From 422723d3fca5f9a984c8c258f65267e64a7f89da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net>
Date: Tue, 13 Dec 2016 03:34:50 +0000
Subject: [PATCH] Merge with master

---
 Makefile                                      |  8 ++---
 internal/sqladapter/exql/column_value.go      |  3 ++
 internal/sqladapter/exql/column_value_test.go |  9 ++++++
 lib/sqlbuilder/builder.go                     | 18 +++++------
 lib/sqlbuilder/convert.go                     | 30 +++++++------------
 lib/sqlbuilder/select.go                      |  8 ++---
 6 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/Makefile b/Makefile
index 7181dd72..b72e1662 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 8834ee8a..2d2f2784 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 b71db7ed..e9bfc524 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 1867b221..31ea0736 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 bc5d8f5f..b8b2de40 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 b22d05a4..d560fb85 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:
-- 
GitLab