This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch CAUSEWAY-3676
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/CAUSEWAY-3676 by this push:
     new f4df5712b1 CAUSEWAY-3676: encapsulating top level query structure
f4df5712b1 is described below

commit f4df5712b1a81cf404859838998dfa3183e6aa87
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 15:23:44 2024 +0000

    CAUSEWAY-3676: encapsulating top level query structure
---
 .../viewer/integration/GraphQlSourceForCauseway.java    | 16 ++++++++++------
 .../viewer/source/GqlvTopLevelQueryStructure.java       | 17 +++++++++++++++++
 .../viewer/graphql/viewer/source/QueryFieldFactory.java |  8 +++++---
 3 files changed, 32 insertions(+), 9 deletions(-)

diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
index 2ec42cc6c3..509fa9f3b2 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
@@ -31,6 +31,7 @@ import org.apache.causeway.applib.id.HasLogicalType;
 
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
+import 
org.apache.causeway.viewer.graphql.viewer.source.GqlvTopLevelQueryStructure;
 import org.apache.causeway.viewer.graphql.viewer.source.GraphQLTypeRegistry;
 import org.apache.causeway.viewer.graphql.viewer.source.ObjectTypeFactory;
 import org.apache.causeway.viewer.graphql.viewer.source.QueryFieldFactory;
@@ -94,13 +95,15 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             throw new IllegalStateException("Metamodel is not fully 
introspected");
         }
 
-        final GraphQLObjectType.Builder queryBuilder = 
newObject().name("Query");
         final GraphQLCodeRegistry.Builder codeRegistryBuilder = 
GraphQLCodeRegistry.newCodeRegistry();
 
+        val gqlvTopLevelQueryStructure = new GqlvTopLevelQueryStructure();
+        final GraphQLObjectType.Builder queryBuilder = 
gqlvTopLevelQueryStructure.getQueryBuilder();
+
         specificationLoader.snapshotSpecifications()
             .distinct((a, b) -> 
a.getLogicalTypeName().equals(b.getLogicalTypeName()))
             .sorted(Comparator.comparing(HasLogicalType::getLogicalTypeName))
-            .forEach(objectSpec -> addToSchema(objectSpec, queryBuilder, 
codeRegistryBuilder));
+            .forEach(objectSpec -> addToSchema(objectSpec, 
codeRegistryBuilder, gqlvTopLevelQueryStructure));
 
         final GraphQLFieldDefinition numServicesField = newFieldDefinition()
                 .name("numServices")
@@ -126,15 +129,16 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
 
     private void addToSchema(
             final ObjectSpecification objectSpec,
-            final GraphQLObjectType.Builder queryBuilder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
-    ) {
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+            final GqlvTopLevelQueryStructure gqlvTopLevelQueryStructure) {
+
+        final GraphQLObjectType.Builder queryBuilder = 
gqlvTopLevelQueryStructure.getQueryBuilder();
 
         switch (objectSpec.getBeanSort()) {
 
             case MANAGED_BEAN_CONTRIBUTING: // @DomainService
 
-                
queryFieldFactory.queryFieldFromObjectSpecification(queryBuilder, 
codeRegistryBuilder, objectSpec);
+                
queryFieldFactory.queryFieldFromObjectSpecification(objectSpec, 
gqlvTopLevelQueryStructure, codeRegistryBuilder);
                 break;
 
             case ABSTRACT:
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvTopLevelQueryStructure.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvTopLevelQueryStructure.java
new file mode 100644
index 0000000000..da13d701e6
--- /dev/null
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvTopLevelQueryStructure.java
@@ -0,0 +1,17 @@
+package org.apache.causeway.viewer.graphql.viewer.source;
+
+import graphql.schema.GraphQLObjectType;
+
+import lombok.Getter;
+
+import static graphql.schema.GraphQLObjectType.newObject;
+
+public class GqlvTopLevelQueryStructure {
+
+    @Getter final GraphQLObjectType.Builder queryBuilder;
+
+    public GqlvTopLevelQueryStructure() {
+        queryBuilder = newObject().name("Query");
+    }
+
+}
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
index 2057b68247..45b1237325 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/QueryFieldFactory.java
@@ -60,9 +60,11 @@ public class QueryFieldFactory {
     private final SpecificationLoader specificationLoader;
 
     public void queryFieldFromObjectSpecification(
-            final GraphQLObjectType.Builder queryBuilder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final ObjectSpecification objectSpec) {
+            final ObjectSpecification objectSpec,
+            final GqlvTopLevelQueryStructure gqlvTopLevelQueryStructure,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
+
+        final GraphQLObjectType.Builder queryBuilder = 
gqlvTopLevelQueryStructure.getQueryBuilder();
 
         String logicalTypeNameSanitized = _LTN.sanitized(objectSpec);
 

Reply via email to