flipper-active_record 0.26.1 → 0.26.2
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/benchmark/active_record_adapter_ips.rb +15 -0
- data/benchmark/active_record_ips.rb +17 -0
- data/benchmark/active_record_setup.rb +31 -0
- data/lib/flipper/adapters/active_record.rb +31 -18
- data/lib/flipper/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2bf01c33aad4266b0237775c779d6b3b19d01d43adff566c82c1ddb26fb76f5
|
4
|
+
data.tar.gz: 34ba1e6bded36a3352031c82b9f32d34abbb5f8781eb28b15f7aa450cbd02cbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 303520e21a9e3f71284d72bb817032df8849b5bee213e4a42924ab5e90af1f38e82734830fba40d11c0b6e91962b134838e80d181f4c7482f306f64651222bf6
|
7
|
+
data.tar.gz: f9b371acc123a5a7cc8e901d40db474a83f706d886496512b9f24c298d0a8e621c2e394b3b38f8bddc5b92966d7ab594f38c1b83912026eac967133dccd1eb2d
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require_relative './active_record_setup'
|
3
|
+
require 'flipper'
|
4
|
+
require 'flipper/adapters/active_record'
|
5
|
+
require 'benchmark/ips'
|
6
|
+
|
7
|
+
flipper = Flipper.new(Flipper::Adapters::ActiveRecord.new)
|
8
|
+
|
9
|
+
2000.times do |i|
|
10
|
+
flipper.enable_actor :foo, Flipper::Actor.new("User;#{i}")
|
11
|
+
end
|
12
|
+
|
13
|
+
Benchmark.ips do |x|
|
14
|
+
x.report("get_all") { flipper.preload_all }
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require_relative './active_record_setup'
|
3
|
+
require 'flipper'
|
4
|
+
require 'flipper/adapters/active_record'
|
5
|
+
require 'benchmark/ips'
|
6
|
+
|
7
|
+
flipper = Flipper.new(Flipper::Adapters::ActiveRecord.new)
|
8
|
+
|
9
|
+
2000.times do |i|
|
10
|
+
flipper.enable_actor :foo, Flipper::Actor.new("User;#{i}")
|
11
|
+
end
|
12
|
+
|
13
|
+
Benchmark.ips do |x|
|
14
|
+
x.report("all") { Flipper::Adapters::ActiveRecord::Gate.where(feature_key: "foo".freeze).load }
|
15
|
+
x.report("pluck") { Flipper::Adapters::ActiveRecord::Gate.where(feature_key: "foo".freeze).pluck(:key, :value) }
|
16
|
+
x.compare!
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
ActiveRecord::Base.establish_connection({
|
5
|
+
adapter: 'sqlite3',
|
6
|
+
database: ':memory:',
|
7
|
+
})
|
8
|
+
|
9
|
+
ActiveRecord::Base.connection.execute <<-SQL
|
10
|
+
CREATE TABLE flipper_features (
|
11
|
+
id integer PRIMARY KEY,
|
12
|
+
key text NOT NULL UNIQUE,
|
13
|
+
created_at datetime NOT NULL,
|
14
|
+
updated_at datetime NOT NULL
|
15
|
+
)
|
16
|
+
SQL
|
17
|
+
|
18
|
+
ActiveRecord::Base.connection.execute <<-SQL
|
19
|
+
CREATE TABLE flipper_gates (
|
20
|
+
id integer PRIMARY KEY,
|
21
|
+
feature_key text NOT NULL,
|
22
|
+
key text NOT NULL,
|
23
|
+
value text DEFAULT NULL,
|
24
|
+
created_at datetime NOT NULL,
|
25
|
+
updated_at datetime NOT NULL
|
26
|
+
)
|
27
|
+
SQL
|
28
|
+
|
29
|
+
ActiveRecord::Base.connection.execute <<-SQL
|
30
|
+
CREATE UNIQUE INDEX index_gates_on_keys_and_value on flipper_gates (feature_key, key, value)
|
31
|
+
SQL
|
@@ -95,17 +95,22 @@ module Flipper
|
|
95
95
|
#
|
96
96
|
# Returns a Hash of Flipper::Gate#key => value.
|
97
97
|
def get(feature)
|
98
|
-
|
99
|
-
|
98
|
+
gates = with_connection(@gate_class) { @gate_class.where(feature_key: feature.key).pluck(:key, :value) }
|
99
|
+
result_for_gates(feature, gates)
|
100
100
|
end
|
101
101
|
|
102
102
|
def get_multi(features)
|
103
103
|
with_connection(@gate_class) do
|
104
|
-
|
105
|
-
|
104
|
+
gates = @gate_class.where(feature_key: features.map(&:key)).pluck(:feature_key, :key, :value)
|
105
|
+
grouped_gates = gates.inject({}) do |hash, (feature_key, key, value)|
|
106
|
+
hash[feature_key] ||= []
|
107
|
+
hash[feature_key] << [key, value]
|
108
|
+
hash
|
109
|
+
end
|
110
|
+
|
106
111
|
result = {}
|
107
112
|
features.each do |feature|
|
108
|
-
result[feature.key] =
|
113
|
+
result[feature.key] = result_for_gates(feature, grouped_gates[feature.key])
|
109
114
|
end
|
110
115
|
result
|
111
116
|
end
|
@@ -113,18 +118,26 @@ module Flipper
|
|
113
118
|
|
114
119
|
def get_all
|
115
120
|
with_connection(@feature_class) do
|
121
|
+
# query the gates from the db in a single query
|
116
122
|
features = ::Arel::Table.new(@feature_class.table_name.to_sym)
|
117
123
|
gates = ::Arel::Table.new(@gate_class.table_name.to_sym)
|
118
|
-
rows_query = features.join(gates, Arel::Nodes::OuterJoin)
|
124
|
+
rows_query = features.join(gates, ::Arel::Nodes::OuterJoin)
|
119
125
|
.on(features[:key].eq(gates[:feature_key]))
|
120
126
|
.project(features[:key].as('feature_key'), gates[:key], gates[:value])
|
121
|
-
|
122
|
-
|
123
|
-
|
127
|
+
gates = @feature_class.connection.select_rows(rows_query)
|
128
|
+
|
129
|
+
# group the gates by feature key
|
130
|
+
grouped_gates = gates.inject({}) do |hash, (feature_key, key, value)|
|
131
|
+
hash[feature_key] ||= []
|
132
|
+
hash[feature_key] << [key, value]
|
133
|
+
hash
|
134
|
+
end
|
135
|
+
|
136
|
+
# build up the result hash
|
124
137
|
result = Hash.new { |hash, key| hash[key] = default_config }
|
125
|
-
features =
|
138
|
+
features = grouped_gates.keys.map { |key| Flipper::Feature.new(key, self) }
|
126
139
|
features.each do |feature|
|
127
|
-
result[feature.key] =
|
140
|
+
result[feature.key] = result_for_gates(feature, grouped_gates[feature.key])
|
128
141
|
end
|
129
142
|
result
|
130
143
|
end
|
@@ -219,22 +232,22 @@ module Flipper
|
|
219
232
|
# already added so no need move on with life
|
220
233
|
end
|
221
234
|
|
222
|
-
def
|
223
|
-
db_gates ||= []
|
235
|
+
def result_for_gates(feature, gates)
|
224
236
|
result = {}
|
237
|
+
gates ||= []
|
225
238
|
feature.gates.each do |gate|
|
226
239
|
result[gate.key] =
|
227
240
|
case gate.data_type
|
228
241
|
when :boolean
|
229
|
-
if
|
230
|
-
|
242
|
+
if row = gates.detect { |key, value| !key.nil? && key.to_sym == gate.key }
|
243
|
+
row.last
|
231
244
|
end
|
232
245
|
when :integer
|
233
|
-
if
|
234
|
-
|
246
|
+
if row = gates.detect { |key, value| !key.nil? && key.to_sym == gate.key }
|
247
|
+
row.last
|
235
248
|
end
|
236
249
|
when :set
|
237
|
-
|
250
|
+
gates.select { |key, value| !key.nil? && key.to_sym == gate.key }.map(&:last).to_set
|
238
251
|
else
|
239
252
|
unsupported_data_type gate.data_type
|
240
253
|
end
|
data/lib/flipper/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flipper-active_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.26.
|
4
|
+
version: 0.26.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.26.
|
19
|
+
version: 0.26.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.26.
|
26
|
+
version: 0.26.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -51,6 +51,9 @@ executables: []
|
|
51
51
|
extensions: []
|
52
52
|
extra_rdoc_files: []
|
53
53
|
files:
|
54
|
+
- benchmark/active_record_adapter_ips.rb
|
55
|
+
- benchmark/active_record_ips.rb
|
56
|
+
- benchmark/active_record_setup.rb
|
54
57
|
- examples/active_record/ar_setup.rb
|
55
58
|
- examples/active_record/basic.rb
|
56
59
|
- examples/active_record/internals.rb
|