88import graphql .execution .instrumentation .InstrumentationState ;
99import graphql .execution .instrumentation .SimplePerformantInstrumentation ;
1010import graphql .execution .instrumentation .parameters .InstrumentationExecuteOperationParameters ;
11+ import org .jspecify .annotations .NullMarked ;
1112import org .jspecify .annotations .Nullable ;
1213
1314import java .util .function .Function ;
2122 * exceeded. If the function returns {@code true} a {@link AbortExecutionException} is thrown.
2223 */
2324@ PublicApi
25+ @ NullMarked
2426public class MaxQueryDepthInstrumentation extends SimplePerformantInstrumentation {
2527
26-
2728 private final int maxDepth ;
2829 private final Function <QueryDepthInfo , Boolean > maxQueryDepthExceededFunction ;
2930
@@ -48,7 +49,7 @@ public MaxQueryDepthInstrumentation(int maxDepth, Function<QueryDepthInfo, Boole
4849 }
4950
5051 @ Override
51- public @ Nullable InstrumentationContext <ExecutionResult > beginExecuteOperation (InstrumentationExecuteOperationParameters parameters , InstrumentationState state ) {
52+ public InstrumentationContext <ExecutionResult > beginExecuteOperation (InstrumentationExecuteOperationParameters parameters , InstrumentationState state ) {
5253 QueryTraverser queryTraverser = newQueryTraverser (parameters .getExecutionContext ());
5354 int depth = queryTraverser .reducePreOrder ((env , acc ) -> Math .max (getPathLength (env .getParentEnvironment ()), acc ), 0 );
5455 if (depth > maxDepth ) {
@@ -84,7 +85,7 @@ QueryTraverser newQueryTraverser(ExecutionContext executionContext) {
8485 .build ();
8586 }
8687
87- private int getPathLength (QueryVisitorFieldEnvironment path ) {
88+ private int getPathLength (@ Nullable QueryVisitorFieldEnvironment path ) {
8889 int length = 1 ;
8990 while (path != null ) {
9091 path = path .getParentEnvironment ();
0 commit comments