From 4111a57d03f054b46fddf030730d2e42b2755233 Mon Sep 17 00:00:00 2001 From: danielhanrahan Date: Thu, 19 Jan 2023 18:20:11 +0000 Subject: Handle root xpaths in getDataNodes Issue-ID: CPS-1458 Signed-off-by: danielhanrahan Change-Id: I64abf97317afe4335c8d04169689ee1396e75860 --- .../cps/spi/impl/CpsDataPersistenceServiceImpl.java | 17 +++++++++++++---- .../CpsDataPersistenceServiceIntegrationSpec.groovy | 6 ++++++ .../CpsDataPersistenceServicePerfTest.groovy | 2 -- 3 files changed, 19 insertions(+), 6 deletions(-) (limited to 'cps-ri') diff --git a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java index b85b30d9d..d2b7273fe 100644 --- a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java @@ -265,17 +265,26 @@ public class CpsDataPersistenceServiceImpl implements CpsDataPersistenceService final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName); final AnchorEntity anchorEntity = anchorRepository.getByDataspaceAndName(dataspaceEntity, anchorName); - final Set normalizedXpaths = new HashSet<>(xpaths.size()); - for (final String xpath : xpaths) { + final Collection nonRootXpaths = new HashSet<>(xpaths); + final boolean haveRootXpath = nonRootXpaths.removeIf(CpsDataPersistenceServiceImpl::isRootXpath); + + final Collection normalizedXpaths = new HashSet<>(nonRootXpaths.size()); + for (final String xpath : nonRootXpaths) { try { normalizedXpaths.add(CpsPathUtil.getNormalizedXpath(xpath)); } catch (final PathParsingException e) { log.warn("Error parsing xpath \"{}\" in getDataNodes: {}", xpath, e.getMessage()); } } + final Collection fragmentEntities = + new HashSet<>(fragmentRepository.findByAnchorAndMultipleCpsPaths(anchorEntity.getId(), normalizedXpaths)); + + if (haveRootXpath) { + final List fragmentExtracts = fragmentRepository.getTopLevelFragments(dataspaceEntity, + anchorEntity); + fragmentEntities.addAll(FragmentEntityArranger.toFragmentEntityTrees(anchorEntity, fragmentExtracts)); + } - final List fragmentEntities = - fragmentRepository.findByAnchorAndMultipleCpsPaths(anchorEntity.getId(), normalizedXpaths); return toDataNodes(fragmentEntities, fetchDescendantsOption); } diff --git a/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsDataPersistenceServiceIntegrationSpec.groovy b/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsDataPersistenceServiceIntegrationSpec.groovy index 6252fff56..5f48469c0 100755 --- a/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsDataPersistenceServiceIntegrationSpec.groovy +++ b/cps-ri/src/test/groovy/org/onap/cps/spi/impl/CpsDataPersistenceServiceIntegrationSpec.groovy @@ -20,6 +20,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ + package org.onap.cps.spi.impl import com.fasterxml.jackson.databind.ObjectMapper @@ -303,6 +304,7 @@ class CpsDataPersistenceServiceIntegrationSpec extends CpsPersistenceSpecBase { assert results.size() == expectedResultSize where: 'following parameters were used' scenario | inputXpaths || expectedResultSize + '0 nodes' | [] || 0 '1 node' | ["/parent-200"] || 1 '2 unique nodes' | ["/parent-200", "/parent-201"] || 2 '3 unique nodes' | ["/parent-200", "/parent-201", "/parent-202"] || 3 @@ -314,6 +316,10 @@ class CpsDataPersistenceServiceIntegrationSpec extends CpsPersistenceSpecBase { 'existing and non-existing xpaths' | ["/parent-200", "/NO-XPATH", "/parent-201"] || 2 'invalid xpath' | ["INVALID XPATH"] || 0 'valid and invalid xpaths' | ["/parent-200", "INVALID XPATH", "/parent-201"] || 2 + 'root xpath' | ["/"] || 7 + 'empty (root) xpath' | [""] || 7 + 'root and top-level xpaths' | ["/", "/parent-200", "/parent-201"] || 7 + 'root and child xpaths' | ["/", "/parent-200/child-201"] || 8 } @Sql([CLEAR_DATA, SET_DATA]) diff --git a/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServicePerfTest.groovy b/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServicePerfTest.groovy index 2346239df..040749027 100644 --- a/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServicePerfTest.groovy +++ b/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServicePerfTest.groovy @@ -29,8 +29,6 @@ import org.onap.cps.spi.repository.FragmentRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.test.context.jdbc.Sql -import java.util.concurrent.TimeUnit - import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS -- cgit 1.2.3-korg