Analytical database in Java 25
columnar storage · SQL engine · REST + CLI + web
No Spring. No Jackson. No Lombok. Just the JDK and a few focused libraries.
Sealed interfaces, pattern matching, records. Java 25 language features everywhere.
MemorySegment + Arena.ofShared for mmap. Read path is entirely off-heap, zero GC pressure.
jdk.incubator.vector enabled. SIMD filters, aggregates, and string ops on the roadmap.
Compile-time null-safety enforced on all main sources. ~60 @Nullable annotations. NPE = build failure.
Clean build with Spotless, Checkstyle, ErrorProne, SpotBugs. Full check in ~11 seconds.
Runtime: JLine (CLI) + CodeMirror via CDN (web UI). Test: JUnit 5 + DuckDB CLI. That's it.
Storage engine, SQL parser, binder, executor. TSV converter, JSON serializer. The brain.
REST on com.sun.net.httpserver — /health, /schema, /query endpoints + static web UI.
JLine REPL with syntax highlighting, history, \-meta commands. Full terminal experience.
ClickBench golden correctness tests. Every query verified against DuckDB reference output.
./gradlew check runs all of these in ~11 seconds:
Vector batches (4096 rows), pull-based pipeline. BoundExpr → VectorizedExpr with typed arrays + null masks.
jdk.incubator.vector for i32/i64/f64 filters, SUM/COUNT/MIN/MAX aggregates, string search acceleration.
ForkJoinPool for column blocks (~64K rows), partial_agg per thread + reduce. Scalable across cores.
Open-addressing with linear probing, specialized i32/i64 key variants, ring-buffer spilling.
RLE for constants, Delta for monotonic i64, LZ4 for strings. Bloom filters and min/max indexes per block.
Reader/writer for interop with the ClickBench ecosystem and external tooling.
Questions, ideas, or want to contribute? Reach out.
Подкаст про программирование, базы данных и технологии. Слушайте на любой платформе.