like_query 0.4.3 → 1.0.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: a395b0ca0072b0b3750ed048c81dc27991faec8f961304789c7557c72604ff9e
4
- data.tar.gz: af895088c98030ace55e84d16d1c3f0e4913bc6630de5ff8e91c3bf83176839e
3
+ metadata.gz: 9138666d6536a394d83d47902776ba4af6f19dfe8c37bee56a356d5cc2e0c33e
4
+ data.tar.gz: 2ff26aa8e235fa3567b0df56f34ed2d9ae9087e42af88507624ee949e60e3712
5
5
  SHA512:
6
- metadata.gz: 8580ccce7db7810e88daf62d7d82e2884446d2fac1a62d5adac825d578b8b9f82a84594aca302644fae73569f535e5d0d130370c879ae61b4f5f6e144b2d66d0
7
- data.tar.gz: 8800d8444d820a7b78aff63f00b77eec40c86b1572104feef92f9b92040a655d61ff15030247692c4fb9b48e36839985d7ff8575ed239f0353782e64f0a5a9be
6
+ metadata.gz: 61a87ed5b000a9edad6122801205ccda4448a2398d5da9d51de5868c74dc4fcee34487001bf7399b86264b79e5b632a7aec2e7f96dab504db976655d0f6d69e8
7
+ data.tar.gz: '064710969469f02fbf30086f8feffcdd77899a6b6bc26d295c9a1a890aa2bfc9fe9fbacd86bac947deeee8621db15f3d8edd5d36be840327b73cee8a4625a8a5'
data/README.md CHANGED
@@ -116,6 +116,13 @@ Book.like('author.name:marc', [{author: [:name]}])
116
116
  # => find books where author.name includes "marc"
117
117
  ```
118
118
 
119
+ LikeQuery raises a error if invalid column name is given, vor example:
120
+
121
+ ```ruby
122
+ Book.like('title2:history', [:title, :price])
123
+ # => raises a error like column «title2» is not present within available columns: «title, price»
124
+ ```
125
+
119
126
  There is a helper for allowing the user translating the column names:
120
127
 
121
128
  ```ruby
@@ -1,6 +1,9 @@
1
1
  module LikeQuery
2
2
  class Formatter
3
3
 
4
+ COLUMN_REGEX_CASE_SENSITIVE = /^[a-z_\.0-9]+(?=:)/
5
+ COLUMN_REGEX_CASE_INSENSITIVE = /^[a-zA-Z_\.0-9]+(?=:)/
6
+
4
7
  #== Translate columns for more convenient usage
5
8
  # second parameter is always a Array of Arrays
6
9
  # Example:
@@ -9,7 +12,7 @@ module LikeQuery
9
12
  def self.translate_columns(search_string, column_translations, case_sensitive: true)
10
13
  search_string.split(' ').map do |str|
11
14
 
12
- reg = (case_sensitive ? /^[a-z_\.]+(?=:)/ : /^[a-zA-Z_\.]+(?=:)/)
15
+ reg = (case_sensitive ? COLUMN_REGEX_CASE_SENSITIVE : COLUMN_REGEX_CASE_INSENSITIVE)
13
16
 
14
17
  column = if case_sensitive
15
18
  str.match(reg)
@@ -15,12 +15,13 @@ module LikeQuery
15
15
 
16
16
  queries = []
17
17
  associations = []
18
+ available_column_keys = []
18
19
  @like_query_schema = schema
19
20
 
20
21
  search_string.split(' ').each do |s|
21
22
 
22
23
  f_str = format_string_element(s)
23
-
24
+ #exception_on_unknown_column(f_str, schema)
24
25
  q = []
25
26
 
26
27
  (schema.first.is_a?(Array) ? schema.first : schema).each do |p|
@@ -38,9 +39,11 @@ module LikeQuery
38
39
  raise "Unknown association: :#{k}" unless assoc.present?
39
40
  associations.push(k.to_sym) unless associations.include?(k.to_sym)
40
41
  if v.is_a?(Symbol) || v.is_a?(String)
42
+ available_column_keys.push([k.to_s, v.to_s].join('.'))
41
43
  q.push(query_string(v, f_str, assoc))
42
44
  elsif v.is_a?(Array)
43
45
  v.each do |_v|
46
+ available_column_keys.push([k.to_s, _v.to_s].join('.'))
44
47
  q.push(query_string(_v, f_str, assoc))
45
48
  end
46
49
  else
@@ -49,12 +52,18 @@ module LikeQuery
49
52
  end
50
53
 
51
54
  else
55
+ available_column_keys.push(p.to_s)
52
56
  q.push(query_string(p, f_str))
53
57
 
54
58
  end
55
59
 
56
60
  end
57
61
 
62
+ # raise error
63
+ if f_str[:column] && !available_column_keys.include?(f_str[:column])
64
+ raise "column «#{f_str[:column]}» is not present within available columns: «#{available_column_keys.join(', ')}»"
65
+ end
66
+
58
67
  __q = q.compact
59
68
  queries.push("(#{__q.join(' OR ')})") if __q.present?
60
69
  end
@@ -101,7 +110,7 @@ module LikeQuery
101
110
 
102
111
  def format_string_element(str)
103
112
 
104
- column = str.match(/^[a-z_\.]+(?=:)/)
113
+ column = str.match(LikeQuery::Formatter::COLUMN_REGEX_CASE_INSENSITIVE)
105
114
  _str = (column ? str.match(/(?<=:)[\s\S]+/) : str).to_s
106
115
  match_number = _str.match(/^(\d+(?:\.\d+)?)$/)
107
116
  match_range = _str.match(/^(\d+(?:\.\d+)?)(\.\.)(\d+(?:\.\d+)?)$/)
@@ -155,6 +164,22 @@ module LikeQuery
155
164
  end
156
165
  end
157
166
 
167
+ # def exception_on_unknown_column(search, schema)
168
+ # return unless search[:column]
169
+ #
170
+ # keys = []
171
+ #
172
+ # (schema.first.is_a?(Array) ? schema.first : schema).each do |p|
173
+ # if p.is_a?(Hash)
174
+ # p.each do |k, v|
175
+ # if v.is_a?(Array)
176
+ # else
177
+ # end
178
+ # end
179
+ # end
180
+ # end
181
+ # end
182
+
158
183
  def dbg(label)
159
184
 
160
185
  return unless @debug_like_query
@@ -1,3 +1,3 @@
1
1
  module LikeQuery
2
- VERSION = "0.4.3"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -3,7 +3,7 @@ module LikeQuery
3
3
  def like_query_mark(string, column = nil, find: @mark_string)
4
4
  res = string.to_s
5
5
  find.split(' ').each do |word|
6
- _col = word.match(/^[a-z_\.]+(?=:)/)
6
+ _col = word.match(LikeQuery::Formatter::COLUMN_REGEX_CASE_SENSITIVE)
7
7
  if !column || !_col || _col.to_s == column.to_s
8
8
  _word = (_col ? word.match(/(?<=:)[\s\S]+/) : word).to_s
9
9
  res = Translighterate.highlight(res, _word)
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.4.3
4
+ version: 1.0.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-12-04 00:00:00.000000000 Z
11
+ date: 2024-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails