From d0dde6dea7e3c12d443dfffc0d610117c08ee4e4 Mon Sep 17 00:00:00 2001 From: Myron Marston Date: Sun, 9 Feb 2025 15:17:59 -0800 Subject: [PATCH 1/3] Refactor: split `GetRecordFieldValue` resolver. Previously, it handled both the `Hash` and `Document` cases, via a `case` statement on `object`. Instead, we can handle it with two separate resolvers. The `Document` resolver simply delegates to the `Hash` resolver after extracting the hash `payload`. We want to minimize the logic that needs to happen to resolve each field, so it's nice to eliminate this `case` statement. --- Steepfile | 1 - .../lib/elastic_graph/graphql.rb | 15 ++++----- .../graphql/resolvers/document.rb | 32 +++++++++++++++++++ .../{get_record_field_value.rb => hash.rb} | 15 +++------ .../graphql/resolvers/document.rbs | 15 +++++++++ .../{get_record_field_value.rbs => hash.rbs} | 4 ++- elasticgraph-graphql/spec/support/resolver.rb | 4 +++ .../graphql/resolvers/document_spec.rb | 25 +++++++++++++++ ...rb => hash_or_document_shared_examples.rb} | 19 +---------- .../graphql/resolvers/hash_spec.rb | 20 ++++++++++++ .../relay_connection/array_adapter_spec.rb | 12 +++---- 11 files changed, 116 insertions(+), 46 deletions(-) create mode 100644 elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb rename elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/{get_record_field_value.rb => hash.rb} (73%) create mode 100644 elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/document.rbs rename elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/{get_record_field_value.rbs => hash.rbs} (70%) create mode 100644 elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/document_spec.rb rename elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/{get_record_field_value_spec.rb => hash_or_document_shared_examples.rb} (84%) create mode 100644 elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_spec.rb diff --git a/Steepfile b/Steepfile index c4f2c6df..5fc38606 100644 --- a/Steepfile +++ b/Steepfile @@ -36,7 +36,6 @@ target :elasticgraph_gems do elasticgraph-graphql/lib/elastic_graph/graphql/datastore_search_router.rb elasticgraph-graphql/lib/elastic_graph/graphql/monkey_patches/schema_field.rb elasticgraph-graphql/lib/elastic_graph/graphql/monkey_patches/schema_object.rb - elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/get_record_field_value.rb elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/graphql_adapter.rb elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/list_records.rb elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/nested_relationships.rb diff --git a/elasticgraph-graphql/lib/elastic_graph/graphql.rb b/elasticgraph-graphql/lib/elastic_graph/graphql.rb index e18aebe9..e1abf6e7 100644 --- a/elasticgraph-graphql/lib/elastic_graph/graphql.rb +++ b/elasticgraph-graphql/lib/elastic_graph/graphql.rb @@ -166,18 +166,15 @@ def graphql_gem_plugins # @private def graphql_resolvers @graphql_resolvers ||= begin - require "elastic_graph/graphql/resolvers/get_record_field_value" + require "elastic_graph/graphql/resolvers/document" + require "elastic_graph/graphql/resolvers/hash" require "elastic_graph/graphql/resolvers/list_records" - list_records = Resolvers::ListRecords.new( - resolver_query_adapter: resolver_query_adapter - ) - - get_record_field_value = Resolvers::GetRecordFieldValue.new( - schema_element_names: runtime_metadata.schema_element_names - ) + list_records = Resolvers::ListRecords.new(resolver_query_adapter: resolver_query_adapter) + hash = Resolvers::Hash.new(schema_element_names: runtime_metadata.schema_element_names) + document = Resolvers::Document.new(hash_resolver: hash) - [list_records, get_record_field_value] + [list_records, hash, document] end end diff --git a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb new file mode 100644 index 00000000..7e95bca1 --- /dev/null +++ b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb @@ -0,0 +1,32 @@ +# Copyright 2024 Block, Inc. +# +# Use of this source code is governed by an MIT-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/MIT. +# +# frozen_string_literal: true + +require "elastic_graph/graphql/datastore_response/document" +require "elastic_graph/graphql/resolvers/relay_connection/array_adapter" +require "elastic_graph/support/hash_util" + +module ElasticGraph + class GraphQL + module Resolvers + # Responsible for fetching a single field value from a datastore document. + class Document + def initialize(hash_resolver:) + @hash_resolver = hash_resolver + end + + def can_resolve?(field:, object:) + object.is_a?(DatastoreResponse::Document) + end + + def call(parent_type, graphql_field, object, args, context) + @hash_resolver.call(parent_type, graphql_field, object.payload, args, context) + end + end + end + end +end diff --git a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/get_record_field_value.rb b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb similarity index 73% rename from elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/get_record_field_value.rb rename to elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb index 5b1cf113..26228013 100644 --- a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/get_record_field_value.rb +++ b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb @@ -13,28 +13,21 @@ module ElasticGraph class GraphQL module Resolvers - # Responsible for fetching a single field value from a document. - class GetRecordFieldValue + # Responsible for fetching a single field value from a Ruby hash. + class Hash def initialize(schema_element_names:) @schema_element_names = schema_element_names end def can_resolve?(field:, object:) - object.is_a?(DatastoreResponse::Document) || object.is_a?(::Hash) + object.is_a?(::Hash) end def call(parent_type, graphql_field, object, args, context) field = context.fetch(:elastic_graph_schema).field_named(parent_type.graphql_name, graphql_field.name) field_name = field.name_in_index.to_s - data = - case object - when DatastoreResponse::Document - object.payload - else - object - end - value = Support::HashUtil.fetch_value_at_path(data, field_name) do + value = Support::HashUtil.fetch_value_at_path(object, field_name) do field.type.list? ? [] : nil end diff --git a/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/document.rbs b/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/document.rbs new file mode 100644 index 00000000..74e29b5f --- /dev/null +++ b/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/document.rbs @@ -0,0 +1,15 @@ +module ElasticGraph + class GraphQL + module Resolvers + class Document + include _Resolver + + @hash_resolver: Resolvers::Hash + + def initialize: ( + hash_resolver: Resolvers::Hash + ) -> void + end + end + end +end diff --git a/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/get_record_field_value.rbs b/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/hash.rbs similarity index 70% rename from elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/get_record_field_value.rbs rename to elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/hash.rbs index cc34194e..56529593 100644 --- a/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/get_record_field_value.rbs +++ b/elasticgraph-graphql/sig/elastic_graph/graphql/resolvers/hash.rbs @@ -1,9 +1,11 @@ module ElasticGraph class GraphQL module Resolvers - class GetRecordFieldValue + class Hash include _Resolver + @schema_element_names: SchemaArtifacts::RuntimeMetadata::SchemaElementNames + def initialize: ( schema_element_names: SchemaArtifacts::RuntimeMetadata::SchemaElementNames ) -> void diff --git a/elasticgraph-graphql/spec/support/resolver.rb b/elasticgraph-graphql/spec/support/resolver.rb index 6db60f30..2aff24c8 100644 --- a/elasticgraph-graphql/spec/support/resolver.rb +++ b/elasticgraph-graphql/spec/support/resolver.rb @@ -82,6 +82,10 @@ def call(query:, **) graphql.runtime_metadata.schema_element_names elsif dep_name == :resolver_query_adapter resolver_query_adapter + elsif dep_name == :hash_resolver + ElasticGraph::GraphQL::Resolvers::Hash.new( + schema_element_names: graphql.runtime_metadata.schema_element_names + ) else graphql.public_send(dep_name) end diff --git a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/document_spec.rb b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/document_spec.rb new file mode 100644 index 00000000..5d23d64c --- /dev/null +++ b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/document_spec.rb @@ -0,0 +1,25 @@ +# Copyright 2024 Block, Inc. +# +# Use of this source code is governed by an MIT-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/MIT. +# +# frozen_string_literal: true + +require "elastic_graph/graphql/resolvers/document" +require_relative "hash_or_document_shared_examples" + +module ElasticGraph + class GraphQL + module Resolvers + RSpec.describe Document, :capture_logs, :resolver do + include_examples "Hash or Document resolver" + + def resolve(type_name, field_name, hash, **options) + doc = DatastoreResponse::Document.with_payload(hash) + super(type_name, field_name, doc, **options) + end + end + end + end +end diff --git a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/get_record_field_value_spec.rb b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_or_document_shared_examples.rb similarity index 84% rename from elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/get_record_field_value_spec.rb rename to elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_or_document_shared_examples.rb index d41c3a3a..00673f54 100644 --- a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/get_record_field_value_spec.rb +++ b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_or_document_shared_examples.rb @@ -6,13 +6,10 @@ # # frozen_string_literal: true -require "elastic_graph/graphql/datastore_response/document" -require "elastic_graph/graphql/resolvers/get_record_field_value" - module ElasticGraph class GraphQL module Resolvers - RSpec.describe GetRecordFieldValue, :capture_logs, :resolver do + RSpec.shared_examples_for "Hash or Document resolver", :capture_logs, :resolver do attr_accessor :schema_artifacts before(:context) do @@ -51,13 +48,6 @@ module Resolvers expect(value).to eq "Napoleon" end - it "works with an `DatastoreResponse::Document`" do - doc = DatastoreResponse::Document.with_payload("id" => 1, "name" => "Napoleon") - value = resolve(:Person, :name, doc) - - expect(value).to eq "Napoleon" - end - it "fetches a requested list field from the document" do value = resolve(:Person, :nicknames, {"id" => 1, "nicknames" => %w[Napo Leon]}) @@ -104,13 +94,6 @@ module Resolvers expect(value2).to eq "Napoleon" end - it "works with an `DatastoreResponse::Document`" do - doc = DatastoreResponse::Document.with_payload("id" => 1, "name" => "Napoleon") - value = resolve(:Person, :alt_name1, doc) - - expect(value).to eq "Napoleon" - end - it "returns `nil` for a scalar when the directive field name is missing" do value = resolve(:Person, :alt_name1, {"id" => 1}) expect(value).to eq nil diff --git a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_spec.rb b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_spec.rb new file mode 100644 index 00000000..1f7aeaf2 --- /dev/null +++ b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/hash_spec.rb @@ -0,0 +1,20 @@ +# Copyright 2024 Block, Inc. +# +# Use of this source code is governed by an MIT-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/MIT. +# +# frozen_string_literal: true + +require "elastic_graph/graphql/resolvers/hash" +require_relative "hash_or_document_shared_examples" + +module ElasticGraph + class GraphQL + module Resolvers + RSpec.describe Hash, :capture_logs, :resolver do + include_examples "Hash or Document resolver" + end + end + end +end diff --git a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/relay_connection/array_adapter_spec.rb b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/relay_connection/array_adapter_spec.rb index 4dbd78e2..68813276 100644 --- a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/relay_connection/array_adapter_spec.rb +++ b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/relay_connection/array_adapter_spec.rb @@ -6,19 +6,19 @@ # # frozen_string_literal: true -require "elastic_graph/graphql/resolvers/get_record_field_value" +require "elastic_graph/graphql/resolvers/hash" module ElasticGraph class GraphQL module Resolvers module RelayConnection # Note: while this file is `array_adapter_spec.rb`, the describe block below - # must use `GetRecordFieldValue` so we can leverage the handy `resolver` support - # (since `GetRecordFieldValue` is a resolver, but `ArrayAdapter` is not). + # must use `Hash` so we can leverage the handy `resolver` support + # (since `Hash` is a resolver, but `ArrayAdapter` is not). # It still primarily exercises the `ArrayAdapter` class defined in `array_adapter.rb`, - # but does so via the `GetRecordFieldValue` resolver, which has the added benefit - # of also verifying that `GetRecordFieldValue` builds `ArrayAdapter` properly. - RSpec.describe GetRecordFieldValue, "on a paginated collection field", :resolver do + # but does so via the `Hash` resolver, which has the added benefit + # of also verifying that `Hash` builds `ArrayAdapter` properly. + RSpec.describe Hash, "on a paginated collection field", :resolver do attr_accessor :schema_artifacts before(:context) do From 0425911b57dc2b8e8395b0444ef3f85542a1aae9 Mon Sep 17 00:00:00 2001 From: Myron Marston Date: Sun, 9 Feb 2025 15:51:03 -0800 Subject: [PATCH 2/3] Refactor: merge multiple runtime metadata overrides. This allows us to set runtime metadata overrides in multiple spots and trust that the merged result will be used. --- .../schema_definition/factory.rb | 12 +++++------ .../schema_definition/mixins/has_indices.rb | 20 +++++++++++++++++-- .../supports_filtering_and_aggregation.rb | 17 +++++++--------- .../schema_elements/built_in_types.rb | 12 +++++------ .../schema_definition/mixins/has_indices.rbs | 3 ++- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/factory.rb b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/factory.rb index 8909a85c..d4117e28 100644 --- a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/factory.rb +++ b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/factory.rb @@ -272,10 +272,10 @@ def new_aggregated_values_type_for_index_leaf_type(index_leaf_type) new_object_type @state.type_ref(index_leaf_type).as_aggregated_values.name do |type| type.graphql_only true type.documentation "A return type used from aggregations to provided aggregated values over `#{index_leaf_type}` fields." - type.runtime_metadata_overrides = { + type.override_runtime_metadata( elasticgraph_category: :scalar_aggregated_values, default_graphql_resolver: :object - } + ) type.field @state.schema_elements.approximate_distinct_value_count, "JsonSafeLong", graphql_only: true do |f| # Note: the 1-6% accuracy figure comes from the Elasticsearch docs: @@ -436,10 +436,10 @@ def edge_type_for(type_name) type_ref = @state.type_ref(type_name) new_object_type type_ref.as_edge.name do |t| t.relay_pagination_type = true - t.runtime_metadata_overrides = { + t.override_runtime_metadata( elasticgraph_category: :relay_edge, default_graphql_resolver: :object - } + ) t.documentation <<~EOS Represents a specific `#{type_name}` in the context of a `#{type_ref.as_connection.name}`, @@ -466,10 +466,10 @@ def connection_type_for(type_name, include_total_edge_count, derived_indexed_typ type_ref = @state.type_ref(type_name) new_object_type type_ref.as_connection.name do |t| t.relay_pagination_type = true - t.runtime_metadata_overrides = { + t.override_runtime_metadata( elasticgraph_category: :relay_connection, default_graphql_resolver: :object - } + ) if support_pagination t.documentation <<~EOS diff --git a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb index 617f278e..a5bda505 100644 --- a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb +++ b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb @@ -16,12 +16,12 @@ module Mixins module HasIndices # @dynamic runtime_metadata_overrides # @private - attr_accessor :runtime_metadata_overrides + attr_reader :runtime_metadata_overrides # @private def initialize(*args, **options) super(*args, **options) - self.runtime_metadata_overrides = {} + @runtime_metadata_overrides = {} yield self # Freeze `indices` so that the indexable status of a type does not change after instantiation. @@ -150,6 +150,22 @@ def derived_indexed_types @derived_indexed_types ||= [] end + # Configures overrides for runtime metadata. The provided runtime metadata values will be persisted in the + # `runtime_metadata.yaml` schema artifact and made available at runtime to `elasticgraph-graphql` and + # `elasticgraph-indexer`. + # + # @example Configure the `default_graphql_resolver` to use for a type + # ElasticGraph.define_schema do |schema| + # schema.object_type "Person" do |t| + # t.override_runtime_metadata default_graphql_resolver: :object + # end + # end + # + # @return [void] + def override_runtime_metadata(**overrides) + @runtime_metadata_overrides.merge!(overrides) + end + # @private def runtime_metadata(extra_update_targets) SchemaArtifacts::RuntimeMetadata::ObjectType.new( diff --git a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/supports_filtering_and_aggregation.rb b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/supports_filtering_and_aggregation.rb index 9c89a9a1..459ef79b 100644 --- a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/supports_filtering_and_aggregation.rb +++ b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/supports_filtering_and_aggregation.rb @@ -45,10 +45,7 @@ def derived_graphql_types [type] + schema_def_state.factory.build_relay_pagination_types(type.name, support_pagination: false) do |t| # Record metadata that is necessary for elasticgraph-graphql to correctly recognize and handle # this sub-aggregation correctly. - t.runtime_metadata_overrides = { - elasticgraph_category: :nested_sub_aggregation_connection, - default_graphql_resolver: :object - } + t.override_runtime_metadata elasticgraph_category: :nested_sub_aggregation_connection end end @@ -119,7 +116,7 @@ def sub_aggregation_types_for_nested_field_references schema_def_state.sub_aggregation_paths_for(nested_field_ref.parent_type).map do |path| schema_def_state.factory.new_object_type type_ref.as_sub_aggregation(parent_doc_types: path.parent_doc_types).name do |t| t.documentation "Return type representing a bucket of `#{name}` objects for a sub-aggregation within each `#{type_ref.as_parent_aggregation(parent_doc_types: path.parent_doc_types).name}`." - t.runtime_metadata_overrides = {default_graphql_resolver: :object} + t.override_runtime_metadata default_graphql_resolver: :object t.field schema_def_state.schema_elements.count_detail, "AggregationCountDetail", graphql_only: true do |f| f.documentation "Details of the count of `#{name}` documents in a sub-aggregation bucket." @@ -167,7 +164,7 @@ def build_aggregation_sub_aggregations_types schema_def_state.factory.new_object_type agg_sub_aggs_type_ref.name do |t| under_field_description = "under `#{path.field_path_string}` " unless path.field_path.empty? t.documentation "Provides access to the `#{schema_def_state.schema_elements.sub_aggregations}` #{under_field_description}within each `#{type_ref.as_parent_aggregation(parent_doc_types: path.parent_doc_types).name}`." - t.runtime_metadata_overrides = {default_graphql_resolver: :object} + t.override_runtime_metadata default_graphql_resolver: :object sub_aggregatable_fields.each do |field| if field.nested? @@ -230,11 +227,11 @@ def to_indexed_aggregation_type # Record metadata that is necessary for elasticgraph-graphql to correctly recognize and handle # this indexed aggregation type correctly. - t.runtime_metadata_overrides = { + t.override_runtime_metadata( source_type: name, elasticgraph_category: :indexed_aggregation, default_graphql_resolver: :object - } + ) end end @@ -245,7 +242,7 @@ def to_grouped_by_type new_non_empty_object_type type_ref.as_grouped_by.name do |t| t.documentation "Type used to specify the `#{name}` fields to group by for aggregations." - t.runtime_metadata_overrides = {default_graphql_resolver: :object} + t.override_runtime_metadata default_graphql_resolver: :object graphql_fields_by_name.values.each do |field| field.define_grouped_by_field(t) @@ -260,7 +257,7 @@ def to_aggregated_values_type new_non_empty_object_type type_ref.as_aggregated_values.name do |t| t.documentation "Type used to perform aggregation computations on `#{name}` fields." - t.runtime_metadata_overrides = {default_graphql_resolver: :object} + t.override_runtime_metadata default_graphql_resolver: :object graphql_fields_by_name.values.each do |field| field.define_aggregated_values_field(t) diff --git a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/schema_elements/built_in_types.rb b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/schema_elements/built_in_types.rb index 94ccdda2..8b2d9ea1 100644 --- a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/schema_elements/built_in_types.rb +++ b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/schema_elements/built_in_types.rb @@ -393,7 +393,7 @@ def register_standard_elastic_graph_types # to go from non-null to null, but is not a breaking change to make it non-null # in the future. register_framework_object_type "PageInfo" do |t| - t.runtime_metadata_overrides = {default_graphql_resolver: :object} + t.override_runtime_metadata default_graphql_resolver: :object t.documentation <<~EOS Provides information about the specific fetched page. This implements the `PageInfo` @@ -511,7 +511,7 @@ def register_standard_elastic_graph_types register_framework_object_type "AggregationCountDetail" do |t| t.documentation "Provides detail about an aggregation `#{names.count}`." - t.runtime_metadata_overrides = {default_graphql_resolver: :object} + t.override_runtime_metadata default_graphql_resolver: :object t.field names.approximate_value, "JsonSafeLong!", graphql_only: true do |f| f.documentation <<~EOS @@ -1293,10 +1293,10 @@ def register_date_and_time_grouped_by_types date = schema_def_state.type_ref("Date") register_framework_object_type date.as_grouped_by.name do |t| t.documentation "Allows for grouping `Date` values based on the desired return type." - t.runtime_metadata_overrides = { + t.override_runtime_metadata( elasticgraph_category: :date_grouped_by_object, default_graphql_resolver: :object - } + ) t.field names.as_date, "Date", graphql_only: true do |f| f.documentation "Used when grouping on the full `Date` value." @@ -1313,10 +1313,10 @@ def register_date_and_time_grouped_by_types date_time = schema_def_state.type_ref("DateTime") register_framework_object_type date_time.as_grouped_by.name do |t| t.documentation "Allows for grouping `DateTime` values based on the desired return type." - t.runtime_metadata_overrides = { + t.override_runtime_metadata( elasticgraph_category: :date_grouped_by_object, default_graphql_resolver: :object - } + ) t.field names.as_date_time, "DateTime", graphql_only: true do |f| f.documentation "Used when grouping on the full `DateTime` value." diff --git a/elasticgraph-schema_definition/sig/elastic_graph/schema_definition/mixins/has_indices.rbs b/elasticgraph-schema_definition/sig/elastic_graph/schema_definition/mixins/has_indices.rbs index e47ef252..beb4fae6 100644 --- a/elasticgraph-schema_definition/sig/elastic_graph/schema_definition/mixins/has_indices.rbs +++ b/elasticgraph-schema_definition/sig/elastic_graph/schema_definition/mixins/has_indices.rbs @@ -3,9 +3,10 @@ module ElasticGraph module Mixins module HasIndices attr_reader indices: ::Array[Indexing::Index] - attr_accessor runtime_metadata_overrides: ::Hash[::Symbol, untyped] + attr_reader runtime_metadata_overrides: ::Hash[::Symbol, untyped] def index: (::String, ::Hash[::Symbol, ::String | ::Integer]) ?{ (Indexing::Index) -> void } -> ::Array[Indexing::Index] def indexed?: () -> bool + def override_runtime_metadata: (**untyped) -> void def runtime_metadata: (::Array[SchemaArtifacts::RuntimeMetadata::UpdateTarget]) -> SchemaArtifacts::RuntimeMetadata::ObjectType def derived_indexed_types: () -> ::Array[Indexing::DerivedIndexedType] def derive_indexed_type_fields: ( From 13b9cfa30ecb7773bda11ec111cb300560b60cbf Mon Sep 17 00:00:00 2001 From: Myron Marston Date: Sun, 9 Feb 2025 15:45:51 -0800 Subject: [PATCH 3/3] Use new `resolver` metadata for `Document` and `Hash` resolvers. This moves us one step closer to being able to use the GraphQL gem's native resolver disaptching. --- config/schema/artifacts/runtime_metadata.yaml | 52 ++++++++++++++++++ .../runtime_metadata.yaml | 55 +++++++++++++++++++ .../lib/elastic_graph/graphql.rb | 14 ++--- .../graphql/resolvers/document.rb | 4 -- .../elastic_graph/graphql/resolvers/hash.rb | 4 -- .../graphql/resolvers/graphql_adapter_spec.rb | 39 ------------- .../schema_definition/mixins/has_indices.rb | 3 +- .../object_types_by_name/pruning_spec.rb | 2 +- 8 files changed, 117 insertions(+), 56 deletions(-) delete mode 100644 elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/graphql_adapter_spec.rb diff --git a/config/schema/artifacts/runtime_metadata.yaml b/config/schema/artifacts/runtime_metadata.yaml index de77ade9..9a67b69c 100644 --- a/config/schema/artifacts/runtime_metadata.yaml +++ b/config/schema/artifacts/runtime_metadata.yaml @@ -2664,6 +2664,7 @@ index_definitions_by_name: route_with: workspace_id2 object_types_by_name: Address: + default_graphql_resolver: document graphql_fields_by_name: manufacturer: relation: @@ -2720,10 +2721,14 @@ object_types_by_name: elasticgraph_category: relay_edge AddressGroupedBy: default_graphql_resolver: object + AddressTimestamps: + default_graphql_resolver: hash AddressTimestampsAggregatedValues: default_graphql_resolver: object AddressTimestampsGroupedBy: default_graphql_resolver: object + Affiliations: + default_graphql_resolver: hash AffiliationsAggregatedValues: default_graphql_resolver: object AffiliationsFieldsListFilterInput: @@ -2739,7 +2744,10 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + Company: + default_graphql_resolver: hash Component: + default_graphql_resolver: document graphql_fields_by_name: dollar_widget: relation: @@ -2838,6 +2846,8 @@ object_types_by_name: graphql_fields_by_name: widget_workspace_id: name_in_index: widget_workspace_id3 + CurrencyDetails: + default_graphql_resolver: hash CurrencyDetailsAggregatedValues: default_graphql_resolver: object CurrencyDetailsGroupedBy: @@ -2895,6 +2905,7 @@ object_types_by_name: count: name_in_index: __counts ElectricalPart: + default_graphql_resolver: document graphql_fields_by_name: component_aggregations: relation: @@ -2982,11 +2993,14 @@ object_types_by_name: function: min graphql_only_return_type: true GeoLocation: + default_graphql_resolver: hash graphql_fields_by_name: latitude: name_in_index: lat longitude: name_in_index: lon + GeoShape: + default_graphql_resolver: hash IDListFilterInput: graphql_fields_by_name: count: @@ -3021,6 +3035,8 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + Inventor: + default_graphql_resolver: hash InventorAggregatedValues: default_graphql_resolver: object InventorGroupedBy: @@ -3106,6 +3122,7 @@ object_types_by_name: function: sum graphql_only_return_type: true Manufacturer: + default_graphql_resolver: document graphql_fields_by_name: address: relation: @@ -3167,6 +3184,7 @@ object_types_by_name: ManufacturerGroupedBy: default_graphql_resolver: object MechanicalPart: + default_graphql_resolver: document graphql_fields_by_name: component_aggregations: relation: @@ -3231,6 +3249,8 @@ object_types_by_name: elasticgraph_category: relay_edge MechanicalPartGroupedBy: default_graphql_resolver: object + Money: + default_graphql_resolver: hash MoneyAggregatedValues: default_graphql_resolver: object MoneyFieldsListFilterInput: @@ -3244,6 +3264,7 @@ object_types_by_name: count: name_in_index: __counts NamedEntity: + default_graphql_resolver: hash graphql_fields_by_name: address: relation: @@ -3417,6 +3438,8 @@ object_types_by_name: name_in_index: widget_workspace_id3 workspace_id: name_in_index: workspace_id2 + NamedInventor: + default_graphql_resolver: hash NamedInventorAggregatedValues: default_graphql_resolver: object NamedInventorGroupedBy: @@ -3434,6 +3457,7 @@ object_types_by_name: default_graphql_resolver: object graphql_only_return_type: true Part: + default_graphql_resolver: hash graphql_fields_by_name: component_aggregations: relation: @@ -3470,6 +3494,10 @@ object_types_by_name: elasticgraph_category: relay_edge PartGroupedBy: default_graphql_resolver: object + Person: + default_graphql_resolver: hash + Player: + default_graphql_resolver: hash PlayerAggregatedValues: default_graphql_resolver: object PlayerFieldsListFilterInput: @@ -3482,6 +3510,8 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + PlayerSeason: + default_graphql_resolver: hash PlayerSeasonAggregatedValues: default_graphql_resolver: object PlayerSeasonFieldsListFilterInput: @@ -3494,6 +3524,8 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + Position: + default_graphql_resolver: hash PositionAggregatedValues: default_graphql_resolver: object PositionGroupedBy: @@ -3503,6 +3535,7 @@ object_types_by_name: count: name_in_index: __counts Sponsor: + default_graphql_resolver: document graphql_fields_by_name: affiliated_team_from_nested_aggregations: relation: @@ -3572,6 +3605,8 @@ object_types_by_name: elasticgraph_category: relay_edge SponsorGroupedBy: default_graphql_resolver: object + Sponsorship: + default_graphql_resolver: hash SponsorshipAggregatedValues: default_graphql_resolver: object SponsorshipFieldsListFilterInput: @@ -3595,6 +3630,7 @@ object_types_by_name: count: name_in_index: __counts Team: + default_graphql_resolver: document graphql_fields_by_name: nested_fields: name_in_index: the_nested_fields @@ -3693,6 +3729,8 @@ object_types_by_name: TeamConnection: default_graphql_resolver: object elasticgraph_category: relay_connection + TeamDetails: + default_graphql_resolver: hash TeamDetailsAggregatedValues: default_graphql_resolver: object TeamDetailsGroupedBy: @@ -3712,6 +3750,7 @@ object_types_by_name: default_graphql_resolver: object elasticgraph_category: nested_sub_aggregation_connection TeamNestedFields: + default_graphql_resolver: hash graphql_fields_by_name: seasons: name_in_index: the_seasons @@ -3744,6 +3783,7 @@ object_types_by_name: TeamPlayerSubAggregationSubAggregations: default_graphql_resolver: object TeamRecord: + default_graphql_resolver: hash graphql_fields_by_name: first_win_on_legacy: name_in_index: first_win_on @@ -3808,6 +3848,7 @@ object_types_by_name: wins: name_in_index: win_count TeamSeason: + default_graphql_resolver: hash graphql_fields_by_name: record: name_in_index: the_record @@ -3903,6 +3944,7 @@ object_types_by_name: TeamTeamSeasonSubAggregationSubAggregations: default_graphql_resolver: object Widget: + default_graphql_resolver: document graphql_fields_by_name: amount_cents2: name_in_index: amount_cents @@ -4102,6 +4144,7 @@ object_types_by_name: default_graphql_resolver: object elasticgraph_category: relay_connection WidgetCurrency: + default_graphql_resolver: document graphql_fields_by_name: widget_names: name_in_index: widget_names2 @@ -4176,6 +4219,8 @@ object_types_by_name: graphql_fields_by_name: widget_name: name_in_index: widget_names2 + WidgetCurrencyNestedFields: + default_graphql_resolver: hash WidgetCurrencyNestedFieldsAggregatedValues: default_graphql_resolver: object WidgetCurrencyNestedFieldsGroupedBy: @@ -4226,9 +4271,12 @@ object_types_by_name: name_in_index: the_opts workspace_id: name_in_index: workspace_id2 + WidgetOptionSets: + default_graphql_resolver: hash WidgetOptionSetsAggregatedValues: default_graphql_resolver: object WidgetOptions: + default_graphql_resolver: hash graphql_fields_by_name: the_size: name_in_index: the_sighs @@ -4247,6 +4295,7 @@ object_types_by_name: the_size: name_in_index: the_sighs WidgetOrAddress: + default_graphql_resolver: hash graphql_fields_by_name: amount_cents2: name_in_index: amount_cents @@ -4363,6 +4412,7 @@ object_types_by_name: workspace_id: name_in_index: workspace_id2 WidgetWorkspace: + default_graphql_resolver: document index_definition_names: - widget_workspaces update_targets: @@ -4428,6 +4478,8 @@ object_types_by_name: elasticgraph_category: relay_edge WidgetWorkspaceGroupedBy: default_graphql_resolver: object + WorkspaceWidget: + default_graphql_resolver: hash WorkspaceWidgetAggregatedValues: default_graphql_resolver: object WorkspaceWidgetGroupedBy: diff --git a/config/schema/artifacts_with_apollo/runtime_metadata.yaml b/config/schema/artifacts_with_apollo/runtime_metadata.yaml index 65c60103..27f658f0 100644 --- a/config/schema/artifacts_with_apollo/runtime_metadata.yaml +++ b/config/schema/artifacts_with_apollo/runtime_metadata.yaml @@ -2667,6 +2667,7 @@ index_definitions_by_name: route_with: workspace_id2 object_types_by_name: Address: + default_graphql_resolver: document graphql_fields_by_name: manufacturer: relation: @@ -2723,10 +2724,14 @@ object_types_by_name: elasticgraph_category: relay_edge AddressGroupedBy: default_graphql_resolver: object + AddressTimestamps: + default_graphql_resolver: hash AddressTimestampsAggregatedValues: default_graphql_resolver: object AddressTimestampsGroupedBy: default_graphql_resolver: object + Affiliations: + default_graphql_resolver: hash AffiliationsAggregatedValues: default_graphql_resolver: object AffiliationsFieldsListFilterInput: @@ -2742,7 +2747,10 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + Company: + default_graphql_resolver: hash Component: + default_graphql_resolver: document graphql_fields_by_name: dollar_widget: relation: @@ -2842,6 +2850,7 @@ object_types_by_name: widget_workspace_id: name_in_index: widget_workspace_id3 Country: + default_graphql_resolver: hash graphql_fields_by_name: team_aggregations: relation: @@ -2853,6 +2862,8 @@ object_types_by_name: direction: in foreign_key: country_code resolver: nested_relationships + CurrencyDetails: + default_graphql_resolver: hash CurrencyDetailsAggregatedValues: default_graphql_resolver: object CurrencyDetailsGroupedBy: @@ -2910,6 +2921,7 @@ object_types_by_name: count: name_in_index: __counts ElectricalPart: + default_graphql_resolver: document graphql_fields_by_name: component_aggregations: relation: @@ -2997,11 +3009,14 @@ object_types_by_name: function: min graphql_only_return_type: true GeoLocation: + default_graphql_resolver: hash graphql_fields_by_name: latitude: name_in_index: lat longitude: name_in_index: lon + GeoShape: + default_graphql_resolver: hash IDListFilterInput: graphql_fields_by_name: count: @@ -3036,6 +3051,8 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + Inventor: + default_graphql_resolver: hash InventorAggregatedValues: default_graphql_resolver: object InventorGroupedBy: @@ -3121,6 +3138,7 @@ object_types_by_name: function: sum graphql_only_return_type: true Manufacturer: + default_graphql_resolver: document graphql_fields_by_name: address: relation: @@ -3182,6 +3200,7 @@ object_types_by_name: ManufacturerGroupedBy: default_graphql_resolver: object MechanicalPart: + default_graphql_resolver: document graphql_fields_by_name: component_aggregations: relation: @@ -3246,6 +3265,8 @@ object_types_by_name: elasticgraph_category: relay_edge MechanicalPartGroupedBy: default_graphql_resolver: object + Money: + default_graphql_resolver: hash MoneyAggregatedValues: default_graphql_resolver: object MoneyFieldsListFilterInput: @@ -3259,6 +3280,7 @@ object_types_by_name: count: name_in_index: __counts NamedEntity: + default_graphql_resolver: hash graphql_fields_by_name: address: relation: @@ -3432,6 +3454,8 @@ object_types_by_name: name_in_index: widget_workspace_id3 workspace_id: name_in_index: workspace_id2 + NamedInventor: + default_graphql_resolver: hash NamedInventorAggregatedValues: default_graphql_resolver: object NamedInventorGroupedBy: @@ -3449,6 +3473,7 @@ object_types_by_name: default_graphql_resolver: object graphql_only_return_type: true Part: + default_graphql_resolver: hash graphql_fields_by_name: component_aggregations: relation: @@ -3485,6 +3510,10 @@ object_types_by_name: elasticgraph_category: relay_edge PartGroupedBy: default_graphql_resolver: object + Person: + default_graphql_resolver: hash + Player: + default_graphql_resolver: hash PlayerAggregatedValues: default_graphql_resolver: object PlayerFieldsListFilterInput: @@ -3497,6 +3526,8 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + PlayerSeason: + default_graphql_resolver: hash PlayerSeasonAggregatedValues: default_graphql_resolver: object PlayerSeasonFieldsListFilterInput: @@ -3509,6 +3540,8 @@ object_types_by_name: graphql_fields_by_name: count: name_in_index: __counts + Position: + default_graphql_resolver: hash PositionAggregatedValues: default_graphql_resolver: object PositionGroupedBy: @@ -3518,6 +3551,7 @@ object_types_by_name: count: name_in_index: __counts Sponsor: + default_graphql_resolver: document graphql_fields_by_name: affiliated_team_from_nested_aggregations: relation: @@ -3587,6 +3621,8 @@ object_types_by_name: elasticgraph_category: relay_edge SponsorGroupedBy: default_graphql_resolver: object + Sponsorship: + default_graphql_resolver: hash SponsorshipAggregatedValues: default_graphql_resolver: object SponsorshipFieldsListFilterInput: @@ -3610,6 +3646,7 @@ object_types_by_name: count: name_in_index: __counts Team: + default_graphql_resolver: document graphql_fields_by_name: nested_fields: name_in_index: the_nested_fields @@ -3708,6 +3745,8 @@ object_types_by_name: TeamConnection: default_graphql_resolver: object elasticgraph_category: relay_connection + TeamDetails: + default_graphql_resolver: hash TeamDetailsAggregatedValues: default_graphql_resolver: object TeamDetailsGroupedBy: @@ -3727,6 +3766,7 @@ object_types_by_name: default_graphql_resolver: object elasticgraph_category: nested_sub_aggregation_connection TeamNestedFields: + default_graphql_resolver: hash graphql_fields_by_name: seasons: name_in_index: the_seasons @@ -3759,6 +3799,7 @@ object_types_by_name: TeamPlayerSubAggregationSubAggregations: default_graphql_resolver: object TeamRecord: + default_graphql_resolver: hash graphql_fields_by_name: first_win_on_legacy: name_in_index: first_win_on @@ -3823,6 +3864,7 @@ object_types_by_name: wins: name_in_index: win_count TeamSeason: + default_graphql_resolver: hash graphql_fields_by_name: record: name_in_index: the_record @@ -3918,6 +3960,7 @@ object_types_by_name: TeamTeamSeasonSubAggregationSubAggregations: default_graphql_resolver: object Widget: + default_graphql_resolver: document graphql_fields_by_name: amount_cents2: name_in_index: amount_cents @@ -4117,6 +4160,7 @@ object_types_by_name: default_graphql_resolver: object elasticgraph_category: relay_connection WidgetCurrency: + default_graphql_resolver: document graphql_fields_by_name: widget_names: name_in_index: widget_names2 @@ -4191,6 +4235,8 @@ object_types_by_name: graphql_fields_by_name: widget_name: name_in_index: widget_names2 + WidgetCurrencyNestedFields: + default_graphql_resolver: hash WidgetCurrencyNestedFieldsAggregatedValues: default_graphql_resolver: object WidgetCurrencyNestedFieldsGroupedBy: @@ -4241,9 +4287,12 @@ object_types_by_name: name_in_index: the_opts workspace_id: name_in_index: workspace_id2 + WidgetOptionSets: + default_graphql_resolver: hash WidgetOptionSetsAggregatedValues: default_graphql_resolver: object WidgetOptions: + default_graphql_resolver: hash graphql_fields_by_name: the_size: name_in_index: the_sighs @@ -4262,6 +4311,7 @@ object_types_by_name: the_size: name_in_index: the_sighs WidgetOrAddress: + default_graphql_resolver: hash graphql_fields_by_name: amount_cents2: name_in_index: amount_cents @@ -4378,6 +4428,7 @@ object_types_by_name: workspace_id: name_in_index: workspace_id2 WidgetWorkspace: + default_graphql_resolver: document index_definition_names: - widget_workspaces update_targets: @@ -4443,13 +4494,17 @@ object_types_by_name: elasticgraph_category: relay_edge WidgetWorkspaceGroupedBy: default_graphql_resolver: object + WorkspaceWidget: + default_graphql_resolver: hash WorkspaceWidgetAggregatedValues: default_graphql_resolver: object WorkspaceWidgetGroupedBy: default_graphql_resolver: object _Entity: + default_graphql_resolver: hash graphql_only_return_type: true _Service: + default_graphql_resolver: hash graphql_only_return_type: true scalar_types_by_name: Boolean: diff --git a/elasticgraph-graphql/lib/elastic_graph/graphql.rb b/elasticgraph-graphql/lib/elastic_graph/graphql.rb index e1abf6e7..645680ff 100644 --- a/elasticgraph-graphql/lib/elastic_graph/graphql.rb +++ b/elasticgraph-graphql/lib/elastic_graph/graphql.rb @@ -166,21 +166,17 @@ def graphql_gem_plugins # @private def graphql_resolvers @graphql_resolvers ||= begin - require "elastic_graph/graphql/resolvers/document" - require "elastic_graph/graphql/resolvers/hash" require "elastic_graph/graphql/resolvers/list_records" - list_records = Resolvers::ListRecords.new(resolver_query_adapter: resolver_query_adapter) - hash = Resolvers::Hash.new(schema_element_names: runtime_metadata.schema_element_names) - document = Resolvers::Document.new(hash_resolver: hash) - - [list_records, hash, document] + [Resolvers::ListRecords.new(resolver_query_adapter: resolver_query_adapter)] end end # @private def named_graphql_resolvers @named_graphql_resolvers ||= begin + require "elastic_graph/graphql/resolvers/document" + require "elastic_graph/graphql/resolvers/hash" require "elastic_graph/graphql/resolvers/nested_relationships" require "elastic_graph/graphql/resolvers/object" @@ -190,7 +186,11 @@ def named_graphql_resolvers logger: logger ) + hash = Resolvers::Hash.new(schema_element_names: runtime_metadata.schema_element_names) + { + document: Resolvers::Document.new(hash_resolver: hash), + hash: hash, nested_relationships: nested_relationships, object: Resolvers::Object.new } diff --git a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb index 7e95bca1..02a77c10 100644 --- a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb +++ b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/document.rb @@ -19,10 +19,6 @@ def initialize(hash_resolver:) @hash_resolver = hash_resolver end - def can_resolve?(field:, object:) - object.is_a?(DatastoreResponse::Document) - end - def call(parent_type, graphql_field, object, args, context) @hash_resolver.call(parent_type, graphql_field, object.payload, args, context) end diff --git a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb index 26228013..5dad88fc 100644 --- a/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb +++ b/elasticgraph-graphql/lib/elastic_graph/graphql/resolvers/hash.rb @@ -19,10 +19,6 @@ def initialize(schema_element_names:) @schema_element_names = schema_element_names end - def can_resolve?(field:, object:) - object.is_a?(::Hash) - end - def call(parent_type, graphql_field, object, args, context) field = context.fetch(:elastic_graph_schema).field_named(parent_type.graphql_name, graphql_field.name) field_name = field.name_in_index.to_s diff --git a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/graphql_adapter_spec.rb b/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/graphql_adapter_spec.rb deleted file mode 100644 index bc31c38e..00000000 --- a/elasticgraph-graphql/spec/unit/elastic_graph/graphql/resolvers/graphql_adapter_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2024 Block, Inc. -# -# Use of this source code is governed by an MIT-style -# license that can be found in the LICENSE file or at -# https://opensource.org/licenses/MIT. -# -# frozen_string_literal: true - -require "elastic_graph/graphql/resolvers/graphql_adapter" - -module ElasticGraph - class GraphQL - module Resolvers - RSpec.describe GraphQLAdapter do - let(:graphql) { build_graphql } - let(:schema) { graphql.schema } - - it "raises a clear error when no resolver can be found" do - adapter = GraphQLAdapter.new( - schema: schema, - runtime_metadata: graphql.runtime_metadata, - named_resolvers: graphql.named_graphql_resolvers, - resolvers: graphql.graphql_resolvers - ) - - expect { - adapter.call( - schema.type_named(:Widget).graphql_type, - schema.field_named(:Widget, :id).instance_variable_get(:@graphql_field), - nil, - {}, - {} - ) - }.to raise_error(a_string_including("No resolver", "Widget.id")) - end - end - end - end -end diff --git a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb index a5bda505..3c7d72c5 100644 --- a/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb +++ b/elasticgraph-schema_definition/lib/elastic_graph/schema_definition/mixins/has_indices.rb @@ -21,7 +21,7 @@ module HasIndices # @private def initialize(*args, **options) super(*args, **options) - @runtime_metadata_overrides = {} + @runtime_metadata_overrides = {default_graphql_resolver: :hash} yield self # Freeze `indices` so that the indexable status of a type does not change after instantiation. @@ -64,6 +64,7 @@ def initialize(*args, **options) # end def index(name, **settings, &block) indices.replace([Indexing::Index.new(name, settings, schema_def_state, self, &block)]) + override_runtime_metadata default_graphql_resolver: :document end # List of indices. (Currently we only store one but we may support multiple in the future). diff --git a/elasticgraph-schema_definition/spec/unit/elastic_graph/schema_definition/runtime_metadata/object_types_by_name/pruning_spec.rb b/elasticgraph-schema_definition/spec/unit/elastic_graph/schema_definition/runtime_metadata/object_types_by_name/pruning_spec.rb index c58b86de..53cfd090 100644 --- a/elasticgraph-schema_definition/spec/unit/elastic_graph/schema_definition/runtime_metadata/object_types_by_name/pruning_spec.rb +++ b/elasticgraph-schema_definition/spec/unit/elastic_graph/schema_definition/runtime_metadata/object_types_by_name/pruning_spec.rb @@ -26,7 +26,6 @@ module SchemaDefinition t.field "size", "Int", name_in_index: "size_in_index" end - # NoCustomizations should not be dumped because it needs no runtime metadata s.object_type "NoCustomizations" do |t| t.field "size", "Int", graphql_only: true end @@ -71,6 +70,7 @@ module SchemaDefinition LongStringAggregatedValues LongStringListFilterInput MatchesQueryAllowedEditsPerTermListFilterInput + NoCustomizations NoCustomizationsAggregatedValues NoCustomizationsFieldsListFilterInput NoCustomizationsGroupedBy