diff --git a/Makefile b/Makefile index 7181dd7260cd4fb9de24760eccb6a5b078be84ab..b72e16627f8d13f612b250da464c4e889c8b2c32 100644 --- a/Makefile +++ b/Makefile @@ -5,11 +5,9 @@ DB_HOST ?= 127.0.0.1 export DB_HOST test: - go test -v -benchtime=500ms -bench=. ./lib/... & \ - go test -v -benchtime=500ms -bench=. ./internal/... & \ - wait && \ + go test -v -benchtime=500ms -bench=. ./lib/... && \ + go test -v -benchtime=500ms -bench=. ./internal/... && \ for ADAPTER in postgresql mysql sqlite ql mongo; do \ - $(MAKE) -C $$ADAPTER test & \ + $(MAKE) -C $$ADAPTER test; \ done && \ - wait && \ go test -v diff --git a/internal/sqladapter/exql/column_value.go b/internal/sqladapter/exql/column_value.go index 8834ee8a6bdd459ddb0cca4ce7255d62483d7288..2d2f2784566e43f495c9b7437b42052a5ac01c20 100644 --- a/internal/sqladapter/exql/column_value.go +++ b/internal/sqladapter/exql/column_value.go @@ -35,6 +35,9 @@ func (c *ColumnValue) Compile(layout *Template) (compiled string) { c.Operator, c.Value.Compile(layout), } + if c.Operator == "" { + data.Operator = layout.DefaultOperator + } compiled = mustParse(layout.ColumnValue, data) diff --git a/internal/sqladapter/exql/column_value_test.go b/internal/sqladapter/exql/column_value_test.go index b71db7ed76c18b3b449eaddc561bf01edbe105e2..e9bfc524b8ef364efb292eb3fd56283ccf2902bd 100644 --- a/internal/sqladapter/exql/column_value_test.go +++ b/internal/sqladapter/exql/column_value_test.go @@ -54,6 +54,15 @@ func TestColumnValue(t *testing.T) { if s != e { t.Fatalf("Got: %s, Expecting: %s", s, e) } + + cv = &ColumnValue{Column: ColumnWithName("date"), Value: NewValue(RawValue("NOW()"))} + + s = cv.Compile(defaultTemplate) + e = `"date" = NOW()` + + if s != e { + t.Fatalf("Got: %s, Expecting: %s", s, e) + } } func TestColumnValues(t *testing.T) { diff --git a/lib/sqlbuilder/builder.go b/lib/sqlbuilder/builder.go index 1867b221c0d5e582864bf56d20bd4246f0499be5..31ea07361389f9a8ef6cce7e601430648e5fdcaf 100644 --- a/lib/sqlbuilder/builder.go +++ b/lib/sqlbuilder/builder.go @@ -330,10 +330,10 @@ func columnFragments(columns []interface{}) ([]exql.Fragment, []interface{}, err for i := 0; i < l; i++ { switch v := columns[i].(type) { - case *selector: - expanded, rawArgs := expandPlaceholders(v.Compile(), v.Arguments()) - f[i] = exql.RawValue(expanded) - args = append(args, rawArgs...) + case compilable: + q, a := Preprocess(v.Compile(), v.Arguments()) + f[i] = exql.RawValue(q) + args = append(args, a...) case db.Function: fnName, fnArgs := v.Name(), v.Arguments() if len(fnArgs) == 0 { @@ -341,13 +341,13 @@ func columnFragments(columns []interface{}) ([]exql.Fragment, []interface{}, err } else { fnName = fnName + "(?" + strings.Repeat("?, ", len(fnArgs)-1) + ")" } - expanded, fnArgs := expandPlaceholders(fnName, fnArgs) - f[i] = exql.RawValue(expanded) + fnName, fnArgs = Preprocess(fnName, fnArgs) + f[i] = exql.RawValue(fnName) args = append(args, fnArgs...) case db.RawValue: - expanded, rawArgs := expandPlaceholders(v.Raw(), v.Arguments()) - f[i] = exql.RawValue(expanded) - args = append(args, rawArgs...) + q, a := Preprocess(v.Raw(), v.Arguments()) + f[i] = exql.RawValue(q) + args = append(args, a...) case exql.Fragment: f[i] = v case string: diff --git a/lib/sqlbuilder/convert.go b/lib/sqlbuilder/convert.go index bc5d8f5fa8b649e5cdc5390bed6f613378e577b4..b8b2de4074a3e479c2a11f4432b61b4955494072 100644 --- a/lib/sqlbuilder/convert.go +++ b/lib/sqlbuilder/convert.go @@ -11,10 +11,9 @@ import ( ) var ( - sqlNull = exql.RawValue(`NULL`) - sqlIsOperator = `IS` - sqlInOperator = `IN` - sqlDefaultOperator = `=` + sqlNull = exql.RawValue(`NULL`) + sqlIsOperator = `IS` + sqlInOperator = `IN` ) type templateWithUtils struct { @@ -167,11 +166,6 @@ func Preprocess(in string, args []interface{}) (string, []interface{}) { return expandQuery(in, args, preprocessFn) } -func expandPlaceholders(in string, args []interface{}) (string, []interface{}) { - // TODO: Remove after immutable query builder - return in, args -} - // toWhereWithArguments converts the given parameters into a exql.Where // value. func toWhereWithArguments(term interface{}) (where exql.Where, args []interface{}) { @@ -182,7 +176,7 @@ func toWhereWithArguments(term interface{}) (where exql.Where, args []interface{ if len(t) > 0 { if s, ok := t[0].(string); ok { if strings.ContainsAny(s, "?") || len(t) == 1 { - s, args = expandPlaceholders(s, t[1:]) + s, args = Preprocess(s, t[1:]) where.Conditions = []exql.Fragment{exql.RawValue(s)} } else { var val interface{} @@ -211,7 +205,7 @@ func toWhereWithArguments(term interface{}) (where exql.Where, args []interface{ } return case db.RawValue: - r, v := expandPlaceholders(t.Raw(), t.Arguments()) + r, v := Preprocess(t.Raw(), t.Arguments()) where.Conditions = []exql.Fragment{exql.RawValue(r)} args = append(args, v...) return @@ -329,13 +323,13 @@ func toColumnValues(term interface{}) (cv exql.ColumnValues, args []interface{}) // A function with one or more arguments. fnName = fnName + "(?" + strings.Repeat("?, ", len(fnArgs)-1) + ")" } - expanded, fnArgs := expandPlaceholders(fnName, fnArgs) - columnValue.Value = exql.RawValue(expanded) + fnName, fnArgs = Preprocess(fnName, fnArgs) + columnValue.Value = exql.RawValue(fnName) args = append(args, fnArgs...) case db.RawValue: - expanded, rawArgs := expandPlaceholders(value.Raw(), value.Arguments()) - columnValue.Value = exql.RawValue(expanded) - args = append(args, rawArgs...) + q, a := Preprocess(value.Raw(), value.Arguments()) + columnValue.Value = exql.RawValue(q) + args = append(args, a...) default: v, isSlice := toInterfaceArguments(value) @@ -367,10 +361,6 @@ func toColumnValues(term interface{}) (cv exql.ColumnValues, args []interface{}) } // Using guessed operator if no operator was given. - if columnValue.Operator == "" { - columnValue.Operator = sqlDefaultOperator - } - cv.ColumnValues = append(cv.ColumnValues, &columnValue) return cv, args diff --git a/lib/sqlbuilder/select.go b/lib/sqlbuilder/select.go index b22d05a4f4ae1f63ba3e4455a05c71033ad2b82a..d560fb85ade49e7ff98f8a0a0d286cd8acc5fec4 100644 --- a/lib/sqlbuilder/select.go +++ b/lib/sqlbuilder/select.go @@ -243,9 +243,9 @@ func (sel *selector) OrderBy(columns ...interface{}) Selector { switch value := columns[i].(type) { case db.RawValue: - col, args := expandPlaceholders(value.Raw(), value.Arguments()) + query, args := Preprocess(value.Raw(), value.Arguments()) sort = &exql.SortColumn{ - Column: exql.RawValue(col), + Column: exql.RawValue(query), } sq.orderByArgs = append(sq.orderByArgs, args...) case db.Function: @@ -255,9 +255,9 @@ func (sel *selector) OrderBy(columns ...interface{}) Selector { } else { fnName = fnName + "(?" + strings.Repeat("?, ", len(fnArgs)-1) + ")" } - expanded, fnArgs := expandPlaceholders(fnName, fnArgs) + fnName, fnArgs = Preprocess(fnName, fnArgs) sort = &exql.SortColumn{ - Column: exql.RawValue(expanded), + Column: exql.RawValue(fnName), } sq.orderByArgs = append(sq.orderByArgs, fnArgs...) case string: