Module: ElasticGraph::GraphQL::Aggregation::NonCompositeGroupingAdapter

Defined in:
lib/elastic_graph/graphql/aggregation/non_composite_grouping_adapter.rb

Overview

Grouping adapter that avoids using a ‘composite` aggregation, due to limitations with Elasticsearch/OpenSearch.

Class Method Summary collapse

Class Method Details

.grouping_detail_for(query) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/elastic_graph/graphql/aggregation/non_composite_grouping_adapter.rb', line 19

def grouping_detail_for(query)
  date_groupings, term_groupings = query.groupings.partition do |grouping|
    grouping.is_a?(DateHistogramGrouping)
  end

  grouping_detail(date_groupings, query) do
    # We want term groupings inside date groupings so that, when our bucket aggregations might produce
    # inaccurate doc counts, the innermost grouping aggregation has `doc_count_error_upper_bound` on
    # its buckets allowing us to expose information about the accuracy.
    #
    # Date histogram aggregations do not include `doc_count_error_upper_bound` because, on their own, they are
    # always accurate, but they may not be accurate when used as a sub-aggregation of a `terms` aggregation.
    #
    # For more detail on the issue this ordering is designed to avoid, see:
    # https://discuss.elastic.co/t/accuracy-of-date-histogram-sub-aggregation-doc-count-under-terms-aggregation/348685
    grouping_detail(term_groupings, query) do
      inner_clauses = yield
      inner_clauses = nil if inner_clauses.empty?
      AggregationDetail.new(inner_clauses, {})
    end
  end
end

.meta_nameObject



15
16
17
# File 'lib/elastic_graph/graphql/aggregation/non_composite_grouping_adapter.rb', line 15

def meta_name
  "non_comp"
end

.prepare_response_buckets(sub_agg, buckets_path, meta) ⇒ Object



42
43
44
# File 'lib/elastic_graph/graphql/aggregation/non_composite_grouping_adapter.rb', line 42

def prepare_response_buckets(sub_agg, buckets_path, meta)
  sort_and_truncate_buckets(format_buckets(sub_agg, buckets_path), meta.fetch("size"))
end