This is an automated email from the ASF dual-hosted git repository.
bchapuis pushed a commit to branch 681-handle-the-out-of-memory-errors
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
The following commit(s) were added to
refs/heads/681-handle-the-out-of-memory-errors by this push:
new 6521b512 Format code
6521b512 is described below
commit 6521b5123c0fadcf7154983dc88cc16843d84807
Author: Bertil Chapuis <[email protected]>
AuthorDate: Tue Jul 4 23:03:36 2023 +0200
Format code
---
.../apache/baremaps/collection/JaggedDataMap.java | 394 +++++++++++----------
.../java/org/apache/baremaps/utils/ArrayUtils.java | 106 +++---
.../apache/baremaps/collection/DataMapTest.java | 6 +-
3 files changed, 265 insertions(+), 241 deletions(-)
diff --git
a/baremaps-core/src/main/java/org/apache/baremaps/collection/JaggedDataMap.java
b/baremaps-core/src/main/java/org/apache/baremaps/collection/JaggedDataMap.java
index 819a8e17..5a149c4b 100644
---
a/baremaps-core/src/main/java/org/apache/baremaps/collection/JaggedDataMap.java
+++
b/baremaps-core/src/main/java/org/apache/baremaps/collection/JaggedDataMap.java
@@ -1,214 +1,226 @@
-package org.apache.baremaps.collection;
+/*
+ * Licensed 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.
+ */
-import org.apache.baremaps.stream.StreamUtils;
+package org.apache.baremaps.collection;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;
+import org.apache.baremaps.stream.StreamUtils;
public class JaggedDataMap<E> extends DataMap<E> {
- private static final int L_BYTES = 8;
- private static final int L_SIZE = 1 << L_BYTES;
- private static final int L_MASK = L_SIZE - 1;
- private static final int L_SHIFT = 0;
-
- private static final int K_BYTES = 8;
- private static final int K_SIZE = 1 << K_BYTES;
- private static final int K_MASK = K_SIZE - 1;
- private static final int K_SHIFT = L_SHIFT + L_BYTES;
-
- private static final int J_BYTES = 12;
- private static final int J_SIZE = 1 << J_BYTES;
- private static final int J_MASK = J_SIZE - 1;
- private static final int J_SHIFT = K_SHIFT + K_BYTES;
-
- private static final int I_BYTES = 12;
- private static final int I_SIZE = 1 << I_BYTES;
- private static final int I_MASK = I_SIZE - 1;
- private static final int I_SHIFT = J_SHIFT + J_BYTES;
-
- private static final long CAPACITY = 1L << (I_BYTES + J_BYTES + K_BYTES +
L_BYTES);
-
- private long[][][][] index;
-
- private final AppendOnlyBuffer<E> values;
-
- private final AtomicLong size = new AtomicLong();
-
- /**
- * Constructs a map.
- *
- * @param values the values
- */
- public JaggedDataMap(AppendOnlyBuffer<E> values) {
- this.index = new long[I_SIZE][][][];
- this.values = values;
+ private static final int L_BYTES = 8;
+ private static final int L_SIZE = 1 << L_BYTES;
+ private static final int L_MASK = L_SIZE - 1;
+ private static final int L_SHIFT = 0;
+
+ private static final int K_BYTES = 8;
+ private static final int K_SIZE = 1 << K_BYTES;
+ private static final int K_MASK = K_SIZE - 1;
+ private static final int K_SHIFT = L_SHIFT + L_BYTES;
+
+ private static final int J_BYTES = 12;
+ private static final int J_SIZE = 1 << J_BYTES;
+ private static final int J_MASK = J_SIZE - 1;
+ private static final int J_SHIFT = K_SHIFT + K_BYTES;
+
+ private static final int I_BYTES = 12;
+ private static final int I_SIZE = 1 << I_BYTES;
+ private static final int I_MASK = I_SIZE - 1;
+ private static final int I_SHIFT = J_SHIFT + J_BYTES;
+
+ private static final long CAPACITY = 1L << (I_BYTES + J_BYTES + K_BYTES +
L_BYTES);
+
+ private long[][][][] index;
+
+ private final AppendOnlyBuffer<E> values;
+
+ private final AtomicLong size = new AtomicLong();
+
+ /**
+ * Constructs a map.
+ *
+ * @param values the values
+ */
+ public JaggedDataMap(AppendOnlyBuffer<E> values) {
+ this.index = new long[I_SIZE][][][];
+ this.values = values;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public E put(Long key, E value) {
+ long v = key;
+ if (v < 0 || v >= CAPACITY) {
+ throw new IllegalArgumentException();
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E put(Long key, E value) {
- long v = key;
- if (v < 0 || v >= CAPACITY) {
- throw new IllegalArgumentException();
- }
- int i = (int) (v >>> I_SHIFT) & I_MASK;
- int j = (int) (v >>> J_SHIFT) & J_MASK;
- int k = (int) (v >>> K_SHIFT) & K_MASK;
- int l = (int) (v >>> L_SHIFT) & L_MASK;
- if (index[i] == null) {
- index[i] = new long[J_SIZE][][];
- }
- if (index[i][j] == null) {
- index[i][j] = new long[K_SIZE][];
- }
- if (index[i][j][k] == null) {
- index[i][j][k] = new long[L_SIZE];
- Arrays.fill(index[i][j][k], -1);
- }
- long position = values.addPositioned(value);
- if (index[i][j][k][l] == -1) {
- size.incrementAndGet();
- }
- index[i][j][k][l] = position;
- return value;
+ int i = (int) (v >>> I_SHIFT) & I_MASK;
+ int j = (int) (v >>> J_SHIFT) & J_MASK;
+ int k = (int) (v >>> K_SHIFT) & K_MASK;
+ int l = (int) (v >>> L_SHIFT) & L_MASK;
+ if (index[i] == null) {
+ index[i] = new long[J_SIZE][][];
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E get(Object key) {
- long v = (Long) key;
- if (v < 0 || v >= CAPACITY) {
- throw new IllegalArgumentException();
- }
- int i = (int) (v >>> I_SHIFT) & I_MASK;
- int j = (int) (v >>> J_SHIFT) & J_MASK;
- int k = (int) (v >>> K_SHIFT) & K_MASK;
- int l = (int) (v >>> L_SHIFT) & L_MASK;
- if (index[i] == null) {
- return null;
- }
- if (index[i][j] == null) {
- return null;
- }
- if (index[i][j][k] == null) {
- return null;
- }
- long position = index[i][j][k][l];
- if (position == -1) {
- return null;
- }
- return values.read(position);
+ if (index[i][j] == null) {
+ index[i][j] = new long[K_SIZE][];
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected Iterator<Long> keyIterator() {
- return IntStream.range(0, index.length)
- .filter(i -> index[i] != null)
- .mapToObj(i -> IntStream.range(0, index[i].length)
- .filter(j -> index[i][j] != null)
- .mapToObj(j -> IntStream.range(0, index[i][j].length)
- .filter(k -> index[i][j][k] != null)
- .mapToObj(k -> IntStream.range(0,
index[i][j][k].length)
- .filter(l -> index[i][j][k][l] != -1)
- .mapToObj(l -> (long) ((i << I_SHIFT)
| (j << J_SHIFT) | (k << K_SHIFT) | (l << L_SHIFT))))
- .flatMap(x -> x))
- .flatMap(x -> x))
- .flatMap(x -> x)
- .iterator();
+ if (index[i][j][k] == null) {
+ index[i][j][k] = new long[L_SIZE];
+ Arrays.fill(index[i][j][k], -1);
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected Iterator<E> valueIterator() {
- return StreamUtils.stream(keyIterator()).map(this::get).iterator();
+ long position = values.addPositioned(value);
+ if (index[i][j][k][l] == -1) {
+ size.incrementAndGet();
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected Iterator<Entry<Long, E>> entryIterator() {
- return StreamUtils.stream(keyIterator()).map(key -> Map.entry(key,
get(key))).iterator();
+ index[i][j][k][l] = position;
+ return value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public E get(Object key) {
+ long v = (Long) key;
+ if (v < 0 || v >= CAPACITY) {
+ throw new IllegalArgumentException();
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isEmpty() {
- return StreamUtils.stream(keyIterator()).findAny().isEmpty();
+ int i = (int) (v >>> I_SHIFT) & I_MASK;
+ int j = (int) (v >>> J_SHIFT) & J_MASK;
+ int k = (int) (v >>> K_SHIFT) & K_MASK;
+ int l = (int) (v >>> L_SHIFT) & L_MASK;
+ if (index[i] == null) {
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public long sizeAsLong() {
- return size.get();
+ if (index[i][j] == null) {
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean containsKey(Object key) {
- return get(key) != null;
+ if (index[i][j][k] == null) {
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean containsValue(Object value) {
- return StreamUtils.stream(valueIterator()).anyMatch(v ->
v.equals(value));
+ long position = index[i][j][k][l];
+ if (position == -1) {
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public E remove(Object key) {
- long v = (Long) key;
- int i = (int) (v >>> I_SHIFT) & I_MASK;
- int j = (int) (v >>> J_SHIFT) & J_MASK;
- int k = (int) (v >>> K_SHIFT) & K_MASK;
- int l = (int) (v >>> L_SHIFT) & L_MASK;
- if (index[i] == null) {
- return null;
- }
- if (index[i][j] == null) {
- return null;
- }
- if (index[i][j][k] == null) {
- return null;
- }
- long position = index[i][j][k][l];
- if (position == -1) {
- return null;
- }
- size.decrementAndGet();
- index[i][j][k][l] = -1;
- return values.read(position);
+ return values.read(position);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Iterator<Long> keyIterator() {
+ return IntStream.range(0, index.length)
+ .filter(i -> index[i] != null)
+ .mapToObj(i -> IntStream.range(0, index[i].length)
+ .filter(j -> index[i][j] != null)
+ .mapToObj(j -> IntStream.range(0, index[i][j].length)
+ .filter(k -> index[i][j][k] != null)
+ .mapToObj(k -> IntStream.range(0, index[i][j][k].length)
+ .filter(l -> index[i][j][k][l] != -1)
+ .mapToObj(l -> (long) ((i << I_SHIFT) | (j << J_SHIFT) |
(k << K_SHIFT)
+ | (l << L_SHIFT))))
+ .flatMap(x -> x))
+ .flatMap(x -> x))
+ .flatMap(x -> x)
+ .iterator();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Iterator<E> valueIterator() {
+ return StreamUtils.stream(keyIterator()).map(this::get).iterator();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Iterator<Entry<Long, E>> entryIterator() {
+ return StreamUtils.stream(keyIterator()).map(key -> Map.entry(key,
get(key))).iterator();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isEmpty() {
+ return StreamUtils.stream(keyIterator()).findAny().isEmpty();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public long sizeAsLong() {
+ return size.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean containsKey(Object key) {
+ return get(key) != null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean containsValue(Object value) {
+ return StreamUtils.stream(valueIterator()).anyMatch(v -> v.equals(value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public E remove(Object key) {
+ long v = (Long) key;
+ int i = (int) (v >>> I_SHIFT) & I_MASK;
+ int j = (int) (v >>> J_SHIFT) & J_MASK;
+ int k = (int) (v >>> K_SHIFT) & K_MASK;
+ int l = (int) (v >>> L_SHIFT) & L_MASK;
+ if (index[i] == null) {
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void clear() {
- index = new long[I_SIZE][][][];
+ if (index[i][j] == null) {
+ return null;
+ }
+ if (index[i][j][k] == null) {
+ return null;
+ }
+ long position = index[i][j][k][l];
+ if (position == -1) {
+ return null;
}
+ size.decrementAndGet();
+ index[i][j][k][l] = -1;
+ return values.read(position);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void clear() {
+ index = new long[I_SIZE][][][];
+ }
}
diff --git
a/baremaps-core/src/main/java/org/apache/baremaps/utils/ArrayUtils.java
b/baremaps-core/src/main/java/org/apache/baremaps/utils/ArrayUtils.java
index 0b70db72..bbcf9699 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/utils/ArrayUtils.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/utils/ArrayUtils.java
@@ -1,64 +1,76 @@
+/*
+ * Licensed 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.baremaps.utils;
public class ArrayUtils {
- private ArrayUtils() {
+ private ArrayUtils() {
- }
+ }
- public static Object of(int dimensions, int size) {
- return switch (dimensions) {
- case 1 -> d1(size);
- case 2 -> d2(size);
- case 3 -> d3(size);
- case 4 -> d4(size);
- case 5 -> d5(size);
- case 6 -> d6(size);
- case 7 -> d7(size);
- case 8 -> d8(size);
- case 9 -> d9(size);
- case 10 -> d10(size);
- default -> throw new IllegalArgumentException("Unsupported
dimension");
- };
- }
+ public static Object of(int dimensions, int size) {
+ return switch (dimensions) {
+ case 1 -> d1(size);
+ case 2 -> d2(size);
+ case 3 -> d3(size);
+ case 4 -> d4(size);
+ case 5 -> d5(size);
+ case 6 -> d6(size);
+ case 7 -> d7(size);
+ case 8 -> d8(size);
+ case 9 -> d9(size);
+ case 10 -> d10(size);
+ default -> throw new IllegalArgumentException("Unsupported dimension");
+ };
+ }
- private static Object d1(int size) {
- return new long[size];
- }
+ private static Object d1(int size) {
+ return new long[size];
+ }
- private static Object d2(int size) {
- return new long[size][];
- }
+ private static Object d2(int size) {
+ return new long[size][];
+ }
- private static Object d3(int size) {
- return new long[size][][];
- }
+ private static Object d3(int size) {
+ return new long[size][][];
+ }
- private static Object d4(int size) {
- return new long[size][][][];
- }
+ private static Object d4(int size) {
+ return new long[size][][][];
+ }
- private static Object d5(int size) {
- return new long[size][][][][];
- }
+ private static Object d5(int size) {
+ return new long[size][][][][];
+ }
- private static Object d6(int size) {
- return new long[size][][][][][];
- }
+ private static Object d6(int size) {
+ return new long[size][][][][][];
+ }
- private static Object d7(int size) {
- return new long[size][][][][][][];
- }
+ private static Object d7(int size) {
+ return new long[size][][][][][][];
+ }
- private static Object d8(int size) {
- return new long[size][][][][][][][];
- }
+ private static Object d8(int size) {
+ return new long[size][][][][][][][];
+ }
- private static Object d9(int size) {
- return new long[size][][][][][][][][];
- }
+ private static Object d9(int size) {
+ return new long[size][][][][][][][][];
+ }
- public static Object d10(int size) {
- return new long[size][][][][][][][][][];
- }
+ public static Object d10(int size) {
+ return new long[size][][][][][][][][][];
+ }
}
diff --git
a/baremaps-core/src/test/java/org/apache/baremaps/collection/DataMapTest.java
b/baremaps-core/src/test/java/org/apache/baremaps/collection/DataMapTest.java
index ed662384..5cf09971 100644
---
a/baremaps-core/src/test/java/org/apache/baremaps/collection/DataMapTest.java
+++
b/baremaps-core/src/test/java/org/apache/baremaps/collection/DataMapTest.java
@@ -156,9 +156,9 @@ class DataMapTest {
static Stream<Arguments> mapProvider() {
return Stream
.of(
- Arguments.of(
- new JaggedDataMap<>(
- new AppendOnlyBuffer<>(new LongDataType(), new
OffHeapMemory()))),
+ Arguments.of(
+ new JaggedDataMap<>(
+ new AppendOnlyBuffer<>(new LongDataType(), new
OffHeapMemory()))),
Arguments.of(
new IndexedDataMap<>(
new AppendOnlyBuffer<>(new LongDataType(), new
OffHeapMemory()))),