Skip to content

Commit fbb48d5

Browse files
authored
Revert "New spec validation: Subscriptions root field must not contain @Skip nor @include on root selection set"
1 parent 66e2ebf commit fbb48d5

File tree

8 files changed

+15
-199
lines changed

8 files changed

+15
-199
lines changed

src/main/java/graphql/validation/ValidationErrorType.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public enum ValidationErrorType implements ValidationErrorClassification {
4343
NullValueForNonNullArgument,
4444
SubscriptionMultipleRootFields,
4545
SubscriptionIntrospectionRootField,
46-
ForbidSkipAndIncludeOnSubscriptionRoot,
4746
UniqueObjectFieldName,
4847
UnknownOperation
4948
}

src/main/java/graphql/validation/Validator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import graphql.validation.rules.PossibleFragmentSpreads;
2828
import graphql.validation.rules.ProvidedNonNullArguments;
2929
import graphql.validation.rules.ScalarLeaves;
30-
import graphql.validation.rules.SubscriptionRootField;
30+
import graphql.validation.rules.SubscriptionUniqueRootField;
3131
import graphql.validation.rules.UniqueArgumentNames;
3232
import graphql.validation.rules.UniqueDirectiveNamesPerLocation;
3333
import graphql.validation.rules.UniqueFragmentNames;
@@ -155,7 +155,7 @@ public List<AbstractRule> createRules(ValidationContext validationContext, Valid
155155
UniqueVariableNames uniqueVariableNamesRule = new UniqueVariableNames(validationContext, validationErrorCollector);
156156
rules.add(uniqueVariableNamesRule);
157157

158-
SubscriptionRootField uniqueSubscriptionRootField = new SubscriptionRootField(validationContext, validationErrorCollector);
158+
SubscriptionUniqueRootField uniqueSubscriptionRootField = new SubscriptionUniqueRootField(validationContext, validationErrorCollector);
159159
rules.add(uniqueSubscriptionRootField);
160160

161161
UniqueObjectFieldName uniqueObjectFieldName = new UniqueObjectFieldName(validationContext, validationErrorCollector);

src/main/java/graphql/validation/rules/SubscriptionRootField.java renamed to src/main/java/graphql/validation/rules/SubscriptionUniqueRootField.java

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,30 @@
66
import graphql.execution.FieldCollectorParameters;
77
import graphql.execution.MergedField;
88
import graphql.execution.MergedSelectionSet;
9-
import graphql.execution.RawVariables;
10-
import graphql.execution.ValuesResolver;
11-
import graphql.language.Directive;
129
import graphql.language.NodeUtil;
1310
import graphql.language.OperationDefinition;
14-
import graphql.language.VariableDefinition;
11+
import graphql.language.Selection;
1512
import graphql.schema.GraphQLObjectType;
1613
import graphql.validation.AbstractRule;
1714
import graphql.validation.ValidationContext;
1815
import graphql.validation.ValidationErrorCollector;
1916

2017
import java.util.List;
2118

22-
import static graphql.Directives.INCLUDE_DIRECTIVE_DEFINITION;
23-
import static graphql.Directives.SKIP_DIRECTIVE_DEFINITION;
2419
import static graphql.language.OperationDefinition.Operation.SUBSCRIPTION;
2520
import static graphql.validation.ValidationErrorType.SubscriptionIntrospectionRootField;
2621
import static graphql.validation.ValidationErrorType.SubscriptionMultipleRootFields;
27-
import static graphql.validation.ValidationErrorType.ForbidSkipAndIncludeOnSubscriptionRoot;
2822

2923

3024
/**
3125
* A subscription operation must only have one root field
3226
* A subscription operation's single root field must not be an introspection field
3327
* https://spec.graphql.org/draft/#sec-Single-root-field
34-
*
35-
* A subscription operation's root field must not have neither @skip nor @include directives
3628
*/
3729
@Internal
38-
public class SubscriptionRootField extends AbstractRule {
30+
public class SubscriptionUniqueRootField extends AbstractRule {
3931
private final FieldCollector fieldCollector = new FieldCollector();
40-
public SubscriptionRootField(ValidationContext validationContext, ValidationErrorCollector validationErrorCollector) {
32+
public SubscriptionUniqueRootField(ValidationContext validationContext, ValidationErrorCollector validationErrorCollector) {
4133
super(validationContext, validationErrorCollector);
4234
}
4335

@@ -47,24 +39,16 @@ public void checkOperationDefinition(OperationDefinition operationDef) {
4739

4840
GraphQLObjectType subscriptionType = getValidationContext().getSchema().getSubscriptionType();
4941

50-
// This coercion takes into account default values for variables
51-
List<VariableDefinition> variableDefinitions = operationDef.getVariableDefinitions();
52-
CoercedVariables coercedVariableValues = ValuesResolver.coerceVariableValues(
53-
getValidationContext().getSchema(),
54-
variableDefinitions,
55-
RawVariables.emptyVariables(),
56-
getValidationContext().getGraphQLContext(),
57-
getValidationContext().getI18n().getLocale());
58-
5942
FieldCollectorParameters collectorParameters = FieldCollectorParameters.newParameters()
6043
.schema(getValidationContext().getSchema())
6144
.fragments(NodeUtil.getFragmentsByName(getValidationContext().getDocument()))
62-
.variables(coercedVariableValues.toMap())
45+
.variables(CoercedVariables.emptyVariables().toMap())
6346
.objectType(subscriptionType)
6447
.graphQLContext(getValidationContext().getGraphQLContext())
6548
.build();
6649

6750
MergedSelectionSet fields = fieldCollector.collectFields(collectorParameters, operationDef.getSelectionSet());
51+
List<Selection> subscriptionSelections = operationDef.getSelectionSet().getSelections();
6852

6953
if (fields.size() > 1) {
7054
String message = i18n(SubscriptionMultipleRootFields, "SubscriptionUniqueRootField.multipleRootFields", operationDef.getName());
@@ -73,30 +57,16 @@ public void checkOperationDefinition(OperationDefinition operationDef) {
7357

7458
MergedField mergedField = fields.getSubFieldsList().get(0);
7559

60+
7661
if (isIntrospectionField(mergedField)) {
7762
String message = i18n(SubscriptionIntrospectionRootField, "SubscriptionIntrospectionRootField.introspectionRootField", operationDef.getName(), mergedField.getName());
7863
addError(SubscriptionIntrospectionRootField, mergedField.getSingleField().getSourceLocation(), message);
7964
}
80-
81-
if (hasSkipOrIncludeDirectives(mergedField)) {
82-
String message = i18n(ForbidSkipAndIncludeOnSubscriptionRoot, "SubscriptionRootField.forbidSkipAndIncludeOnSubscriptionRoot", operationDef.getName(), mergedField.getName());
83-
addError(ForbidSkipAndIncludeOnSubscriptionRoot, mergedField.getSingleField().getSourceLocation(), message);
84-
}
8565
}
8666
}
8767
}
8868

8969
private boolean isIntrospectionField(MergedField field) {
9070
return field.getName().startsWith("__");
9171
}
92-
93-
private boolean hasSkipOrIncludeDirectives(MergedField field) {
94-
List<Directive> directives = field.getSingleField().getDirectives();
95-
for (Directive directive : directives) {
96-
if (directive.getName().equals(SKIP_DIRECTIVE_DEFINITION.getName()) || directive.getName().equals(INCLUDE_DIRECTIVE_DEFINITION.getName())) {
97-
return true;
98-
}
99-
}
100-
return false;
101-
}
10272
}

src/main/resources/i18n/Validation.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ ScalarLeaves.subselectionOnLeaf=Validation error ({0}) : Subselection not allowe
6868
ScalarLeaves.subselectionRequired=Validation error ({0}) : Subselection required for type ''{1}'' of field ''{2}''
6969
#
7070
SubscriptionUniqueRootField.multipleRootFields=Validation error ({0}) : Subscription operation ''{1}'' must have exactly one root field
71+
SubscriptionUniqueRootField.multipleRootFieldsWithFragment=Validation error ({0}) : Subscription operation ''{1}'' must have exactly one root field with fragments
7172
SubscriptionIntrospectionRootField.introspectionRootField=Validation error ({0}) : Subscription operation ''{1}'' root field ''{2}'' cannot be an introspection field
72-
SubscriptionRootField.forbidSkipAndIncludeOnSubscriptionRoot=Validation error ({0}) : Subscription operation ''{1}'' root field ''{2}'' must not use @skip nor @include directives in top level selection
73+
SubscriptionIntrospectionRootField.introspectionRootFieldWithFragment=Validation error ({0}) : Subscription operation ''{1}'' fragment root field ''{2}'' cannot be an introspection field
7374
#
7475
UniqueArgumentNames.uniqueArgument=Validation error ({0}) : There can be only one argument named ''{1}''
7576
#

src/main/resources/i18n/Validation_de.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ ScalarLeaves.subselectionOnLeaf=Validierungsfehler ({0}) : Unterauswahl für Bla
6060
ScalarLeaves.subselectionRequired=Validierungsfehler ({0}) : Unterauswahl erforderlich für Typ ''{1}'' des Feldes ''{2}''
6161
#
6262
SubscriptionUniqueRootField.multipleRootFields=Validierungsfehler ({0}) : Subscription operation ''{1}'' muss genau ein root field haben
63+
SubscriptionUniqueRootField.multipleRootFieldsWithFragment=Validierungsfehler ({0}) : Subscription operation ''{1}'' muss genau ein root field mit Fragmenten haben
6364
SubscriptionIntrospectionRootField.introspectionRootField=Validierungsfehler ({0}) : Subscription operation ''{1}'' root field ''{2}'' kann kein introspection field sein
64-
SubscriptionRootField.forbidSkipAndIncludeOnSubscriptionRoot=Validierungsfehler ({0}) : Subscription operation ''{1}'' root field ''{2}'' darf weder @skip noch @include directive in top level selection
65-
#
65+
SubscriptionIntrospectionRootField.introspectionRootFieldWithFragment=Validierungsfehler ({0}) : Subscription operation ''{1}'' fragment root field ''{2}'' kann kein introspection field sein
6666
#
6767
UniqueArgumentNames.uniqueArgument=Validierungsfehler ({0}) : Es kann nur ein Argument namens ''{1}'' geben
6868
#

src/main/resources/i18n/Validation_nl.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ ScalarLeaves.subselectionOnLeaf=Validatiefout ({0}) : Sub-selectie niet toegesta
5858
ScalarLeaves.subselectionRequired=Validatiefout ({0}) : Sub-selectie verplicht voor type ''{1}'' van veld ''{2}''
5959
#
6060
SubscriptionUniqueRootField.multipleRootFields=Validatiefout ({0}) : Subscription operation ''{1}'' moet exact één root field hebben
61+
SubscriptionUniqueRootField.multipleRootFieldsWithFragment=Validatiefout ({0}) : Subscription operation ''{1}'' moet exact één root field met fragmenten hebben
6162
SubscriptionIntrospectionRootField.introspectionRootField=Validatiefout ({0}) : Subscription operation ''{1}'' root field ''{2}'' kan geen introspectieveld zijn
62-
SubscriptionRootField.forbidSkipAndIncludeOnSubscriptionRoot=Validation error ({0}) : Subscription operation ''{1}'' root field ''{2}'' must not use @skip nor @include directives in top level selection
63+
SubscriptionIntrospectionRootField.introspectionRootFieldWithFragment=Validatiefout ({0}) : Subscription operation ''{1}'' fragment root field ''{2}'' kan geen introspectieveld zijn
6364
#
6465
UniqueArgumentNames.uniqueArgument=Validatiefout ({0}) : Er mag maar één argument met naam ''{1}'' bestaan
6566
#

src/test/groovy/graphql/validation/rules/SubscriptionRootFieldNoSkipNoIncludeTest.groovy

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

src/test/groovy/graphql/validation/rules/SubscriptionRootFieldTest.groovy renamed to src/test/groovy/graphql/validation/rules/SubscriptionUniqueRootFieldTest.groovy

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import graphql.validation.ValidationErrorType
77
import graphql.validation.Validator
88
import spock.lang.Specification
99

10-
class SubscriptionRootFieldTest extends Specification {
10+
class SubscriptionUniqueRootFieldTest extends Specification {
1111
def "5.2.3.1 subscription with only one root field passes validation"() {
1212
given:
1313
def subscriptionOneRoot = '''
@@ -286,7 +286,6 @@ class SubscriptionRootFieldTest extends Specification {
286286
then:
287287
validationErrors.empty
288288
}
289-
290289
static List<ValidationError> validate(String query) {
291290
def document = new Parser().parseDocument(query)
292291
return new Validator().validateDocument(SpecValidationSchema.specValidationSchema, document, Locale.ENGLISH)

0 commit comments

Comments
 (0)