Skip to content

Commit f102449

Browse files
committed
vam: Fix summarize where
Fix issue with incorrect counts when using where clauses on a aggregation function in vector runtime. If a value fails the where clause make the value as null so it is skipped by the aggregation function. Closes #5468
1 parent e7d0376 commit f102449

File tree

7 files changed

+135
-46
lines changed

7 files changed

+135
-46
lines changed

runtime/vam/expr/agg/count.go

+8-13
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,20 @@ type count struct {
1010
}
1111

1212
func (a *count) Consume(vec vector.Any) {
13-
if c, ok := vec.(*vector.Const); ok {
14-
val := c.Value()
15-
if !val.IsNull() && !val.IsError() {
16-
a.count += uint64(vec.Len())
17-
}
13+
if c, ok := vec.(*vector.Const); ok && c.Value().IsNull() {
1814
return
1915
}
2016
if _, ok := vector.Under(vec).Type().(*super.TypeError); ok {
2117
return
2218
}
23-
nulls := vector.NullsOf(vec)
24-
if nulls == nil {
25-
a.count += uint64(vec.Len())
26-
return
27-
}
28-
for i := range vec.Len() {
29-
if !nulls.Value(i) {
30-
a.count++
19+
if nulls := vector.NullsOf(vec); nulls != nil {
20+
for i := range vec.Len() {
21+
if !nulls.Value(i) {
22+
a.count++
23+
}
3124
}
25+
} else {
26+
a.count += uint64(vec.Len())
3227
}
3328
}
3429

runtime/vam/expr/aggregator.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,19 @@ func (a *Aggregator) Eval(this vector.Any) vector.Any {
4141

4242
func (a *Aggregator) apply(args ...vector.Any) vector.Any {
4343
vec, where := args[0], args[1]
44-
var tags []uint32
45-
// If type is not bool then we want to filter everything.
46-
if where.Type().ID() == super.IDBool {
47-
for slot := uint32(0); slot < where.Len(); slot++ {
48-
// XXX Feels like we should have a optimzed version of this.
49-
if vector.BoolValue(where, slot) {
50-
tags = append(tags, slot)
51-
}
44+
bools, _ := BoolMask(where)
45+
if bools.IsEmpty() {
46+
// everything is filtered.
47+
return vector.NewConst(super.NewValue(vec.Type(), nil), vec.Len(), nil)
48+
}
49+
bools.Flip(0, uint64(vec.Len()))
50+
if !bools.IsEmpty() {
51+
nulls := vector.NewBoolEmpty(vec.Len(), nil)
52+
bools.WriteDenseTo(nulls.Bits)
53+
if origNulls := vector.NullsOf(vec); origNulls != nil {
54+
nulls = vector.Or(nulls, origNulls)
5255
}
56+
vec = vector.CopyAndSetNulls(vec, nulls)
5357
}
54-
return vector.NewView(vec, tags)
58+
return vec
5559
}

runtime/vam/expr/arith.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ func (a *Arith) eval(vecs ...vector.Any) (out vector.Any) {
6464
}()
6565
}
6666
out = f(lhs, rhs)
67-
vector.SetNulls(out, vector.Or(vector.NullsOf(lhs), vector.NullsOf(rhs)))
68-
return out
67+
return vector.CopyAndSetNulls(out, vector.Or(vector.NullsOf(lhs), vector.NullsOf(rhs)))
6968
}
7069

7170
func (a *Arith) evalDivideByZero(kind vector.Kind, lhs, rhs vector.Any) vector.Any {

runtime/vam/expr/compare.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ func (c *Compare) eval(vecs ...vector.Any) vector.Any {
6161
return vector.NewConst(super.False, lhs.Len(), nulls)
6262
}
6363
out := f(lhs, rhs)
64-
vector.SetNulls(out, nulls)
65-
return out
64+
return vector.CopyAndSetNulls(out, nulls)
6665
}
6766

6867
func (c *Compare) compareTypeVals(lhs, rhs vector.Any) vector.Any {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
zed: |
2+
summarize
3+
num_requests := count()
4+
where log_time >= 2012-10-01T00:00:00Z
5+
by client_ip
6+
| sort client_ip
7+
8+
vector: true
9+
10+
input: |
11+
{log_time:2012-01-01T00:00:44Z,client_ip:249.92.17.134}
12+
{log_time:2012-10-01T00:24:30Z,client_ip:249.92.17.134}
13+
{log_time:2012-05-12T10:23:22Z,client_ip:251.58.48.137}
14+
15+
output: |
16+
{client_ip:249.92.17.134,num_requests:1(uint64)}
17+
{client_ip:251.58.48.137,num_requests:0(uint64)}

vector/bool.go

+94-19
Original file line numberDiff line numberDiff line change
@@ -179,44 +179,119 @@ func NullsOf(v Any) *Bool {
179179
panic(v)
180180
}
181181

182-
func SetNulls(v Any, nulls *Bool) {
182+
func CopyAndSetNulls(v Any, nulls *Bool) Any {
183183
switch v := v.(type) {
184184
case *Array:
185-
v.Nulls = nulls
185+
return &Array{
186+
Typ: v.Typ,
187+
Offsets: v.Offsets,
188+
Values: v.Values,
189+
Nulls: nulls,
190+
}
186191
case *Bytes:
187-
v.Nulls = nulls
192+
return &Bytes{
193+
Offs: v.Offs,
194+
Bytes: v.Bytes,
195+
Nulls: nulls,
196+
}
188197
case *Bool:
189-
v.Nulls = nulls
198+
return &Bool{
199+
len: v.len,
200+
Bits: v.Bits,
201+
Nulls: nulls,
202+
}
190203
case *Const:
191-
v.Nulls = nulls
204+
return &Const{
205+
val: v.val,
206+
len: v.len,
207+
Nulls: nulls,
208+
}
192209
case *Dict:
193-
v.Nulls = nulls
210+
return &Dict{
211+
Any: v.Any,
212+
Index: v.Index,
213+
Counts: v.Counts,
214+
Nulls: nulls,
215+
}
194216
case *Error:
195-
v.Nulls = nulls
217+
return &Error{
218+
Typ: v.Typ,
219+
Vals: v.Vals,
220+
Nulls: nulls,
221+
}
196222
case *Float:
197-
v.Nulls = nulls
223+
return &Float{
224+
Typ: v.Typ,
225+
Values: v.Values,
226+
Nulls: nulls,
227+
}
198228
case *Int:
199-
v.Nulls = nulls
229+
return &Int{
230+
Typ: v.Typ,
231+
Values: v.Values,
232+
Nulls: nulls,
233+
}
200234
case *IP:
201-
v.Nulls = nulls
235+
return &IP{
236+
Values: v.Values,
237+
Nulls: nulls,
238+
}
202239
case *Map:
203-
v.Nulls = nulls
240+
return &Map{
241+
Typ: v.Typ,
242+
Offsets: v.Offsets,
243+
Keys: v.Keys,
244+
Values: v.Values,
245+
Nulls: nulls,
246+
}
204247
case *Named:
205-
SetNulls(v.Any, nulls)
248+
return &Named{
249+
Typ: v.Typ,
250+
Any: CopyAndSetNulls(v.Any, nulls),
251+
}
206252
case *Net:
207-
v.Nulls = nulls
253+
return &Net{
254+
Values: v.Values,
255+
Nulls: nulls,
256+
}
208257
case *Record:
209-
v.Nulls = nulls
258+
return &Record{
259+
Typ: v.Typ,
260+
Fields: v.Fields,
261+
len: v.len,
262+
Nulls: nulls,
263+
}
210264
case *Set:
211-
v.Nulls = nulls
265+
return &Set{
266+
Typ: v.Typ,
267+
Offsets: v.Offsets,
268+
Values: v.Values,
269+
Nulls: nulls,
270+
}
212271
case *String:
213-
v.Nulls = nulls
272+
return &String{
273+
Offsets: v.Offsets,
274+
Bytes: v.Bytes,
275+
Nulls: nulls,
276+
}
214277
case *TypeValue:
215-
v.Nulls = nulls
278+
return &TypeValue{
279+
Offsets: v.Offsets,
280+
Bytes: v.Bytes,
281+
Nulls: nulls,
282+
}
216283
case *Uint:
217-
v.Nulls = nulls
284+
return &Uint{
285+
Typ: v.Typ,
286+
Values: v.Values,
287+
Nulls: nulls,
288+
}
218289
case *Union:
219-
v.Nulls = nulls
290+
return &Union{
291+
Dynamic: v.Dynamic,
292+
Typ: v.Typ,
293+
Nulls: nulls,
294+
}
220295
default:
221296
panic(v)
222297
}

vector/builder.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func (n *nullsBuilder) Build() Any {
132132
if !n.nulls.IsEmpty() {
133133
bits := make([]uint64, (n.n+63)/64)
134134
n.nulls.WriteDenseTo(bits)
135-
SetNulls(vec, NewBool(bits, n.n, nil))
135+
vec = CopyAndSetNulls(vec, NewBool(bits, n.n, nil))
136136
}
137137
return vec
138138
}

0 commit comments

Comments
 (0)