Refactor parsing & select order by impl #6

Merged
gdulai merged 3 commits from refractor into main 2026-06-05 15:22:41 +00:00
3 changed files with 98 additions and 23 deletions
Showing only changes of commit cd1f61fb87 - Show all commits
+5 -4
View File
@@ -98,10 +98,11 @@ func (s *Select[T]) execute(conn *simpleorm.DBConnection, tx *sql.Tx) error {
} }
if len(s.ordering) > 0 { if len(s.ordering) > 0 {
dml += " ORDER BY" orderBy, err := s.target.GetOrderByDML(s.ordering...)
for _, orderBy := range s.ordering { if err != nil {
log.LogError("Failed to create ORDER BY part: %s", err)
dml += " " + orderBy.Field + " " + orderBy.Direction } else {
dml += orderBy
} }
} }
+26
View File
@@ -1,6 +1,7 @@
package schema package schema
import ( import (
"errors"
"reflect" "reflect"
"strings" "strings"
@@ -218,6 +219,31 @@ func (t Table) GetDeleteDML(count int) (string, error) {
return dml.String(), nil return dml.String(), nil
} }
func (t Table) GetOrderByDML(ordering ...OrderBy) (string, error) {
var dml strings.Builder
dml.WriteString(" ORDER BY")
for _, orderBy := range ordering {
col, err := t.getColumnByField(orderBy.Field)
if err != nil {
return "", err
}
dml.WriteString(" ")
dml.WriteString(col.Name)
dml.WriteString(" ")
dml.WriteString(orderBy.Direction)
}
return dml.String(), nil
}
func (t Table) getColumnByField(fieldName string) (Column, error) {
for _, col := range t.columns {
if col.FieldName == fieldName {
return col, nil
}
}
return Column{}, errors.New("No column for field " + fieldName + " in table " + t.name)
}
func (t Table) IsPkAuto() bool { func (t Table) IsPkAuto() bool {
for _, constr := range t.constraints { for _, constr := range t.constraints {
if constr.Type != "pk" { if constr.Type != "pk" {
+67 -19
View File
@@ -4,6 +4,7 @@ import (
"strconv" "strconv"
"testing" "testing"
simpleorm "git.gdulai.com/gdulai/simpleorm"
"git.gdulai.com/gdulai/simpleorm/exec" "git.gdulai.com/gdulai/simpleorm/exec"
"git.gdulai.com/gdulai/simpleorm/schema" "git.gdulai.com/gdulai/simpleorm/schema"
log "gitlab.com/gdulai/simpleloglvl" log "gitlab.com/gdulai/simpleloglvl"
@@ -277,35 +278,22 @@ func TestSelectWithLimitAndOffset(t *testing.T) {
} }
} }
func TestSelectOrderBy(t *testing.T) { func TestSelectOrderByDesc(t *testing.T) {
// GIVEN // GIVEN
orm, conn := testSetup() orm, conn := testSetup()
defer cleanUp("test.db", conn) defer cleanUp("test.db", conn)
testA := Test{Int64Field: -1, IntField: 1, StringField: "A"} err := orderBySetup(conn, orm)
testB := Test{Int64Field: -1, IntField: 1, StringField: "B"}
testC := Test{Int64Field: -1, IntField: 1, StringField: "C"}
testD := Test{Int64Field: -1, IntField: 1, StringField: "D"}
testE := Test{Int64Field: -1, IntField: 1, StringField: "E"}
insertExec, err := exec.NewInsert[Test](orm, testA, testB, testC, testD, testE)
if err != nil { if err != nil {
log.LogError("TestSelectOrderBy setup failed: %s", err) log.LogError("TestSelectOrderByAsc setup failed: %s", err)
t.Fail() t.Fail()
return return
} }
err = insertExec.Execute(conn)
if err != nil {
log.LogError("TestSelectOrderBy setup failed: %s", err)
t.Fail()
return
}
// WHEN // WHEN
selectExec, err := exec.CreateSelect[Test](orm) selectExec, err := exec.CreateSelect[Test](orm)
if err != nil { if err != nil {
log.LogError("TestSelectOrderBy failed: %s", err) log.LogError("TestSelectOrderByDesc failed: %s", err)
t.Fail() t.Fail()
return return
} }
@@ -313,7 +301,47 @@ func TestSelectOrderBy(t *testing.T) {
err = selectExec.Execute(conn) err = selectExec.Execute(conn)
if err != nil { if err != nil {
log.LogError("TestSelectOrderBy failed: %s", err) log.LogError("TestSelectOrderByDesc failed: %s", err)
t.Fail()
return
}
// THEN
var resultStr string
for _, obj := range selectExec.Results() {
resultStr += obj.StringField
}
if resultStr != "EDCBA" {
log.LogError("TestSelectOrderByDesc failed, epxected: EDCBA actual: %s", resultStr)
t.Fail()
}
}
func TestSelectOrderByAsc(t *testing.T) {
// GIVEN
orm, conn := testSetup()
defer cleanUp("test.db", conn)
err := orderBySetup(conn, orm)
if err != nil {
log.LogError("TestSelectOrderByAsc setup failed: %s", err)
t.Fail()
return
}
// WHEN
selectExec, err := exec.CreateSelect[Test](orm)
if err != nil {
log.LogError("TestSelectOrderByAsc failed: %s", err)
t.Fail()
return
}
selectExec.OrderBy(schema.OrderBy{Field: "StringField", Direction: "ASC"})
err = selectExec.Execute(conn)
if err != nil {
log.LogError("TestSelectOrderByAsc failed: %s", err)
t.Fail() t.Fail()
return return
} }
@@ -325,7 +353,27 @@ func TestSelectOrderBy(t *testing.T) {
} }
if resultStr != "ABCDE" { if resultStr != "ABCDE" {
log.LogError("TestSelectOrderBy failed, epxected: ABCDE actual: %s", resultStr) log.LogError("TestSelectOrderByAsc failed, epxected: ABCDE actual: %s", resultStr)
t.Fail() t.Fail()
} }
} }
func orderBySetup(conn *simpleorm.DBConnection, orm *simpleorm.ORM) error {
insertExec, err := exec.NewInsert[Test](orm,
Test{Int64Field: -1, IntField: 1, StringField: "C"},
Test{Int64Field: -1, IntField: 1, StringField: "D"},
Test{Int64Field: -1, IntField: 1, StringField: "E"},
Test{Int64Field: -1, IntField: 1, StringField: "A"},
Test{Int64Field: -1, IntField: 1, StringField: "B"},
)
if err != nil {
return err
}
err = insertExec.Execute(conn)
if err != nil {
return err
}
return nil
}