You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2021/12/06 07:50:53 UTC

[iotdb] 01/01: Implement IoTDBArrayList

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

haonan pushed a commit to branch iotdb_arrayList_0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 435e2ffd883881db457ad13acd16da95e56675d2
Author: HTHou <hh...@outlook.com>
AuthorDate: Mon Dec 6 15:49:19 2021 +0800

    Implement IoTDBArrayList
---
 .../org/apache/iotdb/db/utils/IoTDBArrayList.java  | 175 +++++++++++++++++++++
 .../iotdb/db/utils/datastructure/BinaryTVList.java |   4 +-
 .../db/utils/datastructure/BooleanTVList.java      |   4 +-
 .../iotdb/db/utils/datastructure/DoubleTVList.java |   4 +-
 .../iotdb/db/utils/datastructure/FloatTVList.java  |   4 +-
 .../iotdb/db/utils/datastructure/IntTVList.java    |   4 +-
 .../iotdb/db/utils/datastructure/LongTVList.java   |   4 +-
 .../iotdb/db/utils/datastructure/TVList.java       |   4 +-
 8 files changed, 189 insertions(+), 14 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/utils/IoTDBArrayList.java b/server/src/main/java/org/apache/iotdb/db/utils/IoTDBArrayList.java
new file mode 100644
index 0000000..be27799
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/utils/IoTDBArrayList.java
@@ -0,0 +1,175 @@
+/*
+ * 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.utils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class IoTDBArrayList<E> extends ArrayList<E> {
+
+  private static final int DEFAULT_CAPACITY = 1;
+  private static final Object[] EMPTY_ELEMENTDATA = new Object[0];
+  private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
+  transient Object[] elementData;
+  private int size;
+  private static final int MAX_ARRAY_SIZE = 2147483639;
+
+  public IoTDBArrayList(int initialCapacity) {
+    super();
+    if (initialCapacity > 0) {
+      this.elementData = new Object[initialCapacity];
+    } else {
+      if (initialCapacity != 0) {
+        throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
+      }
+
+      this.elementData = EMPTY_ELEMENTDATA;
+    }
+  }
+
+  public IoTDBArrayList() {
+    super();
+    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
+  }
+
+  private Object[] grow(int minCapacity) {
+    return this.elementData = Arrays.copyOf(this.elementData, this.newCapacity(minCapacity));
+  }
+
+  private Object[] grow() {
+    return this.grow(this.size + 1);
+  }
+
+  @Override
+  public int size() {
+    return this.size;
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return this.size == 0;
+  }
+
+  @Override
+  public E get(int index) {
+    return this.elementData(index);
+  }
+
+  E elementData(int index) {
+    return (E) this.elementData[index];
+  }
+
+  public E set(int index, E element) {
+    E oldValue = this.elementData(index);
+    this.elementData[index] = element;
+    return oldValue;
+  }
+
+  private void add(E e, Object[] elementData, int s) {
+    if (s == elementData.length) {
+      elementData = this.grow();
+    }
+
+    elementData[s] = e;
+    this.size = s + 1;
+  }
+
+  public boolean add(E e) {
+    ++this.modCount;
+    this.add(e, this.elementData, this.size);
+    return true;
+  }
+
+  public void add(int index, E element) {
+    ++this.modCount;
+    int s;
+    Object[] elementData;
+    if ((s = this.size) == (elementData = this.elementData).length) {
+      elementData = this.grow();
+    }
+
+    System.arraycopy(elementData, index, elementData, index + 1, s - index);
+    elementData[index] = element;
+    this.size = s + 1;
+  }
+
+  private int newCapacity(int minCapacity) {
+    int oldCapacity = this.elementData.length;
+    int newCapacity = oldCapacity + 1;
+    if (newCapacity - minCapacity <= 0) {
+      if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
+        return Math.max(1, minCapacity);
+      } else if (minCapacity < 0) {
+        throw new OutOfMemoryError();
+      } else {
+        return minCapacity;
+      }
+    } else {
+      return newCapacity - 2147483639 <= 0 ? newCapacity : hugeCapacity(minCapacity);
+    }
+  }
+
+  private static int hugeCapacity(int minCapacity) {
+    if (minCapacity < 0) {
+      throw new OutOfMemoryError();
+    } else {
+      return minCapacity > 2147483639 ? 2147483647 : 2147483639;
+    }
+  }
+
+  @Override
+  public E remove(int index) {
+    Object[] es = this.elementData;
+    E oldValue = (E) es[index];
+    this.fastRemove(es, index);
+    return oldValue;
+  }
+
+  private void fastRemove(Object[] es, int i) {
+    ++this.modCount;
+    int newSize;
+    if ((newSize = this.size - 1) > i) {
+      System.arraycopy(es, i + 1, es, i, newSize - i);
+    }
+
+    es[this.size = newSize] = null;
+  }
+
+  @Override
+  public void clear() {
+    ++this.modCount;
+    Object[] es = this.elementData;
+    int to = this.size;
+
+    for (int i = this.size = 0; i < to; ++i) {
+      es[i] = null;
+    }
+    trimToSize();
+  }
+
+  @Override
+  public void trimToSize() {
+    ++this.modCount;
+    if (this.size < this.elementData.length) {
+      this.elementData =
+          this.size == 0 ? EMPTY_ELEMENTDATA : Arrays.copyOf(this.elementData, this.size);
+    }
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java
index bf62d63..52999d1 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java
@@ -19,13 +19,13 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.Binary;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.iotdb.db.rescon.PrimitiveArrayManager.ARRAY_SIZE;
@@ -40,7 +40,7 @@ public class BinaryTVList extends TVList {
 
   BinaryTVList() {
     super();
-    values = new ArrayList<>();
+    values = new IoTDBArrayList<>();
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java
index e293544..02547b0 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java
@@ -19,12 +19,12 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.iotdb.db.rescon.PrimitiveArrayManager.ARRAY_SIZE;
@@ -39,7 +39,7 @@ public class BooleanTVList extends TVList {
 
   BooleanTVList() {
     super();
-    values = new ArrayList<>();
+    values = new IoTDBArrayList<>();
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
index d7e8178..2987b48 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
@@ -19,13 +19,13 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.db.utils.MathUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.iotdb.db.rescon.PrimitiveArrayManager.ARRAY_SIZE;
@@ -40,7 +40,7 @@ public class DoubleTVList extends TVList {
 
   DoubleTVList() {
     super();
-    values = new ArrayList<>();
+    values = new IoTDBArrayList<>();
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
index d2ead4b..6c7c770 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
@@ -19,13 +19,13 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.db.utils.MathUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.iotdb.db.rescon.PrimitiveArrayManager.ARRAY_SIZE;
@@ -40,7 +40,7 @@ public class FloatTVList extends TVList {
 
   FloatTVList() {
     super();
-    values = new ArrayList<>();
+    values = new IoTDBArrayList<>();
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java
index caab7d9..759b672 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java
@@ -19,12 +19,12 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.iotdb.db.rescon.PrimitiveArrayManager.ARRAY_SIZE;
@@ -39,7 +39,7 @@ public class IntTVList extends TVList {
 
   IntTVList() {
     super();
-    values = new ArrayList<>();
+    values = new IoTDBArrayList<>();
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java
index 1459e39..4bef620 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java
@@ -19,12 +19,12 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.iotdb.db.rescon.PrimitiveArrayManager.ARRAY_SIZE;
@@ -39,7 +39,7 @@ public class LongTVList extends TVList {
 
   LongTVList() {
     super();
-    values = new ArrayList<>();
+    values = new IoTDBArrayList<>();
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java
index 8ce6295..fd15014 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.utils.datastructure;
 
 import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
+import org.apache.iotdb.db.utils.IoTDBArrayList;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -29,7 +30,6 @@ import org.apache.iotdb.tsfile.read.reader.IPointReader;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -53,7 +53,7 @@ public abstract class TVList {
   private long version;
 
   public TVList() {
-    timestamps = new ArrayList<>();
+    timestamps = new IoTDBArrayList<>();
     size = 0;
     minTime = Long.MAX_VALUE;
     referenceCount = new AtomicInteger();