like_query 0.0.17 → 0.1.1

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: 9f271a2601cfb3587fb40e2cd50ae325d54b00194b3ae6935e1ebe9e4b9e8bcb
4
+ data.tar.gz: bd3d3863befc960ed4f94842f0e6643715aae58ff16394b7d047b124d0ca26b8
5
5
  SHA512:
6
- metadata.gz: ce925c7474309b9e4ecdefb9834a32d63ef93eb84bdc52f7ff36717cf864332532d03fdd55be31ffa9c46791214a5fe9619e265ac9376878c4a966f1806830f3
7
- data.tar.gz: 66d742112d96c97740072a83bb2d76a2e13859fcb7d51cf00111b5034f60e9b1d1fe45d7f05995063f21098c5f8261b11aae1093da1c02d173c75a0cb5c06f59
6
+ metadata.gz: 18786e249d72ece3a0d442be622a0cb44d99ffd7ea596dc0b5a0f4cc92f4845d9eea08f61ecfbdeb8959802a8115a258bf53f207f7590fd0d95c0e38c7285578
7
+ data.tar.gz: 43f86c5823d53103ea79ce9ecc92318b6fbf5ba2cccf9702a3c107b7f8b080df0f62144d76c0b20e157920a7d8df641791f6b718eeee23518bda40aad7b31cd2
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,26 @@ 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 = create_arel(v, f_str, assoc)
34
35
  q = (q ? q.or(_q) : _q)
35
36
  elsif v.is_a?(Array)
36
37
  v.each do |_v|
37
- _q = assoc.klass.arel_table[_v].matches(str)
38
+ _q = create_arel(_v, f_str, assoc)
38
39
  q = (q ? q.or(_q) : _q)
39
40
  end
40
41
  else
41
42
  raise "unknown element: #{p}"
42
43
  end
43
44
  end
45
+ else
46
+ _q = create_arel(p, f_str)
47
+ q = (q ? q.or(_q) : _q)
44
48
  end
45
49
 
46
50
  end
@@ -80,11 +84,49 @@ module LikeQuery
80
84
  en = defined_enums[column_name.to_s]
81
85
  return nil if en.nil?
82
86
  r = []
83
- en.each do |k,v|
87
+ en.each do |k, v|
84
88
  r.push(v) if k.downcase.include?(value.downcase)
85
89
  end
86
90
  r
87
91
  end
88
92
 
93
+ def format_string_element(str)
94
+
95
+ match_number = str.match(/^(\d+(?:\.\d+)?)$/)
96
+ match_range = str.match(/^(\d+(?:\.\d+)?)(\.\.)(\d+(?:\.\d+)?)$/)
97
+
98
+ if match_range
99
+ mr = match_range.to_s
100
+ {
101
+ float_from: mr.split('..').first.to_f,
102
+ float_until: mr.split('..').last.to_f,
103
+ }
104
+ elsif match_number
105
+ mn = match_number.to_s
106
+ {
107
+ float_from: mn,
108
+ float_until: mn,
109
+ }
110
+ else
111
+ {
112
+ string: "%#{str}%"
113
+ }
114
+ end
115
+ end
116
+
117
+ def create_arel(schema_column, search_string, association = nil)
118
+
119
+ base_object = association&.klass || self
120
+ type = base_object.columns_hash[schema_column.to_s].type
121
+ arel = base_object.arel_table[schema_column]
122
+
123
+ if search_string[:float_from]
124
+ if [:float, :big_decimal, :integer].include?(type)
125
+ arel.between(search_string[:float_from]..search_string[:float_until])
126
+ end
127
+ else
128
+ arel.matches(search_string[:string])
129
+ end
130
+ end
89
131
  end
90
132
  end
@@ -1,3 +1,3 @@
1
1
  module LikeQuery
2
- VERSION = "0.0.17"
2
+ VERSION = "0.1.1"
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.1
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