You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2020/11/01 01:44:56 UTC

[iotdb] 01/02: support

This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 3215d5e36a15faa3773841cacf1a757334f20499
Author: LebronAl <TX...@gmail.com>
AuthorDate: Wed Oct 28 11:13:12 2020 +0800

    support
---
 .../DDL Data Definition Language.md                |  4 +-
 docs/UserGuide/Operation Manual/SQL Reference.md   |  3 +-
 .../DDL Data Definition Language.md                |  4 +-
 .../zh/UserGuide/Operation Manual/SQL Reference.md |  3 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  |  1 -
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 38 ++++++---
 .../db/integration/IoTDBDeleteStorageGroupIT.java  | 90 +++++++++++++++-------
 7 files changed, 98 insertions(+), 45 deletions(-)

diff --git a/docs/UserGuide/Operation Manual/DDL Data Definition Language.md b/docs/UserGuide/Operation Manual/DDL Data Definition Language.md
index e83842e..f9c90d4 100644
--- a/docs/UserGuide/Operation Manual/DDL Data Definition Language.md	
+++ b/docs/UserGuide/Operation Manual/DDL Data Definition Language.md	
@@ -53,11 +53,13 @@ The result is as follows:
 
 ## Delete Storage Group
 
-User can delete a specified storage group by using [DELETE STORAGE GROUP](../Operation%20Manual/SQL%20Reference.md). Please note the data in the storage group will also be deleted. 
+User can use the `DELETE STORAGE GROUP <PrefixPath>` statement to delete all storage groups under the prefixPath. Please note the data in the storage group will also be deleted. 
 
 ```
 IoTDB > DELETE STORAGE GROUP root.ln
 IoTDB > DELETE STORAGE GROUP root.sgcc
+// delete all data, all timeseries and all storage groups
+IoTDB > DELETE STORAGE GROUP root.*
 ```
 
 ## Create Timeseries
diff --git a/docs/UserGuide/Operation Manual/SQL Reference.md b/docs/UserGuide/Operation Manual/SQL Reference.md
index b69b9b0..943910a 100644
--- a/docs/UserGuide/Operation Manual/SQL Reference.md	
+++ b/docs/UserGuide/Operation Manual/SQL Reference.md	
@@ -62,7 +62,8 @@ Note: FullPath can not include `*`
 DELETE STORAGE GROUP <FullPath> [COMMA <FullPath>]*
 Eg: IoTDB > DELETE STORAGE GROUP root.ln.wf01.wt01
 Eg: IoTDB > DELETE STORAGE GROUP root.ln.wf01.wt01, root.ln.wf01.wt02
-Note: FullPath can not include `*`
+Eg: IoTDB > DELETE STORAGE GROUP root.ln.wf01.*
+Eg: IoTDB > DELETE STORAGE GROUP root.*
 ```
 
 * Create Timeseries Statement
diff --git a/docs/zh/UserGuide/Operation Manual/DDL Data Definition Language.md b/docs/zh/UserGuide/Operation Manual/DDL Data Definition Language.md
index 607c73c..349e2f7 100644
--- a/docs/zh/UserGuide/Operation Manual/DDL Data Definition Language.md	
+++ b/docs/zh/UserGuide/Operation Manual/DDL Data Definition Language.md	
@@ -53,11 +53,13 @@ IoTDB> show storage group root.ln
 
 ## 删除存储组
 
-用户使用[DELETE STORAGE GROUP](../Operation%20Manual/SQL%20Reference.md)语句可以删除指定的存储组。在删除的过程中,需要注意的是存储组的数据也会被删除。
+用户可以使用`DELETE STORAGE GROUP <PrefixPath>`语句删除该前缀路径下所有的存储组。在删除的过程中,需要注意的是存储组的数据也会被删除。
 
 ```
 IoTDB > DELETE STORAGE GROUP root.ln
 IoTDB > DELETE STORAGE GROUP root.sgcc
