jay_api 29.3.1 → 29.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c4dc3e0a1c55fc4d24d117a2c24f415dfcd4d481c41bcc698ab22b9680b2c1ff
4
- data.tar.gz: b8402e498357724ad86f0516d82e937049176cdb54476c49dab03bf7a941ce15
3
+ metadata.gz: f997e23215ab5ee73c077534d19889c9b91ae5c877a77859b75f454e555bb105
4
+ data.tar.gz: f0250fc57649d863fde276f3e753b9d8aecff90c0bd286a1a97fb12b447b1c33
5
5
  SHA512:
6
- metadata.gz: 77770aca2b7203de9a0e76c5293b21db21ff4f6fb13c4f02f19b3cd3740af58033aacf82f24131b2ed2aa20a1bfec22c9d29d837735fd5ad40081a5642e82e95
7
- data.tar.gz: fbe4d05866d4b6f8b41a3b1ca1a458c22f59352d748619b459b20518a476fc4811ff11253b456c00b13787d8a47f38f4868b914a786ef8a3033f0bef6ca413a0
6
+ metadata.gz: bf6ba31a0f5960479de755757d6479b0c9373cc4b4e9e99ee55d853ba90417d1161b02d88d2103d8c86cd13a028f725293c3f13422c0422c51e0d64b6a906a40
7
+ data.tar.gz: ad81742c20b6a93b973972ee49b814ea61b3ecaac8ce0945aceac05dbd8020ec2c9d4dca701c261dadc7eeffbb3e40658ba6476ba015662217e0a8509785235f
data/CHANGELOG.md CHANGED
@@ -8,6 +8,42 @@ Please mark backwards incompatible changes with an exclamation mark at the start
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [29.5.0] - 2026-02-23
12
+
13
+ ### Fixed
14
+ - A `NameError` that was being raised when `jay_api/elasticsearch/client` was
15
+ required without requiring `elasticsearch`.
16
+ - A `NoMethodError` that was being raised by `Elasticsearch::Stats::Indices`
17
+ when `active_support/core_ext/string` hadn't been loaded.
18
+
19
+ ### Added
20
+ - The `#force_merge` method to the `Elasticsearch::Index` class. This method
21
+ starts a Forced Segment Merge on the index.
22
+ - The `#totals` method to `Elasticsearch::Stats::Index`, this gives the caller
23
+ access to the index's total metrics.
24
+ - The `Elasticsearch::Stats::Index::Totals` class. The class contains information
25
+ about an index's total metrics, for example, total number of documents, total
26
+ size, etc.
27
+ - The `#settings` method to the `Elasticsearch::Index` class. This gives the
28
+ caller access to the index's settings.
29
+ - The `Elasticsearch::Indices::Settings::Blocks` class. The class encapsulates
30
+ an index's blocks settings (for example, whether the index is read-only).
31
+ - The `Elasticsearch::Indices::Settings` class. The class encapsulates an
32
+ index's settings.
33
+ - It is now possible to configure the type used by the `RSpec::TestDataCollector`
34
+ class when pushing documents to Elasticsearch. If no type is specified in the
35
+ configuration the default type will be used.
36
+ - Allow the `Elasticsearch::Index` and `Elasticsearch::Indexes`'s `#push` method
37
+ to receive a `type` parameter, just like `#index` does.
38
+
39
+ ## [29.4.0] - 2026-01-28
40
+
41
+ ### Added
42
+ - Support for the `bucket_selector` pipeline aggregation in
43
+ `Elasticsearch::QueryBuilder::Aggregations`. This allows filtering
44
+ buckets based on computed metrics (e.g., filtering terms buckets by
45
+ aggregated values).
46
+
11
47
  ## [29.3.1] - 2025-12-15
12
48
 
13
49
  ### Fixed
@@ -35,7 +71,7 @@ Please mark backwards incompatible changes with an exclamation mark at the start
35
71
  allows boolean clauses to be nested.
