2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021, 2023 Nordix Foundation.
4 * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.models.dao;
24 import jakarta.persistence.TypedQuery;
25 import java.sql.Timestamp;
28 import org.onap.policy.models.base.PfConcept;
31 * This abstract class is used as a base for the filter implementations.
35 public abstract class PfFilter {
36 private static final String WHERE = " WHERE ";
37 private static final String AND = " AND ";
38 private static final String ORDER = " ORDER BY ";
40 private String nameFilter;
41 private String timeStampStartFilter;
42 private String timeStampEndFilter;
43 private String timeStampFilter;
44 private String nameParameter;
45 private String keyPrefix;
48 * Generates the "WHERE" (and "ORDER BY") clause for a JPA query.
50 public String genWhereClause(PfFilterParametersIntfc parameters) {
51 if (parameters == null) {
55 var builder = new ClauseBuilder(WHERE, AND);
57 if (parameters.getFilterMap() != null) {
58 for (String key : parameters.getFilterMap().keySet()) {
59 builder.addCondition(getKeyPrefix(), key, "= :", key);
63 if (parameters.getName() != null) {
64 builder.addCondition(getNameFilter());
67 if (parameters.getStartTime() != null) {
68 builder.addCondition(getTimeStampStartFilter());
71 if (parameters.getEndTime() != null) {
72 builder.addCondition(getTimeStampEndFilter());
75 return builder.toString();
79 * Generates the "ORDER BY" clause for a JPA query.
81 public String genOrderClause(PfFilterParametersIntfc parameters) {
82 if (parameters == null) {
86 var builder = new ClauseBuilder(ORDER, ", ");
88 if (parameters.getRecordNum() > 0) {
89 builder.addCondition(getTimeStampFilter(), parameters.getSortOrder());
92 return builder.toString();
96 * Sets the JPA query parameters, based on the filter parameters.
97 * @param query query to populate
99 public <T extends PfConcept> void setParams(TypedQuery<T> query, PfFilterParametersIntfc parameters) {
100 if (parameters == null) {
104 if (parameters.getFilterMap() != null) {
105 for (Map.Entry<String, Object> entry : parameters.getFilterMap().entrySet()) {
106 query.setParameter(entry.getKey(), entry.getValue());
109 if (parameters.getName() != null) {
110 query.setParameter(this.getNameParameter(), parameters.getName());
112 if (parameters.getStartTime() != null) {
113 query.setParameter("startTime", Timestamp.from(parameters.getStartTime()));
115 if (parameters.getEndTime() != null) {
116 query.setParameter("endTime", Timestamp.from(parameters.getEndTime()));
118 if (parameters.getRecordNum() > 0) {
119 query.setMaxResults(parameters.getRecordNum());
123 private static class ClauseBuilder {
124 private final StringBuilder builder = new StringBuilder();
125 private final String separator;
127 private String currentSeparator;
129 public ClauseBuilder(String clause, String separator) {
130 this.separator = separator;
131 this.currentSeparator = clause;
135 public String toString() {
136 return builder.toString();
139 public void addCondition(String...condition) {
140 builder.append(currentSeparator);
141 currentSeparator = separator;
143 for (String text: condition) {
144 builder.append(text);