like_query 0.0.16 → 0.1.1

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: dbfa734a9e5416b6267b2b9f07f1dbee004c14b77ca11145adfa88a1feae79c3
4
- data.tar.gz: 1e7385e5ab95bdead0c203ebb8221faf131bcef925b3d6284a135d3d73a7c29d
3
+ metadata.gz: 9f271a2601cfb3587fb40e2cd50ae325d54b00194b3ae6935e1ebe9e4b9e8bcb
4
+ data.tar.gz: bd3d3863befc960ed4f94842f0e6643715aae58ff16394b7d047b124d0ca26b8
5
5
  SHA512:
6
- metadata.gz: 80e648f6bd86f28d3264299c457139f1760821b9986969be8bf2f552389736f3100ab378a94f3fca4a0f6e6db790add316e68b9e36b26e29cb224a563b6348bf
7
- data.tar.gz: 95f6e614d5f227ab29bb35f5f7c765a254432a5ccc0a85b73359f0762d7c96d602080dc4cd3ad42cf9c913dee7744038f1c9d9bab5ff5e1c0e6a08d8e14ec5c8
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,6 +3,9 @@ module LikeQuery
3
3
 
4
4
  def like(search_string, schema = nil)
5
5
 
6
+ search_string = '' if !search_string
7
+ search_string = search_string.to_s unless search_string.is_a?(String)
8
+
6
9
  raise 'like can only be called from a model' if self == ApplicationRecord
7
10
 
8
11
  queries = nil
@@ -10,8 +13,10 @@ module LikeQuery
10
13
  schema = [schema] if schema.is_a?(Symbol)
11
14
  @like_query_schema = schema
12
15
 
13
- (search_string.is_a?(String) ? search_string.split(' ') : search_string).each do |s|
14
- str = "%#{s}%"
16
+ search_string.split(' ').each do |s|
17
+
18
+ f_str = format_string_element(s)
19
+
15
20
  q = nil
16
21
  if schema.first.is_a?(Array) && schema.length >= 2
17
22
  raise "only one array can be given: Either schema as one array or as multiple args, not as array"
@@ -20,26 +25,26 @@ module LikeQuery
20
25
  enum_lab = enum_keys(p, s)
21
26
  if enum_lab.present?
22
27
  q = arel_table[p].in(enum_lab)
23
- elsif p.is_a?(Symbol) || p.is_a?(String)
24
- _q = arel_table[p].matches(str)
25
- q = (q ? q.or(_q) : _q)
26
28
  elsif p.is_a?(Hash)
27
29
  p.each do |k, v|
28
30
  assoc = reflect_on_association(k)
29
31
  raise "Unknown association: :#{k}" unless assoc.present?
30
32
  associations.push(k.to_sym) unless associations.include?(k.to_sym)
31
33
  if v.is_a?(Symbol) || v.is_a?(String)
32
- _q = assoc.klass.arel_table[v].matches(str)
34
+ _q = create_arel(v, f_str, assoc)
33
35
  q = (q ? q.or(_q) : _q)
34
36
  elsif v.is_a?(Array)
35
37
  v.each do |_v|
36
- _q = assoc.klass.arel_table[_v].matches(str)
38
+ _q = create_arel(_v, f_str, assoc)
37
39
  q = (q ? q.or(_q) : _q)
38
40
  end
39
41
  else
40
42
  raise "unknown element: #{p}"
41
43
  end
42
44
  end
45
+ else
46
+ _q = create_arel(p, f_str)
47
+ q = (q ? q.or(_q) : _q)
43
48
  end
44
49
 
45
50
  end
@@ -79,11 +84,49 @@ module LikeQuery
79
84
  en = defined_enums[column_name.to_s]
80
85
  return nil if en.nil?
81
86
  r = []
82
- en.each do |k,v|
87
+ en.each do |k, v|
83
88
  r.push(v) if k.downcase.include?(value.downcase)
84
89
  end
85
90
  r
86
91
  end
87
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
88
131
  end
89
132
  end
@@ -1,3 +1,3 @@
1
1
  module LikeQuery
2
- VERSION = "0.0.16"
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.16
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-06-27 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