36
72
  - `QueryBuilder#sort` can now receive either the direction of the sorting (`asc`
37
73
  or `desc`) or a `Hash` with advanced sorting options. These are relayed
38
- directly to Elasticsearch.
74
+ directly to Elasticsearch.
39
75
 
40
76
  ## [29.0.0] - 2025-08-28
41
77
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'elasticsearch/api/namespace/tasks'
3
+ require 'timeout'
4
4
  require 'elasticsearch/transport/transport/errors'
5
5
  require 'faraday/error'
6
6
  require 'forwardable'
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../errors/error'
4
+
5
+ module JayAPI
6
+ module Elasticsearch
7
+ module Errors
8
+ # An error to be raised when an attempt is made to perform force_merge
9
+ # over an index which hasn't been set to be read-only.
10
+ class WritableIndexError < ::JayAPI::Errors::Error; end
11
+ end
12
+ end
13
+ end
@@ -6,6 +6,7 @@ require_relative 'errors/query_execution_error'
6
6
  require_relative 'errors/query_execution_failure'
7
7
  require_relative 'errors/query_execution_timeout'
8
8
  require_relative 'errors/search_after_error'
9
+ require_relative 'errors/writable_index_error'
9
10
 
10
11
  module JayAPI
11
12
  module Elasticsearch
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'indexable'
4
+ require_relative 'indices/settings'
5
+ require_relative 'errors/writable_index_error'
4
6
 
5
7
  module JayAPI
6
8
  module Elasticsearch
@@ -49,6 +51,36 @@ module JayAPI
49
51
  def index(data, type: DEFAULT_DOC_TYPE)
50
52
  super.first
51
53
  end
54
+
55
+ # @return [JayAPI::Elasticsearch::Indices::Settings] The settings for the
56
+ # index.
57
+ def settings
58
+ # DO NOT MEMOIZE! Leave it to the caller.
59
+ ::JayAPI::Elasticsearch::Indices::Settings.new(client.transport_client, index_name)
60
+ end
61
+
62
+ # Starts a Forced Segment Merge process on the index.
63
+ #
64
+ # ⚠️ For big indexes this process can take a very long time, make sure to
65
+ # adjust the timeout when creating the client.
66
+ # @param [Boolean] only_expunge_deletes Specifies whether the operation
67
+ # should only remove deleted documents.
68
+ # @raise [JayAPI::Elasticsearch::Errors::WritableIndexError] If the index
69
+ # is writable (hasn't been set to read-only).
70
+ # @return [Hash] A +Hash+ with the result of the index merging process,
71
+ # it looks like this:
72
+ #
73
+ # { "_shards" => { "total" => 10, "successful" => 10, "failed" => 0 } }
74
+ def force_merge(only_expunge_deletes: nil)
75
+ unless settings.blocks.write_blocked?
76
+ raise ::JayAPI::Elasticsearch::Errors::WritableIndexError,
77
+ "Write block for '#{index_name}' has not been enabled. " \
78
+ "Please enable the index's write block before performing a segment merge"
79
+ end
80
+
81
+ params = { index: index_name, only_expunge_deletes: }.compact
82
+ client.transport_client.indices.forcemerge(**params)
83
+ end
52
84
  end
53
85
  end
54
86
  end
@@ -48,9 +48,13 @@ module JayAPI
48
48
  # Pushes a record into the index. (This does not send the record to the
49
49
  # Elasticsearch instance, only puts it into the send queue).
50
50
  # @param [Hash] data The data to be pushed to the index.
51
- def push(data)
51
+ # @param [String, nil] type The type of the document. When set to +nil+
52
+ # the decision is left to Elasticsearch's API. Which will normally
53
+ # default to +_doc+.
54
+ def push(data, type: DEFAULT_DOC_TYPE)
55
+ validate_type(type)
52
56
  index_names.each do |index_name|
53
- batch << { index: { _index: index_name, _type: 'nested', data: data } }
57
+ batch << { index: { _index: index_name, _type: type, data: data }.compact }
54
58
  end
55
59
 
