Repository navigation
What's Changed
- Build: default to ninja, mold and ccache by @rjb32 in #1201
- Cypher: accept every query body in every { } by @rjb32 in #1213
- TUR-339: MLIR: fuse a node IN a constant list of IDs into a const scan by @rjb32 in #1215
- TUR-329: Cypher: implement the IS label test by @rjb32 in #1216
- TUR-323: MLIR: convert map values an OPTIONAL CALL body returns before padding them by @rjb32 in #1218
- CLAUDE.md: benchmark binaries one server at a time and check the host first by @rjb32 in #1226
- Storage: introduce GraphPath, drop EntityList by @rjb32 in #1186
- TUR-73: Cypher: test a grouping key read inside a container beside an aggregate by @rjb32 in #1228
- TUR-340: Python: convert a node or an edge held in a list or a map by @rjb32 in #1229
- TUR-336: MLIR: start a pattern from the node making the fewest rows by @rjb32 in #1219
- Unify the value type for lists and maps by @sulaimansuhas in #1227
- TUR-338: MLIR: hash join keys of different types by @rjb32 in #1230
- TUR-338: MLIR: size a hash join by its smaller side by @rjb32 in #1231
- Analyzer: type binary operators by rules over two types by @sulaimansuhas in #1220
- Cypher: parse a parameter in an expression by @sulaimansuhas in #1222
- Analyzer: type a parameter by the candidate types of its bind by @sulaimansuhas in #1223
- Analyzer: share one ParameterDecl between the occurrences of a parameter by @sulaimansuhas in #1224
- TUR-326: MLIR: read an unwound value back as the element it equals by @rjb32 in #1234
- TUR-86: Cypher: answer null for list and map equality over a null at any depth by @sulaimansuhas in #1235
- TUR-307: Cypher: implement conditional WHEN bodies in EXISTS, COUNT and COLLECT subqueries by @rjb32 in #1240
- TUR-300: Cypher: implement allReduce by @rjb32 in #1237
- TUR-304: MLIR: group the rows when every grouping key is constant by @rjb32 in #1236
- TUR-304: MLIR: read an argument of a body run once per row as a constant by @rjb32 in #1238
- MLIR: spell the tag of db.collect_subquery_yield behind a keyword by @rjb32 in #1243
- TUR-304: MLIR: read the imports of a body run once per row as constants by @rjb32 in #1241
- MLIR: describe a pending row by the ID it will commit as by @rjb32 in #1244
- MLIR: estimate pattern walks from typed edge counts and degree products by @rjb32 in #1242
- TUR-349: MLIR: hoist constants and handles in one run above the ops computed from them by @rjb32 in #1246
- TUR-266: MLIR: move the size() and count() walk shortcuts from codegen to db passes by @rjb32 in #1211
- TUR-265: Cypher: type group variables and variable-length relationships as lists by @rjb32 in #1210
- TUR-243: Cypher: accept every keyword as a name by @rjb32 in #1212
- TUR-243: Test: read keyword names on a supplier graph by @rjb32 in #1247
- TUR-343: MLIR: read one unwound element back in the type it replaces by @rjb32 in #1248
- TUR-331: MLIR: keep a sum of integer cells an integer by @rjb32 in #1249
- QA: pin the queries probed over the per-row imports, walks, allReduce and the join estimates by @rjb32 in #1252
- Cypher: answer elementId() as id() by @rjb32 in #1254
- MLIR: read an entity out of a constant list by @rjb32 in #1255
- MLIR: type db.broadcast_constant as the value it lays out by @rjb32 in #1256
- MLIR: hoist an op a region reads ahead of the op holding the region by @rjb32 in #1257
- MLIR: let a collect read every row before a LIMIT after it by @rjb32 in #1259
- MLIR: bound a hash join's cut only by a limit its rows reach by @rjb32 in #1260
- MLIR: build a walk's named path as a path value by @rjb32 in #1261
- MLIR: erase the values computed per row that nothing reads, keeping the ones that may raise by @rjb32 in #1262
- MLIR: select a path in a CASE and a coalesce by @rjb32 in #1263
- MLIR: read a null laid out over rows as the nullable column an op needs by @rjb32 in #1264
- MLIR: read a walk carried into a body run per row as the list of its relationships by @rjb32 in #1265
- MLIR: carry the grouping keys into the bodies beside an aggregate by @rjb32 in #1266
- Cypher: implement map projection by @rjb32 in #1267
- MLIR: give every reader of a fused unwind but an output a stand-in of its type by @rjb32 in #1268
- Cypher: look up a property on any atom by @rjb32 in #1253
- MLIR: reduce every aggregate of a keyless projection that collects in one db.collect by @rjb32 in #1258
- TUR-74: Test: enable the collect tests over maps by @rjb32 in #1275
- TUR-361: Cypher: order by a key or property of a returned item beside an aggregate or after DISTINCT by @rjb32 in #1271
- TUR-366: MLIR: read a LIMIT 0 over a hash join's cut as a budget of zero rows by @rjb32 in #1270
- TUR-368: MLIR: carry only the deduplicated rows into a body in the ORDER BY of a DISTINCT by @rjb32 in #1277
- TUR-346: Cypher: hold paths in lists and maps by @rjb32 in #1250
- MLIR: write map values to a property through the cell path by @sulaimansuhas in #1272
- MLIR: implement SET n += map by @sulaimansuhas in #1273
- MLIR: implement SET n = map by @sulaimansuhas in #1274
- TUR-352: Cypher: start a pattern from the node or relationship a value holds by @rjb32 in #1290
- Add npm Release Step by @sulaimansuhas in #929
- Delete properties of a node through set n = null by @sulaimansuhas in #1296
- TUR-350: Cypher: implement function namespaces and coll.indexOf by @rjb32 in #1300
- Quick Fixes For WASM client by @sulaimansuhas in #1310
- Cypher: implement datetime of a map by @sulaimansuhas in #1314
- TUR-332: Cypher: parse queries by recursive descent by @rjb32 in #1303
- Wasm: test the npm client end to end and fix the gaps it found by @rjb32 in #1309
- TUR-354: Cypher: type labels() as a list of strings by @rjb32 in #1278
- TUR-355: Cypher: compute every value of a map written with a repeated key by @rjb32 in #1279
- TUR-356: Cypher: count a range between bounds held in type-erased cells by @rjb32 in #1280
- TUR-357: MLIR: keep an unread op that may raise by reporting the raise as an effect by @rjb32 in #1281
- TUR-358: MLIR: compute a coalesce argument only over the rows the earlier ones left null by @rjb32 in #1282
- TUR-359: Cypher: raise on indexing or slicing a type-erased cell that holds no list by @rjb32 in #1283
- TUR-360: MLIR: keep a constant laid out over an op's rows out of that op's regions by @rjb32 in #1284
- TUR-362: Cypher: reject an ORDER BY key mixing an aggregate with a dropped variable by @rjb32 in #1285
- TUR-363: Cypher: reject an ORDER BY aggregate over a projection that does not aggregate by @rjb32 in #1286
- TUR-353: Cypher: read components off a temporal cell and raise on a cell holding no keys by @rjb32 in #1287
- Cypher: read a key of a map held by another map by @rjb32 in #1288
- Cypher: read a key written as a literal string in brackets by @rjb32 in #1289
- Cypher: parse a dotted chain as Neo4j does by @rjb32 in #1291
- TUR-369: Cypher: read the components of a datetime or a duration in a map projection by @rjb32 in #1292
- Cypher: read a repeated map key as Neo4j does by @rjb32 in #1293
- MLIR: compute coalesce with a dedicated op by @rjb32 in #1294
- MLIR: reuse a property read inside a CASE or a coalesce by @rjb32 in #1298
- Cypher: index by a value held in a type-erased cell by @rjb32 in #1299
- Cypher: name the type a row holds in its runtime type errors by @rjb32 in #1301
- Cypher: iterate a value held in a type-erased cell as a list of one by @rjb32 in #1302
- Cypher: raise on a string function or arithmetic over a cell holding the wrong type by @rjb32 in #1305
- Cypher: sum and average durations by @rjb32 in #1306
- Cypher: word a shared op's runtime type error to fit every construct that reaches it by @rjb32 in #1307
- Cypher: create a property from a value held in a type-erased cell by @rjb32 in #1308
- Cypher: test out-of-bounds list access by @rjb32 in #1311
- TUR-362: Cypher: test a subquery naming a variable an aggregation dropped by @rjb32 in #1312
- MLIR: follow a type-erased column through every op carrying it to decide whether a read of it may raise by @rjb32 in #1313
- MLIR: place an op over list elements after the values its body reads from above by @rjb32 in #1315
- MLIR: iterate the maps codegen emits from in insertion order by @rjb32 in #1316
- Test: enable the TUR-351 tests and remove the disabled string index tests by @rjb32 in #1318
- Server: remove the JSON protocol by @sulaimansuhas in #1317
- TUR-62: Procedures: read gnn.graphSAGE's arguments per row by @rjb32 in #1319
- TUR-328: Cypher: choose the bar after a label by a speculative parse by @rjb32 in #1321
- TUR-422: Procedures: spell a null node or edge as an invalid ID by @rjb32 in #1320
- TUR-423: Procedures: reject a gnn.graphSAGE seed that names no node by @rjb32 in #1325
- TUR-407: Analyzer: reject a null or a cell beside an operand no value combines with by @sulaimansuhas in #1332
- TUR-410: Query: raise on a duration sum past the range and average durations over a 128-bit total by @sulaimansuhas in #1341
- TUR-414: Query: raise on a null count in duration() of a map by @sulaimansuhas in #1342
- TUR-420: Query: create a property from a map entry typed per row in SET n = map and SET n += map by @sulaimansuhas in #1343
- TUR-376: MLIR: test a CASE in a CALL body over a constant the body binds by @rjb32 in #1331
- TUR-377: Cypher: read a property a SET creates as null in the SET's own value by @rjb32 in #1326
- TUR-376: MLIR: find what an op reads from above without climbing out of it by @rjb32 in #1340
- TUR-390: MLIR: reuse a property read into and out of a subquery body by @rjb32 in #1348
- TUR-417: MLIR: read one property of a node or edge by name, not every property per row by @rjb32 in #1327
- TUR-408: Cypher: split a string on every delimiter of a list by @rjb32 in #1328
- TUR-406: Cypher: answer null for a list plus null by @rjb32 in #1330
- TUR-423: Procedures: reject a gnn.graphSAGE seed that names no node by @rjb32 in #1349
- Claude: run converge at xhigh by default by @rjb32 in #1351
- TUR-424: MLIR: run a join filter before the hops of the pattern it joins by @rjb32 in #1355
- Parameters: hold a Duration or a DateTime value and carry the map to the analyzer by @sulaimansuhas in #1322
- Analyzer: type a parameter by the type of its value by @sulaimansuhas in #1323
- MLIR: run a parameter in an expression as a typed argument of main by @sulaimansuhas in #1324
- Shell: evaluate a :param value as a Cypher expression by @sulaimansuhas in #1344
- Cypher: convert datetime and duration through the conversion rule table and share the calendar arithmetic by @sulaimansuhas in #1358
- TUR-302: Storage: implement a point property type by @rjb32 in #1333
- TUR-302: Cypher: read the components of a point by @rjb32 in #1334
- TUR-302: Cypher: implement point.distance and point.withinBBox by @rjb32 in #1335
- TUR-302: Import: name the type of a property in one spec by @rjb32 in #1336
- TUR-302: Import: read points from JSONL by @rjb32 in #1337
- TUR-302: Import: read points from GeoParquet by @rjb32 in #1338
- TUR-302: Cypher: order points and take their min, max and average by @rjb32 in #1339
- Test: enable the journey and npm tests parameters unblocked by @rjb32 in #1365
- Regress: test every column type and encoding the Python and npm clients read by @rjb32 in #1359
- Python: convert every column type and encoding the engine outputs by @rjb32 in #1360
- Test: run a Doom-style game tick as one Cypher statement by @rjb32 in #1304
- Lowering: forget erased ops and freed buckets in the maps lowering reads by @rjb32 in #1374
- Python: give datetime and duration arrays their unit by @rjb32 in #1382
- Storage: zero the padding of a point in the constructor body by @rjb32 in #1383
- Build: find with std::ranges::find, since GCC 11 has no std::ranges::contains by @rjb32 in #1384
- Build: link with GNU ld on ARM64 when mold is older than 2.32 by @rjb32 in #1385
Full Changelog: v3.0.2...v3.1