You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ka...@apache.org on 2021/05/11 03:35:49 UTC

[iotdb] 02/02: add show index

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

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

commit 83c6f251beaa07e8a83081737e6fc92aac6cbf5e
Author: kr11 <3095717866.com>
AuthorDate: Tue May 11 11:35:12 2021 +0800

    add show index
---
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4   |  1 +
 .../org/apache/iotdb/db/conf/IoTDBConstant.java    |  4 ++
 .../org/apache/iotdb/db/index/IndexManager.java    |  4 ++
 .../iotdb/db/index/algorithm/IoTDBIndex.java       | 21 +++++-----
 .../algorithm/elb/ELBTimeFeatureExtractor.java     | 46 ++++++++++++++--------
 .../iotdb/db/index/algorithm/mmhh/MMHHIndex.java   | 18 +++------
 .../apache/iotdb/db/index/common/IndexInfo.java    | 11 ++++++
 .../apache/iotdb/db/index/router/IIndexRouter.java |  2 +
 .../iotdb/db/index/router/ProtoIndexRouter.java    | 28 +++++++++++++
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |  2 +
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 35 ++++++++++++++++
 .../iotdb/db/qp/logical/sys/ShowIndexOperator.java | 40 +++++++++++++++++++
 .../iotdb/db/qp/physical/sys/ShowIndexPlan.java    | 29 ++++++++++++++
 .../apache/iotdb/db/qp/physical/sys/ShowPlan.java  |  1 +
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    | 11 ++++++
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |  4 ++
 .../apache/iotdb/db/index/it/ELBIndexReadIT.java   | 13 +++---
 .../apache/iotdb/db/index/it/MMHHIndexReadIT.java  |  6 +--
 18 files changed, 227 insertions(+), 49 deletions(-)

diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
index 37d9056..140e8b6 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
@@ -81,6 +81,7 @@ statement
     | SHOW DEVICES prefixPath? (WITH STORAGE GROUP)? limitClause? #showDevices
     | SHOW MERGE #showMergeStatus
     | SHOW QUERY PROCESSLIST #showQueryProcesslist
+    | SHOW INDEX (FROM prefixPath)? #showIndex
     | KILL QUERY INT? #killQuery
     | TRACING ON #tracingOn
     | TRACING OFF #tracingOff
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
index 692a700..a9830a8 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java
@@ -101,6 +101,10 @@ public class IoTDBConstant {
   public static final String FUNCTION_TYPE_EXTERNAL_UDAF = "external UDAF";
   public static final String FUNCTION_TYPE_EXTERNAL_UDTF = "external UDTF";
 
+  public static final String COLUMN_INDEX_SERIES = "index series";
+  public static final String COLUMN_INDEX_TYPE = "index type";
+  public static final String COLUMN_INDEX_ATTRIBUTE = "index attribute";
+
   public static final String COLUMN_TRIGGER_NAME = "trigger name";
   public static final String COLUMN_TRIGGER_STATUS = "status";
   public static final String COLUMN_TRIGGER_EVENT = "event";
diff --git a/server/src/main/java/org/apache/iotdb/db/index/IndexManager.java b/server/src/main/java/org/apache/iotdb/db/index/IndexManager.java
index 30e5e21..2bd7557 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/IndexManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/IndexManager.java
@@ -273,6 +273,10 @@ public class IndexManager implements IndexManagerMBean, IService {
     }
   }
 
+  public Map<PartialPath, Map<IndexType, IndexInfo>> getIndexInfos(PartialPath prefixPath) {
+    return router.getIndexInfosByPrefixPath(prefixPath);
+  }
+
   /**
    * As IoTDB has no normal shutdown mechanism, this function will not be called. To ensure the
    * information safety, The router needs to serialize index metadata every time createIndex or
diff --git a/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java b/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java
index de9495e..4cded51 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/IoTDBIndex.java
@@ -17,9 +17,6 @@
  */
 package org.apache.iotdb.db.index.algorithm;
 
-import java.util.Arrays;
-import java.util.PriorityQueue;
-import java.util.TreeMap;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.index.IndexManagerException;
 import org.apache.iotdb.db.exception.index.QueryIndexException;
