Commit c9265a220bf4467feef1c0e7b2b76bb226f1a539

Authored by Will Cosgrove
Committed by GitHub
1 parent 75250b23

Support beginless ranges in where queries (#1527)

Showing 2 changed files with 17 additions and 6 deletions   Show diff stats
lib/searchkick/query.rb
@@ -904,12 +904,7 @@ module Searchkick @@ -904,12 +904,7 @@ module Searchkick
904 else 904 else
905 # expand ranges 905 # expand ranges
906 if value.is_a?(Range) 906 if value.is_a?(Range)
907 - # infinite? added in Ruby 2.4  
908 - if value.end.nil? || (value.end.respond_to?(:infinite?) && value.end.infinite?)  
909 - value = {gte: value.first}  
910 - else  
911 - value = {gte: value.first, (value.exclude_end? ? :lt : :lte) => value.last}  
912 - end 907 + value = expand_range(value)
913 end 908 end
914 909
915 value = {in: value} if value.is_a?(Array) 910 value = {in: value} if value.is_a?(Array)
@@ -1138,6 +1133,17 @@ module Searchkick @@ -1138,6 +1133,17 @@ module Searchkick
1138 end 1133 end
1139 end 1134 end
1140 1135
  1136 + def expand_range(range)
  1137 + expanded = {}
  1138 + expanded[:gte] = range.begin if range.begin
  1139 +
  1140 + if range.end && !(range.end.respond_to?(:infinite?) && range.end.infinite?)
  1141 + expanded[range.exclude_end? ? :lt : :lte] = range.end
  1142 + end
  1143 +
  1144 + expanded
  1145 + end
  1146 +
1141 def base_field(k) 1147 def base_field(k)
1142 k.sub(/\.(analyzed|word_start|word_middle|word_end|text_start|text_middle|text_end|exact)\z/, "") 1148 k.sub(/\.(analyzed|word_start|word_middle|word_end|text_start|text_middle|text_end|exact)\z/, "")
1143 end 1149 end
test/where_test.rb
@@ -46,6 +46,11 @@ class WhereTest < Minitest::Test @@ -46,6 +46,11 @@ class WhereTest < Minitest::Test
46 # use eval to prevent parse error 46 # use eval to prevent parse error
47 assert_search "product", ["Product C", "Product D"], where: {store_id: eval("3..")} 47 assert_search "product", ["Product C", "Product D"], where: {store_id: eval("3..")}
48 end 48 end
  49 + if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.7.0")
  50 + # use eval to prevent parse error
  51 + assert_search "product", ["Product A", "Product B"], where: {store_id: eval("..2")}
  52 + assert_search "product", ["Product A", "Product B"], where: {store_id: eval("...3")}
  53 + end
49 54
50 # or 55 # or
51 assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{in_stock: true}, {store_id: 3}]]} 56 assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{in_stock: true}, {store_id: 3}]]}