diff options
author | 2025-02-11 17:35:40 +0000 | |
---|---|---|
committer | 2025-02-11 17:35:40 +0000 | |
commit | d2b635356141166c2ea05b79a5a96da31c909764 (patch) | |
tree | af420d3726ad55c1b764c9b3c55c5d62df3712f9 /cps-ri | |
parent | b259b50361c7d844b8e62946463053752dcbc522 (diff) | |
parent | 56d550a3513681b1b20d612a21072b9955b12b82 (diff) |
Merge "Query data nodes with limit"
Diffstat (limited to 'cps-ri')
4 files changed, 38 insertions, 6 deletions
diff --git a/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java b/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java index ac6fe38ee7..e102765a64 100644 --- a/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/ri/CpsDataPersistenceServiceImpl.java @@ -23,6 +23,7 @@ package org.onap.cps.ri; +import static org.onap.cps.api.CpsQueryService.NO_LIMIT; import static org.onap.cps.api.parameters.PaginationOption.NO_PAGINATION; import com.google.common.collect.ImmutableSet; @@ -223,10 +224,19 @@ public class CpsDataPersistenceServiceImpl implements CpsDataPersistenceService description = "Time taken to query data nodes") public List<DataNode> queryDataNodes(final String dataspaceName, final String anchorName, final String cpsPath, final FetchDescendantsOption fetchDescendantsOption) { + return queryDataNodes(dataspaceName, anchorName, cpsPath, fetchDescendantsOption, NO_LIMIT); + } + + @Override + public List<DataNode> queryDataNodes(final String dataspaceName, + final String anchorName, + final String cpsPath, + final FetchDescendantsOption fetchDescendantsOption, + final int queryResultLimit) { final AnchorEntity anchorEntity = getAnchorEntity(dataspaceName, anchorName); final CpsPathQuery cpsPathQuery = getCpsPathQuery(cpsPath); final Collection<FragmentEntity> fragmentEntities = - fragmentRepository.findByAnchorAndCpsPath(anchorEntity, cpsPathQuery); + fragmentRepository.findByAnchorAndCpsPath(anchorEntity, cpsPathQuery, queryResultLimit); return createDataNodesFromFragmentEntities(fetchDescendantsOption, fragmentEntities); } diff --git a/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentQueryBuilder.java b/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentQueryBuilder.java index 3f3ca79900..bf354be024 100644 --- a/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentQueryBuilder.java +++ b/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentQueryBuilder.java @@ -51,13 +51,18 @@ public class FragmentQueryBuilder { private EntityManager entityManager; /** - * Create a sql query to retrieve by anchor(id) and cps path. + * Create a sql query to retrieve by anchor(id) and cps path with an optional queryResultLimit on results. * * @param anchorEntity the anchor * @param cpsPathQuery the cps path query to be transformed into a sql query + * @param queryResultLimit queryResultLimit number of returned entities + * (if the queryResultLimit is less than 1 the method returns all related entities) + * * @return a executable query object */ - public Query getQueryForAnchorAndCpsPath(final AnchorEntity anchorEntity, final CpsPathQuery cpsPathQuery) { + public Query getQueryForAnchorAndCpsPath(final AnchorEntity anchorEntity, + final CpsPathQuery cpsPathQuery, + final int queryResultLimit) { final StringBuilder sqlStringBuilder = new StringBuilder(); final Map<String, Object> queryParameters = new HashMap<>(); @@ -65,6 +70,7 @@ public class FragmentQueryBuilder { addWhereClauseForAnchor(anchorEntity, sqlStringBuilder, queryParameters); addNodeSearchConditions(cpsPathQuery, sqlStringBuilder, queryParameters, false); addSearchSuffix(cpsPathQuery, sqlStringBuilder, queryParameters); + addLimitClause(sqlStringBuilder, queryParameters, queryResultLimit); return getQuery(sqlStringBuilder.toString(), queryParameters, FragmentEntity.class); } @@ -219,6 +225,15 @@ public class FragmentQueryBuilder { } } + private static void addLimitClause(final StringBuilder sqlStringBuilder, + final Map<String, Object> queryParameters, + final int queryResultLimit) { + if (queryResultLimit > 0) { + sqlStringBuilder.append(" LIMIT :queryResultLimit"); + queryParameters.put("queryResultLimit", queryResultLimit); + } + } + private static Integer getTextValueAsInt(final CpsPathQuery cpsPathQuery) { try { return Integer.parseInt(cpsPathQuery.getTextFunctionConditionValue()); diff --git a/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQuery.java b/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQuery.java index 9c1929eaf7..4ee6555b79 100644 --- a/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQuery.java +++ b/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQuery.java @@ -29,7 +29,9 @@ import org.onap.cps.ri.models.DataspaceEntity; import org.onap.cps.ri.models.FragmentEntity; public interface FragmentRepositoryCpsPathQuery { - List<FragmentEntity> findByAnchorAndCpsPath(AnchorEntity anchorEntity, CpsPathQuery cpsPathQuery); + + List<FragmentEntity> findByAnchorAndCpsPath(AnchorEntity anchorEntity, CpsPathQuery cpsPathQuery, + int queryResultLimit); List<FragmentEntity> findByDataspaceAndCpsPath(DataspaceEntity dataspaceEntity, CpsPathQuery cpsPathQuery, List<Long> anchorIds); diff --git a/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQueryImpl.java b/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQueryImpl.java index e8c2725670..80fbe9b6cd 100644 --- a/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQueryImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/ri/repository/FragmentRepositoryCpsPathQueryImpl.java @@ -41,10 +41,15 @@ public class FragmentRepositoryCpsPathQueryImpl implements FragmentRepositoryCps @Override @Transactional public List<FragmentEntity> findByAnchorAndCpsPath(final AnchorEntity anchorEntity, - final CpsPathQuery cpsPathQuery) { - final Query query = fragmentQueryBuilder.getQueryForAnchorAndCpsPath(anchorEntity, cpsPathQuery); + final CpsPathQuery cpsPathQuery, + final int queryResultLimit) { + final Query query = fragmentQueryBuilder + .getQueryForAnchorAndCpsPath(anchorEntity, cpsPathQuery, queryResultLimit); final List<FragmentEntity> fragmentEntities = query.getResultList(); log.debug("Fetched {} fragment entities by anchor and cps path.", fragmentEntities.size()); + if (queryResultLimit > 0) { + log.debug("Result limited to {} entries", queryResultLimit); + } return fragmentEntities; } |