From 64e686fdf4f592893eede3dfadb5fc75462d2fdd Mon Sep 17 00:00:00 2001 From: Felipe Reis Date: Thu, 15 Feb 2024 09:25:47 +1100 Subject: [PATCH 1/2] Rename DeferExecution to NormalizedDeferredExecution This will align the name of this class, which is in the 'incremental' package, with 'DeferredExecution', which is in the 'execution' package. --- .../incremental/DeferredExecution.java | 4 +- .../java/graphql/normalized/ENFMerger.java | 2 +- .../normalized/ExecutableNormalizedField.java | 32 +++++----- .../ExecutableNormalizedOperationFactory.java | 62 +++++++++---------- ...tableNormalizedOperationToAstCompiler.java | 32 +++++----- .../incremental/IncrementalNodes.java | 6 +- ....java => NormalizedDeferredExecution.java} | 22 +++---- ...NormalizedOperationFactoryDeferTest.groovy | 40 ++++++------ 8 files changed, 100 insertions(+), 100 deletions(-) rename src/main/java/graphql/normalized/incremental/{DeferExecution.java => NormalizedDeferredExecution.java} (73%) diff --git a/src/main/java/graphql/execution/incremental/DeferredExecution.java b/src/main/java/graphql/execution/incremental/DeferredExecution.java index b8560b8535..3f14f5922e 100644 --- a/src/main/java/graphql/execution/incremental/DeferredExecution.java +++ b/src/main/java/graphql/execution/incremental/DeferredExecution.java @@ -1,14 +1,14 @@ package graphql.execution.incremental; import graphql.ExperimentalApi; -import graphql.normalized.incremental.DeferExecution; +import graphql.normalized.incremental.NormalizedDeferredExecution; import javax.annotation.Nullable; /** * Represents details about the defer execution that can be associated with a {@link graphql.execution.MergedField}. *

- * This representation is used during graphql execution. Check {@link DeferExecution} + * This representation is used during graphql execution. Check {@link NormalizedDeferredExecution} * for the normalized representation of @defer. */ @ExperimentalApi diff --git a/src/main/java/graphql/normalized/ENFMerger.java b/src/main/java/graphql/normalized/ENFMerger.java index f1fbc37b95..5150eee5a4 100644 --- a/src/main/java/graphql/normalized/ENFMerger.java +++ b/src/main/java/graphql/normalized/ENFMerger.java @@ -75,7 +75,7 @@ && isFieldInSharedInterface(field, fieldInGroup, schema) if (deferSupport) { // Move defer executions from removed field into the merged field's entry - first.addDeferExecutions(next.getDeferExecutions()); + first.addDeferredExecutions(next.getDeferredExecutions()); } } first.setObjectTypeNames(mergedObjects); diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedField.java b/src/main/java/graphql/normalized/ExecutableNormalizedField.java index 3a8d36af08..47f8151229 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedField.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedField.java @@ -10,7 +10,7 @@ import graphql.collect.ImmutableKit; import graphql.introspection.Introspection; import graphql.language.Argument; -import graphql.normalized.incremental.DeferExecution; +import graphql.normalized.incremental.NormalizedDeferredExecution; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLInterfaceType; import graphql.schema.GraphQLNamedOutputType; @@ -66,7 +66,7 @@ public class ExecutableNormalizedField { private final int level; // Mutable List on purpose: it is modified after creation - private final LinkedHashSet deferExecutions; + private final LinkedHashSet deferredExecutions; private ExecutableNormalizedField(Builder builder) { this.alias = builder.alias; @@ -78,7 +78,7 @@ private ExecutableNormalizedField(Builder builder) { this.children = builder.children; this.level = builder.level; this.parent = builder.parent; - this.deferExecutions = builder.deferExecutions; + this.deferredExecutions = builder.deferredExecutions; } /** @@ -262,13 +262,13 @@ public void clearChildren() { } @Internal - public void setDeferExecutions(Collection deferExecutions) { - this.deferExecutions.clear(); - this.deferExecutions.addAll(deferExecutions); + public void setDeferredExecutions(Collection deferredExecutions) { + this.deferredExecutions.clear(); + this.deferredExecutions.addAll(deferredExecutions); } - public void addDeferExecutions(Collection deferExecutions) { - this.deferExecutions.addAll(deferExecutions); + public void addDeferredExecutions(Collection deferredExecutions) { + this.deferredExecutions.addAll(deferredExecutions); } /** @@ -477,12 +477,12 @@ public ExecutableNormalizedField getParent() { } /** - * @return the {@link DeferExecution}s associated with this {@link ExecutableNormalizedField}. - * @see DeferExecution + * @return the {@link NormalizedDeferredExecution}s associated with this {@link ExecutableNormalizedField}. + * @see NormalizedDeferredExecution */ @ExperimentalApi - public LinkedHashSet getDeferExecutions() { - return deferExecutions; + public LinkedHashSet getDeferredExecutions() { + return deferredExecutions; } @Internal @@ -612,7 +612,7 @@ public static class Builder { private LinkedHashMap resolvedArguments = new LinkedHashMap<>(); private ImmutableList astArguments = ImmutableKit.emptyList(); - private LinkedHashSet deferExecutions = new LinkedHashSet<>(); + private LinkedHashSet deferredExecutions = new LinkedHashSet<>(); private Builder() { } @@ -627,7 +627,7 @@ private Builder(ExecutableNormalizedField existing) { this.children = new ArrayList<>(existing.children); this.level = existing.getLevel(); this.parent = existing.getParent(); - this.deferExecutions = existing.getDeferExecutions(); + this.deferredExecutions = existing.getDeferredExecutions(); } public Builder clearObjectTypesNames() { @@ -683,8 +683,8 @@ public Builder parent(ExecutableNormalizedField parent) { return this; } - public Builder deferExecutions(LinkedHashSet deferExecutions) { - this.deferExecutions = deferExecutions; + public Builder deferredExecutions(LinkedHashSet deferredExecutions) { + this.deferredExecutions = deferredExecutions; return this; } diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java b/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java index 9367c1d58d..e739db90f2 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java @@ -30,7 +30,7 @@ import graphql.language.SelectionSet; import graphql.language.TypeName; import graphql.language.VariableDefinition; -import graphql.normalized.incremental.DeferExecution; +import graphql.normalized.incremental.NormalizedDeferredExecution; import graphql.normalized.incremental.IncrementalNodes; import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLCompositeType; @@ -568,7 +568,7 @@ private void createNFs(ImmutableList.Builder nfListBu nfListBuilder.add(nf); if (this.options.deferSupport) { - nf.addDeferExecutions(fieldGroup.deferExecutions); + nf.addDeferredExecutions(fieldGroup.deferredExecutions); } } if (commonParentsGroups.size() > 1) { @@ -633,22 +633,22 @@ private List groupByCommonParentsNoDeferSupport(Collection< private List groupByCommonParentsWithDeferSupport(Collection fields) { ImmutableSet.Builder objectTypes = ImmutableSet.builder(); - ImmutableSet.Builder deferExecutionsBuilder = ImmutableSet.builder(); + ImmutableSet.Builder deferredExecutionsBuilder = ImmutableSet.builder(); for (CollectedField collectedField : fields) { objectTypes.addAll(collectedField.objectTypes); - DeferExecution collectedDeferExecution = collectedField.deferExecution; + NormalizedDeferredExecution collectedDeferredExecution = collectedField.deferredExecution; - if (collectedDeferExecution != null) { - deferExecutionsBuilder.add(collectedDeferExecution); + if (collectedDeferredExecution != null) { + deferredExecutionsBuilder.add(collectedDeferredExecution); } } Set allRelevantObjects = objectTypes.build(); - Set deferExecutions = deferExecutionsBuilder.build(); + Set deferredExecutions = deferredExecutionsBuilder.build(); - Set duplicatedLabels = listDuplicatedLabels(deferExecutions); + Set duplicatedLabels = listDuplicatedLabels(deferredExecutions); if (!duplicatedLabels.isEmpty()) { // Query validation should pick this up @@ -657,33 +657,33 @@ private List groupByCommonParentsWithDeferSupport(Collectio Map> groupByAstParent = groupingBy(fields, fieldAndType -> fieldAndType.astTypeCondition); if (groupByAstParent.size() == 1) { - return singletonList(new CollectedFieldGroup(ImmutableSet.copyOf(fields), allRelevantObjects, deferExecutions)); + return singletonList(new CollectedFieldGroup(ImmutableSet.copyOf(fields), allRelevantObjects, deferredExecutions)); } ImmutableList.Builder result = ImmutableList.builder(); for (GraphQLObjectType objectType : allRelevantObjects) { Set relevantFields = filterSet(fields, field -> field.objectTypes.contains(objectType)); - Set filteredDeferExecutions = deferExecutions.stream() + Set filteredDeferredExecutions = deferredExecutions.stream() .filter(filterExecutionsFromType(objectType)) .collect(toCollection(LinkedHashSet::new)); - result.add(new CollectedFieldGroup(relevantFields, singleton(objectType), filteredDeferExecutions)); + result.add(new CollectedFieldGroup(relevantFields, singleton(objectType), filteredDeferredExecutions)); } return result.build(); } - private static Predicate filterExecutionsFromType(GraphQLObjectType objectType) { + private static Predicate filterExecutionsFromType(GraphQLObjectType objectType) { String objectTypeName = objectType.getName(); - return deferExecution -> deferExecution.getPossibleTypes() + return deferredExecution -> deferredExecution.getPossibleTypes() .stream() .map(GraphQLObjectType::getName) .anyMatch(objectTypeName::equals); } - private Set listDuplicatedLabels(Collection deferExecutions) { - return deferExecutions.stream() - .map(DeferExecution::getLabel) + private Set listDuplicatedLabels(Collection deferredExecutions) { + return deferredExecutions.stream() + .map(NormalizedDeferredExecution::getLabel) .filter(Objects::nonNull) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet() @@ -697,11 +697,11 @@ private void collectFromSelectionSet(SelectionSet selectionSet, List result, GraphQLCompositeType astTypeCondition, Set possibleObjects, - DeferExecution deferExecution + NormalizedDeferredExecution deferredExecution ) { for (Selection selection : selectionSet.getSelections()) { if (selection instanceof Field) { - collectField(result, (Field) selection, possibleObjects, astTypeCondition, deferExecution); + collectField(result, (Field) selection, possibleObjects, astTypeCondition, deferredExecution); } else if (selection instanceof InlineFragment) { collectInlineFragment(result, (InlineFragment) selection, possibleObjects, astTypeCondition); } else if (selection instanceof FragmentSpread) { @@ -731,12 +731,12 @@ private void collectFragmentSpread(List result, GraphQLCompositeType newAstTypeCondition = (GraphQLCompositeType) assertNotNull(this.graphQLSchema.getType(fragmentDefinition.getTypeCondition().getName())); Set newPossibleObjects = narrowDownPossibleObjects(possibleObjects, newAstTypeCondition); - DeferExecution newDeferExecution = buildDeferExecution( + NormalizedDeferredExecution newDeferredExecution = buildDeferredExecution( fragmentSpread.getDirectives(), fragmentDefinition.getTypeCondition(), newPossibleObjects); - collectFromSelectionSet(fragmentDefinition.getSelectionSet(), result, newAstTypeCondition, newPossibleObjects, newDeferExecution); + collectFromSelectionSet(fragmentDefinition.getSelectionSet(), result, newAstTypeCondition, newPossibleObjects, newDeferredExecution); } private void collectInlineFragment(List result, @@ -756,16 +756,16 @@ private void collectInlineFragment(List result, } - DeferExecution newDeferExecution = buildDeferExecution( + NormalizedDeferredExecution newDeferredExecution = buildDeferredExecution( inlineFragment.getDirectives(), inlineFragment.getTypeCondition(), newPossibleObjects ); - collectFromSelectionSet(inlineFragment.getSelectionSet(), result, newAstTypeCondition, newPossibleObjects, newDeferExecution); + collectFromSelectionSet(inlineFragment.getSelectionSet(), result, newAstTypeCondition, newPossibleObjects, newDeferredExecution); } - private DeferExecution buildDeferExecution( + private NormalizedDeferredExecution buildDeferredExecution( List directives, TypeName typeCondition, Set newPossibleObjects) { @@ -785,7 +785,7 @@ private void collectField(List result, Field field, Set possibleObjectTypes, GraphQLCompositeType astTypeCondition, - DeferExecution deferExecution + NormalizedDeferredExecution deferredExecution ) { if (!conditionalNodes.shouldInclude(field, this.coercedVariableValues.toMap(), @@ -797,7 +797,7 @@ private void collectField(List result, if (possibleObjectTypes.isEmpty()) { return; } - result.add(new CollectedField(field, possibleObjectTypes, astTypeCondition, deferExecution)); + result.add(new CollectedField(field, possibleObjectTypes, astTypeCondition, deferredExecution)); } private Set narrowDownPossibleObjects(Set currentOnes, @@ -852,13 +852,13 @@ private static class CollectedField { Field field; Set objectTypes; GraphQLCompositeType astTypeCondition; - DeferExecution deferExecution; + NormalizedDeferredExecution deferredExecution; - public CollectedField(Field field, Set objectTypes, GraphQLCompositeType astTypeCondition, DeferExecution deferExecution) { + public CollectedField(Field field, Set objectTypes, GraphQLCompositeType astTypeCondition, NormalizedDeferredExecution deferredExecution) { this.field = field; this.objectTypes = objectTypes; this.astTypeCondition = astTypeCondition; - this.deferExecution = deferExecution; + this.deferredExecution = deferredExecution; } } @@ -885,12 +885,12 @@ private FieldAndAstParent(Field field, GraphQLCompositeType astParentType) { private static class CollectedFieldGroup { Set objectTypes; Set fields; - Set deferExecutions; + Set deferredExecutions; - public CollectedFieldGroup(Set fields, Set objectTypes, Set deferExecutions) { + public CollectedFieldGroup(Set fields, Set objectTypes, Set deferredExecutions) { this.fields = fields; this.objectTypes = objectTypes; - this.deferExecutions = deferExecutions; + this.deferredExecutions = deferredExecutions; } } } diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedOperationToAstCompiler.java b/src/main/java/graphql/normalized/ExecutableNormalizedOperationToAstCompiler.java index 051d4655de..877decb767 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedOperationToAstCompiler.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedOperationToAstCompiler.java @@ -23,7 +23,7 @@ import graphql.language.StringValue; import graphql.language.TypeName; import graphql.language.Value; -import graphql.normalized.incremental.DeferExecution; +import graphql.normalized.incremental.NormalizedDeferredExecution; import graphql.schema.GraphQLCompositeType; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLObjectType; @@ -277,30 +277,30 @@ private static List> subselectionsForNormalizedFieldWithDeferSuppor Map> fieldsByFragmentDetails = new LinkedHashMap<>(); for (ExecutableNormalizedField nf : executableNormalizedFields) { - LinkedHashSet deferExecutions = nf.getDeferExecutions(); + LinkedHashSet deferredExecutions = nf.getDeferredExecutions(); if (nf.isConditional(schema)) { selectionForNormalizedField(schema, nf, normalizedFieldToQueryDirectives, variableAccumulator, true) .forEach((objectTypeName, field) -> { - if (deferExecutions == null || deferExecutions.isEmpty()) { + if (deferredExecutions == null || deferredExecutions.isEmpty()) { fieldsByFragmentDetails .computeIfAbsent(new ExecutionFragmentDetails(objectTypeName, null), ignored -> new ArrayList<>()) .add(field); } else { - deferExecutions.forEach(deferExecution -> { + deferredExecutions.forEach(deferredExecution -> { fieldsByFragmentDetails - .computeIfAbsent(new ExecutionFragmentDetails(objectTypeName, deferExecution), ignored -> new ArrayList<>()) + .computeIfAbsent(new ExecutionFragmentDetails(objectTypeName, deferredExecution), ignored -> new ArrayList<>()) .add(field); }); } }); - } else if (deferExecutions != null && !deferExecutions.isEmpty()) { + } else if (deferredExecutions != null && !deferredExecutions.isEmpty()) { Field field = selectionForNormalizedField(schema, parentOutputType, nf, normalizedFieldToQueryDirectives, variableAccumulator, true); - deferExecutions.forEach(deferExecution -> { + deferredExecutions.forEach(deferredExecution -> { fieldsByFragmentDetails - .computeIfAbsent(new ExecutionFragmentDetails(null, deferExecution), ignored -> new ArrayList<>()) + .computeIfAbsent(new ExecutionFragmentDetails(null, deferredExecution), ignored -> new ArrayList<>()) .add(field); }); } else { @@ -317,11 +317,11 @@ private static List> subselectionsForNormalizedFieldWithDeferSuppor fragmentBuilder.typeCondition(typeName); } - if (typeAndDeferPair.deferExecution != null) { + if (typeAndDeferPair.deferredExecution != null) { Directive.Builder deferBuilder = Directive.newDirective().name(Directives.DeferDirective.getName()); - if (typeAndDeferPair.deferExecution.getLabel() != null) { - deferBuilder.argument(newArgument().name("label").value(StringValue.of(typeAndDeferPair.deferExecution.getLabel())).build()); + if (typeAndDeferPair.deferredExecution.getLabel() != null) { + deferBuilder.argument(newArgument().name("label").value(StringValue.of(typeAndDeferPair.deferredExecution.getLabel())).build()); } fragmentBuilder.directive(deferBuilder.build()); @@ -489,11 +489,11 @@ private static GraphQLObjectType getOperationType(@NotNull GraphQLSchema schema, */ private static class ExecutionFragmentDetails { private final String typeName; - private final DeferExecution deferExecution; + private final NormalizedDeferredExecution deferredExecution; - public ExecutionFragmentDetails(String typeName, DeferExecution deferExecution) { + public ExecutionFragmentDetails(String typeName, NormalizedDeferredExecution deferredExecution) { this.typeName = typeName; - this.deferExecution = deferExecution; + this.deferredExecution = deferredExecution; } @Override @@ -505,12 +505,12 @@ public boolean equals(Object o) { return false; } ExecutionFragmentDetails that = (ExecutionFragmentDetails) o; - return Objects.equals(typeName, that.typeName) && Objects.equals(deferExecution, that.deferExecution); + return Objects.equals(typeName, that.typeName) && Objects.equals(deferredExecution, that.deferredExecution); } @Override public int hashCode() { - return Objects.hash(typeName, deferExecution); + return Objects.hash(typeName, deferredExecution); } } } diff --git a/src/main/java/graphql/normalized/incremental/IncrementalNodes.java b/src/main/java/graphql/normalized/incremental/IncrementalNodes.java index 025b9333a0..0daa539329 100644 --- a/src/main/java/graphql/normalized/incremental/IncrementalNodes.java +++ b/src/main/java/graphql/normalized/incremental/IncrementalNodes.java @@ -21,7 +21,7 @@ @Internal public class IncrementalNodes { - public DeferExecution createDeferExecution( + public NormalizedDeferredExecution createDeferExecution( Map variables, List directives, @Nullable TypeName targetType, @@ -42,12 +42,12 @@ public DeferExecution createDeferExecution( Object label = argumentValues.get("label"); if (label == null) { - return new DeferExecution(null, possibleTypes); + return new NormalizedDeferredExecution(null, possibleTypes); } Assert.assertTrue(label instanceof String, () -> String.format("The 'label' argument from the '%s' directive MUST contain a String value", DeferDirective.getName())); - return new DeferExecution((String) label, possibleTypes); + return new NormalizedDeferredExecution((String) label, possibleTypes); } return null; diff --git a/src/main/java/graphql/normalized/incremental/DeferExecution.java b/src/main/java/graphql/normalized/incremental/NormalizedDeferredExecution.java similarity index 73% rename from src/main/java/graphql/normalized/incremental/DeferExecution.java rename to src/main/java/graphql/normalized/incremental/NormalizedDeferredExecution.java index 71488b03ca..a3f789e063 100644 --- a/src/main/java/graphql/normalized/incremental/DeferExecution.java +++ b/src/main/java/graphql/normalized/incremental/NormalizedDeferredExecution.java @@ -17,7 +17,7 @@ * type Dog implements Animal { name: String, age: Int } * * - * An ENF can be associated with multiple `DeferExecution`s + * An ENF can be associated with multiple `NormalizedDeferredExecution`s * * For example, this query: *

@@ -33,12 +33,12 @@
  *     }
  * 
