From 2b1ff940f1432c07cfff4eaf150690cf591a3ad6 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 26 Sep 2023 19:09:37 -0500 Subject: [PATCH] Ensure that boolean partition columns are boxed (#4547) Fixes #4545 --- .../io/deephaven/parquet/table/ParquetTools.java | 11 +++++++++-- .../deephaven/parquet/table/TestParquetTools.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTools.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTools.java index 0efadb57f16..e230034eec4 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTools.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTools.java @@ -685,8 +685,15 @@ public static Table readPartitionedTableInferSchema( throw new IllegalArgumentException("First location key " + firstKey + " has null partition value at partition key " + partitionKey); } - allColumns.add(ColumnDefinition.fromGenericType(partitionKey, - getUnboxedTypeIfBoxed(partitionValue.getClass()), null, ColumnDefinition.ColumnType.Partitioning)); + + // Primitives should be unboxed, except booleans + Class dataType = partitionValue.getClass(); + if (dataType != Boolean.class) { + dataType = getUnboxedTypeIfBoxed(partitionValue.getClass()); + } + + allColumns.add(ColumnDefinition.fromGenericType(partitionKey, dataType, null, + ColumnDefinition.ColumnType.Partitioning)); } allColumns.addAll(schemaInfo.getFirst()); return readPartitionedTable(readInstructions.isRefreshing() ? locationKeyFinder : initialKeys, diff --git a/extensions/parquet/table/src/test/java/io/deephaven/parquet/table/TestParquetTools.java b/extensions/parquet/table/src/test/java/io/deephaven/parquet/table/TestParquetTools.java index 1add72076ce..933efac7690 100644 --- a/extensions/parquet/table/src/test/java/io/deephaven/parquet/table/TestParquetTools.java +++ b/extensions/parquet/table/src/test/java/io/deephaven/parquet/table/TestParquetTools.java @@ -11,6 +11,7 @@ import io.deephaven.engine.table.TableDefinition; import io.deephaven.engine.table.impl.DataAccessHelpers; import io.deephaven.engine.table.impl.InMemoryTable; +import io.deephaven.engine.table.impl.UncoalescedTable; import io.deephaven.engine.table.impl.locations.TableDataException; import io.deephaven.engine.testutil.junit4.EngineCleanup; import io.deephaven.engine.util.TableTools; @@ -355,6 +356,19 @@ public void testPartitionedRead() { assertTableEquals(expected, result); } + @Test + public void testBooleanPartition() { + ParquetTools.writeTable(table1, new File(testRootFile, "Active=true" + File.separator + "file1.parquet")); + ParquetTools.writeTable(table1, new File(testRootFile, "Active=false" + File.separator + "file2.parquet")); + Table table = ParquetTools.readTable(testRootFile); + Assert.assertTrue(table instanceof UncoalescedTable); + final Table expected = TableTools.merge( + table1.updateView("Active=false"), + table1.updateView("Active=true")).moveColumnsUp("Active"); + + assertTableEquals(expected, table); + } + @Test public void testBigArrays() { ExecutionContext.getContext().getQueryLibrary().importClass(LongVectorDirect.class);