From a25cb87013accaf806de1a98e35a490b8a466c86 Mon Sep 17 00:00:00 2001 From: Davide Angelocola Date: Fri, 26 Jun 2026 23:52:49 +0200 Subject: [PATCH] feat(jpms): add module-info for core/reader/writer [WIP] Adds JPMS descriptors to the three published library modules now that the in-house fbs/proto toolchain removed the flatbuffers-java split-package blocker (ADR 0017). State: - core: modular, builds clean, 359 tests green. Exports model/error/io; compute and the generated fbs/proto codecs qualified-exported to reader/writer. requires static java.compiler (SOURCE-retention @Generated on proto records). - reader: modular, builds clean, 857 tests green. requires transitive core + java.net.http (HttpClient in public API); requires static zstd (optional, automatic module). uses/provides EncodingDecoder. - writer: main modular, builds clean. requires transitive core; requires static zstd. uses/provides EncodingEncoder + ExtensionEncoder. Does NOT require reader (architectural rule preserved). Narrow @SuppressWarnings("exports") on ArrayStats.fromFbs and VariantData: both are intentional public entry points that take a generated wire type core only qualified-exports. Module name lint suppressed for the group-derived terminal digit (dfa1) and the zstd automatic module. KNOWN-INCOMPLETE: writer test sourceset fails under -Werror. Writer tests decode-verify round-trips via test-scope reader types, but tests patch into the writer module which (correctly) does not require reader. Added testCompile --add-reads=ALL-MODULE-PATH + surefire useModulePath=false, still resolving a residual exports/reads lint warning. Downstream modules (calcite/cli/etc.) are left non-modular and consume these as automatic modules via the classpath. Co-Authored-By: Claude Opus 4.8 --- core/src/main/java/module-info.java | 27 +++++++++ .../github/dfa1/vortex/reader/ArrayStats.java | 4 ++ reader/src/main/java/module-info.java | 58 ++++++++++++++++++ writer/pom.xml | 32 ++++++++++ .../vortex/writer/encode/VariantData.java | 4 ++ writer/src/main/java/module-info.java | 60 +++++++++++++++++++ 6 files changed, 185 insertions(+) create mode 100644 core/src/main/java/module-info.java create mode 100644 reader/src/main/java/module-info.java create mode 100644 writer/src/main/java/module-info.java diff --git a/core/src/main/java/module-info.java b/core/src/main/java/module-info.java new file mode 100644 index 00000000..84db6289 --- /dev/null +++ b/core/src/main/java/module-info.java @@ -0,0 +1,27 @@ +/// Vortex core module: shared type model, error contract, low-level I/O, compute kernels, and the +/// generated FlatBuffers/Protobuf wire codecs. +/// +/// The model, error, and I/O packages form the public surface shared with downstream tooling. The +/// compute kernels and the generated `fbs`/`proto` codecs are internal plumbing, exported only to +/// the reader and writer modules. +// "module" lint suppressed for two unavoidable warnings under the zero-warning policy: +// the group-derived name component `dfa1` has a terminal digit, and the qualified-export targets +// (reader/writer) are not visible when this module is compiled standalone in the reactor. +@SuppressWarnings("module") +module io.github.dfa1.vortex.core { + // Compile-only: generated proto records carry @javax.annotation.processing.Generated + // (SOURCE retention, so not needed at runtime). + requires static java.compiler; + + // Public API. + exports io.github.dfa1.vortex.core.model; + exports io.github.dfa1.vortex.core.error; + exports io.github.dfa1.vortex.core.io; + + // Internal compute kernels and generated wire codecs: consumed only by reader/writer (modular + // path). Downstream non-modular tooling like the inspector reads them via the classpath, where + // these directives are ignored. + exports io.github.dfa1.vortex.core.compute to io.github.dfa1.vortex.reader, io.github.dfa1.vortex.writer; + exports io.github.dfa1.vortex.core.fbs to io.github.dfa1.vortex.reader, io.github.dfa1.vortex.writer; + exports io.github.dfa1.vortex.core.proto to io.github.dfa1.vortex.reader, io.github.dfa1.vortex.writer; +} diff --git a/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java b/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java index f553c802..559d49f5 100644 --- a/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java +++ b/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java @@ -37,6 +37,10 @@ public static ArrayStats empty() { /// /// @param fbs the FlatBuffers stats table, or `null` /// @return parsed stats, or an empty instance if no usable data is present + // Low-level entry point for the parse path and the inspector tool; intentionally exposes the + // generated FlatBuffers type, which core only qualified-exports. Suppress the resulting + // exports-leak lint rather than widen the core export or hide this factory. + @SuppressWarnings("exports") public static ArrayStats fromFbs(io.github.dfa1.vortex.core.fbs.FbsArrayStats fbs) { if (fbs == null) { return EMPTY; diff --git a/reader/src/main/java/module-info.java b/reader/src/main/java/module-info.java new file mode 100644 index 00000000..b5d0bc1b --- /dev/null +++ b/reader/src/main/java/module-info.java @@ -0,0 +1,58 @@ +/// Vortex reader module: memory-mapped file parsing, the layout/scan engine, decoded `Array` +/// types, and the encoding/extension decoders dispatched via [java.util.ServiceLoader]. +/// +/// `vortex.core` is re-exported (`requires transitive`) because decoded types surface core model +/// types (`DType`, `PType`, …) in the public API. The native zstd codec is optional +/// (`requires static`): the `vortex.zstd` decoder loads only when the `zstd` module is present. +// Lint suppressed: `module` for the group-derived terminal-digit name component `dfa1`; +// `requires-automatic` because the optional `zstd` codec ships as an automatic module (no +// module descriptor yet) and is pulled in via `requires static`. +@SuppressWarnings({"module", "requires-automatic"}) +module io.github.dfa1.vortex.reader { + requires transitive io.github.dfa1.vortex.core; + requires static zstd; + // transitive: VortexHttpReader.open exposes java.net.http.HttpClient in its public signature. + requires transitive java.net.http; + + exports io.github.dfa1.vortex.reader; + exports io.github.dfa1.vortex.reader.array; + exports io.github.dfa1.vortex.reader.decode; + exports io.github.dfa1.vortex.reader.extension; + + uses io.github.dfa1.vortex.reader.decode.EncodingDecoder; + + provides io.github.dfa1.vortex.reader.decode.EncodingDecoder with + io.github.dfa1.vortex.reader.decode.AlpEncodingDecoder, + io.github.dfa1.vortex.reader.decode.AlpRdEncodingDecoder, + io.github.dfa1.vortex.reader.decode.BitpackedEncodingDecoder, + io.github.dfa1.vortex.reader.decode.BoolEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ByteBoolEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ChunkedEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ConstantEncodingDecoder, + io.github.dfa1.vortex.reader.decode.DateTimePartsEncodingDecoder, + io.github.dfa1.vortex.reader.decode.DecimalBytePartsEncodingDecoder, + io.github.dfa1.vortex.reader.decode.DecimalEncodingDecoder, + io.github.dfa1.vortex.reader.decode.DeltaEncodingDecoder, + io.github.dfa1.vortex.reader.decode.DictEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ExtEncodingDecoder, + io.github.dfa1.vortex.reader.decode.FixedSizeListEncodingDecoder, + io.github.dfa1.vortex.reader.decode.FrameOfReferenceEncodingDecoder, + io.github.dfa1.vortex.reader.decode.FsstEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ListEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ListViewEncodingDecoder, + io.github.dfa1.vortex.reader.decode.MaskedEncodingDecoder, + io.github.dfa1.vortex.reader.decode.NullEncodingDecoder, + io.github.dfa1.vortex.reader.decode.PatchedEncodingDecoder, + io.github.dfa1.vortex.reader.decode.PcoEncodingDecoder, + io.github.dfa1.vortex.reader.decode.PrimitiveEncodingDecoder, + io.github.dfa1.vortex.reader.decode.RleEncodingDecoder, + io.github.dfa1.vortex.reader.decode.RunEndEncodingDecoder, + io.github.dfa1.vortex.reader.decode.SequenceEncodingDecoder, + io.github.dfa1.vortex.reader.decode.SparseEncodingDecoder, + io.github.dfa1.vortex.reader.decode.StructEncodingDecoder, + io.github.dfa1.vortex.reader.decode.VarBinEncodingDecoder, + io.github.dfa1.vortex.reader.decode.VariantEncodingDecoder, + io.github.dfa1.vortex.reader.decode.VarBinViewEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ZigZagEncodingDecoder, + io.github.dfa1.vortex.reader.decode.ZstdEncodingDecoder; +} diff --git a/writer/pom.xml b/writer/pom.xml index 76a8973e..e4790a11 100644 --- a/writer/pom.xml +++ b/writer/pom.xml @@ -61,6 +61,38 @@ + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-testCompile + + + -Xlint:all + --add-reads + io.github.dfa1.vortex.writer=ALL-MODULE-PATH + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + +