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();