|
1 | | -## [unreleased] |
| 1 | +## [0.5.2] - 2025-11-30 |
2 | 2 |
|
3 | 3 | ### 🚀 Features |
4 | 4 |
|
5 | | -- Fix OPTIONAL MATCH + Variable-Length Paths returning 0 rows when no path exists |
| 5 | +- **OPTIONAL MATCH + Variable-Length Paths** - Fix returning 0 rows when no path exists |
6 | 6 | - Changed FROM clause to use anchor node instead of CTE for optional VLP |
7 | 7 | - Added LEFT JOIN for CTE (instead of FROM) when VLP is optional |
8 | 8 | - Added LEFT JOIN for end node through CTE |
9 | 9 | - Extract start node filter to outer query WHERE clause |
10 | | - - Added `extract_start_filter_for_outer_query()` to traverse logical plan and find GraphRel.where_predicate |
11 | | - - Added `GroupBy` handling to filter extraction (was missing, causing filter to not be found) |
12 | 10 | - All 27 OPTIONAL MATCH tests now pass (100%) |
13 | 11 |
|
14 | | -- Complete polymorphic edge support for wildcard relationship patterns |
| 12 | +- **Complete Polymorphic Edge Support** - Single table with multiple edge types |
15 | 13 | - Single-hop wildcard edges: `(u:User)-[r]->(target)` with unlabeled targets |
16 | 14 | - Multi-hop polymorphic CTE chaining: `(u)-[r1]->(m)-[r2]->(t)` with proper JOIN chaining |
17 | 15 | - Bidirectional (incoming) edges: `(u:User)<-[r]-(source)` using `to_node_id` JOIN |
18 | 16 | - Mixed edge patterns: Standard edges + polymorphic edges in same query |
19 | | - - Added `is_incoming` tracking for correct JOIN direction |
| 17 | + - Multi-type filter with IN clause: `[:FOLLOWS|LIKES]` → `WHERE type IN ('FOLLOWS', 'LIKES')` |
20 | 18 |
|
21 | | -- Verify composite edge ID support with polymorphic tables |
| 19 | +- **Composite Edge ID Support** - Multi-column uniqueness for polymorphic tables |
22 | 20 | - Single-column edge IDs: `edge_id: uid` |
23 | 21 | - Composite edge IDs: `edge_id: [from_id, to_id, interaction_type, timestamp]` |
24 | | - - Works with VLP (variable-length paths) - generates `tuple(...)` for uniqueness |
| 22 | + - Works with VLP - generates `tuple(...)` for cycle detection |
25 | 23 | - Works with polymorphic edge tables - type filters + composite IDs together |
26 | | - - Proper `NOT has(path_edges, tuple(...))` cycle detection |
27 | 24 |
|
28 | | -- Add coupled edge alias unification for denormalized patterns |
29 | | - - Automatic JOIN elimination for multi-hop patterns on same table |
30 | | - - Unified table aliases for coupled edges (e.g., both `r1` and `r2` use `r1`) |
| 25 | +- **Coupled Edge Optimization** - JOIN elimination for multi-hop on same table |
| 26 | + - Automatic detection when edges share table and coupling node |
| 27 | + - Unified table aliases (e.g., both `r1` and `r2` use `r1`) |
31 | 28 | - Works with all Cypher features: WHERE, aggregations, ORDER BY, DISTINCT, UNWIND |
32 | | - |
33 | | -- Add UNWIND property mapping for denormalized nodes |
34 | | - - `transform_unwind_expression()` resolves Cypher properties to SQL columns |
35 | | - - Supports denormalized node properties (`from_node_properties`/`to_node_properties`) |
36 | 29 |
|
37 | | -- Add VLP + UNWIND support: UNWIND nodes(p) and relationships(p) after variable-length paths |
38 | | - - Translates to ARRAY JOIN on CTE's path_nodes/path_relationships arrays |
| 30 | +- **VLP + UNWIND Support** - Path decomposition with ARRAY JOIN |
| 31 | + - `UNWIND nodes(p) AS n` - Explodes path nodes to rows |
| 32 | + - `UNWIND relationships(p) AS r` - Explodes path relationships to rows |
39 | 33 | - Works with all VLP patterns: `*`, `*2`, `*1..3`, `*..5`, `*2..` |
40 | | - |
41 | | -- Add coupled edge detection in graph schema |
42 | | - - `are_edges_coupled()` and `get_coupled_edge_info()` schema methods |
43 | | - - Detects when two edges share the same table and a common node |
44 | | - - Foundation for multi-edge single-row optimization (Zeek DNS pattern) |
| 34 | + |
| 35 | +- **Denormalized Edge Tables** - Edge table = node table pattern |
| 36 | + - Schema structure with `from_node_properties`/`to_node_properties` |
| 37 | + - Multi-hop patterns, VLP, aggregations all working |
| 38 | + - Graph algorithms: shortestPath, allShortestPaths, PageRank |
| 39 | + |
| 40 | +### 🧪 Testing |
| 41 | + |
| 42 | +- Add comprehensive schema variation test suite (73 tests) |
| 43 | + - Standard schema: 30 tests |
| 44 | + - Denormalized schema: 14 tests |
| 45 | + - Polymorphic schema: 24 tests |
| 46 | + - Coupled schema: 5 tests |
| 47 | +- All 534 library tests passing |
45 | 48 |
|
46 | 49 | ### 📚 Documentation |
47 | 50 |
|
48 | | -- Update STATUS.md with complete polymorphic edge support |
49 | | -- Add Coupled Edges section to denormalized-edge-tables.md |
50 | | -- Add UNWIND with Coupled Edges documentation |
| 51 | +- Add Schema-Polymorphic-Edges.md wiki page |
| 52 | +- Add Cypher-Subgraph-Extraction.md wiki page |
51 | 53 | - Add coupled-edges.md implementation notes |
| 54 | +- Update STATUS.md with complete schema variation support |
52 | 55 |
|
53 | 56 | ### ⚙️ Miscellaneous Tasks |
54 | 57 |
|
55 | 58 | - Update CHANGELOG.md [skip ci] |
| 59 | + |
56 | 60 | ## [0.5.1] - 2025-11-21 |
57 | 61 |
|
58 | 62 | ### 🚀 Features |
|
0 commit comments