chewy 0.9.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +214 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +41 -19
- data/.rubocop_todo.yml +2 -2
- data/.yardopts +5 -0
- data/Appraisals +58 -28
- data/CHANGELOG.md +153 -12
- data/Gemfile +20 -12
- data/LEGACY_DSL.md +497 -0
- data/LICENSE.txt +1 -1
- data/README.md +338 -528
- data/chewy.gemspec +11 -12
- data/gemfiles/rails.5.2.activerecord.gemfile +17 -0
- data/gemfiles/rails.5.2.mongoid.6.4.gemfile +17 -0
- data/gemfiles/rails.6.0.activerecord.gemfile +17 -0
- data/gemfiles/rails.6.1.activerecord.gemfile +19 -0
- data/gemfiles/ruby3.gemfile +10 -0
- data/gemfiles/sequel.4.45.gemfile +11 -0
- data/lib/chewy.rb +79 -44
- data/lib/chewy/backports/duplicable.rb +1 -1
- data/lib/chewy/config.rb +43 -17
- data/lib/chewy/errors.rb +2 -2
- data/lib/chewy/fields/base.rb +56 -31
- data/lib/chewy/fields/root.rb +44 -11
- data/lib/chewy/index.rb +237 -149
- data/lib/chewy/index/actions.rb +100 -35
- data/lib/chewy/index/aliases.rb +2 -1
- data/lib/chewy/index/settings.rb +11 -5
- data/lib/chewy/index/specification.rb +60 -0
- data/lib/chewy/journal.rb +40 -92
- data/lib/chewy/minitest/helpers.rb +6 -6
- data/lib/chewy/minitest/search_index_receiver.rb +17 -17
- data/lib/chewy/query.rb +182 -122
- data/lib/chewy/query/compose.rb +13 -13
- data/lib/chewy/query/criteria.rb +13 -13
- data/lib/chewy/query/filters.rb +21 -4
- data/lib/chewy/query/loading.rb +1 -2
- data/lib/chewy/query/nodes/and.rb +2 -2
- data/lib/chewy/query/nodes/bool.rb +1 -1
- data/lib/chewy/query/nodes/equal.rb +2 -2
- data/lib/chewy/query/nodes/exists.rb +1 -1
- data/lib/chewy/query/nodes/field.rb +1 -1
- data/lib/chewy/query/nodes/has_relation.rb +2 -2
- data/lib/chewy/query/nodes/match_all.rb +1 -1
- data/lib/chewy/query/nodes/missing.rb +1 -1
- data/lib/chewy/query/nodes/not.rb +2 -2
- data/lib/chewy/query/nodes/or.rb +2 -2
- data/lib/chewy/query/nodes/prefix.rb +1 -1
- data/lib/chewy/query/nodes/query.rb +2 -2
- data/lib/chewy/query/nodes/range.rb +4 -4
- data/lib/chewy/query/nodes/regexp.rb +4 -4
- data/lib/chewy/query/nodes/script.rb +3 -3
- data/lib/chewy/query/pagination.rb +10 -1
- data/lib/chewy/railtie.rb +4 -3
- data/lib/chewy/rake_helper.rb +265 -48
- data/lib/chewy/rspec/update_index.rb +33 -27
- data/lib/chewy/search.rb +79 -26
- data/lib/chewy/search/loader.rb +83 -0
- data/lib/chewy/{query → search}/pagination/kaminari.rb +13 -5
- data/lib/chewy/search/pagination/will_paginate.rb +43 -0
- data/lib/chewy/search/parameters.rb +168 -0
- data/lib/chewy/search/parameters/aggs.rb +16 -0
- data/lib/chewy/search/parameters/allow_partial_search_results.rb +27 -0
- data/lib/chewy/search/parameters/concerns/bool_storage.rb +24 -0
- data/lib/chewy/search/parameters/concerns/hash_storage.rb +23 -0
- data/lib/chewy/search/parameters/concerns/integer_storage.rb +14 -0
- data/lib/chewy/search/parameters/concerns/query_storage.rb +238 -0
- data/lib/chewy/search/parameters/concerns/string_array_storage.rb +23 -0
- data/lib/chewy/search/parameters/concerns/string_storage.rb +14 -0
- data/lib/chewy/search/parameters/docvalue_fields.rb +12 -0
- data/lib/chewy/search/parameters/explain.rb +16 -0
- data/lib/chewy/search/parameters/filter.rb +47 -0
- data/lib/chewy/search/parameters/highlight.rb +16 -0
- data/lib/chewy/search/parameters/indices.rb +123 -0
- data/lib/chewy/search/parameters/indices_boost.rb +52 -0
- data/lib/chewy/search/parameters/limit.rb +17 -0
- data/lib/chewy/search/parameters/load.rb +32 -0
- data/lib/chewy/search/parameters/min_score.rb +16 -0
- data/lib/chewy/search/parameters/none.rb +27 -0
- data/lib/chewy/search/parameters/offset.rb +17 -0
- data/lib/chewy/search/parameters/order.rb +64 -0
- data/lib/chewy/search/parameters/post_filter.rb +19 -0
- data/lib/chewy/search/parameters/preference.rb +16 -0
- data/lib/chewy/search/parameters/profile.rb +16 -0
- data/lib/chewy/search/parameters/query.rb +19 -0
- data/lib/chewy/search/parameters/request_cache.rb +27 -0
- data/lib/chewy/search/parameters/rescore.rb +29 -0
- data/lib/chewy/search/parameters/script_fields.rb +16 -0
- data/lib/chewy/search/parameters/search_after.rb +20 -0
- data/lib/chewy/search/parameters/search_type.rb +16 -0
- data/lib/chewy/search/parameters/source.rb +73 -0
- data/lib/chewy/search/parameters/storage.rb +95 -0
- data/lib/chewy/search/parameters/stored_fields.rb +63 -0
- data/lib/chewy/search/parameters/suggest.rb +16 -0
- data/lib/chewy/search/parameters/terminate_after.rb +16 -0
- data/lib/chewy/search/parameters/timeout.rb +16 -0
- data/lib/chewy/search/parameters/track_scores.rb +16 -0
- data/lib/chewy/search/parameters/types.rb +20 -0
- data/lib/chewy/search/parameters/version.rb +16 -0
- data/lib/chewy/search/query_proxy.rb +257 -0
- data/lib/chewy/search/request.rb +1046 -0
- data/lib/chewy/search/response.rb +119 -0
- data/lib/chewy/search/scoping.rb +50 -0
- data/lib/chewy/search/scrolling.rb +134 -0
- data/lib/chewy/stash.rb +79 -0
- data/lib/chewy/strategy.rb +10 -3
- data/lib/chewy/strategy/active_job.rb +2 -1
- data/lib/chewy/strategy/atomic.rb +2 -4
- data/lib/chewy/strategy/bypass.rb +1 -1
- data/lib/chewy/strategy/resque.rb +1 -0
- data/lib/chewy/strategy/shoryuken.rb +40 -0
- data/lib/chewy/strategy/sidekiq.rb +13 -3
- data/lib/chewy/type.rb +29 -7
- data/lib/chewy/type/actions.rb +26 -2
- data/lib/chewy/type/adapter/active_record.rb +44 -29
- data/lib/chewy/type/adapter/base.rb +27 -7
- data/lib/chewy/type/adapter/mongoid.rb +19 -10
- data/lib/chewy/type/adapter/object.rb +187 -26
- data/lib/chewy/type/adapter/orm.rb +59 -32
- data/lib/chewy/type/adapter/sequel.rb +33 -19
- data/lib/chewy/type/crutch.rb +1 -1
- data/lib/chewy/type/import.rb +146 -191
- data/lib/chewy/type/import/bulk_builder.rb +122 -0
- data/lib/chewy/type/import/bulk_request.rb +78 -0
- data/lib/chewy/type/import/journal_builder.rb +45 -0
- data/lib/chewy/type/import/routine.rb +138 -0
- data/lib/chewy/type/mapping.rb +51 -35
- data/lib/chewy/type/observe.rb +17 -13
- data/lib/chewy/type/syncer.rb +222 -0
- data/lib/chewy/type/witchcraft.rb +32 -16
- data/lib/chewy/type/wrapper.rb +30 -4
- data/lib/chewy/version.rb +1 -1
- data/lib/sequel/plugins/chewy_observe.rb +4 -19
- data/lib/tasks/chewy.rake +84 -26
- data/spec/chewy/config_spec.rb +98 -1
- data/spec/chewy/fields/base_spec.rb +170 -135
- data/spec/chewy/fields/root_spec.rb +124 -20
- data/spec/chewy/fields/time_fields_spec.rb +2 -3
- data/spec/chewy/index/actions_spec.rb +214 -52
- data/spec/chewy/index/aliases_spec.rb +2 -2
- data/spec/chewy/index/settings_spec.rb +67 -38
- data/spec/chewy/index/specification_spec.rb +169 -0
- data/spec/chewy/index_spec.rb +108 -64
- data/spec/chewy/journal_spec.rb +150 -55
- data/spec/chewy/minitest/helpers_spec.rb +4 -4
- data/spec/chewy/minitest/search_index_receiver_spec.rb +1 -1
- data/spec/chewy/query/criteria_spec.rb +179 -179
- data/spec/chewy/query/filters_spec.rb +16 -16
- data/spec/chewy/query/loading_spec.rb +22 -20
- data/spec/chewy/query/nodes/and_spec.rb +2 -2
- data/spec/chewy/query/nodes/bool_spec.rb +4 -4
- data/spec/chewy/query/nodes/equal_spec.rb +19 -19
- data/spec/chewy/query/nodes/exists_spec.rb +6 -6
- data/spec/chewy/query/nodes/has_child_spec.rb +19 -19
- data/spec/chewy/query/nodes/has_parent_spec.rb +19 -19
- data/spec/chewy/query/nodes/missing_spec.rb +5 -5
- data/spec/chewy/query/nodes/not_spec.rb +4 -2
- data/spec/chewy/query/nodes/or_spec.rb +2 -2
- data/spec/chewy/query/nodes/prefix_spec.rb +5 -5
- data/spec/chewy/query/nodes/query_spec.rb +2 -2
- data/spec/chewy/query/nodes/range_spec.rb +18 -18
- data/spec/chewy/query/nodes/raw_spec.rb +1 -1
- data/spec/chewy/query/nodes/regexp_spec.rb +14 -14
- data/spec/chewy/query/nodes/script_spec.rb +4 -4
- data/spec/chewy/query/pagination/kaminari_spec.rb +3 -55
- data/spec/chewy/query/pagination/will_paginate_spec.rb +5 -0
- data/spec/chewy/query/pagination_spec.rb +25 -21
- data/spec/chewy/query_spec.rb +503 -561
- data/spec/chewy/rake_helper_spec.rb +381 -0
- data/spec/chewy/repository_spec.rb +4 -4
- data/spec/chewy/rspec/update_index_spec.rb +89 -56
- data/spec/chewy/runtime_spec.rb +2 -2
- data/spec/chewy/search/loader_spec.rb +117 -0
- data/spec/chewy/search/pagination/kaminari_examples.rb +71 -0
- data/spec/chewy/search/pagination/kaminari_spec.rb +21 -0
- data/spec/chewy/search/pagination/will_paginate_examples.rb +63 -0
- data/spec/chewy/search/pagination/will_paginate_spec.rb +23 -0
- data/spec/chewy/search/parameters/aggs_spec.rb +5 -0
- data/spec/chewy/search/parameters/bool_storage_examples.rb +53 -0
- data/spec/chewy/search/parameters/docvalue_fields_spec.rb +5 -0
- data/spec/chewy/search/parameters/explain_spec.rb +5 -0
- data/spec/chewy/search/parameters/filter_spec.rb +5 -0
- data/spec/chewy/search/parameters/hash_storage_examples.rb +59 -0
- data/spec/chewy/search/parameters/highlight_spec.rb +5 -0
- data/spec/chewy/search/parameters/indices_spec.rb +191 -0
- data/spec/chewy/search/parameters/integer_storage_examples.rb +32 -0
- data/spec/chewy/search/parameters/limit_spec.rb +5 -0
- data/spec/chewy/search/parameters/load_spec.rb +60 -0
- data/spec/chewy/search/parameters/min_score_spec.rb +32 -0
- data/spec/chewy/search/parameters/none_spec.rb +5 -0
- data/spec/chewy/search/parameters/offset_spec.rb +5 -0
- data/spec/chewy/search/parameters/order_spec.rb +65 -0
- data/spec/chewy/search/parameters/post_filter_spec.rb +5 -0
- data/spec/chewy/search/parameters/preference_spec.rb +5 -0
- data/spec/chewy/search/parameters/profile_spec.rb +5 -0
- data/spec/chewy/search/parameters/query_spec.rb +5 -0
- data/spec/chewy/search/parameters/query_storage_examples.rb +388 -0
- data/spec/chewy/search/parameters/request_cache_spec.rb +67 -0
- data/spec/chewy/search/parameters/rescore_spec.rb +62 -0
- data/spec/chewy/search/parameters/script_fields_spec.rb +5 -0
- data/spec/chewy/search/parameters/search_after_spec.rb +32 -0
- data/spec/chewy/search/parameters/search_type_spec.rb +5 -0
- data/spec/chewy/search/parameters/source_spec.rb +156 -0
- data/spec/chewy/search/parameters/storage_spec.rb +60 -0
- data/spec/chewy/search/parameters/stored_fields_spec.rb +126 -0
- data/spec/chewy/search/parameters/string_array_storage_examples.rb +63 -0
- data/spec/chewy/search/parameters/string_storage_examples.rb +32 -0
- data/spec/chewy/search/parameters/suggest_spec.rb +5 -0
- data/spec/chewy/search/parameters/terminate_after_spec.rb +5 -0
- data/spec/chewy/search/parameters/timeout_spec.rb +5 -0
- data/spec/chewy/search/parameters/track_scores_spec.rb +5 -0
- data/spec/chewy/search/parameters/types_spec.rb +5 -0
- data/spec/chewy/search/parameters/version_spec.rb +5 -0
- data/spec/chewy/search/parameters_spec.rb +147 -0
- data/spec/chewy/search/query_proxy_spec.rb +68 -0
- data/spec/chewy/search/request_spec.rb +685 -0
- data/spec/chewy/search/response_spec.rb +198 -0
- data/spec/chewy/search/scrolling_spec.rb +169 -0
- data/spec/chewy/search_spec.rb +33 -16
- data/spec/chewy/stash_spec.rb +95 -0
- data/spec/chewy/strategy/active_job_spec.rb +21 -2
- data/spec/chewy/strategy/resque_spec.rb +6 -0
- data/spec/chewy/strategy/shoryuken_spec.rb +70 -0
- data/spec/chewy/strategy/sidekiq_spec.rb +13 -1
- data/spec/chewy/strategy_spec.rb +6 -6
- data/spec/chewy/type/actions_spec.rb +29 -10
- data/spec/chewy/type/adapter/active_record_spec.rb +203 -91
- data/spec/chewy/type/adapter/mongoid_spec.rb +112 -54
- data/spec/chewy/type/adapter/object_spec.rb +101 -28
- data/spec/chewy/type/adapter/sequel_spec.rb +149 -82
- data/spec/chewy/type/import/bulk_builder_spec.rb +279 -0
- data/spec/chewy/type/import/bulk_request_spec.rb +102 -0
- data/spec/chewy/type/import/journal_builder_spec.rb +95 -0
- data/spec/chewy/type/import/routine_spec.rb +110 -0
- data/spec/chewy/type/import_spec.rb +356 -271
- data/spec/chewy/type/mapping_spec.rb +96 -29
- data/spec/chewy/type/observe_spec.rb +9 -5
- data/spec/chewy/type/syncer_spec.rb +123 -0
- data/spec/chewy/type/witchcraft_spec.rb +61 -29
- data/spec/chewy/type/wrapper_spec.rb +63 -23
- data/spec/chewy/type_spec.rb +28 -7
- data/spec/chewy_spec.rb +75 -7
- data/spec/spec_helper.rb +17 -3
- data/spec/support/active_record.rb +5 -1
- data/spec/support/class_helpers.rb +0 -14
- data/spec/support/mongoid.rb +15 -3
- data/spec/support/sequel.rb +6 -1
- metadata +219 -58
- data/.travis.yml +0 -36
- data/gemfiles/rails.3.2.activerecord.gemfile +0 -16
- data/gemfiles/rails.3.2.activerecord.kaminari.gemfile +0 -15
- data/gemfiles/rails.3.2.activerecord.will_paginate.gemfile +0 -15
- data/gemfiles/rails.4.2.activerecord.gemfile +0 -17
- data/gemfiles/rails.4.2.activerecord.kaminari.gemfile +0 -16
- data/gemfiles/rails.4.2.activerecord.will_paginate.gemfile +0 -16
- data/gemfiles/rails.4.2.mongoid.4.0.gemfile +0 -16
- data/gemfiles/rails.4.2.mongoid.4.0.kaminari.gemfile +0 -15
- data/gemfiles/rails.4.2.mongoid.4.0.will_paginate.gemfile +0 -15
- data/gemfiles/rails.4.2.mongoid.5.1.gemfile +0 -16
- data/gemfiles/rails.4.2.mongoid.5.1.kaminari.gemfile +0 -15
- data/gemfiles/rails.4.2.mongoid.5.1.will_paginate.gemfile +0 -15
- data/gemfiles/rails.5.0.activerecord.gemfile +0 -17
- data/gemfiles/rails.5.0.activerecord.kaminari.gemfile +0 -16
- data/gemfiles/rails.5.0.activerecord.will_paginate.gemfile +0 -16
- data/gemfiles/sequel.4.38.gemfile +0 -14
- data/lib/chewy/journal/apply.rb +0 -31
- data/lib/chewy/journal/clean.rb +0 -24
- data/lib/chewy/journal/entry.rb +0 -83
- data/lib/chewy/journal/query.rb +0 -87
- data/lib/chewy/query/pagination/will_paginate.rb +0 -27
- data/lib/chewy/query/scoping.rb +0 -20
- data/spec/chewy/journal/apply_spec.rb +0 -120
- data/spec/chewy/journal/entry_spec.rb +0 -237
- data/spec/chewy/query/pagination/will_paginage_spec.rb +0 -59
data/lib/chewy/query/compose.rb
CHANGED
@@ -4,23 +4,23 @@ module Chewy
|
|
4
4
|
protected
|
5
5
|
|
6
6
|
def _filtered_query(query, filter, options = {})
|
7
|
-
query = {
|
7
|
+
query = {match_all: {}} if !query.present? && filter.present?
|
8
8
|
|
9
9
|
if filter.present?
|
10
10
|
filtered = if query.present?
|
11
|
-
{
|
11
|
+
{query: {filtered: {
|
12
12
|
query: query,
|
13
13
|
filter: filter
|
14
|
-
}
|
14
|
+
}}}
|
15
15
|
else
|
16
|
-
{
|
16
|
+
{query: {filtered: {
|
17
17
|
filter: filter
|
18
|
-
}
|
18
|
+
}}}
|
19
19
|
end
|
20
20
|
filtered[:query][:filtered][:strategy] = options[:strategy].to_s if options[:strategy].present?
|
21
21
|
filtered
|
22
22
|
elsif query.present?
|
23
|
-
{
|
23
|
+
{query: query}
|
24
24
|
else
|
25
25
|
{}
|
26
26
|
end
|
@@ -32,14 +32,14 @@ module Chewy
|
|
32
32
|
if queries.many? || (queries.present? && logic == :must_not)
|
33
33
|
case logic
|
34
34
|
when :dis_max
|
35
|
-
{
|
35
|
+
{dis_max: {queries: queries}}
|
36
36
|
when :must, :should, :must_not
|
37
|
-
{
|
37
|
+
{bool: {logic => queries}}
|
38
38
|
else
|
39
39
|
if logic.is_a?(Float)
|
40
|
-
{
|
40
|
+
{dis_max: {queries: queries, tie_breaker: logic}}
|
41
41
|
else
|
42
|
-
{
|
42
|
+
{bool: {should: queries, minimum_should_match: logic}}
|
43
43
|
end
|
44
44
|
end
|
45
45
|
else
|
@@ -53,11 +53,11 @@ module Chewy
|
|
53
53
|
if filters.many? || (filters.present? && logic == :must_not)
|
54
54
|
case logic
|
55
55
|
when :and, :or
|
56
|
-
{
|
56
|
+
{logic => filters}
|
57
57
|
when :must, :should, :must_not
|
58
|
-
{
|
58
|
+
{bool: {logic => filters}}
|
59
59
|
else
|
60
|
-
{
|
60
|
+
{bool: {should: filters, minimum_should_match: logic}}
|
61
61
|
end
|
62
62
|
else
|
63
63
|
filters.first
|
data/lib/chewy/query/criteria.rb
CHANGED
@@ -4,8 +4,8 @@ module Chewy
|
|
4
4
|
class Query
|
5
5
|
class Criteria
|
6
6
|
include Compose
|
7
|
-
ARRAY_STORAGES = [
|
8
|
-
HASH_STORAGES = [
|
7
|
+
ARRAY_STORAGES = %i[queries filters post_filters sort fields types scores].freeze
|
8
|
+
HASH_STORAGES = %i[options search_options request_options facets aggregations suggest script_fields].freeze
|
9
9
|
STORAGES = ARRAY_STORAGES + HASH_STORAGES
|
10
10
|
|
11
11
|
def initialize(options = {})
|
@@ -20,7 +20,7 @@ module Chewy
|
|
20
20
|
other.is_a?(self.class) && storages == other.storages
|
21
21
|
end
|
22
22
|
|
23
|
-
{
|
23
|
+
{ARRAY_STORAGES => '[]', HASH_STORAGES => '{}'}.each do |storages, default|
|
24
24
|
storages.each do |storage|
|
25
25
|
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
26
26
|
def #{storage}
|
@@ -72,7 +72,7 @@ module Chewy
|
|
72
72
|
script_fields.merge!(modifier)
|
73
73
|
end
|
74
74
|
|
75
|
-
[
|
75
|
+
%i[filters queries post_filters].each do |storage|
|
76
76
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
77
77
|
def update_#{storage}(modifier)
|
78
78
|
@#{storage} = #{storage} + Array.wrap(modifier).reject(&:blank?)
|
@@ -83,12 +83,12 @@ module Chewy
|
|
83
83
|
def update_sort(modifier, options = {})
|
84
84
|
@sort = nil if options[:purge]
|
85
85
|
modifier = Array.wrap(modifier).flatten.map do |element|
|
86
|
-
element.is_a?(Hash) ? element.map { |k, v| {
|
86
|
+
element.is_a?(Hash) ? element.map { |k, v| {k => v} } : element
|
87
87
|
end.flatten
|
88
88
|
@sort = sort + modifier
|
89
89
|
end
|
90
90
|
|
91
|
-
%w
|
91
|
+
%w[fields types].each do |storage|
|
92
92
|
define_method "update_#{storage}" do |modifier, options = {}|
|
93
93
|
variable = "@#{storage}"
|
94
94
|
instance_variable_set(variable, nil) if options[:purge]
|
@@ -112,7 +112,7 @@ module Chewy
|
|
112
112
|
body = _filtered_query(_request_query, _request_filter, options.slice(:strategy))
|
113
113
|
|
114
114
|
if options[:simple]
|
115
|
-
{
|
115
|
+
{body: body.presence || {query: {match_all: {}}}}
|
116
116
|
else
|
117
117
|
body[:post_filter] = _request_post_filter if post_filters?
|
118
118
|
body[:facets] = facets if facets?
|
@@ -124,7 +124,7 @@ module Chewy
|
|
124
124
|
|
125
125
|
body = _boost_query(body)
|
126
126
|
|
127
|
-
{
|
127
|
+
{body: body.merge!(_request_options)}.merge!(search_options)
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
@@ -134,9 +134,9 @@ module Chewy
|
|
134
134
|
STORAGES.map { |storage| send(storage) }
|
135
135
|
end
|
136
136
|
|
137
|
-
def initialize_clone(
|
137
|
+
def initialize_clone(origin)
|
138
138
|
STORAGES.each do |storage|
|
139
|
-
value =
|
139
|
+
value = origin.send(storage)
|
140
140
|
instance_variable_set("@#{storage}", value.deep_dup)
|
141
141
|
end
|
142
142
|
end
|
@@ -146,7 +146,7 @@ module Chewy
|
|
146
146
|
query = body.delete :query
|
147
147
|
filter = body.delete :filter
|
148
148
|
if query && filter
|
149
|
-
query = {
|
149
|
+
query = {filtered: {query: query, filter: filter}}
|
150
150
|
filter = nil
|
151
151
|
end
|
152
152
|
score = {}
|
@@ -155,7 +155,7 @@ module Chewy
|
|
155
155
|
score[:score_mode] = options[:score_mode] if options[:score_mode]
|
156
156
|
score[:query] = query if query
|
157
157
|
score[:filter] = filter if filter
|
158
|
-
body.tap { |b| b[:query] = {
|
158
|
+
body.tap { |b| b[:query] = {function_score: score} }
|
159
159
|
end
|
160
160
|
|
161
161
|
def _request_options
|
@@ -180,7 +180,7 @@ module Chewy
|
|
180
180
|
end
|
181
181
|
|
182
182
|
def _request_types
|
183
|
-
_filters_join(types.map { |type| {
|
183
|
+
_filters_join(types.map { |type| {type: {value: type}} }, :or)
|
184
184
|
end
|
185
185
|
|
186
186
|
def _request_post_filter
|
data/lib/chewy/query/filters.rb
CHANGED
@@ -24,18 +24,20 @@ module Chewy
|
|
24
24
|
# You can use logic operations <tt>&</tt> and <tt>|</tt> to concat
|
25
25
|
# expressions.
|
26
26
|
#
|
27
|
+
# @example
|
27
28
|
# UsersIndex.filter{ (article.title =~ /Honey/) & (age < 42) & !rate }
|
28
29
|
#
|
29
30
|
#
|
30
31
|
class Filters
|
31
32
|
def initialize(outer = nil, &block)
|
32
33
|
@block = block
|
33
|
-
@outer = outer || eval('self', block.binding)
|
34
|
+
@outer = outer || eval('self', block.binding, __FILE__, __LINE__)
|
34
35
|
end
|
35
36
|
|
36
37
|
# Outer scope call
|
37
38
|
# Block evaluates in the external context
|
38
39
|
#
|
40
|
+
# @example
|
39
41
|
# def name
|
40
42
|
# 'Friend'
|
41
43
|
# end
|
@@ -50,12 +52,14 @@ module Chewy
|
|
50
52
|
# Used if method_missing is not working by some reason.
|
51
53
|
# Additional expression options might be passed as second argument hash.
|
52
54
|
#
|
55
|
+
# @example
|
53
56
|
# UsersIndex.filter{ f(:name) == 'Name' } == UsersIndex.filter{ name == 'Name' } # => true
|
54
57
|
# UsersIndex.filter{ f(:name, execution: :bool) == ['Name1', 'Name2'] } ==
|
55
58
|
# UsersIndex.filter{ name(execution: :bool) == ['Name1', 'Name2'] } # => true
|
56
59
|
#
|
57
60
|
# Supports block for getting field name from the outer scope
|
58
61
|
#
|
62
|
+
# @example
|
59
63
|
# def field
|
60
64
|
# :name
|
61
65
|
# end
|
@@ -70,11 +74,13 @@ module Chewy
|
|
70
74
|
# Returns script filter
|
71
75
|
# Just script filter. Supports additional params.
|
72
76
|
#
|
77
|
+
# @example
|
73
78
|
# UsersIndex.filter{ s('doc["num1"].value > 1') }
|
74
79
|
# UsersIndex.filter{ s('doc["num1"].value > param1', param1: 42) }
|
75
80
|
#
|
76
81
|
# Supports block for getting script from the outer scope
|
77
82
|
#
|
83
|
+
# @example
|
78
84
|
# def script
|
79
85
|
# 'doc["num1"].value > param1 || 1'
|
80
86
|
# end
|
@@ -90,10 +96,12 @@ module Chewy
|
|
90
96
|
|
91
97
|
# Returns query filter
|
92
98
|
#
|
99
|
+
# @example
|
93
100
|
# UsersIndex.filter{ q(query_string: {query: 'name: hello'}) }
|
94
101
|
#
|
95
102
|
# Supports block for getting query from the outer scope
|
96
103
|
#
|
104
|
+
# @example
|
97
105
|
# def query
|
98
106
|
# {query_string: {query: 'name: hello'}}
|
99
107
|
# end
|
@@ -107,11 +115,13 @@ module Chewy
|
|
107
115
|
# Returns raw expression
|
108
116
|
# Same as filter with arguments instead of block, but can participate in expressions
|
109
117
|
#
|
118
|
+
# @example
|
110
119
|
# UsersIndex.filter{ r(term: {name: 'Name'}) }
|
111
120
|
# UsersIndex.filter{ r(term: {name: 'Name'}) & (age < 42) }
|
112
121
|
#
|
113
122
|
# Supports block for getting raw filter from the outer scope
|
114
123
|
#
|
124
|
+
# @example
|
115
125
|
# def filter
|
116
126
|
# {term: {name: 'Name'}}
|
117
127
|
# end
|
@@ -126,12 +136,13 @@ module Chewy
|
|
126
136
|
# Bool filter chainable methods
|
127
137
|
# Used to create bool query. Nodes are passed as arguments.
|
128
138
|
#
|
139
|
+
# @example
|
129
140
|
# UsersIndex.filter{ must(age < 42, name == 'Name') }
|
130
141
|
# UsersIndex.filter{ should(age < 42, name == 'Name') }
|
131
142
|
# UsersIndex.filter{ must(age < 42).should(name == 'Name1', name == 'Name2') }
|
132
143
|
# UsersIndex.filter{ should_not(age >= 42).must(name == 'Name1') }
|
133
144
|
#
|
134
|
-
%w
|
145
|
+
%w[must must_not should].each do |method|
|
135
146
|
define_method method do |*exprs|
|
136
147
|
Nodes::Bool.new.send(method, *exprs)
|
137
148
|
end
|
@@ -141,12 +152,14 @@ module Chewy
|
|
141
152
|
# Chainable interface acts the same as main query interface. You can pass plain
|
142
153
|
# filters or plain queries or filter with DSL block.
|
143
154
|
#
|
155
|
+
# @example
|
144
156
|
# UsersIndex.filter{ has_child('user').filter(term: {role: 'Admin'}) }
|
145
157
|
# UsersIndex.filter{ has_child('user').filter{ role == 'Admin' } }
|
146
158
|
# UsersIndex.filter{ has_child('user').query(match: {name: 'borogoves'}) }
|
147
159
|
#
|
148
160
|
# Filters and queries might be combined and filter_mode and query_mode are configurable:
|
149
161
|
#
|
162
|
+
# @example
|
150
163
|
# UsersIndex.filter do
|
151
164
|
# has_child('user')
|
152
165
|
# .filter{ name: 'Peter' }
|
@@ -155,7 +168,7 @@ module Chewy
|
|
155
168
|
# .filter_mode(:or)
|
156
169
|
# end
|
157
170
|
#
|
158
|
-
def has_child(type) # rubocop:disable
|
171
|
+
def has_child(type) # rubocop:disable Naming/PredicateName
|
159
172
|
Nodes::HasChild.new(type, @outer)
|
160
173
|
end
|
161
174
|
|
@@ -163,12 +176,14 @@ module Chewy
|
|
163
176
|
# Chainable interface acts the same as main query interface. You can pass plain
|
164
177
|
# filters or plain queries or filter with DSL block.
|
165
178
|
#
|
179
|
+
# @example
|
166
180
|
# UsersIndex.filter{ has_parent('user').filter(term: {role: 'Admin'}) }
|
167
181
|
# UsersIndex.filter{ has_parent('user').filter{ role == 'Admin' } }
|
168
182
|
# UsersIndex.filter{ has_parent('user').query(match: {name: 'borogoves'}) }
|
169
183
|
#
|
170
184
|
# Filters and queries might be combined and filter_mode and query_mode are configurable:
|
171
185
|
#
|
186
|
+
# @example
|
172
187
|
# UsersIndex.filter do
|
173
188
|
# has_parent('user')
|
174
189
|
# .filter{ name: 'Peter' }
|
@@ -177,7 +192,7 @@ module Chewy
|
|
177
192
|
# .filter_mode(:or)
|
178
193
|
# end
|
179
194
|
#
|
180
|
-
def has_parent(type) # rubocop:disable
|
195
|
+
def has_parent(type) # rubocop:disable Naming/PredicateName
|
181
196
|
Nodes::HasParent.new(type, @outer)
|
182
197
|
end
|
183
198
|
|
@@ -190,6 +205,7 @@ module Chewy
|
|
190
205
|
# Creates field or exists node
|
191
206
|
# Additional options for further expression might be passed as hash
|
192
207
|
#
|
208
|
+
# @example
|
193
209
|
# UsersIndex.filter{ name == 'Name' } == UsersIndex.filter(term: {name: 'Name'}) # => true
|
194
210
|
# UsersIndex.filter{ name? } == UsersIndex.filter(exists: {term: 'name'}) # => true
|
195
211
|
# UsersIndex.filter{ name(execution: :bool) == ['Name1', 'Name2'] } ==
|
@@ -197,6 +213,7 @@ module Chewy
|
|
197
213
|
#
|
198
214
|
# Also field names might be chained to use dot-notation for ES field names
|
199
215
|
#
|
216
|
+
# @example
|
200
217
|
# UsersIndex.filter{ article.title =~ 'Hello' }
|
201
218
|
# UsersIndex.filter{ article.tags? }
|
202
219
|
#
|
data/lib/chewy/query/loading.rb
CHANGED
@@ -94,8 +94,7 @@ module Chewy
|
|
94
94
|
loaded_objects = Hash[_results.group_by(&:class).map do |type, objects|
|
95
95
|
next if except.include?(type.type_name)
|
96
96
|
next if only.present? && !only.include?(type.type_name)
|
97
|
-
|
98
|
-
loaded = type.adapter.load(objects, options.merge(_type: type))
|
97
|
+
loaded = type.adapter.load(objects.map(&:id), **options.merge(_type: type)) || objects
|
99
98
|
[type, loaded.index_by.with_index do |loaded_object, i|
|
100
99
|
objects[i]._object = loaded_object
|
101
100
|
objects[i]
|
@@ -14,9 +14,9 @@ module Chewy
|
|
14
14
|
def __render__
|
15
15
|
nodes = @nodes.map(&:__render__)
|
16
16
|
if @options.key?(:cache)
|
17
|
-
{
|
17
|
+
{and: {filters: nodes, _cache: !!@options[:cache]}}
|
18
18
|
else
|
19
|
-
{
|
19
|
+
{and: nodes}
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -23,10 +23,10 @@ module Chewy
|
|
23
23
|
|
24
24
|
def __render__
|
25
25
|
filter = (@value.is_a?(Array) ? :terms : :term)
|
26
|
-
body = {
|
26
|
+
body = {@name => @value}
|
27
27
|
body.merge!(@options.slice(:execution)) if filter == :terms
|
28
28
|
body[:_cache] = !!@options[:cache] if @options.key?(:cache)
|
29
|
-
{
|
29
|
+
{filter => body}
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -39,7 +39,7 @@ module Chewy
|
|
39
39
|
when ::Regexp
|
40
40
|
Nodes::Regexp.new @name, other, *@args
|
41
41
|
when ::Range
|
42
|
-
Nodes::Range.new @name, *__options_merge__(gt: other.
|
42
|
+
Nodes::Range.new @name, *__options_merge__(gt: other.begin, lt: other.end)
|
43
43
|
else
|
44
44
|
if other.is_a?(Array) && other.first.is_a?(::Range)
|
45
45
|
Nodes::Range.new @name, *__options_merge__(
|
@@ -45,13 +45,13 @@ module Chewy
|
|
45
45
|
filters = _filters_join @filters, @filter_mode
|
46
46
|
|
47
47
|
body = if filters && !queries
|
48
|
-
{
|
48
|
+
{filter: filters}
|
49
49
|
else
|
50
50
|
_filtered_query(queries, filters)
|
51
51
|
end
|
52
52
|
body ||= {}
|
53
53
|
|
54
|
-
{
|
54
|
+
{_relation => body.merge(type: @type)}
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -14,9 +14,9 @@ module Chewy
|
|
14
14
|
def __render__
|
15
15
|
expr = @expr.__render__
|
16
16
|
if @options.key?(:cache)
|
17
|
-
{
|
17
|
+
{not: {filter: expr, _cache: !!@options[:cache]}}
|
18
18
|
else
|
19
|
-
{
|
19
|
+
{not: expr}
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/lib/chewy/query/nodes/or.rb
CHANGED
@@ -14,9 +14,9 @@ module Chewy
|
|
14
14
|
def __render__
|
15
15
|
nodes = @nodes.map(&:__render__)
|
16
16
|
if @options.key?(:cache)
|
17
|
-
{
|
17
|
+
{or: {filters: nodes, _cache: !!@options[:cache]}}
|
18
18
|
else
|
19
|
-
{
|
19
|
+
{or: nodes}
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|