activerecord-filter 5.2.1.1 → 6.0.0

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
  SHA256:
3
- metadata.gz: e50c6dcde39aec10b2037328f63d5b4bbd051a0054b4f21feac732660e3814cf
4
- data.tar.gz: 5c17d22575163abee4958f403ebd5b7038dd8f6282f3a0f424a7f46d6fb85f20
3
+ metadata.gz: eb5558c10ab1700003d9bf88d48bd0d70a68e8cba26e802036f1c540b9e105db
4
+ data.tar.gz: edabdc23ec140c5cb0ae15078de8f56a8da63e8a813cea36ee9b94b1abf44455
5
5
  SHA512:
6
- metadata.gz: 6ec8a2f4070bb84beb6083e0909b792a3558b1706ec439997f155cb8505af81da9dca388abf2f68bc7e3049cf14067c7684726a533728fdd03d22fb7a4f9a671
7
- data.tar.gz: 168d718fa70364ff0e947a635cb995fa9cc1c74e02b1d154a932322f5483146fe31af0bb0f015d7790b3bc69c4ec6cfb9bbf303bea5e201015ca73d3a3676e96
6
+ metadata.gz: 10393c5284c77f55c91d386e696ad6067841db807286ebd0228c0df4a743a5ee66f283b14b2294e6be3d7c7f705f86079c5f9b46280da6cc57065eb2ed1a25a6
7
+ data.tar.gz: 8fc0d573ee06224c5c0f9cf245f37011518fac4309689206c5d8f4417efc59ce6e315dc10e36d94af4f00bc9f154d0256e3ba85c52cba6faae6b4cea33a4611f
data/README.md CHANGED
@@ -46,17 +46,21 @@ It can also work with array columns:
46
46
 
47
47
  ```ruby
48
48
  Property.filter(:tags => 'Skyscraper').to_sql
49
- # => "...WHERE 'Skyscraper' = ANY(properties.tags)..."
49
+ # => "...WHERE properties.tags = '{'Skyscraper'}'..."
50
50
 
51
51
  Property.filter(:tags => ['Skyscraper', 'Brick']).to_sql
52
- # => "...WHERE (properties.aliases && '{"Skyscraper", "Brick"}')..."
52
+ # => "...WHERE (properties.tags = '{"Skyscraper", "Brick"}')..."
53
+
54
+ Property.filter(:tags => {overlaps: ['Skyscraper', 'Brick']}).to_sql
55
+ # => "...WHERE properties.tags && '{"Skyscraper", "Brick"}')..."
56
+
57
+ Property.filter(:tags => {contains: ['Skyscraper', 'Brick']}).to_sql
58
+ # => "...WHERE accounts.tags @> '{"Skyscraper", "Brick"}')..."
59
+
53
60
  ```
54
61
  It can also sort on relations:
55
62
 
