activerecord-filter 6.0.0.3 → 6.0.0.4
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/active_record/filter.rb +52 -44
- data/lib/active_record/filter/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86c7f7cf36ec41fc4dae21d1460151fcf2a32a9813f13a8b0acec56ebdccfbdd
|
4
|
+
data.tar.gz: 9993953d4a401d46e1bfd60102162794fd6f13d496d2fcd3352534fa0601ef90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69ad9b34f9b0511a0e34d76ef819b147a5705b9d0731fdca7fdcd3b876a90d1685321386033354653c39d30d3fb96283a4e4443e5a330bc405736e3342c24e06
|
7
|
+
data.tar.gz: f466d0b394b040109ba460a24a1811c8f4550bdeb9ca17904a4906ee1c2f011e59bf38481e074c29e08b4f6af4ea81360352bebb65fa45e49a285377d798f291
|
data/lib/active_record/filter.rb
CHANGED
@@ -77,13 +77,13 @@ module ActiveRecord
|
|
77
77
|
relations
|
78
78
|
end
|
79
79
|
|
80
|
-
def build_from_filter_hash(attributes)
|
80
|
+
def build_from_filter_hash(attributes, relation_trail, alias_tracker)
|
81
81
|
if attributes.is_a?(Array)
|
82
|
-
node = build_from_filter_hash(attributes.shift)
|
82
|
+
node = build_from_filter_hash(attributes.shift, relation_trail, alias_tracker)
|
83
83
|
|
84
84
|
n = attributes.shift(2)
|
85
85
|
while !n.empty?
|
86
|
-
n[1] = build_from_filter_hash(n[1])
|
86
|
+
n[1] = build_from_filter_hash(n[1], relation_trail, alias_tracker)
|
87
87
|
if n[0] == 'AND'
|
88
88
|
if node.is_a?(Arel::Nodes::And)
|
89
89
|
node.children.push(n[1])
|
@@ -100,26 +100,26 @@ module ActiveRecord
|
|
100
100
|
|
101
101
|
node
|
102
102
|
elsif attributes.is_a?(Hash)
|
103
|
-
expand_from_filter_hash(attributes)
|
103
|
+
expand_from_filter_hash(attributes, relation_trail, alias_tracker)
|
104
104
|
else
|
105
|
-
expand_from_filter_hash({id: attributes})
|
105
|
+
expand_from_filter_hash({id: attributes}, relation_trail, alias_tracker)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
def expand_from_filter_hash(attributes)
|
109
|
+
def expand_from_filter_hash(attributes, relation_trail, alias_tracker)
|
110
110
|
klass = table.send(:klass)
|
111
111
|
|
112
112
|
children = attributes.flat_map do |key, value|
|
113
113
|
if custom_filter = klass.filters[key]
|
114
|
-
self.instance_exec(klass, table, key, value, &custom_filter[:block])
|
114
|
+
self.instance_exec(klass, table, key, value, relation_trail, alias_tracker, &custom_filter[:block])
|
115
115
|
elsif column = klass.columns_hash[key.to_s] || klass.columns_hash[key.to_s.split('.').first]
|
116
|
-
expand_filter_for_column(key, column, value)
|
116
|
+
expand_filter_for_column(key, column, value, relation_trail)
|
117
117
|
elsif relation = klass.reflect_on_association(key)
|
118
|
-
expand_filter_for_relationship(relation, value)
|
118
|
+
expand_filter_for_relationship(relation, value, relation_trail, alias_tracker)
|
119
119
|
elsif key.to_s.ends_with?('_ids') && relation = klass.reflect_on_association(key.to_s.gsub(/_ids$/, 's'))
|
120
|
-
expand_filter_for_relationship(relation, {id: value})
|
120
|
+
expand_filter_for_relationship(relation, {id: value}, relation_trail, alias_tracker)
|
121
121
|
elsif relation = klass.reflect_on_all_associations(:has_and_belongs_to_many).find {|r| r.join_table == key.to_s && value.keys.first.to_s == r.association_foreign_key.to_s }
|
122
|
-
expand_filter_for_join_table(relation, value)
|
122
|
+
expand_filter_for_join_table(relation, value, relation_trail, alias_tracker)
|
123
123
|
else
|
124
124
|
raise ActiveRecord::UnkownFilterError.new("Unkown filter \"#{key}\" for #{klass}.")
|
125
125
|
end
|
@@ -133,21 +133,12 @@ module ActiveRecord
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
def expand_filter_for_column(key, column, value)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
# Arel::Nodes::TableAlias, would like to go back to it one day
|
141
|
-
attribute = if klass = table.send(:klass)
|
142
|
-
if Arel::Nodes::TableAlias === table.send(:arel_table)
|
143
|
-
klass.arel_attribute(column.name, table.send(:arel_table).left)
|
144
|
-
else
|
145
|
-
klass.arel_attribute(column.name, table.send(:arel_table))
|
146
|
-
end
|
147
|
-
else
|
148
|
-
table.send(:arel_table)[column.name]
|
136
|
+
def expand_filter_for_column(key, column, value, relation_trail)
|
137
|
+
attribute = table.arel_attribute(column.name)
|
138
|
+
relation_trail.each do |rt|
|
139
|
+
attribute = Arel::Attributes::Relation.new(attribute, rt)
|
149
140
|
end
|
150
|
-
|
141
|
+
|
151
142
|
if column.type == :json || column.type == :jsonb
|
152
143
|
names = key.to_s.split('.')
|
153
144
|
names.shift
|
@@ -250,11 +241,11 @@ module ActiveRecord
|
|
250
241
|
raise "Not Supported value for within: #{value.inspect}"
|
251
242
|
end
|
252
243
|
else
|
253
|
-
raise "Not Supported: #{key.to_sym}"
|
244
|
+
raise "Not Supported: #{key.to_sym} on column \"#{column.name}\" of type #{column.type}"
|
254
245
|
end
|
255
246
|
end
|
256
247
|
|
257
|
-
def expand_filter_for_relationship(relation, value)
|
248
|
+
def expand_filter_for_relationship(relation, value, relation_trail, alias_tracker)
|
258
249
|
case relation.macro
|
259
250
|
when :has_many
|
260
251
|
if value == true || value == 'true'
|
@@ -279,16 +270,37 @@ module ActiveRecord
|
|
279
270
|
return table.arel_attribute(relation.foreign_key).eq(nil)
|
280
271
|
end
|
281
272
|
end
|
282
|
-
|
283
|
-
builder =
|
284
|
-
|
273
|
+
|
274
|
+
builder = self.class.new(TableMetadata.new(
|
275
|
+
relation.klass,
|
276
|
+
alias_tracker.aliased_table_for(
|
277
|
+
relation.table_name,
|
278
|
+
relation.alias_candidate(table.send(:arel_table).name),
|
279
|
+
relation.klass.type_caster
|
280
|
+
),
|
281
|
+
relation
|
282
|
+
))
|
283
|
+
builder.build_from_filter_hash(value, relation_trail + [relation.name], alias_tracker)
|
285
284
|
end
|
286
285
|
|
287
|
-
|
286
|
+
|
287
|
+
def expand_filter_for_join_table(relation, value, relation_trail, alias_tracker)
|
288
288
|
relation = relation.active_record._reflections[relation.active_record._reflections[relation.name.to_s].send(:delegate_reflection).options[:through].to_s]
|
289
|
-
|
290
|
-
|
291
|
-
|
289
|
+
STDOUT.puts [
|
290
|
+
relation.table_name,
|
291
|
+
relation.alias_candidate(table.send(:arel_table).name)
|
292
|
+
|
293
|
+
].inspect
|
294
|
+
builder = self.class.new(TableMetadata.new(
|
295
|
+
relation.klass,
|
296
|
+
alias_tracker.aliased_table_for(
|
297
|
+
relation.table_name,
|
298
|
+
relation.alias_candidate(table.send(:arel_table).name),
|
299
|
+
relation.klass.type_caster
|
300
|
+
),
|
301
|
+
relation
|
302
|
+
))
|
303
|
+
builder.build_from_filter_hash(value, relation_trail + [relation.name], alias_tracker)
|
292
304
|
end
|
293
305
|
|
294
306
|
end
|
@@ -303,14 +315,9 @@ module ActiveRecord
|
|
303
315
|
@predicate_builder = predicate_builder
|
304
316
|
end
|
305
317
|
|
306
|
-
def build(filters)
|
318
|
+
def build(filters, alias_tracker)
|
307
319
|
if filters.is_a?(Hash) || filters.is_a?(Array)
|
308
|
-
|
309
|
-
# attributes = klass.send(:expand_hash_conditions_for_aggregates, attributes)
|
310
|
-
# attributes.stringify_keys!
|
311
|
-
#
|
312
|
-
# attributes, binds = predicate_builder.create_binds(attributes)
|
313
|
-
parts = [predicate_builder.build_from_filter_hash(filters)]
|
320
|
+
parts = [predicate_builder.build_from_filter_hash(filters, [], alias_tracker)]
|
314
321
|
else
|
315
322
|
raise ArgumentError, "Unsupported argument type: #{filters.inspect} (#{filters.class})"
|
316
323
|
end
|
@@ -371,13 +378,14 @@ class ActiveRecord::Relation
|
|
371
378
|
|
372
379
|
def build_arel(aliases)
|
373
380
|
arel = super
|
374
|
-
|
381
|
+
my_alias_tracker = ActiveRecord::Associations::AliasTracker.create(connection, table.name, [])
|
382
|
+
build_filters(arel, my_alias_tracker)
|
375
383
|
arel
|
376
384
|
end
|
377
385
|
|
378
|
-
def build_filters(manager)
|
386
|
+
def build_filters(manager, aliases)
|
379
387
|
@filters.each do |filters|
|
380
|
-
manager.where(filter_clause_factory.build(filters).ast)
|
388
|
+
manager.where(filter_clause_factory.build(filters, alias_tracker).ast)
|
381
389
|
end
|
382
390
|
end
|
383
391
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0.
|
4
|
+
version: 6.0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 6.0.0
|
33
|
+
version: 6.0.0.5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 6.0.0
|
40
|
+
version: 6.0.0.5
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pg
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|