diff --git a/dataset/tck/schema.cypher b/dataset/tck/schema.cypher new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index 9156a7cb37..0c5c016b36 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -432,39 +432,41 @@ void Binder::bindQueryNodeProperties(NodeExpression& node) { } } -std::vector Binder::bindTableIDs( - const std::vector& tableNames, LogicalTypeID nodeOrRelType) { +std::vector Binder::bindNodeTableIDs( + const std::vector& tableNames) { + if (!catalog.getReadOnlyVersion()->hasNodeTable()) { + throw common::BinderException("No node table exists in database."); + } std::unordered_set tableIDs; - switch (nodeOrRelType) { - case LogicalTypeID::NODE: { - if (tableNames.empty()) { - for (auto tableID : catalog.getReadOnlyVersion()->getNodeTableIDs()) { - tableIDs.insert(tableID); - } - } else { - for (auto& tableName : tableNames) { - tableIDs.insert(bindNodeTableID(tableName)); - } - } - } break; - case LogicalTypeID::REL: { - if (tableNames.empty()) { - for (auto tableID : catalog.getReadOnlyVersion()->getRelTableIDs()) { - tableIDs.insert(tableID); - } + if (tableNames.empty()) { + for (auto tableID : catalog.getReadOnlyVersion()->getNodeTableIDs()) { + tableIDs.insert(tableID); } + } else { for (auto& tableName : tableNames) { - tableIDs.insert(bindRelTableID(tableName)); + tableIDs.insert(bindNodeTableID(tableName)); } - } break; - default: - throw NotImplementedException( - "bindTableIDs(" + LogicalTypeUtils::dataTypeToString(nodeOrRelType) + ")."); } auto result = std::vector{tableIDs.begin(), tableIDs.end()}; - if (result.empty() && tableNames.empty()) { - throw common::BinderException{"Expected a valid node name in MATCH clause."}; + std::sort(result.begin(), result.end()); + return result; +} + +std::vector Binder::bindRelTableIDs( + const std::vector& tableNames) { + if (!catalog.getReadOnlyVersion()->hasRelTable()) { + throw common::BinderException("No rel table exists in database."); } + std::unordered_set tableIDs; + if (tableNames.empty()) { + for (auto tableID : catalog.getReadOnlyVersion()->getRelTableIDs()) { + tableIDs.insert(tableID); + } + } + for (auto& tableName : tableNames) { + tableIDs.insert(bindRelTableID(tableName)); + } + auto result = std::vector{tableIDs.begin(), tableIDs.end()}; std::sort(result.begin(), result.end()); return result; } diff --git a/src/common/types/value.cpp b/src/common/types/value.cpp index 27b9431940..62c56652d1 100644 --- a/src/common/types/value.cpp +++ b/src/common/types/value.cpp @@ -340,13 +340,13 @@ std::string Value::toString() const { auto fieldNames = StructType::getFieldNames(&dataType); for (auto i = 0u; i < nestedTypeVal.size(); ++i) { if (nestedTypeVal[i]->isNull_) { + // Avoid printing null key value pair. continue; } - result += fieldNames[i] + ": "; - result += nestedTypeVal[i]->toString(); - if (i != nestedTypeVal.size() - 1) { + if (i != 0) { result += ", "; } + result += fieldNames[i] + ": " + nestedTypeVal[i]->toString(); } result += "}"; return result; @@ -356,13 +356,13 @@ std::string Value::toString() const { auto fieldNames = StructType::getFieldNames(&dataType); for (auto i = 2u; i < nestedTypeVal.size(); ++i) { if (nestedTypeVal[i]->isNull_) { + // Avoid printing null key value pair. continue; } - result += fieldNames[i] + ": "; - result += nestedTypeVal[i]->toString(); - if (i != nestedTypeVal.size() - 1) { + if (i != 2) { result += ", "; } + result += fieldNames[i] + ": " + nestedTypeVal[i]->toString(); } result += "}->(" + nestedTypeVal[1]->toString() + ")"; return result; diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index a1f7a49d1a..15190e1b75 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -195,16 +195,8 @@ class Binder { const std::string& parsedName, const std::vector& tableIDs); void bindQueryNodeProperties(NodeExpression& node); - inline std::vector bindNodeTableIDs( - const std::vector& tableNames) { - return bindTableIDs(tableNames, common::LogicalTypeID::NODE); - } - inline std::vector bindRelTableIDs( - const std::vector& tableNames) { - return bindTableIDs(tableNames, common::LogicalTypeID::REL); - } - std::vector bindTableIDs( - const std::vector& tableNames, common::LogicalTypeID nodeOrRelType); + std::vector bindNodeTableIDs(const std::vector& tableNames); + std::vector bindRelTableIDs(const std::vector& tableNames); /*** validations ***/ // E.g. Optional MATCH (a) RETURN a.age diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index efb1676ae1..31b10d3bd4 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -44,6 +44,9 @@ class CatalogContent { common::table_id_t dstTableID, common::LogicalType srcPKDataType, common::LogicalType dstPKDataType); + inline bool hasNodeTable() const { return !nodeTableSchemas.empty(); } + inline bool hasRelTable() const { return !relTableSchemas.empty(); } + inline bool containNodeTable(common::table_id_t tableID) const { return nodeTableSchemas.contains(tableID); } diff --git a/test/test_files/copy/copy_node_csv.test b/test/test_files/copy/copy_node_csv.test index 4f9d4c6f8a..d650a21f5c 100644 --- a/test/test_files/copy/copy_node_csv.test +++ b/test/test_files/copy/copy_node_csv.test @@ -37,7 +37,7 @@ -LOG EmptyStringTest -STATEMENT MATCH (row:tableOfTypes) WHERE row.id = 49992 RETURN *; ---- 1 -{_ID: 0:49992, _LABEL: tableOfTypes, id: 49992, int64Column: 50, doubleColumn: 31.582059, booleanColumn: False, dateColumn: 1551-07-19, timestampColumn: 1551-07-19 16:28:31, } +{_ID: 0:49992, _LABEL: tableOfTypes, id: 49992, int64Column: 50, doubleColumn: 31.582059, booleanColumn: False, dateColumn: 1551-07-19, timestampColumn: 1551-07-19 16:28:31} -LOG FloatTest -STATEMENT MATCH (row:tableOfTypes) WHERE row.doubleColumn = 68.73718401556897 RETURN row.dateColumn; diff --git a/test/test_files/demo_db/demo_db.test b/test/test_files/demo_db/demo_db.test index 17393282b7..c6849107d9 100644 --- a/test/test_files/demo_db/demo_db.test +++ b/test/test_files/demo_db/demo_db.test @@ -23,10 +23,10 @@ Adam -LOG MatchMultipleNodeLabels -STATEMENT MATCH (a:User:City) RETURN a; ---- 7 -{_ID: 0:0, _LABEL: User, name: Adam, age: 30, } -{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, } -{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, } -{_ID: 0:3, _LABEL: User, name: Noura, age: 25, } +{_ID: 0:0, _LABEL: User, name: Adam, age: 30} +{_ID: 0:1, _LABEL: User, name: Karissa, age: 40} +{_ID: 0:2, _LABEL: User, name: Zhang, age: 50} +{_ID: 0:3, _LABEL: User, name: Noura, age: 25} {_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000} {_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000} {_ID: 1:2, _LABEL: City, name: Guelph, population: 75000} @@ -34,10 +34,10 @@ Adam -LOG MatchAnyNodeLabel -STATEMENT MATCH (a) RETURN a; ---- 7 -{_ID: 0:0, _LABEL: User, name: Adam, age: 30, } -{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, } -{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, } -{_ID: 0:3, _LABEL: User, name: Noura, age: 25, } +{_ID: 0:0, _LABEL: User, name: Adam, age: 30} +{_ID: 0:1, _LABEL: User, name: Karissa, age: 40} +{_ID: 0:2, _LABEL: User, name: Zhang, age: 50} +{_ID: 0:3, _LABEL: User, name: Noura, age: 25} {_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000} {_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000} {_ID: 1:2, _LABEL: City, name: Guelph, population: 75000} @@ -55,24 +55,24 @@ Zhang|(0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3)|Noura ---- 8 Adam|(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1)|Karissa Adam|(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2)|Zhang -Adam|(0:0)-{_LABEL: LivesIn, _ID: 3:0, }->(1:0)|Waterloo +Adam|(0:0)-{_LABEL: LivesIn, _ID: 3:0}->(1:0)|Waterloo Karissa|(0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2)|Zhang -Karissa|(0:1)-{_LABEL: LivesIn, _ID: 3:1, }->(1:0)|Waterloo -Noura|(0:3)-{_LABEL: LivesIn, _ID: 3:3, }->(1:2)|Guelph +Karissa|(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0)|Waterloo +Noura|(0:3)-{_LABEL: LivesIn, _ID: 3:3}->(1:2)|Guelph Zhang|(0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3)|Noura -Zhang|(0:2)-{_LABEL: LivesIn, _ID: 3:2, }->(1:1)|Kitchener +Zhang|(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1)|Kitchener -LOG MatchAnyRelLabel -STATEMENT MATCH ()-[e]->() RETURN e; ---- 8 (0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1) (0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2) -(0:0)-{_LABEL: LivesIn, _ID: 3:0, }->(1:0) +(0:0)-{_LABEL: LivesIn, _ID: 3:0}->(1:0) (0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2) -(0:1)-{_LABEL: LivesIn, _ID: 3:1, }->(1:0) +(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0) (0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3) -(0:2)-{_LABEL: LivesIn, _ID: 3:2, }->(1:1) -(0:3)-{_LABEL: LivesIn, _ID: 3:3, }->(1:2) +(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1) +(0:3)-{_LABEL: LivesIn, _ID: 3:3}->(1:2) -LOG MatchUndirected -STATEMENT MATCH (a:User)-[e:Follows]-(b:User) WHERE a.name = 'Karissa' RETURN b.name; @@ -128,8 +128,8 @@ Zhang -LOG AllShortestPath -STATEMENT MATCH p = (a)-[* ALL SHORTEST 1..3 ]-(b) WHERE a.name = 'Zhang' AND b.name='Waterloo' RETURN nodes(p); ---- 2 -[{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, },{_ID: 0:0, _LABEL: User, name: Adam, age: 30, },{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}] -[{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, },{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, },{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}] +[{_ID: 0:2, _LABEL: User, name: Zhang, age: 50},{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}] +[{_ID: 0:2, _LABEL: User, name: Zhang, age: 50},{_ID: 0:1, _LABEL: User, name: Karissa, age: 40},{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}] -LOG ShortestPath -STATEMENT MATCH (a:User)-[e* SHORTEST 1..4]->(b:City) WHERE a.name = 'Adam' RETURN b.name, length(e) AS length; @@ -181,16 +181,16 @@ Zhang|50|2022 -LOG ReturnPath2 -STATEMENT MATCH p = (a:User)-[:Follows*1..2]->(:User)-[:LivesIn]->(:City) WHERE a.name = 'Adam' RETURN p; ---- 4 -{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30, },{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, },{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, },{_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1),(0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2),(0:2)-{_LABEL: LivesIn, _ID: 3:2, }->(1:1)]} -{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30, },{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, },{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1),(0:1)-{_LABEL: LivesIn, _ID: 3:1, }->(1:0)]} -{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30, },{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, },{_ID: 0:3, _LABEL: User, name: Noura, age: 25, },{_ID: 1:2, _LABEL: City, name: Guelph, population: 75000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2),(0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3),(0:3)-{_LABEL: LivesIn, _ID: 3:3, }->(1:2)]} -{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30, },{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, },{_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2),(0:2)-{_LABEL: LivesIn, _ID: 3:2, }->(1:1)]} +{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:1, _LABEL: User, name: Karissa, age: 40},{_ID: 0:2, _LABEL: User, name: Zhang, age: 50},{_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1),(0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2),(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1)]} +{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:1, _LABEL: User, name: Karissa, age: 40},{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1),(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0)]} +{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:2, _LABEL: User, name: Zhang, age: 50},{_ID: 0:3, _LABEL: User, name: Noura, age: 25},{_ID: 1:2, _LABEL: City, name: Guelph, population: 75000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2),(0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3),(0:3)-{_LABEL: LivesIn, _ID: 3:3}->(1:2)]} +{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:2, _LABEL: User, name: Zhang, age: 50},{_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2),(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1)]} -LOG ReturnPath3 -STATEMENT MATCH p1 = (a:User)-[:Follows]->(b:User), p2 = (b)-[:LivesIn]->(:City) WHERE a.name = 'Adam' RETURN p1, p2; ---- 2 -{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:1, _LABEL: User, name: Karissa, age: 40}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1)]}|{_NODES: [{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, },{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}], _RELS: [(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0)]} -{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:2, _LABEL: User, name: Zhang, age: 50}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2)]}|{_NODES: [{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, },{_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000}], _RELS: [(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1)]} +{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:1, _LABEL: User, name: Karissa, age: 40}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1)]}|{_NODES: [{_ID: 0:1, _LABEL: User, name: Karissa, age: 40},{_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000}], _RELS: [(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0)]} +{_NODES: [{_ID: 0:0, _LABEL: User, name: Adam, age: 30},{_ID: 0:2, _LABEL: User, name: Zhang, age: 50}], _RELS: [(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2)]}|{_NODES: [{_ID: 0:2, _LABEL: User, name: Zhang, age: 50},{_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000}], _RELS: [(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1)]} -LOG ReturnPath4 -STATEMENT MATCH p = (a:User)-[:Follows*1..2]->(:User) WHERE a.name = 'Adam' RETURN nodes(p), (rels(p)[1]).since; diff --git a/test/test_files/demo_db/demo_db_create.test b/test/test_files/demo_db/demo_db_create.test index a1e95981fa..fe9c5fb03d 100644 --- a/test/test_files/demo_db/demo_db_create.test +++ b/test/test_files/demo_db/demo_db_create.test @@ -44,7 +44,7 @@ Noura -CHECK_ORDER -STATEMENT MATCH (a:User) WITH a, avg(a.age) AS b, SUM(a.age) AS c, COUNT(a.age) AS d, COUNT(*) AS e RETURN a, b, c,d, e ORDER BY c DESC ---- 5 -{_ID: 0:4, _LABEL: User, name: Alice, }|||0|1 +{_ID: 0:4, _LABEL: User, name: Alice}|||0|1 {_ID: 0:2, _LABEL: User, name: Zhang, age: 50}|50.000000|50|1|1 {_ID: 0:1, _LABEL: User, name: Karissa, age: 40}|40.000000|40|1|1 {_ID: 0:0, _LABEL: User, name: Adam, age: 30}|30.000000|30|1|1 diff --git a/test/test_files/demo_db/demo_db_parquet.test b/test/test_files/demo_db/demo_db_parquet.test index 8fdff6e2b0..3c54dd2367 100644 --- a/test/test_files/demo_db/demo_db_parquet.test +++ b/test/test_files/demo_db/demo_db_parquet.test @@ -23,10 +23,10 @@ Adam -LOG MatchMultipleNodeLabels -STATEMENT MATCH (a:User:City) RETURN a; ---- 7 -{_ID: 0:0, _LABEL: User, name: Adam, age: 30, } -{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, } -{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, } -{_ID: 0:3, _LABEL: User, name: Noura, age: 25, } +{_ID: 0:0, _LABEL: User, name: Adam, age: 30} +{_ID: 0:1, _LABEL: User, name: Karissa, age: 40} +{_ID: 0:2, _LABEL: User, name: Zhang, age: 50} +{_ID: 0:3, _LABEL: User, name: Noura, age: 25} {_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000} {_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000} {_ID: 1:2, _LABEL: City, name: Guelph, population: 75000} @@ -34,10 +34,10 @@ Adam -LOG MatchAnyNodeLabel -STATEMENT MATCH (a) RETURN a; ---- 7 -{_ID: 0:0, _LABEL: User, name: Adam, age: 30, } -{_ID: 0:1, _LABEL: User, name: Karissa, age: 40, } -{_ID: 0:2, _LABEL: User, name: Zhang, age: 50, } -{_ID: 0:3, _LABEL: User, name: Noura, age: 25, } +{_ID: 0:0, _LABEL: User, name: Adam, age: 30} +{_ID: 0:1, _LABEL: User, name: Karissa, age: 40} +{_ID: 0:2, _LABEL: User, name: Zhang, age: 50} +{_ID: 0:3, _LABEL: User, name: Noura, age: 25} {_ID: 1:0, _LABEL: City, name: Waterloo, population: 150000} {_ID: 1:1, _LABEL: City, name: Kitchener, population: 200000} {_ID: 1:2, _LABEL: City, name: Guelph, population: 75000} @@ -55,24 +55,24 @@ Zhang|(0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3)|Noura ---- 8 Adam|(0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1)|Karissa Adam|(0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2)|Zhang -Adam|(0:0)-{_LABEL: LivesIn, _ID: 3:0, }->(1:0)|Waterloo +Adam|(0:0)-{_LABEL: LivesIn, _ID: 3:0}->(1:0)|Waterloo Karissa|(0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2)|Zhang -Karissa|(0:1)-{_LABEL: LivesIn, _ID: 3:1, }->(1:0)|Waterloo -Noura|(0:3)-{_LABEL: LivesIn, _ID: 3:3, }->(1:2)|Guelph +Karissa|(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0)|Waterloo +Noura|(0:3)-{_LABEL: LivesIn, _ID: 3:3}->(1:2)|Guelph Zhang|(0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3)|Noura -Zhang|(0:2)-{_LABEL: LivesIn, _ID: 3:2, }->(1:1)|Kitchener +Zhang|(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1)|Kitchener -LOG MatchAnyRelLabel -STATEMENT MATCH ()-[e]->() RETURN e; ---- 8 (0:0)-{_LABEL: Follows, _ID: 2:0, since: 2020}->(0:1) (0:0)-{_LABEL: Follows, _ID: 2:1, since: 2020}->(0:2) -(0:0)-{_LABEL: LivesIn, _ID: 3:0, }->(1:0) +(0:0)-{_LABEL: LivesIn, _ID: 3:0}->(1:0) (0:1)-{_LABEL: Follows, _ID: 2:2, since: 2021}->(0:2) -(0:1)-{_LABEL: LivesIn, _ID: 3:1, }->(1:0) +(0:1)-{_LABEL: LivesIn, _ID: 3:1}->(1:0) (0:2)-{_LABEL: Follows, _ID: 2:3, since: 2022}->(0:3) -(0:2)-{_LABEL: LivesIn, _ID: 3:2, }->(1:1) -(0:3)-{_LABEL: LivesIn, _ID: 3:3, }->(1:2) +(0:2)-{_LABEL: LivesIn, _ID: 3:2}->(1:1) +(0:3)-{_LABEL: LivesIn, _ID: 3:3}->(1:2) -LOG MatchTwoHop -STATEMENT MATCH (a:User)-[:Follows]->(:User)-[:LivesIn]->(c:City) WHERE a.name = "Adam" RETURN a, c.name, c.population; diff --git a/test/test_files/exceptions/binder/empty_db_binder_error.test b/test/test_files/exceptions/binder/empty_db_binder_error.test index 0cc4cd8bc8..d0e17a7cbc 100644 --- a/test/test_files/exceptions/binder/empty_db_binder_error.test +++ b/test/test_files/exceptions/binder/empty_db_binder_error.test @@ -6,4 +6,4 @@ -CASE MissingQueryNode -STATEMENT MATCH () WITH NULL AS a RETURN a; ---- error -Binder exception: Expected a valid node name in MATCH clause. +Binder exception: No node table exists in database. diff --git a/test/test_files/tck/match/match1.test b/test/test_files/tck/match/match1.test new file mode 100644 index 0000000000..97c2b9b2aa --- /dev/null +++ b/test/test_files/tck/match/match1.test @@ -0,0 +1,351 @@ +-GROUP TCK +-DATASET CSV tck + +-- + +# Match non-existent nodes returns empty +-CASE Scenario1 +-STATEMENT MATCH (n) RETURN n; +---- error +Binder exception: No node table exists in database. + +# Matching all nodes +# TODO(Guodong/Ziyi): Fixme +-CASE Scenario2 +-SKIP +-STATEMENT CREATE NODE TABLE A(ID SERIAL, name STRING, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE NODE TABLE B(ID SERIAL, name STRING, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE (:A), (:B {name: 'b'}); +---- ok +-STATEMENT MATCH (n) RETURN n; +---- 2 +1 +2 + +# Matching nodes using multiple labels +# TODO(Guodong/Ziyi): Fixme +-CASE Scenario3 +-SKIP +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE NODE TABLE B(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE NODE TABLE C(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE (:A), (:B), (:C); +---- ok +-STATEMENT MATCH (a:A:B) RETURN a; +---- 1 +1 + +# Simple node inlnie property predicate +-CASE Scenario4 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, name STRING, firstName STRING, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE (:A {name: 'bar'}), (:A {name: 'monkey'}), (:A {firstName: 'bar'}); +---- ok +-STATEMENT MATCH (n {name: 'bar'}) RETURN n; +---- 1 +{_ID: 0:0, _LABEL: A, ID: 0, name: bar} + + +# Use multiple MATCH clauses to do a Cartesian product +-CASE Scenario5 +-STATEMENT CREATE NODE TABLE A(num INT64, PRIMARY KEY(num)); +---- ok +-STATEMENT CREATE (:A {num: 1}), (:A {num: 2}), (:A {num: 3}); +---- ok +-STATEMENT MATCH (n), (m) RETURN n.num AS n, m.num AS m; +---- 9 +1|1 +1|2 +1|3 +2|1 +2|2 +2|3 +3|1 +3|2 +3|3 + +# Fail when using parameter as node predicate in MATCH +-CASE Scenario6 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT MATCH (n $param) RETURN n; +---- error +Parser exception: Invalid input : expected rule oC_SingleQuery (line: 1, offset: 9) +"MATCH (n $param) RETURN n;" + ^ + +# Fail when a relationship has the same variable in a preceding MATCH +-CASE Scenario7 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE REL TABLE R(FROM A TO A); +---- ok +-STATEMENT MATCH ()-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]->() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()<-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH (), ()-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]-(), () MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-(), ()-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[]-(), ()-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[]-(), ()-[r]-(), () MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[]-(), (), ()-[r]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH (x), (a)-[q]-(b), (s), (s)-[r]->(t)<-[]-(b) MATCH (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. + +# Fail when a path has the same variable in a preceding MATCH +-CASE Scenario8 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE REL TABLE R(FROM A TO A); +---- ok +-STATEMENT MATCH r = ()-[]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[]->() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()<-[]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[*1..30]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[*1..30]->() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[]->() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()<-[]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[*1..30]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[*1..30]->() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-(), r = ()-[]-(), () MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[]-(), ()-[]-(), () MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()<-[]-(), r = ()-[]-() MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), r = (a)-[q]-(b), (s)-[p]-(t)-[]-(b) MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), (a)-[q]-(b), r = (s)-[p]-(t)-[]-(b) MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), (a)-[q]-(b), r = (s)-[p]->(t)<-[]-(b) MATCH (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. + + +# Fail when a relationship has the same variable in the same pattern +-CASE Scenario9 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE REL TABLE R(FROM A TO A); +---- ok +-STATEMENT MATCH ()-[r]-(r) RETURN r; +---- error +Binder exception: r has data type NODE. (REL) was expected. +-STATEMENT MATCH ()-[r]->(r) RETURN r; +---- error +Binder exception: r has data type NODE. (REL) was expected. +-STATEMENT MATCH ()<-[r]-(r) RETURN r; +---- error +Binder exception: r has data type NODE. (REL) was expected. +-STATEMENT MATCH ()-[r]-()-[]-(r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r*1..30]-()-[]-(r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]-(), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]->(), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()<-[r]-(), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]-(), (r)-[]-() RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]-(), ()-[]-(r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH (s)-[r]-(t), (r)-[]-(t) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH (s)-[r]-(t), (s)-[]-(r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH (), ()-[r]-(), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]-(), (), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[r]-(), (r), () RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-(), ()-[r]-(), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[r]-(), ()-[]-(r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[]-(), ()-[r]-(), (r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[r]-(), (r), ()-[]-() RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[r]-(), (), (r)-[]-() RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()-[r*1..30]-(), (r), ()-[]-() RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH ()-[*1..30]-()-[r]-(), (), (r)-[]-() RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[*1..30]-()-[r]-(), (), (r)-[*1..30]-() RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH ()-[*1..30]-()-[r]-(), (), ()-[*1..30]-(r) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. +-STATEMENT MATCH (x), (a)-[r]-(b), (s), (s)-[]->(r)<-[]-(b) RETURN r; +---- error +Binder exception: r has data type REL. (NODE) was expected. + +# Fail when a path has the same variable in the same pattern +-CASE Scenario10 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE REL TABLE R(FROM A TO A); +---- ok +-STATEMENT MATCH r = ()-[]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[]->(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()<-[]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[*1..30]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[*1..30]->(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[]->(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()<-[]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[*1..30]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (), r = ()-[*1..30]->(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-(), r = ()-[]-(), (), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH r = ()-[]-(), ()-[]-(), (), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH ()-[]-()<-[]-(), r = ()-[]-(), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), r = (a)-[q]-(b), (s)-[p]-(t)-[]-(b), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), (a)-[q]-(b), r = (s)-[p]-(t)-[]-(b), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), (a)-[q]-(b), r = (s)-[p]->(t)<-[]-(b), (r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), r = (s)-[p]-(t)-[]-(b), (r), (a)-[q]-(b) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), r = (s)-[p]->(t)<-[]-(b), (r), (a)-[q]-(b) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), r = (s)-[p]-(t)-[]-(b), (a)-[q]-(r) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. +-STATEMENT MATCH (x), r = (s)-[p]->(t)<-[]-(b), (r)-[q]-(b) RETURN r; +---- error +Binder exception: r has data type RECURSIVE_REL. (NODE) was expected. + +# Fail when a path has the same variable in the same pattern +-CASE Scenario11 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT WITH true AS n MATCH (n) RETURN n; +---- error +Binder exception: True has data type BOOL. (NODE) was expected. +-STATEMENT WITH 123 AS n MATCH (n) RETURN n; +---- error +Binder exception: 123 has data type INT64. (NODE) was expected. +-STATEMENT WITH 123.4 AS n MATCH (n) RETURN n; +---- error +Binder exception: 123.400000 has data type DOUBLE. (NODE) was expected. +-STATEMENT WITH 'foo' AS n MATCH (n) RETURN n; +---- error +Binder exception: foo has data type STRING. (NODE) was expected. +-STATEMENT WITH [10] AS n MATCH (n) RETURN n; +---- error +Binder exception: LIST_CREATION(10) has data type VAR_LIST. (NODE) was expected. +-STATEMENT WITH {x: 1} AS n MATCH (n) RETURN n; +---- error +Binder exception: STRUCT_PACK(1) has data type STRUCT. (NODE) was expected. +-STATEMENT WITH {x: [1]} AS n MATCH (n) RETURN n; +---- error +Binder exception: STRUCT_PACK(LIST_CREATION(1)) has data type STRUCT. (NODE) was expected. diff --git a/test/test_files/tck/match/match2.test b/test/test_files/tck/match/match2.test new file mode 100644 index 0000000000..fbe0b57dce --- /dev/null +++ b/test/test_files/tck/match/match2.test @@ -0,0 +1,35 @@ +-GROUP TCK +-DATASET CSV tck + +-- + +# Match non-existent relationships returns empty +-CASE Scenario1 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT MATCH ()-[r]->() RETURN r; +---- error +Binder exception: No rel table exists in database. + +# Matching a relationship pattern using a label predicate on both sides +-CASE Scenario2 +-STATEMENT CREATE NODE TABLE A(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE NODE TABLE B(ID SERIAL, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE REL TABLE T1(FROM A TO B); +---- ok +-STATEMENT CREATE REL TABLE T2(FROM B TO A); +---- ok +-STATEMENT CREATE REL TABLE T3(FROM B TO B); +---- ok +-STATEMENT CREATE REL TABLE T4(FROM A TO A); +---- ok +-STATEMENT CREATE (:A)-[:T1]->(:B), + (:B)-[:T2]->(:A), + (:B)-[:T3]->(:B), + (:A)-[:T4]->(:A); +---- ok +-STATEMENT MATCH (:A)-[r]->(:B) RETURN r; +---- 1 +(0:0)-{_LABEL: T1, _ID: 2:0}->(1:0) diff --git a/test/test_files/tinysnb/path/path.test b/test/test_files/tinysnb/path/path.test index 8a7d8476d2..ef7d258f44 100644 --- a/test/test_files/tinysnb/path/path.test +++ b/test/test_files/tinysnb/path/path.test @@ -13,13 +13,13 @@ -LOG Path2 -STATEMENT MATCH p = (a:person)-[e:studyAt]->(b:organisation) WHERE a.ID = 0 RETURN p ---- 1 -{_NODES: [{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000, },{_ID: 1:0, _LABEL: organisation, ID: 1, name: ABFsUni, orgCode: 325, mark: 3.700000, score: -2, history: 10 years 5 months 13 hours 24 us, licenseValidInterval: 3 years 5 days, rating: 1.000000, state: {revenue: 138, location: ['toronto', 'montr,eal'], stock: {price: [96,56], volume: 1000}}}], _RELS: [(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, places: [wwAewsdndweusd,wek], length: 5}->(1:0)]} +{_NODES: [{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000},{_ID: 1:0, _LABEL: organisation, ID: 1, name: ABFsUni, orgCode: 325, mark: 3.700000, score: -2, history: 10 years 5 months 13 hours 24 us, licenseValidInterval: 3 years 5 days, rating: 1.000000, state: {revenue: 138, location: ['toronto', 'montr,eal'], stock: {price: [96,56], volume: 1000}}}], _RELS: [(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, places: [wwAewsdndweusd,wek], length: 5}->(1:0)]} -LOG Path3 -STATEMENT MATCH p = (a)-[e]->(b) WHERE a.ID = 8 RETURN p ---- 2 -{_NODES: [{_ID: 0:5, _LABEL: person, ID: 8, fName: Farooq, gender: 2, isStudent: True, isWorker: False, age: 25, eyeSight: 4.500000, birthdate: 1980-10-26, registerTime: 1972-07-31 13:22:30.678559, lastJobDuration: 00:18:00.024, workedHours: [3,4,5,6,7], usedNames: [Fesdwe], courseScoresPerTerm: [[8]], grades: [80,78,34,83], height: 1.510000, },{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000, }], _RELS: [(0:5)-{_LABEL: meets, _ID: 6:4, location: [2.200000,9.000000], times: 9, data: :\xA3, }->(0:2)]} -{_NODES: [{_ID: 0:5, _LABEL: person, ID: 8, fName: Farooq, gender: 2, isStudent: True, isWorker: False, age: 25, eyeSight: 4.500000, birthdate: 1980-10-26, registerTime: 1972-07-31 13:22:30.678559, lastJobDuration: 00:18:00.024, workedHours: [3,4,5,6,7], usedNames: [Fesdwe], courseScoresPerTerm: [[8]], grades: [80,78,34,83], height: 1.510000, },{_ID: 1:0, _LABEL: organisation, ID: 1, name: ABFsUni, orgCode: 325, mark: 3.700000, score: -2, history: 10 years 5 months 13 hours 24 us, licenseValidInterval: 3 years 5 days, rating: 1.000000, state: {revenue: 138, location: ['toronto', 'montr,eal'], stock: {price: [96,56], volume: 1000}}, }], _RELS: [(0:5)-{_LABEL: studyAt, _ID: 4:2, year: 2020, places: [awndsnjwejwen,isuhuwennjnuhuhuwewe], length: 22, }->(1:0)]} +{_NODES: [{_ID: 0:5, _LABEL: person, ID: 8, fName: Farooq, gender: 2, isStudent: True, isWorker: False, age: 25, eyeSight: 4.500000, birthdate: 1980-10-26, registerTime: 1972-07-31 13:22:30.678559, lastJobDuration: 00:18:00.024, workedHours: [3,4,5,6,7], usedNames: [Fesdwe], courseScoresPerTerm: [[8]], grades: [80,78,34,83], height: 1.510000},{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000}], _RELS: [(0:5)-{_LABEL: meets, _ID: 6:4, location: [2.200000,9.000000], times: 9, data: :\xA3}->(0:2)]} +{_NODES: [{_ID: 0:5, _LABEL: person, ID: 8, fName: Farooq, gender: 2, isStudent: True, isWorker: False, age: 25, eyeSight: 4.500000, birthdate: 1980-10-26, registerTime: 1972-07-31 13:22:30.678559, lastJobDuration: 00:18:00.024, workedHours: [3,4,5,6,7], usedNames: [Fesdwe], courseScoresPerTerm: [[8]], grades: [80,78,34,83], height: 1.510000},{_ID: 1:0, _LABEL: organisation, ID: 1, name: ABFsUni, orgCode: 325, mark: 3.700000, score: -2, history: 10 years 5 months 13 hours 24 us, licenseValidInterval: 3 years 5 days, rating: 1.000000, state: {revenue: 138, location: ['toronto', 'montr,eal'], stock: {price: [96,56], volume: 1000}}}], _RELS: [(0:5)-{_LABEL: studyAt, _ID: 4:2, year: 2020, places: [awndsnjwejwen,isuhuwennjnuhuhuwewe], length: 22}->(1:0)]} -LOG Path4 -STATEMENT MATCH p = (a:person)-[e:knows*1..2]->(b:person) WHERE a.ID = 0 AND b.ID = 2 RETURN nodes(p) @@ -47,8 +47,8 @@ -LOG Path6 -STATEMENT MATCH p = (a:person)-[e*2..2]->(b:organisation) WHERE a.ID = 0 RETURN rels(p) ---- 5 -[(0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf], }->(0:1),(0:1)-{_LABEL: studyAt, _ID: 4:1, year: 2020, places: [anew,jsdnwusklklklwewsd], length: 55, }->(1:0)] -[(0:0)-{_LABEL: knows, _ID: 3:1, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 20 years 30 days 48:00:00, comments: [njnojppo9u0jkmf,fjiojioh9h9h89hph], }->(0:2),(0:2)-{_LABEL: workAt, _ID: 5:0, year: 2015, grading: [3.800000,2.500000], rating: 8.200000, }->(1:1)] -[(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434], }->(0:3),(0:3)-{_LABEL: workAt, _ID: 5:1, year: 2010, grading: [2.100000,4.400000], rating: 7.600000, }->(1:2)] -[(0:0)-{_LABEL: marries, _ID: 7:0, usedAddress: [toronto], address: [4,5], }->(0:1),(0:1)-{_LABEL: studyAt, _ID: 4:1, year: 2020, places: [anew,jsdnwusklklklwewsd], length: 55, }->(1:0)] -[(0:0)-{_LABEL: meets, _ID: 6:0, location: [7.820000,3.540000], times: 5, data: \xAA\xBB\xCC\xDD, }->(0:1),(0:1)-{_LABEL: studyAt, _ID: 4:1, year: 2020, places: [anew,jsdnwusklklklwewsd], length: 55, }->(1:0)] +[(0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf]}->(0:1),(0:1)-{_LABEL: studyAt, _ID: 4:1, year: 2020, places: [anew,jsdnwusklklklwewsd], length: 55}->(1:0)] +[(0:0)-{_LABEL: knows, _ID: 3:1, date: 2021-06-30, meetTime: 1946-08-25 19:07:22, validInterval: 20 years 30 days 48:00:00, comments: [njnojppo9u0jkmf,fjiojioh9h9h89hph]}->(0:2),(0:2)-{_LABEL: workAt, _ID: 5:0, year: 2015, grading: [3.800000,2.500000], rating: 8.200000}->(1:1)] +[(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434]}->(0:3),(0:3)-{_LABEL: workAt, _ID: 5:1, year: 2010, grading: [2.100000,4.400000], rating: 7.600000}->(1:2)] +[(0:0)-{_LABEL: marries, _ID: 7:0, usedAddress: [toronto], address: [4,5]}->(0:1),(0:1)-{_LABEL: studyAt, _ID: 4:1, year: 2020, places: [anew,jsdnwusklklklwewsd], length: 55}->(1:0)] +[(0:0)-{_LABEL: meets, _ID: 6:0, location: [7.820000,3.540000], times: 5, data: \xAA\xBB\xCC\xDD}->(0:1),(0:1)-{_LABEL: studyAt, _ID: 4:1, year: 2020, places: [anew,jsdnwusklklklwewsd], length: 55}->(1:0)] diff --git a/test/test_files/tinysnb/projection/multi_label.test b/test/test_files/tinysnb/projection/multi_label.test index a4179edc46..fd436969df 100644 --- a/test/test_files/tinysnb/projection/multi_label.test +++ b/test/test_files/tinysnb/projection/multi_label.test @@ -30,9 +30,9 @@ -LOG MultiLabelReturnStar -STATEMENT MATCH (a:movies:organisation) RETURN * ---- 6 -{_ID: 1:0, _LABEL: organisation, ID: 1, name: ABFsUni, orgCode: 325, mark: 3.700000, score: -2, history: 10 years 5 months 13 hours 24 us, licenseValidInterval: 3 years 5 days, rating: 1.000000, state: {revenue: 138, location: ['toronto', 'montr,eal'], stock: {price: [96,56], volume: 1000}}, } -{_ID: 1:1, _LABEL: organisation, ID: 4, name: CsWork, orgCode: 934, mark: 4.100000, score: -100, history: 2 years 4 days 10 hours, licenseValidInterval: 26 years 52 days 48:00:00, rating: 0.780000, state: {revenue: 152, location: ["vanco,uver north area"], stock: {price: [15,78,671], volume: 432}}, } -{_ID: 1:2, _LABEL: organisation, ID: 6, name: DEsWork, orgCode: 824, mark: 4.100000, score: 7, history: 2 years 4 hours 22 us 34 minutes, licenseValidInterval: 82:00:00.1, rating: 0.520000, state: {revenue: 558, location: ['very long city name', 'new york'], stock: {price: [22], volume: 99}}, } +{_ID: 1:0, _LABEL: organisation, ID: 1, name: ABFsUni, orgCode: 325, mark: 3.700000, score: -2, history: 10 years 5 months 13 hours 24 us, licenseValidInterval: 3 years 5 days, rating: 1.000000, state: {revenue: 138, location: ['toronto', 'montr,eal'], stock: {price: [96,56], volume: 1000}}} +{_ID: 1:1, _LABEL: organisation, ID: 4, name: CsWork, orgCode: 934, mark: 4.100000, score: -100, history: 2 years 4 days 10 hours, licenseValidInterval: 26 years 52 days 48:00:00, rating: 0.780000, state: {revenue: 152, location: ["vanco,uver north area"], stock: {price: [15,78,671], volume: 432}}} +{_ID: 1:2, _LABEL: organisation, ID: 6, name: DEsWork, orgCode: 824, mark: 4.100000, score: 7, history: 2 years 4 hours 22 us 34 minutes, licenseValidInterval: 82:00:00.1, rating: 0.520000, state: {revenue: 558, location: ['very long city name', 'new york'], stock: {price: [22], volume: 99}}} {_ID: 2:0, _LABEL: movies, name: Sóló cón tu párejâ, length: 126, note: this is a very very good movie, description: {rating: 5.300000, views: 152, release: 2011-08-20 11:25:30, film: 2012-05-11}, content: \xAA\xABinteresting\x0B} {_ID: 2:1, _LABEL: movies, name: The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie, length: 2544, note: the movie is very very good, description: {rating: 7.000000, views: 982, release: 2018-11-13 13:33:11, film: 2014-09-12}, content: \xAB\xCD} {_ID: 2:2, _LABEL: movies, name: Roma, length: 298, note: the movie is very interesting and funny, description: {rating: 1223.000000, views: 10003, release: 2011-02-11 16:44:22, film: 2013-02-22}, content: pure ascii characters} diff --git a/test/test_files/tinysnb/projection/single_label.test b/test/test_files/tinysnb/projection/single_label.test index c5ca24b845..a1f08e61c2 100644 --- a/test/test_files/tinysnb/projection/single_label.test +++ b/test/test_files/tinysnb/projection/single_label.test @@ -385,7 +385,7 @@ Dan|Carol -LOG QueryOneToOneRelTable -STATEMENT MATCH (:person)-[m:marries]->(:person) RETURN m ---- 3 -(0:0)-{_LABEL: marries, _ID: 7:0, usedAddress: [toronto], address: [4,5], }->(0:1) +(0:0)-{_LABEL: marries, _ID: 7:0, usedAddress: [toronto], address: [4,5]}->(0:1) (0:2)-{_LABEL: marries, _ID: 7:1, address: [2,5], note: long long long string}->(0:3) (0:4)-{_LABEL: marries, _ID: 7:2, usedAddress: [], address: [3,9], note: short str}->(0:5) diff --git a/test/test_files/tinysnb/update_node/create.test b/test/test_files/tinysnb/update_node/create.test index ae59a4b779..a0b68db95b 100644 --- a/test/test_files/tinysnb/update_node/create.test +++ b/test/test_files/tinysnb/update_node/create.test @@ -80,7 +80,7 @@ -STATEMENT MATCH (a:person)-[e:studyAt]->(b:organisation) WHERE a.ID > 5 RETURN a.ID, b.orgCode, e, ID(e) ---- 2 8|325|(0:5)-{_LABEL: studyAt, _ID: 4:2, year: 2020, places: [awndsnjwejwen,isuhuwennjnuhuhuwewe], length: 22}->(1:0)|4:2 -9|934|(0:6)-{_LABEL: studyAt, _ID: 4:3, year: 2022, }->(1:1)|4:3 +9|934|(0:6)-{_LABEL: studyAt, _ID: 4:3, year: 2022}->(1:1)|4:3 -CASE InsertRepeatedNToNRelTest -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 7 AND b.ID = 8 CREATE (a)-[:knows {validInterval:interval('3 years')}]->(b) diff --git a/test/test_files/tinysnb/var_length_extend/multi_label.test b/test/test_files/tinysnb/var_length_extend/multi_label.test index 7b6ca66b8c..6ea307f1ee 100644 --- a/test/test_files/tinysnb/var_length_extend/multi_label.test +++ b/test/test_files/tinysnb/var_length_extend/multi_label.test @@ -59,4 +59,4 @@ -LOG MixMultiLabelTest5 -STATEMENT MATCH (a:person)-[e*2..2 (r, _ | WHERE offset(id(r)) > 0)]->(b:organisation) WHERE a.fName = 'Alice' RETURN rels(e) ---- 1 -[(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434], }->(0:3),(0:3)-{_LABEL: workAt, _ID: 5:1, year: 2010, grading: [2.100000,4.400000], rating: 7.600000, }->(1:2)] +[(0:0)-{_LABEL: knows, _ID: 3:2, date: 2021-06-30, meetTime: 2012-12-11 20:07:22, validInterval: 10 days, comments: [ioji232,jifhe8w99u43434]}->(0:3),(0:3)-{_LABEL: workAt, _ID: 5:1, year: 2010, grading: [2.100000,4.400000], rating: 7.600000}->(1:2)]