GQLGW-5297-optimise-incremental-part-execution-for-defer-requests by llin2 · Pull Request #4174 · graphql-java/graphql-java

@llin2

This is to optimise defer execution for incremental results to begin processing as soon as the first incremental call is detected rather than on completion of the initial result.

@llin2

andimarek

@llin2

@llin2

bbakerman

initialResult.incrementalItemPublisher.subscribe(sub)

then:
Awaitility.await().untilTrue(sub.isDone())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs an assert on the contents of the Publisher

bbakerman

bbakerman

&& deferredExecutionSupport.deferredFieldsCount() > 0
&& executionContext.getGraphQLContext().getBoolean(IncrementalExecutionContextKeys.ENABLE_EAGER_DEFER_START, false)) {

executionContext.getIncrementalCallState().startDeferredCalls();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This call here is only need as a side effect to create the memoizing supplier (of the Publisher)

I think we should invent a new method that does that and hides the side effect

executionContext.getIncrementalCallState().startEarlyDraining();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hang on you have that - startDrainingNow() and it calls publisher.get()

I dont think executionContext.getIncrementalCallState().startDeferredCalls(); is needed

@llin2

bbakerman

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to create a new entry in the unusual config - lets put it in

graphql.GraphQLUnusualConfiguration.IncrementalSupportConfig

        /**
         * This controls whether @defer field execution starts as early as possible.
         */
        @ExperimentalApi
        public IncrementalSupportConfig enableEarlyFieldExecution(boolean enable) {
            contextConfig.put(YOUR_KEY_HERE, enable);
            return this;
        }

@llin2

andimarek

}

public void startDrainingNow() {
startDeferredCalls();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need to call start Deferred calls as it just creates the publisher

@llin2