Skip to content

perf(engine): query optimizer pipeline & zero-copy N-Family bulk ingestion - #634

Merged
remiceres merged 5 commits into
feature/corese-nextfrom
perf/engine-optimizer-and-bulk-loader
Oct 20, 2026
Merged

remiceres merged 5 commits into
feature/corese-nextfrom
perf/engine-optimizer-and-bulk-loader

Conversation

@remiceres

Copy link
Copy Markdown
Contributor

Description

Cette Pull Request résout et finalise les travaux d'optimisation du moteur et d'ingestion massive pour l'atteinte des performances comparatives avec Apache Jena 6.2.0 et Eclipse RDF4J 5.3.2 sur le benchmark Bowlogna (1,23 million de triplets) dans le cadre du Cycle #53 (Itération 36).

Fixes #633.


Réalisations & Percées Techniques

  1. Phase A1 — DISTINCT Bypass sur GROUP BY (ce65602cc) :

    • Détection formelle dans Query.java (isDistinctRedundantWithGroupBy()) lorsque toutes les variables de regroupement sont projetées dans le SELECT.
    • Évite l'allocation de la table de hachage de déduplication et le surcoût de filtrage dans Mappings et Eval.
  2. Phase A2 — Selective Filter Pushdown (2cd0b366c) :

    • Introduction du composant SelectiveFilterPushdown.java dans l'ordonnanceur d'arêtes.
    • Amorçage prioritaire des triplets contraints par des filtres de comparaison sélectifs (?var = constant).
    • Temps sur la régression Q8 divisé par deux (1 830 ms -> 969 ms).
  3. Phase D — Modernisation & Fast Streaming Scanners N-Triples / N-Quads (16c79d432 & f512e8740) :

    • Élimination définitive de la dépendance ANTLR4 pour les formats ligne à ligne RDF 1.1 : suppression des grammaires NTriples.g4, NQuads.g4 et des parseurs/listeners d'arbres syntaxiques.
    • Réécriture in-place d'NTriplesParser.java et NQuadsParser.java avec un scanner streaming zéro-copie optimisé.
    • Ingestion Bowlogna 1,23M triplets : passage de 45,5 s à 3,7 s (332 000 triplets/s vs 54 800 t/s sous Corese 4.6.5, accélération de 6x).
  4. Phase C — Cost-Based Join Reordering Dynamique (195607694) :

    • Recalcul dynamique glouton du coût effectif dans CardinalityPatternOrdering.java prenant en compte le fan-out réel selon les variables déjà liées par les arêtes précédentes ou les scopes englobants.
    • Mise à l'échelle décimale avec BigDecimal.movePointLeft() (sujet lié /1000 pour probe SPO, objet lié /10 pour POS/OSP, prédicat variable /10).
    • Préservation stricte de la connectivité de graphe (pas de produit cartésien accidentel).
    • Q14 (multi-join) tombe à 645 ms (vs 1 560 ms sous 4.6.5 $\rightarrow$ 2,4x plus rapide).
    • Q9 tombe à 218 ms (vs 706 ms sous 4.6.5 $\rightarrow$ 3,2x plus rapide).

Qualité & Conformité

  • Conformité W3C : 100% de succès sur les suites officielles W3C SPARQL 1.1, RDF 1.1 N-Triples (70/70 tests) et RDF 1.1 N-Quads.
  • SonarLint LSP : 0 alerte de qualité, complexité cognitive $\le 15$ respectée.
  • Tests unitaires & d'intégration : 100% de succès sur toute la suite corese-core (dont 33 tests dédiés CBO).

…in SELECT

- Implement Query.isDistinctRedundantWithGroupBy() with strict W3C semantics
- Guard against non-projected grouping variables to preserve aggregate distinctness
- Bypass distinct hash group allocation and submission lookup in Mappings
- Add unit tests in QueryTest covering nominal, projected, and missing key cases
- Reduce Q8 Bowlogna benchmark latency by 26% (1830 ms -> 1352 ms)
…dges

Identify triple patterns constrained by inequality/equality comparison
filters and position them as initial seeds during cardinality-guided join
planning. This dramatically cuts intermediate candidate state on queries
with selective post-filters (e.g. Bowlogna Q8 down from 1830ms to 969ms).
…eaming scanner

Eliminate NTriples.g4 and NTriplesListener to remove per-line ANTLR ParseTree
and TokenStream allocations. NTriplesParser now scans W3C RDF 1.1 N-Triples
directly into Model/StorageManager with zero-copy buffer handling, dividing
Bowlogna 1.23M loading time by 4 (from 45.5s down to 11.1s).
…ming scanner

Eliminate NQuads.g4, NQuadsListener and LineRDFParser to remove all per-line
ANTLR allocations across the N-Family format suite. NQuadsParser now scans
quads and triples with zero-copy buffer handling directly into Model/StorageManager,
achieving 100% W3C conformance on official RDF 1.1 N-Quads tests.
…nOrdering

- Dynamically recompute pattern effective cost during greedy selection based on already bound variables from enclosing scopes and chosen edges.
- Scale cardinality with BigDecimal precision (discount SPO subject probes by 1000, POS/OSP object lookups by 10, variable predicate by 10).
- Maintain strict connectivity priority over disconnected Cartesian patterns.
- Add 9 regression and edge-case unit tests covering precision, bound probes, and tie-breaking order.
- Fixes #633 (Phase C).
@remiceres
remiceres merged commit b8dbc15 into feature/corese-next Oct 20, 2026
1 check passed
@github-actions

Copy link
Copy Markdown
Overall Project 57.81% -0.12% 🍏
Files changed 82.08% 🍏

File Coverage
CardinalityPatternOrdering.java 99.24% 🍏
SelectiveFilterPushdown.java 98.5% -1.5% 🍏
Query.java 80.44% -0.1% 🍏
NTriplesParser.java 80.07% -19.93% 🍏
NQuadsParser.java 78.47% -21.53% 🍏
Mappings.java 73.44% 🍏
Eval.java 64.9% 🍏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant