Skip to content

Commit 183307c

Browse files
committed
cardinality optimization
1 parent 799d248 commit 183307c

File tree

3 files changed

+57
-14
lines changed

3 files changed

+57
-14
lines changed

roaringbitmap--0.2.65.1--0.2.65.2.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ DROP FUNCTION IF EXISTS rb_cardinality(roaringbitmap, integer, integer, integer)
5050
CREATE
5151
OR REPLACE FUNCTION rb_cardinality(roaringbitmap, integer, integer, integer) RETURNS BIGINT AS 'MODULE_PATHNAME',
5252
'rb_cardinality_step' LANGUAGE C STRICT IMMUTABLE;
53+
DROP FUNCTION IF EXISTS rb_cardinality(roaringbitmap, integer, integer, integer, integer[]);
5354
CREATE
5455
OR REPLACE FUNCTION rb_cardinality(roaringbitmap, integer, integer, integer, integer[]) RETURNS BIGINT AS 'MODULE_PATHNAME',
56+
'rb_cardinality_step_array' LANGUAGE C STRICT IMMUTABLE;
57+
DROP FUNCTION IF EXISTS rb_cardinality(roaringbitmap, integer, integer, integer, integer, integer);
58+
CREATE
59+
OR REPLACE FUNCTION rb_cardinality(roaringbitmap, integer, integer, integer, integer, integer) RETURNS BIGINT AS 'MODULE_PATHNAME',
5560
'rb_cardinality_step_intval' LANGUAGE C STRICT IMMUTABLE;
5661
CREATE
5762
OR REPLACE FUNCTION rb_is_empty(roaringbitmap) RETURNS bool AS 'MODULE_PATHNAME',

roaringbitmap--0.2.65.2.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ CREATE
7373
'rb_cardinality_step' LANGUAGE C STRICT IMMUTABLE;
7474
CREATE
7575
OR REPLACE FUNCTION rb_cardinality(roaringbitmap, integer, integer, integer, integer[]) RETURNS BIGINT AS 'MODULE_PATHNAME',
76+
'rb_cardinality_step_array' LANGUAGE C STRICT IMMUTABLE;
77+
CREATE
78+
OR REPLACE FUNCTION rb_cardinality(roaringbitmap, integer, integer, integer, integer, integer) RETURNS BIGINT AS 'MODULE_PATHNAME',
7679
'rb_cardinality_step_intval' LANGUAGE C STRICT IMMUTABLE;
7780
CREATE
7881
OR REPLACE FUNCTION rb_is_empty(roaringbitmap) RETURNS bool AS 'MODULE_PATHNAME',

roaringbitmap.c

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -389,23 +389,58 @@ Datum
389389
uint32_t rmin = roaring_bitmap_minimum(r1);
390390
uint32_t rmax = roaring_bitmap_maximum(r1);
391391

392-
max = max == -1 ? rmax : max;
392+
max = max == -1 ? rmax : (rmax < max ? rmax : max);
393+
uint32_t p = min;
394+
int64 card1 = 0;
395+
while (p <= max)
396+
{
397+
if (p + step >= rmin)
398+
{
399+
if (roaring_bitmap_range_cardinality(r1, p, p + step) > 0)
400+
card1++;
401+
}
402+
p += step;
403+
}
404+
405+
roaring_bitmap_free(r1);
406+
PG_RETURN_INT64(card1);
407+
}
408+
409+
//bitmap cardinality step interval
410+
PG_FUNCTION_INFO_V1(rb_cardinality_step_interval);
411+
Datum rb_cardinality_step_interval(PG_FUNCTION_ARGS);
412+
413+
Datum
414+
rb_cardinality_step_interval(PG_FUNCTION_ARGS)
415+
{
416+
bytea *data = PG_GETARG_BYTEA_P(0);
417+
uint32_t min = PG_GETARG_INT32(1);
418+
uint32_t max = PG_GETARG_INT32(2);
419+
int step = PG_GETARG_INT32(3);
420+
uint32_t start = PG_GETARG_INT32(4);
421+
uint32_t end = PG_GETARG_INT32(5);
422+
423+
if (step < 2)
424+
ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("step must be greater than 1")));
425+
if (end < start)
426+
ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("range end must be greater than range start")));
427+
428+
roaring_bitmap_t *r1 = roaring_bitmap_portable_deserialize(VARDATA(data));
429+
if (!r1)
430+
ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("bitmap format is error")));
393431

432+
uint32_t rmin = roaring_bitmap_minimum(r1);
433+
uint32_t rmax = roaring_bitmap_maximum(r1);
434+
435+
max = max == -1 ? rmax : (rmax < max ? rmax : max);
394436
uint32_t p = min;
395-
uint32_t n;
396437
int64 card1 = 0;
397438
while (p <= max)
398439
{
399440
if (p + step >= rmin)
400441
{
401-
for (n = 0; n < step; n++)
402-
{
403-
if (roaring_bitmap_contains(r1, n + p))
404-
{
405-
card1++;
406-
break;
407-
}
408-
}
442+
if (roaring_bitmap_range_cardinality(r1, p + start, p + end) > 0)
443+
card1++;
409444
}
410445
p += step;
411446
}
@@ -414,12 +449,12 @@ Datum
414449
PG_RETURN_INT64(card1);
415450
}
416451

417-
//bitmap cardinality step intval
418-
PG_FUNCTION_INFO_V1(rb_cardinality_step_intval);
419-
Datum rb_cardinality_step_intval(PG_FUNCTION_ARGS);
452+
//bitmap cardinality step array
453+
PG_FUNCTION_INFO_V1(rb_cardinality_step_array);
454+
Datum rb_cardinality_step_array(PG_FUNCTION_ARGS);
420455

421456
Datum
422-
rb_cardinality_step_intval(PG_FUNCTION_ARGS)
457+
rb_cardinality_step_array(PG_FUNCTION_ARGS)
423458
{
424459
bytea *data = PG_GETARG_BYTEA_P(0);
425460
uint32_t min = PG_GETARG_INT32(1);

0 commit comments

Comments
 (0)