Skip to content

Commit 8ee0210

Browse files
authored
feat: add inc-hash-agg min/max bool type (openGemini#590)
Signed-off-by: chen19991212 <[email protected]>
1 parent a32007e commit 8ee0210

6 files changed

+371
-51
lines changed

engine/executor/chunk.go

+2
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,8 @@ func (c *ChunkImpl) AppendIntervalFullRows(start, step int64, num int, tag Chunk
381381
c.Column(i).AppendIntegerValues(make([]int64, num))
382382
case influxql.Float:
383383
c.Column(i).AppendFloatValues(make([]float64, num))
384+
case influxql.Boolean:
385+
c.Column(i).AppendBooleanValues(make([]bool, num))
384386
default:
385387
panic("unsupported the data type for AppendIntervalFullRows")
386388
}

engine/executor/column.gen.go

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

engine/executor/column.gen.go.tmpl

+3-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type Column interface {
6969
Append{{.Name}}Value({{.Type}})
7070
Append{{.Name}}Values([]{{.Type}})
7171
Set{{.Name}}Values([]{{.Type}})
72-
{{- if or (eq .Name "Float") (eq .Name "Integer")}}
72+
{{- if or (eq .Name "Float") (eq .Name "Integer") (eq .Name "Boolean")}}
7373
Update{{.Name}}ValueFast(v {{.Type}}, row int)
7474
{{- end}}
7575
{{- else }}
@@ -289,7 +289,8 @@ func (c *ColumnImpl) Set{{.Name}}Values(values []{{.Type}}) {
289289
c.{{.name}}Values = values
290290
}
291291

292-
{{- if or (eq .Name "Float") (eq .Name "Integer")}}
292+
{{- if or (eq .Name "Float") (eq .Name "Integer") (eq .Name "Boolean")}}
293+
293294
func (c *ColumnImpl) Update{{.Name}}ValueFast(v {{.Type}}, row int) {
294295
c.{{.name}}Values[row] = v
295296
}

engine/executor/inc_hash_agg_funcs.go

+82
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,35 @@ func UpdateHashFloatMinFast(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, sr
110110
dstColumn.UpdateFloatValueFast(minV, dstRow)
111111
}
112112

113+
func UpdateHashBooleanMinSlow(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, srcRow int) {
114+
srcColumn, dstColumn := srcChunk.Column(srcCol), dstChunk.Column(dstCol)
115+
isNil := srcColumn.IsNilV2(srcRow)
116+
if isNil {
117+
return
118+
}
119+
srcRow = srcColumn.GetValueIndexV2(srcRow)
120+
sv := srcColumn.BooleanValue(srcRow)
121+
dv := dstColumn.BooleanValue(dstRow)
122+
if !dv {
123+
return
124+
}
125+
if !sv {
126+
dstColumn.UpdateBooleanValueFast(sv, dstRow)
127+
}
128+
}
129+
130+
func UpdateHashBooleanMinFast(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, srcRow int) {
131+
dstColumn := dstChunk.Column(dstCol)
132+
sv := srcChunk.Column(srcCol).BooleanValue(srcRow)
133+
dv := dstColumn.BooleanValue(dstRow)
134+
if !dv {
135+
return
136+
}
137+
if !sv {
138+
dstColumn.UpdateBooleanValueFast(sv, dstRow)
139+
}
140+
}
141+
113142
func rewriteInterMinColumnFunc(chunk Chunk, srcCol, lastNum int) {
114143
column := chunk.Column(srcCol)
115144
lastIndex := len(column.IntegerValues()) - 1
@@ -134,6 +163,18 @@ func rewriteFloatMinColumnFunc(chunk Chunk, srcCol, lastNum int) {
134163
}
135164
}
136165

166+
func rewriteBooleanMinColumnFunc(chunk Chunk, srcCol, lastNum int) {
167+
column := chunk.Column(srcCol)
168+
lastIndex := len(column.BooleanValues()) - 1
169+
firstIndex := lastIndex - lastNum + 1
170+
if firstIndex < 0 {
171+
return
172+
}
173+
for i := lastIndex; i >= firstIndex; i-- {
174+
column.UpdateBooleanValueFast(true, i)
175+
}
176+
}
177+
137178
func UpdateHashInterMaxSlow(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, srcRow int) {
138179
srcColumn, dstColumn := srcChunk.Column(srcCol), dstChunk.Column(dstCol)
139180
isNil := srcColumn.IsNilV2(srcRow)
@@ -188,6 +229,35 @@ func UpdateHashFloatMaxFast(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, sr
188229
dstColumn.UpdateFloatValueFast(maxV, dstRow)
189230
}
190231

232+
func UpdateHashBooleanMaxSlow(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, srcRow int) {
233+
srcColumn, dstColumn := srcChunk.Column(srcCol), dstChunk.Column(dstCol)
234+
isNil := srcColumn.IsNilV2(srcRow)
235+
if isNil {
236+
return
237+
}
238+
srcRow = srcColumn.GetValueIndexV2(srcRow)
239+
sv := srcColumn.BooleanValue(srcRow)
240+
dv := dstColumn.BooleanValue(dstRow)
241+
if dv {
242+
return
243+
}
244+
if sv {
245+
dstColumn.UpdateBooleanValueFast(sv, dstRow)
246+
}
247+
}
248+
249+
func UpdateHashBooleanMaxFast(dstChunk, srcChunk Chunk, dstCol, srcCol, dstRow, srcRow int) {
250+
dstColumn := dstChunk.Column(dstCol)
251+
sv := srcChunk.Column(srcCol).BooleanValue(srcRow)
252+
dv := dstColumn.BooleanValue(dstRow)
253+
if dv {
254+
return
255+
}
256+
if sv {
257+
dstColumn.UpdateBooleanValueFast(sv, dstRow)
258+
}
259+
}
260+
191261
func rewriteInterMaxColumnFunc(chunk Chunk, srcCol, lastNum int) {
192262
column := chunk.Column(srcCol)
193263
lastIndex := len(column.IntegerValues()) - 1
@@ -211,3 +281,15 @@ func rewriteFloatMaxColumnFunc(chunk Chunk, srcCol, lastNum int) {
211281
column.UpdateFloatValueFast(-math.MaxFloat64, i)
212282
}
213283
}
284+
285+
func rewriteBooleanMaxColumnFunc(chunk Chunk, srcCol, lastNum int) {
286+
column := chunk.Column(srcCol)
287+
lastIndex := len(column.BooleanValues()) - 1
288+
firstIndex := lastIndex - lastNum + 1
289+
if firstIndex < 0 {
290+
return
291+
}
292+
for i := lastIndex; i >= firstIndex; i-- {
293+
column.UpdateBooleanValueFast(false, i)
294+
}
295+
}

engine/executor/inc_hash_agg_transform.go

+8
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,10 @@ func (trans *IncHashAggTransform) buildIncMinAggFuncs(i int) {
522522
trans.rewriteColumnFunc[srcCol] = rewriteFloatMinColumnFunc
523523
trans.incAggFuncs[srcCol][SlowFuncIdx] = UpdateHashFloatMinSlow
524524
trans.incAggFuncs[srcCol][FastFuncIdx] = UpdateHashFloatMinFast
525+
case influxql.Boolean:
526+
trans.rewriteColumnFunc[srcCol] = rewriteBooleanMinColumnFunc
527+
trans.incAggFuncs[srcCol][SlowFuncIdx] = UpdateHashBooleanMinSlow
528+
trans.incAggFuncs[srcCol][FastFuncIdx] = UpdateHashBooleanMinFast
525529
default:
526530
panic(fmt.Sprintf("unsupport data type %s for min", srcType))
527531
}
@@ -544,6 +548,10 @@ func (trans *IncHashAggTransform) buildIncMaxAggFuncs(i int) {
544548
trans.rewriteColumnFunc[srcCol] = rewriteFloatMaxColumnFunc
545549
trans.incAggFuncs[srcCol][SlowFuncIdx] = UpdateHashFloatMaxSlow
546550
trans.incAggFuncs[srcCol][FastFuncIdx] = UpdateHashFloatMaxFast
551+
case influxql.Boolean:
552+
trans.rewriteColumnFunc[srcCol] = rewriteBooleanMaxColumnFunc
553+
trans.incAggFuncs[srcCol][SlowFuncIdx] = UpdateHashBooleanMaxSlow
554+
trans.incAggFuncs[srcCol][FastFuncIdx] = UpdateHashBooleanMaxFast
547555
default:
548556
panic(fmt.Sprintf("unsupport data type %s for max", srcType))
549557
}

0 commit comments

Comments
 (0)