@@ -20,28 +20,48 @@ module Resolvers
2020 # Note: `NestedRelationshipsSource` implements further optimizations on top of this, and should
2121 # be used rather than this class when applicable.
2222 class QuerySource < ::GraphQL ::Dataloader ::Source
23- def initialize ( datastore_router , query_tracker )
23+ def initialize ( datastore_router , query_tracker , opaque_id_parts = [ ] )
2424 @datastore_router = datastore_router
2525 @query_tracker = query_tracker
26+ @opaque_id_parts = opaque_id_parts
2627 end
2728
2829 def fetch ( queries )
29- responses_by_query = @datastore_router . msearch ( queries , query_tracker : @query_tracker )
30+ responses_by_query = @datastore_router . msearch (
31+ queries ,
32+ query_tracker : @query_tracker ,
33+ opaque_id_parts : @opaque_id_parts
34+ )
3035 queries . map { |q | responses_by_query . fetch ( q ) }
3136 end
3237
3338 def self . execute_many ( queries , for_context :)
3439 datastore_router = for_context . fetch ( :datastore_search_router )
3540 query_tracker = for_context . fetch ( :elastic_graph_query_tracker )
41+ opaque_id_parts = datastore_opaque_id_parts_for ( for_context )
3642 dataloader = for_context . dataloader
3743
38- responses = dataloader . with ( self , datastore_router , query_tracker ) . load_all ( queries )
44+ responses = dataloader . with ( self , datastore_router , query_tracker , opaque_id_parts ) . load_all ( queries )
3945 queries . zip ( responses ) . to_h
4046 end
4147
4248 def self . execute_one ( query , for_context :)
4349 execute_many ( [ query ] , for_context : for_context ) . fetch ( query )
4450 end
51+
52+ # `QueryExecutor` adds `:elastic_graph_client` to the GraphQL context before
53+ # resolver execution begins, so resolver-side datastore queries can reuse the
54+ # same client identity in their datastore `X-Opaque-Id` headers.
55+ private_class_method def self . datastore_opaque_id_parts_for ( for_context )
56+ client = for_context . fetch ( :elastic_graph_client )
57+ graphql_query = for_context . query
58+ [
59+ "elasticgraph-graphql" ,
60+ "client=#{ client . name } " ,
61+ *client . extra_opaque_id_parts ,
62+ "query=#{ graphql_query . fingerprint } "
63+ ]
64+ end
4565 end
4666 end
4767 end
0 commit comments