Skip to content

Commit

Permalink
Merge pull request #3 from KoNekoD/refactor-query-builder
Browse files Browse the repository at this point in the history
refactor: simplify method arguments usage
  • Loading branch information
KoNekoD authored Feb 13, 2025
2 parents 832c3ed + 44499ab commit f563196
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 176 deletions.
29 changes: 6 additions & 23 deletions pkg/dtos/composite_expression.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,40 +51,23 @@ type CompositeExpression struct {
// NewCompositeExpression - Use the NewAndCompositeExpression() / NewOrCompositeExpression() factory methods.
func NewCompositeExpression(
expressionType CompositeExpressionType,
part *CompositeExpressionOrString,
parts ...*CompositeExpressionOrString,
) *CompositeExpression {
parts = append([]*CompositeExpressionOrString{part}, parts...)

return &CompositeExpression{
exprType: string(expressionType),
parts: parts,
}
return &CompositeExpression{exprType: string(expressionType), parts: parts}
}

func NewAndCompositeExpression(
part *CompositeExpressionOrString,
parts ...*CompositeExpressionOrString,
) *CompositeExpression {
return NewCompositeExpression(CompositeExpressionTypeAnd, part, parts...)
func NewAndCompositeExpression(parts ...*CompositeExpressionOrString) *CompositeExpression {
return NewCompositeExpression(CompositeExpressionTypeAnd, parts...)
}

func NewOrCompositeExpression(
part *CompositeExpressionOrString,
parts ...*CompositeExpressionOrString,
) *CompositeExpression {
return NewCompositeExpression(CompositeExpressionTypeOr, part, parts...)
func NewOrCompositeExpression(parts ...*CompositeExpressionOrString) *CompositeExpression {
return NewCompositeExpression(CompositeExpressionTypeOr, parts...)
}

// With - Returns a new CompositeExpression with the given parts added.
func (c *CompositeExpression) With(
part *CompositeExpressionOrString,
parts ...*CompositeExpressionOrString,
) *CompositeExpression {
func (c *CompositeExpression) With(parts ...*CompositeExpressionOrString) *CompositeExpression {
that := c.Clone()

parts = append([]*CompositeExpressionOrString{part}, parts...)

that.parts = append(that.parts, parts...)

return that
Expand Down
52 changes: 12 additions & 40 deletions pkg/expression_builders/expression_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,60 +18,32 @@ const (
)

// And - Creates a conjunction of the given expressions.
func (b *ExpressionBuilder) And(
expression string,
expressions ...string,
) *dtos.CompositeExpression {
expressionComposite := &dtos.CompositeExpressionOrString{String: &expression}

expressionsComposite := make(
[]*dtos.CompositeExpressionOrString,
len(expressions),
)
for i, e := range expressions {
func (b *ExpressionBuilder) And(expr ...string) *dtos.CompositeExpression {
expressionsComposite := make([]*dtos.CompositeExpressionOrString, len(expr))
for i, e := range expr {
expressionsComposite[i] = &dtos.CompositeExpressionOrString{String: &e}
}

return dtos.NewAndCompositeExpression(
expressionComposite,
expressionsComposite...,
)
return dtos.NewAndCompositeExpression(expressionsComposite...)
}

// AndComposite - Creates a conjunction of the given expressions.
func (b *ExpressionBuilder) AndComposite(
expression *dtos.CompositeExpressionOrString,
expressions ...*dtos.CompositeExpressionOrString,
) *dtos.CompositeExpression {
return dtos.NewAndCompositeExpression(expression, expressions...)
func (b *ExpressionBuilder) AndComposite(expr ...*dtos.CompositeExpressionOrString) *dtos.CompositeExpression {
return dtos.NewAndCompositeExpression(expr...)
}

// Or - Creates a disjunction of the given expressions.
func (b *ExpressionBuilder) Or(
expression string,
expressions ...string,
) *dtos.CompositeExpression {
expressionComposite := &dtos.CompositeExpressionOrString{String: &expression}

expressionsComposite := make(
[]*dtos.CompositeExpressionOrString,
len(expressions),
)
for i, e := range expressions {
func (b *ExpressionBuilder) Or(expr ...string) *dtos.CompositeExpression {
expressionsComposite := make([]*dtos.CompositeExpressionOrString, len(expr))
for i, e := range expr {
expressionsComposite[i] = &dtos.CompositeExpressionOrString{String: &e}
}

return dtos.NewOrCompositeExpression(
expressionComposite,
expressionsComposite...,
)
return dtos.NewOrCompositeExpression(expressionsComposite...)
}

func (b *ExpressionBuilder) OrComposite(
expression *dtos.CompositeExpressionOrString,
expressions ...*dtos.CompositeExpressionOrString,
) *dtos.CompositeExpression {
return dtos.NewOrCompositeExpression(expression, expressions...)
func (b *ExpressionBuilder) OrComposite(expr ...*dtos.CompositeExpressionOrString) *dtos.CompositeExpression {
return dtos.NewOrCompositeExpression(expr...)
}

// Comparison - Creates a comparison expression.
Expand Down
150 changes: 37 additions & 113 deletions pkg/gormite_query_builders/query_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -420,14 +420,9 @@ func (qb *QueryBuilder[ResultType]) Distinct(distinct bool) *QueryBuilder[Result
// .leftJoin('u', 'phonenumbers', 'u.id = p.user_id');
//
// </code>
// @param string expression The selection expression.
// @param string ...expressions Additional selection expressions.
func (qb *QueryBuilder[ResultType]) AddSelect(
expression string,
expressions ...string,
) *QueryBuilder[ResultType] {
// @param string expression The selection expressions.
func (qb *QueryBuilder[ResultType]) AddSelect(expressions ...string) *QueryBuilder[ResultType] {
qb.queryType = enums.QueryTypeSelect
qb.selectParts = append(qb.selectParts, expression)
qb.selectParts = append(qb.selectParts, expressions...)
qb.sql = nil
return qb
Expand Down Expand Up @@ -648,13 +643,8 @@ func (qb *QueryBuilder[ResultType]) Set(key, value string) *QueryBuilder[ResultT
// .where(or);
//
// </code>
// @param string|CompositeExpression predicate The WHERE clause predicate.
// @param string|CompositeExpression ...predicates Additional WHERE clause predicates.
func (qb *QueryBuilder[ResultType]) Where(
predicate string,
predicates ...string,
) *QueryBuilder[ResultType] {
predicateItem := &dtos.CompositeExpressionOrString{String: &predicate}
// @param string|CompositeExpression predicate The WHERE clause predicates.
func (qb *QueryBuilder[ResultType]) Where(predicates ...string) *QueryBuilder[ResultType] {
predicatesItem := make([]*dtos.CompositeExpressionOrString, 0)
for _, s := range predicates {
predicatesItem = append(
Expand All @@ -663,16 +653,13 @@ func (qb *QueryBuilder[ResultType]) Where(
)
}

qb.where = qb.createPredicate(predicateItem, predicatesItem...)
qb.where = qb.createPredicate(predicatesItem...)
qb.sql = nil
return qb
}

func (qb *QueryBuilder[ResultType]) WhereViaExpr(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *QueryBuilder[ResultType] {
qb.where = qb.createPredicate(predicate, predicates...)
func (qb *QueryBuilder[ResultType]) WhereViaExpr(predicates ...*dtos.CompositeExpressionOrString) *QueryBuilder[ResultType] {
qb.where = qb.createPredicate(predicates...)
qb.sql = nil
return qb
}
Expand All @@ -689,13 +676,8 @@ func (qb *QueryBuilder[ResultType]) WhereViaExpr(
//
// </code>
// @see where()
// @param string|CompositeExpression predicate The predicate to append.
// @param string|CompositeExpression ...predicates Additional predicates to append.
func (qb *QueryBuilder[ResultType]) AndWhere(
predicate string,
predicates ...string,
) *QueryBuilder[ResultType] {
predicateItem := &dtos.CompositeExpressionOrString{String: &predicate}
// @param string|CompositeExpression predicate The predicates to append.
func (qb *QueryBuilder[ResultType]) AndWhere(predicates ...string) *QueryBuilder[ResultType] {
predicatesItem := make([]*dtos.CompositeExpressionOrString, 0)
for _, s := range predicates {
predicatesItem = append(
Expand All @@ -707,26 +689,17 @@ func (qb *QueryBuilder[ResultType]) AndWhere(
qb.where = qb.appendToPredicate(
qb.where,
dtos.CompositeExpressionTypeAnd,
append(
[]*dtos.CompositeExpressionOrString{predicateItem},
predicatesItem...,
)...,
predicatesItem...,
)
qb.sql = nil
return qb
}

func (qb *QueryBuilder[ResultType]) AndWhereViaExpr(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *QueryBuilder[ResultType] {
func (qb *QueryBuilder[ResultType]) AndWhereViaExpr(predicates ...*dtos.CompositeExpressionOrString) *QueryBuilder[ResultType] {
qb.where = qb.appendToPredicate(
qb.where,
dtos.CompositeExpressionTypeAnd,
append(
[]*dtos.CompositeExpressionOrString{predicate},
predicates...,
)...,
predicates...,
)
qb.sql = nil
return qb
Expand All @@ -744,19 +717,12 @@ func (qb *QueryBuilder[ResultType]) AndWhereViaExpr(
//
// </code>
// @see where()
// @param string|CompositeExpression predicate The predicate to append.
// @param string|CompositeExpression ...predicates Additional predicates to append.
func (qb *QueryBuilder[ResultType]) OrWhere(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *QueryBuilder[ResultType] {
// @param string|CompositeExpression predicate The predicates to append.
func (qb *QueryBuilder[ResultType]) OrWhere(predicates ...*dtos.CompositeExpressionOrString) *QueryBuilder[ResultType] {
qb.where = qb.appendToPredicate(
qb.where,
dtos.CompositeExpressionTypeOr,
append(
[]*dtos.CompositeExpressionOrString{predicate},
predicates...,
)...,
predicates...,
)
qb.sql = nil
return qb
Expand All @@ -772,13 +738,9 @@ func (qb *QueryBuilder[ResultType]) OrWhere(
// .groupBy('u.id');
//
// </code>
// @param string expression The grouping expression
// @param string ...expressions Additional grouping expressions
func (qb *QueryBuilder[ResultType]) GroupBy(
expression string,
expressions ...string,
) *QueryBuilder[ResultType] {
qb.groupBy = append([]string{expression}, expressions...)
// @param string expression The grouping expressions
func (qb *QueryBuilder[ResultType]) GroupBy(expressions ...string) *QueryBuilder[ResultType] {
qb.groupBy = append([]string{}, expressions...)
qb.sql = nil
return qb
}
Expand All @@ -793,16 +755,9 @@ func (qb *QueryBuilder[ResultType]) GroupBy(
// .addGroupBy('u.createdAt');
//
// </code>
// @param string expression The grouping expression
// @param string ...expressions Additional grouping expressions
func (qb *QueryBuilder[ResultType]) AddGroupBy(
expression string,
expressions ...string,
) *QueryBuilder[ResultType] {
qb.groupBy = append(
qb.groupBy,
append([]string{expression}, expressions...)...,
)
// @param string expression The grouping expressions
func (qb *QueryBuilder[ResultType]) AddGroupBy(expressions ...string) *QueryBuilder[ResultType] {
qb.groupBy = append(qb.groupBy, expressions...)
qb.sql = nil
return qb
}
Expand Down Expand Up @@ -850,71 +805,46 @@ func (qb *QueryBuilder[ResultType]) Values(values map[string]string) *QueryBuild

// Having - Specifies a restriction over the groups of the query.
// Replaces any previous having restrictions, if any.
// @param string|CompositeExpression predicate The HAVING clause predicate.
// @param string|CompositeExpression ...predicates Additional HAVING clause predicates.
func (qb *QueryBuilder[ResultType]) Having(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *QueryBuilder[ResultType] {
qb.having = qb.createPredicate(predicate, predicates...)
// @param string|CompositeExpression predicate The HAVING clause predicates.
func (qb *QueryBuilder[ResultType]) Having(predicates ...*dtos.CompositeExpressionOrString) *QueryBuilder[ResultType] {
qb.having = qb.createPredicate(predicates...)
qb.sql = nil
return qb
}

// AndHaving - Adds a restriction over the groups of the query, forming a logical
// conjunction with any existing having restrictions.
// @param string|CompositeExpression predicate The predicate to append.
// @param string|CompositeExpression ...predicates Additional predicates to append.
func (qb *QueryBuilder[ResultType]) AndHaving(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *QueryBuilder[ResultType] {
// @param string|CompositeExpression predicate The predicates to append.
func (qb *QueryBuilder[ResultType]) AndHaving(predicates ...*dtos.CompositeExpressionOrString) *QueryBuilder[ResultType] {
qb.having = qb.appendToPredicate(
qb.having,
dtos.CompositeExpressionTypeAnd,
append(
[]*dtos.CompositeExpressionOrString{predicate},
predicates...,
)...,
predicates...,
)
qb.sql = nil
return qb
}

// OrHaving - Adds a restriction over the groups of the query, forming a logical
// disjunction with any existing having restrictions.
// @param string|CompositeExpression predicate The predicate to append.
// @param string|CompositeExpression ...predicates Additional predicates to append.
func (qb *QueryBuilder[ResultType]) OrHaving(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *QueryBuilder[ResultType] {
// @param string|CompositeExpression predicate The predicates to append.
func (qb *QueryBuilder[ResultType]) OrHaving(predicates ...*dtos.CompositeExpressionOrString) *QueryBuilder[ResultType] {
qb.having = qb.appendToPredicate(
qb.having,
dtos.CompositeExpressionTypeOr,
append(
[]*dtos.CompositeExpressionOrString{predicate},
predicates...,
)...,
predicates...,
)
qb.sql = nil
return qb
}

// createPredicate - Creates a CompositeExpression from one or more predicates combined by the AND logic.
func (qb *QueryBuilder[ResultType]) createPredicate(
predicate *dtos.CompositeExpressionOrString,
predicates ...*dtos.CompositeExpressionOrString,
) *dtos.CompositeExpressionOrString {
if len(predicates) == 0 {
return predicate
}
return &dtos.CompositeExpressionOrString{
CompositeExpression: dtos.NewAndCompositeExpression(
predicate,
predicates...,
),
func (qb *QueryBuilder[ResultType]) createPredicate(predicates ...*dtos.CompositeExpressionOrString) *dtos.CompositeExpressionOrString {
if len(predicates) == 1 {
return predicates[0]
}

return &dtos.CompositeExpressionOrString{CompositeExpression: dtos.NewAndCompositeExpression(predicates...)}
}

// appendToPredicate - Appends the given predicates combined by the given type of logic to the current predicate.
Expand All @@ -924,12 +854,7 @@ func (qb *QueryBuilder[ResultType]) appendToPredicate(
predicates ...*dtos.CompositeExpressionOrString,
) *dtos.CompositeExpressionOrString {
if currentPredicate != nil && currentPredicate.CompositeExpression != nil && currentPredicate.CompositeExpression.GetType() == string(exprType) {
return &dtos.CompositeExpressionOrString{
CompositeExpression: currentPredicate.CompositeExpression.With(
predicates[0],
predicates[1:]...,
),
}
return &dtos.CompositeExpressionOrString{CompositeExpression: currentPredicate.CompositeExpression.With(predicates...)}
}

if currentPredicate != nil {
Expand All @@ -944,8 +869,7 @@ func (qb *QueryBuilder[ResultType]) appendToPredicate(
return &dtos.CompositeExpressionOrString{
CompositeExpression: dtos.NewCompositeExpression(
exprType,
predicates[0],
predicates[1:]...,
predicates...,
),
}
}
Expand Down

0 comments on commit f563196

Please sign in to comment.