From 202c1f0795214d93a3e8728809ebc88e2ba80a7d Mon Sep 17 00:00:00 2001
From: gitRasheed <99349713+gitRasheed@users.noreply.github.com>
Date: Wed, 4 Nov 2026 19:54:10 +0000
Subject: [PATCH] test: pin list layouts nested in structs and check that
leaves inside lists read alone
- Golden files for three more list layouts: a nullable struct holding lists of nullable structs four lists
deep, nullable lists of nullable structs, and lists written with empty chunks before, between and after
populated ones. Projections read leaves one to four lists deep from them.
- A Spark test reads leaves one to four lists deep, under structs, through both read paths, and checks each
reads under a fifth of the bytes of the list around it, and matches Parquet with pruning on and off.
Signed-off-by: gitRasheed <99349713+gitRasheed@users.noreply.github.com>
---
.../spark/VortexListElementPruningIoTest.java | 295 +++++++++++++++++
.../list_layout/event_shape.vortex | Bin 0 -> 1018284 bytes
.../nullable_struct_elements.vortex | Bin 0 -> 301244 bytes
.../list_layout/zero_row_chunks.vortex | Bin 0 -> 45568 bytes
vortex-jni/src/list_layout_golden.rs | 302 +++++++++++++++++-
5 files changed, 585 insertions(+), 12 deletions(-)
create mode 100644 java/vortex-spark/common/src/test/java/dev/vortex/spark/VortexListElementPruningIoTest.java
create mode 100644 vortex-jni/goldenfiles/list_layout/event_shape.vortex
create mode 100644 vortex-jni/goldenfiles/list_layout/nullable_struct_elements.vortex
create mode 100644 vortex-jni/goldenfiles/list_layout/zero_row_chunks.vortex
diff --git a/java/vortex-spark/common/src/test/java/dev/vortex/spark/VortexListElementPruningIoTest.java b/java/vortex-spark/common/src/test/java/dev/vortex/spark/VortexListElementPruningIoTest.java
new file mode 100644
index 00000000000..17e80b0b5e2
--- /dev/null
+++ b/java/vortex-spark/common/src/test/java/dev/vortex/spark/VortexListElementPruningIoTest.java
@@ -0,0 +1,295 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: Copyright the Vortex contributors
+
+package dev.vortex.spark;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Locale;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import org.apache.spark.sql.Column;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.apache.spark.sql.SparkSession;
+import org.apache.spark.sql.functions;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Tests that reading a leaf inside lists of structs nested in structs reads only that leaf from storage, through both
+ * Spark read paths, and returns what Parquet returns.
+ *
+ *
The table nests lists the way wide event schemas do, one to four lists deep under structs:
+ *
+ *
+ * id
+ * r: struct
+ * q: struct
+ * imp: array<struct
+ * id, w0..w7
+ * banner: struct
+ * w, h, b0..b7
+ * format: array<struct<w, h, f0..f7>>
+ * tags: array<string>
+ * seats: array<struct
+ * name, s0..s7
+ * deals: array<struct
+ * price, d0..d7
+ * segs: array<struct<v, g0..g7>>
+ *
+ *
+ * Every struct carries eight wide string siblings, so a read that pulls in a leaf's siblings shows up in the bytes
+ * read. Each list level has null lists, null elements and empty lists. The table is written with
+ * {@code vortex.listLayout}, without it, and as Parquet to compare against.
+ */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public final class VortexListElementPruningIoTest {
+ private static final int ROWS = 8192;
+ private static final String PRUNING = "spark.sql.optimizer.nestedSchemaPruning.enabled";
+ private static final String USE_V1 = "spark.sql.sources.useV1SourceList";
+
+ private SparkSession spark;
+ private String listLayoutPath;
+ private String flatPath;
+ private String parquetPath;
+
+ @BeforeAll
+ public void setUp(@TempDir Path tempDir) {
+ spark = SparkSession.builder()
+ .appName("VortexListElementPruningIoTest")
+ .master("local[2]")
+ .config("spark.driver.host", "127.0.0.1")
+ .config("spark.sql.shuffle.partitions", "2")
+ .config("spark.sql.adaptive.enabled", "false")
+ .config(PRUNING, "true")
+ // Spark prunes below two arrays only through an index, which ANSI mode fails on an empty array.
+ .config("spark.sql.ansi.enabled", "false")
+ .config("spark.ui.enabled", "false")
+ .config(
+ "spark.hadoop.fs.file.impl",
+ VortexNestedSchemaPruningIoTest.CountingLocalFileSystem.class.getName())
+ .config("spark.hadoop.fs.file.impl.disable.cache", "true")
+ .getOrCreate();
+
+ Dataset rows = spark.range(0, ROWS, 1, 2)
+ .selectExpr("id", "named_struct('q', named_struct('imp', " + imps() + ")) AS r");
+ listLayoutPath = tempDir.resolve("list_layout").toString();
+ rows.write().format("vortex").option("vortex.listLayout", "true").save(listLayoutPath);
+ flatPath = tempDir.resolve("flat").toString();
+ rows.write().format("vortex").save(flatPath);
+ parquetPath = tempDir.resolve("parquet").toString();
+ rows.write().parquet(parquetPath);
+ }
+
+ @AfterAll
+ public void tearDown() {
+ if (spark != null) {
+ spark.stop();
+ SparkSession.clearActiveSession();
+ SparkSession.clearDefaultSession();
+ }
+ }
+
+ /** Eight wide string fields named {@code prefix0..7}, distinct per row and position. */
+ private static String wide(String prefix, String key) {
+ StringBuilder out = new StringBuilder();
+ for (int k = 0; k < 8; k++) {
+ out.append(String.format(
+ Locale.ROOT, ", '%s%d', sha2(concat_ws(':', '%s%d', %s), 256)", prefix, k, prefix, k, key));
+ }
+ return out.toString();
+ }
+
+ /**
+ * A list of {@code element} over {@code sequence(0, max - 1)}, null when {@code seed % nullEvery == 0}, with a
+ * length of {@code seed % (max + 1)}, so some lists are empty, and a null element when {@code (seed + i) % 7 == 0}.
+ */
+ private static String list(String var, String seed, int max, int nullEvery, String element) {
+ return String.format(
+ Locale.ROOT,
+ "CASE WHEN (%s) %% %d = 0 THEN NULL ELSE transform(filter(sequence(0, %d), %s -> %s < (%s) %% %d),"
+ + " %s -> CASE WHEN (%s + %s) %% 7 = 0 THEN NULL ELSE %s END) END",
+ seed,
+ nullEvery,
+ max - 1,
+ var,
+ var,
+ seed,
+ max + 1,
+ var,
+ seed,
+ var,
+ element);
+ }
+
+ private static String imps() {
+ String format = list(
+ "k",
+ "id + i + 3",
+ 3,
+ 5,
+ "named_struct('w', id + i * 10 + k, 'h', id + k" + wide("f", "id, i, k") + ")");
+ String banner = "CASE WHEN (id + i) % 6 = 0 THEN NULL ELSE named_struct('w', id * 3 + i, 'h', id + i"
+ + wide("b", "id, i") + ", 'format', " + format + ") END";
+ String tags = list("t", "id + i + 1", 4, 9, "concat('tag', id % 13, '-', t)");
+ String segs = list(
+ "g",
+ "id + i + c + d + 2",
+ 3,
+ 6,
+ "named_struct('v', id + i + c + d + g" + wide("g", "id, i, c, d, g") + ")");
+ String deals = list(
+ "d",
+ "id + i + c + 1",
+ 2,
+ 4,
+ "named_struct('price', id * 7 + i + c + d" + wide("d", "id, i, c, d") + ", 'segs', " + segs + ")");
+ String seats = list(
+ "c",
+ "id + i",
+ 3,
+ 8,
+ "named_struct('name', concat('seat', c)" + wide("s", "id, i, c") + ", 'deals', " + deals + ")");
+ String imp = "named_struct('id', id * 10 + i" + wide("w", "id, i") + ", 'banner', " + banner + ", 'tags', "
+ + tags + ", 'seats', " + seats + ")";
+ return list("i", "id", 4, 11, imp);
+ }
+
+ private static final Column IMP = functions.col("r.q.imp");
+
+ /**
+ * Leaves at one to four lists deep, each with the column read whole for comparison: the leaf's list, or the
+ * innermost list around it.
+ */
+ static Stream leaves() {
+ return Stream.of(
+ Arguments.of("r.q.imp.id (1 list)", IMP.getField("id"), IMP),
+ Arguments.of(
+ "r.q.imp.banner.w (1 list, struct below)",
+ IMP.getField("banner").getField("w"),
+ IMP),
+ Arguments.of(
+ "r.q.imp[0].banner.format.w (2 lists)",
+ IMP.getItem(0).getField("banner").getField("format").getField("w"),
+ IMP.getItem(0).getField("banner").getField("format")),
+ Arguments.of("r.q.imp.tags (list of strings in a list)", IMP.getField("tags"), IMP),
+ Arguments.of(
+ "r.q.imp[0].seats.deals[0].price (3 lists)",
+ IMP.getItem(0)
+ .getField("seats")
+ .getField("deals")
+ .getItem(0)
+ .getField("price"),
+ IMP.getItem(0).getField("seats")),
+ Arguments.of(
+ "r.q.imp[0].seats[0].deals[0].segs.v (4 lists)",
+ IMP.getItem(0)
+ .getField("seats")
+ .getItem(0)
+ .getField("deals")
+ .getItem(0)
+ .getField("segs")
+ .getField("v"),
+ IMP.getItem(0)
+ .getField("seats")
+ .getItem(0)
+ .getField("deals")
+ .getItem(0)
+ .getField("segs")));
+ }
+
+ static Stream leavesByPath() {
+ return leaves().flatMap(
+ a -> Stream.of(true, false).map(v1 -> Arguments.of(a.get()[0], a.get()[1], a.get()[2], v1)));
+ }
+
+ @ParameterizedTest(name = "{0}, V1={3}")
+ @MethodSource("leavesByPath")
+ public void leafInsideListsReadsOnlyThatLeaf(String name, Column leaf, Column whole, boolean v1) {
+ withReadPath(v1, () -> {
+ Dataset table = spark.read().format("vortex").load(listLayoutPath);
+ long leafBytes = bytesRead(table.select(leaf));
+ long wholeBytes = bytesRead(table.select(whole));
+ long flatLeaf =
+ bytesRead(spark.read().format("vortex").load(flatPath).select(leaf));
+ System.out.printf(
+ Locale.ROOT,
+ "bytes read, V1=%s, %s: list layout %d (around it %d), flat %d%n",
+ v1,
+ name,
+ leafBytes,
+ wholeBytes,
+ flatLeaf);
+ assertTrue(
+ leafBytes * 5 < wholeBytes,
+ name + " read " + leafBytes + " bytes; the list around it read " + wholeBytes);
+ assertMatchesParquet(t -> t.select(functions.col("id"), leaf));
+ });
+ }
+
+ @ParameterizedTest(name = "V1={0}")
+ @MethodSource("readPaths")
+ public void severalLeavesAndFiltersMatchParquet(boolean v1) {
+ withReadPath(v1, () -> {
+ assertMatchesParquet(t -> t.select(
+ functions.col("id"),
+ IMP.getField("id"),
+ IMP.getField("banner").getField("h"),
+ IMP.getItem(1).getField("seats").getField("name")));
+ assertMatchesParquet(t -> t.where(functions.size(IMP).gt(2))
+ .select(
+ functions.col("id"),
+ IMP.getItem(0).getField("banner").getField("format").getField("h")));
+ assertMatchesParquet(t -> t.where(IMP.isNull()).select(functions.col("id"), IMP.getField("id")));
+ assertMatchesParquet(t -> t.where(functions.array_contains(
+ IMP.getField("id"), functions.col("id").multiply(10)))
+ .select(functions.col("id"), IMP.getField("tags")));
+ });
+ }
+
+ static Stream readPaths() {
+ return Stream.of(true, false);
+ }
+
+ private void withReadPath(boolean v1, Runnable body) {
+ String previous = spark.conf().get(USE_V1, "");
+ spark.conf().set(USE_V1, v1 ? "vortex" : "");
+ try {
+ body.run();
+ } finally {
+ spark.conf().set(USE_V1, previous);
+ }
+ }
+
+ /** Asserts {@code query} returns Parquet's rows from both Vortex tables, with and without pruning. */
+ private void assertMatchesParquet(Function, Dataset> query) {
+ List expected =
+ query.apply(spark.read().parquet(parquetPath)).orderBy("id").collectAsList();
+ for (String path : List.of(listLayoutPath, flatPath)) {
+ Dataset read = query.apply(spark.read().format("vortex").load(path));
+ assertEquals(expected, read.orderBy("id").collectAsList(), path);
+ spark.conf().set(PRUNING, "false");
+ try {
+ assertEquals(expected, read.orderBy("id").collectAsList(), path + ", unpruned");
+ } finally {
+ spark.conf().set(PRUNING, "true");
+ }
+ }
+ }
+
+ /** Hashes every selected value so the whole result is decoded, and returns the bytes read from storage. */
+ private static long bytesRead(Dataset query) {
+ VortexNestedSchemaPruningIoTest.BYTES_READ.set(0);
+ query.selectExpr("bit_xor(xxhash64(*))").collectAsList();
+ return VortexNestedSchemaPruningIoTest.BYTES_READ.get();
+ }
+}
diff --git a/vortex-jni/goldenfiles/list_layout/event_shape.vortex b/vortex-jni/goldenfiles/list_layout/event_shape.vortex
new file mode 100644
index 0000000000000000000000000000000000000000..bb49deb7cde9b4244ba108de936799ec22fa5974
GIT binary patch
literal 1018284
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