Filter on private properties of CM Handles
[cps.git] / cps-ncmp-service / src / main / java / org / onap / cps / ncmp / api / impl / NetworkCmProxyCmHandlerQueryServiceImpl.java
index 1674c52..a8fc6d7 100644 (file)
 
 package org.onap.cps.ncmp.api.impl;
 
+import static org.onap.cps.ncmp.api.impl.utils.RestQueryParametersValidator.validateCpsPathConditionProperties;
+import static org.onap.cps.ncmp.api.impl.utils.RestQueryParametersValidator.validateModuleNameConditionProperties;
 import static org.onap.cps.ncmp.api.impl.utils.YangDataConverter.convertYangModelCmHandleToNcmpServiceCmHandle;
 import static org.onap.cps.spi.FetchDescendantsOption.FETCH_DIRECT_CHILDREN_ONLY;
 import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS;
-import static org.onap.cps.utils.CmHandleQueryRestParametersValidator.validateCpsPathConditionProperties;
-import static org.onap.cps.utils.CmHandleQueryRestParametersValidator.validateModuleNameConditionProperties;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -40,16 +40,18 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.onap.cps.cpspath.parser.PathParsingException;
 import org.onap.cps.ncmp.api.NetworkCmProxyCmHandlerQueryService;
+import org.onap.cps.ncmp.api.impl.utils.CmHandleQueryConditions;
+import org.onap.cps.ncmp.api.impl.utils.InventoryQueryConditions;
 import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
 import org.onap.cps.ncmp.api.inventory.CmHandleQueries;
 import org.onap.cps.ncmp.api.inventory.InventoryPersistence;
+import org.onap.cps.ncmp.api.inventory.enums.PropertyType;
+import org.onap.cps.ncmp.api.models.CmHandleQueryServiceParameters;
 import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle;
 import org.onap.cps.spi.exceptions.DataValidationException;
 import org.onap.cps.spi.model.Anchor;
-import org.onap.cps.spi.model.CmHandleQueryServiceParameters;
 import org.onap.cps.spi.model.ConditionProperties;
 import org.onap.cps.spi.model.DataNode;
-import org.onap.cps.utils.ValidQueryProperties;
 import org.springframework.stereotype.Service;
 
 @Service
@@ -113,6 +115,92 @@ public class NetworkCmProxyCmHandlerQueryServiceImpl implements NetworkCmProxyCm
         return moduleNameQueryResult;
     }
 
