1
1
package expr
2
2
3
3
import (
4
+ "slices"
5
+
4
6
"github.com/brimdata/super"
5
7
"github.com/brimdata/super/vector"
6
8
)
@@ -177,6 +179,18 @@ func toBool(vec vector.Any) *vector.Bool {
177
179
} else {
178
180
return vector .NewBoolEmpty (vec .Len (), vec .Nulls )
179
181
}
182
+ case * vector.Dynamic :
183
+ nulls := vector .NewBoolEmpty (vec .Len (), nil )
184
+ out := vector .NewBoolEmpty (vec .Len (), nulls )
185
+ for i := range vec .Len () {
186
+ v , null := vector .BoolValue (vec , i )
187
+ if null {
188
+ nulls .Set (i )
189
+ } else if v {
190
+ out .Set (i )
191
+ }
192
+ }
193
+ return out
180
194
case * vector.Bool :
181
195
return vec
182
196
default :
@@ -191,3 +205,90 @@ func trueBool(n uint32) *vector.Bool {
191
205
}
192
206
return vec
193
207
}
208
+
209
+ type In struct {
210
+ zctx * super.Context
211
+ lhs Evaluator
212
+ rhs Evaluator
213
+ eq * Compare
214
+ }
215
+
216
+ func NewIn (zctx * super.Context , lhs , rhs Evaluator ) * In {
217
+ return & In {zctx , lhs , rhs , NewCompare (zctx , nil , nil , "==" )}
218
+ }
219
+
220
+ func (i * In ) Eval (this vector.Any ) vector.Any {
221
+ return vector .Apply (true , i .eval , i .lhs .Eval (this ), i .rhs .Eval (this ))
222
+ }
223
+
224
+ func (i * In ) eval (vecs ... vector.Any ) vector.Any {
225
+ lhs , rhs := vecs [0 ], vecs [1 ]
226
+ if lhs .Type ().Kind () == super .ErrorKind {
227
+ return lhs
228
+ }
229
+ if rhs .Type ().Kind () == super .ErrorKind {
230
+ return rhs
231
+ }
232
+ return i .evalResursive (lhs , rhs )
233
+ }
234
+
235
+ func (i * In ) evalResursive (vecs ... vector.Any ) vector.Any {
236
+ lhs , rhs := vecs [0 ], vecs [1 ]
237
+ rhs = vector .Under (rhs )
238
+ var index []uint32
239
+ if view , ok := rhs .(* vector.View ); ok {
240
+ rhs = view .Any
241
+ index = view .Index
242
+ }
243
+ switch rhs := rhs .(type ) {
244
+ case * vector.Record :
245
+ out := vector .NewBoolEmpty (lhs .Len (), nil )
246
+ for _ , f := range rhs .Fields {
247
+ if index != nil {
248
+ f = vector .NewView (f , index )
249
+ }
250
+ out = vector .Or (out , toBool (i .evalResursive (lhs , f )))
251
+ }
252
+ return out
253
+ case * vector.Array :
254
+ return i .evalForList (lhs , rhs .Values , rhs .Offsets , index )
255
+ case * vector.Set :
256
+ return i .evalForList (lhs , rhs .Values , rhs .Offsets , index )
257
+ case * vector.Map :
258
+ return vector .Or (i .evalForList (lhs , rhs .Keys , rhs .Offsets , index ),
259
+ i .evalForList (lhs , rhs .Values , rhs .Offsets , index ))
260
+ case * vector.Union :
261
+ return vector .Apply (true , i .evalResursive , lhs , rhs )
262
+ case * vector.Error :
263
+ return i .evalResursive (lhs , rhs .Vals )
264
+ default :
265
+ return i .eq .eval (lhs , rhs )
266
+ }
267
+ }
268
+
269
+ func (i * In ) evalForList (lhs , rhs vector.Any , offsets , index []uint32 ) * vector.Bool {
270
+ out := vector .NewBoolEmpty (lhs .Len (), nil )
271
+ var lhsIndex , rhsIndex []uint32
272
+ for j := range lhs .Len () {
273
+ if index != nil {
274
+ j = index [j ]
275
+ }
276
+ start , end := offsets [j ], offsets [j + 1 ]
277
+ if start == end {
278
+ continue
279
+ }
280
+ n := end - start
281
+ lhsIndex = slices .Grow (lhsIndex [:0 ], int (n ))[:n ]
282
+ rhsIndex = slices .Grow (rhsIndex [:0 ], int (n ))[:n ]
283
+ for k := range n {
284
+ lhsIndex [k ] = k
285
+ rhsIndex [k ] = k + start
286
+ }
287
+ lhsView := vector .NewView (lhs , lhsIndex )
288
+ rhsView := vector .NewView (rhs , rhsIndex )
289
+ if toBool (i .evalResursive (lhsView , rhsView )).TrueCount () > 0 {
290
+ out .Set (j )
291
+ }
292
+ }
293
+ return out
294
+ }
0 commit comments