/*-
* ============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 ";
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(getKeyPrefix() + 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();
}
}