From 6e2adff87a24a6ea1f4d4c21ebcef576e7444c25 Mon Sep 17 00:00:00 2001 From: Brad Baker Date: Fri, 30 Jul 2021 20:59:45 +1000 Subject: [PATCH] Allow getting a field in the schema by FieldCoordinates --- .../java/graphql/schema/FieldCoordinates.java | 2 +- .../java/graphql/schema/GraphQLSchema.java | 24 +++++++++ .../graphql/schema/GraphQLSchemaTest.groovy | 52 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/main/java/graphql/schema/FieldCoordinates.java b/src/main/java/graphql/schema/FieldCoordinates.java index f5f26fc6b2..a8a048a72f 100644 --- a/src/main/java/graphql/schema/FieldCoordinates.java +++ b/src/main/java/graphql/schema/FieldCoordinates.java @@ -78,7 +78,7 @@ public int hashCode() { @Override public String toString() { - return typeName + ':' + fieldName + '\''; + return typeName + '.' + fieldName; } /** diff --git a/src/main/java/graphql/schema/GraphQLSchema.java b/src/main/java/graphql/schema/GraphQLSchema.java index 7f68c1071c..ba9ca1da6e 100644 --- a/src/main/java/graphql/schema/GraphQLSchema.java +++ b/src/main/java/graphql/schema/GraphQLSchema.java @@ -293,6 +293,30 @@ public GraphQLObjectType getObjectType(String typeName) { return (GraphQLObjectType) graphQLType; } + public GraphQLFieldDefinition getFieldDefinition(FieldCoordinates fieldCoordinates) { + String fieldName = fieldCoordinates.getFieldName(); + if (fieldCoordinates.isSystemCoordinates()) { + if (fieldName.equals(this.getIntrospectionSchemaFieldDefinition().getName())) { + return this.getIntrospectionSchemaFieldDefinition(); + } + if (fieldName.equals(this.getIntrospectionTypeFieldDefinition().getName())) { + return this.getIntrospectionTypeFieldDefinition(); + } + if (fieldName.equals(this.getIntrospectionTypenameFieldDefinition().getName())) { + return this.getIntrospectionTypenameFieldDefinition(); + } + return Assert.assertShouldNeverHappen("The system field name %s is unknown", fieldName); + } + String typeName = fieldCoordinates.getTypeName(); + GraphQLType graphQLType = getType(typeName); + if (graphQLType != null) { + assertTrue(graphQLType instanceof GraphQLFieldsContainer, + () -> String.format("You have asked for named type '%s' but its not GraphQLFieldsContainer but rather a '%s'", typeName, graphQLType.getClass().getName())); + return ((GraphQLFieldsContainer) graphQLType).getFieldDefinition(fieldName); + } + return null; + } + public Map getTypeMap() { return typeMap; } diff --git a/src/test/groovy/graphql/schema/GraphQLSchemaTest.groovy b/src/test/groovy/graphql/schema/GraphQLSchemaTest.groovy index 7f7f58d08c..40a0a3fd1f 100644 --- a/src/test/groovy/graphql/schema/GraphQLSchemaTest.groovy +++ b/src/test/groovy/graphql/schema/GraphQLSchemaTest.groovy @@ -272,4 +272,56 @@ class GraphQLSchemaTest extends Specification { newDF !== nameDF newDF instanceof PropertyDataFetcher // defaulted in } + + def "can get by field co-ordinate"() { + when: + def fieldDef = starWarsSchema.getFieldDefinition(FieldCoordinates.coordinates("QueryType", "hero")) + + then: + fieldDef.name == "hero" + (fieldDef.type as GraphQLInterfaceType).getName() == "Character" + + when: + fieldDef = starWarsSchema.getFieldDefinition(FieldCoordinates.coordinates("X", "hero")) + + then: + fieldDef == null + + when: + fieldDef = starWarsSchema.getFieldDefinition(FieldCoordinates.coordinates("QueryType", "X")) + + then: + fieldDef == null + + when: + starWarsSchema.getFieldDefinition(FieldCoordinates.coordinates("Episode", "JEDI")) + + then: + thrown(AssertException) + + when: + fieldDef = starWarsSchema.getFieldDefinition(FieldCoordinates.systemCoordinates("__typename")) + + then: + fieldDef == starWarsSchema.getIntrospectionTypenameFieldDefinition() + + when: + fieldDef = starWarsSchema.getFieldDefinition(FieldCoordinates.systemCoordinates("__type")) + + then: + fieldDef == starWarsSchema.getIntrospectionTypeFieldDefinition() + + when: + fieldDef = starWarsSchema.getFieldDefinition(FieldCoordinates.systemCoordinates("__schema")) + + then: + fieldDef == starWarsSchema.getIntrospectionSchemaFieldDefinition() + + when: + starWarsSchema.getFieldDefinition(FieldCoordinates.systemCoordinates("__junk")) + + then: + thrown(AssertException) + + } }