From 32c3b2ad52c69b38ac5a70ec48d570f4d47aa5ba Mon Sep 17 00:00:00 2001 From: Matt Jaffee Date: Tue, 30 May 2017 22:08:21 -0500 Subject: [PATCH] more cardinality and conversions --- roaring/roaring.go | 25 +++++++++++++++++-------- roaring/roaring_internal_test.go | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index 76aa9a6b3..a10b5463c 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -1715,7 +1715,7 @@ func intersectRunRun(a, b *container) *container { i++ } } - if output.n < 4096 && len(output.runs) > output.n/2 { + if output.n < ArrayMaxSize && len(output.runs) > output.n/2 { output.runToArray() } else if len(output.runs) > RunMaxSize { output.runToBitmap() @@ -1724,10 +1724,10 @@ func intersectRunRun(a, b *container) *container { } // intersectBitmapRun returns an array container if the run container's -// cardinality is < 4096. Otherwise it returns a bitmap container. +// cardinality is < ArrayMaxSize. Otherwise it returns a bitmap container. func intersectBitmapRun(a, b *container) *container { var output *container - if b.n < 4096 { + if b.n < ArrayMaxSize { // output is array container output = &container{} for _, iv := range b.runs { @@ -1776,7 +1776,7 @@ func intersectBitmapRun(a, b *container) *container { valast = vastart + 63 } } - if output.n < 4096 { + if output.n < ArrayMaxSize { output.bitmapToArray() } } @@ -1906,13 +1906,18 @@ func unionArrayRun(a, b *container) *container { vb = b.runs[j] } if i < na && (j >= nb || va < vb.start) { - output.runAppendInterval(interval32{start: va, last: va}) + output.n += output.runAppendInterval(interval32{start: va, last: va}) i++ } else { - output.runAppendInterval(vb) + output.n += output.runAppendInterval(vb) j++ } } + if output.n < ArrayMaxSize { + output.runToArray() + } else if len(output.runs) > RunMaxSize { + output.runToBitmap() + } return output } @@ -1953,17 +1958,21 @@ func unionRunRun(a, b *container) *container { vb = b.runs[j] } if i < na && (j >= nb || va.start < vb.start) { - output.runAppendInterval(va) + output.n += output.runAppendInterval(va) i++ } else { - output.runAppendInterval(vb) + output.n += output.runAppendInterval(vb) j++ } } + if len(output.runs) > RunMaxSize { + output.runToBitmap() + } return output } func unionBitmapRun(a, b *container) *container { + // TODO return nil } diff --git a/roaring/roaring_internal_test.go b/roaring/roaring_internal_test.go index efba7d85c..7e1506ad2 100644 --- a/roaring/roaring_internal_test.go +++ b/roaring/roaring_internal_test.go @@ -44,7 +44,7 @@ func TestRunAppendInterval(t *testing.T) { { base: []interval32{{start: 20, last: 23}}, app: interval32{start: 19, last: 25}, - exp: 3, + exp: 2, // runAppendInterval explicitly does not support intervals whose start is < c.runs[-1].start }, }