95 lines
2.7 KiB
Go
95 lines
2.7 KiB
Go
|
|
package sqlbuilder
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/dropbox/godropbox/database/sqltypes"
|
||
|
|
"github.com/pkg/errors"
|
||
|
|
)
|
||
|
|
|
||
|
|
type NumericExpression interface {
|
||
|
|
Expression
|
||
|
|
|
||
|
|
Eq(expression NumericExpression) BoolExpression
|
||
|
|
NotEq(expression NumericExpression) BoolExpression
|
||
|
|
GtEq(rhs NumericExpression) BoolExpression
|
||
|
|
LtEq(rhs NumericExpression) BoolExpression
|
||
|
|
|
||
|
|
Add(expression NumericExpression) NumericExpression
|
||
|
|
Sub(expression NumericExpression) NumericExpression
|
||
|
|
Mul(expression NumericExpression) NumericExpression
|
||
|
|
Div(expression NumericExpression) NumericExpression
|
||
|
|
}
|
||
|
|
|
||
|
|
type numericInterfaceImpl struct {
|
||
|
|
parent NumericExpression
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) Eq(expression NumericExpression) BoolExpression {
|
||
|
|
return Eq(n.parent, expression)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) NotEq(expression NumericExpression) BoolExpression {
|
||
|
|
return Neq(n.parent, expression)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) GtEq(expression NumericExpression) BoolExpression {
|
||
|
|
return Gte(n.parent, expression)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) LtEq(expression NumericExpression) BoolExpression {
|
||
|
|
return Lte(n.parent, expression)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) Add(expression NumericExpression) NumericExpression {
|
||
|
|
return newBinaryNumericExpression(n.parent, expression, []byte(" + "))
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) Sub(expression NumericExpression) NumericExpression {
|
||
|
|
return newBinaryNumericExpression(n.parent, expression, []byte(" - "))
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) Mul(expression NumericExpression) NumericExpression {
|
||
|
|
return newBinaryNumericExpression(n.parent, expression, []byte(" * "))
|
||
|
|
}
|
||
|
|
|
||
|
|
func (n *numericInterfaceImpl) Div(expression NumericExpression) NumericExpression {
|
||
|
|
return newBinaryNumericExpression(n.parent, expression, []byte(" / "))
|
||
|
|
}
|
||
|
|
|
||
|
|
//---------------------------------------------------//
|
||
|
|
type numericLiteral struct {
|
||
|
|
numericInterfaceImpl
|
||
|
|
literalExpression
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewNumericLiteral(value interface{}) NumericExpression {
|
||
|
|
numericLiteral := numericLiteral{}
|
||
|
|
|
||
|
|
sqlValue, err := sqltypes.BuildValue(value)
|
||
|
|
if err != nil {
|
||
|
|
panic(errors.Wrap(err, "Invalid literal value"))
|
||
|
|
}
|
||
|
|
numericLiteral.literalExpression = *NewLiteralExpression(sqlValue)
|
||
|
|
numericLiteral.numericInterfaceImpl.parent = &numericLiteral
|
||
|
|
|
||
|
|
return &numericLiteral
|
||
|
|
}
|
||
|
|
|
||
|
|
//---------------------------------------------------//
|
||
|
|
type binaryNumericExpression struct {
|
||
|
|
expressionInterfaceImpl
|
||
|
|
numericInterfaceImpl
|
||
|
|
|
||
|
|
binaryExpression
|
||
|
|
}
|
||
|
|
|
||
|
|
func newBinaryNumericExpression(lhs, rhs Expression, operator []byte) NumericExpression {
|
||
|
|
numericExpression := binaryNumericExpression{}
|
||
|
|
|
||
|
|
numericExpression.binaryExpression = newBinaryExpression(lhs, rhs, operator)
|
||
|
|
|
||
|
|
numericExpression.expressionInterfaceImpl.parent = &numericExpression
|
||
|
|
numericExpression.numericInterfaceImpl.parent = &numericExpression
|
||
|
|
|
||
|
|
return &numericExpression
|
||
|
|
}
|