From d0b2634773f93e9ccd248e3d98446d4571ad2f62 Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Fri, 21 Jul 2023 16:48:23 +0000 Subject: [PATCH 01/10] Instrument usage of ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation --- .../graphql/execution/ExecutionContext.java | 12 +++++++++- .../ChainedInstrumentation.java | 16 +++++++------- .../instrumentation/Instrumentation.java | 22 ++++++++++++------- .../NoContextChainedInstrumentation.java | 14 ++++++------ ...ionParseExecutableNormalizedOperation.java | 18 +++++++++++++++ src/test/groovy/graphql/StarWarsData.groovy | 1 + .../ChainedInstrumentationStateTest.groovy | 6 +++++ .../InstrumentationTest.groovy | 2 ++ .../ModernTestingInstrumentation.groovy | 8 +++++++ .../NamedInstrumentation.groovy | 8 +++++++ ...NoContextChainedInstrumentationTest.groovy | 1 + 11 files changed, 84 insertions(+), 24 deletions(-) create mode 100644 src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java diff --git a/src/main/java/graphql/execution/ExecutionContext.java b/src/main/java/graphql/execution/ExecutionContext.java index 5bdc076d36..8f0194e6b8 100644 --- a/src/main/java/graphql/execution/ExecutionContext.java +++ b/src/main/java/graphql/execution/ExecutionContext.java @@ -14,6 +14,7 @@ import graphql.execution.incremental.IncrementalCallState; import graphql.execution.instrumentation.Instrumentation; import graphql.execution.instrumentation.InstrumentationState; +import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation; import graphql.language.Document; import graphql.language.FragmentDefinition; import graphql.language.OperationDefinition; @@ -100,7 +101,7 @@ public class ExecutionContext { this.localContext = builder.localContext; this.executionInput = builder.executionInput; this.dataLoaderDispatcherStrategy = builder.dataLoaderDispatcherStrategy; - this.queryTree = FpKit.interThreadMemoize(() -> ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables)); + this.queryTree = FpKit.interThreadMemoize(this::createExecutableNormalizedOperation); this.propagateErrorsOnNonNullContractFailure = builder.propagateErrorsOnNonNullContractFailure; this.engineRunningState = builder.engineRunningState; } @@ -368,6 +369,15 @@ public ResultNodesInfo getResultNodesInfo() { return resultNodesInfo; } + private ExecutableNormalizedOperation createExecutableNormalizedOperation() { + var instrument = instrumentation.beginParseExecutableNormalizedOperation(new InstrumentationParseExecutableNormalizedOperation(executionInput, graphQLSchema), instrumentationState); + var result = ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables); + if (instrument != null) { + instrument.onCompleted(result, null); + } + return result; + } + @Internal public boolean hasIncrementalSupport() { GraphQLContext graphqlContext = getGraphQLContext(); diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index daca12293f..4d4131ba30 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -8,15 +8,9 @@ import graphql.execution.Async; import graphql.execution.ExecutionContext; import graphql.execution.FieldValueInfo; -import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; +import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; +import graphql.normalized.ExecutableNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -126,6 +120,12 @@ public InstrumentationContext beginParse(InstrumentationExecutionParam return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginParse(parameters, specificState)); } + @Override + public InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + return chainedCtx(state, (instrumentation, specificState) -> + instrumentation.beginParseExecutableNormalizedOperation(parameters, specificState)); + } + @Override public InstrumentationContext> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) { diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index 714f96fe3c..91309af76b 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -5,15 +5,9 @@ import graphql.ExperimentalApi; import graphql.PublicSpi; import graphql.execution.ExecutionContext; -import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; +import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; +import graphql.normalized.ExecutableNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -120,6 +114,18 @@ default InstrumentationContext beginExecuteOperation(Instrument return noOp(); } + /** + * This is called just before the parsing of the executable normalized operation is started. + * + * @param parameters the parameters to this step + * @param state the state created during the call to {@link #createState(InstrumentationCreateStateParameters)} + * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) + */ + @Nullable + default InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + return noOp(); + } + /** * This is called each time an {@link graphql.execution.ExecutionStrategy} is invoked, which may be multiple times * per query as the engine recursively descends over the query. diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index 89e91b6e50..2642663f78 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -2,14 +2,9 @@ import graphql.ExecutionResult; import graphql.PublicApi; -import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; -import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; -import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; +import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; +import graphql.normalized.ExecutableNormalizedOperation; import graphql.validation.ValidationError; import org.jspecify.annotations.Nullable; @@ -83,6 +78,11 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecuteObject(parameters, specificState)); } + @Override + public @Nullable InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + return runAll(state, (instrumentation, specificState) -> instrumentation.beginParseExecutableNormalizedOperation(parameters, specificState)); + } + @Override public InstrumentationContext beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginSubscribedFieldEvent(parameters, specificState)); diff --git a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java new file mode 100644 index 0000000000..7e6a44d15e --- /dev/null +++ b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java @@ -0,0 +1,18 @@ +package graphql.execution.instrumentation.parameters; + +import graphql.ExecutionInput; +import graphql.PublicApi; +import graphql.execution.instrumentation.Instrumentation; +import graphql.execution.instrumentation.InstrumentationState; +import graphql.schema.GraphQLSchema; + +/** + * Parameters sent to {@link Instrumentation} methods + */ +@SuppressWarnings("TypeParameterUnusedInFormals") +@PublicApi +public class InstrumentationParseExecutableNormalizedOperation extends InstrumentationExecutionParameters { + public InstrumentationParseExecutableNormalizedOperation(ExecutionInput executionInput, GraphQLSchema schema) { + super(executionInput, schema); + } +} diff --git a/src/test/groovy/graphql/StarWarsData.groovy b/src/test/groovy/graphql/StarWarsData.groovy index d4a406d565..00fb552c71 100644 --- a/src/test/groovy/graphql/StarWarsData.groovy +++ b/src/test/groovy/graphql/StarWarsData.groovy @@ -105,6 +105,7 @@ class StarWarsData { static TypeResolver characterTypeResolver = new TypeResolver() { @Override GraphQLObjectType getType(TypeResolutionEnvironment env) { + env.getSelectionSet().getFields() // Used to validate instrumentation def id = env.getObject().id if (humanData[id] != null) return StarWarsSchema.humanType diff --git a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy index 88d7c86538..22fc7971df 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy @@ -55,6 +55,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", + "start:parse-executable-normalized-operation", + "end:parse-executable-normalized-operation", "start:execute-object", @@ -143,6 +145,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", + "start:parse-executable-normalized-operation", + "end:parse-executable-normalized-operation", "start:execute-object", @@ -183,6 +187,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", + "start:parse-executable-normalized-operation", + "end:parse-executable-normalized-operation", "start:execute-object", diff --git a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy index 6580d59904..79a7a67a77 100644 --- a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy @@ -312,6 +312,8 @@ class InstrumentationTest extends Specification { "onDispatched:fetch-hero", "end:fetch-hero", "start:complete-hero", + "start:parse-executable-normalized-operation", + "end:parse-executable-normalized-operation", "start:execute-object", "start:field-id", "start:fetch-id", diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 822d08f5a6..7eca95e0e3 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -10,8 +10,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionStra import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters +import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document +import graphql.normalized.ExecutableNormalizedOperation import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment import graphql.schema.GraphQLSchema @@ -73,6 +75,12 @@ class ModernTestingInstrumentation implements Instrumentation { return new TestingInstrumentContext("execute-operation", executionList, throwableList, useOnDispatch) } + @Override + InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + assert state == instrumentationState + return new TestingInstrumentContext("parse-executable-normalized-operation", executionList, throwableList, useOnDispatch) + } + @Override InstrumentationContext beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) { assert state == instrumentationState diff --git a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy index 5e17e040ad..9412dd3df6 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy @@ -7,8 +7,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionPara import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters +import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document +import graphql.normalized.ExecutableNormalizedOperation import graphql.schema.DataFetcher import graphql.validation.ValidationError @@ -72,6 +74,12 @@ class NamedInstrumentation extends ModernTestingInstrumentation { return super.beginFieldExecution(parameters, state) } + @Override + InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + assertState(state) + return super.beginParseExecutableNormalizedOperation(parameters, state) + } + @Override InstrumentationContext beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { assertState(state) diff --git a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy index 981f756633..88c9d30d86 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy @@ -41,6 +41,7 @@ class NoContextChainedInstrumentationTest extends Specification { "start:field-hero", "start:fetch-hero", "start:complete-hero", + "start:parse-executable-normalized-operation", "start:execute-object", From 6ac9b17c97c01e777a60166c899839efafea770d Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Wed, 9 Jul 2025 15:34:41 +0800 Subject: [PATCH 02/10] Use interface for parsed normalized operation --- .../java/graphql/execution/ExecutionContext.java | 5 +++-- .../instrumentation/ChainedInstrumentation.java | 6 +++--- .../execution/instrumentation/Instrumentation.java | 5 +++-- .../NoContextChainedInstrumentation.java | 5 +++-- ...> InstrumentationParsedNormalizedOperation.java} | 5 ++--- .../normalized/ExecutableNormalizedOperation.java | 2 +- .../normalized/ParsedNormalizedOperation.java | 13 +++++++++++++ .../graphql/normalized/nf/NormalizedOperation.java | 3 ++- .../ChainedInstrumentationStateTest.groovy | 12 ++++++------ .../instrumentation/InstrumentationTest.groovy | 4 ++-- .../ModernTestingInstrumentation.groovy | 7 ++++--- .../instrumentation/NamedInstrumentation.groovy | 7 ++++--- .../NoContextChainedInstrumentationTest.groovy | 2 +- 13 files changed, 47 insertions(+), 29 deletions(-) rename src/main/java/graphql/execution/instrumentation/parameters/{InstrumentationParseExecutableNormalizedOperation.java => InstrumentationParsedNormalizedOperation.java} (56%) create mode 100644 src/main/java/graphql/normalized/ParsedNormalizedOperation.java diff --git a/src/main/java/graphql/execution/ExecutionContext.java b/src/main/java/graphql/execution/ExecutionContext.java index 8f0194e6b8..20ca11547c 100644 --- a/src/main/java/graphql/execution/ExecutionContext.java +++ b/src/main/java/graphql/execution/ExecutionContext.java @@ -14,7 +14,7 @@ import graphql.execution.incremental.IncrementalCallState; import graphql.execution.instrumentation.Instrumentation; import graphql.execution.instrumentation.InstrumentationState; -import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation; +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation; import graphql.language.Document; import graphql.language.FragmentDefinition; import graphql.language.OperationDefinition; @@ -370,7 +370,8 @@ public ResultNodesInfo getResultNodesInfo() { } private ExecutableNormalizedOperation createExecutableNormalizedOperation() { - var instrument = instrumentation.beginParseExecutableNormalizedOperation(new InstrumentationParseExecutableNormalizedOperation(executionInput, graphQLSchema), instrumentationState); + var parameters = new InstrumentationParsedNormalizedOperation(executionInput, graphQLSchema); + var instrument = instrumentation.beginParsedNormalizedOperation(parameters, instrumentationState); var result = ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables); if (instrument != null) { instrument.onCompleted(result, null); diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index 4d4131ba30..d633088395 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -10,7 +10,7 @@ import graphql.execution.FieldValueInfo; import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; -import graphql.normalized.ExecutableNormalizedOperation; +import graphql.normalized.ParsedNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -121,9 +121,9 @@ public InstrumentationContext beginParse(InstrumentationExecutionParam } @Override - public InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + public InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> - instrumentation.beginParseExecutableNormalizedOperation(parameters, specificState)); + instrumentation.beginParsedNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index 91309af76b..536ce550d6 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -8,6 +8,7 @@ import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; import graphql.normalized.ExecutableNormalizedOperation; +import graphql.normalized.ParsedNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -115,14 +116,14 @@ default InstrumentationContext beginExecuteOperation(Instrument } /** - * This is called just before the parsing of the executable normalized operation is started. + * This is called just before the parsing of the normalized operation is started. * * @param parameters the parameters to this step * @param state the state created during the call to {@link #createState(InstrumentationCreateStateParameters)} * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) */ @Nullable - default InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + default InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { return noOp(); } diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index 2642663f78..47c8f6ba92 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -5,6 +5,7 @@ import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; import graphql.normalized.ExecutableNormalizedOperation; +import graphql.normalized.ParsedNormalizedOperation; import graphql.validation.ValidationError; import org.jspecify.annotations.Nullable; @@ -79,8 +80,8 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument } @Override - public @Nullable InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { - return runAll(state, (instrumentation, specificState) -> instrumentation.beginParseExecutableNormalizedOperation(parameters, specificState)); + public @Nullable InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { + return runAll(state, (instrumentation, specificState) -> instrumentation.beginParsedNormalizedOperation(parameters, specificState)); } @Override diff --git a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperation.java similarity index 56% rename from src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java rename to src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperation.java index 7e6a44d15e..3723a3e854 100644 --- a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParseExecutableNormalizedOperation.java +++ b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperation.java @@ -3,7 +3,6 @@ import graphql.ExecutionInput; import graphql.PublicApi; import graphql.execution.instrumentation.Instrumentation; -import graphql.execution.instrumentation.InstrumentationState; import graphql.schema.GraphQLSchema; /** @@ -11,8 +10,8 @@ */ @SuppressWarnings("TypeParameterUnusedInFormals") @PublicApi -public class InstrumentationParseExecutableNormalizedOperation extends InstrumentationExecutionParameters { - public InstrumentationParseExecutableNormalizedOperation(ExecutionInput executionInput, GraphQLSchema schema) { +public class InstrumentationParsedNormalizedOperation extends InstrumentationExecutionParameters { + public InstrumentationParsedNormalizedOperation(ExecutionInput executionInput, GraphQLSchema schema) { super(executionInput, schema); } } diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java b/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java index cfcda2746d..e2bbdab417 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java @@ -23,7 +23,7 @@ * An operation consists of a list of {@link ExecutableNormalizedField}s in a parent child hierarchy */ @PublicApi -public class ExecutableNormalizedOperation { +public class ExecutableNormalizedOperation implements ParsedNormalizedOperation { private final OperationDefinition.Operation operation; private final String operationName; private final List topLevelFields; diff --git a/src/main/java/graphql/normalized/ParsedNormalizedOperation.java b/src/main/java/graphql/normalized/ParsedNormalizedOperation.java new file mode 100644 index 0000000000..666c75c1f4 --- /dev/null +++ b/src/main/java/graphql/normalized/ParsedNormalizedOperation.java @@ -0,0 +1,13 @@ +package graphql.normalized; + +import graphql.PublicApi; + +/** + * A {@link ParsedNormalizedOperation} represents a parsed and normalized operation in GraphQL. + * It is used to handle the execution of GraphQL operations according to the specification, + * including merging duplicate fields and handling type detection for fields that may correspond + * to multiple object types. + */ +@PublicApi +public interface ParsedNormalizedOperation { +} diff --git a/src/main/java/graphql/normalized/nf/NormalizedOperation.java b/src/main/java/graphql/normalized/nf/NormalizedOperation.java index 6d3c333d0b..10d568c463 100644 --- a/src/main/java/graphql/normalized/nf/NormalizedOperation.java +++ b/src/main/java/graphql/normalized/nf/NormalizedOperation.java @@ -8,6 +8,7 @@ import graphql.execution.directives.QueryDirectives; import graphql.language.Field; import graphql.language.OperationDefinition; +import graphql.normalized.ParsedNormalizedOperation; import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLFieldsContainer; @@ -23,7 +24,7 @@ * An operation consists of a list of {@link NormalizedField}s in a parent child hierarchy */ @ExperimentalApi -public class NormalizedOperation { +public class NormalizedOperation implements ParsedNormalizedOperation { private final OperationDefinition.Operation operation; private final String operationName; private final List rootFields; diff --git a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy index 22fc7971df..435d2c5f01 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy @@ -55,8 +55,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parse-executable-normalized-operation", - "end:parse-executable-normalized-operation", + "start:parsed-normalized-operation", + "end:parsed-normalized-operation", "start:execute-object", @@ -145,8 +145,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parse-executable-normalized-operation", - "end:parse-executable-normalized-operation", + "start:parsed-normalized-operation", + "end:parsed-normalized-operation", "start:execute-object", @@ -187,8 +187,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parse-executable-normalized-operation", - "end:parse-executable-normalized-operation", + "start:parsed-normalized-operation", + "end:parsed-normalized-operation", "start:execute-object", diff --git a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy index 79a7a67a77..87b8323bdd 100644 --- a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy @@ -312,8 +312,8 @@ class InstrumentationTest extends Specification { "onDispatched:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parse-executable-normalized-operation", - "end:parse-executable-normalized-operation", + "start:parsed-normalized-operation", + "end:parsed-normalized-operation", "start:execute-object", "start:field-id", "start:fetch-id", diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 7eca95e0e3..08ee23f3af 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -10,10 +10,11 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionStra import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document import graphql.normalized.ExecutableNormalizedOperation +import graphql.normalized.ParsedNormalizedOperation import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment import graphql.schema.GraphQLSchema @@ -76,9 +77,9 @@ class ModernTestingInstrumentation implements Instrumentation { } @Override - InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { assert state == instrumentationState - return new TestingInstrumentContext("parse-executable-normalized-operation", executionList, throwableList, useOnDispatch) + return new TestingInstrumentContext("parsed-normalized-operation", executionList, throwableList, useOnDispatch) } @Override diff --git a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy index 9412dd3df6..f3149d23b4 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy @@ -7,10 +7,11 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionPara import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document import graphql.normalized.ExecutableNormalizedOperation +import graphql.normalized.ParsedNormalizedOperation import graphql.schema.DataFetcher import graphql.validation.ValidationError @@ -75,9 +76,9 @@ class NamedInstrumentation extends ModernTestingInstrumentation { } @Override - InstrumentationContext beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) { + InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { assertState(state) - return super.beginParseExecutableNormalizedOperation(parameters, state) + return super.beginParsedNormalizedOperation(parameters, state) } @Override diff --git a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy index 88c9d30d86..a7a57d4be8 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy @@ -41,7 +41,7 @@ class NoContextChainedInstrumentationTest extends Specification { "start:field-hero", "start:fetch-hero", "start:complete-hero", - "start:parse-executable-normalized-operation", + "start:parsed-normalized-operation", "start:execute-object", From 372949659a8603eccde20c7d51fdbfe43a9aa259 Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 10:43:09 +0800 Subject: [PATCH 03/10] Fix imports. --- .../execution/instrumentation/Instrumentation.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index 536ce550d6..d772b4ca3b 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -5,9 +5,16 @@ import graphql.ExperimentalApi; import graphql.PublicSpi; import graphql.execution.ExecutionContext; -import graphql.execution.instrumentation.parameters.*; +import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation; +import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.ExecutableNormalizedOperation; import graphql.normalized.ParsedNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; From 3a4401f5350bcba8421e3a496070680a8b9d3413 Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 10:47:24 +0800 Subject: [PATCH 04/10] Add Parameters suffix to InstrumentationParsedNormalizedOperation --- src/main/java/graphql/execution/ExecutionContext.java | 4 ++-- .../execution/instrumentation/ChainedInstrumentation.java | 2 +- .../graphql/execution/instrumentation/Instrumentation.java | 4 ++-- .../instrumentation/NoContextChainedInstrumentation.java | 3 +-- ... InstrumentationParsedNormalizedOperationParameters.java} | 4 ++-- .../instrumentation/ModernTestingInstrumentation.groovy | 5 ++--- .../execution/instrumentation/NamedInstrumentation.groovy | 5 ++--- 7 files changed, 12 insertions(+), 15 deletions(-) rename src/main/java/graphql/execution/instrumentation/parameters/{InstrumentationParsedNormalizedOperation.java => InstrumentationParsedNormalizedOperationParameters.java} (62%) diff --git a/src/main/java/graphql/execution/ExecutionContext.java b/src/main/java/graphql/execution/ExecutionContext.java index 20ca11547c..626ad1f3d0 100644 --- a/src/main/java/graphql/execution/ExecutionContext.java +++ b/src/main/java/graphql/execution/ExecutionContext.java @@ -14,7 +14,7 @@ import graphql.execution.incremental.IncrementalCallState; import graphql.execution.instrumentation.Instrumentation; import graphql.execution.instrumentation.InstrumentationState; -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation; +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters; import graphql.language.Document; import graphql.language.FragmentDefinition; import graphql.language.OperationDefinition; @@ -370,7 +370,7 @@ public ResultNodesInfo getResultNodesInfo() { } private ExecutableNormalizedOperation createExecutableNormalizedOperation() { - var parameters = new InstrumentationParsedNormalizedOperation(executionInput, graphQLSchema); + var parameters = new InstrumentationParsedNormalizedOperationParameters(executionInput, graphQLSchema); var instrument = instrumentation.beginParsedNormalizedOperation(parameters, instrumentationState); var result = ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables); if (instrument != null) { diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index d633088395..7f0cebde86 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -121,7 +121,7 @@ public InstrumentationContext beginParse(InstrumentationExecutionParam } @Override - public InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { + public InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginParsedNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index d772b4ca3b..13f4de5fd3 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -12,7 +12,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation; +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; import graphql.normalized.ParsedNormalizedOperation; @@ -130,7 +130,7 @@ default InstrumentationContext beginExecuteOperation(Instrument * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) */ @Nullable - default InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { + default InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { return noOp(); } diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index 47c8f6ba92..df56408aaa 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -4,7 +4,6 @@ import graphql.PublicApi; import graphql.execution.instrumentation.parameters.*; import graphql.language.Document; -import graphql.normalized.ExecutableNormalizedOperation; import graphql.normalized.ParsedNormalizedOperation; import graphql.validation.ValidationError; import org.jspecify.annotations.Nullable; @@ -80,7 +79,7 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument } @Override - public @Nullable InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginParsedNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperation.java b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperationParameters.java similarity index 62% rename from src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperation.java rename to src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperationParameters.java index 3723a3e854..9364c5ee5c 100644 --- a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperation.java +++ b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperationParameters.java @@ -10,8 +10,8 @@ */ @SuppressWarnings("TypeParameterUnusedInFormals") @PublicApi -public class InstrumentationParsedNormalizedOperation extends InstrumentationExecutionParameters { - public InstrumentationParsedNormalizedOperation(ExecutionInput executionInput, GraphQLSchema schema) { +public class InstrumentationParsedNormalizedOperationParameters extends InstrumentationExecutionParameters { + public InstrumentationParsedNormalizedOperationParameters(ExecutionInput executionInput, GraphQLSchema schema) { super(executionInput, schema); } } diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 08ee23f3af..18fdfa89ae 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -10,10 +10,9 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionStra import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document -import graphql.normalized.ExecutableNormalizedOperation import graphql.normalized.ParsedNormalizedOperation import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment @@ -77,7 +76,7 @@ class ModernTestingInstrumentation implements Instrumentation { } @Override - InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { + InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { assert state == instrumentationState return new TestingInstrumentContext("parsed-normalized-operation", executionList, throwableList, useOnDispatch) } diff --git a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy index f3149d23b4..1cfbffd3f3 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy @@ -7,10 +7,9 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionPara import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperation +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document -import graphql.normalized.ExecutableNormalizedOperation import graphql.normalized.ParsedNormalizedOperation import graphql.schema.DataFetcher import graphql.validation.ValidationError @@ -76,7 +75,7 @@ class NamedInstrumentation extends ModernTestingInstrumentation { } @Override - InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperation parameters, InstrumentationState state) { + InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { assertState(state) return super.beginParsedNormalizedOperation(parameters, state) } From 0ed10be73f943c3f58cde9de0bd66441f138a48d Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 10:47:40 +0800 Subject: [PATCH 05/10] Fix imports for NoContextChainedInstrumentation --- .../instrumentation/NoContextChainedInstrumentation.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index df56408aaa..e0857c4de4 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -2,7 +2,14 @@ import graphql.ExecutionResult; import graphql.PublicApi; -import graphql.execution.instrumentation.parameters.*; +import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; +import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; import graphql.normalized.ParsedNormalizedOperation; import graphql.validation.ValidationError; From 61400e6f3d0fe7d0288d225f421285909760b501 Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 10:50:36 +0800 Subject: [PATCH 06/10] Rename beginParsedNormalizedOperation to beginCreateNormalizedOperation --- src/main/java/graphql/execution/ExecutionContext.java | 6 +++--- .../execution/instrumentation/ChainedInstrumentation.java | 4 ++-- .../graphql/execution/instrumentation/Instrumentation.java | 6 +++--- .../instrumentation/NoContextChainedInstrumentation.java | 6 +++--- ...InstrumentationCreateNormalizedOperationParameters.java} | 4 ++-- .../instrumentation/ModernTestingInstrumentation.groovy | 4 ++-- .../execution/instrumentation/NamedInstrumentation.groovy | 6 +++--- 7 files changed, 18 insertions(+), 18 deletions(-) rename src/main/java/graphql/execution/instrumentation/parameters/{InstrumentationParsedNormalizedOperationParameters.java => InstrumentationCreateNormalizedOperationParameters.java} (78%) diff --git a/src/main/java/graphql/execution/ExecutionContext.java b/src/main/java/graphql/execution/ExecutionContext.java index 626ad1f3d0..afe3326ff5 100644 --- a/src/main/java/graphql/execution/ExecutionContext.java +++ b/src/main/java/graphql/execution/ExecutionContext.java @@ -14,7 +14,7 @@ import graphql.execution.incremental.IncrementalCallState; import graphql.execution.instrumentation.Instrumentation; import graphql.execution.instrumentation.InstrumentationState; -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; import graphql.language.Document; import graphql.language.FragmentDefinition; import graphql.language.OperationDefinition; @@ -370,8 +370,8 @@ public ResultNodesInfo getResultNodesInfo() { } private ExecutableNormalizedOperation createExecutableNormalizedOperation() { - var parameters = new InstrumentationParsedNormalizedOperationParameters(executionInput, graphQLSchema); - var instrument = instrumentation.beginParsedNormalizedOperation(parameters, instrumentationState); + var parameters = new InstrumentationCreateNormalizedOperationParameters(executionInput, graphQLSchema); + var instrument = instrumentation.beginCreateNormalizedOperation(parameters, instrumentationState); var result = ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables); if (instrument != null) { instrument.onCompleted(result, null); diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index 7f0cebde86..b21f2f6681 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -121,9 +121,9 @@ public InstrumentationContext beginParse(InstrumentationExecutionParam } @Override - public InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { + public InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> - instrumentation.beginParsedNormalizedOperation(parameters, specificState)); + instrumentation.beginCreateNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index 13f4de5fd3..76fc7b7af6 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -12,7 +12,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; import graphql.normalized.ParsedNormalizedOperation; @@ -123,14 +123,14 @@ default InstrumentationContext beginExecuteOperation(Instrument } /** - * This is called just before the parsing of the normalized operation is started. + * This is called just before the creation of the normalized operation is started. * * @param parameters the parameters to this step * @param state the state created during the call to {@link #createState(InstrumentationCreateStateParameters)} * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) */ @Nullable - default InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { + default InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { return noOp(); } diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index e0857c4de4..a3d5d5a39c 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -8,7 +8,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; import graphql.normalized.ParsedNormalizedOperation; @@ -86,8 +86,8 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument } @Override - public @Nullable InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { - return runAll(state, (instrumentation, specificState) -> instrumentation.beginParsedNormalizedOperation(parameters, specificState)); + public @Nullable InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + return runAll(state, (instrumentation, specificState) -> instrumentation.beginCreateNormalizedOperation(parameters, specificState)); } @Override diff --git a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperationParameters.java b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateNormalizedOperationParameters.java similarity index 78% rename from src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperationParameters.java rename to src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateNormalizedOperationParameters.java index 9364c5ee5c..92aa4a24b8 100644 --- a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationParsedNormalizedOperationParameters.java +++ b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateNormalizedOperationParameters.java @@ -10,8 +10,8 @@ */ @SuppressWarnings("TypeParameterUnusedInFormals") @PublicApi -public class InstrumentationParsedNormalizedOperationParameters extends InstrumentationExecutionParameters { - public InstrumentationParsedNormalizedOperationParameters(ExecutionInput executionInput, GraphQLSchema schema) { +public class InstrumentationCreateNormalizedOperationParameters extends InstrumentationExecutionParameters { + public InstrumentationCreateNormalizedOperationParameters(ExecutionInput executionInput, GraphQLSchema schema) { super(executionInput, schema); } } diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 18fdfa89ae..38ab03efed 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -10,7 +10,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionStra import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters +import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document import graphql.normalized.ParsedNormalizedOperation @@ -76,7 +76,7 @@ class ModernTestingInstrumentation implements Instrumentation { } @Override - InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { + InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { assert state == instrumentationState return new TestingInstrumentContext("parsed-normalized-operation", executionList, throwableList, useOnDispatch) } diff --git a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy index 1cfbffd3f3..15f82eef81 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy @@ -7,7 +7,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionPara import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationParsedNormalizedOperationParameters +import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document import graphql.normalized.ParsedNormalizedOperation @@ -75,9 +75,9 @@ class NamedInstrumentation extends ModernTestingInstrumentation { } @Override - InstrumentationContext beginParsedNormalizedOperation(InstrumentationParsedNormalizedOperationParameters parameters, InstrumentationState state) { + InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { assertState(state) - return super.beginParsedNormalizedOperation(parameters, state) + return super.beginCreateNormalizedOperation(parameters, state) } @Override From 9aa6d72712ac75793cd78b7f3dc9be61fbab40ab Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 10:52:10 +0800 Subject: [PATCH 07/10] Fix imports. --- .../instrumentation/ChainedInstrumentation.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index b21f2f6681..b2814b8ae0 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -8,7 +8,15 @@ import graphql.execution.Async; import graphql.execution.ExecutionContext; import graphql.execution.FieldValueInfo; -import graphql.execution.instrumentation.parameters.*; +import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; +import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; +import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; +import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; import graphql.normalized.ParsedNormalizedOperation; import graphql.schema.DataFetcher; From 5b74d1f6a9f730be1ae2176dc2991fa1174ff6bd Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 10:55:39 +0800 Subject: [PATCH 08/10] Update naming in tests. --- .../ChainedInstrumentationStateTest.groovy | 12 ++++++------ .../instrumentation/InstrumentationTest.groovy | 4 ++-- .../ModernTestingInstrumentation.groovy | 2 +- .../NoContextChainedInstrumentationTest.groovy | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy index 435d2c5f01..26a56bbceb 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy @@ -55,8 +55,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parsed-normalized-operation", - "end:parsed-normalized-operation", + "start:create-normalized-operation", + "end:create-normalized-operation", "start:execute-object", @@ -145,8 +145,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parsed-normalized-operation", - "end:parsed-normalized-operation", + "start:create-normalized-operation", + "end:create-normalized-operation", "start:execute-object", @@ -187,8 +187,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parsed-normalized-operation", - "end:parsed-normalized-operation", + "start:create-normalized-operation", + "end:create-normalized-operation", "start:execute-object", diff --git a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy index 87b8323bdd..ce6bb64196 100644 --- a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy @@ -312,8 +312,8 @@ class InstrumentationTest extends Specification { "onDispatched:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:parsed-normalized-operation", - "end:parsed-normalized-operation", + "start:create-normalized-operation", + "end:create-normalized-operation", "start:execute-object", "start:field-id", "start:fetch-id", diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 38ab03efed..6d24c2b236 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -78,7 +78,7 @@ class ModernTestingInstrumentation implements Instrumentation { @Override InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { assert state == instrumentationState - return new TestingInstrumentContext("parsed-normalized-operation", executionList, throwableList, useOnDispatch) + return new TestingInstrumentContext("create-normalized-operation", executionList, throwableList, useOnDispatch) } @Override diff --git a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy index a7a57d4be8..9602eae438 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy @@ -41,7 +41,7 @@ class NoContextChainedInstrumentationTest extends Specification { "start:field-hero", "start:fetch-hero", "start:complete-hero", - "start:parsed-normalized-operation", + "start:create-normalized-operation", "start:execute-object", From 7c8b8aa4d00b463010bd0af2b73374f59f25d6e4 Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Jul 2025 22:13:29 +0800 Subject: [PATCH 09/10] Rename ParsedNormalizedOperation to GraphQlNormalizedOperation --- .../execution/instrumentation/ChainedInstrumentation.java | 4 ++-- .../graphql/execution/instrumentation/Instrumentation.java | 4 ++-- .../instrumentation/NoContextChainedInstrumentation.java | 4 ++-- .../graphql/normalized/ExecutableNormalizedOperation.java | 2 +- ...rmalizedOperation.java => GraphQlNormalizedOperation.java} | 4 ++-- src/main/java/graphql/normalized/nf/NormalizedOperation.java | 4 ++-- .../instrumentation/ModernTestingInstrumentation.groovy | 4 ++-- .../execution/instrumentation/NamedInstrumentation.groovy | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) rename src/main/java/graphql/normalized/{ParsedNormalizedOperation.java => GraphQlNormalizedOperation.java} (67%) diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index b2814b8ae0..c60a8b8baf 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -18,7 +18,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.ParsedNormalizedOperation; +import graphql.normalized.GraphQlNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -129,7 +129,7 @@ public InstrumentationContext beginParse(InstrumentationExecutionParam } @Override - public InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + public InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginCreateNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index 76fc7b7af6..bb2c767e61 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -15,7 +15,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.ParsedNormalizedOperation; +import graphql.normalized.GraphQlNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -130,7 +130,7 @@ default InstrumentationContext beginExecuteOperation(Instrument * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) */ @Nullable - default InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + default InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { return noOp(); } diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index a3d5d5a39c..a96d345ebd 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -11,7 +11,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.ParsedNormalizedOperation; +import graphql.normalized.GraphQlNormalizedOperation; import graphql.validation.ValidationError; import org.jspecify.annotations.Nullable; @@ -86,7 +86,7 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument } @Override - public @Nullable InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginCreateNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java b/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java index e2bbdab417..c9b6de612d 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java @@ -23,7 +23,7 @@ * An operation consists of a list of {@link ExecutableNormalizedField}s in a parent child hierarchy */ @PublicApi -public class ExecutableNormalizedOperation implements ParsedNormalizedOperation { +public class ExecutableNormalizedOperation implements GraphQlNormalizedOperation { private final OperationDefinition.Operation operation; private final String operationName; private final List topLevelFields; diff --git a/src/main/java/graphql/normalized/ParsedNormalizedOperation.java b/src/main/java/graphql/normalized/GraphQlNormalizedOperation.java similarity index 67% rename from src/main/java/graphql/normalized/ParsedNormalizedOperation.java rename to src/main/java/graphql/normalized/GraphQlNormalizedOperation.java index 666c75c1f4..a5ab3eea05 100644 --- a/src/main/java/graphql/normalized/ParsedNormalizedOperation.java +++ b/src/main/java/graphql/normalized/GraphQlNormalizedOperation.java @@ -3,11 +3,11 @@ import graphql.PublicApi; /** - * A {@link ParsedNormalizedOperation} represents a parsed and normalized operation in GraphQL. + * A {@link GraphQlNormalizedOperation} represents a normalized operation in GraphQL. * It is used to handle the execution of GraphQL operations according to the specification, * including merging duplicate fields and handling type detection for fields that may correspond * to multiple object types. */ @PublicApi -public interface ParsedNormalizedOperation { +public interface GraphQlNormalizedOperation { } diff --git a/src/main/java/graphql/normalized/nf/NormalizedOperation.java b/src/main/java/graphql/normalized/nf/NormalizedOperation.java index 10d568c463..2bf0309128 100644 --- a/src/main/java/graphql/normalized/nf/NormalizedOperation.java +++ b/src/main/java/graphql/normalized/nf/NormalizedOperation.java @@ -8,7 +8,7 @@ import graphql.execution.directives.QueryDirectives; import graphql.language.Field; import graphql.language.OperationDefinition; -import graphql.normalized.ParsedNormalizedOperation; +import graphql.normalized.GraphQlNormalizedOperation; import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLFieldsContainer; @@ -24,7 +24,7 @@ * An operation consists of a list of {@link NormalizedField}s in a parent child hierarchy */ @ExperimentalApi -public class NormalizedOperation implements ParsedNormalizedOperation { +public class NormalizedOperation implements GraphQlNormalizedOperation { private final OperationDefinition.Operation operation; private final String operationName; private final List rootFields; diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 6d24c2b236..79aa539725 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -13,7 +13,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldParamete import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document -import graphql.normalized.ParsedNormalizedOperation +import graphql.normalized.GraphQlNormalizedOperation import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment import graphql.schema.GraphQLSchema @@ -76,7 +76,7 @@ class ModernTestingInstrumentation implements Instrumentation { } @Override - InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { assert state == instrumentationState return new TestingInstrumentContext("create-normalized-operation", executionList, throwableList, useOnDispatch) } diff --git a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy index 15f82eef81..338bd6b14c 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy @@ -10,7 +10,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldParamete import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document -import graphql.normalized.ParsedNormalizedOperation +import graphql.normalized.GraphQlNormalizedOperation import graphql.schema.DataFetcher import graphql.validation.ValidationError @@ -75,7 +75,7 @@ class NamedInstrumentation extends ModernTestingInstrumentation { } @Override - InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { assertState(state) return super.beginCreateNormalizedOperation(parameters, state) } From e9baf2f0856ff2feced896d0c9a813114bcd7d3c Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Sun, 13 Jul 2025 12:14:38 +0800 Subject: [PATCH 10/10] Remove public common interface for ExectuableNormalizedOperations and NormalizedOperations --- .../java/graphql/execution/ExecutionContext.java | 6 +++--- .../instrumentation/ChainedInstrumentation.java | 8 ++++---- .../execution/instrumentation/Instrumentation.java | 9 +++++---- .../NoContextChainedInstrumentation.java | 8 ++++---- ...ateExecutableNormalizedOperationParameters.java} | 8 ++++---- .../normalized/ExecutableNormalizedOperation.java | 2 +- .../normalized/GraphQlNormalizedOperation.java | 13 ------------- .../graphql/normalized/nf/NormalizedOperation.java | 3 +-- .../ChainedInstrumentationStateTest.groovy | 12 ++++++------ .../instrumentation/InstrumentationTest.groovy | 4 ++-- .../ModernTestingInstrumentation.groovy | 8 ++++---- .../instrumentation/NamedInstrumentation.groovy | 8 ++++---- .../NoContextChainedInstrumentationTest.groovy | 2 +- 13 files changed, 39 insertions(+), 52 deletions(-) rename src/main/java/graphql/execution/instrumentation/parameters/{InstrumentationCreateNormalizedOperationParameters.java => InstrumentationCreateExecutableNormalizedOperationParameters.java} (53%) delete mode 100644 src/main/java/graphql/normalized/GraphQlNormalizedOperation.java diff --git a/src/main/java/graphql/execution/ExecutionContext.java b/src/main/java/graphql/execution/ExecutionContext.java index afe3326ff5..fcf1663d8d 100644 --- a/src/main/java/graphql/execution/ExecutionContext.java +++ b/src/main/java/graphql/execution/ExecutionContext.java @@ -14,7 +14,7 @@ import graphql.execution.incremental.IncrementalCallState; import graphql.execution.instrumentation.Instrumentation; import graphql.execution.instrumentation.InstrumentationState; -import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateExecutableNormalizedOperationParameters; import graphql.language.Document; import graphql.language.FragmentDefinition; import graphql.language.OperationDefinition; @@ -370,8 +370,8 @@ public ResultNodesInfo getResultNodesInfo() { } private ExecutableNormalizedOperation createExecutableNormalizedOperation() { - var parameters = new InstrumentationCreateNormalizedOperationParameters(executionInput, graphQLSchema); - var instrument = instrumentation.beginCreateNormalizedOperation(parameters, instrumentationState); + var parameters = new InstrumentationCreateExecutableNormalizedOperationParameters(executionInput, graphQLSchema); + var instrument = instrumentation.beginCreateExecutableNormalizedOperation(parameters, instrumentationState); var result = ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables); if (instrument != null) { instrument.onCompleted(result, null); diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index c60a8b8baf..bc1f5cdfe3 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -8,7 +8,7 @@ import graphql.execution.Async; import graphql.execution.ExecutionContext; import graphql.execution.FieldValueInfo; -import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateExecutableNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters; import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; @@ -18,7 +18,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.GraphQlNormalizedOperation; +import graphql.normalized.ExecutableNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -129,9 +129,9 @@ public InstrumentationContext beginParse(InstrumentationExecutionParam } @Override - public InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + public InstrumentationContext beginCreateExecutableNormalizedOperation(InstrumentationCreateExecutableNormalizedOperationParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> - instrumentation.beginCreateNormalizedOperation(parameters, specificState)); + instrumentation.beginCreateExecutableNormalizedOperation(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index bb2c767e61..4949efdc58 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -12,10 +12,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateExecutableNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.GraphQlNormalizedOperation; +import graphql.normalized.ExecutableNormalizedOperation; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; @@ -123,14 +123,15 @@ default InstrumentationContext beginExecuteOperation(Instrument } /** - * This is called just before the creation of the normalized operation is started. + * This is called just before the creation of the executable normalized operation is started. * * @param parameters the parameters to this step * @param state the state created during the call to {@link #createState(InstrumentationCreateStateParameters)} * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) */ + @ExperimentalApi @Nullable - default InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + default InstrumentationContext beginCreateExecutableNormalizedOperation(InstrumentationCreateExecutableNormalizedOperationParameters parameters, InstrumentationState state) { return noOp(); } diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index a96d345ebd..c8db929152 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -8,10 +8,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; -import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters; +import graphql.execution.instrumentation.parameters.InstrumentationCreateExecutableNormalizedOperationParameters; import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; -import graphql.normalized.GraphQlNormalizedOperation; +import graphql.normalized.ExecutableNormalizedOperation; import graphql.validation.ValidationError; import org.jspecify.annotations.Nullable; @@ -86,8 +86,8 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument } @Override - public @Nullable InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { - return runAll(state, (instrumentation, specificState) -> instrumentation.beginCreateNormalizedOperation(parameters, specificState)); + public @Nullable InstrumentationContext beginCreateExecutableNormalizedOperation(InstrumentationCreateExecutableNormalizedOperationParameters parameters, InstrumentationState state) { + return runAll(state, (instrumentation, specificState) -> instrumentation.beginCreateExecutableNormalizedOperation(parameters, specificState)); } @Override diff --git a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateNormalizedOperationParameters.java b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateExecutableNormalizedOperationParameters.java similarity index 53% rename from src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateNormalizedOperationParameters.java rename to src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateExecutableNormalizedOperationParameters.java index 92aa4a24b8..7f0bdbb503 100644 --- a/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateNormalizedOperationParameters.java +++ b/src/main/java/graphql/execution/instrumentation/parameters/InstrumentationCreateExecutableNormalizedOperationParameters.java @@ -1,7 +1,7 @@ package graphql.execution.instrumentation.parameters; import graphql.ExecutionInput; -import graphql.PublicApi; +import graphql.ExperimentalApi; import graphql.execution.instrumentation.Instrumentation; import graphql.schema.GraphQLSchema; @@ -9,9 +9,9 @@ * Parameters sent to {@link Instrumentation} methods */ @SuppressWarnings("TypeParameterUnusedInFormals") -@PublicApi -public class InstrumentationCreateNormalizedOperationParameters extends InstrumentationExecutionParameters { - public InstrumentationCreateNormalizedOperationParameters(ExecutionInput executionInput, GraphQLSchema schema) { +@ExperimentalApi +public class InstrumentationCreateExecutableNormalizedOperationParameters extends InstrumentationExecutionParameters { + public InstrumentationCreateExecutableNormalizedOperationParameters(ExecutionInput executionInput, GraphQLSchema schema) { super(executionInput, schema); } } diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java b/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java index c9b6de612d..cfcda2746d 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedOperation.java @@ -23,7 +23,7 @@ * An operation consists of a list of {@link ExecutableNormalizedField}s in a parent child hierarchy */ @PublicApi -public class ExecutableNormalizedOperation implements GraphQlNormalizedOperation { +public class ExecutableNormalizedOperation { private final OperationDefinition.Operation operation; private final String operationName; private final List topLevelFields; diff --git a/src/main/java/graphql/normalized/GraphQlNormalizedOperation.java b/src/main/java/graphql/normalized/GraphQlNormalizedOperation.java deleted file mode 100644 index a5ab3eea05..0000000000 --- a/src/main/java/graphql/normalized/GraphQlNormalizedOperation.java +++ /dev/null @@ -1,13 +0,0 @@ -package graphql.normalized; - -import graphql.PublicApi; - -/** - * A {@link GraphQlNormalizedOperation} represents a normalized operation in GraphQL. - * It is used to handle the execution of GraphQL operations according to the specification, - * including merging duplicate fields and handling type detection for fields that may correspond - * to multiple object types. - */ -@PublicApi -public interface GraphQlNormalizedOperation { -} diff --git a/src/main/java/graphql/normalized/nf/NormalizedOperation.java b/src/main/java/graphql/normalized/nf/NormalizedOperation.java index 2bf0309128..6d3c333d0b 100644 --- a/src/main/java/graphql/normalized/nf/NormalizedOperation.java +++ b/src/main/java/graphql/normalized/nf/NormalizedOperation.java @@ -8,7 +8,6 @@ import graphql.execution.directives.QueryDirectives; import graphql.language.Field; import graphql.language.OperationDefinition; -import graphql.normalized.GraphQlNormalizedOperation; import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLFieldsContainer; @@ -24,7 +23,7 @@ * An operation consists of a list of {@link NormalizedField}s in a parent child hierarchy */ @ExperimentalApi -public class NormalizedOperation implements GraphQlNormalizedOperation { +public class NormalizedOperation { private final OperationDefinition.Operation operation; private final String operationName; private final List rootFields; diff --git a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy index 26a56bbceb..b6c0f15124 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy @@ -55,8 +55,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:create-normalized-operation", - "end:create-normalized-operation", + "start:create-executable-normalized-operation", + "end:create-executable-normalized-operation", "start:execute-object", @@ -145,8 +145,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:create-normalized-operation", - "end:create-normalized-operation", + "start:create-executable-normalized-operation", + "end:create-executable-normalized-operation", "start:execute-object", @@ -187,8 +187,8 @@ class ChainedInstrumentationStateTest extends Specification { "start:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:create-normalized-operation", - "end:create-normalized-operation", + "start:create-executable-normalized-operation", + "end:create-executable-normalized-operation", "start:execute-object", diff --git a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy index ce6bb64196..5463edeb10 100644 --- a/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy @@ -312,8 +312,8 @@ class InstrumentationTest extends Specification { "onDispatched:fetch-hero", "end:fetch-hero", "start:complete-hero", - "start:create-normalized-operation", - "end:create-normalized-operation", + "start:create-executable-normalized-operation", + "end:create-executable-normalized-operation", "start:execute-object", "start:field-id", "start:fetch-id", diff --git a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy index 79aa539725..483459c8df 100644 --- a/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy @@ -10,10 +10,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionStra import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters +import graphql.execution.instrumentation.parameters.InstrumentationCreateExecutableNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document -import graphql.normalized.GraphQlNormalizedOperation +import graphql.normalized.ExecutableNormalizedOperation import graphql.schema.DataFetcher import graphql.schema.DataFetchingEnvironment import graphql.schema.GraphQLSchema @@ -76,9 +76,9 @@ class ModernTestingInstrumentation implements Instrumentation { } @Override - InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + InstrumentationContext beginCreateExecutableNormalizedOperation(InstrumentationCreateExecutableNormalizedOperationParameters parameters, InstrumentationState state) { assert state == instrumentationState - return new TestingInstrumentContext("create-normalized-operation", executionList, throwableList, useOnDispatch) + return new TestingInstrumentContext("create-executable-normalized-operation", executionList, throwableList, useOnDispatch) } @Override diff --git a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy index 338bd6b14c..3f79ab7d80 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy @@ -7,10 +7,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionPara import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters -import graphql.execution.instrumentation.parameters.InstrumentationCreateNormalizedOperationParameters +import graphql.execution.instrumentation.parameters.InstrumentationCreateExecutableNormalizedOperationParameters import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters import graphql.language.Document -import graphql.normalized.GraphQlNormalizedOperation +import graphql.normalized.ExecutableNormalizedOperation import graphql.schema.DataFetcher import graphql.validation.ValidationError @@ -75,9 +75,9 @@ class NamedInstrumentation extends ModernTestingInstrumentation { } @Override - InstrumentationContext beginCreateNormalizedOperation(InstrumentationCreateNormalizedOperationParameters parameters, InstrumentationState state) { + InstrumentationContext beginCreateExecutableNormalizedOperation(InstrumentationCreateExecutableNormalizedOperationParameters parameters, InstrumentationState state) { assertState(state) - return super.beginCreateNormalizedOperation(parameters, state) + return super.beginCreateExecutableNormalizedOperation(parameters, state) } @Override diff --git a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy index 9602eae438..f1556c57eb 100644 --- a/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/NoContextChainedInstrumentationTest.groovy @@ -41,7 +41,7 @@ class NoContextChainedInstrumentationTest extends Specification { "start:field-hero", "start:fetch-hero", "start:complete-hero", - "start:create-normalized-operation", + "start:create-executable-normalized-operation", "start:execute-object",