Skip to content

Releases: Shopify/cypher-parser

v0.8.1

Choose a tag to compare

@github-actions github-actions released this 09 Jul 20:59
a7b822f

What's Changed

Performance

Documentation

New Contributors

Full Changelog: v0.8.0...v0.8.1

v0.8.0

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

Highlights

  • Negative integer literals (-10). Previously a syntax error in expressions and property maps.
  • openCypher orderability. ORDER BY now orders across types per the spec (null sorts 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 Vec rather than a HashMap, cutting allocations when a large scan materializes one row per node.

v0.7.0

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

Highlights

  • UNWIND. Expand a list into rows; may start a query.
  • CASE expressions. Both CASE x WHEN ... and CASE WHEN cond ... forms.
  • Comments. Line (//) and block (/* ... */).
  • Map projections n { .prop, key: expr }, backed by a new CypherValue::Map.

Breaking: new Clause / Expr variants and CypherValue::Map.

v0.6.1

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

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) with d bound now traverses from d via the incoming cache instead of scanning every node.
  • HashSet-backed DISTINCT and IN. 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

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

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 via OPTIONAL MATCH + IS NULL workarounds.

Breaking: new Expr / MatchClause AST variants.

v0.5.0

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

Highlights

  • WITH clause 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

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

Highlights

  • Node identity in results. Added GraphProvider::node_id and an id on CypherValue::Node so 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

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

Highlights

  • IN + list literals and IS 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

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

Highlights

  • Pluggable executor. Added a generic tree-walking executor over a new GraphProvider trait, 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

Choose a tag to compare

@paracycle paracycle released this 08 Jul 18:09

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.