Class ExecutableNormalizedField
ExecutableNormalizedField represents a field in an executable graphql operation. Its models what
could be executed during a given operation.
This class is intentionally mutable for performance reasons since building immutable parent child objects is too expensive.
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final Stringprivate final com.google.common.collect.ImmutableList<Argument> private final ArrayList<ExecutableNormalizedField> private final Stringprivate final intprivate final com.google.common.collect.ImmutableMap<String, NormalizedInputValue> private final LinkedHashSet<String> private ExecutableNormalizedFieldprivate final LinkedHashMap<String, Object> -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivate -
Method Summary
Modifier and TypeMethodDescriptionvoidaddChild(ExecutableNormalizedField executableNormalizedField) voidaddObjectTypeNames(Collection<String> objectTypeNames) voidvoidforEachFieldDefinition(GraphQLSchema schema, Consumer<GraphQLFieldDefinition> consumer) getAlias()com.google.common.collect.ImmutableList<Argument> getChildren(int includingRelativeLevel) getChildren(String objectTypeName) This returns the child fields that can be used if the object is of the specified object typegetChildrenWithSameResultKey(String resultKey) Returns the list of child fields that would have the same result keygetFieldDefinitions(GraphQLSchema schema) private Set<GraphQLInterfaceType> This tries to find interfaces common to all the field output types.intgetLevel()the level of theExecutableNormalizedFieldin the operation hierarchy with top level fields starting at 1This returns the list of the result keys (seegetResultKey()that lead from this field upwards to its parent fieldgetName()All merged fields have the same name so this is the name of theExecutableNormalizedField.getNormalizedArgument(String name) Returns an argument value as aNormalizedInputValuewhich contains its type name and its current valuecom.google.common.collect.ImmutableMap<String, NormalizedInputValue> AExecutableNormalizedFieldcan sometimes (for non-concrete types like interfaces and unions) have more than one object type it could be when executed.private GraphQLFieldDefinitiongetOneFieldDefinition(GraphQLSchema schema) This is NOT public as it is not recommended usage.Returns the result key of thisExecutableNormalizedFieldwithin the overall result.This returns the first entry ingetObjectTypeNames().getType(GraphQLSchema schema) getTypes(GraphQLSchema schema) booleanbooleanisConditional(@NotNull GraphQLSchema schema) Determines whether thisExecutableNormalizedFieldneeds a fragment to select the field.voidreplaceParent(ExecutableNormalizedField newParent) private static GraphQLFieldDefinitionresolveIntrospectionField(GraphQLSchema schema, Set<String> objectTypeNames, String fieldName) voidsetObjectTypeNames(Collection<String> objectTypeNames) toString()transform(Consumer<ExecutableNormalizedField.Builder> builderConsumer) Allows thisExecutableNormalizedFieldto be transformed via aExecutableNormalizedField.Builderconsumer callbackprivate voidtraverseImpl(ExecutableNormalizedField root, Consumer<ExecutableNormalizedField> consumer, int curRelativeLevel, int abortAfter) voidtraverseSubTree(Consumer<ExecutableNormalizedField> consumer) Traverse from thisExecutableNormalizedFielddown into itself and all of its children
-
Field Details
-
alias
-
normalizedArguments
private final com.google.common.collect.ImmutableMap<String,NormalizedInputValue> normalizedArguments -
resolvedArguments
-
astArguments
-
objectTypeNames
-
children
-
parent
-
fieldName
-
level
private final int level
-
-
Constructor Details
-
ExecutableNormalizedField
-
-
Method Details
-
isConditional
Determines whether thisExecutableNormalizedFieldneeds a fragment to select the field. However, it considers the parent output type when determining whether it needs a fragment.Consider the following schema
interface Animal { name: String parent: Animal } type Cat implements Animal { name: String parent: Cat } type Dog implements Animal { name: String parent: Dog isGoodBoy: Boolean } type Query { animal: Animal }and the following query
{ animal { parent { name } } }Then we would get the following
ExecutableNormalizedOperation-Query.animal: Animal --[Cat, Dog].parent: Cat, Dog ---[Cat, Dog].name: String
If we simply checked the
parent'sgetFieldDefinitions(GraphQLSchema)that would point us toCat.parentandDog.parentwhose output types would incorrectly answer our question whether this is conditional?We MUST consider that the output type of the
parentfield isAnimaland NOTCatorDogas their respective implementations would say.- Parameters:
schema- - the graphql schema in play- Returns:
- true if the field is conditional
-
hasChildren
public boolean hasChildren() -
getType
-
getTypes
-
forEachFieldDefinition
-
getFieldDefinitions
-
getOneFieldDefinition
This is NOT public as it is not recommended usage.Internally there are cases where we know it is safe to use this, so this exists.
-
resolveIntrospectionField
private static GraphQLFieldDefinition resolveIntrospectionField(GraphQLSchema schema, Set<String> objectTypeNames, String fieldName) -
addObjectTypeNames
-
setObjectTypeNames
-
addChild
-
clearChildren
public void clearChildren() -
getName
All merged fields have the same name so this is the name of theExecutableNormalizedField.WARNING: This is not always the key in the execution result, because of possible field aliases.
- Returns:
- the name of this
ExecutableNormalizedField - See Also:
-
getFieldName
- Returns:
- the same value as
getName() - See Also:
-
getResultKey
Returns the result key of thisExecutableNormalizedFieldwithin the overall result. This is either a field alias or the value ofgetName()- Returns:
- the result key for this
ExecutableNormalizedField. - See Also:
-
getAlias
- Returns:
- the field alias used or null if there is none
- See Also:
-
getAstArguments
- Returns:
- a list of the
Arguments on the field
-
getNormalizedArgument
Returns an argument value as aNormalizedInputValuewhich contains its type name and its current value- Parameters:
name- the name of the argument- Returns:
- an argument value
-
getNormalizedArguments
- Returns:
- a map of all the arguments in
NormalizedInputValueform
-
getResolvedArguments
- Returns:
- a map of the resolved argument values
-
getObjectTypeNames
AExecutableNormalizedFieldcan sometimes (for non-concrete types like interfaces and unions) have more than one object type it could be when executed. There is no way to know what it will be until the field is executed over data and the type is resolved via aTypeResolver.This method returns all the possible types a field can be which is one or more
GraphQLObjectTypenames.Warning: This returns a Mutable Set. No defensive copy is made for performance reasons.
- Returns:
- a set of the possible type names this field could be.
-
getSingleObjectTypeName
This returns the first entry ingetObjectTypeNames(). Sometimes you know a field cant be more than one type and this method is a shortcut one to help you.- Returns:
- the first entry from
-
printDetails
- Returns:
- a helper method show field details
-
objectTypeNamesToString
- Returns:
- a helper method to show the object types names as a string
-
getListOfResultKeys
This returns the list of the result keys (seegetResultKey()that lead from this field upwards to its parent field- Returns:
- a list of the result keys from this
ExecutableNormalizedFieldto the top of the operation via parent fields
-
getChildren
- Returns:
- the children of the
ExecutableNormalizedField
-
getChildrenWithSameResultKey
Returns the list of child fields that would have the same result key- Parameters:
resultKey- the result key to check- Returns:
- a list of all direct
ExecutableNormalizedFieldchildren with the specified result key
-
getChildren
-
getChildren
This returns the child fields that can be used if the object is of the specified object type- Parameters:
objectTypeName- the object type- Returns:
- a list of child fields that would apply to that object type
-
getLevel
public int getLevel()the level of theExecutableNormalizedFieldin the operation hierarchy with top level fields starting at 1- Returns:
- the level of the
ExecutableNormalizedFieldin the operation hierarchy
-
getParent
- Returns:
- the parent of this
ExecutableNormalizedFieldor null if it's a top level field
-
replaceParent
-
toString
-
traverseSubTree
Traverse from thisExecutableNormalizedFielddown into itself and all of its children- Parameters:
consumer- the callback for eachExecutableNormalizedFieldin the hierarchy.
-
traverseImpl
private void traverseImpl(ExecutableNormalizedField root, Consumer<ExecutableNormalizedField> consumer, int curRelativeLevel, int abortAfter) -
getInterfacesCommonToAllOutputTypes
This tries to find interfaces common to all the field output types.i.e. goes through
getFieldDefinitions(GraphQLSchema)and finds interfaces that all the field's unwrapped output types are assignable to. -
newNormalizedField
- Returns:
- a
ExecutableNormalizedField.BuilderofExecutableNormalizedFields
-
transform
public ExecutableNormalizedField transform(Consumer<ExecutableNormalizedField.Builder> builderConsumer) Allows thisExecutableNormalizedFieldto be transformed via aExecutableNormalizedField.Builderconsumer callback- Parameters:
builderConsumer- the consumer given a builder- Returns:
- a new transformed
ExecutableNormalizedField
-