56
60
  flush! if batch.size >= batch_size
@@ -78,8 +82,7 @@ module JayAPI
78
82
  # For information on the contents of this Hash please see:
79
83
  # https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#docs-index-api-response-body
80
84
  def index(data, type: DEFAULT_DOC_TYPE)
81
- raise ArgumentError, "Unsupported type: '#{type}'" unless SUPPORTED_TYPES.include?(type)
82
-
85
+ validate_type(type)
83
86
  index_names.map { |index_name| client.index index: index_name, type: type, body: data }
84
87
  end
85
88
 
@@ -220,6 +223,15 @@ module JayAPI
220
223
  def async
221
224
  @async ||= JayAPI::Elasticsearch::Async.new(self)
222
225
  end
226
+
227
+ # @param [String, nil] type The type of the document. When set to +nil+
228
+ # the decision is left to Elasticsearch's API. Which will normally
229
+ # default to +_doc+.
230
+ # @raise [ArgumentError] When the given +type+ is not one of the
231
+ # +SUPPORTED_TYPES+
232
+ def validate_type(type)
233
+ raise ArgumentError, "Unsupported type: '#{type}'" unless SUPPORTED_TYPES.include?(type)
234
+ end
223
235
  end
224
236
  end
225
237
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JayAPI
4
+ module Elasticsearch
5
+ module Indices
6
+ class Settings
7
+ # Represents the block settings of an Elasticsearch index.
8
+ class Blocks
9
+ attr_reader :settings
10
+
11
+ # @param [JayAPI::Elasticsearch::Indices::Settings] settings The
12
+ # parent +Settings+ object.
13
+ def initialize(settings)
14
+ @settings = settings
15
+ end
16
+
17
+ # @return [Boolean] True if the Index's write block has been set to
18
+ # true, false otherwise.
19
+ def write_blocked?
20
+ blocks_settings.fetch('write') == 'true'
21
+ end
22
+
23
+ # Sets the index's +write+ block to the given value. When the +write+
24
+ # block is set to +true+ the index's data is read-only, but the
25
+ # index's settings can still be changed. This allows maintenance tasks
26
+ # to still be performed on the index.
27
+ # @param [Boolean] value The new value for the +write+ block of the
28
+ # index.
29
+ # @raise [Elasticsearch::Transport::Transport::Errors::ServerError] If
30
+ # an error occurs when trying to set the value of the block.
31
+ def write=(value)
32
+ unless [true, false].include?(value)
33
+ raise ArgumentError, "Expected 'value' to be true or false, #{value.class} given"
34
+ end
35
+
36
+ return if write_blocked? == value
37
+
38
+ settings.transport_client.indices.put_settings(
39
+ index: settings.index_name,
40
+ body: { 'blocks.write' => value }
41
+ )
42
+ end
43
+
44
+ private
45
+
46
+ # @return [Hash] The block settings of the index. Something like this:
47
+ #
48
+ # { 'read_only_allow_delete' => 'false', 'write' => 'false' }
49
+ #
50
+ # @raise [KeyError] If the index's settings do not contain a "blocks"
51
+ # section.
52
+ def blocks_settings
53
+ settings.all.fetch('blocks')
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'settings/blocks'
4
+
5
+ module JayAPI
6
+ module Elasticsearch
7
+ module Indices
8
+ # Represents the settings of an Elasticsearch Index.
9
+ class Settings
10
+ attr_reader :transport_client, :index_name
11
+
12
+ # @param [Elasticsearch::Transport::Client] transport_client Elasticsearch's
13
+ # transport client.
14
+ # @param [String] index_name The name of the index this class will be
15
+ # handling settings for.
16
+ def initialize(transport_client, index_name)
17
+ @transport_client = transport_client
18
+ @index_name = index_name
19
+ end
20
+
21
+ # @return [Hash] A Hash with all the settings for the index. It looks
22
+ # like this:
23
+ #
24
+ # {
25
+ # "number_of_shards" => "5",
26
+ # "blocks" => { "read_only_allow_delete" => "false", "write" => "false" },
27
+ # "provided_name" => "xyz01_tests",
28
+ # "creation_date" => "1588701800423",
29
+ # "number_of_replicas" => "1",
30
+ # "uuid" => "VFx2e5t0Qgi-1zc2PUkYEg",
31
+ # "version" => { "created" => "7010199", "upgraded" => "7100299"}
32
+ # }
33
+ #
34
+ # @raise [Elasticsearch::Transport::Transport::Errors::ServerError] If
35
+ # an error occurs when trying to get the index's settings.
36
+ # @raise [KeyError] If any of the expected hierarchical elements in the
37
+ # response are missing.
38
+ def all
39
+ transport_client.indices.get_settings(index: index_name)
40
+ .fetch(index_name).fetch('settings').fetch('index')
41
+ end
42
+
43
+ # @return [JayAPI::Elasticsearch::Indices::Settings::Blocks] The blocks
44
+ # settings for the given index.
45
+ def blocks
46
+ @blocks ||= ::JayAPI::Elasticsearch::Indices::Settings::Blocks.new(self)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'indices/settings'
4
+
5
+ module JayAPI
6
+ module Elasticsearch
7
+ # Namespace for sub-elements of Elasticsearch's indices
8
+ module Indices; end
9
+ end
10
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'aggregation'
4
+
5
+ module JayAPI
6
+ module Elasticsearch
7
+ class QueryBuilder
8
+ class Aggregations
9
+ # Represents a +bucket_selector+ pipeline aggregation in Elasticsearch.
10
+ # Docs:
11
+ # https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation.html
12
+ class BucketSelector < ::JayAPI::Elasticsearch::QueryBuilder::Aggregations::Aggregation
13
+ attr_reader :buckets_path, :script, :gap_policy
14
+
15
+ # @param [String] name The name used by Elasticsearch to identify the
16
+ # aggregation.
17
+ # @param [Hash] buckets_path Path(s) to the metric or metrics
18
+ # over which the bucket_selector aggregation's script will operate.
19
+ # The keys are the names of the script variables, the values the
20
+ # paths to the metrics (relative to the parent aggregation).
21
+ # The script will receive these variables in its +params+.
22
+ # @param [JayAPI::Elasticsearch::QueryBuilder::Script] script
23
+ # Script used to decide whether to keep each bucket.
24
+ # @param [String, nil] gap_policy Optional gap policy (e.g. "skip",
25
+ # "insert_zeros").
26
+ def initialize(name, buckets_path:, script:, gap_policy: nil)
27
+ super(name)
28
+
29
+ @buckets_path = buckets_path
30
+ @script = script
31
+ @gap_policy = gap_policy
32
+ end
33
+
34
+ # Bucket selector is a pipeline agg and cannot have nested aggregations.
35
+ # @raise [JayAPI::Elasticsearch::QueryBuilder::Aggregations::Errors::AggregationsError]
36
+ def aggs
37
+ no_nested_aggregations('Bucket Selector')
38
+ end
39
+
40
+ # @return [self] A copy of the receiver.
41
+ def clone
42
+ self.class.new(
43
+ name,
44
+ buckets_path: buckets_path.is_a?(Hash) ? buckets_path.dup : buckets_path,
45
+ script:, # Script is immutable-ish, ok to reuse
46
+ gap_policy:
47
+ )
48
+ end
49
+
50
+ # @return [Hash] The Hash representation of the +Aggregation+.
51
+ # Properly formatted for Elasticsearch.
52
+ def to_h
53
+ super do
54
+ {
55
+ bucket_selector: {
56
+ buckets_path: buckets_path,
57
+ script: script.to_h,
58
+ gap_policy: gap_policy
59
+ }.compact
60
+ }
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -9,6 +9,7 @@ require_relative 'aggregations/composite'
9
9
  require_relative 'aggregations/date_histogram'
