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.
@@ -222,12 +222,25 @@ module Rokaki
222
222
  leaf: leaf
223
223
  )
224
224
 
225
- if join_map.empty?
226
- filter_query = "@model.#{query}"
227
- elsif join_map.is_a?(Array)
228
- filter_query = "@model.joins(*#{join_map}).#{query}"
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
- filter_query = "@model.joins(**#{join_map}).#{query}"
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 # :sqlserver and others
251
- query = "where(\"#{key_leaf} #{type.to_s.upcase} :query\", "
252
- if search_mode == :circumfix
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Rokaki
2
- VERSION = "0.14.0"
2
+ VERSION = "0.15.0"
3
3
  end
data/rokaki.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: true
1
+ # frozen_string_literal: true
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
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.14.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-25 00:00:00.000000000 Z
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