like_query 0.0.16 → 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: 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