chewy 0.6.2 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +35 -29
- data/Appraisals +37 -0
- data/CHANGELOG.md +115 -4
- data/Gemfile +2 -3
- data/README.md +135 -40
- data/chewy.gemspec +4 -3
- data/gemfiles/rails.3.2.activerecord.gemfile +13 -0
- data/gemfiles/rails.3.2.activerecord.kaminari.gemfile +14 -0
- data/gemfiles/rails.3.2.activerecord.will_paginate.gemfile +14 -0
- data/gemfiles/rails.4.0.activerecord.gemfile +13 -0
- data/gemfiles/rails.4.0.activerecord.kaminari.gemfile +14 -0
- data/gemfiles/rails.4.0.activerecord.will_paginate.gemfile +14 -0
- data/gemfiles/rails.4.0.mongoid.gemfile +13 -0
- data/gemfiles/rails.4.0.mongoid.kaminari.gemfile +14 -0
- data/gemfiles/rails.4.0.mongoid.will_paginate.gemfile +14 -0
- data/gemfiles/rails.4.1.activerecord.gemfile +13 -0
- data/gemfiles/rails.4.1.activerecord.kaminari.gemfile +14 -0
- data/gemfiles/rails.4.1.activerecord.will_paginate.gemfile +14 -0
- data/gemfiles/rails.4.1.mongoid.gemfile +13 -0
- data/gemfiles/rails.4.1.mongoid.kaminari.gemfile +14 -0
- data/gemfiles/rails.4.1.mongoid.will_paginate.gemfile +14 -0
- data/gemfiles/rails.4.2.activerecord.gemfile +13 -0
- data/gemfiles/rails.4.2.activerecord.kaminari.gemfile +14 -0
- data/gemfiles/rails.4.2.activerecord.will_paginate.gemfile +14 -0
- data/gemfiles/rails.4.2.mongoid.gemfile +13 -0
- data/gemfiles/rails.4.2.mongoid.kaminari.gemfile +14 -0
- data/gemfiles/rails.4.2.mongoid.will_paginate.gemfile +14 -0
- data/lib/chewy.rb +65 -0
- data/lib/chewy/config.rb +44 -93
- data/lib/chewy/errors.rb +14 -5
- data/lib/chewy/fields/base.rb +8 -7
- data/lib/chewy/fields/root.rb +2 -2
- data/lib/chewy/index.rb +7 -9
- data/lib/chewy/log_subscriber.rb +34 -0
- data/lib/chewy/query.rb +41 -27
- data/lib/chewy/query/criteria.rb +28 -23
- data/lib/chewy/query/scoping.rb +20 -0
- data/lib/chewy/railtie.rb +51 -13
- data/lib/chewy/repository.rb +61 -0
- data/lib/chewy/rspec/update_index.rb +3 -6
- data/lib/chewy/search.rb +28 -7
- data/lib/chewy/strategy.rb +60 -0
- data/lib/chewy/strategy/atomic.rb +31 -0
- data/lib/chewy/strategy/base.rb +27 -0
- data/lib/chewy/strategy/bypass.rb +15 -0
- data/lib/chewy/strategy/urgent.rb +17 -0
- data/lib/chewy/type.rb +19 -5
- data/lib/chewy/type/adapter/active_record.rb +28 -117
- data/lib/chewy/type/adapter/base.rb +35 -0
- data/lib/chewy/type/adapter/mongoid.rb +23 -123
- data/lib/chewy/type/adapter/object.rb +41 -19
- data/lib/chewy/type/adapter/orm.rb +142 -0
- data/lib/chewy/type/import.rb +43 -16
- data/lib/chewy/type/observe.rb +8 -21
- data/lib/chewy/version.rb +1 -1
- data/lib/tasks/chewy.rake +8 -4
- data/spec/chewy/config_spec.rb +20 -97
- data/spec/chewy/fields/base_spec.rb +24 -11
- data/spec/chewy/fields/time_fields_spec.rb +27 -0
- data/spec/chewy/index/settings_spec.rb +2 -1
- data/spec/chewy/index_spec.rb +98 -79
- data/spec/chewy/query/criteria_spec.rb +14 -0
- data/spec/chewy/query_spec.rb +1 -1
- data/spec/chewy/repository_spec.rb +50 -0
- data/spec/chewy/search_spec.rb +100 -0
- data/spec/chewy/strategy_spec.rb +109 -0
- data/spec/chewy/type/adapter/active_record_spec.rb +110 -46
- data/spec/chewy/type/adapter/mongoid_spec.rb +123 -74
- data/spec/chewy/type/adapter/object_spec.rb +51 -34
- data/spec/chewy/type/import_spec.rb +21 -21
- data/spec/chewy/type/observe_spec.rb +26 -29
- data/spec/chewy/type_spec.rb +19 -0
- data/spec/chewy_spec.rb +19 -3
- data/spec/spec_helper.rb +1 -1
- data/spec/support/active_record.rb +2 -1
- data/spec/support/mongoid.rb +29 -38
- metadata +85 -55
- data/gemfiles/Gemfile.rails-3.2.active_record +0 -6
- data/gemfiles/Gemfile.rails-3.2.active_record.kaminari +0 -7
- data/gemfiles/Gemfile.rails-3.2.active_record.will_paginate +0 -7
- data/gemfiles/Gemfile.rails-4.0.active_record +0 -6
- data/gemfiles/Gemfile.rails-4.0.active_record.kaminari +0 -7
- data/gemfiles/Gemfile.rails-4.0.active_record.will_paginate +0 -7
- data/gemfiles/Gemfile.rails-4.0.mongoid +0 -6
- data/gemfiles/Gemfile.rails-4.0.mongoid.kaminari +0 -7
- data/gemfiles/Gemfile.rails-4.0.mongoid.will_paginate +0 -7
- data/gemfiles/Gemfile.rails-4.1.active_record +0 -6
- data/gemfiles/Gemfile.rails-4.1.active_record.kaminari +0 -7
- data/gemfiles/Gemfile.rails-4.1.active_record.will_paginate +0 -7
- data/gemfiles/Gemfile.rails-4.1.mongoid +0 -6
- data/gemfiles/Gemfile.rails-4.1.mongoid.kaminari +0 -7
- data/gemfiles/Gemfile.rails-4.1.mongoid.will_paginate +0 -7
- data/gemfiles/Gemfile.rails-4.2.active_record +0 -6
- data/gemfiles/Gemfile.rails-4.2.active_record.kaminari +0 -7
- data/gemfiles/Gemfile.rails-4.2.active_record.will_paginate +0 -7
- data/gemfiles/Gemfile.rails-4.2.mongoid +0 -6
- data/gemfiles/Gemfile.rails-4.2.mongoid.kaminari +0 -7
- data/gemfiles/Gemfile.rails-4.2.mongoid.will_paginate +0 -7
- data/spec/chewy/index/search_spec.rb +0 -46
data/lib/chewy/errors.rb
CHANGED
@@ -11,20 +11,29 @@ module Chewy
|
|
11
11
|
class UnderivableType < Error
|
12
12
|
end
|
13
13
|
|
14
|
+
class UndefinedUpdateStrategy < Error
|
15
|
+
def initialize type
|
16
|
+
super <<-MESSAGE
|
17
|
+
Index update strategy is undefined in current context.
|
18
|
+
Please wrap your code with `Chewy.strategy(:strategy_name) block.`
|
19
|
+
MESSAGE
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
14
23
|
class DocumentNotFound < Error
|
15
24
|
end
|
16
25
|
|
17
26
|
class ImportFailed < Error
|
18
27
|
def initialize type, errors
|
19
|
-
|
28
|
+
message = "Import failed for `#{type}` with:\n"
|
20
29
|
errors.each do |action, errors|
|
21
|
-
|
30
|
+
message << " #{action.to_s.humanize} errors:\n"
|
22
31
|
errors.each do |error, documents|
|
23
|
-
|
24
|
-
|
32
|
+
message << " `#{error}`\n"
|
33
|
+
message << " on #{documents.count} documents: #{documents}\n"
|
25
34
|
end
|
26
35
|
end
|
27
|
-
super
|
36
|
+
super message
|
28
37
|
end
|
29
38
|
end
|
30
39
|
end
|
data/lib/chewy/fields/base.rb
CHANGED
@@ -20,9 +20,10 @@ module Chewy
|
|
20
20
|
false
|
21
21
|
end
|
22
22
|
|
23
|
-
def compose(object)
|
23
|
+
def compose(object, *parent_objects)
|
24
24
|
result = if value && value.is_a?(Proc)
|
25
|
-
value.arity
|
25
|
+
value.arity.zero? ? object.instance_exec(&value) :
|
26
|
+
value.call(object, *parent_objects.first(value.arity - 1))
|
26
27
|
elsif object.is_a?(Hash)
|
27
28
|
object[name] || object[name.to_s]
|
28
29
|
else
|
@@ -30,12 +31,12 @@ module Chewy
|
|
30
31
|
end
|
31
32
|
|
32
33
|
result = if result.respond_to?(:to_ary)
|
33
|
-
result.to_ary.map { |
|
34
|
+
result.to_ary.map { |result| nested_compose(result, object, *parent_objects) }
|
34
35
|
else
|
35
|
-
nested_compose(result)
|
36
|
+
nested_compose(result, object, *parent_objects)
|
36
37
|
end if nested.any? && !multi_field?
|
37
38
|
|
38
|
-
{name => result.as_json}
|
39
|
+
{name => result.as_json(root: false)}
|
39
40
|
end
|
40
41
|
|
41
42
|
def nested(field = nil)
|
@@ -57,8 +58,8 @@ module Chewy
|
|
57
58
|
|
58
59
|
private
|
59
60
|
|
60
|
-
def nested_compose(value)
|
61
|
-
nested.values.map { |field| field.compose(value) if value }.compact.inject(:merge)
|
61
|
+
def nested_compose(value, *parent_objects)
|
62
|
+
nested.values.map { |field| field.compose(value, *parent_objects) if value }.compact.inject(:merge)
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
data/lib/chewy/fields/root.rb
CHANGED
@@ -10,7 +10,7 @@ module Chewy
|
|
10
10
|
@id = options.delete(:id) || options.delete(:_id)
|
11
11
|
@parent = options.delete(:parent) || options.delete(:_parent)
|
12
12
|
@parent_id = options.delete(:parent_id)
|
13
|
-
options.reverse_merge!(value: ->(_){_})
|
13
|
+
options.reverse_merge!(value: ->(_) { _ })
|
14
14
|
super(name, options)
|
15
15
|
options.delete(:type)
|
16
16
|
@dynamic_templates = []
|
@@ -66,7 +66,7 @@ module Chewy
|
|
66
66
|
parent_id.arity == 0 ? object.instance_exec(&parent_id) : parent_id.call(object)
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def compose_id(object)
|
71
71
|
if id
|
72
72
|
id.arity == 0 ? object.instance_exec(&id) : id.call(object)
|
data/lib/chewy/index.rb
CHANGED
@@ -34,7 +34,7 @@ module Chewy
|
|
34
34
|
else
|
35
35
|
@index_name ||= begin
|
36
36
|
build_index_name(
|
37
|
-
name.
|
37
|
+
name.sub(/Index\Z/, '').demodulize.underscore,
|
38
38
|
prefix: Chewy.configuration[:prefix]
|
39
39
|
) if name
|
40
40
|
end
|
@@ -137,6 +137,12 @@ module Chewy
|
|
137
137
|
self._settings = Chewy::Index::Settings.new params
|
138
138
|
end
|
139
139
|
|
140
|
+
# Returns list of public class methods defined in current index
|
141
|
+
#
|
142
|
+
def self.scopes
|
143
|
+
public_methods - Chewy::Index.public_methods - type_names.map(&:to_sym)
|
144
|
+
end
|
145
|
+
|
140
146
|
private
|
141
147
|
|
142
148
|
def self.build_index_name *args
|
@@ -156,13 +162,5 @@ module Chewy
|
|
156
162
|
def self.index_params
|
157
163
|
[settings_hash, mappings_hash].inject(:merge)
|
158
164
|
end
|
159
|
-
|
160
|
-
def self.search_index
|
161
|
-
self
|
162
|
-
end
|
163
|
-
|
164
|
-
def self.search_type
|
165
|
-
type_names
|
166
|
-
end
|
167
165
|
end
|
168
166
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Chewy
|
2
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
3
|
+
def logger
|
4
|
+
Chewy.logger
|
5
|
+
end
|
6
|
+
|
7
|
+
def import_objects(event)
|
8
|
+
render_action('Import', event) { |payload| payload[:import] }
|
9
|
+
end
|
10
|
+
|
11
|
+
def search_query(event)
|
12
|
+
render_action('Search', event) { |payload| payload[:request] }
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete_query(event)
|
16
|
+
render_action('Delete by Query', event) { |payload| payload[:request] }
|
17
|
+
end
|
18
|
+
|
19
|
+
def render_action action, event, &block
|
20
|
+
payload = event.payload
|
21
|
+
description = block.call(payload)
|
22
|
+
|
23
|
+
if description.present?
|
24
|
+
subject = payload[:type].presence || payload[:index]
|
25
|
+
action = "#{subject} #{action} (#{event.duration.round(1)}ms)"
|
26
|
+
action = color(action, GREEN, true)
|
27
|
+
|
28
|
+
debug(" #{action} #{description}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Chewy::LogSubscriber.attach_to :chewy
|
data/lib/chewy/query.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'chewy/query/criteria'
|
2
2
|
require 'chewy/query/filters'
|
3
|
+
require 'chewy/query/scoping'
|
3
4
|
require 'chewy/query/loading'
|
4
5
|
require 'chewy/query/pagination'
|
5
6
|
|
@@ -13,6 +14,7 @@ module Chewy
|
|
13
14
|
#
|
14
15
|
class Query
|
15
16
|
include Enumerable
|
17
|
+
include Scoping
|
16
18
|
include Loading
|
17
19
|
include Pagination
|
18
20
|
|
@@ -29,13 +31,14 @@ module Chewy
|
|
29
31
|
delegate :each, :count, :size, to: :_collection
|
30
32
|
alias_method :to_ary, :to_a
|
31
33
|
|
32
|
-
attr_reader :
|
34
|
+
attr_reader :_indexes, :_types, :options, :criteria
|
33
35
|
|
34
|
-
def initialize
|
35
|
-
@
|
36
|
-
@
|
36
|
+
def initialize *indexes_or_types_and_options
|
37
|
+
@options = indexes_or_types_and_options.extract_options!
|
38
|
+
@_types = indexes_or_types_and_options.select { |klass| klass < Chewy::Type }
|
39
|
+
@_indexes = indexes_or_types_and_options.select { |klass| klass < Chewy::Index }
|
40
|
+
@_indexes |= @_types.map(&:index)
|
37
41
|
@criteria = Criteria.new
|
38
|
-
reset
|
39
42
|
end
|
40
43
|
|
41
44
|
# Comparation with other query or collection
|
@@ -347,21 +350,21 @@ module Chewy
|
|
347
350
|
# added to the search request and combinded according to
|
348
351
|
# <tt>boost_mode</tt> and <tt>score_mode</tt>
|
349
352
|
#
|
350
|
-
# UsersIndex.script_score("doc['boost'].value",
|
353
|
+
# UsersIndex.script_score("doc['boost'].value", params: { modifier: 2 })
|
351
354
|
# # => {body:
|
352
355
|
# query: {
|
353
356
|
# function_score: {
|
354
357
|
# query: { ...},
|
355
358
|
# functions: [{
|
356
359
|
# script_score: {
|
357
|
-
# script: "doc['boost'].value"
|
358
|
-
#
|
359
|
-
#
|
360
|
+
# script: "doc['boost'].value * modifier",
|
361
|
+
# params: { modifier: 2 }
|
362
|
+
# }
|
360
363
|
# }
|
361
364
|
# }]
|
362
365
|
# } } }
|
363
366
|
def script_score(script, options = {})
|
364
|
-
scoring =
|
367
|
+
scoring = { script_score: { script: script }.merge(options) }
|
365
368
|
chain { criteria.update_scores scoring }
|
366
369
|
end
|
367
370
|
|
@@ -800,11 +803,7 @@ module Chewy
|
|
800
803
|
# }}}}
|
801
804
|
#
|
802
805
|
def types *params
|
803
|
-
|
804
|
-
chain { criteria.update_types params }
|
805
|
-
else
|
806
|
-
@types
|
807
|
-
end
|
806
|
+
chain { criteria.update_types params }
|
808
807
|
end
|
809
808
|
|
810
809
|
# Acts the same way as <tt>types</tt>, but cleans up previously set types
|
@@ -841,8 +840,11 @@ module Chewy
|
|
841
840
|
#
|
842
841
|
def delete_all
|
843
842
|
request = chain { criteria.update_options simple: true }.send(:_request)
|
844
|
-
ActiveSupport::Notifications.instrument 'delete_query.chewy',
|
845
|
-
|
843
|
+
ActiveSupport::Notifications.instrument 'delete_query.chewy',
|
844
|
+
request: request, indexes: _indexes, types: _types,
|
845
|
+
index: _indexes.one? ? _indexes.first : _indexes,
|
846
|
+
type: _types.one? ? _types.first : _types do
|
847
|
+
Chewy.client.delete_by_query(request)
|
846
848
|
end
|
847
849
|
end
|
848
850
|
|
@@ -899,7 +901,7 @@ module Chewy
|
|
899
901
|
private
|
900
902
|
|
901
903
|
def chain &block
|
902
|
-
clone.tap { |q| q.
|
904
|
+
clone.tap { |q| q.instance_exec(&block) }
|
903
905
|
end
|
904
906
|
|
905
907
|
def reset
|
@@ -907,17 +909,20 @@ module Chewy
|
|
907
909
|
end
|
908
910
|
|
909
911
|
def _request
|
910
|
-
@_request ||= criteria.request_body.merge(index:
|
912
|
+
@_request ||= criteria.request_body.merge(index: _indexes.map(&:index_name), type: _types.map(&:type_name))
|
911
913
|
end
|
912
914
|
|
913
915
|
def _response
|
914
|
-
@_response ||= ActiveSupport::Notifications.instrument 'search_query.chewy',
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
916
|
+
@_response ||= ActiveSupport::Notifications.instrument 'search_query.chewy',
|
917
|
+
request: _request, indexes: _indexes, types: _types,
|
918
|
+
index: _indexes.one? ? _indexes.first : _indexes,
|
919
|
+
type: _types.one? ? _types.first : _types do
|
920
|
+
begin
|
921
|
+
Chewy.client.search(_request)
|
922
|
+
rescue Elasticsearch::Transport::Transport::Errors::NotFound => e
|
923
|
+
raise e if e.message !~ /IndexMissingException/
|
924
|
+
{}
|
925
|
+
end
|
921
926
|
end
|
922
927
|
end
|
923
928
|
|
@@ -928,7 +933,7 @@ module Chewy
|
|
928
933
|
.merge!(_score: hit['_score'])
|
929
934
|
.merge!(_explanation: hit['_explanation'])
|
930
935
|
|
931
|
-
wrapper =
|
936
|
+
wrapper = _derive_index(hit['_index']).type_hash[hit['_type']].new attributes
|
932
937
|
wrapper._data = hit
|
933
938
|
wrapper
|
934
939
|
end
|
@@ -941,5 +946,14 @@ module Chewy
|
|
941
946
|
_results.map(&:_object) : _results
|
942
947
|
end
|
943
948
|
end
|
949
|
+
|
950
|
+
def _derive_index index_name
|
951
|
+
(@derive_index ||= {})[index_name] ||= _indexes_hash[index_name] ||
|
952
|
+
_indexes_hash[_indexes_hash.keys.sort_by(&:length).reverse.detect { |name| index_name.starts_with?(name) }]
|
953
|
+
end
|
954
|
+
|
955
|
+
def _indexes_hash
|
956
|
+
@_indexes_hash ||= _indexes.index_by(&:index_name)
|
957
|
+
end
|
944
958
|
end
|
945
959
|
end
|
data/lib/chewy/query/criteria.rb
CHANGED
@@ -5,14 +5,14 @@ module Chewy
|
|
5
5
|
class Criteria
|
6
6
|
include Compose
|
7
7
|
ARRAY_STORAGES = [:queries, :filters, :post_filters, :sort, :fields, :types, :scores]
|
8
|
-
HASH_STORAGES = [:options, :request_options, :facets, :aggregations, :suggest]
|
8
|
+
HASH_STORAGES = [:options, :request_options, :facets, :aggregations, :suggest, :script_fields]
|
9
9
|
STORAGES = ARRAY_STORAGES + HASH_STORAGES
|
10
10
|
|
11
11
|
def initialize options = {}
|
12
12
|
@options = options.merge(
|
13
13
|
query_mode: Chewy.query_mode,
|
14
14
|
filter_mode: Chewy.filter_mode,
|
15
|
-
post_filter_mode: Chewy.
|
15
|
+
post_filter_mode: Chewy.post_filter_mode || Chewy.filter_mode
|
16
16
|
)
|
17
17
|
end
|
18
18
|
|
@@ -40,52 +40,56 @@ module Chewy
|
|
40
40
|
!!options[:none]
|
41
41
|
end
|
42
42
|
|
43
|
-
def update_options(
|
44
|
-
options.merge!(
|
43
|
+
def update_options(modifier)
|
44
|
+
options.merge!(modifier)
|
45
45
|
end
|
46
46
|
|
47
|
-
def update_request_options(
|
48
|
-
request_options.merge!(
|
47
|
+
def update_request_options(modifier)
|
48
|
+
request_options.merge!(modifier)
|
49
49
|
end
|
50
50
|
|
51
|
-
def update_facets(
|
52
|
-
facets.merge!(
|
51
|
+
def update_facets(modifier)
|
52
|
+
facets.merge!(modifier)
|
53
53
|
end
|
54
54
|
|
55
|
-
def update_scores(
|
56
|
-
@scores = scores + Array.wrap(
|
55
|
+
def update_scores(modifier)
|
56
|
+
@scores = scores + Array.wrap(modifier).reject(&:blank?)
|
57
57
|
end
|
58
58
|
|
59
|
-
def update_aggregations(
|
60
|
-
aggregations.merge!(
|
59
|
+
def update_aggregations(modifier)
|
60
|
+
aggregations.merge!(modifier)
|
61
61
|
end
|
62
62
|
|
63
63
|
def update_suggest(modifier)
|
64
64
|
suggest.merge!(modifier)
|
65
65
|
end
|
66
66
|
|
67
|
+
def update_script_fields(modifier)
|
68
|
+
script_fields.merge!(modifier)
|
69
|
+
end
|
70
|
+
|
67
71
|
[:filters, :queries, :post_filters].each do |storage|
|
68
72
|
class_eval <<-RUBY
|
69
|
-
def update_#{storage}(
|
70
|
-
@#{storage} = #{storage} + Array.wrap(
|
73
|
+
def update_#{storage}(modifier)
|
74
|
+
@#{storage} = #{storage} + Array.wrap(modifier).reject(&:blank?)
|
71
75
|
end
|
72
76
|
RUBY
|
73
77
|
end
|
74
78
|
|
75
|
-
def update_sort(
|
79
|
+
def update_sort(modifier, options = {})
|
76
80
|
@sort = nil if options[:purge]
|
77
|
-
|
81
|
+
modifier = Array.wrap(modifier).flatten.map do |element|
|
78
82
|
element.is_a?(Hash) ? element.map { |k, v| {k => v} } : element
|
79
83
|
end.flatten
|
80
|
-
@sort = sort +
|
84
|
+
@sort = sort + modifier
|
81
85
|
end
|
82
86
|
|
83
87
|
%w(fields types).each do |storage|
|
84
|
-
define_method "update_#{storage}" do |
|
88
|
+
define_method "update_#{storage}" do |modifier, options = {}|
|
85
89
|
variable = "@#{storage}"
|
86
90
|
instance_variable_set(variable, nil) if options[:purge]
|
87
|
-
|
88
|
-
instance_variable_set(variable,
|
91
|
+
modifier = send(storage) | Array.wrap(modifier).flatten.map(&:to_s).reject(&:blank?)
|
92
|
+
instance_variable_set(variable, modifier)
|
89
93
|
end
|
90
94
|
end
|
91
95
|
|
@@ -112,6 +116,7 @@ module Chewy
|
|
112
116
|
body.merge!(suggest: suggest) if suggest?
|
113
117
|
body.merge!(sort: sort) if sort?
|
114
118
|
body.merge!(_source: fields) if fields?
|
119
|
+
body.merge!(script_fields: script_fields) if script_fields?
|
115
120
|
|
116
121
|
body = _boost_query(body)
|
117
122
|
|
@@ -133,14 +138,14 @@ module Chewy
|
|
133
138
|
end
|
134
139
|
|
135
140
|
def _boost_query(body)
|
136
|
-
|
141
|
+
return body unless scores?
|
137
142
|
query = body.delete :query
|
138
143
|
filter = body.delete :filter
|
139
144
|
if query && filter
|
140
145
|
query = { filtered: { query: query, filter: filter } }
|
141
146
|
filter = nil
|
142
147
|
end
|
143
|
-
score = {
|
148
|
+
score = {}
|
144
149
|
score[:functions] = scores
|
145
150
|
score[:boost_mode] = options[:boost_mode] if options[:boost_mode]
|
146
151
|
score[:score_mode] = options[:score_mode] if options[:score_mode]
|
@@ -165,7 +170,7 @@ module Chewy
|
|
165
170
|
end
|
166
171
|
|
167
172
|
def _request_types
|
168
|
-
_filters_join(types.map { |type| {type: {value: type}} }, :or)
|
173
|
+
_filters_join(types.map { |type| { type: { value: type } } }, :or)
|
169
174
|
end
|
170
175
|
|
171
176
|
def _request_post_filter
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Chewy
|
2
|
+
class Query
|
3
|
+
module Scoping
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def scopes
|
8
|
+
Thread.current[:chewy_scopes] ||= []
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def scoping
|
13
|
+
self.class.scopes.push(self)
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
self.class.scopes.pop
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|