canUseRegexQuickfind does not test for contains-condition 25/134425/2
authordanielhanrahan <daniel.hanrahan@est.tech>
Tue, 2 May 2023 17:00:53 +0000 (18:00 +0100)
committerDaniel Hanrahan <daniel.hanrahan@est.tech>
Wed, 3 May 2023 09:21:17 +0000 (09:21 +0000)
This bug causes queries using contains-condition to return wrong
results, when INCLUDE_ALL_DESCENDANTS option is set.

Issue-ID: CPS-1663
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: If323e0e3b54d8c9a213dffda46897b2efb01fe2a

cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java
integration-test/src/test/groovy/org/onap/cps/integration/functional/CpsQueryServiceIntegrationSpec.groovy

index 3d9105f..9527078 100644 (file)
@@ -349,7 +349,8 @@ public class CpsDataPersistenceServiceImpl implements CpsDataPersistenceService
                                                 final CpsPathQuery cpsPathQuery) {
         return fetchDescendantsOption.equals(FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS)
             && !cpsPathQuery.hasLeafConditions()
-            && !cpsPathQuery.hasTextFunctionCondition();
+            && !cpsPathQuery.hasTextFunctionCondition()
+            && !cpsPathQuery.hasContainsFunctionCondition();
     }
 
     private List<DataNode> getDataNodesUsingRegexQuickFind(final FetchDescendantsOption fetchDescendantsOption,
index a04302f..b723d7d 100644 (file)
@@ -150,18 +150,16 @@ class CpsQueryServiceIntegrationSpec extends FunctionalSpecBase {
 
     def 'Query for attribute by cps path using contains condition #scenario.'() {
         when: 'a query is executed to get response by the given cps path'
-            def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1, cpsPath, OMIT_DESCENDANTS)
-        then: 'the cps-path of queryDataNodes has expected number of nodes'
-            assert result.size() == expectedResultsize
-        and: 'xpaths of the retrieved data nodes are as expected'
+            def result = objectUnderTest.queryDataNodes(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1, cpsPath, INCLUDE_ALL_DESCENDANTS)
+        then: 'xpaths of the retrieved data nodes are as expected'
             def bookTitles = result.collect { it.getLeaves().get('title') }
             assert bookTitles.sort() == expectedBookTitles.sort()
         where: 'the following data is used'
-            scenario                                 | cpsPath                           | expectedResultsize || expectedBookTitles
-            'contains condition with leaf'           | '//books[contains(@title,"Mat")]' | 1                  || ["Matilda"]
-            'contains condition with case-sensitive' | '//books[contains(@title,"Ti")]'  | 0                  || []
-            'contains condition with Integer Value'  | '//books[contains(@price,"15")]'  | 2                  || ["Annihilation", "The Gruffalo"]
-            'contains condition with No-value'       | '//books[contains(@title,"")]'    | 9                  || ["A Book with No Language", "Annihilation", "Debian GNU/Linux", "Good Omens", "Logarithm tables", "Matilda", "The Colour of Magic", "The Gruffalo", "The Light Fantastic"]
+            scenario                                 | cpsPath                           || expectedBookTitles
+            'contains condition with leaf'           | '//books[contains(@title,"Mat")]' || ["Matilda"]
+            'contains condition with case-sensitive' | '//books[contains(@title,"Ti")]'  || []
+            'contains condition with Integer Value'  | '//books[contains(@price,"15")]'  || ["Annihilation", "The Gruffalo"]
+            'contains condition with No-value'       | '//books[contains(@title,"")]'    || ["A Book with No Language", "Annihilation", "Debian GNU/Linux", "Good Omens", "Logarithm tables", "Matilda", "The Colour of Magic", "The Gruffalo", "The Light Fantastic"]
     }
 
     def 'Cps Path query using descendant anywhere with #scenario condition for a container element.'() {