Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package graphql.nadel.definition.coordinates

import graphql.Directives
import graphql.language.Definition
import graphql.language.Document
import graphql.language.NamedNode
import graphql.nadel.engine.util.AnySDLDefinition
import graphql.nadel.engine.util.AnySDLNamedDefinition
import graphql.nadel.engine.util.unwrapAll
import graphql.nadel.schema.NadelSchemaDefinitionTraverser
import graphql.nadel.schema.NadelSchemaDefinitionTraverserElement
Expand Down Expand Up @@ -62,22 +63,33 @@ class NadelSchemaMemberCoordinatesFactory {

fun create(
schema: Document,
resolveTypeReferences: Boolean,
): Set<NadelSchemaMemberCoordinates> {
val definitions = schema.definitions
return create(
schema = schema.definitions,
resolveTypeReferences = resolveTypeReferences,
)
}

fun create(
schema: Iterable<Definition<*>>,
resolveTypeReferences: Boolean,
): Set<NadelSchemaMemberCoordinates> {
val definitions = schema
.asSequence()
.filterIsInstance<AnySDLDefinition>()
.filterIsInstance<AnySDLNamedDefinition>()

// There can be multiple definitions per name, but in this scenario we don't care
val definitionByName = definitions
.associateBy {
(it as NamedNode<*>).name
it.name
}

val roots = definitions
.mapNotNull(NadelSchemaDefinitionTraverserElement::from)
.toList()

return createImpl(roots, definitionByName)
return createImpl(roots, definitionByName, resolveTypeReferences)
}

private fun createImpl(
Expand All @@ -97,13 +109,18 @@ class NadelSchemaMemberCoordinatesFactory {
private fun createImpl(
roots: List<NadelSchemaDefinitionTraverserElement>,
definitionByName: Map<String, AnySDLDefinition>,
resolveTypeReferences: Boolean,
): Set<NadelSchemaMemberCoordinates> {
val coordinates = mutableSetOf<NadelSchemaMemberCoordinates>()

NadelSchemaDefinitionTraverser()
.traverse(
roots,
NadelSchemaDefinitionCoordinateCollectorTraverserVisitor(coordinates, definitionByName),
NadelSchemaDefinitionCoordinateCollectorTraverserVisitor(
coordinates,
definitionByName,
resolveTypeReferences,
),
)

return coordinates
Expand Down Expand Up @@ -225,6 +242,7 @@ internal class NadelSchemaCoordinateCollectorTraverserVisitor(
internal class NadelSchemaDefinitionCoordinateCollectorTraverserVisitor(
private val coordinates: MutableCollection<NadelSchemaMemberCoordinates>,
private val definitionByName: Map<String, AnySDLDefinition>,
private val resolveTypeReferences: Boolean,
) : NadelSchemaDefinitionTraverserVisitor {
override fun visitGraphQLAppliedDirective(element: NadelSchemaDefinitionTraverserElement.AppliedDirective): Boolean {
coordinates.add(element.coordinates())
Expand Down Expand Up @@ -302,6 +320,14 @@ internal class NadelSchemaDefinitionCoordinateCollectorTraverserVisitor(
}

override fun visitTypeReference(element: NadelSchemaDefinitionTraverserElement.TypeReference): Boolean {
return if (resolveTypeReferences) {
resolveTypeReference(element)
} else {
false
}
}

private fun resolveTypeReference(element: NadelSchemaDefinitionTraverserElement.TypeReference): Boolean {
// Resolve definition then traverse
val typeName = element.node.unwrapAll().name

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ abstract class NadelSchemaMemberCoordinatesFactoryTest {

class DocumentDefinitionExtractorTest : NadelSchemaMemberCoordinatesFactoryTest() {
override fun extractCoordinates(schema: String): Set<NadelSchemaMemberCoordinates> {
return NadelSchemaMemberCoordinatesFactory().create(Parser().parseDocument(schema))
return NadelSchemaMemberCoordinatesFactory().create(
Parser().parseDocument(schema),
resolveTypeReferences = true,
)
}

@Test
Expand Down
Loading