Commit cbb15d8ea732dba793f4347acb5647b340cd1278
1 parent
47273037
Exists in
master
and in
21 other branches
Added _and, _or, and _not to where option
Showing
3 changed files
with
30 additions
and
0 deletions
Show diff stats
CHANGELOG.md
lib/searchkick/query.rb
... | ... | @@ -784,6 +784,24 @@ module Searchkick |
784 | 784 | filters << {bool: {should: or_clause.map { |or_statement| {bool: {filter: where_filters(or_statement)}} }}} |
785 | 785 | end |
786 | 786 | end |
787 | + elsif field == :_or | |
788 | + if below20? | |
789 | + filters << {or: value.map { |or_statement| {and: where_filters(or_statement)} }} | |
790 | + else | |
791 | + filters << {bool: {should: value.map { |or_statement| {bool: {filter: where_filters(or_statement)}} }}} | |
792 | + end | |
793 | + elsif field == :_not | |
794 | + if below20? | |
795 | + filters << {not: {and: where_filters(value)}} | |
796 | + else | |
797 | + filters << {bool: {must_not: where_filters(value)}} | |
798 | + end | |
799 | + elsif field == :_and | |
800 | + if below20? | |
801 | + filters << {and: value.map { |or_statement| {and: where_filters(or_statement)} }} | |
802 | + else | |
803 | + filters << {bool: {must: value.map { |or_statement| {bool: {filter: where_filters(or_statement)}} }}} | |
804 | + end | |
787 | 805 | else |
788 | 806 | # expand ranges |
789 | 807 | if value.is_a?(Range) | ... | ... |
test/where_test.rb
... | ... | @@ -31,6 +31,14 @@ class WhereTest < Minitest::Test |
31 | 31 | assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{in_stock: true}, {store_id: 3}]]} |
32 | 32 | assert_search "product", ["Product A", "Product B", "Product C"], where: {or: [[{orders_count: [2, 4]}, {store_id: [1, 2]}]]} |
33 | 33 | assert_search "product", ["Product A", "Product D"], where: {or: [[{orders_count: 1}, {created_at: {gte: now - 1}, backordered: true}]]} |
34 | + # _or | |
35 | + assert_search "product", ["Product A", "Product B", "Product C"], where: {_or: [{in_stock: true}, {store_id: 3}]} | |
36 | + assert_search "product", ["Product A", "Product B", "Product C"], where: {_or: [{orders_count: [2, 4]}, {store_id: [1, 2]}]} | |
37 | + assert_search "product", ["Product A", "Product D"], where: {_or: [{orders_count: 1}, {created_at: {gte: now - 1}, backordered: true}]} | |
38 | + # _and | |
39 | + assert_search "product", ["Product A"], where: {_and: [{in_stock: true}, {backordered: true}]} | |
40 | + # _not | |
41 | + assert_search "product", ["Product B", "Product C"], where: {_not: {_or: [{orders_count: 1}, {created_at: {gte: now - 1}, backordered: true}]}} | |
34 | 42 | # all |
35 | 43 | assert_search "product", ["Product A", "Product C"], where: {user_ids: {all: [1, 3]}} |
36 | 44 | assert_search "product", [], where: {user_ids: {all: [1, 2, 3, 4]}} | ... | ... |