|
|
|
|
@ -16,7 +16,6 @@ package histogram |
|
|
|
|
import ( |
|
|
|
|
"fmt" |
|
|
|
|
"math" |
|
|
|
|
"math/rand" |
|
|
|
|
"testing" |
|
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require" |
|
|
|
|
@ -2253,495 +2252,3 @@ func TestFloatBucketIteratorTargetSchema(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
require.False(t, it.Next(), "negative iterator not exhausted") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestFloatHistogramAddNew(t *testing.T) { |
|
|
|
|
cases := []struct { |
|
|
|
|
name string |
|
|
|
|
in1, in2, expected *FloatHistogram |
|
|
|
|
}{ |
|
|
|
|
{ |
|
|
|
|
"same bucket layout", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {1, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {1, 3}}, |
|
|
|
|
PositiveBuckets: []float64{0, 0, 2, 3, 6}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {1, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 5, 7, 13}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{4, 2, 9, 10}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"same bucket layout, defined differently", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {1, 1}, {0, 2}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {1, 2}, {0, 1}}, |
|
|
|
|
PositiveBuckets: []float64{0, 0, 2, 3, 6}, |
|
|
|
|
NegativeSpans: []Span{{3, 7}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 0, 0, 0, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {1, 1}, {0, 2}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 5, 7, 13}, |
|
|
|
|
NegativeSpans: []Span{{3, 5}, {0, 2}}, |
|
|
|
|
NegativeBuckets: []float64{4, 2, 0, 0, 0, 9, 10}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"non-overlapping spans", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.001, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.001, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{0, 2}, {3, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 3, 6}, |
|
|
|
|
NegativeSpans: []Span{{-9, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.001, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 4}, {0, 6}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 5, 4, 3, 4, 7, 2, 3, 6}, |
|
|
|
|
NegativeSpans: []Span{{-9, 2}, {3, 2}, {5, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4, 3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"non-overlapping inverted order", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{0, 2}, {3, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 3, 6}, |
|
|
|
|
NegativeSpans: []Span{{-9, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {0, 5}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 5, 4, 3, 4, 7, 2, 3, 6}, |
|
|
|
|
NegativeSpans: []Span{{-9, 2}, {3, 2}, {5, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4, 3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"overlapping spans", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{-1, 4}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 4}, {0, 4}}, |
|
|
|
|
PositiveBuckets: []float64{1, 5, 4, 2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"overlapping spans inverted order", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{-1, 4}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 5}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 5, 4, 2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"schema change", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
Schema: 0, |
|
|
|
|
PositiveSpans: []Span{{-1, 4}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
Schema: 1, |
|
|
|
|
PositiveSpans: []Span{{-4, 3}, {5, 5}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 0, 3, 2, 2, 3, 4}, |
|
|
|
|
NegativeSpans: []Span{{6, 3}, {6, 4}}, |
|
|
|
|
NegativeBuckets: []float64{3, 0.5, 0.5, 2, 3, 2, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 19, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-2, 5}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 5, 4, 2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"larger zero bucket in first histogram", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 1, |
|
|
|
|
ZeroCount: 17, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{1, 2}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 1, |
|
|
|
|
ZeroCount: 29, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{1, 2}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"larger zero bucket in second histogram", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 1, |
|
|
|
|
ZeroCount: 17, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{1, 2}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 1, |
|
|
|
|
ZeroCount: 29, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{1, 5}}, |
|
|
|
|
PositiveBuckets: []float64{2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"larger zero threshold in first histogram ends up inside a populated bucket of second histogram", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.2, |
|
|
|
|
ZeroCount: 17, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{1, 2}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.25, |
|
|
|
|
ZeroCount: 29, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-1, 1}, {1, 5}}, |
|
|
|
|
PositiveBuckets: []float64{0, 2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"larger zero threshold in second histogram ends up inside a populated bucket of first histogram", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
PositiveSpans: []Span{{-2, 2}, {2, 3}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 4, 7}, |
|
|
|
|
NegativeSpans: []Span{{3, 2}, {3, 2}}, |
|
|
|
|
NegativeBuckets: []float64{3, 1, 5, 6}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.2, |
|
|
|
|
ZeroCount: 17, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
PositiveSpans: []Span{{1, 2}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.25, |
|
|
|
|
ZeroCount: 29, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{1, 5}}, |
|
|
|
|
PositiveBuckets: []float64{2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"schema change combined with larger zero bucket in second histogram", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
Schema: 0, |
|
|
|
|
PositiveSpans: []Span{{-2, 5}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{2, 5, 4, 2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.25, |
|
|
|
|
ZeroCount: 12, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
Schema: 1, |
|
|
|
|
PositiveSpans: []Span{{-3, 2}, {5, 5}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 3, 2, 2, 3, 4}, |
|
|
|
|
NegativeSpans: []Span{{6, 3}, {6, 4}}, |
|
|
|
|
NegativeBuckets: []float64{3, 0.5, 0.5, 2, 3, 2, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.25, |
|
|
|
|
ZeroCount: 22, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-1, 7}}, |
|
|
|
|
PositiveBuckets: []float64{6, 4, 2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
"schema change combined with larger zero bucket in first histogram", |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.25, |
|
|
|
|
ZeroCount: 8, |
|
|
|
|
Count: 21, |
|
|
|
|
Sum: 1.234, |
|
|
|
|
Schema: 0, |
|
|
|
|
PositiveSpans: []Span{{-1, 4}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 3, 6, 2, 5}, |
|
|
|
|
NegativeSpans: []Span{{4, 2}, {1, 2}}, |
|
|
|
|
NegativeBuckets: []float64{1, 1, 4, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.01, |
|
|
|
|
ZeroCount: 11, |
|
|
|
|
Count: 30, |
|
|
|
|
Sum: 2.345, |
|
|
|
|
Schema: 1, |
|
|
|
|
PositiveSpans: []Span{{-4, 3}, {5, 5}}, |
|
|
|
|
PositiveBuckets: []float64{1, 0, 0, 3, 2, 2, 3, 4}, |
|
|
|
|
NegativeSpans: []Span{{6, 3}, {6, 4}}, |
|
|
|
|
NegativeBuckets: []float64{3, 0.5, 0.5, 2, 3, 2, 4}, |
|
|
|
|
}, |
|
|
|
|
&FloatHistogram{ |
|
|
|
|
ZeroThreshold: 0.25, |
|
|
|
|
ZeroCount: 20, |
|
|
|
|
Count: 51, |
|
|
|
|
Sum: 3.579, |
|
|
|
|
PositiveSpans: []Span{{-1, 4}, {0, 3}}, |
|
|
|
|
PositiveBuckets: []float64{5, 4, 2, 6, 10, 9, 5}, |
|
|
|
|
NegativeSpans: []Span{{3, 3}, {1, 3}}, |
|
|
|
|
NegativeBuckets: []float64{3, 2, 1, 4, 9, 6}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, c := range cases { |
|
|
|
|
t.Run(c.name, func(t *testing.T) { |
|
|
|
|
require.Equal(t, c.expected, c.in1.AddNew(c.in2)) |
|
|
|
|
// Has it also happened in-place?
|
|
|
|
|
require.Equal(t, c.expected, c.in1) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func BenchmarkAddOld(b *testing.B) { |
|
|
|
|
for n := 0; n < b.N; n++ { |
|
|
|
|
b.StopTimer() |
|
|
|
|
f1 := createRandomFloatHistogram(50) |
|
|
|
|
f2 := createRandomFloatHistogram(50) |
|
|
|
|
b.StartTimer() |
|
|
|
|
f1.Add(f2) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func BenchmarkAddNew(b *testing.B) { |
|
|
|
|
for n := 0; n < b.N; n++ { |
|
|
|
|
b.StopTimer() |
|
|
|
|
f1 := createRandomFloatHistogram(50) |
|
|
|
|
f2 := createRandomFloatHistogram(50) |
|
|
|
|
b.StartTimer() |
|
|
|
|
f1.AddNew(f2) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func createRandomFloatHistogram(spanNum int32) *FloatHistogram { |
|
|
|
|
f := &FloatHistogram{} |
|
|
|
|
f.PositiveSpans, f.PositiveBuckets = createRandomSpans(spanNum) |
|
|
|
|
f.NegativeSpans, f.NegativeBuckets = createRandomSpans(spanNum) |
|
|
|
|
return f |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func createRandomSpans(spanNum int32) ([]Span, []float64) { |
|
|
|
|
Spans := make([]Span, spanNum) |
|
|
|
|
Buckets := make([]float64, 0) |
|
|
|
|
for i := 0; i < int(spanNum); i++ { |
|
|
|
|
Spans[i].Offset = rand.Int31n(spanNum) + 1 |
|
|
|
|
Spans[i].Length = uint32(rand.Int31n(spanNum) + 1) |
|
|
|
|
for j := 0; j < int(Spans[i].Length); j++ { |
|
|
|
|
Buckets = append(Buckets, float64(rand.Int31n(spanNum)+1)) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return Spans, Buckets |
|
|
|
|
} |
|
|
|
|
|