in src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java [407:443]
private void handleConnectionTypes(ObjectTypeDefinition typeDefinition, TypeDefinitionRegistry typeRegistry) {
for (FieldDefinition fieldDefinition : typeDefinition.getFieldDefinitions()) {
Directive directive = fieldDefinition.getDirectives().stream().filter( i -> "connection".equals(i.getName())).findFirst().orElse(null);
if (directive != null) {
if (directive.getArgument(CONNECTION_FOR) != null) {
String forType = ((StringValue) directive.getArgument(CONNECTION_FOR).getValue()).getValue();
Optional<TypeDefinition> forTypeDefinition = typeRegistry.getType(forType);
if (!forTypeDefinition.isPresent()) {
throw new SlingGraphQLException("Type '" + forType + "' has not been defined.");
}
TypeDefinition<?> forOTD = forTypeDefinition.get();
ObjectTypeDefinition edge = ObjectTypeDefinition.newObjectTypeDefinition().name(forOTD.getName() + "Edge")
.fieldDefinition(new FieldDefinition("cursor", new TypeName(TYPE_STRING)))
.fieldDefinition(new FieldDefinition("node", new TypeName(forOTD.getName())))
.build();
ObjectTypeDefinition connection = ObjectTypeDefinition.newObjectTypeDefinition().name(forOTD.getName() +
"Connection")
.fieldDefinition(new FieldDefinition("edges", new ListType(new TypeName(forType + "Edge"))))
.fieldDefinition(new FieldDefinition("pageInfo", new TypeName(TYPE_PAGE_INFO)))
.build();
if (!typeRegistry.getType(TYPE_PAGE_INFO).isPresent()) {
ObjectTypeDefinition pageInfo = ObjectTypeDefinition.newObjectTypeDefinition().name(TYPE_PAGE_INFO)
.fieldDefinition(new FieldDefinition("hasPreviousPage", new NonNullType(new TypeName(TYPE_BOOLEAN))))
.fieldDefinition(new FieldDefinition("hasNextPage", new NonNullType(new TypeName(TYPE_BOOLEAN))))
.fieldDefinition(new FieldDefinition("startCursor", new TypeName(TYPE_STRING)))
.fieldDefinition(new FieldDefinition("endCursor", new TypeName(TYPE_STRING)))
.build();
typeRegistry.add(pageInfo);
}
typeRegistry.add(edge);
typeRegistry.add(connection);
} else {
throw new SlingGraphQLException("The connection directive requires a 'for' argument.");
}
}
}
}