10
10
  require_relative 'aggregations/filter'
11
11
  require_relative 'aggregations/scripted_metric'
12
+ require_relative 'aggregations/bucket_selector'
12
13
  require_relative 'aggregations/sum'
13
14
  require_relative 'aggregations/max'
14
15
  require_relative 'aggregations/terms'
@@ -86,6 +87,16 @@ module JayAPI
86
87
  )
87
88
  end
88
89
 
90
+ # Adds an +bucket_selector+ type aggregation. For information about the parameters
91
+ # @see JayAPI::Elasticsearch::QueryBuilder::Aggregations::BucketSelector#initialize
92
+ def bucket_selector(name, buckets_path:, script:, gap_policy: nil)
93
+ add(
94
+ ::JayAPI::Elasticsearch::QueryBuilder::Aggregations::BucketSelector.new(
95
+ name, buckets_path:, script:, gap_policy:
96
+ )
97
+ )
98
+ end
99
+
89
100
  # Adds a +max+ type aggregation. For information about the parameters
90
101
  # @see JayAPI::Elasticsearch::QueryBuilder::Aggregations::Max#initialize
91
102
  def max(name, field:)
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JayAPI
4
+ module Elasticsearch
5
+ class Stats
6
+ class Index
7
+ # Contains information about an index's totals (docs, used space, etc).
8
+ class Totals
9
+ # @param [Hash] data The data under the index's +total+ key.
10
+ def initialize(data)
11
+ @data = data
12
+ end
13
+
14
+ # @return [Integer] The total number of documents in the index.
15
+ def docs_count
16
+ @docs_count ||= docs.fetch('count')
17
+ end
18
+
19
+ # @return [Integer] The total number of deleted documents in the index.
20
+ def deleted_docs
21
+ @deleted_docs ||= docs.fetch('deleted')
22
+ end
23
+
24
+ # @return [Float] A number between 0 and 1 that represents the ratio
25
+ # of between deleted documents and total documents in the index.
26
+ def deleted_ratio
27
+ @deleted_ratio ||= calculate_deleted_ratio
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :data
33
+
34
+ # @return [Hash] The information about the documents in the index.
35
+ # Looks something like this:
36
+ #
37
+ # { "count" => 530626, "deleted" => 11 }
38
+ #
39
+ # @raise [KeyError] If the given data doesn't have a +docs+ key.
40
+ def docs
41
+ @docs ||= data.fetch('docs')
42
+ end
43
+
44
+ # @return [Float] A number between 0 and 1 that represents the ratio
45
+ # of between deleted documents and total documents in the index.
46
+ def calculate_deleted_ratio
47
+ if docs_count.zero?
48
+ return deleted_docs.zero? ? 0.0 : 1.0
49
+ end
50
+
51
+ deleted_docs / docs_count.to_f
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'index/totals'
4
+
3
5
  module JayAPI
