summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/database/postgres_hll/buckets_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/database/postgres_hll/buckets_spec.rb')
-rw-r--r--spec/lib/gitlab/database/postgres_hll/buckets_spec.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/spec/lib/gitlab/database/postgres_hll/buckets_spec.rb b/spec/lib/gitlab/database/postgres_hll/buckets_spec.rb
new file mode 100644
index 00000000000..b4d8fd4a449
--- /dev/null
+++ b/spec/lib/gitlab/database/postgres_hll/buckets_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::PostgresHll::Buckets do
+ let(:error_rate) { Gitlab::Database::PostgresHll::BatchDistinctCounter::ERROR_RATE } # HyperLogLog is a probabilistic algorithm, which provides estimated data, with given error margin
+ let(:buckets_hash_5) { { 121 => 2, 126 => 1, 141 => 1, 383 => 1, 56 => 1 } }
+ let(:buckets_hash_2) { { 141 => 1, 56 => 1 } }
+
+ describe '#estimated_distinct_count' do
+ it 'provides estimated cardinality', :aggregate_failures do
+ expect(described_class.new(buckets_hash_5).estimated_distinct_count).to be_within(error_rate).percent_of(5)
+ expect(described_class.new(buckets_hash_2).estimated_distinct_count).to be_within(error_rate).percent_of(2)
+ expect(described_class.new({}).estimated_distinct_count).to eq 0
+ expect(described_class.new.estimated_distinct_count).to eq 0
+ end
+ end
+
+ describe '#merge_hash!' do
+ let(:hash_a) { { 1 => 1, 2 => 3 } }
+ let(:hash_b) { { 1 => 2, 2 => 1 } }
+
+ it 'merges two hashes together into union of two sets' do
+ expect(described_class.new(hash_a).merge_hash!(hash_b).to_json).to eq described_class.new(1 => 2, 2 => 3).to_json
+ end
+ end
+
+ describe '#to_json' do
+ it 'serialize HyperLogLog buckets as hash' do
+ expect(described_class.new(1 => 5).to_json).to eq '{"1":5}'
+ end
+ end
+end