Releases: Shopify/cypher-parser
Releases · Shopify/cypher-parser
Release list
v0.8.1
What's Changed
Performance
- Push single-variable WHERE predicates across all MATCH clauses by @paracycle in #4
- Release 0.8.1 by @paracycle in #5
Documentation
- Refresh README and set up PR-based release notes by @paracycle in #2
- Add AGENTS.md by @paracycle in #3
New Contributors
- @paracycle made their first contribution in #2
Full Changelog: v0.8.0...v0.8.1
v0.8.0
Highlights
- Negative integer literals (
-10). Previously a syntax error in expressions and property maps. - openCypher orderability.
ORDER BYnow orders across types per the spec (nullsorts last; strings before numbers). GraphProvider::expand_in. Optional targeted incoming-neighbour lookup so an incoming step is O(degree) instead of a whole-graph reverse-adjacency build; defaulted, so existing providers are unaffected.- Cheaper binding rows. Rows are now backed by a small
Vecrather than aHashMap, cutting allocations when a large scan materializes one row per node.
v0.7.0
Highlights
UNWIND. Expand a list into rows; may start a query.CASEexpressions. BothCASE x WHEN ...andCASE WHEN cond ...forms.- Comments. Line (
//) and block (/* ... */). - Map projections
n { .prop, key: expr }, backed by a newCypherValue::Map.
Breaking: new Clause / Expr variants and CypherValue::Map.
v0.6.1
Highlights — performance
Existential and set-membership queries now scale regardless of how the pattern was written (a forward-written NOT EXISTS previously timed out / OOM'd on a large graph). All changes are internal and behavior-preserving.
- Bound-endpoint anchoring.
(x)-[:R]->(d)withdbound now traverses fromdvia the incoming cache instead of scanning every node. - HashSet-backed
DISTINCTandIN. O(n) dedup and O(1) membership, replacing O(n²) / O(n) scans. - WHERE pushdown. Single-variable predicates prune the candidate scan before expansion.
v0.6.0
Highlights
OPTIONAL MATCH. Left-join semantics: unmatched rows are kept with the clause's new variables null.- First-class
EXISTS { ... }/NOT EXISTS. Express "has no such relationship" anti-joins directly instead of viaOPTIONAL MATCH+IS NULLworkarounds.
Breaking: new Expr / MatchClause AST variants.
v0.5.0
Highlights
WITHclause chaining. Enables post-aggregation filtering (... WITH n, count(*) AS c WHERE c > 1 ...) and passing values between clauses. Required generalizing bindings to hold either a node or a computed value.
Breaking: the Query AST is now a clause pipeline (clauses + result).
v0.4.0
Highlights
- Node identity in results. Added
GraphProvider::node_idand anidonCypherValue::Nodeso consumers can map a returned node back to their own object — label + name alone was not unique.
Breaking: GraphProvider implementers must add node_id.
v0.3.0
Highlights
IN+ list literals andIS NULL/IS NOT NULL. The most common membership and null-test predicates for real introspection queries.RETURN *. Project all bound variables without naming them.- Scalar functions
toLower,toUpper,size,coalesce,labels. A starter set covering the frequent string/collection needs.
v0.2.0
Highlights
- Pluggable executor. Added a generic tree-walking executor over a new
GraphProvidertrait, so any backend can be queried without the crate knowing the concrete graph — turning the parser into a usable engine with table/JSON output.
v0.1.0
Initial release. A hand-written lexer, recursive-descent parser, and AST for a practical read-only subset of Cypher (MATCH / WHERE / RETURN / ORDER BY / SKIP / LIMIT), extracted from rubydex so the query language could evolve as its own crate.