4
6
  module Elasticsearch
5
7
  class Stats
@@ -13,6 +15,17 @@ module JayAPI
13
15
  @name = name
14
16
  @data = data
15
17
  end
18
+
19
+ # @return [JayAPI::Elasticsearch::Stats::Index::Totals] Information
20
+ # about the index's total metrics.
21
+ # @raise [KeyError] If the given data doesn't have a +total+ key.
22
+ def totals
23
+ @totals ||= ::JayAPI::Elasticsearch::Stats::Index::Totals.new(data.fetch('total'))
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :data
16
29
  end
17
30
  end
18
31
  end
@@ -10,7 +10,7 @@ module JayAPI
10
10
  class Indices
11
11
  # A lambda used to select / reject system indices (indices whose name
12
12
  # starts with dot).
13
- SYSTEM_SELECTOR = ->(name, _data) { name.starts_with?('.') }
13
+ SYSTEM_SELECTOR = ->(name, _data) { name.start_with?('.') }
14
14
 
15
15
  # @param [Hash{String=>Hash}] indices A +Hash+ with the information
16
16
  # about the indices. Its keys are the names of the indices, its values
@@ -7,6 +7,7 @@ require_relative 'elasticsearch/client_factory'
7
7
  require_relative 'elasticsearch/errors'
