Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid repeated calls to getFieldDef and unnecessary immutable builders/collections #3478

Merged

Conversation

DanielThomas
Copy link
Contributor

@DanielThomas DanielThomas commented Feb 28, 2024

Avoid additional calls to getFieldDef in ExecutionStrategy and avoid immutable builder/collections where they're unnecessary on hot paths.

This improves the throughput of TwitterBenchmark by about 15%:

Benchmark                  Mode  Cnt    Score   Error  Units
TwitterBenchmark.execute  thrpt   10  105.571 ± 0.367  ops/s
Benchmark                  Mode  Cnt    Score   Error  Units
TwitterBenchmark.execute  thrpt   10  123.840 ± 1.492  ops/s

(fld1, fld2) -> assertShouldNeverHappen("Duplicated definition for field '%s' in type '%s'", fld1.getName(), this.name)));
private Map<String, GraphQLFieldDefinition> buildDefinitionMap(List<GraphQLFieldDefinition> fieldDefinitions) {
return FpKit.getByName(fieldDefinitions, GraphQLFieldDefinition::getName,
(fld1, fld2) -> assertShouldNeverHappen("Duplicated definition for field '%s' in type '%s'", fld1.getName(), this.name));
Copy link
Member

Choose a reason for hiding this comment

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

yup - just checked - this does not change the immutability of what we give out since we never give out the map of fields directly

Copy link
Member

Choose a reason for hiding this comment

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

That said building object types is done once per schema - so this really wont affect runtime query performance at all I think - or is ImmutableMap lookup of fields somehow slower ???

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, HashMap and therefore LinkedHashMap compares hashes and identity equality first, so is particularly suited for String keys.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Oh, I should add, this matters less than when I started working on this, because I found I could reduce the calls from 3 to 1, but it'll still help.

.measurementIterations(10)
.build();

new Runner(opt).run();
Copy link
Member

Choose a reason for hiding this comment

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

question - I noticed you put main() methods for running the JMH code. Are you some how running this in a standard way (say on a controlled spec machine say?) ??

I ask because we have a desire to do this some how (we worked with Twitter on this until Elon Husk wrecked the joint)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This makes it easier to iterate from the IDE and profile, setting the forks to 0.

@@ -52,10 +54,10 @@ public static Builder newMergedSelectionSet() {
}

public static class Builder {
private Map<String, MergedField> subFields = ImmutableMap.of();
Copy link
Member

Choose a reason for hiding this comment

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

ok defaulting happening in constructor 👍

@@ -66,7 +67,7 @@ public String toString() {
public static class Builder {
private CompleteValueType completeValueType;
private CompletableFuture<Object> fieldValueFuture;
private List<FieldValueInfo> listInfos = new ArrayList<>();
private List<FieldValueInfo> listInfos = ImmutableList.of();
Copy link
Member

Choose a reason for hiding this comment

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

I have another PR that intends to break this class away from a builder pattern

#3465

eg JUST allocate the the object - not a builder and then the object say

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I was also going to add a SingletonMergedField but MergedField is concrete and marked as a public API, so didn't feel comfortable changing that.


private CompletableFuture<FetchedValue> fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {
MergedField field = parameters.getField();
GraphQLObjectType parentType = (GraphQLObjectType) parameters.getExecutionStepInfo().getUnwrappedNonNullType();

Copy link
Member

Choose a reason for hiding this comment

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

The old code is left in place

  protected CompletableFuture<FetchedValue> fetchField(ExecutionContext executionContext, ExecutionStrategyParameters parameters) {
        MergedField field = parameters.getField();
        GraphQLObjectType parentType = (GraphQLObjectType) parameters.getExecutionStepInfo().getUnwrappedNonNullType();
        GraphQLFieldDefinition fieldDef = getFieldDef(executionContext.getGraphQLSchema(), parentType, field.getSingleField());
        return fetchField(fieldDef, executionContext, parameters);
    }

    private CompletableFuture<FetchedValue> fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

and the engine only now calls the private method here. This means we dont break backwards compatibility. So nominally a 👍

HOWEVER - we have long had the debate inside the team about JUST how much API contract we should have in the ExecutionStrategy land - eg can other compose their own engines based on using the base classes and I think the answer is... they really cant make whole new engines using this class via inheritance and hence perhaps these should not be API per say

So it might be prudent @andimarek to just change the method signature - since the old method is dangling and never called by the engine now

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, with the class marked @PublicSpi I didn't want to mess with the signatures, and three remaining references internally:

Screenshot 2024-02-28 at 5 23 59 pm

@bbakerman bbakerman changed the base branch from master to performance-branch March 1, 2024 05:50
@bbakerman
Copy link
Member

I targetted this PR to a performance branch taken from master as of right now.

I want to double check the numbers here. 15% seems too good - so lets just double check before we merged to master

@bbakerman bbakerman merged commit 808d7bc into graphql-java:performance-branch Mar 1, 2024
1 check passed
@DanielThomas
Copy link
Contributor Author

I retested here, I realised I had a memory leak on my Mac that was causing wonkiness in my first run. In fact it's closer to 25%:

Benchmark                  Mode  Cnt    Score   Error  Units
TwitterBenchmark.execute  thrpt   10  113.847 ± 2.123  ops/s
Benchmark                  Mode  Cnt    Score   Error  Units
TwitterBenchmark.execute  thrpt   10  149.603 ± 0.621  ops/s

@bbakerman
Copy link
Member

I just ran this on my machine.

Testing on personal laptops is personal and unstable - ideally we would have a controlled env to submit benchmarks but we don't. But @dondonz was doing some innovation week work on such a thing... so we live in hope.

master

Benchmark                  Mode  Cnt   Score    Error  Units
TwitterBenchmark.execute  thrpt    9  75.879 ± 10.695  ops/s

performance-branch

Benchmark                  Mode  Cnt   Score   Error  Units
TwitterBenchmark.execute  thrpt    9  78.246 ± 4.922  ops/s

So I see a 3.1% increase - still a win

@DanielThomas
Copy link
Contributor Author

Yeah, I can spin future work up on an m7a.2xlarge to benchmark. This is obviously particularly well suited for arm.

I can improve some more incidentally by interning the field keys, so you might want to try that too:

Benchmark                  Mode  Cnt    Score   Error  Units
TwitterBenchmark.execute  thrpt   10  158.237 ± 2.366  ops/s

https://github.com/DanielThomas/graphql-java/compare/dannyt/field-def...DanielThomas:graphql-java:dannyt/field-intern?expand=1

@DanielThomas
Copy link
Contributor Author

DanielThomas commented Mar 1, 2024

This should be better:

processor : 0
vendor_id : AuthenticAMD
cpu family  : 25
model   : 17
model name  : AMD EPYC 9R14
stepping  : 1
microcode : 0xa10113e
cpu MHz   : 2599.998
cache size  : 1024 KB
physical id : 0
siblings  : 8
core id   : 0
cpu cores : 8
apicid    : 0
initial apicid  : 0
fpu   : yes
fpu_exception : yes
cpuid level : 16
wp    : yes
flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf tsc_known_freq pni pclmulqdq monitor ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch topoext perfctr_core invpcid_single ssbd perfmon_v2 ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx512_bf16 clzero xsaveerptr rdpru wbnoinvd arat avx512vbmi pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid flush_l1d
bugs    : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass
bogomips  : 5199.99
TLB size  : 3584 4K pages
clflush size  : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management:
# JMH version: 1.37
# VM version: JDK 11.0.21.0.101, OpenJDK 64-Bit Server VM, 11.0.21.0.101+2-LTS
# VM invoker: /usr/lib/jvm/zulu-11-amd64/bin/java
# VM options: <none>
# Blackhole mode: full + dont-inline hint (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
# Warmup: 5 iterations, 5 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: benchmark.TwitterBenchmark.execute
Benchmark                  Mode  Cnt   Score   Error  Units
TwitterBenchmark.execute  thrpt    5  79.232 ± 0.500  ops/s # master
TwitterBenchmark.execute  thrpt    5  84.061 ± 1.326  ops/s # dannyt/field-def
TwitterBenchmark.execute  thrpt    5  91.914 ± 0.385  ops/s # dannyt/field-intern

(The field-intern branch was built on top of field-def)

@DanielThomas DanielThomas mentioned this pull request Mar 1, 2024
github-merge-queue bot pushed a commit to camunda/camunda that referenced this pull request Apr 24, 2024
…n) (#17781)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[com.graphql-java:graphql-java](https://togithub.com/graphql-java/graphql-java)
| `21.5` -> `230521-nf-execution` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>graphql-java/graphql-java
(com.graphql-java:graphql-java)</summary>

###
[`v22.0`](https://togithub.com/graphql-java/graphql-java/releases/tag/v22.0):
22.0

[Compare
Source](https://togithub.com/graphql-java/graphql-java/compare/v21.5...v22.0)

We are pleased to announce the release of graphql-java v22.0.

Thanks to everyone in the community who contributed to the release,
whether that was code, helping to report issues, or participating in
discussions.

This is a **breaking change** release.

The graphql-java team takes breaking changes very seriously but in the
name of performance we have made some significant breaking changes in
this release.

### Major Performance Changes

Past releases have been very much performance focused and this one is no
different. However, this release is aiming to reduce memory pressure
more than reduce pure CPU usage. When the graphql-java engine is
running, if it produces less objects it will ultimately run faster
because of reduced memory pressure and less garbage to collect.

The engine has been changed in two major ways that reduce memory
pressure.

#### ExecutionResult wrapping

The first was that all values that come back got wrapped internally into
a `ExecutionResult` object where the `data` attribute was the value.
This was a carry over from some very early GraphQL code but was
unnecessary and hence has been removed. The follow on effect of this is
that some `graphql.execution.ExecutionStrategy` protected methods and
`graphql.execution.instrumentation.Instrumentation` methods used to
receive and return `ExecutionResult` values and no longer do, which is
an API breaking change. We have made this breaking changes in the name
of memory pressure performance.

#### CompletableFuture wrapping

The second major change is that the engine no longer exclusively uses
`java.util.concurrent.CompletableFuture`s when composing together
results. Let us explain the past code first so we can discuss the new
code.

`CompletableFuture` is a fantastic construct because it represents a
promise to a value and it can also hold an exceptional state inside
itself. Async programming with `CompletableFuture` is viral. If stage 1
of some compute process returns a `CompletableFuture` then stage 2 and 3
and 4 are likely to as well to ensure everything is asynchronous.

We use to take values that were not asynchronous (such as DataFetcher
that returned a simple in memory object) and wrap them in a
`CompletableFuture` so that all of the other code composed together
using `CompletableFuture` methods like `.thenApply()` and `.thenCompose`
and so on. The code is cleaner if you use all `CompletableFuture` code
patterns.

However many objects in a GraphQL request are not asynchronous but
rather materialised objects in memory. Scalars, enums and list are often
just values immediately available to be used and allocating a
`CompletableFuture` makes the code easier to write but it has a memory
pressure cost.

So we have sacrificed cleaner code for more memory performant code.

graphql-java engine `graphql.execution.ExecutionStrategy` methods now
just return `Object` where that object might be either a
`CompletableFuture` or a materialised value.

```java
    private Object /*CompletableFuture<FetchedValue> | FetchedValue>*/
       fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

```

Notice we have lost type safety here. In the past this would have only
been `CompletableFuture<FetchedValue>` and hence been both type safe and
async composable.

Now the caller of that method has to handle the async case where it
might be a `CompletableFuture<FetchedValue>` AND the materialised value
case where it might be a `FetchedValue` but as most simple fields in
GraphQL are in fact materialised values, this is worth the less clean
code.

`DataFetchers` can of course continue to return `CompletableFuture`
values and they will be handled in a polymorphic manner.

The upshot of all this work is that the graphql-java engine allocated
way less `CompletableFuture` values and hence reduces the amount of
memory used.

#### Instrumentation Changes

The above changes now mean means that before
`graphql.execution.instrumentation.InstrumentationContext` used to be
given a `CompletableFuture` but now no longer does

```java
    void onDispatched(CompletableFuture<T> result);
```

is now

```java
    void onDispatched();
```

if you previously used the `CompletableFuture` to know when something
was completed, well `InstrumentationContext` has the same semantics
because it's completed method is similar in that it presents a value or
an exception

```java
    void onCompleted(T result, Throwable t);
```

`graphql.execution.instrumentation.Instrumentation` also had a lot of
deprecated methods in place and these have been removed since the more
performant shape of passing in
`graphql.execution.instrumentation.InstrumentationState` has been in
place for quite a few releases.

Some of the methods that received `ExecutionResult` wrapped values have
also changed as mentioned above.

`Instrumentation` is probably the area that needs the most attention in
terms of breaking changes. If you have not moved off the deprecated
methods, your custom `Instrumentation`s will no longer compile or run.

#### Interning key strings

Our friends at Netflix provided a PR that interns certain key strings
like "field names" so that we create less String instances when
processing field names in queries that we know must be previously
interned in the schema.

[graphql-java/graphql-java#3504

#### The full list of performance related changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3Aperformance

### Major Changes

#### [@&#8203;defer](https://togithub.com/defer) Experimental Support

Support for the `@defer` directive has been added in an experimental
fashion. While `@defer` is still not in the released GraphQL
specification, we have judged it mature enough to support at this stage
and the `graphql-js` reference implementation has support for it.

https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md

At this stage we have not yet supported `@stream` but this is likely to
be included in a future release.

### Breaking Changes

There are quite a few API breaking changes in this release. In fact
there are 22 PRs containing breaking API changes.

#### Stricter parseValue coercion: Aligning with JS reference
implementation

We have made changes to String, Boolean, Float, and Int `parseValue`
coercion, to be consistent with the reference JS implementation. The key
change is `parseValue` is now stricter on accepted inputs.

- String `parseValue` now requires input of type `String`. For example,
a `Number` input `123` or a `Boolean` input `true` will no longer be
accepted.
- Boolean `parseValue` now requires input of type `Boolean`. For
example, a `String` input `"true"` will no longer be accepted.
- Float `parseValue` now requires input of type `Number`. For example, a
`String` input `"3.14"` will no longer be accepted.
- Int `parseValue` now requires input of type `Number`. For example, a
`String` input `"42"` will no longer be accepted.

This is a breaking change. To help you migrate, in [version
21.0](https://togithub.com/graphql-java/graphql-java/releases/tag/v21.0),
we introduced the InputInterceptor
[graphql-java/graphql-java#3188
(and an implementation LegacyCoercingInputInterceptor
[graphql-java/graphql-java#3218)
to provide a migration pathway. You can use this interceptor to monitor
and modify values.

For more, see
[graphql-java/graphql-java#3553
JS reference implementation:
https://github.com/graphql/graphql-js/blob/main/src/type/scalars.ts

#### Removing deprecated methods

Many methods that have been deprecated for a long time, sometimes even
up to 6 years, have finally been removed.

The `CompletableFuture` unwrapping work mentioned above changed many
methods in the `graphql.execution.ExecutionStrategy` classes but we
don't expect this affect many people since very few people write their
own engines.

That `CompletableFuture` unwrapping work also had knock on effects as
mentioned above on `graphql.execution.instrumentation.Instrumentation`
and hence this is the **most likely** place for there to be
compatibility challenges in existing code.

#### DataLoaderDispatcherInstrumentation has been removed and is now
built into the engine

The code to dispatch `org.dataloader.DataLoader`s used to be an
instrumentation called `DataLoadersDataLoaderDispatcherInstrumentation`
and it was automatically added at runtime. This approach has been
removed.

The equivalent code is now built into the graphql-java engine itself.
`DataLoader`s can now always be used without any special setup. This
also allows the code to be more performant in how `DataLoader`s are
dispatched.

#### SL4J logging has been removed

Previously, the graphql-java engine would log at DEBUG level certain
errors or when fields get fetched. This has not proven used for from a
support point to the graphql-java team and also has a compliance cost in
that user generated content (UGC) and personally identifying information
(PII) could end up being logged, which may not be allowed under regimes
like European General Data Protection Regulation (GDPR).

If you want to log now we suggest you invest in a `Instrumentation` that
logs key events and you can there for log what you want and in a
compliant manner of your choosing.

[graphql-java/graphql-java#3403

#### The full list of API breaking changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3A%22breaking+change%22

### Other changes

- Optional strict mode for RuntimeWiring and TypeRuntimeWiring, to avoid
accidentally having multiple datafetchers on the same element
[#&#8203;3565](https://togithub.com/graphql-java/graphql-java/issues/3565)

#### What's Changed

- OneOf validation not being applied to nested inputs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3365
- Bump me.champeau.jmh from 0.7.1 to 0.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3371
- Dutch translations for GraphQL Java by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3031
- Add 'compute' family of methods to GraphQLContext by
[@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) in
[graphql-java/graphql-java#3364
- Handle list of [@&#8203;oneOf](https://togithub.com/oneOf) input
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3370
- Bump com.graphql-java:java-dataloader from 3.2.1 to 3.2.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3375
- Bump com.fasterxml.jackson.core:jackson-databind from 2.15.3 to 2.16.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3376
- Bump org.jetbrains:annotations from 24.0.1 to 24.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3377
- Add GitHub action to manage stale PRs and issues by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3359
- Bump actions/setup-node from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3358
- Bump google-github-actions/auth from 1.1.1 to 1.2.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3381
- Update German translations by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3368
- Bump google-github-actions/auth from 1.2.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3389
- Bump actions/setup-java from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3390
- Add tag to exempt PRs and issues from the stale bot by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3391
- Bump org.codehaus.groovy:groovy from 3.0.19 to 3.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3402
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.0 to 2.16.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3400
- Bump actions/stale from 8 to 9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3393
- Bump org.testng:testng from 7.8.0 to 7.9.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3407
- Cleaning up ValidationError constructors by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3405
- Refactor ENF Factory by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3410
- upgrade gradle to 8.5 by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3412
- Java 9 [@&#8203;Deprecated](https://togithub.com/Deprecated)
annotation by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3406
- Defer support on ENFs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3395
- Bump google-github-actions/auth from 2.0.0 to 2.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3416
- 3385 - fix for the turkish eye 🧿 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3388
- Update deprecated methods in scalar coercion documentation example by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3413
- Propagate GraphQLContext when completing fields - fix missing
ConditionalNodesDecision issue by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3411
- This removes SLF4J from the code base by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3403
- Check in Gradle files for Gradle 8.5 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3419
- Bump google-github-actions/auth from 2.0.1 to 2.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3420
- Bump gradle/wrapper-validation-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3437
- Skip signing for local and upgrade to Gradle 8.6 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3441
- ExecutionResult wrapping can be avoided - reduces memory allocations
and GC by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3330
- Bump org.eclipse.jetty:jetty-server from 11.0.15 to 11.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3445
- Bump google-github-actions/auth from 2.1.0 to 2.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3446
- Defer execution 2024 by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3421
- Add class hierarchy for incremental execution result by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3414
- ensure that instrumentations get an executionid by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3448
- handle more Schema diff applied directives cases by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3451
- Defer execution refactoring after first merge by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3450
- Fix bug where deferred payloads were not using field aliases by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3449
- Fix invalid AST printer: add escape characters to single line
descriptions by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3443
- Fix flaky defer test by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3455
- Native DataLoader dispatch strategy without Instrumentation by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3447
- Avoid repeated Map lookups in SimpleFieldValidation by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3461
- Fix oneOf bug when variables is empty by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3430
- Avoid Map for instrumentation state by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3459
- Small code tweaks on recent PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3463
- Use String concatenation instead of StringBuilder by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3464
- Added Async benchmark for future changes by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3467
- cleaning up the jhm benchmarks by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3468
- fixed async benchmark - it was nonsensical before by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3469
- andis suggestions on batch size by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3472
- Fix schema builder to copy extensionDefinitions by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3470
- Added an id generator that's more performant by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3466
- Bump google-github-actions/auth from 2.1.1 to 2.1.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3473
- Tweaked id generator name by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3474
- Using object instead of CF in DispatcherStrategy interface by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3479
- Added a more complex query benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3476
- Now allows the benchmark to go into profiling mode by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3485
- Now allows the benchmark to go into profiling mode - 2 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3486
- Avoid repeated calls to getFieldDef and unnecessary immutable
builders/collections by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3478
- This removes the CompletableFuture signature from
InstrumentationContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3457
- Don't build a builder object and then turn it into the actual object
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3465
- directive filtering during printing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3387
- Updated helper code for profiler attachment by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3491
- Combined benchmark runner by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3493
- Defer validation by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3439
- Does not allocate a default deferred context that is thrown away on
transform by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3484
- Bump org.codehaus.groovy:groovy from 3.0.20 to 3.0.21 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3497
- Get fieldDef improvements from Netflix by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3499
- recreating the netflix Intern field names PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3503
- adding a tracking agent by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3433
- Map benchmarks by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3488
- A CompleteableFuture benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3492
- Fix printing of union types by
[@&#8203;bhabegger](https://togithub.com/bhabegger) in
[graphql-java/graphql-java#3506
- SubscriptionUniqueRootField validation to check multiple fragments -
Validation Bug fix by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3481
- Return empty singleton DirectivesHolder if directives are empty by
[@&#8203;gnawf](https://togithub.com/gnawf) in
[graphql-java/graphql-java#3518
- Bump org.junit.jupiter:junit-jupiter from 5.7.1 to 5.10.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3523
- Bump org.assertj:assertj-core from 3.25.1 to 3.25.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3521
- Bump net.bytebuddy:byte-buddy from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3522
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3519
- Bump net.bytebuddy:byte-buddy-agent from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3520
- allow for a max result nodes limit for execution by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3525
- This provides and ability to disable Introspection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3526
- This provides GoodFaithIntrospection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3527
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.2 to 2.17.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3534
- adding a cycle schema analyzer by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3533
- Restrict the number of ENFs created and take advantage in GoodFaith
introspection by [@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3539
- Interning fieldnames (from netflix) by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3504
- Cheaper assertions with constant strings by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3507
- Small tweaks to not allocate objects for lambda closures by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3508
- Removed the deprecated Instrumentation methods and removes ER wrapping
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3460
- Removed deprecated methods in parsing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3509
- Removed deprecated methods in doc providers by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3510
- Removed deprecated methods in ExecutionInput by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3511
- Removed deprecated methods in ExecutionContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3512
- Removed deprecated methods in GraphQLSchema by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3515
- Removed deprecated methods and SchemaGeneratorPostProcessing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3516
- Removed deprecated methods in ValidationError by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3517
- cleanup ExecutableNormalizedOperationFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3544
- Made the field definition lookup more optimised by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3494
- Removed deprecated methods in code registry by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3514
- Improve Good faith introspection error handling by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3546
- Reduce the usage of CompletableFutures in graphql-java - scalars /
enums and lists by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3480
- add a default max nodes count for the ExecutableNormalizedFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3547
- Reduce the usage of CompletableFutures in graphql-java - now with
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3490
- Bump net.bytebuddy:byte-buddy from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3554
- Bump net.bytebuddy:byte-buddy-agent from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3555
- Stricter parseValue coercion for String, Int, Float, Boolean by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3553
- require non-empty directive locations by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3552
- Putting createState back into Instrumentation by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3557
- Bump org.testng:testng from 7.9.0 to 7.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3559
- Bump io.github.gradle-nexus.publish-plugin from 1.3.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3560
- fix incremental partial result builder by
[@&#8203;sbarker2](https://togithub.com/sbarker2) in
[graphql-java/graphql-java#3562
- Dataloader 3.3.0 upgrade by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3564
- strictMode for RuntimeWiring and TypeRuntimeWiring by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3565
- Bump org.testng:testng from 7.10.0 to 7.10.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3566
- Bump gradle/wrapper-validation-action from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3567
- validate non-nullable directive args by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3551

#### New Contributors

- [@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) made their
first contribution in
[graphql-java/graphql-java#3364
- [@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) made their
first contribution in
[graphql-java/graphql-java#3439
- [@&#8203;bhabegger](https://togithub.com/bhabegger) made their first
contribution in
[graphql-java/graphql-java#3506
- [@&#8203;sbarker2](https://togithub.com/sbarker2) made their first
contribution in
[graphql-java/graphql-java#3562

**Full Changelog**:
graphql-java/graphql-java@v21.5...v22.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/camunda/zeebe).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMxMy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2UiXX0=-->
github-merge-queue bot pushed a commit to camunda/camunda that referenced this pull request Apr 25, 2024
…n) (#17781)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[com.graphql-java:graphql-java](https://togithub.com/graphql-java/graphql-java)
| `21.5` -> `230521-nf-execution` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>graphql-java/graphql-java
(com.graphql-java:graphql-java)</summary>

###
[`v22.0`](https://togithub.com/graphql-java/graphql-java/releases/tag/v22.0):
22.0

We are pleased to announce the release of graphql-java v22.0.

Thanks to everyone in the community who contributed to the release,
whether that was code, helping to report issues, or participating in
discussions.

This is a **breaking change** release.

The graphql-java team takes breaking changes very seriously but in the
name of performance we have made some significant breaking changes in
this release.

### Major Performance Changes

Past releases have been very much performance focused and this one is no
different. However, this release is aiming to reduce memory pressure
more than reduce pure CPU usage. When the graphql-java engine is
running, if it produces less objects it will ultimately run faster
because of reduced memory pressure and less garbage to collect.

The engine has been changed in two major ways that reduce memory
pressure.

#### ExecutionResult wrapping

The first was that all values that come back got wrapped internally into
a `ExecutionResult` object where the `data` attribute was the value.
This was a carry over from some very early GraphQL code but was
unnecessary and hence has been removed. The follow on effect of this is
that some `graphql.execution.ExecutionStrategy` protected methods and
`graphql.execution.instrumentation.Instrumentation` methods used to
receive and return `ExecutionResult` values and no longer do, which is
an API breaking change. We have made this breaking changes in the name
of memory pressure performance.

#### CompletableFuture wrapping

The second major change is that the engine no longer exclusively uses
`java.util.concurrent.CompletableFuture`s when composing together
results. Let us explain the past code first so we can discuss the new
code.

`CompletableFuture` is a fantastic construct because it represents a
promise to a value and it can also hold an exceptional state inside
itself. Async programming with `CompletableFuture` is viral. If stage 1
of some compute process returns a `CompletableFuture` then stage 2 and 3
and 4 are likely to as well to ensure everything is asynchronous.

We use to take values that were not asynchronous (such as DataFetcher
that returned a simple in memory object) and wrap them in a
`CompletableFuture` so that all of the other code composed together
using `CompletableFuture` methods like `.thenApply()` and `.thenCompose`
and so on. The code is cleaner if you use all `CompletableFuture` code
patterns.

However many objects in a GraphQL request are not asynchronous but
rather materialised objects in memory. Scalars, enums and list are often
just values immediately available to be used and allocating a
`CompletableFuture` makes the code easier to write but it has a memory
pressure cost.

So we have sacrificed cleaner code for more memory performant code.

graphql-java engine `graphql.execution.ExecutionStrategy` methods now
just return `Object` where that object might be either a
`CompletableFuture` or a materialised value.

```java
    private Object /*CompletableFuture<FetchedValue> | FetchedValue>*/
       fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

```

Notice we have lost type safety here. In the past this would have only
been `CompletableFuture<FetchedValue>` and hence been both type safe and
async composable.

Now the caller of that method has to handle the async case where it
might be a `CompletableFuture<FetchedValue>` AND the materialised value
case where it might be a `FetchedValue` but as most simple fields in
GraphQL are in fact materialised values, this is worth the less clean
code.

`DataFetchers` can of course continue to return `CompletableFuture`
values and they will be handled in a polymorphic manner.

The upshot of all this work is that the graphql-java engine allocated
way less `CompletableFuture` values and hence reduces the amount of
memory used.

#### Instrumentation Changes

The above changes now mean means that before
`graphql.execution.instrumentation.InstrumentationContext` used to be
given a `CompletableFuture` but now no longer does

```java
    void onDispatched(CompletableFuture<T> result);
```

is now

```java
    void onDispatched();
```

if you previously used the `CompletableFuture` to know when something
was completed, well `InstrumentationContext` has the same semantics
because it's completed method is similar in that it presents a value or
an exception

```java
    void onCompleted(T result, Throwable t);
```

`graphql.execution.instrumentation.Instrumentation` also had a lot of
deprecated methods in place and these have been removed since the more
performant shape of passing in
`graphql.execution.instrumentation.InstrumentationState` has been in
place for quite a few releases.

Some of the methods that received `ExecutionResult` wrapped values have
also changed as mentioned above.

`Instrumentation` is probably the area that needs the most attention in
terms of breaking changes. If you have not moved off the deprecated
methods, your custom `Instrumentation`s will no longer compile or run.

#### Interning key strings

Our friends at Netflix provided a PR that interns certain key strings
like "field names" so that we create less String instances when
processing field names in queries that we know must be previously
interned in the schema.

[graphql-java/graphql-java#3504

#### The full list of performance related changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3Aperformance

### Major Changes

#### [@&#8203;defer](https://togithub.com/defer) Experimental Support

Support for the `@defer` directive has been added in an experimental
fashion. While `@defer` is still not in the released GraphQL
specification, we have judged it mature enough to support at this stage
and the `graphql-js` reference implementation has support for it.

https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md

At this stage we have not yet supported `@stream` but this is likely to
be included in a future release.

### Breaking Changes

There are quite a few API breaking changes in this release. In fact
there are 22 PRs containing breaking API changes.

#### Stricter parseValue coercion: Aligning with JS reference
implementation

We have made changes to String, Boolean, Float, and Int `parseValue`
coercion, to be consistent with the reference JS implementation. The key
change is `parseValue` is now stricter on accepted inputs.

- String `parseValue` now requires input of type `String`. For example,
a `Number` input `123` or a `Boolean` input `true` will no longer be
accepted.
- Boolean `parseValue` now requires input of type `Boolean`. For
example, a `String` input `"true"` will no longer be accepted.
- Float `parseValue` now requires input of type `Number`. For example, a
`String` input `"3.14"` will no longer be accepted.
- Int `parseValue` now requires input of type `Number`. For example, a
`String` input `"42"` will no longer be accepted.

This is a breaking change. To help you migrate, in [version
21.0](https://togithub.com/graphql-java/graphql-java/releases/tag/v21.0),
we introduced the InputInterceptor
[graphql-java/graphql-java#3188
(and an implementation LegacyCoercingInputInterceptor
[graphql-java/graphql-java#3218)
to provide a migration pathway. You can use this interceptor to monitor
and modify values.

For more, see
[graphql-java/graphql-java#3553
JS reference implementation:
https://github.com/graphql/graphql-js/blob/main/src/type/scalars.ts

#### Removing deprecated methods

Many methods that have been deprecated for a long time, sometimes even
up to 6 years, have finally been removed.

The `CompletableFuture` unwrapping work mentioned above changed many
methods in the `graphql.execution.ExecutionStrategy` classes but we
don't expect this affect many people since very few people write their
own engines.

That `CompletableFuture` unwrapping work also had knock on effects as
mentioned above on `graphql.execution.instrumentation.Instrumentation`
and hence this is the **most likely** place for there to be
compatibility challenges in existing code.

#### DataLoaderDispatcherInstrumentation has been removed and is now
built into the engine

The code to dispatch `org.dataloader.DataLoader`s used to be an
instrumentation called `DataLoadersDataLoaderDispatcherInstrumentation`
and it was automatically added at runtime. This approach has been
removed.

The equivalent code is now built into the graphql-java engine itself.
`DataLoader`s can now always be used without any special setup. This
also allows the code to be more performant in how `DataLoader`s are
dispatched.

#### SL4J logging has been removed

Previously, the graphql-java engine would log at DEBUG level certain
errors or when fields get fetched. This has not proven used for from a
support point to the graphql-java team and also has a compliance cost in
that user generated content (UGC) and personally identifying information
(PII) could end up being logged, which may not be allowed under regimes
like European General Data Protection Regulation (GDPR).

If you want to log now we suggest you invest in a `Instrumentation` that
logs key events and you can there for log what you want and in a
compliant manner of your choosing.

[graphql-java/graphql-java#3403

#### The full list of API breaking changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3A%22breaking+change%22

### Other changes

- Optional strict mode for RuntimeWiring and TypeRuntimeWiring, to avoid
accidentally having multiple datafetchers on the same element
[#&#8203;3565](https://togithub.com/graphql-java/graphql-java/issues/3565)

#### What's Changed

- OneOf validation not being applied to nested inputs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3365
- Bump me.champeau.jmh from 0.7.1 to 0.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3371
- Dutch translations for GraphQL Java by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3031
- Add 'compute' family of methods to GraphQLContext by
[@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) in
[graphql-java/graphql-java#3364
- Handle list of [@&#8203;oneOf](https://togithub.com/oneOf) input
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3370
- Bump com.graphql-java:java-dataloader from 3.2.1 to 3.2.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3375
- Bump com.fasterxml.jackson.core:jackson-databind from 2.15.3 to 2.16.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3376
- Bump org.jetbrains:annotations from 24.0.1 to 24.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3377
- Add GitHub action to manage stale PRs and issues by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3359
- Bump actions/setup-node from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3358
- Bump google-github-actions/auth from 1.1.1 to 1.2.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3381
- Update German translations by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3368
- Bump google-github-actions/auth from 1.2.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3389
- Bump actions/setup-java from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3390
- Add tag to exempt PRs and issues from the stale bot by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3391
- Bump org.codehaus.groovy:groovy from 3.0.19 to 3.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3402
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.0 to 2.16.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3400
- Bump actions/stale from 8 to 9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3393
- Bump org.testng:testng from 7.8.0 to 7.9.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3407
- Cleaning up ValidationError constructors by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3405
- Refactor ENF Factory by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3410
- upgrade gradle to 8.5 by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3412
- Java 9 [@&#8203;Deprecated](https://togithub.com/Deprecated)
annotation by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3406
- Defer support on ENFs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3395
- Bump google-github-actions/auth from 2.0.0 to 2.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3416
- 3385 - fix for the turkish eye 🧿 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3388
- Update deprecated methods in scalar coercion documentation example by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3413
- Propagate GraphQLContext when completing fields - fix missing
ConditionalNodesDecision issue by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3411
- This removes SLF4J from the code base by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3403
- Check in Gradle files for Gradle 8.5 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3419
- Bump google-github-actions/auth from 2.0.1 to 2.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3420
- Bump gradle/wrapper-validation-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3437
- Skip signing for local and upgrade to Gradle 8.6 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3441
- ExecutionResult wrapping can be avoided - reduces memory allocations
and GC by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3330
- Bump org.eclipse.jetty:jetty-server from 11.0.15 to 11.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3445
- Bump google-github-actions/auth from 2.1.0 to 2.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3446
- Defer execution 2024 by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3421
- Add class hierarchy for incremental execution result by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3414
- ensure that instrumentations get an executionid by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3448
- handle more Schema diff applied directives cases by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3451
- Defer execution refactoring after first merge by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3450
- Fix bug where deferred payloads were not using field aliases by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3449
- Fix invalid AST printer: add escape characters to single line
descriptions by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3443
- Fix flaky defer test by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3455
- Native DataLoader dispatch strategy without Instrumentation by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3447
- Avoid repeated Map lookups in SimpleFieldValidation by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3461
- Fix oneOf bug when variables is empty by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3430
- Avoid Map for instrumentation state by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3459
- Small code tweaks on recent PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3463
- Use String concatenation instead of StringBuilder by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3464
- Added Async benchmark for future changes by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3467
- cleaning up the jhm benchmarks by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3468
- fixed async benchmark - it was nonsensical before by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3469
- andis suggestions on batch size by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3472
- Fix schema builder to copy extensionDefinitions by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3470
- Added an id generator that's more performant by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3466
- Bump google-github-actions/auth from 2.1.1 to 2.1.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3473
- Tweaked id generator name by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3474
- Using object instead of CF in DispatcherStrategy interface by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3479
- Added a more complex query benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3476
- Now allows the benchmark to go into profiling mode by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3485
- Now allows the benchmark to go into profiling mode - 2 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3486
- Avoid repeated calls to getFieldDef and unnecessary immutable
builders/collections by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3478
- This removes the CompletableFuture signature from
InstrumentationContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3457
- Don't build a builder object and then turn it into the actual object
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3465
- directive filtering during printing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3387
- Updated helper code for profiler attachment by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3491
- Combined benchmark runner by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3493
- Defer validation by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3439
- Does not allocate a default deferred context that is thrown away on
transform by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3484
- Bump org.codehaus.groovy:groovy from 3.0.20 to 3.0.21 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3497
- Get fieldDef improvements from Netflix by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3499
- recreating the netflix Intern field names PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3503
- adding a tracking agent by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3433
- Map benchmarks by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3488
- A CompleteableFuture benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3492
- Fix printing of union types by
[@&#8203;bhabegger](https://togithub.com/bhabegger) in
[graphql-java/graphql-java#3506
- SubscriptionUniqueRootField validation to check multiple fragments -
Validation Bug fix by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3481
- Return empty singleton DirectivesHolder if directives are empty by
[@&#8203;gnawf](https://togithub.com/gnawf) in
[graphql-java/graphql-java#3518
- Bump org.junit.jupiter:junit-jupiter from 5.7.1 to 5.10.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3523
- Bump org.assertj:assertj-core from 3.25.1 to 3.25.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3521
- Bump net.bytebuddy:byte-buddy from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3522
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3519
- Bump net.bytebuddy:byte-buddy-agent from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3520
- allow for a max result nodes limit for execution by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3525
- This provides and ability to disable Introspection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3526
- This provides GoodFaithIntrospection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3527
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.2 to 2.17.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3534
- adding a cycle schema analyzer by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3533
- Restrict the number of ENFs created and take advantage in GoodFaith
introspection by [@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3539
- Interning fieldnames (from netflix) by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3504
- Cheaper assertions with constant strings by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3507
- Small tweaks to not allocate objects for lambda closures by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3508
- Removed the deprecated Instrumentation methods and removes ER wrapping
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3460
- Removed deprecated methods in parsing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3509
- Removed deprecated methods in doc providers by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3510
- Removed deprecated methods in ExecutionInput by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3511
- Removed deprecated methods in ExecutionContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3512
- Removed deprecated methods in GraphQLSchema by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3515
- Removed deprecated methods and SchemaGeneratorPostProcessing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3516
- Removed deprecated methods in ValidationError by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3517
- cleanup ExecutableNormalizedOperationFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3544
- Made the field definition lookup more optimised by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3494
- Removed deprecated methods in code registry by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3514
- Improve Good faith introspection error handling by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3546
- Reduce the usage of CompletableFutures in graphql-java - scalars /
enums and lists by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3480
- add a default max nodes count for the ExecutableNormalizedFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3547
- Reduce the usage of CompletableFutures in graphql-java - now with
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3490
- Bump net.bytebuddy:byte-buddy from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3554
- Bump net.bytebuddy:byte-buddy-agent from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3555
- Stricter parseValue coercion for String, Int, Float, Boolean by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3553
- require non-empty directive locations by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3552
- Putting createState back into Instrumentation by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3557
- Bump org.testng:testng from 7.9.0 to 7.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3559
- Bump io.github.gradle-nexus.publish-plugin from 1.3.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3560
- fix incremental partial result builder by
[@&#8203;sbarker2](https://togithub.com/sbarker2) in
[graphql-java/graphql-java#3562
- Dataloader 3.3.0 upgrade by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3564
- strictMode for RuntimeWiring and TypeRuntimeWiring by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3565
- Bump org.testng:testng from 7.10.0 to 7.10.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3566
- Bump gradle/wrapper-validation-action from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3567
- validate non-nullable directive args by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3551

#### New Contributors

- [@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) made their
first contribution in
[graphql-java/graphql-java#3364
- [@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) made their
first contribution in
[graphql-java/graphql-java#3439
- [@&#8203;bhabegger](https://togithub.com/bhabegger) made their first
contribution in
[graphql-java/graphql-java#3506
- [@&#8203;sbarker2](https://togithub.com/sbarker2) made their first
contribution in
[graphql-java/graphql-java#3562

**Full Changelog**:
graphql-java/graphql-java@v21.5...v22.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/camunda/zeebe).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMyMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2UiXX0=-->
github-merge-queue bot pushed a commit to camunda/camunda that referenced this pull request Apr 25, 2024
…n) (#17781)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[com.graphql-java:graphql-java](https://togithub.com/graphql-java/graphql-java)
| `21.5` -> `230521-nf-execution` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>graphql-java/graphql-java
(com.graphql-java:graphql-java)</summary>

###
[`v22.0`](https://togithub.com/graphql-java/graphql-java/releases/tag/v22.0):
22.0

[Compare
Source](https://togithub.com/graphql-java/graphql-java/compare/v21.5...v22.0)

We are pleased to announce the release of graphql-java v22.0.

Thanks to everyone in the community who contributed to the release,
whether that was code, helping to report issues, or participating in
discussions.

This is a **breaking change** release.

The graphql-java team takes breaking changes very seriously but in the
name of performance we have made some significant breaking changes in
this release.

### Major Performance Changes

Past releases have been very much performance focused and this one is no
different. However, this release is aiming to reduce memory pressure
more than reduce pure CPU usage. When the graphql-java engine is
running, if it produces less objects it will ultimately run faster
because of reduced memory pressure and less garbage to collect.

The engine has been changed in two major ways that reduce memory
pressure.

#### ExecutionResult wrapping

The first was that all values that come back got wrapped internally into
a `ExecutionResult` object where the `data` attribute was the value.
This was a carry over from some very early GraphQL code but was
unnecessary and hence has been removed. The follow on effect of this is
that some `graphql.execution.ExecutionStrategy` protected methods and
`graphql.execution.instrumentation.Instrumentation` methods used to
receive and return `ExecutionResult` values and no longer do, which is
an API breaking change. We have made this breaking changes in the name
of memory pressure performance.

#### CompletableFuture wrapping

The second major change is that the engine no longer exclusively uses
`java.util.concurrent.CompletableFuture`s when composing together
results. Let us explain the past code first so we can discuss the new
code.

`CompletableFuture` is a fantastic construct because it represents a
promise to a value and it can also hold an exceptional state inside
itself. Async programming with `CompletableFuture` is viral. If stage 1
of some compute process returns a `CompletableFuture` then stage 2 and 3
and 4 are likely to as well to ensure everything is asynchronous.

We use to take values that were not asynchronous (such as DataFetcher
that returned a simple in memory object) and wrap them in a
`CompletableFuture` so that all of the other code composed together
using `CompletableFuture` methods like `.thenApply()` and `.thenCompose`
and so on. The code is cleaner if you use all `CompletableFuture` code
patterns.

However many objects in a GraphQL request are not asynchronous but
rather materialised objects in memory. Scalars, enums and list are often
just values immediately available to be used and allocating a
`CompletableFuture` makes the code easier to write but it has a memory
pressure cost.

So we have sacrificed cleaner code for more memory performant code.

graphql-java engine `graphql.execution.ExecutionStrategy` methods now
just return `Object` where that object might be either a
`CompletableFuture` or a materialised value.

```java
    private Object /*CompletableFuture<FetchedValue> | FetchedValue>*/
       fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

```

Notice we have lost type safety here. In the past this would have only
been `CompletableFuture<FetchedValue>` and hence been both type safe and
async composable.

Now the caller of that method has to handle the async case where it
might be a `CompletableFuture<FetchedValue>` AND the materialised value
case where it might be a `FetchedValue` but as most simple fields in
GraphQL are in fact materialised values, this is worth the less clean
code.

`DataFetchers` can of course continue to return `CompletableFuture`
values and they will be handled in a polymorphic manner.

The upshot of all this work is that the graphql-java engine allocated
way less `CompletableFuture` values and hence reduces the amount of
memory used.

#### Instrumentation Changes

The above changes now mean means that before
`graphql.execution.instrumentation.InstrumentationContext` used to be
given a `CompletableFuture` but now no longer does

```java
    void onDispatched(CompletableFuture<T> result);
```

is now

```java
    void onDispatched();
```

if you previously used the `CompletableFuture` to know when something
was completed, well `InstrumentationContext` has the same semantics
because it's completed method is similar in that it presents a value or
an exception

```java
    void onCompleted(T result, Throwable t);
```

`graphql.execution.instrumentation.Instrumentation` also had a lot of
deprecated methods in place and these have been removed since the more
performant shape of passing in
`graphql.execution.instrumentation.InstrumentationState` has been in
place for quite a few releases.

Some of the methods that received `ExecutionResult` wrapped values have
also changed as mentioned above.

`Instrumentation` is probably the area that needs the most attention in
terms of breaking changes. If you have not moved off the deprecated
methods, your custom `Instrumentation`s will no longer compile or run.

#### Interning key strings

Our friends at Netflix provided a PR that interns certain key strings
like "field names" so that we create less String instances when
processing field names in queries that we know must be previously
interned in the schema.

[graphql-java/graphql-java#3504

#### The full list of performance related changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3Aperformance

### Major Changes

#### [@&#8203;defer](https://togithub.com/defer) Experimental Support

Support for the `@defer` directive has been added in an experimental
fashion. While `@defer` is still not in the released GraphQL
specification, we have judged it mature enough to support at this stage
and the `graphql-js` reference implementation has support for it.

https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md

At this stage we have not yet supported `@stream` but this is likely to
be included in a future release.

### Breaking Changes

There are quite a few API breaking changes in this release. In fact
there are 22 PRs containing breaking API changes.

#### Stricter parseValue coercion: Aligning with JS reference
implementation

We have made changes to String, Boolean, Float, and Int `parseValue`
coercion, to be consistent with the reference JS implementation. The key
change is `parseValue` is now stricter on accepted inputs.

- String `parseValue` now requires input of type `String`. For example,
a `Number` input `123` or a `Boolean` input `true` will no longer be
accepted.
- Boolean `parseValue` now requires input of type `Boolean`. For
example, a `String` input `"true"` will no longer be accepted.
- Float `parseValue` now requires input of type `Number`. For example, a
`String` input `"3.14"` will no longer be accepted.
- Int `parseValue` now requires input of type `Number`. For example, a
`String` input `"42"` will no longer be accepted.

This is a breaking change. To help you migrate, in [version
21.0](https://togithub.com/graphql-java/graphql-java/releases/tag/v21.0),
we introduced the InputInterceptor
[graphql-java/graphql-java#3188
(and an implementation LegacyCoercingInputInterceptor
[graphql-java/graphql-java#3218)
to provide a migration pathway. You can use this interceptor to monitor
and modify values.

For more, see
[graphql-java/graphql-java#3553
JS reference implementation:
https://github.com/graphql/graphql-js/blob/main/src/type/scalars.ts

#### Removing deprecated methods

Many methods that have been deprecated for a long time, sometimes even
up to 6 years, have finally been removed.

The `CompletableFuture` unwrapping work mentioned above changed many
methods in the `graphql.execution.ExecutionStrategy` classes but we
don't expect this affect many people since very few people write their
own engines.

That `CompletableFuture` unwrapping work also had knock on effects as
mentioned above on `graphql.execution.instrumentation.Instrumentation`
and hence this is the **most likely** place for there to be
compatibility challenges in existing code.

#### DataLoaderDispatcherInstrumentation has been removed and is now
built into the engine

The code to dispatch `org.dataloader.DataLoader`s used to be an
instrumentation called `DataLoadersDataLoaderDispatcherInstrumentation`
and it was automatically added at runtime. This approach has been
removed.

The equivalent code is now built into the graphql-java engine itself.
`DataLoader`s can now always be used without any special setup. This
also allows the code to be more performant in how `DataLoader`s are
dispatched.

#### SL4J logging has been removed

Previously, the graphql-java engine would log at DEBUG level certain
errors or when fields get fetched. This has not proven used for from a
support point to the graphql-java team and also has a compliance cost in
that user generated content (UGC) and personally identifying information
(PII) could end up being logged, which may not be allowed under regimes
like European General Data Protection Regulation (GDPR).

If you want to log now we suggest you invest in a `Instrumentation` that
logs key events and you can there for log what you want and in a
compliant manner of your choosing.

[graphql-java/graphql-java#3403

#### The full list of API breaking changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3A%22breaking+change%22

### Other changes

- Optional strict mode for RuntimeWiring and TypeRuntimeWiring, to avoid
accidentally having multiple datafetchers on the same element
[#&#8203;3565](https://togithub.com/graphql-java/graphql-java/issues/3565)

#### What's Changed

- OneOf validation not being applied to nested inputs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3365
- Bump me.champeau.jmh from 0.7.1 to 0.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3371
- Dutch translations for GraphQL Java by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3031
- Add 'compute' family of methods to GraphQLContext by
[@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) in
[graphql-java/graphql-java#3364
- Handle list of [@&#8203;oneOf](https://togithub.com/oneOf) input
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3370
- Bump com.graphql-java:java-dataloader from 3.2.1 to 3.2.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3375
- Bump com.fasterxml.jackson.core:jackson-databind from 2.15.3 to 2.16.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3376
- Bump org.jetbrains:annotations from 24.0.1 to 24.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3377
- Add GitHub action to manage stale PRs and issues by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3359
- Bump actions/setup-node from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3358
- Bump google-github-actions/auth from 1.1.1 to 1.2.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3381
- Update German translations by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3368
- Bump google-github-actions/auth from 1.2.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3389
- Bump actions/setup-java from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3390
- Add tag to exempt PRs and issues from the stale bot by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3391
- Bump org.codehaus.groovy:groovy from 3.0.19 to 3.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3402
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.0 to 2.16.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3400
- Bump actions/stale from 8 to 9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3393
- Bump org.testng:testng from 7.8.0 to 7.9.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3407
- Cleaning up ValidationError constructors by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3405
- Refactor ENF Factory by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3410
- upgrade gradle to 8.5 by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3412
- Java 9 [@&#8203;Deprecated](https://togithub.com/Deprecated)
annotation by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3406
- Defer support on ENFs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3395
- Bump google-github-actions/auth from 2.0.0 to 2.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3416
- 3385 - fix for the turkish eye 🧿 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3388
- Update deprecated methods in scalar coercion documentation example by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3413
- Propagate GraphQLContext when completing fields - fix missing
ConditionalNodesDecision issue by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3411
- This removes SLF4J from the code base by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3403
- Check in Gradle files for Gradle 8.5 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3419
- Bump google-github-actions/auth from 2.0.1 to 2.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3420
- Bump gradle/wrapper-validation-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3437
- Skip signing for local and upgrade to Gradle 8.6 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3441
- ExecutionResult wrapping can be avoided - reduces memory allocations
and GC by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3330
- Bump org.eclipse.jetty:jetty-server from 11.0.15 to 11.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3445
- Bump google-github-actions/auth from 2.1.0 to 2.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3446
- Defer execution 2024 by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3421
- Add class hierarchy for incremental execution result by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3414
- ensure that instrumentations get an executionid by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3448
- handle more Schema diff applied directives cases by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3451
- Defer execution refactoring after first merge by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3450
- Fix bug where deferred payloads were not using field aliases by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3449
- Fix invalid AST printer: add escape characters to single line
descriptions by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3443
- Fix flaky defer test by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3455
- Native DataLoader dispatch strategy without Instrumentation by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3447
- Avoid repeated Map lookups in SimpleFieldValidation by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3461
- Fix oneOf bug when variables is empty by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3430
- Avoid Map for instrumentation state by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3459
- Small code tweaks on recent PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3463
- Use String concatenation instead of StringBuilder by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3464
- Added Async benchmark for future changes by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3467
- cleaning up the jhm benchmarks by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3468
- fixed async benchmark - it was nonsensical before by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3469
- andis suggestions on batch size by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3472
- Fix schema builder to copy extensionDefinitions by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3470
- Added an id generator that's more performant by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3466
- Bump google-github-actions/auth from 2.1.1 to 2.1.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3473
- Tweaked id generator name by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3474
- Using object instead of CF in DispatcherStrategy interface by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3479
- Added a more complex query benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3476
- Now allows the benchmark to go into profiling mode by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3485
- Now allows the benchmark to go into profiling mode - 2 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3486
- Avoid repeated calls to getFieldDef and unnecessary immutable
builders/collections by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3478
- This removes the CompletableFuture signature from
InstrumentationContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3457
- Don't build a builder object and then turn it into the actual object
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3465
- directive filtering during printing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3387
- Updated helper code for profiler attachment by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3491
- Combined benchmark runner by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3493
- Defer validation by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3439
- Does not allocate a default deferred context that is thrown away on
transform by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3484
- Bump org.codehaus.groovy:groovy from 3.0.20 to 3.0.21 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3497
- Get fieldDef improvements from Netflix by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3499
- recreating the netflix Intern field names PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3503
- adding a tracking agent by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3433
- Map benchmarks by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3488
- A CompleteableFuture benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3492
- Fix printing of union types by
[@&#8203;bhabegger](https://togithub.com/bhabegger) in
[graphql-java/graphql-java#3506
- SubscriptionUniqueRootField validation to check multiple fragments -
Validation Bug fix by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3481
- Return empty singleton DirectivesHolder if directives are empty by
[@&#8203;gnawf](https://togithub.com/gnawf) in
[graphql-java/graphql-java#3518
- Bump org.junit.jupiter:junit-jupiter from 5.7.1 to 5.10.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3523
- Bump org.assertj:assertj-core from 3.25.1 to 3.25.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3521
- Bump net.bytebuddy:byte-buddy from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3522
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3519
- Bump net.bytebuddy:byte-buddy-agent from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3520
- allow for a max result nodes limit for execution by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3525
- This provides and ability to disable Introspection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3526
- This provides GoodFaithIntrospection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3527
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.2 to 2.17.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3534
- adding a cycle schema analyzer by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3533
- Restrict the number of ENFs created and take advantage in GoodFaith
introspection by [@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3539
- Interning fieldnames (from netflix) by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3504
- Cheaper assertions with constant strings by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3507
- Small tweaks to not allocate objects for lambda closures by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3508
- Removed the deprecated Instrumentation methods and removes ER wrapping
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3460
- Removed deprecated methods in parsing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3509
- Removed deprecated methods in doc providers by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3510
- Removed deprecated methods in ExecutionInput by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3511
- Removed deprecated methods in ExecutionContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3512
- Removed deprecated methods in GraphQLSchema by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3515
- Removed deprecated methods and SchemaGeneratorPostProcessing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3516
- Removed deprecated methods in ValidationError by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3517
- cleanup ExecutableNormalizedOperationFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3544
- Made the field definition lookup more optimised by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3494
- Removed deprecated methods in code registry by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3514
- Improve Good faith introspection error handling by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3546
- Reduce the usage of CompletableFutures in graphql-java - scalars /
enums and lists by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3480
- add a default max nodes count for the ExecutableNormalizedFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3547
- Reduce the usage of CompletableFutures in graphql-java - now with
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3490
- Bump net.bytebuddy:byte-buddy from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3554
- Bump net.bytebuddy:byte-buddy-agent from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3555
- Stricter parseValue coercion for String, Int, Float, Boolean by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3553
- require non-empty directive locations by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3552
- Putting createState back into Instrumentation by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3557
- Bump org.testng:testng from 7.9.0 to 7.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3559
- Bump io.github.gradle-nexus.publish-plugin from 1.3.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3560
- fix incremental partial result builder by
[@&#8203;sbarker2](https://togithub.com/sbarker2) in
[graphql-java/graphql-java#3562
- Dataloader 3.3.0 upgrade by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3564
- strictMode for RuntimeWiring and TypeRuntimeWiring by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3565
- Bump org.testng:testng from 7.10.0 to 7.10.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3566
- Bump gradle/wrapper-validation-action from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3567
- validate non-nullable directive args by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3551

#### New Contributors

- [@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) made their
first contribution in
[graphql-java/graphql-java#3364
- [@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) made their
first contribution in
[graphql-java/graphql-java#3439
- [@&#8203;bhabegger](https://togithub.com/bhabegger) made their first
contribution in
[graphql-java/graphql-java#3506
- [@&#8203;sbarker2](https://togithub.com/sbarker2) made their first
contribution in
[graphql-java/graphql-java#3562

**Full Changelog**:
graphql-java/graphql-java@v21.5...v22.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/camunda/zeebe).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMyMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2UiXX0=-->
github-merge-queue bot pushed a commit to camunda/camunda that referenced this pull request Apr 25, 2024
…n) (#17781)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[com.graphql-java:graphql-java](https://togithub.com/graphql-java/graphql-java)
| `21.5` -> `230521-nf-execution` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>graphql-java/graphql-java
(com.graphql-java:graphql-java)</summary>

###
[`v22.0`](https://togithub.com/graphql-java/graphql-java/releases/tag/v22.0):
22.0

[Compare
Source](https://togithub.com/graphql-java/graphql-java/compare/v21.5...v22.0)

We are pleased to announce the release of graphql-java v22.0.

Thanks to everyone in the community who contributed to the release,
whether that was code, helping to report issues, or participating in
discussions.

This is a **breaking change** release.

The graphql-java team takes breaking changes very seriously but in the
name of performance we have made some significant breaking changes in
this release.

### Major Performance Changes

Past releases have been very much performance focused and this one is no
different. However, this release is aiming to reduce memory pressure
more than reduce pure CPU usage. When the graphql-java engine is
running, if it produces less objects it will ultimately run faster
because of reduced memory pressure and less garbage to collect.

The engine has been changed in two major ways that reduce memory
pressure.

#### ExecutionResult wrapping

The first was that all values that come back got wrapped internally into
a `ExecutionResult` object where the `data` attribute was the value.
This was a carry over from some very early GraphQL code but was
unnecessary and hence has been removed. The follow on effect of this is
that some `graphql.execution.ExecutionStrategy` protected methods and
`graphql.execution.instrumentation.Instrumentation` methods used to
receive and return `ExecutionResult` values and no longer do, which is
an API breaking change. We have made this breaking changes in the name
of memory pressure performance.

#### CompletableFuture wrapping

The second major change is that the engine no longer exclusively uses
`java.util.concurrent.CompletableFuture`s when composing together
results. Let us explain the past code first so we can discuss the new
code.

`CompletableFuture` is a fantastic construct because it represents a
promise to a value and it can also hold an exceptional state inside
itself. Async programming with `CompletableFuture` is viral. If stage 1
of some compute process returns a `CompletableFuture` then stage 2 and 3
and 4 are likely to as well to ensure everything is asynchronous.

We use to take values that were not asynchronous (such as DataFetcher
that returned a simple in memory object) and wrap them in a
`CompletableFuture` so that all of the other code composed together
using `CompletableFuture` methods like `.thenApply()` and `.thenCompose`
and so on. The code is cleaner if you use all `CompletableFuture` code
patterns.

However many objects in a GraphQL request are not asynchronous but
rather materialised objects in memory. Scalars, enums and list are often
just values immediately available to be used and allocating a
`CompletableFuture` makes the code easier to write but it has a memory
pressure cost.

So we have sacrificed cleaner code for more memory performant code.

graphql-java engine `graphql.execution.ExecutionStrategy` methods now
just return `Object` where that object might be either a
`CompletableFuture` or a materialised value.

```java
    private Object /*CompletableFuture<FetchedValue> | FetchedValue>*/
       fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

```

Notice we have lost type safety here. In the past this would have only
been `CompletableFuture<FetchedValue>` and hence been both type safe and
async composable.

Now the caller of that method has to handle the async case where it
might be a `CompletableFuture<FetchedValue>` AND the materialised value
case where it might be a `FetchedValue` but as most simple fields in
GraphQL are in fact materialised values, this is worth the less clean
code.

`DataFetchers` can of course continue to return `CompletableFuture`
values and they will be handled in a polymorphic manner.

The upshot of all this work is that the graphql-java engine allocated
way less `CompletableFuture` values and hence reduces the amount of
memory used.

#### Instrumentation Changes

The above changes now mean means that before
`graphql.execution.instrumentation.InstrumentationContext` used to be
given a `CompletableFuture` but now no longer does

```java
    void onDispatched(CompletableFuture<T> result);
```

is now

```java
    void onDispatched();
```

if you previously used the `CompletableFuture` to know when something
was completed, well `InstrumentationContext` has the same semantics
because it's completed method is similar in that it presents a value or
an exception

```java
    void onCompleted(T result, Throwable t);
```

`graphql.execution.instrumentation.Instrumentation` also had a lot of
deprecated methods in place and these have been removed since the more
performant shape of passing in
`graphql.execution.instrumentation.InstrumentationState` has been in
place for quite a few releases.

Some of the methods that received `ExecutionResult` wrapped values have
also changed as mentioned above.

`Instrumentation` is probably the area that needs the most attention in
terms of breaking changes. If you have not moved off the deprecated
methods, your custom `Instrumentation`s will no longer compile or run.

#### Interning key strings

Our friends at Netflix provided a PR that interns certain key strings
like "field names" so that we create less String instances when
processing field names in queries that we know must be previously
interned in the schema.

[graphql-java/graphql-java#3504

#### The full list of performance related changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3Aperformance

### Major Changes

#### [@&#8203;defer](https://togithub.com/defer) Experimental Support

Support for the `@defer` directive has been added in an experimental
fashion. While `@defer` is still not in the released GraphQL
specification, we have judged it mature enough to support at this stage
and the `graphql-js` reference implementation has support for it.

https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md

At this stage we have not yet supported `@stream` but this is likely to
be included in a future release.

### Breaking Changes

There are quite a few API breaking changes in this release. In fact
there are 22 PRs containing breaking API changes.

#### Stricter parseValue coercion: Aligning with JS reference
implementation

We have made changes to String, Boolean, Float, and Int `parseValue`
coercion, to be consistent with the reference JS implementation. The key
change is `parseValue` is now stricter on accepted inputs.

- String `parseValue` now requires input of type `String`. For example,
a `Number` input `123` or a `Boolean` input `true` will no longer be
accepted.
- Boolean `parseValue` now requires input of type `Boolean`. For
example, a `String` input `"true"` will no longer be accepted.
- Float `parseValue` now requires input of type `Number`. For example, a
`String` input `"3.14"` will no longer be accepted.
- Int `parseValue` now requires input of type `Number`. For example, a
`String` input `"42"` will no longer be accepted.

This is a breaking change. To help you migrate, in [version
21.0](https://togithub.com/graphql-java/graphql-java/releases/tag/v21.0),
we introduced the InputInterceptor
[graphql-java/graphql-java#3188
(and an implementation LegacyCoercingInputInterceptor
[graphql-java/graphql-java#3218)
to provide a migration pathway. You can use this interceptor to monitor
and modify values.

For more, see
[graphql-java/graphql-java#3553
JS reference implementation:
https://github.com/graphql/graphql-js/blob/main/src/type/scalars.ts

#### Removing deprecated methods

Many methods that have been deprecated for a long time, sometimes even
up to 6 years, have finally been removed.

The `CompletableFuture` unwrapping work mentioned above changed many
methods in the `graphql.execution.ExecutionStrategy` classes but we
don't expect this affect many people since very few people write their
own engines.

That `CompletableFuture` unwrapping work also had knock on effects as
mentioned above on `graphql.execution.instrumentation.Instrumentation`
and hence this is the **most likely** place for there to be
compatibility challenges in existing code.

#### DataLoaderDispatcherInstrumentation has been removed and is now
built into the engine

The code to dispatch `org.dataloader.DataLoader`s used to be an
instrumentation called `DataLoadersDataLoaderDispatcherInstrumentation`
and it was automatically added at runtime. This approach has been
removed.

The equivalent code is now built into the graphql-java engine itself.
`DataLoader`s can now always be used without any special setup. This
also allows the code to be more performant in how `DataLoader`s are
dispatched.

#### SL4J logging has been removed

Previously, the graphql-java engine would log at DEBUG level certain
errors or when fields get fetched. This has not proven used for from a
support point to the graphql-java team and also has a compliance cost in
that user generated content (UGC) and personally identifying information
(PII) could end up being logged, which may not be allowed under regimes
like European General Data Protection Regulation (GDPR).

If you want to log now we suggest you invest in a `Instrumentation` that
logs key events and you can there for log what you want and in a
compliant manner of your choosing.

[graphql-java/graphql-java#3403

#### The full list of API breaking changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3A%22breaking+change%22

### Other changes

- Optional strict mode for RuntimeWiring and TypeRuntimeWiring, to avoid
accidentally having multiple datafetchers on the same element
[#&#8203;3565](https://togithub.com/graphql-java/graphql-java/issues/3565)

#### What's Changed

- OneOf validation not being applied to nested inputs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3365
- Bump me.champeau.jmh from 0.7.1 to 0.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3371
- Dutch translations for GraphQL Java by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3031
- Add 'compute' family of methods to GraphQLContext by
[@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) in
[graphql-java/graphql-java#3364
- Handle list of [@&#8203;oneOf](https://togithub.com/oneOf) input
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3370
- Bump com.graphql-java:java-dataloader from 3.2.1 to 3.2.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3375
- Bump com.fasterxml.jackson.core:jackson-databind from 2.15.3 to 2.16.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3376
- Bump org.jetbrains:annotations from 24.0.1 to 24.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3377
- Add GitHub action to manage stale PRs and issues by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3359
- Bump actions/setup-node from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3358
- Bump google-github-actions/auth from 1.1.1 to 1.2.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3381
- Update German translations by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3368
- Bump google-github-actions/auth from 1.2.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3389
- Bump actions/setup-java from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3390
- Add tag to exempt PRs and issues from the stale bot by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3391
- Bump org.codehaus.groovy:groovy from 3.0.19 to 3.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3402
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.0 to 2.16.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3400
- Bump actions/stale from 8 to 9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3393
- Bump org.testng:testng from 7.8.0 to 7.9.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3407
- Cleaning up ValidationError constructors by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3405
- Refactor ENF Factory by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3410
- upgrade gradle to 8.5 by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3412
- Java 9 [@&#8203;Deprecated](https://togithub.com/Deprecated)
annotation by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3406
- Defer support on ENFs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3395
- Bump google-github-actions/auth from 2.0.0 to 2.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3416
- 3385 - fix for the turkish eye 🧿 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3388
- Update deprecated methods in scalar coercion documentation example by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3413
- Propagate GraphQLContext when completing fields - fix missing
ConditionalNodesDecision issue by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3411
- This removes SLF4J from the code base by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3403
- Check in Gradle files for Gradle 8.5 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3419
- Bump google-github-actions/auth from 2.0.1 to 2.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3420
- Bump gradle/wrapper-validation-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3437
- Skip signing for local and upgrade to Gradle 8.6 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3441
- ExecutionResult wrapping can be avoided - reduces memory allocations
and GC by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3330
- Bump org.eclipse.jetty:jetty-server from 11.0.15 to 11.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3445
- Bump google-github-actions/auth from 2.1.0 to 2.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3446
- Defer execution 2024 by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3421
- Add class hierarchy for incremental execution result by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3414
- ensure that instrumentations get an executionid by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3448
- handle more Schema diff applied directives cases by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3451
- Defer execution refactoring after first merge by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3450
- Fix bug where deferred payloads were not using field aliases by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3449
- Fix invalid AST printer: add escape characters to single line
descriptions by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3443
- Fix flaky defer test by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3455
- Native DataLoader dispatch strategy without Instrumentation by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3447
- Avoid repeated Map lookups in SimpleFieldValidation by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3461
- Fix oneOf bug when variables is empty by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3430
- Avoid Map for instrumentation state by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3459
- Small code tweaks on recent PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3463
- Use String concatenation instead of StringBuilder by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3464
- Added Async benchmark for future changes by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3467
- cleaning up the jhm benchmarks by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3468
- fixed async benchmark - it was nonsensical before by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3469
- andis suggestions on batch size by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3472
- Fix schema builder to copy extensionDefinitions by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3470
- Added an id generator that's more performant by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3466
- Bump google-github-actions/auth from 2.1.1 to 2.1.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3473
- Tweaked id generator name by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3474
- Using object instead of CF in DispatcherStrategy interface by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3479
- Added a more complex query benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3476
- Now allows the benchmark to go into profiling mode by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3485
- Now allows the benchmark to go into profiling mode - 2 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3486
- Avoid repeated calls to getFieldDef and unnecessary immutable
builders/collections by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3478
- This removes the CompletableFuture signature from
InstrumentationContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3457
- Don't build a builder object and then turn it into the actual object
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3465
- directive filtering during printing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3387
- Updated helper code for profiler attachment by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3491
- Combined benchmark runner by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3493
- Defer validation by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3439
- Does not allocate a default deferred context that is thrown away on
transform by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3484
- Bump org.codehaus.groovy:groovy from 3.0.20 to 3.0.21 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3497
- Get fieldDef improvements from Netflix by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3499
- recreating the netflix Intern field names PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3503
- adding a tracking agent by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3433
- Map benchmarks by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3488
- A CompleteableFuture benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3492
- Fix printing of union types by
[@&#8203;bhabegger](https://togithub.com/bhabegger) in
[graphql-java/graphql-java#3506
- SubscriptionUniqueRootField validation to check multiple fragments -
Validation Bug fix by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3481
- Return empty singleton DirectivesHolder if directives are empty by
[@&#8203;gnawf](https://togithub.com/gnawf) in
[graphql-java/graphql-java#3518
- Bump org.junit.jupiter:junit-jupiter from 5.7.1 to 5.10.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3523
- Bump org.assertj:assertj-core from 3.25.1 to 3.25.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3521
- Bump net.bytebuddy:byte-buddy from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3522
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3519
- Bump net.bytebuddy:byte-buddy-agent from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3520
- allow for a max result nodes limit for execution by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3525
- This provides and ability to disable Introspection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3526
- This provides GoodFaithIntrospection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3527
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.2 to 2.17.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3534
- adding a cycle schema analyzer by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3533
- Restrict the number of ENFs created and take advantage in GoodFaith
introspection by [@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3539
- Interning fieldnames (from netflix) by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3504
- Cheaper assertions with constant strings by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3507
- Small tweaks to not allocate objects for lambda closures by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3508
- Removed the deprecated Instrumentation methods and removes ER wrapping
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3460
- Removed deprecated methods in parsing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3509
- Removed deprecated methods in doc providers by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3510
- Removed deprecated methods in ExecutionInput by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3511
- Removed deprecated methods in ExecutionContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3512
- Removed deprecated methods in GraphQLSchema by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3515
- Removed deprecated methods and SchemaGeneratorPostProcessing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3516
- Removed deprecated methods in ValidationError by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3517
- cleanup ExecutableNormalizedOperationFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3544
- Made the field definition lookup more optimised by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3494
- Removed deprecated methods in code registry by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3514
- Improve Good faith introspection error handling by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3546
- Reduce the usage of CompletableFutures in graphql-java - scalars /
enums and lists by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3480
- add a default max nodes count for the ExecutableNormalizedFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3547
- Reduce the usage of CompletableFutures in graphql-java - now with
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3490
- Bump net.bytebuddy:byte-buddy from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3554
- Bump net.bytebuddy:byte-buddy-agent from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3555
- Stricter parseValue coercion for String, Int, Float, Boolean by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3553
- require non-empty directive locations by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3552
- Putting createState back into Instrumentation by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3557
- Bump org.testng:testng from 7.9.0 to 7.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3559
- Bump io.github.gradle-nexus.publish-plugin from 1.3.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3560
- fix incremental partial result builder by
[@&#8203;sbarker2](https://togithub.com/sbarker2) in
[graphql-java/graphql-java#3562
- Dataloader 3.3.0 upgrade by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3564
- strictMode for RuntimeWiring and TypeRuntimeWiring by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3565
- Bump org.testng:testng from 7.10.0 to 7.10.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3566
- Bump gradle/wrapper-validation-action from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3567
- validate non-nullable directive args by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3551

#### New Contributors

- [@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) made their
first contribution in
[graphql-java/graphql-java#3364
- [@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) made their
first contribution in
[graphql-java/graphql-java#3439
- [@&#8203;bhabegger](https://togithub.com/bhabegger) made their first
contribution in
[graphql-java/graphql-java#3506
- [@&#8203;sbarker2](https://togithub.com/sbarker2) made their first
contribution in
[graphql-java/graphql-java#3562

**Full Changelog**:
graphql-java/graphql-java@v21.5...v22.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/camunda/zeebe).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMyMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2UiXX0=-->
github-merge-queue bot pushed a commit to camunda/camunda that referenced this pull request Apr 25, 2024
…n) (#17781)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[com.graphql-java:graphql-java](https://togithub.com/graphql-java/graphql-java)
| `21.5` -> `230521-nf-execution` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>graphql-java/graphql-java
(com.graphql-java:graphql-java)</summary>

###
[`v22.0`](https://togithub.com/graphql-java/graphql-java/releases/tag/v22.0):
22.0

[Compare
Source](https://togithub.com/graphql-java/graphql-java/compare/v21.5...v22.0)

We are pleased to announce the release of graphql-java v22.0.

Thanks to everyone in the community who contributed to the release,
whether that was code, helping to report issues, or participating in
discussions.

This is a **breaking change** release.

The graphql-java team takes breaking changes very seriously but in the
name of performance we have made some significant breaking changes in
this release.

### Major Performance Changes

Past releases have been very much performance focused and this one is no
different. However, this release is aiming to reduce memory pressure
more than reduce pure CPU usage. When the graphql-java engine is
running, if it produces less objects it will ultimately run faster
because of reduced memory pressure and less garbage to collect.

The engine has been changed in two major ways that reduce memory
pressure.

#### ExecutionResult wrapping

The first was that all values that come back got wrapped internally into
a `ExecutionResult` object where the `data` attribute was the value.
This was a carry over from some very early GraphQL code but was
unnecessary and hence has been removed. The follow on effect of this is
that some `graphql.execution.ExecutionStrategy` protected methods and
`graphql.execution.instrumentation.Instrumentation` methods used to
receive and return `ExecutionResult` values and no longer do, which is
an API breaking change. We have made this breaking changes in the name
of memory pressure performance.

#### CompletableFuture wrapping

The second major change is that the engine no longer exclusively uses
`java.util.concurrent.CompletableFuture`s when composing together
results. Let us explain the past code first so we can discuss the new
code.

`CompletableFuture` is a fantastic construct because it represents a
promise to a value and it can also hold an exceptional state inside
itself. Async programming with `CompletableFuture` is viral. If stage 1
of some compute process returns a `CompletableFuture` then stage 2 and 3
and 4 are likely to as well to ensure everything is asynchronous.

We use to take values that were not asynchronous (such as DataFetcher
that returned a simple in memory object) and wrap them in a
`CompletableFuture` so that all of the other code composed together
using `CompletableFuture` methods like `.thenApply()` and `.thenCompose`
and so on. The code is cleaner if you use all `CompletableFuture` code
patterns.

However many objects in a GraphQL request are not asynchronous but
rather materialised objects in memory. Scalars, enums and list are often
just values immediately available to be used and allocating a
`CompletableFuture` makes the code easier to write but it has a memory
pressure cost.

So we have sacrificed cleaner code for more memory performant code.

graphql-java engine `graphql.execution.ExecutionStrategy` methods now
just return `Object` where that object might be either a
`CompletableFuture` or a materialised value.

```java
    private Object /*CompletableFuture<FetchedValue> | FetchedValue>*/
       fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

```

Notice we have lost type safety here. In the past this would have only
been `CompletableFuture<FetchedValue>` and hence been both type safe and
async composable.

Now the caller of that method has to handle the async case where it
might be a `CompletableFuture<FetchedValue>` AND the materialised value
case where it might be a `FetchedValue` but as most simple fields in
GraphQL are in fact materialised values, this is worth the less clean
code.

`DataFetchers` can of course continue to return `CompletableFuture`
values and they will be handled in a polymorphic manner.

The upshot of all this work is that the graphql-java engine allocated
way less `CompletableFuture` values and hence reduces the amount of
memory used.

#### Instrumentation Changes

The above changes now mean means that before
`graphql.execution.instrumentation.InstrumentationContext` used to be
given a `CompletableFuture` but now no longer does

```java
    void onDispatched(CompletableFuture<T> result);
```

is now

```java
    void onDispatched();
```

if you previously used the `CompletableFuture` to know when something
was completed, well `InstrumentationContext` has the same semantics
because it's completed method is similar in that it presents a value or
an exception

```java
    void onCompleted(T result, Throwable t);
```

`graphql.execution.instrumentation.Instrumentation` also had a lot of
deprecated methods in place and these have been removed since the more
performant shape of passing in
`graphql.execution.instrumentation.InstrumentationState` has been in
place for quite a few releases.

Some of the methods that received `ExecutionResult` wrapped values have
also changed as mentioned above.

`Instrumentation` is probably the area that needs the most attention in
terms of breaking changes. If you have not moved off the deprecated
methods, your custom `Instrumentation`s will no longer compile or run.

#### Interning key strings

Our friends at Netflix provided a PR that interns certain key strings
like "field names" so that we create less String instances when
processing field names in queries that we know must be previously
interned in the schema.

[graphql-java/graphql-java#3504

#### The full list of performance related changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3Aperformance

### Major Changes

#### [@&#8203;defer](https://togithub.com/defer) Experimental Support

Support for the `@defer` directive has been added in an experimental
fashion. While `@defer` is still not in the released GraphQL
specification, we have judged it mature enough to support at this stage
and the `graphql-js` reference implementation has support for it.

https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md

At this stage we have not yet supported `@stream` but this is likely to
be included in a future release.

### Breaking Changes

There are quite a few API breaking changes in this release. In fact
there are 22 PRs containing breaking API changes.

#### Stricter parseValue coercion: Aligning with JS reference
implementation

We have made changes to String, Boolean, Float, and Int `parseValue`
coercion, to be consistent with the reference JS implementation. The key
change is `parseValue` is now stricter on accepted inputs.

- String `parseValue` now requires input of type `String`. For example,
a `Number` input `123` or a `Boolean` input `true` will no longer be
accepted.
- Boolean `parseValue` now requires input of type `Boolean`. For
example, a `String` input `"true"` will no longer be accepted.
- Float `parseValue` now requires input of type `Number`. For example, a
`String` input `"3.14"` will no longer be accepted.
- Int `parseValue` now requires input of type `Number`. For example, a
`String` input `"42"` will no longer be accepted.

This is a breaking change. To help you migrate, in [version
21.0](https://togithub.com/graphql-java/graphql-java/releases/tag/v21.0),
we introduced the InputInterceptor
[graphql-java/graphql-java#3188
(and an implementation LegacyCoercingInputInterceptor
[graphql-java/graphql-java#3218)
to provide a migration pathway. You can use this interceptor to monitor
and modify values.

For more, see
[graphql-java/graphql-java#3553
JS reference implementation:
https://github.com/graphql/graphql-js/blob/main/src/type/scalars.ts

#### Removing deprecated methods

Many methods that have been deprecated for a long time, sometimes even
up to 6 years, have finally been removed.

The `CompletableFuture` unwrapping work mentioned above changed many
methods in the `graphql.execution.ExecutionStrategy` classes but we
don't expect this affect many people since very few people write their
own engines.

That `CompletableFuture` unwrapping work also had knock on effects as
mentioned above on `graphql.execution.instrumentation.Instrumentation`
and hence this is the **most likely** place for there to be
compatibility challenges in existing code.

#### DataLoaderDispatcherInstrumentation has been removed and is now
built into the engine

The code to dispatch `org.dataloader.DataLoader`s used to be an
instrumentation called `DataLoadersDataLoaderDispatcherInstrumentation`
and it was automatically added at runtime. This approach has been
removed.

The equivalent code is now built into the graphql-java engine itself.
`DataLoader`s can now always be used without any special setup. This
also allows the code to be more performant in how `DataLoader`s are
dispatched.

#### SL4J logging has been removed

Previously, the graphql-java engine would log at DEBUG level certain
errors or when fields get fetched. This has not proven used for from a
support point to the graphql-java team and also has a compliance cost in
that user generated content (UGC) and personally identifying information
(PII) could end up being logged, which may not be allowed under regimes
like European General Data Protection Regulation (GDPR).

If you want to log now we suggest you invest in a `Instrumentation` that
logs key events and you can there for log what you want and in a
compliant manner of your choosing.

[graphql-java/graphql-java#3403

#### The full list of API breaking changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3A%22breaking+change%22

### Other changes

- Optional strict mode for RuntimeWiring and TypeRuntimeWiring, to avoid
accidentally having multiple datafetchers on the same element
[#&#8203;3565](https://togithub.com/graphql-java/graphql-java/issues/3565)

#### What's Changed

- OneOf validation not being applied to nested inputs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3365
- Bump me.champeau.jmh from 0.7.1 to 0.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3371
- Dutch translations for GraphQL Java by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3031
- Add 'compute' family of methods to GraphQLContext by
[@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) in
[graphql-java/graphql-java#3364
- Handle list of [@&#8203;oneOf](https://togithub.com/oneOf) input
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3370
- Bump com.graphql-java:java-dataloader from 3.2.1 to 3.2.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3375
- Bump com.fasterxml.jackson.core:jackson-databind from 2.15.3 to 2.16.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3376
- Bump org.jetbrains:annotations from 24.0.1 to 24.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3377
- Add GitHub action to manage stale PRs and issues by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3359
- Bump actions/setup-node from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3358
- Bump google-github-actions/auth from 1.1.1 to 1.2.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3381
- Update German translations by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3368
- Bump google-github-actions/auth from 1.2.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3389
- Bump actions/setup-java from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3390
- Add tag to exempt PRs and issues from the stale bot by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3391
- Bump org.codehaus.groovy:groovy from 3.0.19 to 3.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3402
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.0 to 2.16.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3400
- Bump actions/stale from 8 to 9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3393
- Bump org.testng:testng from 7.8.0 to 7.9.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3407
- Cleaning up ValidationError constructors by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3405
- Refactor ENF Factory by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3410
- upgrade gradle to 8.5 by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3412
- Java 9 [@&#8203;Deprecated](https://togithub.com/Deprecated)
annotation by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3406
- Defer support on ENFs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3395
- Bump google-github-actions/auth from 2.0.0 to 2.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3416
- 3385 - fix for the turkish eye 🧿 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3388
- Update deprecated methods in scalar coercion documentation example by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3413
- Propagate GraphQLContext when completing fields - fix missing
ConditionalNodesDecision issue by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3411
- This removes SLF4J from the code base by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3403
- Check in Gradle files for Gradle 8.5 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3419
- Bump google-github-actions/auth from 2.0.1 to 2.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3420
- Bump gradle/wrapper-validation-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3437
- Skip signing for local and upgrade to Gradle 8.6 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3441
- ExecutionResult wrapping can be avoided - reduces memory allocations
and GC by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3330
- Bump org.eclipse.jetty:jetty-server from 11.0.15 to 11.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3445
- Bump google-github-actions/auth from 2.1.0 to 2.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3446
- Defer execution 2024 by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3421
- Add class hierarchy for incremental execution result by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3414
- ensure that instrumentations get an executionid by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3448
- handle more Schema diff applied directives cases by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3451
- Defer execution refactoring after first merge by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3450
- Fix bug where deferred payloads were not using field aliases by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3449
- Fix invalid AST printer: add escape characters to single line
descriptions by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3443
- Fix flaky defer test by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3455
- Native DataLoader dispatch strategy without Instrumentation by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3447
- Avoid repeated Map lookups in SimpleFieldValidation by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3461
- Fix oneOf bug when variables is empty by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3430
- Avoid Map for instrumentation state by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3459
- Small code tweaks on recent PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3463
- Use String concatenation instead of StringBuilder by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3464
- Added Async benchmark for future changes by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3467
- cleaning up the jhm benchmarks by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3468
- fixed async benchmark - it was nonsensical before by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3469
- andis suggestions on batch size by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3472
- Fix schema builder to copy extensionDefinitions by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3470
- Added an id generator that's more performant by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3466
- Bump google-github-actions/auth from 2.1.1 to 2.1.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3473
- Tweaked id generator name by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3474
- Using object instead of CF in DispatcherStrategy interface by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3479
- Added a more complex query benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3476
- Now allows the benchmark to go into profiling mode by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3485
- Now allows the benchmark to go into profiling mode - 2 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3486
- Avoid repeated calls to getFieldDef and unnecessary immutable
builders/collections by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3478
- This removes the CompletableFuture signature from
InstrumentationContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3457
- Don't build a builder object and then turn it into the actual object
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3465
- directive filtering during printing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3387
- Updated helper code for profiler attachment by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3491
- Combined benchmark runner by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3493
- Defer validation by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3439
- Does not allocate a default deferred context that is thrown away on
transform by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3484
- Bump org.codehaus.groovy:groovy from 3.0.20 to 3.0.21 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3497
- Get fieldDef improvements from Netflix by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3499
- recreating the netflix Intern field names PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3503
- adding a tracking agent by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3433
- Map benchmarks by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3488
- A CompleteableFuture benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3492
- Fix printing of union types by
[@&#8203;bhabegger](https://togithub.com/bhabegger) in
[graphql-java/graphql-java#3506
- SubscriptionUniqueRootField validation to check multiple fragments -
Validation Bug fix by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3481
- Return empty singleton DirectivesHolder if directives are empty by
[@&#8203;gnawf](https://togithub.com/gnawf) in
[graphql-java/graphql-java#3518
- Bump org.junit.jupiter:junit-jupiter from 5.7.1 to 5.10.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3523
- Bump org.assertj:assertj-core from 3.25.1 to 3.25.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3521
- Bump net.bytebuddy:byte-buddy from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3522
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3519
- Bump net.bytebuddy:byte-buddy-agent from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3520
- allow for a max result nodes limit for execution by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3525
- This provides and ability to disable Introspection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3526
- This provides GoodFaithIntrospection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3527
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.2 to 2.17.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3534
- adding a cycle schema analyzer by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3533
- Restrict the number of ENFs created and take advantage in GoodFaith
introspection by [@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3539
- Interning fieldnames (from netflix) by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3504
- Cheaper assertions with constant strings by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3507
- Small tweaks to not allocate objects for lambda closures by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3508
- Removed the deprecated Instrumentation methods and removes ER wrapping
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3460
- Removed deprecated methods in parsing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3509
- Removed deprecated methods in doc providers by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3510
- Removed deprecated methods in ExecutionInput by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3511
- Removed deprecated methods in ExecutionContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3512
- Removed deprecated methods in GraphQLSchema by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3515
- Removed deprecated methods and SchemaGeneratorPostProcessing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3516
- Removed deprecated methods in ValidationError by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3517
- cleanup ExecutableNormalizedOperationFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3544
- Made the field definition lookup more optimised by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3494
- Removed deprecated methods in code registry by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3514
- Improve Good faith introspection error handling by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3546
- Reduce the usage of CompletableFutures in graphql-java - scalars /
enums and lists by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3480
- add a default max nodes count for the ExecutableNormalizedFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3547
- Reduce the usage of CompletableFutures in graphql-java - now with
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3490
- Bump net.bytebuddy:byte-buddy from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3554
- Bump net.bytebuddy:byte-buddy-agent from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3555
- Stricter parseValue coercion for String, Int, Float, Boolean by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3553
- require non-empty directive locations by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3552
- Putting createState back into Instrumentation by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3557
- Bump org.testng:testng from 7.9.0 to 7.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3559
- Bump io.github.gradle-nexus.publish-plugin from 1.3.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3560
- fix incremental partial result builder by
[@&#8203;sbarker2](https://togithub.com/sbarker2) in
[graphql-java/graphql-java#3562
- Dataloader 3.3.0 upgrade by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3564
- strictMode for RuntimeWiring and TypeRuntimeWiring by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3565
- Bump org.testng:testng from 7.10.0 to 7.10.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3566
- Bump gradle/wrapper-validation-action from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3567
- validate non-nullable directive args by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3551

#### New Contributors

- [@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) made their
first contribution in
[graphql-java/graphql-java#3364
- [@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) made their
first contribution in
[graphql-java/graphql-java#3439
- [@&#8203;bhabegger](https://togithub.com/bhabegger) made their first
contribution in
[graphql-java/graphql-java#3506
- [@&#8203;sbarker2](https://togithub.com/sbarker2) made their first
contribution in
[graphql-java/graphql-java#3562

**Full Changelog**:
graphql-java/graphql-java@v21.5...v22.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/camunda/zeebe).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMyMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2UiXX0=-->
github-merge-queue bot pushed a commit to camunda/camunda that referenced this pull request Apr 25, 2024
…n) (#17781)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[com.graphql-java:graphql-java](https://togithub.com/graphql-java/graphql-java)
| `21.5` -> `230521-nf-execution` |
[![age](https://developer.mend.io/api/mc/badges/age/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.graphql-java:graphql-java/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.graphql-java:graphql-java/21.5/230521-nf-execution?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>graphql-java/graphql-java
(com.graphql-java:graphql-java)</summary>

###
[`v22.0`](https://togithub.com/graphql-java/graphql-java/releases/tag/v22.0):
22.0

[Compare
Source](https://togithub.com/graphql-java/graphql-java/compare/v21.5...v22.0)

We are pleased to announce the release of graphql-java v22.0.

Thanks to everyone in the community who contributed to the release,
whether that was code, helping to report issues, or participating in
discussions.

This is a **breaking change** release.

The graphql-java team takes breaking changes very seriously but in the
name of performance we have made some significant breaking changes in
this release.

### Major Performance Changes

Past releases have been very much performance focused and this one is no
different. However, this release is aiming to reduce memory pressure
more than reduce pure CPU usage. When the graphql-java engine is
running, if it produces less objects it will ultimately run faster
because of reduced memory pressure and less garbage to collect.

The engine has been changed in two major ways that reduce memory
pressure.

#### ExecutionResult wrapping

The first was that all values that come back got wrapped internally into
a `ExecutionResult` object where the `data` attribute was the value.
This was a carry over from some very early GraphQL code but was
unnecessary and hence has been removed. The follow on effect of this is
that some `graphql.execution.ExecutionStrategy` protected methods and
`graphql.execution.instrumentation.Instrumentation` methods used to
receive and return `ExecutionResult` values and no longer do, which is
an API breaking change. We have made this breaking changes in the name
of memory pressure performance.

#### CompletableFuture wrapping

The second major change is that the engine no longer exclusively uses
`java.util.concurrent.CompletableFuture`s when composing together
results. Let us explain the past code first so we can discuss the new
code.

`CompletableFuture` is a fantastic construct because it represents a
promise to a value and it can also hold an exceptional state inside
itself. Async programming with `CompletableFuture` is viral. If stage 1
of some compute process returns a `CompletableFuture` then stage 2 and 3
and 4 are likely to as well to ensure everything is asynchronous.

We use to take values that were not asynchronous (such as DataFetcher
that returned a simple in memory object) and wrap them in a
`CompletableFuture` so that all of the other code composed together
using `CompletableFuture` methods like `.thenApply()` and `.thenCompose`
and so on. The code is cleaner if you use all `CompletableFuture` code
patterns.

However many objects in a GraphQL request are not asynchronous but
rather materialised objects in memory. Scalars, enums and list are often
just values immediately available to be used and allocating a
`CompletableFuture` makes the code easier to write but it has a memory
pressure cost.

So we have sacrificed cleaner code for more memory performant code.

graphql-java engine `graphql.execution.ExecutionStrategy` methods now
just return `Object` where that object might be either a
`CompletableFuture` or a materialised value.

```java
    private Object /*CompletableFuture<FetchedValue> | FetchedValue>*/
       fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext executionContext, ExecutionStrategyParameters parameters) {

```

Notice we have lost type safety here. In the past this would have only
been `CompletableFuture<FetchedValue>` and hence been both type safe and
async composable.

Now the caller of that method has to handle the async case where it
might be a `CompletableFuture<FetchedValue>` AND the materialised value
case where it might be a `FetchedValue` but as most simple fields in
GraphQL are in fact materialised values, this is worth the less clean
code.

`DataFetchers` can of course continue to return `CompletableFuture`
values and they will be handled in a polymorphic manner.

The upshot of all this work is that the graphql-java engine allocated
way less `CompletableFuture` values and hence reduces the amount of
memory used.

#### Instrumentation Changes

The above changes now mean means that before
`graphql.execution.instrumentation.InstrumentationContext` used to be
given a `CompletableFuture` but now no longer does

```java
    void onDispatched(CompletableFuture<T> result);
```

is now

```java
    void onDispatched();
```

if you previously used the `CompletableFuture` to know when something
was completed, well `InstrumentationContext` has the same semantics
because it's completed method is similar in that it presents a value or
an exception

```java
    void onCompleted(T result, Throwable t);
```

`graphql.execution.instrumentation.Instrumentation` also had a lot of
deprecated methods in place and these have been removed since the more
performant shape of passing in
`graphql.execution.instrumentation.InstrumentationState` has been in
place for quite a few releases.

Some of the methods that received `ExecutionResult` wrapped values have
also changed as mentioned above.

`Instrumentation` is probably the area that needs the most attention in
terms of breaking changes. If you have not moved off the deprecated
methods, your custom `Instrumentation`s will no longer compile or run.

#### Interning key strings

Our friends at Netflix provided a PR that interns certain key strings
like "field names" so that we create less String instances when
processing field names in queries that we know must be previously
interned in the schema.

[graphql-java/graphql-java#3504

#### The full list of performance related changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3Aperformance

### Major Changes

#### [@&#8203;defer](https://togithub.com/defer) Experimental Support

Support for the `@defer` directive has been added in an experimental
fashion. While `@defer` is still not in the released GraphQL
specification, we have judged it mature enough to support at this stage
and the `graphql-js` reference implementation has support for it.

https://github.com/graphql/graphql-wg/blob/main/rfcs/DeferStream.md

At this stage we have not yet supported `@stream` but this is likely to
be included in a future release.

### Breaking Changes

There are quite a few API breaking changes in this release. In fact
there are 22 PRs containing breaking API changes.

#### Stricter parseValue coercion: Aligning with JS reference
implementation

We have made changes to String, Boolean, Float, and Int `parseValue`
coercion, to be consistent with the reference JS implementation. The key
change is `parseValue` is now stricter on accepted inputs.

- String `parseValue` now requires input of type `String`. For example,
a `Number` input `123` or a `Boolean` input `true` will no longer be
accepted.
- Boolean `parseValue` now requires input of type `Boolean`. For
example, a `String` input `"true"` will no longer be accepted.
- Float `parseValue` now requires input of type `Number`. For example, a
`String` input `"3.14"` will no longer be accepted.
- Int `parseValue` now requires input of type `Number`. For example, a
`String` input `"42"` will no longer be accepted.

This is a breaking change. To help you migrate, in [version
21.0](https://togithub.com/graphql-java/graphql-java/releases/tag/v21.0),
we introduced the InputInterceptor
[graphql-java/graphql-java#3188
(and an implementation LegacyCoercingInputInterceptor
[graphql-java/graphql-java#3218)
to provide a migration pathway. You can use this interceptor to monitor
and modify values.

For more, see
[graphql-java/graphql-java#3553
JS reference implementation:
https://github.com/graphql/graphql-js/blob/main/src/type/scalars.ts

#### Removing deprecated methods

Many methods that have been deprecated for a long time, sometimes even
up to 6 years, have finally been removed.

The `CompletableFuture` unwrapping work mentioned above changed many
methods in the `graphql.execution.ExecutionStrategy` classes but we
don't expect this affect many people since very few people write their
own engines.

That `CompletableFuture` unwrapping work also had knock on effects as
mentioned above on `graphql.execution.instrumentation.Instrumentation`
and hence this is the **most likely** place for there to be
compatibility challenges in existing code.

#### DataLoaderDispatcherInstrumentation has been removed and is now
built into the engine

The code to dispatch `org.dataloader.DataLoader`s used to be an
instrumentation called `DataLoadersDataLoaderDispatcherInstrumentation`
and it was automatically added at runtime. This approach has been
removed.

The equivalent code is now built into the graphql-java engine itself.
`DataLoader`s can now always be used without any special setup. This
also allows the code to be more performant in how `DataLoader`s are
dispatched.

#### SL4J logging has been removed

Previously, the graphql-java engine would log at DEBUG level certain
errors or when fields get fetched. This has not proven used for from a
support point to the graphql-java team and also has a compliance cost in
that user generated content (UGC) and personally identifying information
(PII) could end up being logged, which may not be allowed under regimes
like European General Data Protection Regulation (GDPR).

If you want to log now we suggest you invest in a `Instrumentation` that
logs key events and you can there for log what you want and in a
compliant manner of your choosing.

[graphql-java/graphql-java#3403

#### The full list of API breaking changes

https://github.com/graphql-java/graphql-java/pulls?q=is%3Apr+milestone%3A%2222.0%22+label%3A%22breaking+change%22

### Other changes

- Optional strict mode for RuntimeWiring and TypeRuntimeWiring, to avoid
accidentally having multiple datafetchers on the same element
[#&#8203;3565](https://togithub.com/graphql-java/graphql-java/issues/3565)

#### What's Changed

- OneOf validation not being applied to nested inputs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3365
- Bump me.champeau.jmh from 0.7.1 to 0.7.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3371
- Dutch translations for GraphQL Java by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3031
- Add 'compute' family of methods to GraphQLContext by
[@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) in
[graphql-java/graphql-java#3364
- Handle list of [@&#8203;oneOf](https://togithub.com/oneOf) input
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3370
- Bump com.graphql-java:java-dataloader from 3.2.1 to 3.2.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3375
- Bump com.fasterxml.jackson.core:jackson-databind from 2.15.3 to 2.16.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3376
- Bump org.jetbrains:annotations from 24.0.1 to 24.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3377
- Add GitHub action to manage stale PRs and issues by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3359
- Bump actions/setup-node from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3358
- Bump google-github-actions/auth from 1.1.1 to 1.2.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3381
- Update German translations by
[@&#8203;jord1e](https://togithub.com/jord1e) in
[graphql-java/graphql-java#3368
- Bump google-github-actions/auth from 1.2.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3389
- Bump actions/setup-java from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3390
- Add tag to exempt PRs and issues from the stale bot by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3391
- Bump org.codehaus.groovy:groovy from 3.0.19 to 3.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3402
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.0 to 2.16.1
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3400
- Bump actions/stale from 8 to 9 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3393
- Bump org.testng:testng from 7.8.0 to 7.9.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3407
- Cleaning up ValidationError constructors by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3405
- Refactor ENF Factory by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3410
- upgrade gradle to 8.5 by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3412
- Java 9 [@&#8203;Deprecated](https://togithub.com/Deprecated)
annotation by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3406
- Defer support on ENFs by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3395
- Bump google-github-actions/auth from 2.0.0 to 2.0.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3416
- 3385 - fix for the turkish eye 🧿 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3388
- Update deprecated methods in scalar coercion documentation example by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3413
- Propagate GraphQLContext when completing fields - fix missing
ConditionalNodesDecision issue by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3411
- This removes SLF4J from the code base by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3403
- Check in Gradle files for Gradle 8.5 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3419
- Bump google-github-actions/auth from 2.0.1 to 2.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3420
- Bump gradle/wrapper-validation-action from 1 to 2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3437
- Skip signing for local and upgrade to Gradle 8.6 by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3441
- ExecutionResult wrapping can be avoided - reduces memory allocations
and GC by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3330
- Bump org.eclipse.jetty:jetty-server from 11.0.15 to 11.0.20 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3445
- Bump google-github-actions/auth from 2.1.0 to 2.1.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3446
- Defer execution 2024 by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3421
- Add class hierarchy for incremental execution result by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3414
- ensure that instrumentations get an executionid by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3448
- handle more Schema diff applied directives cases by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3451
- Defer execution refactoring after first merge by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3450
- Fix bug where deferred payloads were not using field aliases by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3449
- Fix invalid AST printer: add escape characters to single line
descriptions by [@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3443
- Fix flaky defer test by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3455
- Native DataLoader dispatch strategy without Instrumentation by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3447
- Avoid repeated Map lookups in SimpleFieldValidation by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3461
- Fix oneOf bug when variables is empty by
[@&#8203;felipe-gdr](https://togithub.com/felipe-gdr) in
[graphql-java/graphql-java#3430
- Avoid Map for instrumentation state by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3459
- Small code tweaks on recent PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3463
- Use String concatenation instead of StringBuilder by
[@&#8203;kilink](https://togithub.com/kilink) in
[graphql-java/graphql-java#3464
- Added Async benchmark for future changes by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3467
- cleaning up the jhm benchmarks by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3468
- fixed async benchmark - it was nonsensical before by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3469
- andis suggestions on batch size by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3472
- Fix schema builder to copy extensionDefinitions by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3470
- Added an id generator that's more performant by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3466
- Bump google-github-actions/auth from 2.1.1 to 2.1.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3473
- Tweaked id generator name by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3474
- Using object instead of CF in DispatcherStrategy interface by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3479
- Added a more complex query benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3476
- Now allows the benchmark to go into profiling mode by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3485
- Now allows the benchmark to go into profiling mode - 2 by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3486
- Avoid repeated calls to getFieldDef and unnecessary immutable
builders/collections by
[@&#8203;DanielThomas](https://togithub.com/DanielThomas) in
[graphql-java/graphql-java#3478
- This removes the CompletableFuture signature from
InstrumentationContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3457
- Don't build a builder object and then turn it into the actual object
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3465
- directive filtering during printing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3387
- Updated helper code for profiler attachment by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3491
- Combined benchmark runner by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3493
- Defer validation by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3439
- Does not allocate a default deferred context that is thrown away on
transform by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3484
- Bump org.codehaus.groovy:groovy from 3.0.20 to 3.0.21 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3497
- Get fieldDef improvements from Netflix by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3499
- recreating the netflix Intern field names PR by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3503
- adding a tracking agent by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3433
- Map benchmarks by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3488
- A CompleteableFuture benchmark by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3492
- Fix printing of union types by
[@&#8203;bhabegger](https://togithub.com/bhabegger) in
[graphql-java/graphql-java#3506
- SubscriptionUniqueRootField validation to check multiple fragments -
Validation Bug fix by
[@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) in
[graphql-java/graphql-java#3481
- Return empty singleton DirectivesHolder if directives are empty by
[@&#8203;gnawf](https://togithub.com/gnawf) in
[graphql-java/graphql-java#3518
- Bump org.junit.jupiter:junit-jupiter from 5.7.1 to 5.10.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3523
- Bump org.assertj:assertj-core from 3.25.1 to 3.25.3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3521
- Bump net.bytebuddy:byte-buddy from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3522
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.1 to 2.16.2
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3519
- Bump net.bytebuddy:byte-buddy-agent from 1.14.11 to 1.14.12 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3520
- allow for a max result nodes limit for execution by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3525
- This provides and ability to disable Introspection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3526
- This provides GoodFaithIntrospection by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3527
- Bump com.fasterxml.jackson.core:jackson-databind from 2.16.2 to 2.17.0
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3534
- adding a cycle schema analyzer by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3533
- Restrict the number of ENFs created and take advantage in GoodFaith
introspection by [@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3539
- Interning fieldnames (from netflix) by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3504
- Cheaper assertions with constant strings by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3507
- Small tweaks to not allocate objects for lambda closures by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3508
- Removed the deprecated Instrumentation methods and removes ER wrapping
by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3460
- Removed deprecated methods in parsing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3509
- Removed deprecated methods in doc providers by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3510
- Removed deprecated methods in ExecutionInput by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3511
- Removed deprecated methods in ExecutionContext by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3512
- Removed deprecated methods in GraphQLSchema by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3515
- Removed deprecated methods and SchemaGeneratorPostProcessing by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3516
- Removed deprecated methods in ValidationError by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3517
- cleanup ExecutableNormalizedOperationFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3544
- Made the field definition lookup more optimised by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3494
- Removed deprecated methods in code registry by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3514
- Improve Good faith introspection error handling by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3546
- Reduce the usage of CompletableFutures in graphql-java - scalars /
enums and lists by [@&#8203;bbakerman](https://togithub.com/bbakerman)
in
[graphql-java/graphql-java#3480
- add a default max nodes count for the ExecutableNormalizedFactory by
[@&#8203;andimarek](https://togithub.com/andimarek) in
[graphql-java/graphql-java#3547
- Reduce the usage of CompletableFutures in graphql-java - now with
objects by [@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3490
- Bump net.bytebuddy:byte-buddy from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3554
- Bump net.bytebuddy:byte-buddy-agent from 1.14.12 to 1.14.13 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3555
- Stricter parseValue coercion for String, Int, Float, Boolean by
[@&#8203;dondonz](https://togithub.com/dondonz) in
[graphql-java/graphql-java#3553
- require non-empty directive locations by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3552
- Putting createState back into Instrumentation by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3557
- Bump org.testng:testng from 7.9.0 to 7.10.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3559
- Bump io.github.gradle-nexus.publish-plugin from 1.3.0 to 2.0.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3560
- fix incremental partial result builder by
[@&#8203;sbarker2](https://togithub.com/sbarker2) in
[graphql-java/graphql-java#3562
- Dataloader 3.3.0 upgrade by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3564
- strictMode for RuntimeWiring and TypeRuntimeWiring by
[@&#8203;bbakerman](https://togithub.com/bbakerman) in
[graphql-java/graphql-java#3565
- Bump org.testng:testng from 7.10.0 to 7.10.1 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3566
- Bump gradle/wrapper-validation-action from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[graphql-java/graphql-java#3567
- validate non-nullable directive args by
[@&#8203;jbellenger](https://togithub.com/jbellenger) in
[graphql-java/graphql-java#3551

#### New Contributors

- [@&#8203;salvoilmiosi](https://togithub.com/salvoilmiosi) made their
first contribution in
[graphql-java/graphql-java#3364
- [@&#8203;Juliano-Prado](https://togithub.com/Juliano-Prado) made their
first contribution in
[graphql-java/graphql-java#3439
- [@&#8203;bhabegger](https://togithub.com/bhabegger) made their first
contribution in
[graphql-java/graphql-java#3506
- [@&#8203;sbarker2](https://togithub.com/sbarker2) made their first
contribution in
[graphql-java/graphql-java#3562

**Full Changelog**:
graphql-java/graphql-java@v21.5...v22.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/camunda/zeebe).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMTMuMSIsInVwZGF0ZWRJblZlciI6IjM3LjMyMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2UiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants