From 4c27accdf71239a5a18ecdb014fdc66a26595dbb Mon Sep 17 00:00:00 2001 From: Marc-Andre Giroux Date: Wed, 2 Jul 2025 09:11:40 -0400 Subject: [PATCH 1/4] Iterate over implementations instead of allocating collections for isPossibleType --- .../graphql/schema/idl/TypeDefinitionRegistry.java | 14 +++++++++++--- src/main/java/graphql/schema/idl/TypeInfo.java | 12 ++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java index 599c3a1340..699d5a7592 100644 --- a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java +++ b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java @@ -623,9 +623,17 @@ public boolean isPossibleType(Type abstractType, Type possibleType) { return false; } else { InterfaceTypeDefinition iFace = (InterfaceTypeDefinition) abstractTypeDef; - List implementingTypeDefinitions = getAllImplementationsOf(iFace); - return implementingTypeDefinitions.stream() - .anyMatch(od -> od.getName().equals(targetObjectTypeDef.getName())); + + return types.values().stream() + .filter(ImplementingTypeDefinition.class::isInstance) + .filter(t -> t.getName().equals(targetObjectTypeDef.getName())) + .map(td -> (ImplementingTypeDefinition) td) + .anyMatch(itd -> itd.getImplements() + .stream() + .map(TypeInfo::getTypeName) + .map(tn -> types.get(tn.getName())) + .anyMatch(td -> td.getName().equals(iFace.getName())) + ); } } diff --git a/src/main/java/graphql/schema/idl/TypeInfo.java b/src/main/java/graphql/schema/idl/TypeInfo.java index fe12d49885..904cdfedc8 100644 --- a/src/main/java/graphql/schema/idl/TypeInfo.java +++ b/src/main/java/graphql/schema/idl/TypeInfo.java @@ -26,6 +26,18 @@ public static TypeInfo typeInfo(Type type) { return new TypeInfo(type); } + public static TypeName getTypeName(Type type) { + while (!(type instanceof TypeName)) { + if (type instanceof NonNullType) { + type = ((NonNullType) type).getType(); + } + if (type instanceof ListType) { + type = ((ListType) type).getType(); + } + } + return (TypeName) type; + } + private final Type rawType; private final TypeName typeName; private final Deque> decoration = new ArrayDeque<>(); From 94300f0e2742457d50508c9cb395dddc012d9631 Mon Sep 17 00:00:00 2001 From: Marc-Andre Giroux Date: Thu, 3 Jul 2025 08:44:19 -0400 Subject: [PATCH 2/4] no more streams --- .../schema/idl/TypeDefinitionRegistry.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java index 699d5a7592..d1bf56c171 100644 --- a/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java +++ b/src/main/java/graphql/schema/idl/TypeDefinitionRegistry.java @@ -624,16 +624,24 @@ public boolean isPossibleType(Type abstractType, Type possibleType) { } else { InterfaceTypeDefinition iFace = (InterfaceTypeDefinition) abstractTypeDef; - return types.values().stream() - .filter(ImplementingTypeDefinition.class::isInstance) - .filter(t -> t.getName().equals(targetObjectTypeDef.getName())) - .map(td -> (ImplementingTypeDefinition) td) - .anyMatch(itd -> itd.getImplements() - .stream() - .map(TypeInfo::getTypeName) - .map(tn -> types.get(tn.getName())) - .anyMatch(td -> td.getName().equals(iFace.getName())) - ); + for (TypeDefinition t : types.values()) { + if (t instanceof ImplementingTypeDefinition) { + if (t.getName().equals(targetObjectTypeDef.getName())) { + ImplementingTypeDefinition itd = (ImplementingTypeDefinition) t; + + for (Type impl : itd.getImplements()) { + TypeName typeName = TypeInfo.getTypeName(impl); + TypeDefinition matchingInterface = types.get(typeName.getName()); + + if (matchingInterface != null && matchingInterface.getName().equals(iFace.getName())) { + return true; + } + } + } + } + } + + return false; } } From b57dad6ad8ec309d3de10e8a2b28b6fbad90c64b Mon Sep 17 00:00:00 2001 From: Marc-Andre Giroux Date: Thu, 3 Jul 2025 08:44:29 -0400 Subject: [PATCH 3/4] add a test for getTypeName --- .../graphql/schema/idl/TypeInfoTest.groovy | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/groovy/graphql/schema/idl/TypeInfoTest.groovy b/src/test/groovy/graphql/schema/idl/TypeInfoTest.groovy index 92ec7b1b8c..bd5cc260c8 100644 --- a/src/test/groovy/graphql/schema/idl/TypeInfoTest.groovy +++ b/src/test/groovy/graphql/schema/idl/TypeInfoTest.groovy @@ -136,4 +136,21 @@ class TypeInfoTest extends Specification { "[named!]!" | "[newName!]!" "[[named!]!]" | "[[newName!]!]" } + + def "test getTypeName gets to the inner type"() { + + expect: + Type actualType = TestUtil.parseType(actual) + def typeName = TypeInfo.getTypeName(actualType) + typeName.getName() == expected + + where: + actual | expected + "named" | "named" + "named!" | "named" + "[named]" | "named" + "[named!]" | "named" + "[named!]!" | "named" + "[[named!]!]" | "named" + } } From e6027449fd75fdaf0a0bc800c87a6a2ffe063b48 Mon Sep 17 00:00:00 2001 From: Marc-Andre Giroux Date: Thu, 3 Jul 2025 10:29:22 -0400 Subject: [PATCH 4/4] add javadoc --- src/main/java/graphql/schema/idl/TypeInfo.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/graphql/schema/idl/TypeInfo.java b/src/main/java/graphql/schema/idl/TypeInfo.java index 904cdfedc8..2f470ecbe5 100644 --- a/src/main/java/graphql/schema/idl/TypeInfo.java +++ b/src/main/java/graphql/schema/idl/TypeInfo.java @@ -26,6 +26,13 @@ public static TypeInfo typeInfo(Type type) { return new TypeInfo(type); } + /** + * Gets the type name of a [Type], unwrapping any lists or non-null decorations + * + * @param type the Type + * + * @return the inner TypeName for this type + */ public static TypeName getTypeName(Type type) { while (!(type instanceof TypeName)) { if (type instanceof NonNullType) {