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
|
|
|
|
|
|
|
|
EQ(rhs IntegerExpression) BoolExpression
|
|
|
|
|
NOT_EQ(rhs IntegerExpression) BoolExpression
|
|
|
|
|
IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
|
|
|
|
|
IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression
|
|
|
|
|
|
|
|
|
|
LT(rhs IntegerExpression) BoolExpression
|
|
|
|
|
LT_EQ(rhs IntegerExpression) BoolExpression
|
|
|
|
|
GT(rhs IntegerExpression) BoolExpression
|
|
|
|
|
GT_EQ(rhs IntegerExpression) BoolExpression
|
2022-01-04 17:58:10 +01:00
|
|
|
BETWEEN(min, max IntegerExpression) BoolExpression
|
|
|
|
|
NOT_BETWEEN(min, max IntegerExpression) BoolExpression
|
2019-05-31 12:59:57 +02:00
|
|
|
|
|
|
|
|
ADD(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
SUB(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
MUL(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
DIV(rhs IntegerExpression) IntegerExpression
|
2019-06-01 15:00:37 +02:00
|
|
|
MOD(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
POW(rhs IntegerExpression) IntegerExpression
|
2019-05-31 12:59:57 +02:00
|
|
|
|
2019-06-27 19:55:21 +02:00
|
|
|
BIT_AND(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
BIT_OR(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
BIT_XOR(rhs IntegerExpression) IntegerExpression
|
|
|
|
|
BIT_SHIFT_LEFT(shift IntegerExpression) IntegerExpression
|
|
|
|
|
BIT_SHIFT_RIGHT(shift IntegerExpression) IntegerExpression
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2024-02-27 10:48:57 +01:00
|
|
|
// additional integer expression subtypes, used in range expressions.
|
|
|
|
|
type (
|
|
|
|
|
Int4Expression IntegerExpression
|
|
|
|
|
Int8Expression IntegerExpression
|
|
|
|
|
)
|
|
|
|
|
|
2019-03-31 14:07:58 +02:00
|
|
|
type integerInterfaceImpl struct {
|
2019-06-21 12:30:32 +02:00
|
|
|
numericExpressionImpl
|
2025-03-09 19:06:17 +01:00
|
|
|
root IntegerExpression
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) EQ(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return Eq(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) NOT_EQ(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return NotEq(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) IS_DISTINCT_FROM(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IsDistinctFrom(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) IS_NOT_DISTINCT_FROM(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IsNotDistinctFrom(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) GT(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return Gt(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) GT_EQ(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return GtEq(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) LT(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return Lt(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) LT_EQ(rhs IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return LtEq(i.root, rhs)
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
2022-01-04 17:58:10 +01:00
|
|
|
func (i *integerInterfaceImpl) BETWEEN(min, max IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return NewBetweenOperatorExpression(i.root, min, max, false)
|
2022-01-04 17:58:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) NOT_BETWEEN(min, max IntegerExpression) BoolExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return NewBetweenOperatorExpression(i.root, min, max, true)
|
2022-01-04 17:58:10 +01:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) ADD(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IntExp(Add(i.root, rhs))
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) SUB(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IntExp(Sub(i.root, rhs))
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) MUL(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IntExp(Mul(i.root, rhs))
|
2019-05-31 12:59:57 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) DIV(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IntExp(Div(i.root, rhs))
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) MOD(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IntExp(Mod(i.root, rhs))
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) POW(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return IntExp(POW(i.root, rhs))
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) BIT_AND(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return newBinaryIntegerOperatorExpression(i.root, rhs, "&")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) BIT_OR(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return newBinaryIntegerOperatorExpression(i.root, rhs, "|")
|
2019-06-01 15:00:37 +02:00
|
|
|
}
|
|
|
|
|
|
2020-02-09 18:37:48 +01:00
|
|
|
func (i *integerInterfaceImpl) BIT_XOR(rhs IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return newBinaryIntegerOperatorExpression(i.root, rhs, "#")
|
2019-06-01 15:00:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) BIT_SHIFT_LEFT(intExpression IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return newBinaryIntegerOperatorExpression(i.root, intExpression, "<<")
|
2019-06-01 15:00:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *integerInterfaceImpl) BIT_SHIFT_RIGHT(intExpression IntegerExpression) IntegerExpression {
|
2025-03-09 19:06:17 +01:00
|
|
|
return newBinaryIntegerOperatorExpression(i.root, intExpression, ">>")
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-12-07 18:52:46 +01:00
|
|
|
func newBinaryIntegerOperatorExpression(lhs, rhs IntegerExpression, operator string) IntegerExpression {
|
2020-02-09 18:37:48 +01:00
|
|
|
return IntExp(NewBinaryOperatorExpression(lhs, rhs, operator))
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
|
|
|
|
|
2019-12-07 18:52:46 +01:00
|
|
|
func newPrefixIntegerOperatorExpression(expression IntegerExpression, operator string) IntegerExpression {
|
|
|
|
|
return IntExp(newPrefixOperatorExpression(expression, operator))
|
2019-03-31 14:07:58 +02:00
|
|
|
}
|
2019-06-07 14:23:14 +02:00
|
|
|
|
|
|
|
|
type integerExpressionWrapper struct {
|
|
|
|
|
integerInterfaceImpl
|
|
|
|
|
|
|
|
|
|
Expression
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newIntExpressionWrap(expression Expression) IntegerExpression {
|
2025-03-08 19:01:37 +01:00
|
|
|
intExpressionWrap := &integerExpressionWrapper{Expression: expression}
|
2025-03-09 19:06:17 +01:00
|
|
|
intExpressionWrap.integerInterfaceImpl.root = intExpressionWrap
|
|
|
|
|
expression.setRoot(intExpressionWrap)
|
2019-06-07 14:23:14 +02:00
|
|
|
|
2025-03-08 19:01:37 +01:00
|
|
|
return intExpressionWrap
|
2019-06-07 14:23:14 +02:00
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
|
|
}
|