elasticquery 0.1.1 → 0.1.2
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/.ruby-style.yml +1063 -0
- data/History.md +22 -0
- data/README.md +12 -16
- data/elasticquery.gemspec +1 -0
- data/lib/elasticquery/base.rb +4 -4
- data/lib/elasticquery/builder.rb +32 -0
- data/lib/elasticquery/filters/base.rb +2 -0
- data/lib/elasticquery/filters/not.rb +8 -8
- data/lib/elasticquery/filters/range.rb +12 -6
- data/lib/elasticquery/filters/search.rb +2 -1
- data/lib/elasticquery/filters/term.rb +15 -10
- data/lib/elasticquery/query.rb +4 -12
- data/lib/elasticquery/version.rb +2 -2
- data/lib/elasticquery.rb +1 -1
- data/test/base_test.rb +3 -3
- data/test/{queries/all_test.rb → builder_test.rb} +3 -3
- data/test/filters/not_test.rb +10 -6
- data/test/filters/range_test.rb +35 -13
- data/test/filters/search_test.rb +18 -13
- data/test/filters/term_test.rb +20 -5
- data/test/integration/chainable_call_test.rb +7 -7
- data/test/integration/not_case_test.rb +17 -3
- data/test/integration/queries_inheritence_test.rb +9 -23
- data/test/integration/range_case_test.rb +18 -5
- data/test/integration/search_case_test.rb +15 -9
- data/test/integration/term_case_test.rb +21 -7
- data/test/query_test.rb +15 -6
- data/test/test_helper.rb +2 -2
- metadata +22 -6
- data/lib/elasticquery/queries/all.rb +0 -34
data/History.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
## Elasticquery (master)
|
2
|
+
|
3
|
+
## Elasticquery 0.1.2 (16 June 2015)
|
4
|
+
|
5
|
+
* Fix `range.not`. Exception was raised
|
6
|
+
|
7
|
+
* Skip blank values in filtering
|
8
|
+
`term name: " "`, `range :age, lte: ""`, and `search nil` return all records
|
9
|
+
|
10
|
+
* Create `history.md` file
|
11
|
+
|
12
|
+
* Add options support for `range` and `term`.
|
13
|
+
`term` supports `_cache` option. `range` supports both `_cache` and `execution`
|
14
|
+
|
15
|
+
## Elasticquery 0.1.1 (02 Mar 2015)
|
16
|
+
|
17
|
+
* Fix typo in gem description
|
18
|
+
* Add rubygems bange
|
19
|
+
|
20
|
+
## Elasticquery 0.1.0 (02 Mar 2015)
|
21
|
+
|
22
|
+
* Initial version. Supported filters: `term`, `range`, `term.not`, `range.not`. Support multi match query. Simple inheritence support. Chain calls.
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ gem install elasticquery
|
|
23
23
|
## Getting Started
|
24
24
|
### First instruction
|
25
25
|
|
26
|
-
|
26
|
+
Elasticquery was designed to be customized as you need to. Providing simple methods it allows you to build power and flexible form objects. Simplicity - is the main goal. For example:
|
27
27
|
|
28
28
|
```ruby
|
29
29
|
class MyQuery < Elasticquery::Base
|
@@ -48,8 +48,6 @@ Article.search query.build # => be happy
|
|
48
48
|
2. [MultiMatch][es_search] filter. [Usage][search_examples]
|
49
49
|
3. [Range][es_range] filter. [Usage][range_examples]
|
50
50
|
|
51
|
-
#### Note! After first releases of elasticuqery it has scarce support of options and methods. Pull requests and issues with your ideas are welcome!
|
52
|
-
|
53
51
|
### Extended instruction
|
54
52
|
There are multiple ways to organize your query, using chaining calls, or custom filters. Better custom filters support in progress now.
|
55
53
|
|
@@ -102,15 +100,6 @@ end
|
|
102
100
|
|
103
101
|
ChildQuery.build({user_id: 1, category_id: 14}) => # the same as in previous example
|
104
102
|
```
|
105
|
-
- Custom filter methods
|
106
|
-
```ruby
|
107
|
-
in progress...
|
108
|
-
```
|
109
|
-
|
110
|
-
- Custom filter classes
|
111
|
-
```ruby
|
112
|
-
in progress...
|
113
|
-
```
|
114
103
|
|
115
104
|
### Usage
|
116
105
|
#### term
|
@@ -124,6 +113,9 @@ term category: 'Soul', user: 'Aaron'
|
|
124
113
|
|
125
114
|
# Term exclusion
|
126
115
|
term.not category: 'Rap'
|
116
|
+
|
117
|
+
# Blank values are skipped. This query returns all records
|
118
|
+
term name: " "
|
127
119
|
```
|
128
120
|
|
129
121
|
#### search (multimatch)
|
@@ -136,6 +128,9 @@ search 'developers', fields: "_all", operator: "and", type: "best_fields"
|
|
136
128
|
|
137
129
|
# Configure fields
|
138
130
|
search 'Jordan', fields: ['first_name', 'last_name'], operator: "or"
|
131
|
+
|
132
|
+
# Blank values are skipped. This query returns all records
|
133
|
+
search ''
|
139
134
|
```
|
140
135
|
|
141
136
|
#### range
|
@@ -148,12 +143,13 @@ range :volume, gte: 1, lte: 100
|
|
148
143
|
|
149
144
|
# Range exclusion
|
150
145
|
range.not :size, gte: 32, lte: 128
|
151
|
-
```
|
152
|
-
|
153
|
-
## Contributing
|
154
|
-
1. I'm happy to see any method you can be part of this.
|
155
146
|
|
147
|
+
# Blank values are skipped. This query returns all records
|
148
|
+
range.not :age, lte: ' ', gte: nil
|
156
149
|
|
150
|
+
# _cache and execution options support
|
151
|
+
range :volume, gte: 1, lte: 100, _cache: true, execution: "fielddata"
|
152
|
+
```
|
157
153
|
[elasticsearch_rails]: https://github.com/elasticsearch/elasticsearch-rails
|
158
154
|
[demo]: http://elasticquery-demo.herokuapp.com
|
159
155
|
[bundler]: http://bundler.io/
|
data/elasticquery.gemspec
CHANGED
data/lib/elasticquery/base.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "active_support/core_ext/class/attribute"
|
2
|
+
require "elasticquery/query"
|
3
|
+
require "elasticquery/builder"
|
4
4
|
|
5
5
|
# Base class for query builder. Superclass of your all builders
|
6
6
|
module Elasticquery
|
7
7
|
class Base
|
8
|
-
include Elasticquery::
|
8
|
+
include Elasticquery::Builder
|
9
9
|
|
10
10
|
class_attribute :filters
|
11
11
|
attr_reader :params, :query
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "elasticquery/filters/term"
|
2
|
+
require "elasticquery/filters/search"
|
3
|
+
require "elasticquery/filters/not"
|
4
|
+
require "elasticquery/filters/range"
|
5
|
+
|
6
|
+
require "active_support/concern"
|
7
|
+
require "active_support/core_ext/string/inflections"
|
8
|
+
|
9
|
+
module Elasticquery
|
10
|
+
module Builder
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
filters = [
|
14
|
+
Filters::Term,
|
15
|
+
Filters::Search,
|
16
|
+
Filters::Not,
|
17
|
+
Filters::Range
|
18
|
+
]
|
19
|
+
|
20
|
+
included do
|
21
|
+
filters.each do |filter_class|
|
22
|
+
filter_name = filter_class.to_s.split("::").last.underscore
|
23
|
+
|
24
|
+
define_method filter_name do |*args|
|
25
|
+
filter = filter_class.new *args
|
26
|
+
query << filter
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,25 +1,25 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "base"
|
2
2
|
|
3
3
|
module Elasticquery
|
4
4
|
module Filters
|
5
5
|
class Not < Base
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
@
|
7
|
+
def initialize(*args)
|
8
|
+
@args = args
|
9
9
|
end
|
10
10
|
|
11
11
|
def dup_with(*args)
|
12
|
-
raise StandardError,
|
12
|
+
raise StandardError, "Cannot use Filters::Not twice"
|
13
13
|
end
|
14
14
|
|
15
15
|
def to_hash
|
16
|
-
|
16
|
+
args = @args
|
17
17
|
-> do
|
18
|
-
filter = filters.last.dup_with
|
18
|
+
filter = filters.last.dup_with *args
|
19
19
|
if filter.valid?
|
20
20
|
subquery = filter.to_hash
|
21
|
-
q = subquery[:query][:filtered][:filter][:and]
|
22
|
-
{query: {filtered: {filter: {and: {not: {filter: q}}}}}}
|
21
|
+
q = subquery[:query][:filtered][:filter][:and][0]
|
22
|
+
{query: {filtered: {filter: {and: [{not: {filter: q}}]}}}}
|
23
23
|
else
|
24
24
|
{}
|
25
25
|
end
|
@@ -1,25 +1,31 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "base"
|
2
2
|
|
3
3
|
module Elasticquery
|
4
4
|
module Filters
|
5
5
|
class Range < Base
|
6
|
+
OPTIONS = %i(_cache execution)
|
6
7
|
|
7
|
-
def initialize(field, gte: nil, lte: nil)
|
8
|
+
def initialize(field=nil, gte: nil, lte: nil, **options)
|
9
|
+
@options = options.extract! *OPTIONS
|
8
10
|
@field, @gte, @lte = field, gte, lte
|
9
11
|
end
|
10
12
|
|
11
13
|
def valid?
|
12
|
-
@gte || @lte
|
14
|
+
@gte.present? || @lte.present?
|
13
15
|
end
|
14
16
|
|
15
17
|
def to_hash
|
16
|
-
valid?
|
18
|
+
if valid?
|
19
|
+
{query: {filtered: {filter: {and: [{range: range_with_options}]}}}}
|
20
|
+
else
|
21
|
+
{}
|
22
|
+
end
|
17
23
|
end
|
18
24
|
|
19
25
|
private
|
20
26
|
|
21
|
-
def
|
22
|
-
{@field =>
|
27
|
+
def range_with_options
|
28
|
+
{@field => @options}.tap do |r|
|
23
29
|
r[@field][:lte] = @lte unless @lte.nil?
|
24
30
|
r[@field][:gte] = @gte unless @gte.nil?
|
25
31
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "base"
|
2
2
|
|
3
3
|
module Elasticquery
|
4
4
|
module Filters
|
@@ -29,6 +29,7 @@ module Elasticquery
|
|
29
29
|
def valid?
|
30
30
|
OPERATORS.include?(@operator) &&
|
31
31
|
TYPES.include?(@type) &&
|
32
|
+
@query.present? &&
|
32
33
|
( Array === @fields || @fields == "_all" )
|
33
34
|
end
|
34
35
|
|
@@ -1,21 +1,22 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "base"
|
2
2
|
|
3
3
|
module Elasticquery
|
4
4
|
module Filters
|
5
5
|
class Term < Base
|
6
|
+
OPTIONS = %i(_cache)
|
6
7
|
|
7
|
-
# Create
|
8
|
-
# builder
|
8
|
+
# Create term filter for elasticsearch builder
|
9
9
|
#
|
10
10
|
# @param [Hash] condition passed to define
|
11
11
|
#
|
12
12
|
# @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html#_filtering_without_a_query
|
13
|
-
def initialize(
|
14
|
-
@
|
13
|
+
def initialize(data={})
|
14
|
+
@options = data.extract! *OPTIONS
|
15
|
+
@condition = data
|
15
16
|
end
|
16
17
|
|
17
18
|
# Is passed condition valid. Passed condition must have
|
18
|
-
# one key
|
19
|
+
# one key and present value
|
19
20
|
#
|
20
21
|
# @return [Boolean] is condition have at least one key
|
21
22
|
#
|
@@ -23,7 +24,7 @@ module Elasticquery
|
|
23
24
|
# rule = Elasticquery::Rules::Term.new
|
24
25
|
# rule.valid? #=> false
|
25
26
|
def valid?
|
26
|
-
@condition.keys.
|
27
|
+
@condition.keys.size == 1 && @condition.values[0].present?
|
27
28
|
end
|
28
29
|
|
29
30
|
# Hash presentation of query.
|
@@ -31,10 +32,14 @@ module Elasticquery
|
|
31
32
|
# @return [Hash] presentation of filter.
|
32
33
|
#
|
33
34
|
# @example
|
34
|
-
#
|
35
|
-
#
|
35
|
+
# valid = Elasticquery::Filters::Term.new {name: "John"}
|
36
|
+
# valid.to_hash #=> {query: {filtered: {filter: {and: [{term: {name: 'John'}}]}}}
|
36
37
|
def to_hash
|
37
|
-
valid?
|
38
|
+
if valid?
|
39
|
+
{query: {filtered: {filter: {and: [{term: @condition.merge(@options)}]}}}}
|
40
|
+
else
|
41
|
+
{}
|
42
|
+
end
|
38
43
|
end
|
39
44
|
end
|
40
45
|
end
|
data/lib/elasticquery/query.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "deep_merge/rails_compat"
|
2
2
|
|
3
3
|
module Elasticquery
|
4
4
|
class Query
|
@@ -22,16 +22,8 @@ module Elasticquery
|
|
22
22
|
#
|
23
23
|
# @return [Hash] hash presentation of query
|
24
24
|
def to_hash
|
25
|
-
|
26
|
-
|
27
|
-
flatted_filters = _filters.flat_map do |type, filters|
|
28
|
-
filters.flat_map do |key, value|
|
29
|
-
{type => {key => value}}
|
30
|
-
end
|
31
|
-
end
|
32
|
-
q[:query][:filtered][:filter][:and] = flatted_filters
|
33
|
-
end
|
34
|
-
q
|
25
|
+
return DEFAULT if @query == {}
|
26
|
+
@query
|
35
27
|
end
|
36
28
|
|
37
29
|
# Merge filter to query. If current query is `matche_all`ed
|
@@ -59,7 +51,7 @@ module Elasticquery
|
|
59
51
|
def merge(filter)
|
60
52
|
hash = filter.to_hash
|
61
53
|
subquery = hash.respond_to?(:call) ? instance_exec(&hash) : hash
|
62
|
-
@query.
|
54
|
+
@query.deeper_merge! subquery
|
63
55
|
end
|
64
56
|
|
65
57
|
def _filters
|
data/lib/elasticquery/version.rb
CHANGED
data/lib/elasticquery.rb
CHANGED
data/test/base_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test_helper"
|
2
|
+
require "elasticquery/base"
|
3
3
|
|
4
4
|
class TestBase < MiniTest::Test
|
5
5
|
|
@@ -52,7 +52,7 @@ class TestBase < MiniTest::Test
|
|
52
52
|
|
53
53
|
def test_should_execute_code_in_instance_context
|
54
54
|
klass = Class.new(Elasticquery::Base)
|
55
|
-
klass.send(:define_method, :_error_) { raise StandardError,
|
55
|
+
klass.send(:define_method, :_error_) { raise StandardError, "from instance context"}
|
56
56
|
klass.filtered { _error_ }
|
57
57
|
|
58
58
|
assert_raises(StandardError) { klass.new.build }
|
data/test/filters/not_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test_helper"
|
2
|
+
require "elasticquery/filters/not"
|
3
3
|
|
4
4
|
class NotFilter < MiniTest::Test
|
5
5
|
attr_reader :filters
|
@@ -20,13 +20,15 @@ class NotFilter < MiniTest::Test
|
|
20
20
|
def test_to_hash_change_last_term_filter_value
|
21
21
|
filter_class = MiniTest::Mock.new
|
22
22
|
filter_class.expect :valid?, true
|
23
|
-
|
23
|
+
expected = {query: {filtered: {filter: {and: [{term: {a: 1, b: 2}}]}}}}
|
24
|
+
filter_class.expect :to_hash, expected
|
24
25
|
previous_filter = MiniTest::Mock.new
|
25
26
|
previous_filter.expect :dup_with, filter_class, [{a: 1}]
|
26
27
|
|
27
28
|
@filters = [previous_filter]
|
28
29
|
result = instance_exec &@filter.to_hash
|
29
|
-
|
30
|
+
expected = {query: {filtered: {filter: {and: [{not: {filter: {term: {a: 1, b: 2}}}}]}}}}
|
31
|
+
assert_equal result, expected
|
30
32
|
|
31
33
|
assert filter_class.verify
|
32
34
|
assert previous_filter.verify
|
@@ -35,13 +37,15 @@ class NotFilter < MiniTest::Test
|
|
35
37
|
def test_to_hash_change_last_range_filter_value
|
36
38
|
filter_class = MiniTest::Mock.new
|
37
39
|
filter_class.expect :valid?, true
|
38
|
-
|
40
|
+
expected = {query: {filtered: {filter: {and: [{range: {a: {lte: 1}}}]}}}}
|
41
|
+
filter_class.expect :to_hash, expected
|
39
42
|
previous_filter = MiniTest::Mock.new
|
40
43
|
previous_filter.expect :dup_with, filter_class, [{a: 1}]
|
41
44
|
|
42
45
|
@filters = [previous_filter]
|
43
46
|
result = instance_exec &@filter.to_hash
|
44
|
-
|
47
|
+
expected = {query: {filtered: {filter: {and: [{not: {filter: {range: {a: {lte: 1}}}}}]}}}}
|
48
|
+
assert_equal result, expected
|
45
49
|
|
46
50
|
assert filter_class.verify
|
47
51
|
assert previous_filter.verify
|
data/test/filters/range_test.rb
CHANGED
@@ -1,44 +1,66 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test_helper"
|
2
|
+
require "elasticquery/filters/range"
|
3
3
|
|
4
4
|
class RangeFilter < MiniTest::Test
|
5
5
|
def setup
|
6
|
-
@filter = Elasticquery::Filters::Range.new
|
7
|
-
@lte_filter = Elasticquery::Filters::Range.new
|
8
|
-
@gte_filter = Elasticquery::Filters::Range.new
|
6
|
+
@filter = Elasticquery::Filters::Range.new "year", lte: 2015, gte: 1990
|
7
|
+
@lte_filter = Elasticquery::Filters::Range.new "age", lte: 58
|
8
|
+
@gte_filter = Elasticquery::Filters::Range.new "age", gte: 18
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_filter_valid_if_has_at_least_lte_or_gte_option
|
12
|
-
filter = Elasticquery::Filters::Range.new
|
12
|
+
filter = Elasticquery::Filters::Range.new "year", lte: 1
|
13
13
|
assert filter.valid?
|
14
|
-
filter = Elasticquery::Filters::Range.new
|
14
|
+
filter = Elasticquery::Filters::Range.new "year", gte: 0
|
15
15
|
assert filter.valid?
|
16
16
|
end
|
17
17
|
|
18
|
+
def empty_values_is_invalid
|
19
|
+
filter = Elasticquery::Filters::Range.new "year", lte: " "
|
20
|
+
assert filter.invalid?
|
21
|
+
filter = Elasticquery::Filters::Range.new "year", gte: nil, lte: ""
|
22
|
+
assert filte.invalid?
|
23
|
+
end
|
24
|
+
|
18
25
|
def test_filter_invalid_if_has_no_options
|
19
|
-
filter = Elasticquery::Filters::Range.new
|
26
|
+
filter = Elasticquery::Filters::Range.new "year"
|
20
27
|
refute filter.valid?
|
21
28
|
end
|
22
29
|
|
23
30
|
def test_to_hash_should_return_query
|
24
31
|
filter = Elasticquery::Filters::Range.new :year, lte: 1, gte: 0
|
25
|
-
assert_equal({query: {filtered: {filter: {and: {range: {year: {lte: 1, gte: 0}}}}}}}, filter.to_hash)
|
32
|
+
assert_equal({query: {filtered: {filter: {and: [{range: {year: {lte: 1, gte: 0}}}]}}}}, filter.to_hash)
|
26
33
|
end
|
27
34
|
|
28
35
|
def test_to_hash_with_one_param
|
29
36
|
filter = Elasticquery::Filters::Range.new :year, lte: 1
|
30
|
-
assert_equal({query: {filtered: {filter: {and: {range: {year: {lte: 1}}}}}}}, filter.to_hash)
|
37
|
+
assert_equal({query: {filtered: {filter: {and: [{range: {year: {lte: 1}}}]}}}}, filter.to_hash)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_to_hash_support_cache_option
|
41
|
+
filter = Elasticquery::Filters::Range.new :year, lte: 1, _cache: true
|
42
|
+
assert_equal({query: {filtered: {filter: {and: [{range: {year: {_cache: true, lte: 1}}}]}}}}, filter.to_hash)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_to_hash_support_execution_option
|
46
|
+
filter = Elasticquery::Filters::Range.new :year, lte: 1, gte: 0, execution: "fielddata"
|
47
|
+
assert_equal({query: {filtered: {filter: {and: [{range: {year: {lte: 1, gte: 0, execution: "fielddata"}}}]}}}}, filter.to_hash)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_to_hash_skip_unnesessary_options
|
51
|
+
filter = Elasticquery::Filters::Range.new :year, lte: 1, _cache: true, extra: false
|
52
|
+
assert_equal({query: {filtered: {filter: {and: [{range: {year: { _cache: true, lte: 1}}}]}}}}, filter.to_hash)
|
31
53
|
end
|
32
54
|
|
33
55
|
def test_to_hash_is_empty_if_invalid
|
34
|
-
filter = Elasticquery::Filters::Range.new
|
56
|
+
filter = Elasticquery::Filters::Range.new "year"
|
35
57
|
refute filter.valid?
|
36
58
|
assert_equal filter.to_hash, {}
|
37
59
|
end
|
38
60
|
|
39
61
|
def test_dup_with_return_new_range_filter
|
40
|
-
filter = Elasticquery::Filters::Range.new
|
41
|
-
new_filter = filter.dup_with
|
62
|
+
filter = Elasticquery::Filters::Range.new "year"
|
63
|
+
new_filter = filter.dup_with "month", gte: 12
|
42
64
|
assert_kind_of Elasticquery::Filters::Range, new_filter
|
43
65
|
end
|
44
66
|
end
|
data/test/filters/search_test.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test_helper"
|
2
|
+
require "elasticquery/filters/search"
|
3
3
|
|
4
4
|
class TestSearchFilter < MiniTest::Test
|
5
5
|
|
6
6
|
def test_default_values_of_filter
|
7
|
-
filter = Elasticquery::Filters::Search.new
|
7
|
+
filter = Elasticquery::Filters::Search.new "hi"
|
8
8
|
actual = filter.to_hash[:query][:filtered][:query][:multi_match]
|
9
9
|
assert_equal actual, {fields: "_all", operator: "and", type: "best_fields", query: "hi"}
|
10
10
|
end
|
@@ -15,43 +15,48 @@ class TestSearchFilter < MiniTest::Test
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def test_empty_query_is_invalid
|
19
|
+
filter = Elasticquery::Filters::Search.new " "
|
20
|
+
assert filter.invalid?
|
21
|
+
end
|
22
|
+
|
18
23
|
def test_default_query_should_be_valid
|
19
|
-
filter = Elasticquery::Filters::Search.new
|
24
|
+
filter = Elasticquery::Filters::Search.new "hi"
|
20
25
|
assert filter.valid?
|
21
26
|
end
|
22
27
|
|
23
28
|
def test_query_fields_validation
|
24
|
-
filter = Elasticquery::Filters::Search.new
|
29
|
+
filter = Elasticquery::Filters::Search.new "hi", fields: 42
|
25
30
|
refute filter.valid?
|
26
|
-
filter = Elasticquery::Filters::Search.new
|
31
|
+
filter = Elasticquery::Filters::Search.new "hi", fields: %w(name body)
|
27
32
|
assert filter.valid?
|
28
33
|
end
|
29
34
|
|
30
35
|
def test_operator_validation
|
31
|
-
filter = Elasticquery::Filters::Search.new
|
36
|
+
filter = Elasticquery::Filters::Search.new "hi", operator: "without"
|
32
37
|
refute filter.valid?
|
33
|
-
filter = Elasticquery::Filters::Search.new
|
38
|
+
filter = Elasticquery::Filters::Search.new "hi", operator: "or"
|
34
39
|
assert filter.valid?
|
35
40
|
end
|
36
41
|
|
37
42
|
def test_types_validation
|
38
43
|
%w(most_fields cross_fields phrase pharse_prefix).each do |type|
|
39
|
-
filter = Elasticquery::Filters::Search.new
|
44
|
+
filter = Elasticquery::Filters::Search.new "hi", type: type
|
40
45
|
assert filter.valid?
|
41
46
|
end
|
42
|
-
filter = Elasticquery::Filters::Search.new
|
47
|
+
filter = Elasticquery::Filters::Search.new "hi", type: "random"
|
43
48
|
refute filter.valid?
|
44
49
|
end
|
45
50
|
|
46
51
|
def test_to_hash_is_empty_if_invalid
|
47
|
-
filter = Elasticquery::Filters::Search.new
|
52
|
+
filter = Elasticquery::Filters::Search.new "hi", fields: 42
|
48
53
|
refute filter.valid?
|
49
54
|
assert_equal filter.to_hash, {}
|
50
55
|
end
|
51
56
|
|
52
57
|
def test_dup_with_return_new_search_query
|
53
|
-
filter = Elasticquery::Filters::Search.new
|
54
|
-
new_filter = filter.dup_with
|
58
|
+
filter = Elasticquery::Filters::Search.new "hi", fields: 42
|
59
|
+
new_filter = filter.dup_with "who"
|
55
60
|
assert_kind_of Elasticquery::Filters::Search, new_filter
|
56
61
|
end
|
57
62
|
end
|
data/test/filters/term_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test_helper"
|
2
|
+
require "elasticquery/filters/term"
|
3
3
|
|
4
4
|
class TestTermfilter < MiniTest::Test
|
5
5
|
|
@@ -13,14 +13,29 @@ class TestTermfilter < MiniTest::Test
|
|
13
13
|
refute filter.valid?
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
16
|
+
def test_invalid_filter_should_have_2_and_more_keys
|
17
17
|
filter = Elasticquery::Filters::Term.new a: 1, b: 2
|
18
|
+
refute filter.valid?
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_empty_condition_is_invalid
|
22
|
+
filter = Elasticquery::Filters::Term.new a: ""
|
23
|
+
refute filter.valid?
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_valid_filter_could_have_cache_option
|
27
|
+
filter = Elasticquery::Filters::Term.new a: 1, _cache: false
|
18
28
|
assert filter.valid?
|
19
29
|
end
|
20
30
|
|
31
|
+
def test_to_hash_should_pass__cache_options
|
32
|
+
filter = Elasticquery::Filters::Term.new a: 1, _cache: true
|
33
|
+
assert_equal({query: {filtered: {filter: {and: [{term: {a: 1, _cache: true}}]}}}}, filter.to_hash)
|
34
|
+
end
|
35
|
+
|
21
36
|
def test_to_hash_should_return_es_query
|
22
|
-
filter = Elasticquery::Filters::Term.new a: 1
|
23
|
-
assert_equal({query: {filtered: {filter: {and: {term: {a: 1
|
37
|
+
filter = Elasticquery::Filters::Term.new a: 1
|
38
|
+
assert_equal({query: {filtered: {filter: {and: [{term: {a: 1}}]}}}}, filter.to_hash)
|
24
39
|
end
|
25
40
|
|
26
41
|
def test_to_hash_is_empty_if_invalid
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test_helper"
|
2
|
+
require "elasticquery"
|
3
3
|
|
4
4
|
class TestChainableCalls < MiniTest::Test
|
5
5
|
|
@@ -12,17 +12,17 @@ class TestChainableCalls < MiniTest::Test
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_apply_query
|
15
|
-
query = @query.term(a: 1).term(
|
16
|
-
assert_equal query.build, query: {filtered: {filter: {and: [{term: {a: 3}}]}}}
|
15
|
+
query = @query.term(a: 1).term(b: 3)
|
16
|
+
assert_equal query.build, query: {filtered: {filter: {and: [{term: {a: 1}}, {term: {b: 3}}]}}}
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_with_not_filter
|
20
|
-
query = @query.search(
|
21
|
-
assert_equal query.build, {query: {filtered: {query: {multi_match: {fields: "_all", operator: "and", type: "best_fields", query: "hi"}}, filter: {and: [{not: {filter: {term: {a: 1}}}}]}}}}
|
20
|
+
query = @query.search("hi").term.not(a: 1, _cache: true)
|
21
|
+
assert_equal query.build, {query: {filtered: {query: {multi_match: {fields: "_all", operator: "and", type: "best_fields", query: "hi"}}, filter: {and: [{not: {filter: {term: {a: 1, _cache: true}}}}]}}}}
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_apply_kinds_of_query
|
25
|
-
query = @query.term(a: 1).search(
|
25
|
+
query = @query.term(a: 1).search("hello", operator: "or").build
|
26
26
|
terms = query[:query][:filtered][:filter][:and]
|
27
27
|
search = query[:query][:filtered][:query][:multi_match]
|
28
28
|
assert_equal terms, [{term: {a: 1}}]
|