This is an automated email from the ASF dual-hosted git repository.
bossenti pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to refs/heads/dev by this push:
new de44bd9c43 feat: IoTDB delete capabilities (#2870)
de44bd9c43 is described below
commit de44bd9c43a7b17178e29338eb3927e785525297
Author: Tim <[email protected]>
AuthorDate: Fri May 17 08:36:48 2024 +0200
feat: IoTDB delete capabilities (#2870)
* feat: add delete capabilities
* style: add missing import
* style: add whitespace
* fix: delete query verification
---
.../api/IDataExplorerQueryManagement.java | 2 +-
.../influx/DataExplorerInfluxQueryExecutor.java | 2 +-
.../influx/DataExplorerQueryManagementInflux.java | 9 ++-
.../iotdb/DataExplorerManagerIotDb.java | 13 +++-
.../iotdb/DataExplorerQueryManagementIotDb.java | 85 ++++++++++++++++++++++
.../dataexplorer/param/DeleteQueryParams.java | 2 +-
.../param/ProvidedRestQueryParamConverter.java | 4 +-
.../apache/streampipes/ps/DataLakeResourceV4.java | 11 ++-
8 files changed, 115 insertions(+), 13 deletions(-)
diff --git
a/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerQueryManagement.java
b/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerQueryManagement.java
index 1e3b500925..2f5f3eb6c3 100644
---
a/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerQueryManagement.java
+++
b/streampipes-data-explorer-api/src/main/java/org/apache/streampipes/dataexplorer/api/IDataExplorerQueryManagement.java
@@ -39,7 +39,7 @@ public interface IDataExplorerQueryManagement {
boolean deleteData(String measurementID);
- SpQueryResult deleteData(String measurementID, Long startDate, Long endDate);
+ boolean deleteData(String measurementName, Long startDate, Long endDate);
boolean deleteAllData();
diff --git
a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerInfluxQueryExecutor.java
b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerInfluxQueryExecutor.java
index b24d2e4a88..4bc17c2515 100644
---
a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerInfluxQueryExecutor.java
+++
b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerInfluxQueryExecutor.java
@@ -108,7 +108,7 @@ public class DataExplorerInfluxQueryExecutor extends
DataExplorerQueryExecutor<Q
@Override
protected Query makeDeleteQuery(DeleteQueryParams params) {
- String query = "DELETE FROM \"" + params.measurementId() + "\"";
+ String query = "DELETE FROM \"" + params.measurementName() + "\"";
if (params.timeRestricted()) {
query += "WHERE time > "
+ params.startTime() * 1000000
diff --git
a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerQueryManagementInflux.java
b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerQueryManagementInflux.java
index 44b9374b80..0129fd4beb 100644
---
a/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerQueryManagementInflux.java
+++
b/streampipes-data-explorer-influx/src/main/java/org/apache/streampipes/dataexplorer/influx/DataExplorerQueryManagementInflux.java
@@ -25,6 +25,7 @@ import
org.apache.streampipes.dataexplorer.QueryResultProvider;
import org.apache.streampipes.dataexplorer.StreamedQueryResultProvider;
import org.apache.streampipes.dataexplorer.param.DeleteQueryParams;
import
org.apache.streampipes.dataexplorer.param.ProvidedRestQueryParamConverter;
+import org.apache.streampipes.model.datalake.SpQueryStatus;
import org.apache.streampipes.model.datalake.param.ProvidedRestQueryParams;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.model.datalake.SpQueryResult;
@@ -92,10 +93,12 @@ public class DataExplorerQueryManagementInflux implements
IDataExplorerQueryMana
}
@Override
- public SpQueryResult deleteData(String measurementID, Long startDate, Long
endDate) {
+ public boolean deleteData(String measurementName, Long startDate, Long
endDate) {
DeleteQueryParams params =
- ProvidedRestQueryParamConverter.getDeleteQueryParams(measurementID,
startDate, endDate);
- return new DataExplorerInfluxQueryExecutor().executeQuery(params);
+ ProvidedRestQueryParamConverter.getDeleteQueryParams(measurementName,
startDate, endDate);
+ return new DataExplorerInfluxQueryExecutor().executeQuery(params)
+ .getSpQueryStatus()
+ .equals(SpQueryStatus.OK);
}
@Override
diff --git
a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
index e29b570f4a..97ef58e99e 100644
---
a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
+++
b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerManagerIotDb.java
@@ -19,8 +19,14 @@
package org.apache.streampipes.dataexplorer.iotdb;
import org.apache.streampipes.client.api.IStreamPipesClient;
+import org.apache.streampipes.commons.environment.Environments;
import org.apache.streampipes.dataexplorer.DataExplorerSchemaManagement;
-import org.apache.streampipes.dataexplorer.api.*;
+import org.apache.streampipes.dataexplorer.api.IDataExplorerManager;
+import org.apache.streampipes.dataexplorer.api.IDataExplorerQueryManagement;
+import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
+import org.apache.streampipes.dataexplorer.api.IDataLakeMeasurementCounter;
+import org.apache.streampipes.dataexplorer.api.IDataLakeMeasurementSanitizer;
+import org.apache.streampipes.dataexplorer.api.ITimeSeriesStorage;
import
org.apache.streampipes.dataexplorer.iotdb.sanitize.DataLakeMeasurementSanitizerIotDb;
import org.apache.streampipes.model.datalake.DataLakeMeasure;
import org.apache.streampipes.storage.management.StorageDispatcher;
@@ -36,7 +42,10 @@ public class DataExplorerManagerIotDb implements
IDataExplorerManager {
@Override
public IDataExplorerQueryManagement
getQueryManagement(IDataExplorerSchemaManagement dataExplorerSchemaManagement) {
- return null;
+ return new DataExplorerQueryManagementIotDb(
+ dataExplorerSchemaManagement,
+ new DataExplorerIotDbQueryExecutor(new
IotDbSessionProvider().getSessionPool(Environments.getEnvironment()))
+ );
}
@Override
diff --git
a/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerQueryManagementIotDb.java
b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerQueryManagementIotDb.java
new file mode 100644
index 0000000000..dfc88efea8
--- /dev/null
+++
b/streampipes-data-explorer-iotdb/src/main/java/org/apache/streampipes/dataexplorer/iotdb/DataExplorerQueryManagementIotDb.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.streampipes.dataexplorer.iotdb;
+
+import org.apache.streampipes.dataexplorer.api.IDataExplorerQueryManagement;
+import org.apache.streampipes.dataexplorer.api.IDataExplorerSchemaManagement;
+import org.apache.streampipes.dataexplorer.export.OutputFormat;
+import org.apache.streampipes.model.datalake.SpQueryResult;
+import org.apache.streampipes.model.datalake.param.ProvidedRestQueryParams;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+
+public class DataExplorerQueryManagementIotDb implements
IDataExplorerQueryManagement {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(DataExplorerIotDbQueryExecutor.class);
+
+ private final DataExplorerIotDbQueryExecutor queryExecutor;
+ private final IDataExplorerSchemaManagement dataExplorerSchemaManagement;
+
+ public DataExplorerQueryManagementIotDb(IDataExplorerSchemaManagement
dataExplorerSchemaManagement,
+ DataExplorerIotDbQueryExecutor
queryExecutor) {
+ this.dataExplorerSchemaManagement = dataExplorerSchemaManagement;
+ this.queryExecutor = queryExecutor;
+ }
+
+ @Override
+ public SpQueryResult getData(ProvidedRestQueryParams queryParams, boolean
ignoreMissingData) throws IllegalArgumentException {
+ return null;
+ }
+
+ @Override
+ public void getDataAsStream(ProvidedRestQueryParams params, OutputFormat
format, boolean ignoreMissingValues, OutputStream outputStream) throws
IOException {
+
+ }
+
+ @Override
+ public boolean deleteData(String measurementID) {
+ var allMeasurements =
this.dataExplorerSchemaManagement.getAllMeasurements();
+
+ var measureToDeleteOpt = allMeasurements.stream()
+ .filter(measure -> measure.getMeasureName().equals(measurementID))
+ .findFirst();
+ return measureToDeleteOpt.filter(queryExecutor::deleteData).isPresent();
+ }
+
+ @Override
+ public boolean deleteData(String measurementName, Long startDate, Long
endDate) {
+ var queryString = "DELETE FROM root.streampipes.%s.* WHERE time > %s AND
time < %s".formatted(measurementName, startDate, endDate);
+ return queryExecutor.executeNonQueryStatement(queryString);
+ }
+
+ @Override
+ public boolean deleteAllData() {
+ var allMeasurements =
this.dataExplorerSchemaManagement.getAllMeasurements();
+
+ return allMeasurements.stream()
+ .allMatch(queryExecutor::deleteData); // Check if
all results are true else return false
+ }
+
+ @Override
+ public Map<String, Object> getTagValues(String measurementId, String fields)
{
+ LOG.error("Retrieval of tag values is not supported with IoTDB as
storage");
+ return Map.of();
+ }
+}
diff --git
a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/DeleteQueryParams.java
b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/DeleteQueryParams.java
index 33d3634903..1fa6948c38 100644
---
a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/DeleteQueryParams.java
+++
b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/DeleteQueryParams.java
@@ -19,7 +19,7 @@
package org.apache.streampipes.dataexplorer.param;
-public record DeleteQueryParams(String measurementId, Long startTime, Long
endTime, boolean timeRestricted) {
+public record DeleteQueryParams(String measurementName, Long startTime, Long
endTime, boolean timeRestricted) {
public DeleteQueryParams(String measurementId, Long startTime, Long endTime)
{
this(measurementId, startTime != null ? startTime : 0, endTime != null ?
endTime : 99999999999999L, true);
diff --git
a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/ProvidedRestQueryParamConverter.java
b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/ProvidedRestQueryParamConverter.java
index dd658d0575..5628b5f992 100644
---
a/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/ProvidedRestQueryParamConverter.java
+++
b/streampipes-data-explorer/src/main/java/org/apache/streampipes/dataexplorer/param/ProvidedRestQueryParamConverter.java
@@ -105,10 +105,10 @@ public class ProvidedRestQueryParamConverter {
return queryParameters;
}
- public static DeleteQueryParams getDeleteQueryParams(String measurementId,
+ public static DeleteQueryParams getDeleteQueryParams(String measurementName,
Long startTime,
Long endTime) {
- return new DeleteQueryParams(measurementId, startTime, endTime);
+ return new DeleteQueryParams(measurementName, startTime, endTime);
}
private static boolean hasTimeParams(ProvidedRestQueryParams params) {
diff --git
a/streampipes-platform-services/src/main/java/org/apache/streampipes/ps/DataLakeResourceV4.java
b/streampipes-platform-services/src/main/java/org/apache/streampipes/ps/DataLakeResourceV4.java
index 2bc5cf4a79..d4bda50882 100644
---
a/streampipes-platform-services/src/main/java/org/apache/streampipes/ps/DataLakeResourceV4.java
+++
b/streampipes-platform-services/src/main/java/org/apache/streampipes/ps/DataLakeResourceV4.java
@@ -104,7 +104,7 @@ public class DataLakeResourceV4 extends
AbstractRestResource {
responses = {
@ApiResponse(responseCode = "200", description = "Data from
measurement series successfully removed"),
@ApiResponse(responseCode = "400", description = "Measurement series
with given id not found")})
- public ResponseEntity<Void> deleteData(
+ public ResponseEntity<?> deleteData(
@Parameter(in = ParameterIn.PATH, description = "the id of the
measurement series", required = true)
@PathVariable("measurementID") String measurementID
, @Parameter(in = ParameterIn.QUERY, description = "start date for
slicing operation")
@@ -112,8 +112,13 @@ public class DataLakeResourceV4 extends
AbstractRestResource {
, @Parameter(in = ParameterIn.QUERY, description = "end date for slicing
operation")
@RequestParam(value = "endDate", required = false) Long endDate) {
- SpQueryResult result =
this.dataExplorerQueryManagement.deleteData(measurementID, startDate, endDate);
- return ok();
+ if (this.dataExplorerQueryManagement.deleteData(measurementID, startDate,
endDate)){
+ return ok();
+ } else {
+ return ResponseEntity
+ .status(HttpStatus.NOT_FOUND)
+ .body("Given measurement could not be found");
+ }
}
@DeleteMapping(path = "/measurements/{measurementID}/drop")