7afe243a7372cb283eb55c65330d73675a81001c
[policy/models.git] / models-dao / src / main / java / org / onap / policy / models / dao / PfFilter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.models.dao;
23
24 import java.sql.Timestamp;
25 import java.util.Map;
26 import javax.persistence.TypedQuery;
27 import lombok.Data;
28 import org.onap.policy.models.base.PfConcept;
29
30 /**
31  * This abstract class is used as a base for the filter implementations.
32  */
33
34 @Data
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 ";
39
40     private String nameFilter;
41     private String timeStampStartFilter;
42     private String timeStampEndFilter;
43     private String timeStampFilter;
44     private String nameParameter;
45     private String keyPrefix;
46
47     /**
48      * Generates the "WHERE" (and "ORDER BY") clause for a JPA query.
49      */
50     public String genWhereClause(PfFilterParametersIntfc parameters) {
51         if (parameters == null) {
52             return "";
53         }
54
55         var builder = new ClauseBuilder(WHERE, AND);
56
57         if (parameters.getFilterMap() != null) {
58             for (String key : parameters.getFilterMap().keySet()) {
59                 builder.addCondition(getKeyPrefix(), key, "= :", key);
60             }
61         }
62
63         if (parameters.getName() != null) {
64             builder.addCondition(getNameFilter());
65         }
66
67         if (parameters.getStartTime() != null) {
68             builder.addCondition(getTimeStampStartFilter());
69         }
70
71         if (parameters.getEndTime() != null) {
72             builder.addCondition(getTimeStampEndFilter());
73         }
74
75         return builder.toString();
76     }
77
78     /**
79      * Generates the "ORDER BY" clause for a JPA query.
80      */
81     public String genOrderClause(PfFilterParametersIntfc parameters) {
82         if (parameters == null) {
83             return "";
84         }
85
86         var builder = new ClauseBuilder(ORDER, ", ");
87
88         if (parameters.getRecordNum() > 0) {
89             builder.addCondition(getTimeStampFilter(), parameters.getSortOrder());
90         }
91
92         return builder.toString();
93     }
94
95     /**
96      * Sets the JPA query parameters, based on the filter parameters.
97      * @param query query to populate
98      */
99     public <T extends PfConcept> void setParams(TypedQuery<T> query, PfFilterParametersIntfc parameters) {
100         if (parameters == null) {
101             return;
102         }
103
104         if (parameters.getFilterMap() != null) {
105             for (Map.Entry<String, Object> entry : parameters.getFilterMap().entrySet()) {
106                 query.setParameter(entry.getKey(), entry.getValue());
107             }
108         }
109         if (parameters.getName() != null) {
110             query.setParameter(this.getNameParameter(), parameters.getName());
111         }
112         if (parameters.getStartTime() != null) {
113             query.setParameter("startTime", Timestamp.from(parameters.getStartTime()));
114         }
115         if (parameters.getEndTime() != null) {
116             query.setParameter("endTime", Timestamp.from(parameters.getEndTime()));
117         }
118         if (parameters.getRecordNum() > 0) {
119             query.setMaxResults(parameters.getRecordNum());
120         }
121     }
122
123     private static class ClauseBuilder {
124         private final StringBuilder builder = new StringBuilder();
125         private final String separator;
126
127         private String currentSeparator;
128
129         public ClauseBuilder(String clause, String separator) {
130             this.separator = separator;
131             this.currentSeparator = clause;
132         }
133
134         @Override
135         public String toString() {
136             return builder.toString();
137         }
138
139         public void addCondition(String...condition) {
140             builder.append(currentSeparator);
141             currentSeparator = separator;
142
143             for (String text: condition) {
144                 builder.append(text);
145             }
146         }
147     }
148 }