diff --git a/tests/query/v1/test_go.py b/tests/query/v1/test_go.py deleted file mode 100644 index 7d6d65a27b4bcfa78a560e1b8c15b3223f4f83f8..0000000000000000000000000000000000000000 --- a/tests/query/v1/test_go.py +++ /dev/null @@ -1,2113 +0,0 @@ -# --coding:utf-8-- -# -# Copyright (c) 2020 vesoft inc. All rights reserved. -# -# This source code is licensed under Apache 2.0 License, -# attached with Common Clause Condition 1.0, found in the LICENSES directory. - -import pytest - -from tests.common.nebula_test_suite import NebulaTestSuite -from tests.common.nebula_test_suite import T_EMPTY - - -class TestGoQuery(NebulaTestSuite): - @classmethod - def prepare(self): - self.use_nba() - - def test_one_step(self): - stmt = 'GO FROM "Tim Duncan" OVER serve' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Tim Duncan", "Tim Duncan" OVER serve' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'YIELD "Tim Duncan" as vid | GO FROM $-.vid OVER serve' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - - stmt = '''GO FROM "Boris Diaw" OVER serve YIELD \ - $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Boris Diaw", 2003, 2005, "Hawks"], - ["Boris Diaw", 2005, 2008, "Suns"], - ["Boris Diaw", 2008, 2012, "Hornets"], - ["Boris Diaw", 2012, 2016, "Spurs"], - ["Boris Diaw", 2016, 2017, "Jazz"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Rajon Rondo" OVER serve WHERE \ - serve.start_year >= 2013 AND serve.end_year <= 2018 YIELD \ - $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Rajon Rondo", 2014, 2015, "Mavericks"], - ["Rajon Rondo", 2015, 2016, "Kings"], - ["Rajon Rondo", 2016, 2017, "Bulls"], - ["Rajon Rondo", 2017, 2018, "Pelicans"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Boris Diaw" OVER like YIELD like._dst as id \ - | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Hornets"], - ["Trail Blazers"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Thunders' OVER serve REVERSELY" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Russell Westbrook"], - ["Kevin Durant"], - ["James Harden"], - ["Carmelo Anthony"], - ["Paul George"], - ["Ray Allen"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Boris Diaw" OVER like YIELD like._dst as id \ - | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Hornets"], - ["Trail Blazers"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "NON EXIST VERTEX ID" OVER like YIELD like._dst as id \ - | (GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = '''GO FROM "Boris Diaw" OVER like, serve YIELD like._dst as id \ - | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Hornets"], - ["Trail Blazers"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_assignment_simple(self): - stmt = '''$var = GO FROM "Tracy McGrady" OVER like YIELD like._dst as id; \ - GO FROM $var.id OVER like''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tracy McGrady"], - ["LaMarcus Aldridge"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_assignment_pipe(self): - stmt = '''$var = (GO FROM "Tracy McGrady" OVER like YIELD like._dst as id \ - | GO FROM $-.id OVER like YIELD like._dst as id); \ - GO FROM $var.id OVER like''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Kobe Bryant"], - ["Grant Hill"], - ["Rudy Gay"], - ["Tony Parker"], - ["Tim Duncan"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_pipe_only_yield_input_prop(self): - stmt = '''GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid \ - | GO FROM $-.vid OVER like YIELD $-.vid as id''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["id"], - "rows": [ - ["Kobe Bryant"], - ["Grant Hill"], - ["Rudy Gay"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_pipe_only_yield_constant(self): - stmt = '''GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid \ - | GO FROM $-.vid OVER like YIELD 3''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["3"], - "rows": [ - [3], - [3], - [3] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_assignment_empty_result(self): - stmt = '''$var = GO FROM "-1" OVER like YIELD like._dst as id; \ - GO FROM $var.id OVER like''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - - def test_variable_undefined(self): - stmt = "GO FROM $var OVER like" - resp = self.execute(stmt) - self.check_resp_failed(resp) - - def test_distinct(self): - stmt = '''GO FROM "Nobody" OVER serve \ - YIELD DISTINCT $^.player.name as name, $$.team.name as name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - - stmt = '''GO FROM "Boris Diaw" OVER like YIELD like._dst as id \ - | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve \ - YIELD DISTINCT serve._dst, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "$$.team.name"], - "rows": [ - ["Spurs", "Spurs"], - ["Hornets", "Hornets"], - ["Trail Blazers", "Trail Blazers"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO 2 STEPS FROM "Tony Parker" OVER like YIELD DISTINCT like._dst' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tim Duncan"], - ["Tony Parker"], - ["Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_vertex_noexist(self): - stmt = 'GO FROM "NON EXIST VERTEX ID" OVER serve' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = '''GO FROM "NON EXIST VERTEX ID" OVER serve YIELD \ - $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = '''GO FROM "NON EXIST VERTEX ID" OVER serve YIELD DISTINCT \ - $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - def test_empty_inputs(self): - stmt = '''GO FROM "NON EXIST VERTEX ID" OVER like YIELD like._dst as id \ - | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = '''GO FROM "NON EXIST VERTEX ID" OVER serve YIELD serve._dst as id, serve.start_year as start \ - | YIELD $-.id as id WHERE $-.start > 20000 | Go FROM $-.id over serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - def test_multi_edges_over_all(self): - stmt = 'GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._dst, like._dst' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "James Harden"], - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "Paul George"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._src, like._src' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "Russell Westbrook"], - [T_EMPTY, "Russell Westbrook"], - [T_EMPTY, "Russell Westbrook"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Russell Westbrook" OVER * REVERSELY' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["James Harden", T_EMPTY, T_EMPTY], - ["Dejounte Murray", T_EMPTY, T_EMPTY], - ["Paul George", T_EMPTY, T_EMPTY] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Dirk Nowitzki" OVER * YIELD serve._dst, like._dst' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Mavericks", T_EMPTY], - [T_EMPTY, "Steve Nash"], - [T_EMPTY, "Jason Kidd"], - [T_EMPTY, "Dwyane Wade"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Paul Gasol" OVER *' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "Grizzlies", T_EMPTY], - [T_EMPTY, "Lakers", T_EMPTY], - [T_EMPTY, "Bulls", T_EMPTY], - [T_EMPTY, "Spurs", T_EMPTY], - [T_EMPTY, "Bucks", T_EMPTY], - ["Kobe Bryant", T_EMPTY, T_EMPTY], - ["Marc Gasol", T_EMPTY, T_EMPTY] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Manu Ginobili" OVER * REVERSELY YIELD like.likeness, \ - teammate.start_year, serve.start_year, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [95, T_EMPTY, T_EMPTY, "Tim Duncan"], - [95, T_EMPTY, T_EMPTY, "Tony Parker"], - [90, T_EMPTY, T_EMPTY, "Tiago Splitter"], - [99, T_EMPTY, T_EMPTY, "Dejounte Murray"], - [T_EMPTY, 2002, T_EMPTY, "Tim Duncan"], - [T_EMPTY, 2002, T_EMPTY, "Tony Parker"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "LaMarcus Aldridge" OVER * YIELD $$.team.name, $$.player.name' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Trail Blazers", T_EMPTY], - [T_EMPTY, "Tim Duncan"], - [T_EMPTY, "Tony Parker"], - ["Spurs", T_EMPTY] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Boris Diaw" OVER * YIELD like._dst as id \ - | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Spurs"], - ["Hornets"], - ["Trail Blazers"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - @pytest.mark.skip(reason = 'return diffrent type when edge type wanted.') - def test_edge_type(self): - stmt = '''GO FROM "Russell Westbrook" OVER serve, like \ - YIELD serve.start_year, like.likeness, serve._type, like._type''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [2008, T_EMPTY, 6, T_EMPTY], - [T_EMPTY, 90, T_EMPTY, 5], - [T_EMPTY, 90, T_EMPTY, 5] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Russell Westbrook" OVER serve, like REVERSELY \ - YIELD serve._dst, like._dst, serve._type, like._type''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "James Harden", T_EMPTY, -5], - [T_EMPTY, "Dejounte Murray", T_EMPTY, -5], - [T_EMPTY, "Paul George", T_EMPTY, -5], - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_multi_edges(self): - stmt = '''GO FROM "Russell Westbrook" OVER serve, like \ - YIELD serve.start_year, like.likeness''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [2008, T_EMPTY], - [T_EMPTY, 90], - [T_EMPTY, 90] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Shaquile O\'Neal" OVER serve, like' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Magic", T_EMPTY], - ["Lakers",T_EMPTY], - ["Heat", T_EMPTY], - ["Suns", T_EMPTY], - ["Cavaliers", T_EMPTY], - ["Celtics", T_EMPTY], - [T_EMPTY, "JaVale McGee"], - [T_EMPTY, "Tim Duncan"], - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Russell Westbrook' OVER serve, like" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Thunders", T_EMPTY], - [T_EMPTY, "Paul George"], - [T_EMPTY, "James Harden"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Russell Westbrook" OVER serve, like REVERSELY \ - YIELD serve._dst, like._dst, serve.start_year, like.likeness''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "James Harden", T_EMPTY, 80], - [T_EMPTY, "Dejounte Murray", T_EMPTY, 99], - [T_EMPTY, "Paul George", T_EMPTY, 95], - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Russell Westbrook" OVER serve, like REVERSELY YIELD serve._src, like._src' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "Russell Westbrook"], - [T_EMPTY, "Russell Westbrook"], - [T_EMPTY, "Russell Westbrook"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = 'GO FROM "Russell Westbrook" OVER serve, like REVERSELY' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, "James Harden"], - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "Paul George"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Manu Ginobili" OVER like, teammate REVERSELY YIELD like.likeness, \ - teammate.start_year, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [95, T_EMPTY, "Tim Duncan"], - [95, T_EMPTY, "Tony Parker"], - [90, T_EMPTY, "Tiago Splitter"], - [99, T_EMPTY, "Dejounte Murray"], - [T_EMPTY, 2002, "Tim Duncan"], - [T_EMPTY, 2002, "Tony Parker"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_multi_edges_with_filter(self): - stmt = '''GO FROM "Russell Westbrook" OVER serve, like WHERE serve.start_year > 2000 \ - YIELD serve.start_year, like.likeness''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [2008, T_EMPTY] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Manu Ginobili" OVER like, teammate REVERSELY WHERE like.likeness > 90 YIELD like.likeness, \ - teammate.start_year, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [95, T_EMPTY, "Tim Duncan"], - [95, T_EMPTY, "Tony Parker"], - [99, T_EMPTY, "Dejounte Murray"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - - stmt = '''GO FROM "Manu Ginobili" OVER * \ - WHERE $$.player.age > 30 or $$.team.name not starts with "Rockets" \ - YIELD DISTINCT $$.player.age, $$.player.name, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY, T_EMPTY, "Spurs"], - [42, "Tim Duncan", T_EMPTY], - [36, "Tony Parker",T_EMPTY] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM "Manu Ginobili" OVER like, teammate REVERSELY \ - WHERE $$.player.age > 30 and $$.player.age < 40 \ - YIELD DISTINCT $$.player.age, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [34, "Tiago Splitter"], - [36, "Tony Parker"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - - def test_reference_pipe_in_yieldandwhere(self): - stmt = '''GO FROM 'Tim Duncan', 'Chris Paul' OVER like \ - YIELD $^.player.name AS name, like._dst AS id \ - | GO FROM $-.id OVER like \ - YIELD $-.name, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$-.name", "$^.player.name", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Manu Ginobili", "Tim Duncan"], - ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"], - ["Tim Duncan", "Tony Parker", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker", "Tim Duncan"], - ["Chris Paul", "LeBron James", "Ray Allen"], - ["Chris Paul", "Carmelo Anthony", "Chris Paul"], - ["Chris Paul", "Carmelo Anthony", "LeBron James"], - ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"], - ["Chris Paul", "Dwyane Wade", "Chris Paul"], - ["Chris Paul", "Dwyane Wade", "LeBron James"], - ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Tim Duncan', 'Chris Paul' OVER like \ - YIELD $^.player.name AS name, like._dst AS id \ - | GO FROM $-.id OVER like \ - WHERE $-.name != $$.player.name \ - YIELD $-.name, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$-.name", "$^.player.name", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"], - ["Tim Duncan", "Tony Parker", "Manu Ginobili"], - ["Chris Paul", "LeBron James", "Ray Allen"], - ["Chris Paul", "Carmelo Anthony", "LeBron James"], - ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"], - ["Chris Paul", "Dwyane Wade", "LeBron James"], - ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - @pytest.mark.skip(reason = '$-.* over * $var.* not implement') - def test_all_prop(self): - stmt = '''GO FROM 'Tim Duncan', 'Chris Paul' OVER like \ - YIELD $^.player.name AS name, like._dst AS id \ - | GO FROM $-.id OVER like \ - YIELD $-.*, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$-.name", "$^.player.name", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"], - ["Tim Duncan", "Tony Parker", "Tony Parker", "LaMarcus Aldridge"], - ["Tim Duncan", "Tony Parker", "Tony Parker", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker", "Tony Parker", "Tim Duncan"], - ["Chris Paul", "LeBron James", "LeBron James", "Ray Allen"], - ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Chris Paul"], - ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "LeBron James"], - ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Dwyane Wade"], - ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Chris Paul"], - ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "LeBron James"], - ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Carmelo Anthony"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like \ - YIELD $^.player.name AS name, like._dst AS id; \ - GO FROM $var.id OVER like \ - YIELD $var.*, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"], - ["Tim Duncan", "Tony Parker", "Tony Parker", "LaMarcus Aldridge"], - ["Tim Duncan", "Tony Parker", "Tony Parker", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker", "Tony Parker", "Tim Duncan"], - ["Chris Paul", "LeBron James", "LeBron James", "Ray Allen"], - ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Chris Paul"], - ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "LeBron James"], - ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Dwyane Wade"], - ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Chris Paul"], - ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "LeBron James"], - ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Carmelo Anthony"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - - def test_reference_variable_in_yieldandwhere(self): - stmt = '''$var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like \ - YIELD $^.player.name AS name, like._dst AS id; \ - GO FROM $var.id OVER like \ - YIELD $var.name, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$var.name", "$^.player.name", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Manu Ginobili", "Tim Duncan"], - ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"], - ["Tim Duncan", "Tony Parker", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker", "Tim Duncan"], - ["Chris Paul", "LeBron James", "Ray Allen"], - ["Chris Paul", "Carmelo Anthony", "Chris Paul"], - ["Chris Paul", "Carmelo Anthony", "LeBron James"], - ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"], - ["Chris Paul", "Dwyane Wade", "Chris Paul"], - ["Chris Paul", "Dwyane Wade", "LeBron James"], - ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like \ - YIELD $^.player.name AS name, like._dst AS id; \ - GO FROM $var.id OVER like \ - WHERE $var.name != $$.player.name \ - YIELD $var.name, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$var.name", "$^.player.name", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"], - ["Tim Duncan", "Tony Parker", "Manu Ginobili"], - ["Chris Paul", "LeBron James", "Ray Allen"], - ["Chris Paul", "Carmelo Anthony", "LeBron James"], - ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"], - ["Chris Paul", "Dwyane Wade", "LeBron James"], - ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_no_existent_prop(self): - stmt = "GO FROM 'Tim Duncan' OVER serve YIELD $^.player.test" - resp = self.execute(stmt) - self.check_resp_failed(resp) - - stmt = "GO FROM 'Tim Duncan' OVER serve yield $^.player.test" - resp = self.execute(stmt) - self.check_resp_failed(resp) - - stmt = "GO FROM 'Tim Duncan' OVER serve YIELD serve.test" - resp = self.execute(stmt) - self.check_resp_failed(resp) - - @pytest.mark.skip(reason="not support udf_is_in now!") - def test_is_incall(self): - stmt = '''GO FROM 'Boris Diaw' OVER serve \ - WHERE udf_is_in($$.team.name, 'Hawks', 'Suns') \ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Boris Diaw", 2003, 2005, "Hawks"], - ["Boris Diaw", 2005, 2008, "Suns"], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id \ - | GO FROM $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123)''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Hornets"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id \ - | GO FROM $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) AND 1 == 1''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Hornets"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - @pytest.mark.skip(reason = 'return not implement') - def test_return_test(self): - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \ - $rA = YIELD $A.* WHERE $A.dst == 123; \ - RETURN $rA IF $rA IS NOT NULL; \ - GO FROM $A.dst OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Hornets"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \ - $rA = YIELD $A.* WHERE 1 == 1; \ - RETURN $rA IF $rA IS NOT NULL; \ - GO FROM $A.dst OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$A.dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dstA; \ - $rA = YIELD $A.* WHERE $A.dstA == 123; \ - RETURN $rA IF $rA IS NOT NULL; \ - $B = GO FROM $A.dstA OVER like YIELD like._dst AS dstB; \ - $rB = YIELD $B.* WHERE $B.dstB == 456; \ - RETURN $rB IF $rB IS NOT NULL; \ - GO FROM $B.dstB OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Trail Blazers"], - ["Spurs"], - ["Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \ - $rA = YIELD $A.* WHERE $A.dst == 123; \ - RETURN $rA IF $rA IS NOT NULL''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \ - $rA = YIELD $A.* WHERE 1 == 1; \ - RETURN $rA IF $rA IS NOT NULL''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$A.dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \ - $rA = YIELD $A.* WHERE 1 == 1; \ - RETURN $B IF $B IS NOT NULL''' - resp = self.execute(stmt) - self.check_resp_failed(resp) - - stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \ - $rA = YIELD $A.* WHERE 1 == 1; \ - RETURN $B IF $A IS NOT NULL''' - resp = self.execute(stmt) - self.check_resp_failed(resp) - - # will return error - stmt = '''RETURN $rA IF $rA IS NOT NULL;''' - resp = self.execute(stmt) - self.check_resp_failed(resp) - - def test_reversely_one_step(self): - stmt = "GO FROM 'Tim Duncan' OVER like REVERSELY YIELD like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Danny Green"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Dejounte Murray"], - ["Shaquile O'Neal"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER like REVERSELY YIELD $$.player.name" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$$.player.name"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Danny Green"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Dejounte Murray"], - ["Shaquile O'Neal"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Tim Duncan' OVER like REVERSELY \ - WHERE $$.player.age < 35 \ - YIELD $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$$.player.name"], - "rows": [ - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Danny Green"], - ["Aron Baynes"], - ["Tiago Splitter"], - ["Dejounte Murray"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER * REVERSELY YIELD like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Danny Green"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Dejounte Murray"], - ["Shaquile O'Neal"], - [T_EMPTY], - [T_EMPTY] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_only_id_n_steps(self): - stmt = "GO 2 STEPS FROM 'Tony Parker' OVER like YIELD like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tim Duncan"], - ["Tim Duncan"], - ["Tony Parker"], - ["Tony Parker"], - ["Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 3 STEPS FROM 'Tony Parker' OVER like YIELD like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["Manu Ginobili"], - ["Tim Duncan"], - ["Tim Duncan"], - ["LaMarcus Aldridge"], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 1 STEPS FROM 'Tony Parker' OVER like YIELD like._dst AS id"\ - " | GO 2 STEPS FROM $-.id OVER like YIELD like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["LaMarcus Aldridge"], - ["LaMarcus Aldridge"], - ["Manu Ginobili"], - ["Manu Ginobili"], - ["Tim Duncan"], - ["Tim Duncan"], - ["Tim Duncan"], - ["Manu Ginobili"], - ["Manu Ginobili"], - ["Tony Parker"], - ["Tony Parker"], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_reversely_two_steps(self): - stmt = "GO 2 STEPS FROM 'Kobe Bryant' OVER like REVERSELY YIELD $$.player.name" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$$.player.name"], - "rows": [ - ["Marc Gasol"], - ["Vince Carter"], - ["Yao Ming"], - ["Grant Hill"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 2 STEPS FROM 'Kobe Bryant' OVER * REVERSELY YIELD $$.player.name" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$$.player.name"], - "rows": [ - ["Marc Gasol"], - ["Vince Carter"], - ["Yao Ming"], - ["Grant Hill"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Manu Ginobili' OVER * REVERSELY YIELD like._dst AS id \ - | GO FROM $-.id OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Hornets"], - ["Spurs"], - ["Hawks"], - ["76ers"], - ["Spurs"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_reversely_with_pipe(self): - stmt = '''GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id \ - | GO FROM $-.id OVER serve REVERSELY YIELD $^.team.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.team.name", "$$.player.name"], - "rows": [ - ["Cavaliers", "Danny Green"], - ["Cavaliers", "Danny Green"], - ["Cavaliers", "Dwyane Wade"], - ["Cavaliers", "Dwyane Wade"], - ["Cavaliers", "Kyrie Irving"], - ["Cavaliers", "Kyrie Irving"], - ["Cavaliers", "LeBron James"], - ["Cavaliers", "LeBron James"], - ["Cavaliers", "Shaquile O'Neal"], - ["Cavaliers", "Shaquile O'Neal"], - ["Cavaliers", "LeBron James"], - ["Cavaliers", "LeBron James"], - - ["Heat", "Amar'e Stoudemire"], - ["Heat", "Dwyane Wade"], - ["Heat", "LeBron James"], - ["Heat", "Ray Allen"], - ["Heat", "Shaquile O'Neal"], - ["Heat", "Dwyane Wade"], - ["Lakers", "Dwight Howard"], - ["Lakers", "JaVale McGee"], - ["Lakers", "Kobe Bryant"], - ["Lakers", "LeBron James"], - ["Lakers", "Paul Gasol"], - ["Lakers", "Rajon Rondo"], - ["Lakers", "Shaquile O'Neal"], - ["Lakers", "Steve Nash"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id \ - | GO FROM $-.id OVER serve REVERSELY WHERE $$.player.name != 'LeBron James' \ - YIELD $^.team.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.team.name", "$$.player.name"], - "rows": [ - ["Cavaliers", "Danny Green"], - ["Cavaliers", "Danny Green"], - ["Cavaliers", "Dwyane Wade"], - ["Cavaliers", "Dwyane Wade"], - ["Cavaliers", "Kyrie Irving"], - ["Cavaliers", "Kyrie Irving"], - ["Cavaliers", "Shaquile O'Neal"], - ["Cavaliers", "Shaquile O'Neal"], - - ["Heat", "Amar'e Stoudemire"], - - ["Heat", "Dwyane Wade"], - ["Heat", "Ray Allen"], - ["Heat", "Shaquile O'Neal"], - ["Heat", "Dwyane Wade"], - - ["Lakers", "Dwight Howard"], - ["Lakers", "JaVale McGee"], - ["Lakers", "Kobe Bryant"], - ["Lakers", "Paul Gasol"], - ["Lakers", "Rajon Rondo"], - ["Lakers", "Shaquile O'Neal"], - ["Lakers", "Steve Nash"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Manu Ginobili' OVER like REVERSELY YIELD like._dst AS id \ - | GO FROM $-.id OVER serve''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Spurs"], - ["Spurs"], - ["Hornets"], - ["Spurs"], - ["Hawks"], - ["76ers"], - ["Spurs"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_bidirect(self): - stmt = "GO FROM 'Tim Duncan' OVER serve bidirect" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER like bidirect" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Danny Green"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Dejounte Murray"], - ["Shaquile O'Neal"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER serve, like bidirect" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst"], - "rows": [ - ["Spurs", T_EMPTY], - [T_EMPTY, "Tony Parker"], - [T_EMPTY, "Manu Ginobili"], - [T_EMPTY, "Tony Parker"], - [T_EMPTY, "Manu Ginobili"], - [T_EMPTY, "LaMarcus Aldridge"], - [T_EMPTY, "Marco Belinelli"], - [T_EMPTY, "Danny Green"], - [T_EMPTY, "Aron Baynes"], - [T_EMPTY, "Boris Diaw"], - [T_EMPTY, "Tiago Splitter"], - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "Shaquile O'Neal"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER serve bidirect YIELD $$.team.name" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$$.team.name"], - "rows": [ - ["Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER like bidirect YIELD $$.player.name" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$$.player.name"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Danny Green"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Dejounte Murray"], - ["Shaquile O'Neal"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Tim Duncan' OVER like bidirect WHERE like.likeness > 90 \ - YIELD $^.player.name, like._dst, $$.player.name, like.likeness''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "like._dst", "$$.player.name", "like.likeness"], - "rows": [ - ["Tim Duncan", "Tony Parker", "Tony Parker", 95], - ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", 95], - ["Tim Duncan", "Tony Parker", "Tony Parker", 95], - ["Tim Duncan", "Dejounte Murray", "Dejounte Murray", 99] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_bidirect_over_all(self): - stmt = '''GO FROM 'Tim Duncan' OVER * bidirect \ - YIELD $^.player.name, serve._dst, $$.team.name, like._dst, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve._dst", "$$.team.name", "like._dst", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Spurs", "Spurs", T_EMPTY, T_EMPTY], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Tony Parker", "Tony Parker"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Manu Ginobili", "Manu Ginobili"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Tony Parker", "Tony Parker"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Manu Ginobili", "Manu Ginobili"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "LaMarcus Aldridge", "LaMarcus Aldridge"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Marco Belinelli", "Marco Belinelli"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Danny Green", "Danny Green"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Aron Baynes", "Aron Baynes"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Boris Diaw", "Boris Diaw"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Tiago Splitter", "Tiago Splitter"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Dejounte Murray", "Dejounte Murray"], - ["Tim Duncan", T_EMPTY, T_EMPTY, "Shaquile O'Neal", "Shaquile O'Neal"], - ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Tony Parker"], - ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Manu Ginobili"], - ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Danny Green"], - ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "LaMarcus Aldridge"], - ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Tony Parker"], - ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO FROM 'Tim Duncan' OVER * bidirect" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst", "serve._dst", "teammate._dst"], - "rows": [ - [T_EMPTY, "Spurs", T_EMPTY], - ["Tony Parker", T_EMPTY, T_EMPTY], - ["Manu Ginobili", T_EMPTY, T_EMPTY], - ["Tony Parker", T_EMPTY, T_EMPTY], - ["Manu Ginobili", T_EMPTY, T_EMPTY], - ["LaMarcus Aldridge", T_EMPTY, T_EMPTY], - ["Marco Belinelli", T_EMPTY, T_EMPTY], - ["Danny Green", T_EMPTY, T_EMPTY], - ["Aron Baynes", T_EMPTY, T_EMPTY], - ["Boris Diaw", T_EMPTY, T_EMPTY], - ["Tiago Splitter", T_EMPTY, T_EMPTY], - ["Dejounte Murray", T_EMPTY, T_EMPTY], - ["Shaquile O'Neal", T_EMPTY, T_EMPTY], - [T_EMPTY, T_EMPTY, "Tony Parker"], - [T_EMPTY, T_EMPTY, "Manu Ginobili"], - [T_EMPTY, T_EMPTY, "LaMarcus Aldridge"], - [T_EMPTY, T_EMPTY, "Danny Green"], - [T_EMPTY, T_EMPTY, "Tony Parker"], - [T_EMPTY, T_EMPTY, "Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_duplicate_column_name(self): - stmt = "GO FROM 'Tim Duncan' OVER serve YIELD serve._dst, serve._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "serve._dst"], - "rows": [ - ["Spurs", "Spurs"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id, like.likeness AS id - | GO FROM $-.id OVER serve''' - resp = self.execute(stmt) - self.check_resp_failed(resp) - - stmt = '''GO FROM 'Tim Duncan' OVER like, serve - YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id - | GO FROM $-.id OVER *''' - resp = self.execute(stmt) - self.check_resp_failed(resp) - - stmt = '''$a = GO FROM 'Tim Duncan' OVER * - YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id; - | GO FROM $-.id OVER serve''' - resp = self.execute(stmt) - self.check_resp_failed(resp) - - def test_contains(self): - """ the name_label is not a string any more, will be deprecated such a way of writing. - stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE $$.team.name CONTAINS Haw\ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Boris Diaw", 2003, 2005, "Hawks"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - """ - - stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE $$.team.name CONTAINS \"Haw\"\ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Boris Diaw", 2003, 2005, "Hawks"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - - stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE (string)serve.start_year CONTAINS "05" \ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Boris Diaw", 2005, 2008, "Suns"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE $^.player.name CONTAINS "Boris" \ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"], - "rows": [ - ["Boris Diaw", 2003, 2005, "Hawks"], - ["Boris Diaw", 2005, 2008, "Suns"], - ["Boris Diaw", 2008, 2012, "Hornets"], - ["Boris Diaw", 2012, 2016, "Spurs"], - ["Boris Diaw", 2016, 2017, "Jazz"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE !($^.player.name CONTAINS "Boris") \ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE "Leo" CONTAINS "Boris" \ - YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - # todo: add test for NOT_CONTAINS - # def test_not_contains(self): - - def test_with_intermediate_data(self): - # zero to zero - stmt = "GO 0 TO 0 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - # simple - stmt = "GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Tim Duncan"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Tim Duncan"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like \ - YIELD DISTINCT like._dst, like.likeness, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst", "like.likeness", "$$.player.name"], - "rows": [ - ["Manu Ginobili", 95, "Manu Ginobili"], - ["LaMarcus Aldridge", 90, "LaMarcus Aldridge"], - ["Tim Duncan", 95, "Tim Duncan"], - ["Tony Parker", 95, "Tony Parker"], - ["Tony Parker", 75, "Tony Parker"], - ["Tim Duncan", 75, "Tim Duncan"], - ["Tim Duncan", 90, "Tim Duncan"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like \ - YIELD DISTINCT like._dst, like.likeness, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst", "like.likeness", "$$.player.name"], - "rows": [ - ["Manu Ginobili", 95, "Manu Ginobili"], - ["LaMarcus Aldridge", 90, "LaMarcus Aldridge"], - ["Tim Duncan", 95, "Tim Duncan"], - ["Tony Parker", 95, "Tony Parker"], - ["Tony Parker", 75, "Tony Parker"], - ["Tim Duncan", 75, "Tim Duncan"], - ["Tim Duncan", 90, "Tim Duncan"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 1 TO 3 STEPS FROM 'Tim Duncan' OVER serve" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Spurs"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 0 TO 3 STEPS FROM 'Tim Duncan' OVER serve" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - ["Spurs"] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 2 TO 3 STEPS FROM 'Tim Duncan' OVER serve" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - #reversely - stmt = "GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tim Duncan"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Boris Diaw"], - ["Dejounte Murray"], - ["Tony Parker"], - ["Manu Ginobili"], - ["Danny Green"], - ["Aron Baynes"], - ["Tiago Splitter"], - ["Shaquile O'Neal"], - ["Rudy Gay"], - ["Damian Lillard"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tim Duncan"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Boris Diaw"], - ["Dejounte Murray"], - ["Tony Parker"], - ["Manu Ginobili"], - ["Danny Green"], - ["Aron Baynes"], - ["Tiago Splitter"], - ["Shaquile O'Neal"], - ["Rudy Gay"], - ["Damian Lillard"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 2 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Boris Diaw"], - ["Dejounte Murray"], - ["Tony Parker"], - ["Manu Ginobili"], - ["Danny Green"], - ["Aron Baynes"], - ["Tiago Splitter"], - ["Shaquile O'Neal"], - ["Rudy Gay"], - ["Damian Lillard"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # empty starts before last step - stmt = "GO 1 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Tim Duncan"], - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Rudy Gay"], - ["Marco Belinelli"], - ["Danny Green"], - ["Kyle Anderson"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Cory Joseph"], - ["David West"], - ["Jonathon Simmons"], - ["Dejounte Murray"], - ["Tracy McGrady"], - ["Paul Gasol"], - ["Marco Belinelli"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 0 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst"], - "rows": [ - ["Tim Duncan"], - ["Tony Parker"], - ["Manu Ginobili"], - ["LaMarcus Aldridge"], - ["Rudy Gay"], - ["Marco Belinelli"], - ["Danny Green"], - ["Kyle Anderson"], - ["Aron Baynes"], - ["Boris Diaw"], - ["Tiago Splitter"], - ["Cory Joseph"], - ["David West"], - ["Jonathon Simmons"], - ["Dejounte Murray"], - ["Tracy McGrady"], - ["Paul Gasol"], - ["Marco Belinelli"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # bidirectionally - stmt = "GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tim Duncan"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Boris Diaw"], - ["Dejounte Murray"], - ["Tony Parker"], - ["Manu Ginobili"], - ["Danny Green"], - ["Aron Baynes"], - ["Tiago Splitter"], - ["Shaquile O'Neal"], - ["Rudy Gay"], - ["Damian Lillard"], - ["LeBron James"], - ["Russell Westbrook"], - ["Chris Paul"], - ["Kyle Anderson"], - ["Kevin Durant"], - ["James Harden"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - - stmt = "GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["like._dst"], - "rows": [ - ["Tim Duncan"], - ["LaMarcus Aldridge"], - ["Marco Belinelli"], - ["Boris Diaw"], - ["Dejounte Murray"], - ["Tony Parker"], - ["Manu Ginobili"], - ["Danny Green"], - ["Aron Baynes"], - ["Tiago Splitter"], - ["Shaquile O'Neal"], - ["Rudy Gay"], - ["Damian Lillard"], - ["LeBron James"], - ["Russell Westbrook"], - ["Chris Paul"], - ["Kyle Anderson"], - ["Kevin Durant"], - ["James Harden"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # over * - stmt = "GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst"], - "rows": [ - ["Thunders", T_EMPTY], - [T_EMPTY, "Paul George"], - [T_EMPTY, "James Harden"], - ["Pacers", T_EMPTY], - ["Thunders", T_EMPTY], - [T_EMPTY, "Russell Westbrook"], - ["Thunders", T_EMPTY], - ["Rockets", T_EMPTY], - [T_EMPTY, "Russell Westbrook"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = "GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst"], - "rows": [ - ["Thunders", T_EMPTY], - [T_EMPTY, "Paul George"], - [T_EMPTY, "James Harden"], - ["Pacers", T_EMPTY], - ["Thunders", T_EMPTY], - [T_EMPTY, "Russell Westbrook"], - ["Thunders", T_EMPTY], - ["Rockets", T_EMPTY], - [T_EMPTY, "Russell Westbrook"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # with properties - stmt = '''GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * \ - YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst", "serve.start_year", "like.likeness", "$$.player.name"], - "rows": [ - ["Thunders", T_EMPTY, 2008, T_EMPTY, T_EMPTY], - [T_EMPTY, "Paul George", T_EMPTY, 90, "Paul George"], - [T_EMPTY, "James Harden", T_EMPTY, 90, "James Harden"], - ["Pacers", T_EMPTY, 2010, T_EMPTY, T_EMPTY], - ["Thunders", T_EMPTY, 2017, T_EMPTY, T_EMPTY], - [T_EMPTY, "Russell Westbrook", T_EMPTY, 95, "Russell Westbrook"], - ["Thunders", T_EMPTY, 2009, T_EMPTY, T_EMPTY], - ["Rockets", T_EMPTY, 2012, T_EMPTY, T_EMPTY], - [T_EMPTY, "Russell Westbrook", T_EMPTY, 80, "Russell Westbrook"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * \ - YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst", "serve.start_year", "like.likeness", "$$.player.name"], - "rows": [ - ["Thunders", T_EMPTY, 2008, T_EMPTY, T_EMPTY], - [T_EMPTY, "Paul George", T_EMPTY, 90, "Paul George"], - [T_EMPTY, "James Harden", T_EMPTY, 90, "James Harden"], - ["Pacers", T_EMPTY, 2010, T_EMPTY, T_EMPTY], - ["Thunders", T_EMPTY, 2017, T_EMPTY, T_EMPTY], - [T_EMPTY, "Russell Westbrook", T_EMPTY, 95, "Russell Westbrook"], - ["Thunders", T_EMPTY, 2009, T_EMPTY, T_EMPTY], - ["Rockets", T_EMPTY, 2012, T_EMPTY, T_EMPTY], - [T_EMPTY, "Russell Westbrook", T_EMPTY, 80, "Russell Westbrook"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * \ - REVERSELY YIELD serve._dst, like._dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst"], - "rows": [ - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "James Harden"], - [T_EMPTY, "Paul George"], - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "Russell Westbrook"], - [T_EMPTY, "Luka Doncic"], - [T_EMPTY, "Russell Westbrook"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * \ - REVERSELY YIELD serve._dst, like._dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["serve._dst", "like._dst"], - "rows": [ - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "James Harden"], - [T_EMPTY, "Paul George"], - [T_EMPTY, "Dejounte Murray"], - [T_EMPTY, "Russell Westbrook"], - [T_EMPTY, "Luka Doncic"], - [T_EMPTY, "Russell Westbrook"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_error_massage(self): - stmt = "GO FROM 'Tim Duncan' OVER serve YIELD $$.player.name as name" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": [], - "rows": [ - [T_EMPTY] - ] - } - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_zero_step(self): - stmt = "GO 0 STEPS FROM 'Tim Duncan' OVER serve BIDIRECT" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = "GO 0 STEPS FROM 'Tim Duncan' OVER serve" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - stmt = "GO 0 STEPS FROM 'Tim Duncan' OVER like YIELD like._dst as id \ - | GO FROM $-.id OVER serve" - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - self.check_empty_result(resp) - - def test_go_cover_input(self): - stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst \ - | GO FROM $-.src OVER like \ - YIELD $-.src as src, like._dst as dst, $^.player.name, $$.player.name''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["src", "dst", "$^.player.name", "$$.player.name"], - "rows": [ - ["Tim Duncan", "Tony Parker", "Tim Duncan", "Tony Parker"], - ["Tim Duncan", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker", "Tim Duncan", "Tony Parker"], - ["Tim Duncan", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$a = GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst; \ - GO FROM $a.src OVER like YIELD $a.src as src, like._dst as dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["src", "dst"], - "rows": [ - ["Tim Duncan", "Tony Parker"], - ["Tim Duncan", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker"], - ["Tim Duncan", "Manu Ginobili"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # with intermidate data pipe - stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst \ - | GO 1 TO 2 STEPS FROM $-.src OVER like YIELD $-.src as src, like._dst as dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["src", "dst"], - "rows": [ - ["Tim Duncan", "Tony Parker"], - ["Tim Duncan", "Manu Ginobili"], - ["Tim Duncan", "Tony Parker"], - ["Tim Duncan", "Manu Ginobili"], - - ["Tim Duncan", "Tim Duncan"], - ["Tim Duncan", "Tim Duncan"], - ["Tim Duncan", "Manu Ginobili"], - ["Tim Duncan", "Manu Ginobili"], - ["Tim Duncan", "LaMarcus Aldridge"], - ["Tim Duncan", "LaMarcus Aldridge"], - ["Tim Duncan", "Tim Duncan"], - ["Tim Duncan", "Tim Duncan"], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # var with properties - stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst \ - | GO 1 TO 2 STEPS FROM $-.src OVER like \ - YIELD $-.src as src, $-.dst, like._dst as dst, like.likeness''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["src", "$-.dst", "dst", "like.likeness"], - "rows": [ - ["Tim Duncan", "Tony Parker", "Tony Parker", 95], - ["Tim Duncan", "Tony Parker", "Manu Ginobili", 95], - ["Tim Duncan", "Manu Ginobili", "Tony Parker", 95], - ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", 95], - - ["Tim Duncan", "Tony Parker", "Tim Duncan", 95], - ["Tim Duncan", "Tony Parker", "Manu Ginobili", 95], - ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge", 90], - ["Tim Duncan", "Tony Parker", "Tim Duncan", 90], - ["Tim Duncan", "Manu Ginobili", "Tim Duncan", 95], - ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", 95], - ["Tim Duncan", "Manu Ginobili", "LaMarcus Aldridge", 90], - ["Tim Duncan", "Manu Ginobili", "Tim Duncan", 90], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # partial neighbors input - stmt = '''GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst \ - | GO FROM $-.dst OVER teammate YIELD $-.src AS src, $-.dst, teammate._dst AS dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["src", "$-.dst", "dst"], - "rows": [ - ["Danny Green", "Tim Duncan", "Tony Parker"], - ["Danny Green", "Tim Duncan", "Manu Ginobili"], - ["Danny Green", "Tim Duncan", "LaMarcus Aldridge"], - ["Danny Green", "Tim Duncan", "Danny Green"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - # var - stmt = '''$a = GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst; \ - GO FROM $a.dst OVER teammate YIELD $a.src AS src, $a.dst, teammate._dst AS dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["src", "$a.dst", "dst"], - "rows": [ - ["Danny Green", "Tim Duncan", "Tony Parker"], - ["Danny Green", "Tim Duncan", "Manu Ginobili"], - ["Danny Green", "Tim Duncan", "LaMarcus Aldridge"], - ["Danny Green", "Tim Duncan", "Danny Green"] - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - def test_backtrack_overlap(self): - stmt = '''GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst \ - | GO 2 STEPS FROM $-.src OVER like YIELD $-.src, $-.dst, like._src, like._dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$-.src", "$-.dst", "like._src", "like._dst"], - "rows": [ - ["Tony Parker", "Tim Duncan", "Tim Duncan", "Manu Ginobili"], - ["Tony Parker", "Tim Duncan", "Tim Duncan", "Tony Parker"], - ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tony Parker"], - ["Tony Parker", "Tim Duncan", "Manu Ginobili", "Tim Duncan"], - ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tim Duncan"], - ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"], - ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Tony Parker"], - ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tony Parker"], - ["Tony Parker", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"], - ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tim Duncan"], - ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Manu Ginobili"], - ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Tony Parker"], - ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tony Parker"], - ["Tony Parker", "LaMarcus Aldridge", "Manu Ginobili", "Tim Duncan"], - ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tim Duncan"], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) - - stmt = '''$a = GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst; \ - GO 2 STEPS FROM $a.src OVER like YIELD $a.src, $a.dst, like._src, like._dst''' - resp = self.execute(stmt) - self.check_resp_succeeded(resp) - expected_data = { - "column_names": ["$a.src", "$a.dst", "like._src", "like._dst"], - "rows": [ - ["Tony Parker", "Tim Duncan", "Tim Duncan", "Manu Ginobili"], - ["Tony Parker", "Tim Duncan", "Tim Duncan", "Tony Parker"], - ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tony Parker"], - ["Tony Parker", "Tim Duncan", "Manu Ginobili", "Tim Duncan"], - ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tim Duncan"], - ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"], - ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Tony Parker"], - ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tony Parker"], - ["Tony Parker", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"], - ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tim Duncan"], - ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Manu Ginobili"], - ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Tony Parker"], - ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tony Parker"], - ["Tony Parker", "LaMarcus Aldridge", "Manu Ginobili", "Tim Duncan"], - ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tim Duncan"], - ] - } - self.check_column_names(resp, expected_data["column_names"]) - self.check_out_of_order_result(resp, expected_data["rows"]) diff --git a/tests/tck/conftest.py b/tests/tck/conftest.py index ebb9fc26f131157d822444d56ed100db15ea43dd..22575c5ab78946e337fb611253690037a9b35b43 100644 --- a/tests/tck/conftest.py +++ b/tests/tck/conftest.py @@ -151,13 +151,14 @@ def execution_should_be_succ(graph_spaces): assert rs is not None, "Please execute a query at first" assert rs.is_succeeded(), f"Response failed: {rs.error_msg()}" - -@then(rparse(r"a (?P<err_type>\w+) should be raised at (?P<time>.*):(?P<msg>.*)")) +@then( + rparse("a (?P<err_type>\w+) should be raised at (?P<time>runtime|compile time):(?P<msg>.*)") +) def raised_type_error(err_type, time, msg, graph_spaces): res = graph_spaces["result_set"] assert not res.is_succeeded(), "Response should be failed" err_type = err_type.strip() - msg = msg.strip().replace('$', r'\$') + msg = msg.strip().replace('$', r'\$').replace('^', r"\^") res_msg = res.error_msg() if res.error_code() == ErrorCode.E_EXECUTION_ERROR: assert err_type == "ExecutionError" diff --git a/tests/tck/features/go/go.feature b/tests/tck/features/go/go.feature new file mode 100644 index 0000000000000000000000000000000000000000..269b1b8851ac2137dc7b9301d854d559d3c1f6ad --- /dev/null +++ b/tests/tck/features/go/go.feature @@ -0,0 +1,1581 @@ +Feature: Go Sentence + + Background: Prepare space + Given a graph with space named "nba" + + Scenario: one step + When executing query: + """ + GO FROM "Tim Duncan" OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + When executing query: + """ + GO FROM "Tim Duncan", "Tim Duncan" OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + When executing query: + """ + YIELD "Tim Duncan" as vid | GO FROM $-.vid OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + When executing query: + """ + GO FROM "Boris Diaw" OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + | "Boris Diaw" | 2008 | 2012 | "Hornets" | + | "Boris Diaw" | 2012 | 2016 | "Spurs" | + | "Boris Diaw" | 2016 | 2017 | "Jazz" | + When executing query: + """ + GO FROM "Rajon Rondo" OVER serve WHERE serve.start_year >= 2013 AND serve.end_year <= 2018 + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Rajon Rondo" | 2014 | 2015 | "Mavericks" | + | "Rajon Rondo" | 2015 | 2016 | "Kings" | + | "Rajon Rondo" | 2016 | 2017 | "Bulls" | + | "Rajon Rondo" | 2017 | 2018 | "Pelicans" | + When executing query: + """ + GO FROM "Boris Diaw" OVER like YIELD like._dst as id + | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Hornets" | + | "Trail Blazers" | + When executing query: + """ + GO FROM 'Thunders' OVER serve REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Russell Westbrook" | + | "Kevin Durant" | + | "James Harden" | + | "Carmelo Anthony" | + | "Paul George" | + | "Ray Allen" | + When executing query: + """ + GO FROM "Boris Diaw" OVER like YIELD like._dst as id + |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Hornets" | + | "Trail Blazers" | + When executing query: + """ + GO FROM "No Exist Vertex Id" OVER like YIELD like._dst as id + |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO FROM "Boris Diaw" OVER like, serve YIELD like._dst as id + |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Hornets" | + | "Trail Blazers" | + + Scenario: assignment simple + When executing query: + """ + $var = GO FROM "Tracy McGrady" OVER like YIELD like._dst as id; GO FROM $var.id OVER like + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tracy McGrady" | + | "LaMarcus Aldridge" | + + Scenario: assignment pipe + When executing query: + """ + $var = (GO FROM "Tracy McGrady" OVER like YIELD like._dst as id | GO FROM $-.id OVER like YIELD like._dst as id); + GO FROM $var.id OVER like + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Kobe Bryant" | + | "Grant Hill" | + | "Rudy Gay" | + | "Tony Parker" | + | "Tim Duncan" | + + Scenario: pipe only yield input prop + When executing query: + """ + GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD $-.vid as id + """ + Then the result should be, in any order, with relax comparison: + | id | + | "Kobe Bryant" | + | "Grant Hill" | + | "Rudy Gay" | + + Scenario: pipe only yield constant + When executing query: + """ + GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD 3 + """ + Then the result should be, in any order, with relax comparison: + | 3 | + | 3 | + | 3 | + | 3 | + + Scenario: assignment empty result + When executing query: + """ + $var = GO FROM "-1" OVER like YIELD like._dst as id; GO FROM $var.id OVER like + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + + Scenario: variable undefined + When executing query: + """ + GO FROM $var OVER like + """ + Then a SyntaxError should be raised at runtime: syntax error near `OVER' + + Scenario: distinct + When executing query: + """ + GO FROM "Nobody" OVER serve YIELD DISTINCT $^.player.name as name, $$.team.name as name + """ + Then the result should be, in any order, with relax comparison: + | name | name | + When executing query: + """ + GO FROM "Boris Diaw" OVER like YIELD like._dst as id + | GO FROM $-.id OVER like YIELD like._dst as id + | GO FROM $-.id OVER serve + YIELD DISTINCT serve._dst, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | $$.team.name | + | "Spurs" | "Spurs" | + | "Hornets" | "Hornets" | + | "Trail Blazers" | "Trail Blazers" | + When executing query: + """ + GO 2 STEPS FROM "Tony Parker" OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tim Duncan" | + | "Tony Parker" | + | "Manu Ginobili" | + + Scenario: vertex noexist + When executing query: + """ + GO FROM "NON EXIST VERTEX ID" OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO FROM "NON EXIST VERTEX ID" OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + When executing query: + """ + GO FROM "NON EXIST VERTEX ID" OVER serve YIELD DISTINCT $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + + Scenario: empty input + When executing query: + """ + GO FROM "NON EXIST VERTEX ID" OVER like YIELD like._dst as id + | GO FROM $-.id OVER like YIELD like._dst as id + | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO FROM "NON EXIST VERTEX ID" OVER serve YIELD serve._dst as id, serve.start_year as start + | YIELD $-.id as id WHERE $-.start > 20000 + | Go FROM $-.id over serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + + Scenario: multi edges over all + When executing query: + """ + GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | "James Harden" | + | EMPTY | "Dejounte Murray" | + | EMPTY | "Paul George" | + When executing query: + """ + GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._src, like._src + """ + Then the result should be, in any order, with relax comparison: + | serve._src | like._src | + | EMPTY | "Russell Westbrook" | + | EMPTY | "Russell Westbrook" | + | EMPTY | "Russell Westbrook" | + When executing query: + """ + GO FROM "Russell Westbrook" OVER * REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | like._dst | serve._dst | teammate._dst | + | "James Harden" | EMPTY | EMPTY | + | "Dejounte Murray" | EMPTY | EMPTY | + | "Paul George" | EMPTY | EMPTY | + When executing query: + """ + GO FROM "Dirk Nowitzki" OVER * YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | "Mavericks" | EMPTY | + | EMPTY | "Steve Nash" | + | EMPTY | "Jason Kidd" | + | EMPTY | "Dwyane Wade" | + When executing query: + """ + GO FROM "Paul Gasol" OVER * + """ + Then the result should be, in any order, with relax comparison: + | like._dst | serve._dst | teammate._dst | + | EMPTY | "Grizzlies" | EMPTY | + | EMPTY | "Lakers" | EMPTY | + | EMPTY | "Bulls" | EMPTY | + | EMPTY | "Spurs" | EMPTY | + | EMPTY | "Bucks" | EMPTY | + | "Kobe Bryant" | EMPTY | EMPTY | + | "Marc Gasol" | EMPTY | EMPTY | + When executing query: + """ + GO FROM "Manu Ginobili" OVER * REVERSELY YIELD like.likeness, teammate.start_year, serve.start_year, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like.likeness | teammate.start_year | serve.start_year | $$.player.name | + | 95 | EMPTY | EMPTY | "Tim Duncan" | + | 95 | EMPTY | EMPTY | "Tony Parker" | + | 90 | EMPTY | EMPTY | "Tiago Splitter" | + | 99 | EMPTY | EMPTY | "Dejounte Murray" | + | EMPTY | 2002 | EMPTY | "Tim Duncan" | + | EMPTY | 2002 | EMPTY | "Tony Parker" | + When executing query: + """ + GO FROM "LaMarcus Aldridge" OVER * YIELD $$.team.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.team.name | $$.player.name | + | "Trail Blazers" | EMPTY | + | EMPTY | "Tim Duncan" | + | EMPTY | "Tony Parker" | + | "Spurs" | EMPTY | + When executing query: + """ + GO FROM "Boris Diaw" OVER * YIELD like._dst as id + | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve ) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Hornets" | + | "Trail Blazers" | + + @skip + Scenario: edge type + When executing query: + """ + YIELD serve.start_year, like.likeness, serve._type, like._type + """ + Then the result should be, in any order, with relax comparison: + | serve.start_year | like.likeness | serve._type | like._type | + | 2008 | EMPTY | 6 | EMPTY | + | EMPTY | 90 | EMPTY | 5 | + | EMPTY | 90 | EMPTY | 5 | + When executing query: + """ + GO FROM "Russell Westbrook" OVER serve, like REVERSELY + YIELD serve._dst, like._dst, serve._type, like._type + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve._type | like._type | + | EMPTY | "James Harden" | EMPTY | -5 | + | EMPTY | "Dejounte Murray" | EMPTY | -5 | + | EMPTY | "Paul George" | EMPTY | -5 | + + Scenario: multi edges + When executing query: + """ + GO FROM "Russell Westbrook" OVER serve, like YIELD serve.start_year, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | serve.start_year | like.likeness | + | 2008 | EMPTY | + | EMPTY | 90 | + | EMPTY | 90 | + When executing query: + """ + GO FROM "Shaquile O\'Neal" OVER serve, like + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | "Magic" | EMPTY | + | "Lakers" | EMPTY | + | "Heat" | EMPTY | + | "Suns" | EMPTY | + | "Cavaliers" | EMPTY | + | "Celtics" | EMPTY | + | EMPTY | "JaVale McGee" | + | EMPTY | "Tim Duncan" | + When executing query: + """ + GO FROM 'Russell Westbrook' OVER serve, like + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | "Thunders" | EMPTY | + | EMPTY | "Paul George" | + | EMPTY | "James Harden" | + When executing query: + """ + GO FROM "Russell Westbrook" OVER serve, like REVERSELY + YIELD serve._dst, like._dst, serve.start_year, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve.start_year | like.likeness | + | EMPTY | "James Harden" | EMPTY | 80 | + | EMPTY | "Dejounte Murray" | EMPTY | 99 | + | EMPTY | "Paul George" | EMPTY | 95 | + When executing query: + """ + GO FROM "Russell Westbrook" OVER serve, like REVERSELY YIELD serve._src, like._src + """ + Then the result should be, in any order, with relax comparison: + | serve._src | like._src | + | EMPTY | "Russell Westbrook" | + | EMPTY | "Russell Westbrook" | + | EMPTY | "Russell Westbrook" | + When executing query: + """ + GO FROM "Russell Westbrook" OVER serve, like REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | "James Harden" | + | EMPTY | "Dejounte Murray" | + | EMPTY | "Paul George" | + When executing query: + """ + GO FROM "Manu Ginobili" OVER like, teammate REVERSELY YIELD like.likeness, teammate.start_year, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like.likeness | teammate.start_year | $$.player.name | + | 95 | EMPTY | "Tim Duncan" | + | 95 | EMPTY | "Tony Parker" | + | 90 | EMPTY | "Tiago Splitter" | + | 99 | EMPTY | "Dejounte Murray" | + | EMPTY | 2002 | "Tim Duncan" | + | EMPTY | 2002 | "Tony Parker" | + + Scenario: multi edges with filter + When executing query: + """ + GO FROM "Russell Westbrook" OVER serve, like WHERE serve.start_year > 2000 + YIELD serve.start_year, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | serve.start_year | like.likeness | + | 2008 | EMPTY | + When executing query: + """ + GO FROM "Manu Ginobili" OVER like, teammate REVERSELY WHERE like.likeness > 90 + YIELD like.likeness, teammate.start_year, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like.likeness | teammate.start_year | $$.player.name | + | 95 | EMPTY | "Tim Duncan" | + | 95 | EMPTY | "Tony Parker" | + | 99 | EMPTY | "Dejounte Murray" | + When executing query: + """ + GO FROM "Manu Ginobili" OVER * WHERE $$.player.age > 30 or $$.team.name not starts with "Rockets" + YIELD DISTINCT $$.player.age, $$.player.name, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.age | $$.player.name | $$.team.name | + | EMPTY | EMPTY | "Spurs" | + | 42 | "Tim Duncan" | EMPTY | + | 36 | "Tony Parker" | EMPTY | + When executing query: + """ + GO FROM "Manu Ginobili" OVER like, teammate REVERSELY WHERE $$.player.age > 30 and $$.player.age < 40 + YIELD DISTINCT $$.player.age, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.age | $$.player.name | + | 34 | "Tiago Splitter" | + | 36 | "Tony Parker" | + + Scenario: reference pipe in yield and where + When executing query: + """ + GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id + | GO FROM $-.id OVER like YIELD $-.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $-.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + When executing query: + """ + GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id + | GO FROM $-.id OVER like WHERE $-.name != $$.player.name YIELD $-.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $-.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + + @skip + Scenario: all prop(reson = $-.* over * $var.* not implement) + When executing query: + """ + GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id + | GO FROM $-.id OVER like YIELD $-.*, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $-.* | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + When executing query: + """ + $var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id; + GO FROM $var.id OVER like YIELD $var.*, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $var.* | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + + Scenario: reference variable in yield and where + When executing query: + """ + $var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id; + GO FROM $var.id OVER like YIELD $var.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $var.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + When executing query: + """ + $var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id; + GO FROM $var.id OVER like WHERE $var.name != $$.player.name YIELD $var.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $var.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + + Scenario: no exist prop + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve YIELD $^.player.test + """ + Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'. + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve yield $^.player.test + """ + Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'. + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve YIELD serve.test + """ + Then a SemanticError should be raised at runtime: `serve.test', not found the property `test'. + + @skip + Scenario: udf call (reason = "not support udf_is_in now") + When executing query: + """ + GO FROM 'Boris Diaw' OVER serve WHERE udf_is_in($$.team.name, 'Hawks', 'Suns') + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id + | GO FROM $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Hornets" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id + | GO FROM $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) AND 1 == 1 + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Hornets" | + + @skip + Scenario: return test (reason = "return not implement") + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE $A.dst == 123; + RETURN $rA IF $rA IS NOT NULL; + GO FROM $A.dst OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Hornets" | + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $rA IF $rA IS NOT NULL; + GO FROM $A.dst OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Tony Parker" | + | "Manu Ginobili" | + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dstA; + $rA = YIELD $A.* WHERE $A.dstA == 123; + RETURN $rA IF $rA IS NOT NULL; + $B = GO FROM $A.dstA OVER like YIELD like._dst AS dstB; + $rB = YIELD $B.* WHERE $B.dstB == 456; + RETURN $rB IF $rB IS NOT NULL; + GO FROM $B.dstB OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Trail Blazers" | + | "Spurs" | + | "Spurs" | + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE $A.dst == 123; + RETURN $rA IF $rA IS NOT NULL; + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $rA IF $rA IS NOT NULL; + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Tony Parker" | + | "Manu Ginobili" | + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $B IF $B IS NOT NULL + """ + Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a' + When executing query: + """ + $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $B IF $A IS NOT NULL + """ + Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a' + When executing query: + """ + RETURN $rA IF $rA IS NOT NULL; + """ + Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a' + + Scenario: reverse one step + When executing query: + """ + GO FROM 'Tim Duncan' OVER like REVERSELY YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like REVERSELY YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like REVERSELY WHERE $$.player.age < 35 YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Dejounte Murray" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER * REVERSELY YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + | EMPTY | + | EMPTY | + + Scenario: only id n steps + When executing query: + """ + GO 2 STEPS FROM 'Tony Parker' OVER like YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tim Duncan" | + | "Tim Duncan" | + | "Tony Parker" | + | "Tony Parker" | + | "Manu Ginobili" | + When executing query: + """ + GO 3 STEPS FROM 'Tony Parker' OVER like YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tony Parker" | + | "Manu Ginobili" | + | "Manu Ginobili" | + | "Tim Duncan" | + | "Tim Duncan" | + | "LaMarcus Aldridge" | + When executing query: + """ + GO 1 STEPS FROM 'Tony Parker' OVER like YIELD like._dst AS id + | GO 2 STEPS FROM $-.id OVER like YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "LaMarcus Aldridge" | + | "LaMarcus Aldridge" | + | "Manu Ginobili" | + | "Manu Ginobili" | + | "Tim Duncan" | + | "Tim Duncan" | + | "Tim Duncan" | + | "Manu Ginobili" | + | "Manu Ginobili" | + | "Tony Parker" | + | "Tony Parker" | + + Scenario: reverse two steps + When executing query: + """ + GO 2 STEPS FROM 'Kobe Bryant' OVER like REVERSELY YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "Marc Gasol" | + | "Vince Carter" | + | "Yao Ming" | + | "Grant Hill" | + When executing query: + """ + GO FROM 'Manu Ginobili' OVER * REVERSELY YIELD like._dst AS id + | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Hornets" | + | "Spurs" | + | "Hawks" | + | "76ers" | + | "Spurs" | + + Scenario: reverse with pipe + When executing query: + """ + GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id + | GO FROM $-.id OVER serve REVERSELY YIELD $^.team.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $^.team.name | $$.player.name | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "LeBron James" | + | "Cavaliers" | "LeBron James" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Cavaliers" | "LeBron James" | + | "Cavaliers" | "LeBron James" | + | "Heat" | "Amar'e Stoudemire" | + | "Heat" | "Dwyane Wade" | + | "Heat" | "LeBron James" | + | "Heat" | "Ray Allen" | + | "Heat" | "Shaquile O'Neal" | + | "Heat" | "Dwyane Wade" | + | "Lakers" | "Dwight Howard" | + | "Lakers" | "JaVale McGee" | + | "Lakers" | "Kobe Bryant" | + | "Lakers" | "LeBron James" | + | "Lakers" | "Paul Gasol" | + | "Lakers" | "Rajon Rondo" | + | "Lakers" | "Shaquile O'Neal" | + | "Lakers" | "Steve Nash" | + When executing query: + """ + GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id + | GO FROM $-.id OVER serve REVERSELY WHERE $$.player.name != 'LeBron James' + YIELD $^.team.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $^.team.name | $$.player.name | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Heat" | "Amar'e Stoudemire" | + | "Heat" | "Dwyane Wade" | + | "Heat" | "Ray Allen" | + | "Heat" | "Shaquile O'Neal" | + | "Heat" | "Dwyane Wade" | + | "Lakers" | "Dwight Howard" | + | "Lakers" | "JaVale McGee" | + | "Lakers" | "Kobe Bryant" | + | "Lakers" | "Paul Gasol" | + | "Lakers" | "Rajon Rondo" | + | "Lakers" | "Shaquile O'Neal" | + | "Lakers" | "Steve Nash" | + When executing query: + """ + GO FROM 'Manu Ginobili' OVER like REVERSELY YIELD like._dst AS id + | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Spurs" | + | "Hornets" | + | "Hawks" | + | "76ers" | + + Scenario: bidirect + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve bidirect + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like bidirect + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tony Parker" | + | "Manu Ginobili" | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve, like bidirect + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | "Spurs" | EMPTY | + | EMPTY | "Tony Parker" | + | EMPTY | "Manu Ginobili" | + | EMPTY | "Tony Parker" | + | EMPTY | "Manu Ginobili" | + | EMPTY | "LaMarcus Aldridge" | + | EMPTY | "Marco Belinelli" | + | EMPTY | "Danny Green" | + | EMPTY | "Aron Baynes" | + | EMPTY | "Boris Diaw" | + | EMPTY | "Tiago Splitter" | + | EMPTY | "Dejounte Murray" | + | EMPTY | "Shaquile O'Neal" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve bidirect YIELD $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $$.team.name | + | "Spurs" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like bidirect YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "Tony Parker" | + | "Manu Ginobili" | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like bidirect WHERE like.likeness > 90 + YIELD $^.player.name, like._dst, $$.player.name, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | like._dst | $$.player.name | like.likeness | + | "Tim Duncan" | "Tony Parker" | "Tony Parker" | 95 | + | "Tim Duncan" | "Manu Ginobili" | "Manu Ginobili" | 95 | + | "Tim Duncan" | "Tony Parker" | "Tony Parker" | 95 | + | "Tim Duncan" | "Dejounte Murray" | "Dejounte Murray" | 99 | + + Scenario: bidirect_over_all + When executing query: + """ + GO FROM 'Tim Duncan' OVER * bidirect YIELD $^.player.name, serve._dst, $$.team.name, like._dst, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve._dst | $$.team.name | like._dst | $$.player.name | + | "Tim Duncan" | "Spurs" | "Spurs" | EMPTY | EMPTY | + | "Tim Duncan" | EMPTY | EMPTY | "Tony Parker" | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | "Manu Ginobili" | "Manu Ginobili" | + | "Tim Duncan" | EMPTY | EMPTY | "Tony Parker" | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | "Manu Ginobili" | "Manu Ginobili" | + | "Tim Duncan" | EMPTY | EMPTY | "LaMarcus Aldridge" | "LaMarcus Aldridge" | + | "Tim Duncan" | EMPTY | EMPTY | "Marco Belinelli" | "Marco Belinelli" | + | "Tim Duncan" | EMPTY | EMPTY | "Danny Green" | "Danny Green" | + | "Tim Duncan" | EMPTY | EMPTY | "Aron Baynes" | "Aron Baynes" | + | "Tim Duncan" | EMPTY | EMPTY | "Boris Diaw" | "Boris Diaw" | + | "Tim Duncan" | EMPTY | EMPTY | "Tiago Splitter" | "Tiago Splitter" | + | "Tim Duncan" | EMPTY | EMPTY | "Dejounte Murray" | "Dejounte Murray" | + | "Tim Duncan" | EMPTY | EMPTY | "Shaquile O'Neal" | "Shaquile O'Neal" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Manu Ginobili" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Danny Green" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "LaMarcus Aldridge" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Manu Ginobili" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER * bidirect + """ + Then the result should be, in any order, with relax comparison: + | like._dst | serve._dst | teammate._dst | + | EMPTY | "Spurs" | EMPTY | + | "Tony Parker" | EMPTY | EMPTY | + | "Manu Ginobili" | EMPTY | EMPTY | + | "Tony Parker" | EMPTY | EMPTY | + | "Manu Ginobili" | EMPTY | EMPTY | + | "LaMarcus Aldridge" | EMPTY | EMPTY | + | "Marco Belinelli" | EMPTY | EMPTY | + | "Danny Green" | EMPTY | EMPTY | + | "Aron Baynes" | EMPTY | EMPTY | + | "Boris Diaw" | EMPTY | EMPTY | + | "Tiago Splitter" | EMPTY | EMPTY | + | "Dejounte Murray" | EMPTY | EMPTY | + | "Shaquile O'Neal" | EMPTY | EMPTY | + | EMPTY | EMPTY | "Tony Parker" | + | EMPTY | EMPTY | "Manu Ginobili" | + | EMPTY | EMPTY | "LaMarcus Aldridge" | + | EMPTY | EMPTY | "Danny Green" | + | EMPTY | EMPTY | "Tony Parker" | + | EMPTY | EMPTY | "Manu Ginobili" | + + Scenario: duplicate column name + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve YIELD serve._dst, serve._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | serve._dst | + | "Spurs" | "Spurs" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id, like.likeness AS id + | GO FROM $-.id OVER serve + """ + Then a SemanticError should be raised at runtime: Duplicate Column Name : `id' + When executing query: + """ + GO FROM 'Tim Duncan' OVER like, serve YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id + | GO FROM $-.id OVER * + """ + Then a SemanticError should be raised at runtime: Duplicate Column Name : `year' + When executing query: + """ + $a = GO FROM 'Tim Duncan' OVER * + YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id; + | GO FROM $-.id OVER serve + """ + Then a SyntaxError should be raised at runtime: syntax error near `| GO FRO' + + Scenario: contain + When executing query: + """ + GO FROM 'Boris Diaw' OVER serve WHERE $$.team.name CONTAINS "Haw" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + When executing query: + """ + GO FROM 'Boris Diaw' OVER serve WHERE (string)serve.start_year CONTAINS "05" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + When executing query: + """ + GO FROM 'Boris Diaw' OVER serve WHERE $^.player.name CONTAINS "Boris" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + | "Boris Diaw" | 2008 | 2012 | "Hornets" | + | "Boris Diaw" | 2012 | 2016 | "Spurs" | + | "Boris Diaw" | 2016 | 2017 | "Jazz" | + When executing query: + """ + GO FROM 'Boris Diaw' OVER serve WHERE !($^.player.name CONTAINS "Boris") + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + When executing query: + """ + GO FROM 'Boris Diaw' OVER serve WHERE "Leo" CONTAINS "Boris" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + + Scenario: [0] intermediate data + When executing query: + """ + GO 0 TO 0 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Tim Duncan" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Tim Duncan" | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like._dst | like.likeness | $$.player.name | + | "Manu Ginobili" | 95 | "Manu Ginobili" | + | "LaMarcus Aldridge" | 90 | "LaMarcus Aldridge" | + | "Tim Duncan" | 95 | "Tim Duncan" | + | "Tony Parker" | 95 | "Tony Parker" | + | "Tony Parker" | 75 | "Tony Parker" | + | "Tim Duncan" | 75 | "Tim Duncan" | + | "Tim Duncan" | 90 | "Tim Duncan" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like._dst | like.likeness | $$.player.name | + | "Manu Ginobili" | 95 | "Manu Ginobili" | + | "LaMarcus Aldridge" | 90 | "LaMarcus Aldridge" | + | "Tim Duncan" | 95 | "Tim Duncan" | + | "Tony Parker" | 95 | "Tony Parker" | + | "Tony Parker" | 75 | "Tony Parker" | + | "Tim Duncan" | 75 | "Tim Duncan" | + | "Tim Duncan" | 90 | "Tim Duncan" | + When executing query: + """ + GO 0 TO 3 STEPS FROM 'Tim Duncan' OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Spurs" | + When executing query: + """ + GO 2 TO 3 STEPS FROM 'Tim Duncan' OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tim Duncan" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Boris Diaw" | + | "Dejounte Murray" | + | "Tony Parker" | + | "Manu Ginobili" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Shaquile O'Neal" | + | "Rudy Gay" | + | "Damian Lillard" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tim Duncan" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Boris Diaw" | + | "Dejounte Murray" | + | "Tony Parker" | + | "Manu Ginobili" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Shaquile O'Neal" | + | "Rudy Gay" | + | "Damian Lillard" | + When executing query: + """ + GO 2 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Boris Diaw" | + | "Dejounte Murray" | + | "Tony Parker" | + | "Manu Ginobili" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Shaquile O'Neal" | + | "Rudy Gay" | + | "Damian Lillard" | + When executing query: + """ + GO 1 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Tim Duncan" | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Rudy Gay" | + | "Marco Belinelli" | + | "Danny Green" | + | "Kyle Anderson" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Cory Joseph" | + | "David West" | + | "Jonathon Simmons" | + | "Dejounte Murray" | + | "Tracy McGrady" | + | "Paul Gasol" | + | "Marco Belinelli" | + When executing query: + """ + GO 0 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | "Tim Duncan" | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Rudy Gay" | + | "Marco Belinelli" | + | "Danny Green" | + | "Kyle Anderson" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Cory Joseph" | + | "David West" | + | "Jonathon Simmons" | + | "Dejounte Murray" | + | "Tracy McGrady" | + | "Paul Gasol" | + | "Marco Belinelli" | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tim Duncan" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Boris Diaw" | + | "Dejounte Murray" | + | "Tony Parker" | + | "Manu Ginobili" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Shaquile O'Neal" | + | "Rudy Gay" | + | "Damian Lillard" | + | "LeBron James" | + | "Russell Westbrook" | + | "Chris Paul" | + | "Kyle Anderson" | + | "Kevin Durant" | + | "James Harden" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | "Tim Duncan" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Boris Diaw" | + | "Dejounte Murray" | + | "Tony Parker" | + | "Manu Ginobili" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Shaquile O'Neal" | + | "Rudy Gay" | + | "Damian Lillard" | + | "LeBron James" | + | "Russell Westbrook" | + | "Chris Paul" | + | "Kyle Anderson" | + | "Kevin Durant" | + | "James Harden" | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | "Thunders" | EMPTY | + | EMPTY | "Paul George" | + | EMPTY | "James Harden" | + | "Pacers" | EMPTY | + | "Thunders" | EMPTY | + | EMPTY | "Russell Westbrook" | + | "Thunders" | EMPTY | + | "Rockets" | EMPTY | + | EMPTY | "Russell Westbrook" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | "Thunders" | EMPTY | + | EMPTY | "Paul George" | + | EMPTY | "James Harden" | + | "Pacers" | EMPTY | + | "Thunders" | EMPTY | + | EMPTY | "Russell Westbrook" | + | "Thunders" | EMPTY | + | "Rockets" | EMPTY | + | EMPTY | "Russell Westbrook" | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * + YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve.start_year | like.likeness | $$.player.name | + | "Thunders" | EMPTY | 2008 | EMPTY | EMPTY | + | EMPTY | "Paul George" | EMPTY | 90 | "Paul George" | + | EMPTY | "James Harden" | EMPTY | 90 | "James Harden" | + | "Pacers" | EMPTY | 2010 | EMPTY | EMPTY | + | "Thunders" | EMPTY | 2017 | EMPTY | EMPTY | + | EMPTY | "Russell Westbrook" | EMPTY | 95 | "Russell Westbrook" | + | "Thunders" | EMPTY | 2009 | EMPTY | EMPTY | + | "Rockets" | EMPTY | 2012 | EMPTY | EMPTY | + | EMPTY | "Russell Westbrook" | EMPTY | 80 | "Russell Westbrook" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * + YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve.start_year | like.likeness | $$.player.name | + | "Thunders" | EMPTY | 2008 | EMPTY | EMPTY | + | EMPTY | "Paul George" | EMPTY | 90 | "Paul George" | + | EMPTY | "James Harden" | EMPTY | 90 | "James Harden" | + | "Pacers" | EMPTY | 2010 | EMPTY | EMPTY | + | "Thunders" | EMPTY | 2017 | EMPTY | EMPTY | + | EMPTY | "Russell Westbrook" | EMPTY | 95 | "Russell Westbrook" | + | "Thunders" | EMPTY | 2009 | EMPTY | EMPTY | + | "Rockets" | EMPTY | 2012 | EMPTY | EMPTY | + | EMPTY | "Russell Westbrook" | EMPTY | 80 | "Russell Westbrook" | + When executing query: + """ + GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * REVERSELY YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | "Dejounte Murray" | + | EMPTY | "James Harden" | + | EMPTY | "Paul George" | + | EMPTY | "Dejounte Murray" | + | EMPTY | "Russell Westbrook" | + | EMPTY | "Luka Doncic" | + | EMPTY | "Russell Westbrook" | + When executing query: + """ + GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * REVERSELY YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | "Dejounte Murray" | + | EMPTY | "James Harden" | + | EMPTY | "Paul George" | + | EMPTY | "Dejounte Murray" | + | EMPTY | "Russell Westbrook" | + | EMPTY | "Luka Doncic" | + | EMPTY | "Russell Westbrook" | + + Scenario: error message + When executing query: + """ + GO FROM 'Tim Duncan' OVER serve YIELD $$.player.name as name + """ + Then the result should be, in any order, with relax comparison: + | name | + | EMPTY | + + Scenario: zero step + When executing query: + """ + GO 0 STEPS FROM 'Tim Duncan' OVER serve BIDIRECT + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO 0 STEPS FROM 'Tim Duncan' OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO 0 STEPS FROM 'Tim Duncan' OVER like YIELD like._dst as id | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + + Scenario: go cover input + When executing query: + """ + GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst | GO FROM $-.src OVER like + YIELD $-.src as src, like._dst as dst, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | src | dst | $^.player.name | $$.player.name | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | "Tony Parker" | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | "Tony Parker" | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | "Manu Ginobili" | + When executing query: + """ + $a = GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst; + GO FROM $a.src OVER like YIELD $a.src as src, like._dst as dst + """ + Then the result should be, in any order, with relax comparison: + | src | dst | + | "Tim Duncan" | "Tony Parker" | + | "Tim Duncan" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | + | "Tim Duncan" | "Manu Ginobili" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst + | GO 1 TO 2 STEPS FROM $-.src OVER like YIELD $-.src as src, like._dst as dst + """ + Then the result should be, in any order, with relax comparison: + | src | dst | + | "Tim Duncan" | "Tony Parker" | + | "Tim Duncan" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | + | "Tim Duncan" | "Manu Ginobili" | + | "Tim Duncan" | "Tim Duncan" | + | "Tim Duncan" | "Tim Duncan" | + | "Tim Duncan" | "Manu Ginobili" | + | "Tim Duncan" | "Manu Ginobili" | + | "Tim Duncan" | "LaMarcus Aldridge" | + | "Tim Duncan" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tim Duncan" | + | "Tim Duncan" | "Tim Duncan" | + When executing query: + """ + GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst + | GO 1 TO 2 STEPS FROM $-.src OVER like + YIELD $-.src as src, $-.dst, like._dst as dst, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | src | $-.dst | dst | like.likeness | + | "Tim Duncan" | "Tony Parker" | "Tony Parker" | 95 | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | 95 | + | "Tim Duncan" | "Manu Ginobili" | "Tony Parker" | 95 | + | "Tim Duncan" | "Manu Ginobili" | "Manu Ginobili" | 95 | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | 95 | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | 95 | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | 90 | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | 90 | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | 95 | + | "Tim Duncan" | "Manu Ginobili" | "Manu Ginobili" | 95 | + | "Tim Duncan" | "Manu Ginobili" | "LaMarcus Aldridge" | 90 | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | 90 | + When executing query: + """ + GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst + | GO FROM $-.dst OVER teammate YIELD $-.src AS src, $-.dst, teammate._dst AS dst + """ + Then the result should be, in any order, with relax comparison: + | src | $-.dst | dst | + | "Danny Green" | "Tim Duncan" | "Tony Parker" | + | "Danny Green" | "Tim Duncan" | "Manu Ginobili" | + | "Danny Green" | "Tim Duncan" | "LaMarcus Aldridge" | + | "Danny Green" | "Tim Duncan" | "Danny Green" | + When executing query: + """ + $a = GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst; + GO FROM $a.dst OVER teammate YIELD $a.src AS src, $a.dst, teammate._dst AS dst + """ + Then the result should be, in any order, with relax comparison: + | src | $a.dst | dst | + | "Danny Green" | "Tim Duncan" | "Tony Parker" | + | "Danny Green" | "Tim Duncan" | "Manu Ginobili" | + | "Danny Green" | "Tim Duncan" | "LaMarcus Aldridge" | + | "Danny Green" | "Tim Duncan" | "Danny Green" | + + Scenario: backtrack overlap + When executing query: + """ + GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst + | GO 2 STEPS FROM $-.src OVER like YIELD $-.src, $-.dst, like._src, like._dst + """ + Then the result should be, in any order, with relax comparison: + | $-.src | $-.dst | like._src | like._dst | + | "Tony Parker" | "Tim Duncan" | "Tim Duncan" | "Manu Ginobili" | + | "Tony Parker" | "Tim Duncan" | "Tim Duncan" | "Tony Parker" | + | "Tony Parker" | "Tim Duncan" | "LaMarcus Aldridge" | "Tony Parker" | + | "Tony Parker" | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tony Parker" | "Tim Duncan" | "LaMarcus Aldridge" | "Tim Duncan" | + | "Tony Parker" | "Manu Ginobili" | "Tim Duncan" | "Manu Ginobili" | + | "Tony Parker" | "Manu Ginobili" | "Tim Duncan" | "Tony Parker" | + | "Tony Parker" | "Manu Ginobili" | "LaMarcus Aldridge" | "Tony Parker" | + | "Tony Parker" | "Manu Ginobili" | "Manu Ginobili" | "Tim Duncan" | + | "Tony Parker" | "Manu Ginobili" | "LaMarcus Aldridge" | "Tim Duncan" | + | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan" | "Manu Ginobili" | + | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan" | "Tony Parker" | + | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tony Parker" | + | "Tony Parker" | "LaMarcus Aldridge" | "Manu Ginobili" | "Tim Duncan" | + | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tim Duncan" | + When executing query: + """ + $a = GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst; + GO 2 STEPS FROM $a.src OVER like YIELD $a.src, $a.dst, like._src, like._dst + """ + Then the result should be, in any order, with relax comparison: + | $a.src | $a.dst | like._src | like._dst | + | "Tony Parker" | "Tim Duncan" | "Tim Duncan" | "Manu Ginobili" | + | "Tony Parker" | "Tim Duncan" | "Tim Duncan" | "Tony Parker" | + | "Tony Parker" | "Tim Duncan" | "LaMarcus Aldridge" | "Tony Parker" | + | "Tony Parker" | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tony Parker" | "Tim Duncan" | "LaMarcus Aldridge" | "Tim Duncan" | + | "Tony Parker" | "Manu Ginobili" | "Tim Duncan" | "Manu Ginobili" | + | "Tony Parker" | "Manu Ginobili" | "Tim Duncan" | "Tony Parker" | + | "Tony Parker" | "Manu Ginobili" | "LaMarcus Aldridge" | "Tony Parker" | + | "Tony Parker" | "Manu Ginobili" | "Manu Ginobili" | "Tim Duncan" | + | "Tony Parker" | "Manu Ginobili" | "LaMarcus Aldridge" | "Tim Duncan" | + | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan" | "Manu Ginobili" | + | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan" | "Tony Parker" | + | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tony Parker" | + | "Tony Parker" | "LaMarcus Aldridge" | "Manu Ginobili" | "Tim Duncan" | + | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tim Duncan" | diff --git a/tests/tck/features/go/go.intVid.feature b/tests/tck/features/go/go.intVid.feature new file mode 100644 index 0000000000000000000000000000000000000000..e4aa5d48e2fabd1762d978543bfd3e7ee1d28c0a --- /dev/null +++ b/tests/tck/features/go/go.intVid.feature @@ -0,0 +1,1582 @@ +@skip +Feature: IntegerVid Go Sentence + + Background: Prepare space + Given a graph with space named "nba_int_vid" + + Scenario: Integer Vid one step + When executing query: + """ + GO FROM hash("Tim Duncan") OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + When executing query: + """ + GO FROM hash("Tim Duncan"), hash("Tim Duncan") OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + When executing query: + """ + YIELD hash("Tim Duncan") as vid | GO FROM $-.vid OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + When executing query: + """ + GO FROM hash("Boris Diaw") OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + | "Boris Diaw" | 2008 | 2012 | "Hornets" | + | "Boris Diaw" | 2012 | 2016 | "Spurs" | + | "Boris Diaw" | 2016 | 2017 | "Jazz" | + When executing query: + """ + GO FROM hash("Rajon Rondo") OVER serve WHERE serve.start_year >= 2013 AND serve.end_year <= 2018 + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Rajon Rondo" | 2014 | 2015 | "Mavericks" | + | "Rajon Rondo" | 2015 | 2016 | "Kings" | + | "Rajon Rondo" | 2016 | 2017 | "Bulls" | + | "Rajon Rondo" | 2017 | 2018 | "Pelicans" | + When executing query: + """ + GO FROM hash("Boris Diaw") OVER like YIELD like._dst as id + | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + | hash("Trail Blazers") | + When executing query: + """ + GO FROM hash('Thunders') OVER serve REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Russell Westbrook") | + | hash("Kevin Durant") | + | hash("James Harden") | + | hash("Carmelo Anthony") | + | hash("Paul George") | + | hash("Ray Allen") | + When executing query: + """ + GO FROM hash("Boris Diaw") OVER like YIELD like._dst as id + |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + | hash("Trail Blazers") | + When executing query: + """ + GO FROM hash("No Exist Vertex Id") OVER like YIELD like._dst as id + |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO FROM hash("Boris Diaw") OVER like, serve YIELD like._dst as id + |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + | hash("Trail Blazers") | + + Scenario: Integer Vid assignment simple + When executing query: + """ + $var = GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as id; GO FROM $var.id OVER like + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tracy McGrady") | + | hash("LaMarcus Aldridge") | + + Scenario: Integer Vid assignment pipe + When executing query: + """ + $var = (GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as id | GO FROM $-.id OVER like YIELD like._dst as id); + GO FROM $var.id OVER like + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Kobe Bryant") | + | hash("Grant Hill") | + | hash("Rudy Gay") | + | hash("Tony Parker") | + | hash("Tim Duncan") | + + Scenario: Integer Vid pipe only yield input prop + When executing query: + """ + GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD $-.vid as id + """ + Then the result should be, in any order, with relax comparison: + | id | + | hash("Kobe Bryant") | + | hash("Grant Hill") | + | hash("Rudy Gay") | + + Scenario: Integer Vid pipe only yield constant + When executing query: + """ + GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD 3 + """ + Then the result should be, in any order, with relax comparison: + | 3 | + | 3 | + | 3 | + | 3 | + + Scenario: Integer Vid assignment empty result + When executing query: + """ + $var = GO FROM -1 OVER like YIELD like._dst as id; GO FROM $var.id OVER like + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + + Scenario: Integer Vid variable undefined + When executing query: + """ + GO FROM $var OVER like + """ + Then a SyntaxError should be raised at runtime: syntax error near `OVER' + + Scenario: Integer Vid distinct + When executing query: + """ + GO FROM hash("Nobody") OVER serve YIELD DISTINCT $^.player.name as name, $$.team.name as name + """ + Then the result should be, in any order, with relax comparison: + | name | name | + When executing query: + """ + GO FROM hash("Boris Diaw") OVER like YIELD like._dst as id + | GO FROM $-.id OVER like YIELD like._dst as id + | GO FROM $-.id OVER serve + YIELD DISTINCT serve._dst, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | $$.team.name | + | hash("Spurs") | "Spurs" | + | hash("Hornets") | "Hornets" | + | hash("Trail Blazers") | "Trail Blazers" | + When executing query: + """ + GO 2 STEPS FROM hash("Tony Parker") OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tim Duncan") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + + Scenario: Integer Vid vertex noexist + When executing query: + """ + GO FROM hash("NON EXIST VERTEX ID") OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO FROM hash("NON EXIST VERTEX ID") OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + When executing query: + """ + GO FROM hash("NON EXIST VERTEX ID") OVER serve YIELD DISTINCT $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + + Scenario: Integer Vid empty input + When executing query: + """ + GO FROM hash("NON EXIST VERTEX ID") OVER like YIELD like._dst as id + | GO FROM $-.id OVER like YIELD like._dst as id + | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO FROM hash("NON EXIST VERTEX ID") OVER serve YIELD serve._dst as id, serve.start_year as start + | YIELD $-.id as id WHERE $-.start > 20000 + | Go FROM $-.id over serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + + Scenario: Integer Vid multi edges over all + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER * REVERSELY YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | hash("James Harden") | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("Paul George") | + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER * REVERSELY YIELD serve._src, like._src + """ + Then the result should be, in any order, with relax comparison: + | serve._src | like._src | + | EMPTY | hash("Russell Westbrook") | + | EMPTY | hash("Russell Westbrook") | + | EMPTY | hash("Russell Westbrook") | + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER * REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | like._dst | serve._dst | teammate._dst | + | hash("James Harden") | EMPTY | EMPTY | + | hash("Dejounte Murray") | EMPTY | EMPTY | + | hash("Paul George") | EMPTY | EMPTY | + When executing query: + """ + GO FROM hash("Dirk Nowitzki") OVER * YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | hash("Mavericks") | EMPTY | + | EMPTY | hash("Steve Nash") | + | EMPTY | hash("Jason Kidd") | + | EMPTY | hash("Dwyane Wade") | + When executing query: + """ + GO FROM hash("Paul Gasol") OVER * + """ + Then the result should be, in any order, with relax comparison: + | like._dst | serve._dst | teammate._dst | + | EMPTY | hash("Grizzlies") | EMPTY | + | EMPTY | hash("Lakers") | EMPTY | + | EMPTY | hash("Bulls") | EMPTY | + | EMPTY | hash("Spurs") | EMPTY | + | EMPTY | hash("Bucks") | EMPTY | + | hash("Kobe Bryant") | EMPTY | EMPTY | + | hash("Marc Gasol") | EMPTY | EMPTY | + When executing query: + """ + GO FROM hash("Manu Ginobili") OVER * REVERSELY YIELD like.likeness, teammate.start_year, serve.start_year, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like.likeness | teammate.start_year | serve.start_year | $$.player.name | + | 95 | EMPTY | EMPTY | "Tim Duncan" | + | 95 | EMPTY | EMPTY | "Tony Parker" | + | 90 | EMPTY | EMPTY | "Tiago Splitter" | + | 99 | EMPTY | EMPTY | "Dejounte Murray" | + | EMPTY | 2002 | EMPTY | "Tim Duncan" | + | EMPTY | 2002 | EMPTY | "Tony Parker" | + When executing query: + """ + GO FROM hash("LaMarcus Aldridge") OVER * YIELD $$.team.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.team.name | $$.player.name | + | "Trail Blazers" | EMPTY | + | EMPTY | "Tim Duncan" | + | EMPTY | "Tony Parker" | + | "Spurs" | EMPTY | + When executing query: + """ + GO FROM hash("Boris Diaw") OVER * YIELD like._dst as id + | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve ) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + | hash("Trail Blazers") | + + @skip + Scenario: Integer Vid edge type + When executing query: + """ + YIELD serve.start_year, like.likeness, serve._type, like._type + """ + Then the result should be, in any order, with relax comparison: + | serve.start_year | like.likeness | serve._type | like._type | + | 2008 | EMPTY | 6 | EMPTY | + | EMPTY | 90 | EMPTY | 5 | + | EMPTY | 90 | EMPTY | 5 | + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY + YIELD serve._dst, like._dst, serve._type, like._type + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve._type | like._type | + | EMPTY | hash("James Harden") | EMPTY | -5 | + | EMPTY | hash("Dejounte Murray") | EMPTY | -5 | + | EMPTY | hash("Paul George") | EMPTY | -5 | + + Scenario: Integer Vid multi edges + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER serve, like YIELD serve.start_year, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | serve.start_year | like.likeness | + | 2008 | EMPTY | + | EMPTY | 90 | + | EMPTY | 90 | + When executing query: + """ + GO FROM hash("Shaquile O\'Neal") OVER serve, like + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | hash("Magic") | EMPTY | + | hash("Lakers") | EMPTY | + | hash("Heat") | EMPTY | + | hash("Suns") | EMPTY | + | hash("Cavaliers") | EMPTY | + | hash("Celtics") | EMPTY | + | EMPTY | hash("JaVale McGee") | + | EMPTY | hash("Tim Duncan") | + When executing query: + """ + GO FROM hash('Russell Westbrook') OVER serve, like + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | hash("Thunders") | EMPTY | + | EMPTY | hash("Paul George") | + | EMPTY | hash("James Harden") | + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY + YIELD serve._dst, like._dst, serve.start_year, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve.start_year | like.likeness | + | EMPTY | hash("James Harden") | EMPTY | 80 | + | EMPTY | hash("Dejounte Murray") | EMPTY | 99 | + | EMPTY | hash("Paul George") | EMPTY | 95 | + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY YIELD serve._src, like._src + """ + Then the result should be, in any order, with relax comparison: + | serve._src | like._src | + | EMPTY | hash("Russell Westbrook") | + | EMPTY | hash("Russell Westbrook") | + | EMPTY | hash("Russell Westbrook") | + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | hash("James Harden") | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("Paul George") | + When executing query: + """ + GO FROM hash("Manu Ginobili") OVER like, teammate REVERSELY YIELD like.likeness, teammate.start_year, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like.likeness | teammate.start_year | $$.player.name | + | 95 | EMPTY | "Tim Duncan" | + | 95 | EMPTY | "Tony Parker" | + | 90 | EMPTY | "Tiago Splitter" | + | 99 | EMPTY | "Dejounte Murray" | + | EMPTY | 2002 | "Tim Duncan" | + | EMPTY | 2002 | "Tony Parker" | + + Scenario: Integer Vid multi edges with filter + When executing query: + """ + GO FROM hash("Russell Westbrook") OVER serve, like WHERE serve.start_year > 2000 + YIELD serve.start_year, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | serve.start_year | like.likeness | + | 2008 | EMPTY | + When executing query: + """ + GO FROM hash("Manu Ginobili") OVER like, teammate REVERSELY WHERE like.likeness > 90 + YIELD like.likeness, teammate.start_year, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like.likeness | teammate.start_year | $$.player.name | + | 95 | EMPTY | "Tim Duncan" | + | 95 | EMPTY | "Tony Parker" | + | 99 | EMPTY | "Dejounte Murray" | + When executing query: + """ + GO FROM hash("Manu Ginobili") OVER * WHERE $$.player.age > 30 or $$.team.name not starts with "Rockets" + YIELD DISTINCT $$.player.age, $$.player.name, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.age | $$.player.name | $$.team.name | + | EMPTY | EMPTY | "Spurs" | + | 42 | "Tim Duncan" | EMPTY | + | 36 | "Tony Parker" | EMPTY | + When executing query: + """ + GO FROM hash("Manu Ginobili") OVER like, teammate REVERSELY WHERE $$.player.age > 30 and $$.player.age < 40 + YIELD DISTINCT $$.player.age, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.age | $$.player.name | + | 34 | "Tiago Splitter" | + | 36 | "Tony Parker" | + + Scenario: Integer Vid reference pipe in yield and where + When executing query: + """ + GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id + | GO FROM $-.id OVER like YIELD $-.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $-.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + When executing query: + """ + GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id + | GO FROM $-.id OVER like WHERE $-.name != $$.player.name YIELD $-.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $-.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + + @skip + Scenario: Integer Vid all prop(reson = $-.* over * $var.* not implement) + When executing query: + """ + GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id + | GO FROM $-.id OVER like YIELD $-.*, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $-.* | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + When executing query: + """ + $var = GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id; + GO FROM $var.id OVER like YIELD $var.*, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $var.* | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + + Scenario: Integer Vid reference variable in yield and where + When executing query: + """ + $var = GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id; + GO FROM $var.id OVER like YIELD $var.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $var.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan" | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Tim Duncan" | "Tony Parker" | "Tim Duncan" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "Chris Paul" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "Chris Paul" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + When executing query: + """ + $var = GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id; + GO FROM $var.id OVER like WHERE $var.name != $$.player.name YIELD $var.name, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $var.name | $^.player.name | $$.player.name | + | "Tim Duncan" | "Tony Parker" | "LaMarcus Aldridge" | + | "Tim Duncan" | "Tony Parker" | "Manu Ginobili" | + | "Chris Paul" | "LeBron James" | "Ray Allen" | + | "Chris Paul" | "Carmelo Anthony" | "LeBron James" | + | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade" | + | "Chris Paul" | "Dwyane Wade" | "LeBron James" | + | "Chris Paul" | "Dwyane Wade" | "Carmelo Anthony" | + + Scenario: Integer Vid no exist prop + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve YIELD $^.player.test + """ + Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'. + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve yield $^.player.test + """ + Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'. + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve YIELD serve.test + """ + Then a SemanticError should be raised at runtime: `serve.test', not found the property `test'. + + @skip + Scenario: Integer Vid udf call (reason = "not support udf_is_in now") + When executing query: + """ + GO FROM hash('Boris Diaw') OVER serve WHERE udf_is_in($$.team.name, 'Hawks', 'Suns') + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS id + | GO FROM $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Hornets") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS id + | GO FROM $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) AND 1 == 1 + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Hornets") | + + @skip + Scenario: Integer Vid return test (reason = "return not implement") + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE $A.dst == 123; + RETURN $rA IF $rA IS NOT NULL; + GO FROM $A.dst OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $rA IF $rA IS NOT NULL; + GO FROM $A.dst OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dstA; + $rA = YIELD $A.* WHERE $A.dstA == 123; + RETURN $rA IF $rA IS NOT NULL; + $B = GO FROM $A.dstA OVER like YIELD like._dst AS dstB; + $rB = YIELD $B.* WHERE $B.dstB == 456; + RETURN $rB IF $rB IS NOT NULL; + GO FROM $B.dstB OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Trail Blazers") | + | hash("Spurs") | + | hash("Spurs") | + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE $A.dst == 123; + RETURN $rA IF $rA IS NOT NULL; + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $rA IF $rA IS NOT NULL; + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $B IF $B IS NOT NULL + """ + Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a' + When executing query: + """ + $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst; + $rA = YIELD $A.* WHERE 1 == 1; + RETURN $B IF $A IS NOT NULL + """ + Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a' + When executing query: + """ + RETURN $rA IF $rA IS NOT NULL; + """ + Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a' + + Scenario: Integer Vid reverse one step + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like REVERSELY YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Boris Diaw") | + | hash("Tiago Splitter") | + | hash("Dejounte Murray") | + | hash("Shaquile O'Neal") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like REVERSELY YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like REVERSELY WHERE $$.player.age < 35 YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Tiago Splitter" | + | "Dejounte Murray" | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER * REVERSELY YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Boris Diaw") | + | hash(("Tiago Splitter") | + | hash("Dejounte Murray") | + | hash("Shaquile O'Neal") | + | EMPTY | + | EMPTY | + + Scenario: Integer Vid only id n steps + When executing query: + """ + GO 2 STEPS FROM hash('Tony Parker') OVER like YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tim Duncan") | + | hash("Tim Duncan") | + | hash("Tony Parker") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + When executing query: + """ + GO 3 STEPS FROM hash('Tony Parker') OVER like YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Manu Ginobili") | + | hash("Tim Duncan") | + | hash("Tim Duncan") | + | hash("LaMarcus Aldridge") | + When executing query: + """ + GO 1 STEPS FROM hash('Tony Parker') OVER like YIELD like._dst AS id + | GO 2 STEPS FROM $-.id OVER like YIELD like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("LaMarcus Aldridge") | + | hash("LaMarcus Aldridge") | + | hash("Manu Ginobili") | + | hash("Manu Ginobili") | + | hash("Tim Duncan") | + | hash("Tim Duncan") | + | hash("Tim Duncan") | + | hash("Manu Ginobili") | + | hash("Manu Ginobili") | + | hash("Tony Parker") | + | hash("Tony Parker") | + + Scenario: Integer Vid reverse two steps + When executing query: + """ + GO 2 STEPS FROM hash('Kobe Bryant') OVER like REVERSELY YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "Marc Gasol" | + | "Vince Carter" | + | "Yao Ming" | + | "Grant Hill" | + When executing query: + """ + GO FROM hash('Manu Ginobili') OVER * REVERSELY YIELD like._dst AS id + | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + | hash("Spurs") | + | hash("Hawks") | + | hash("76ers") | + | hash("Spurs") | + + Scenario: Integer Vid reverse with pipe + When executing query: + """ + GO FROM hash('LeBron James') OVER serve YIELD serve._dst AS id + | GO FROM $-.id OVER serve REVERSELY YIELD $^.team.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $^.team.name | $$.player.name | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "LeBron James" | + | "Cavaliers" | "LeBron James" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Cavaliers" | "LeBron James" | + | "Cavaliers" | "LeBron James" | + | "Heat" | "Amar'e Stoudemire" | + | "Heat" | "Dwyane Wade" | + | "Heat" | "LeBron James" | + | "Heat" | "Ray Allen" | + | "Heat" | "Shaquile O'Neal" | + | "Heat" | "Dwyane Wade" | + | "Lakers" | "Dwight Howard" | + | "Lakers" | "JaVale McGee" | + | "Lakers" | "Kobe Bryant" | + | "Lakers" | "LeBron James" | + | "Lakers" | "Paul Gasol" | + | "Lakers" | "Rajon Rondo" | + | "Lakers" | "Shaquile O'Neal" | + | "Lakers" | "Steve Nash" | + When executing query: + """ + GO FROM hash('LeBron James') OVER serve YIELD serve._dst AS id + | GO FROM $-.id OVER serve REVERSELY WHERE $$.player.name != 'LeBron James' + YIELD $^.team.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $^.team.name | $$.player.name | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Danny Green" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Dwyane Wade" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "Kyrie Irving" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Cavaliers" | "Shaquile O'Neal" | + | "Heat" | "Amar'e Stoudemire" | + | "Heat" | "Dwyane Wade" | + | "Heat" | "Ray Allen" | + | "Heat" | "Shaquile O'Neal" | + | "Heat" | "Dwyane Wade" | + | "Lakers" | "Dwight Howard" | + | "Lakers" | "JaVale McGee" | + | "Lakers" | "Kobe Bryant" | + | "Lakers" | "Paul Gasol" | + | "Lakers" | "Rajon Rondo" | + | "Lakers" | "Shaquile O'Neal" | + | "Lakers" | "Steve Nash" | + When executing query: + """ + GO FROM hash('Manu Ginobili') OVER like REVERSELY YIELD like._dst AS id + | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Spurs") | + | hash("Hornets") | + | hash("Hawks") | + | hash("76ers") | + + Scenario: Integer Vid bidirect + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve bidirect + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like bidirect + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Boris Diaw") | + | hash("Tiago Splitter") | + | hash("Dejounte Murray") | + | hash("Shaquile O'Neal") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve, like bidirect + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | hash("Spurs") | EMPTY | + | EMPTY | hash("Tony Parker") | + | EMPTY | hash("Manu Ginobili") | + | EMPTY | hash("Tony Parker") | + | EMPTY | hash("Manu Ginobili") | + | EMPTY | hash("LaMarcus Aldridge") | + | EMPTY | hash("Marco Belinelli") | + | EMPTY | hash("Danny Green") | + | EMPTY | hash("Aron Baynes") | + | EMPTY | hash("Boris Diaw") | + | EMPTY | hash("Tiago Splitter") | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("Shaquile O'Neal") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve bidirect YIELD $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $$.team.name | + | "Spurs" | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like bidirect YIELD $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $$.player.name | + | "Tony Parker" | + | "Manu Ginobili" | + | "Tony Parker" | + | "Manu Ginobili" | + | "LaMarcus Aldridge" | + | "Marco Belinelli" | + | "Danny Green" | + | "Aron Baynes" | + | "Boris Diaw" | + | "Tiago Splitter" | + | "Dejounte Murray" | + | "Shaquile O'Neal" | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like bidirect WHERE like.likeness > 90 + YIELD $^.player.name, like._dst, $$.player.name, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | like._dst | $$.player.name | like.likeness | + | "Tim Duncan" | hash("Tony Parker") | "Tony Parker" | 95 | + | "Tim Duncan" | hash("Manu Ginobili") | "Manu Ginobili" | 95 | + | "Tim Duncan" | hash("Tony Parker") | "Tony Parker" | 95 | + | "Tim Duncan" | hash("Dejounte Murray") | "Dejounte Murray" | 99 | + + Scenario: Integer Vid bidirect_over_all + When executing query: + """ + GO FROM hash('Tim Duncan') OVER * bidirect YIELD $^.player.name, serve._dst, $$.team.name, like._dst, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve._dst | $$.team.name | like._dst | $$.player.name | + | "Tim Duncan" | hash("Spurs") | "Spurs" | EMPTY | EMPTY | + | "Tim Duncan" | EMPTY | EMPTY | hash("Tony Parker") | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Manu Ginobili") | "Manu Ginobili" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Tony Parker") | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Manu Ginobili") | "Manu Ginobili" | + | "Tim Duncan" | EMPTY | EMPTY | hash("LaMarcus Aldridge") | "LaMarcus Aldridge" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Marco Belinelli") | "Marco Belinelli" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Danny Green") | "Danny Green" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Aron Baynes") | "Aron Baynes" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Boris Diaw") | "Boris Diaw" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Tiago Splitter") | "Tiago Splitter" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Dejounte Murray") | "Dejounte Murray" | + | "Tim Duncan" | EMPTY | EMPTY | hash("Shaquile O'Neal") | "Shaquile O'Neal" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Manu Ginobili" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Danny Green" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "LaMarcus Aldridge" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Tony Parker" | + | "Tim Duncan" | EMPTY | EMPTY | EMPTY | "Manu Ginobili" | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER * bidirect + """ + Then the result should be, in any order, with relax comparison: + | like._dst | serve._dst | teammate._dst | + | EMPTY | hash("Spurs") | EMPTY | + | hash("Tony Parker") | EMPTY | EMPTY | + | hash("Manu Ginobili") | EMPTY | EMPTY | + | hash("Tony Parker") | EMPTY | EMPTY | + | hash("Manu Ginobili") | EMPTY | EMPTY | + | hash("LaMarcus Aldridge") | EMPTY | EMPTY | + | hash("Marco Belinelli") | EMPTY | EMPTY | + | hash("Danny Green") | EMPTY | EMPTY | + | hash("Aron Baynes") | EMPTY | EMPTY | + | hash("Boris Diaw") | EMPTY | EMPTY | + | hash("Tiago Splitter") | EMPTY | EMPTY | + | hash("Dejounte Murray") | EMPTY | EMPTY | + | hash("Shaquile O'Neal") | EMPTY | EMPTY | + | EMPTY | EMPTY | hash("Tony Parker") | + | EMPTY | EMPTY | hash("Manu Ginobili") | + | EMPTY | EMPTY | hash("LaMarcus Aldridge") | + | EMPTY | EMPTY | hash("Danny Green") | + | EMPTY | EMPTY | hash("Tony Parker") | + | EMPTY | EMPTY | hash("Manu Ginobili") | + + Scenario: Integer Vid duplicate column name + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve YIELD serve._dst, serve._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | serve._dst | + | hash("Spurs") | hash("Spurs") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS id, like.likeness AS id + | GO FROM $-.id OVER serve + """ + Then a SemanticError should be raised at runtime: Duplicate Column Name : `id' + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like, serve YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id + | GO FROM $-.id OVER * + """ + Then a SemanticError should be raised at runtime: Duplicate Column Name : `year' + When executing query: + """ + $a = GO FROM hash('Tim Duncan') OVER * + YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id; + | GO FROM $-.id OVER serve + """ + Then a SyntaxError should be raised at runtime: syntax error near `| GO FRO' + + Scenario: Integer Vid contain + When executing query: + """ + GO FROM hash('Boris Diaw') OVER serve WHERE $$.team.name CONTAINS "Haw" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + When executing query: + """ + GO FROM hash('Boris Diaw') OVER serve WHERE (string)serve.start_year CONTAINS "05" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + When executing query: + """ + GO FROM hash('Boris Diaw') OVER serve WHERE $^.player.name CONTAINS "Boris" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + | "Boris Diaw" | 2003 | 2005 | "Hawks" | + | "Boris Diaw" | 2005 | 2008 | "Suns" | + | "Boris Diaw" | 2008 | 2012 | "Hornets" | + | "Boris Diaw" | 2012 | 2016 | "Spurs" | + | "Boris Diaw" | 2016 | 2017 | "Jazz" | + When executing query: + """ + GO FROM hash('Boris Diaw') OVER serve WHERE !($^.player.name CONTAINS "Boris") + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + When executing query: + """ + GO FROM hash('Boris Diaw') OVER serve WHERE "Leo" CONTAINS "Boris" + YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name + """ + Then the result should be, in any order, with relax comparison: + | $^.player.name | serve.start_year | serve.end_year | $$.team.name | + + Scenario: Integer Vid intermediate data + When executing query: + """ + GO 0 TO 0 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Tim Duncan") | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Tim Duncan") | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like._dst | like.likeness | $$.player.name | + | hash("Manu Ginobili") | 95 | "Manu Ginobili" | + | hash("LaMarcus Aldridge") | 90 | "LaMarcus Aldridge" | + | hash("Tim Duncan") | 95 | "Tim Duncan" | + | hash("Tony Parker") | 95 | "Tony Parker" | + | hash("Tony Parker") | 75 | "Tony Parker" | + | hash("Tim Duncan") | 75 | "Tim Duncan" | + | hash("Tim Duncan") | 90 | "Tim Duncan" | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | like._dst | like.likeness | $$.player.name | + | hash("Manu Ginobili") | 95 | "Manu Ginobili" | + | hash("LaMarcus Aldridge") | 90 | "LaMarcus Aldridge" | + | hash("Tim Duncan") | 95 | "Tim Duncan" | + | hash("Tony Parker") | 95 | "Tony Parker" | + | hash("Tony Parker") | 75 | "Tony Parker" | + | hash("Tim Duncan") | 75 | "Tim Duncan" | + | hash("Tim Duncan") | 90 | "Tim Duncan" | + When executing query: + """ + GO 0 TO 3 STEPS FROM hash('Tim Duncan') OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Spurs") | + When executing query: + """ + GO 2 TO 3 STEPS FROM hash('Tim Duncan') OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like REVERSELY YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tim Duncan") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Boris Diaw") | + | hash("Dejounte Murray") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Tiago Splitter") | + | hash("Shaquile O'Neal") | + | hash("Rudy Gay") | + | hash("Damian Lillard") | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like REVERSELY YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tim Duncan") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Boris Diaw") | + | hash("Dejounte Murray") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Tiago Splitter") | + | hash("Shaquile O'Neal") | + | hash("Rudy Gay") | + | hash("Damian Lillard") | + When executing query: + """ + GO 2 TO 2 STEPS FROM hash('Tony Parker') OVER like REVERSELY YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Boris Diaw") | + | hash("Dejounte Murray") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Tiago Splitter") | + | hash("Shaquile O'Neal") | + | hash("Rudy Gay") | + | hash("Damian Lillard") | + When executing query: + """ + GO 1 TO 3 STEPS FROM hash('Spurs') OVER serve REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Tim Duncan") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Rudy Gay") | + | hash("Marco Belinelli") | + | hash("Danny Green") | + | hash("Kyle Anderson") | + | hash("Aron Baynes") | + | hash("Boris Diaw") | + | hash("Tiago Splitter") | + | hash("Cory Joseph") | + | hash("David West") | + | hash("Jonathon Simmons") | + | hash("Dejounte Murray") | + | hash("Tracy McGrady") | + | hash("Paul Gasol") | + | hash("Marco Belinelli") | + When executing query: + """ + GO 0 TO 3 STEPS FROM hash('Spurs') OVER serve REVERSELY + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + | hash("Tim Duncan") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("LaMarcus Aldridge") | + | hash("Rudy Gay") | + | hash("Marco Belinelli") | + | hash("Danny Green") | + | hash("Kyle Anderson") | + | hash("Aron Baynes") | + | hash("Boris Diaw") | + | hash("Tiago Splitter") | + | hash("Cory Joseph") | + | hash("David West") | + | hash("Jonathon Simmons") | + | hash("Dejounte Murray") | + | hash("Tracy McGrady") | + | hash("Paul Gasol") | + | hash("Marco Belinelli") | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like BIDIRECT YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tim Duncan") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Boris Diaw") | + | hash("Dejounte Murray") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Tiago Splitter") | + | hash("Shaquile O'Neal") | + | hash("Rudy Gay") | + | hash("Damian Lillard") | + | hash("LeBron James") | + | hash("Russell Westbrook") | + | hash("Chris Paul") | + | hash("Kyle Anderson") | + | hash("Kevin Durant") | + | hash("James Harden") | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like BIDIRECT YIELD DISTINCT like._dst + """ + Then the result should be, in any order, with relax comparison: + | like._dst | + | hash("Tim Duncan") | + | hash("LaMarcus Aldridge") | + | hash("Marco Belinelli") | + | hash("Boris Diaw") | + | hash("Dejounte Murray") | + | hash("Tony Parker") | + | hash("Manu Ginobili") | + | hash("Danny Green") | + | hash("Aron Baynes") | + | hash("Tiago Splitter") | + | hash("Shaquile O'Neal") | + | hash("Rudy Gay") | + | hash("Damian Lillard") | + | hash("LeBron James") | + | hash("Russell Westbrook") | + | hash("Chris Paul") | + | hash("Kyle Anderson") | + | hash("Kevin Durant") | + | hash("James Harden") | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Russell Westbrook') OVER * YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | hash("Thunders") | EMPTY | + | EMPTY | hash("Paul George") | + | EMPTY | hash("James Harden") | + | hash("Pacers") | EMPTY | + | hash("Thunders") | EMPTY | + | EMPTY | hash("Russell Westbrook") | + | hash("Thunders") | EMPTY | + | hash("Rockets") | EMPTY | + | EMPTY | hash("Russell Westbrook") | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Russell Westbrook') OVER * YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | hash("Thunders") | EMPTY | + | EMPTY | hash("Paul George") | + | EMPTY | hash("James Harden") | + | hash("Pacers") | EMPTY | + | hash("Thunders") | EMPTY | + | EMPTY | hash("Russell Westbrook") | + | hash("Thunders") | EMPTY | + | hash("Rockets") | EMPTY | + | EMPTY | hash("Russell Westbrook") | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Russell Westbrook') OVER * + YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve.start_year | like.likeness | $$.player.name | + | hash("Thunders") | EMPTY | 2008 | EMPTY | EMPTY | + | EMPTY | hash("Paul George") | EMPTY | 90 | "Paul George" | + | EMPTY | hash("James Harden") | EMPTY | 90 | "James Harden" | + | hash("Pacers") | EMPTY | 2010 | EMPTY | EMPTY | + | hash("Thunders") | EMPTY | 2017 | EMPTY | EMPTY | + | EMPTY | hash("Russell Westbrook") | EMPTY | 95 | "Russell Westbrook" | + | hash("Thunders") | EMPTY | 2009 | EMPTY | EMPTY | + | hash("Rockets") | EMPTY | 2012 | EMPTY | EMPTY | + | EMPTY | hash("Russell Westbrook") | EMPTY | 80 | "Russell Westbrook" | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Russell Westbrook') OVER * + YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | serve.start_year | like.likeness | $$.player.name | + | hash("Thunders") | EMPTY | 2008 | EMPTY | EMPTY | + | EMPTY | hash("Paul George") | EMPTY | 90 | "Paul George" | + | EMPTY | hash("James Harden") | EMPTY | 90 | "James Harden" | + | hash("Pacers") | EMPTY | 2010 | EMPTY | EMPTY | + | hash("Thunders") | EMPTY | 2017 | EMPTY | EMPTY | + | EMPTY | hash("Russell Westbrook") | EMPTY | 95 | "Russell Westbrook" | + | hash("Thunders") | EMPTY | 2009 | EMPTY | EMPTY | + | hash("Rockets") | EMPTY | 2012 | EMPTY | EMPTY | + | EMPTY | hash("Russell Westbrook") | EMPTY | 80 | "Russell Westbrook" | + When executing query: + """ + GO 1 TO 2 STEPS FROM hash('Russell Westbrook') OVER * REVERSELY YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("James Harden") | + | EMPTY | hash("Paul George") | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("Russell Westbrook") | + | EMPTY | hash("Luka Doncic") | + | EMPTY | hash("Russell Westbrook") | + When executing query: + """ + GO 0 TO 2 STEPS FROM hash('Russell Westbrook') OVER * REVERSELY YIELD serve._dst, like._dst + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | like._dst | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("James Harden") | + | EMPTY | hash("Paul George") | + | EMPTY | hash("Dejounte Murray") | + | EMPTY | hash("Russell Westbrook") | + | EMPTY | hash("Luka Doncic") | + | EMPTY | hash("Russell Westbrook") | + + Scenario: Integer Vid error message + When executing query: + """ + GO FROM hash('Tim Duncan') OVER serve YIELD $$.player.name as name + """ + Then the result should be, in any order, with relax comparison: + | name | + | EMPTY | + + Scenario: Integer Vid zero step + When executing query: + """ + GO 0 STEPS FROM hash('Tim Duncan') OVER serve BIDIRECT + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO 0 STEPS FROM hash('Tim Duncan') OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + When executing query: + """ + GO 0 STEPS FROM hash('Tim Duncan') OVER like YIELD like._dst as id | GO FROM $-.id OVER serve + """ + Then the result should be, in any order, with relax comparison: + | serve._dst | + + Scenario: Integer Vid go cover input + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst | GO FROM $-.src OVER like + YIELD $-.src as src, like._dst as dst, $^.player.name, $$.player.name + """ + Then the result should be, in any order, with relax comparison: + | src | dst | $^.player.name | $$.player.name | + | hash("Tim Duncan") | hash("Tony Parker") | "Tim Duncan" | "Tony Parker" | + | hash("Tim Duncan") | hash("Manu Ginobili") | "Tim Duncan" | "Manu Ginobili" | + | hash("Tim Duncan") | hash("Tony Parker") | "Tim Duncan" | "Tony Parker" | + | hash("Tim Duncan") | hash("Manu Ginobili") | "Tim Duncan" | "Manu Ginobili" | + When executing query: + """ + $a = GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst; + GO FROM $a.src OVER like YIELD $a.src as src, like._dst as dst + """ + Then the result should be, in any order, with relax comparison: + | src | dst | + | hash("Tim Duncan") | hash("Tony Parker") | + | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Tim Duncan") | hash("Tony Parker") | + | hash("Tim Duncan") | hash("Manu Ginobili") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst + | GO 1 TO 2 STEPS FROM $-.src OVER like YIELD $-.src as src, like._dst as dst + """ + Then the result should be, in any order, with relax comparison: + | src | dst | + | hash("Tim Duncan") | hash("Tony Parker") | + | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Tim Duncan") | hash("Tony Parker") | + | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Tim Duncan") | hash("Tim Duncan") | + | hash("Tim Duncan") | hash("Tim Duncan") | + | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Tim Duncan") | hash("LaMarcus Aldridge") | + | hash("Tim Duncan") | hash("LaMarcus Aldridge") | + | hash("Tim Duncan") | hash("Tim Duncan") | + | hash("Tim Duncan") | hash("Tim Duncan") | + When executing query: + """ + GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst + | GO 1 TO 2 STEPS FROM $-.src OVER like + YIELD $-.src as src, $-.dst, like._dst as dst, like.likeness + """ + Then the result should be, in any order, with relax comparison: + | src | $-.dst | dst | like.likeness | + | hash("Tim Duncan") | hash("Tony Parker") | hash("Tony Parker") | 95 | + | hash("Tim Duncan") | hash("Tony Parker") | hash("Manu Ginobili") | 95 | + | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Tony Parker") | 95 | + | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Manu Ginobili") | 95 | + | hash("Tim Duncan") | hash("Tony Parker") | hash("Tim Duncan") | 95 | + | hash("Tim Duncan") | hash("Tony Parker") | hash("Manu Ginobili") | 95 | + | hash("Tim Duncan") | hash("Tony Parker") | hash("LaMarcus Aldridge") | 90 | + | hash("Tim Duncan") | hash("Tony Parker") | hash("Tim Duncan") | 90 | + | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Tim Duncan") | 95 | + | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Manu Ginobili") | 95 | + | hash("Tim Duncan") | hash("Manu Ginobili") | hash("LaMarcus Aldridge") | 90 | + | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Tim Duncan") | 90 | + When executing query: + """ + GO FROM hash('Danny Green') OVER like YIELD like._src AS src, like._dst AS dst + | GO FROM $-.dst OVER teammate YIELD $-.src AS src, $-.dst, teammate._dst AS dst + """ + Then the result should be, in any order, with relax comparison: + | src | $-.dst | dst | + | hash("Danny Green") | hash("Tim Duncan") | hash("Tony Parker") | + | hash("Danny Green") | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Danny Green") | hash("Tim Duncan") | hash("LaMarcus Aldridge") | + | hash("Danny Green") | hash("Tim Duncan") | hash("Danny Green") | + When executing query: + """ + $a = GO FROM hash('Danny Green') OVER like YIELD like._src AS src, like._dst AS dst; + GO FROM $a.dst OVER teammate YIELD $a.src AS src, $a.dst, teammate._dst AS dst + """ + Then the result should be, in any order, with relax comparison: + | src | $a.dst | dst | + | hash("Danny Green") | hash("Tim Duncan") | hash("Tony Parker") | + | hash("Danny Green") | hash("Tim Duncan") | hash("Manu Ginobili") | + | hash("Danny Green") | hash("Tim Duncan") | hash("LaMarcus Aldridge") | + | hash("Danny Green") | hash("Tim Duncan") | hash("Danny Green") | + + Scenario: Integer Vid backtrack overlap + When executing query: + """ + GO FROM hash('Tony Parker') OVER like YIELD like._src as src, like._dst as dst + | GO 2 STEPS FROM $-.src OVER like YIELD $-.src, $-.dst, like._src, like._dst + """ + Then the result should be, in any order, with relax comparison: + | $-.src | $-.dst | like._src | like._dst | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("Tim Duncan" ) | hash("Manu Ginobili") | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("Tim Duncan" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("Manu Ginobili") | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | hash("Manu Ginobili" ) | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | hash("Manu Ginobili" ) | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | + When executing query: + """ + $a = GO FROM hash('Tony Parker') OVER like YIELD like._src as src, like._dst as dst; + GO 2 STEPS FROM $a.src OVER like YIELD $a.src, $a.dst, like._src, like._dst + """ + Then the result should be, in any order, with relax comparison: + | $a.src | $a.dst | like._src | like._dst | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("Tim Duncan" ) | hash("Manu Ginobili") | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("Tim Duncan" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("Manu Ginobili") | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("Tim Duncan" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | hash("Manu Ginobili" ) | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("Manu Ginobili" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | hash("Manu Ginobili" ) | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker") | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Manu Ginobili" ) | hash("Tim Duncan" ) | + | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" ) |