elasticgraph-graphql 0.18.0.0 → 0.18.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/elastic_graph/graphql/aggregation/nested_sub_aggregation.rb +13 -3
- data/lib/elastic_graph/graphql/aggregation/query.rb +6 -2
- data/lib/elastic_graph/graphql/aggregation/query_adapter.rb +17 -13
- data/lib/elastic_graph/graphql/aggregation/resolvers/aggregated_values.rb +2 -1
- data/lib/elastic_graph/graphql/aggregation/resolvers/grouped_by.rb +3 -1
- data/lib/elastic_graph/graphql/aggregation/resolvers/sub_aggregations.rb +10 -7
- data/lib/elastic_graph/graphql/resolvers/relay_connection.rb +2 -1
- data/lib/elastic_graph/graphql.rb +0 -1
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9832ca5ee58e052ef3428907d2bc277cdeba8b567eb3a3861609d0b97799ff7
|
4
|
+
data.tar.gz: 74f29fcd9a89007b34a2b4be5ba332dabc4ff7cb38585a0173e89541061a65a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ff8132bb4c647b2f23669d7c8e5993da3550b83fc15113ebcd0234a19f6f1faf79bfe2127c03d5cf19f39beadf3f96abcbbd18e99df22dd6bba3d1931e86524
|
7
|
+
data.tar.gz: 7ac54e755f0d20da132d7ff2ca03a9c3f61b2c182c781408e50ba9ac2e20c45a12dbf6dd235010b73675ee8b6be1bc7d352d868dd8c0aa982671b85e23bf41ed
|
@@ -7,6 +7,7 @@
|
|
7
7
|
# frozen_string_literal: true
|
8
8
|
|
9
9
|
require "elastic_graph/graphql/aggregation/field_path_encoder"
|
10
|
+
require "elastic_graph/support/memoizable_data"
|
10
11
|
|
11
12
|
module ElasticGraph
|
12
13
|
class GraphQL
|
@@ -14,14 +15,23 @@ module ElasticGraph
|
|
14
15
|
# Represents a sub-aggregation on a `nested` field.
|
15
16
|
# For the relevant Elasticsearch docs, see:
|
16
17
|
# https://www.elastic.co/guide/en/elasticsearch/reference/8.10/search-aggregations-bucket-nested-aggregation.html
|
17
|
-
class NestedSubAggregation < ::
|
18
|
+
class NestedSubAggregation < Support::MemoizableData.define(:nested_path, :query)
|
19
|
+
# The nested path in the GraphQL query from the parent aggregation to this-subaggregation, encoded
|
20
|
+
# for use as a hash key.
|
21
|
+
#
|
22
|
+
# This key will be unique in the scope of the parent aggregation query, and thus suitable as a key
|
23
|
+
# in a sub-aggregations hash.
|
24
|
+
def nested_path_key
|
25
|
+
@nested_path_key ||= FieldPathEncoder.encode(nested_path.map(&:name_in_graphql_query))
|
26
|
+
end
|
27
|
+
|
18
28
|
def build_agg_hash(filter_interpreter, parent_queries:)
|
19
29
|
detail = query.build_agg_detail(filter_interpreter, field_path: nested_path, parent_queries: parent_queries)
|
20
30
|
return {} if detail.nil?
|
21
31
|
|
22
|
-
|
32
|
+
parent_query_names = parent_queries.map(&:name)
|
23
33
|
{
|
24
|
-
Key.encode(
|
34
|
+
Key.encode(parent_query_names + [nested_path_key]) => {
|
25
35
|
"nested" => {"path" => FieldPathEncoder.encode(nested_path.filter_map(&:name_in_index))},
|
26
36
|
"aggs" => detail.clauses,
|
27
37
|
"meta" => detail.meta.merge({
|
@@ -9,6 +9,7 @@
|
|
9
9
|
require "elastic_graph/graphql/aggregation/key"
|
10
10
|
require "elastic_graph/graphql/datastore_query"
|
11
11
|
require "elastic_graph/graphql/filtering/field_path"
|
12
|
+
require "elastic_graph/support/hash_util"
|
12
13
|
|
13
14
|
module ElasticGraph
|
14
15
|
class GraphQL
|
@@ -62,7 +63,7 @@ module ElasticGraph
|
|
62
63
|
|
63
64
|
filter_detail(filter_interpreter, field_path) do
|
64
65
|
grouping_adapter.grouping_detail_for(self) do
|
65
|
-
|
66
|
+
Support::HashUtil.disjoint_merge(computations_detail, sub_aggregation_detail(filter_interpreter, queries))
|
66
67
|
end
|
67
68
|
end
|
68
69
|
end
|
@@ -114,7 +115,10 @@ module ElasticGraph
|
|
114
115
|
end
|
115
116
|
|
116
117
|
def build_inner_aggregation_detail(collection, &block)
|
117
|
-
|
118
|
+
initial = {} # : ::Hash[::String, untyped]
|
119
|
+
collection.map(&block).reduce(initial) do |accum, hash|
|
120
|
+
Support::HashUtil.disjoint_merge(accum, hash)
|
121
|
+
end
|
118
122
|
end
|
119
123
|
end
|
120
124
|
|
@@ -15,6 +15,7 @@ require "elastic_graph/graphql/aggregation/path_segment"
|
|
15
15
|
require "elastic_graph/graphql/aggregation/query"
|
16
16
|
require "elastic_graph/graphql/aggregation/script_term_grouping"
|
17
17
|
require "elastic_graph/graphql/schema/arguments"
|
18
|
+
require "elastic_graph/support/hash_util"
|
18
19
|
require "elastic_graph/support/memoizable_data"
|
19
20
|
|
20
21
|
module ElasticGraph
|
@@ -303,22 +304,25 @@ module ElasticGraph
|
|
303
304
|
end
|
304
305
|
|
305
306
|
def build_sub_aggregations_from(node_node, parent_nested_path: [])
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
307
|
+
key_sub_agg_pairs =
|
308
|
+
build_clauses_from(node_node.selection(element_names.sub_aggregations)) do |node, field, field_path|
|
309
|
+
if field.type.elasticgraph_category == :nested_sub_aggregation_connection
|
310
|
+
nested_path = parent_nested_path + field_path
|
311
|
+
nested_sub_agg = NestedSubAggregation.new(
|
312
|
+
nested_path: nested_path,
|
313
|
+
query: build_aggregation_query_for(
|
314
|
+
node,
|
315
|
+
field: field,
|
316
|
+
grouping_adapter: sub_aggregation_grouping_adapter,
|
317
|
+
nested_path: nested_path
|
318
|
+
)
|
316
319
|
)
|
317
|
-
)
|
318
320
|
|
319
|
-
|
321
|
+
[[nested_sub_agg.nested_path_key, nested_sub_agg]] # : ::Array[[::String, NestedSubAggregation]]
|
322
|
+
end
|
320
323
|
end
|
321
|
-
|
324
|
+
|
325
|
+
Support::HashUtil.strict_to_h(key_sub_agg_pairs)
|
322
326
|
end
|
323
327
|
|
324
328
|
def build_paginator_for(node)
|
@@ -8,6 +8,7 @@
|
|
8
8
|
|
9
9
|
require "elastic_graph/graphql/aggregation/key"
|
10
10
|
require "elastic_graph/graphql/aggregation/path_segment"
|
11
|
+
require "elastic_graph/support/hash_util"
|
11
12
|
|
12
13
|
module ElasticGraph
|
13
14
|
class GraphQL
|
@@ -27,7 +28,7 @@ module ElasticGraph
|
|
27
28
|
function_name: field.name_in_index.to_s
|
28
29
|
)
|
29
30
|
|
30
|
-
result =
|
31
|
+
result = Support::HashUtil.verbose_fetch(bucket, key.encode)
|
31
32
|
|
32
33
|
# Aggregated value results always have a `value` key; in addition, for `date` field, they also have a `value_as_string`.
|
33
34
|
# In that case, `value` is a number (e.g. ms since epoch) whereas `value_as_string` is a formatted value. ElasticGraph
|
@@ -7,6 +7,7 @@
|
|
7
7
|
# frozen_string_literal: true
|
8
8
|
|
9
9
|
require "elastic_graph/graphql/aggregation/field_path_encoder"
|
10
|
+
require "elastic_graph/support/hash_util"
|
10
11
|
|
11
12
|
module ElasticGraph
|
12
13
|
class GraphQL
|
@@ -21,7 +22,8 @@ module ElasticGraph
|
|
21
22
|
new_field_path = field_path + [PathSegment.for(field: field, lookahead: lookahead)]
|
22
23
|
return with(field_path: new_field_path) if field.type.object?
|
23
24
|
|
24
|
-
|
25
|
+
bucket_entry = Support::HashUtil.verbose_fetch(bucket, "key")
|
26
|
+
Support::HashUtil.verbose_fetch(bucket_entry, FieldPathEncoder.encode(new_field_path.map(&:name_in_graphql_query)))
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
@@ -7,17 +7,19 @@
|
|
7
7
|
# frozen_string_literal: true
|
8
8
|
|
9
9
|
require "elastic_graph/graphql/aggregation/composite_grouping_adapter"
|
10
|
+
require "elastic_graph/graphql/aggregation/field_path_encoder"
|
10
11
|
require "elastic_graph/graphql/aggregation/key"
|
11
12
|
require "elastic_graph/graphql/aggregation/non_composite_grouping_adapter"
|
12
13
|
require "elastic_graph/graphql/aggregation/resolvers/count_detail"
|
13
14
|
require "elastic_graph/graphql/decoded_cursor"
|
14
15
|
require "elastic_graph/graphql/resolvers/resolvable_value"
|
16
|
+
require "elastic_graph/support/hash_util"
|
15
17
|
|
16
18
|
module ElasticGraph
|
17
19
|
class GraphQL
|
18
20
|
module Aggregation
|
19
21
|
module Resolvers
|
20
|
-
class SubAggregations < ::Data.define(:schema_element_names, :sub_aggregations, :parent_queries, :
|
22
|
+
class SubAggregations < ::Data.define(:schema_element_names, :sub_aggregations, :parent_queries, :sub_aggs_by_agg_key, :field_path)
|
21
23
|
def can_resolve?(field:, object:)
|
22
24
|
true
|
23
25
|
end
|
@@ -27,25 +29,26 @@ module ElasticGraph
|
|
27
29
|
new_field_path = field_path + [path_segment]
|
28
30
|
return with(field_path: new_field_path) unless field.type.elasticgraph_category == :nested_sub_aggregation_connection
|
29
31
|
|
30
|
-
|
31
|
-
sub_agg_query =
|
32
|
+
sub_agg_key = FieldPathEncoder.encode(new_field_path.map(&:name_in_graphql_query))
|
33
|
+
sub_agg_query = Support::HashUtil.verbose_fetch(sub_aggregations, sub_agg_key).query
|
32
34
|
|
33
35
|
RelayConnectionBuilder.build_from_buckets(
|
34
36
|
query: sub_agg_query,
|
35
37
|
parent_queries: parent_queries,
|
36
38
|
schema_element_names: schema_element_names,
|
37
39
|
field_path: new_field_path
|
38
|
-
) { extract_buckets(
|
40
|
+
) { extract_buckets(sub_agg_key, args) }
|
39
41
|
end
|
40
42
|
|
41
43
|
private
|
42
44
|
|
43
|
-
def extract_buckets(
|
45
|
+
def extract_buckets(aggregation_field_path, args)
|
44
46
|
# When the client passes `first: 0`, we omit the sub-aggregation from the query body entirely,
|
45
|
-
# and it wont' be in `
|
47
|
+
# and it wont' be in `sub_aggs_by_agg_key`. Instead, we can just return an empty list of buckets.
|
46
48
|
return [] if args[schema_element_names.first] == 0
|
47
49
|
|
48
|
-
|
50
|
+
sub_agg_key = Key.encode(parent_queries.map(&:name) + [aggregation_field_path])
|
51
|
+
sub_agg = Support::HashUtil.verbose_fetch(sub_aggs_by_agg_key, sub_agg_key)
|
49
52
|
meta = sub_agg.fetch("meta")
|
50
53
|
|
51
54
|
# When the sub-aggregation node of the GraphQL query has a `filter` argument, the direct sub-aggregation returned by
|
@@ -8,6 +8,7 @@
|
|
8
8
|
|
9
9
|
require "elastic_graph/graphql/aggregation/resolvers/relay_connection_builder"
|
10
10
|
require "elastic_graph/graphql/resolvers/relay_connection/search_response_adapter_builder"
|
11
|
+
require "elastic_graph/support/hash_util"
|
11
12
|
|
12
13
|
module ElasticGraph
|
13
14
|
class GraphQL
|
@@ -33,7 +34,7 @@ module ElasticGraph
|
|
33
34
|
Aggregation::Resolvers::RelayConnectionBuilder.build_from_search_response(
|
34
35
|
schema_element_names: schema_element_names,
|
35
36
|
search_response: search_response,
|
36
|
-
query: query.aggregations
|
37
|
+
query: Support::HashUtil.verbose_fetch(query.aggregations, agg_name)
|
37
38
|
)
|
38
39
|
end
|
39
40
|
end
|
@@ -171,7 +171,6 @@ module ElasticGraph
|
|
171
171
|
# @private
|
172
172
|
def datastore_query_adapters
|
173
173
|
@datastore_query_adapters ||= begin
|
174
|
-
require "elastic_graph/graphql/aggregation/non_composite_grouping_adapter"
|
175
174
|
require "elastic_graph/graphql/aggregation/query_adapter"
|
176
175
|
require "elastic_graph/graphql/query_adapter/filters"
|
177
176
|
require "elastic_graph/graphql/query_adapter/pagination"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticgraph-graphql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.18.0.
|
4
|
+
version: 0.18.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Myron Marston
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop-factory_bot
|
@@ -278,28 +278,28 @@ dependencies:
|
|
278
278
|
requirements:
|
279
279
|
- - '='
|
280
280
|
- !ruby/object:Gem::Version
|
281
|
-
version: 0.18.0.
|
281
|
+
version: 0.18.0.1
|
282
282
|
type: :runtime
|
283
283
|
prerelease: false
|
284
284
|
version_requirements: !ruby/object:Gem::Requirement
|
285
285
|
requirements:
|
286
286
|
- - '='
|
287
287
|
- !ruby/object:Gem::Version
|
288
|
-
version: 0.18.0.
|
288
|
+
version: 0.18.0.1
|
289
289
|
- !ruby/object:Gem::Dependency
|
290
290
|
name: elasticgraph-schema_artifacts
|
291
291
|
requirement: !ruby/object:Gem::Requirement
|
292
292
|
requirements:
|
293
293
|
- - '='
|
294
294
|
- !ruby/object:Gem::Version
|
295
|
-
version: 0.18.0.
|
295
|
+
version: 0.18.0.1
|
296
296
|
type: :runtime
|
297
297
|
prerelease: false
|
298
298
|
version_requirements: !ruby/object:Gem::Requirement
|
299
299
|
requirements:
|
300
300
|
- - '='
|
301
301
|
- !ruby/object:Gem::Version
|
302
|
-
version: 0.18.0.
|
302
|
+
version: 0.18.0.1
|
303
303
|
- !ruby/object:Gem::Dependency
|
304
304
|
name: graphql
|
305
305
|
requirement: !ruby/object:Gem::Requirement
|
@@ -326,70 +326,70 @@ dependencies:
|
|
326
326
|
requirements:
|
327
327
|
- - '='
|
328
328
|
- !ruby/object:Gem::Version
|
329
|
-
version: 0.18.0.
|
329
|
+
version: 0.18.0.1
|
330
330
|
type: :development
|
331
331
|
prerelease: false
|
332
332
|
version_requirements: !ruby/object:Gem::Requirement
|
333
333
|
requirements:
|
334
334
|
- - '='
|
335
335
|
- !ruby/object:Gem::Version
|
336
|
-
version: 0.18.0.
|
336
|
+
version: 0.18.0.1
|
337
337
|
- !ruby/object:Gem::Dependency
|
338
338
|
name: elasticgraph-elasticsearch
|
339
339
|
requirement: !ruby/object:Gem::Requirement
|
340
340
|
requirements:
|
341
341
|
- - '='
|
342
342
|
- !ruby/object:Gem::Version
|
343
|
-
version: 0.18.0.
|
343
|
+
version: 0.18.0.1
|
344
344
|
type: :development
|
345
345
|
prerelease: false
|
346
346
|
version_requirements: !ruby/object:Gem::Requirement
|
347
347
|
requirements:
|
348
348
|
- - '='
|
349
349
|
- !ruby/object:Gem::Version
|
350
|
-
version: 0.18.0.
|
350
|
+
version: 0.18.0.1
|
351
351
|
- !ruby/object:Gem::Dependency
|
352
352
|
name: elasticgraph-opensearch
|
353
353
|
requirement: !ruby/object:Gem::Requirement
|
354
354
|
requirements:
|
355
355
|
- - '='
|
356
356
|
- !ruby/object:Gem::Version
|
357
|
-
version: 0.18.0.
|
357
|
+
version: 0.18.0.1
|
358
358
|
type: :development
|
359
359
|
prerelease: false
|
360
360
|
version_requirements: !ruby/object:Gem::Requirement
|
361
361
|
requirements:
|
362
362
|
- - '='
|
363
363
|
- !ruby/object:Gem::Version
|
364
|
-
version: 0.18.0.
|
364
|
+
version: 0.18.0.1
|
365
365
|
- !ruby/object:Gem::Dependency
|
366
366
|
name: elasticgraph-indexer
|
367
367
|
requirement: !ruby/object:Gem::Requirement
|
368
368
|
requirements:
|
369
369
|
- - '='
|
370
370
|
- !ruby/object:Gem::Version
|
371
|
-
version: 0.18.0.
|
371
|
+
version: 0.18.0.1
|
372
372
|
type: :development
|
373
373
|
prerelease: false
|
374
374
|
version_requirements: !ruby/object:Gem::Requirement
|
375
375
|
requirements:
|
376
376
|
- - '='
|
377
377
|
- !ruby/object:Gem::Version
|
378
|
-
version: 0.18.0.
|
378
|
+
version: 0.18.0.1
|
379
379
|
- !ruby/object:Gem::Dependency
|
380
380
|
name: elasticgraph-schema_definition
|
381
381
|
requirement: !ruby/object:Gem::Requirement
|
382
382
|
requirements:
|
383
383
|
- - '='
|
384
384
|
- !ruby/object:Gem::Version
|
385
|
-
version: 0.18.0.
|
385
|
+
version: 0.18.0.1
|
386
386
|
type: :development
|
387
387
|
prerelease: false
|
388
388
|
version_requirements: !ruby/object:Gem::Requirement
|
389
389
|
requirements:
|
390
390
|
- - '='
|
391
391
|
- !ruby/object:Gem::Version
|
392
|
-
version: 0.18.0.
|
392
|
+
version: 0.18.0.1
|
393
393
|
description:
|
394
394
|
email:
|
395
395
|
- myron@squareup.com
|