in graphql-dgs-codegen-shared-core/src/main/kotlin/com/netflix/graphql/dgs/client/codegen/GraphQLMultiQueryRequest.kt [26:79]
fun serialize(): String {
if (requests.isEmpty()) throw AssertionError("Request must have at least one query")
val operationDef = OperationDefinition.newOperationDefinition()
requests[0].query.name?.let { operationDef.name(it) }
requests[0].query.getOperationType()?.let { operationDef.operation(OperationDefinition.Operation.valueOf(it.uppercase())) }
val queryType = requests[0].query.getOperationType().toString()
val variableDefinitions = mutableListOf<VariableDefinition>()
val selectionList: MutableList<Field.Builder> = mutableListOf()
for (request in this.requests) {
val query = request.query
// Graphql only supports multiple mutations or multiple queries. Not a combination of the two.
// Graphql does not support multiple subscriptions in one request http://spec.graphql.org/June2018/#sec-Single-root-field
if (!query.getOperationType().equals(queryType) || queryType == OperationDefinition.Operation.SUBSCRIPTION.name) {
throw AssertionError("Request has to have exclusively queries or mutations in a multi operation request")
}
if (request.query.variableDefinitions.isNotEmpty()) {
variableDefinitions.addAll(request.query.variableDefinitions)
}
val selection = Field.newField(request.query.getOperationName())
if (query.input.isNotEmpty()) {
selection.arguments(
query.input.map { (name, value) ->
Argument(name, request.inputValueSerializer.toValue(value))
},
)
}
if (request.projection != null) {
val selectionSet =
if (request.projection is BaseSubProjectionNode<*, *> && request.projection.root() != null) {
request.projectionSerializer.toSelectionSet(request.projection.root() as BaseProjectionNode)
} else {
request.projectionSerializer.toSelectionSet(request.projection)
}
if (selectionSet.selections.isNotEmpty()) {
selection.selectionSet(selectionSet)
}
}
if (query.queryAlias.isNotEmpty()) {
selection.alias(query.queryAlias)
}
selectionList.add(selection)
}
operationDef.selectionSet(SelectionSet.newSelectionSet(selectionList.map(Field.Builder::build).toList()).build())
return AstPrinter.printAst(operationDef.build())
}