@@ -38,7 +35,6 @@ import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.Field;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
@@ -46,9 +42,11 @@ import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 
 /**
  * For index developers, the indexing framework aims to provide a simple and friendly platform and
@@ -156,7 +154,7 @@ public abstract class IoTDBIndex {
       List<DistSeries> res, boolean alignedByTime, int nMaxReturnSeries)
       throws QueryIndexException {
     if (alignedByTime) {
-//      throw new QueryIndexException("Unsupported alignedByTime result");
+      //      throw new QueryIndexException("Unsupported alignedByTime result");
       return constructTimeAlignedSearchDataset(res, nMaxReturnSeries);
     }
     // make result paths and types
@@ -248,7 +246,7 @@ public abstract class IoTDBIndex {
     TreeMap<Long, List<Field>> timeMergedFields = new TreeMap<>();
 
     for (int col = 0; col < nMaxReturnSeries; col++) {
-        TVList tvList = res.get(col).tvList;
+      TVList tvList = res.get(col).tvList;
 
       for (int row = 0; row < tvList.size(); row++) {
         long t = tvList.getTime(row);
@@ -260,12 +258,13 @@ public abstract class IoTDBIndex {
         timeMergedFields.get(t).set(col, Field.getField(v, tsDataType));
       }
     }
-//    timeMergedFields.forEach((k,v)-> System.out.println(k + "," + v));
+    //    timeMergedFields.forEach((k,v)-> System.out.println(k + "," + v));
     // to dataset
-    timeMergedFields.forEach((k,v)->{
-      RowRecord record = new RowRecord(k, v);
-      dataSet.putRecord(record);
-    });
+    timeMergedFields.forEach(
+        (k, v) -> {
+          RowRecord record = new RowRecord(k, v);
+          dataSet.putRecord(record);
+        });
     return dataSet;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBTimeFeatureExtractor.java b/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBTimeFeatureExtractor.java
index bb5b114..75a2547 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBTimeFeatureExtractor.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/elb/ELBTimeFeatureExtractor.java
@@ -17,13 +17,7 @@
  */
 package org.apache.iotdb.db.index.algorithm.elb;
 
-import org.apache.iotdb.db.exception.index.IllegalIndexParamException;
-import org.apache.iotdb.db.exception.index.IndexRuntimeException;
-import org.apache.iotdb.db.index.algorithm.elb.ELB.ELBType;
-import org.apache.iotdb.db.index.algorithm.elb.ELB.ELBWindowBlockFeature;
-import org.apache.iotdb.db.index.feature.CountFixedFeatureExtractor;
 import org.apache.iotdb.db.index.feature.TimeFixedFeatureExtractor;