+    @Override
+    public Set<String> queryCmHandleIdsForInventory(
+            final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+
+        if (cmHandleQueryServiceParameters.getCmHandleQueryParameters().isEmpty()) {
+            return getAllCmHandleIds();
+        }
+
+        final Map<String, NcmpServiceCmHandle> publicPropertiesQueryResult = queryCmHandlesByPublicProperties(
+                cmHandleQueryServiceParameters);
+        if (publicPropertiesQueryResult != null && publicPropertiesQueryResult.isEmpty()) {
+            return Collections.emptySet();
+        }
+
+        final Map<String, NcmpServiceCmHandle> privatePropertiesQueryResult = queryCmHandlesByPrivateProperties(
+                cmHandleQueryServiceParameters);
+        if (privatePropertiesQueryResult != null && privatePropertiesQueryResult.isEmpty()) {
+            return Collections.emptySet();
+        }
+
+        final Map<String, NcmpServiceCmHandle> dmiPropertiesQueryResult = queryCmHandlesByDmiPlugin(
+                cmHandleQueryServiceParameters);
+        if (dmiPropertiesQueryResult != null && dmiPropertiesQueryResult.isEmpty()) {
+            return Collections.emptySet();
+        }
+
+        final Map<String, NcmpServiceCmHandle> combinedResult =
+              combineQueryResults(publicPropertiesQueryResult, privatePropertiesQueryResult, dmiPropertiesQueryResult);
+
+        return combinedResult.keySet();
+    }
+
+    private Map<String, NcmpServiceCmHandle> queryCmHandlesByDmiPlugin(
+            final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+        final Map<String, String> dmiPropertyQueryPairs =
+                getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+                        InventoryQueryConditions.CM_HANDLE_WITH_DMI_PLUGIN.getName());
+        if (dmiPropertyQueryPairs.isEmpty()) {
+            return NO_QUERY_TO_EXECUTE;
+        }
+
+        final String dmiPluginIdentifierValue = dmiPropertyQueryPairs.get(
+                PropertyType.DMI_PLUGIN.getYangContainerName());
+
+        final Set<NcmpServiceCmHandle> cmHandlesByDmiPluginIdentifier = cmHandleQueries
+                .getCmHandlesByDmiPluginIdentifier(dmiPluginIdentifierValue);
+
+        return cmHandlesByDmiPluginIdentifier.stream()
+                .collect(Collectors.toMap(NcmpServiceCmHandle::getCmHandleId, cmH -> cmH));
+    }
+
+    private Map<String, NcmpServiceCmHandle> queryCmHandlesByPrivateProperties(
+            final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+
+        final Map<String, String> privatePropertyQueryPairs =
+                getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+                        InventoryQueryConditions.HAS_ALL_ADDITIONAL_PROPERTIES.getName());
+
+        return privatePropertyQueryPairs.isEmpty()
+                ? NO_QUERY_TO_EXECUTE
+                : cmHandleQueries.queryCmHandleAdditionalProperties(privatePropertyQueryPairs);
+    }
+
+    private Map<String, NcmpServiceCmHandle> queryCmHandlesByPublicProperties(
+            final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+
+        final Map<String, String> publicPropertyQueryPairs =
+                getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+                        CmHandleQueryConditions.HAS_ALL_PROPERTIES.getConditionName());
+
+        return publicPropertyQueryPairs.isEmpty()
+                ? NO_QUERY_TO_EXECUTE
+                : cmHandleQueries.queryCmHandlePublicProperties(publicPropertyQueryPairs);
+    }
+
+    private Map<String, NcmpServiceCmHandle> combineQueryResults(
+            final Map<String, NcmpServiceCmHandle> publicPropertiesQueryResult,
+            final Map<String, NcmpServiceCmHandle> privatePropertiesQueryResult,
+            final Map<String, NcmpServiceCmHandle> dmiPropertiesQueryResult) {
+
+        final Map<String, NcmpServiceCmHandle> propertiesCombinedResult = cmHandleQueries
+                .combineCmHandleQueries(publicPropertiesQueryResult, privatePropertiesQueryResult);
+        return cmHandleQueries
+                .combineCmHandleQueries(propertiesCombinedResult, dmiPropertiesQueryResult);
+    }
+
     private Map<String, NcmpServiceCmHandle> combineWithModuleNameQuery(
             final CmHandleQueryServiceParameters cmHandleQueryServiceParameters,
             final Map<String, NcmpServiceCmHandle> previousQueryResult) {
@@ -164,7 +252,8 @@ public class NetworkCmProxyCmHandlerQueryServiceImpl implements NetworkCmProxyCm
         }
 
         final Map<String, String> publicPropertyQueryPairs =
-                getPublicPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
+                getPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters(),
+                        CmHandleQueryConditions.HAS_ALL_PROPERTIES.getConditionName());
         final Map<String, NcmpServiceCmHandle> propertiesQueryResult = publicPropertyQueryPairs.isEmpty()
                 ? NO_QUERY_TO_EXECUTE : cmHandleQueries.queryCmHandlePublicProperties(publicPropertyQueryPairs);
 
@@ -178,7 +267,7 @@ public class NetworkCmProxyCmHandlerQueryServiceImpl implements NetworkCmProxyCm
 
     private Collection<String> getModuleNamesForQuery(final List<ConditionProperties> conditionProperties) {
         final List<String> result = new ArrayList<>();
-        getConditions(conditionProperties, ValidQueryProperties.HAS_ALL_MODULES.getQueryProperty())
+        getConditions(conditionProperties, CmHandleQueryConditions.HAS_ALL_MODULES.getConditionName())
             .parallelStream().forEach(
                 conditionProperty -> {
                     validateModuleNameConditionProperties(conditionProperty);
@@ -190,15 +279,15 @@ public class NetworkCmProxyCmHandlerQueryServiceImpl implements NetworkCmProxyCm
 
     private Map<String, String> getCpsPath(final List<ConditionProperties> conditionProperties) {
         final Map<String, String> result = new HashMap<>();
-        getConditions(conditionProperties, ValidQueryProperties.WITH_CPS_PATH.getQueryProperty()).forEach(
+        getConditions(conditionProperties, CmHandleQueryConditions.WITH_CPS_PATH.getConditionName()).forEach(
                 result::putAll);
         return result;
     }
 
-    private Map<String, String> getPublicPropertyPairs(final List<ConditionProperties> conditionProperties) {
+    private Map<String, String> getPropertyPairs(final List<ConditionProperties> conditionProperties,
+                                                       final String queryProperty) {
         final Map<String, String> result = new HashMap<>();
-        getConditions(conditionProperties,
-                ValidQueryProperties.HAS_ALL_PROPERTIES.getQueryProperty()).forEach(result::putAll);
+        getConditions(conditionProperties, queryProperty).forEach(result::putAll);
         return result;
     }