diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index eab4d572c3..dee7d3472b 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -29,3 +29,4 @@ updates:
schedule:
interval: "weekly"
day: "sunday"
+ open-pull-requests-limit: 50
diff --git a/.github/workflows/stale-prs.yml b/.github/workflows/stale-prs.yml
new file mode 100644
index 0000000000..fe726c4812
--- /dev/null
+++ b/.github/workflows/stale-prs.yml
@@ -0,0 +1,55 @@
+# 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.
+
+name: Stale pull requests
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+
+permissions:
+ pull-requests: write
+ issues: write
+
+jobs:
+ stale:
+ runs-on: ubuntu-slim
+ steps:
+ - name: Mark and close stale pull requests
+ uses: actions/stale@v9
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ # Don't touch issues.
+ days-before-issue-stale: -1
+ days-before-issue-close: -1
+ # PRs stale after 2 months of inactivity and closed 1 month later.
+ days-before-pr-stale: 60
+ days-before-pr-close: 30
+ stale-pr-label: stale
+ stale-pr-message: >
+ This pull request has been automatically marked as stale because it has
+ had no activity for at least 2 months. If you are still working on this
+ change or plan to move it forward, please leave a comment or push a new
+ commit so we know to keep it open. Otherwise, this PR will be closed
+ automatically in about one month. Thank you for your contribution to
+ Apache Parquet!
+ close-pr-message: >
+ Closing this pull request due to at least 3 months of inactivity. If you
+ would like to continue the work, please feel free to reopen this pull
+ request or open a new one. Thank you for your contribution to
+ Apache Parquet!
diff --git a/README.md b/README.md
index ff6f162151..221970ee93 100644
--- a/README.md
+++ b/README.md
@@ -153,29 +153,29 @@ The build runs in [GitHub Actions](https://github.com/apache/parquet-java/action
## Add Parquet as a dependency in Maven
-The current release is version `1.15.1`.
+The current release is version `1.17.0`.
```xml
* // required group zipMap (MAP) {
- * // repeated group map (MAP_KEY_VALUE) {
+ * // repeated group map {
* // required float key
* // optional int32 value
* // }
@@ -122,7 +122,7 @@
*
*
* // required group zipMap (MAP) {
- * // repeated group map (MAP_KEY_VALUE) {
+ * // repeated group map {
* // required group key {
* // optional int64 first;
* // required group second {
diff --git a/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestSizeStatistics.java b/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestSizeStatistics.java
index 813298c2b6..786d2be2c3 100644
--- a/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestSizeStatistics.java
+++ b/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestSizeStatistics.java
@@ -18,8 +18,8 @@
*/
package org.apache.parquet.column.statistics;
-import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
import java.util.Optional;
import org.apache.parquet.io.api.Binary;
import org.apache.parquet.schema.LogicalTypeAnnotation;
@@ -47,8 +47,8 @@ public void testAddBinaryType() {
builder.add(1, 1);
SizeStatistics statistics = builder.build();
Assert.assertEquals(Optional.of(3L), statistics.getUnencodedByteArrayDataBytes());
- Assert.assertEquals(Arrays.asList(3L, 3L, 1L), statistics.getRepetitionLevelHistogram());
- Assert.assertEquals(Arrays.asList(2L, 2L, 3L), statistics.getDefinitionLevelHistogram());
+ Assert.assertEquals(List.of(3L, 3L, 1L), statistics.getRepetitionLevelHistogram());
+ Assert.assertEquals(List.of(2L, 2L, 3L), statistics.getDefinitionLevelHistogram());
}
@Test
@@ -67,7 +67,7 @@ public void testAddNonBinaryType() {
builder.add(1, 0);
SizeStatistics statistics = builder.build();
Assert.assertEquals(Optional.empty(), statistics.getUnencodedByteArrayDataBytes());
- Assert.assertEquals(Arrays.asList(2L, 4L), statistics.getRepetitionLevelHistogram());
+ Assert.assertEquals(List.of(2L, 4L), statistics.getRepetitionLevelHistogram());
Assert.assertEquals(Collections.emptyList(), statistics.getDefinitionLevelHistogram());
}
@@ -89,8 +89,8 @@ public void testMergeStatistics() {
SizeStatistics statistics2 = builder2.build();
statistics1.mergeStatistics(statistics2);
Assert.assertEquals(Optional.of(5L), statistics1.getUnencodedByteArrayDataBytes());
- Assert.assertEquals(Arrays.asList(3L, 1L, 1L), statistics1.getRepetitionLevelHistogram());
- Assert.assertEquals(Arrays.asList(1L, 3L, 1L), statistics1.getDefinitionLevelHistogram());
+ Assert.assertEquals(List.of(3L, 1L, 1L), statistics1.getRepetitionLevelHistogram());
+ Assert.assertEquals(List.of(1L, 3L, 1L), statistics1.getDefinitionLevelHistogram());
}
@Test
@@ -122,8 +122,8 @@ public void testCopyStatistics() {
SizeStatistics statistics = builder.build();
SizeStatistics copy = statistics.copy();
Assert.assertEquals(Optional.of(3L), copy.getUnencodedByteArrayDataBytes());
- Assert.assertEquals(Arrays.asList(1L, 1L, 1L), copy.getRepetitionLevelHistogram());
- Assert.assertEquals(Arrays.asList(1L, 1L, 1L), copy.getDefinitionLevelHistogram());
+ Assert.assertEquals(List.of(1L, 1L, 1L), copy.getRepetitionLevelHistogram());
+ Assert.assertEquals(List.of(1L, 1L, 1L), copy.getDefinitionLevelHistogram());
}
@Test
diff --git a/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestStatistics.java b/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestStatistics.java
index dec244f629..92eaa7a302 100644
--- a/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestStatistics.java
+++ b/parquet-column/src/test/java/org/apache/parquet/column/statistics/TestStatistics.java
@@ -927,4 +927,15 @@ public void testNoopStatistics() {
assertThrows(UnsupportedOperationException.class, stats::minAsString);
assertThrows(UnsupportedOperationException.class, () -> stats.isSmallerThan(0));
}
+
+ @Test
+ public void testBinaryIsSmallerThanNoOverflowForLargeValues() {
+ BinaryStatistics stats = new BinaryStatistics();
+ // Create a Binary whose length() reports 2^30 without allocating 1 GB
+ Binary fakeLarge = Binary.fromConstantByteArray(new byte[0], 0, 1 << 30);
+ stats.updateStats(fakeLarge);
+
+ // min.length() + max.length() = 2^31, must not overflow int to negative
+ assertFalse(stats.isSmallerThan(4096));
+ }
}
diff --git a/parquet-column/src/test/java/org/apache/parquet/column/values/bytestreamsplit/ByteStreamSplitValuesReaderTest.java b/parquet-column/src/test/java/org/apache/parquet/column/values/bytestreamsplit/ByteStreamSplitValuesReaderTest.java
index 348d245595..dc37ed67ca 100644
--- a/parquet-column/src/test/java/org/apache/parquet/column/values/bytestreamsplit/ByteStreamSplitValuesReaderTest.java
+++ b/parquet-column/src/test/java/org/apache/parquet/column/values/bytestreamsplit/ByteStreamSplitValuesReaderTest.java
@@ -37,7 +37,7 @@ private static Reader makeReader(byte[] input, int
throws Exception {
ByteBuffer buffer = ByteBuffer.wrap(input);
ByteBufferInputStream stream = ByteBufferInputStream.wrap(buffer);
- Reader reader = cls.newInstance();
+ Reader reader = cls.getDeclaredConstructor().newInstance();
reader.initFromPage(length, stream);
return reader;
}
diff --git a/parquet-column/src/test/java/org/apache/parquet/column/values/rle/TestRunLengthBitPackingHybridEncoder.java b/parquet-column/src/test/java/org/apache/parquet/column/values/rle/TestRunLengthBitPackingHybridEncoder.java
index 7ec5a9568c..93a6c8deb4 100644
--- a/parquet-column/src/test/java/org/apache/parquet/column/values/rle/TestRunLengthBitPackingHybridEncoder.java
+++ b/parquet-column/src/test/java/org/apache/parquet/column/values/rle/TestRunLengthBitPackingHybridEncoder.java
@@ -22,7 +22,6 @@
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import org.apache.parquet.bytes.BytesUtils;
import org.apache.parquet.bytes.DirectByteBufferAllocator;
@@ -187,7 +186,7 @@ public void testTransitionFromBitPackingToRle() throws Exception {
assertEquals(3, BytesUtils.readUnsignedVarInt(is));
List values = unpack(3, 8, is);
- assertEquals(Arrays.asList(0, 1, 0, 1, 0, 2, 2, 2), values);
+ assertEquals(List.of(0, 1, 0, 1, 0, 2, 2, 2), values);
// header = 100 << 1 = 200
assertEquals(200, BytesUtils.readUnsignedVarInt(is));
@@ -212,7 +211,7 @@ public void testPaddingZerosOnUnfinishedBitPackedRuns() throws Exception {
List values = unpack(5, 16, is);
- assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0), values);
+ assertEquals(List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0), values);
assertEquals(-1, is.read());
}
diff --git a/parquet-column/src/test/java/org/apache/parquet/filter2/recordlevel/TestValueInspector.java b/parquet-column/src/test/java/org/apache/parquet/filter2/recordlevel/TestValueInspector.java
index a164e96665..e0c55c2764 100644
--- a/parquet-column/src/test/java/org/apache/parquet/filter2/recordlevel/TestValueInspector.java
+++ b/parquet-column/src/test/java/org/apache/parquet/filter2/recordlevel/TestValueInspector.java
@@ -24,7 +24,6 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import java.util.Arrays;
import java.util.List;
import org.apache.parquet.filter2.recordlevel.IncrementallyUpdatedFilterPredicate.ValueInspector;
import org.junit.Test;
@@ -83,7 +82,7 @@ public void testLifeCycle() {
@Test
public void testReusable() {
- List values = Arrays.asList(2, 4, 7, 3, 8, 8, 11, 200);
+ List values = List.of(2, 4, 7, 3, 8, 8, 11, 200);
ValueInspector v = intIsEven();
for (Integer x : values) {
diff --git a/parquet-column/src/test/java/org/apache/parquet/internal/column/columnindex/TestColumnIndexBuilder.java b/parquet-column/src/test/java/org/apache/parquet/internal/column/columnindex/TestColumnIndexBuilder.java
index 58a899eefc..6274f36263 100644
--- a/parquet-column/src/test/java/org/apache/parquet/internal/column/columnindex/TestColumnIndexBuilder.java
+++ b/parquet-column/src/test/java/org/apache/parquet/internal/column/columnindex/TestColumnIndexBuilder.java
@@ -18,7 +18,6 @@
*/
package org.apache.parquet.internal.column.columnindex;
-import static java.util.Arrays.asList;
import static org.apache.parquet.filter2.predicate.FilterApi.and;
import static org.apache.parquet.filter2.predicate.FilterApi.binaryColumn;
import static org.apache.parquet.filter2.predicate.FilterApi.booleanColumn;
@@ -688,8 +687,8 @@ public void testStaticBuildBinary() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(BINARY).as(UTF8).named("test_binary_utf8"),
BoundaryOrder.ASCENDING,
- asList(true, true, false, false, true, false, true, false),
- asList(1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l),
+ List.of(true, true, false, false, true, false, true, false),
+ List.of(1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l),
toBBList(
null,
null,
@@ -738,7 +737,7 @@ public void testFilterWithoutNullCounts() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(BINARY).as(UTF8).named("test_binary_utf8"),
BoundaryOrder.ASCENDING,
- asList(true, true, false, false, true, false, true, false),
+ List.of(true, true, false, false, true, false, true, false),
null,
toBBList(
null,
@@ -904,8 +903,8 @@ public void testStaticBuildBoolean() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(BOOLEAN).named("test_boolean"),
BoundaryOrder.DESCENDING,
- asList(false, true, false, true, false, true),
- asList(9l, 8l, 7l, 6l, 5l, 0l),
+ List.of(false, true, false, true, false, true),
+ List.of(9l, 8l, 7l, 6l, 5l, 0l),
toBBList(false, null, false, null, true, null),
toBBList(true, null, false, null, true, null));
assertEquals(BoundaryOrder.DESCENDING, columnIndex.getBoundaryOrder());
@@ -1058,8 +1057,8 @@ public void testStaticBuildDouble() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(DOUBLE).named("test_double"),
BoundaryOrder.UNORDERED,
- asList(false, false, false, false, false, false),
- asList(0l, 1l, 2l, 3l, 4l, 5l),
+ List.of(false, false, false, false, false, false),
+ List.of(0l, 1l, 2l, 3l, 4l, 5l),
toBBList(-1.0, -2.0, -3.0, -4.0, -5.0, -6.0),
toBBList(1.0, 2.0, 3.0, 4.0, 5.0, 6.0));
assertEquals(BoundaryOrder.UNORDERED, columnIndex.getBoundaryOrder());
@@ -1211,8 +1210,8 @@ public void testStaticBuildFloat() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(FLOAT).named("test_float"),
BoundaryOrder.ASCENDING,
- asList(true, true, true, false, false, false),
- asList(9l, 8l, 7l, 6l, 0l, 0l),
+ List.of(true, true, true, false, false, false),
+ List.of(9l, 8l, 7l, 6l, 0l, 0l),
toBBList(null, null, null, -3.0f, -2.0f, 0.1f),
toBBList(null, null, null, -2.0f, 0.0f, 6.0f));
assertEquals(BoundaryOrder.ASCENDING, columnIndex.getBoundaryOrder());
@@ -1345,8 +1344,8 @@ public void testStaticBuildInt32() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(INT32).named("test_int32"),
BoundaryOrder.DESCENDING,
- asList(false, false, false, true, true, true),
- asList(0l, 10l, 0l, 3l, 5l, 7l),
+ List.of(false, false, false, true, true, true),
+ List.of(0l, 10l, 0l, 3l, 5l, 7l),
toBBList(10, 8, 6, null, null, null),
toBBList(9, 7, 5, null, null, null));
assertEquals(BoundaryOrder.DESCENDING, columnIndex.getBoundaryOrder());
@@ -1597,8 +1596,8 @@ public void testStaticBuildInt64() {
ColumnIndex columnIndex = ColumnIndexBuilder.build(
Types.required(INT64).named("test_int64"),
BoundaryOrder.UNORDERED,
- asList(true, false, true, false, true, false),
- asList(1l, 2l, 3l, 4l, 5l, 6l),
+ List.of(true, false, true, false, true, false),
+ List.of(1l, 2l, 3l, 4l, 5l, 6l),
toBBList(null, 2l, null, 4l, null, 9l),
toBBList(null, 3l, null, 15l, null, 10l));
assertEquals(BoundaryOrder.UNORDERED, columnIndex.getBoundaryOrder());
diff --git a/parquet-column/src/test/java/org/apache/parquet/io/ExpectationValidatingConverter.java b/parquet-column/src/test/java/org/apache/parquet/io/ExpectationValidatingConverter.java
index cf8e2edc09..99073c98ed 100644
--- a/parquet-column/src/test/java/org/apache/parquet/io/ExpectationValidatingConverter.java
+++ b/parquet-column/src/test/java/org/apache/parquet/io/ExpectationValidatingConverter.java
@@ -21,7 +21,6 @@
import static org.junit.Assert.assertEquals;
import java.util.ArrayDeque;
-import java.util.Arrays;
import java.util.Deque;
import java.util.List;
import org.apache.parquet.io.api.Binary;
@@ -48,7 +47,7 @@ public void validate(String got) {
}
public ExpectationValidatingConverter(String[] expectations, MessageType schema) {
- this(new ArrayDeque<>(Arrays.asList(expectations)), schema);
+ this(new ArrayDeque<>(List.of(expectations)), schema);
}
public ExpectationValidatingConverter(Deque expectations, MessageType schema) {
diff --git a/parquet-column/src/test/java/org/apache/parquet/io/TestColumnIO.java b/parquet-column/src/test/java/org/apache/parquet/io/TestColumnIO.java
index ed1e232a8d..fa4fab710c 100644
--- a/parquet-column/src/test/java/org/apache/parquet/io/TestColumnIO.java
+++ b/parquet-column/src/test/java/org/apache/parquet/io/TestColumnIO.java
@@ -144,7 +144,7 @@ public class TestColumnIO {
@Parameterized.Parameters
public static Collection