119 lines
2.5 KiB
Go
119 lines
2.5 KiB
Go
package ql
|
|
|
|
// Squirrel Sqlizer interface implementators for all ast node types
|
|
// This helps us to throw columns into squirrel's select builder
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/Masterminds/squirrel"
|
|
)
|
|
|
|
// ToSql concatenates outputs and arguments from all nodes
|
|
func (nn ASTNodes) ToSql() (out string, args []interface{}, err error) {
|
|
var _out string
|
|
var _args []interface{}
|
|
|
|
for _, s := range nn {
|
|
if _out, _args, err = s.ToSql(); err != nil {
|
|
return
|
|
} else {
|
|
if _, ok := s.(ASTNodes); ok {
|
|
// Nested nodes should be wrapped
|
|
// Example: ((A) AND (B))
|
|
out = out + "(" + _out + ")"
|
|
} else {
|
|
out = out + _out
|
|
}
|
|
|
|
args = append(args, _args...)
|
|
}
|
|
}
|
|
|
|
return out, args, err
|
|
}
|
|
|
|
// ToSql concatenates outputs and arguments from all nodes, comma delimited
|
|
func (nn ASTSet) ToSql() (out string, args []interface{}, err error) {
|
|
var _out string
|
|
var _args []interface{}
|
|
|
|
for i, s := range nn {
|
|
if _out, _args, err = s.ToSql(); err != nil {
|
|
return
|
|
} else {
|
|
if i > 0 {
|
|
out = out + ", "
|
|
}
|
|
|
|
out = out + _out
|
|
|
|
args = append(args, _args...)
|
|
}
|
|
}
|
|
|
|
return out, args, err
|
|
}
|
|
|
|
// ToSql returns column alias expression or output of underlying expression's ToSql()
|
|
func (n Column) ToSql() (string, []interface{}, error) {
|
|
if n.Alias != "" {
|
|
return squirrel.Alias(n.Expr, n.Alias).ToSql()
|
|
} else {
|
|
return n.Expr.ToSql()
|
|
}
|
|
}
|
|
|
|
func (n Ident) ToSql() (string, []interface{}, error) {
|
|
return n.Value, n.Args, nil
|
|
}
|
|
|
|
func (n LNull) ToSql() (string, []interface{}, error) {
|
|
return "NULL", nil, nil
|
|
}
|
|
|
|
func (n LBoolean) ToSql() (string, []interface{}, error) {
|
|
if n.Value {
|
|
return "TRUE", nil, nil
|
|
} else {
|
|
return "FALSE", nil, nil
|
|
}
|
|
}
|
|
|
|
func (n Function) ToSql() (string, []interface{}, error) {
|
|
if paramsSql, args, err := n.Arguments.ToSql(); err != nil {
|
|
return "", nil, err
|
|
} else {
|
|
return fmt.Sprintf("%s(%s)", n.Name, paramsSql), args, nil
|
|
}
|
|
|
|
}
|
|
|
|
func (n Keyword) ToSql() (string, []interface{}, error) {
|
|
return n.Keyword, nil, nil
|
|
}
|
|
|
|
func (n Interval) ToSql() (string, []interface{}, error) {
|
|
return fmt.Sprintf("INTERVAL ? %s", n.Unit), []interface{}{n.Value}, nil
|
|
}
|
|
|
|
func (n Operator) ToSql() (string, []interface{}, error) {
|
|
var op = n.Kind
|
|
|
|
switch n.Kind {
|
|
case "LIKE", "NOT LIKE":
|
|
// Make sure we are doing case insensitive search
|
|
op = "COLLATE utf8_general_ci " + n.Kind
|
|
}
|
|
|
|
return " " + op + " ", nil, nil
|
|
}
|
|
|
|
func (n LString) ToSql() (string, []interface{}, error) {
|
|
return "?", []interface{}{n.Value}, nil
|
|
}
|
|
|
|
func (n LNumber) ToSql() (string, []interface{}, error) {
|
|
return n.Value, nil, nil
|
|
}
|