Support text() condition

- Added Antlr parsing of text() condition (as an optional additional to any query)
- Implemented text-condition combined with descendants
- Refactor descendants queries into using one more flexible Custom (native) Query builder
- Refactor ALL cpsPath queries to now use FragmentRepositoryCpsPathQuery (custom query builder)
- Refactor Antrl code to simply parsing of cpsPath and allow all combinations (no more query types, addresses CPS-436)
- Minor clean up of some minor convention issues in CpsAdminServiceImplSpec.groovy (found during groovy demo)
- Update .rst documentation of xPaths
- Fixed incorrect matching of additional list indexes using more precise SIMILAR-TO regex in postgreSQL
- Documented special chararter limitation (CPS-500)
- Checked for consistent use of term 'CPS path' in documentation and error message
- Included (updated) copyright in all .SQL test files

Issue-ID: CPS-452
Issue-ID: CPS-436
Issue-ID: CPS-500

Signed-off-by: ToineSiebelink <toine.siebelink@est.tech>
Change-Id: If422d25cafd2850d25c9a28dea16ba7a5f93dddb
diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy
index 532f442..be213c0 100755
--- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsAdminServiceImplSpec.groovy
@@ -35,16 +35,16 @@
     }
 
     def 'Create dataspace method invokes persistence service.'() {
-        when: 'Create dataspace method is invoked'
+        when: 'create dataspace method is invoked'
             objectUnderTest.createDataspace('someDataspace')
-        then: 'The persistence service method is invoked with same parameters'
+        then: 'the persistence service method is invoked with same parameters'
             1 * mockCpsAdminPersistenceService.createDataspace('someDataspace')
     }
 
     def 'Create anchor method invokes persistence service.'() {
-        when: 'Create anchor method is invoked'
+        when: 'create anchor method is invoked'
             objectUnderTest.createAnchor('someDataspace', 'someSchemaSet', 'someAnchorName')
-        then: 'The persistence service method is invoked with same parameters'
+        then: 'the persistence service method is invoked with same parameters'
             1 * mockCpsAdminPersistenceService.createAnchor('someDataspace', 'someSchemaSet', 'someAnchorName')
     }
 
@@ -61,7 +61,7 @@
             Anchor anchor = new Anchor()
             mockCpsAdminPersistenceService.getAnchor('someDataspace','someAnchor') >>  anchor
         expect: 'the anchor provided by persistence service is returned as result'
-            objectUnderTest.getAnchor('someDataspace','someAnchor') == anchor
+            assert objectUnderTest.getAnchor('someDataspace','someAnchor') == anchor
     }
 
     def 'Delete anchor.'() {
diff --git a/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
index 7f50f7f..2751d55 100644
--- a/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
@@ -1,6 +1,7 @@
 /*
  *  ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Pantheon.tech
+ *  Modifications Copyright (C) 2021 Nordix Foundation.
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -28,11 +29,12 @@
 class DataNodeBuilderSpec extends Specification {
 
     Map<String, Map<String, Object>> expectedLeavesByXpathMap = [
-            '/test-tree'                             : [],
-            '/test-tree/branch[@name=\'Left\']'      : [name: 'Left'],
-            '/test-tree/branch[@name=\'Left\']/nest' : [name: 'Small', birds: ['Sparrow', 'Robin', 'Finch']],
-            '/test-tree/branch[@name=\'Right\']'     : [name: 'Right'],
-            '/test-tree/branch[@name=\'Right\']/nest': [name: 'Big', birds: ['Owl', 'Raven', 'Crow']]
+            '/test-tree'                                            : [],
+            '/test-tree/branch[@name=\'Left\']'                     : [name: 'Left'],
+            '/test-tree/branch[@name=\'Left\']/nest'                : [name: 'Small', birds: ['Sparrow', 'Robin', 'Finch']],
+            '/test-tree/branch[@name=\'Right\']'                    : [name: 'Right'],
+            '/test-tree/branch[@name=\'Right\']/nest'               : [name: 'Big', birds: ['Owl', 'Raven', 'Crow']],
+            '/test-tree/fruit[@color=\'Green\' and @name=\'Apple\']': [color: 'Green', name: 'Apple']
     ]
 
     String[] networkTopologyModelRfc8345 = [
@@ -55,7 +57,7 @@
             def result = new DataNodeBuilder().withNormalizedNodeTree(normalizedNode).build()
             def mappedResult = TestUtils.getFlattenMapByXpath(result)
         then: '5 DataNode objects with unique xpath were created in total'
-            mappedResult.size() == 5
+            mappedResult.size() == 6
         and: 'all expected xpaths were built'
             mappedResult.keySet().containsAll(expectedLeavesByXpathMap.keySet())
         and: 'each data node contains the expected attributes'
diff --git a/cps-service/src/test/resources/test-tree.json b/cps-service/src/test/resources/test-tree.json
index bc9cbd7..e1789ab 100644
--- a/cps-service/src/test/resources/test-tree.json
+++ b/cps-service/src/test/resources/test-tree.json
@@ -23,6 +23,12 @@
           ]
         }
       }
+    ],
+    "fruit": [
+      {
+        "name": "Apple",
+        "color": "Green"
+      }
     ]
   }
-}
\ No newline at end of file
+}
diff --git a/cps-service/src/test/resources/test-tree.yang b/cps-service/src/test/resources/test-tree.yang
index faba8a1..6310065 100644
--- a/cps-service/src/test/resources/test-tree.yang
+++ b/cps-service/src/test/resources/test-tree.yang
@@ -20,5 +20,17 @@
                 }
             }
         }
+        list fruit {
+            key "name color";
+
+            leaf name {
+                type string;
+            }
+
+            leaf color {
+                type string;
+            }
+
+        }
     }
 }