diff options
Diffstat (limited to 'cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentQueryBuilder.java')
-rw-r--r-- | cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentQueryBuilder.java | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentQueryBuilder.java b/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentQueryBuilder.java index e371035ba..0c43d62bc 100644 --- a/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentQueryBuilder.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentQueryBuilder.java @@ -21,8 +21,10 @@ package org.onap.cps.spi.repository; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Queue; import javax.persistence.EntityManager; @@ -32,6 +34,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.onap.cps.cpspath.parser.CpsPathPrefixType; import org.onap.cps.cpspath.parser.CpsPathQuery; +import org.onap.cps.spi.PaginationOption; import org.onap.cps.spi.entities.AnchorEntity; import org.onap.cps.spi.entities.DataspaceEntity; import org.onap.cps.spi.entities.FragmentEntity; @@ -56,7 +59,8 @@ public class FragmentQueryBuilder { * @return a executable query object */ public Query getQueryForAnchorAndCpsPath(final AnchorEntity anchorEntity, final CpsPathQuery cpsPathQuery) { - return getQueryForDataspaceOrAnchorAndCpsPath(anchorEntity.getDataspace(), anchorEntity, cpsPathQuery); + return getQueryForDataspaceOrAnchorAndCpsPath(anchorEntity.getDataspace(), + anchorEntity, cpsPathQuery, Collections.EMPTY_LIST); } /** @@ -67,13 +71,45 @@ public class FragmentQueryBuilder { * @return a executable query object */ public Query getQueryForDataspaceAndCpsPath(final DataspaceEntity dataspaceEntity, - final CpsPathQuery cpsPathQuery) { - return getQueryForDataspaceOrAnchorAndCpsPath(dataspaceEntity, ACROSS_ALL_ANCHORS, cpsPathQuery); + final CpsPathQuery cpsPathQuery, + final List<Long> anchorIdsForPagination) { + return getQueryForDataspaceOrAnchorAndCpsPath(dataspaceEntity, ACROSS_ALL_ANCHORS, + cpsPathQuery, anchorIdsForPagination); + } + + /** + * Get query for dataspace, cps path, page index and page size. + * @param dataspaceEntity data space entity + * @param cpsPathQuery cps path query + * @param paginationOption pagination option + * @return query for given dataspace, cps path and pagination parameters + */ + public Query getQueryForAnchorIdsForPagination(final DataspaceEntity dataspaceEntity, + final CpsPathQuery cpsPathQuery, + final PaginationOption paginationOption) { + final StringBuilder sqlStringBuilder = new StringBuilder(); + final Map<String, Object> queryParameters = new HashMap<>(); + sqlStringBuilder.append("SELECT distinct(fragment.anchor_id) FROM fragment " + + "JOIN anchor ON anchor.id = fragment.anchor_id WHERE dataspace_id = :dataspaceId"); + queryParameters.put("dataspaceId", dataspaceEntity.getId()); + addXpathSearch(cpsPathQuery, sqlStringBuilder, queryParameters); + addLeafConditions(cpsPathQuery, sqlStringBuilder); + addTextFunctionCondition(cpsPathQuery, sqlStringBuilder, queryParameters); + addContainsFunctionCondition(cpsPathQuery, sqlStringBuilder, queryParameters); + if (PaginationOption.NO_PAGINATION != paginationOption) { + sqlStringBuilder.append(" ORDER BY fragment.anchor_id"); + addPaginationCondition(sqlStringBuilder, queryParameters, paginationOption); + } + + final Query query = entityManager.createNativeQuery(sqlStringBuilder.toString()); + setQueryParameters(query, queryParameters); + return query; } private Query getQueryForDataspaceOrAnchorAndCpsPath(final DataspaceEntity dataspaceEntity, final AnchorEntity anchorEntity, - final CpsPathQuery cpsPathQuery) { + final CpsPathQuery cpsPathQuery, + final List<Long> anchorIdsForPagination) { final StringBuilder sqlStringBuilder = new StringBuilder(); final Map<String, Object> queryParameters = new HashMap<>(); @@ -81,6 +117,10 @@ public class FragmentQueryBuilder { sqlStringBuilder.append("SELECT fragment.* FROM fragment JOIN anchor ON anchor.id = fragment.anchor_id" + " WHERE dataspace_id = :dataspaceId"); queryParameters.put("dataspaceId", dataspaceEntity.getId()); + if (!anchorIdsForPagination.isEmpty()) { + sqlStringBuilder.append(" AND anchor_id IN (:anchorIdsForPagination)"); + queryParameters.put("anchorIdsForPagination", anchorIdsForPagination); + } } else { sqlStringBuilder.append("SELECT * FROM fragment WHERE anchor_id = :anchorId"); queryParameters.put("anchorId", anchorEntity.getId()); @@ -107,6 +147,15 @@ public class FragmentQueryBuilder { } } + private static void addPaginationCondition(final StringBuilder sqlStringBuilder, + final Map<String, Object> queryParameters, + final PaginationOption paginationOption) { + final Integer offset = (paginationOption.getPageIndex() - 1) * paginationOption.getPageSize(); + sqlStringBuilder.append(" LIMIT :pageSize OFFSET :offset"); + queryParameters.put("pageSize", paginationOption.getPageSize()); + queryParameters.put("offset", offset); + } + private static Integer getTextValueAsInt(final CpsPathQuery cpsPathQuery) { try { return Integer.parseInt(cpsPathQuery.getTextFunctionConditionValue()); |