* - * Would result in one ENF (name) associated with 2 `DeferExecution` instances. This is relevant for the execution + * Would result in one ENF (name) associated with 2 `NormalizedDeferredExecution` instances. This is relevant for the execution * since the field would have to be included in 2 incremental payloads. (I know, there's some duplication here, but * this is the current state of the spec. There are some discussions happening around de-duplicating data in scenarios * like this, so this behaviour might change in the future). * - * A `DeferExecution` may be associated with a list of possible types + * A `NormalizedDeferredExecution` may be associated with a list of possible types * * For example, this query: *
@@ -50,9 +50,9 @@
  *         }
  *     }
  * 
- * results in a `DeferExecution` with no label and possible types [Dog, Cat] + * results in a `NormalizedDeferredExecution` with no label and possible types [Dog, Cat] * - * A `DeferExecution` may be associated with specific types + * A `NormalizedDeferredExecution` may be associated with specific types * For example, this query: *
  *     query MyQuery {
@@ -66,10 +66,10 @@
  *         }
  *     }
  * 
- * results in a single ENF (name) associated with a `DeferExecution` with only "Cat" as a possible type. This means + * results in a single ENF (name) associated with a `NormalizedDeferredExecution` with only "Cat" as a possible type. This means * that, at execution time, `name` should be deferred only if the return object is a "Cat" (but not a if it is a "Dog"). * - * ENFs associated with the same instance of `DeferExecution` will be resolved in the same incremental response payload + * ENFs associated with the same instance of `NormalizedDeferredExecution` will be resolved in the same incremental response payload * For example, take these queries: * *
@@ -94,20 +94,20 @@
  *     }
  * 
* - * In `Query1`, the ENFs name and age are associated with different instances of `DeferExecution`. This means that, + * In `Query1`, the ENFs name and age are associated with different instances of `NormalizedDeferredExecution`. This means that, * during execution, `name` and `age` can be delivered at different times (if name is resolved faster, it will be * delivered first, and vice-versa). - * In `Query2` the fields will share the same instance of `DeferExecution`. This ensures that, at execution time, the + * In `Query2` the fields will share the same instance of `NormalizedDeferredExecution`. This ensures that, at execution time, the * fields are guaranteed to be delivered together. In other words, execution should wait until the slowest field resolves * and deliver both fields at the same time. * */ @ExperimentalApi -public class DeferExecution { +public class NormalizedDeferredExecution { private final String label; private final Set possibleTypes; - public DeferExecution(@Nullable String label, Set possibleTypes) { + public NormalizedDeferredExecution(@Nullable String label, Set possibleTypes) { this.label = label; this.possibleTypes = possibleTypes; } diff --git a/src/test/groovy/graphql/normalized/ExecutableNormalizedOperationFactoryDeferTest.groovy b/src/test/groovy/graphql/normalized/ExecutableNormalizedOperationFactoryDeferTest.groovy index 08ead8f5e2..332d1d685e 100644 --- a/src/test/groovy/graphql/normalized/ExecutableNormalizedOperationFactoryDeferTest.groovy +++ b/src/test/groovy/graphql/normalized/ExecutableNormalizedOperationFactoryDeferTest.groovy @@ -200,16 +200,16 @@ class ExecutableNormalizedOperationFactoryDeferTest extends Specification { def nameField = findField(executableNormalizedOperation, "Dog", "name") def ageField = findField(executableNormalizedOperation, "Dog", "age") - nameField.deferExecutions.size() == 1 - ageField.deferExecutions.size() == 2 + nameField.deferredExecutions.size() == 1 + ageField.deferredExecutions.size() == 2 // age field is associated with 2 defer executions, one of then is shared with "name" the other isn't - ageField.deferExecutions.any { - it == nameField.deferExecutions[0] + ageField.deferredExecutions.any { + it == nameField.deferredExecutions[0] } - ageField.deferExecutions.any { - it != nameField.deferExecutions[0] + ageField.deferredExecutions.any { + it != nameField.deferredExecutions[0] } printedTree == ['Query.dog', @@ -440,21 +440,21 @@ class ExecutableNormalizedOperationFactoryDeferTest extends Specification { def dogBreedField = findField(executableNormalizedOperation, "Dog", "breed") def catBreedField = findField(executableNormalizedOperation, "Cat", "breed") - nameField.deferExecutions.size() == 3 - dogBreedField.deferExecutions.size() == 1 - catBreedField.deferExecutions.size() == 1 + nameField.deferredExecutions.size() == 3 + dogBreedField.deferredExecutions.size() == 1 + catBreedField.deferredExecutions.size() == 1 // nameField should share a defer block with each of the other fields - nameField.deferExecutions.any { - it == dogBreedField.deferExecutions[0] + nameField.deferredExecutions.any { + it == dogBreedField.deferredExecutions[0] } - nameField.deferExecutions.any { - it == catBreedField.deferExecutions[0] + nameField.deferredExecutions.any { + it == catBreedField.deferredExecutions[0] } // also, nameField should have a defer block that is not shared with any other field - nameField.deferExecutions.any { - it != dogBreedField.deferExecutions[0] && - it != catBreedField.deferExecutions[0] + nameField.deferredExecutions.any { + it != dogBreedField.deferredExecutions[0] && + it != catBreedField.deferredExecutions[0] } printedTree == ['Query.animal', @@ -491,11 +491,11 @@ class ExecutableNormalizedOperationFactoryDeferTest extends Specification { def nameField = findField(executableNormalizedOperation, "Dog", "name") def breedField = findField(executableNormalizedOperation, "Dog", "breed") - nameField.deferExecutions.size() == 1 - breedField.deferExecutions.size() == 1 + nameField.deferredExecutions.size() == 1 + breedField.deferredExecutions.size() == 1 // different label instances - nameField.deferExecutions[0] != breedField.deferExecutions[0] + nameField.deferredExecutions[0] != breedField.deferredExecutions[0] printedTree == ['Query.dog', 'Dog.name defer{[label=null;types=[Dog]]}', @@ -932,7 +932,7 @@ class ExecutableNormalizedOperationFactoryDeferTest extends Specification { } String printDeferExecutionDetails(ExecutableNormalizedField field) { - def deferExecutions = field.deferExecutions + def deferExecutions = field.deferredExecutions if (deferExecutions == null || deferExecutions.isEmpty()) { return "" } From 86f577c332e9b21bb1dc87b5f9325d02278a7394 Mon Sep 17 00:00:00 2001 From: Felipe Reis Date: Thu, 15 Feb 2024 09:42:28 +1100 Subject: [PATCH 2/2] Remove duplicated code in IncrementalNodes --- .../ExecutableNormalizedOperationFactory.java | 12 +--- .../incremental/IncrementalNodes.java | 55 ------------------- 2 files changed, 3 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/graphql/normalized/incremental/IncrementalNodes.java diff --git a/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java b/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java index e739db90f2..96d5193919 100644 --- a/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java +++ b/src/main/java/graphql/normalized/ExecutableNormalizedOperationFactory.java @@ -17,6 +17,7 @@ import graphql.execution.conditional.ConditionalNodes; import graphql.execution.directives.QueryDirectives; import graphql.execution.directives.QueryDirectivesImpl; +import graphql.execution.incremental.IncrementalUtils; import graphql.introspection.Introspection; import graphql.language.Directive; import graphql.language.Document; @@ -28,10 +29,8 @@ import graphql.language.OperationDefinition; import graphql.language.Selection; import graphql.language.SelectionSet; -import graphql.language.TypeName; import graphql.language.VariableDefinition; import graphql.normalized.incremental.NormalizedDeferredExecution; -import graphql.normalized.incremental.IncrementalNodes; import graphql.schema.FieldCoordinates; import graphql.schema.GraphQLCompositeType; import graphql.schema.GraphQLFieldDefinition; @@ -191,7 +190,6 @@ public boolean getDeferSupport() { } private static final ConditionalNodes conditionalNodes = new ConditionalNodes(); - private static final IncrementalNodes incrementalNodes = new IncrementalNodes(); private ExecutableNormalizedOperationFactory() { @@ -733,7 +731,6 @@ private void collectFragmentSpread(List result, NormalizedDeferredExecution newDeferredExecution = buildDeferredExecution( fragmentSpread.getDirectives(), - fragmentDefinition.getTypeCondition(), newPossibleObjects); collectFromSelectionSet(fragmentDefinition.getSelectionSet(), result, newAstTypeCondition, newPossibleObjects, newDeferredExecution); @@ -758,7 +755,6 @@ private void collectInlineFragment(List result, NormalizedDeferredExecution newDeferredExecution = buildDeferredExecution( inlineFragment.getDirectives(), - inlineFragment.getTypeCondition(), newPossibleObjects ); @@ -767,17 +763,15 @@ private void collectInlineFragment(List result, private NormalizedDeferredExecution buildDeferredExecution( List directives, - TypeName typeCondition, Set newPossibleObjects) { if(!options.deferSupport) { return null; } - return incrementalNodes.createDeferExecution( + return IncrementalUtils.createDeferredExecution( this.coercedVariableValues.toMap(), directives, - typeCondition, - newPossibleObjects + (label) -> new NormalizedDeferredExecution(label, newPossibleObjects) ); } diff --git a/src/main/java/graphql/normalized/incremental/IncrementalNodes.java b/src/main/java/graphql/normalized/incremental/IncrementalNodes.java deleted file mode 100644 index 0daa539329..0000000000 --- a/src/main/java/graphql/normalized/incremental/IncrementalNodes.java +++ /dev/null @@ -1,55 +0,0 @@ -package graphql.normalized.incremental; - -import graphql.Assert; -import graphql.GraphQLContext; -import graphql.Internal; -import graphql.execution.CoercedVariables; -import graphql.execution.ValuesResolver; -import graphql.language.Directive; -import graphql.language.NodeUtil; -import graphql.language.TypeName; -import graphql.schema.GraphQLObjectType; - -import javax.annotation.Nullable; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import static graphql.Directives.DeferDirective; - -@Internal -public class IncrementalNodes { - - public NormalizedDeferredExecution createDeferExecution( - Map variables, - List directives, - @Nullable TypeName targetType, - Set possibleTypes - ) { - Directive deferDirective = NodeUtil.findNodeByName(directives, DeferDirective.getName()); - - if (deferDirective != null) { - Map argumentValues = ValuesResolver.getArgumentValues(DeferDirective.getArguments(), deferDirective.getArguments(), CoercedVariables.of(variables), GraphQLContext.getDefault(), Locale.getDefault()); - - Object flag = argumentValues.get("if"); - Assert.assertTrue(flag instanceof Boolean, () -> String.format("The '%s' directive MUST have a value for the 'if' argument", DeferDirective.getName())); - - if (!((Boolean) flag)) { - return null; - } - - Object label = argumentValues.get("label"); - - if (label == null) { - return new NormalizedDeferredExecution(null, possibleTypes); - } - - Assert.assertTrue(label instanceof String, () -> String.format("The 'label' argument from the '%s' directive MUST contain a String value", DeferDirective.getName())); - - return new NormalizedDeferredExecution((String) label, possibleTypes); - } - - return null; - } -}