splitclient-rb 7.3.5.pre.rc1 → 7.3.5.pre.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/splitclient-rb/cache/filter/bloom_filter.rb +63 -0
- data/lib/splitclient-rb/cache/filter/filter_adapter.rb +2 -2
- data/lib/splitclient-rb/split_factory.rb +1 -3
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +1 -0
- data/splitclient-rb.gemspec +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0f3db9ed40e5c2bf07caa781888d680307e649eca41fc2e5321aefb2373072d4
|
|
4
|
+
data.tar.gz: 421b1630311542b729069a73a29646a5c1162b89a902d070fcf88434c051b7b2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 378c6248fa6e047ef94f1afa80e6a3f5a725ccb9588c8af11061a75e575d7441168a13672749e9e03ac38571ccd4578e4a821dee888b72403e923d1bfa5151c5
|
|
7
|
+
data.tar.gz: 1bb4d9b98cd783dd65b550811bee706e1b125153acd926d74bb5ae2ca3c8069eca8f9e3f212405f08ca0c3aa3613cf3d04afee4ac250f86c8713cceb00ad21a7
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bitarray'
|
|
4
|
+
|
|
5
|
+
module SplitIoClient
|
|
6
|
+
module Cache
|
|
7
|
+
module Filter
|
|
8
|
+
class BloomFilter
|
|
9
|
+
def initialize(capacity, false_positive_probability = 0.001)
|
|
10
|
+
@capacity = capacity.round
|
|
11
|
+
m = best_m(capacity, false_positive_probability)
|
|
12
|
+
@ba = BitArray.new(m.round)
|
|
13
|
+
@k = best_k(capacity)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add(string)
|
|
17
|
+
return false if contains?(string)
|
|
18
|
+
|
|
19
|
+
positions = hashes(string)
|
|
20
|
+
|
|
21
|
+
positions.each { |position| @ba[position] = 1 }
|
|
22
|
+
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def contains?(string)
|
|
27
|
+
!hashes(string).any? { |ea| @ba[ea] == 0 }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def clear
|
|
31
|
+
@ba.size.times { |i| @ba[i] = 0 }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# m is the required number of bits in the array
|
|
37
|
+
def best_m(capacity, false_positive_probability)
|
|
38
|
+
-(capacity * Math.log(false_positive_probability)) / (Math.log(2) ** 2)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# k is the number of hash functions that minimizes the probability of false positives
|
|
42
|
+
def best_k(capacity)
|
|
43
|
+
(Math.log(2) * (@ba.size / capacity)).round
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def hashes(data)
|
|
47
|
+
m = @ba.size
|
|
48
|
+
h = Digest::MD5.hexdigest(data.to_s).to_i(16)
|
|
49
|
+
x = h % m
|
|
50
|
+
h /= m
|
|
51
|
+
y = h % m
|
|
52
|
+
h /= m
|
|
53
|
+
z = h % m
|
|
54
|
+
[x] + 1.upto(@k - 1).collect do |i|
|
|
55
|
+
x = (x + y) % m
|
|
56
|
+
y = (y + z) % m
|
|
57
|
+
x
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -10,13 +10,13 @@ module SplitIoClient
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def add(feature_name, key)
|
|
13
|
-
@filter.
|
|
13
|
+
@filter.add("#{feature_name}#{key}")
|
|
14
14
|
rescue StandardError => e
|
|
15
15
|
@config.log_found_exception(__method__.to_s, e)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def contains?(feature_name, key)
|
|
19
|
-
@filter.
|
|
19
|
+
@filter.contains?("#{feature_name}#{key}")
|
|
20
20
|
rescue StandardError => e
|
|
21
21
|
@config.log_found_exception(__method__.to_s, e)
|
|
22
22
|
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'bloomfilter-rb'
|
|
4
|
-
|
|
5
3
|
module SplitIoClient
|
|
6
4
|
class SplitFactory
|
|
7
5
|
ROOT_PROCESS_ID = Process.pid
|
|
@@ -218,7 +216,7 @@ module SplitIoClient
|
|
|
218
216
|
return
|
|
219
217
|
end
|
|
220
218
|
|
|
221
|
-
bf = BloomFilter
|
|
219
|
+
bf = Cache::Filter::BloomFilter.new(30_000_000)
|
|
222
220
|
filter_adapter = Cache::Filter::FilterAdapter.new(@config, bf)
|
|
223
221
|
cache = Concurrent::Hash.new
|
|
224
222
|
@unique_keys_tracker = Engine::Impressions::UniqueKeysTracker.new(@config, filter_adapter, @impressions_sender_adapter, cache)
|
data/lib/splitclient-rb.rb
CHANGED
|
@@ -12,6 +12,7 @@ require 'splitclient-rb/cache/adapters/memory_adapter'
|
|
|
12
12
|
require 'splitclient-rb/cache/adapters/redis_adapter'
|
|
13
13
|
require 'splitclient-rb/cache/fetchers/segment_fetcher'
|
|
14
14
|
require 'splitclient-rb/cache/fetchers/split_fetcher'
|
|
15
|
+
require 'splitclient-rb/cache/filter/bloom_filter'
|
|
15
16
|
require 'splitclient-rb/cache/filter/filter_adapter'
|
|
16
17
|
require 'splitclient-rb/cache/hashers/impression_hasher'
|
|
17
18
|
require 'splitclient-rb/cache/observers/impression_observer'
|
data/splitclient-rb.gemspec
CHANGED
|
@@ -50,7 +50,7 @@ Gem::Specification.new do |spec|
|
|
|
50
50
|
spec.add_development_dependency 'timecop', '~> 0.9'
|
|
51
51
|
spec.add_development_dependency 'webmock', '~> 3.14'
|
|
52
52
|
|
|
53
|
-
spec.add_runtime_dependency '
|
|
53
|
+
spec.add_runtime_dependency 'bitarray', '~> 1.3'
|
|
54
54
|
spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
|
|
55
55
|
spec.add_runtime_dependency 'faraday', '>= 0.8', '< 2.0'
|
|
56
56
|
spec.add_runtime_dependency 'json', '>= 1.8', '< 3.0'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: splitclient-rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 7.3.5.pre.
|
|
4
|
+
version: 7.3.5.pre.rc2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Split Software
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-04-
|
|
11
|
+
date: 2022-04-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: allocation_stats
|
|
@@ -193,19 +193,19 @@ dependencies:
|
|
|
193
193
|
- !ruby/object:Gem::Version
|
|
194
194
|
version: '3.14'
|
|
195
195
|
- !ruby/object:Gem::Dependency
|
|
196
|
-
name:
|
|
196
|
+
name: bitarray
|
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
|
198
198
|
requirements:
|
|
199
199
|
- - "~>"
|
|
200
200
|
- !ruby/object:Gem::Version
|
|
201
|
-
version: '
|
|
201
|
+
version: '1.3'
|
|
202
202
|
type: :runtime
|
|
203
203
|
prerelease: false
|
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
|
205
205
|
requirements:
|
|
206
206
|
- - "~>"
|
|
207
207
|
- !ruby/object:Gem::Version
|
|
208
|
-
version: '
|
|
208
|
+
version: '1.3'
|
|
209
209
|
- !ruby/object:Gem::Dependency
|
|
210
210
|
name: concurrent-ruby
|
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -407,6 +407,7 @@ files:
|
|
|
407
407
|
- lib/splitclient-rb/cache/adapters/redis_adapter.rb
|
|
408
408
|
- lib/splitclient-rb/cache/fetchers/segment_fetcher.rb
|
|
409
409
|
- lib/splitclient-rb/cache/fetchers/split_fetcher.rb
|
|
410
|
+
- lib/splitclient-rb/cache/filter/bloom_filter.rb
|
|
410
411
|
- lib/splitclient-rb/cache/filter/filter_adapter.rb
|
|
411
412
|
- lib/splitclient-rb/cache/hashers/impression_hasher.rb
|
|
412
413
|
- lib/splitclient-rb/cache/observers/impression_observer.rb
|