102 lines
2.9 KiB
Go
102 lines
2.9 KiB
Go
package jet
|
|
|
|
// RowExpression interface
|
|
type RowExpression interface {
|
|
Expression
|
|
HasProjections
|
|
|
|
EQ(rhs RowExpression) BoolExpression
|
|
NOT_EQ(rhs RowExpression) BoolExpression
|
|
IS_DISTINCT_FROM(rhs RowExpression) BoolExpression
|
|
IS_NOT_DISTINCT_FROM(rhs RowExpression) BoolExpression
|
|
|
|
LT(rhs RowExpression) BoolExpression
|
|
LT_EQ(rhs RowExpression) BoolExpression
|
|
GT(rhs RowExpression) BoolExpression
|
|
GT_EQ(rhs RowExpression) BoolExpression
|
|
}
|
|
|
|
type rowInterfaceImpl struct {
|
|
parent Expression
|
|
dialect Dialect
|
|
elemCount int
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) EQ(rhs RowExpression) BoolExpression {
|
|
return Eq(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) NOT_EQ(rhs RowExpression) BoolExpression {
|
|
return NotEq(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) IS_DISTINCT_FROM(rhs RowExpression) BoolExpression {
|
|
return IsDistinctFrom(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) IS_NOT_DISTINCT_FROM(rhs RowExpression) BoolExpression {
|
|
return IsNotDistinctFrom(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) GT(rhs RowExpression) BoolExpression {
|
|
return Gt(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) GT_EQ(rhs RowExpression) BoolExpression {
|
|
return GtEq(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) LT(rhs RowExpression) BoolExpression {
|
|
return Lt(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) LT_EQ(rhs RowExpression) BoolExpression {
|
|
return LtEq(n.parent, rhs)
|
|
}
|
|
|
|
func (n *rowInterfaceImpl) projections() ProjectionList {
|
|
var ret ProjectionList
|
|
|
|
for i := 0; i < n.elemCount; i++ {
|
|
rowColumn := NewColumnImpl(n.dialect.ValuesDefaultColumnName(i), "", nil)
|
|
ret = append(ret, &rowColumn)
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
// ---------------------------------------------------//
|
|
type rowExpressionWrapper struct {
|
|
rowInterfaceImpl
|
|
Expression
|
|
}
|
|
|
|
func newRowExpression(name string, dialect Dialect, expressions ...Expression) RowExpression {
|
|
ret := &rowExpressionWrapper{}
|
|
ret.rowInterfaceImpl.parent = ret
|
|
|
|
ret.Expression = NewFunc(name, expressions, ret)
|
|
ret.dialect = dialect
|
|
ret.elemCount = len(expressions)
|
|
|
|
return ret
|
|
}
|
|
|
|
// ROW function is used to create a tuple value that consists of a set of expressions or column values.
|
|
func ROW(dialect Dialect, expressions ...Expression) RowExpression {
|
|
return newRowExpression("ROW", dialect, expressions...)
|
|
}
|
|
|
|
// WRAP creates row expressions without ROW keyword `( expression1, expression2, ... )`.
|
|
func WRAP(dialect Dialect, expressions ...Expression) RowExpression {
|
|
return newRowExpression("", dialect, expressions...)
|
|
}
|
|
|
|
// RowExp serves as a wrapper for an arbitrary expression, treating it as a row expression.
|
|
// This enables the Go compiler to interpret any expression as a row expression
|
|
// Note: This does not modify the generated SQL builder output by adding a SQL CAST operation.
|
|
func RowExp(expression Expression) RowExpression {
|
|
rowExpressionWrap := rowExpressionWrapper{Expression: expression}
|
|
rowExpressionWrap.rowInterfaceImpl.parent = &rowExpressionWrap
|
|
return &rowExpressionWrap
|
|
}
|