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

commit b021da9d6d31a49d7f19ac2352c7c44cffc8971c
Author: danhaywood <[email protected]>
AuthorDate: Tue Feb 13 00:45:38 2024 +0000

    CAUSEWAY-3676: completes saveAs; adds description to metamodel
---
 .../core/config/CausewayConfiguration.java         |   2 +-
 .../viewer/graphql/model/domain/GqlvAction.java    |  35 ++-
 .../graphql/model/domain/GqlvDomainObject.java     |  17 +-
 .../viewer/graphql/model/domain/GqlvMember.java    |   2 +
 .../viewer/graphql/model/domain/GqlvMeta.java      |   4 +
 .../graphql/model/domain/GqlvMetaSaveAs.java       |   5 +-
 .../model/domain/GqlvMutationForAction.java        |   8 +-
 .../model/domain/GqlvMutationForProperty.java      |   8 +-
 .../viewer/test/domain/dept/Department.java        |   2 +
 .../graphql/viewer/test/domain/dept/DeptHead.java  |   2 +
 .../viewer/test/domain/dept/StaffMember.java       |   4 +-
 ...tegTest.change_department_name_visibility._.gql |   2 +-
 ...change_department_name_visibility.approved.json |   2 +-
 ...IntegTest.find_department_and_change_name._.gql |  23 +-
 ...t.find_department_and_change_name.approved.json |  25 +-
 viewers/graphql/test/src/test/resources/schema.gql | 282 +++++++++++++--------
 16 files changed, 243 insertions(+), 180 deletions(-)

diff --git 
a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
 
b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
index 4e3f88f79d..760fe7baed 100644
--- 
a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
+++ 
b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
@@ -2398,7 +2398,7 @@ public class CausewayConfiguration {
                 /**
                  * Lookup field prefix
                  */
-                private String fieldNamePrefix = "_gqlv_lookup__";
+                private String fieldNamePrefix = "";
                 /**
                  * Lookup field suffix
                  */
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
index 2f31c22090..9bc0cf1eee 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -41,6 +41,7 @@ import 
org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyActionParameter;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter;
+import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 
@@ -115,16 +116,16 @@ public class GqlvAction
 
     /**
      *
-     * @param dataFetchingEnvironment
+     * @param environment
      * @param objectAction
      * @param context
      * @return
      */
     public static Can<ManagedObject> argumentManagedObjectsFor(
-            final DataFetchingEnvironment dataFetchingEnvironment,
+            final DataFetchingEnvironment environment,
             final ObjectAction objectAction,
             final Context context) {
-        Map<String, Object> argumentPojos = 
dataFetchingEnvironment.getArguments();
+        Map<String, Object> argumentPojos = environment.getArguments();
         Can<ObjectActionParameter> parameters = objectAction.getParameters();
         return parameters
                 .map(oap -> {
@@ -144,12 +145,12 @@ public class GqlvAction
                             if (argumentValue instanceof List) {
                                 val argumentValueList = (List<Object>) 
argumentValue;
                                 pojoOrPojoList = argumentValueList.stream()
-                                        .map(value -> 
asPojo(oap.getElementType(), value, context.bookmarkService))
+                                        .map(value -> 
asPojo(oap.getElementType(), value, context.bookmarkService, environment))
                                         .filter(Optional::isPresent)
                                         .map(Optional::get)
                                         .collect(Collectors.toList());
                             } else {
-                                pojoOrPojoList = asPojo(oap.getElementType(), 
argumentValue, context.bookmarkService).orElse(null);
+                                pojoOrPojoList = asPojo(oap.getElementType(), 
argumentValue, context.bookmarkService, environment).orElse(null);
                             }
                             return ManagedObject.adaptParameter(oap, 
pojoOrPojoList);
 
@@ -185,15 +186,25 @@ public class GqlvAction
     public static Optional<Object> asPojo(
             final ObjectSpecification elementType,
             final Object argumentValueObj,
-            final BookmarkService bookmarkService) {
+            final BookmarkService bookmarkService,
+            final DataFetchingEnvironment environment) {
         val argumentValue = (Map<String, String>) argumentValueObj;
         String idValue = argumentValue.get("id");
-        Class<?> paramClass = elementType.getCorrespondingClass();
-        Optional<Bookmark> bookmarkIfAny = 
bookmarkService.bookmarkFor(paramClass, idValue);
-        return bookmarkIfAny
-                .map(bookmarkService::lookup)
-                .filter(Optional::isPresent)
-                .map(Optional::get);
+        if (idValue != null) {
+            Class<?> paramClass = elementType.getCorrespondingClass();
+            Optional<Bookmark> bookmarkIfAny = 
bookmarkService.bookmarkFor(paramClass, idValue);
+            return bookmarkIfAny
+                    .map(bookmarkService::lookup)
+                    .filter(Optional::isPresent)
+                    .map(Optional::get);
+        }
+        String refValue = argumentValue.get("ref");
+        if (refValue != null) {
+            String key = GqlvMetaSaveAs.keyFor(refValue);
+            BookmarkedPojo value = environment.getGraphQlContext().get(key);
+            return Optional.of(value).map(BookmarkedPojo::getTargetPojo);
+        }
+        throw new IllegalArgumentException("Either 'id' or 'ref' must be 
specified for a DomainObject input type");
     }
 
     public void addGqlArguments(
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index 2508aecdf0..e4f895fd26 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -31,7 +31,6 @@ import graphql.schema.GraphQLInputObjectType;
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
 import static graphql.schema.GraphQLInputObjectType.newInputObject;
-import static graphql.schema.GraphQLNonNull.nonNull;
 
 import org.apache.causeway.core.metamodel.spec.ActionScope;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
@@ -73,6 +72,7 @@ public class GqlvDomainObject
         super(TypeNames.objectTypeNameFor(objectSpecification), context);
 
         this.objectSpecification = objectSpecification;
+        gqlObjectTypeBuilder.description(objectSpecification.getDescription());
 
         this.meta = new GqlvMeta(this, context);
         addChildField(meta.getField());
@@ -81,8 +81,15 @@ public class GqlvDomainObject
         inputTypeBuilder
                 .field(newInputObjectField()
                         .name("id")
-                        .type(nonNull(Scalars.GraphQLID))
-                        .build());
+                        .type(Scalars.GraphQLID)
+                        .build()
+                )
+                .field(newInputObjectField()
+                        .name("ref")
+                        .type(Scalars.GraphQLString)
+                        .build()
+                )
+        ;
         gqlInputObjectType = inputTypeBuilder.build();
 
         setField(buildFieldDefinition(gqlInputObjectType));
@@ -96,7 +103,7 @@ public class GqlvDomainObject
 
     }
 
-    private GraphQLFieldDefinition buildFieldDefinition(GraphQLInputObjectType 
gqlInputObjectType) {
+    private GraphQLFieldDefinition buildFieldDefinition(final 
GraphQLInputObjectType gqlInputObjectType) {
         val lookupConfig = 
this.context.causewayConfiguration.getViewer().getGraphql().getLookup();
         val objectSpec = getObjectSpecification();
         val fieldName = String.format("%s%s%s",
@@ -161,7 +168,7 @@ public class GqlvDomainObject
     @Override
     protected Object fetchData(DataFetchingEnvironment environment) {
         Object target = environment.getArgument("object");
-        return GqlvAction.asPojo(getObjectSpecification(), target, 
this.context.bookmarkService)
+        return GqlvAction.asPojo(getObjectSpecification(), target, 
this.context.bookmarkService, environment)
                 .orElse(null);
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
index 9aabeb5195..be1ab35bcb 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
@@ -42,6 +42,8 @@ public abstract class GqlvMember<T extends ObjectMember, H 
extends GqlvMember.Ho
         super(typeName, context);
         this.holder = holder;
         this.objectMember = objectMember;
+
+        
objectMember.getCanonicalDescription().ifPresent(gqlObjectTypeBuilder::description);
     }
 
     public String getId() {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
index 8b51c01f2c..39e11d64c9 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
@@ -134,6 +134,10 @@ public class GqlvMeta extends GqlvAbstractCustom {
                     .orElse(null);
         }
 
+        public Bookmark bookmark() {
+            return bookmark;
+        }
+
     }
 
     public interface Holder
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMetaSaveAs.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMetaSaveAs.java
index c095689b01..9f2e019396 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMetaSaveAs.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMetaSaveAs.java
@@ -45,11 +45,12 @@ public class GqlvMetaSaveAs extends GqlvAbstract {
     @Override
     protected Object fetchData(DataFetchingEnvironment environment) {
         String ref = environment.getArgument("ref");
-        environment.getGraphQlContext().put(keyFor(ref), 
BookmarkedPojo.sourceFrom(environment));
+        GqlvMeta.Fetcher source = environment.getSource();
+        environment.getGraphQlContext().put(keyFor(ref), new 
BookmarkedPojo(source.bookmark(), context.bookmarkService));
         return ref;
     }
 
-    private static String keyFor(String ref) {
+    public static String keyFor(String ref) {
         return GqlvMetaSaveAs.class.getName() + "#" + ref;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
index 81274cac1a..017e25ad38 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
@@ -116,7 +116,7 @@ public class GqlvMutationForAction extends GqlvAbstract {
     }
 
     @Override
-    protected Object fetchData(final DataFetchingEnvironment 
dataFetchingEnvironment) {
+    protected Object fetchData(final DataFetchingEnvironment environment) {
 
         val isService = objectSpec.getBeanSort().isManagedBeanContributing();
 
@@ -124,8 +124,8 @@ public class GqlvMutationForAction extends GqlvAbstract {
         if (isService) {
             sourcePojo = 
context.serviceRegistry.lookupServiceElseFail(objectSpec.getCorrespondingClass());
         } else {
-            Object target = dataFetchingEnvironment.getArgument(argumentName);
-            sourcePojo = GqlvAction.asPojo(objectSpec, target, 
context.bookmarkService)
+            Object target = environment.getArgument(argumentName);
+            sourcePojo = GqlvAction.asPojo(objectSpec, target, 
context.bookmarkService, environment)
                     .orElseThrow(); // TODO: better error handling if no such 
object found.
         }
 
@@ -142,7 +142,7 @@ public class GqlvMutationForAction extends GqlvAbstract {
         }
 
         val head = objectAction.interactionHead(managedObject);
-        val argumentManagedObjects = 
argumentManagedObjectsFor(dataFetchingEnvironment, objectAction);
+        val argumentManagedObjects = argumentManagedObjectsFor(environment, 
objectAction);
 
         val validityConsent = objectAction.isArgumentSetValid(head, 
argumentManagedObjects, InteractionInitiatedBy.USER);
         if (validityConsent.isVetoed()) {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
index 358f68d88c..75fb1e5450 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
@@ -76,16 +76,16 @@ public class GqlvMutationForProperty extends GqlvAbstract {
     }
 
     @Override
-    protected Object fetchData(final DataFetchingEnvironment 
dataFetchingEnvironment) {
+    protected Object fetchData(final DataFetchingEnvironment environment) {
 
 
-        Object target = dataFetchingEnvironment.getArgument(argumentName);
-        Object sourcePojo = GqlvAction.asPojo(objectSpec, target, 
context.bookmarkService)
+        Object target = environment.getArgument(argumentName);
+        Object sourcePojo = GqlvAction.asPojo(objectSpec, target, 
context.bookmarkService, environment)
                     .orElseThrow(); // TODO: better error handling if no such 
object found.
 
         val managedObject = ManagedObject.adaptSingular(objectSpec, 
sourcePojo);
 
-        Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
+        Map<String, Object> arguments = environment.getArguments();
         Object argumentValue = arguments.get(oneToOneAssociation.getId());
         ManagedObject argumentManagedObject = 
ManagedObject.adaptProperty(oneToOneAssociation, argumentValue);
 
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Department.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Department.java
index 9233736c00..2bd105a4d5 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Department.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/Department.java
@@ -40,6 +40,7 @@ import org.apache.causeway.applib.annotation.ActionLayout;
 import org.apache.causeway.applib.annotation.Bounding;
 import org.apache.causeway.applib.annotation.Collection;
 import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.DomainObjectLayout;
 import org.apache.causeway.applib.annotation.Editing;
 import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.Property;
@@ -59,6 +60,7 @@ import lombok.val;
 @javax.inject.Named("university.dept.Department")
 @NoArgsConstructor
 @DomainObject(nature = Nature.ENTITY, bounding = Bounding.BOUNDED)
+@DomainObjectLayout(describedAs = "University department specializing in a 
field of study")
 public class Department implements Comparable<Department> {
 
 
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHead.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHead.java
index 5d7b602736..12ed53631a 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHead.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/DeptHead.java
@@ -34,6 +34,7 @@ import javax.persistence.Transient;
 
 import org.apache.causeway.applib.annotation.Action;
 import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.DomainObjectLayout;
 import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.Property;
 import org.apache.causeway.applib.annotation.SemanticsOf;
@@ -55,6 +56,7 @@ import lombok.Setter;
         autoCompleteRepository = DeptHeadRepository.class,
         autoCompleteMethod = "findByNameContaining"
 )
+@DomainObjectLayout(describedAs = "Departmental head, responsible for 
curriculum, research, funding and staff")
 @NoArgsConstructor
 public class DeptHead implements Comparable<DeptHead> {
 
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/StaffMember.java
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/StaffMember.java
index 0298469d8e..a8e471699c 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/StaffMember.java
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/dept/StaffMember.java
@@ -32,6 +32,7 @@ import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
 import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.DomainObjectLayout;
 import org.apache.causeway.applib.annotation.Editing;
 import org.apache.causeway.applib.annotation.Nature;
 import org.apache.causeway.applib.annotation.Optionality;
@@ -50,8 +51,9 @@ import lombok.Setter;
         name = "StaffMember"
 )
 @javax.inject.Named("university.dept.StaffMember")
-@NoArgsConstructor
 @DomainObject(nature = Nature.ENTITY, autoCompleteRepository = 
StaffMemberRepository.class, autoCompleteMethod = "findByNameMatching")
+@DomainObjectLayout(describedAs = "Staff member of a university department, 
responsible for delivering lectures, tutorials, exam invigilation and candidate 
interviews")
+@NoArgsConstructor
 public class StaffMember implements Comparable<StaffMember> {
 
     public StaffMember(
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility._.gql
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility._.gql
index 41a7cf7c38..bdb740382f 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility._.gql
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility._.gql
@@ -1,5 +1,5 @@
 {
-  _gqlv_lookup__university_dept_Department(object: {id: "$departmentId"}) {
+  university_dept_Department(object: {id: "$departmentId"}) {
     changeName {
       hidden
     }
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility.approved.json
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility.approved.json
index cb35165718..e9d6798864 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility.approved.json
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/query_and_mutations/DepartmentMutating_IntegTest.change_department_name_visibility.approved.json
@@ -1,6 +1,6 @@
 {
   "data" : {
-    "_gqlv_lookup__university_dept_Department" : {
+    "university_dept_Department" : {
       "changeName" : {
         "hidden" : false
       }
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name._.gql
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name._.gql
index 5bb0283dd3..351faedeb6 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name._.gql
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name._.gql
@@ -1,6 +1,7 @@
 {
   Scenario(name: "Find department and change its name"){
     Name
+
     Given {
       university_dept_Departments {
         findDepartmentByName {
@@ -12,25 +13,11 @@
         }
       }
     }
+
     When {
-      university_dept_Departments {
-        findDepartmentByName {
-          invoke(name: "Classics") {
-            changeName {
-              invokeIdempotent(newName: "Ancient History") {
-                name {
-                  get
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    Then {
-      university_dept_Departments {
-        findDepartmentByName {
-          invoke(name: "Ancient History") {
+      university_dept_Department(object: {ref: "classics_dept"}) {
+        changeName {
+          invokeIdempotent(newName: "Ancient History") {
             name {
               get
             }
diff --git 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name.approved.json
 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name.approved.json
index fbc3a7ca8f..8f6b6c89f8 100644
--- 
a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name.approved.json
+++ 
b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/scenario/Department_IntegTest.find_department_and_change_name.approved.json
@@ -6,32 +6,17 @@
         "university_dept_Departments" : {
           "findDepartmentByName" : {
             "invoke" : {
-              "name" : {
-                "get" : "Classics"
+              "_gqlv_meta" : {
+                "saveAs" : "classics_dept"
               }
             }
           }
         }
       },
       "When" : {
-        "university_dept_Departments" : {
-          "findDepartmentByName" : {
-            "invoke" : {
-              "changeName" : {
-                "invokeIdempotent" : {
-                  "name" : {
-                    "get" : "Ancient History"
-                  }
-                }
-              }
-            }
-          }
-        }
-      },
-      "Then" : {
-        "university_dept_Departments" : {
-          "findDepartmentByName" : {
-            "invoke" : {
+        "university_dept_Department" : {
+          "changeName" : {
+            "invokeIdempotent" : {
               "name" : {
                 "get" : "Ancient History"
               }
diff --git a/viewers/graphql/test/src/test/resources/schema.gql 
b/viewers/graphql/test/src/test/resources/schema.gql
index 8920b0eae9..9e0889217c 100644
--- a/viewers/graphql/test/src/test/resources/schema.gql
+++ b/viewers/graphql/test/src/test/resources/schema.gql
@@ -24,51 +24,51 @@ directive @specifiedBy(
 
 type Query {
   Scenario(name: String): Scenario
-  _gqlv_lookup__causeway_applib_DomainObjectList(object: 
causeway_applib_DomainObjectList__gqlv_input): causeway_applib_DomainObjectList
-  _gqlv_lookup__causeway_applib_FacetGroupNode(object: 
causeway_applib_FacetGroupNode__gqlv_input): causeway_applib_FacetGroupNode
-  _gqlv_lookup__causeway_applib_ParameterNode(object: 
causeway_applib_ParameterNode__gqlv_input): causeway_applib_ParameterNode
-  _gqlv_lookup__causeway_applib_PropertyNode(object: 
causeway_applib_PropertyNode__gqlv_input): causeway_applib_PropertyNode
-  _gqlv_lookup__causeway_applib_RoleMemento(object: 
causeway_applib_RoleMemento__gqlv_input): causeway_applib_RoleMemento
-  _gqlv_lookup__causeway_applib_TypeNode(object: 
causeway_applib_TypeNode__gqlv_input): causeway_applib_TypeNode
-  _gqlv_lookup__causeway_applib_UserMemento(object: 
causeway_applib_UserMemento__gqlv_input): causeway_applib_UserMemento
-  _gqlv_lookup__causeway_applib_node_ActionNode(object: 
causeway_applib_node_ActionNode__gqlv_input): causeway_applib_node_ActionNode
-  _gqlv_lookup__causeway_applib_node_CollectionNode(object: 
causeway_applib_node_CollectionNode__gqlv_input): 
causeway_applib_node_CollectionNode
-  _gqlv_lookup__causeway_applib_node_FacetAttrNode(object: 
causeway_applib_node_FacetAttrNode__gqlv_input): 
causeway_applib_node_FacetAttrNode
-  _gqlv_lookup__causeway_applib_node_FacetNode(object: 
causeway_applib_node_FacetNode__gqlv_input): causeway_applib_node_FacetNode
-  _gqlv_lookup__causeway_conf_ConfigurationProperty(object: 
causeway_conf_ConfigurationProperty__gqlv_input): 
causeway_conf_ConfigurationProperty
-  _gqlv_lookup__causeway_conf_ConfigurationViewmodel(object: 
causeway_conf_ConfigurationViewmodel__gqlv_input): 
causeway_conf_ConfigurationViewmodel
-  _gqlv_lookup__causeway_feat_ApplicationFeatureViewModel(object: 
causeway_feat_ApplicationFeatureViewModel__gqlv_input): 
causeway_feat_ApplicationFeatureViewModel
-  _gqlv_lookup__causeway_feat_ApplicationNamespace(object: 
causeway_feat_ApplicationNamespace__gqlv_input): 
causeway_feat_ApplicationNamespace
-  _gqlv_lookup__causeway_feat_ApplicationType(object: 
causeway_feat_ApplicationType__gqlv_input): causeway_feat_ApplicationType
-  _gqlv_lookup__causeway_feat_ApplicationTypeAction(object: 
causeway_feat_ApplicationTypeAction__gqlv_input): 
causeway_feat_ApplicationTypeAction
-  _gqlv_lookup__causeway_feat_ApplicationTypeCollection(object: 
causeway_feat_ApplicationTypeCollection__gqlv_input): 
causeway_feat_ApplicationTypeCollection
-  _gqlv_lookup__causeway_feat_ApplicationTypeMember(object: 
causeway_feat_ApplicationTypeMember__gqlv_input): 
causeway_feat_ApplicationTypeMember
-  _gqlv_lookup__causeway_feat_ApplicationTypeProperty(object: 
causeway_feat_ApplicationTypeProperty__gqlv_input): 
causeway_feat_ApplicationTypeProperty
-  _gqlv_lookup__causeway_schema_metamodel_v2_DomainClassDto(object: 
causeway_schema_metamodel_v2_DomainClassDto__gqlv_input): 
causeway_schema_metamodel_v2_DomainClassDto
-  _gqlv_lookup__causeway_security_LoginRedirect(object: 
causeway_security_LoginRedirect__gqlv_input): causeway_security_LoginRedirect
-  _gqlv_lookup__causeway_testing_fixtures_FixtureResult(object: 
causeway_testing_fixtures_FixtureResult__gqlv_input): 
causeway_testing_fixtures_FixtureResult
-  _gqlv_lookup__java_lang_Runnable(object: java_lang_Runnable__gqlv_input): 
java_lang_Runnable
-  _gqlv_lookup__java_util_Map(object: java_util_Map__gqlv_input): java_util_Map
-  _gqlv_lookup__java_util_SortedMap(object: java_util_SortedMap__gqlv_input): 
java_util_SortedMap
-  _gqlv_lookup__java_util_concurrent_Callable(object: 
java_util_concurrent_Callable__gqlv_input): java_util_concurrent_Callable
-  _gqlv_lookup__java_util_function_BiFunction(object: 
java_util_function_BiFunction__gqlv_input): java_util_function_BiFunction
-  _gqlv_lookup__java_util_function_Consumer(object: 
java_util_function_Consumer__gqlv_input): java_util_function_Consumer
-  _gqlv_lookup__java_util_function_Function(object: 
java_util_function_Function__gqlv_input): java_util_function_Function
-  _gqlv_lookup__java_util_stream_Stream(object: 
java_util_stream_Stream__gqlv_input): java_util_stream_Stream
-  
_gqlv_lookup__org_apache_causeway_core_metamodel_inspect_model_MMNode(object: 
org_apache_causeway_core_metamodel_inspect_model_MMNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MMNode
-  
_gqlv_lookup__org_apache_causeway_core_metamodel_inspect_model_MemberNode(object:
 org_apache_causeway_core_metamodel_inspect_model_MemberNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MemberNode
-  
_gqlv_lookup__org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript(object:
 
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript__gqlv_input):
 org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript
-  _gqlv_lookup__university_dept_Department(object: 
university_dept_Department__gqlv_input): university_dept_Department
-  _gqlv_lookup__university_dept_DeptHead(object: 
university_dept_DeptHead__gqlv_input): university_dept_DeptHead
-  _gqlv_lookup__university_dept_StaffMember(object: 
university_dept_StaffMember__gqlv_input): university_dept_StaffMember
+  causeway_applib_DomainObjectList(object: 
causeway_applib_DomainObjectList__gqlv_input): causeway_applib_DomainObjectList
+  causeway_applib_FacetGroupNode(object: 
causeway_applib_FacetGroupNode__gqlv_input): causeway_applib_FacetGroupNode
+  causeway_applib_ParameterNode(object: 
causeway_applib_ParameterNode__gqlv_input): causeway_applib_ParameterNode
+  causeway_applib_PropertyNode(object: 
causeway_applib_PropertyNode__gqlv_input): causeway_applib_PropertyNode
+  causeway_applib_RoleMemento(object: 
causeway_applib_RoleMemento__gqlv_input): causeway_applib_RoleMemento
+  causeway_applib_TypeNode(object: causeway_applib_TypeNode__gqlv_input): 
causeway_applib_TypeNode
+  causeway_applib_UserMemento(object: 
causeway_applib_UserMemento__gqlv_input): causeway_applib_UserMemento
   causeway_applib_UserMenu: causeway_applib_UserMenu
+  causeway_applib_node_ActionNode(object: 
causeway_applib_node_ActionNode__gqlv_input): causeway_applib_node_ActionNode
+  causeway_applib_node_CollectionNode(object: 
causeway_applib_node_CollectionNode__gqlv_input): 
causeway_applib_node_CollectionNode
+  causeway_applib_node_FacetAttrNode(object: 
causeway_applib_node_FacetAttrNode__gqlv_input): 
causeway_applib_node_FacetAttrNode
+  causeway_applib_node_FacetNode(object: 
causeway_applib_node_FacetNode__gqlv_input): causeway_applib_node_FacetNode
   causeway_conf_ConfigurationMenu: causeway_conf_ConfigurationMenu
+  causeway_conf_ConfigurationProperty(object: 
causeway_conf_ConfigurationProperty__gqlv_input): 
causeway_conf_ConfigurationProperty
+  causeway_conf_ConfigurationViewmodel(object: 
causeway_conf_ConfigurationViewmodel__gqlv_input): 
causeway_conf_ConfigurationViewmodel
+  causeway_feat_ApplicationFeatureViewModel(object: 
causeway_feat_ApplicationFeatureViewModel__gqlv_input): 
causeway_feat_ApplicationFeatureViewModel
+  causeway_feat_ApplicationNamespace(object: 
causeway_feat_ApplicationNamespace__gqlv_input): 
causeway_feat_ApplicationNamespace
+  causeway_feat_ApplicationType(object: 
causeway_feat_ApplicationType__gqlv_input): causeway_feat_ApplicationType
+  causeway_feat_ApplicationTypeAction(object: 
causeway_feat_ApplicationTypeAction__gqlv_input): 
causeway_feat_ApplicationTypeAction
+  causeway_feat_ApplicationTypeCollection(object: 
causeway_feat_ApplicationTypeCollection__gqlv_input): 
causeway_feat_ApplicationTypeCollection
+  causeway_feat_ApplicationTypeMember(object: 
causeway_feat_ApplicationTypeMember__gqlv_input): 
causeway_feat_ApplicationTypeMember
+  causeway_feat_ApplicationTypeProperty(object: 
causeway_feat_ApplicationTypeProperty__gqlv_input): 
causeway_feat_ApplicationTypeProperty
+  causeway_schema_metamodel_v2_DomainClassDto(object: 
causeway_schema_metamodel_v2_DomainClassDto__gqlv_input): 
causeway_schema_metamodel_v2_DomainClassDto
+  causeway_security_LoginRedirect(object: 
causeway_security_LoginRedirect__gqlv_input): causeway_security_LoginRedirect
   causeway_security_LogoutMenu: causeway_security_LogoutMenu
+  causeway_testing_fixtures_FixtureResult(object: 
causeway_testing_fixtures_FixtureResult__gqlv_input): 
causeway_testing_fixtures_FixtureResult
+  java_lang_Runnable(object: java_lang_Runnable__gqlv_input): 
java_lang_Runnable
+  java_util_Map(object: java_util_Map__gqlv_input): java_util_Map
+  java_util_SortedMap(object: java_util_SortedMap__gqlv_input): 
java_util_SortedMap
+  java_util_concurrent_Callable(object: 
java_util_concurrent_Callable__gqlv_input): java_util_concurrent_Callable
+  java_util_function_BiFunction(object: 
java_util_function_BiFunction__gqlv_input): java_util_function_BiFunction
+  java_util_function_Consumer(object: 
java_util_function_Consumer__gqlv_input): java_util_function_Consumer
+  java_util_function_Function(object: 
java_util_function_Function__gqlv_input): java_util_function_Function
+  java_util_stream_Stream(object: java_util_stream_Stream__gqlv_input): 
java_util_stream_Stream
+  org_apache_causeway_core_metamodel_inspect_model_MMNode(object: 
org_apache_causeway_core_metamodel_inspect_model_MMNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MMNode
+  org_apache_causeway_core_metamodel_inspect_model_MemberNode(object: 
org_apache_causeway_core_metamodel_inspect_model_MemberNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MemberNode
+  
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript(object:
 
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript__gqlv_input):
 org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript
   university_admin_AdminMenu: university_admin_AdminMenu
   university_calc_Calculator: university_calc_Calculator
+  university_dept_Department(object: university_dept_Department__gqlv_input): 
university_dept_Department
   university_dept_Departments: university_dept_Departments
+  university_dept_DeptHead(object: university_dept_DeptHead__gqlv_input): 
university_dept_DeptHead
   university_dept_DeptHeads: university_dept_DeptHeads
   university_dept_Staff: university_dept_Staff
+  university_dept_StaffMember(object: 
university_dept_StaffMember__gqlv_input): university_dept_StaffMember
 }
 
 type Scenario {
@@ -79,51 +79,51 @@ type Scenario {
 }
 
 type ScenarioStep {
-  _gqlv_lookup__causeway_applib_DomainObjectList(object: 
causeway_applib_DomainObjectList__gqlv_input): causeway_applib_DomainObjectList
-  _gqlv_lookup__causeway_applib_FacetGroupNode(object: 
causeway_applib_FacetGroupNode__gqlv_input): causeway_applib_FacetGroupNode
-  _gqlv_lookup__causeway_applib_ParameterNode(object: 
causeway_applib_ParameterNode__gqlv_input): causeway_applib_ParameterNode
-  _gqlv_lookup__causeway_applib_PropertyNode(object: 
causeway_applib_PropertyNode__gqlv_input): causeway_applib_PropertyNode
-  _gqlv_lookup__causeway_applib_RoleMemento(object: 
causeway_applib_RoleMemento__gqlv_input): causeway_applib_RoleMemento
-  _gqlv_lookup__causeway_applib_TypeNode(object: 
causeway_applib_TypeNode__gqlv_input): causeway_applib_TypeNode
-  _gqlv_lookup__causeway_applib_UserMemento(object: 
causeway_applib_UserMemento__gqlv_input): causeway_applib_UserMemento
-  _gqlv_lookup__causeway_applib_node_ActionNode(object: 
causeway_applib_node_ActionNode__gqlv_input): causeway_applib_node_ActionNode
-  _gqlv_lookup__causeway_applib_node_CollectionNode(object: 
causeway_applib_node_CollectionNode__gqlv_input): 
causeway_applib_node_CollectionNode
-  _gqlv_lookup__causeway_applib_node_FacetAttrNode(object: 
causeway_applib_node_FacetAttrNode__gqlv_input): 
causeway_applib_node_FacetAttrNode
-  _gqlv_lookup__causeway_applib_node_FacetNode(object: 
causeway_applib_node_FacetNode__gqlv_input): causeway_applib_node_FacetNode
-  _gqlv_lookup__causeway_conf_ConfigurationProperty(object: 
causeway_conf_ConfigurationProperty__gqlv_input): 
causeway_conf_ConfigurationProperty
-  _gqlv_lookup__causeway_conf_ConfigurationViewmodel(object: 
causeway_conf_ConfigurationViewmodel__gqlv_input): 
causeway_conf_ConfigurationViewmodel
-  _gqlv_lookup__causeway_feat_ApplicationFeatureViewModel(object: 
causeway_feat_ApplicationFeatureViewModel__gqlv_input): 
causeway_feat_ApplicationFeatureViewModel
-  _gqlv_lookup__causeway_feat_ApplicationNamespace(object: 
causeway_feat_ApplicationNamespace__gqlv_input): 
causeway_feat_ApplicationNamespace
-  _gqlv_lookup__causeway_feat_ApplicationType(object: 
causeway_feat_ApplicationType__gqlv_input): causeway_feat_ApplicationType
-  _gqlv_lookup__causeway_feat_ApplicationTypeAction(object: 
causeway_feat_ApplicationTypeAction__gqlv_input): 
causeway_feat_ApplicationTypeAction
-  _gqlv_lookup__causeway_feat_ApplicationTypeCollection(object: 
causeway_feat_ApplicationTypeCollection__gqlv_input): 
causeway_feat_ApplicationTypeCollection
-  _gqlv_lookup__causeway_feat_ApplicationTypeMember(object: 
causeway_feat_ApplicationTypeMember__gqlv_input): 
causeway_feat_ApplicationTypeMember
-  _gqlv_lookup__causeway_feat_ApplicationTypeProperty(object: 
causeway_feat_ApplicationTypeProperty__gqlv_input): 
causeway_feat_ApplicationTypeProperty
-  _gqlv_lookup__causeway_schema_metamodel_v2_DomainClassDto(object: 
causeway_schema_metamodel_v2_DomainClassDto__gqlv_input): 
causeway_schema_metamodel_v2_DomainClassDto
-  _gqlv_lookup__causeway_security_LoginRedirect(object: 
causeway_security_LoginRedirect__gqlv_input): causeway_security_LoginRedirect
-  _gqlv_lookup__causeway_testing_fixtures_FixtureResult(object: 
causeway_testing_fixtures_FixtureResult__gqlv_input): 
causeway_testing_fixtures_FixtureResult
-  _gqlv_lookup__java_lang_Runnable(object: java_lang_Runnable__gqlv_input): 
java_lang_Runnable
-  _gqlv_lookup__java_util_Map(object: java_util_Map__gqlv_input): java_util_Map
-  _gqlv_lookup__java_util_SortedMap(object: java_util_SortedMap__gqlv_input): 
java_util_SortedMap
-  _gqlv_lookup__java_util_concurrent_Callable(object: 
java_util_concurrent_Callable__gqlv_input): java_util_concurrent_Callable
-  _gqlv_lookup__java_util_function_BiFunction(object: 
java_util_function_BiFunction__gqlv_input): java_util_function_BiFunction
-  _gqlv_lookup__java_util_function_Consumer(object: 
java_util_function_Consumer__gqlv_input): java_util_function_Consumer
-  _gqlv_lookup__java_util_function_Function(object: 
java_util_function_Function__gqlv_input): java_util_function_Function
-  _gqlv_lookup__java_util_stream_Stream(object: 
java_util_stream_Stream__gqlv_input): java_util_stream_Stream
-  
_gqlv_lookup__org_apache_causeway_core_metamodel_inspect_model_MMNode(object: 
org_apache_causeway_core_metamodel_inspect_model_MMNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MMNode
-  
_gqlv_lookup__org_apache_causeway_core_metamodel_inspect_model_MemberNode(object:
 org_apache_causeway_core_metamodel_inspect_model_MemberNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MemberNode
-  
_gqlv_lookup__org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript(object:
 
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript__gqlv_input):
 org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript
-  _gqlv_lookup__university_dept_Department(object: 
university_dept_Department__gqlv_input): university_dept_Department
-  _gqlv_lookup__university_dept_DeptHead(object: 
university_dept_DeptHead__gqlv_input): university_dept_DeptHead
-  _gqlv_lookup__university_dept_StaffMember(object: 
university_dept_StaffMember__gqlv_input): university_dept_StaffMember
+  causeway_applib_DomainObjectList(object: 
causeway_applib_DomainObjectList__gqlv_input): causeway_applib_DomainObjectList
+  causeway_applib_FacetGroupNode(object: 
causeway_applib_FacetGroupNode__gqlv_input): causeway_applib_FacetGroupNode
+  causeway_applib_ParameterNode(object: 
causeway_applib_ParameterNode__gqlv_input): causeway_applib_ParameterNode
+  causeway_applib_PropertyNode(object: 
causeway_applib_PropertyNode__gqlv_input): causeway_applib_PropertyNode
+  causeway_applib_RoleMemento(object: 
causeway_applib_RoleMemento__gqlv_input): causeway_applib_RoleMemento
+  causeway_applib_TypeNode(object: causeway_applib_TypeNode__gqlv_input): 
causeway_applib_TypeNode
+  causeway_applib_UserMemento(object: 
causeway_applib_UserMemento__gqlv_input): causeway_applib_UserMemento
   causeway_applib_UserMenu: causeway_applib_UserMenu
+  causeway_applib_node_ActionNode(object: 
causeway_applib_node_ActionNode__gqlv_input): causeway_applib_node_ActionNode
+  causeway_applib_node_CollectionNode(object: 
causeway_applib_node_CollectionNode__gqlv_input): 
causeway_applib_node_CollectionNode
+  causeway_applib_node_FacetAttrNode(object: 
causeway_applib_node_FacetAttrNode__gqlv_input): 
causeway_applib_node_FacetAttrNode
+  causeway_applib_node_FacetNode(object: 
causeway_applib_node_FacetNode__gqlv_input): causeway_applib_node_FacetNode
   causeway_conf_ConfigurationMenu: causeway_conf_ConfigurationMenu
+  causeway_conf_ConfigurationProperty(object: 
causeway_conf_ConfigurationProperty__gqlv_input): 
causeway_conf_ConfigurationProperty
+  causeway_conf_ConfigurationViewmodel(object: 
causeway_conf_ConfigurationViewmodel__gqlv_input): 
causeway_conf_ConfigurationViewmodel
+  causeway_feat_ApplicationFeatureViewModel(object: 
causeway_feat_ApplicationFeatureViewModel__gqlv_input): 
causeway_feat_ApplicationFeatureViewModel
+  causeway_feat_ApplicationNamespace(object: 
causeway_feat_ApplicationNamespace__gqlv_input): 
causeway_feat_ApplicationNamespace
+  causeway_feat_ApplicationType(object: 
causeway_feat_ApplicationType__gqlv_input): causeway_feat_ApplicationType
+  causeway_feat_ApplicationTypeAction(object: 
causeway_feat_ApplicationTypeAction__gqlv_input): 
causeway_feat_ApplicationTypeAction
+  causeway_feat_ApplicationTypeCollection(object: 
causeway_feat_ApplicationTypeCollection__gqlv_input): 
causeway_feat_ApplicationTypeCollection
+  causeway_feat_ApplicationTypeMember(object: 
causeway_feat_ApplicationTypeMember__gqlv_input): 
causeway_feat_ApplicationTypeMember
+  causeway_feat_ApplicationTypeProperty(object: 
causeway_feat_ApplicationTypeProperty__gqlv_input): 
causeway_feat_ApplicationTypeProperty
+  causeway_schema_metamodel_v2_DomainClassDto(object: 
causeway_schema_metamodel_v2_DomainClassDto__gqlv_input): 
causeway_schema_metamodel_v2_DomainClassDto
+  causeway_security_LoginRedirect(object: 
causeway_security_LoginRedirect__gqlv_input): causeway_security_LoginRedirect
   causeway_security_LogoutMenu: causeway_security_LogoutMenu
+  causeway_testing_fixtures_FixtureResult(object: 
causeway_testing_fixtures_FixtureResult__gqlv_input): 
causeway_testing_fixtures_FixtureResult
+  java_lang_Runnable(object: java_lang_Runnable__gqlv_input): 
java_lang_Runnable
+  java_util_Map(object: java_util_Map__gqlv_input): java_util_Map
+  java_util_SortedMap(object: java_util_SortedMap__gqlv_input): 
java_util_SortedMap
+  java_util_concurrent_Callable(object: 
java_util_concurrent_Callable__gqlv_input): java_util_concurrent_Callable
+  java_util_function_BiFunction(object: 
java_util_function_BiFunction__gqlv_input): java_util_function_BiFunction
+  java_util_function_Consumer(object: 
java_util_function_Consumer__gqlv_input): java_util_function_Consumer
+  java_util_function_Function(object: 
java_util_function_Function__gqlv_input): java_util_function_Function
+  java_util_stream_Stream(object: java_util_stream_Stream__gqlv_input): 
java_util_stream_Stream
+  org_apache_causeway_core_metamodel_inspect_model_MMNode(object: 
org_apache_causeway_core_metamodel_inspect_model_MMNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MMNode
+  org_apache_causeway_core_metamodel_inspect_model_MemberNode(object: 
org_apache_causeway_core_metamodel_inspect_model_MemberNode__gqlv_input): 
org_apache_causeway_core_metamodel_inspect_model_MemberNode
+  
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript(object:
 
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript__gqlv_input):
 org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript
   university_admin_AdminMenu: university_admin_AdminMenu
   university_calc_Calculator: university_calc_Calculator
+  university_dept_Department(object: university_dept_Department__gqlv_input): 
university_dept_Department
   university_dept_Departments: university_dept_Departments
+  university_dept_DeptHead(object: university_dept_DeptHead__gqlv_input): 
university_dept_DeptHead
   university_dept_DeptHeads: university_dept_DeptHeads
   university_dept_Staff: university_dept_Staff
+  university_dept_StaffMember(object: 
university_dept_StaffMember__gqlv_input): university_dept_StaffMember
 }
 
 type causeway_applib_DomainObjectList {
@@ -470,6 +470,7 @@ type causeway_applib_UserMenu {
   me: causeway_applib_UserMenu__me__gqlv_action
 }
 
+"Returns your user account details"
 type causeway_applib_UserMenu__me__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2009,6 +2010,7 @@ type 
university_calc_Calculator__plusJodaDays__numDays__gqlv_action_parameter {
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Department {
   _gqlv_meta: university_dept_Department__gqlv_meta
   addStaffMember: university_dept_Department__addStaffMember__gqlv_action
@@ -2021,6 +2023,7 @@ type university_dept_Department {
   staffMembers: university_dept_Department__staffMembers__gqlv_collection
 }
 
+"University department specializing in a field of study"
 type university_dept_Department__addStaffMember__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2040,6 +2043,7 @@ type 
university_dept_Department__addStaffMember__staffMember__gqlv_action_parame
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Department__addStaffMembers__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2059,6 +2063,7 @@ type 
university_dept_Department__addStaffMembers__staffMembers__gqlv_action_para
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Department__changeDeptHead__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2079,6 +2084,7 @@ type 
university_dept_Department__changeDeptHead__newDeptHead__gqlv_action_parame
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Department__changeName__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2098,6 +2104,7 @@ type 
university_dept_Department__changeName__newName__gqlv_action_parameter {
   validity: String
 }
 
+"Departmental head, responsible for curriculum, research, funding and staff"
 type university_dept_Department__deptHead__gqlv_property {
   autoComplete(search: String!): [university_dept_DeptHead]
   disabled: String
@@ -2122,6 +2129,7 @@ type university_dept_Department__name__gqlv_property {
   validate(name: String): String
 }
 
+"University department specializing in a field of study"
 type university_dept_Department__removeStaffMember__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2141,6 +2149,7 @@ type 
university_dept_Department__removeStaffMember__staffMember__gqlv_action_par
   validity: String
 }
 
+"Staff member of a university department, responsible for delivering lectures, 
tutorials, exam invigilation and candidate interviews"
 type university_dept_Department__staffMembers__gqlv_collection {
   disabled: String
   get: [university_dept_StaffMember]
@@ -2160,6 +2169,7 @@ type 
university_dept_Departments__createDepartment__deptHead__gqlv_action_parame
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Departments__createDepartment__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2179,6 +2189,7 @@ type 
university_dept_Departments__createDepartment__name__gqlv_action_parameter
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Departments__findAllDepartments__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2186,6 +2197,7 @@ type 
university_dept_Departments__findAllDepartments__gqlv_action {
   validate: String
 }
 
+"University department specializing in a field of study"
 type university_dept_Departments__findDepartmentByName__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2204,6 +2216,7 @@ type 
university_dept_Departments__findDepartmentByName__name__gqlv_action_parame
   validity: String
 }
 
+"Departmental head, responsible for curriculum, research, funding and staff"
 type university_dept_DeptHead {
   _gqlv_meta: university_dept_DeptHead__gqlv_meta
   changeDepartment: university_dept_DeptHead__changeDepartment__gqlv_action
@@ -2219,6 +2232,7 @@ type 
university_dept_DeptHead__changeDepartment__department__gqlv_action_paramet
   validity: String
 }
 
+"Departmental head, responsible for curriculum, research, funding and staff"
 type university_dept_DeptHead__changeDepartment__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2231,6 +2245,7 @@ type 
university_dept_DeptHead__changeDepartment__gqlv_action_params {
   department: 
university_dept_DeptHead__changeDepartment__department__gqlv_action_parameter
 }
 
+"Departmental head, responsible for curriculum, research, funding and staff"
 type university_dept_DeptHead__changeName__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2250,6 +2265,7 @@ type 
university_dept_DeptHead__changeName__newName__gqlv_action_parameter {
   validity: String
 }
 
+"University department specializing in a field of study"
 type university_dept_DeptHead__department__gqlv_property {
   choices(department: university_dept_Department__gqlv_input): 
[university_dept_Department]
   disabled: String
@@ -2279,6 +2295,7 @@ type university_dept_DeptHeads {
   findHeadByName: university_dept_DeptHeads__findHeadByName__gqlv_action
 }
 
+"Departmental head, responsible for curriculum, research, funding and staff"
 type university_dept_DeptHeads__findAllHeads__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2286,6 +2303,7 @@ type university_dept_DeptHeads__findAllHeads__gqlv_action 
{
   validate: String
 }
 
+"Departmental head, responsible for curriculum, research, funding and staff"
 type university_dept_DeptHeads__findHeadByName__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2310,6 +2328,7 @@ type university_dept_Staff {
   findStaffMemberByName: 
university_dept_Staff__findStaffMemberByName__gqlv_action
 }
 
+"Staff member of a university department, responsible for delivering lectures, 
tutorials, exam invigilation and candidate interviews"
 type university_dept_StaffMember {
   _gqlv_meta: university_dept_StaffMember__gqlv_meta
   department: university_dept_StaffMember__department__gqlv_property
@@ -2318,6 +2337,7 @@ type university_dept_StaffMember {
   photo: university_dept_StaffMember__photo__gqlv_property
 }
 
+"University department specializing in a field of study"
 type university_dept_StaffMember__department__gqlv_property {
   choices(department: university_dept_Department__gqlv_input): 
[university_dept_Department]
   disabled: String
@@ -2366,6 +2386,7 @@ type 
university_dept_Staff__createStaffMember__department__gqlv_action_parameter
   validity: String
 }
 
+"Staff member of a university department, responsible for delivering lectures, 
tutorials, exam invigilation and candidate interviews"
 type university_dept_Staff__createStaffMember__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2385,6 +2406,7 @@ type 
university_dept_Staff__createStaffMember__name__gqlv_action_parameter {
   validity: String
 }
 
+"Staff member of a university department, responsible for delivering lectures, 
tutorials, exam invigilation and candidate interviews"
 type university_dept_Staff__findAllStaffMembers__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2392,6 +2414,7 @@ type 
university_dept_Staff__findAllStaffMembers__gqlv_action {
   validate: String
 }
 
+"Staff member of a university department, responsible for delivering lectures, 
tutorials, exam invigilation and candidate interviews"
 type university_dept_Staff__findStaffMemberByName__gqlv_action {
   disabled: String
   hidden: Boolean
@@ -2411,149 +2434,186 @@ type 
university_dept_Staff__findStaffMemberByName__name__gqlv_action_parameter {
 }
 
 input causeway_applib_DomainObjectList__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_FacetGroupNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_ParameterNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_PropertyNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_RoleMemento__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_TypeNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_UserMemento__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_node_ActionNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_node_CollectionNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_node_FacetAttrNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_applib_node_FacetNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_conf_ConfigurationProperty__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_conf_ConfigurationViewmodel__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationFeatureViewModel__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationNamespace__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationTypeAction__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationTypeCollection__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationTypeMember__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationTypeProperty__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_feat_ApplicationType__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_schema_metamodel_v2_DomainClassDto__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_security_LoginRedirect__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input causeway_testing_fixtures_FixtureResult__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_lang_Runnable__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_Map__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_SortedMap__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_concurrent_Callable__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_function_BiFunction__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_function_Consumer__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_function_Function__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input java_util_stream_Stream__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input org_apache_causeway_core_metamodel_inspect_model_MMNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input org_apache_causeway_core_metamodel_inspect_model_MemberNode__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input 
org_apache_causeway_testing_fixtures_applib_fixturescripts_FixtureScript__gqlv_input
 {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input university_dept_Department__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input university_dept_DeptHead__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }
 
 input university_dept_StaffMember__gqlv_input {
-  id: ID!
+  id: ID
+  ref: String
 }

Reply via email to