activerecord-filter 5.0.0.7 → 5.2.0

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
- SHA1:
3
- metadata.gz: a17e5665d5d8476c382e7dca7ab1bcbb600da917
4
- data.tar.gz: ac54d3aba9f451bd468a4e55943423307fc1e5cc
2
+ SHA256:
3
+ metadata.gz: a535b323a4ffbf5fc7628089b0c25e8f5034c82d15002938ec5b13081a9ba13a
4
+ data.tar.gz: 8429eb3399716797f4b969e2205b5e47b1989abd6f65e55e0f2c4405860fb6ad
5
5
  SHA512:
6
- metadata.gz: 4c5a83ec75a1bd656fcdf8c4a4505f3013cf155e03b0b3d638c0807ecc520a656b362ba9c8f75fd135ece248e030b984a95c24784b7947fab46b8f78b68688df
7
- data.tar.gz: 7ec0169479bfb8edf3b9767f4cd5daed9ce607ed0b3472a15cfceb2f6a59654654cb1a822a7502c0ecbcbac04c65854c8473b8437f27eaebe0be79d39dbc19f6
6
+ metadata.gz: 6dfdd6e75dc5c276f8394a82bb7750e4c4db093c7d1744b4d1cff418a4606d31bb9530ea4c1e896703e6fe651d3923c3094e42a19cc6c98d181df99165b88dbe
7
+ data.tar.gz: 0ae3202e02a5b2e79be030189a1b73bc0fdfcb09b35574f36c05a0059834316ca5ac864d79941a4c7b228eefe5e0d9ccc65347f525286f1b19aaf226cc201688
@@ -1,6 +1,5 @@
1
1
  require 'active_record'
2
2
  require 'arel/extensions'
3
- require 'action_controller/metal/strong_parameters'
4
3
 
5
4
  class ActiveRecord::UnkownFilterError < NoMethodError
6
5
  end
@@ -58,14 +57,15 @@ module ActiveRecord
58
57
  elsif value != true && value != false && value != 'true' && value != 'false' && !value.nil?
59
58
  relations << key
60
59
  end
61
- elsif key.to_s.ends_with?('_ids') && reflection = klass._reflections[key.to_s.gsub(/_ids$/, 's')]
60
+ elsif !klass.columns_hash.has_key?(key.to_s) && key.to_s.ends_with?('_ids') && reflection = klass._reflections[key.to_s.gsub(/_ids$/, 's')]
62
61
  relations << reflection.name
63
62
  elsif reflection = 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 }
64
- reflection = klass._reflections[klass._reflections[reflection.name.to_s].delegate_reflection.options[:through].to_s]
63
+ reflection = klass._reflections[klass._reflections[reflection.name.to_s].send(:delegate_reflection).options[:through].to_s]
65
64
  relations << {reflection.name => build_filter_joins(reflection.klass, value)}
66
65
  end
67
66
  end
68
67
  end
68
+ puts [relations, custom].inspect
69
69
  [relations, custom]
70
70
  end
71
71
 
@@ -167,9 +167,9 @@ module ActiveRecord
167
167
  def expand_filter_for_arel_attribute(column, attribute, key, value)
168
168
  case key.to_sym
169
169
  when :contains
170
- attribute.contains(column.array ? Array(convert_filter_value(column, value)) : convert_filter_value(column, value))
170
+ attribute.contains(column.array ? convert_filter_value(column, Array(value)) : convert_filter_value(column, value))
171
171
  when :contained_by
172
- attribute.contained_by(column.array ? Array(convert_filter_value(column, value)) : convert_filter_value(column, value))
172
+ attribute.contained_by(column.array ? convert_filter_value(column, Array(value)) : convert_filter_value(column, value))
173
173
  when :equal_to, :eq
174
174
  attribute.eq(convert_filter_value(column, value))
175
175
  when :excludes
@@ -179,7 +179,11 @@ module ActiveRecord
179
179
  when :greater_than_or_equal_to, :gteq, :gte
180
180
  attribute.gteq(convert_filter_value(column, value))
181
181
  when :has_key
182
- attribute.has_key(convert_filter_value(column, value))
182
+ attribute.has_key(value)
183
+ when :has_keys
184
+ attribute.has_keys(*Array(value))
185
+ when :has_any_key
186
+ attribute.has_any_key(*Array(value))
183
187
  when :in
184
188
  attribute.in(convert_filter_value(column, value))
185
189
  when :intersects
@@ -220,7 +224,17 @@ module ActiveRecord
220
224
  attribute.ts_query(convert_filter_value(column, value))
221
225
  end
222
226
  when :within
223
- attribute.within(value)
227
+ if value.is_a?(String)
228
+ if /\A[0-9A-F]*\Z/i.match?(value) && (value.start_with?('00') || value.start_with?('01'))
229
+ attribute.within(Arel::Nodes::HexEncodedBinary.new(value))
230
+ else
231
+ attribute.within(Arel::Nodes.build_quoted(value))
232
+ end
233
+ elsif value.is_a?(Hash)
234
+ attribute.within(Arel::Nodes.build_quoted(value))
235
+ else
236
+ raise "Not Supported value for within: #{value.inspect}"
237
+ end
224
238
  else
225
239
  raise "Not Supported: #{key.to_sym}"
226
240
  end
@@ -265,7 +279,7 @@ module ActiveRecord
265
279
  end
266
280
 
267
281
  def expand_filter_for_join_table(relation, value, join_dependency)
268
- relation = relation.active_record._reflections[relation.active_record._reflections[relation.name.to_s].delegate_reflection.options[:through].to_s]
282
+ relation = relation.active_record._reflections[relation.active_record._reflections[relation.name.to_s].send(:delegate_reflection).options[:through].to_s]
269
283
 
270
284
  builder = associated_predicate_builder(relation.name.to_sym)
271
285
  if join_dependency
@@ -288,8 +302,6 @@ module ActiveRecord
288
302
  end
289
303
 
290
304
  def build(filters, join_dependency)
291
- binds = []
292
-
293
305
  if filters.is_a?(Hash) || filters.is_a?(Array)
294
306
  # attributes = predicate_builder.resolve_column_aliases(filters)
295
307
  # attributes = klass.send(:expand_hash_conditions_for_aggregates, attributes)
@@ -301,7 +313,7 @@ module ActiveRecord
301
313
  raise ArgumentError, "Unsupported argument type: #{filters.inspect} (#{filters.class})"
302
314
  end
303
315
 
304
- WhereClause.new(parts, binds)
316
+ WhereClause.new(parts)
305
317
  end
306
318
 
307
319
  protected
@@ -314,8 +326,9 @@ end
314
326
  class ActiveRecord::Relation
315
327
  module Filter
316
328
 
317
- def initialize(klass, table, predicate_builder, values = {})
329
+ def initialize(klass, table: klass.arel_table, predicate_builder: klass.predicate_builder, values: {})
318
330
  @filters = []
331
+ @join_dependency = nil
319
332
  super
320
333
  end
321
334
 
@@ -324,14 +337,18 @@ class ActiveRecord::Relation
324
337
  super
325
338
  end
326
339
 
327
- def filter(filters)
328
- if filters.is_a?(ActionController::Parameters)
329
- filters = filters.to_unsafe_h
330
- elsif filters.is_a?(Array)
331
- filters.map! do |f|
332
- f.is_a?(ActionController::Parameters) ? f.to_unsafe_h : f
333
- end
340
+ def clean_filters(value)
341
+ if value.class.name == 'ActionController::Parameters'.freeze
342
+ value.to_unsafe_h
343
+ elsif value.is_a?(Array)
344
+ value.map { |v| clean_filters(v) }
345
+ else
346
+ value
334
347
  end
348
+ end
349
+
350
+ def filter(filters)
351
+ filters = clean_filters(filters)
335
352
 
336
353
  if filters.nil? || filters.empty?
337
354
  self
@@ -350,13 +367,13 @@ class ActiveRecord::Relation
350
367
  @filter_clause_factory ||= FilterClauseFactory.new(klass, predicate_builder)
351
368
  end
352
369
 
353
- def build_arel
370
+ def build_arel(aliases)
354
371
  arel = super
355
372
  build_filters(arel)
356
373
  arel
357
374
  end
358
375
 
359
- def build_join_query(manager, buckets, join_type)
376
+ def build_join_query(manager, buckets, join_type, aliases)
360
377
  buckets.default = []
361
378
 
362
379
  association_joins = buckets[:association_join]
@@ -364,33 +381,36 @@ class ActiveRecord::Relation
364
381
  join_nodes = buckets[:join_node].uniq
365
382
  string_joins = buckets[:string_join].map(&:strip).uniq
366
383
 
367
- join_list = join_nodes + convert_join_strings_to_ast(manager, string_joins)
384
+ join_list = join_nodes + convert_join_strings_to_ast(string_joins)
385
+ alias_tracker = alias_tracker(join_list, aliases)
368
386
 
369
387
  join_dependency = ActiveRecord::Associations::JoinDependency.new(
370
- @klass,
371
- association_joins,
372
- join_list
388
+ klass, table, association_joins, alias_tracker
373
389
  )
374
390
 
375
- join_infos = join_dependency.join_constraints stashed_association_joins, join_type
391
+ joins = join_dependency.join_constraints(stashed_association_joins, join_type)
392
+ joins.each { |join| manager.from(join) }
393
+ # join_infos = join_dependency.join_constraints stashed_association_joins, join_type
376
394
 
377
- join_infos.each do |info|
378
- info.joins.each { |join| manager.from(join) }
379
- manager.bind_values.concat info.binds
380
- end
395
+ # join_infos.each do |info|
396
+ # info.joins.each { |join| manager.from(join) }
397
+ # manager.bind_values.concat info.binds
398
+ # end
399
+
400
+ # manager.join_sources.concat(join_list)
381
401
 
382
402
  manager.join_sources.concat(join_list)
383
403
 
384
- if @klass.connection.class.name != 'ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter'
404
+ if klass.connection.class.name != 'ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter'
385
405
  @join_dependency = join_dependency
386
406
  end
387
407
 
388
- manager
408
+ alias_tracker.aliases
389
409
  end
390
410
 
391
411
  def build_filters(manager)
392
412
  @filters.each do |filters|
393
- manager.where(filter_clause_factory.build(filters, @join_dependency&.join_root).ast)
413
+ manager.where(filter_clause_factory.build(filters, @join_dependency&.send(:join_root)).ast)
394
414
  end
395
415
  end
396
416
 
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Filter
3
- VERSION = '5.0.0.7'
3
+ VERSION = '5.2.0'
4
4
  end
5
5
  end
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: 5.0.0.7
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-20 00:00:00.000000000 Z
11
+ date: 2018-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,74 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 5.0.0
19
+ version: 5.2.0.rc1
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '5.0'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 5.0.0
26
+ version: 5.2.0.rc1
33
27
  - !ruby/object:Gem::Dependency
34
- name: actionpack
28
+ name: arel-extensions
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
- version: '5.0'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 5.0.0
33
+ version: 1.6.0
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
46
37
  requirements:
47
38
  - - "~>"
48
39
  - !ruby/object:Gem::Version
49
- version: '5.0'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 5.0.0
40
+ version: 1.6.0
53
41
  - !ruby/object:Gem::Dependency
54
- name: arel-extensions
42
+ name: pg
55
43
  requirement: !ruby/object:Gem::Requirement
56
44
  requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '1.0'
60
45
  - - ">="
61
46
  - !ruby/object:Gem::Version
62
- version: 1.5.2
63
- type: :runtime
47
+ version: '0'
48
+ type: :development
64
49
  prerelease: false
65
50
  version_requirements: !ruby/object:Gem::Requirement
66
51
  requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: '1.0'
70
52
  - - ">="
71
53
  - !ruby/object:Gem::Version
72
- version: 1.5.2
54
+ version: '0'
73
55
  - !ruby/object:Gem::Dependency
74
- name: pg
56
+ name: actionpack
75
57
  requirement: !ruby/object:Gem::Requirement
76
58
  requirements:
77
- - - ">="
59
+ - - "~>"
78
60
  - !ruby/object:Gem::Version
79
- version: '0'
61
+ version: 5.2.0.rc1
80
62
  type: :development
81
63
  prerelease: false
82
64
  version_requirements: !ruby/object:Gem::Requirement
83
65
  requirements:
84
- - - ">="
66
+ - - "~>"
85
67
  - !ruby/object:Gem::Version
86
- version: '0'
68
+ version: 5.2.0.rc1
87
69
  - !ruby/object:Gem::Dependency
88
70
  name: bundler
89
71
  requirement: !ruby/object:Gem::Requirement
@@ -166,14 +148,14 @@ dependencies:
166
148
  requirements:
167
149
  - - ">="
168
150
  - !ruby/object:Gem::Version
169
- version: 5.0.0
151
+ version: 5.2.0.rc1
170
152
  type: :development
171
153
  prerelease: false
172
154
  version_requirements: !ruby/object:Gem::Requirement
173
155
  requirements:
174
156
  - - ">="
175
157
  - !ruby/object:Gem::Version
176
- version: 5.0.0
158
+ version: 5.2.0.rc1
177
159
  - !ruby/object:Gem::Dependency
178
160
  name: faker
179
161
  requirement: !ruby/object:Gem::Requirement
@@ -236,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
236
218
  version: '0'
237
219
  requirements: []
238
220
  rubyforge_project:
239
- rubygems_version: 2.6.8
221
+ rubygems_version: 2.7.4
240
222
  signing_key:
241
223
  specification_version: 4
242
224
  summary: A safe way to accept user parameters and query against your ActiveRecord