diff options
Diffstat (limited to 'cps-ri/src')
6 files changed, 89 insertions, 437 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 b2014757d7..eb61d56632 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 @@ -24,14 +24,12 @@ package org.onap.cps.spi.repository; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; -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 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; @@ -43,10 +41,8 @@ import org.onap.cps.spi.utils.EscapeUtils; import org.springframework.stereotype.Component; @RequiredArgsConstructor -@Slf4j @Component public class FragmentQueryBuilder { - private static final AnchorEntity ACROSS_ALL_ANCHORS = null; @PersistenceContext private EntityManager entityManager; @@ -59,8 +55,14 @@ public class FragmentQueryBuilder { * @return a executable query object */ public Query getQueryForAnchorAndCpsPath(final AnchorEntity anchorEntity, final CpsPathQuery cpsPathQuery) { - return getQueryForDataspaceOrAnchorAndCpsPath(anchorEntity.getDataspace(), - anchorEntity, cpsPathQuery, Collections.emptyList()); + final StringBuilder sqlStringBuilder = new StringBuilder(); + final Map<String, Object> queryParameters = new HashMap<>(); + + sqlStringBuilder.append("SELECT fragment.* FROM fragment"); + addWhereClauseForAnchor(anchorEntity, sqlStringBuilder, queryParameters); + addNodeSearchConditions(cpsPathQuery, sqlStringBuilder, queryParameters, false); + + return getQuery(sqlStringBuilder.toString(), queryParameters, FragmentEntity.class); } /** @@ -73,8 +75,18 @@ public class FragmentQueryBuilder { public Query getQueryForDataspaceAndCpsPath(final DataspaceEntity dataspaceEntity, final CpsPathQuery cpsPathQuery, final List<Long> anchorIdsForPagination) { - return getQueryForDataspaceOrAnchorAndCpsPath(dataspaceEntity, ACROSS_ALL_ANCHORS, - cpsPathQuery, anchorIdsForPagination); + final StringBuilder sqlStringBuilder = new StringBuilder(); + final Map<String, Object> queryParameters = new HashMap<>(); + + sqlStringBuilder.append("SELECT fragment.* FROM fragment"); + if (anchorIdsForPagination.isEmpty()) { + addWhereClauseForDataspace(dataspaceEntity, sqlStringBuilder, queryParameters); + } else { + addWhereClauseForAnchorIds(anchorIdsForPagination, sqlStringBuilder, queryParameters); + } + addNodeSearchConditions(cpsPathQuery, sqlStringBuilder, queryParameters, true); + + return getQuery(sqlStringBuilder.toString(), queryParameters, FragmentEntity.class); } /** @@ -89,52 +101,52 @@ public class FragmentQueryBuilder { 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()); - addAbsoluteParentXpathSearchCondition(cpsPathQuery, sqlStringBuilder, queryParameters, ACROSS_ALL_ANCHORS); - addXpathSearchCondition(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()); + sqlStringBuilder.append("SELECT distinct(fragment.anchor_id) FROM fragment"); + addWhereClauseForDataspace(dataspaceEntity, sqlStringBuilder, queryParameters); + addNodeSearchConditions(cpsPathQuery, sqlStringBuilder, queryParameters, true); + sqlStringBuilder.append(" ORDER BY fragment.anchor_id"); + addPaginationCondition(sqlStringBuilder, queryParameters, paginationOption); + + return getQuery(sqlStringBuilder.toString(), queryParameters, Long.class); + } + + private Query getQuery(final String sql, final Map<String, Object> queryParameters, final Class<?> returnType) { + final Query query = entityManager.createNativeQuery(sql, returnType); setQueryParameters(query, queryParameters); return query; } - private Query getQueryForDataspaceOrAnchorAndCpsPath(final DataspaceEntity dataspaceEntity, - final AnchorEntity anchorEntity, - final CpsPathQuery cpsPathQuery, - final List<Long> anchorIdsForPagination) { - final StringBuilder sqlStringBuilder = new StringBuilder(); - final Map<String, Object> queryParameters = new HashMap<>(); + private static void addWhereClauseForAnchor(final AnchorEntity anchorEntity, + final StringBuilder sqlStringBuilder, + final Map<String, Object> queryParameters) { + sqlStringBuilder.append(" WHERE anchor_id = :anchorId"); + queryParameters.put("anchorId", anchorEntity.getId()); + } - if (anchorEntity == ACROSS_ALL_ANCHORS) { - 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()); - } - addAbsoluteParentXpathSearchCondition(cpsPathQuery, sqlStringBuilder, queryParameters, anchorEntity); + private static void addWhereClauseForAnchorIds(final List<Long> anchorIdsForPagination, + final StringBuilder sqlStringBuilder, + final Map<String, Object> queryParameters) { + sqlStringBuilder.append(" WHERE anchor_id IN (:anchorIdsForPagination)"); + queryParameters.put("anchorIdsForPagination", anchorIdsForPagination); + } + + private static void addWhereClauseForDataspace(final DataspaceEntity dataspaceEntity, + final StringBuilder sqlStringBuilder, + final Map<String, Object> queryParameters) { + sqlStringBuilder.append(" JOIN anchor ON anchor.id = fragment.anchor_id WHERE dataspace_id = :dataspaceId"); + queryParameters.put("dataspaceId", dataspaceEntity.getId()); + } + + private static void addNodeSearchConditions(final CpsPathQuery cpsPathQuery, + final StringBuilder sqlStringBuilder, + final Map<String, Object> queryParameters, + final boolean acrossAnchors) { + addAbsoluteParentXpathSearchCondition(cpsPathQuery, sqlStringBuilder, queryParameters, acrossAnchors); addXpathSearchCondition(cpsPathQuery, sqlStringBuilder, queryParameters); addLeafConditions(cpsPathQuery, sqlStringBuilder); addTextFunctionCondition(cpsPathQuery, sqlStringBuilder, queryParameters); addContainsFunctionCondition(cpsPathQuery, sqlStringBuilder, queryParameters); - - final Query query = entityManager.createNativeQuery(sqlStringBuilder.toString(), FragmentEntity.class); - setQueryParameters(query, queryParameters); - return query; } private static void addXpathSearchCondition(final CpsPathQuery cpsPathQuery, @@ -152,12 +164,12 @@ public class FragmentQueryBuilder { private static void addAbsoluteParentXpathSearchCondition(final CpsPathQuery cpsPathQuery, final StringBuilder sqlStringBuilder, final Map<String, Object> queryParameters, - final AnchorEntity anchorEntity) { + final boolean acrossAnchors) { if (CpsPathPrefixType.ABSOLUTE.equals(cpsPathQuery.getCpsPathPrefixType())) { if (cpsPathQuery.getNormalizedParentPath().isEmpty()) { sqlStringBuilder.append(" AND parent_id IS NULL"); } else { - if (anchorEntity == ACROSS_ALL_ANCHORS) { + if (acrossAnchors) { sqlStringBuilder.append(" AND parent_id IN (SELECT id FROM fragment WHERE xpath = :parentXpath)"); } else { sqlStringBuilder.append(" AND parent_id = (SELECT id FROM fragment WHERE xpath = :parentXpath" @@ -171,10 +183,12 @@ 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); + if (PaginationOption.NO_PAGINATION != 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) { @@ -185,40 +199,34 @@ public class FragmentQueryBuilder { } } - private void addLeafConditions(final CpsPathQuery cpsPathQuery, final StringBuilder sqlStringBuilder) { + private static void addLeafConditions(final CpsPathQuery cpsPathQuery, final StringBuilder sqlStringBuilder) { if (cpsPathQuery.hasLeafConditions()) { - queryLeafConditions(cpsPathQuery, sqlStringBuilder); - } - } - - private void queryLeafConditions(final CpsPathQuery cpsPathQuery, final StringBuilder sqlStringBuilder) { - sqlStringBuilder.append(" AND ("); - final Queue<String> booleanOperatorsQueue = new LinkedList<>(cpsPathQuery.getBooleanOperators()); - final Queue<String> comparativeOperatorQueue = new LinkedList<>(cpsPathQuery.getComparativeOperators()); - cpsPathQuery.getLeavesData().forEach(leaf -> { - final String nextComparativeOperator = comparativeOperatorQueue.poll(); - if (leaf.getValue() instanceof Integer) { - sqlStringBuilder.append("(attributes ->> '").append(leaf.getName()).append("')\\:\\:int"); - sqlStringBuilder.append(nextComparativeOperator); - sqlStringBuilder.append(leaf.getValue()); - } else { - if ("=".equals(nextComparativeOperator)) { - final String leafValueAsText = leaf.getValue().toString(); - sqlStringBuilder.append("attributes ->> '").append(leaf.getName()).append("'"); - sqlStringBuilder.append(" = '"); - sqlStringBuilder.append(EscapeUtils.escapeForSqlStringLiteral(leafValueAsText)); - sqlStringBuilder.append("'"); + sqlStringBuilder.append(" AND ("); + final Queue<String> booleanOperatorsQueue = new LinkedList<>(cpsPathQuery.getBooleanOperators()); + cpsPathQuery.getLeafConditions().forEach(leafCondition -> { + if (leafCondition.value() instanceof Integer) { + sqlStringBuilder.append("(attributes ->> '").append(leafCondition.name()).append("')\\:\\:int"); + sqlStringBuilder.append(leafCondition.operator()); + sqlStringBuilder.append(leafCondition.value()); } else { - throw new CpsPathException(" can use only " + nextComparativeOperator + " with integer "); + if ("=".equals(leafCondition.operator())) { + final String leafValueAsText = leafCondition.value().toString(); + sqlStringBuilder.append("attributes ->> '").append(leafCondition.name()).append("'"); + sqlStringBuilder.append(" = '"); + sqlStringBuilder.append(EscapeUtils.escapeForSqlStringLiteral(leafValueAsText)); + sqlStringBuilder.append("'"); + } else { + throw new CpsPathException(" can use only " + leafCondition.operator() + " with integer "); + } } - } - if (!booleanOperatorsQueue.isEmpty()) { - sqlStringBuilder.append(" "); - sqlStringBuilder.append(booleanOperatorsQueue.poll()); - sqlStringBuilder.append(" "); - } - }); - sqlStringBuilder.append(")"); + if (!booleanOperatorsQueue.isEmpty()) { + sqlStringBuilder.append(" "); + sqlStringBuilder.append(booleanOperatorsQueue.poll()); + sqlStringBuilder.append(" "); + } + }); + sqlStringBuilder.append(")"); + } } private static void addTextFunctionCondition(final CpsPathQuery cpsPathQuery, diff --git a/cps-ri/src/main/resources/changelog/db/changes/data/dmi/generated-csv/README.md b/cps-ri/src/main/resources/changelog/db/changes/data/dmi/generated-csv/README.md deleted file mode 100644 index 212acb9006..0000000000 --- a/cps-ri/src/main/resources/changelog/db/changes/data/dmi/generated-csv/README.md +++ /dev/null @@ -1,23 +0,0 @@ -<!-- - ============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========================================================= ---> - -##Placeholder folder for generated CSV files as part of yang models. - -Do not remove this folder
\ No newline at end of file diff --git a/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2021-12-13.yang b/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2021-12-13.yang deleted file mode 100644 index ed3559bf61..0000000000 --- a/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2021-12-13.yang +++ /dev/null @@ -1,63 +0,0 @@ -module dmi-registry { - - yang-version 1.1; - - namespace "org:onap:cps:ncmp"; - - prefix dmi-reg; - - contact "dylan.byrne@est.tech"; - - revision "2021-05-20" { - description - "Initial Version"; - } - - revision "2021-10-20" { - description - "Added dmi-data-service-name & dmi-model-service-name to allow separate DMI instances for each responsibility"; - } - - revision "2021-12-13" { - description - "Added new list of public additonal properties for a Cm-Handle which are exposed to clients of the NCMP interface"; - } - - container dmi-registry { - list cm-handles { - key "id"; - leaf id { - type string; - } - leaf dmi-service-name { - type string; - } - leaf dmi-data-service-name { - type string; - } - leaf dmi-model-service-name { - type string; - } - - list additional-properties { - key "name"; - leaf name { - type string; - } - leaf value { - type string; - } - } - - list public-properties { - key "name"; - leaf name { - type string; - } - leaf value { - type string; - } - } - } - } -}
\ No newline at end of file diff --git a/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2022-02-10.yang b/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2022-02-10.yang deleted file mode 100644 index 3c6d990c5d..0000000000 --- a/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2022-02-10.yang +++ /dev/null @@ -1,81 +0,0 @@ -module dmi-registry { - - yang-version 1.1; - - namespace "org:onap:cps:ncmp"; - - prefix dmi-reg; - - contact "toine.siebelink@est.tech"; - - revision "2022-02-10" { - description - "Added State, LockReason, LockReasonDetails to aid with cmHandle sync and timestamp to aid with retry/timeout scenarios"; - } - - revision "2021-12-13" { - description - "Added new list of public additional properties for a Cm-Handle which are exposed to clients of the NCMP interface"; - } - - revision "2021-10-20" { - description - "Added dmi-data-service-name & dmi-model-service-name to allow separate DMI instances for each responsibility"; - } - - revision "2021-05-20" { - description - "Initial Version"; - } - - container dmi-registry { - list cm-handles { - key "id"; - leaf id { - type string; - } - leaf dmi-service-name { - type string; - } - leaf dmi-data-service-name { - type string; - } - leaf dmi-model-service-name { - type string; - } - - list additional-properties { - key "name"; - leaf name { - type string; - } - leaf value { - type string; - } - } - - list public-properties { - key "name"; - leaf name { - type string; - } - leaf value { - type string; - } - } - - leaf state { - type string; - } - leaf lock-reason { - type string; - } - leaf lock-reason-details { - type string; - } - leaf last-update-time { - type string; - } - } - } -} diff --git a/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2022-05-10.yang b/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2022-05-10.yang deleted file mode 100644 index 77517968c6..0000000000 --- a/cps-ri/src/main/resources/changelog/db/changes/data/yang-models/dmi-registry@2022-05-10.yang +++ /dev/null @@ -1,123 +0,0 @@ -module dmi-registry { - - yang-version 1.1; - - namespace "org:onap:cps:ncmp"; - - prefix dmi-reg; - - contact "toine.siebelink@est.tech"; - - revision "2022-05-10" { - description - "Added DataSyncEnabled, SyncState with State, LastSyncTime, DataStoreSyncState with Operational and Running syncstate"; - } - - revision "2022-02-10" { - description - "Added State, LockReason, LockReasonDetails to aid with cmHandle sync and timestamp to aid with retry/timeout scenarios"; - } - - revision "2021-12-13" { - description - "Added new list of public additional properties for a Cm-Handle which are exposed to clients of the NCMP interface"; - } - - revision "2021-10-20" { - description - "Added dmi-data-service-name & dmi-model-service-name to allow separate DMI instances for each responsibility"; - } - - revision "2021-05-20" { - description - "Initial Version"; - } - - grouping LockReason { - leaf reason { - type string; - } - leaf details { - type string; - } - } - - grouping SyncState { - leaf sync-state { - type string; - } - leaf last-sync-time { - type string; - } - } - - grouping Datastores { - container operational { - uses SyncState; - } - container running { - uses SyncState; - } - } - - container dmi-registry { - list cm-handles { - key "id"; - leaf id { - type string; - } - leaf dmi-service-name { - type string; - } - leaf dmi-data-service-name { - type string; - } - leaf dmi-model-service-name { - type string; - } - - list additional-properties { - key "name"; - leaf name { - type string; - } - leaf value { - type string; - } - } - - list public-properties { - key "name"; - leaf name { - type string; - } - leaf value { - type string; - } - } - - container state { - leaf cm-handle-state { - type string; - } - - container lock-reason { - uses LockReason; - } - - leaf last-update-time { - type string; - } - - leaf data-sync-enabled { - type boolean; - default "false"; - } - - container datastores { - uses Datastores; - } - } - } - } -}
\ No newline at end of file diff --git a/cps-ri/src/main/resources/yangResourceCsvGenerator.py b/cps-ri/src/main/resources/yangResourceCsvGenerator.py deleted file mode 100644 index 3a076d4378..0000000000 --- a/cps-ri/src/main/resources/yangResourceCsvGenerator.py +++ /dev/null @@ -1,66 +0,0 @@ -# ============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========================================================= - - -import csv -import datetime -import hashlib -import sys -import re - -yang_source = '' -checksum = '' -regexForModuleName = '(?<=module)(.*)(?={)' -regexForRevision = '(?<=revision)(.*)(?={)' - -def main(): - for yang_source in sys.argv[1:]: - checksum = hashlib.sha256(str(yang_source).encode()).hexdigest() - - with open('changelog/db/changes/data/yang-models/' + yang_source + '.yang', 'r') as content: - dmiRegistry = content.read() - - try: - latestRevision = re.search(regexForRevision, dmiRegistry).group(0).replace('\"','').strip() - except: - print("ERROR IN in yangResourceCsvGenerator.py: Unable to find revision for " + yang_source + '.yang') - - try: - module_name = re.search(regexForModuleName, dmiRegistry).group(0).strip() - except: - print("ERROR IN in yangResourceCsvGenerator.py: Unable to find module name for " + yang_source + '.yang') - - #If true, file was created after module_name and revision columns were added to yang-resources table - writeWithModuleNameAndRevision = yang_source != 'dmi-registry@2021-12-13' - - try: - # open the file in the write mode - with open('changelog/db/changes/data/dmi/generated-csv/generated_yang_resource_' + yang_source + '.csv', 'w', newline='') \ - as file: - writer = csv.writer(file, delimiter='|') - if(writeWithModuleNameAndRevision): - writer.writerow(["name", "content", "checksum", "module_name", "revision"]) - writer.writerow([yang_source + '.yang', dmiRegistry, checksum, module_name, latestRevision]) - else: - writer.writerow(["name", "content", "checksum"]) - writer.writerow([yang_source + '.yang', dmiRegistry, checksum]) - except: - print("ERROR IN in yangResourceCsvGenerator.py: Unable to write to changelog/db/changes/data/dmi/generated-csv/generated_yang_resource_" + yang_source + ".csv") - - -main()
\ No newline at end of file |