splitclient-rb 7.3.5.pre.rc1 → 7.3.5.pre.rc2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69cfd920b90d9a1c7a22b9bdc708ee7ef2a911fc600e82070b9671ce918fe51c
4
- data.tar.gz: 994523b6dbd861c5c7f8027c23272b65348ba8c7cd97e06b84e01ccdd3992aee
3
+ metadata.gz: 0f3db9ed40e5c2bf07caa781888d680307e649eca41fc2e5321aefb2373072d4
4
+ data.tar.gz: 421b1630311542b729069a73a29646a5c1162b89a902d070fcf88434c051b7b2
5
5
  SHA512:
6
- metadata.gz: 704a28f628cb20b3f768435dcc400a240c75345de995e5633724aaff817778093f27a51a56d14e890a1306beedcd525035ac6d82f1c47730ba064504c75d4697
7
- data.tar.gz: 8d26256da8265defea4214edbba7ebdf155f7da8ca1bfb69a40bc89e30b73175a50fdc40f4233fdfc81ee70ec4799fe0de8e4e644f71b2efb0d62aff9570eaa5
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.insert("#{feature_name}#{key}")
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.include?("#{feature_name}#{key}")
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::Native.new(size: 95_850_584, hashes: 2)
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)
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '7.3.5.pre.rc1'
2
+ VERSION = '7.3.5.pre.rc2'
3
3
  end
@@ -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'
@@ -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 'bloomfilter-rb', '~> 2.1'
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.rc1
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-06 00:00:00.000000000 Z
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: bloomfilter-rb
196
+ name: bitarray
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: '2.1'
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: '2.1'
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