Skip to content

Commit

Permalink
rangeExpression change to make it more type safe
Browse files Browse the repository at this point in the history
  • Loading branch information
sarkan-ag5 committed Feb 12, 2024
1 parent a8bc101 commit 9e0879c
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 52 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/go-jet/jet/v2

go 1.11
go 1.21.6

require (
github.com/go-sql-driver/mysql v1.7.1
Expand Down
40 changes: 20 additions & 20 deletions internal/jet/func_expression.go
Original file line number Diff line number Diff line change
Expand Up @@ -471,13 +471,13 @@ func REGEXP_LIKE(stringExp StringExpression, pattern StringExpression, matchType
//----------Range Type Functions ----------------------//

// LOWER_BOUND returns range expressions lower bound
func LOWER_BOUND(rangeExpression RangeExpression) RangeExpression {
return NewRangeFunc("LOWER", rangeExpression)
func LOWER_BOUND[T Expression](rangeExpression Range[T]) Range[T] {
return NewRangeFunc[T]("LOWER", rangeExpression)
}

// UPPER_BOUND returns range expressions upper bound
func UPPER_BOUND(rangeExpression RangeExpression) RangeExpression {
return NewRangeFunc("UPPER", rangeExpression)
func UPPER_BOUND[T Expression](rangeExpression Range[T]) Range[T] {
return NewRangeFunc[T]("UPPER", rangeExpression)
}

//----------Data Type Formatting Functions ----------------------//
Expand Down Expand Up @@ -856,41 +856,41 @@ func Func(name string, expressions ...Expression) Expression {
return NewFunc(name, expressions, nil)
}

type rangeFunc struct {
type rangeFunc[T Expression] struct {
funcExpressionImpl
rangeInterfaceImpl
rangeInterfaceImpl[T]
}

// NewRangeFunc creates new range function with name and expression parameters
func NewRangeFunc(name string, expressions ...Expression) *rangeFunc {
rangeFunc := &rangeFunc{}
func NewRangeFunc[T Expression](name string, expressions ...Expression) *rangeFunc[T] {
rangeFunc := &rangeFunc[T]{}

rangeFunc.funcExpressionImpl = *NewFunc(name, expressions, rangeFunc)
rangeFunc.rangeInterfaceImpl.parent = rangeFunc

return rangeFunc
}

func NumRange(lowNum, highNum NumericExpression, bounds StringExpression) RangeExpression {
return RangeExp(NewFunc("numrange", []Expression{lowNum, highNum, bounds}, nil))
func NumRange(lowNum, highNum NumericExpression, bounds StringExpression) Range[NumericExpression] {
return RangeExp[NumericExpression](NewFunc("numrange", []Expression{lowNum, highNum, bounds}, nil))
}

func Int4Range(lowNum, highNum NumericExpression, bounds StringExpression) RangeExpression {
return RangeExp(NewFunc("int4range", []Expression{lowNum, highNum, bounds}, nil))
func Int4Range(lowNum, highNum IntegerExpression, bounds StringExpression) Range[IntegerExpression] {
return RangeExp[IntegerExpression](NewFunc("int4range", []Expression{lowNum, highNum, bounds}, nil))
}

func Int8Range(lowNum, highNum NumericExpression, bounds StringExpression) RangeExpression {
return RangeExp(NewFunc("int8range", []Expression{lowNum, highNum, bounds}, nil))
func Int8Range(lowNum, highNum IntegerExpression, bounds StringExpression) Range[IntegerExpression] {
return RangeExp[IntegerExpression](NewFunc("int8range", []Expression{lowNum, highNum, bounds}, nil))
}

func TimestampRange(lowTs, highTs TimestampExpression, bounds StringExpression) RangeExpression {
return RangeExp(NewFunc("tsrange", []Expression{lowTs, highTs, bounds}, nil))
func TimestampRange(lowTs, highTs TimestampExpression, bounds StringExpression) Range[TimestampExpression] {
return RangeExp[TimestampExpression](NewFunc("tsrange", []Expression{lowTs, highTs, bounds}, nil))
}

func TimestampzRange(lowTs, highTs TimestampzExpression, bounds StringExpression) RangeExpression {
return RangeExp(NewFunc("tstzrange", []Expression{lowTs, highTs, bounds}, nil))
func TimestampzRange(lowTs, highTs TimestampzExpression, bounds StringExpression) Range[TimestampzExpression] {
return RangeExp[TimestampzExpression](NewFunc("tstzrange", []Expression{lowTs, highTs, bounds}, nil))
}

func DateRange(lowTs, highTs DateExpression, bounds StringExpression) RangeExpression {
return RangeExp(NewFunc("daterange", []Expression{lowTs, highTs, bounds}, nil))
func DateRange(lowTs, highTs DateExpression, bounds StringExpression) Range[DateExpression] {
return RangeExp[DateExpression](NewFunc("daterange", []Expression{lowTs, highTs, bounds}, nil))
}
62 changes: 31 additions & 31 deletions internal/jet/range_expression.go
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)
}

0 comments on commit 9e0879c

Please sign in to comment.