2 * Copyright (c) 2010-2020 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.persistence.influxdb.internal;
15 import static org.hamcrest.CoreMatchers.equalTo;
16 import static org.hamcrest.MatcherAssert.assertThat;
18 import java.time.ZoneId;
19 import java.time.ZonedDateTime;
20 import java.time.format.DateTimeFormatter;
21 import java.time.temporal.ChronoUnit;
23 import org.eclipse.jdt.annotation.DefaultLocation;
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.junit.jupiter.api.AfterEach;
26 import org.junit.jupiter.api.BeforeEach;
27 import org.junit.jupiter.api.Test;
28 import org.openhab.core.library.types.PercentType;
29 import org.openhab.core.persistence.FilterCriteria;
30 import org.openhab.persistence.influxdb.internal.influx1.Influx1FilterCriteriaQueryCreatorImpl;
31 import org.openhab.persistence.influxdb.internal.influx2.Influx2FilterCriteriaQueryCreatorImpl;
34 * @author Joan Pujol Espinar - Initial contribution
36 @NonNullByDefault({ DefaultLocation.RETURN_TYPE, DefaultLocation.PARAMETER })
37 public class InfluxFilterCriteriaQueryCreatorImplTest {
38 private static final String RETENTION_POLICY = "origin";
39 public static final String ITEM_NAME = "sampleItem";
41 private static final DateTimeFormatter INFLUX2_DATE_FORMATTER = DateTimeFormatter
42 .ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnnnnn'Z'").withZone(ZoneId.of("UTC"));
44 private Influx1FilterCriteriaQueryCreatorImpl instanceV1;
45 private Influx2FilterCriteriaQueryCreatorImpl instanceV2;
48 public void before() {
49 instanceV1 = new Influx1FilterCriteriaQueryCreatorImpl();
50 instanceV2 = new Influx2FilterCriteriaQueryCreatorImpl();
60 public void testSimpleItemQueryWithoutParams() {
61 FilterCriteria criteria = createBaseCriteria();
63 String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
64 assertThat(queryV1, equalTo("SELECT value FROM origin.sampleItem;"));
66 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
67 assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t"
68 + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")"));
72 public void testEscapeSimpleItem() {
73 FilterCriteria criteria = createBaseCriteria("sample.Item");
75 String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
76 assertThat(queryV1, equalTo("SELECT value FROM origin.\"sample.Item\";"));
78 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
79 assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t"
80 + "|> filter(fn: (r) => r[\"_measurement\"] == \"sample.Item\")"));
84 public void testSimpleUnboundedItemWithoutParams() {
85 FilterCriteria criteria = new FilterCriteria();
86 criteria.setOrdering(null);
88 String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
89 assertThat(queryV1, equalTo("SELECT value FROM origin./.*/;"));
91 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
92 assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)"));
96 public void testRangeCriteria() {
97 FilterCriteria criteria = createBaseCriteria();
98 ZonedDateTime now = ZonedDateTime.now();
99 ZonedDateTime tomorrow = now.plus(1, ChronoUnit.DAYS);
100 criteria.setBeginDate(now);
101 criteria.setEndDate(tomorrow);
103 String queryV1 = instanceV1.createQuery(criteria, RETENTION_POLICY);
104 String expectedQueryV1 = String.format(
105 "SELECT value FROM origin.sampleItem WHERE time >= '%s' AND time <= '%s';", now.toInstant(),
106 tomorrow.toInstant());
107 assertThat(queryV1, equalTo(expectedQueryV1));
109 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
110 String expectedQueryV2 = String.format(
111 "from(bucket:\"origin\")\n\t" + "|> range(start:%s, stop:%s)\n\t"
112 + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")",
113 INFLUX2_DATE_FORMATTER.format(now.toInstant()), INFLUX2_DATE_FORMATTER.format(tomorrow.toInstant()));
114 assertThat(queryV2, equalTo(expectedQueryV2));
118 public void testValueOperator() {
119 FilterCriteria criteria = createBaseCriteria();
120 criteria.setOperator(FilterCriteria.Operator.LTE);
121 criteria.setState(new PercentType(90));
123 String query = instanceV1.createQuery(criteria, RETENTION_POLICY);
124 assertThat(query, equalTo("SELECT value FROM origin.sampleItem WHERE value <= 90;"));
126 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
128 equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t"
129 + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t"
130 + "|> filter(fn: (r) => (r[\"_field\"] == \"value\" and r[\"_value\"] <= 90))"));
134 public void testPagination() {
135 FilterCriteria criteria = createBaseCriteria();
136 criteria.setPageNumber(2);
137 criteria.setPageSize(10);
139 String query = instanceV1.createQuery(criteria, RETENTION_POLICY);
140 assertThat(query, equalTo("SELECT value FROM origin.sampleItem LIMIT 10 OFFSET 20;"));
142 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
143 assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t"
144 + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + "|> limit(n:10, offset:20)"));
148 public void testOrdering() {
149 FilterCriteria criteria = createBaseCriteria();
150 criteria.setOrdering(FilterCriteria.Ordering.ASCENDING);
152 String query = instanceV1.createQuery(criteria, RETENTION_POLICY);
153 assertThat(query, equalTo("SELECT value FROM origin.sampleItem ORDER BY time ASC;"));
155 String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY);
157 equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t"
158 + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t"
159 + "|> sort(desc:false, columns:[\"_time\"])"));
162 private FilterCriteria createBaseCriteria() {
163 return createBaseCriteria(ITEM_NAME);
166 private FilterCriteria createBaseCriteria(String sampleItem) {
167 FilterCriteria criteria = new FilterCriteria();
168 criteria.setItemName(sampleItem);
169 criteria.setOrdering(null);