rokaki 0.14.0 → 0.15.0
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 +4 -4
- data/.github/workflows/spec.yml +1 -1
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +1 -1
- data/README.legacy.md +533 -0
- data/README.md +24 -444
- data/docs/adapters.md +25 -1
- data/docs/configuration.md +12 -1
- data/docs/index.md +4 -4
- data/docs/usage.md +68 -2
- data/lib/rokaki/filter_model/nested_like_filters.rb +21 -16
- data/lib/rokaki/filter_model.rb +18 -0
- data/lib/rokaki/version.rb +1 -1
- data/rokaki.gemspec +1 -1
- metadata +3 -2
|
@@ -222,12 +222,25 @@ module Rokaki
|
|
|
222
222
|
leaf: leaf
|
|
223
223
|
)
|
|
224
224
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
225
|
+
# Compose filter_query based on adapter; for generic adapters use generic_like to support array values
|
|
226
|
+
if db == :postgres || db == :mysql
|
|
227
|
+
if join_map.empty?
|
|
228
|
+
filter_query = "@model.#{query}"
|
|
229
|
+
elsif join_map.is_a?(Array)
|
|
230
|
+
filter_query = "@model.joins(*#{join_map}).#{query}"
|
|
231
|
+
else
|
|
232
|
+
filter_query = "@model.joins(**#{join_map}).#{query}"
|
|
233
|
+
end
|
|
229
234
|
else
|
|
230
|
-
|
|
235
|
+
# Generic (e.g., SQLite)
|
|
236
|
+
if join_map.empty?
|
|
237
|
+
rel_expr = "@model"
|
|
238
|
+
elsif join_map.is_a?(Array)
|
|
239
|
+
rel_expr = "@model.joins(*#{join_map})"
|
|
240
|
+
else
|
|
241
|
+
rel_expr = "@model.joins(**#{join_map})"
|
|
242
|
+
end
|
|
243
|
+
filter_query = "generic_like(#{rel_expr}, \"#{key_leaf}\", \"#{type.to_s.upcase}\", #{filter_name}, :#{search_mode})"
|
|
231
244
|
end
|
|
232
245
|
end
|
|
233
246
|
|
|
@@ -247,17 +260,9 @@ module Rokaki
|
|
|
247
260
|
elsif db == :mysql
|
|
248
261
|
query = "where(\"#{key_leaf} #{type.to_s.upcase} :query\", "
|
|
249
262
|
query += "query: prepare_regex_terms(#{filter}, :#{search_mode}))"
|
|
250
|
-
else # :
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
query += "query: \"%\#{#{filter}}%\")"
|
|
254
|
-
elsif search_mode == :prefix
|
|
255
|
-
query += "query: \"%\#{#{filter}}\")"
|
|
256
|
-
elsif search_mode == :suffix
|
|
257
|
-
query += "query: \"\#{#{filter}}%\")"
|
|
258
|
-
else
|
|
259
|
-
query += "query: \"%\#{#{filter}}%\")"
|
|
260
|
-
end
|
|
263
|
+
else # generic adapters (e.g., SQLite): delegate to generic_like to support array values via OR
|
|
264
|
+
# We return a marker here; the caller (build_query) will assemble the full expression with joins
|
|
265
|
+
query = nil
|
|
261
266
|
end
|
|
262
267
|
|
|
263
268
|
query
|
data/lib/rokaki/filter_model.rb
CHANGED
|
@@ -90,6 +90,24 @@ module Rokaki
|
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
92
|
|
|
93
|
+
# Compose a generic LIKE relation supporting arrays of terms (OR chained)
|
|
94
|
+
# Used for adapters without special handling (e.g., SQLite)
|
|
95
|
+
def generic_like(model, column, type, value, mode)
|
|
96
|
+
terms = prepare_terms(value, mode)
|
|
97
|
+
return model.none if terms.nil?
|
|
98
|
+
if terms.is_a?(Array)
|
|
99
|
+
return model.none if terms.empty?
|
|
100
|
+
rel = model.where("#{column} #{type} :q0", q0: terms[0])
|
|
101
|
+
terms[1..-1]&.each_with_index do |t, i|
|
|
102
|
+
rel = rel.or(model.where("#{column} #{type} :q#{i + 1}", "q#{i + 1}".to_sym => t))
|
|
103
|
+
end
|
|
104
|
+
rel
|
|
105
|
+
else
|
|
106
|
+
# prepare_terms returns arrays for scalar input, so this branch is rarely used
|
|
107
|
+
model.where("#{column} #{type} :q", q: terms)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
93
111
|
def prepare_regex_terms(param, mode)
|
|
94
112
|
if Array === param
|
|
95
113
|
param_map = param.map { |term| ".*#{term}.*" } if mode == :circumfix
|
data/lib/rokaki/version.rb
CHANGED
data/rokaki.gemspec
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rokaki
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.15.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Steve Martin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-10-
|
|
11
|
+
date: 2025-10-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -287,6 +287,7 @@ files:
|
|
|
287
287
|
- Gemfile.lock
|
|
288
288
|
- Guardfile
|
|
289
289
|
- LICENSE.txt
|
|
290
|
+
- README.legacy.md
|
|
290
291
|
- README.md
|
|
291
292
|
- Rakefile
|
|
292
293
|
- bin/console
|