From deac4777c1a245be1dc4c423658523b41071b110 Mon Sep 17 00:00:00 2001 From: JosephKeenan Date: Mon, 28 Mar 2022 12:26:07 +0100 Subject: Query based on Public CM Properties -Updated OpenAPI for new Endpoint -Will replace SQL with CPSPathQuery once investigation is complete -Functionality in place to determine if public properties match - -Added Unit and CSIT tests - small modifications may need to be made -CSIT tests enhanced to add additional nodes and tests Issue-ID: CPS-731 Change-Id: I403e603ce79c4a4a6994d51b459b5703510d5a83 Signed-off-by: DylanB95EST Signed-off-by: JosephKeenan --- .../spi/impl/CpsAdminPersistenceServiceImpl.java | 9 ++++ .../cps/spi/repository/ModuleReferenceQuery.java | 10 ++++ .../spi/repository/ModuleReferenceRepository.java | 3 +- .../repository/ModuleReferenceRepositoryImpl.java | 63 +++++++++++++++++++++- 4 files changed, 82 insertions(+), 3 deletions(-) (limited to 'cps-ri/src/main/java/org') diff --git a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsAdminPersistenceServiceImpl.java b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsAdminPersistenceServiceImpl.java index 50b27207ee..2e7bb7e969 100755 --- a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsAdminPersistenceServiceImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsAdminPersistenceServiceImpl.java @@ -24,6 +24,7 @@ package org.onap.cps.spi.impl; import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.AllArgsConstructor; @@ -36,8 +37,10 @@ import org.onap.cps.spi.exceptions.AlreadyDefinedException; import org.onap.cps.spi.exceptions.DataspaceInUseException; import org.onap.cps.spi.exceptions.ModuleNamesNotFoundException; import org.onap.cps.spi.model.Anchor; +import org.onap.cps.spi.model.CmHandleQueryParameters; import org.onap.cps.spi.repository.AnchorRepository; import org.onap.cps.spi.repository.DataspaceRepository; +import org.onap.cps.spi.repository.ModuleReferenceRepository; import org.onap.cps.spi.repository.SchemaSetRepository; import org.onap.cps.spi.repository.YangResourceRepository; import org.springframework.dao.DataIntegrityViolationException; @@ -51,6 +54,7 @@ public class CpsAdminPersistenceServiceImpl implements CpsAdminPersistenceServic private final AnchorRepository anchorRepository; private final SchemaSetRepository schemaSetRepository; private final YangResourceRepository yangResourceRepository; + private final ModuleReferenceRepository moduleReferenceRepository; @Override public void createDataspace(final String dataspaceName) { @@ -132,6 +136,11 @@ public class CpsAdminPersistenceServiceImpl implements CpsAdminPersistenceServic anchorRepository.delete(anchorEntity); } + @Override + public Set queryCmHandles(final CmHandleQueryParameters cmHandleQueryParameters) { + return moduleReferenceRepository.queryCmHandles(cmHandleQueryParameters); + } + private AnchorEntity getAnchorEntity(final String dataspaceName, final String anchorName) { final var dataspaceEntity = dataspaceRepository.getByName(dataspaceName); return anchorRepository.getByDataspaceAndName(dataspaceEntity, anchorName); diff --git a/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceQuery.java b/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceQuery.java index 6551937e10..4bc9dd9603 100644 --- a/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceQuery.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceQuery.java @@ -21,6 +21,8 @@ package org.onap.cps.spi.repository; import java.util.Collection; +import java.util.Set; +import org.onap.cps.spi.model.CmHandleQueryParameters; import org.onap.cps.spi.model.ModuleReference; /** @@ -31,4 +33,12 @@ public interface ModuleReferenceQuery { Collection identifyNewModuleReferences( final Collection moduleReferencesToCheck); + /** + * Query and return cm handles that match the given query parameters. + * + * @param cmHandleQueryParameters the cm handle query parameters + * @return collection of cm handle ids + */ + Set queryCmHandles(CmHandleQueryParameters cmHandleQueryParameters); + } diff --git a/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepository.java b/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepository.java index ce2bfe7847..f70e218373 100644 --- a/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepository.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepository.java @@ -27,8 +27,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface ModuleReferenceRepository extends - JpaRepository, ModuleReferenceQuery { +public interface ModuleReferenceRepository extends JpaRepository, ModuleReferenceQuery { Collection identifyNewModuleReferences( final Collection moduleReferencesToCheck); diff --git a/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepositoryImpl.java b/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepositoryImpl.java index 0e79deb8e8..40a93da71c 100644 --- a/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepositoryImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/repository/ModuleReferenceRepositoryImpl.java @@ -24,21 +24,32 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.onap.cps.spi.CpsDataPersistenceService; +import org.onap.cps.spi.FetchDescendantsOption; +import org.onap.cps.spi.model.CmHandleQueryParameters; +import org.onap.cps.spi.model.DataNode; import org.onap.cps.spi.model.ModuleReference; import org.springframework.transaction.annotation.Transactional; @Slf4j @Transactional +@AllArgsConstructor public class ModuleReferenceRepositoryImpl implements ModuleReferenceQuery { @PersistenceContext private EntityManager entityManager; + private final CpsDataPersistenceService cpsDataPersistenceService; + @Override @SneakyThrows public Collection identifyNewModuleReferences( @@ -57,6 +68,56 @@ public class ModuleReferenceRepositoryImpl implements ModuleReferenceQuery { return identifyNewModuleReferencesForCmHandle(tempTableName); } + /** + * Query and return cm handles that match the given query parameters. + * + * @param cmHandleQueryParameters the cm handle query parameters + * @return collection of cm handle ids + */ + @Override + public Set queryCmHandles(final CmHandleQueryParameters cmHandleQueryParameters) { + + if (cmHandleQueryParameters.getPublicProperties().entrySet().isEmpty()) { + return getAllCmHandles(); + } + + final Collection amalgamatedQueryResult = new ArrayList<>(); + int queryConditionCounter = 0; + for (final Map.Entry entry : cmHandleQueryParameters.getPublicProperties().entrySet()) { + final StringBuilder cmHandlePath = new StringBuilder(); + cmHandlePath.append("//public-properties[@name='").append(entry.getKey()).append("' "); + cmHandlePath.append("and @value='").append(entry.getValue()).append("']"); + cmHandlePath.append("/ancestor::cm-handles"); + + final Collection singleConditionQueryResult = + cpsDataPersistenceService.queryDataNodes("NCMP-Admin", + "ncmp-dmi-registry", String.valueOf(cmHandlePath), FetchDescendantsOption.OMIT_DESCENDANTS); + if (++queryConditionCounter == 1) { + amalgamatedQueryResult.addAll(singleConditionQueryResult); + } else { + amalgamatedQueryResult.retainAll(singleConditionQueryResult); + } + + if (amalgamatedQueryResult.isEmpty()) { + break; + } + } + + return extractCmHandleIds(amalgamatedQueryResult); + } + + private Set getAllCmHandles() { + final Collection cmHandles = cpsDataPersistenceService.queryDataNodes("NCMP-Admin", + "ncmp-dmi-registry", "//public-properties/ancestor::cm-handles", + FetchDescendantsOption.OMIT_DESCENDANTS); + return extractCmHandleIds(cmHandles); + } + + private Set extractCmHandleIds(final Collection cmHandles) { + return cmHandles.stream().map(cmHandle -> cmHandle.getLeaves().get("id").toString()) + .collect(Collectors.toSet()); + } + private void createTemporaryTable(final String tempTableName) { final StringBuilder sqlStringBuilder = new StringBuilder("CREATE TEMPORARY TABLE " + tempTableName + "("); sqlStringBuilder.append(" id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,"); @@ -95,7 +156,7 @@ public class ModuleReferenceRepositoryImpl implements ModuleReferenceQuery { + " WHERE yang_resource.module_name IS NULL;", tempTableName); final List resultsAsObjects = - entityManager.createNativeQuery(sql).getResultList(); + (List) entityManager.createNativeQuery(sql).getResultList(); final List resultsAsModuleReferences = new ArrayList<>(resultsAsObjects.size()); for (final Object[] row : resultsAsObjects) { -- cgit 1.2.3-korg