like_query 0.0.17 → 0.1.2

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: 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