Files
2026-07-13 12:25:07 +08:00

116 lines
4.9 KiB
Python

# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
# ┃ This file is part of the Perspective library, distributed under the terms ┃
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
import perspective as psp
client = psp.Server().new_local_client()
class TestJoin:
def test_inner_join_two_tables(self):
left = client.table(
[{"id": 1, "x": 10}, {"id": 2, "x": 20}, {"id": 3, "x": 30}]
)
right = client.table(
[{"id": 1, "y": "a"}, {"id": 2, "y": "b"}, {"id": 4, "y": "d"}]
)
joined = client.join(left, right, "id")
view = joined.view()
json = view.to_json()
assert len(json) == 2
view.delete()
joined.delete()
right.delete()
left.delete()
def test_join_has_correct_schema(self):
left = client.table({"id": "integer", "x": "float"})
right = client.table({"id": "integer", "y": "string"})
joined = client.join(left, right, "id")
schema = joined.schema()
assert schema == {"id": "integer", "x": "float", "y": "string"}
joined.delete()
right.delete()
left.delete()
def test_join_reacts_to_left_updates(self):
left = client.table(
[{"id": 1, "x": 10}, {"id": 2, "x": 20}]
)
right = client.table(
[{"id": 1, "y": "a"}, {"id": 2, "y": "b"}]
)
joined = client.join(left, right, "id")
view = joined.view()
left.update([{"id": 1, "x": 99}])
json = view.to_json()
assert json == [
{"id": 1, "x": 10, "y": "a"},
{"id": 2, "x": 20, "y": "b"},
{"id": 1, "x": 99, "y": "a"},
]
view.delete()
joined.delete()
right.delete()
left.delete()
def test_left_join(self):
left = client.table(
[{"id": 1, "x": 10}, {"id": 2, "x": 20}, {"id": 3, "x": 30}]
)
right = client.table(
[{"id": 1, "y": "a"}, {"id": 2, "y": "b"}]
)
joined = client.join(left, right, "id", "left")
view = joined.view()
json = view.to_json()
assert len(json) == 3
view.delete()
joined.delete()
right.delete()
left.delete()
def test_join_by_table_names(self):
left = client.table(
[{"id": 1, "x": 10}, {"id": 2, "x": 20}],
name="left_py",
)
right = client.table(
[{"id": 1, "y": "a"}, {"id": 2, "y": "b"}],
name="right_py",
)
joined = client.join("left_py", "right_py", "id")
view = joined.view()
json = view.to_json()
assert len(json) == 2
view.delete()
joined.delete()
right.delete()
left.delete()
def test_join_mixed_table_and_string(self):
left = client.table(
[{"id": 1, "x": 10}, {"id": 2, "x": 20}]
)
right = client.table(
[{"id": 1, "y": "a"}, {"id": 2, "y": "b"}],
name="right_py_mixed",
)
joined = client.join(left, "right_py_mixed", "id")
view = joined.view()
json = view.to_json()
assert len(json) == 2
view.delete()
joined.delete()
right.delete()
left.delete()