Skip to content

perf(engine): streaming hash aggregation & direct scalar grouping - #639

Merged
remiceres merged 2 commits into
feature/corese-nextfrom
perf/streaming-hash-aggregation
Oct 21, 2026
Merged

remiceres merged 2 commits into
feature/corese-nextfrom
perf/streaming-hash-aggregation

Conversation

@remiceres

Copy link
Copy Markdown
Contributor

Description

Cette Pull Request implémente le Streaming HashAggregation pour les requêtes SPARQL avec GROUP BY afin de résoudre le goulot d'étranglement majeur identifié sur Q8 lors des benchmarks comparatifs avec Apache Jena 6.2.0 et Eclipse RDF4J 5.3.2.

Fixes #635.


Réalisations Techniques

  1. Step 1 — Table de hachage O(1) dans Group.java (eb1d19bc9) :

    • Remplacement de l'ordonnancement par arbre (TreeMap) par une table de hachage LinkedHashMap<GroupKey, Mappings>.
    • Clé immuable GroupKey avec copie défensive du tableau Node[] et implémentation rigoureuse de equals et hashCode (gestion stricte des termes RDF, unbound null, littéraux typés, langues et nœuds anonymes).
    • Préservation stricte de l'ordre d'insertion et compatibilité totale avec Merge.java.
    • Ajout de la suite de tests GroupTest.java (35 tests unitaires).
  2. Step 2 — Agrégation scalaire directe par accumulateurs (da8e5cfba) :

    • Introduction du composant DirectGroupAggregation.java permettant de réduire les groupes en une seule passe $\mathcal{O}(N)$ sans conserver ni empiler les listes de mappings membres.
    • Accumulateurs scalaires dédiés (COUNT, SUM, AVG, MIN, MAX) avec promotions numériques automatiques via NumericAccumulator.
    • Isolation des erreurs de type (une erreur sur un agrégat n'invalide pas les autres projections).
    • Repli automatique transparent via isEligible(Query) pour les requêtes complexes.
    • Ajout de la suite de tests DirectGroupAggregationTest.java (24 tests unitaires).

Résultats Benchmark Bowlogna (1,23M triplets)

  • Query 8 (GROUP BY ?X + COUNT(?E)) : passage de 1 830 ms (v4.6.5) à 760 ms (accélération de 2,4x / -58%).
  • Query 9 : 207 ms (vs 650 ms sous v4.6.5 $\rightarrow$ 3,1x plus rapide).
  • Ingestion N-Triples : 332 000 triplets/s (3,7 s vs 22,2 s sous v4.6.5).
  • Mémoire & Débit : aucune régression, empreinte mémoire stable.

Contrôle Qualité

  • SonarLint LSP : 0 alerte sur tous les fichiers modifiés et créés.
  • Tests unitaires et d'intégration : 100% de succès sur toute la suite corese-core.

- Replace legacy TreeMapping/TreeMap with LinkedHashMap in Group.java.
- Introduce immutable GroupKey holding defensive copy of Node tuple with strict W3C semantics (support unbound nulls, RDF datatypes, languages, blank nodes).
- Retain exact insertion order and API compatibility with Merge.java.
- Add comprehensive JUnit 5 test suite (35 unit tests in GroupTest.java).
- Zero SonarLint LSP alerts; full test suite passing.
- Reduces Bowlogna Q8 latency from 1,137 ms to 918 ms (-19%).
- Part of #635 (Step 1).
…mulator state

- Introduce DirectGroupAggregation to compute scalar projections (COUNT, SUM, AVG, MIN, MAX) in a single pass without storing member mappings.
- Retain only the first representative mapping and scalar accumulator state per group key.
- Promote numeric types smoothly with NumericAccumulator and preserve type error boundaries.
- Add comprehensive JUnit 5 test coverage in DirectGroupAggregationTest.
- Zero SonarLint alerts; full test suite passing.
- Reduces Bowlogna Q8 latency from 918 ms down to 760 ms.
- Part of #635 (Step 2).
@remiceres
remiceres merged commit ac84c09 into feature/corese-next Oct 21, 2026
1 check passed
@github-actions

Copy link
Copy Markdown
Overall Project 57.9% -0.02% 🍏
Files changed 90.49% 🍏

File Coverage
DirectGroupAggregation.java 96.14% -3.86% 🍏
Group.java 87.92% -10.27% 🍏
NativeAggregateEvaluator.java 75.36% -4.61% ❌
Mappings.java 73.53% 🍏

@remiceres
remiceres deleted the perf/streaming-hash-aggregation branch October 21, 2026 14:53
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