X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cps-rest%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fcps%2Frest%2Fcontroller%2FQueryRestController.java;h=5334b4814377bf5fb6b5916dce0357a43c714084;hb=44ff493a5e1f32b0566fa6f9826e99da08998faa;hp=1fc13fc522fc30b6c00ba9cf77d09bf9642df7f9;hpb=a317890387fdbc689f8dcd8648b5bfe3b43abd1e;p=cps.git diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java index 1fc13fc52..5334b4814 100644 --- a/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java +++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java @@ -25,12 +25,14 @@ package org.onap.cps.rest.controller; import io.micrometer.core.annotation.Timed; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; import org.onap.cps.api.CpsQueryService; import org.onap.cps.rest.api.CpsQueryApi; import org.onap.cps.spi.FetchDescendantsOption; +import org.onap.cps.spi.PaginationOption; import org.onap.cps.spi.model.DataNode; import org.onap.cps.utils.DataMapUtils; import org.onap.cps.utils.JsonObjectMapper; @@ -72,22 +74,55 @@ public class QueryRestController implements CpsQueryApi { } @Override - public ResponseEntity getNodesByDataspaceAndCpsPath(final String dataspaceName, - final String cpsPath, final String fetchDescendantsOptionAsString) { + @Timed(value = "cps.data.controller.datanode.query.across.anchors", + description = "Time taken to query data nodes across anchors") + public ResponseEntity getNodesByDataspaceAndCpsPath(final String dataspaceName, final String cpsPath, + final String fetchDescendantsOptionAsString, + final Integer pageIndex, final Integer pageSize) { final FetchDescendantsOption fetchDescendantsOption = FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString); - final Collection dataNodes = - cpsQueryService.queryDataNodesAcrossAnchors(dataspaceName, cpsPath, fetchDescendantsOption); - final List> dataMaps = new ArrayList<>(dataNodes.size()); + final PaginationOption paginationOption = (pageIndex == null || pageSize == null) + ? PaginationOption.NO_PAGINATION : new PaginationOption(pageIndex, pageSize); + final Collection dataNodes = cpsQueryService.queryDataNodesAcrossAnchors(dataspaceName, + cpsPath, fetchDescendantsOption, paginationOption); + final List> dataNodesAsListOfMaps = new ArrayList<>(dataNodes.size()); String prefix = null; - for (final DataNode dataNode : dataNodes) { + final Map> anchorDataNodeListMap = prepareDataNodesForAnchor(dataNodes); + for (final Map.Entry> anchorDataNodesMapEntry : anchorDataNodeListMap.entrySet()) { if (prefix == null) { - prefix = prefixResolver.getPrefix(dataspaceName, dataNode.getAnchorName(), dataNode.getXpath()); + prefix = prefixResolver.getPrefix(dataspaceName, anchorDataNodesMapEntry.getKey(), + anchorDataNodesMapEntry.getValue().get(0).getXpath()); + } + final Map dataMap = DataMapUtils.toDataMapWithIdentifierAndAnchor( + anchorDataNodesMapEntry.getValue(), anchorDataNodesMapEntry.getKey(), prefix); + dataNodesAsListOfMaps.add(dataMap); + } + final Integer totalPages = getTotalPages(dataspaceName, cpsPath, paginationOption); + return ResponseEntity.ok().header("total-pages", + totalPages.toString()).body(jsonObjectMapper.asJsonString(dataNodesAsListOfMaps)); + } + + private Integer getTotalPages(final String dataspaceName, final String cpsPath, + final PaginationOption paginationOption) { + if (paginationOption == PaginationOption.NO_PAGINATION) { + return 1; + } + final int totalAnchors = cpsQueryService.countAnchorsForDataspaceAndCpsPath(dataspaceName, cpsPath); + return totalAnchors <= paginationOption.getPageSize() ? 1 + : (int) Math.ceil((double) totalAnchors / paginationOption.getPageSize()); + } + + private Map> prepareDataNodesForAnchor(final Collection dataNodes) { + final Map> dataNodesMapForAnchor = new HashMap<>(); + for (final DataNode dataNode : dataNodes) { + List dataNodesInAnchor = dataNodesMapForAnchor.get(dataNode.getAnchorName()); + if (dataNodesInAnchor == null) { + dataNodesInAnchor = new ArrayList<>(); + dataNodesMapForAnchor.put(dataNode.getAnchorName(), dataNodesInAnchor); } - final Map dataMap = DataMapUtils.toDataMapWithIdentifierAndAnchor(dataNode, prefix); - dataMaps.add(dataMap); + dataNodesInAnchor.add(dataNode); } - return new ResponseEntity<>(jsonObjectMapper.asJsonString(dataMaps), HttpStatus.OK); + return dataNodesMapForAnchor; } private ResponseEntity executeNodesByDataspaceQueryAndCreateResponse(final String dataspaceName,