2019-06-21 13:56:57 +02:00
|
|
|
package jet
|
2019-03-31 14:07:58 +02:00
|
|
|
|
2019-07-18 17:43:11 +02:00
|
|
|
// IntegerExpression interface
|
2019-05-31 12:59:57 +02:00
|
|
|
type IntegerExpression interface {
|
2019-06-04 12:10:23 +02:00
|
|
|
Expression
|
2019-06-21 12:30:32 +02:00
|
|
|
numericExpression
|
2019-05-31 12:59:57 +02:00
|
|
|
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is equal to rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
EQ(rhs IntegerExpression) BoolExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is not equal to rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
NOT_EQ(rhs IntegerExpression) BoolExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is distinct from rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is not distinct from rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
|
|
|
|
|
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is less then rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
LT(rhs IntegerExpression) BoolExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is less then equal rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
LT_EQ(rhs IntegerExpression) BoolExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is greater then rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
GT(rhs IntegerExpression) BoolExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// Check if expression is greater then equal rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
GT_EQ(rhs IntegerExpression) BoolExpression
|
|
|
|
|
|
2019-06-27 19:55:21 +02:00
|
|
|
// expression + rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
ADD(rhs IntegerExpression) IntegerExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// expression - rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
SUB(rhs IntegerExpression) IntegerExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// expression * rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
MUL(rhs IntegerExpression) IntegerExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// expression / rhs
|
2019-05-31 12:59:57 +02:00
|
|
|
DIV(rhs IntegerExpression) IntegerExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// expression % rhs
|
2019-06-01 15:00:37 +02:00
|
|
|
MOD(rhs IntegerExpression) IntegerExpression
|
2019-06-27 19:55:21 +02:00
|
|
|
// expression ^ rhs
|
2019-06-01 15:00:37 +02:00
|
|
|
POW(rhs IntegerExpression) IntegerExpression
|
2019-05-31 12:59:57 +02:00
|
|
|
|
2019-06-27 19:55:21 +02:00
|
|
|
// 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
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type integerInterfaceImpl struct {
|
2019-06-21 12:30:32 +02:00
|
|
|
numericExpressionImpl
|
2019-05-31 12:59:57 +02:00
|
|
|
parent IntegerExpression
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) EQ(rhs IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return eq(i.parent, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) NOT_EQ(rhs IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return notEq(i.parent, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return isDistinctFrom(i.parent, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return isNotDistinctFrom(i.parent, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) GT(rhs IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return gt(i.parent, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) GT_EQ(rhs IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return gtEq(i.parent, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) LT(expression IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return lt(i.parent, expression)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) LT_EQ(expression IntegerExpression) BoolExpression {
|
2019-06-27 19:55:21 +02:00
|
|
|
return ltEq(i.parent, expression)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) ADD(expression IntegerExpression) IntegerExpression {
|
2019-06-01 15:00:37 +02:00
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "+")
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) SUB(expression IntegerExpression) IntegerExpression {
|
2019-06-01 15:00:37 +02:00
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "-")
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) MUL(expression IntegerExpression) IntegerExpression {
|
2019-06-01 15:00:37 +02:00
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "*")
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) DIV(expression IntegerExpression) IntegerExpression {
|
2019-06-01 15:00:37 +02:00
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "/")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-07-15 13:06:06 +02:00
|
|
|
func (i *integerInterfaceImpl) MOD(expression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "%")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-07-15 13:06:06 +02:00
|
|
|
func (i *integerInterfaceImpl) POW(expression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "^")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-01 15:00:37 +02:00
|
|
|
func (i *integerInterfaceImpl) BIT_AND(expression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "&")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-01 15:00:37 +02:00
|
|
|
func (i *integerInterfaceImpl) BIT_OR(expression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "|")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) BIT_XOR(expression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, expression, "#")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) BIT_SHIFT_LEFT(intExpression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, intExpression, "<<")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) BIT_SHIFT_RIGHT(intExpression IntegerExpression) IntegerExpression {
|
|
|
|
|
return newBinaryIntegerExpression(i.parent, intExpression, ">>")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------//
|
|
|
|
|
type binaryIntegerExpression struct {
|
|
|
|
|
expressionInterfaceImpl
|
|
|
|
|
integerInterfaceImpl
|
|
|
|
|
|
2019-05-29 14:03:38 +02:00
|
|
|
binaryOpExpression
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-01 15:00:37 +02:00
|
|
|
func newBinaryIntegerExpression(lhs, rhs IntegerExpression, operator string) IntegerExpression {
|
2019-03-31 14:07:58 +02:00
|
|
|
integerExpression := binaryIntegerExpression{}
|
|
|
|
|
|
|
|
|
|
integerExpression.expressionInterfaceImpl.parent = &integerExpression
|
|
|
|
|
integerExpression.integerInterfaceImpl.parent = &integerExpression
|
|
|
|
|
|
2019-05-29 14:03:38 +02:00
|
|
|
integerExpression.binaryOpExpression = newBinaryExpression(lhs, rhs, operator)
|
2019-03-31 14:07:58 +02:00
|
|
|
|
|
|
|
|
return &integerExpression
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------//
|
2019-05-31 12:59:57 +02:00
|
|
|
type prefixIntegerOpExpression struct {
|
2019-03-31 14:07:58 +02:00
|
|
|
expressionInterfaceImpl
|
|
|
|
|
integerInterfaceImpl
|
|
|
|
|
|
2019-05-29 14:03:38 +02:00
|
|
|
prefixOpExpression
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-07-15 13:06:06 +02:00
|
|
|
func newPrefixIntegerOperator(expression IntegerExpression, operator string) IntegerExpression {
|
2019-05-31 12:59:57 +02:00
|
|
|
integerExpression := prefixIntegerOpExpression{}
|
2019-05-29 14:03:38 +02:00
|
|
|
integerExpression.prefixOpExpression = newPrefixExpression(expression, operator)
|
2019-03-31 14:07:58 +02:00
|
|
|
|
|
|
|
|
integerExpression.expressionInterfaceImpl.parent = &integerExpression
|
|
|
|
|
integerExpression.integerInterfaceImpl.parent = &integerExpression
|
|
|
|
|
|
|
|
|
|
return &integerExpression
|
|
|
|
|
}
|
2019-06-07 14:23:14 +02:00
|
|
|
|
|
|
|
|
//---------------------------------------------------//
|
|
|
|
|
type integerExpressionWrapper struct {
|
|
|
|
|
integerInterfaceImpl
|
|
|
|
|
|
|
|
|
|
Expression
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newIntExpressionWrap(expression Expression) IntegerExpression {
|
|
|
|
|
intExpressionWrap := integerExpressionWrapper{Expression: expression}
|
|
|
|
|
|
|
|
|
|
intExpressionWrap.integerInterfaceImpl.parent = &intExpressionWrap
|
|
|
|
|
|
|
|
|
|
return &intExpressionWrap
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-18 17:43:11 +02:00
|
|
|
// IntExp is int expression wrapper around arbitrary expression.
|
|
|
|
|
// Allows go compiler to see any expression as int expression.
|
|
|
|
|
// Does not add sql cast to generated sql builder output.
|
2019-06-07 14:23:14 +02:00
|
|
|
func IntExp(expression Expression) IntegerExpression {
|
|
|
|
|
return newIntExpressionWrap(expression)
|
|
|
|
|
}
|