+// 删除所有数据,时间序列以及存储组
+IoTDB > DELETE STORAGE GROUP root.*
 ```
 
 ## 创建时间序列
diff --git a/docs/zh/UserGuide/Operation Manual/SQL Reference.md b/docs/zh/UserGuide/Operation Manual/SQL Reference.md
index 08afaaa..657b1a6 100644
--- a/docs/zh/UserGuide/Operation Manual/SQL Reference.md	
+++ b/docs/zh/UserGuide/Operation Manual/SQL Reference.md	
@@ -52,7 +52,8 @@ Note: FullPath can not include `*`
 DELETE STORAGE GROUP <FullPath> [COMMA <FullPath>]*
 Eg: IoTDB > DELETE STORAGE GROUP root.ln.wf01.wt01
 Eg: IoTDB > DELETE STORAGE GROUP root.ln.wf01.wt01, root.ln.wf01.wt02
-Note: FullPath can not include `*`
+Eg: IoTDB > DELETE STORAGE GROUP root.ln.wf01.*
+Eg: IoTDB > DELETE STORAGE GROUP root.*
 ```
 
 * 创建时间序列语句
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index 768f05e..9e1279e 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.engine;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.List;
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index e8fbcbb..b05283f 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -149,6 +149,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class PlanExecutor implements IPlanExecutor {
+
   // logger
   private static final Logger logger = LoggerFactory.getLogger(PlanExecutor.class);
 
@@ -724,7 +725,8 @@ public class PlanExecutor implements IPlanExecutor {
   @Override
   public void delete(DeletePlan deletePlan) throws QueryProcessException {
     for (PartialPath path : deletePlan.getPaths()) {
-      delete(path, deletePlan.getDeleteStartTime(), deletePlan.getDeleteEndTime(), deletePlan.getIndex());
+      delete(path, deletePlan.getDeleteStartTime(), deletePlan.getDeleteEndTime(),
+          deletePlan.getIndex());
     }
   }
 
@@ -894,7 +896,8 @@ public class PlanExecutor implements IPlanExecutor {
   }
 
   @Override
-  public void delete(PartialPath path, long startTime, long endTime, long planIndex) throws QueryProcessException {
+  public void delete(PartialPath path, long startTime, long endTime, long planIndex)
+      throws QueryProcessException {
     try {
       if (!IoTDB.metaManager.isPathExist(path)) {
         throw new QueryProcessException(
@@ -1055,13 +1058,19 @@ public class PlanExecutor implements IPlanExecutor {
   private boolean createMultiTimeSeries(CreateMultiTimeSeriesPlan createMultiTimeSeriesPlan) {
     Map<Integer, Exception> results = new HashMap<>(createMultiTimeSeriesPlan.getPaths().size());
     for (int i = 0; i < createMultiTimeSeriesPlan.getPaths().size(); i++) {
-      CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan(createMultiTimeSeriesPlan.getPaths().get(i),
-        createMultiTimeSeriesPlan.getDataTypes().get(i), createMultiTimeSeriesPlan.getEncodings().get(i),
-        createMultiTimeSeriesPlan.getCompressors().get(i),
-        createMultiTimeSeriesPlan.getProps() == null ? null : createMultiTimeSeriesPlan.getProps().get(i),
-        createMultiTimeSeriesPlan.getTags() == null ? null : createMultiTimeSeriesPlan.getTags().get(i),
-        createMultiTimeSeriesPlan.getAttributes() == null ? null : createMultiTimeSeriesPlan.getAttributes().get(i),
-        createMultiTimeSeriesPlan.getAlias() == null ? null : createMultiTimeSeriesPlan.getAlias().get(i));
+      CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan(
+          createMultiTimeSeriesPlan.getPaths().get(i),
+          createMultiTimeSeriesPlan.getDataTypes().get(i),
+          createMultiTimeSeriesPlan.getEncodings().get(i),
+          createMultiTimeSeriesPlan.getCompressors().get(i),
+          createMultiTimeSeriesPlan.getProps() == null ? null
+              : createMultiTimeSeriesPlan.getProps().get(i),
+          createMultiTimeSeriesPlan.getTags() == null ? null
+              : createMultiTimeSeriesPlan.getTags().get(i),
+          createMultiTimeSeriesPlan.getAttributes() == null ? null
+              : createMultiTimeSeriesPlan.getAttributes().get(i),
+          createMultiTimeSeriesPlan.getAlias() == null ? null
+              : createMultiTimeSeriesPlan.getAlias().get(i));
 
       try {
         createTimeSeries(plan);
@@ -1150,8 +1159,15 @@ public class PlanExecutor implements IPlanExecutor {
     List<PartialPath> deletePathList = new ArrayList<>();
     try {
       for (PartialPath storageGroupPath : deleteStorageGroupPlan.getPaths()) {
-        StorageEngine.getInstance().deleteStorageGroup(storageGroupPath);
-        deletePathList.add(storageGroupPath);
+        List<PartialPath> allRelatedStorageGroupPath = IoTDB.metaManager
+            .getStorageGroupPaths(storageGroupPath);
+        if (allRelatedStorageGroupPath.isEmpty()) {
+          throw new PathNotExistException(storageGroupPath.getFullPath());
+        }
+        for (PartialPath path : allRelatedStorageGroupPath) {
+          StorageEngine.getInstance().deleteStorageGroup(path);
+          deletePathList.add(path);
+        }
       }
       IoTDB.metaManager.deleteStorageGroups(deletePathList);
     } catch (MetadataException e) {
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteStorageGroupIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteStorageGroupIT.java
index 189fffd..d723c6d 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteStorageGroupIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBDeleteStorageGroupIT.java
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertTrue;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -80,42 +79,22 @@ public class IoTDBDeleteStorageGroupIT {
     }
   }
 
-  /**
-   * Star is not allowed in delete storage group statement
-   *
-   * @throws SQLException
-   * @throws ClassNotFoundException
-   */
-  @Test(expected = IoTDBSQLException.class)
-  public void testDeleteStorageGroupWithStar() throws Exception {
-    Class.forName(Config.JDBC_DRIVER_NAME);
-    try (Connection connection = DriverManager.
-            getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
-         Statement statement = connection.createStatement();) {
-      statement.execute("SET STORAGE GROUP TO root.ln1.wf01.wt01");
-      statement.execute("SET STORAGE GROUP TO root.ln1.wf01.wt02");
-      statement.execute("SET STORAGE GROUP TO root.ln1.wf02.wt03");
-      statement.execute("SET STORAGE GROUP TO root.ln1.wf02.wt04");
-      statement.execute("DELETE STORAGE GROUP root.ln1.wf02.*");
-    }
-  }
-
   @Test
   public void testDeleteMultipleStorageGroupWithQuote() throws Exception {
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection = DriverManager
             .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
          Statement statement = connection.createStatement();) {
-      statement.execute("SET STORAGE GROUP TO root.ln2.wf01.wt01");
-      statement.execute("SET STORAGE GROUP TO root.ln2.wf01.wt02");
-      statement.execute("SET STORAGE GROUP TO root.ln2.wf02.wt03");
-      statement.execute("SET STORAGE GROUP TO root.ln2.wf02.wt04");
-      statement.execute("DELETE STORAGE GROUP root.ln2.wf01.wt01, root.ln2.wf02.wt03");
+      statement.execute("SET STORAGE GROUP TO root.ln1.wf01.wt01");
+      statement.execute("SET STORAGE GROUP TO root.ln1.wf01.wt02");
+      statement.execute("SET STORAGE GROUP TO root.ln1.wf02.wt03");
+      statement.execute("SET STORAGE GROUP TO root.ln1.wf02.wt04");
+      statement.execute("DELETE STORAGE GROUP root.ln1.wf01.wt01, root.ln1.wf02.wt03");
       boolean hasResult = statement.execute("SHOW STORAGE GROUP");
       assertTrue(hasResult);
       String[] expected = new String[]{
-              "root.ln2.wf01.wt02",
-              "root.ln2.wf02.wt04"
+              "root.ln1.wf01.wt02",
+              "root.ln1.wf02.wt04"
       };
       List<String> expectedList = new ArrayList<>();
       Collections.addAll(expectedList, expected);
@@ -136,8 +115,61 @@ public class IoTDBDeleteStorageGroupIT {
     try (Connection connection = DriverManager.
             getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
          Statement statement = connection.createStatement();) {
+      statement.execute("SET STORAGE GROUP TO root.ln2.wf01.wt01");
+      statement.execute("DELETE STORAGE GROUP root.ln2.wf01.wt02");
+    }
+  }
+
+  @Test
+  public void testDeleteStorageGroupWithStar() throws Exception {
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection = DriverManager.
+        getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement();) {
+      statement.execute("SET STORAGE GROUP TO root.ln3.wf01.wt01");
+      statement.execute("SET STORAGE GROUP TO root.ln3.wf01.wt02");
+      statement.execute("SET STORAGE GROUP TO root.ln3.wf02.wt03");
+      statement.execute("SET STORAGE GROUP TO root.ln3.wf02.wt04");
+      statement.execute("DELETE STORAGE GROUP root.ln3.wf02.*");
+      boolean hasResult = statement.execute("SHOW STORAGE GROUP");
+      assertTrue(hasResult);
+      String[] expected = new String[]{
+          "root.ln3.wf01.wt01",
+          "root.ln3.wf01.wt02"
+      };
+      List<String> expectedList = new ArrayList<>();
+      Collections.addAll(expectedList, expected);
+      List<String> result = new ArrayList<>();
+      try (ResultSet resultSet = statement.getResultSet()) {
+        while (resultSet.next()) {
+          result.add(resultSet.getString(1));
+        }
+      }
+      assertEquals(expected.length, result.size());
+      assertTrue(expectedList.containsAll(result));
+    }
+  }
+
+  @Test
+  public void testDeleteAllStorageGroups() throws Exception {
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection = DriverManager.
+        getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement();) {
       statement.execute("SET STORAGE GROUP TO root.ln4.wf01.wt01");
-      statement.execute("DELETE STORAGE GROUP root.ln4.wf01.wt02");
+      statement.execute("SET STORAGE GROUP TO root.ln4.wf01.wt02");
+      statement.execute("SET STORAGE GROUP TO root.ln4.wf02.wt03");
+      statement.execute("SET STORAGE GROUP TO root.ln4.wf02.wt04");
+      statement.execute("DELETE STORAGE GROUP root.*");
+      boolean hasResult = statement.execute("SHOW STORAGE GROUP");
+      assertTrue(hasResult);
+      List<String> result = new ArrayList<>();
+      try (ResultSet resultSet = statement.getResultSet()) {
+        while (resultSet.next()) {
+          result.add(resultSet.getString(1));
+        }
+      }
+      assertEquals(0, result.size());
     }
   }
 }