Skip to content

Commit 469caf6

Browse files
committed
Cherry pick PR 3539 and update ConditionalNodes and related files to v21 equivalent
1 parent 67035a2 commit 469caf6

23 files changed

Lines changed: 2139 additions & 483 deletions

src/main/java/graphql/Assert.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,20 @@ public static void assertTrue(boolean condition) {
8585
throw new AssertException("condition expected to be true");
8686
}
8787

88+
public static void assertTrue(boolean condition, String constantMsg) {
89+
if (condition) {
90+
return;
91+
}
92+
throwAssert(constantMsg);
93+
}
94+
95+
public static void assertTrue(boolean condition, String msgFmt, Object arg1) {
96+
if (condition) {
97+
return;
98+
}
99+
throwAssert(msgFmt, arg1);
100+
}
101+
88102
public static void assertFalse(boolean condition, Supplier<String> msg) {
89103
if (!condition) {
90104
return;
@@ -117,4 +131,7 @@ public static String assertValidName(String name) {
117131
throw new AssertException(String.format(invalidNameErrorMessage, name));
118132
}
119133

134+
private static <T> T throwAssert(String format, Object... args) {
135+
throw new AssertException(format(format, args));
136+
}
120137
}

src/main/java/graphql/analysis/NodeVisitorWithTypeTracking.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import graphql.GraphQLContext;
44
import graphql.Internal;
55
import graphql.execution.CoercedVariables;
6-
import graphql.execution.ConditionalNodes;
76
import graphql.execution.ValuesResolver;
7+
import graphql.execution.conditional.ConditionalNodes;
88
import graphql.introspection.Introspection;
99
import graphql.language.Argument;
1010
import graphql.language.Directive;
@@ -68,7 +68,9 @@ public TraversalControl visitDirective(Directive node, TraverserContext<Node> co
6868

6969
@Override
7070
public TraversalControl visitInlineFragment(InlineFragment inlineFragment, TraverserContext<Node> context) {
71-
if (!conditionalNodes.shouldInclude(variables, inlineFragment.getDirectives())) {
71+
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
72+
GraphQLContext graphQLContext = parentEnv.getGraphQLContext();
73+
if (!conditionalNodes.shouldInclude(inlineFragment, variables, null, graphQLContext)) {
7274
return TraversalControl.ABORT;
7375
}
7476

@@ -82,7 +84,6 @@ public TraversalControl visitInlineFragment(InlineFragment inlineFragment, Trave
8284
preOrderCallback.visitInlineFragment(inlineFragmentEnvironment);
8385

8486
// inline fragments are allowed not have type conditions, if so the parent type counts
85-
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
8687

8788
GraphQLCompositeType fragmentCondition;
8889
if (inlineFragment.getTypeCondition() != null) {
@@ -92,38 +93,41 @@ public TraversalControl visitInlineFragment(InlineFragment inlineFragment, Trave
9293
fragmentCondition = parentEnv.getUnwrappedOutputType();
9394
}
9495
// for unions we only have other fragments inside
95-
context.setVar(QueryTraversalContext.class, new QueryTraversalContext(fragmentCondition, parentEnv.getEnvironment(), inlineFragment));
96+
context.setVar(QueryTraversalContext.class, new QueryTraversalContext(fragmentCondition, parentEnv.getEnvironment(), inlineFragment, graphQLContext));
9697
return TraversalControl.CONTINUE;
9798
}
9899

99100
@Override
100-
public TraversalControl visitFragmentDefinition(FragmentDefinition node, TraverserContext<Node> context) {
101-
if (!conditionalNodes.shouldInclude(variables, node.getDirectives())) {
101+
public TraversalControl visitFragmentDefinition(FragmentDefinition fragmentDefinition, TraverserContext<Node> context) {
102+
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
103+
GraphQLContext graphQLContext = parentEnv.getGraphQLContext();
104+
if (!conditionalNodes.shouldInclude(fragmentDefinition, variables, null, graphQLContext)) {
102105
return TraversalControl.ABORT;
103106
}
104107

105-
QueryVisitorFragmentDefinitionEnvironment fragmentEnvironment = new QueryVisitorFragmentDefinitionEnvironmentImpl(node, context, schema);
108+
QueryVisitorFragmentDefinitionEnvironment fragmentEnvironment = new QueryVisitorFragmentDefinitionEnvironmentImpl(fragmentDefinition, context, schema);
106109

107110
if (context.getPhase() == LEAVE) {
108111
postOrderCallback.visitFragmentDefinition(fragmentEnvironment);
109112
return TraversalControl.CONTINUE;
110113
}
111114
preOrderCallback.visitFragmentDefinition(fragmentEnvironment);
112115

113-
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
114-
GraphQLCompositeType typeCondition = (GraphQLCompositeType) schema.getType(node.getTypeCondition().getName());
115-
context.setVar(QueryTraversalContext.class, new QueryTraversalContext(typeCondition, parentEnv.getEnvironment(), node));
116+
GraphQLCompositeType typeCondition = (GraphQLCompositeType) schema.getType(fragmentDefinition.getTypeCondition().getName());
117+
context.setVar(QueryTraversalContext.class, new QueryTraversalContext(typeCondition, parentEnv.getEnvironment(), fragmentDefinition, graphQLContext));
116118
return TraversalControl.CONTINUE;
117119
}
118120

119121
@Override
120122
public TraversalControl visitFragmentSpread(FragmentSpread fragmentSpread, TraverserContext<Node> context) {
121-
if (!conditionalNodes.shouldInclude(variables, fragmentSpread.getDirectives())) {
123+
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
124+
GraphQLContext graphQLContext = parentEnv.getGraphQLContext();
125+
if (!conditionalNodes.shouldInclude(fragmentSpread, variables, null, graphQLContext)) {
122126
return TraversalControl.ABORT;
123127
}
124128

125129
FragmentDefinition fragmentDefinition = fragmentsByName.get(fragmentSpread.getName());
126-
if (!conditionalNodes.shouldInclude(variables, fragmentDefinition.getDirectives())) {
130+
if (!conditionalNodes.shouldInclude(fragmentDefinition, variables, null, graphQLContext)) {
127131
return TraversalControl.ABORT;
128132
}
129133

@@ -135,19 +139,19 @@ public TraversalControl visitFragmentSpread(FragmentSpread fragmentSpread, Trave
135139

136140
preOrderCallback.visitFragmentSpread(fragmentSpreadEnvironment);
137141

138-
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
139142

140143
GraphQLCompositeType typeCondition = (GraphQLCompositeType) schema.getType(fragmentDefinition.getTypeCondition().getName());
141144
assertNotNull(typeCondition,
142145
() -> format("Invalid type condition '%s' in fragment '%s'", fragmentDefinition.getTypeCondition().getName(),
143146
fragmentDefinition.getName()));
144-
context.setVar(QueryTraversalContext.class, new QueryTraversalContext(typeCondition, parentEnv.getEnvironment(), fragmentDefinition));
147+
context.setVar(QueryTraversalContext.class, new QueryTraversalContext(typeCondition, parentEnv.getEnvironment(), fragmentDefinition, graphQLContext));
145148
return TraversalControl.CONTINUE;
146149
}
147150

148151
@Override
149152
public TraversalControl visitField(Field field, TraverserContext<Node> context) {
150153
QueryTraversalContext parentEnv = context.getVarFromParents(QueryTraversalContext.class);
154+
GraphQLContext graphQLContext = parentEnv.getGraphQLContext();
151155

152156
GraphQLFieldDefinition fieldDefinition = Introspection.getFieldDef(schema, (GraphQLCompositeType) unwrapAll(parentEnv.getOutputType()), field.getName());
153157
boolean isTypeNameIntrospectionField = fieldDefinition == schema.getIntrospectionTypenameFieldDefinition();
@@ -174,16 +178,16 @@ public TraversalControl visitField(Field field, TraverserContext<Node> context)
174178
return TraversalControl.CONTINUE;
175179
}
176180

177-
if (!conditionalNodes.shouldInclude(variables, field.getDirectives())) {
181+
if (!conditionalNodes.shouldInclude(field, variables, null, graphQLContext)) {
178182
return TraversalControl.ABORT;
179183
}
180184

181185
TraversalControl traversalControl = preOrderCallback.visitFieldWithControl(environment);
182186

183187
GraphQLUnmodifiedType unmodifiedType = unwrapAll(fieldDefinition.getType());
184188
QueryTraversalContext fieldEnv = (unmodifiedType instanceof GraphQLCompositeType)
185-
? new QueryTraversalContext(fieldDefinition.getType(), environment, field)
186-
: new QueryTraversalContext(null, environment, field);// Terminal (scalar) node, EMPTY FRAME
189+
? new QueryTraversalContext(fieldDefinition.getType(), environment, field, graphQLContext)
190+
: new QueryTraversalContext(null, environment, field, graphQLContext);// Terminal (scalar) node, EMPTY FRAME
187191

188192

189193
context.setVar(QueryTraversalContext.class, fieldEnv);
@@ -259,4 +263,4 @@ protected TraversalControl visitValue(Value<?> value, TraverserContext<Node> con
259263
}
260264
return preOrderCallback.visitArgumentValue(environment);
261265
}
262-
}
266+
}

src/main/java/graphql/analysis/QueryTransformer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.analysis;
22

3+
import graphql.GraphQLContext;
34
import graphql.PublicApi;
45
import graphql.language.FragmentDefinition;
56
import graphql.language.Node;
@@ -67,7 +68,7 @@ public Node transform(QueryVisitor queryVisitor) {
6768
NodeVisitorWithTypeTracking nodeVisitor = new NodeVisitorWithTypeTracking(queryVisitor, noOp, variables, schema, fragmentsByName);
6869

6970
Map<Class<?>, Object> rootVars = new LinkedHashMap<>();
70-
rootVars.put(QueryTraversalContext.class, new QueryTraversalContext(rootParentType, null, null));
71+
rootVars.put(QueryTraversalContext.class, new QueryTraversalContext(rootParentType, null, null, GraphQLContext.getDefault()));
7172

7273
TraverserVisitor<Node> nodeTraverserVisitor = new TraverserVisitor<Node>() {
7374

@@ -163,4 +164,4 @@ public QueryTransformer build() {
163164
return new QueryTransformer(schema, root, rootParentType, fragmentsByName, variables);
164165
}
165166
}
166-
}
167+
}

src/main/java/graphql/analysis/QueryTraversalContext.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package graphql.analysis;
22

3+
import graphql.GraphQLContext;
34
import graphql.Internal;
45
import graphql.language.SelectionSetContainer;
56
import graphql.schema.GraphQLCompositeType;
@@ -16,14 +17,17 @@ class QueryTraversalContext {
1617
// never used for scalars/enums, always a possibly wrapped composite type
1718
private final GraphQLOutputType outputType;
1819
private final QueryVisitorFieldEnvironment environment;
19-
private final SelectionSetContainer selectionSetContainer;
20+
private final SelectionSetContainer<?> selectionSetContainer;
21+
private final GraphQLContext graphQLContext;
2022

2123
QueryTraversalContext(GraphQLOutputType outputType,
2224
QueryVisitorFieldEnvironment environment,
23-
SelectionSetContainer selectionSetContainer) {
25+
SelectionSetContainer<?> selectionSetContainer,
26+
GraphQLContext graphQLContext) {
2427
this.outputType = outputType;
2528
this.environment = environment;
2629
this.selectionSetContainer = selectionSetContainer;
30+
this.graphQLContext = graphQLContext;
2731
}
2832

2933
public GraphQLOutputType getOutputType() {
@@ -34,13 +38,15 @@ public GraphQLCompositeType getUnwrappedOutputType() {
3438
return (GraphQLCompositeType) GraphQLTypeUtil.unwrapAll(outputType);
3539
}
3640

37-
3841
public QueryVisitorFieldEnvironment getEnvironment() {
3942
return environment;
4043
}
4144

42-
public SelectionSetContainer getSelectionSetContainer() {
43-
45+
public SelectionSetContainer<?> getSelectionSetContainer() {
4446
return selectionSetContainer;
4547
}
46-
}
48+
49+
public GraphQLContext getGraphQLContext() {
50+
return graphQLContext;
51+
}
52+
}

src/main/java/graphql/analysis/QueryTraverser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ private List<Node> childrenOf(Node<?> node) {
177177

178178
private Object visitImpl(QueryVisitor visitFieldCallback, Boolean preOrder) {
179179
Map<Class<?>, Object> rootVars = new LinkedHashMap<>();
180-
rootVars.put(QueryTraversalContext.class, new QueryTraversalContext(rootParentType, null, null));
180+
rootVars.put(QueryTraversalContext.class, new QueryTraversalContext(rootParentType, null, null, GraphQLContext.getDefault()));
181181

182182
QueryVisitor preOrderCallback;
183183
QueryVisitor postOrderCallback;
@@ -343,4 +343,4 @@ private void checkState() {
343343
}
344344

345345
}
346-
}
346+
}

src/main/java/graphql/execution/ConditionalNodes.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/main/java/graphql/execution/ExecutionContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public class ExecutionContext {
8181
this.errors.set(builder.errors);
8282
this.localContext = builder.localContext;
8383
this.executionInput = builder.executionInput;
84-
queryTree = FpKit.interThreadMemoize(() -> ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables));
84+
this.queryTree = FpKit.interThreadMemoize(() -> ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables));
8585
}
8686

8787

src/main/java/graphql/execution/FieldCollector.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33

44
import graphql.Internal;
5+
import graphql.execution.conditional.ConditionalNodes;
56
import graphql.language.Field;
67
import graphql.language.FragmentDefinition;
78
import graphql.language.FragmentSpread;
@@ -76,13 +77,19 @@ private void collectFragmentSpread(FieldCollectorParameters parameters, Set<Stri
7677
if (visitedFragments.contains(fragmentSpread.getName())) {
7778
return;
7879
}
79-
if (!conditionalNodes.shouldInclude(parameters.getVariables(), fragmentSpread.getDirectives())) {
80+
if (!conditionalNodes.shouldInclude(fragmentSpread,
81+
parameters.getVariables(),
82+
parameters.getGraphQLSchema(),
83+
parameters.getGraphQLContext())) {
8084
return;
8185
}
8286
visitedFragments.add(fragmentSpread.getName());
8387
FragmentDefinition fragmentDefinition = parameters.getFragmentsByName().get(fragmentSpread.getName());
8488

85-
if (!conditionalNodes.shouldInclude(parameters.getVariables(), fragmentDefinition.getDirectives())) {
89+
if (!conditionalNodes.shouldInclude(fragmentDefinition,
90+
parameters.getVariables(),
91+
parameters.getGraphQLSchema(),
92+
parameters.getGraphQLContext())) {
8693
return;
8794
}
8895
if (!doesFragmentConditionMatch(parameters, fragmentDefinition)) {
@@ -92,15 +99,21 @@ private void collectFragmentSpread(FieldCollectorParameters parameters, Set<Stri
9299
}
93100

94101
private void collectInlineFragment(FieldCollectorParameters parameters, Set<String> visitedFragments, Map<String, MergedField> fields, InlineFragment inlineFragment) {
95-
if (!conditionalNodes.shouldInclude(parameters.getVariables(), inlineFragment.getDirectives()) ||
102+
if (!conditionalNodes.shouldInclude(inlineFragment,
103+
parameters.getVariables(),
104+
parameters.getGraphQLSchema(),
105+
parameters.getGraphQLContext()) ||
96106
!doesFragmentConditionMatch(parameters, inlineFragment)) {
97107
return;
98108
}
99109
collectFields(parameters, inlineFragment.getSelectionSet(), visitedFragments, fields);
100110
}
101111

102112
private void collectField(FieldCollectorParameters parameters, Map<String, MergedField> fields, Field field) {
103-
if (!conditionalNodes.shouldInclude(parameters.getVariables(), field.getDirectives())) {
113+
if (!conditionalNodes.shouldInclude(field,
114+
parameters.getVariables(),
115+
parameters.getGraphQLSchema(),
116+
parameters.getGraphQLContext())) {
104117
return;
105118
}
106119
String name = field.getResultKey();
@@ -143,4 +156,4 @@ private boolean checkTypeCondition(FieldCollectorParameters parameters, GraphQLT
143156
}
144157

145158

146-
}
159+
}

0 commit comments

Comments
 (0)