Compiled Cypher: a CALL's UNION ALL keeps its null and list marks from the first part only (port of drivine4j#512)
Les mainteneurs répondent en général sous 1 jour
Une pull request liée a déjà été fusionnée.
- #322 par @jasperblues — fusionnée
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 56/100
Piste de recherche
Start at _called_union in drivine/cypher/sql/sql_cypher_compiler.py, especially the merge loop around line 1874, and compare how it combines marks across UNION ALL parts. Port the named cases from CypherQueryCrossEngineTest.kt and the two steps from spec v0.20.0. Done means the null and list marks merge as described and the regression cases match the expected Neo4j behavior.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Port of liberation-data/drivine4j#512 (fixed by liberation-data/drivine4j#514). This adds to the note already in #314.
What happens here now: _called_union (drivine/cypher/sql/sql_cypher_compiler.py:1834, merge loop at ~1874) builds each merged column with dataclasses.replace(projected[0]'s value, …). It recomputes only row_keys, from_list, temporal, items, item_items, temporals, text, texts and known across the parts. Every other mark comes from the first part only: JSON's-null (#314's note), and the marks for a list, a list of lists, and a flat list. So when parts differ in kind, the merged column sorts and compares by the first part's kind.
drivine4j's wrong rows before its fix:
CALL { RETURN [10] AS v UNION ALL RETURN 10 AS v } RETURN v ORDER BY vgave[10, [10]]; Neo4j gives[[10], 10].v < 2over[1] ∪ 1gave[null, null]; Neo4j gives[null, true].v = [1]andv IN [[1], 1]over[1] ∪ [null]gave[true, false]; Neo4j gives[true, null].UNWIND vover[[1]] ∪ [1], then ORDER BY, gave[1, [1]]; Neo4j gives[[1], 1].CALL { RETURN {}.a AS v UNION ALL RETURN [null][0] AS v } RETURN DISTINCT vgave two nulls; Neo4j gives one.
What the fix does: in calledUnion, the JSON's-null mark is set if any part has it. The list, list-of-lists and flat marks are kept only where every part has them, like text/texts.
Tests to port:
- drivine4j
CypherQueryCrossEngineTest.kt: "a CALL's UNION ALL whose later part gives a list's null keeps it one null with a missing key", and "a CALL's UNION ALL whose first part gives a list and a later one a number or a map sorts each by its kind". The second skips Postgres (#307 there) and compares rows without ORDER BY as a multiset. - Spec v0.20.0 (drivine-cypher-spec #45): two steps in "A null in a map and a missing key are one null".
- Langage dominant
- Python
- Étoiles
- 1
- Forks
- 0
- Merge moyen
- 1 h 32 min
- PR mergées (30 j)
- 149
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de liberation-data/drivine-python
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
liberation-data/drivine-python#363 ·
Les mainteneurs répondent en général sous 1 jour
-
Docs: drivine4j doesn't read the flat DATABASE_* variables, as 02-connecting.md and design.md sayOuvertedocumentation
Difficulté 1/5 1-3 heures Accessibilité débutants 78/100
liberation-data/drivine-python#361 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
liberation-data/drivine-python#250 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
liberation-data/drivine-python#209 ·
Les mainteneurs répondent en général sous 1 jour
-
CI: three Oracle-only tests in test_cypher_compiled.py never run, as -k oracle doesn't select themOuverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
liberation-data/drivine-python#178 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de liberation-data/drivine-python
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
pytest-dev/pyfakefs#1367 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
IFEvalG exclude_word_harder misses the keyword next to punctuation, at the start or end of the text, and in other letter casePeut-être pris @damienen l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
allenai/open-instruct#2151 ·
Les mainteneurs répondent en général sous 1 jour
-
feat(plan): support convertorLabels and convertorAffinity in Plan resourcePeut-être pris @AmenB l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
RedHatQE/openshift-python-wrapper#2849 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 25 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
libnativeapi/nativeapi#21 ·