elasticated 2.5.5 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -2
- data/Rakefile +52 -1
- data/elasticated.gemspec +3 -1
- data/lib/elasticated.rb +20 -24
- data/lib/elasticated/aggregation.rb +3 -6
- data/lib/elasticated/aggregations/date_histogram_aggregation.rb +6 -1
- data/lib/elasticated/aggregations/filter_aggregation.rb +8 -12
- data/lib/elasticated/aggregations/filter_aggregation_evaluator.rb +1 -1
- data/lib/elasticated/aggregations/group_aggregation.rb +14 -11
- data/lib/elasticated/aggregations/range_aggregation.rb +10 -11
- data/lib/elasticated/aggregations/range_aggregation_evaluator.rb +1 -1
- data/lib/elasticated/aggregations/ranges_builder.rb +2 -2
- data/lib/elasticated/aggregations/safe_date_histogram_aggregation.rb +7 -2
- data/lib/elasticated/aggregations/subaggregated.rb +1 -1
- data/lib/elasticated/boolean_clause.rb +4 -3
- data/lib/elasticated/bulk_actions/create_action.rb +14 -0
- data/lib/elasticated/bulk_actions/delete_action.rb +30 -0
- data/lib/elasticated/bulk_actions/index_action.rb +35 -0
- data/lib/elasticated/bulk_actions/standard_action.rb +22 -0
- data/lib/elasticated/bulk_actions/update_action.rb +44 -0
- data/lib/elasticated/bulk_actions/upsert_action.rb +14 -0
- data/lib/elasticated/bulk_request.rb +58 -0
- data/lib/elasticated/bulk_request/response.rb +32 -0
- data/lib/elasticated/bulk_request/response_item.rb +39 -0
- data/lib/elasticated/client.rb +27 -3
- data/lib/elasticated/conditions/custom_condition.rb +3 -3
- data/lib/elasticated/conditions/range_condition.rb +5 -2
- data/lib/elasticated/conditions/script_condition.rb +3 -3
- data/lib/elasticated/conditions/standard_condition.rb +4 -5
- data/lib/elasticated/conditions/term_condition.rb +22 -0
- data/lib/elasticated/conditions/terms_condition.rb +2 -2
- data/lib/elasticated/conditions_builder.rb +19 -4
- data/lib/elasticated/delimiters/date_field_delimiter.rb +21 -12
- data/lib/elasticated/delimiters/standard_field_delimiter.rb +18 -2
- data/lib/elasticated/delimiters/term_field_delimiter.rb +6 -5
- data/lib/elasticated/document.rb +20 -1
- data/lib/elasticated/enum.rb +17 -0
- data/lib/elasticated/index_selector.rb +26 -25
- data/lib/elasticated/mapping.rb +2 -4
- data/lib/elasticated/mapping/builder.rb +3 -2
- data/lib/elasticated/mapping/fields_builder.rb +13 -9
- data/lib/elasticated/mapping/object_builder.rb +38 -4
- data/lib/elasticated/mapping/type_builder.rb +3 -5
- data/lib/elasticated/mixins/block_evaluation.rb +17 -0
- data/lib/elasticated/mixins/clonable.rb +60 -0
- data/lib/elasticated/mixins/configurable.rb +22 -0
- data/lib/elasticated/mixins/inspectionable.rb +16 -0
- data/lib/elasticated/partitioned_repository.rb +24 -18
- data/lib/elasticated/query.rb +27 -21
- data/lib/elasticated/query_aggregations.rb +5 -7
- data/lib/elasticated/query_conditions.rb +6 -3
- data/lib/elasticated/quick.rb +7 -0
- data/lib/elasticated/repository.rb +184 -40
- data/lib/elasticated/repository/intelligent_search.rb +3 -3
- data/lib/elasticated/repository/normal_search.rb +2 -2
- data/lib/elasticated/repository/resumable_search.rb +5 -5
- data/lib/elasticated/repository/scan_scroll_search.rb +4 -4
- data/lib/elasticated/repository/scroll_search.rb +3 -3
- data/lib/elasticated/repository/search.rb +7 -0
- data/lib/elasticated/repository/single_page_search.rb +1 -1
- data/lib/elasticated/results.rb +14 -0
- data/lib/version.rb +18 -25
- data/spec/aggregation_spec.rb +95 -16
- data/spec/bulk_request_spec.rb +158 -0
- data/spec/date_field_delimiter_spec.rb +50 -6
- data/spec/document_spec.rb +1 -5
- data/spec/integration_spec.rb +7 -7
- data/spec/mapping_spec.rb +128 -8
- data/spec/partitioned_repository_spec.rb +218 -0
- data/spec/query_conditions_spec.rb +98 -45
- data/spec/query_spec.rb +21 -28
- data/spec/repository_spec.rb +245 -0
- data/spec/results_spec.rb +0 -4
- data/spec/sample_responses/elasticsearch_bulk_response_1.json +35 -0
- data/spec/sample_responses/elasticsearch_bulk_response_2.json +20 -0
- data/spec/sample_responses/elasticsearch_count_1.json +8 -0
- data/spec/sample_responses/elasticsearch_count_2.json +8 -0
- data/spec/sample_responses/elasticsearch_get_response_1.json +10 -0
- data/spec/sample_responses/elasticsearch_get_response_2.json +6 -0
- data/spec/{elasticsearch_hit_1.json → sample_responses/elasticsearch_hit_1.json} +0 -0
- data/spec/sample_responses/elasticsearch_mget_response_1.json +25 -0
- data/spec/{elasticsearch_response_1.json → sample_responses/elasticsearch_response_1.json} +0 -0
- data/spec/{elasticsearch_response_2.json → sample_responses/elasticsearch_response_2.json} +0 -0
- data/spec/{elasticsearch_top_hits_response.json → sample_responses/elasticsearch_top_hits_response.json} +0 -0
- data/spec/spec_helper.rb +47 -0
- data/spec/spec_helper/fake_index_selector.rb +27 -0
- data/spec/term_field_delimiter_spec.rb +8 -8
- metadata +80 -26
- data/lib/elasticated/block_evaluation.rb +0 -15
- data/lib/elasticated/clonable.rb +0 -58
- data/lib/elasticated/configurable.rb +0 -20
- data/lib/elasticated/date_delimiter_factory.rb +0 -123
- data/lib/elasticated/delimiter_visitor.rb +0 -53
- data/lib/elasticated/inspectionable.rb +0 -9
- data/lib/elasticated/strategy_params_for_query_service.rb +0 -14
- data/lib/elasticated/term_delimiter_factory.rb +0 -73
- data/spec/delimiter_factory_spec.rb +0 -399
- data/spec/strategy_params_for_query_service_spec.rb +0 -387
@@ -2,12 +2,46 @@ module Elasticated
|
|
2
2
|
module Mapping
|
3
3
|
class ObjectBuilder < FieldsBuilder
|
4
4
|
|
5
|
+
attr_accessor :object_attributes
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
super
|
9
|
+
self.object_attributes = Hash.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_attribute(name, value)
|
13
|
+
object_attributes[name] = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def base_body
|
17
|
+
{ type: :object }
|
18
|
+
end
|
19
|
+
|
5
20
|
# override
|
6
21
|
def build_body
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
22
|
+
ret = base_body
|
23
|
+
properties = super
|
24
|
+
ret.merge! properties: properties unless properties.empty?
|
25
|
+
ret.merge! object_attributes unless object_attributes.empty?
|
26
|
+
ret
|
27
|
+
end
|
28
|
+
|
29
|
+
# 'dynamic' attribute
|
30
|
+
|
31
|
+
def dynamic(value)
|
32
|
+
add_attribute :dynamic, value
|
33
|
+
end
|
34
|
+
|
35
|
+
def strict
|
36
|
+
dynamic Enum::Mapping::Dynamic::STRICT
|
37
|
+
end
|
38
|
+
|
39
|
+
def ignore_new_fields
|
40
|
+
dynamic Enum::Mapping::Dynamic::IGNORE_NEW_FIELDS
|
41
|
+
end
|
42
|
+
|
43
|
+
def accept_new_fields
|
44
|
+
dynamic Enum::Mapping::Dynamic::ACCEPT_NEW_FIELDS
|
11
45
|
end
|
12
46
|
|
13
47
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Elasticated
|
2
|
+
module Mixins
|
3
|
+
module BlockEvaluation
|
4
|
+
|
5
|
+
def evaluate(block=nil, obj=nil)
|
6
|
+
return unless block
|
7
|
+
obj ||= self
|
8
|
+
if block.parameters.empty?
|
9
|
+
obj.instance_exec &block
|
10
|
+
else
|
11
|
+
block.call obj
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Elasticated
|
2
|
+
module Mixins
|
3
|
+
module Clonable
|
4
|
+
|
5
|
+
def clone
|
6
|
+
ret = super
|
7
|
+
instance_variables.each do |instance_variable|
|
8
|
+
value = instance_variable_get instance_variable
|
9
|
+
value = case value.class
|
10
|
+
when Array
|
11
|
+
clone_array value
|
12
|
+
when Hash
|
13
|
+
Helpers.hash_deep_dup value
|
14
|
+
else
|
15
|
+
value.clone
|
16
|
+
end
|
17
|
+
ret.instance_variable_set instance_variable, value
|
18
|
+
end
|
19
|
+
ret
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(other_entity)
|
23
|
+
other_entity.class == self.class &&
|
24
|
+
instance_variables.all? do |instance_variable|
|
25
|
+
next true if instance_variable == :@_subaggregations # Subaggregated
|
26
|
+
value = instance_variable_get instance_variable
|
27
|
+
other_value = other_entity.instance_variable_get instance_variable
|
28
|
+
case other_value.class
|
29
|
+
when Array
|
30
|
+
compare_arrays value, other_value
|
31
|
+
else
|
32
|
+
other_value == value
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def clone_array(array)
|
40
|
+
array.map do |element|
|
41
|
+
case element.class
|
42
|
+
when Hash
|
43
|
+
Helpers.hash_deep_dup element
|
44
|
+
when Array
|
45
|
+
clone_array element
|
46
|
+
else
|
47
|
+
element.clone
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def compare_arrays(array_a, array_b)
|
53
|
+
array_a.all? do |element|
|
54
|
+
array_b.include? element
|
55
|
+
end && array_a.size == array_b.size
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Elasticated
|
2
|
+
module Mixins
|
3
|
+
module Configurable
|
4
|
+
|
5
|
+
def self.delegated(attr_name)
|
6
|
+
define_method attr_name do
|
7
|
+
instance_variable_get("@#{attr_name}") || Configuration.send(attr_name)
|
8
|
+
end
|
9
|
+
define_method "#{attr_name}=" do |value|
|
10
|
+
instance_variable_set "@#{attr_name}", value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
delegated :logger
|
15
|
+
alias_method :log, :logger
|
16
|
+
delegated :scroll_expiration_time
|
17
|
+
delegated :scroll_page_size
|
18
|
+
delegated :search_page_size
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Elasticated
|
2
|
+
module Mixins
|
3
|
+
module Inspectionable
|
4
|
+
|
5
|
+
def inspect(show_original=false)
|
6
|
+
return super() if show_original
|
7
|
+
"#<#{self.class.name}:#{text_for_inspect}>"
|
8
|
+
end
|
9
|
+
|
10
|
+
def text_for_inspect
|
11
|
+
build.to_json # default implementation
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -13,34 +13,40 @@ module Elasticated
|
|
13
13
|
client.refresh_indices affected_indices
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
super(query, {delimit_by: [:conditions, :aggregations]}.merge(opts))
|
16
|
+
def affected_indices_for(query)
|
17
|
+
index_selector.indices_for_query(query)
|
19
18
|
end
|
20
19
|
|
21
|
-
|
20
|
+
def affected_index_for(user_params)
|
21
|
+
index_params = user_params.delete(:index_for)
|
22
|
+
index_params || raise("The index selection parameters should be specified in the missing 'index_for' option")
|
23
|
+
index_selector.index_for_params index_params
|
24
|
+
end
|
25
|
+
|
26
|
+
def params_for_document(document, original_params={})
|
27
|
+
affected_index = index_selector.index_for_document document
|
28
|
+
original_params.merge index: affected_index
|
29
|
+
end
|
22
30
|
|
23
|
-
|
24
|
-
|
25
|
-
affected_indices = affected_indices_for query, opts
|
31
|
+
def params_for_query(query, original_params={})
|
32
|
+
affected_indices = affected_indices_for query
|
26
33
|
affected_indices = affected_indices*','
|
27
|
-
|
34
|
+
original_params.merge index: affected_indices
|
28
35
|
end
|
29
36
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
super action, document, opts.merge(index: affected_index)
|
37
|
+
def params_for_source(source, original_params={})
|
38
|
+
affected_index = affected_index_for original_params
|
39
|
+
original_params.merge index: affected_index
|
34
40
|
end
|
35
41
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
super action, query, opts.merge(index: affected_index)
|
42
|
+
def params_for_ids(ids, original_params={})
|
43
|
+
affected_index = affected_index_for original_params
|
44
|
+
original_params.merge index: affected_index
|
40
45
|
end
|
41
46
|
|
42
|
-
def
|
43
|
-
index_selector.
|
47
|
+
def params_for_percolator(original_params={})
|
48
|
+
affected_index = index_selector.index_for_percolator
|
49
|
+
original_params.merge index: affected_index
|
44
50
|
end
|
45
51
|
|
46
52
|
end
|
data/lib/elasticated/query.rb
CHANGED
@@ -9,8 +9,9 @@ module Elasticated
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
include
|
13
|
-
include
|
12
|
+
include Mixins::Clonable
|
13
|
+
include Mixins::BlockEvaluation
|
14
|
+
include Mixins::Inspectionable
|
14
15
|
|
15
16
|
attr_accessor :_conditions, :_filter_conditions, :_post_conditions
|
16
17
|
attr_accessor :_source, :_sort, :_size, :_from
|
@@ -53,35 +54,38 @@ module Elasticated
|
|
53
54
|
end
|
54
55
|
alias_method :offset, :from
|
55
56
|
|
56
|
-
def
|
57
|
+
def sort(field, method=nil)
|
57
58
|
self._sort ||= Array.new
|
58
|
-
_sort <<
|
59
|
+
_sort << { field => { order: method || :asc } }
|
59
60
|
self
|
60
61
|
end
|
61
62
|
|
62
|
-
def sort(field, method=nil)
|
63
|
-
custom_sort(field => { order: method || :asc })
|
64
|
-
end
|
65
|
-
alias_method :sort_by_field, :sort
|
66
|
-
|
67
|
-
def sort_by_script(script_hash)
|
68
|
-
custom_sort(_script: script_hash)
|
69
|
-
end
|
70
|
-
|
71
63
|
def sort_randomly
|
72
|
-
|
64
|
+
self._sort ||= Array.new
|
65
|
+
_sort << { _script: { script: "Math.random()", type: "number" } }
|
66
|
+
self
|
73
67
|
end
|
74
68
|
|
75
69
|
def source(*fields_array)
|
76
|
-
|
70
|
+
if fields_array.count == 1 && fields_array.first == false
|
71
|
+
no_source
|
72
|
+
else
|
73
|
+
self._source = fields_array.flatten
|
74
|
+
end
|
77
75
|
self
|
78
76
|
end
|
79
77
|
alias_method :fields, :source
|
80
78
|
|
79
|
+
def no_source
|
80
|
+
self._source = false
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
81
84
|
def aggregations(&block)
|
82
85
|
_aggregations.evaluate block
|
83
86
|
self
|
84
87
|
end
|
88
|
+
alias_method :aggs, :aggregations
|
85
89
|
|
86
90
|
# misc getters
|
87
91
|
|
@@ -93,7 +97,7 @@ module Elasticated
|
|
93
97
|
!_size || _size > repository.search_page_size
|
94
98
|
end
|
95
99
|
|
96
|
-
def
|
100
|
+
def offset?
|
97
101
|
_from && _from > 0
|
98
102
|
end
|
99
103
|
|
@@ -127,7 +131,7 @@ module Elasticated
|
|
127
131
|
ret.merge! sort: _sort if _sort
|
128
132
|
ret.merge! size: _size if _size
|
129
133
|
ret.merge! from: _from if _from
|
130
|
-
ret.merge! _source: _source
|
134
|
+
ret.merge! _source: _source unless _source.nil? # source can be false
|
131
135
|
ret
|
132
136
|
end
|
133
137
|
|
@@ -143,6 +147,7 @@ module Elasticated
|
|
143
147
|
ret
|
144
148
|
end
|
145
149
|
alias_method :build, :build_for_aggregated_search
|
150
|
+
alias_method :to_h, :build_for_aggregated_search
|
146
151
|
|
147
152
|
# parse methods
|
148
153
|
|
@@ -150,10 +155,11 @@ module Elasticated
|
|
150
155
|
_aggregations.parse response
|
151
156
|
end
|
152
157
|
|
153
|
-
#
|
154
|
-
|
155
|
-
def
|
156
|
-
|
158
|
+
# delimiters
|
159
|
+
|
160
|
+
def fill_delimiter(field_delimiter)
|
161
|
+
_conditions.fill_delimiter field_delimiter
|
162
|
+
_filter_conditions.fill_delimiter field_delimiter
|
157
163
|
end
|
158
164
|
|
159
165
|
# conditions & filter shorthands
|
@@ -4,8 +4,9 @@ module Elasticated
|
|
4
4
|
extend Forwardable
|
5
5
|
def_delegators :@_aggregations, :first, :one?, :empty?
|
6
6
|
|
7
|
-
include Clonable
|
8
|
-
include BlockEvaluation
|
7
|
+
include Mixins::Clonable
|
8
|
+
include Mixins::BlockEvaluation
|
9
|
+
include Mixins::Inspectionable
|
9
10
|
|
10
11
|
attr_accessor :_aggregations
|
11
12
|
|
@@ -27,19 +28,16 @@ module Elasticated
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
30
|
-
def merge!
|
31
|
+
def merge! other_query_aggs
|
31
32
|
other_query_aggs._aggregations.each do |other_aggregation|
|
32
33
|
add_aggregation other_aggregation
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
36
|
-
def accept_visitor(visitor)
|
37
|
-
visitor.visit_query_aggregations(self)
|
38
|
-
end
|
39
|
-
|
40
37
|
private
|
41
38
|
|
42
39
|
def get_aggregation_class(agg_name)
|
40
|
+
return GroupAggregation if agg_name.to_s == 'terms'
|
43
41
|
camel_case_name = Helpers.string_to_camel_case agg_name.to_s
|
44
42
|
self.class.const_get("::Elasticated::#{camel_case_name}Aggregation") rescue nil
|
45
43
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module Elasticated
|
2
2
|
class QueryConditions
|
3
3
|
|
4
|
-
include Clonable
|
4
|
+
include Mixins::Clonable
|
5
|
+
include Mixins::Inspectionable
|
5
6
|
|
6
7
|
attr_accessor :_must, :_must_not, :_should, :_minimum_should_match, :_cache
|
7
8
|
|
@@ -11,8 +12,10 @@ module Elasticated
|
|
11
12
|
self._should = BooleanClause.new
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
# delimiters
|
16
|
+
|
17
|
+
def fill_delimiter(field_delimiter)
|
18
|
+
_must.fill_delimiter field_delimiter
|
16
19
|
end
|
17
20
|
|
18
21
|
# conditions
|
@@ -1,9 +1,17 @@
|
|
1
1
|
module Elasticated
|
2
2
|
class Repository
|
3
|
-
include Configurable
|
4
|
-
|
5
|
-
#
|
6
|
-
# child can implement
|
3
|
+
include Mixins::Configurable
|
4
|
+
|
5
|
+
# PRE-ACTION METHODS ----------------------------------------------------------
|
6
|
+
# child can implement params_for_document(document, original_params={}) => Hash
|
7
|
+
# child can implement params_for_query(query, original_params={}) => Hash
|
8
|
+
# child can implement params_for_source(source, original_params={}) => Hash
|
9
|
+
# child can implement params_for_ids(ids, original_params={}) => Hash
|
10
|
+
# child can implement params_for_percolator(original_params={}) => Hash
|
11
|
+
# POST-ACTION METHODS ---------------------------------------------------------
|
12
|
+
# child can implement prepare_source(source) => Hash
|
13
|
+
# child can implement restore_source(source) => Hash
|
14
|
+
# -----------------------------------------------------------------------------
|
7
15
|
|
8
16
|
attr_accessor :client
|
9
17
|
|
@@ -12,76 +20,136 @@ module Elasticated
|
|
12
20
|
end
|
13
21
|
|
14
22
|
def execute_search(query, opts={})
|
15
|
-
|
23
|
+
prepare_query_action :search, query, opts
|
16
24
|
end
|
17
25
|
|
18
26
|
def execute_aggregations(query, opts={})
|
19
|
-
|
27
|
+
prepare_query_action :aggregations, query, opts
|
20
28
|
end
|
21
29
|
|
22
30
|
def execute_count(query, opts={})
|
23
|
-
|
31
|
+
prepare_query_action :count, query, opts
|
24
32
|
end
|
25
33
|
|
26
34
|
def execute_aggregated_search(query, opts={})
|
27
|
-
|
35
|
+
prepare_query_action :aggregated_search, query, opts
|
28
36
|
end
|
29
37
|
|
30
|
-
def
|
31
|
-
|
38
|
+
def delete_by_query(query, opts={})
|
39
|
+
prepare_query_action :delete_by_query, query, opts
|
32
40
|
end
|
41
|
+
alias_method :delete_by, :delete_by_query
|
33
42
|
|
34
43
|
def exists?(query, opts={})
|
35
44
|
execute_count(query, opts) > 0
|
36
45
|
end
|
37
46
|
|
38
47
|
def index_document(document, opts={})
|
39
|
-
|
48
|
+
prepare_document_action :index_document, document, opts
|
40
49
|
end
|
41
50
|
|
42
|
-
def update_document(
|
43
|
-
|
51
|
+
def update_document(document_id, opts={})
|
52
|
+
source = opts.delete(:source) || raise("No body specified for partial update")
|
53
|
+
prepare_source_action :update_document, source, opts.merge(id: document_id)
|
44
54
|
end
|
45
55
|
|
46
56
|
def create_percolator(query, opts={})
|
47
|
-
|
57
|
+
prepare_query_action :prepare_percolator_action, query, opts
|
58
|
+
end
|
59
|
+
|
60
|
+
def percolate_document(document, opts={})
|
61
|
+
prepare_document_action :prepare_percolator_action, document, opts
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_document(document_id_or_ids, opts={})
|
65
|
+
prepare_ids_action :variable_get, Array(document_id_or_ids), opts
|
48
66
|
end
|
67
|
+
alias_method :get_documents, :get_document
|
49
68
|
|
50
|
-
def
|
51
|
-
|
69
|
+
def delete_document(document_id, opts={})
|
70
|
+
prepare_ids_action :delete_document, Array(document_id), opts
|
52
71
|
end
|
53
72
|
|
54
73
|
def prepare_search(query, opts={})
|
55
|
-
|
74
|
+
prepare_query_action :prepare_search, query, opts
|
56
75
|
end
|
57
76
|
|
58
77
|
def restore_search(scroll_id)
|
59
78
|
ResumableSearch.from_scroll_id self, scroll_id
|
60
79
|
end
|
61
80
|
|
62
|
-
|
81
|
+
def prepare_bulk(&block)
|
82
|
+
BulkRequest.build_over(self, &block)
|
83
|
+
end
|
63
84
|
|
64
|
-
|
85
|
+
def execute_bulk(bulk_request)
|
86
|
+
result = client.bulk bulk_request.build
|
87
|
+
bulk_request.parse result
|
88
|
+
end
|
89
|
+
|
90
|
+
# params preparation
|
91
|
+
|
92
|
+
def params_for_document(document, original_params={})
|
93
|
+
original_params
|
94
|
+
end
|
65
95
|
|
66
|
-
def
|
67
|
-
|
96
|
+
def params_for_query(query, original_params={})
|
97
|
+
original_params
|
68
98
|
end
|
69
99
|
|
70
|
-
def
|
71
|
-
|
100
|
+
def params_for_source(source, original_params={})
|
101
|
+
original_params
|
72
102
|
end
|
73
103
|
|
74
|
-
def
|
104
|
+
def params_for_ids(ids, original_params={})
|
105
|
+
original_params
|
106
|
+
end
|
107
|
+
|
108
|
+
def params_for_percolator(original_params={})
|
109
|
+
original_params
|
110
|
+
end
|
111
|
+
|
112
|
+
# document translation
|
113
|
+
|
114
|
+
def prepare_source(source)
|
115
|
+
source
|
116
|
+
end
|
117
|
+
|
118
|
+
def restore_source(source)
|
119
|
+
source
|
120
|
+
end
|
121
|
+
|
122
|
+
def prepare_document(document)
|
123
|
+
params = params_for_document document
|
124
|
+
translated_document = document.clone
|
125
|
+
translated_document.source = prepare_source Helpers.hash_deep_dup document.source
|
126
|
+
translated_document.index = params[:index] if params[:index]
|
127
|
+
translated_document.type = params[:type] if params[:type]
|
128
|
+
translated_document
|
129
|
+
end
|
130
|
+
|
131
|
+
protected
|
132
|
+
|
133
|
+
# write actions
|
134
|
+
|
135
|
+
def _exec_index_document(document, opts={})
|
75
136
|
opts.merge! id: document.id if document.id
|
76
137
|
opts.merge! type: document.type unless opts[:type]
|
77
138
|
opts.merge! index: document.index unless opts[:index]
|
78
|
-
document.index = opts[:index]
|
79
|
-
document.type = opts[:type]
|
80
|
-
client.
|
139
|
+
document.index = opts[:index] || raise("A target index should be specified in a indexation")
|
140
|
+
document.type = opts[:type] || raise("A target type should be specified in a indexation")
|
141
|
+
client.index_document document.source, opts
|
142
|
+
end
|
143
|
+
|
144
|
+
def _exec_update_document(source, opts={})
|
145
|
+
opts[:index] || raise("A target index should be specified in a partial update")
|
146
|
+
opts[:type] || raise("A target type should be specified in a partial update")
|
147
|
+
opts[:id] || raise("A target document id should be specified in a partial update")
|
148
|
+
client.update_document source, opts
|
81
149
|
end
|
82
150
|
|
83
151
|
def _exec_create_percolator(query, opts={})
|
84
|
-
query_source = query.
|
152
|
+
query_source = query.build_for_count
|
85
153
|
client.create_percolator query_source, opts
|
86
154
|
end
|
87
155
|
|
@@ -107,8 +175,9 @@ module Elasticated
|
|
107
175
|
_exec_paginated_search query, query.aggregated?, opts
|
108
176
|
end
|
109
177
|
|
110
|
-
def
|
111
|
-
|
178
|
+
def _exec_delete_by_query(query, opts={})
|
179
|
+
body = query.build_for_count
|
180
|
+
client.delete_by_query body, opts
|
112
181
|
end
|
113
182
|
|
114
183
|
def _exec_paginated_search(query, aggregated, opts={})
|
@@ -134,30 +203,105 @@ module Elasticated
|
|
134
203
|
|
135
204
|
def _exec_prepare_search(query, opts={})
|
136
205
|
raise "The query for a resumable search should not have the parameter 'size'" if query.limited? || opts[:size]
|
137
|
-
raise "The query for a resumable search should not have the parameter 'from'" if query.
|
206
|
+
raise "The query for a resumable search should not have the parameter 'from'" if query.offset? || opts[:from]
|
138
207
|
ResumableSearch.new self, query, false, opts
|
139
208
|
end
|
140
209
|
|
141
|
-
def
|
142
|
-
document_source = document.
|
210
|
+
def _exec_percolate_document(document, opts={})
|
211
|
+
document_source = document.source
|
143
212
|
client.percolate document_source, opts
|
144
213
|
end
|
145
214
|
|
146
|
-
|
215
|
+
def _exec_get_document(document_id, opts={})
|
216
|
+
result = client.get_document document_id, opts
|
217
|
+
return nil unless result['found']
|
218
|
+
document = Document.parse result
|
219
|
+
prepare_served_document document
|
220
|
+
end
|
221
|
+
|
222
|
+
def _exec_get_documents(documents_ids, opts={})
|
223
|
+
result = client.get_documents documents_ids, opts
|
224
|
+
result['docs'].map do |e|
|
225
|
+
document = Document.parse e
|
226
|
+
prepare_served_document document
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def _exec_variable_get(documents_ids, opts={})
|
231
|
+
if documents_ids.empty?
|
232
|
+
raise "At least one document id must be specified for a get"
|
233
|
+
elsif documents_ids.count == 1
|
234
|
+
_exec_get_document documents_ids.first, opts
|
235
|
+
else
|
236
|
+
_exec_get_documents documents_ids, opts
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def _exec_delete_document(documents_ids, opts={})
|
241
|
+
raise "Not more than one document delete per time allowed" unless documents_ids.count == 1
|
242
|
+
client.delete_document documents_ids.first, opts
|
243
|
+
end
|
244
|
+
|
245
|
+
# pre-action methods
|
246
|
+
|
247
|
+
def prepare_source_action(action, source, opts={})
|
248
|
+
# child's implementation here
|
249
|
+
# child's implementation must end with a 'super' call
|
250
|
+
prepared_source = prepare_source Helpers.hash_deep_dup source
|
251
|
+
prepared_params = params_for_source source, opts
|
252
|
+
send "_exec_#{action}", prepared_source, prepared_params
|
253
|
+
end
|
254
|
+
|
255
|
+
def prepare_ids_action(action, documents_ids, opts={})
|
256
|
+
# child's implementation here
|
257
|
+
# child's implementation must end with a 'super' call
|
258
|
+
prepared_params = params_for_ids documents_ids, opts
|
259
|
+
send "_exec_#{action}", documents_ids, prepared_params
|
260
|
+
end
|
261
|
+
|
262
|
+
def prepare_query_action(action, query, opts={})
|
263
|
+
# child's implementation here
|
264
|
+
# child's implementation must end with a 'super' call
|
265
|
+
prepared_params = params_for_query query, opts
|
266
|
+
return prepare_percolator_action(:create_percolator, query, prepared_params) if percolator_action?(action)
|
267
|
+
send "_exec_#{action}", query, prepared_params
|
268
|
+
end
|
269
|
+
|
270
|
+
def prepare_document_action(action, document, opts={})
|
271
|
+
# child's implementation here
|
272
|
+
# child's implementation must end with a 'super' call
|
273
|
+
prepared_params = params_for_document document, opts
|
274
|
+
prepared_document = prepare_document document
|
275
|
+
return prepare_percolator_action :percolate_document, prepared_document, prepared_params if percolator_action? action
|
276
|
+
send "_exec_#{action}", prepared_document, prepared_params
|
277
|
+
end
|
147
278
|
|
148
|
-
def
|
279
|
+
def prepare_percolator_action(action, doc_or_query, opts={})
|
149
280
|
# child's implementation here
|
150
|
-
|
281
|
+
# child's implementation must end with a 'super' call
|
282
|
+
# DO NOT TOUCH THE DOC OR QUERY HERE! use prepare_query_action or prepare_document_action
|
283
|
+
prepared_params = params_for_percolator opts
|
284
|
+
send "_exec_#{action}", doc_or_query, prepared_params
|
151
285
|
end
|
152
286
|
|
153
|
-
|
287
|
+
# post-action methods
|
288
|
+
|
289
|
+
def prepare_served_document(document)
|
154
290
|
# child's implementation here
|
155
|
-
|
291
|
+
document.source = restore_source document.source
|
292
|
+
document
|
156
293
|
end
|
157
294
|
|
158
|
-
def
|
295
|
+
def prepare_served_results(results)
|
159
296
|
# child's implementation here
|
160
|
-
|
297
|
+
results.documents.each{ |document| prepare_served_document document }
|
298
|
+
results
|
299
|
+
end
|
300
|
+
|
301
|
+
# misc
|
302
|
+
|
303
|
+
def percolator_action?(action)
|
304
|
+
action == :prepare_percolator_action
|
161
305
|
end
|
162
306
|
|
163
307
|
end
|