Add BETWEEN operator support.
This commit is contained in:
parent
3c866a0b6f
commit
001d64f1dc
14 changed files with 251 additions and 152 deletions
|
|
@ -13,6 +13,8 @@ type DateExpression interface {
|
|||
LT_EQ(rhs DateExpression) BoolExpression
|
||||
GT(rhs DateExpression) BoolExpression
|
||||
GT_EQ(rhs DateExpression) BoolExpression
|
||||
BETWEEN(min, max DateExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max DateExpression) BoolExpression
|
||||
|
||||
ADD(rhs Interval) TimestampExpression
|
||||
SUB(rhs Interval) TimestampExpression
|
||||
|
|
@ -54,6 +56,14 @@ func (d *dateInterfaceImpl) GT_EQ(rhs DateExpression) BoolExpression {
|
|||
return GtEq(d.parent, rhs)
|
||||
}
|
||||
|
||||
func (d *dateInterfaceImpl) BETWEEN(min, max DateExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(d.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (d *dateInterfaceImpl) NOT_BETWEEN(min, max DateExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(d.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (d *dateInterfaceImpl) ADD(rhs Interval) TimestampExpression {
|
||||
return TimestampExp(Add(d.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -196,3 +196,45 @@ func (p *postfixOpExpression) serialize(statement StatementType, out *SQLBuilder
|
|||
|
||||
out.WriteString(p.operator)
|
||||
}
|
||||
|
||||
type betweenOperatorExpression struct {
|
||||
ExpressionInterfaceImpl
|
||||
|
||||
expression Expression
|
||||
notBetween bool
|
||||
min Expression
|
||||
max Expression
|
||||
}
|
||||
|
||||
// NewBetweenOperatorExpression creates new BETWEEN operator expression
|
||||
func NewBetweenOperatorExpression(expression, min, max Expression, notBetween bool) BoolExpression {
|
||||
newBetweenOperator := &betweenOperatorExpression{
|
||||
expression: expression,
|
||||
notBetween: notBetween,
|
||||
min: min,
|
||||
max: max,
|
||||
}
|
||||
|
||||
newBetweenOperator.ExpressionInterfaceImpl.Parent = newBetweenOperator
|
||||
|
||||
return BoolExp(newBetweenOperator)
|
||||
}
|
||||
|
||||
func (p *betweenOperatorExpression) serialize(statement StatementType, out *SQLBuilder, options ...SerializeOption) {
|
||||
if !contains(options, NoWrap) {
|
||||
out.WriteString("(")
|
||||
}
|
||||
|
||||
p.expression.serialize(statement, out, FallTrough(options)...)
|
||||
if p.notBetween {
|
||||
out.WriteString("NOT")
|
||||
}
|
||||
out.WriteString("BETWEEN")
|
||||
p.min.serialize(statement, out, FallTrough(options)...)
|
||||
out.WriteString("AND")
|
||||
p.max.serialize(statement, out, FallTrough(options)...)
|
||||
|
||||
if !contains(options, NoWrap) {
|
||||
out.WriteString(")")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ type FloatExpression interface {
|
|||
LT_EQ(rhs FloatExpression) BoolExpression
|
||||
GT(rhs FloatExpression) BoolExpression
|
||||
GT_EQ(rhs FloatExpression) BoolExpression
|
||||
BETWEEN(min, max FloatExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max FloatExpression) BoolExpression
|
||||
|
||||
ADD(rhs NumericExpression) FloatExpression
|
||||
SUB(rhs NumericExpression) FloatExpression
|
||||
|
|
@ -60,6 +62,14 @@ func (n *floatInterfaceImpl) LT_EQ(rhs FloatExpression) BoolExpression {
|
|||
return LtEq(n.parent, rhs)
|
||||
}
|
||||
|
||||
func (n *floatInterfaceImpl) BETWEEN(min, max FloatExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(n.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (n *floatInterfaceImpl) NOT_BETWEEN(min, max FloatExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(n.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (n *floatInterfaceImpl) ADD(rhs NumericExpression) FloatExpression {
|
||||
return FloatExp(Add(n.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,46 +5,29 @@ type IntegerExpression interface {
|
|||
Expression
|
||||
numericExpression
|
||||
|
||||
// Check if expression is equal to rhs
|
||||
EQ(rhs IntegerExpression) BoolExpression
|
||||
// Check if expression is not equal to rhs
|
||||
NOT_EQ(rhs IntegerExpression) BoolExpression
|
||||
// Check if expression is distinct from rhs
|
||||
IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
|
||||
// Check if expression is not distinct from rhs
|
||||
IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
|
||||
|
||||
// Check if expression is less then rhs
|
||||
LT(rhs IntegerExpression) BoolExpression
|
||||
// Check if expression is less then equal rhs
|
||||
LT_EQ(rhs IntegerExpression) BoolExpression
|
||||
// Check if expression is greater then rhs
|
||||
GT(rhs IntegerExpression) BoolExpression
|
||||
// Check if expression is greater then equal rhs
|
||||
GT_EQ(rhs IntegerExpression) BoolExpression
|
||||
BETWEEN(min, max IntegerExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max IntegerExpression) BoolExpression
|
||||
|
||||
// expression + rhs
|
||||
ADD(rhs IntegerExpression) IntegerExpression
|
||||
// expression - rhs
|
||||
SUB(rhs IntegerExpression) IntegerExpression
|
||||
// expression * rhs
|
||||
MUL(rhs IntegerExpression) IntegerExpression
|
||||
// expression / rhs
|
||||
DIV(rhs IntegerExpression) IntegerExpression
|
||||
// expression % rhs
|
||||
MOD(rhs IntegerExpression) IntegerExpression
|
||||
// expression ^ rhs
|
||||
POW(rhs IntegerExpression) IntegerExpression
|
||||
|
||||
// expression & rhs
|
||||
BIT_AND(rhs IntegerExpression) IntegerExpression
|
||||
// expression | rhs
|
||||
BIT_OR(rhs IntegerExpression) IntegerExpression
|
||||
// expression # rhs
|
||||
BIT_XOR(rhs IntegerExpression) IntegerExpression
|
||||
// expression << rhs
|
||||
BIT_SHIFT_LEFT(shift IntegerExpression) IntegerExpression
|
||||
// expression >> rhs
|
||||
BIT_SHIFT_RIGHT(shift IntegerExpression) IntegerExpression
|
||||
}
|
||||
|
||||
|
|
@ -85,6 +68,14 @@ func (i *integerInterfaceImpl) LT_EQ(rhs IntegerExpression) BoolExpression {
|
|||
return LtEq(i.parent, rhs)
|
||||
}
|
||||
|
||||
func (i *integerInterfaceImpl) BETWEEN(min, max IntegerExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(i.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (i *integerInterfaceImpl) NOT_BETWEEN(min, max IntegerExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(i.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (i *integerInterfaceImpl) ADD(rhs IntegerExpression) IntegerExpression {
|
||||
return IntExp(Add(i.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,3 +99,9 @@ func TestIntExpressionIntExp(t *testing.T) {
|
|||
assertClauseSerialize(t, IntExp(table1ColFloat.ADD(table2ColFloat)).ADD(Int(11)),
|
||||
"((table1.col_float + table2.col_float) + $1)", int64(11))
|
||||
}
|
||||
|
||||
func TestIntExpressionBetween(t *testing.T) {
|
||||
assertClauseSerialize(t, table1ColInt.BETWEEN(Int(1), table1Col3), "(table1.col_int BETWEEN $1 AND table1.col3)", int64(1))
|
||||
assertClauseSerialize(t, table1ColInt.BETWEEN(Int(1), table1Col3).AND(table1ColBool),
|
||||
"((table1.col_int BETWEEN $1 AND table1.col3) AND table1.col_bool)", int64(1))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ type StringExpression interface {
|
|||
LT_EQ(rhs StringExpression) BoolExpression
|
||||
GT(rhs StringExpression) BoolExpression
|
||||
GT_EQ(rhs StringExpression) BoolExpression
|
||||
BETWEEN(min, max StringExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max StringExpression) BoolExpression
|
||||
|
||||
CONCAT(rhs Expression) StringExpression
|
||||
|
||||
|
|
@ -59,6 +61,14 @@ func (s *stringInterfaceImpl) LT_EQ(rhs StringExpression) BoolExpression {
|
|||
return LtEq(s.parent, rhs)
|
||||
}
|
||||
|
||||
func (s *stringInterfaceImpl) BETWEEN(min, max StringExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(s.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (s *stringInterfaceImpl) NOT_BETWEEN(min, max StringExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(s.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (s *stringInterfaceImpl) CONCAT(rhs Expression) StringExpression {
|
||||
return newBinaryStringOperatorExpression(s.parent, rhs, StringConcatOperator)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ type TimeExpression interface {
|
|||
LT_EQ(rhs TimeExpression) BoolExpression
|
||||
GT(rhs TimeExpression) BoolExpression
|
||||
GT_EQ(rhs TimeExpression) BoolExpression
|
||||
BETWEEN(min, max TimeExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max TimeExpression) BoolExpression
|
||||
|
||||
ADD(rhs Interval) TimeExpression
|
||||
SUB(rhs Interval) TimeExpression
|
||||
|
|
@ -54,6 +56,14 @@ func (t *timeInterfaceImpl) GT_EQ(rhs TimeExpression) BoolExpression {
|
|||
return GtEq(t.parent, rhs)
|
||||
}
|
||||
|
||||
func (t *timeInterfaceImpl) BETWEEN(min, max TimeExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (t *timeInterfaceImpl) NOT_BETWEEN(min, max TimeExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (t *timeInterfaceImpl) ADD(rhs Interval) TimeExpression {
|
||||
return TimeExp(Add(t.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ type TimestampExpression interface {
|
|||
LT_EQ(rhs TimestampExpression) BoolExpression
|
||||
GT(rhs TimestampExpression) BoolExpression
|
||||
GT_EQ(rhs TimestampExpression) BoolExpression
|
||||
BETWEEN(min, max TimestampExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max TimestampExpression) BoolExpression
|
||||
|
||||
ADD(rhs Interval) TimestampExpression
|
||||
SUB(rhs Interval) TimestampExpression
|
||||
|
|
@ -54,6 +56,14 @@ func (t *timestampInterfaceImpl) GT_EQ(rhs TimestampExpression) BoolExpression {
|
|||
return GtEq(t.parent, rhs)
|
||||
}
|
||||
|
||||
func (t *timestampInterfaceImpl) BETWEEN(min, max TimestampExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (t *timestampInterfaceImpl) NOT_BETWEEN(min, max TimestampExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (t *timestampInterfaceImpl) ADD(rhs Interval) TimestampExpression {
|
||||
return TimestampExp(Add(t.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ type TimestampzExpression interface {
|
|||
LT_EQ(rhs TimestampzExpression) BoolExpression
|
||||
GT(rhs TimestampzExpression) BoolExpression
|
||||
GT_EQ(rhs TimestampzExpression) BoolExpression
|
||||
BETWEEN(min, max TimestampzExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max TimestampzExpression) BoolExpression
|
||||
|
||||
ADD(rhs Interval) TimestampzExpression
|
||||
SUB(rhs Interval) TimestampzExpression
|
||||
|
|
@ -54,6 +56,14 @@ func (t *timestampzInterfaceImpl) GT_EQ(rhs TimestampzExpression) BoolExpression
|
|||
return GtEq(t.parent, rhs)
|
||||
}
|
||||
|
||||
func (t *timestampzInterfaceImpl) BETWEEN(min, max TimestampzExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (t *timestampzInterfaceImpl) NOT_BETWEEN(min, max TimestampzExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (t *timestampzInterfaceImpl) ADD(rhs Interval) TimestampzExpression {
|
||||
return TimestampzExp(Add(t.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ type TimezExpression interface {
|
|||
LT_EQ(rhs TimezExpression) BoolExpression
|
||||
GT(rhs TimezExpression) BoolExpression
|
||||
GT_EQ(rhs TimezExpression) BoolExpression
|
||||
BETWEEN(min, max TimezExpression) BoolExpression
|
||||
NOT_BETWEEN(min, max TimezExpression) BoolExpression
|
||||
|
||||
ADD(rhs Interval) TimezExpression
|
||||
SUB(rhs Interval) TimezExpression
|
||||
|
|
@ -54,6 +56,14 @@ func (t *timezInterfaceImpl) GT_EQ(rhs TimezExpression) BoolExpression {
|
|||
return GtEq(t.parent, rhs)
|
||||
}
|
||||
|
||||
func (t *timezInterfaceImpl) BETWEEN(min, max TimezExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, false)
|
||||
}
|
||||
|
||||
func (t *timezInterfaceImpl) NOT_BETWEEN(min, max TimezExpression) BoolExpression {
|
||||
return NewBetweenOperatorExpression(t.parent, min, max, true)
|
||||
}
|
||||
|
||||
func (t *timezInterfaceImpl) ADD(rhs Interval) TimezExpression {
|
||||
return TimezExp(Add(t.parent, rhs))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue