From 31f562f315b31b638fc857cf254a27db51c78c53 Mon Sep 17 00:00:00 2001 From: Rustam_Lotsmanenko <Rustam_Lotsmanenko@epam.com> Date: Sat, 1 May 2021 18:08:09 +0400 Subject: [PATCH] support array of complex types processing for Items with ref or allOf --- .../schema/converter/PropertiesProcessor.java | 76 +++++++++---------- .../indexer/schema/converter/tags/Items.java | 11 +++ .../schema/converter/tags/TypeProperty.java | 2 +- .../converter/PropertiesProcessorTest.java | 4 +- .../resources/converter/basic/schema.json.res | 36 +++++++++ .../colons-sample.json.res | 8 ++ 6 files changed, 92 insertions(+), 45 deletions(-) diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessor.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessor.java index 0c57b5604..1cf63e8d9 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessor.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessor.java @@ -17,6 +17,7 @@ package org.opengroup.osdu.indexer.schema.converter; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; @@ -173,50 +174,11 @@ public class PropertiesProcessor { if ("array".equals(entry.getValue().getType())) { Items items = entry.getValue().getItems(); - if(Objects.isNull(items)){ - return Stream.empty(); + if(Objects.nonNull(items) && items.isComplexTypeItems()){ + return processComplexTypeItems(entry, items); } - if(Objects.nonNull(items.getProperties()) && !items.getProperties().isEmpty()){ - Map<String, String> type = entry.getValue().getIndexingType(); - String indexingType = Objects.isNull(type) ? - schemaConverterConfig.getDefaultObjectArraysType() : - type.getOrDefault(TYPE_KEY,schemaConverterConfig.getDefaultObjectArraysType()); - /*Schema item inner properties will be processed if they are present & indexingType in schema configured for processing - result ex: - { - path = ArrayItem, - kind = nested, - properties = [{ - path = InnerProperty, - kind = double - }, { - path = OtherInnerProperty, - kind = string - } - ] - } - */ - if(schemaConverterConfig.getProcessedArraysTypes().contains(indexingType)){ - PropertiesProcessor propertiesProcessor = new PropertiesProcessor(definitions, log, new SchemaConverterPropertiesConfig()); - return storageSchemaObjectArrayEntry( - indexingType, - entry.getKey(), - items.getProperties().entrySet().stream().flatMap(propertiesProcessor::processPropertyEntry)); - - /*Otherwise inner properties won't be processed - result ex: - { - path = ArrayItem, - kind = []object - } - */ - }else { - return storageSchemaEntry(indexingType, pathPrefixWithDot + entry.getKey()); - } - } - - if (schemaConverterConfig.getSupportedArrayTypes().contains(items.getType()) && Objects.isNull(items.getProperties())) { + if (schemaConverterConfig.getSupportedArrayTypes().contains(items.getType()) && !items.isComplexTypeItems()) { return storageSchemaEntry("[]" + getTypeByDefinitionProperty(entry.getValue()), pathPrefixWithDot + entry.getKey()); } @@ -243,6 +205,36 @@ public class PropertiesProcessor { return storageSchemaEntry(getTypeByDefinitionProperty(entry.getValue()), pathPrefixWithDot + entry.getKey()); } + private Stream<Map<String, Object>> processComplexTypeItems(Entry<String, TypeProperty> entry, Items items) { + Map<String, String> indexHint = entry.getValue().getIndexHint(); + + String indexingType = Objects.isNull(indexHint) ? + schemaConverterConfig.getDefaultObjectArraysType() : + indexHint.getOrDefault(TYPE_KEY,schemaConverterConfig.getDefaultObjectArraysType()); + + if(schemaConverterConfig.getProcessedArraysTypes().contains(indexingType)){ + PropertiesProcessor propertiesProcessor = new PropertiesProcessor(definitions, log, new SchemaConverterPropertiesConfig()); + + Stream<Map<String, Object>> propertiesStream = Stream.empty(); + + if(Objects.nonNull(items.getProperties())){ + propertiesStream = items.getProperties().entrySet().stream().flatMap(propertiesProcessor::processPropertyEntry); + } + if (Objects.nonNull(items.getRef())){ + propertiesStream = Stream.concat(propertiesStream, propertiesProcessor.processRef(items.getRef())); + } + if(Objects.nonNull(items.getAllOf())){ + propertiesStream = Stream.concat(propertiesStream, items.getAllOf().stream().flatMap(propertiesProcessor::processItem)); + } + return storageSchemaObjectArrayEntry( + indexingType, + entry.getKey(), + propertiesStream); + }else { + return storageSchemaEntry(indexingType, pathPrefixWithDot + entry.getKey()); + } + } + private Stream<Map<String, Object>> processOfItems(Map.Entry<String, TypeProperty> entry) { Stream<Map<String, Object>> ofItems = null; diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/Items.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/Items.java index 21721ccad..ed1678cf0 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/Items.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/Items.java @@ -14,12 +14,23 @@ package org.opengroup.osdu.indexer.schema.converter.tags; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; import java.util.Map; +import java.util.Objects; import lombok.Data; @Data public class Items { + @JsonProperty("$ref") + private String ref; + private List<AllOfItem> allOf; private String type; private String pattern; private Map<String, TypeProperty> properties; + + public boolean isComplexTypeItems(){ + return Objects.nonNull(ref) || Objects.nonNull(allOf) || Objects.nonNull(properties); + } + } diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/TypeProperty.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/TypeProperty.java index 91d10c555..d06a47c26 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/TypeProperty.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/schema/converter/tags/TypeProperty.java @@ -22,7 +22,7 @@ import lombok.Data; @Data public class TypeProperty { @JsonProperty("x-osdu-indexing") - private Map<String, String> indexingType; + private Map<String, String> indexHint; private String type; private String pattern; private String format; diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessorTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessorTest.java index 837e203f4..3789a250e 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessorTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/schema/converter/PropertiesProcessorTest.java @@ -117,7 +117,7 @@ public class PropertiesProcessorTest { items.setProperties(itemsProperties); TypeProperty arrayProperty = new TypeProperty(); - arrayProperty.setIndexingType(ImmutableMap.of("type","nested")); + arrayProperty.setIndexHint(ImmutableMap.of("type","nested")); arrayProperty.setType("array"); arrayProperty.setItems(items); @@ -145,7 +145,7 @@ public class PropertiesProcessorTest { items.setProperties(itemsProperties); TypeProperty arrayProperty = new TypeProperty(); - arrayProperty.setIndexingType(ImmutableMap.of("type","flattened")); + arrayProperty.setIndexHint(ImmutableMap.of("type","flattened")); arrayProperty.setType("array"); arrayProperty.setItems(items); diff --git a/indexer-core/src/test/resources/converter/basic/schema.json.res b/indexer-core/src/test/resources/converter/basic/schema.json.res index 416ac54e5..e3b4fd5f3 100644 --- a/indexer-core/src/test/resources/converter/basic/schema.json.res +++ b/indexer-core/src/test/resources/converter/basic/schema.json.res @@ -132,6 +132,42 @@ { "kind": "link", "path": "GeographicBottomHoleLocation.SpatialGeometryTypeID" + }, + { + "path": "VerticalMeasurements", + "kind": "[]object" + }, + { + "path": "DrillingReason", + "kind": "[]object" + }, + { + "path": "FacilityNameAlias", + "kind": "[]object" + }, + { + "path": "FacilityState", + "kind": "[]object" + }, + { + "path": "FacilityEvent", + "kind": "[]object" + }, + { + "path": "FacilitySpecification", + "kind": "[]object" + }, + { + "path": "FacilityOperator", + "kind": "[]object" + }, + { + "path": "SpatialLocation", + "kind": "[]object" + }, + { + "path": "GeoContexts", + "kind": "[]object" } ] } \ No newline at end of file diff --git a/indexer-core/src/test/resources/converter/new-definitions-format/colons-sample.json.res b/indexer-core/src/test/resources/converter/new-definitions-format/colons-sample.json.res index 8f3ca4d72..4c099bb32 100644 --- a/indexer-core/src/test/resources/converter/new-definitions-format/colons-sample.json.res +++ b/indexer-core/src/test/resources/converter/new-definitions-format/colons-sample.json.res @@ -72,6 +72,14 @@ { "path": "VersionCreationReason", "kind": "string" + }, + { + "path": "GeoContexts", + "kind": "[]object" + }, + { + "path": "NameAliases", + "kind": "[]object" } ] } \ No newline at end of file -- GitLab