]> git.basschouten.com Git - openhab-addons.git/blob
99620776d7a9f781dff729ddc92b088880a9fc43
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.persistence.influxdb.internal.influx1;
14
15 import static org.influxdb.querybuilder.BuiltQuery.QueryBuilder.*;
16 import static org.openhab.persistence.influxdb.internal.InfluxDBConstants.*;
17 import static org.openhab.persistence.influxdb.internal.InfluxDBStateConvertUtils.stateToObject;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.influxdb.dto.Query;
22 import org.influxdb.querybuilder.BuiltQuery;
23 import org.influxdb.querybuilder.Select;
24 import org.influxdb.querybuilder.Where;
25 import org.influxdb.querybuilder.clauses.SimpleClause;
26 import org.openhab.core.persistence.FilterCriteria;
27 import org.openhab.persistence.influxdb.internal.FilterCriteriaQueryCreator;
28 import org.openhab.persistence.influxdb.internal.InfluxDBConfiguration;
29 import org.openhab.persistence.influxdb.internal.InfluxDBMetadataService;
30 import org.openhab.persistence.influxdb.internal.InfluxDBVersion;
31
32 /**
33  * Implementation of {@link FilterCriteriaQueryCreator} for InfluxDB 1.0
34  *
35  * @author Joan Pujol Espinar - Initial contribution
36  */
37 @NonNullByDefault
38 public class InfluxDB1FilterCriteriaQueryCreatorImpl implements FilterCriteriaQueryCreator {
39
40     private final InfluxDBConfiguration configuration;
41     private final InfluxDBMetadataService influxDBMetadataService;
42
43     public InfluxDB1FilterCriteriaQueryCreatorImpl(InfluxDBConfiguration configuration,
44             InfluxDBMetadataService influxDBMetadataService) {
45         this.configuration = configuration;
46         this.influxDBMetadataService = influxDBMetadataService;
47     }
48
49     @Override
50     public String createQuery(FilterCriteria criteria, String retentionPolicy) {
51         final String itemName = criteria.getItemName();
52         final String tableName = getTableName(itemName);
53         final boolean hasCriteriaName = itemName != null;
54
55         Select select = select().column("\"" + COLUMN_VALUE_NAME_V1 + "\"::field")
56                 .column("\"" + TAG_ITEM_NAME + "\"::tag")
57                 .fromRaw(null, fullQualifiedTableName(retentionPolicy, tableName, hasCriteriaName));
58
59         Where where = select.where();
60
61         if (itemName != null && !tableName.equals(itemName)) {
62             where.and(BuiltQuery.QueryBuilder.eq(TAG_ITEM_NAME, itemName));
63         }
64         if (criteria.getBeginDate() != null) {
65             where.and(BuiltQuery.QueryBuilder.gte(COLUMN_TIME_NAME_V1, criteria.getBeginDate().toInstant().toString()));
66         }
67         if (criteria.getEndDate() != null) {
68             where.and(BuiltQuery.QueryBuilder.lte(COLUMN_TIME_NAME_V1, criteria.getEndDate().toInstant().toString()));
69         }
70
71         if (criteria.getState() != null && criteria.getOperator() != null) {
72             where.and(new SimpleClause(COLUMN_VALUE_NAME_V1,
73                     getOperationSymbol(criteria.getOperator(), InfluxDBVersion.V1),
74                     stateToObject(criteria.getState())));
75         }
76
77         if (criteria.getOrdering() == FilterCriteria.Ordering.DESCENDING) {
78             select = select.orderBy(desc());
79         } else if (criteria.getOrdering() == FilterCriteria.Ordering.ASCENDING) {
80             select = select.orderBy(asc());
81         }
82
83         if (criteria.getPageSize() != Integer.MAX_VALUE) {
84             if (criteria.getPageNumber() != 0) {
85                 select = select.limit(criteria.getPageSize(), (long) criteria.getPageSize() * criteria.getPageNumber());
86             } else {
87                 select = select.limit(criteria.getPageSize());
88             }
89         }
90
91         return ((Query) select).getCommand();
92     }
93
94     private String getTableName(@Nullable String itemName) {
95         if (itemName == null) {
96             return "/.*/";
97         }
98
99         String name = influxDBMetadataService.getMeasurementNameOrDefault(itemName, itemName);
100
101         if (configuration.isReplaceUnderscore()) {
102             name = name.replace('_', '.');
103         }
104
105         return name;
106     }
107
108     private String fullQualifiedTableName(String retentionPolicy, String tableName, boolean escapeTableName) {
109         StringBuilder sb = new StringBuilder();
110         sb.append('"').append(retentionPolicy).append('"');
111         sb.append(".");
112         if (escapeTableName) {
113             sb.append('"').append(tableName).append('"');
114         } else {
115             sb.append(tableName);
116         }
117         return sb.toString();
118     }
119 }