diff --git a/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBPersistenceService.java b/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBPersistenceService.java index afc84b2434cf1..40e1eadc4abeb 100644 --- a/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBPersistenceService.java +++ b/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBPersistenceService.java @@ -357,7 +357,7 @@ public Iterable query(FilterCriteria filter) { public Iterable query(FilterCriteria filter, @Nullable String alias) { logIfManyQueuedTasks(); Instant start = Instant.now(); - String filterDescription = filterToString(filter); + String filterDescription = filter.toString(); logger.trace("Got a query with filter {}", filterDescription); DynamoDbEnhancedAsyncClient localClient = client; DynamoDBTableNameResolver localTableNameResolver = tableNameResolver; @@ -675,12 +675,4 @@ private void logIfManyQueuedTasks() { } } } - - private String filterToString(FilterCriteria filter) { - return String.format( - "FilterCriteria@%s(item=%s, pageNumber=%d, pageSize=%d, time=[%s, %s, %s], state=[%s, %s of %s] )", - System.identityHashCode(filter), filter.getItemName(), filter.getPageNumber(), filter.getPageSize(), - filter.getBeginDate(), filter.getEndDate(), filter.getOrdering(), filter.getOperator(), - filter.getState(), filter.getState() == null ? "null" : filter.getState().getClass().getSimpleName()); - } } diff --git a/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBQueryUtils.java b/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBQueryUtils.java index 3a083fcad7b45..e2455ee6d0b02 100644 --- a/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBQueryUtils.java +++ b/bundles/org.openhab.persistence.dynamodb/src/main/java/org/openhab/persistence/dynamodb/internal/DynamoDBQueryUtils.java @@ -21,7 +21,6 @@ import org.openhab.core.items.GenericItem; import org.openhab.core.items.Item; import org.openhab.core.persistence.FilterCriteria; -import org.openhab.core.persistence.FilterCriteria.Operator; import org.openhab.core.persistence.FilterCriteria.Ordering; import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter; @@ -142,10 +141,10 @@ private static void addStateFilter(QueryEnhancedRequest.Builder queryBuilder, return null; } }); - if (filter.getOperator() != null && filter.getState() != null) { + if (filter.getState() != null) { // Convert filter's state to DynamoDBItem in order get suitable string representation for the state Expression.Builder stateFilterExpressionBuilder = Expression.builder() - .expression(String.format("#attr %s :value", operatorAsString(filter.getOperator()))); + .expression(String.format("#attr %s :value", filter.getOperator().getSymbol())); // Following will throw IllegalArgumentException when filter state is not compatible with // item. This is acceptable. GenericItem stateToFind = DynamoDBPersistenceService.copyItem(item, item, filter.getItemName(), @@ -206,32 +205,6 @@ private static void addFilterbyItemAndTimeFilter(QueryEnhancedRequest.Builder qu } } - /** - * Convert op to string suitable for dynamodb filter expression - * - * @param op - * @return string representation corresponding to the given the Operator - */ - private static String operatorAsString(Operator op) { - switch (op) { - case EQ: - return "="; - case NEQ: - return "<>"; - case LT: - return "<"; - case LTE: - return "<="; - case GT: - return ">"; - case GTE: - return ">="; - - default: - throw new IllegalStateException("Unknown operator " + op); - } - } - private static void acceptAsDTO(Item item, boolean legacy, DynamoDBItemVisitor visitor) { ZonedDateTime dummyTimestamp = ZonedDateTime.now(); if (legacy) { diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/InfluxDBPersistenceService.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/InfluxDBPersistenceService.java index ee88e03ae1712..8bea4464e50a4 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/InfluxDBPersistenceService.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/InfluxDBPersistenceService.java @@ -244,10 +244,7 @@ public Iterable query(FilterCriteria filter, @Nullable String alia return List.of(); } if (serviceActivated && checkConnection()) { - logger.trace( - "Query-Filter: itemname: {}, ordering: {}, state: {}, operator: {}, getBeginDate: {}, getEndDate: {}, getPageSize: {}, getPageNumber: {}", - itemName, filter.getOrdering().toString(), filter.getState(), filter.getOperator(), - filter.getBeginDate(), filter.getEndDate(), filter.getPageSize(), filter.getPageNumber()); + logger.trace("Query-Filter: {}", filter); List results = influxDBRepository.query(filter, configuration.getRetentionPolicy(), alias); diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/FilterCriteriaQueryCreator.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/FilterCriteriaQueryCreator.java index 1343c0ad625f3..30ed0a51d7ded 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/FilterCriteriaQueryCreator.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/FilterCriteriaQueryCreator.java @@ -32,15 +32,4 @@ public interface FilterCriteriaQueryCreator { * @return Created query as a String */ String createQuery(FilterCriteria criteria, String retentionPolicy, @Nullable String alias); - - default String getOperationSymbol(FilterCriteria.Operator operator, InfluxDBVersion version) { - return switch (operator) { - case EQ -> "="; - case LT -> "<"; - case LTE -> "<="; - case GT -> ">"; - case GTE -> ">="; - case NEQ -> version == InfluxDBVersion.V1 ? "<>" : "!="; - }; - } } diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1FilterCriteriaQueryCreatorImpl.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1FilterCriteriaQueryCreatorImpl.java index 508beaeaddd84..6504bbdc94a54 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1FilterCriteriaQueryCreatorImpl.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx1/InfluxDB1FilterCriteriaQueryCreatorImpl.java @@ -30,7 +30,6 @@ import org.openhab.persistence.influxdb.internal.FilterCriteriaQueryCreator; import org.openhab.persistence.influxdb.internal.InfluxDBConfiguration; import org.openhab.persistence.influxdb.internal.InfluxDBMetadataService; -import org.openhab.persistence.influxdb.internal.InfluxDBVersion; /** * Implementation of {@link FilterCriteriaQueryCreator} for InfluxDB 1.0 @@ -73,9 +72,9 @@ public String createQuery(FilterCriteria criteria, String retentionPolicy, @Null } State filterState = criteria.getState(); - if (filterState != null && criteria.getOperator() != null) { - where.and(new SimpleClause(COLUMN_VALUE_NAME_V1, - getOperationSymbol(criteria.getOperator(), InfluxDBVersion.V1), stateToObject(filterState))); + if (filterState != null) { + where.and(new SimpleClause(COLUMN_VALUE_NAME_V1, getOperationSymbol(criteria.getOperator()), + stateToObject(filterState))); } if (criteria.getOrdering() == FilterCriteria.Ordering.DESCENDING) { @@ -120,4 +119,11 @@ private String fullQualifiedTableName(String retentionPolicy, String tableName, } return sb.toString(); } + + private String getOperationSymbol(FilterCriteria.Operator operator) { + if (operator == FilterCriteria.Operator.NEQ) { + return "<>"; + } + return operator.getSymbol(); + } } diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/InfluxDB2FilterCriteriaQueryCreatorImpl.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/InfluxDB2FilterCriteriaQueryCreatorImpl.java index e0e1a2aad3e09..cbcdf738ee90e 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/InfluxDB2FilterCriteriaQueryCreatorImpl.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/InfluxDB2FilterCriteriaQueryCreatorImpl.java @@ -26,7 +26,6 @@ import org.openhab.persistence.influxdb.internal.FilterCriteriaQueryCreator; import org.openhab.persistence.influxdb.internal.InfluxDBConfiguration; import org.openhab.persistence.influxdb.internal.InfluxDBMetadataService; -import org.openhab.persistence.influxdb.internal.InfluxDBVersion; import com.influxdb.query.dsl.Flux; import com.influxdb.query.dsl.functions.RangeFlux; @@ -79,10 +78,9 @@ public String createQuery(FilterCriteria criteria, String retentionPolicy, @Null } State filterState = criteria.getState(); - if (filterState != null && criteria.getOperator() != null) { + if (filterState != null) { Restrictions restrictions = Restrictions.and(Restrictions.field().equal(FIELD_VALUE_NAME), - Restrictions.value().custom(stateToObject(filterState), - getOperationSymbol(criteria.getOperator(), InfluxDBVersion.V2))); + Restrictions.value().custom(stateToObject(filterState), criteria.getOperator().getSymbol())); flux = flux.filter(restrictions); } diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcDerbyDAO.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcDerbyDAO.java index 2cbe445d351c7..9563e34661bd6 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcDerbyDAO.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/db/JdbcDerbyDAO.java @@ -186,7 +186,7 @@ protected String histItemFilterQueryProvider(FilterCriteria filter, int numberDe String simpleName, ZoneId timeZone) { logger.debug( "JDBC::getHistItemFilterQueryProvider filter = {}, numberDecimalcount = {}, table = {}, simpleName = {}", - StringUtilsExt.filterToString(filter), numberDecimalcount, table, simpleName); + filter, numberDecimalcount, table, simpleName); String filterString = ""; ZonedDateTime beginDate = filter.getBeginDate(); diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/utils/StringUtilsExt.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/utils/StringUtilsExt.java index a51c298de7d10..46ff520c9cceb 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/utils/StringUtilsExt.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/internal/utils/StringUtilsExt.java @@ -20,7 +20,6 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; -import org.openhab.core.persistence.FilterCriteria; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -254,31 +253,4 @@ public static List substrPos(String s, String substr, boolean ignoreCas } return arr; } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ - public static String filterToString(FilterCriteria filter) { - StringBuilder builder = new StringBuilder(); - builder.append("FilterCriteria [itemName="); - builder.append(filter.getItemName()); - builder.append(", beginDate="); - builder.append(filter.getBeginDate()); - builder.append(", endDate="); - builder.append(filter.getEndDate()); - builder.append(", pageNumber="); - builder.append(filter.getPageNumber()); - builder.append(", pageSize="); - builder.append(filter.getPageSize()); - builder.append(", operator="); - builder.append(filter.getOperator()); - builder.append(", ordering="); - builder.append(filter.getOrdering()); - builder.append(", state="); - builder.append(filter.getState()); - builder.append("]"); - return builder.toString(); - } } diff --git a/bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/JpaPersistenceService.java b/bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/JpaPersistenceService.java index 0b373df182ade..1db43656ebfb4 100644 --- a/bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/JpaPersistenceService.java +++ b/bundles/org.openhab.persistence.jpa/src/main/java/org/openhab/persistence/jpa/internal/JpaPersistenceService.java @@ -32,6 +32,7 @@ import org.openhab.core.persistence.PersistenceService; import org.openhab.core.persistence.QueryablePersistenceService; import org.openhab.core.persistence.strategy.PersistenceStrategy; +import org.openhab.core.types.State; import org.openhab.core.types.UnDefType; import org.openhab.persistence.jpa.internal.model.JpaPersistentItem; import org.osgi.framework.BundleContext; @@ -219,6 +220,7 @@ public Iterable query(FilterCriteria filter, @Nullable String alia boolean hasBeginDate = false; boolean hasEndDate = false; + State state = null; String queryString = "SELECT n FROM " + JpaPersistentItem.class.getSimpleName() + " n WHERE n.realName = :itemName"; if (filter.getBeginDate() != null) { @@ -229,6 +231,9 @@ public Iterable query(FilterCriteria filter, @Nullable String alia queryString += " AND n.timestamp <= :endDate"; hasEndDate = true; } + if ((state = filter.getState()) != null) { + queryString += " AND n.value " + filter.getOperator().getSymbol() + " :state"; + } queryString += " ORDER BY n.timestamp " + sortOrder; logger.debug("The query: {}", queryString); @@ -247,6 +252,9 @@ public Iterable query(FilterCriteria filter, @Nullable String alia if (hasEndDate) { query.setParameter("endDate", Date.from(filter.getEndDate().toInstant())); } + if (state != null) { + query.setParameter("state", StateHelper.toString(state)); + } query.setFirstResult(filter.getPageNumber() * filter.getPageSize()); query.setMaxResults(filter.getPageSize());