Java 17 Upgrade
[policy/models.git] / models-dao / src / main / java / org / onap / policy / models / dao / PfFilter.java
index ef9d4f9..bba494d 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021 Nordix Foundation.
+ *  Copyright (C) 2021, 2023 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.policy.models.dao;
 
-import java.time.Instant;
+import jakarta.persistence.TypedQuery;
+import java.sql.Timestamp;
 import java.util.Map;
 import lombok.Data;
+import org.onap.policy.models.base.PfConcept;
+
 /**
  * This abstract class is used as a base for the filter implementations.
- *
  */
 
 @Data
 public abstract class PfFilter {
+    private static final String WHERE      = " WHERE ";
     private static final String AND        = " AND ";
     private static final String ORDER      = " ORDER BY ";
 
@@ -38,54 +42,107 @@ public abstract class PfFilter {
     private String timeStampEndFilter;
     private String timeStampFilter;
     private String nameParameter;
+    private String keyPrefix;
 
     /**
-     * Generates filter string.
-     *
-     * @param inputFilterString current filterString generated from FilterMap
-     * @param name the pdpInstance name for the PDP statistics to get
-     * @param startTime the start timeStamp to filter from database, filter rule:
-     *     startTime <= filteredRecord timeStamp <= endTime. null for ignore end time
-     * @param endTime the end timeStamp to filter from database, filter rule:
-     *     startTime <= filteredRecord timeStamp <= endTime. null for ignore end time
-     * @param filterMap Map store extra key/value used to filter from database, can be null     *
-     * @param sortOrder sortOrder to query database
-     * @param getRecordNum Total query count from database
-
+     * Generates the "WHERE" (and "ORDER BY") clause for a JPA query.
      */
-    public String addFilter(final String inputFilterString,
-        final String name, final Instant startTime, final Instant endTime,
-        final Map<String, Object> filterMap, final String sortOrder, final int getRecordNum) {
-        StringBuilder filterQueryString = new StringBuilder(inputFilterString);
-        if (filterMap != null) {
-            for (String key : filterMap.keySet()) {
-                filterQueryString.append("c." + key + "= :" + key + AND);
+    public String genWhereClause(PfFilterParametersIntfc parameters) {
+        if (parameters == null) {
+            return "";
+        }
+
+        var builder = new ClauseBuilder(WHERE, AND);
+
+        if (parameters.getFilterMap() != null) {
+            for (String key : parameters.getFilterMap().keySet()) {
+                builder.addCondition(getKeyPrefix(), key, "= :", key);
             }
         }
 
-        if (name != null) {
-            filterQueryString.append(getNameFilter() + AND);
+        if (parameters.getName() != null) {
+            builder.addCondition(getNameFilter());
         }
 
-        if (startTime != null) {
-            if (endTime != null) {
-                filterQueryString.append(getTimeStampStartFilter());
-                filterQueryString.append(AND);
-                filterQueryString.append(getTimeStampEndFilter());
-            } else {
-                filterQueryString.append(getTimeStampStartFilter());
-            }
-        } else {
-            if (endTime != null) {
-                filterQueryString.append(getTimeStampEndFilter());
-            } else {
-                filterQueryString.delete(filterQueryString.length() - AND.length(), filterQueryString.length());
+        if (parameters.getStartTime() != null) {
+            builder.addCondition(getTimeStampStartFilter());
+        }
+
+        if (parameters.getEndTime() != null) {
+            builder.addCondition(getTimeStampEndFilter());
+        }
+
+        return builder.toString();
+    }
+
+    /**
+     * Generates the "ORDER BY" clause for a JPA query.
+     */
+    public String genOrderClause(PfFilterParametersIntfc parameters) {
+        if (parameters == null) {
+            return "";
+        }
+
+        var builder = new ClauseBuilder(ORDER, ", ");
+
+        if (parameters.getRecordNum() > 0) {
+            builder.addCondition(getTimeStampFilter(), parameters.getSortOrder());
+        }
+
+        return builder.toString();
+    }
+
+    /**
+     * Sets the JPA query parameters, based on the filter parameters.
+     * @param query query to populate
+     */
+    public <T extends PfConcept> void setParams(TypedQuery<T> query, PfFilterParametersIntfc parameters) {
+        if (parameters == null) {
+            return;
+        }
+
+        if (parameters.getFilterMap() != null) {
+            for (Map.Entry<String, Object> entry : parameters.getFilterMap().entrySet()) {
+                query.setParameter(entry.getKey(), entry.getValue());
             }
         }
+        if (parameters.getName() != null) {
+            query.setParameter(this.getNameParameter(), parameters.getName());
+        }
+        if (parameters.getStartTime() != null) {
+            query.setParameter("startTime", Timestamp.from(parameters.getStartTime()));
+        }
+        if (parameters.getEndTime() != null) {
+            query.setParameter("endTime", Timestamp.from(parameters.getEndTime()));
+        }
+        if (parameters.getRecordNum() > 0) {
+            query.setMaxResults(parameters.getRecordNum());
+        }
+    }
+
+    private static class ClauseBuilder {
+        private final StringBuilder builder = new StringBuilder();
+        private final String separator;
+
+        private String currentSeparator;
+
+        public ClauseBuilder(String clause, String separator) {
+            this.separator = separator;
+            this.currentSeparator = clause;
+        }
 
-        if (getRecordNum > 0) {
-            filterQueryString.append(ORDER + getTimeStampFilter() + sortOrder);
+        @Override
+        public String toString() {
+            return builder.toString();
+        }
+
+        public void addCondition(String...condition) {
+            builder.append(currentSeparator);
+            currentSeparator = separator;
+
+            for (String text: condition) {
+                builder.append(text);
+            }
         }
-        return filterQueryString.toString();
     }
 }