splitclient-rb 7.3.5.pre.rc1-java → 7.3.5.pre.rc4-java

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 52ee386fb2542467575c4f58ddfd25b3d33ff33e
4
- data.tar.gz: 6a6d7cd53ca3d0c7ad30c8fa8d3621c43e9a63d2
3
+ metadata.gz: 056032ef5843a8944e848f07d7a75471a193bdba
4
+ data.tar.gz: 94812fea82d41a99a9537555e3b04f617215807d
5
5
  SHA512:
6
- metadata.gz: fb3e3c3dac2de8df3994d40bb10ba3dddf1e1ca8ae382a144980ddb8ba61ff76fb4dad4f40ce4755ed0f81e63650f84ca238c9b4c1353db86dfa39891131be88
7
- data.tar.gz: f68eb21afac8f031a56eecb358d1e79520f38036b44f20f0596e07163b1cf1c4b50263f419b9388d556d2e919f206bffa17bd4f16e7f25276ba6d592487b3268
6
+ metadata.gz: 0b792cec62ca90569dbed5bcc8b4bb1a8bd3774add314806c0dc4fa10a09e560fbacf3927453348812f53fffdf88016a60b22fb47c4bb7bbf74d3cbdffd4e27d
7
+ data.tar.gz: 5b1e2eecf0de9f94bb6248eb145dc206f5927c2a0e068f2c3aeea57894ec358e9afec70409f5f109e3ed67e8de71b89317bc71d5abafa63861d7195e8e9a5c3f
@@ -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
@@ -9,15 +9,13 @@ module SplitIoClient
9
9
  impression_counter,
10
10
  telemetry_runtime_producer,
11
11
  impression_observer,
12
- unique_keys_tracker,
13
- impression_router)
12
+ unique_keys_tracker)
14
13
  @config = config
15
14
  @impressions_repository = impressions_repository
16
15
  @impression_counter = impression_counter
17
16
  @impression_observer = impression_observer
18
17
  @telemetry_runtime_producer = telemetry_runtime_producer
19
18
  @unique_keys_tracker = unique_keys_tracker
20
- @impression_router = impression_router
21
19
  end
22
20
 
23
21
  def build_impression(matching_key, bucketing_key, split_name, treatment, params = {})
@@ -58,12 +56,18 @@ module SplitIoClient
58
56
  @config.log_found_exception(__method__.to_s, e)
59
57
  ensure
60
58
  record_stats(stats)
61
- @impression_router.add_bulk(impressions)
59
+ impression_router.add_bulk(impressions)
62
60
  end
63
61
  end
64
62
 
65
63
  private
66
64
 
65
+ def impression_router
66
+ @impression_router ||= SplitIoClient::ImpressionRouter.new(@config)
67
+ rescue StandardError => error
68
+ @config.log_found_exception(__method__.to_s, error)
69
+ end
70
+
67
71
  def record_stats(stats)
68
72
  return if redis?
69
73
 
@@ -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)
@@ -251,8 +249,7 @@ module SplitIoClient
251
249
  build_impressions_observer
252
250
  build_impression_counter
253
251
 
254
- impression_router = ImpressionRouter.new(@config)
255
- @impressions_manager = Engine::Common::ImpressionManager.new(@config, @impressions_repository, @impression_counter, @runtime_producer, @impression_observer, @unique_keys_tracker, impression_router)
252
+ @impressions_manager = Engine::Common::ImpressionManager.new(@config, @impressions_repository, @impression_counter, @runtime_producer, @impression_observer, @unique_keys_tracker)
256
253
  end
257
254
  end
258
255
  end
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '7.3.5.pre.rc1'
2
+ VERSION = '7.3.5.pre.rc4'
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.rc4
5
5
  platform: java
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-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -197,15 +197,15 @@ dependencies:
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
- version: '2.1'
201
- name: bloomfilter-rb
200
+ version: '1.3'
201
+ name: bitarray
202
202
  prerelease: false
203
203
  type: :runtime
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
  requirement: !ruby/object:Gem::Requirement
211
211
  requirements:
@@ -402,6 +402,7 @@ files:
402
402
  - lib/splitclient-rb/cache/adapters/redis_adapter.rb
403
403
  - lib/splitclient-rb/cache/fetchers/segment_fetcher.rb
404
404
  - lib/splitclient-rb/cache/fetchers/split_fetcher.rb
405
+ - lib/splitclient-rb/cache/filter/bloom_filter.rb
405
406
  - lib/splitclient-rb/cache/filter/filter_adapter.rb
406
407
  - lib/splitclient-rb/cache/hashers/impression_hasher.rb
407
408
  - lib/splitclient-rb/cache/observers/impression_observer.rb