v4.2.0
What's Changed
Features
- Temporal arithmetic per SEP-0002, and make TZ/TIMEZONE reindex-stable by @bplatz in #1747
- feat(graphql): GraphQL endpoint over a schema derived from the ledger by @bplatz in #1748
- SQL graph sources: R2RML over Trino-protocol endpoints, plus the fluree-sql-bridge sidecar by @bplatz in #1749
- feat(validate): carry the validated ledger t on ValidateReport by @bplatz in #1757
- browser peer + playground: fluree-db-browser, @fluree/db-wasm, SSE head tracking, and the residency retry loop by @aaj3f in #1715
- feat(policy): enforce static view policy on Iceberg/SQL graph sources by @bplatz in #1759
- feat(cli):
fluree doc— Fluree Unstructured: documents into a searchable graph by @bplatz in #1760 - fluree doc: --model and --entities, grounded entity and relation extraction; hybrid search by @bplatz in #1764
- feat(sql): pushdown lane — one statement per GRAPH block over a SQL source by @bplatz in #1777
- feat(sql): pushdown lane M1/M2 — MIN/MAX, BIND, widening filters, partitioning, caps, block cache, class policies by @bplatz in #1785
- feat(sql): pushdown lane M3 — subject policies, expressions, sub-selects, unions, HAVING by @bplatz in #1788
- feat(stats): fluree-db-stats kernel and on-demand column profiling by @bplatz in #1789
- feat(materialize): advance a backlogged window by a bounded prefix by @christophediprima in #1649
Bug Fixes
- fix(query): keep every string-dictionary datatype's own term identity by @aaj3f in #1736
- fix: make the equijoin-filter fold sound about term equality by @aaj3f in #1728
- Deduplicate repeated statements in bulk import by @bplatz in #1754
- fix(indexer): recover a ledger wedged at max novelty by @christophediprima in #1662
- fix(ingest): store an object-position empty collection as the rdf:nil triple it denotes by @aaj3f in #1744
- fix: fail closed on unencodable datatype IRIs; keep the membership-join lane join-equivalent on list rows by @aaj3f in #1746
- fix(query): STR() on a double returns the canonical XSD lexical form by @aaj3f in #1750
- fix(policy): evaluate every targeted f:query before denying; deterministic policy order by @bplatz in #1761
- fix(sql): fused SUM/AVG folds over double/text columns, SQLite bridge column typing by @bplatz in #1769
- fix(transact): give staged views dictionaries that cover their own flakes by @bplatz in #1791
- fix(consensus): park queued submissions on entry liveness, not a fixed clock by @bplatz in #1792
- fix(bm25,vector): advance the watermark on an empty change set, don't rebuild by @christophediprima in #1661
Other Changes
- perf: make filtered-DELETE list-meta hydration O(novelty), not O(retractions × novelty) by @bplatz in #1675
- fix: match string literals by RDF term identity; normalize language-tag case by @bplatz in #1676
- fix: two v4.1.6 planner regressions — star-join reorder and membership-join admission by @bplatz in #1674
- fix: never delete raw-txn blobs inline; tolerate dangling txn refs; add
fluree verifyby @bplatz in #1677 - fix(consensus): extract fluree-raft-core and add a replicated kv fragment; fix two waiter-map defects by @bplatz in #1678
- refactor(consensus): reduce the nameservice through the generic state-machine seam by @bplatz in #1679
- fix: ledger-cache deadlock, MinIO path-style, and an embeddable Raft node by @bplatz in #1680
- fix: make IN/NOT IN match encoded resources, price the row lanes max_fuel could not see by @bplatz in #1681
- feat: graph sync — whole-graph replacement committing only the delta by @bplatz in #1682
- docs: make PR↔issue reference direction explicit (Fixes / Follow-up / Partially addresses) by @aaj3f in #1692
- fix(cli): novelty-aware encoded-binding resolution in the table renderer, and never Debug-print a binding by @aaj3f in #1693
- fix(query): novelty-only-predicate retractions were invisible to the crawl read path by @aaj3f in #1698
- fix: let a no-op republish complete its raft queue entry by @bplatz in #1716
- feat: Add sh:sparql (SHACL-SPARQL) constraint support by @bplatz in #1717
- fix(core): make FlakeMeta's Ord agree with its Eq by @aaj3f in #1727
- fix(storage): clamp FileStorage ranged reads to the object, and sweep orphaned .tmp staging files by @aaj3f in #1702
- fix(query): COUNT(*) counts joined rows, not distinct subjects, on an anchored star by @aaj3f in #1706
- fix(query): keep a VALUES written after an OPTIONAL below it by @aaj3f in #1701
- fix(stats): reconcile novelty asserts against the base index for user-facing counts by @aaj3f in #1699
- fix(query): let OPTIONAL extend a row that left the shared variable unbound by @aaj3f in #1724
- fix(datalog): IRI comparison in rule FILTERs (fails open today) + a diagnostic when a rule can't derive by @aaj3f in #1705
- perf(transact): take the cached ledger state for the commit window — stop per-commit DictNovelty deep-clones for serial writers by @aaj3f in #1718
- feat(api): make the background indexer observable and configurable from the embedded API by @aaj3f in #1710
- fix(server): surface novelty backpressure as 503 + Retry-After with err:db/NoveltyAtMax by @aaj3f in #1719
- fix(import): publish bulk-import commit heads via ref fast-forward, not the queue contract by @bplatz in #1753
- group integration tests into grp_* harnesses by @zonotope in #1755
- split debug info out of dev-profile binaries by @zonotope in #1752
- Add an offline index-version graph diagnostic by @zonotope in #1622
- perf(query): seek a bound-term overlay window instead of translating all novelty by @aaj3f in #1732
- fix(server): accept per-ledger SSE subscriptions on GET /events by @aaj3f in #1730
- wasm32 groundwork: the engine stack compiles and runs on wasm32-unknown-unknown, native untouched by @aaj3f in #1714
- Fix reasoning defaults by @zonotope in #1763
- Make storage-sweep planning proportional to distinct manifests by @zonotope in #1643
- Guard against integration tests that silently never run by @zonotope in #1756
- fix(query): range-filter pushdown keeps every conjunct; push xsd:decimal bounds by @bplatz in #1778
- fix: bound retained index versions by count, not only by age by @christophediprima in #1601
- fix(materialize): bound the full read a source falls back to when its watermark expires by @christophediprima in #1663
- feat(r2rml): refuse the graph-map constructs the materializer cannot honor by @christophediprima in #1581
- stamp provenance on rows leaving — and joining within — a cross-ledger SERVICE by @aaj3f in #1641
- release v4.2.0 by @bplatz in #1740
Full Changelog: v4.1.6...v4.2.0