Adjust to core changes (#14952)
Signed-off-by: Jan N. Klug <github@klug.nrw>
This commit is contained in:
@@ -214,6 +214,10 @@ public class InfluxDBPersistenceService implements QueryablePersistenceService {
|
||||
"Query-Filter: itemname: {}, ordering: {}, state: {}, operator: {}, getBeginDate: {}, getEndDate: {}, getPageSize: {}, getPageNumber: {}",
|
||||
filter.getItemName(), filter.getOrdering().toString(), filter.getState(), filter.getOperator(),
|
||||
filter.getBeginDate(), filter.getEndDate(), filter.getPageSize(), filter.getPageNumber());
|
||||
if (filter.getItemName() == null) {
|
||||
logger.warn("Item name is missing in filter {}", filter);
|
||||
return List.of();
|
||||
}
|
||||
String query = influxDBRepository.createQueryCreator().createQuery(filter,
|
||||
configuration.getRetentionPolicy());
|
||||
logger.trace("Query {}", query);
|
||||
|
||||
@@ -16,6 +16,8 @@ import static org.influxdb.querybuilder.BuiltQuery.QueryBuilder.*;
|
||||
import static org.openhab.persistence.influxdb.internal.InfluxDBConstants.*;
|
||||
import static org.openhab.persistence.influxdb.internal.InfluxDBStateConvertUtils.stateToObject;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.eclipse.jdt.annotation.Nullable;
|
||||
import org.influxdb.dto.Query;
|
||||
@@ -24,6 +26,7 @@ import org.influxdb.querybuilder.Select;
|
||||
import org.influxdb.querybuilder.Where;
|
||||
import org.influxdb.querybuilder.clauses.SimpleClause;
|
||||
import org.openhab.core.persistence.FilterCriteria;
|
||||
import org.openhab.core.types.State;
|
||||
import org.openhab.persistence.influxdb.internal.FilterCriteriaQueryCreator;
|
||||
import org.openhab.persistence.influxdb.internal.InfluxDBConfiguration;
|
||||
import org.openhab.persistence.influxdb.internal.InfluxDBMetadataService;
|
||||
@@ -48,7 +51,7 @@ public class InfluxDB1FilterCriteriaQueryCreatorImpl implements FilterCriteriaQu
|
||||
|
||||
@Override
|
||||
public String createQuery(FilterCriteria criteria, String retentionPolicy) {
|
||||
final String itemName = criteria.getItemName();
|
||||
final String itemName = Objects.requireNonNull(criteria.getItemName()); // we checked non-null before
|
||||
final String tableName = getTableName(itemName);
|
||||
final boolean hasCriteriaName = itemName != null;
|
||||
|
||||
@@ -68,10 +71,10 @@ public class InfluxDB1FilterCriteriaQueryCreatorImpl implements FilterCriteriaQu
|
||||
where.and(BuiltQuery.QueryBuilder.lte(COLUMN_TIME_NAME_V1, criteria.getEndDate().toInstant().toString()));
|
||||
}
|
||||
|
||||
if (criteria.getState() != null && criteria.getOperator() != 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(criteria.getState())));
|
||||
getOperationSymbol(criteria.getOperator(), InfluxDBVersion.V1), stateToObject(filterState)));
|
||||
}
|
||||
|
||||
if (criteria.getOrdering() == FilterCriteria.Ordering.DESCENDING) {
|
||||
|
||||
@@ -18,9 +18,11 @@ import static org.openhab.persistence.influxdb.internal.InfluxDBConstants.*;
|
||||
import static org.openhab.persistence.influxdb.internal.InfluxDBStateConvertUtils.stateToObject;
|
||||
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNullByDefault;
|
||||
import org.openhab.core.persistence.FilterCriteria;
|
||||
import org.openhab.core.types.State;
|
||||
import org.openhab.persistence.influxdb.internal.FilterCriteriaQueryCreator;
|
||||
import org.openhab.persistence.influxdb.internal.InfluxDBConfiguration;
|
||||
import org.openhab.persistence.influxdb.internal.InfluxDBMetadataService;
|
||||
@@ -63,23 +65,22 @@ public class InfluxDB2FilterCriteriaQueryCreatorImpl implements FilterCriteriaQu
|
||||
}
|
||||
flux = range;
|
||||
|
||||
String itemName = criteria.getItemName();
|
||||
if (itemName != null) {
|
||||
String name = influxDBMetadataService.getMeasurementNameOrDefault(itemName, itemName);
|
||||
String measurementName = configuration.isReplaceUnderscore() ? name.replace('_', '.') : name;
|
||||
flux = flux.filter(measurement().equal(measurementName));
|
||||
if (!measurementName.equals(itemName)) {
|
||||
flux = flux.filter(tag(TAG_ITEM_NAME).equal(itemName));
|
||||
flux = flux.keep(new String[] { FIELD_MEASUREMENT_NAME, COLUMN_TIME_NAME_V2, COLUMN_VALUE_NAME_V2,
|
||||
TAG_ITEM_NAME });
|
||||
} else {
|
||||
flux = flux.keep(new String[] { FIELD_MEASUREMENT_NAME, COLUMN_TIME_NAME_V2, COLUMN_VALUE_NAME_V2 });
|
||||
}
|
||||
String itemName = Objects.requireNonNull(criteria.getItemName()); // we checked non-null before
|
||||
String name = influxDBMetadataService.getMeasurementNameOrDefault(itemName, itemName);
|
||||
String measurementName = configuration.isReplaceUnderscore() ? name.replace('_', '.') : name;
|
||||
flux = flux.filter(measurement().equal(measurementName));
|
||||
if (!measurementName.equals(itemName)) {
|
||||
flux = flux.filter(tag(TAG_ITEM_NAME).equal(itemName));
|
||||
flux = flux.keep(
|
||||
new String[] { FIELD_MEASUREMENT_NAME, COLUMN_TIME_NAME_V2, COLUMN_VALUE_NAME_V2, TAG_ITEM_NAME });
|
||||
} else {
|
||||
flux = flux.keep(new String[] { FIELD_MEASUREMENT_NAME, COLUMN_TIME_NAME_V2, COLUMN_VALUE_NAME_V2 });
|
||||
}
|
||||
|
||||
if (criteria.getState() != null && criteria.getOperator() != null) {
|
||||
State filterState = criteria.getState();
|
||||
if (filterState != null && criteria.getOperator() != null) {
|
||||
Restrictions restrictions = Restrictions.and(Restrictions.field().equal(FIELD_VALUE_NAME),
|
||||
Restrictions.value().custom(stateToObject(criteria.getState()),
|
||||
Restrictions.value().custom(stateToObject(filterState),
|
||||
getOperationSymbol(criteria.getOperator(), InfluxDBVersion.V2)));
|
||||
flux = flux.filter(restrictions);
|
||||
}
|
||||
|
||||
@@ -77,26 +77,16 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
FilterCriteria criteria = createBaseCriteria();
|
||||
|
||||
String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV1, equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\";"));
|
||||
assertThat(queryV1,
|
||||
equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" ORDER BY time DESC;"));
|
||||
|
||||
String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV2, equalTo("""
|
||||
from(bucket:"origin")
|
||||
\t|> range(start:-100y, stop:100y)
|
||||
\t|> filter(fn: (r) => r["_measurement"] == "sampleItem")
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])"""));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleUnboundedItemWithoutParams() {
|
||||
FilterCriteria criteria = new FilterCriteria();
|
||||
criteria.setOrdering(null);
|
||||
|
||||
String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV1, equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\"./.*/;"));
|
||||
|
||||
String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y, stop:100y)"));
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])
|
||||
\t|> sort(desc:true, columns:["_time"])"""));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -109,7 +99,7 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
|
||||
String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
String expectedQueryV1 = String.format(
|
||||
"SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" WHERE time >= '%s' AND time <= '%s';",
|
||||
"SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" WHERE time >= '%s' AND time <= '%s' ORDER BY time DESC;",
|
||||
now.toInstant(), tomorrow.toInstant());
|
||||
assertThat(queryV1, equalTo(expectedQueryV1));
|
||||
|
||||
@@ -118,8 +108,9 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
from(bucket:"origin")
|
||||
\t|> range(start:%s, stop:%s)
|
||||
\t|> filter(fn: (r) => r["_measurement"] == "sampleItem")
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])""",
|
||||
INFLUX2_DATE_FORMATTER.format(now.toInstant()), INFLUX2_DATE_FORMATTER.format(tomorrow.toInstant()));
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])
|
||||
\t|> sort(desc:true, columns:["_time"])""", INFLUX2_DATE_FORMATTER.format(now.toInstant()),
|
||||
INFLUX2_DATE_FORMATTER.format(tomorrow.toInstant()));
|
||||
assertThat(queryV2, equalTo(expectedQueryV2));
|
||||
}
|
||||
|
||||
@@ -130,8 +121,8 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
criteria.setState(new PercentType(90));
|
||||
|
||||
String query = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(query,
|
||||
equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" WHERE value <= 90;"));
|
||||
assertThat(query, equalTo(
|
||||
"SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" WHERE value <= 90 ORDER BY time DESC;"));
|
||||
|
||||
String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV2, equalTo("""
|
||||
@@ -139,7 +130,8 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
\t|> range(start:-100y, stop:100y)
|
||||
\t|> filter(fn: (r) => r["_measurement"] == "sampleItem")
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])
|
||||
\t|> filter(fn: (r) => (r["_field"] == "value" and r["_value"] <= 90))"""));
|
||||
\t|> filter(fn: (r) => (r["_field"] == "value" and r["_value"] <= 90))
|
||||
\t|> sort(desc:true, columns:["_time"])"""));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -149,8 +141,8 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
criteria.setPageSize(10);
|
||||
|
||||
String query = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(query,
|
||||
equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" LIMIT 10 OFFSET 20;"));
|
||||
assertThat(query, equalTo(
|
||||
"SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" ORDER BY time DESC LIMIT 10 OFFSET 20;"));
|
||||
|
||||
String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV2, equalTo("""
|
||||
@@ -158,6 +150,7 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
\t|> range(start:-100y, stop:100y)
|
||||
\t|> filter(fn: (r) => r["_measurement"] == "sampleItem")
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])
|
||||
\t|> sort(desc:true, columns:["_time"])
|
||||
\t|> limit(n:10, offset:20)"""));
|
||||
}
|
||||
|
||||
@@ -196,7 +189,6 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
private FilterCriteria createBaseCriteria() {
|
||||
FilterCriteria criteria = new FilterCriteria();
|
||||
criteria.setItemName(ITEM_NAME);
|
||||
criteria.setOrdering(null);
|
||||
return criteria;
|
||||
}
|
||||
|
||||
@@ -210,7 +202,7 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
|
||||
String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV1, equalTo(
|
||||
"SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"measurementName\" WHERE item = 'sampleItem';"));
|
||||
"SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"measurementName\" WHERE item = 'sampleItem' ORDER BY time DESC;"));
|
||||
|
||||
String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV2, equalTo("""
|
||||
@@ -218,18 +210,21 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
|
||||
\t|> range(start:-100y, stop:100y)
|
||||
\t|> filter(fn: (r) => r["_measurement"] == "measurementName")
|
||||
\t|> filter(fn: (r) => r["item"] == "sampleItem")
|
||||
\t|> keep(columns:["_measurement", "_time", "_value", "item"])"""));
|
||||
\t|> keep(columns:["_measurement", "_time", "_value", "item"])
|
||||
\t|> sort(desc:true, columns:["_time"])"""));
|
||||
when(metadataRegistry.get(metadataKey))
|
||||
.thenReturn(new Metadata(metadataKey, "", Map.of("key1", "val1", "key2", "val2")));
|
||||
|
||||
queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV1, equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\";"));
|
||||
assertThat(queryV1,
|
||||
equalTo("SELECT \"value\"::field,\"item\"::tag FROM \"origin\".\"sampleItem\" ORDER BY time DESC;"));
|
||||
|
||||
queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
|
||||
assertThat(queryV2, equalTo("""
|
||||
from(bucket:"origin")
|
||||
\t|> range(start:-100y, stop:100y)
|
||||
\t|> filter(fn: (r) => r["_measurement"] == "sampleItem")
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])"""));
|
||||
\t|> keep(columns:["_measurement", "_time", "_value"])
|
||||
\t|> sort(desc:true, columns:["_time"])"""));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user