elastomer-client 2.3.0 → 3.0.0
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/.gitignore +2 -0
- data/.travis.yml +0 -4
- data/CHANGELOG.md +8 -0
- data/docker/docker-compose.cibuild.yml +8 -0
- data/docker/docker-compose.es24.yml +34 -0
- data/docker/docker-compose.es56.yml +37 -0
- data/docker/elasticsearch.yml +15 -0
- data/docs/index.md +2 -2
- data/docs/notifications.md +1 -1
- data/elastomer-client.gemspec +2 -0
- data/lib/elastomer/client.rb +86 -33
- data/lib/elastomer/client/app_delete_by_query.rb +158 -0
- data/lib/elastomer/client/delete_by_query.rb +8 -115
- data/lib/elastomer/client/docs.rb +63 -13
- data/lib/elastomer/client/errors.rb +10 -2
- data/lib/elastomer/client/index.rb +40 -12
- data/lib/elastomer/client/multi_percolate.rb +2 -2
- data/lib/elastomer/client/native_delete_by_query.rb +60 -0
- data/lib/elastomer/client/percolator.rb +6 -3
- data/lib/elastomer/client/scroller.rb +22 -7
- data/lib/elastomer/client/tasks.rb +188 -0
- data/lib/elastomer/client/warmer.rb +6 -0
- data/lib/elastomer/notifications.rb +1 -0
- data/lib/elastomer/version.rb +1 -1
- data/lib/elastomer/version_support.rb +177 -0
- data/script/cibuild +77 -6
- data/script/cibuild-elastomer-client +1 -0
- data/script/cibuild-elastomer-client-es24 +8 -0
- data/script/cibuild-elastomer-client-es56 +8 -0
- data/script/poll-for-es +20 -0
- data/test/client/{delete_by_query_test.rb → app_delete_by_query_test.rb} +7 -7
- data/test/client/bulk_test.rb +9 -13
- data/test/client/cluster_test.rb +2 -2
- data/test/client/docs_test.rb +133 -49
- data/test/client/errors_test.rb +21 -1
- data/test/client/es_5_x_warmer_test.rb +13 -0
- data/test/client/index_test.rb +104 -39
- data/test/client/multi_percolate_test.rb +13 -6
- data/test/client/multi_search_test.rb +5 -5
- data/test/client/native_delete_by_query_test.rb +123 -0
- data/test/client/nodes_test.rb +1 -1
- data/test/client/percolator_test.rb +10 -2
- data/test/client/repository_test.rb +1 -1
- data/test/client/scroller_test.rb +16 -6
- data/test/client/snapshot_test.rb +1 -1
- data/test/client/stubbed_client_test.rb +1 -1
- data/test/client/tasks_test.rb +139 -0
- data/test/client/template_test.rb +1 -1
- data/test/client/warmer_test.rb +8 -4
- data/test/client_test.rb +99 -0
- data/test/core_ext/time_test.rb +1 -1
- data/test/notifications_test.rb +4 -0
- data/test/test_helper.rb +129 -21
- data/test/version_support_test.rb +119 -0
- metadata +59 -5
@@ -23,10 +23,8 @@ module Elastomer
|
|
23
23
|
Scroller.new(self, query, opts)
|
24
24
|
end
|
25
25
|
|
26
|
-
# DEPRECATED in ES 2.1.0 - use a Scroll query sorted by _doc: https://www.elastic.co/guide/en/elasticsearch/reference/2.3/search-request-search-type.html#scan
|
27
|
-
#
|
28
26
|
# Create a new Scroller instance for scrolling all results from a `query`
|
29
|
-
# via "scan" semantics.
|
27
|
+
# via "scan" semantics by sorting by _doc.
|
30
28
|
#
|
31
29
|
# query - The query to scan as a Hash or a JSON encoded String
|
32
30
|
# opts - Options Hash
|
@@ -45,8 +43,7 @@ module Elastomer
|
|
45
43
|
#
|
46
44
|
# Returns a new Scroller instance
|
47
45
|
def scan( query, opts = {} )
|
48
|
-
|
49
|
-
Scroller.new(self, query, opts)
|
46
|
+
Scroller.new(self, add_sort_by_doc(query), opts)
|
50
47
|
end
|
51
48
|
|
52
49
|
# Begin scrolling a query.
|
@@ -99,7 +96,7 @@ module Elastomer
|
|
99
96
|
#
|
100
97
|
# Returns the response body as a Hash.
|
101
98
|
def continue_scroll( scroll_id, scroll = "5m" )
|
102
|
-
response = get "/_search/scroll", :body => scroll_id, :scroll => scroll, :action => "search.scroll"
|
99
|
+
response = get "/_search/scroll", :body => {:scroll_id => scroll_id}, :scroll => scroll, :action => "search.scroll"
|
103
100
|
response.body
|
104
101
|
rescue RequestError => err
|
105
102
|
if err.error && err.error["caused_by"]["type"] == "search_context_missing_exception"
|
@@ -120,7 +117,25 @@ module Elastomer
|
|
120
117
|
response.body
|
121
118
|
end
|
122
119
|
|
123
|
-
|
120
|
+
# Internal: Add sort by doc to query.
|
121
|
+
#
|
122
|
+
# Raises an exception if the query contains a sort already.
|
123
|
+
# Returns the query as a hash
|
124
|
+
def add_sort_by_doc(query)
|
125
|
+
if query.nil?
|
126
|
+
query = {}
|
127
|
+
elsif query.is_a? String
|
128
|
+
query = MultiJson.load(query)
|
129
|
+
end
|
130
|
+
|
131
|
+
if query.has_key? :sort
|
132
|
+
raise ArgumentError, "Query cannot contain a sort (found sort '#{query[:sort]}' in query: #{query})"
|
133
|
+
end
|
134
|
+
|
135
|
+
query.merge(:sort => [:_doc])
|
136
|
+
end
|
137
|
+
|
138
|
+
DEFAULT_OPTS = {
|
124
139
|
:index => nil,
|
125
140
|
:type => nil,
|
126
141
|
:scroll => "5m",
|
@@ -0,0 +1,188 @@
|
|
1
|
+
module Elastomer
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns a Tasks instance for querying the cluster bound to this client for
|
5
|
+
# metadata about internal tasks in flight, and to submit administrative
|
6
|
+
# requests (like cancellation) concerning those tasks.
|
7
|
+
#
|
8
|
+
# Returns a new Tasks object associated with this client
|
9
|
+
def tasks
|
10
|
+
Tasks.new(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
class Tasks
|
14
|
+
|
15
|
+
# TODO - validate params from this whitelist
|
16
|
+
PARAMETERS = %i[
|
17
|
+
nodes
|
18
|
+
actions
|
19
|
+
parent_task_id
|
20
|
+
wait_for_completion
|
21
|
+
pretty
|
22
|
+
detailed
|
23
|
+
timeout
|
24
|
+
group_by
|
25
|
+
].to_set.freeze
|
26
|
+
|
27
|
+
# Create a new Tasks for introspecting on internal cluster activity.
|
28
|
+
# More context: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/tasks.html
|
29
|
+
#
|
30
|
+
# client - Elastomer::Client used for HTTP requests to the server
|
31
|
+
#
|
32
|
+
# Raises IncompatibleVersionException if caller attempts to access Tasks API on ES version < 5.0.0
|
33
|
+
def initialize(client)
|
34
|
+
@client = client
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_reader :client
|
38
|
+
|
39
|
+
# Fetch results from the generic _tasks endpoint.
|
40
|
+
#
|
41
|
+
# params - Hash of request parameters, including:
|
42
|
+
#
|
43
|
+
# Examples
|
44
|
+
#
|
45
|
+
# tasks.get
|
46
|
+
# tasks.get :nodes => "DmteLdw1QmSgW3GZmjmoKA,DmteLdw1QmSgW3GZmjmoKB", :actions => "cluster:*", :detailed => true
|
47
|
+
#
|
48
|
+
# Examples (ES 5+ only)
|
49
|
+
#
|
50
|
+
# tasks.get :group_by => "parents"
|
51
|
+
# tasks.get :group_by => "parents", :actions => "*reindex", ...
|
52
|
+
#
|
53
|
+
# Returns the response body as a Hash
|
54
|
+
def get(params = {})
|
55
|
+
response = client.get "/_tasks", params
|
56
|
+
response.body
|
57
|
+
end
|
58
|
+
|
59
|
+
# Fetch results from the _tasks endpoint for a particular cluster node and task ID.
|
60
|
+
# NOTE: the API docs note the behavior wrong for this call; "task_id:<task_id>" is really "<node_id>:<task_id>"
|
61
|
+
# where "node_id" is a value from the "nodes" hash returned from the /_tasks endpoint, and "task_id" is
|
62
|
+
# from the "tasks" child hash of any of the "nodes" entries of the /_tasks endpoint
|
63
|
+
#
|
64
|
+
# node_id - the name of the ES cluster node hosting the target task
|
65
|
+
# task_id - the numerical ID of the task to return data about in the response
|
66
|
+
# params - Hash of request parameters to include
|
67
|
+
#
|
68
|
+
# Examples
|
69
|
+
#
|
70
|
+
# tasks.get_by_id "DmteLdw1QmSgW3GZmjmoKA", 123
|
71
|
+
# tasks.get_by_id "DmteLdw1QmSgW3GZmjmoKA", 456, :pretty => true
|
72
|
+
#
|
73
|
+
# Returns the response body as a Hash
|
74
|
+
def get_by_id(node_id, task_id, params = {})
|
75
|
+
raise ArgumentError, "invalid node ID provided: #{node_id.inspect}" if node_id.to_s.empty?
|
76
|
+
raise ArgumentError, "invalid task ID provided: #{task_id.inspect}" unless task_id.is_a?(Integer)
|
77
|
+
|
78
|
+
# in this API, the task ID is included in the path, not as a request parameter.
|
79
|
+
response = client.get "/_tasks/#{node_id}:#{task_id}", params
|
80
|
+
response.body
|
81
|
+
end
|
82
|
+
|
83
|
+
# Fetch task details for all child tasks of the specified parent task.
|
84
|
+
# NOTE: the API docs note the behavior wrong for this call: "parentTaskId:<task_id>"
|
85
|
+
# is not the correct syntax for the parent_task_id param value. The correct
|
86
|
+
# value syntax is "<parent_node_id>:<parent_task_id>"
|
87
|
+
#
|
88
|
+
# parent_node_id - ID of the node the parent task is hosted by
|
89
|
+
# parent_task_id - ID of a parent task who's child tasks' data will be returned in the response
|
90
|
+
# params - Hash of request parameters to include
|
91
|
+
#
|
92
|
+
# Examples
|
93
|
+
#
|
94
|
+
# tasks.get_by_parent_id "DmteLdw1QmSgW3GZmjmoKA", 123
|
95
|
+
# tasks.get_by_parent_id "DmteLdw1QmSgW3GZmjmoKB", 456, :detailed => true
|
96
|
+
#
|
97
|
+
# Returns the response body as a Hash
|
98
|
+
def get_by_parent_id(parent_node_id, parent_task_id, params = {})
|
99
|
+
raise ArgumentError, "invalid parent node ID provided: #{parent_node_id.inspect}" if node_id.to_s.empty?
|
100
|
+
raise ArgumentError, "invalid parent task ID provided: #{parent_task_id.inspect}" unless parent_task_id.is_a?(Integer)
|
101
|
+
|
102
|
+
# in this API, we pass the parent task ID as a formatted parameter in a request to the _tasks endpoint
|
103
|
+
formatted_parent = { :parent_task_id => "#{parent_node_id}:#{parent_task_id}" }
|
104
|
+
response = client.get "/_tasks", params.merge(formatted_parent)
|
105
|
+
response.body
|
106
|
+
end
|
107
|
+
|
108
|
+
# Wait for the specified amount of time (10 seconds by default) for some task(s) to complete.
|
109
|
+
# Filters for task(s) to wait upon using same filter params as Tasks#get(params)
|
110
|
+
#
|
111
|
+
# timeout - maximum time to wait for target task to complete before returning, example: "5s"
|
112
|
+
# params - Hash of request params to include (mostly task filters in this context)
|
113
|
+
#
|
114
|
+
# Examples
|
115
|
+
#
|
116
|
+
# tasks.wait_for "5s", :actions => "*health"
|
117
|
+
# tasks.wait_for("30s", :actions => "*reindex", :nodes => "DmteLdw1QmSgW3GZmjmoKA,DmteLdw1QmSgW3GZmjmoKB")
|
118
|
+
#
|
119
|
+
# Returns the response body as a Hash when timeout expires or target tasks complete
|
120
|
+
# COMPATIBILITY WARNING: the response body differs between ES versions for this API
|
121
|
+
def wait_for(timeout = "10s", params = {})
|
122
|
+
params_with_wait = params.merge({ :wait_for_completion => true, :timeout => timeout })
|
123
|
+
self.get(params_with_wait)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Wait for the specified amount of time (10 seconds by default) for some task(s) to complete.
|
127
|
+
# Filters for task(s) to wait upon using same IDs and filter params as Tasks#get_by_id(params)
|
128
|
+
#
|
129
|
+
# node_id - the ID of the node on which the target task is hosted
|
130
|
+
# task_id - the ID of the task to wait on
|
131
|
+
# timeout - time for call to await target tasks completion before returning
|
132
|
+
# params - Hash of request params to include (mostly task filters in this context)
|
133
|
+
#
|
134
|
+
# Examples
|
135
|
+
#
|
136
|
+
# tasks.wait_by_id "DmteLdw1QmSgW3GZmjmoKA", 123, "15s"
|
137
|
+
# tasks.wait_by_id "DmteLdw1QmSgW3GZmjmoKA", 456, "30s", :actions => "*search"
|
138
|
+
#
|
139
|
+
# Returns the response body as a Hash when timeout expires or target tasks complete
|
140
|
+
def wait_by_id(node_id, task_id, timeout = "10s", params = {})
|
141
|
+
raise ArgumentError, "invalid node ID provided: #{node_id.inspect}" if node_id.to_s.empty?
|
142
|
+
raise ArgumentError, "invalid task ID provided: #{task_id.inspect}" unless task_id.is_a?(Integer)
|
143
|
+
|
144
|
+
params_with_wait = params.merge({ :wait_for_completion => true, :timeout => timeout })
|
145
|
+
self.get_by_id(node_id, task_id, params_with_wait)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Cancels a task running on a particular node.
|
149
|
+
# NOTE: the API docs note the behavior wrong for this call; "task_id:<task_id>" is really "<node_id>:<task_id>"
|
150
|
+
# where "node_id" is a value from the "nodes" hash returned from the /_tasks endpoint, and "task_id" is
|
151
|
+
# from the "tasks" child hash of any of the "nodes" entries of the /_tasks endpoint
|
152
|
+
#
|
153
|
+
# node_id - the ES node hosting the task to be cancelled
|
154
|
+
# task_id - ID of the task to be cancelled
|
155
|
+
# params - Hash of request parameters to include
|
156
|
+
#
|
157
|
+
# Examples
|
158
|
+
#
|
159
|
+
# tasks.cancel_by_id "DmteLdw1QmSgW3GZmjmoKA", 123
|
160
|
+
# tasks.cancel_by_id "DmteLdw1QmSgW3GZmjmoKA", 456, :pretty => true
|
161
|
+
#
|
162
|
+
# Returns the response body as a Hash
|
163
|
+
def cancel_by_id(node_id, task_id, params = {})
|
164
|
+
raise ArgumentError, "invalid node ID provided: #{node_id.inspect}" if node_id.to_s.empty?
|
165
|
+
raise ArgumentError, "invalid task ID provided: #{task_id.inspect}" unless task_id.is_a?(Integer)
|
166
|
+
|
167
|
+
response = client.post "/_tasks/#{node_id}:#{task_id}/_cancel", params
|
168
|
+
response.body
|
169
|
+
end
|
170
|
+
|
171
|
+
# Cancels a task or group of tasks using various filtering parameters.
|
172
|
+
#
|
173
|
+
# params - Hash of request parameters to include
|
174
|
+
#
|
175
|
+
# Examples
|
176
|
+
#
|
177
|
+
# tasks.cancel :actions => "*reindex"
|
178
|
+
# tasks.cancel :actions => "*search", :nodes => "DmteLdw1QmSgW3GZmjmoKA,DmteLdw1QmSgW3GZmjmoKB,DmteLdw1QmSgW3GZmjmoKC"
|
179
|
+
#
|
180
|
+
# Returns the response body as a Hash
|
181
|
+
def cancel(params = {})
|
182
|
+
response = client.post "/_tasks/_cancel", params
|
183
|
+
response.body
|
184
|
+
end
|
185
|
+
|
186
|
+
end # end class Tasks
|
187
|
+
end # end class Client
|
188
|
+
end # end module Elastomer
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Elastomer
|
2
2
|
class Client
|
3
3
|
|
4
|
+
# DEPRECATED: Warmers have been removed from Elasticsearch as of 5.0.
|
5
|
+
# See https://www.elastic.co/guide/en/elasticsearch/reference/5.0/indices-warmers.html
|
4
6
|
class Warmer
|
5
7
|
|
6
8
|
# Create a new Warmer helper for making warmer API requests.
|
@@ -9,6 +11,10 @@ module Elastomer
|
|
9
11
|
# index_name - The name of the index as a String
|
10
12
|
# name - The name of the warmer as a String
|
11
13
|
def initialize(client, index_name, name)
|
14
|
+
unless client.version_support.supports_warmers?
|
15
|
+
raise IncompatibleVersionException, "ES #{client.version} does not support warmers"
|
16
|
+
end
|
17
|
+
|
12
18
|
@client = client
|
13
19
|
@index_name = @client.assert_param_presence(index_name, "index name")
|
14
20
|
@name = @client.assert_param_presence(name, "warmer name")
|
data/lib/elastomer/version.rb
CHANGED
@@ -0,0 +1,177 @@
|
|
1
|
+
module Elastomer
|
2
|
+
# VersionSupport holds methods that (a) encapsulate version differences; or
|
3
|
+
# (b) give an intention-revealing name to a conditional check.
|
4
|
+
class VersionSupport
|
5
|
+
COMMON_INDEXING_PARAMETER_NAMES = %i[
|
6
|
+
index
|
7
|
+
type
|
8
|
+
id
|
9
|
+
version
|
10
|
+
version_type
|
11
|
+
op_type
|
12
|
+
routing
|
13
|
+
parent
|
14
|
+
refresh
|
15
|
+
].freeze
|
16
|
+
ES_2_X_INDEXING_PARAMETER_NAMES = %i[consistency ttl timestamp].freeze
|
17
|
+
ES_5_X_INDEXING_PARAMETER_NAMES = %i[wait_for_active_shards].freeze
|
18
|
+
KNOWN_INDEXING_PARAMETER_NAMES =
|
19
|
+
(COMMON_INDEXING_PARAMETER_NAMES + ES_2_X_INDEXING_PARAMETER_NAMES + ES_5_X_INDEXING_PARAMETER_NAMES).freeze
|
20
|
+
|
21
|
+
attr_reader :version
|
22
|
+
|
23
|
+
# version - an Elasticsearch version string e.g., 2.3.5 or 5.3.0
|
24
|
+
#
|
25
|
+
# Raises ArgumentError if version is unsupported.
|
26
|
+
def initialize(version)
|
27
|
+
if version < "2.3" || version >= "5.7"
|
28
|
+
raise ArgumentError, "Elasticsearch version #{version} is not supported by elastomer-client"
|
29
|
+
end
|
30
|
+
|
31
|
+
@version = version
|
32
|
+
end
|
33
|
+
|
34
|
+
# COMPATIBILITY: Return a boolean indicating if this version supports warmers.
|
35
|
+
# Warmers were removed in ES 5.0.
|
36
|
+
def supports_warmers?
|
37
|
+
es_version_2_x?
|
38
|
+
end
|
39
|
+
|
40
|
+
# COMPATIBILITY: The Tasks API is evolving quickly; features, and request/response
|
41
|
+
# structure can differ across ES versions
|
42
|
+
def tasks_new_response_format?
|
43
|
+
es_version_5_x?
|
44
|
+
end
|
45
|
+
|
46
|
+
# COMPATIBILITY: Return a "text"-type mapping for a field.
|
47
|
+
#
|
48
|
+
# On ES 2.x, this will be a string field. On ES 5+, it will be a text field.
|
49
|
+
def text(**args)
|
50
|
+
reject_args!(args, :type, :index)
|
51
|
+
|
52
|
+
if es_version_2_x?
|
53
|
+
{type: "string"}.merge(args)
|
54
|
+
else
|
55
|
+
{type: "text"}.merge(args)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# COMPATIBILITY: Return a "keyword"-type mapping for a field.
|
60
|
+
#
|
61
|
+
# On ES 2.x, this will be a string field with not_analyzed=true. On ES 5+,
|
62
|
+
# it will be a keyword field.
|
63
|
+
def keyword(**args)
|
64
|
+
reject_args!(args, :type, :index)
|
65
|
+
|
66
|
+
if es_version_2_x?
|
67
|
+
{type: "string", index: "not_analyzed"}.merge(args)
|
68
|
+
else
|
69
|
+
{type: "keyword"}.merge(args)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Elasticsearch 2.0 changed some request formats in a non-backward-compatible
|
74
|
+
# way. Some tests need to know what version is running to structure requests
|
75
|
+
# as expected.
|
76
|
+
#
|
77
|
+
# Returns true if Elasticsearch version is 2.x.
|
78
|
+
def es_version_2_x?
|
79
|
+
version >= "2.0.0" && version < "3.0.0"
|
80
|
+
end
|
81
|
+
|
82
|
+
# Elasticsearch 5.0 changed some request formats in a non-backward-compatible
|
83
|
+
# way. Some tests need to know what version is running to structure requests
|
84
|
+
# as expected.
|
85
|
+
#
|
86
|
+
# Returns true if Elasticsearch version is 5.x.
|
87
|
+
def es_version_5_x?
|
88
|
+
version >= "5.0.0" && version < "6.0.0"
|
89
|
+
end
|
90
|
+
|
91
|
+
# Wraps version check and param gen where ES version >= 5.x requires
|
92
|
+
# percolator type + field defined in mappings
|
93
|
+
def percolator_type
|
94
|
+
if es_version_5_x?
|
95
|
+
"percolator"
|
96
|
+
else
|
97
|
+
".percolator"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# COMPATIBILITY
|
102
|
+
# ES 2.x reports query parsing exceptions as query_parse_exception whereas
|
103
|
+
# ES 5.x reports them as query_shard_exception or parsing_exception
|
104
|
+
# depending on when the error occurs.
|
105
|
+
#
|
106
|
+
# Returns an Array of Strings to match.
|
107
|
+
def query_parse_exception
|
108
|
+
if es_version_2_x?
|
109
|
+
["query_parsing_exception"]
|
110
|
+
else
|
111
|
+
["query_shard_exception", "parsing_exception"]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# COMPATIBILITY
|
116
|
+
# ES 5.X supports `delete_by_query` natively again.
|
117
|
+
alias :native_delete_by_query? :es_version_5_x?
|
118
|
+
|
119
|
+
# COMPATIBILITY
|
120
|
+
# Return a Hash of indexing request parameters that are valid for this
|
121
|
+
# version of Elasticsearch.
|
122
|
+
def indexing_directives
|
123
|
+
return @indexing_directives if defined?(@indexing_directives)
|
124
|
+
|
125
|
+
@indexing_directives = indexing_parameter_names.each_with_object({}) do |key, h|
|
126
|
+
h[key] = "_#{key}"
|
127
|
+
end
|
128
|
+
@indexing_directives.freeze
|
129
|
+
end
|
130
|
+
|
131
|
+
# COMPATIBILITY
|
132
|
+
# Return a Hash of indexing request parameters that are known to
|
133
|
+
# elastomer-client, but not supported by the current version of
|
134
|
+
# Elasticsearch.
|
135
|
+
def unsupported_indexing_directives
|
136
|
+
return @unsupported_indexing_directives if defined?(@unsupported_indexing_directives)
|
137
|
+
|
138
|
+
unsupported_keys = KNOWN_INDEXING_PARAMETER_NAMES - indexing_parameter_names
|
139
|
+
|
140
|
+
@unsupported_indexing_directives = unsupported_keys.each_with_object({}) do |key, h|
|
141
|
+
h[key] = "_#{key}"
|
142
|
+
end
|
143
|
+
@unsupported_indexing_directives.freeze
|
144
|
+
end
|
145
|
+
|
146
|
+
# COMPATIBILITY
|
147
|
+
# Return a symbol representing the best supported delete_by_query
|
148
|
+
# implementation for this version of Elasticsearch.
|
149
|
+
def delete_by_query_method
|
150
|
+
if es_version_2_x?
|
151
|
+
:app_delete_by_query
|
152
|
+
else
|
153
|
+
:native_delete_by_query
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
# Internal: Helper to reject arguments that shouldn't be passed because
|
160
|
+
# merging them in would defeat the purpose of a compatibility layer.
|
161
|
+
def reject_args!(args, *names)
|
162
|
+
names.each do |name|
|
163
|
+
if args.include?(name.to_s) || args.include?(name.to_sym)
|
164
|
+
raise ArgumentError, "Argument '#{name}' is not allowed"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def indexing_parameter_names
|
170
|
+
if es_version_2_x?
|
171
|
+
COMMON_INDEXING_PARAMETER_NAMES + ES_2_X_INDEXING_PARAMETER_NAMES
|
172
|
+
else
|
173
|
+
COMMON_INDEXING_PARAMETER_NAMES + ES_5_X_INDEXING_PARAMETER_NAMES
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|