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 17b842b77e CAUSEWAY-3676: wip on toplevel query structure, numServices
17b842b77e is described below

commit 17b842b77ea2d10ec6a435d551889988f2935852
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 15:34:31 2024 +0000

    CAUSEWAY-3676: wip on toplevel query structure, numServices
---
 .../test/e2e/Schema_IntegTest.schema.approved.json | 22 ++++++------
 .../integration/GraphQlSourceForCauseway.java      | 13 ++------
 .../graphql/viewer/source/GqlvObjectStructure.java |  2 +-
 .../viewer/source/GqlvTopLevelQueryStructure.java  | 39 ++++++++++++++++++++++
 4 files changed, 53 insertions(+), 23 deletions(-)

diff --git 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
index 447ff3cb33..8156430cfb 100644
--- 
a/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
+++ 
b/incubator/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/Schema_IntegTest.schema.approved.json
@@ -38,6 +38,17 @@
         "name" : "Query",
         "description" : null,
         "fields" : [ {
+          "name" : "numServices",
+          "description" : null,
+          "args" : [ ],
+          "type" : {
+            "kind" : "SCALAR",
+            "name" : "Int",
+            "ofType" : null
+          },
+          "isDeprecated" : false,
+          "deprecationReason" : null
+        }, {
           "name" : "causeway_applib_UserMenu",
           "description" : null,
           "args" : [ ],
@@ -92,17 +103,6 @@
           },
           "isDeprecated" : false,
           "deprecationReason" : null
-        }, {
-          "name" : "numServices",
-          "description" : null,
-          "args" : [ ],
-          "type" : {
-            "kind" : "SCALAR",
-            "name" : "Int",
-            "ofType" : null
-          },
-          "isDeprecated" : false,
-          "deprecationReason" : null
         } ],
         "inputFields" : null,
         "interfaces" : [ ],
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 509fa9f3b2..3ad6fec9dd 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
@@ -98,25 +98,18 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
         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, 
codeRegistryBuilder, gqlvTopLevelQueryStructure));
 
-        final GraphQLFieldDefinition numServicesField = newFieldDefinition()
-                .name("numServices")
-                .type(Scalars.GraphQLInt)
-                .build();
-
-        queryBuilder.field(numServicesField);
 
-        GraphQLObjectType queryType = queryBuilder.build();
+        GraphQLObjectType queryType = 
gqlvTopLevelQueryStructure.buildQueryType();
 
         codeRegistryBuilder
                 .dataFetcher(
-                        coordinates(queryType, numServicesField),
+                        coordinates(queryType, 
gqlvTopLevelQueryStructure.getNumServicesField()),
                         (DataFetcher<Object>) environment -> 
this.serviceRegistry.streamRegisteredBeans().count());
         val codeRegistry = codeRegistryBuilder.build();
 
@@ -132,8 +125,6 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final GqlvTopLevelQueryStructure gqlvTopLevelQueryStructure) {
 
-        final GraphQLObjectType.Builder queryBuilder = 
gqlvTopLevelQueryStructure.getQueryBuilder();
-
         switch (objectSpec.getBeanSort()) {
 
             case MANAGED_BEAN_CONTRIBUTING: // @DomainService
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
index f44be72ba2..f9c97fffac 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
@@ -295,7 +295,7 @@ public class GqlvObjectStructure {
     public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() {
         //noinspection OptionalAssignedToNull
         if (mutatorsTypeIfAny != null) {
-            throw new IllegalArgumentException("MutatorsType has already been 
built for " + getLogicalTypeName());
+            throw new IllegalArgumentException("Gql MutatorsType has already 
been built for " + getLogicalTypeName());
         }
         return mutatorsTypeIfAny = hasMutators()
                 ? Optional.of(mutatorsTypeBuilder.build())
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
index da13d701e6..88ca9bd7ea 100644
--- 
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
@@ -1,17 +1,56 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
+import graphql.Scalars;
+import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLObjectType;
 
 import lombok.Getter;
 
+import java.util.Optional;
+
+import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
 public class GqlvTopLevelQueryStructure {
 
     @Getter final GraphQLObjectType.Builder queryBuilder;
 
+    @Getter private GraphQLFieldDefinition numServicesField;
+
+    /**
+     * Built using {@link #buildQueryType()}
+     */
+    private GraphQLObjectType queryType;
+
+
     public GqlvTopLevelQueryStructure() {
         queryBuilder = newObject().name("Query");
+
+        numServicesField = newFieldDefinition()
+                .name("numServices")
+                .type(Scalars.GraphQLInt)
+                .build();
+        queryBuilder.field(numServicesField);
+    }
+
+
+
+    public GraphQLObjectType buildQueryType() {
+        if (queryType != null) {
+            throw new IllegalStateException("QueryType has already been 
built");
+        }
+        return queryType = queryBuilder.build();
+    }
+
+    /**
+     *
+     * @see #buildQueryType()
+     */
+    public GraphQLObjectType getQueryType() {
+        if (queryType == null) {
+            throw new IllegalStateException("QueryType has not yet been 
built");
+        }
+        return queryType;
     }
 
 }

Reply via email to