@@ -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
421456Datum
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