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 <[email protected]> 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();
