summaryrefslogtreecommitdiffstats
path: root/cps-service/src
diff options
context:
space:
mode:
authorkissand <andras.zoltan.kiss@est.tech>2022-09-23 13:49:05 +0200
committerAndras Zoltan Kiss <andras.zoltan.kiss@est.tech>2022-10-12 12:32:42 +0000
commitd05c1d71f33c1d951d5a5196f6c206457431da9e (patch)
tree175b3ae4682d256dd971f046fcfd1169e5891a45 /cps-service/src
parentc9ec915d7d16b88f53493c85928d463d070df472 (diff)
Fix Id-searches endpoint performance degradation
- create more flexible control over fetch descendants - add a new FETCH_DIRECT_CHILDREN_ONLY option to fetch descendants options - enabel create custom fetch descendants option Reviewer: Toine, Joe, Priyank Issue-ID: CPS-1216 Change-Id: I900b32e813367aa9566c1dec986b20f009d27203 Signed-off-by: kissand <andras.zoltan.kiss@est.tech>
Diffstat (limited to 'cps-service/src')
-rw-r--r--cps-service/src/main/java/org/onap/cps/spi/FetchDescendantsOption.java48
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy2
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy4
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/spi/FetchDescendantsOptionSpec.groovy75
4 files changed, 123 insertions, 6 deletions
diff --git a/cps-service/src/main/java/org/onap/cps/spi/FetchDescendantsOption.java b/cps-service/src/main/java/org/onap/cps/spi/FetchDescendantsOption.java
index 0c994d8d7b..b80054ac3b 100644
--- a/cps-service/src/main/java/org/onap/cps/spi/FetchDescendantsOption.java
+++ b/cps-service/src/main/java/org/onap/cps/spi/FetchDescendantsOption.java
@@ -1,6 +1,7 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2021 Pantheon.tech
+ * Copyright (C) 2022 Nordix Foundation
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,7 +20,48 @@
package org.onap.cps.spi;
-public enum FetchDescendantsOption {
- OMIT_DESCENDANTS,
- INCLUDE_ALL_DESCENDANTS
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class FetchDescendantsOption {
+
+ public static final FetchDescendantsOption FETCH_DIRECT_CHILDREN_ONLY = new FetchDescendantsOption(1);
+ public static final FetchDescendantsOption OMIT_DESCENDANTS = new FetchDescendantsOption(0);
+ public static final FetchDescendantsOption INCLUDE_ALL_DESCENDANTS = new FetchDescendantsOption(-1);
+
+ private final int depth;
+
+ /**
+ * Has next depth.
+ *
+ * @return true if next level of depth is available
+ * @throws IllegalArgumentException when depth less than -1
+ */
+ public boolean hasNext() {
+ validateDepth(depth);
+ return depth > 0 || this.depth == INCLUDE_ALL_DESCENDANTS.depth;
+ }
+
+ /**
+ * Next fetch descendants option.
+ *
+ * @return the next fetch descendants option
+ * @throws IllegalArgumentException when depth less than -1 or 0
+ */
+ public FetchDescendantsOption next() {
+ if (depth == 0) {
+ throw new IllegalArgumentException("Do not use next() method with zero depth");
+ }
+ final FetchDescendantsOption nextDescendantsOption = this.depth == INCLUDE_ALL_DESCENDANTS.depth
+ ? INCLUDE_ALL_DESCENDANTS : new FetchDescendantsOption(depth - 1);
+ validateDepth(nextDescendantsOption.depth);
+ return nextDescendantsOption;
+ }
+
+ private static void validateDepth(final int depth) {
+ if (depth < -1) {
+ throw new IllegalArgumentException("A depth of less than minus one is not allowed");
+ }
+ }
+
}
diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy
index 3f28f0ac8d..a53706a06b 100644
--- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy
@@ -188,7 +188,7 @@ class CpsDataServiceImplSpec extends Specification {
expect: 'service returns same data if uses same parameters'
objectUnderTest.getDataNode(dataspaceName, anchorName, xpath, fetchDescendantsOption) == dataNode
where: 'all fetch options are supported'
- fetchDescendantsOption << FetchDescendantsOption.values()
+ fetchDescendantsOption << [FetchDescendantsOption.OMIT_DESCENDANTS, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS]
}
def 'Get data node with option invalid #scenario.'() {
diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy
index 55a252c27d..b7fec85119 100644
--- a/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/CpsQueryServiceImplSpec.groovy
@@ -1,6 +1,6 @@
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation
+ * Copyright (C) 2021-2022 Nordix Foundation
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ class CpsQueryServiceImplSpec extends Specification {
then: 'the persistence service is called once with the correct parameters'
1 * mockCpsDataPersistenceService.queryDataNodes(dataspaceName, anchorName, cpsPath, fetchDescendantsOption)
where: 'all fetch descendants options are supported'
- fetchDescendantsOption << FetchDescendantsOption.values()
+ fetchDescendantsOption << [FetchDescendantsOption.OMIT_DESCENDANTS, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS]
}
def 'Query data nodes by cps path with invalid #scenario.'() {
diff --git a/cps-service/src/test/groovy/org/onap/cps/spi/FetchDescendantsOptionSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/spi/FetchDescendantsOptionSpec.groovy
new file mode 100644
index 0000000000..627383561a
--- /dev/null
+++ b/cps-service/src/test/groovy/org/onap/cps/spi/FetchDescendantsOptionSpec.groovy
@@ -0,0 +1,75 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.spi
+
+
+import spock.lang.Specification
+
+class FetchDescendantsOptionSpec extends Specification {
+ def 'Check has next descendant for fetch descendant option: #scenario'() {
+ when: 'fetch descendant option with #depth depth'
+ def fetchDescendantsOption = new FetchDescendantsOption(depth)
+ then: 'next level descendants available: #expectedHasNext'
+ fetchDescendantsOption.hasNext() == expectedHasNext
+ where: 'following parameters are used'
+ scenario | depth || expectedHasNext
+ 'omit descendants' | 0 || false
+ 'first child' | 1 || true
+ 'second child' | 2 || true
+ 'include all descendants' | -1 || true
+ }
+
+ def 'Check has next descendant for fetch descendant option: invalid depth'() {
+ given: 'fetch descendant option with -2 depth'
+ def fetchDescendantsOption = new FetchDescendantsOption(-2)
+ when: 'next level descendants not available'
+ fetchDescendantsOption.hasNext()
+ then: 'exception thrown'
+ thrown IllegalArgumentException
+ }
+
+ def 'Get next descendant for fetch descendant option: #scenario'() {
+ when: 'fetch descendant option with #depth depth'
+ def fetchDescendantsOption = new FetchDescendantsOption(depth)
+ then: 'the next level of depth is as expected'
+ fetchDescendantsOption.next().depth == depth - 1
+ where: 'following parameters are used'
+ scenario | depth
+ 'first child' | 1
+ 'second child' | 2
+ }
+
+ def 'Get next descendant for fetch descendant option: include all descendants'() {
+ when: 'fetch descendant option with -1 depth'
+ def fetchDescendantsOption = new FetchDescendantsOption(-1)
+ then: 'the next level of depth is as expected'
+ fetchDescendantsOption.next().depth == -1
+ }
+
+ def 'Get next descendant for fetch descendant option: omit descendants'() {
+ given: 'fetch descendant option with 0 depth'
+ def fetchDescendantsOption = new FetchDescendantsOption(0)
+ when: 'the next level of depth is not allowed'
+ fetchDescendantsOption.next()
+ then: 'exception thrown'
+ thrown IllegalArgumentException
+ }
+}