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

rong pushed a commit to branch tsfile-vector-index
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 3962089f7395067cb89ac39052329569cb6031cc
Author: Steve Yurong Su <[email protected]>
AuthorDate: Mon Jun 28 11:37:51 2021 +0800

    refactor MetadataIndexConstructor
---
 .../file/metadata/MetadataIndexConstructor.java    | 70 +++++++++++++---------
 1 file changed, 41 insertions(+), 29 deletions(-)

diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/MetadataIndexConstructor.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/MetadataIndexConstructor.java
index 57a9b25..c9a68fd 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/MetadataIndexConstructor.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/MetadataIndexConstructor.java
@@ -46,7 +46,6 @@ public class MetadataIndexConstructor {
    * @param deviceTimeseriesMetadataMap device => TimeseriesMetadata list
    * @param out tsfile output
    */
-  @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   public static MetadataIndexNode constructMetadataIndex(
       Map<String, List<TimeseriesMetadata>> deviceTimeseriesMetadataMap, 
TsFileOutput out)
       throws IOException {
@@ -57,55 +56,55 @@ public class MetadataIndexConstructor {
       if (entry.getValue().isEmpty()) {
         continue;
       }
+
       Queue<MetadataIndexNode> measurementMetadataIndexQueue = new 
ArrayDeque<>();
-      TimeseriesMetadata timeseriesMetadata;
       MetadataIndexNode currentIndexNode =
           new MetadataIndexNode(MetadataIndexNodeType.LEAF_MEASUREMENT);
-      int serializedTimeseriesMetadataNum = 0;
+      int serializedTimeseriesMetadataNumberInCurrentIndexNode = 0;
+
       for (int i = 0; i < entry.getValue().size(); i++) {
-        timeseriesMetadata = entry.getValue().get(i);
-        if (timeseriesMetadata.isTimeColumn()) {
-          // calculate the number of value columns in this vector
-          int numOfValueColumns = 0;
-          for (int j = i + 1; j < entry.getValue().size(); j++) {
-            if (entry.getValue().get(j).isValueColumn()) {
-              numOfValueColumns++;
-            } else {
-              break;
-            }
-          }
+        TimeseriesMetadata timeseriesMetadata = entry.getValue().get(i);
 
+        if (timeseriesMetadata.isTimeColumn()) {
           // for each vector, add time column of vector into LEAF_MEASUREMENT 
node
           currentIndexNode.addEntry(
               new MetadataIndexEntry(timeseriesMetadata.getMeasurementId(), 
out.getPosition()));
-          serializedTimeseriesMetadataNum = 0;
+          serializedTimeseriesMetadataNumberInCurrentIndexNode = 0;
 
+          // serialize timeseries metadata of time column
           timeseriesMetadata.serializeTo(out.wrapAsStream());
-          serializedTimeseriesMetadataNum++;
-          for (int j = 0; j < numOfValueColumns; j++) {
-            i++;
-            timeseriesMetadata = entry.getValue().get(i);
+          serializedTimeseriesMetadataNumberInCurrentIndexNode++;
+
+          // serialize timeseries metadata of value columns
+          int numberOfValueColumns = 
countValueColumnsStartFrom(entry.getValue(), i);
+          for (int j = 1; j <= numberOfValueColumns; j++) {
             // value columns of vector should not be added into 
LEAF_MEASUREMENT node
-            timeseriesMetadata.serializeTo(out.wrapAsStream());
-            serializedTimeseriesMetadataNum++;
+            entry.getValue().get(i + j).serializeTo(out.wrapAsStream());
+            serializedTimeseriesMetadataNumberInCurrentIndexNode++;
           }
+
+          // timeseries metadata of value columns in entry has been serialized
+          i += numberOfValueColumns;
         } else {
           // when constructing from leaf node, every "degree number of nodes" 
are related to an
           // entry
-          if (serializedTimeseriesMetadataNum == 0
-              || serializedTimeseriesMetadataNum >= 
config.getMaxDegreeOfIndexNode()) {
+          if (serializedTimeseriesMetadataNumberInCurrentIndexNode == 0
+              || serializedTimeseriesMetadataNumberInCurrentIndexNode
+                  >= config.getMaxDegreeOfIndexNode()) {
             if (currentIndexNode.isFull()) {
               addCurrentIndexNodeToQueue(currentIndexNode, 
measurementMetadataIndexQueue, out);
               currentIndexNode = new 
MetadataIndexNode(MetadataIndexNodeType.LEAF_MEASUREMENT);
             }
             currentIndexNode.addEntry(
                 new MetadataIndexEntry(timeseriesMetadata.getMeasurementId(), 
out.getPosition()));
-            serializedTimeseriesMetadataNum = 0;
+            serializedTimeseriesMetadataNumberInCurrentIndexNode = 0;
           }
+
           timeseriesMetadata.serializeTo(out.wrapAsStream());
-          serializedTimeseriesMetadataNum++;
+          serializedTimeseriesMetadataNumberInCurrentIndexNode++;
         }
       }
+
       addCurrentIndexNodeToQueue(currentIndexNode, 
measurementMetadataIndexQueue, out);
       deviceMetadataIndexMap.put(
           entry.getKey(),
@@ -127,25 +126,38 @@ public class MetadataIndexConstructor {
     }
 
     // else, build level index for devices
-    Queue<MetadataIndexNode> deviceMetadaIndexQueue = new ArrayDeque<>();
+    Queue<MetadataIndexNode> deviceMetadataIndexQueue = new ArrayDeque<>();
     MetadataIndexNode currentIndexNode = new 
MetadataIndexNode(MetadataIndexNodeType.LEAF_DEVICE);
 
     for (Map.Entry<String, MetadataIndexNode> entry : 
deviceMetadataIndexMap.entrySet()) {
       // when constructing from internal node, each node is related to an entry
       if (currentIndexNode.isFull()) {
-        addCurrentIndexNodeToQueue(currentIndexNode, deviceMetadaIndexQueue, 
out);
+        addCurrentIndexNodeToQueue(currentIndexNode, deviceMetadataIndexQueue, 
out);
         currentIndexNode = new 
MetadataIndexNode(MetadataIndexNodeType.LEAF_DEVICE);
       }
       currentIndexNode.addEntry(new MetadataIndexEntry(entry.getKey(), 
out.getPosition()));
       entry.getValue().serializeTo(out.wrapAsStream());
     }
-    addCurrentIndexNodeToQueue(currentIndexNode, deviceMetadaIndexQueue, out);
+    addCurrentIndexNodeToQueue(currentIndexNode, deviceMetadataIndexQueue, 
out);
     MetadataIndexNode deviceMetadataIndexNode =
-        generateRootNode(deviceMetadaIndexQueue, out, 
MetadataIndexNodeType.INTERNAL_DEVICE);
+        generateRootNode(deviceMetadataIndexQueue, out, 
MetadataIndexNodeType.INTERNAL_DEVICE);
     deviceMetadataIndexNode.setEndOffset(out.getPosition());
     return deviceMetadataIndexNode;
   }
 
+  private static int countValueColumnsStartFrom(
+      List<TimeseriesMetadata> timeseriesMetadataListOfOneDevice, int 
timeColumnIndex) {
+    int numberOfValueColumns = 0;
+    for (int i = timeColumnIndex + 1; i < 
timeseriesMetadataListOfOneDevice.size(); ++i) {
+      if (timeseriesMetadataListOfOneDevice.get(i).isValueColumn()) {
+        ++numberOfValueColumns;
+      } else {
+        break;
+      }
+    }
+    return numberOfValueColumns;
+  }
+
   /**
    * Generate root node, using the nodes in the queue as leaf nodes. The final 
metadata tree has two
    * levels: measurement leaf nodes will generate to measurement root node; 
device leaf nodes will

Reply via email to