• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

orneryd / NornicDB / 36384799038
87%

Build:
DEFAULT BRANCH: main
Ran 28 Sep 2026 06:20AM UTC
Jobs 1
Files 655
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

28 Sep 2026 06:06AM UTC coverage: 86.955% (-0.008%) from 86.963%
36384799038

push

github

orneryd
fix(cypher): optional shortestPath and shortestPath-as-value converge on one BFS (#581, #721)

OPTIONAL MATCH p = shortestPath(...) previously rewrote the clause to a
plain MATCH and swallowed every error into a fabricated {"result": null}
row with the wrong columns. Clause-only and anchored forms
(MATCH (a) OPTIONAL MATCH p = shortestPath((a)-...->(c))) now run the
shared shortestPath BFS with left-outer-join semantics: one row per seed,
projected values when a path exists, nulls when none, errors propagated.

shortestPath(...)/allShortestPaths(...) are now valid in value position
(RETURN length(shortestPath((a)-[:R*]->(b))), WITH, SET projections):
the projected-pattern validator masks the path-function arguments instead
of rejecting them, and the shared row evaluator runs the same BFS per row.
length() of an unbound path returns null instead of a fabricated 0.

Convergence: MATCH, OPTIONAL MATCH, and value forms all traverse through
e.shortestPath/e.allShortestPaths and project through buildPathContext;
clause-position detection shares extractShortestPathCall with
isShortestPathClause (new); the validator's mask reuses indexASCIIFold
(zero-alloc ASCII fold shared with equalFoldASCII).

Performance (M2 Max, -cpu=1 -count=3, BenchmarkStatementRouting):
  autocommit/simple_match_limit  main 161 allocs, 17.4-18.8 us/op
                                 branch 161 allocs, 17.5-17.7 us/op
  explicit_tx/simple_match_limit main 88 allocs, 11.5-12.0 us/op
                                 branch 88 allocs, 11.4 us/op
  No allocation or latency regression; extractShortestPathCall's
  upperASCII(funcName) copies were removed with constant upper-case
  literals after memprofile diffing showed the +2 allocs they added.

Tests: optional_shortest_path_test.go pins #581's five Neo4j outcomes
plus value forms in RETURN/WITH, autocommit and explicit transactions,
each run twice; full pkg/cypher suite, -race, and TCK ratchet
(7794/7794, 100%) pass.

249 of 322 new or added lines in 7 files covered. (77.33%)

14 existing lines in 3 files now uncovered.

175899 of 202287 relevant lines covered (86.96%)

1.02 hits per line

Uncovered Changes

Lines Coverage ∆ File
59
80.91
-5.72% pkg/cypher/shortest_path.go
9
84.0
-0.07% pkg/cypher/clauses.go
3
95.32
-0.37% pkg/cypher/semantic_validation.go
2
97.28
-0.16% pkg/cypher/keyword_scan.go

Coverage Regressions

Lines Coverage ∆ File
7
86.57
-2.47% pkg/replication/multi_region.go
5
87.82
-0.38% pkg/nornicdb/search_services.go
2
91.09
-0.31% pkg/search/fulltext_index_v2.go
Jobs
ID Job ID Ran Files Coverage
1 36384799038.1 28 Sep 2026 06:20AM UTC 655
86.96
GitHub Action Run
Source Files on build 36384799038
  • Tree
  • List 655
  • Changed 20
  • Source Changed 0
  • Coverage Changed 20
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • 5182fe9e on github
  • Prev Build on main (#36378037120)
  • Next Build on main (#36393085049)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc