7
7
#include < contrib/libs/croaring/include/roaring/memory.h>
8
8
#include < contrib/libs/croaring/include/roaring/roaring.h>
9
9
10
+ #include < util/generic/array_ref.h>
10
11
#include < util/generic/vector.h>
11
12
#include < util/string/builder.h>
12
13
#include < util/system/yassert.h>
@@ -30,6 +31,11 @@ namespace {
30
31
{
31
32
}
32
33
34
+ TRoaringWrapper (roaring_bitmap_t * bitmap)
35
+ : Roaring(bitmap)
36
+ {
37
+ }
38
+
33
39
~TRoaringWrapper () {
34
40
roaring_bitmap_free (Roaring);
35
41
}
@@ -105,6 +111,47 @@ namespace {
105
111
}
106
112
};
107
113
114
+ class TRoaringAndNotWithBinary : public TBoxedValue {
115
+ public:
116
+ TRoaringAndNotWithBinary () {
117
+ }
118
+
119
+ static TStringRef Name () {
120
+ return TStringRef::Of (" AndNotWithBinary" );
121
+ }
122
+
123
+ private:
124
+ TUnboxedValue Run (const IValueBuilder* valueBuilder,
125
+ const TUnboxedValuePod* args) const override {
126
+ Y_UNUSED (valueBuilder);
127
+ auto binaryString = args[1 ].AsStringRef ();
128
+ auto bitmap = DeserializePortable (binaryString);
129
+
130
+ roaring_bitmap_andnot_inplace (GetBitmapFromArg (args[0 ]), bitmap);
131
+ roaring_bitmap_free (bitmap);
132
+
133
+ return args[0 ];
134
+ }
135
+ };
136
+
137
+ class TRoaringAndNot : public TBoxedValue {
138
+ public:
139
+ TRoaringAndNot () {
140
+ }
141
+
142
+ static TStringRef Name () {
143
+ return TStringRef::Of (" AndNot" );
144
+ }
145
+
146
+ private:
147
+ TUnboxedValue Run (const IValueBuilder* valueBuilder,
148
+ const TUnboxedValuePod* args) const override {
149
+ Y_UNUSED (valueBuilder);
150
+ roaring_bitmap_andnot_inplace (GetBitmapFromArg (args[0 ]), GetBitmapFromArg (args[1 ]));
151
+ return args[0 ];
152
+ }
153
+ };
154
+
108
155
class TRoaringOr : public TBoxedValue {
109
156
public:
110
157
TRoaringOr () {
@@ -223,6 +270,46 @@ namespace {
223
270
TSourcePosition Pos_;
224
271
};
225
272
273
+ class TRoaringFromUint32List : public TBoxedValue {
274
+ public:
275
+ TRoaringFromUint32List (TSourcePosition pos)
276
+ : Pos_(pos)
277
+ {
278
+ }
279
+
280
+ static TStringRef Name () {
281
+ return TStringRef::Of (" FromUint32List" );
282
+ }
283
+
284
+ private:
285
+ TUnboxedValue Run (const IValueBuilder* valueBuilder,
286
+ const TUnboxedValuePod* args) const override {
287
+ Y_UNUSED (valueBuilder);
288
+ try {
289
+ auto * bitmap = roaring_bitmap_create ();
290
+
291
+ const auto vector = args[0 ];
292
+ const auto * elements = vector.GetElements ();
293
+ if (elements) {
294
+ for (auto & value : TArrayRef{elements, vector.GetListLength ()}) {
295
+ roaring_bitmap_add (bitmap, value.Get <ui32>());
296
+ }
297
+ } else {
298
+ TUnboxedValue value;
299
+ const auto it = vector.GetListIterator ();
300
+ while (it.Next (value)) {
301
+ roaring_bitmap_add (bitmap, value.Get <ui32>());
302
+ }
303
+ }
304
+
305
+ return TUnboxedValuePod (new TRoaringWrapper (bitmap));
306
+ } catch (const std::exception& e) {
307
+ UdfTerminate ((TStringBuilder () << Pos_ << " " << e.what ()).data ());
308
+ }
309
+ }
310
+ TSourcePosition Pos_;
311
+ };
312
+
226
313
class TRoaringSerialize : public TBoxedValue {
227
314
public:
228
315
TRoaringSerialize () {
@@ -266,6 +353,25 @@ namespace {
266
353
}
267
354
};
268
355
356
+ class TRoaringRunOptimize : public TBoxedValue {
357
+ public:
358
+ TRoaringRunOptimize () {
359
+ }
360
+
361
+ static TStringRef Name () {
362
+ return TStringRef::Of (" RunOptimize" );
363
+ }
364
+
365
+ private:
366
+ TUnboxedValue Run (const IValueBuilder* valueBuilder,
367
+ const TUnboxedValuePod* args) const override {
368
+ Y_UNUSED (valueBuilder);
369
+ auto bitmap = GetBitmapFromArg (args[0 ]);
370
+ roaring_bitmap_run_optimize (bitmap);
371
+ return args[0 ];
372
+ }
373
+ };
374
+
269
375
class TRoaringModule : public IUdfModule {
270
376
public:
271
377
TRoaringModule () {
@@ -282,6 +388,7 @@ namespace {
282
388
void GetAllFunctions (IFunctionsSink& sink) const final {
283
389
sink.Add (TRoaringSerialize::Name ());
284
390
sink.Add (TRoaringDeserialize::Name ());
391
+ sink.Add (TRoaringFromUint32List::Name ());
285
392
286
393
sink.Add (TRoaringCardinality::Name ());
287
394
@@ -292,6 +399,11 @@ namespace {
292
399
293
400
sink.Add (TRoaringAndWithBinary::Name ());
294
401
sink.Add (TRoaringAnd::Name ());
402
+
403
+ sink.Add (TRoaringAndNotWithBinary::Name ());
404
+ sink.Add (TRoaringAndNot::Name ());
405
+
406
+ sink.Add (TRoaringRunOptimize::Name ());
295
407
}
296
408
297
409
void CleanupOnTerminate () const final {
@@ -312,6 +424,12 @@ namespace {
312
424
if (!typesOnly) {
313
425
builder.Implementation (new TRoaringDeserialize (builder.GetSourcePosition ()));
314
426
}
427
+ } else if (TRoaringFromUint32List::Name () == name) {
428
+ builder.Returns <TResource<RoaringResourceName>>().Args ()->Add <TListType<ui32>>();
429
+
430
+ if (!typesOnly) {
431
+ builder.Implementation (new TRoaringFromUint32List (builder.GetSourcePosition ()));
432
+ }
315
433
} else if (TRoaringSerialize::Name () == name) {
316
434
builder.Returns (builder.SimpleType <char *>())
317
435
.Args ()
@@ -372,6 +490,32 @@ namespace {
372
490
if (!typesOnly) {
373
491
builder.Implementation (new TRoaringAnd ());
374
492
}
493
+ } else if (TRoaringAndNotWithBinary::Name () == name) {
494
+ builder.Returns <TResource<RoaringResourceName>>()
495
+ .Args ()
496
+ ->Add <TAutoMap<TResource<RoaringResourceName>>>()
497
+ .Add <TAutoMap<char *>>();
498
+
499
+ if (!typesOnly) {
500
+ builder.Implementation (new TRoaringAndNotWithBinary ());
501
+ }
502
+ } else if (TRoaringAndNot::Name () == name) {
503
+ builder.Returns <TResource<RoaringResourceName>>()
504
+ .Args ()
505
+ ->Add <TAutoMap<TResource<RoaringResourceName>>>()
506
+ .Add <TAutoMap<TResource<RoaringResourceName>>>();
507
+
508
+ if (!typesOnly) {
509
+ builder.Implementation (new TRoaringAndNot ());
510
+ }
511
+ } else if (TRoaringRunOptimize::Name () == name) {
512
+ builder.Returns <TResource<RoaringResourceName>>()
513
+ .Args ()
514
+ ->Add <TAutoMap<TResource<RoaringResourceName>>>();
515
+
516
+ if (!typesOnly) {
517
+ builder.Implementation (new TRoaringRunOptimize ());
518
+ }
375
519
} else {
376
520
TStringBuilder sb;
377
521
sb << " Unknown function: " << name.Data ();
0 commit comments