You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by as...@apache.org on 2021/06/04 15:01:32 UTC

[unomi] 01/01: UNOMI-490 Fix schema generation for event types without properties

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

asi pushed a commit to branch UNOMI-490
in repository https://gitbox.apache.org/repos/asf/unomi.git

commit 7a05ade1c14a9f3b589127f65a2431c5a333799a
Author: Anatol Sialitski <as...@enonic.com>
AuthorDate: Fri Jun 4 18:00:51 2021 +0300

    UNOMI-490 Fix schema generation for event types without properties
---
 .../graphql/schema/GraphQLSchemaProvider.java      | 116 +++++++++++++--------
 1 file changed, 74 insertions(+), 42 deletions(-)

diff --git a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/schema/GraphQLSchemaProvider.java b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/schema/GraphQLSchemaProvider.java
index 8ea7193..9d9858e 100644
--- a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/schema/GraphQLSchemaProvider.java
+++ b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/schema/GraphQLSchemaProvider.java
@@ -267,7 +267,10 @@ public class GraphQLSchemaProvider {
                     objectType = (GraphQLInputObjectType) getFromTypeRegistry(typeName);
                     registerDynamicInputFields(typeName, objectType, unomiEventType.getPropertyTypes());
                 }
-                schemaBuilder.additionalType(objectType);
+
+                if (objectType != null) {
+                    schemaBuilder.additionalType(objectType);
+                }
             }
         }
     }
@@ -288,7 +291,10 @@ public class GraphQLSchemaProvider {
                     objectType = (GraphQLObjectType) getFromTypeRegistry(typeName);
                     registerDynamicOutputFields(typeName, objectType, CustomerPropertyDataFetcher.class, unomiEventType.getPropertyTypes());
                 }
-                schemaBuilder.additionalType(objectType);
+
+                if (objectType != null) {
+                    schemaBuilder.additionalType(objectType);
+                }
             }
         }
     }
@@ -329,16 +335,18 @@ public class GraphQLSchemaProvider {
             if ("set".equals(propertyType.getValueTypeId())) {
                 final String typeName = StringUtils.capitalize(propertyName);
 
-                GraphQLObjectType objectType;
                 if (!graphQLAnnotations.getContainer().getTypeRegistry().containsKey(typeName)) {
-                    objectType = createDynamicSetOutputType(propertyType, codeRegisterBuilder, null);
+                    GraphQLObjectType objectType = createDynamicSetOutputType(propertyType, codeRegisterBuilder, null);
+                    if (objectType != null) {
+                        fieldDefinitions.add(GraphQLFieldDefinition.newFieldDefinition()
+                                .type(objectType)
+                                .name(propertyName).build());
+                    }
                 } else {
-                    objectType = (GraphQLObjectType) getFromTypeRegistry(typeName);
+                    fieldDefinitions.add(GraphQLFieldDefinition.newFieldDefinition()
+                            .type((GraphQLObjectType) getFromTypeRegistry(typeName))
+                            .name(propertyName).build());
                 }
-
-                fieldDefinitions.add(GraphQLFieldDefinition.newFieldDefinition()
-                        .type(objectType)
-                        .name(propertyName).build());
             } else {
                 fieldDefinitions.add(GraphQLFieldDefinition.newFieldDefinition()
                         .type((GraphQLOutputType) UnomiToGraphQLConverter.convertPropertyType(propertyType.getValueTypeId()))
@@ -353,9 +361,11 @@ public class GraphQLSchemaProvider {
             }
         });
 
-        final GraphQLObjectType transformedObjectType = graphQLObjectType.transform(builder -> fieldDefinitions.forEach(builder::field));
+        if (!fieldDefinitions.isEmpty()) {
+            final GraphQLObjectType transformedObjectType = graphQLObjectType.transform(builder -> fieldDefinitions.forEach(builder::field));
 
-        registerInTypeRegistry(graphQLTypeName, transformedObjectType);
+            registerInTypeRegistry(graphQLTypeName, transformedObjectType);
+        }
     }
 
     private GraphQLObjectType createDynamicSetOutputType(
@@ -378,13 +388,15 @@ public class GraphQLSchemaProvider {
         final GraphQLObjectType.Builder dynamicTypeBuilder = GraphQLObjectType.newObject()
                 .name(typeName);
 
+        final List<GraphQLFieldDefinition> fieldDefinitions = new ArrayList<>();
+
         if (interfaces != null && !interfaces.isEmpty()) {
             for (Class anInterface : interfaces) {
                 final GraphQLInterfaceType graphQLInterface = (GraphQLInterfaceType) getOutputType(anInterface);
                 if (graphQLInterface != null) {
                     dynamicTypeBuilder.withInterface(graphQLInterface);
                     graphQLInterface.getFieldDefinitions().forEach(fieldDefinition -> {
-                        dynamicTypeBuilder.field(fieldDefinition);
+                        fieldDefinitions.add(fieldDefinition);
 
                         final String propertyName = fieldDefinition.getName();
                         final DataFetcher dataFetcher = new CustomEventOrSetPropertyDataFetcher(propertyName);
@@ -399,26 +411,33 @@ public class GraphQLSchemaProvider {
                 final boolean isSet = "set".equals(childPropertyType.getValueTypeId());
                 String childPropertyName = PropertyNameTranslator.translateFromUnomiToGraphQL(childPropertyType.getItemId());
 
-                final GraphQLFieldDefinition.Builder fieldBuilder = GraphQLFieldDefinition.newFieldDefinition()
-                        .name(childPropertyName);
-
+                GraphQLOutputType objectType = null;
                 if (isSet) {
-                    fieldBuilder.type(createDynamicSetOutputType(childPropertyType, codeRegisterBuilder, typeName + "_" + childPropertyName));
+                    objectType = createDynamicSetOutputType(childPropertyType, codeRegisterBuilder, typeName + "_" + childPropertyName);
                 } else {
-                    fieldBuilder.type((GraphQLOutputType) UnomiToGraphQLConverter.convertPropertyType(childPropertyType.getValueTypeId()));
+                    objectType = (GraphQLOutputType) UnomiToGraphQLConverter.convertPropertyType(childPropertyType.getValueTypeId());
                 }
-                codeRegisterBuilder.dataFetcher(FieldCoordinates.coordinates(typeName, childPropertyName),
-                        new CustomEventOrSetPropertyDataFetcher(childPropertyName));
 
-                dynamicTypeBuilder.field(fieldBuilder.build());
+                if (objectType != null) {
+                    fieldDefinitions.add(GraphQLFieldDefinition.newFieldDefinition()
+                            .name(childPropertyName)
+                            .type(objectType)
+                            .build());
+
+                    codeRegisterBuilder.dataFetcher(FieldCoordinates.coordinates(typeName, childPropertyName),
+                            new CustomEventOrSetPropertyDataFetcher(childPropertyName));
+                }
             });
         }
 
-        final GraphQLObjectType objectType = dynamicTypeBuilder.build();
-
-        registerInTypeRegistry(typeName, objectType);
+        if (!fieldDefinitions.isEmpty()) {
+            fieldDefinitions.forEach(dynamicTypeBuilder::field);
+            final GraphQLObjectType objectType = dynamicTypeBuilder.build();
+            registerInTypeRegistry(typeName, objectType);
+            return objectType;
+        }
 
-        return objectType;
+        return null;
     }
 
     private GraphQLInputObjectType createDynamicEventInputType(final EventType eventType) {
@@ -441,29 +460,37 @@ public class GraphQLSchemaProvider {
             );
         }
 
+        final List<GraphQLInputObjectField> fieldDefinitions = new ArrayList<>();
+
         if (propertyTypes != null && !propertyTypes.isEmpty()) {
             propertyTypes.forEach(childPropertyType -> {
                 final boolean isSet = "set".equals(childPropertyType.getValueTypeId());
                 String childPropertyName = PropertyNameTranslator.translateFromUnomiToGraphQL(childPropertyType.getItemId());
 
-                final GraphQLInputObjectField.Builder fieldBuilder = GraphQLInputObjectField.newInputObjectField()
-                        .name(childPropertyName);
-
+                GraphQLInputType objectType;
                 if (isSet) {
-                    fieldBuilder.type(createDynamicSetInputType(childPropertyType, typeName + "_" + childPropertyName));
+                    objectType = createDynamicSetInputType(childPropertyType, typeName + "_" + childPropertyName);
                 } else {
-                    fieldBuilder.type((GraphQLInputType) UnomiToGraphQLConverter.convertPropertyType(childPropertyType.getValueTypeId()));
+                    objectType = (GraphQLInputType) UnomiToGraphQLConverter.convertPropertyType(childPropertyType.getValueTypeId());
                 }
 
-                dynamicTypeBuilder.field(fieldBuilder.build());
+                if (objectType != null) {
+                    fieldDefinitions.add(GraphQLInputObjectField.newInputObjectField()
+                            .name(childPropertyName)
+                            .type(objectType)
+                            .build());
+                }
             });
         }
 
-        final GraphQLInputObjectType objectType = dynamicTypeBuilder.build();
-
-        registerInTypeRegistry(typeName, objectType);
-
-        return objectType;
+        if (!fieldDefinitions.isEmpty()) {
+            fieldDefinitions.forEach(dynamicTypeBuilder::field);
+            final GraphQLInputObjectType objectType = dynamicTypeBuilder.build();
+            registerInTypeRegistry(typeName, objectType);
+            return objectType;
+        } else {
+            return null;
+        }
     }
 
     private void registerDynamicInputFields(final String graphQLTypeName,
@@ -485,10 +512,13 @@ public class GraphQLSchemaProvider {
                 final String typeName = StringUtils.capitalize(propertyName) + "Input";
 
                 if (!graphQLAnnotations.getContainer().getTypeRegistry().containsKey(typeName)) {
-                    fieldDefinitions.add(GraphQLInputObjectField.newInputObjectField()
-                            .name(propertyName)
-                            .type(createDynamicSetInputType(propertyType, null))
-                            .build());
+                    final GraphQLInputObjectType inputType = createDynamicSetInputType(propertyType, null);
+                    if (inputType != null) {
+                        fieldDefinitions.add(GraphQLInputObjectField.newInputObjectField()
+                                .name(propertyName)
+                                .type(inputType)
+                                .build());
+                    }
                 } else {
                     fieldDefinitions.add(GraphQLInputObjectField.newInputObjectField()
                             .name(propertyName)
@@ -503,10 +533,12 @@ public class GraphQLSchemaProvider {
             }
         });
 
-        final GraphQLInputObjectType transformedObjectType = graphQLInputObjectType
-                .transform(builder -> fieldDefinitions.forEach(builder::field));
+        if (!fieldDefinitions.isEmpty()) {
+            final GraphQLInputObjectType transformedObjectType = graphQLInputObjectType
+                    .transform(builder -> fieldDefinitions.forEach(builder::field));
 
-        registerInTypeRegistry(graphQLTypeName, transformedObjectType);
+            registerInTypeRegistry(graphQLTypeName, transformedObjectType);
+        }
     }
 
     private void registerDynamicEventInputFields() {