8
8
  require_relative 'elasticsearch/index'
9
9
  require_relative 'elasticsearch/indexes'
10
+ require_relative 'elasticsearch/indices'
10
11
  require_relative 'elasticsearch/query_builder'
11
12
  require_relative 'elasticsearch/query_results'
12
13
  require_relative 'elasticsearch/response'
@@ -79,7 +79,7 @@ module JayAPI
79
79
  }
80
80
  }
81
81
 
82
- elasticsearch_index.push(data)
82
+ elasticsearch_index.push(data, **push_params)
83
83
  end
84
84
 
85
85
  # Executed by RSpec at the end of the test run. If the push is enabled,
@@ -94,6 +94,14 @@ module JayAPI
94
94
 
95
95
  attr_reader :push_enabled
96
96
 
97
+ # @return [Hash] Additional parameters for the Elasticsearch::Index#push.
98
+ def push_params
99
+ # The extraction of the parameters is done with a #slice to be able to
100
+ # differentiate between when the parameter is not specified (completely
101
+ # absent) or when the parameter has been specified as +nil+.
102
+ @push_params ||= configuration.to_h.slice(:type)
103
+ end
104
+
97
105
  # @return [Hash] The configuration set for Elasticsearch as a hash. If no
98
106
  # value has been set for the batch size a reasonable default is set.
99
107
  # @raise [JayAPI::Errors::ConfigurationError] If no configuration for
@@ -2,5 +2,5 @@
2
2
 
3
3
  module JayAPI
4
4
  # JayAPI gem's semantic version
5
- VERSION = '29.3.1'
5
+ VERSION = '29.5.0'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jay_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 29.3.1
4
+ version: 29.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Accenture-Industry X
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-12-15 00:00:00.000000000 Z
12
+ date: 2026-02-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -128,13 +128,18 @@ files:
128
128
  - lib/jay_api/elasticsearch/errors/query_execution_failure.rb
129
129
  - lib/jay_api/elasticsearch/errors/query_execution_timeout.rb
130
130
  - lib/jay_api/elasticsearch/errors/search_after_error.rb
131
+ - lib/jay_api/elasticsearch/errors/writable_index_error.rb
131
132
  - lib/jay_api/elasticsearch/index.rb
132
133
  - lib/jay_api/elasticsearch/indexable.rb
133
134
  - lib/jay_api/elasticsearch/indexes.rb
135
+ - lib/jay_api/elasticsearch/indices.rb
136
+ - lib/jay_api/elasticsearch/indices/settings.rb
137
+ - lib/jay_api/elasticsearch/indices/settings/blocks.rb
134
138
  - lib/jay_api/elasticsearch/query_builder.rb
135
139
  - lib/jay_api/elasticsearch/query_builder/aggregations.rb
136
140
  - lib/jay_api/elasticsearch/query_builder/aggregations/aggregation.rb
137
141
  - lib/jay_api/elasticsearch/query_builder/aggregations/avg.rb
142
+ - lib/jay_api/elasticsearch/query_builder/aggregations/bucket_selector.rb
138
143
  - lib/jay_api/elasticsearch/query_builder/aggregations/cardinality.rb
139
144
  - lib/jay_api/elasticsearch/query_builder/aggregations/composite.rb
140
145
  - lib/jay_api/elasticsearch/query_builder/aggregations/date_histogram.rb
@@ -173,6 +178,7 @@ files:
173
178
  - lib/jay_api/elasticsearch/stats.rb
174
179
  - lib/jay_api/elasticsearch/stats/errors/stats_data_not_available.rb
175
180
  - lib/jay_api/elasticsearch/stats/index.rb
181
+ - lib/jay_api/elasticsearch/stats/index/totals.rb
176
182
  - lib/jay_api/elasticsearch/stats/indices.rb
177
183
  - lib/jay_api/elasticsearch/stats/node.rb
178
184
  - lib/jay_api/elasticsearch/stats/node/storage.rb