Skip to content
This repository was archived by the owner on Nov 7, 2025. It is now read-only.

Commit 592a6f8

Browse files
committed
overwrite groupby expr
1 parent 9f8390c commit 592a6f8

File tree

6 files changed

+70
-42
lines changed

6 files changed

+70
-42
lines changed

platform/model/base_visitor.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type BaseExprVisitor struct {
1212
OverrideVisitNestedProperty func(b *BaseExprVisitor, e NestedProperty) interface{}
1313
OverrideVisitArrayAccess func(b *BaseExprVisitor, e ArrayAccess) interface{}
1414
OverrideVisitOrderByExpr func(b *BaseExprVisitor, e OrderByExpr) interface{}
15+
OverrideVisitGroupByExpr func(b *BaseExprVisitor, e GroupByExpr) interface{}
1516
OverrideVisitDistinctExpr func(b *BaseExprVisitor, e DistinctExpr) interface{}
1617
OverrideVisitTableRef func(b *BaseExprVisitor, e TableRef) interface{}
1718
OverrideVisitAliasedExpr func(b *BaseExprVisitor, e AliasedExpr) interface{}
@@ -107,6 +108,13 @@ func (v *BaseExprVisitor) VisitTableRef(e TableRef) interface{} {
107108
return e
108109
}
109110

111+
func (v *BaseExprVisitor) VisitGroupByExpr(e GroupByExpr) interface{} {
112+
if v.OverrideVisitGroupByExpr != nil {
113+
return v.OverrideVisitGroupByExpr(v, e)
114+
}
115+
return GroupByExpr{Expr: e.Expr.Accept(v).(Expr), GroupAlias: e.GroupAlias}
116+
}
117+
110118
func (v *BaseExprVisitor) VisitOrderByExpr(e OrderByExpr) interface{} {
111119
if v.OverrideVisitOrderByExpr != nil {
112120
return v.OverrideVisitOrderByExpr(v, e)

platform/model/expr.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package model
44

55
import (
66
"fmt"
7-
"strconv"
7+
"github.com/QuesmaOrg/quesma/platform/util"
88
)
99

1010
// Expr is a generic representation of an expression which is a part of the SQL query.
@@ -203,17 +203,17 @@ func (t TableRef) Accept(v ExprVisitor) interface{} {
203203
}
204204

205205
type GroupByExpr struct {
206-
Expr Expr
206+
Expr Expr
207+
GroupAlias string
208+
}
209+
210+
func (g GroupByExpr) Accept(v ExprVisitor) interface{} {
211+
return v.VisitGroupByExpr(g)
207212
}
208213

209-
//
210-
//func NewGroupByExpr(exprs ...Expr) GroupByExpr {
211-
// return GroupByExpr{Exprs: exprs}
212-
//}
213-
//
214-
//func (e GroupByExpr) Accept(v ExprVisitor) interface{} {
215-
// return v.VisitGroupBY(e)
216-
//}
214+
func NewGroupByExpr(expr Expr, groupAlias string) GroupByExpr {
215+
return GroupByExpr{Expr: expr, GroupAlias: groupAlias}
216+
}
217217

218218
type OrderByDirection int8
219219

@@ -265,7 +265,11 @@ func NewAliasedExpr(expr Expr, alias string) AliasedExpr {
265265
func (a AliasedExpr) Accept(v ExprVisitor) interface{} { return v.VisitAliasedExpr(a) }
266266

267267
func (a AliasedExpr) AliasRef() LiteralExpr {
268-
return LiteralExpr{Value: strconv.Quote(a.Alias)}
268+
return LiteralExpr{Value: util.BackquoteIdentifier(a.Alias)}
269+
}
270+
271+
func (g GroupByExpr) GroupAliasRef() LiteralExpr {
272+
return LiteralExpr{Value: util.BackquoteIdentifier(g.GroupAlias)}
269273
}
270274

271275
// WindowFunction representation e.g. `SUM(x) OVER (PARTITION BY y ORDER BY z)`
@@ -352,6 +356,7 @@ type ExprVisitor interface {
352356
VisitNestedProperty(e NestedProperty) interface{}
353357
VisitArrayAccess(e ArrayAccess) interface{}
354358
VisitOrderByExpr(e OrderByExpr) interface{}
359+
VisitGroupByExpr(e GroupByExpr) interface{}
355360
VisitDistinctExpr(e DistinctExpr) interface{}
356361
VisitTableRef(e TableRef) interface{}
357362
VisitAliasedExpr(e AliasedExpr) interface{}

platform/model/expr_string_renderer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ func (v *renderer) VisitInfix(e InfixExpr) interface{} {
133133
}
134134
}
135135

136+
func (v *renderer) VisitGroupByExpr(e GroupByExpr) interface{} {
137+
return fmt.Sprintf("%s ", e.Expr.Accept(v).(string))
138+
}
139+
136140
func (v *renderer) VisitOrderByExpr(e OrderByExpr) interface{} {
137141
allExprs := e.Expr.Accept(v).(string)
138142
if e.Direction == DescOrder {

platform/model/noop_visitor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ func (NoOpVisitor) VisitPrefixExpr(e PrefixExpr) interface{} { return e
1414
func (NoOpVisitor) VisitNestedProperty(e NestedProperty) interface{} { return e }
1515
func (NoOpVisitor) VisitArrayAccess(e ArrayAccess) interface{} { return e }
1616
func (NoOpVisitor) VisitOrderByExpr(e OrderByExpr) interface{} { return e }
17+
func (NoOpVisitor) VisitGroupByExpr(e GroupByExpr) interface{} { return e }
1718
func (NoOpVisitor) VisitDistinctExpr(e DistinctExpr) interface{} { return e }
1819
func (NoOpVisitor) VisitTableRef(e TableRef) interface{} { return e }
1920
func (NoOpVisitor) VisitAliasedExpr(e AliasedExpr) interface{} { return e }

platform/parsers/elastic_query_dsl/pancake_sql_query_generation.go

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ func (p *pancakeSqlQueryGenerator) aliasedExprArrayToExpr(aliasedExprs []model.A
2929
return exprs
3030
}
3131

32+
func (p *pancakeSqlQueryGenerator) groupByExprArrayToExpr(groupExprs []model.GroupByExpr) []model.Expr {
33+
exprs := make([]model.Expr, 0, len(groupExprs))
34+
for _, groupExpr := range groupExprs {
35+
exprs = append(exprs, groupExpr)
36+
}
37+
return exprs
38+
}
39+
3240
func (p *pancakeSqlQueryGenerator) aliasedExprArrayToLiteralExpr(aliasedExprs []model.AliasedExpr) []model.Expr {
3341
exprs := make([]model.Expr, 0, len(aliasedExprs))
3442
for _, aliasedExpr := range aliasedExprs {
@@ -37,10 +45,10 @@ func (p *pancakeSqlQueryGenerator) aliasedExprArrayToLiteralExpr(aliasedExprs []
3745
return exprs
3846
}
3947

40-
func (p *pancakeSqlQueryGenerator) generatePartitionBy(groupByColumns []model.AliasedExpr) []model.Expr {
48+
func (p *pancakeSqlQueryGenerator) generatePartitionBy(groupByColumns []model.GroupByExpr) []model.Expr {
4149
partitionBy := make([]model.Expr, 0)
4250
for _, col := range groupByColumns {
43-
partitionBy = append(partitionBy, col.AliasRef())
51+
partitionBy = append(partitionBy, col.GroupAliasRef())
4452
}
4553
return partitionBy
4654
}
@@ -101,7 +109,7 @@ func (p *pancakeSqlQueryGenerator) generateAccumAggrFunctions(origExpr model.Exp
101109
fmt.Errorf("not implemented, queryType: %s, origExpr: %s", debugQueryType, model.AsString(origExpr))
102110
}
103111

104-
func (p *pancakeSqlQueryGenerator) generateMetricSelects(metric *pancakeModelMetricAggregation, groupByColumns []model.AliasedExpr, hasMoreBucketAggregations bool) (addSelectColumns []model.AliasedExpr, err error) {
112+
func (p *pancakeSqlQueryGenerator) generateMetricSelects(metric *pancakeModelMetricAggregation, groupByColumns []model.GroupByExpr, hasMoreBucketAggregations bool) (addSelectColumns []model.AliasedExpr, err error) {
105113
for columnId, column := range metric.selectedColumns {
106114
finalColumn := column
107115

@@ -119,27 +127,31 @@ func (p *pancakeSqlQueryGenerator) generateMetricSelects(metric *pancakeModelMet
119127
return
120128
}
121129

122-
func (p *pancakeSqlQueryGenerator) isPartOf(column model.Expr, aliasedColumns []model.AliasedExpr) *model.AliasedExpr {
130+
func (p *pancakeSqlQueryGenerator) isPartOf(column model.Expr, aliasedColumns []model.GroupByExpr) *model.AliasedExpr {
123131
for _, aliasedColumn := range aliasedColumns {
124-
if model.PartlyImplementedIsEqual(column, aliasedColumn) {
125-
return &aliasedColumn
132+
if model.PartlyImplementedIsEqual(column, aliasedColumn.Expr) {
133+
result := model.AliasedExpr{
134+
Expr: aliasedColumn.Expr,
135+
Alias: aliasedColumn.GroupAlias,
136+
}
137+
return &result
126138
}
127139
}
128140
return nil
129141
}
130142

131-
func (p *pancakeSqlQueryGenerator) isPartOfOrderBy(alias model.AliasedExpr, orderByColumns []model.OrderByExpr) bool {
143+
func (p *pancakeSqlQueryGenerator) isPartOfOrderBy(alias model.GroupByExpr, orderByColumns []model.OrderByExpr) bool {
132144
for _, orderBy := range orderByColumns {
133145
if orderByLiteral, ok := orderBy.Expr.(model.LiteralExpr); ok {
134-
if alias.AliasRef().Value == orderByLiteral.Value {
146+
if alias.GroupAlias == orderByLiteral.Value {
135147
return true
136148
}
137149
}
138150
}
139151
return false
140152
}
141153

142-
func (p *pancakeSqlQueryGenerator) addPotentialParentCount(bucketAggregation *pancakeModelBucketAggregation, groupByColumns []model.AliasedExpr) []model.AliasedExpr {
154+
func (p *pancakeSqlQueryGenerator) addPotentialParentCount(bucketAggregation *pancakeModelBucketAggregation, groupByColumns []model.GroupByExpr) []model.AliasedExpr {
143155
if query_util.IsAnyKindOfTerms(bucketAggregation.queryType) {
144156
parentCountColumn := model.NewWindowFunction("sum",
145157
[]model.Expr{model.NewCountFunc()},
@@ -150,20 +162,16 @@ func (p *pancakeSqlQueryGenerator) addPotentialParentCount(bucketAggregation *pa
150162
return []model.AliasedExpr{}
151163
}
152164

153-
func (p *pancakeSqlQueryGenerator) generateBucketSqlParts(query *pancakeModel, bucketAggregation *pancakeModelBucketAggregation, groupByColumns []model.AliasedExpr, hasMoreBucketAggregations bool) (
154-
addSelectColumns, addGroupBys, addRankColumns []model.AliasedExpr, addRankWheres []model.Expr, addRankOrderBys []model.OrderByExpr, err error) {
165+
func (p *pancakeSqlQueryGenerator) generateBucketSqlParts(query *pancakeModel, bucketAggregation *pancakeModelBucketAggregation, groupByColumns []model.GroupByExpr, hasMoreBucketAggregations bool) (
166+
addSelectColumns []model.AliasedExpr, addGroupBys []model.GroupByExpr, addRankColumns []model.AliasedExpr, addRankWheres []model.Expr, addRankOrderBys []model.OrderByExpr, err error) {
155167

156168
// For some group by such as terms, we need total count. We add it in this method.
157169
addSelectColumns = append(addSelectColumns, p.addPotentialParentCount(bucketAggregation, groupByColumns)...)
158170

159-
var tmpGroupBys []model.AliasedExpr
160171
for columnId, column := range bucketAggregation.selectedColumns {
161-
aliasedColumn := model.NewAliasedExpr(column, bucketAggregation.InternalNameForKey(columnId))
162-
addSelectColumns = append(addSelectColumns, aliasedColumn)
163-
tmpGroupBys = append(tmpGroupBys, aliasedColumn)
164-
// doris not support group by alias
165-
groupByAliasedColumn := model.NewAliasedExpr(column, "")
166-
addGroupBys = append(addGroupBys, groupByAliasedColumn)
172+
columnAliasString := bucketAggregation.InternalNameForKey(columnId)
173+
addSelectColumns = append(addSelectColumns, model.NewAliasedExpr(column, columnAliasString))
174+
addGroupBys = append(addGroupBys, model.NewGroupByExpr(column, columnAliasString))
167175
}
168176

169177
// build count for aggr
@@ -186,9 +194,9 @@ func (p *pancakeSqlQueryGenerator) generateBucketSqlParts(query *pancakeModel, b
186194
columnId := len(bucketAggregation.selectedColumns) + i
187195
direction := orderBy.Direction
188196

189-
rankColumn := p.isPartOf(orderBy.Expr, append(append(groupByColumns, tmpGroupBys...),
197+
rankColumn := p.isPartOf(orderBy.Expr, append(append(groupByColumns, addGroupBys...),
190198
// We need count before window functions
191-
model.NewAliasedExpr(model.NewCountFunc(), bucketAggregation.InternalNameForCount())))
199+
model.NewGroupByExpr(model.NewCountFunc(), bucketAggregation.InternalNameForCount())))
192200
if rankColumn != nil { // rank is part of group by
193201
if direction == model.DefaultOrder {
194202
direction = model.AscOrder // primarily needed for tests
@@ -207,7 +215,7 @@ func (p *pancakeSqlQueryGenerator) generateBucketSqlParts(query *pancakeModel, b
207215
return nil, nil, nil, nil, nil, err
208216
}
209217
orderByExpr = model.NewWindowFunction(aggFunctionName, []model.Expr{partColumn},
210-
p.generatePartitionBy(append(groupByColumns, tmpGroupBys...)), []model.OrderByExpr{})
218+
p.generatePartitionBy(append(groupByColumns, addGroupBys...)), []model.OrderByExpr{})
211219
}
212220
aliasedExpr := model.NewAliasedExpr(orderByExpr, bucketAggregation.InternalNameForOrderBy(columnId))
213221
addSelectColumns = append(addSelectColumns, aliasedExpr)
@@ -218,9 +226,9 @@ func (p *pancakeSqlQueryGenerator) generateBucketSqlParts(query *pancakeModel, b
218226
}
219227

220228
// We order by count, but add key to get right dense_rank()
221-
for _, addedGroupByAlias := range tmpGroupBys {
229+
for _, addedGroupByAlias := range addGroupBys {
222230
if !p.isPartOfOrderBy(addedGroupByAlias, rankOrderBy) {
223-
rankOrderBy = append(rankOrderBy, model.NewOrderByExpr(addedGroupByAlias.AliasRef(), model.AscOrder))
231+
rankOrderBy = append(rankOrderBy, model.NewOrderByExpr(addedGroupByAlias.GroupAliasRef(), model.AscOrder))
224232
}
225233
}
226234

@@ -322,7 +330,7 @@ func (p *pancakeSqlQueryGenerator) generateSelectCommand(aggregation *pancakeMod
322330
rankColumns := make([]model.AliasedExpr, 0)
323331
rankWheres := make([]model.Expr, 0)
324332
rankOrderBys := make([]model.OrderByExpr, 0)
325-
groupBys := make([]model.AliasedExpr, 0)
333+
groupBys := make([]model.GroupByExpr, 0)
326334

327335
type addIfCombinator struct {
328336
selectNr int
@@ -430,7 +438,7 @@ func (p *pancakeSqlQueryGenerator) generateSelectCommand(aggregation *pancakeMod
430438

431439
resultQuery = &model.SelectCommand{
432440
Columns: p.aliasedExprArrayToExpr(selectColumns),
433-
GroupBy: p.aliasedExprArrayToExpr(groupBys),
441+
GroupBy: p.groupByExprArrayToExpr(groupBys),
434442
WhereClause: aggregation.whereClause,
435443
FromClause: model.NewTableRef(model.SingleTableNamePlaceHolder),
436444
OrderBy: orderBy,
@@ -441,7 +449,7 @@ func (p *pancakeSqlQueryGenerator) generateSelectCommand(aggregation *pancakeMod
441449
} else {
442450
windowCte := model.SelectCommand{
443451
Columns: p.aliasedExprArrayToExpr(selectColumns),
444-
GroupBy: p.aliasedExprArrayToExpr(groupBys),
452+
GroupBy: p.groupByExprArrayToExpr(groupBys),
445453
WhereClause: aggregation.whereClause,
446454
FromClause: model.NewTableRef(model.SingleTableNamePlaceHolder),
447455
SampleLimit: aggregation.sampleLimit,

platform/parsers/elastic_query_dsl/pancake_top_hits.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import (
66
"fmt"
77
"github.com/QuesmaOrg/quesma/platform/model"
88
"github.com/QuesmaOrg/quesma/platform/model/metrics_aggregations"
9+
"github.com/QuesmaOrg/quesma/platform/util"
910
"strconv"
1011
)
1112

1213
func (p *pancakeSqlQueryGenerator) quotedLiteral(name string) model.LiteralExpr {
13-
return model.NewLiteral(strconv.Quote(name))
14+
return model.NewLiteral(util.BackquoteIdentifier(name))
1415
}
1516

1617
// generateSimpleTopHitsQuery generates an SQL for top_hits/top_metrics
@@ -42,7 +43,7 @@ func (p *pancakeSqlQueryGenerator) generateSimpleTopHitsQuery(topHits *pancakeMo
4243
func (p *pancakeSqlQueryGenerator) generateTopHitsQuery(aggregation *pancakeModel,
4344
combinatorWhere []model.Expr,
4445
topHits *pancakeModelMetricAggregation,
45-
groupBys []model.AliasedExpr,
46+
groupBys []model.GroupByExpr,
4647
selectColumns []model.AliasedExpr,
4748
origQuery *model.SelectCommand) (*model.SelectCommand, error) {
4849

@@ -83,7 +84,8 @@ func (p *pancakeSqlQueryGenerator) generateTopHitsQuery(aggregation *pancakeMode
8384
hitTableName := "hit_table"
8485

8586
groupTableLiteral := func(reference string) model.Expr {
86-
return model.NewLiteral(strconv.Quote(groupTableName) + "." + strconv.Quote(reference))
87+
//return model.NewLiteral(strconv.Quote(groupTableName) + "." + strconv.Quote(reference))
88+
return model.NewLiteral(util.BackquoteIdentifier(groupTableName) + "." + util.BackquoteIdentifier(reference))
8789
}
8890

8991
convertColumnRefToHitTable := func(expr model.Expr) model.Expr {
@@ -101,9 +103,9 @@ func (p *pancakeSqlQueryGenerator) generateTopHitsQuery(aggregation *pancakeMode
101103
var joinExprs []model.Expr
102104
var partitionByExprs []model.Expr
103105
for _, groupBy := range groupBys {
104-
partitionByExprs = append(partitionByExprs, groupTableLiteral(groupBy.Alias))
106+
partitionByExprs = append(partitionByExprs, groupTableLiteral(groupBy.GroupAlias))
105107
joinExprs = append(joinExprs, model.NewInfixExpr(
106-
groupTableLiteral(groupBy.Alias),
108+
groupTableLiteral(groupBy.GroupAlias),
107109
"=",
108110
convertColumnRefToHitTable(groupBy.Expr)))
109111
}

0 commit comments

Comments
 (0)