Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/jmh/java/benchmark/OverlappingFieldValidationBenchmark.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.SchemaGenerator;
import graphql.validation.LanguageTraversal;
import graphql.validation.RulesVisitor;
import graphql.validation.OperationValidationRule;
import graphql.validation.OperationValidator;
import graphql.validation.ValidationContext;
import graphql.validation.ValidationError;
import graphql.validation.ValidationErrorCollector;
import graphql.validation.rules.OverlappingFieldsCanBeMerged;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
Expand All @@ -25,7 +25,6 @@
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -78,9 +77,10 @@ private List<ValidationError> validateQuery(GraphQLSchema schema, Document docum
ValidationErrorCollector errorCollector = new ValidationErrorCollector();
I18n i18n = I18n.i18n(I18n.BundleType.Validation, Locale.ENGLISH);
ValidationContext validationContext = new ValidationContext(schema, document, i18n);
OverlappingFieldsCanBeMerged overlappingFieldsCanBeMerged = new OverlappingFieldsCanBeMerged(validationContext, errorCollector);
OperationValidator operationValidator = new OperationValidator(validationContext, errorCollector,
rule -> rule == OperationValidationRule.OVERLAPPING_FIELDS_CAN_BE_MERGED);
LanguageTraversal languageTraversal = new LanguageTraversal();
languageTraversal.traverse(document, new RulesVisitor(validationContext, Collections.singletonList(overlappingFieldsCanBeMerged)));
languageTraversal.traverse(document, operationValidator);
return errorCollector.getErrors();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.SchemaGenerator;
import graphql.validation.LanguageTraversal;
import graphql.validation.RulesVisitor;
import graphql.validation.OperationValidationRule;
import graphql.validation.OperationValidator;
import graphql.validation.ValidationContext;
import graphql.validation.ValidationError;
import graphql.validation.ValidationErrorCollector;
import graphql.validation.rules.OverlappingFieldsCanBeMerged;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
Expand All @@ -27,7 +27,6 @@
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -151,9 +150,10 @@ private List<ValidationError> validateQuery(GraphQLSchema schema, Document docum
ValidationErrorCollector errorCollector = new ValidationErrorCollector();
I18n i18n = I18n.i18n(I18n.BundleType.Validation, Locale.ENGLISH);
ValidationContext validationContext = new ValidationContext(schema, document, i18n);
OverlappingFieldsCanBeMerged overlappingFieldsCanBeMerged = new OverlappingFieldsCanBeMerged(validationContext, errorCollector);
OperationValidator operationValidator = new OperationValidator(validationContext, errorCollector,
rule -> rule == OperationValidationRule.OVERLAPPING_FIELDS_CAN_BE_MERGED);
LanguageTraversal languageTraversal = new LanguageTraversal();
languageTraversal.traverse(document, new RulesVisitor(validationContext, Collections.singletonList(overlappingFieldsCanBeMerged)));
languageTraversal.traverse(document, operationValidator);
Assert.assertTrue(errorCollector.getErrors().size() == 0);
return errorCollector.getErrors();
}
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/graphql/GraphQL.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import graphql.execution.preparsed.PreparsedDocumentProvider;
import graphql.language.Document;
import graphql.schema.GraphQLSchema;
import graphql.validation.OperationValidationRule;
import graphql.validation.ValidationError;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.NullUnmarked;
Expand Down Expand Up @@ -598,8 +599,8 @@ private List<ValidationError> validate(ExecutionInput executionInput, Document d
InstrumentationContext<List<ValidationError>> validationCtx = nonNullCtx(instrumentation.beginValidation(new InstrumentationValidationParameters(executionInput, document, graphQLSchema), instrumentationState));
validationCtx.onDispatched();

Predicate<Class<?>> validationRulePredicate = executionInput.getGraphQLContext().getOrDefault(ParseAndValidate.INTERNAL_VALIDATION_PREDICATE_HINT, r -> true);
Locale locale = executionInput.getLocale();
Predicate<OperationValidationRule> validationRulePredicate = executionInput.getGraphQLContext().getOrDefault(ParseAndValidate.INTERNAL_VALIDATION_PREDICATE_HINT, r -> true);
Locale locale = executionInput.getLocale() != null ? executionInput.getLocale() : Locale.getDefault();
List<ValidationError> validationErrors = ParseAndValidate.validate(graphQLSchema, document, validationRulePredicate, locale);

validationCtx.onCompleted(validationErrors, null);
Expand Down
22 changes: 12 additions & 10 deletions src/main/java/graphql/ParseAndValidate.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import graphql.parser.ParserEnvironment;
import graphql.parser.ParserOptions;
import graphql.schema.GraphQLSchema;
import graphql.validation.OperationValidationRule;
import graphql.validation.ValidationError;
import graphql.validation.Validator;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.NullMarked;

import java.util.List;
Expand All @@ -28,7 +30,7 @@ public class ParseAndValidate {

/**
* This {@link GraphQLContext} hint can be used to supply a Predicate to the Validator so that certain rules can be skipped.
* <p>
*
* This is an internal capability that you should use at your own risk. While we intend for this to be present for some time, the validation
* rule class names may change, as may this mechanism.
*/
Expand All @@ -44,7 +46,7 @@ public class ParseAndValidate {
*
* @return a result object that indicates how this operation went
*/
public static ParseAndValidateResult parseAndValidate(GraphQLSchema graphQLSchema, ExecutionInput executionInput) {
public static ParseAndValidateResult parseAndValidate(@NonNull GraphQLSchema graphQLSchema, @NonNull ExecutionInput executionInput) {
ParseAndValidateResult result = parse(executionInput);
if (!result.isFailure()) {
List<ValidationError> errors = validate(graphQLSchema, assertNotNull(result.getDocument(), "Parse result document cannot be null when parse succeeded"), executionInput.getLocale());
Expand All @@ -60,15 +62,15 @@ public static ParseAndValidateResult parseAndValidate(GraphQLSchema graphQLSchem
*
* @return a result object that indicates how this operation went
*/
public static ParseAndValidateResult parse(ExecutionInput executionInput) {
public static ParseAndValidateResult parse(@NonNull ExecutionInput executionInput) {
try {
//
// we allow the caller to specify new parser options by context
ParserOptions parserOptions = executionInput.getGraphQLContext().get(ParserOptions.class);
// we use the query parser options by default if they are not specified
parserOptions = ofNullable(parserOptions).orElse(ParserOptions.getDefaultOperationParserOptions());
Parser parser = new Parser();
Locale locale = executionInput.getLocale();
Locale locale = executionInput.getLocale() == null ? Locale.getDefault() : executionInput.getLocale();
ParserEnvironment parserEnvironment = ParserEnvironment.newParserEnvironment()
.document(executionInput.getQuery()).parserOptions(parserOptions)
.locale(locale)
Expand All @@ -89,8 +91,8 @@ public static ParseAndValidateResult parse(ExecutionInput executionInput) {
*
* @return a result object that indicates how this operation went
*/
public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument, Locale locale) {
return validate(graphQLSchema, parsedDocument, ruleClass -> true, locale);
public static List<ValidationError> validate(@NonNull GraphQLSchema graphQLSchema, @NonNull Document parsedDocument, @NonNull Locale locale) {
return validate(graphQLSchema, parsedDocument, rule -> true, locale);
}

/**
Expand All @@ -101,8 +103,8 @@ public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Docume
*
* @return a result object that indicates how this operation went
*/
public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument) {
return validate(graphQLSchema, parsedDocument, ruleClass -> true, Locale.getDefault());
public static List<ValidationError> validate(@NonNull GraphQLSchema graphQLSchema, @NonNull Document parsedDocument) {
return validate(graphQLSchema, parsedDocument, rule -> true, Locale.getDefault());
}

/**
Expand All @@ -115,7 +117,7 @@ public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Docume
*
* @return a result object that indicates how this operation went
*/
public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument, Predicate<Class<?>> rulePredicate, Locale locale) {
public static List<ValidationError> validate(@NonNull GraphQLSchema graphQLSchema, @NonNull Document parsedDocument, @NonNull Predicate<OperationValidationRule> rulePredicate, @NonNull Locale locale) {
Validator validator = new Validator();
return validator.validateDocument(graphQLSchema, parsedDocument, rulePredicate, locale);
}
Expand All @@ -129,7 +131,7 @@ public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Docume
*
* @return a result object that indicates how this operation went
*/
public static List<ValidationError> validate(GraphQLSchema graphQLSchema, Document parsedDocument, Predicate<Class<?>> rulePredicate) {
public static List<ValidationError> validate(@NonNull GraphQLSchema graphQLSchema, @NonNull Document parsedDocument, @NonNull Predicate<OperationValidationRule> rulePredicate) {
Validator validator = new Validator();
return validator.validateDocument(graphQLSchema, parsedDocument, rulePredicate, Locale.getDefault());
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/graphql/execution/MergedField.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
* </pre>
* These examples make clear that you need to consider all merged fields together to have the full picture.
* <p>
* The actual logic when fields can be successfully merged together is implemented in {#graphql.validation.rules.OverlappingFieldsCanBeMerged}
* The actual logic when fields can be successfully merged together is implemented in {#graphql.validation.OperationValidator}
*/
@PublicApi
@NullMarked
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/graphql/normalized/ENFMerger.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ private static boolean compareWithoutChildren(ExecutableNormalizedField one, Exe
return true;
}

// copied from graphql.validation.rules.OverlappingFieldsCanBeMerged
// copied from graphql.validation.OperationValidator
private static boolean sameArguments(List<Argument> arguments1, List<Argument> arguments2) {
if (arguments1.size() != arguments2.size()) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ private static boolean compareWithoutChildren(NormalizedField one, NormalizedFie
return true;
}

// copied from graphql.validation.rules.OverlappingFieldsCanBeMerged
// copied from graphql.validation.OperationValidator
private static boolean sameArguments(List<Argument> arguments1, List<Argument> arguments2) {
if (arguments1.size() != arguments2.size()) {
return false;
Expand Down
Loading
Loading