-import org.apache.iotdb.db.index.read.TVListPointer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 /**
@@ -36,26 +30,44 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
  * <p>Refer to: Kang, Rong, et al. Matching Consecutive Subpatterns over Streaming Time Series.
  * APWeb-WAIM. Springer. 2018: 90-105.
  *
- * Temp
+ * <p>Temp
  */
 public class ELBTimeFeatureExtractor extends TimeFixedFeatureExtractor {
 
-
-  public ELBTimeFeatureExtractor(TSDataType tsDataType, int windowRange, int slideStep,
-      int alignedDim, long timeAnchor, boolean storeIdentifier, boolean storeAligned,
+  public ELBTimeFeatureExtractor(
+      TSDataType tsDataType,
+      int windowRange,
+      int slideStep,
+      int alignedDim,
+      long timeAnchor,
+      boolean storeIdentifier,
+      boolean storeAligned,
       boolean inQueryMode) {
-    super(tsDataType, windowRange, slideStep, alignedDim, timeAnchor, storeIdentifier, storeAligned,
+    super(
+        tsDataType,
+        windowRange,
+        slideStep,
+        alignedDim,
+        timeAnchor,
+        storeIdentifier,
+        storeAligned,
         inQueryMode);
   }
 
-  public ELBTimeFeatureExtractor(TSDataType tsDataType, int windowRange, int slideStep,
-      int alignedDim, long timeAnchor, boolean storeIdentifier, boolean storeAligned) {
-    super(tsDataType, windowRange, slideStep, alignedDim, timeAnchor, storeIdentifier,
-        storeAligned);
+  public ELBTimeFeatureExtractor(
+      TSDataType tsDataType,
+      int windowRange,
+      int slideStep,
+      int alignedDim,
+      long timeAnchor,
+      boolean storeIdentifier,
+      boolean storeAligned) {
+    super(
+        tsDataType, windowRange, slideStep, alignedDim, timeAnchor, storeIdentifier, storeAligned);
   }
 
-  public ELBTimeFeatureExtractor(TSDataType tsDataType, int windowRange, int alignedDim,
-      int slideStep, long timeAnchor) {
+  public ELBTimeFeatureExtractor(
+      TSDataType tsDataType, int windowRange, int alignedDim, int slideStep, long timeAnchor) {
     super(tsDataType, windowRange, alignedDim, slideStep, timeAnchor);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java b/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java
index 86cc5b0..783482e 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/algorithm/mmhh/MMHHIndex.java
@@ -76,9 +76,7 @@ import static org.apache.iotdb.db.index.common.IndexConstant.SERIES_LENGTH;
 import static org.apache.iotdb.db.index.common.IndexConstant.TOP_K;
 import static org.apache.iotdb.db.index.common.IndexType.MMHH;
 
-/**
- * <p>Refer to: Kang, Rong, et al. Maximum-margin hamming hashing. ICCV. IEEE/CVF. 2019: 8252-8261.
- */
+/** Refer to: Kang, Rong, et al. Maximum-margin hamming hashing. ICCV. IEEE/CVF. 2019: 8252-8261. */
 public class MMHHIndex extends IoTDBIndex {
 
   private static final Logger logger = LoggerFactory.getLogger(MMHHIndex.class);
@@ -143,9 +141,7 @@ public class MMHHIndex extends IoTDBIndex {
     return res;
   }
 
-  /**
-   * should be concise into WholeIndex or IoTDBIndex, it's duplicate
-   */
+  /** should be concise into WholeIndex or IoTDBIndex, it's duplicate */
   public void endFlushTask() {
     super.endFlushTask();
     currentInsertPath = null;
@@ -217,9 +213,7 @@ public class MMHHIndex extends IoTDBIndex {
 
   private static class MMHHQueryStruct {
 
-    /**
-     * features is represented by float array
-     */
+    /** features is represented by float array */
     //    float[] patternFeatures;
     //    TriFunction<float[], float[], float[], Double> calcLowerDistFunc;
     //
@@ -375,9 +369,7 @@ public class MMHHIndex extends IoTDBIndex {
     return res;
   }
 
-  /**
-   * if res has reached topK
-   */
+  /** if res has reached topK */
   private boolean scanBucket(
       long queryCode,
       int doneIdx,
@@ -423,7 +415,7 @@ public class MMHHIndex extends IoTDBIndex {
       }
     }
     resList.sort(Comparator.comparingDouble(o -> o.backDist));
-    if(tempQueryStruct.topK < resList.size()){
+    if (tempQueryStruct.topK < resList.size()) {
       resList.subList(tempQueryStruct.topK, resList.size()).clear();
     }
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/index/common/IndexInfo.java b/server/src/main/java/org/apache/iotdb/db/index/common/IndexInfo.java
index e2e67ab..3173eb4 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/common/IndexInfo.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/common/IndexInfo.java
@@ -130,6 +130,17 @@ public class IndexInfo implements Cloneable {
     return String.format("[type: %s, time: %d, props: %s]", indexType, time, props);
   }
 
+  public String toStringForShow() {
+    // no indexType. not default map.toString. no time if not set
+    StringBuilder sb = new StringBuilder();
+    props.forEach((k, v) -> sb.append(k).append("=").append(v).append(","));
+    if (time > 0) {
+      sb.append("time>").append(time);
+    }
+    sb.deleteCharAt(sb.length() - 1);
+    return sb.toString();
+  }
+
   @Override
   public Object clone() {
     return new IndexInfo(indexType, time, new HashMap<>(props));
diff --git a/server/src/main/java/org/apache/iotdb/db/index/router/IIndexRouter.java b/server/src/main/java/org/apache/iotdb/db/index/router/IIndexRouter.java
index bc6cfdd..f558f41 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/router/IIndexRouter.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/router/IIndexRouter.java
@@ -116,6 +116,8 @@ public interface IIndexRouter {
    */
   void endQuery(PartialPath indexSeries, IndexType indexType, QueryContext context);
 
+  Map<PartialPath, Map<IndexType, IndexInfo>> getIndexInfosByPrefixPath(PartialPath prefixPath);
+
   class Factory {
 
     private Factory() {
diff --git a/server/src/main/java/org/apache/iotdb/db/index/router/ProtoIndexRouter.java b/server/src/main/java/org/apache/iotdb/db/index/router/ProtoIndexRouter.java
index 640027c..1d962bc 100644
--- a/server/src/main/java/org/apache/iotdb/db/index/router/ProtoIndexRouter.java
+++ b/server/src/main/java/org/apache/iotdb/db/index/router/ProtoIndexRouter.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.index.router;
 
 import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
 import org.apache.iotdb.db.exception.index.QueryIndexException;
+import org.apache.iotdb.db.exception.metadata.IllegalPathException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.index.IndexProcessor;
 import org.apache.iotdb.db.index.common.IndexInfo;
@@ -231,6 +232,33 @@ public class ProtoIndexRouter implements IIndexRouter {
   }
 
   @Override
+  public Map<PartialPath, Map<IndexType, IndexInfo>> getIndexInfosByPrefixPath(
+      PartialPath prefixPath) {
+    // TODO prefixPath must be "prefix", i.e. ending with wildcard: root.XX.XX.*
+    // the wildcard match is costly. We'd move router into MManager
+    Map<PartialPath, Map<IndexType, IndexInfo>> res = new HashMap<>();
+    if (prefixPath != null) prefixPath.toLowerCase();
+    wildCardProcessorMap.forEach(
+        (indexSeries, struct) -> {
+          if (prefixPath == null || prefixPath.matchFullPath(indexSeries)) {
+            res.put(indexSeries, struct.infos);
+          }
+        });
+    fullPathProcessorMap.forEach(
+        (indexSeries, struct) -> {
+          try {
+            PartialPath path = new PartialPath(indexSeries);
+            if (prefixPath == null || prefixPath.matchFullPath(path)) {
+              res.put(path, struct.infos);
+            }
+          } catch (IllegalPathException e) {
+            // that's impossible but ugly, so let's move it into MManager quickly
+          }
+        });
+    return res;
+  }
+
+  @Override
   public boolean addIndexIntoRouter(
       PartialPath partialPath,
       IndexInfo indexInfo,
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
index 35dcdec..4f79284 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/constant/SQLConstant.java
@@ -100,6 +100,7 @@ public class SQLConstant {
   public static final int TOK_CREATE_INDEX = 31;
   public static final int TOK_DROP_INDEX = 32;
   public static final int TOK_QUERY_INDEX = 33;
+  public static final int TOK_SHOW_INDEX = 34;
 
   public static final int TOK_GRANT_WATERMARK_EMBEDDING = 34;
   public static final int TOK_REVOKE_WATERMARK_EMBEDDING = 35;
@@ -265,6 +266,7 @@ public class SQLConstant {
     tokenNames.put(TOK_CREATE_INDEX, "TOK_CREATE_INDEX");
     tokenNames.put(TOK_DROP_INDEX, "TOK_DROP_INDEX");
     tokenNames.put(TOK_QUERY_INDEX, "TOK_QUERY_INDEX");
+    tokenNames.put(TOK_SHOW_INDEX, "TOK_SHOW_INDEX");
 
     tokenNames.put(TOK_TRIGGER_CREATE, "TOK_TRIGGER_CREATE");
     tokenNames.put(TOK_TRIGGER_DROP, "TOK_TRIGGER_DROP");
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 db9d416..8b4cc14 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
@@ -101,6 +101,7 @@ import org.apache.iotdb.db.qp.physical.sys.ShowChildNodesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowChildPathsPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowFunctionsPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowIndexPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowStorageGroupPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
@@ -168,6 +169,9 @@ import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_DONE;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_FUNCTION_CLASS;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_FUNCTION_NAME;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_FUNCTION_TYPE;
+import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_INDEX_ATTRIBUTE;
+import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_INDEX_SERIES;
+import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_INDEX_TYPE;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_ITEM;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_PRIVILEGE;
 import static org.apache.iotdb.db.conf.IoTDBConstant.COLUMN_PROGRESS;
@@ -545,6 +549,8 @@ public class PlanExecutor implements IPlanExecutor {
         return processShowQueryProcesslist();
       case FUNCTIONS:
         return processShowFunctions((ShowFunctionsPlan) showPlan);
+      case INDEX:
+        return processShowIndex((ShowIndexPlan) showPlan);
       case TRIGGERS:
         return processShowTriggers((ShowTriggersPlan) showPlan);
       default:
@@ -829,6 +835,35 @@ public class PlanExecutor implements IPlanExecutor {
     return listDataSet;
   }
 
+  private QueryDataSet processShowIndex(ShowIndexPlan showPlan) throws QueryProcessException {
+    ListDataSet listDataSet =
+        new ListDataSet(
+            Arrays.asList(
+                new PartialPath(COLUMN_INDEX_SERIES, false),
+                new PartialPath(COLUMN_INDEX_TYPE, false),
+                new PartialPath(COLUMN_INDEX_ATTRIBUTE, false)),
+            Arrays.asList(TSDataType.TEXT, TSDataType.TEXT, TSDataType.TEXT));
+
+    Map<PartialPath, Map<IndexType, IndexInfo>> infos =
+        indexManager.getIndexInfos(showPlan.getPath());
+    infos.forEach(
+        (path, struct) ->
+            struct.forEach(
+                (indexType, info) -> {
+                  RowRecord rowRecord = new RowRecord(0); // ignore timestamp
+                  rowRecord.addField(Binary.valueOf(path.getFullPath()), TSDataType.TEXT);
+                  rowRecord.addField(Binary.valueOf(indexType.toString()), TSDataType.TEXT);
+                  rowRecord.addField(Binary.valueOf(info.toStringForShow()), TSDataType.TEXT);
+                  listDataSet.putRecord(rowRecord);
+                }));
+
+    listDataSet.sort(
+        (r1, r2) ->
+            String.CASE_INSENSITIVE_ORDER.compare(
+                r1.getFields().get(0).getStringValue(), r2.getFields().get(0).getStringValue()));
+    return listDataSet;
+  }
+
   @SuppressWarnings("squid:S3776")
   private void appendUDFs(ListDataSet listDataSet, ShowFunctionsPlan showPlan)
       throws QueryProcessException {
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowIndexOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowIndexOperator.java
new file mode 100644
index 0000000..2ff21b3
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowIndexOperator.java
@@ -0,0 +1,40 @@
+/*
+ * 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.iotdb.db.qp.logical.sys;
+
+import org.apache.iotdb.db.metadata.PartialPath;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
+
+public class ShowIndexOperator extends ShowOperator {
+
+  private PartialPath prefixPath;
+
+  public ShowIndexOperator() {
+    super(SQLConstant.TOK_SHOW_INDEX);
+  }
+
+  public PartialPath getPrefixPath() {
+    return prefixPath;
+  }
+
+  public void setPrefixPath(PartialPath prefixPath) {
+    this.prefixPath = prefixPath;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowIndexPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowIndexPlan.java
new file mode 100644
index 0000000..749d7ac
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowIndexPlan.java
@@ -0,0 +1,29 @@
+/*
+ * 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.iotdb.db.qp.physical.sys;
+
+import org.apache.iotdb.db.metadata.PartialPath;
+
+public class ShowIndexPlan extends ShowPlan {
+
+  public ShowIndexPlan(PartialPath prefixPath) {
+    super(ShowContentType.INDEX, prefixPath);
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
index a77917a..a095398 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/ShowPlan.java
@@ -114,6 +114,7 @@ public class ShowPlan extends PhysicalPlan {
     COUNT_NODES,
     MERGE_STATUS,
     FUNCTIONS,
+    INDEX,
     COUNT_DEVICES,
     COUNT_STORAGE_GROUP,
     QUERY_PROCESSLIST,
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index 33ceca0..67ff535 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -68,6 +68,7 @@ import org.apache.iotdb.db.qp.logical.sys.ShowChildNodesOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowChildPathsOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowDevicesOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowFunctionsOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowIndexOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowMergeStatusOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowStorageGroupOperator;
@@ -183,6 +184,7 @@ import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowChildPathsContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowDevicesContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowFlushTaskInfoContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowFunctionsContext;
+import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowIndexContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowMergeStatusContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowQueryProcesslistContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.ShowStorageGroupContext;
@@ -462,6 +464,15 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> {
   }
 
   @Override
+  public Operator visitShowIndex(ShowIndexContext ctx) {
+    ShowIndexOperator showIndexOperator = new ShowIndexOperator();
+    if (ctx.prefixPath() != null) {
+      showIndexOperator.setPrefixPath(parsePrefixPath(ctx.prefixPath()));
+    }
+    return showIndexOperator;
+  }
+
+  @Override
   public Operator visitCreateTrigger(CreateTriggerContext ctx) {
     CreateTriggerOperator createTriggerOperator =
         new CreateTriggerOperator(SQLConstant.TOK_TRIGGER_CREATE);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 4fddd2d..dde1f6c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -62,6 +62,7 @@ import org.apache.iotdb.db.qp.logical.sys.ShowChildNodesOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowChildPathsOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowDevicesOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowFunctionsOperator;
+import org.apache.iotdb.db.qp.logical.sys.ShowIndexOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowStorageGroupOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowTimeSeriesOperator;
@@ -112,6 +113,7 @@ import org.apache.iotdb.db.qp.physical.sys.ShowChildNodesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowChildPathsPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowFunctionsPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowIndexPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowMergeStatusPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowPlan.ShowContentType;
@@ -332,6 +334,8 @@ public class PhysicalGenerator {
             return new ShowQueryProcesslistPlan(ShowContentType.QUERY_PROCESSLIST);
           case SQLConstant.TOK_SHOW_FUNCTIONS:
             return new ShowFunctionsPlan(((ShowFunctionsOperator) operator).showTemporary());
+          case SQLConstant.TOK_SHOW_INDEX:
+            return new ShowIndexPlan(((ShowIndexOperator) operator).getPrefixPath());
           case SQLConstant.TOK_SHOW_TRIGGERS:
             return new ShowTriggersPlan(((ShowTriggersOperator) operator).getPath());
           default:
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java
index 07105ac..df85e78 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/ELBIndexReadIT.java
@@ -89,17 +89,20 @@ public class ELBIndexReadIT {
       System.out.println(String.format("SET STORAGE GROUP TO %s", storageGroupWhole));
       statement.execute(
           String.format("CREATE TIMESERIES %s WITH DATATYPE=FLOAT,ENCODING=PLAIN", speed1));
-      System.out.println(String.format("CREATE TIMESERIES %s WITH DATATYPE=FLOAT,ENCODING=PLAIN", speed1));
+      System.out.println(
+          String.format("CREATE TIMESERIES %s WITH DATATYPE=FLOAT,ENCODING=PLAIN", speed1));
 
       for (int i = 0; i < wholeSize; i++) {
         String wholePath = String.format(directionPattern, i);
         statement.execute(
             String.format("CREATE TIMESERIES %s WITH DATATYPE=FLOAT,ENCODING=PLAIN", wholePath));
-        System.out.println(String.format("CREATE TIMESERIES %s WITH DATATYPE=FLOAT,ENCODING=PLAIN", wholePath));
+        System.out.println(
+            String.format("CREATE TIMESERIES %s WITH DATATYPE=FLOAT,ENCODING=PLAIN", wholePath));
       }
       statement.execute(
           String.format("CREATE INDEX ON %s WITH INDEX=%s, BLOCK_SIZE=%d", indexSub, ELB_INDEX, 5));
-      System.out.println(String.format("CREATE INDEX ON %s WITH INDEX=%s, BLOCK_SIZE=%d", indexSub, ELB_INDEX, 5));
+      System.out.println(
+          String.format("CREATE INDEX ON %s WITH INDEX=%s, BLOCK_SIZE=%d", indexSub, ELB_INDEX, 5));
 
       TVList subInput = TVListAllocator.getInstance().allocate(TSDataType.DOUBLE);
       for (int i = 0; i < subLength; i++) {
@@ -214,7 +217,7 @@ public class ELBIndexReadIT {
           sb.append("\n");
         }
         System.out.println(sb);
-//        Assert.assertEquals(gt, sb.toString());
+        //        Assert.assertEquals(gt, sb.toString());
       }
     } catch (Exception e) {
       e.printStackTrace();
@@ -226,7 +229,7 @@ public class ELBIndexReadIT {
   public void checkRead() throws ClassNotFoundException {
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection =
-        DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
 
       String querySQL =
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java
index 0b257b2..ecef093 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java
@@ -90,9 +90,9 @@ public class MMHHIndexReadIT {
               wholeDim,
               hashLength,
               MODEL_PATH,
-//              "\"/Users/kangrong/code/github/deep-learning/hash_journal/TAH_project/src/mmhh.pt\""
-              "\"resources/index/mmhh.pt\""
-          ));
+              //
+              // "\"/Users/kangrong/code/github/deep-learning/hash_journal/TAH_project/src/mmhh.pt\""
+              "\"resources/index/mmhh.pt\""));
       //      String modelPath =
       // "/Users/kangrong/code/github/deep-learning/hash_journal/TAH_project/src/mmhh.pt";
       String modelPath = "src/test/resources/index/mmhh.pt";