-
Notifications
You must be signed in to change notification settings - Fork 116
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rangeExpression change to make it more type safe
- Loading branch information
1 parent
a8bc101
commit 9e0879c
Showing
3 changed files
with
52 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,90 +1,90 @@ | ||
package jet | ||
|
||
// RangeExpression is interface for date range types | ||
type RangeExpression interface { | ||
// Range Expression is interface for date range types | ||
type Range[T Expression] interface { | ||
Expression | ||
|
||
EQ(rhs RangeExpression) BoolExpression | ||
NOT_EQ(rhs RangeExpression) BoolExpression | ||
EQ(rhs Range[T]) BoolExpression | ||
NOT_EQ(rhs Range[T]) BoolExpression | ||
|
||
LT(rhs RangeExpression) BoolExpression | ||
LT_EQ(rhs RangeExpression) BoolExpression | ||
GT(rhs RangeExpression) BoolExpression | ||
GT_EQ(rhs RangeExpression) BoolExpression | ||
LT(rhs Range[T]) BoolExpression | ||
LT_EQ(rhs Range[T]) BoolExpression | ||
GT(rhs Range[T]) BoolExpression | ||
GT_EQ(rhs Range[T]) BoolExpression | ||
|
||
CONTAINS(rhs Expression) BoolExpression | ||
OVERLAP(rhs RangeExpression) BoolExpression | ||
UNION(rhs RangeExpression) RangeExpression | ||
INTERSECTION(rhs RangeExpression) RangeExpression | ||
DIFFERENCE(rhs RangeExpression) RangeExpression | ||
CONTAINS(rhs T) BoolExpression | ||
OVERLAP(rhs Range[T]) BoolExpression | ||
UNION(rhs Range[T]) Range[T] | ||
INTERSECTION(rhs Range[T]) Range[T] | ||
DIFFERENCE(rhs Range[T]) Range[T] | ||
} | ||
|
||
type rangeInterfaceImpl struct { | ||
type rangeInterfaceImpl[T Expression] struct { | ||
parent Expression | ||
} | ||
|
||
func (r *rangeInterfaceImpl) EQ(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) EQ(rhs Range[T]) BoolExpression { | ||
return Eq(r.parent, rhs) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) NOT_EQ(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) NOT_EQ(rhs Range[T]) BoolExpression { | ||
return NotEq(r.parent, rhs) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) LT(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) LT(rhs Range[T]) BoolExpression { | ||
return Lt(r.parent, rhs) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) LT_EQ(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) LT_EQ(rhs Range[T]) BoolExpression { | ||
return LtEq(r.parent, rhs) | ||
|
||
} | ||
|
||
func (r *rangeInterfaceImpl) GT(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) GT(rhs Range[T]) BoolExpression { | ||
return Gt(r.parent, rhs) | ||
|
||
} | ||
|
||
func (r *rangeInterfaceImpl) GT_EQ(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) GT_EQ(rhs Range[T]) BoolExpression { | ||
return GtEq(r.parent, rhs) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) CONTAINS(rhs Expression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) CONTAINS(rhs T) BoolExpression { | ||
return Contains(r.parent, rhs) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) OVERLAP(rhs RangeExpression) BoolExpression { | ||
func (r *rangeInterfaceImpl[T]) OVERLAP(rhs Range[T]) BoolExpression { | ||
return Overlap(r.parent, rhs) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) UNION(rhs RangeExpression) RangeExpression { | ||
func (r *rangeInterfaceImpl[T]) UNION(rhs Range[T]) Range[T] { | ||
return RangeExp(Add(r.parent, rhs)) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) INTERSECTION(rhs RangeExpression) RangeExpression { | ||
func (r *rangeInterfaceImpl[T]) INTERSECTION(rhs Range[T]) Range[T] { | ||
return RangeExp(Mul(r.parent, rhs)) | ||
} | ||
|
||
func (r *rangeInterfaceImpl) DIFFERENCE(rhs RangeExpression) RangeExpression { | ||
func (r *rangeInterfaceImpl[T]) DIFFERENCE(rhs Range[T]) Range[T] { | ||
return RangeExp(Sub(r.parent, rhs)) | ||
} | ||
|
||
//---------------------------------------------------// | ||
|
||
type rangeExpressionWrapper struct { | ||
rangeInterfaceImpl | ||
type rangeExpressionWrapper[T Expression] struct { | ||
rangeInterfaceImpl[T] | ||
Expression | ||
} | ||
|
||
func newRangeExpressionWrap(expression Expression) RangeExpression { | ||
rangeExpressionWrap := rangeExpressionWrapper{Expression: expression} | ||
func newRangeExpressionWrap[T Expression](expression Expression) Range[T] { | ||
rangeExpressionWrap := rangeExpressionWrapper[T]{Expression: expression} | ||
rangeExpressionWrap.rangeInterfaceImpl.parent = &rangeExpressionWrap | ||
return &rangeExpressionWrap | ||
} | ||
|
||
// RangeExp is range expression wrapper around arbitrary expression. | ||
// Allows go compiler to see any expression as range expression. | ||
// Does not add sql cast to generated sql builder output. | ||
func RangeExp(expression Expression) RangeExpression { | ||
return newRangeExpressionWrap(expression) | ||
func RangeExp[T Expression](expression Expression) Range[T] { | ||
return newRangeExpressionWrap[T](expression) | ||
} |