like_query 0.0.17 → 0.1.2

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
2
  SHA256:
3
- metadata.gz: caf444e80b657a38ee1834b353137f6cf6b9dfbfc1828804706ecd9f7dc5d775
4
- data.tar.gz: 3823fc56fa8aad401a26c2a88ec68532cf235a4fbb0c6ac8ccc321e0333c9fbf
3
+ metadata.gz: 5b3ecb102cd58ed1ecefe66b9bd8c760b599285d8259c65b813d82fabae3be2d
4
+ data.tar.gz: 10c48700df9e2179ae0eeab011be58e6a70faf74c9483d13edea52f4a03ce7f1
5
5
  SHA512:
6
- metadata.gz: ce925c7474309b9e4ecdefb9834a32d63ef93eb84bdc52f7ff36717cf864332532d03fdd55be31ffa9c46791214a5fe9619e265ac9376878c4a966f1806830f3
7
- data.tar.gz: 66d742112d96c97740072a83bb2d76a2e13859fcb7d51cf00111b5034f60e9b1d1fe45d7f05995063f21098c5f8261b11aae1093da1c02d173c75a0cb5c06f59
6
+ metadata.gz: 5ce052feef2d7dd04737c3df8e741189da3d09a0d17443c61a60a254121d57f024c1d52adddf9d2fcfad361d2ca44043087964b97ba2c3dc43460cfbdb023f9e
7
+ data.tar.gz: fa8ffaa79f5c3b6583741f8b7344d61dc1a1abaadc9faf4a3e3f6ff0b2c2d4cf2b12262988274075e4e4fa758e1f517e59eb6ea3a2488d9b459800eccc773a1e
data/README.md CHANGED
@@ -99,6 +99,13 @@ Article.like('Truck', [:type_enum]).count #=> 1
99
99
 
100
100
  Translated enums and enums on associated models (e.g. article.customer) not yet implemented
101
101
 
102
+ **Numbers**
103
+
104
+ ```ruby
105
+ Book.like('Nelson 3.4..8', [:title, :price])
106
+ # => find books where title includes "Nelson" and price (must be number column) is between 3.4 and 8
107
+ ```
108
+
102
109
  **Class LikeQuery::Collect**
103
110
 
104
111
  ```ruby
@@ -3,7 +3,9 @@ module LikeQuery
3
3
 
4
4
  def like(search_string, schema = nil)
5
5
 
6
- search_string = '' unless search_string
6
+ search_string = '' if !search_string
7
+ search_string = search_string.to_s unless search_string.is_a?(String)
8
+
7
9
  raise 'like can only be called from a model' if self == ApplicationRecord
8
10
 
9
11
  queries = nil
@@ -11,8 +13,10 @@ module LikeQuery
11
13
  schema = [schema] if schema.is_a?(Symbol)
12
14
  @like_query_schema = schema
13
15
 
14
- (search_string.is_a?(String) ? search_string.split(' ') : search_string).each do |s|
15
- str = "%#{s}%"
16
+ search_string.split(' ').each do |s|
17
+
18
+ f_str = format_string_element(s)
19
+
16
20
  q = nil
17
21
  if schema.first.is_a?(Array) && schema.length >= 2
18
22
  raise "only one array can be given: Either schema as one array or as multiple args, not as array"
@@ -21,26 +25,32 @@ module LikeQuery
21
25
  enum_lab = enum_keys(p, s)
22
26
  if enum_lab.present?
23
27
  q = arel_table[p].in(enum_lab)
24
- elsif p.is_a?(Symbol) || p.is_a?(String)
25
- _q = arel_table[p].matches(str)
26
- q = (q ? q.or(_q) : _q)
27
28
  elsif p.is_a?(Hash)
28
29
  p.each do |k, v|
29
30
  assoc = reflect_on_association(k)
30
31
  raise "Unknown association: :#{k}" unless assoc.present?
31
32
  associations.push(k.to_sym) unless associations.include?(k.to_sym)
32
33
  if v.is_a?(Symbol) || v.is_a?(String)
33
- _q = assoc.klass.arel_table[v].matches(str)
34
- q = (q ? q.or(_q) : _q)
34
+ _q = create_arel(v, f_str, assoc)
35
+ if _q.present?
36
+ q = (q ? q.or(_q) : _q)
37
+ end
35
38
  elsif v.is_a?(Array)
36
39
  v.each do |_v|
37
- _q = assoc.klass.arel_table[_v].matches(str)
38
- q = (q ? q.or(_q) : _q)
40
+ _q = create_arel(_v, f_str, assoc)
41
+ if _q.present?
42
+ q = (q ? q.or(_q) : _q)
43
+ end
39
44
  end
40
45
  else
41
46
  raise "unknown element: #{p}"
42
47
  end
43
48
  end
49
+ else
50
+ _q = create_arel(p, f_str)
51
+ if _q.present?
52
+ q = (q ? q.or(_q) : _q)
53
+ end
44
54
  end
45
55
 
46
56
  end
@@ -80,11 +90,49 @@ module LikeQuery
80
90
  en = defined_enums[column_name.to_s]
81
91
  return nil if en.nil?
82
92
  r = []
83
- en.each do |k,v|
93
+ en.each do |k, v|
84
94
  r.push(v) if k.downcase.include?(value.downcase)
85
95
  end
86
96
  r
87
97
  end
88
98
 
99
+ def format_string_element(str)
100
+
101
+ match_number = str.match(/^(\d+(?:\.\d+)?)$/)
102
+ match_range = str.match(/^(\d+(?:\.\d+)?)(\.\.)(\d+(?:\.\d+)?)$/)
103
+
104
+ if match_range
105
+ mr = match_range.to_s
106
+ {
107
+ float_from: mr.split('..').first.to_f,
108
+ float_until: mr.split('..').last.to_f,
109
+ }
110
+ elsif match_number
111
+ mn = match_number.to_s
112
+ {
113
+ float_from: mn,
114
+ float_until: mn,
115
+ }
116
+ else
117
+ {
118
+ string: "%#{str}%"
119
+ }
120
+ end
121
+ end
122
+
123
+ def create_arel(schema_column, search_string, association = nil)
124
+
125
+ base_object = association&.klass || self
126
+ type = base_object.columns_hash[schema_column.to_s].type
127
+ arel = base_object.arel_table[schema_column]
128
+
129
+ if search_string[:float_from]
130
+ if [:float, :big_decimal, :integer].include?(type)
131
+ arel.between(search_string[:float_from]..search_string[:float_until])
132
+ end
133
+ else
134
+ arel.matches(search_string[:string])
135
+ end
136
+ end
89
137
  end
90
138
  end
@@ -1,3 +1,3 @@
1
1
  module LikeQuery
2
- VERSION = "0.0.17"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: like_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - christian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-19 00:00:00.000000000 Z
11
+ date: 2024-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails