diff --git a/ci/test.sh b/ci/test.sh index 5a20de51b4f59c6c82ab97fc8bdabc5a0334e1b8..cb692f30d73cd09c7f3694ddbe1f6e24a1779c4a 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -102,7 +102,8 @@ function run_test() { $PROJ_DIR/tests/query/stateless/test_range.py \ $PROJ_DIR/tests/query/stateless/test_go.py \ $PROJ_DIR/tests/query/stateless/test_simple_query.py \ - $PROJ_DIR/tests/query/stateless/test_keyword.py + $PROJ_DIR/tests/query/stateless/test_keyword.py \ + $PROJ_DIR/tests/query/stateless/test_lookup.py } case "$1" in diff --git a/src/validator/IndexScanValidator.cpp b/src/validator/IndexScanValidator.cpp index 4f6848f798b792239e0d7a64fc219d19deb22124..def908ccc1a3a8f00c06353060ac56996f8a4b36 100644 --- a/src/validator/IndexScanValidator.cpp +++ b/src/validator/IndexScanValidator.cpp @@ -42,6 +42,7 @@ Status IndexScanValidator::prepareFrom() { Status IndexScanValidator::prepareYield() { auto *sentence = static_cast<const LookupSentence *>(sentence_); + returnCols_ = std::make_unique<std::vector<std::string>>(); if (sentence->yieldClause() == nullptr) { return Status::OK(); } @@ -55,7 +56,6 @@ Status IndexScanValidator::prepareYield() { ? Status::EdgeNotFound("Edge schema not found : %s", from->c_str()) : Status::TagNotFound("Tag schema not found : %s", from->c_str()); } - returnCols_ = std::make_unique<std::vector<std::string>>(); for (auto col : columns) { std::string schemaName, colName; if (col->expr()->kind() == Expression::Kind::kLabelAttribute) { diff --git a/tests/query/stateless/test_lookup.py b/tests/query/stateless/test_lookup.py index f1a112a18b1f6b6e27f90a69eab08ee031e3e3e5..9bd529d8bf7482e02b2312baea7541c12b81fcb5 100644 --- a/tests/query/stateless/test_lookup.py +++ b/tests/query/stateless/test_lookup.py @@ -18,12 +18,14 @@ class TestIndex(NebulaTestSuite): self.check_resp_succeeded(resp) def test_edge_index(self): + time.sleep(self.delay) resp = self.execute('USE nbaLookup') self.check_resp_succeeded(resp) resp = self.execute("CREATE EDGE like(likeness int)") self.check_resp_succeeded(resp) resp = self.execute("CREATE EDGE serve(start_year int, end_year int)") self.check_resp_succeeded(resp) + time.sleep(self.delay) resp = self.execute("CREATE EDGE INDEX serve_index_1 on serve(start_year)") self.check_resp_succeeded(resp) resp = self.execute("CREATE EDGE INDEX serve_index_2 on serve(end_year)") @@ -33,97 +35,125 @@ class TestIndex(NebulaTestSuite): resp = self.execute("CREATE EDGE INDEX like_index_1 on like(likeness)") self.check_resp_succeeded(resp) time.sleep(self.delay) - resp = self.execute('INSERT EDGE like(likeness) VALUES 100 -> 101:(95)') + resp = self.execute('INSERT EDGE like(likeness) VALUES "100" -> "101":(95)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE like(likeness) VALUES 101 -> 102:(95)') + resp = self.execute('INSERT EDGE like(likeness) VALUES "101" -> "102":(95)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE like(likeness) VALUES 102 -> 104:(85)') + resp = self.execute('INSERT EDGE like(likeness) VALUES "102" -> "104":(85)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE like(likeness) VALUES 102 -> 103:(85)') + resp = self.execute('INSERT EDGE like(likeness) VALUES "102" -> "103":(85)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE like(likeness) VALUES 105 -> 106:(90)') + resp = self.execute('INSERT EDGE like(likeness) VALUES "105" -> "106":(90)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE like(likeness) VALUES 106 -> 100:(75)') + resp = self.execute('INSERT EDGE like(likeness) VALUES "106" -> "100":(75)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES 100 -> 200:(1997, 2016)') + resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES "100" -> "200":(1997, 2016)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES 101 -> 201:(1999, 2018)') + resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES "101" -> "201":(1999, 2018)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES 102 -> 202:(1997, 2016)') + resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES "102" -> "202":(1997, 2016)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES 103 -> 203:(1999, 2018)') + resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES "103" -> "203":(1999, 2018)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES 105 -> 204:(1997, 2016)') + resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES "105" -> "204":(1997, 2016)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES 121 -> 201:(1999, 2018)') + resp = self.execute('INSERT EDGE serve(start_year, end_year) VALUES "121" -> "201":(1999, 2018)') self.check_resp_succeeded(resp) + resp = self.execute_query('LOOKUP ON serve where serve.start_year > 0') self.check_resp_succeeded(resp) + assert len(resp.data.rows) == 6 + + resp = self.execute_query('LOOKUP ON serve where serve.start_year > 1997 and serve.end_year < 2020') + self.check_resp_succeeded(resp) + assert len(resp.data.rows) == 3 + resp = self.execute_query('LOOKUP ON serve where serve.start_year > 2000 and serve.end_year < 2020') self.check_resp_succeeded(resp) + self.check_empty_result(resp) + resp = self.execute_query('LOOKUP ON like where like.likeness > 89') self.check_resp_succeeded(resp) + assert len(resp.data.rows) == 3 + resp = self.execute_query('LOOKUP ON like where like.likeness < 39') self.check_resp_succeeded(resp) + self.check_empty_result(resp) def test_tag_index(self): + time.sleep(self.delay) resp = self.execute('USE nbaLookup') self.check_resp_succeeded(resp) - resp = self.execute("CREATE TAG player (name string, age int)") + resp = self.execute("CREATE TAG player (name FIXED_STRING(30), age INT)") self.check_resp_succeeded(resp) - resp = self.execute("CREATE TAG team (name string)") + resp = self.execute("CREATE TAG team (name FIXED_STRING(30))") self.check_resp_succeeded(resp) - resp = self.execute("CREATE TAG INDEX player_index_1 on player(name);") + time.sleep(self.delay) + resp = self.execute("CREATE TAG INDEX player_index_1 on player(name)") self.check_resp_succeeded(resp) - resp = self.execute("CREATE TAG INDEX player_index_2 on player(age);") + resp = self.execute("CREATE TAG INDEX player_index_2 on player(age)") self.check_resp_succeeded(resp) - resp = self.execute("CREATE TAG INDEX player_index_3 on player(name,age);") + resp = self.execute("CREATE TAG INDEX player_index_3 on player(name,age)") self.check_resp_succeeded(resp) resp = self.execute("CREATE TAG INDEX team_index_1 on team(name)") self.check_resp_succeeded(resp) time.sleep(self.delay) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 100:("Tim Duncan", 42)') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "100":("Tim Duncan", 42)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 101:("Tony Parker", 36);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "101":("Tony Parker", 36)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 102:("LaMarcus Aldridge", 33);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "102":("LaMarcus Aldridge", 33)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 103:("xxx", 35);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "103":("xxx", 35)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 104:("yyy", 28);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "104":("yyy", 28)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 105:("zzz", 21);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "105":("zzz", 21)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 106:("kkk", 21);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "106":("kkk", 21)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 121:("Useless", 60);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "121":("Useless", 60)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX player(name, age) VALUES 121:("Useless", 20);') + resp = self.execute('INSERT VERTEX player(name, age) VALUES "121":("Useless", 20)') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX team(name) VALUES 200:("Warriors");') + resp = self.execute('INSERT VERTEX team(name) VALUES "200":("Warriors")') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX team(name) VALUES 201:("Nuggets")') + resp = self.execute('INSERT VERTEX team(name) VALUES "201":("Nuggets")') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX team(name) VALUES 202:("oopp")') + resp = self.execute('INSERT VERTEX team(name) VALUES "202":("oopp")') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX team(name) VALUES 203:("iiiooo")') + resp = self.execute('INSERT VERTEX team(name) VALUES "203":("iiiooo")') self.check_resp_succeeded(resp) - resp = self.execute('INSERT VERTEX team(name) VALUES 204:("opl")') + resp = self.execute('INSERT VERTEX team(name) VALUES "204":("opl")') self.check_resp_succeeded(resp) + resp = self.execute_query('LOOKUP ON player where player.age == 35') self.check_resp_succeeded(resp) + assert len(resp.data.rows) == 1 + resp = self.execute_query('LOOKUP ON player where player.age > 0') self.check_resp_succeeded(resp) + assert len(resp.data.rows) == 8 + resp = self.execute_query('LOOKUP ON player where player.age < 100') self.check_resp_succeeded(resp) - resp = self.execute_query('LOOKUP ON player where player.name == Useless') + assert len(resp.data.rows) == 8 + + resp = self.execute_query('LOOKUP ON player where player.name == "Useless"') self.check_resp_succeeded(resp) - resp = self.execute_query('LOOKUP ON player where player.name == Useless and player.age < 30') + assert len(resp.data.rows) == 1 + + resp = self.execute_query('LOOKUP ON player where player.name == "Useless" and player.age < 30') self.check_resp_succeeded(resp) - resp = self.execute_query('LOOKUP ON team where team.name == Warriors') + assert len(resp.data.rows) == 1 + + resp = self.execute_query('LOOKUP ON team where team.name == "Warriors"') self.check_resp_succeeded(resp) - resp = self.execute_query('LOOKUP ON team where team.name == oopp') + assert len(resp.data.rows) == 1 + + resp = self.execute_query('LOOKUP ON team where team.name == "oopp"') self.check_resp_succeeded(resp) + assert len(resp.data.rows) == 1 @classmethod def cleanup(self):