56
63
  ```ruby
57
- Photo.filter(:property => 10).to_sql
58
- # => "...WHERE photos.property_id = 5"
59
-
60
64
  Photo.filter(:property => {name: 'Empire State'}).to_sql
61
65
  # => "...INNER JOIN properties ON properties.id = photos.property_id
62
66
  # => " WHERE properties.name = 'Empire State'"
@@ -30,7 +30,8 @@ module ActiveRecord
30
30
  class PredicateBuilder # :nodoc:
31
31
 
32
32
  def self.filter_joins(klass, filters)
33
- build_filter_joins(klass, filters).inject(&:+)
33
+ custom = []
34
+ [build_filter_joins(klass, filters, [], custom), custom]
34
35
  end
35
36
 
36
37
  def self.build_filter_joins(klass, filters, relations=[], custom=[])
@@ -40,20 +41,27 @@ module ActiveRecord
40
41
  filters.each do |key, value|
41
42
  if klass.filters.has_key?(key.to_sym)
42
43
  js = klass.filters.dig(key.to_sym, :joins)
44
+
43
45
  if js.is_a?(Array)
44
46
  js.each do |j|
45
- if j.is_a?(Hash)
46
- relations << j
47
- else
47
+ if j.is_a?(String)
48
48
  custom << j
49
+ else
50
+ relations << j
49
51
  end
50
52
  end
51
53
  elsif js
52
- relations << js
54
+ if js.is_a?(String)
55
+ custom << js
56
+ else
57
+ relations << js
58
+ end
53
59
  end
54
60
  elsif reflection = klass._reflections[key.to_s]
55
61
  if value.is_a?(Hash)
56
- relations << {key => build_filter_joins(reflection.klass, value)}
62
+ relations << {
63
+ key => build_filter_joins(reflection.klass, value, [], custom)
64
+ }
57
65
  elsif value != true && value != false && value != 'true' && value != 'false' && !value.nil?
58
66
  relations << key
59
67
  end
@@ -65,7 +73,8 @@ module ActiveRecord
65
73
  end
66
74
  end
67
75
  end
68
- [relations, custom]
76
+
77
+ relations
69
78
  end
70
79
 
71
80
  def build_from_filter_hash(attributes, join_dependency)
@@ -216,6 +225,8 @@ module ActiveRecord
216
225
  attribute.not_in(convert_filter_value(column, value))
217
226
  when :overlaps
218
227
  attribute.overlaps(convert_filter_value(column, value))
228
+ when :not_overlaps
229
+ attribute.not_overlaps(convert_filter_value(column, value))
219
230
  when :ts_match
220
231
  if value.is_a?(Array)
221
232
  attribute.ts_query(*convert_filter_value(column, value))
@@ -271,7 +282,7 @@ module ActiveRecord
271
282
 
272
283
  if join_dependency
273
284
  join_dependency = join_dependency.children.find { |c| c.reflection.name == relation.name }
274
- builder.table.instance_variable_set(:@arel_table, join_dependency.tables.first)
285
+ builder.send(:table).instance_variable_set(:@arel_table, join_dependency.tables.first)
275
286
  end
276
287
 
277
288
  builder.build_from_filter_hash(value, join_dependency)
@@ -283,7 +294,7 @@ module ActiveRecord
283
294
  builder = associated_predicate_builder(relation.name.to_sym)
284
295
  if join_dependency
285
296
  join_dependency = join_dependency.children.find { |c| c.reflection.name == relation.name }
286
- builder.table.instance_variable_set(:@arel_table, join_dependency.tables.first)
297
+ builder.send(:table).instance_variable_set(:@arel_table, join_dependency.tables.first)
287
298
  end
288
299
  builder.build_from_filter_hash(value, join_dependency)
289
300
  end
@@ -357,7 +368,10 @@ class ActiveRecord::Relation
357
368
  end
358
369
 
359
370
  def filter!(filters)
360
- joins!(ActiveRecord::PredicateBuilder.filter_joins(klass, filters))
371
+ js = ActiveRecord::PredicateBuilder.filter_joins(klass, filters)
372
+ js.each do |j|
373
+ joins!(j) if j.present?
374
+ end
361
375
  @filters << filters
362
376
  self
363
377
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Filter
3
- VERSION = '5.2.1.1'
3
+ VERSION = '6.0.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.1.1
4
+ version: 6.0.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: 2018-11-06 00:00:00.000000000 Z
11
+ date: 2019-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.2.1
19
+ version: 6.0.0.rc1
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: 5.2.1
26
+ version: 6.0.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: arel-extensions
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.6'
33
+ version: 6.0.0
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: '1.6'
40
+ version: 6.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pg
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,36 +56,30 @@ dependencies:
56
56
  name: actionpack
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 5.2.1
61
+ version: 6.0.0.rc1
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 5.2.1
68
+ version: 6.0.0.rc1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.11'
76
73
  - - ">="
77
74
  - !ruby/object:Gem::Version
78
- version: 1.11.2
75
+ version: '0'
79
76
  type: :development
80
77
  prerelease: false
81
78
  version_requirements: !ruby/object:Gem::Requirement
82
79
  requirements:
83
- - - "~>"
84
- - !ruby/object:Gem::Version
85
- version: '1.11'
86
80
  - - ">="
87
81
  - !ruby/object:Gem::Version
88
- version: 1.11.2
82
+ version: '0'
89
83
  - !ruby/object:Gem::Dependency
90
84
  name: rake
91
85
  requirement: !ruby/object:Gem::Requirement
@@ -148,14 +142,14 @@ dependencies:
148
142
  requirements:
149
143
  - - ">="
150
144
  - !ruby/object:Gem::Version
151
- version: 5.2.1
145
+ version: 6.0.0.rc1
152
146
  type: :development
153
147
  prerelease: false
154
148
  version_requirements: !ruby/object:Gem::Requirement
155
149
  requirements:
156
150
  - - ">="
157
151
  - !ruby/object:Gem::Version
158
- version: 5.2.1
152
+ version: 6.0.0.rc1
159
153
  - !ruby/object:Gem::Dependency
160
154
  name: faker
161
155
  requirement: !ruby/object:Gem::Requirement
@@ -217,8 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
211
  - !ruby/object:Gem::Version
218
212
  version: '0'
219
213
  requirements: []
220
- rubyforge_project:
221
- rubygems_version: 2.7.6
214
+ rubygems_version: 3.0.3
222
215
  signing_key:
223
216
  specification_version: 4
224
217
  summary: A safe way to accept user parameters and query against your ActiveRecord