From 0d84c734f1d3dde3a657ac4c7f24864adac24907 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Mon, 4 Mar 2024 12:06:13 +0400 Subject: [PATCH 001/136] Support Polars DataFrame export from QueryResult (#2985) --- tools/python_api/requirements_dev.txt | 1 + tools/python_api/src_py/query_result.py | 13 + tools/python_api/test/test_arrow.py | 677 +++++++++++++++--------- 3 files changed, 444 insertions(+), 247 deletions(-) diff --git a/tools/python_api/requirements_dev.txt b/tools/python_api/requirements_dev.txt index ac095f8f454..00501dea8f3 100644 --- a/tools/python_api/requirements_dev.txt +++ b/tools/python_api/requirements_dev.txt @@ -1,6 +1,7 @@ pybind11>=2.6.0 pytest pandas +polars networkx~=3.0.0 numpy pyarrow==14.0.1 diff --git a/tools/python_api/src_py/query_result.py b/tools/python_api/src_py/query_result.py index c7201230fab..75a5e719be8 100644 --- a/tools/python_api/src_py/query_result.py +++ b/tools/python_api/src_py/query_result.py @@ -98,6 +98,19 @@ def get_as_df(self): return self._query_result.getAsDF() + def get_as_pl(self): + """ + Get the query result as a Polars DataFrame. + + Returns + ------- + polars.DataFrame + Query result as a Polars DataFrame. + """ + + import polars as pl + return pl.from_arrow(data=self.get_as_arrow(10_000)) + def get_as_arrow(self, chunk_size): """ Get the query result as a PyArrow Table. diff --git a/tools/python_api/test/test_arrow.py b/tools/python_api/test/test_arrow.py index d071f6c082d..408cb38617a 100644 --- a/tools/python_api/test/test_arrow.py +++ b/tools/python_api/test/test_arrow.py @@ -1,237 +1,401 @@ -import time - -import kuzu +import polars as pl import pyarrow as pa -import datetime import ground_truth +from datetime import date, datetime, timedelta from decimal import Decimal from pandas import Timestamp import pytz +# enable polars' decimal support +pl.Config.activate_decimals(True) + + +_expected_dtypes = { + # ------------------------------------------------ + # person + # ------------------------------------------------ + "a.ID": {"arrow": pa.int64(), "pl": pl.Int64}, + "a.fName": {"arrow": pa.string(), "pl": pl.String}, + "a.gender": {"arrow": pa.int64(), "pl": pl.Int64}, + "a.isStudent": {"arrow": pa.bool_(), "pl": pl.Boolean}, + "a.isWorker": {"arrow": pa.bool_(), "pl": pl.Boolean}, + "a.age": {"arrow": pa.int64(), "pl": pl.Int64}, + "a.eyeSight": {"arrow": pa.float64(), "pl": pl.Float64}, + "a.birthdate": {"arrow": pa.date32(), "pl": pl.Date}, + "a.registerTime": {"arrow": pa.timestamp("us"), "pl": pl.Datetime("us")}, + "a.lastJobDuration": {"arrow": pa.duration("ms"), "pl": pl.Duration("ms")}, + "a.workedHours": {"arrow": pa.list_(pa.int64()), "pl": pl.List(pl.Int64)}, + "a.usedNames": {"arrow": pa.list_(pa.string()), "pl": pl.List(pl.String)}, + "a.courseScoresPerTerm": {"arrow": pa.list_(pa.list_(pa.int64())), "pl": pl.List(pl.List(pl.Int64))}, + "a.grades": {"arrow": pa.list_(pa.int64(), 4), "pl": pl.Array(pl.Int64, width=4)}, + "a.height": {"arrow": pa.float32(), "pl": pl.Float32}, + "a.u": {"arrow": pa.string(), "pl": pl.String}, + # ------------------------------------------------ + # movies + # ------------------------------------------------ + "a.length": {"arrow": pa.int32(), "pl": pl.Int32}, + "m.name": {"arrow": pa.string(), "pl": pl.String}, + "a.description": { + "arrow": pa.struct( + [ + ("rating", pa.float64()), + ("stars", pa.int8()), + ("views", pa.int64()), + ("release", pa.timestamp("us")), + ("release_ns", pa.timestamp("ns")), + ("release_ms", pa.timestamp("ms")), + ("release_sec", pa.timestamp("s")), + ("release_tz", pa.timestamp("us", tz="UTC")), + ("film", pa.date32()), + ("u8", pa.uint8()), + ("u16", pa.uint16()), + ("u32", pa.uint32()), + ("u64", pa.uint64()), + ("hugedata", pa.decimal128(38, 0)), + ] + ), + "pl": pl.Struct( + { + "rating": pl.Float64, + "stars": pl.Int8, + "views": pl.Int64, + "release": pl.Datetime(time_unit="us"), + "release_ns": pl.Datetime(time_unit="ns"), + "release_ms": pl.Datetime(time_unit="ms"), + "release_sec": pl.Datetime(time_unit="ms"), + "release_tz": pl.Datetime(time_unit="us", time_zone="UTC"), + "film": pl.Date, + "u8": pl.UInt8, + "u16": pl.UInt16, + "u32": pl.UInt32, + "u64": pl.UInt64, + "hugedata": pl.Decimal(precision=38, scale=0), + } + ), + }, + # ------------------------------------------------ + # miscellaneous + # ------------------------------------------------ + "a.lbl": {"arrow": pa.string(), "pl": pl.String}, + "a.orgCode": {"arrow": pa.int64(), "pl": pl.Int64}, +} + + +def get_result(query_result, result_type, chunk_size): + sz = [] if chunk_size is None else [chunk_size] + return getattr(query_result, f"get_as_{result_type}")(*sz) + + +def assert_column_equals(data, col_name, return_type, expected_values): + col = data[col_name] + col_dtype = col.dtype if hasattr(col, "dtype") else col.type + values = col.to_pylist() if return_type == "arrow" else col.to_list() + + assert len(col) == len(expected_values) + assert values == expected_values, f"Unexpected values for {col_name} ({return_type!r})" + assert col_dtype == _expected_dtypes[col_name][return_type], f"Unexpected dtype for {col_name} ({return_type!r})" + + +def assert_col_names(data, expected_col_names): + col_names = [(c._name if hasattr(c, "_name") else c.name) for c in data] + assert col_names == expected_col_names, f"Unexpected column names: {col_names!r}" + + def test_to_arrow(establish_connection): conn, db = establish_connection - def _test_person_table(_conn): + def _test_person_table(_conn, return_type, chunk_size=None): query = "MATCH (a:person) RETURN a.* ORDER BY a.ID" - arrow_tbl = _conn.execute(query).get_as_arrow(9) - assert arrow_tbl.num_columns == 16 - - id_col = arrow_tbl.column(0) - assert id_col.type == pa.int64() - assert id_col.length() == 8 - assert id_col.to_pylist() == [0, 2, 3, 5, 7, 8, 9, 10] - - f_name_col = arrow_tbl.column(1) - assert f_name_col.type == pa.string() - assert f_name_col.length() == 8 - assert f_name_col.to_pylist() == ["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"] - - f_gender_col = arrow_tbl.column(2) - assert f_gender_col.type == pa.int64() - assert f_gender_col.length() == 8 - assert f_gender_col.to_pylist() == [1, 2, 1, 2, 1, 2, 2, 2] - - is_student_col = arrow_tbl.column(3) - assert is_student_col.type == pa.bool_() - assert is_student_col.length() == 8 - assert is_student_col.to_pylist() == [True, True, False, False, False, True, False, False] - - is_worker_col = arrow_tbl.column(4) - assert is_worker_col.type == pa.bool_() - assert is_worker_col.length() == 8 - assert is_worker_col.to_pylist() == [False, False, True, True, True, False, False, True] - - age_col = arrow_tbl.column(5) - assert age_col.type == pa.int64() - assert age_col.length() == 8 - assert age_col.to_pylist() == [35, 30, 45, 20, 20, 25, 40, 83] - - eye_sight_col = arrow_tbl.column(6) - assert eye_sight_col.type == pa.float64() - assert eye_sight_col.length() == 8 - assert eye_sight_col.to_pylist() == [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9] - - birthdate_col = arrow_tbl.column(7) - assert birthdate_col.type == pa.date32() - assert birthdate_col.length() == 8 - assert birthdate_col.to_pylist() == [datetime.date(1900, 1, 1), datetime.date(1900, 1, 1), - datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), - datetime.date(1980, 10, 26), datetime.date(1980, 10, 26), - datetime.date(1980, 10, 26), datetime.date(1990, 11, 27)] - - register_time_col = arrow_tbl.column(8) - assert register_time_col.type == pa.timestamp('us') - assert register_time_col.length() == 8 - assert register_time_col.to_pylist() == [ - datetime.datetime(2011, 8, 20, 11, 25, 30), datetime.datetime(2008, 11, 3, 15, 25, 30, 526), - datetime.datetime(1911, 8, 20, 2, 32, 21), datetime.datetime(2031, 11, 30, 12, 25, 30), - datetime.datetime(1976, 12, 23, 11, 21, 42), datetime.datetime(1972, 7, 31, 13, 22, 30, 678559), - datetime.datetime(1976, 12, 23, 4, 41, 42), datetime.datetime(2023, 2, 21, 13, 25, 30)] - - last_job_duration_col = arrow_tbl.column(9) - assert last_job_duration_col.type == pa.duration('ms') - assert last_job_duration_col.length() == 8 - assert last_job_duration_col.to_pylist() == [datetime.timedelta(days=99, seconds=36334, microseconds=628000), - datetime.timedelta(days=543, seconds=4800), - datetime.timedelta(microseconds=125000), - datetime.timedelta(days=541, seconds=57600, microseconds=24000), - datetime.timedelta(0), - datetime.timedelta(days=2016, seconds=68600), - datetime.timedelta(microseconds=125000), - datetime.timedelta(days=541, seconds=57600, microseconds=24000)] - - worked_hours_col = arrow_tbl.column(10) - assert worked_hours_col.type == pa.list_(pa.int64()) - assert worked_hours_col.length() == 8 - assert worked_hours_col.to_pylist() == [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], - [10, 11, 12, 3, 4, 5, 6, 7]] - - used_names_col = arrow_tbl.column(11) - assert used_names_col.type == pa.list_(pa.string()) - assert used_names_col.length() == 8 - assert used_names_col.to_pylist() == [["Aida"], ["Bobby"], ["Carmen", "Fred"], ["Wolfeschlegelstein", "Daniel"], - ["Ein"], ["Fesdwe"], ["Grad"], ["Ad", "De", "Hi", "Kye", "Orlan"]] - - used_names_col = arrow_tbl.column(12) - assert used_names_col.type == pa.list_(pa.list_(pa.int64())) - assert used_names_col.length() == 8 - assert used_names_col.to_pylist() == [[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], [[7, 4], [8, 8], [9]], - [[6], [7], [8]], [[8]], [[10]], [[7], [10], [6, 7]]] - - grades_col = arrow_tbl.column(13) - assert grades_col.type == pa.list_(pa.int64(), 4) - assert grades_col.length() == 8 - assert grades_col.to_pylist() == [[96, 54, 86, 92], [98, 42, 93, 88], [91, 75, 21, 95], [76, 88, 99, 89], - [96, 59, 65, 88], [80, 78, 34, 83], [43, 83, 67, 43], [77, 64, 100, 54]] - - uuid_col = arrow_tbl.column(15) - assert uuid_col.type ==pa.string() - assert uuid_col.length() == 8 - assert uuid_col.to_pylist() == ['a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13','a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14', - 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17', 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18'] - - def _test_movies_table(_conn): + data = get_result(_conn.execute(query), return_type, chunk_size) + assert len(data.columns) == 16 + + assert_column_equals( + data=data, + col_name="a.ID", + return_type=return_type, + expected_values=[0, 2, 3, 5, 7, 8, 9, 10], + ) + + assert_column_equals( + data=data, + col_name="a.fName", + return_type=return_type, + expected_values=["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], + ) + + assert_column_equals( + data=data, + col_name="a.gender", + return_type=return_type, + expected_values=[1, 2, 1, 2, 1, 2, 2, 2], + ) + + assert_column_equals( + data=data, + col_name="a.isStudent", + return_type=return_type, + expected_values=[True, True, False, False, False, True, False, False], + ) + + assert_column_equals( + data=data, + col_name="a.isWorker", + return_type=return_type, + expected_values=[False, False, True, True, True, False, False, True], + ) + + assert_column_equals( + data=data, + col_name="a.age", + return_type=return_type, + expected_values=[35, 30, 45, 20, 20, 25, 40, 83], + ) + + assert_column_equals( + data=data, + col_name="a.eyeSight", + return_type=return_type, + expected_values=[5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], + ) + + assert_column_equals( + data=data, + col_name="a.birthdate", + return_type=return_type, + expected_values=[ + date(1900, 1, 1), + date(1900, 1, 1), + date(1940, 6, 22), + date(1950, 7, 23), + date(1980, 10, 26), + date(1980, 10, 26), + date(1980, 10, 26), + date(1990, 11, 27), + ], + ) + + assert_column_equals( + data=data, + col_name="a.registerTime", + return_type=return_type, + expected_values=[ + datetime(2011, 8, 20, 11, 25, 30), + datetime(2008, 11, 3, 15, 25, 30, 526), + datetime(1911, 8, 20, 2, 32, 21), + datetime(2031, 11, 30, 12, 25, 30), + datetime(1976, 12, 23, 11, 21, 42), + datetime(1972, 7, 31, 13, 22, 30, 678559), + datetime(1976, 12, 23, 4, 41, 42), + datetime(2023, 2, 21, 13, 25, 30), + ], + ) + + assert_column_equals( + data=data, + col_name="a.lastJobDuration", + return_type=return_type, + expected_values=[ + timedelta(days=99, seconds=36334, microseconds=628000), + timedelta(days=543, seconds=4800), + timedelta(microseconds=125000), + timedelta(days=541, seconds=57600, microseconds=24000), + timedelta(0), + timedelta(days=2016, seconds=68600), + timedelta(microseconds=125000), + timedelta(days=541, seconds=57600, microseconds=24000), + ], + ) + + assert_column_equals( + data=data, + col_name="a.workedHours", + return_type=return_type, + expected_values=[[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], [10, 11, 12, 3, 4, 5, 6, 7]], + ) + + assert_column_equals( + data=data, + col_name="a.usedNames", + return_type=return_type, + expected_values=[["Aida"], ["Bobby"], ["Carmen", "Fred"], ["Wolfeschlegelstein", "Daniel"], ["Ein"], ["Fesdwe"], ["Grad"], ["Ad", "De", "Hi", "Kye", "Orlan"]], + ) + + assert_column_equals( + data=data, + col_name="a.courseScoresPerTerm", + return_type=return_type, + expected_values=[[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], [[7, 4], [8, 8], [9]], [[6], [7], [8]], [[8]], [[10]], [[7], [10], [6, 7]]], + ) + + assert_column_equals( + data=data, + col_name="a.grades", + return_type=return_type, + expected_values=[ + [96, 54, 86, 92], + [98, 42, 93, 88], + [91, 75, 21, 95], + [76, 88, 99, 89], + [96, 59, 65, 88], + [80, 78, 34, 83], + [43, 83, 67, 43], + [77, 64, 100, 54], + ], + ) + + assert_column_equals( + data=data, + col_name="a.u", + return_type=return_type, + expected_values=[ + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17", + "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18", + ], + ) + + def _test_movies_table(_conn, return_type, chunk_size=None): query = "MATCH (a:movies) RETURN a.length, a.description ORDER BY a.length" - arrow_tbl = _conn.execute(query).get_as_arrow(8) - assert arrow_tbl.num_columns == 2 - - length_col = arrow_tbl.column(0) - assert length_col.type == pa.int32() - assert length_col.length() == 3 - assert length_col.to_pylist() == [126, 298, 2544] - - description_col = arrow_tbl.column(1) - assert description_col.type == pa.struct( - [('rating', pa.float64()), ('stars', pa.int8()), ('views', pa.int64()), ('release', pa.timestamp('us')), - ('release_ns', pa.timestamp('ns')), ('release_ms', pa.timestamp('ms')), - ('release_sec', pa.timestamp('s')), ('release_tz', pa.timestamp('us', tz='UTC')), - ('film', pa.date32()), ('u8', pa.uint8()), ('u16', pa.uint16()), ('u32', pa.uint32()), - ('u64', pa.uint64()), ('hugedata', pa.decimal128(38, 0))]) - assert description_col.length() == 3 - assert description_col.to_pylist() == [{ - 'rating': 5.3, - 'stars': 2, - 'views': 152, - 'release': datetime.datetime(2011, 8, 20, 11, 25, 30), - 'release_ns': Timestamp('2011-08-20 11:25:30.123456'), - 'release_ms': datetime.datetime(2011, 8, 20, 11, 25, 30, 123000), - 'release_sec': datetime.datetime(2011, 8, 20, 11, 25, 30), - 'release_tz': datetime.datetime(2011, 8, 20, 11, 25, 30, 123456, pytz.UTC), - 'film': datetime.date(2012, 5, 11), - 'u8': 220, - 'u16': 20, - 'u32': 1, - 'u64': 180, - 'hugedata': Decimal(1844674407370955161811111111) - }, { - 'rating': 1223.0, - 'stars': 100, - 'views': 10003, - 'release': datetime.datetime(2011, 2, 11, 16, 44, 22), - 'release_ns': Timestamp('2011-02-11 16:44:22.123456'), - 'release_ms': datetime.datetime(2011, 2, 11, 16, 44, 22, 123000), - 'release_sec': datetime.datetime(2011, 2, 11, 16, 44, 22), - 'release_tz': datetime.datetime(2011, 2, 11, 16, 44, 22, 123456, pytz.UTC), - 'film': datetime.date(2013, 2, 22), - 'u8': 1, - 'u16': 15, - 'u32': 200, - 'u64': 4, - 'hugedata': Decimal(-15) - }, { - 'rating': 7.0, - 'stars': 10, - 'views': 982, - 'release': datetime.datetime(2018, 11, 13, 13, 33, 11), - 'release_ns': Timestamp('2018-11-13 13:33:11.123456'), - 'release_ms': datetime.datetime(2018, 11, 13, 13, 33, 11, 123000), - 'release_sec': datetime.datetime(2018, 11, 13, 13, 33, 11), - 'release_tz': datetime.datetime(2018, 11, 13, 13, 33, 11, 123456, pytz.UTC), - 'film': datetime.date(2014, 9, 12), - 'u8': 12, - 'u16': 120, - 'u32': 55, - 'u64': 1, - 'hugedata': Decimal(-1844674407370955161511) - }] - - def _test_utf8_string(_conn): + data = get_result(_conn.execute(query), return_type, chunk_size) + + assert_col_names(data, ["a.length", "a.description"]) + assert_column_equals( + data=data, + col_name="a.length", + return_type=return_type, + expected_values=[126, 298, 2544], + ) + + assert_column_equals( + data=data, + col_name="a.description", + return_type=return_type, + expected_values=[ + { + "rating": 5.3, + "stars": 2, + "views": 152, + "release": datetime(2011, 8, 20, 11, 25, 30), + "release_ns": datetime(2011, 8, 20, 11, 25, 30, 123456) if return_type == "pl" else Timestamp("2011-08-20 11:25:30.123456"), + "release_ms": datetime(2011, 8, 20, 11, 25, 30, 123000), + "release_sec": datetime(2011, 8, 20, 11, 25, 30), + "release_tz": datetime(2011, 8, 20, 11, 25, 30, 123456, pytz.UTC), + "film": date(2012, 5, 11), + "u8": 220, + "u16": 20, + "u32": 1, + "u64": 180, + "hugedata": Decimal(1844674407370955161811111111), + }, + { + "rating": 1223.0, + "stars": 100, + "views": 10003, + "release": datetime(2011, 2, 11, 16, 44, 22), + "release_ns": datetime(2011, 2, 11, 16, 44, 22, 123456) if return_type == "pl" else Timestamp("2011-02-11 16:44:22.123456"), + "release_ms": datetime(2011, 2, 11, 16, 44, 22, 123000), + "release_sec": datetime(2011, 2, 11, 16, 44, 22), + "release_tz": datetime(2011, 2, 11, 16, 44, 22, 123456, pytz.UTC), + "film": date(2013, 2, 22), + "u8": 1, + "u16": 15, + "u32": 200, + "u64": 4, + "hugedata": Decimal(-15), + }, + { + "rating": 7.0, + "stars": 10, + "views": 982, + "release": datetime(2018, 11, 13, 13, 33, 11), + "release_ns": datetime(2018, 11, 13, 13, 33, 11, 123456) if return_type == "pl" else Timestamp("2018-11-13 13:33:11.123456"), + "release_ms": datetime(2018, 11, 13, 13, 33, 11, 123000), + "release_sec": datetime(2018, 11, 13, 13, 33, 11), + "release_tz": datetime(2018, 11, 13, 13, 33, 11, 123456, pytz.UTC), + "film": date(2014, 9, 12), + "u8": 12, + "u16": 120, + "u32": 55, + "u64": 1, + "hugedata": Decimal(-1844674407370955161511), + }, + ], + ) + + def _test_utf8_string(_conn, return_type, chunk_size=None): query = "MATCH (m:movies) RETURN m.name" - query_result = _conn.execute(query) + data = get_result(_conn.execute(query), return_type, chunk_size) - arrow_tbl = query_result.get_as_arrow(3) - assert arrow_tbl.num_columns == 1 - name_col = arrow_tbl.column(0) - assert name_col.type == pa.string() - assert name_col.length() == 3 - assert name_col.to_pylist() == ["Sóló cón tu párejâ", "The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie", "Roma"] + assert_col_names(data, ["m.name"]) + assert_column_equals( + data=data, + col_name="m.name", + return_type=return_type, + expected_values=["Sóló cón tu párejâ", "The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie", "Roma"], + ) - def _test_in_small_chunk_size(_conn): + def _test_in_small_chunk_size(_conn, return_type, chunk_size=None): query = "MATCH (a:person) RETURN a.age, a.fName ORDER BY a.ID" - query_result = _conn.execute(query) + data = get_result(_conn.execute(query), return_type, chunk_size) + + assert_col_names(data, ["a.age", "a.fName"]) + assert_column_equals( + data=data, + col_name="a.age", + return_type=return_type, + expected_values=[35, 30, 45, 20, 20, 25, 40, 83], + ) + + assert_column_equals( + data=data, + col_name="a.fName", + return_type=return_type, + expected_values=["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], + ) + + def _test_with_nulls(_conn, return_type, chunk_size=None): + query = "MATCH (a:person:organisation) RETURN label(a) AS `a.lbl`, a.fName, a.orgCode ORDER BY a.ID" + data = get_result(_conn.execute(query), return_type, chunk_size) + + assert_col_names(data, ["a.lbl", "a.fName", "a.orgCode"]) + assert_column_equals( + data=data, + col_name="a.lbl", + return_type=return_type, + expected_values=["person", "organisation", "person", "person", "organisation", "person", "organisation", "person", "person", "person", "person"], + ) + + assert_column_equals( + data=data, + col_name="a.fName", + return_type=return_type, + expected_values=["Alice", None, "Bob", "Carol", None, "Dan", None, "Elizabeth", "Farooq", "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], + ) + + assert_column_equals( + data=data, + col_name="a.orgCode", + return_type=return_type, + expected_values=[None, 325, None, None, 934, None, 824, None, None, None, None], + ) + + _test_person_table(conn, "arrow", 9) + _test_person_table(conn, "pl") + _test_movies_table(conn, "arrow", 8) + _test_movies_table(conn, "pl") + _test_utf8_string(conn, "arrow", 3) + _test_utf8_string(conn, "pl") + _test_in_small_chunk_size(conn, "arrow", 4) + _test_in_small_chunk_size(conn, "pl") + _test_with_nulls(conn, "arrow", 12) + _test_with_nulls(conn, "pl") - arrow_tbl = query_result.get_as_arrow(4) - assert arrow_tbl.num_columns == 2 - age_col = arrow_tbl.column(0) - assert age_col.type == pa.int64() - assert age_col.length() == 8 - f_name_col = arrow_tbl.column(1) - assert f_name_col.type == pa.string() - assert f_name_col.length() == 8 - - assert age_col.to_pylist() == [35, 30, 45, 20, 20, 25, 40, 83] - assert f_name_col.to_pylist() == ["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"] - - def _test_with_nulls(_conn): - query = "MATCH (a:person:organisation) RETURN label(a), a.fName, a.orgCode ORDER BY a.ID" - query_result = _conn.execute(query) - arrow_tbl = query_result.get_as_arrow(12) - assert arrow_tbl.num_columns == 3 - label_col = arrow_tbl.column(0) - assert label_col.type == pa.string() - assert label_col.length() == 11 - assert label_col.to_pylist() == ["person", "organisation", "person", "person", "organisation", "person", - "organisation", "person", "person", "person", "person"] - - f_name_col = arrow_tbl.column(1) - assert f_name_col.type == pa.string() - assert f_name_col.length() == 11 - assert f_name_col.to_pylist() == ["Alice", None, "Bob", "Carol", None, "Dan", None, "Elizabeth", "Farooq", - "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"] - - org_code_col = arrow_tbl.column(2) - assert org_code_col.type == pa.int64() - assert org_code_col.length() == 11 - assert org_code_col.to_pylist() == [None, 325, None, None, 934, None, 824, None, None, None, None] - - _test_person_table(conn) - _test_movies_table(conn) - _test_utf8_string(conn) - _test_in_small_chunk_size(conn) - _test_with_nulls(conn) def test_to_arrow_complex(establish_connection): conn, db = establish_connection @@ -242,14 +406,16 @@ def _test_node(_conn): arrow_tbl = query_result.get_as_arrow(12) p_col = arrow_tbl.column(0) - assert p_col.to_pylist() == [ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[0], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[2], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[3], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[5], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[7], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[8], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[9], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[10]] + assert p_col.to_pylist() == [ + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[0], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[2], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[3], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[5], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[7], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[8], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[9], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[10], + ] def _test_node_rel(_conn): query = "MATCH (a:person)-[e:workAt]->(b:organisation) RETURN a, e, b;" @@ -257,24 +423,41 @@ def _test_node_rel(_conn): arrow_tbl = query_result.get_as_arrow(12) assert arrow_tbl.num_columns == 3 a_col = arrow_tbl.column(0) - assert a_col.length() == 3 + assert len(a_col) == 3 e_col = arrow_tbl.column(1) - assert a_col.length() == 3 + assert len(a_col) == 3 b_col = arrow_tbl.column(2) - assert a_col.length() == 3 - assert a_col.to_pylist() == [ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[3], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[5], - ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[7]] + assert len(a_col) == 3 + assert a_col.to_pylist() == [ + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[3], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[5], + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[7], + ] assert e_col.to_pylist() == [ - {'_src': {'offset': 2, 'tableID': 0}, '_dst': {'offset': 1, 'tableID': 2}, - '_id': {'offset': 0, 'tableID': 4}, 'year': 2015}, - {'_src': {'offset': 3, 'tableID': 0}, '_dst': {'offset': 2, 'tableID': 2}, - '_id': {'offset': 1, 'tableID': 4}, 'year': 2010}, - {'_src': {'offset': 4, 'tableID': 0}, '_dst': {'offset': 2, 'tableID': 2}, - '_id': {'offset': 2, 'tableID': 4}, 'year': 2015}] - assert b_col.to_pylist() == [ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[4], - ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[6], - ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[6]] + { + "_src": {"offset": 2, "tableID": 0}, + "_dst": {"offset": 1, "tableID": 2}, + "_id": {"offset": 0, "tableID": 4}, + "year": 2015, + }, + { + "_src": {"offset": 3, "tableID": 0}, + "_dst": {"offset": 2, "tableID": 2}, + "_id": {"offset": 1, "tableID": 4}, + "year": 2010, + }, + { + "_src": {"offset": 4, "tableID": 0}, + "_dst": {"offset": 2, "tableID": 2}, + "_id": {"offset": 2, "tableID": 4}, + "year": 2015, + }, + ] + assert b_col.to_pylist() == [ + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[4], + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[6], + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[6], + ] def _test_marries_table(_conn): query = "MATCH (:person)-[e:marries]->(:person) RETURN e.*" @@ -283,22 +466,22 @@ def _test_marries_table(_conn): used_addr_col = arrow_tbl.column(0) assert used_addr_col.type == pa.list_(pa.string()) - assert used_addr_col.length() == 3 - assert used_addr_col.to_pylist() == [['toronto'], None, []] + assert len(used_addr_col) == 3 + assert used_addr_col.to_pylist() == [["toronto"], None, []] addr_col = arrow_tbl.column(1) assert used_addr_col.type == pa.list_(pa.int16(), 2) - assert used_addr_col.length() == 3 + assert len(used_addr_col) == 3 assert used_addr_col.to_pylist() == [[4, 5], [2, 5], [3, 9]] note_col = arrow_tbl.column(2) assert used_addr_col.type == pa.string() - assert used_addr_col.length() == 3 + assert len(used_addr_col) == 3 assert used_addr_col.to_pylist() == [None, "long long long string", "short str"] - #_test_node(conn) - #_test_node_rel(conn) - #_test_marries_table(conn) + # _test_node(conn) + # _test_node_rel(conn) + # _test_marries_table(conn) def test_to_arrow1(establish_connection): conn, db = establish_connection From 89598fdd451161a7b93ef32853bec2b7a9971c23 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Mon, 4 Mar 2024 21:38:48 +0800 Subject: [PATCH 002/136] clean up transaction pointer in physical operator --- src/include/processor/operator/physical_operator.h | 5 +---- .../operator/recursive_extend/recursive_join.h | 2 +- src/include/processor/operator/scan_node_id.h | 4 ++-- src/processor/operator/ddl/add_node_property.cpp | 2 +- src/processor/operator/ddl/add_rel_property.cpp | 2 +- src/processor/operator/index_scan.cpp | 3 ++- src/processor/operator/persistent/insert.cpp | 4 ++-- src/processor/operator/persistent/merge.cpp | 4 ++-- src/processor/operator/physical_operator.cpp | 1 - .../operator/recursive_extend/recursive_join.cpp | 6 +++--- .../operator/scan/scan_multi_node_tables.cpp | 7 ++++--- src/processor/operator/scan/scan_multi_rel_tables.cpp | 3 ++- src/processor/operator/scan/scan_node_table.cpp | 5 +++-- src/processor/operator/scan/scan_rel_table.cpp | 6 +++--- src/processor/operator/scan_node_id.cpp | 11 ++++++----- src/processor/operator/semi_masker.cpp | 4 ++-- 16 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/include/processor/operator/physical_operator.h b/src/include/processor/operator/physical_operator.h index 55f5e26d349..9076d65047a 100644 --- a/src/include/processor/operator/physical_operator.h +++ b/src/include/processor/operator/physical_operator.h @@ -95,8 +95,7 @@ class PhysicalOperator { public: // Leaf operator PhysicalOperator(PhysicalOperatorType operatorType, uint32_t id, std::string paramsString) - : id{id}, operatorType{operatorType}, transaction{nullptr}, paramsString{ - std::move(paramsString)} {} + : id{id}, operatorType{operatorType}, paramsString{std::move(paramsString)} {} // Unary operator PhysicalOperator(PhysicalOperatorType operatorType, std::unique_ptr child, uint32_t id, const std::string& paramsString); @@ -167,8 +166,6 @@ class PhysicalOperator { PhysicalOperatorType operatorType; physical_op_vector_t children; - // TODO(Xiyang/Guodong): Remove this field, as it should be covered in ExecutionContext now. - transaction::Transaction* transaction; ResultSet* resultSet; std::string paramsString; diff --git a/src/include/processor/operator/recursive_extend/recursive_join.h b/src/include/processor/operator/recursive_extend/recursive_join.h index 479442f950a..ce47117468e 100644 --- a/src/include/processor/operator/recursive_extend/recursive_join.h +++ b/src/include/processor/operator/recursive_extend/recursive_join.h @@ -103,7 +103,7 @@ class RecursiveJoin : public PhysicalOperator { private: void initLocalRecursivePlan(ExecutionContext* context); - void populateTargetDstNodes(); + void populateTargetDstNodes(ExecutionContext* context); bool scanOutput(); diff --git a/src/include/processor/operator/scan_node_id.h b/src/include/processor/operator/scan_node_id.h index 6ec3edd3255..4f7f405df9b 100644 --- a/src/include/processor/operator/scan_node_id.h +++ b/src/include/processor/operator/scan_node_id.h @@ -77,8 +77,8 @@ class ScanNodeID : public PhysicalOperator { sharedState->initialize(context->clientContext->getTx()); } - void setSelVector( - NodeTableScanState* tableState, common::offset_t startOffset, common::offset_t endOffset); + void setSelVector(ExecutionContext* context, NodeTableScanState* tableState, + common::offset_t startOffset, common::offset_t endOffset); private: DataPos outDataPos; diff --git a/src/processor/operator/ddl/add_node_property.cpp b/src/processor/operator/ddl/add_node_property.cpp index 5131fd1b0f9..d8ea5ad4bd2 100644 --- a/src/processor/operator/ddl/add_node_property.cpp +++ b/src/processor/operator/ddl/add_node_property.cpp @@ -9,7 +9,7 @@ void AddNodeProperty::executeDDLInternal(ExecutionContext* context) { auto addedPropID = schema->getPropertyID(propertyName); auto addedProp = schema->getProperty(addedPropID); storageManager.getNodeTable(tableID)->addColumn( - transaction, *addedProp, getDefaultValVector(context)); + context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); storageManager.getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); } diff --git a/src/processor/operator/ddl/add_rel_property.cpp b/src/processor/operator/ddl/add_rel_property.cpp index 4779e712d58..f0eacecf4e8 100644 --- a/src/processor/operator/ddl/add_rel_property.cpp +++ b/src/processor/operator/ddl/add_rel_property.cpp @@ -13,7 +13,7 @@ void AddRelProperty::executeDDLInternal(ExecutionContext* context) { auto addedPropertyID = tableSchema->getPropertyID(propertyName); auto addedProp = tableSchema->getProperty(addedPropertyID); storageManager.getRelTable(tableID)->addColumn( - transaction, *addedProp, getDefaultValVector(context)); + context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); storageManager.getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); } diff --git a/src/processor/operator/index_scan.cpp b/src/processor/operator/index_scan.cpp index 984262d61e4..28e04f66c2f 100644 --- a/src/processor/operator/index_scan.cpp +++ b/src/processor/operator/index_scan.cpp @@ -27,7 +27,8 @@ bool IndexScan::getNextTuplesInternal(ExecutionContext* context) { } outVector->state->selVector->getSelectedPositionsBuffer()[numSelectedValues] = pos; offset_t nodeOffset = INVALID_OFFSET; - numSelectedValues += pkIndex->lookup(transaction, indexVector, pos, nodeOffset); + numSelectedValues += + pkIndex->lookup(context->clientContext->getTx(), indexVector, pos, nodeOffset); nodeID_t nodeID{nodeOffset, tableID}; outVector->setValue(pos, nodeID); } diff --git a/src/processor/operator/persistent/insert.cpp b/src/processor/operator/persistent/insert.cpp index 7414e96dc21..f3a8bee3be7 100644 --- a/src/processor/operator/persistent/insert.cpp +++ b/src/processor/operator/persistent/insert.cpp @@ -20,10 +20,10 @@ bool Insert::getNextTuplesInternal(ExecutionContext* context) { return false; } for (auto& executor : nodeExecutors) { - executor.insert(transaction, context); + executor.insert(context->clientContext->getTx(), context); } for (auto& executor : relExecutors) { - executor.insert(transaction, context); + executor.insert(context->clientContext->getTx(), context); } return true; } diff --git a/src/processor/operator/persistent/merge.cpp b/src/processor/operator/persistent/merge.cpp index f488b9b13a1..5f179a5b8c8 100644 --- a/src/processor/operator/persistent/merge.cpp +++ b/src/processor/operator/persistent/merge.cpp @@ -40,10 +40,10 @@ bool Merge::getNextTuplesInternal(ExecutionContext* context) { } } else { for (auto& executor : nodeInsertExecutors) { - executor.insert(transaction, context); + executor.insert(context->clientContext->getTx(), context); } for (auto& executor : relInsertExecutors) { - executor.insert(transaction, context); + executor.insert(context->clientContext->getTx(), context); } for (auto& executor : onCreateNodeSetExecutors) { executor->set(context); diff --git a/src/processor/operator/physical_operator.cpp b/src/processor/operator/physical_operator.cpp index 625c095303f..ebae013256a 100644 --- a/src/processor/operator/physical_operator.cpp +++ b/src/processor/operator/physical_operator.cpp @@ -175,7 +175,6 @@ void PhysicalOperator::initLocalState(ResultSet* resultSet_, ExecutionContext* c if (!isSource()) { children[0]->initLocalState(resultSet_, context); } - transaction = context->clientContext->getTx(); resultSet = resultSet_; registerProfilingMetrics(context->profiler); initLocalStateInternal(resultSet_, context); diff --git a/src/processor/operator/recursive_extend/recursive_join.cpp b/src/processor/operator/recursive_extend/recursive_join.cpp index a44af6439a4..acb44bf42b5 100644 --- a/src/processor/operator/recursive_extend/recursive_join.cpp +++ b/src/processor/operator/recursive_extend/recursive_join.cpp @@ -11,7 +11,7 @@ namespace kuzu { namespace processor { void RecursiveJoin::initLocalStateInternal(ResultSet* /*resultSet_*/, ExecutionContext* context) { - populateTargetDstNodes(); + populateTargetDstNodes(context); vectors = std::make_unique(); vectors->srcNodeIDVector = resultSet->getValueVector(dataInfo->srcNodePos).get(); vectors->dstNodeIDVector = resultSet->getValueVector(dataInfo->dstNodePos).get(); @@ -221,12 +221,12 @@ void RecursiveJoin::initLocalRecursivePlan(ExecutionContext* context) { recursiveRoot->initLocalState(localResultSet.get(), context); } -void RecursiveJoin::populateTargetDstNodes() { +void RecursiveJoin::populateTargetDstNodes(ExecutionContext* context) { frontier::node_id_set_t targetNodeIDs; uint64_t numTargetNodes = 0; for (auto& semiMask : sharedState->semiMasks) { auto nodeTable = semiMask->getNodeTable(); - auto numNodes = nodeTable->getMaxNodeOffset(transaction) + 1; + auto numNodes = nodeTable->getMaxNodeOffset(context->clientContext->getTx()) + 1; if (semiMask->isEnabled()) { for (auto offset = 0u; offset < numNodes; ++offset) { if (semiMask->isNodeMasked(offset)) { diff --git a/src/processor/operator/scan/scan_multi_node_tables.cpp b/src/processor/operator/scan/scan_multi_node_tables.cpp index b1c17fae571..115853de4b7 100644 --- a/src/processor/operator/scan/scan_multi_node_tables.cpp +++ b/src/processor/operator/scan/scan_multi_node_tables.cpp @@ -13,9 +13,10 @@ bool ScanMultiNodeTables::getNextTuplesInternal(ExecutionContext* context) { inVector->getValue(inVector->state->selVector->selectedPositions[0]).tableID; KU_ASSERT(readStates.contains(tableID) && tables.contains(tableID)); auto scanTableInfo = tables.at(tableID).get(); - scanTableInfo->table->initializeReadState( - transaction, scanTableInfo->columnIDs, inVector, readStates[tableID].get()); - scanTableInfo->table->read(transaction, *readStates.at(tableID), inVector, outVectors); + scanTableInfo->table->initializeReadState(context->clientContext->getTx(), + scanTableInfo->columnIDs, inVector, readStates[tableID].get()); + scanTableInfo->table->read( + context->clientContext->getTx(), *readStates.at(tableID), inVector, outVectors); return true; } diff --git a/src/processor/operator/scan/scan_multi_rel_tables.cpp b/src/processor/operator/scan/scan_multi_rel_tables.cpp index feb59ce0ec2..ac2b3e04487 100644 --- a/src/processor/operator/scan/scan_multi_rel_tables.cpp +++ b/src/processor/operator/scan/scan_multi_rel_tables.cpp @@ -56,7 +56,8 @@ void ScanMultiRelTable::initLocalStateInternal(ResultSet* resultSet, ExecutionCo bool ScanMultiRelTable::getNextTuplesInternal(ExecutionContext* context) { while (true) { - if (currentScanner != nullptr && currentScanner->scan(inVector, outVectors, transaction)) { + if (currentScanner != nullptr && + currentScanner->scan(inVector, outVectors, context->clientContext->getTx())) { metrics->numOutputTuple.increase(outVectors[0]->state->selVector->selectedSize); return true; } diff --git a/src/processor/operator/scan/scan_node_table.cpp b/src/processor/operator/scan/scan_node_table.cpp index c0223aebdac..747dc856e89 100644 --- a/src/processor/operator/scan/scan_node_table.cpp +++ b/src/processor/operator/scan/scan_node_table.cpp @@ -12,8 +12,9 @@ bool ScanSingleNodeTable::getNextTuplesInternal(ExecutionContext* context) { for (auto& outputVector : outVectors) { outputVector->resetAuxiliaryBuffer(); } - info->table->initializeReadState(transaction, info->columnIDs, inVector, readState.get()); - info->table->read(transaction, *readState, inVector, outVectors); + info->table->initializeReadState( + context->clientContext->getTx(), info->columnIDs, inVector, readState.get()); + info->table->read(context->clientContext->getTx(), *readState, inVector, outVectors); return true; } diff --git a/src/processor/operator/scan/scan_rel_table.cpp b/src/processor/operator/scan/scan_rel_table.cpp index 2a836fb82db..426baa0cbbc 100644 --- a/src/processor/operator/scan/scan_rel_table.cpp +++ b/src/processor/operator/scan/scan_rel_table.cpp @@ -6,14 +6,14 @@ namespace processor { bool ScanRelTable::getNextTuplesInternal(ExecutionContext* context) { while (true) { if (scanState->hasMoreToRead(context->clientContext->getTx())) { - info->table->read(transaction, *scanState, inVector, outVectors); + info->table->read(context->clientContext->getTx(), *scanState, inVector, outVectors); return true; } if (!children[0]->getNextTuple(context)) { return false; } - info->table->initializeReadState( - transaction, info->direction, info->columnIDs, inVector, scanState.get()); + info->table->initializeReadState(context->clientContext->getTx(), info->direction, + info->columnIDs, inVector, scanState.get()); } } diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index ef0ea2756fc..698a2c1f4f9 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -57,7 +57,7 @@ void ScanNodeID::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* outValueVector->setSequential(); } -bool ScanNodeID::getNextTuplesInternal(ExecutionContext* /*context*/) { +bool ScanNodeID::getNextTuplesInternal(ExecutionContext* context) { do { auto [state, startOffset, endOffset] = sharedState->getNextRangeToRead(); if (state == nullptr) { @@ -70,14 +70,14 @@ bool ScanNodeID::getNextTuplesInternal(ExecutionContext* /*context*/) { nodeIDValues[i].tableID = state->getTable()->getTableID(); } outValueVector->state->initOriginalAndSelectedSize(size); - setSelVector(state, startOffset, endOffset); + setSelVector(context, state, startOffset, endOffset); } while (outValueVector->state->selVector->selectedSize == 0); metrics->numOutputTuple.increase(outValueVector->state->selVector->selectedSize); return true; } -void ScanNodeID::setSelVector( - NodeTableScanState* tableState, offset_t startOffset, offset_t endOffset) { +void ScanNodeID::setSelVector(ExecutionContext* context, NodeTableScanState* tableState, + offset_t startOffset, offset_t endOffset) { if (tableState->isSemiMaskEnabled()) { outValueVector->state->selVector->resetSelectorToValuePosBuffer(); // Fill selected positions based on node mask for nodes between the given startOffset and @@ -94,7 +94,8 @@ void ScanNodeID::setSelVector( outValueVector->state->selVector->resetSelectorToUnselected(); } // Apply changes to the selVector from nodes metadata. - tableState->getTable()->setSelVectorForDeletedOffsets(transaction, outValueVector); + tableState->getTable()->setSelVectorForDeletedOffsets( + context->clientContext->getTx(), outValueVector); } } // namespace processor diff --git a/src/processor/operator/semi_masker.cpp b/src/processor/operator/semi_masker.cpp index 8b217f5e55f..418ebd7bf93 100644 --- a/src/processor/operator/semi_masker.cpp +++ b/src/processor/operator/semi_masker.cpp @@ -16,11 +16,11 @@ void BaseSemiMasker::initGlobalStateInternal(ExecutionContext* /*context*/) { } } -void BaseSemiMasker::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* /*context*/) { +void BaseSemiMasker::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { keyVector = resultSet->getValueVector(info->keyPos).get(); for (auto& [table, masks] : info->masksPerTable) { for (auto& maskWithIdx : masks) { - maskWithIdx.first->init(transaction); + maskWithIdx.first->init(context->clientContext->getTx()); } } } From 3415ff1a7de22c17112dbf03c863a5bf82b88e13 Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Mon, 4 Mar 2024 15:05:29 -0500 Subject: [PATCH 003/136] Store a stable reference instead of a duplicate string in the ColumnChunk's in-memory compression cache --- src/include/storage/store/dictionary_chunk.h | 36 +++++++++++++++++--- src/storage/store/dictionary_chunk.cpp | 9 +++-- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/include/storage/store/dictionary_chunk.h b/src/include/storage/store/dictionary_chunk.h index 24d59db74cd..e2fc64b9be4 100644 --- a/src/include/storage/store/dictionary_chunk.h +++ b/src/include/storage/store/dictionary_chunk.h @@ -1,6 +1,5 @@ #pragma once -#include "common/string_utils.h" #include "storage/store/column_chunk.h" namespace kuzu { @@ -32,9 +31,38 @@ class DictionaryChunk { // of characters stored. std::unique_ptr stringDataChunk; std::unique_ptr offsetChunk; - std::unordered_map> - indexTable; + + struct DictionaryEntry { + string_index_t index; + + std::string_view get(const DictionaryChunk& dict) const { return dict.getString(index); } + }; + + struct StringOps { + explicit StringOps(const DictionaryChunk* dict) : dict(dict) {} + const DictionaryChunk* dict; + using hash_type = std::hash; + using is_transparent = void; + + std::size_t operator()(const DictionaryEntry& entry) const { + return std::hash()(entry.get(*dict)); + } + std::size_t operator()(const char* str) const { return hash_type{}(str); } + std::size_t operator()(std::string_view str) const { return hash_type{}(str); } + std::size_t operator()(std::string const& str) const { return hash_type{}(str); } + + bool operator()(const DictionaryEntry& lhs, const DictionaryEntry& rhs) const { + return lhs.get(*dict) == rhs.get(*dict); + } + bool operator()(const DictionaryEntry& lhs, std::string_view rhs) const { + return lhs.get(*dict) == rhs; + } + bool operator()(std::string_view lhs, const DictionaryEntry& rhs) const { + return lhs == rhs.get(*dict); + } + }; + + std::unordered_set indexTable; }; } // namespace storage } // namespace kuzu diff --git a/src/storage/store/dictionary_chunk.cpp b/src/storage/store/dictionary_chunk.cpp index e4e9c0c35e4..2470aeaad7a 100644 --- a/src/storage/store/dictionary_chunk.cpp +++ b/src/storage/store/dictionary_chunk.cpp @@ -1,5 +1,7 @@ #include "storage/store/dictionary_chunk.h" +#include + #include using namespace kuzu::common; @@ -17,7 +19,8 @@ namespace storage { static const uint64_t OFFSET_CHUNK_INITIAL_CAPACITY = StorageConstants::NODE_GROUP_SIZE * 0.75; DictionaryChunk::DictionaryChunk(uint64_t capacity, bool enableCompression) - : enableCompression{enableCompression} { + : enableCompression{enableCompression}, + indexTable(0, StringOps(this) /*hash*/, StringOps(this) /*equals*/) { // Bitpacking might save 1 bit per value with regular ascii compared to UTF-8 stringDataChunk = ColumnChunkFactory::createColumnChunk( *LogicalType::UINT8(), false /*enableCompression*/, capacity); @@ -45,7 +48,7 @@ DictionaryChunk::string_index_t DictionaryChunk::appendString(std::string_view v auto found = indexTable.find(val); // If the string already exists in the dictionary, skip it and refer to the existing string if (enableCompression && found != indexTable.end()) { - return found->second; + return found->index; } auto leftSpace = stringDataChunk->getCapacity() - stringDataChunk->getNumValues(); if (leftSpace < val.size()) { @@ -61,7 +64,7 @@ DictionaryChunk::string_index_t DictionaryChunk::appendString(std::string_view v offsetChunk->setValue(startOffset, index); offsetChunk->setNumValues(index + 1); if (enableCompression) { - indexTable.insert({std::string{val}, index}); + indexTable.insert({static_cast(index)}); } return index; } From c1b22200c5089759acdde7168a4d8663e951aa37 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Sat, 2 Mar 2024 16:33:53 +0800 Subject: [PATCH 004/136] fix reset empty heap overflow --- src/include/storage/store/column_chunk.h | 2 +- src/storage/store/column_chunk.cpp | 22 +++++++++++++-------- src/storage/store/struct_column_chunk.cpp | 1 + src/storage/store/var_list_column_chunk.cpp | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index 14070e1bb72..4cff129b379 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -112,7 +112,7 @@ class ColumnChunk { virtual void copyVectorToBuffer(common::ValueVector* vector, common::offset_t startPosInChunk); private: - uint64_t getBufferSize() const; + uint64_t getBufferSize(uint64_t capacity_) const; protected: common::LogicalType dataType; diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 9beb2460f7b..60445d41fe1 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -157,7 +157,7 @@ ColumnChunk::ColumnChunk( void ColumnChunk::initializeBuffer(offset_t capacity_) { numBytesPerValue = getDataTypeSizeInChunk(dataType); capacity = capacity_; - bufferSize = getBufferSize(); + bufferSize = getBufferSize(capacity); buffer = std::make_unique(bufferSize); if (nullChunk) { nullChunk->initializeBuffer(capacity_); @@ -200,7 +200,8 @@ void ColumnChunk::resetToEmpty() { if (nullChunk) { nullChunk->resetToEmpty(); } - memset(buffer.get(), 0, bufferSize); + KU_ASSERT(bufferSize == getBufferSize(capacity)); + memset(buffer.get(), 0x00, bufferSize); numValues = 0; } @@ -288,8 +289,10 @@ void ColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_ } void ColumnChunk::resize(uint64_t newCapacity) { - capacity = newCapacity; - auto numBytesAfterResize = getBufferSize(); + if (newCapacity > capacity) { + capacity = newCapacity; + } + auto numBytesAfterResize = getBufferSize(newCapacity); if (numBytesAfterResize > bufferSize) { auto resizedBuffer = std::make_unique(numBytesAfterResize); memcpy(resizedBuffer.get(), buffer.get(), bufferSize); @@ -374,31 +377,33 @@ ColumnChunkMetadata ColumnChunk::getMetadataToFlush() const { return ColumnChunkMetadata(INVALID_PAGE_IDX, 0, numValues, *constantMetadata); } } + KU_ASSERT(bufferSize == getBufferSize(capacity)); return getMetadataFunction(buffer.get(), bufferSize, capacity, numValues); } ColumnChunkMetadata ColumnChunk::flushBuffer( BMFileHandle* dataFH, page_idx_t startPageIdx, const ColumnChunkMetadata& metadata) { if (!metadata.compMeta.isConstant()) { + KU_ASSERT(bufferSize == getBufferSize(capacity)); return flushBufferFunction(buffer.get(), bufferSize, dataFH, startPageIdx, metadata); } return metadata; } -uint64_t ColumnChunk::getBufferSize() const { +uint64_t ColumnChunk::getBufferSize(uint64_t capacity_) const { switch (dataType.getLogicalTypeID()) { case LogicalTypeID::BOOL: { // 8 values per byte, and we need a buffer size which is a multiple of 8 bytes. - return ceil(capacity / 8.0 / 8.0) * 8; + return ceil(capacity_ / 8.0 / 8.0) * 8; } case LogicalTypeID::FIXED_LIST: { auto numElementsInAPage = PageUtils::getNumElementsInAPage(numBytesPerValue, false /* hasNull */); - auto numPages = capacity / numElementsInAPage + (capacity % numElementsInAPage ? 1 : 0); + auto numPages = capacity_ / numElementsInAPage + (capacity_ % numElementsInAPage ? 1 : 0); return BufferPoolConstants::PAGE_4KB_SIZE * numPages; } default: { - return numBytesPerValue * capacity; + return numBytesPerValue * capacity_; } } } @@ -468,6 +473,7 @@ void NullColumnChunk::setNull(offset_t pos, bool isNull) { // TODO(Guodong): Better let NullColumnChunk also support `append` a vector. if (pos >= numValues) { numValues = pos + 1; + KU_ASSERT(numValues <= capacity); } } diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index f047221be5f..2c83e40308b 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -51,6 +51,7 @@ void StructColumnChunk::append(ValueVector* vector) { void StructColumnChunk::resize(uint64_t newCapacity) { ColumnChunk::resize(newCapacity); + capacity = newCapacity; for (auto& child : childChunks) { child->resize(newCapacity); } diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index 1865181ea65..058dfda7ca6 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -65,7 +65,7 @@ void VarListColumnChunk::append(ValueVector* vector) { while (numValues + numToAppend >= newCapacity) { newCapacity *= 1.5; } - if (capacity != newCapacity) { + if (capacity < newCapacity) { resize(newCapacity); } auto nextListOffsetInChunk = getListOffset(numValues); From 9e2399572926d4d65c18f81558c39e71e139025b Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Thu, 29 Feb 2024 13:51:29 -0500 Subject: [PATCH 005/136] Rework CSV_TO_PARQUET testing feature --- dataset/long-string-pk-tests/schema.cypher | 2 +- src/common/file_system/file_system.cpp | 4 + src/common/file_system/local_file_system.cpp | 12 ++ src/include/common/file_system/file_system.h | 2 + .../common/file_system/local_file_system.h | 2 + .../test_runner/csv_to_parquet_converter.h | 64 +++--- test/runner/e2e_test.cpp | 23 ++- .../copy/copy_pk_long_string_parquet.test | 1 - ...isabled => interactive-short-parquet.test} | 32 +-- ...uet.disabled => lsqb_queries_parquet.test} | 1 - .../test_files/order_by/order_by_parquet.test | 1 - .../read_list/large_adj_list_parquet.test | 1 - .../shortest_path/bfs_sssp_parquet.test | 59 +++--- .../tinysnb/parquet/tinysnb_parquet.test | 6 +- test/test_runner/CMakeLists.txt | 1 + test/test_runner/csv_to_parquet_converter.cpp | 191 ++++++++++++++++++ 16 files changed, 316 insertions(+), 86 deletions(-) rename test/test_files/ldbc/ldbc-interactive/{interactive-short-parquet.disabled => interactive-short-parquet.test} (69%) rename test/test_files/lsqb/{lsqb_queries_parquet.disabled => lsqb_queries_parquet.test} (99%) create mode 100644 test/test_runner/csv_to_parquet_converter.cpp diff --git a/dataset/long-string-pk-tests/schema.cypher b/dataset/long-string-pk-tests/schema.cypher index c2d3476cb82..014a774e006 100644 --- a/dataset/long-string-pk-tests/schema.cypher +++ b/dataset/long-string-pk-tests/schema.cypher @@ -1,2 +1,2 @@ -CREATE NODE TABLE Person(name STRING, spouse STRING, PRIMARY KEY (name)) +CREATE NODE TABLE Person (name STRING, spouse STRING, PRIMARY KEY (name)) create REL TABLE Knows (FROM Person TO Person); diff --git a/src/common/file_system/file_system.cpp b/src/common/file_system/file_system.cpp index 6bdca6dd631..bc595b94d8c 100644 --- a/src/common/file_system/file_system.cpp +++ b/src/common/file_system/file_system.cpp @@ -7,6 +7,10 @@ void FileSystem::overwriteFile(const std::string& /*from*/, const std::string& / KU_UNREACHABLE; } +void FileSystem::copyFile(const std::string& /*from*/, const std::string& /*to*/) const { + KU_UNREACHABLE; +} + void FileSystem::createDir(const std::string& /*dir*/) const { KU_UNREACHABLE; } diff --git a/src/common/file_system/local_file_system.cpp b/src/common/file_system/local_file_system.cpp index 1f91d006b0c..71ff32ff9a0 100644 --- a/src/common/file_system/local_file_system.cpp +++ b/src/common/file_system/local_file_system.cpp @@ -147,6 +147,18 @@ void LocalFileSystem::overwriteFile(const std::string& from, const std::string& } } +void LocalFileSystem::copyFile(const std::string& from, const std::string& to) const { + if (!fileOrPathExists(from)) + return; + std::error_code errorCode; + if (!std::filesystem::copy_file(from, to, std::filesystem::copy_options::none, errorCode)) { + // LCOV_EXCL_START + throw Exception(stringFormat( + "Error copying file {} to {}. ErrorMessage: {}", from, to, errorCode.message())); + // LCOV_EXCL_STOP + } +} + void LocalFileSystem::createDir(const std::string& dir) const { try { if (std::filesystem::exists(dir)) { diff --git a/src/include/common/file_system/file_system.h b/src/include/common/file_system/file_system.h index dce4f2c0db1..8e7860a1349 100644 --- a/src/include/common/file_system/file_system.h +++ b/src/include/common/file_system/file_system.h @@ -29,6 +29,8 @@ class KUZU_API FileSystem { virtual void overwriteFile(const std::string& from, const std::string& to) const; + virtual void copyFile(const std::string& from, const std::string& to) const; + virtual void createDir(const std::string& dir) const; virtual void removeFileIfExists(const std::string& path) const; diff --git a/src/include/common/file_system/local_file_system.h b/src/include/common/file_system/local_file_system.h index caad85db2b5..c29f7b577de 100644 --- a/src/include/common/file_system/local_file_system.h +++ b/src/include/common/file_system/local_file_system.h @@ -36,6 +36,8 @@ class LocalFileSystem final : public FileSystem { void overwriteFile(const std::string& from, const std::string& to) const override; + void copyFile(const std::string& from, const std::string& to) const override; + void createDir(const std::string& dir) const override; void removeFileIfExists(const std::string& path) const override; diff --git a/test/include/test_runner/csv_to_parquet_converter.h b/test/include/test_runner/csv_to_parquet_converter.h index 9a2fe671142..54b9d805519 100644 --- a/test/include/test_runner/csv_to_parquet_converter.h +++ b/test/include/test_runner/csv_to_parquet_converter.h @@ -2,6 +2,8 @@ #include #include +#include "main/kuzu.h" + namespace kuzu { namespace testing { @@ -9,41 +11,51 @@ namespace testing { // The dataset directory must contain schema and copy files. class CSVToParquetConverter { public: - static std::string convertCSVDatasetToParquet( - const std::string& csvDatasetPath, const std::string& parquetDatasetPath); + explicit CSVToParquetConverter( + std::string csvDatasetPath, std::string parquetDatasetPath, uint64_t bufferPoolSize) + : csvDatasetPath{csvDatasetPath}, parquetDatasetPath{parquetDatasetPath}, + bufferPoolSize{bufferPoolSize} {} + + void convertCSVDatasetToParquet(); - inline static std::string replaceSlashesWithUnderscores(std::string dataset) { - std::replace(dataset.begin(), dataset.end(), '/', '_'); - return dataset; - } +private: + void copySchemaFile(); + void createTableInfo(std::string schemaFile); + void readCopyCommandsFromCSVDataset(); + void createCopyFile(); + void convertCSVFilesToParquet(); private: - struct CopyCommandInfo { - std::string table; + struct TableInfo { + std::string name; std::string csvFilePath; std::string parquetFilePath; - bool csvHasHeader; - char delimiter; + // get cypher query to convert csv file to parquet file + virtual std::string getConverterQuery() const = 0; }; - static std::vector readCopyCommandsFromCopyCypherFile( - const std::string& csvDatasetPath, const std::string& parquetDatasetPath); - - static void convertCSVFilesToParquet( - const std::vector& copyCommands); - - static CopyCommandInfo createCopyCommandInfo( - const std::string& parquetDatasetPath, std::string copyStatement); - - // TODO: This has to be re-implemented to not rely on arrow, instead of on our own parquet lib. - // static arrow::Status runCSVToParquetConversion(const std::string& inputFile, - // const std::string& outputFile, char delimiter, bool hasHeader); + struct NodeTableInfo final : public TableInfo { + std::string primaryKey; + // get converter query for node table + std::string getConverterQuery() const override; + }; - static void copySchema( - const std::string& csvDatasetPath, const std::string& parquetDatasetPath); + struct RelTableInfo final : public TableInfo { + std::shared_ptr fromTable; + std::shared_ptr toTable; + // get converter query for rel table + std::string getConverterQuery() const override; + }; - static void createCopyFile(const std::string& parquetDatasetPath, - const std::vector& copyCommands); +private: + std::string csvDatasetPath; + std::string parquetDatasetPath; + std::vector> tables; + std::unordered_map> tableNameMap; + uint64_t bufferPoolSize; + std::unique_ptr systemConfig; + std::unique_ptr tempDb; + std::unique_ptr tempConn; }; } // namespace testing diff --git a/test/runner/e2e_test.cpp b/test/runner/e2e_test.cpp index 4b397a22873..3cf9c9d0ac3 100644 --- a/test/runner/e2e_test.cpp +++ b/test/runner/e2e_test.cpp @@ -30,17 +30,23 @@ class EndToEndTest : public DBTest { } void setUpDataset() { - parquetTempDatasetPath = generateParquetTempDatasetPath(); - dataset = TestHelper::appendKuzuRootPath("dataset/" + dataset); if (datasetType == TestGroup::DatasetType::CSV_TO_PARQUET) { - throw NotImplementedException("CSV_TO_PARQUET dataset type is not implemented yet."); + auto csvDatasetPath = TestHelper::appendKuzuRootPath("dataset/" + dataset); + parquetTempDatasetPath = generateParquetTempDatasetPath(); + CSVToParquetConverter converter(csvDatasetPath, parquetTempDatasetPath, bufferPoolSize); + converter.convertCSVDatasetToParquet(); + dataset = parquetTempDatasetPath; + } else { + dataset = TestHelper::appendKuzuRootPath("dataset/" + dataset); } } void TearDown() override { std::filesystem::remove_all(databasePath); - std::filesystem::remove_all(parquetTempDatasetPath); BaseGraphTest::removeIEDBPath(); + if (datasetType == TestGroup::DatasetType::CSV_TO_PARQUET) { + std::filesystem::remove_all(parquetTempDatasetPath); + } } void TestBody() override { runTest(testStatements, checkpointWaitTimeout, connNames); } @@ -56,10 +62,11 @@ class EndToEndTest : public DBTest { std::set connNames; std::string generateParquetTempDatasetPath() { - return TestHelper::appendKuzuRootPath( - TestHelper::PARQUET_TEMP_DATASET_PATH + - CSVToParquetConverter::replaceSlashesWithUnderscores(dataset) + getTestGroupAndName() + - TestHelper::getMillisecondsSuffix()); + std::string datasetName = dataset; + std::replace(datasetName.begin(), datasetName.end(), '/', '_'); + return TestHelper::appendKuzuRootPath(TestHelper::PARQUET_TEMP_DATASET_PATH + datasetName + + "_" + getTestGroupAndName() + "_" + + TestHelper::getMillisecondsSuffix()); } }; diff --git a/test/test_files/copy/copy_pk_long_string_parquet.test b/test/test_files/copy/copy_pk_long_string_parquet.test index 0a34d037ff8..c70f0e7058e 100644 --- a/test/test_files/copy/copy_pk_long_string_parquet.test +++ b/test/test_files/copy/copy_pk_long_string_parquet.test @@ -1,6 +1,5 @@ -GROUP LongStringPKTest -DATASET PARQUET CSV_TO_PARQUET(long-string-pk-tests) --SKIP -- diff --git a/test/test_files/ldbc/ldbc-interactive/interactive-short-parquet.disabled b/test/test_files/ldbc/ldbc-interactive/interactive-short-parquet.test similarity index 69% rename from test/test_files/ldbc/ldbc-interactive/interactive-short-parquet.disabled rename to test/test_files/ldbc/ldbc-interactive/interactive-short-parquet.test index d89129ac1b0..1a2cafdfa1e 100644 --- a/test/test_files/ldbc/ldbc-interactive/interactive-short-parquet.disabled +++ b/test/test_files/ldbc/ldbc-interactive/interactive-short-parquet.test @@ -1,9 +1,7 @@ -# FIXME: this test is failing on Parquet dataset -GROUP LDBCTest -DATASET PARQUET CSV_TO_PARQUET(ldbc-sf01) -BUFFER_POOL_SIZE 1073741824 -SKIP - -- -CASE LDBCInteractiveShortParquet @@ -22,6 +20,20 @@ ---- 1 Mahinda|Perera|19891203|119.235.7.103|Firefox|1353|male|20100214153210447 +# IS2 should be changed to use Kleene Star relationship once that is implemented. +# The 'Case When' statement should be supported as coalesce(). +-LOG IS2 +-STATEMENT MATCH (:Person {id: 21990232555803})<-[:Post_hasCreator|:Comment_hasCreator]-(message) + WITH message,message.id AS messageId, message.creationDate AS messageCreationDate + ORDER BY messageCreationDate DESC, messageId ASC LIMIT 10 + MATCH (message)-[:replyOf_Post|:replyOf_Comment*1..2]->(post:Post), (post)-[:Post_hasCreator]->(person) + RETURN messageId, CASE WHEN message.imageFile is NULL THEN message.content ELSE message.imageFile END AS messageContent, messageCreationDate, post.id AS postId, person.id AS personId, person.firstName AS personFirstName, person.lastName AS personLastName + ORDER BY messageCreationDate DESC, messageId ASC; +---- 3 +1030792343617|About H•A•M, d Kanye West, released as the first single from their collaborati|20120823142307823|1030792343610|21990232556463|Victor|Antonescu +1030792343876|thx|20120818110412997|1030792343869|21990232555803|Carlos|Lopez +1030792343986|fine|20120810030544084|1030792343978|21990232556837|Bing|Li + -LOG IS3 -STATEMENT MATCH (n:Person {id: 1129})-[r:knows]-(friend) RETURN friend.id AS personId, @@ -58,17 +70,11 @@ Mahinda|Perera|19891203|119.235.7.103|Firefox|1353|male|20100214153210447 2199023256077|Ibrahim Bare|Ousmane # IS6 should be changed to use Kleene Star relationship once that is implemented -# This query is currently commented out, but will work as soon as multilabelled recursive rels are merged to master. -# -LOG IS6 -# -STATEMENT MATCH (m:Comment {id: 962072675825 })-[:replyOf_Post|:replyOf_Comment*1..2]->(p:Post)<-[:containerOf]-(f:Forum)-[:hasModerator]->(mod:Person) -# RETURN -# f.id AS forumId, -# f.title AS forumTitle, -# mod.id AS moderatorId, -# mod.firstName AS moderatorFirstName, -# mod.lastName AS moderatorLastName; -# ---- 1 -# 687194767491|Wall of Faisal Malik|21990232556585|Faisal|Malik +-LOG IS6 +-STATEMENT MATCH (m:Comment {id: 962072675825 })-[:replyOf_Post|:replyOf_Comment*1..2]->(p:Post)<-[:containerOf]-(f:Forum)-[:hasModerator]->(mod:Person) + RETURN f.id AS forumId,f.title AS forumTitle,mod.id AS moderatorId,mod.firstName AS moderatorFirstName, mod.lastName AS moderatorLastName; +---- 1 +687194767491|Wall of Faisal Malik|21990232556585|Faisal|Malik -LOG IS7 -STATEMENT MATCH (m:Post:Comment {id: 962072971887})<-[:replyOf_Comment|:replyOf_Post]-(c:Comment)-[:Comment_hasCreator]->(p:Person) diff --git a/test/test_files/lsqb/lsqb_queries_parquet.disabled b/test/test_files/lsqb/lsqb_queries_parquet.test similarity index 99% rename from test/test_files/lsqb/lsqb_queries_parquet.disabled rename to test/test_files/lsqb/lsqb_queries_parquet.test index 52497b65ed1..1694656414f 100644 --- a/test/test_files/lsqb/lsqb_queries_parquet.disabled +++ b/test/test_files/lsqb/lsqb_queries_parquet.test @@ -2,7 +2,6 @@ -DATASET PARQUET CSV_TO_PARQUET(lsqb-sf01) -BUFFER_POOL_SIZE 1073741824 -SKIP - -- -CASE LSQBTestParquet diff --git a/test/test_files/order_by/order_by_parquet.test b/test/test_files/order_by/order_by_parquet.test index 7e59732e506..6b587d3c682 100644 --- a/test/test_files/order_by/order_by_parquet.test +++ b/test/test_files/order_by/order_by_parquet.test @@ -10,7 +10,6 @@ -GROUP OrderByTests -DATASET PARQUET CSV_TO_PARQUET(order-by-tests) --SKIP -- diff --git a/test/test_files/read_list/large_adj_list_parquet.test b/test/test_files/read_list/large_adj_list_parquet.test index 5012aad2158..629908f427a 100644 --- a/test/test_files/read_list/large_adj_list_parquet.test +++ b/test/test_files/read_list/large_adj_list_parquet.test @@ -1,6 +1,5 @@ -GROUP EndToEndReadLargeListsTest -DATASET PARQUET CSV_TO_PARQUET(read-list-tests/large-list) --SKIP -- diff --git a/test/test_files/shortest_path/bfs_sssp_parquet.test b/test/test_files/shortest_path/bfs_sssp_parquet.test index 6fdaa31dbaa..fde3cc4253f 100644 --- a/test/test_files/shortest_path/bfs_sssp_parquet.test +++ b/test/test_files/shortest_path/bfs_sssp_parquet.test @@ -1,42 +1,41 @@ -GROUP ShortestPathTest -DATASET PARQUET CSV_TO_PARQUET(shortest-path-tests) --SKIP # Timestamp and Date columns are written as strings in parquet file. Parquet reader should support casting operations. -- -CASE BfsParquet -LOG SingleSourceAllDestinationsSSP --STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE a.fName = 'Alice' RETURN a.fName, b.fName, rels(r), properties(nodes(r), 'fName') +-STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE a.fName = 'Alice' RETURN a.fName, b.fName, properties(nodes(r), 'fName') ---- 7 -Alice|Bob|[(0:0)-{_LABEL: knows, _ID: 1:0}->(0:1)]|[] -Alice|Carol|[(0:0)-{_LABEL: knows, _ID: 1:1}->(0:2)]|[] -Alice|Dan|[(0:0)-{_LABEL: knows, _ID: 1:2}->(0:3)]|[] -Alice|Elizabeth|[(0:0)-{_LABEL: knows, _ID: 1:0}->(0:1),(0:1)-{_LABEL: knows, _ID: 1:6}->(0:4)]|[Bob] -Alice|Farooq|[(0:0)-{_LABEL: knows, _ID: 1:0}->(0:1),(0:1)-{_LABEL: knows, _ID: 1:6}->(0:4),(0:4)-{_LABEL: knows, _ID: 1:13}->(0:5)]|[Bob,Elizabeth] -Alice|Greg|[(0:0)-{_LABEL: knows, _ID: 1:0}->(0:1),(0:1)-{_LABEL: knows, _ID: 1:6}->(0:4),(0:4)-{_LABEL: knows, _ID: 1:14}->(0:6)]|[Bob,Elizabeth] -Alice|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|[(0:0)-{_LABEL: knows, _ID: 1:0}->(0:1),(0:1)-{_LABEL: knows, _ID: 1:6}->(0:4),(0:4)-{_LABEL: knows, _ID: 1:15}->(0:7)]|[Bob,Elizabeth] +Alice|Bob|[] +Alice|Carol|[] +Alice|Dan|[] +Alice|Elizabeth|[Bob] +Alice|Farooq|[Bob,Elizabeth] +Alice|Greg|[Bob,Elizabeth] +Alice|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|[Bob,Elizabeth] -LOG AllSourcesSingleDestinationQuery --STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE b.fName = 'Alice' RETURN a.fName, b.fName, rels(r), properties(nodes(r), 'usedNames') +-STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE b.fName = 'Alice' RETURN a.fName, b.fName, properties(nodes(r), 'usedNames') ---- 6 -Bob|Alice|[(0:0)-{_LABEL: knows, _ID: 1:3}->(0:1)]|[] -Carol|Alice|[(0:0)-{_LABEL: knows, _ID: 1:7}->(0:2)]|[] -Dan|Alice|[(0:0)-{_LABEL: knows, _ID: 1:10}->(0:3)]|[] -Elizabeth|Alice|[(0:0)-{_LABEL: knows, _ID: 1:20}->(0:7),(0:7)-{_LABEL: knows, _ID: 1:15}->(0:4)]|[[Ad,De,Hi,Kye,Orlan]] -Farooq|Alice|[(0:0)-{_LABEL: knows, _ID: 1:20}->(0:7),(0:7)-{_LABEL: knows, _ID: 1:17}->(0:5)]|[[Ad,De,Hi,Kye,Orlan]] -Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|Alice|[(0:0)-{_LABEL: knows, _ID: 1:20}->(0:7)]|[] +Bob|Alice|[] +Carol|Alice|[] +Dan|Alice|[] +Elizabeth|Alice|[[Ad,De,Hi,Kye,Orlan]] +Farooq|Alice|[[Ad,De,Hi,Kye,Orlan]] +Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|Alice|[] -LOG SingleSourceWithAllProperties --STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE a.fName = 'Alice' RETURN length(r), b, a +-STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE a.fName = 'Alice' RETURN length(r), b.*, a.* ---- 7 -1|{_ID: 0:1, _LABEL: person, ID: 2, fName: Bob, gender: 2, isStudent: True, isWorker: False, age: 30, eyeSight: 5.100000, birthdate: 1900-01-01, registerTime: 2008-11-03 15:25:30.000526, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [12,8], usedNames: [Bobby], courseScoresPerTerm: [[8,9],[9,10]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} -1|{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} -1|{_ID: 0:3, _LABEL: person, ID: 5, fName: Dan, gender: 2, isStudent: False, isWorker: True, age: 20, eyeSight: 4.800000, birthdate: 1950-07-23, registerTime: 2031-11-30 12:25:30, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1,9], usedNames: [Wolfeschlegelstein,Daniel], courseScoresPerTerm: [[7,4],[8,8],[9]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} -2|{_ID: 0:4, _LABEL: person, ID: 7, fName: Elizabeth, gender: 1, isStudent: False, isWorker: True, age: 20, eyeSight: 4.700000, birthdate: 1980-10-26, registerTime: 1976-12-23 11:21:42, lastJobDuration: 48:24:11, workedHours: [2], usedNames: [Ein], courseScoresPerTerm: [[6],[7],[8]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} -3|{_ID: 0:5, _LABEL: person, ID: 8, fName: Farooq, gender: 2, isStudent: True, isWorker: False, age: 25, eyeSight: 4.500000, birthdate: 1980-10-26, registerTime: 1972-07-31 13:22:30.678559, lastJobDuration: 00:18:00.024, workedHours: [3,4,5,6,7], usedNames: [Fesdwe], courseScoresPerTerm: [[8]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} -3|{_ID: 0:6, _LABEL: person, ID: 9, fName: Greg, gender: 2, isStudent: False, isWorker: False, age: 40, eyeSight: 4.900000, birthdate: 1980-10-26, registerTime: 1976-12-23 04:41:42, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1], usedNames: [Grad], courseScoresPerTerm: [[10]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} -3|{_ID: 0:7, _LABEL: person, ID: 10, fName: Hubert Blaine Wolfeschlegelsteinhausenbergerdorff, gender: 2, isStudent: False, isWorker: True, age: 83, eyeSight: 4.900000, birthdate: 1990-11-27, registerTime: 2023-02-21 13:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,11,12,3,4,5,6,7], usedNames: [Ad,De,Hi,Kye,Orlan], courseScoresPerTerm: [[7],[10],[6,7]]}|{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]]} +1|2|Bob|2|True|False|30|5.100000|1900-01-01|2008-11-03 15:25:30.000526|10 years 5 months 13:00:00|[12,8]|[Bobby]|[[8,9],[9,10]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] +1|3|Carol|1|False|True|45|5.000000|1940-06-22|1911-08-20 02:32:21|48:24:11|[4,5]|[Carmen,Fred]|[[8,10]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] +1|5|Dan|2|False|True|20|4.800000|1950-07-23|2031-11-30 12:25:30|10 years 5 months 13:00:00|[1,9]|[Wolfeschlegelstein,Daniel]|[[7,4],[8,8],[9]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] +2|7|Elizabeth|1|False|True|20|4.700000|1980-10-26|1976-12-23 11:21:42|48:24:11|[2]|[Ein]|[[6],[7],[8]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] +3|10|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|2|False|True|83|4.900000|1990-11-27|2023-02-21 13:25:30|3 years 2 days 13:02:00|[10,11,12,3,4,5,6,7]|[Ad,De,Hi,Kye,Orlan]|[[7],[10],[6,7]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] +3|8|Farooq|2|True|False|25|4.500000|1980-10-26|1972-07-31 13:22:30.678559|00:18:00.024|[3,4,5,6,7]|[Fesdwe]|[[8]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] +3|9|Greg|2|False|False|40|4.900000|1980-10-26|1976-12-23 04:41:42|10 years 5 months 13:00:00|[1]|[Grad]|[[10]]|0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]] -LOG SingleSourceSingleDestination -STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE a.fName = 'Alice' AND b.fName = 'Bob' RETURN a.fName, b.fName, length(r) @@ -44,13 +43,13 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|Alice|[(0:0)-{_LABEL: knows, _ Alice|Bob|1 -LOG SingleSourceAllDestinations2 --STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..2]->(b:person) WHERE a.fName = 'Elizabeth' RETURN a.fName, b.fName, rels(r), properties(nodes(r), '_Label') +-STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..2]->(b:person) WHERE a.fName = 'Elizabeth' RETURN a.fName, b.fName, properties(nodes(r), '_Label') ---- 5 -Elizabeth|Alice|[(0:4)-{_LABEL: knows, _ID: 1:15}->(0:7),(0:7)-{_LABEL: knows, _ID: 1:20}->(0:0)]|[person] -Elizabeth|Dan|[(0:4)-{_LABEL: knows, _ID: 1:15}->(0:7),(0:7)-{_LABEL: knows, _ID: 1:21}->(0:3)]|[person] -Elizabeth|Farooq|[(0:4)-{_LABEL: knows, _ID: 1:13}->(0:5)]|[] -Elizabeth|Greg|[(0:4)-{_LABEL: knows, _ID: 1:14}->(0:6)]|[] -Elizabeth|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|[(0:4)-{_LABEL: knows, _ID: 1:15}->(0:7)]|[] +Elizabeth|Alice|[person] +Elizabeth|Dan|[person] +Elizabeth|Farooq|[] +Elizabeth|Greg|[] +Elizabeth|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|[] -LOG SingleSourceUnreachableDestination -STATEMENT MATCH (a:person)-[r:knows* SHORTEST 1..30]->(b:person) WHERE a.fName = 'Alice' AND b.fName = 'Alice11' RETURN a.fName, b.fName, r diff --git a/test/test_files/tinysnb/parquet/tinysnb_parquet.test b/test/test_files/tinysnb/parquet/tinysnb_parquet.test index 18378e4dab3..bff6331e0e4 100644 --- a/test/test_files/tinysnb/parquet/tinysnb_parquet.test +++ b/test/test_files/tinysnb/parquet/tinysnb_parquet.test @@ -1,9 +1,7 @@ -# one sample from each tinysnb csv test CSV_TO_PARQUET -# https://github.com/kuzudb/kuzu/issues/1627 +# This test group is currently disabled since exporting fixed-list to parquet is not supported yet -GROUP TinySnbParquet --SKIP -DATASET PARQUET CSV_TO_PARQUET(tinysnb) - +-SKIP -- -CASE TinySnbParquet diff --git a/test/test_runner/CMakeLists.txt b/test/test_runner/CMakeLists.txt index 594f6028b60..f1703a45723 100644 --- a/test/test_runner/CMakeLists.txt +++ b/test/test_runner/CMakeLists.txt @@ -1,6 +1,7 @@ add_library( test_runner OBJECT + csv_to_parquet_converter.cpp test_parser.cpp test_runner.cpp ) diff --git a/test/test_runner/csv_to_parquet_converter.cpp b/test/test_runner/csv_to_parquet_converter.cpp new file mode 100644 index 00000000000..a76047b2c9e --- /dev/null +++ b/test/test_runner/csv_to_parquet_converter.cpp @@ -0,0 +1,191 @@ +#include "test_runner/csv_to_parquet_converter.h" + +#include + +#include "common/exception/test.h" +#include "common/file_system/local_file_system.h" +#include "common/string_utils.h" +#include "spdlog/spdlog.h" +#include "test_helper/test_helper.h" + +using namespace kuzu::common; + +namespace kuzu { +namespace testing { + +void CSVToParquetConverter::copySchemaFile() { + LocalFileSystem localFileSystem; + auto csvSchemaFile = + localFileSystem.joinPath(csvDatasetPath, std::string(TestHelper::SCHEMA_FILE_NAME)); + auto parquetSchemaFile = + localFileSystem.joinPath(parquetDatasetPath, std::string(TestHelper::SCHEMA_FILE_NAME)); + if (!localFileSystem.fileOrPathExists(parquetSchemaFile)) { + localFileSystem.copyFile(csvSchemaFile, parquetSchemaFile); + } else { + localFileSystem.overwriteFile(csvSchemaFile, parquetSchemaFile); + } + createTableInfo(parquetSchemaFile); +} + +void CSVToParquetConverter::createTableInfo(std::string schemaFile) { + std::ifstream file(schemaFile); + if (!file.is_open()) { + throw TestException(stringFormat("Error opening file: {}, errno: {}.", schemaFile, errno)); + } + // This implementation stays as a temporary solution to create copy statements for rel tables + // We'll switch to use table_info once that function can provide everything needed + // table_info is mentioned in this issue https://github.com/kuzudb/kuzu/issues/2991 + std::string line; + while (getline(file, line)) { + auto tokens = StringUtils::split(line, " "); + + std::transform(tokens[0].begin(), tokens[0].end(), tokens[0].begin(), + [](unsigned char c) { return std::tolower(c); }); + std::transform(tokens[2].begin(), tokens[2].end(), tokens[2].begin(), + [](unsigned char c) { return std::tolower(c); }); + if (tokens[0] != "create" || tokens[2] != "table") { + throw TestException(stringFormat("Invalid CREATE statement: {}", line)); + } + + auto tableType = tokens[1]; + std::transform(tableType.begin(), tableType.end(), tableType.begin(), + [](unsigned char c) { return std::tolower(c); }); + auto tableName = tokens[3]; + + std::shared_ptr table; + if (tableType == "node") { + auto nodeTable = std::make_shared(); + size_t primaryKeyPos = line.find("PRIMARY KEY"); + if (primaryKeyPos != std::string::npos) { + size_t openParenPos = line.find("(", primaryKeyPos); + size_t closeParenPos = line.find(")", primaryKeyPos); + if (openParenPos != std::string::npos && closeParenPos != std::string::npos && + openParenPos < closeParenPos) { + nodeTable->primaryKey = + line.substr(openParenPos + 1, closeParenPos - openParenPos - 1); + table = nodeTable; + } else { + throw TestException( + stringFormat("PRIMARY KEY is not defined in node table: {}", line)); + } + } else { + throw TestException( + stringFormat("PRIMARY KEY is not defined in node table: {}", line)); + } + } else { + auto relTable = std::make_shared(); + size_t startPos = line.find("FROM"); + if (startPos != std::string::npos) { + size_t endPos = line.find_first_of(",)", startPos); + if (endPos != std::string::npos) { + auto tmp = StringUtils::splitBySpace(line.substr(startPos, endPos - startPos)); + relTable->fromTable = + std::dynamic_pointer_cast(tableNameMap[tmp[1]]); + relTable->toTable = + std::dynamic_pointer_cast(tableNameMap[tmp[3]]); + table = relTable; + } else { + throw TestException(stringFormat( + "FROM node and TO node are not defined in rel table: {}", line)); + } + } else { + throw TestException( + stringFormat("FROM node and TO node are not defined in rel table: {}", line)); + } + } + table->name = tableName; + tables.push_back(table); + tableNameMap[tableName] = table; + } +} + +std::string extractPath(std::string& str, char delimiter) { + std::string::size_type posStart = str.find_first_of(delimiter); + std::string::size_type posEnd = str.find_last_of(delimiter); + return str.substr(posStart + 1, posEnd - posStart - 1); +} + +void CSVToParquetConverter::readCopyCommandsFromCSVDataset() { + auto csvCopyFile = + LocalFileSystem::joinPath(csvDatasetPath, std::string(TestHelper::COPY_FILE_NAME)); + std::ifstream file(csvCopyFile); + if (!file.is_open()) { + throw TestException(stringFormat("Error opening file: {}, errno: {}.", csvCopyFile, errno)); + } + std::string line; + while (getline(file, line)) { + auto tokens = StringUtils::split(line, " "); + auto path = std::filesystem::path(extractPath(tokens[3], '"')); + auto table = tableNameMap[tokens[1]]; + table->csvFilePath = TestHelper::appendKuzuRootPath(path.string()); + auto parquetFileName = path.stem().string() + ".parquet"; + table->parquetFilePath = parquetDatasetPath + "/" + parquetFileName; + } +} + +void CSVToParquetConverter::createCopyFile() { + readCopyCommandsFromCSVDataset(); + auto parquetCopyFile = + LocalFileSystem::joinPath(parquetDatasetPath, std::string(TestHelper::COPY_FILE_NAME)); + std::ofstream outfile(parquetCopyFile); + if (!outfile.is_open()) { + throw TestException( + stringFormat("Error opening file: {}, errno: {}.", parquetCopyFile, errno)); + } + std::string kuzuRootPath = KUZU_ROOT_DIRECTORY + std::string("/"); + for (auto table : tables) { + auto cmd = stringFormat("COPY {} FROM \"{}\";", table->name, + table->parquetFilePath.substr(kuzuRootPath.length())); + outfile << cmd << '\n'; + } +} + +void CSVToParquetConverter::convertCSVFilesToParquet() { + // Load CSV Files to temp database + TestHelper::executeScript( + LocalFileSystem::joinPath(csvDatasetPath, std::string(TestHelper::SCHEMA_FILE_NAME)), + *tempConn); + TestHelper::executeScript( + LocalFileSystem::joinPath(csvDatasetPath, std::string(TestHelper::COPY_FILE_NAME)), + *tempConn); + + spdlog::set_level(spdlog::level::info); + for (auto table : tables) { + spdlog::info("Converting: {} to {}", table->csvFilePath, table->parquetFilePath); + auto cmd = table->getConverterQuery(); + tempConn->query(cmd); + spdlog::info("Executed query: {}", cmd); + } +} + +void CSVToParquetConverter::convertCSVDatasetToParquet() { + LocalFileSystem localFileSystem; + if (!localFileSystem.fileOrPathExists(parquetDatasetPath)) { + localFileSystem.createDir(parquetDatasetPath); + } + + copySchemaFile(); + createCopyFile(); + + systemConfig = std::make_unique(bufferPoolSize); + std::string tempDatabasePath = TestHelper::appendKuzuRootPath( + std::string(TestHelper::TMP_TEST_DIR) + "csv_to_parquet_converter_" + + TestHelper::getMillisecondsSuffix()); + tempDb = std::make_unique(tempDatabasePath, *systemConfig); + tempConn = std::make_unique(tempDb.get()); + + convertCSVFilesToParquet(); + std::filesystem::remove_all(tempDatabasePath); +} + +std::string CSVToParquetConverter::NodeTableInfo::getConverterQuery() const { + return stringFormat("COPY (MATCH (a:{}) RETURN a.*) TO \"{}\";", name, parquetFilePath); +} + +std::string CSVToParquetConverter::RelTableInfo::getConverterQuery() const { + return stringFormat("COPY (MATCH (a)-[e:{}]->(b) RETURN a.{}, b.{}, e.*) TO \"{}\";", name, + fromTable->primaryKey, toTable->primaryKey, parquetFilePath); +} + +} // namespace testing +} // namespace kuzu From ad24bf75c32f2c54730abc0fa7c13a32d267511c Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Wed, 6 Mar 2024 17:09:24 -0500 Subject: [PATCH 006/136] Avoid moving DictionaryChunks They now store pointers in the internal cache which would be invalidated when moving and can't be easily updated --- src/include/storage/store/dictionary_chunk.h | 3 +++ src/include/storage/store/string_column_chunk.h | 8 ++++---- src/storage/store/string_column_chunk.cpp | 15 +++++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/include/storage/store/dictionary_chunk.h b/src/include/storage/store/dictionary_chunk.h index e2fc64b9be4..42693964747 100644 --- a/src/include/storage/store/dictionary_chunk.h +++ b/src/include/storage/store/dictionary_chunk.h @@ -11,6 +11,9 @@ class DictionaryChunk { using string_index_t = uint32_t; DictionaryChunk(uint64_t capacity, bool enableCompression); + // A pointer to the dictionary chunk is stored in the StringOps for the indexTable + // and can't be modified easily. Moving would invalidate that pointer + DictionaryChunk(DictionaryChunk&& other) = delete; void resetToEmpty(); diff --git a/src/include/storage/store/string_column_chunk.h b/src/include/storage/store/string_column_chunk.h index 9a54337d8cb..6d7fd5e971d 100644 --- a/src/include/storage/store/string_column_chunk.h +++ b/src/include/storage/store/string_column_chunk.h @@ -31,11 +31,11 @@ class StringColumnChunk : public ColumnChunk { uint64_t getStringLength(common::offset_t pos) const { auto index = ColumnChunk::getValue(pos); - return dictionaryChunk.getStringLength(index); + return dictionaryChunk->getStringLength(index); } - inline DictionaryChunk& getDictionaryChunk() { return dictionaryChunk; } - inline const DictionaryChunk& getDictionaryChunk() const { return dictionaryChunk; } + inline DictionaryChunk& getDictionaryChunk() { return *dictionaryChunk; } + inline const DictionaryChunk& getDictionaryChunk() const { return *dictionaryChunk; } void finalize() final; @@ -46,7 +46,7 @@ class StringColumnChunk : public ColumnChunk { void setValueFromString(const char* value, uint64_t length, uint64_t pos); private: - DictionaryChunk dictionaryChunk; + std::unique_ptr dictionaryChunk; // If we never update a value, we don't need to prune unused strings in finalize bool needFinalize; }; diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index bb0d20075a9..f187b905b9f 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -1,5 +1,7 @@ #include "storage/store/string_column_chunk.h" +#include "storage/store/dictionary_chunk.h" + using namespace kuzu::common; namespace kuzu { @@ -8,11 +10,12 @@ namespace storage { StringColumnChunk::StringColumnChunk( LogicalType dataType, uint64_t capacity, bool enableCompression) : ColumnChunk{std::move(dataType), capacity, enableCompression}, - dictionaryChunk{capacity, enableCompression}, needFinalize{false} {} + dictionaryChunk{std::make_unique(capacity, enableCompression)}, needFinalize{ + false} {} void StringColumnChunk::resetToEmpty() { ColumnChunk::resetToEmpty(); - dictionaryChunk.resetToEmpty(); + dictionaryChunk->resetToEmpty(); } void StringColumnChunk::append(ValueVector* vector) { @@ -135,7 +138,7 @@ void StringColumnChunk::appendStringColumnChunk( void StringColumnChunk::setValueFromString(const char* value, uint64_t length, uint64_t pos) { KU_ASSERT(pos < numValues); - auto index = dictionaryChunk.appendString(std::string_view(value, length)); + auto index = dictionaryChunk->appendString(std::string_view(value, length)); ColumnChunk::setValue(index, pos); } @@ -147,14 +150,14 @@ void StringColumnChunk::finalize() { // We already de-duplicate as we go, but when out of place updates occur new values will be // appended to the end and the original values may be able to be pruned before flushing them to // disk - DictionaryChunk newDictionaryChunk{numValues, enableCompression}; + auto newDictionaryChunk = std::make_unique(numValues, enableCompression); // Each index is replaced by a new one for the de-duplicated data in the new dictionary. for (auto i = 0u; i < numValues; i++) { if (nullChunk->isNull(i)) { continue; } auto stringData = getValue(i); - auto index = newDictionaryChunk.appendString(stringData); + auto index = newDictionaryChunk->appendString(stringData); setValue(index, i); } dictionaryChunk = std::move(newDictionaryChunk); @@ -165,7 +168,7 @@ template<> std::string_view StringColumnChunk::getValue(offset_t pos) const { KU_ASSERT(pos < numValues); auto index = ColumnChunk::getValue(pos); - return dictionaryChunk.getString(index); + return dictionaryChunk->getString(index); } template<> From 5e598ec22e7dcb53110e5fef7f66187b97c09d6c Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Thu, 7 Mar 2024 18:55:49 +0800 Subject: [PATCH 007/136] update links to website (#3000) --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f229aab0690..896c9a48af6 100644 --- a/README.md +++ b/README.md @@ -46,20 +46,20 @@ Kùzu is available under a permissible license. So try it out and help us make i | C/C++ | [precompiled binaries](https://github.com/kuzudb/kuzu/releases/latest) | | CLI | [precompiled binaries](https://github.com/kuzudb/kuzu/releases/latest) | -To learn more about installation, see our [Installation](https://kuzudb.com/docusaurus/installation/) page. +To learn more about installation, see our [Installation](https://docs.kuzudb.com/installation) page. ## Getting Started -Refer to our [Getting Started](https://kuzudb.com/docusaurus/getting-started/) page for your first example. +Refer to our [Getting Started](https://docs.kuzudb.com/getting-started/) page for your first example. More information can be found at -- [Data Import](https://kuzudb.com/docusaurus/data-import/) -- [Cypher Reference](https://kuzudb.com/docusaurus/cypher/) -- [Client APIs](https://kuzudb.com/docusaurus/client-apis/) +- [Data Import](https://docs.kuzudb.com/data-import/) +- [Cypher Reference](https://docs.kuzudb.com/cypher/) +- [Client APIs](https://docs.kuzudb.com/client-apis/) ## Build from Source -Instructions can be found at [Build Kùzu from Source](https://kuzudb.com/docusaurus/development/building-kuzu). +Instructions can be found at [Build Kùzu from Source](https://docs.kuzudb.com/development/building-kuzu). ## Contributing We welcome contributions to Kùzu. If you are interested in contributing to Kùzu, please read our [Contributing Guide](CONTRIBUTING.md). From 38e4398e06cc37bc212e62b352b5740c233e199f Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Tue, 27 Feb 2024 09:26:32 -0500 Subject: [PATCH 008/136] Re-write partitioner to use ColumnChunks instead of ValueVectors ValueVectors have high memory fragmentation, and allocate strings in 256KB chunks for only 2048 strings. ColumnChunks can have a much larger capacity, and also support string de-duplication. --- src/include/processor/operator/partitioner.h | 20 ++- .../operator/persistent/rel_batch_insert.h | 9 +- src/include/storage/store/column_chunk.h | 13 +- src/include/storage/store/node_group.h | 15 +-- .../storage/store/string_column_chunk.h | 11 +- .../storage/store/struct_column_chunk.h | 9 +- .../storage/store/var_list_column_chunk.h | 7 +- src/processor/operator/partitioner.cpp | 54 ++++++--- .../operator/persistent/rel_batch_insert.cpp | 57 +++++---- src/storage/store/column_chunk.cpp | 114 +++++++++--------- src/storage/store/dictionary_chunk.cpp | 8 +- src/storage/store/node_group.cpp | 15 +-- src/storage/store/string_column_chunk.cpp | 67 +++++----- src/storage/store/struct_column_chunk.cpp | 37 ++++-- src/storage/store/var_list_column_chunk.cpp | 50 ++++++-- 15 files changed, 283 insertions(+), 203 deletions(-) diff --git a/src/include/processor/operator/partitioner.h b/src/include/processor/operator/partitioner.h index 65800727cc6..c6651840944 100644 --- a/src/include/processor/operator/partitioner.h +++ b/src/include/processor/operator/partitioner.h @@ -1,7 +1,7 @@ #pragma once -#include "common/data_chunk/data_chunk_collection.h" #include "processor/operator/sink.h" +#include "storage/store/column_chunk.h" namespace kuzu { namespace storage { @@ -20,7 +20,14 @@ struct PartitionerFunctions { // partitioning methods. For example, copy of rel tables require partitioning on both FWD and BWD // direction. Each partitioning method corresponds to a PartitioningState. struct PartitioningBuffer { - std::vector> partitions; + using ColumnChunkCollection = std::vector>; + struct Partition { + // One chunk for each column, grouped into a list + // so that groups from different threads can be quickly merged without copying + // E.g. [(a,b,c), (a,b,c)] where a is a chunk for column a, b for column b, etc. + std::vector chunks; + }; + std::vector partitions; void merge(std::unique_ptr localPartitioningStates); }; @@ -49,11 +56,11 @@ struct PartitionerSharedState { void resetState(); void merge(std::vector> localPartitioningStates); - inline common::DataChunkCollection* getPartitionBuffer( + inline PartitioningBuffer::Partition& getPartitionBuffer( common::vector_idx_t partitioningIdx, common::partition_idx_t partitionIdx) { KU_ASSERT(partitioningIdx < partitioningBuffers.size()); KU_ASSERT(partitionIdx < partitioningBuffers[partitioningIdx]->partitions.size()); - return partitioningBuffers[partitioningIdx]->partitions[partitionIdx].get(); + return partitioningBuffers[partitioningIdx]->partitions[partitionIdx]; } }; @@ -102,7 +109,7 @@ class Partitioner : public Sink { static void initializePartitioningStates( std::vector>& partitioningBuffers, - std::vector numPartitions, storage::MemoryManager* mm); + std::vector numPartitions); private: // TODO: For now, RelBatchInsert will guarantee all data are inside one data chunk. Should be @@ -111,6 +118,9 @@ class Partitioner : public Sink { common::partition_idx_t partitioningIdx, common::DataChunk* chunkToCopyFrom); private: + // Same size as a value vector. Each thread will allocate a chunk for each node group, + // so this should be kept relatively small to avoid allocating more memory than is needed + static const uint64_t CHUNK_SIZE = 2048; std::vector> infos; std::shared_ptr sharedState; std::unique_ptr localState; diff --git a/src/include/processor/operator/persistent/rel_batch_insert.h b/src/include/processor/operator/persistent/rel_batch_insert.h index ed10d2091f7..8df5ab2000f 100644 --- a/src/include/processor/operator/persistent/rel_batch_insert.h +++ b/src/include/processor/operator/persistent/rel_batch_insert.h @@ -3,6 +3,7 @@ #include "common/enums/rel_direction.h" #include "processor/operator/partitioner.h" #include "processor/operator/persistent/batch_insert.h" +#include "storage/store/column_chunk.h" #include "storage/store/node_group.h" namespace kuzu { @@ -60,20 +61,20 @@ class RelBatchInsert final : public BatchInsert { } private: - void prepareCSRNodeGroup(common::DataChunkCollection* partition, + void prepareCSRNodeGroup(PartitioningBuffer::Partition& partition, common::offset_t startNodeOffset, common::vector_idx_t offsetVectorIdx, common::offset_t numNodes); static common::length_t getGapSize(common::length_t length); static std::vector populateStartCSROffsetsAndLengths( storage::CSRHeaderChunks& csrHeader, common::offset_t numNodes, - common::DataChunkCollection* partition, common::vector_idx_t offsetVectorIdx); + PartitioningBuffer::Partition& partition, common::vector_idx_t offsetVectorIdx); static void populateEndCSROffsets( storage::CSRHeaderChunks& csrHeader, std::vector& gaps); static void setOffsetToWithinNodeGroup( - common::ValueVector* vector, common::offset_t startOffset); + storage::ColumnChunk& chunk, common::offset_t startOffset); static void setOffsetFromCSROffsets( - common::ValueVector* offsetVector, storage::ColumnChunk* offsetChunk); + storage::ColumnChunk* nodeOffsetChunk, storage::ColumnChunk* csrOffsetChunk); // We only check rel multiplcity constraint (MANY_ONE, ONE_ONE) for now. std::optional checkRelMultiplicityConstraint( diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index 4cff129b379..af24d378a88 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -55,6 +55,7 @@ class ColumnChunk { virtual ColumnChunkMetadata getMetadataToFlush() const; virtual void append(common::ValueVector* vector); + virtual void appendOne(common::ValueVector* vector, common::vector_idx_t pos); virtual void append( ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend); @@ -73,8 +74,7 @@ class ColumnChunk { // `offsetInVector`, we should flatten the vector to pos at `offsetInVector`. virtual void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk); - virtual void write( - common::ValueVector* vector, common::ValueVector* offsetsInChunk, bool isCSR); + virtual void write(ColumnChunk* chunk, ColumnChunk* offsetsInChunk, bool isCSR); virtual void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy); virtual void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, @@ -151,12 +151,12 @@ class BoolColumnChunk : public ColumnChunk { enableCompression, hasNullChunk) {} void append(common::ValueVector* vector) final; + void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) override; void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) override; - void write(common::ValueVector* valueVector, common::ValueVector* offsetInChunkVector, - bool isCSR) final; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; }; @@ -206,8 +206,11 @@ class NullColumnChunk final : public BoolColumnChunk { }; struct ColumnChunkFactory { + // inMemory starts string column chunk dictionaries at zero instead of reserving space for + // values to grow static std::unique_ptr createColumnChunk(common::LogicalType dataType, - bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE); + bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE, + bool inMemory = false); static std::unique_ptr createNullColumnChunk( bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { diff --git a/src/include/storage/store/node_group.h b/src/include/storage/store/node_group.h index 1343b10a6fd..755cfb98d13 100644 --- a/src/include/storage/store/node_group.h +++ b/src/include/storage/store/node_group.h @@ -1,7 +1,6 @@ #pragma once #include "common/column_data_format.h" -#include "common/data_chunk/data_chunk.h" #include "storage/store/column_chunk.h" namespace kuzu { @@ -32,15 +31,14 @@ class NodeGroup { uint64_t append(const std::vector& columnVectors, common::DataChunkState* columnState, uint64_t numValuesToAppend); common::offset_t append(NodeGroup* other, common::offset_t offsetInOtherNodeGroup); - void write(common::DataChunk* dataChunk, common::vector_idx_t offsetVector); + void write(std::vector>& data, common::vector_idx_t offsetVector); void finalize(uint64_t nodeGroupIdx_); virtual inline void writeToColumnChunk(common::vector_idx_t chunkIdx, - common::vector_idx_t vectorIdx, common::DataChunk* dataChunk, - common::ValueVector* offsetVector) { - chunks[chunkIdx]->write( - dataChunk->getValueVector(vectorIdx).get(), offsetVector, false /* isCSR */); + common::vector_idx_t vectorIdx, std::vector>& data, + ColumnChunk& offsetChunk) { + chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, false /*isCSR*/); } protected: @@ -81,9 +79,8 @@ class CSRNodeGroup : public NodeGroup { const CSRHeaderChunks& getCSRHeader() const { return csrHeaderChunks; } inline void writeToColumnChunk(common::vector_idx_t chunkIdx, common::vector_idx_t vectorIdx, - common::DataChunk* dataChunk, common::ValueVector* offsetVector) override { - chunks[chunkIdx]->write( - dataChunk->getValueVector(vectorIdx).get(), offsetVector, true /* isCSR */); + std::vector>& data, ColumnChunk& offsetChunk) override { + chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, true /* isCSR */); } private: diff --git a/src/include/storage/store/string_column_chunk.h b/src/include/storage/store/string_column_chunk.h index 6d7fd5e971d..2f999914d7d 100644 --- a/src/include/storage/store/string_column_chunk.h +++ b/src/include/storage/store/string_column_chunk.h @@ -1,6 +1,8 @@ #pragma once #include "common/assert.h" +#include "common/types/types.h" +#include "storage/store/column_chunk.h" #include "storage/store/dictionary_chunk.h" namespace kuzu { @@ -8,17 +10,18 @@ namespace storage { class StringColumnChunk : public ColumnChunk { public: - StringColumnChunk(common::LogicalType dataType, uint64_t capacity, bool enableCompression); + StringColumnChunk( + common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); void resetToEmpty() final; void append(common::ValueVector* vector) final; + void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final; void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) final; - void write(common::ValueVector* valueVector, common::ValueVector* offsetInChunkVector, - bool isCSR) final; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, @@ -43,7 +46,7 @@ class StringColumnChunk : public ColumnChunk { void appendStringColumnChunk(StringColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend); - void setValueFromString(const char* value, uint64_t length, uint64_t pos); + void setValueFromString(std::string_view value, uint64_t pos); private: std::unique_ptr dictionaryChunk; diff --git a/src/include/storage/store/struct_column_chunk.h b/src/include/storage/store/struct_column_chunk.h index f24628f1abc..110c424f095 100644 --- a/src/include/storage/store/struct_column_chunk.h +++ b/src/include/storage/store/struct_column_chunk.h @@ -1,5 +1,7 @@ #pragma once +#include "common/types/internal_id_t.h" +#include "common/types/types.h" #include "storage/store/column_chunk.h" namespace kuzu { @@ -7,7 +9,8 @@ namespace storage { class StructColumnChunk : public ColumnChunk { public: - StructColumnChunk(common::LogicalType dataType, uint64_t capacity, bool enableCompression); + StructColumnChunk( + common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); inline ColumnChunk* getChild(common::vector_idx_t childIdx) { KU_ASSERT(childIdx < childChunks.size()); @@ -20,11 +23,11 @@ class StructColumnChunk : public ColumnChunk { void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final; void append(common::ValueVector* vector) final; + void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) final; - void write(common::ValueVector* valueVector, common::ValueVector* offsetInChunkVector, - bool isCSR) final; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, diff --git a/src/include/storage/store/var_list_column_chunk.h b/src/include/storage/store/var_list_column_chunk.h index bc2c9986100..d2b896aeffe 100644 --- a/src/include/storage/store/var_list_column_chunk.h +++ b/src/include/storage/store/var_list_column_chunk.h @@ -27,7 +27,8 @@ struct VarListDataColumnChunk { class VarListColumnChunk : public ColumnChunk { public: - VarListColumnChunk(common::LogicalType dataType, uint64_t capacity, bool enableCompression); + VarListColumnChunk( + common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); inline ColumnChunk* getDataColumnChunk() const { return varListDataColumnChunk->dataColumnChunk.get(); @@ -36,11 +37,11 @@ class VarListColumnChunk : public ColumnChunk { void resetToEmpty() final; void append(common::ValueVector* vector) final; + void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; // Note: `write` assumes that no `append` will be called afterward. void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) final; - void write(common::ValueVector* valueVector, common::ValueVector* offsetInChunkVector, - bool isCSR) final; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 8db8df79e23..536d1af731c 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -1,5 +1,10 @@ #include "processor/operator/partitioner.h" +#include + +#include "common/constants.h" +#include "processor/execution_context.h" +#include "storage/store/column_chunk.h" #include "storage/store/node_table.h" using namespace kuzu::common; @@ -42,7 +47,7 @@ void PartitionerSharedState::initialize() { numPartitions.resize(2); numPartitions[0] = getNumPartitions(maxNodeOffsets[0]); numPartitions[1] = getNumPartitions(maxNodeOffsets[1]); - Partitioner::initializePartitioningStates(partitioningBuffers, numPartitions, mm); + Partitioner::initializePartitioningStates(partitioningBuffers, numPartitions); } partition_idx_t PartitionerSharedState::getNextPartition(vector_idx_t partitioningIdx) { @@ -71,9 +76,13 @@ void PartitionerSharedState::merge( void PartitioningBuffer::merge(std::unique_ptr localPartitioningState) { KU_ASSERT(partitions.size() == localPartitioningState->partitions.size()); for (auto partitionIdx = 0u; partitionIdx < partitions.size(); partitionIdx++) { - auto sharedPartition = partitions[partitionIdx].get(); - auto localPartition = localPartitioningState->partitions[partitionIdx].get(); - sharedPartition->merge(localPartition); + auto& sharedPartition = partitions[partitionIdx]; + auto& localPartition = localPartitioningState->partitions[partitionIdx]; + sharedPartition.chunks.reserve( + sharedPartition.chunks.size() + localPartition.chunks.size()); + for (auto j = 0u; j < localPartition.chunks.size(); j++) { + sharedPartition.chunks.push_back(std::move(localPartition.chunks[j])); + } } } @@ -91,10 +100,9 @@ void Partitioner::initGlobalStateInternal(ExecutionContext* /*context*/) { sharedState->initialize(); } -void Partitioner::initLocalStateInternal(ResultSet* /*resultSet*/, ExecutionContext* context) { +void Partitioner::initLocalStateInternal(ResultSet* /*resultSet*/, ExecutionContext* /*context*/) { localState = std::make_unique(); - initializePartitioningStates(localState->partitioningBuffers, sharedState->numPartitions, - context->clientContext->getMemoryManager()); + initializePartitioningStates(localState->partitioningBuffers, sharedState->numPartitions); } static void constructDataChunk(DataChunk* dataChunk, const std::vector& columnPositions, @@ -114,14 +122,14 @@ static void constructDataChunk(DataChunk* dataChunk, const std::vector& void Partitioner::initializePartitioningStates( std::vector>& partitioningBuffers, - std::vector numPartitions, MemoryManager* mm) { + std::vector numPartitions) { partitioningBuffers.resize(numPartitions.size()); for (auto partitioningIdx = 0u; partitioningIdx < numPartitions.size(); partitioningIdx++) { auto numPartition = numPartitions[partitioningIdx]; auto partitioningBuffer = std::make_unique(); partitioningBuffer->partitions.reserve(numPartition); for (auto i = 0u; i < numPartition; i++) { - partitioningBuffer->partitions.push_back(std::make_unique(mm)); + partitioningBuffer->partitions.emplace_back(); } partitioningBuffers[partitioningIdx] = std::move(partitioningBuffer); } @@ -146,18 +154,28 @@ void Partitioner::executeInternal(ExecutionContext* context) { void Partitioner::copyDataToPartitions( partition_idx_t partitioningIdx, DataChunk* chunkToCopyFrom) { - auto originalChunkState = chunkToCopyFrom->state; - chunkToCopyFrom->state = std::make_shared(1 /* capacity */); - chunkToCopyFrom->state->selVector->resetSelectorToValuePosBufferWithSize(1 /* size */); - for (auto i = 0u; i < originalChunkState->selVector->selectedSize; i++) { - auto posToCopyFrom = originalChunkState->selVector->selectedPositions[i]; + for (auto i = 0u; i < chunkToCopyFrom->state->selVector->selectedSize; i++) { + auto posToCopyFrom = chunkToCopyFrom->state->selVector->selectedPositions[i]; auto partitionIdx = partitionIdxes->getValue(posToCopyFrom); KU_ASSERT( partitionIdx < localState->getPartitioningBuffer(partitioningIdx)->partitions.size()); - auto partition = - localState->getPartitioningBuffer(partitioningIdx)->partitions[partitionIdx].get(); - chunkToCopyFrom->state->selVector->selectedPositions[0] = posToCopyFrom; - partition->append(*chunkToCopyFrom); + auto& partition = + localState->getPartitioningBuffer(partitioningIdx)->partitions[partitionIdx]; + if (partition.chunks.empty() || partition.chunks.back()[0]->getNumValues() + 1 > + partition.chunks.back()[0]->getCapacity()) { + partition.chunks.emplace_back(); + partition.chunks.back().reserve(chunkToCopyFrom->getNumValueVectors()); + for (auto i = 0u; i < chunkToCopyFrom->getNumValueVectors(); i++) { + partition.chunks.back().emplace_back(ColumnChunkFactory::createColumnChunk( + chunkToCopyFrom->getValueVector(i)->dataType, false /*enableCompression*/, + Partitioner::CHUNK_SIZE)); + } + } + KU_ASSERT(partition.chunks.back().size() == chunkToCopyFrom->getNumValueVectors()); + for (auto i = 0u; i < chunkToCopyFrom->getNumValueVectors(); i++) { + partition.chunks.back()[i]->appendOne( + chunkToCopyFrom->getValueVector(i).get(), posToCopyFrom); + } } } diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index 0b83ab14a9a..8fad55e9d20 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -3,7 +3,9 @@ #include "common/exception/copy.h" #include "common/exception/message.h" #include "common/string_format.h" +#include "processor/operator/partitioner.h" #include "processor/result/factorized_table.h" +#include "storage/store/column_chunk.h" #include "storage/store/rel_table.h" using namespace kuzu::common; @@ -37,12 +39,11 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { break; } // Read the whole partition, and set to node group. - auto partitioningBuffer = partitionerSharedState->getPartitionBuffer( + auto& partitioningBuffer = partitionerSharedState->getPartitionBuffer( relInfo->partitioningIdx, relLocalState->nodeGroupIdx); auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(relLocalState->nodeGroupIdx); - for (auto dataChunk : partitioningBuffer->getChunks()) { - setOffsetToWithinNodeGroup( - dataChunk->getValueVector(relInfo->offsetVectorIdx).get(), startNodeOffset); + for (auto& columns : partitioningBuffer.chunks) { + setOffsetToWithinNodeGroup(*columns[relInfo->offsetVectorIdx], startNodeOffset); } // Calculate num of source nodes in this node group. // This will be used to set the num of values of the node group. @@ -50,8 +51,8 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { partitionerSharedState->maxNodeOffsets[relInfo->partitioningIdx] - startNodeOffset + 1); prepareCSRNodeGroup( partitioningBuffer, startNodeOffset, relInfo->offsetVectorIdx, numNodes); - for (auto dataChunk : partitioningBuffer->getChunks()) { - localState->nodeGroup->write(dataChunk, relInfo->offsetVectorIdx); + for (auto& chunk : partitioningBuffer.chunks) { + localState->nodeGroup->write(chunk, relInfo->offsetVectorIdx); } localState->nodeGroup->finalize(relLocalState->nodeGroupIdx); // Flush node group to table. @@ -61,7 +62,7 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { } } -void RelBatchInsert::prepareCSRNodeGroup(DataChunkCollection* partition, +void RelBatchInsert::prepareCSRNodeGroup(PartitioningBuffer::Partition& partition, common::offset_t startNodeOffset, vector_idx_t offsetVectorIdx, offset_t numNodes) { auto relInfo = ku_dynamic_cast(info.get()); auto csrNodeGroup = ku_dynamic_cast(localState->nodeGroup.get()); @@ -79,9 +80,9 @@ void RelBatchInsert::prepareCSRNodeGroup(DataChunkCollection* partition, offset_t csrChunkCapacity = csrHeader.getEndCSROffset(numNodes - 1) + csrHeader.getCSRLength(numNodes - 1); localState->nodeGroup->resizeChunks(csrChunkCapacity); - for (auto dataChunk : partition->getChunks()) { - auto offsetVector = dataChunk->getValueVector(offsetVectorIdx).get(); - setOffsetFromCSROffsets(offsetVector, csrHeader.offset.get()); + for (auto& dataChunk : partition.chunks) { + auto offsetChunk = dataChunk[offsetVectorIdx].get(); + setOffsetFromCSROffsets(offsetChunk, csrHeader.offset.get()); } populateEndCSROffsets(csrHeader, gaps); } @@ -104,7 +105,7 @@ length_t RelBatchInsert::getGapSize(length_t length) { } std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(CSRHeaderChunks& csrHeader, - offset_t numNodes, DataChunkCollection* partition, vector_idx_t offsetVectorIdx) { + offset_t numNodes, PartitioningBuffer::Partition& partition, vector_idx_t offsetVectorIdx) { KU_ASSERT(numNodes == csrHeader.length->getNumValues() && numNodes == csrHeader.offset->getNumValues()); std::vector gaps; @@ -113,11 +114,10 @@ std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(CSRHeade auto csrLengths = (length_t*)csrHeader.length->getData(); std::fill(csrLengths, csrLengths + numNodes, 0); // Calculate length for each node. Store the num of tuples of node i at csrLengths[i]. - for (auto chunk : partition->getChunks()) { - auto offsetVector = chunk->getValueVector(offsetVectorIdx); - for (auto i = 0u; i < offsetVector->state->selVector->selectedSize; i++) { - auto pos = offsetVector->state->selVector->selectedPositions[i]; - auto nodeOffset = offsetVector->getValue(pos); + for (auto& chunk : partition.chunks) { + auto& offsetChunk = chunk[offsetVectorIdx]; + for (auto i = 0u; i < offsetChunk->getNumValues(); i++) { + auto nodeOffset = offsetChunk->getValue(i); KU_ASSERT(nodeOffset < numNodes); csrLengths[nodeOffset]++; } @@ -134,23 +134,22 @@ std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(CSRHeade return gaps; } -void RelBatchInsert::setOffsetToWithinNodeGroup(ValueVector* vector, offset_t startOffset) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INT64 && - vector->state->selVector->isUnfiltered()); - auto offsets = (offset_t*)vector->getData(); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { +void RelBatchInsert::setOffsetToWithinNodeGroup(ColumnChunk& chunk, offset_t startOffset) { + KU_ASSERT(chunk.getDataType().getPhysicalType() == PhysicalTypeID::INT64); + auto offsets = (offset_t*)chunk.getData(); + for (auto i = 0u; i < chunk.getNumValues(); i++) { offsets[i] -= startOffset; } } -void RelBatchInsert::setOffsetFromCSROffsets(ValueVector* offsetVector, ColumnChunk* offsetChunk) { - KU_ASSERT(offsetVector->dataType.getPhysicalType() == PhysicalTypeID::INT64 && - offsetVector->state->selVector->isUnfiltered()); - for (auto i = 0u; i < offsetVector->state->selVector->selectedSize; i++) { - auto nodeOffset = offsetVector->getValue(i); - auto csrOffset = offsetChunk->getValue(nodeOffset); - offsetVector->setValue(i, csrOffset); - offsetChunk->setValue(csrOffset + 1, nodeOffset); +void RelBatchInsert::setOffsetFromCSROffsets( + ColumnChunk* nodeOffsetChunk, ColumnChunk* csrOffsetChunk) { + KU_ASSERT(nodeOffsetChunk->getDataType().getPhysicalType() == PhysicalTypeID::INT64); + for (auto i = 0u; i < nodeOffsetChunk->getNumValues(); i++) { + auto nodeOffset = nodeOffsetChunk->getValue(i); + auto csrOffset = csrOffsetChunk->getValue(nodeOffset); + nodeOffsetChunk->setValue(csrOffset, i); + csrOffsetChunk->setValue(csrOffset + 1, nodeOffset); } } diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 60445d41fe1..78de045f063 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -1,6 +1,8 @@ #include "storage/store/column_chunk.h" #include "common/exception/copy.h" +#include "common/types/internal_id_t.h" +#include "common/types/types.h" #include "storage/compression/compression.h" #include "storage/storage_utils.h" #include "storage/store/string_column_chunk.h" @@ -211,6 +213,16 @@ void ColumnChunk::append(ValueVector* vector) { numValues += vector->state->selVector->selectedSize; } +void ColumnChunk::appendOne(common::ValueVector* vector, common::vector_idx_t pos) { + KU_ASSERT(vector->dataType.getPhysicalType() == dataType.getPhysicalType()); + KU_ASSERT(numValues < capacity); + memcpy(buffer.get() + numValues * numBytesPerValue, vector->getData() + pos * numBytesPerValue, + 1 * numBytesPerValue); + // TODO(Guodong): Should be wrapped into nullChunk->appendOne(vector); + nullChunk->setNull(this->numValues, vector->isNull(pos)); + numValues += 1; +} + void ColumnChunk::append( ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { KU_ASSERT(other->dataType.getPhysicalType() == dataType.getPhysicalType()); @@ -224,29 +236,24 @@ void ColumnChunk::append( numValues += numValuesToAppend; } -void ColumnChunk::write(ValueVector* vector, ValueVector* offsetsInChunk, bool isCSR) { - KU_ASSERT( - vector->dataType.getPhysicalType() == dataType.getPhysicalType() && - offsetsInChunk->dataType.getPhysicalType() == PhysicalTypeID::INT64 && - vector->state->selVector->selectedSize == offsetsInChunk->state->selVector->selectedSize); - auto offsets = (offset_t*)offsetsInChunk->getData(); - for (auto i = 0u; i < offsetsInChunk->state->selVector->selectedSize; i++) { - auto offsetInChunk = offsets[offsetsInChunk->state->selVector->selectedPositions[i]]; - KU_ASSERT(offsetInChunk < capacity); - if (!isCSR && !nullChunk->isNull(offsetInChunk)) { +void ColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) { + KU_ASSERT(chunk->dataType.getPhysicalType() == dataType.getPhysicalType() && + dstOffsets->dataType.getPhysicalType() == PhysicalTypeID::INT64 && + chunk->getNumValues() == dstOffsets->getNumValues()); + for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { + auto dstOffset = dstOffsets->getValue(i); + KU_ASSERT(dstOffset < capacity); + if (!isCSR && !nullChunk->isNull(dstOffset)) { throw CopyException(stringFormat("Node with offset: {} can only have one neighbour due " "to the MANY-ONE/ONE-ONE relationship constraint.", - offsetInChunk)); + dstOffset)); } - auto offsetInVector = vector->state->selVector->selectedPositions[i]; - if (!vector->isNull(offsetInVector)) { - memcpy(buffer.get() + offsetInChunk * numBytesPerValue, - vector->getData() + offsetInVector * numBytesPerValue, numBytesPerValue); - } - nullChunk->setNull(offsetInChunk, vector->isNull(offsetInVector)); - if (offsetInChunk >= numValues) { - numValues = offsetInChunk + 1; + if (!chunk->getNullChunk()->isNull(i)) { + memcpy(buffer.get() + dstOffset * numBytesPerValue, + chunk->getData() + i * numBytesPerValue, numBytesPerValue); } + nullChunk->setNull(dstOffset, chunk->getNullChunk()->isNull(i)); + numValues = dstOffset >= numValues ? dstOffset + 1 : numValues; } } @@ -335,6 +342,7 @@ offset_t ColumnChunk::getOffsetInBuffer(offset_t pos) const { void ColumnChunk::copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk) { auto bufferToWrite = buffer.get() + startPosInChunk * numBytesPerValue; + KU_ASSERT(startPosInChunk + vector->state->selVector->selectedSize <= capacity); auto vectorDataToWriteFrom = vector->getData(); if (vector->state->selVector->isUnfiltered()) { memcpy(bufferToWrite, vectorDataToWriteFrom, @@ -418,6 +426,13 @@ void BoolColumnChunk::append(ValueVector* vector) { numValues += vector->state->selVector->selectedSize; } +void BoolColumnChunk::appendOne(ValueVector* vector, vector_idx_t pos) { + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::BOOL); + nullChunk->setNull(numValues, vector->isNull(pos)); + NullMask::setNull((uint64_t*)buffer.get(), numValues, vector->getValue(pos)); + numValues += 1; +} + void BoolColumnChunk::append( ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { NullMask::copyNullMask((uint64_t*)static_cast(other)->buffer.get(), @@ -428,23 +443,18 @@ void BoolColumnChunk::append( numValues += numValuesToAppend; } -void BoolColumnChunk::write( - ValueVector* valueVector, ValueVector* offsetInChunkVector, bool /*isCSR*/) { - KU_ASSERT(valueVector->dataType.getPhysicalType() == PhysicalTypeID::BOOL && - offsetInChunkVector->dataType.getPhysicalType() == PhysicalTypeID::INT64 && - valueVector->state->selVector->selectedSize == - offsetInChunkVector->state->selVector->selectedSize); - auto offsets = (offset_t*)offsetInChunkVector->getData(); - for (auto i = 0u; i < offsetInChunkVector->state->selVector->selectedSize; i++) { - auto offsetInChunk = offsets[offsetInChunkVector->state->selVector->selectedPositions[i]]; - KU_ASSERT(offsetInChunk < capacity); - auto offsetInVector = valueVector->state->selVector->selectedPositions[i]; - NullMask::setNull( - (uint64_t*)buffer.get(), offsetInChunk, valueVector->getValue(offsetInVector)); +void BoolColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) { + KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && + chunk->getNumValues() == dstOffsets->getNumValues()); + for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { + auto dstOffset = dstOffsets->getValue(i); + KU_ASSERT(dstOffset < capacity); + NullMask::setNull((uint64_t*)buffer.get(), dstOffset, chunk->getValue(i)); if (nullChunk) { - nullChunk->write(valueVector, offsetInVector, offsetInChunk); + nullChunk->setNull(dstOffset, chunk->getNullChunk()->isNull(i)); } - numValues = offsetInChunk >= numValues ? offsetInChunk + 1 : numValues; + numValues = dstOffset >= numValues ? dstOffset + 1 : numValues; } } @@ -516,23 +526,19 @@ class FixedListColumnChunk : public ColumnChunk { numValues += numValuesToAppend; } - void write(ValueVector* valueVector, ValueVector* offsetInChunkVector, bool /*isCSR*/) final { - KU_ASSERT(valueVector->dataType.getPhysicalType() == PhysicalTypeID::FIXED_LIST && - offsetInChunkVector->dataType.getPhysicalType() == PhysicalTypeID::INT64); - auto offsets = (offset_t*)offsetInChunkVector->getData(); - KU_ASSERT(valueVector->state->selVector->selectedSize == - offsetInChunkVector->state->selVector->selectedSize); - for (auto i = 0u; i < offsetInChunkVector->state->selVector->selectedSize; i++) { - auto offsetInChunk = - offsets[offsetInChunkVector->state->selVector->selectedPositions[i]]; - KU_ASSERT(offsetInChunk < capacity); - auto offsetInVector = valueVector->state->selVector->selectedPositions[i]; - nullChunk->write(valueVector, offsetInVector, offsetInChunk); - if (!valueVector->isNull(offsetInVector)) { - memcpy(buffer.get() + getOffsetInBuffer(offsetInChunk), - valueVector->getData() + offsetInVector * numBytesPerValue, numBytesPerValue); + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) final { + KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::FIXED_LIST && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64); + KU_ASSERT(chunk->getNumValues() == dstOffsets->getNumValues()); + for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { + auto dstOffset = dstOffsets->getValue(i); + KU_ASSERT(dstOffset < capacity); + nullChunk->setNull(dstOffset, chunk->getNullChunk()->isNull(i)); + if (!chunk->getNullChunk()->isNull(i)) { + memcpy(buffer.get() + getOffsetInBuffer(dstOffset), + chunk->getData() + i * numBytesPerValue, numBytesPerValue); } - numValues = offsetInChunk >= numValues ? offsetInChunk + 1 : numValues; + numValues = dstOffset >= numValues ? dstOffset + 1 : numValues; } } @@ -595,7 +601,7 @@ class InternalIDColumnChunk final : public ColumnChunk { }; std::unique_ptr ColumnChunkFactory::createColumnChunk( - LogicalType dataType, bool enableCompression, uint64_t capacity) { + LogicalType dataType, bool enableCompression, uint64_t capacity, bool inMemory) { switch (dataType.getPhysicalType()) { case PhysicalTypeID::BOOL: { return std::make_unique(capacity, enableCompression); @@ -629,15 +635,15 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( } case PhysicalTypeID::STRING: { return std::make_unique( - std::move(dataType), capacity, enableCompression); + std::move(dataType), capacity, enableCompression, inMemory); } case PhysicalTypeID::VAR_LIST: { return std::make_unique( - std::move(dataType), capacity, enableCompression); + std::move(dataType), capacity, enableCompression, inMemory); } case PhysicalTypeID::STRUCT: { return std::make_unique( - std::move(dataType), capacity, enableCompression); + std::move(dataType), capacity, enableCompression, inMemory); } default: KU_UNREACHABLE; diff --git a/src/storage/store/dictionary_chunk.cpp b/src/storage/store/dictionary_chunk.cpp index 2470aeaad7a..69dc48ffda7 100644 --- a/src/storage/store/dictionary_chunk.cpp +++ b/src/storage/store/dictionary_chunk.cpp @@ -16,7 +16,7 @@ namespace storage { // chunk to be greater than the node group size since they remove unused entries. // So the chunk is initialized with a size equal to 3/4 the node group size, making sure there // is always extra space for updates. -static const uint64_t OFFSET_CHUNK_INITIAL_CAPACITY = StorageConstants::NODE_GROUP_SIZE * 0.75; +static const double OFFSET_CHUNK_CAPACITY_FACTOR = 0.75; DictionaryChunk::DictionaryChunk(uint64_t capacity, bool enableCompression) : enableCompression{enableCompression}, @@ -25,7 +25,7 @@ DictionaryChunk::DictionaryChunk(uint64_t capacity, bool enableCompression) stringDataChunk = ColumnChunkFactory::createColumnChunk( *LogicalType::UINT8(), false /*enableCompression*/, capacity); offsetChunk = ColumnChunkFactory::createColumnChunk( - *LogicalType::UINT64(), enableCompression, OFFSET_CHUNK_INITIAL_CAPACITY); + *LogicalType::UINT64(), enableCompression, capacity * OFFSET_CHUNK_CAPACITY_FACTOR); } void DictionaryChunk::resetToEmpty() { @@ -59,7 +59,9 @@ DictionaryChunk::string_index_t DictionaryChunk::appendString(std::string_view v stringDataChunk->setNumValues(startOffset + val.size()); auto index = offsetChunk->getNumValues(); if (index >= offsetChunk->getCapacity()) { - offsetChunk->resize(std::bit_ceil(offsetChunk->getCapacity() * CHUNK_RESIZE_RATIO)); + offsetChunk->resize(offsetChunk->getCapacity() == 0 ? + 2 : + (offsetChunk->getCapacity() * CHUNK_RESIZE_RATIO)); } offsetChunk->setValue(startOffset, index); offsetChunk->setNumValues(index + 1); diff --git a/src/storage/store/node_group.cpp b/src/storage/store/node_group.cpp index d50c64a0d53..2b4582503c8 100644 --- a/src/storage/store/node_group.cpp +++ b/src/storage/store/node_group.cpp @@ -125,21 +125,22 @@ offset_t NodeGroup::append(NodeGroup* other, offset_t offsetInOtherNodeGroup) { return numNodesToAppend; } -void NodeGroup::write(DataChunk* dataChunk, vector_idx_t offsetVectorIdx) { - KU_ASSERT(dataChunk->getNumValueVectors() == chunks.size() + 1); - auto offsetVector = dataChunk->getValueVector(offsetVectorIdx).get(); +void NodeGroup::write( + std::vector>& data, vector_idx_t offsetVectorIdx) { + KU_ASSERT(data.size() == chunks.size() + 1); + auto& offsetChunk = data[offsetVectorIdx]; vector_idx_t vectorIdx = 0, chunkIdx = 0; - for (auto i = 0u; i < dataChunk->getNumValueVectors(); i++) { + for (auto i = 0u; i < data.size(); i++) { if (i == offsetVectorIdx) { vectorIdx++; continue; } - KU_ASSERT(vectorIdx < dataChunk->getNumValueVectors()); - writeToColumnChunk(chunkIdx, vectorIdx, dataChunk, offsetVector); + KU_ASSERT(vectorIdx < data.size()); + writeToColumnChunk(chunkIdx, vectorIdx, data, *offsetChunk); chunkIdx++; vectorIdx++; } - numRows += offsetVector->state->selVector->selectedSize; + numRows += offsetChunk->getNumValues(); } void NodeGroup::finalize(uint64_t nodeGroupIdx_) { diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index f187b905b9f..a392f6bf358 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -1,5 +1,6 @@ #include "storage/store/string_column_chunk.h" +#include "storage/store/column_chunk.h" #include "storage/store/dictionary_chunk.h" using namespace kuzu::common; @@ -8,10 +9,11 @@ namespace kuzu { namespace storage { StringColumnChunk::StringColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression) + LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) : ColumnChunk{std::move(dataType), capacity, enableCompression}, - dictionaryChunk{std::make_unique(capacity, enableCompression)}, needFinalize{ - false} {} + dictionaryChunk{ + std::make_unique(inMemory ? 0 : capacity, enableCompression)}, + needFinalize{false} {} void StringColumnChunk::resetToEmpty() { ColumnChunk::resetToEmpty(); @@ -19,20 +21,23 @@ void StringColumnChunk::resetToEmpty() { } void StringColumnChunk::append(ValueVector* vector) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { // index is stored in main chunk, data is stored in the data chunk auto pos = vector->state->selVector->selectedPositions[i]; - nullChunk->setNull(numValues, vector->isNull(pos)); - if (vector->isNull(pos)) { - numValues++; - continue; - } - auto kuString = vector->getValue(pos); - auto dstPos = numValues; - numValues++; - setValueFromString(kuString.getAsString().c_str(), kuString.len, dstPos); + appendOne(vector, pos); + } +} + +void StringColumnChunk::appendOne(common::ValueVector* vector, common::vector_idx_t pos) { + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); + // index is stored in main chunk, data is stored in the data chunk + nullChunk->setNull(numValues, vector->isNull(pos)); + auto dstPos = numValues++; + if (vector->isNull(pos)) { + return; } + auto kuString = vector->getValue(pos); + setValueFromString(kuString.getAsStringView(), dstPos); } void StringColumnChunk::append( @@ -62,30 +67,26 @@ void StringColumnChunk::write( } if (!vector->isNull(offsetInVector)) { auto kuStr = vector->getValue(offsetInVector); - setValueFromString(kuStr.getAsString().c_str(), kuStr.len, offsetInChunk); + setValueFromString(kuStr.getAsStringView(), offsetInChunk); } } -void StringColumnChunk::write( - ValueVector* valueVector, ValueVector* offsetInChunkVector, bool /*isCSR*/) { - KU_ASSERT(valueVector->dataType.getPhysicalType() == PhysicalTypeID::STRING && - offsetInChunkVector->dataType.getPhysicalType() == PhysicalTypeID::INT64 && - valueVector->state->selVector->selectedSize == - offsetInChunkVector->state->selVector->selectedSize); - for (auto i = 0u; i < valueVector->state->selVector->selectedSize; i++) { - auto pos = valueVector->state->selVector->selectedPositions[i]; - auto offsetInChunk = offsetInChunkVector->getValue(pos); +void StringColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) { + KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRING && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && + chunk->getNumValues() == dstOffsets->getNumValues()); + for (auto i = 0u; i < chunk->getNumValues(); i++) { + auto offsetInChunk = dstOffsets->getValue(i); if (!needFinalize && offsetInChunk < numValues) [[unlikely]] { needFinalize = true; } - auto offsetInVector = valueVector->state->selVector->selectedPositions[i]; - nullChunk->setNull(offsetInChunk, valueVector->isNull(offsetInVector)); + nullChunk->setNull(offsetInChunk, chunk->getNullChunk()->isNull(i)); if (offsetInChunk >= numValues) { numValues = offsetInChunk + 1; } - if (!valueVector->isNull(offsetInVector)) { - auto kuStr = valueVector->getValue(offsetInVector); - setValueFromString((const char*)kuStr.getData(), kuStr.len, offsetInChunk); + if (!chunk->getNullChunk()->isNull(i)) { + auto stringChunk = ku_dynamic_cast(chunk); + setValueFromString(stringChunk->getValue(i), offsetInChunk); } } } @@ -101,8 +102,7 @@ void StringColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, continue; } auto srcStringChunk = ku_dynamic_cast(srcChunk); - auto stringInOtherChunk = srcStringChunk->getValue(srcPos); - setValueFromString(stringInOtherChunk.data(), stringInOtherChunk.size(), dstPos); + setValueFromString(srcStringChunk->getValue(srcPos), dstPos); } } @@ -131,14 +131,13 @@ void StringColumnChunk::appendStringColumnChunk( indices[posInChunk] = 0; continue; } - auto stringInOtherChunk = other->getValue(posInOtherChunk); - setValueFromString(stringInOtherChunk.data(), stringInOtherChunk.size(), posInChunk); + setValueFromString(other->getValue(posInOtherChunk), posInChunk); } } -void StringColumnChunk::setValueFromString(const char* value, uint64_t length, uint64_t pos) { +void StringColumnChunk::setValueFromString(std::string_view value, uint64_t pos) { KU_ASSERT(pos < numValues); - auto index = dictionaryChunk->appendString(std::string_view(value, length)); + auto index = dictionaryChunk->appendString(value); ColumnChunk::setValue(index, pos); } diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index 2c83e40308b..cafd0e26f2d 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -1,5 +1,9 @@ #include "storage/store/struct_column_chunk.h" +#include "common/types/internal_id_t.h" +#include "common/types/types.h" +#include "storage/store/column_chunk.h" + using namespace kuzu::common; namespace kuzu { @@ -8,13 +12,13 @@ namespace storage { // TODO: need to handle this case, when the whole struct entry is null, should set all fields to // null too. StructColumnChunk::StructColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression) + LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) : ColumnChunk{std::move(dataType), capacity} { auto fieldTypes = StructType::getFieldTypes(&this->dataType); childChunks.resize(fieldTypes.size()); for (auto i = 0u; i < fieldTypes.size(); i++) { childChunks[i] = ColumnChunkFactory::createColumnChunk( - *fieldTypes[i]->copy(), enableCompression, capacity); + *fieldTypes[i]->copy(), enableCompression, capacity, inMemory); } } @@ -49,6 +53,17 @@ void StructColumnChunk::append(ValueVector* vector) { numValues += vector->state->selVector->selectedSize; } +void StructColumnChunk::appendOne(ValueVector* vector, vector_idx_t pos) { + auto numFields = StructType::getNumFields(&dataType); + for (auto i = 0u; i < numFields; i++) { + childChunks[i]->appendOne(StructVector::getFieldVector(vector, i).get(), pos); + } + for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { + nullChunk->setNull(numValues + i, vector->isNull(pos)); + } + numValues += 1; +} + void StructColumnChunk::resize(uint64_t newCapacity) { ColumnChunk::resize(newCapacity); capacity = newCapacity; @@ -77,18 +92,16 @@ void StructColumnChunk::write( } } -void StructColumnChunk::write( - ValueVector* valueVector, ValueVector* offsetInChunkVector, bool isCSR) { - KU_ASSERT(valueVector->dataType.getPhysicalType() == PhysicalTypeID::STRUCT); - auto offsets = reinterpret_cast(offsetInChunkVector->getData()); - for (auto i = 0u; i < offsetInChunkVector->state->selVector->selectedSize; i++) { - auto offsetInChunk = offsets[offsetInChunkVector->state->selVector->selectedPositions[i]]; +void StructColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) { + KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT); + for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { + auto offsetInChunk = dstOffsets->getValue(i); KU_ASSERT(offsetInChunk < capacity); - nullChunk->setNull(offsetInChunk, valueVector->isNull(i)); + nullChunk->setNull(offsetInChunk, chunk->getNullChunk()->isNull(i)); } - auto fields = StructVector::getFieldVectors(valueVector); - for (auto i = 0u; i < fields.size(); i++) { - childChunks[i]->write(fields[i].get(), offsetInChunkVector, isCSR); + auto structChunk = ku_dynamic_cast(chunk); + for (auto i = 0u; i < childChunks.size(); i++) { + childChunks[i]->write(structChunk->getChild(i), dstOffsets, isCSR); } } diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index 058dfda7ca6..733eddeb0f2 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -2,6 +2,7 @@ #include "common/cast.h" #include "common/types/value/value.h" +#include "storage/store/column_chunk.h" using namespace kuzu::common; @@ -24,12 +25,12 @@ void VarListDataColumnChunk::resizeBuffer(uint64_t numValues) { } VarListColumnChunk::VarListColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression) + LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) : ColumnChunk{std::move(dataType), capacity, enableCompression, true /* hasNullChunk */}, needFinalize{false} { varListDataColumnChunk = std::make_unique( ColumnChunkFactory::createColumnChunk(*VarListType::getChildType(&this->dataType)->copy(), - enableCompression, 0 /* capacity */)); + enableCompression, 0 /* capacity */, inMemory)); KU_ASSERT(this->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); } @@ -88,7 +89,33 @@ void VarListColumnChunk::append(ValueVector* vector) { } copyListValues(vector->getValue(pos), dataVector); } - numValues += vector->state->selVector->selectedSize; + numValues += numToAppend; +} + +void VarListColumnChunk::appendOne(common::ValueVector* vector, common::vector_idx_t pos) { + auto numToAppend = 1; + auto newCapacity = capacity; + while (numValues + numToAppend >= newCapacity) { + newCapacity *= 1.5; + } + if (capacity != newCapacity) { + resize(newCapacity); + } + auto nextListOffsetInChunk = getListOffset(numValues); + auto offsetBufferToWrite = (offset_t*)(buffer.get()); + uint64_t listLen = vector->isNull(pos) ? 0 : vector->getValue(pos).size; + nullChunk->setNull(numValues, vector->isNull(pos)); + nextListOffsetInChunk += listLen; + offsetBufferToWrite[numValues] = nextListOffsetInChunk; + + varListDataColumnChunk->resizeBuffer(nextListOffsetInChunk); + auto dataVector = ListVector::getDataVector(vector); + dataVector->setState(std::make_unique()); + dataVector->state->selVector->resetSelectorToValuePosBuffer(); + if (!vector->isNull(pos)) { + copyListValues(vector->getValue(pos), dataVector); + } + numValues += numToAppend; } void VarListColumnChunk::appendNullList() { @@ -99,21 +126,18 @@ void VarListColumnChunk::appendNullList() { numValues++; } -void VarListColumnChunk::write( - ValueVector* valueVector, ValueVector* offsetInChunkVector, bool /*isCSR*/) { +void VarListColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) { needFinalize = true; if (!indicesColumnChunk) { initializeIndices(); } - KU_ASSERT(valueVector->dataType.getPhysicalType() == dataType.getPhysicalType() && - offsetInChunkVector->dataType.getPhysicalType() == PhysicalTypeID::INT64 && - valueVector->state->selVector->selectedSize == - offsetInChunkVector->state->selVector->selectedSize); + KU_ASSERT(chunk->getDataType().getPhysicalType() == dataType.getPhysicalType() && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && + chunk->getNumValues() == dstOffsets->getNumValues()); auto currentIndex = numValues; - append(valueVector); - for (auto i = 0u; i < offsetInChunkVector->state->selVector->selectedSize; i++) { - auto posInChunk = offsetInChunkVector->getValue( - offsetInChunkVector->state->selVector->selectedPositions[i]); + append(chunk, 0, chunk->getNumValues()); + for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { + auto posInChunk = dstOffsets->getValue(i); KU_ASSERT(posInChunk < capacity); indicesColumnChunk->setValue(currentIndex++, posInChunk); indicesColumnChunk->getNullChunk()->setNull(posInChunk, false); From b2f50ac7d1d303ce4cb0d02557fd62a2ec6d97a5 Mon Sep 17 00:00:00 2001 From: xiyang Date: Fri, 8 Mar 2024 15:15:05 -0500 Subject: [PATCH 009/136] Abstract client config --- src/binder/bind/bind_graph_pattern.cpp | 14 +-- src/common/task_system/task_scheduler.cpp | 2 +- src/include/common/constants.h | 6 +- src/include/common/timer.h | 4 +- src/include/main/client_config.h | 24 ++++++ src/include/main/client_context.h | 85 ++++++++----------- src/include/main/settings.h | 25 +++--- .../processor/operator/physical_operator.h | 11 +-- src/main/client_context.cpp | 79 +++++++++-------- src/optimizer/optimizer.cpp | 2 +- src/processor/operator/physical_operator.cpp | 12 +++ 11 files changed, 143 insertions(+), 121 deletions(-) create mode 100644 src/include/main/client_config.h diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index c3bd5c68ced..51dc25ac33d 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -454,20 +454,20 @@ std::pair Binder::bindVariableLengthRelBound( function::CastString::operation( ku_string_t{recursiveInfo->lowerBound.c_str(), recursiveInfo->lowerBound.length()}, lowerBound); - auto upperBound = clientContext->varLengthExtendMaxDepth; + auto maxDepth = clientContext->getClientConfig()->varLengthMaxDepth; + auto upperBound = maxDepth; if (!recursiveInfo->upperBound.empty()) { function::CastString::operation( ku_string_t{recursiveInfo->upperBound.c_str(), recursiveInfo->upperBound.length()}, upperBound); } if (lowerBound > upperBound) { - throw BinderException( - "Lower bound of rel " + relPattern.getVariableName() + " is greater than upperBound."); + throw BinderException(stringFormat( + "Lower bound of rel {} is greater than upperBound.", relPattern.getVariableName())); } - if (upperBound > clientContext->varLengthExtendMaxDepth) { - throw BinderException( - "Upper bound of rel " + relPattern.getVariableName() + - " exceeds maximum: " + std::to_string(clientContext->varLengthExtendMaxDepth) + "."); + if (upperBound > maxDepth) { + throw BinderException(stringFormat("Upper bound of rel {} exceeds maximum: {}.", + relPattern.getVariableName(), std::to_string(maxDepth))); } if ((relPattern.getRelType() == QueryRelType::ALL_SHORTEST || relPattern.getRelType() == QueryRelType::SHORTEST) && diff --git a/src/common/task_system/task_scheduler.cpp b/src/common/task_system/task_scheduler.cpp index a01a4114584..a107c920994 100644 --- a/src/common/task_system/task_scheduler.cpp +++ b/src/common/task_system/task_scheduler.cpp @@ -40,7 +40,7 @@ void TaskScheduler::scheduleTaskAndWaitOrError( taskLck.unlock(); break; } - if (context->clientContext->isTimeOutEnabled()) { + if (context->clientContext->hasTimeout()) { timeout = context->clientContext->getTimeoutRemainingInMS(); if (timeout == 0) { context->clientContext->interrupt(); diff --git a/src/include/common/constants.h b/src/include/common/constants.h index d769cf0cb49..96e6091a89e 100644 --- a/src/include/common/constants.h +++ b/src/include/common/constants.h @@ -173,9 +173,11 @@ struct PlannerKnobs { static constexpr uint64_t SIP_RATIO = 5; }; -struct ClientContextConstants { - // We disable query timeout by default. +struct ClientConfigDefault { + // 0 means timeout is disabled by default. static constexpr uint64_t TIMEOUT_IN_MS = 0; + static constexpr uint32_t VAR_LENGTH_MAX_DEPTH = 30; + static constexpr bool ENABLE_SEMI_MASK = true; }; struct OrderByConstants { diff --git a/src/include/common/timer.h b/src/include/common/timer.h index 8295babc85a..aabe69a2107 100644 --- a/src/include/common/timer.h +++ b/src/include/common/timer.h @@ -22,7 +22,7 @@ class Timer { finished = true; } - double getDuration() { + double getDuration() const { if (finished) { auto duration = stopTime - startTime; return (double)std::chrono::duration_cast(duration).count(); @@ -30,7 +30,7 @@ class Timer { throw Exception("Timer is still running."); } - uint64_t getElapsedTimeInMS() { + uint64_t getElapsedTimeInMS() const { auto now = std::chrono::high_resolution_clock::now(); auto duration = now - startTime; auto count = std::chrono::duration_cast(duration).count(); diff --git a/src/include/main/client_config.h b/src/include/main/client_config.h new file mode 100644 index 00000000000..8649c5bd2c0 --- /dev/null +++ b/src/include/main/client_config.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace kuzu { +namespace main { + +struct ClientConfig { + // System home directory. + std::string homeDirectory; + // File search path. + std::string fileSearchPath; + // If using semi mask in join. + bool enableSemiMask; + // Number of threads for execution. + uint64_t numThreads; + // Timeout (milliseconds) + uint64_t timeoutInMS; + // variable length maximum depth + uint32_t varLengthMaxDepth; +}; + +} // namespace main +} // namespace kuzu diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index 032350a949e..651d8370b34 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -6,6 +6,7 @@ #include #include +#include "client_config.h" #include "common/timer.h" #include "common/types/value/value.h" #include "function/scalar_function.h" @@ -47,77 +48,59 @@ class ClientContext { friend class Connection; friend class binder::Binder; friend class binder::ExpressionBinder; - friend class testing::TinySnbDDLTest; - friend class testing::TinySnbCopyCSVTransactionTest; - friend struct ThreadsSetting; - friend struct TimeoutSetting; - friend struct VarLengthExtendMaxDepthSetting; - friend struct EnableSemiMaskSetting; - friend struct HomeDirectorySetting; - friend struct FileSearchPathSetting; public: explicit ClientContext(Database* database); - inline void interrupt() { activeQuery.interrupted = true; } - - bool isInterrupted() const { return activeQuery.interrupted; } - - inline bool isTimeOutEnabled() const { return timeoutInMS != 0; } - - inline uint64_t getTimeoutRemainingInMS() { - KU_ASSERT(isTimeOutEnabled()); - auto elapsed = activeQuery.timer.getElapsedTimeInMS(); - return elapsed >= timeoutInMS ? 0 : timeoutInMS - elapsed; - } - - inline bool isEnableSemiMask() const { return enableSemiMask; } - - void startTimingIfEnabled(); - + // Client config + const ClientConfig* getClientConfig() const { return &config; } + ClientConfig* getClientConfigUnsafe() { return &config; } KUZU_API common::Value getCurrentSetting(const std::string& optionName); + // Timer and timeout + void interrupt() { activeQuery.interrupted = true; } + bool interrupted() const { return activeQuery.interrupted; } + bool hasTimeout() const { return config.timeoutInMS != 0; } + void setQueryTimeOut(uint64_t timeoutInMS); + uint64_t getQueryTimeOut() const; + void startTimer(); + uint64_t getTimeoutRemainingInMS() const; + void resetActiveQuery() { activeQuery.reset(); } + // Parallelism + void setMaxNumThreadForExec(uint64_t numThreads); + uint64_t getMaxNumThreadForExec() const; + + // Transaction. transaction::Transaction* getTx() const; KUZU_API transaction::TransactionContext* getTransactionContext() const; + // Replace function. inline bool hasReplaceFunc() { return replaceFunc != nullptr; } inline void setReplaceFunc(replace_func_t func) { replaceFunc = func; } + // Extension KUZU_API void setExtensionOption(std::string name, common::Value value); - - common::RandomEngine* getRandomEngine() { return randomEngine.get(); } - - common::VirtualFileSystem* getVFSUnsafe() const; - std::string getExtensionDir() const; + // Environment. + KUZU_API std::string getEnvVariable(const std::string& name); + + // Database component getters. KUZU_API Database* getDatabase() const { return database; } storage::StorageManager* getStorageManager(); storage::MemoryManager* getMemoryManager(); catalog::Catalog* getCatalog(); + common::VirtualFileSystem* getVFSUnsafe() const; + common::RandomEngine* getRandomEngine(); - KUZU_API std::string getEnvVariable(const std::string& name); - + // Query. std::unique_ptr prepare(std::string_view query); - - void setQueryTimeOut(uint64_t timeoutInMS); - - uint64_t getQueryTimeOut(); - - void setMaxNumThreadForExec(uint64_t numThreads); - - uint64_t getMaxNumThreadForExec(); - KUZU_API std::unique_ptr executeWithParams(PreparedStatement* preparedStatement, std::unordered_map> inputParams); - std::unique_ptr query(std::string_view queryStatement); - void runQuery(std::string query); private: - inline void resetActiveQuery() { activeQuery.reset(); } - std::unique_ptr query( std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans = true); @@ -152,17 +135,19 @@ class ClientContext { void commitUDFTrx(bool isAutoCommitTrx); - uint64_t numThreadsForExecution; + // Client side configurable settings. + ClientConfig config; + // Current query. ActiveQuery activeQuery; - uint64_t timeoutInMS; - uint32_t varLengthExtendMaxDepth; + // Transaction context. std::unique_ptr transactionContext; - bool enableSemiMask; + // Replace external object as pointer Value; replace_func_t replaceFunc; + // Extension configurable settings. std::unordered_map extensionOptionValues; + // Random generator for UUID. std::unique_ptr randomEngine; - std::string homeDirectory; - std::string fileSearchPath; + // Attached database. Database* database; std::mutex mtx; }; diff --git a/src/include/main/settings.h b/src/include/main/settings.h index 3e3b6a0a32c..a31ddd1f621 100644 --- a/src/include/main/settings.h +++ b/src/include/main/settings.h @@ -11,10 +11,10 @@ struct ThreadsSetting { static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::INT64; static void setContext(ClientContext* context, const common::Value& parameter) { KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::INT64); - context->numThreadsForExecution = parameter.getValue(); + context->getClientConfigUnsafe()->numThreads = parameter.getValue(); } static common::Value getSetting(ClientContext* context) { - return common::Value(context->numThreadsForExecution); + return common::Value(context->getClientConfig()->numThreads); } }; @@ -23,11 +23,10 @@ struct TimeoutSetting { static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::INT64; static void setContext(ClientContext* context, const common::Value& parameter) { KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::INT64); - context->timeoutInMS = parameter.getValue(); - context->startTimingIfEnabled(); + context->getClientConfigUnsafe()->timeoutInMS = parameter.getValue(); } static common::Value getSetting(ClientContext* context) { - return common::Value(context->timeoutInMS); + return common::Value(context->getClientConfig()->timeoutInMS); } }; @@ -36,10 +35,10 @@ struct VarLengthExtendMaxDepthSetting { static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::INT64; static void setContext(ClientContext* context, const common::Value& parameter) { KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::INT64); - context->varLengthExtendMaxDepth = parameter.getValue(); + context->getClientConfigUnsafe()->varLengthMaxDepth = parameter.getValue(); } static common::Value getSetting(ClientContext* context) { - return common::Value(context->varLengthExtendMaxDepth); + return common::Value(context->getClientConfig()->varLengthMaxDepth); } }; @@ -48,10 +47,10 @@ struct EnableSemiMaskSetting { static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::BOOL; static void setContext(ClientContext* context, const common::Value& parameter) { KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::BOOL); - context->enableSemiMask = parameter.getValue(); + context->getClientConfigUnsafe()->enableSemiMask = parameter.getValue(); } static common::Value getSetting(ClientContext* context) { - return common::Value(context->enableSemiMask); + return common::Value(context->getClientConfig()->enableSemiMask); } }; @@ -60,10 +59,10 @@ struct HomeDirectorySetting { static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::STRING; static void setContext(ClientContext* context, const common::Value& parameter) { KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::STRING); - context->homeDirectory = parameter.getValue(); + context->getClientConfigUnsafe()->homeDirectory = parameter.getValue(); } static common::Value getSetting(ClientContext* context) { - return common::Value::createValue(context->homeDirectory); + return common::Value::createValue(context->getClientConfig()->homeDirectory); } }; @@ -72,10 +71,10 @@ struct FileSearchPathSetting { static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::STRING; static void setContext(ClientContext* context, const common::Value& parameter) { KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::STRING); - context->fileSearchPath = parameter.getValue(); + context->getClientConfigUnsafe()->fileSearchPath = parameter.getValue(); } static common::Value getSetting(ClientContext* context) { - return common::Value::createValue(context->fileSearchPath); + return common::Value::createValue(context->getClientConfig()->fileSearchPath); } }; diff --git a/src/include/processor/operator/physical_operator.h b/src/include/processor/operator/physical_operator.h index 9076d65047a..867230393d3 100644 --- a/src/include/processor/operator/physical_operator.h +++ b/src/include/processor/operator/physical_operator.h @@ -1,6 +1,5 @@ #pragma once -#include "common/exception/interrupt.h" #include "processor/execution_context.h" #include "processor/result/result_set.h" @@ -130,15 +129,7 @@ class PhysicalOperator { // Local state is initialized for each thread. void initLocalState(ResultSet* resultSet, ExecutionContext* context); - inline bool getNextTuple(ExecutionContext* context) { - if (context->clientContext->isInterrupted()) { - throw common::InterruptException{}; - } - metrics->executionTime.start(); - auto result = getNextTuplesInternal(context); - metrics->executionTime.stop(); - return result; - } + bool getNextTuple(ExecutionContext* context); std::unordered_map getProfilerKeyValAttributes( common::Profiler& profiler) const; diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 87d2e63b9b6..a510245c803 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -42,27 +42,51 @@ void ActiveQuery::reset() { timer = Timer(); } -ClientContext::ClientContext(Database* database) - : numThreadsForExecution{database->systemConfig.maxNumThreads}, - timeoutInMS{ClientContextConstants::TIMEOUT_IN_MS}, - varLengthExtendMaxDepth{DEFAULT_VAR_LENGTH_EXTEND_MAX_DEPTH}, - enableSemiMask{DEFAULT_ENABLE_SEMI_MASK}, database{database} { +ClientContext::ClientContext(Database* database) : database{database} { transactionContext = std::make_unique(database); randomEngine = std::make_unique(); - fileSearchPath = ""; #if defined(_WIN32) - homeDirectory = getEnvVariable("USERPROFILE"); + config.homeDirectory = getEnvVariable("USERPROFILE"); #else - homeDirectory = getEnvVariable("HOME"); + config.homeDirectory = getEnvVariable("HOME"); #endif + config.fileSearchPath = ""; + config.enableSemiMask = ClientConfigDefault::ENABLE_SEMI_MASK; + config.numThreads = database->systemConfig.maxNumThreads; + config.timeoutInMS = ClientConfigDefault::TIMEOUT_IN_MS; + config.varLengthMaxDepth = ClientConfigDefault::VAR_LENGTH_MAX_DEPTH; } -void ClientContext::startTimingIfEnabled() { - if (isTimeOutEnabled()) { +uint64_t ClientContext::getTimeoutRemainingInMS() const { + KU_ASSERT(hasTimeout()); + auto elapsed = activeQuery.timer.getElapsedTimeInMS(); + return elapsed >= config.timeoutInMS ? 0 : config.timeoutInMS - elapsed; +} + +void ClientContext::startTimer() { + if (hasTimeout()) { activeQuery.timer.start(); } } +void ClientContext::setQueryTimeOut(uint64_t timeoutInMS) { + lock_t lck{mtx}; + config.timeoutInMS = timeoutInMS; +} + +uint64_t ClientContext::getQueryTimeOut() const { + return config.timeoutInMS; +} + +void ClientContext::setMaxNumThreadForExec(uint64_t numThreads) { + lock_t lck{mtx}; + config.numThreads = numThreads; +} + +uint64_t ClientContext::getMaxNumThreadForExec() const { + return config.numThreads; +} + Value ClientContext::getCurrentSetting(const std::string& optionName) { auto lowerCaseOptionName = optionName; StringUtils::toLower(lowerCaseOptionName); @@ -96,12 +120,8 @@ void ClientContext::setExtensionOption(std::string name, common::Value value) { extensionOptionValues.insert_or_assign(name, std::move(value)); } -VirtualFileSystem* ClientContext::getVFSUnsafe() const { - return database->vfs.get(); -} - std::string ClientContext::getExtensionDir() const { - return common::stringFormat("{}/.kuzu/extension", homeDirectory); + return common::stringFormat("{}/.kuzu/extension", config.homeDirectory); } storage::StorageManager* ClientContext::getStorageManager() { @@ -116,6 +136,14 @@ catalog::Catalog* ClientContext::getCatalog() { return database->catalog.get(); } +VirtualFileSystem* ClientContext::getVFSUnsafe() const { + return database->vfs.get(); +} + +common::RandomEngine* ClientContext::getRandomEngine() { + return randomEngine.get(); +} + std::string ClientContext::getEnvVariable(const std::string& name) { #if defined(_WIN32) auto envValue = common::WindowsUtils::utf8ToUnicode(name.c_str()); @@ -133,15 +161,6 @@ std::string ClientContext::getEnvVariable(const std::string& name) { #endif } -void ClientContext::setMaxNumThreadForExec(uint64_t numThreads) { - numThreadsForExecution = numThreads; -} - -uint64_t ClientContext::getMaxNumThreadForExec() { - std::unique_lock lck{mtx}; - return numThreadsForExecution; -} - std::unique_ptr ClientContext::prepare(std::string_view query) { auto preparedStatement = std::unique_ptr(); std::unique_lock lck{mtx}; @@ -297,16 +316,6 @@ std::vector> ClientContext::parseQuery(std::string_vi return statements; } -void ClientContext::setQueryTimeOut(uint64_t timeoutInMS) { - lock_t lck{mtx}; - this->timeoutInMS = timeoutInMS; -} - -uint64_t ClientContext::getQueryTimeOut() { - lock_t lck{mtx}; - return this->timeoutInMS; -} - std::unique_ptr ClientContext::executeWithParams(PreparedStatement* preparedStatement, std::unordered_map> inputParams) { // NOLINT(performance-unnecessary-value-param): It doesn't make sense to pass @@ -358,7 +367,7 @@ std::unique_ptr ClientContext::executeAndAutoCommitIfNecessaryNoLoc } } this->resetActiveQuery(); - this->startTimingIfEnabled(); + this->startTimer(); auto mapper = PlanMapper( *database->storageManager, database->memoryManager.get(), database->catalog.get(), this); std::unique_ptr physicalPlan; diff --git a/src/optimizer/optimizer.cpp b/src/optimizer/optimizer.cpp index c89786f97e3..86d10f3249b 100644 --- a/src/optimizer/optimizer.cpp +++ b/src/optimizer/optimizer.cpp @@ -31,7 +31,7 @@ void Optimizer::optimize(planner::LogicalPlan* plan, main::ClientContext* client auto projectionPushDownOptimizer = ProjectionPushDownOptimizer(); projectionPushDownOptimizer.rewrite(plan); - if (client->isEnableSemiMask()) { + if (client->getClientConfig()->enableSemiMask) { // HashJoinSIPOptimizer should be applied after optimizers that manipulate hash join. auto hashJoinSIPOptimizer = HashJoinSIPOptimizer(); hashJoinSIPOptimizer.rewrite(plan); diff --git a/src/processor/operator/physical_operator.cpp b/src/processor/operator/physical_operator.cpp index ebae013256a..237b32e479d 100644 --- a/src/processor/operator/physical_operator.cpp +++ b/src/processor/operator/physical_operator.cpp @@ -1,5 +1,7 @@ #include "processor/operator/physical_operator.h" +#include "common/exception/interrupt.h" + using namespace kuzu::common; namespace kuzu { @@ -180,6 +182,16 @@ void PhysicalOperator::initLocalState(ResultSet* resultSet_, ExecutionContext* c initLocalStateInternal(resultSet_, context); } +bool PhysicalOperator::getNextTuple(ExecutionContext* context) { + if (context->clientContext->interrupted()) { + throw InterruptException{}; + } + metrics->executionTime.start(); + auto result = getNextTuplesInternal(context); + metrics->executionTime.stop(); + return result; +} + void PhysicalOperator::registerProfilingMetrics(Profiler* profiler) { auto executionTime = profiler->registerTimeMetric(getTimeMetricKey()); auto numOutputTuple = profiler->registerNumericMetric(getNumTupleMetricKey()); From 45c5aa96fe36cd08ba5c290a4ae335b3f73e7aa9 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Sat, 9 Mar 2024 11:26:46 +0400 Subject: [PATCH 010/136] Support use of QueryResult as a context manager (#3009) --- tools/python_api/src_py/query_result.py | 113 ++++++++++++++++----- tools/python_api/test/test_get_header.py | 58 +++++++---- tools/python_api/test/test_query_result.py | 10 ++ 3 files changed, 135 insertions(+), 46 deletions(-) diff --git a/tools/python_api/src_py/query_result.py b/tools/python_api/src_py/query_result.py index 75a5e719be8..27736aa62e9 100644 --- a/tools/python_api/src_py/query_result.py +++ b/tools/python_api/src_py/query_result.py @@ -23,6 +23,12 @@ def __init__(self, connection, query_result): self._query_result = query_result self.is_closed = False + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + def __del__(self): self.close() @@ -73,18 +79,22 @@ def close(self): Close the query result. """ - if self.is_closed: - return - self._query_result.close() - # Allows the connection to be garbage collected if the query result - # is closed manually by the user. - self.connection = None - self.is_closed = True + if not self.is_closed: + # Allows the connection to be garbage collected if the query result + # is closed manually by the user. + self._query_result.close() + self.connection = None + self.is_closed = True def get_as_df(self): """ Get the query result as a Pandas DataFrame. + See Also + -------- + get_as_pl : Get the query result as a Polars DataFrame. + get_as_arrow : Get the query result as a PyArrow Table. + Returns ------- pandas.DataFrame @@ -102,6 +112,11 @@ def get_as_pl(self): """ Get the query result as a Polars DataFrame. + See Also + -------- + get_as_df : Get the query result as a Pandas DataFrame. + get_as_arrow : Get the query result as a PyArrow Table. + Returns ------- polars.DataFrame @@ -109,7 +124,14 @@ def get_as_pl(self): """ import polars as pl - return pl.from_arrow(data=self.get_as_arrow(10_000)) + + target_n_elems = ( + 10_000_000 # adaptive chunk_size; target 10m elements per chunk + ) + target_chunk_size = max(target_n_elems // len(self.get_column_names()), 10) + return pl.from_arrow( + data=self.get_as_arrow(chunk_size=target_chunk_size), + ) def get_as_arrow(self, chunk_size): """ @@ -120,6 +142,11 @@ def get_as_arrow(self, chunk_size): chunk_size : int Number of rows to include in each chunk. + See Also + -------- + get_as_pl : Get the query result as a Polars DataFrame. + get_as_df : Get the query result as a Pandas DataFrame. + Returns ------- pyarrow.Table @@ -159,6 +186,26 @@ def get_column_names(self): self.check_for_query_result_close() return self._query_result.getColumnNames() + def get_schema(self): + """ + Get the column schema of the query result. + + Returns + ------- + dict + Schema of the query result. + + """ + + self.check_for_query_result_close() + return { + name: dtype + for name, dtype in zip( + self._query_result.getColumnNames(), + self._query_result.getColumnDataTypes(), + ) + } + def reset_iterator(self): """ Reset the iterator of the query result. @@ -203,7 +250,9 @@ def get_as_networkx(self, directed=True): table_primary_key_dict = {} def encode_node_id(node, table_primary_key_dict): - return node['_label'] + "_" + str(node[table_primary_key_dict[node['_label']]]) + return ( + node["_label"] + "_" + str(node[table_primary_key_dict[node["_label"]]]) + ) # De-duplicate nodes and rels while self.has_next(): @@ -218,36 +267,42 @@ def encode_node_id(node, table_primary_key_dict): elif column_type == Type.REL.value: _src = row[i]["_src"] _dst = row[i]["_dst"] - rels[(_src["table"], _src["offset"], _dst["table"], - _dst["offset"])] = row[i] + rels[ + (_src["table"], _src["offset"], _dst["table"], _dst["offset"]) + ] = row[i] elif column_type == Type.RECURSIVE_REL.value: - for node in row[i]['_nodes']: + for node in row[i]["_nodes"]: _id = node["_id"] nodes[(_id["table"], _id["offset"])] = node table_to_label_dict[_id["table"]] = node["_label"] - for rel in row[i]['_rels']: + for rel in row[i]["_rels"]: for key in rel: if rel[key] is None: del rel[key] _src = rel["_src"] _dst = rel["_dst"] - rels[(_src["table"], _src["offset"], _dst["table"], - _dst["offset"])] = rel + rels[ + ( + _src["table"], + _src["offset"], + _dst["table"], + _dst["offset"], + ) + ] = rel # Add nodes for node in nodes.values(): _id = node["_id"] - node_id = node['_label'] + "_" + str(_id["offset"]) - if node['_label'] not in table_primary_key_dict: - props = self.connection._get_node_property_names( - node['_label']) + node_id = node["_label"] + "_" + str(_id["offset"]) + if node["_label"] not in table_primary_key_dict: + props = self.connection._get_node_property_names(node["_label"]) for prop_name in props: - if props[prop_name]['is_primary_key']: - table_primary_key_dict[node['_label']] = prop_name + if props[prop_name]["is_primary_key"]: + table_primary_key_dict[node["_label"]] = prop_name break node_id = encode_node_id(node, table_primary_key_dict) - node[node['_label']] = True + node[node["_label"]] = True nx_graph.add_node(node_id, **node) # Add rels @@ -270,7 +325,11 @@ def _get_properties_to_extract(self): for i in range(len(column_names)): column_name = column_names[i] column_type = column_types[i] - if column_type in [Type.NODE.value, Type.REL.value, Type.RECURSIVE_REL.value]: + if column_type in [ + Type.NODE.value, + Type.REL.value, + Type.RECURSIVE_REL.value, + ]: properties_to_extract[i] = (column_type, column_name) return properties_to_extract @@ -280,7 +339,7 @@ def get_as_torch_geometric(self): torch_geometric.data.Data or torch_geometric.data.HeteroData. For node conversion, numerical and boolean properties are directly converted into tensor and - stored in Data/HeteroData. For properties cannot be converted into tensor automatically + stored in Data/HeteroData. For properties cannot be converted into tensor automatically (please refer to the notes below for more detail), they are returned as unconverted_properties. For rel conversion, rel is converted into edge_index tensor director. Edge properties are returned @@ -290,9 +349,9 @@ def get_as_torch_geometric(self): - If the type of a node property is not one of INT64, DOUBLE, or BOOL, it cannot be converted automatically. - If a node property contains a null value, it cannot be converted automatically. - - If a node property contains a nested list of variable length (e.g. [[1,2],[3]]), it cannot be + - If a node property contains a nested list of variable length (e.g. [[1,2],[3]]), it cannot be converted automatically. - - If a node property is a list or nested list, but the shape is inconsistent (e.g. the list length + - If a node property is a list or nested list, but the shape is inconsistent (e.g. the list length is 6 for one node but 5 for another node), it cannot be converted automatically. Additional conversion rules: @@ -363,7 +422,7 @@ def get_num_tuples(self): ------- int Number of tuples. - + """ self.check_for_query_result_close() return self._query_result.getNumTuples() diff --git a/tools/python_api/test/test_get_header.py b/tools/python_api/test/test_get_header.py index aa17b67feca..1d378e4b30b 100644 --- a/tools/python_api/test/test_get_header.py +++ b/tools/python_api/test/test_get_header.py @@ -1,26 +1,46 @@ def test_get_column_names(establish_connection): conn, db = establish_connection - result = conn.execute("MATCH (a:person)-[e:knows]->(b:person) RETURN a.fName, e.date, b.ID;") - column_names = result.get_column_names() - assert column_names[0] == 'a.fName' - assert column_names[1] == 'e.date' - assert column_names[2] == 'b.ID' - result.close() + with conn.execute( + "MATCH (a:person)-[e:knows]->(b:person) RETURN a.fName, e.date, b.ID;" + ) as result: + column_names = result.get_column_names() + assert column_names[0] == 'a.fName' + assert column_names[1] == 'e.date' + assert column_names[2] == 'b.ID' def test_get_column_data_types(establish_connection): conn, db = establish_connection - result = conn.execute( + with conn.execute( "MATCH (p:person) RETURN p.ID, p.fName, p.isStudent, p.eyeSight, p.birthdate, p.registerTime, " - "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;") - column_data_types = result.get_column_data_types() - assert column_data_types[0] == 'INT64' - assert column_data_types[1] == 'STRING' - assert column_data_types[2] == 'BOOL' - assert column_data_types[3] == 'DOUBLE' - assert column_data_types[4] == 'DATE' - assert column_data_types[5] == 'TIMESTAMP' - assert column_data_types[6] == 'INTERVAL' - assert column_data_types[7] == 'INT64[]' - assert column_data_types[8] == 'INT64[][]' - result.close() + "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;" + ) as result: + column_data_types = result.get_column_data_types() + assert column_data_types[0] == 'INT64' + assert column_data_types[1] == 'STRING' + assert column_data_types[2] == 'BOOL' + assert column_data_types[3] == 'DOUBLE' + assert column_data_types[4] == 'DATE' + assert column_data_types[5] == 'TIMESTAMP' + assert column_data_types[6] == 'INTERVAL' + assert column_data_types[7] == 'INT64[]' + assert column_data_types[8] == 'INT64[][]' + + +def test_get_schema(establish_connection): + conn, db = establish_connection + with conn.execute( + "MATCH (p:person) RETURN p.ID, p.fName, p.isStudent, p.eyeSight, p.birthdate, p.registerTime, " + "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;" + ) as result: + assert result.get_schema() == { + 'p.ID': 'INT64', + 'p.fName': 'STRING', + 'p.isStudent': 'BOOL', + 'p.eyeSight': 'DOUBLE', + 'p.birthdate': 'DATE', + 'p.registerTime': 'TIMESTAMP', + 'p.lastJobDuration': 'INTERVAL', + 'p.workedHours': 'INT64[]', + 'p.courseScoresPerTerm': 'INT64[][]' + } diff --git a/tools/python_api/test/test_query_result.py b/tools/python_api/test/test_query_result.py index 468bd45db66..17eadb3177a 100644 --- a/tools/python_api/test/test_query_result.py +++ b/tools/python_api/test/test_query_result.py @@ -24,3 +24,13 @@ def test_explain(establish_connection): result = conn.execute("EXPLAIN MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_num_tuples() == 1 result.close() + +def test_context_manager(establish_connection): + conn, db = establish_connection + with conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") as result: + assert result.get_num_tuples() == 1 + assert result.get_compiling_time() > 0 + + # context exit guarantees immediately 'close' of the underlying QueryResult + # (don't have to wait for __del__, which may not ever actually get called) + assert result.is_closed From a3a6c2a42bce95801d087becd0c34818d53eb892 Mon Sep 17 00:00:00 2001 From: xiyang Date: Fri, 8 Mar 2024 15:22:29 -0500 Subject: [PATCH 011/136] Pass client context to binder --- src/binder/bind/bind_comment_on.cpp | 2 +- src/binder/bind/bind_copy.cpp | 15 ++++--- src/binder/bind/bind_create_macro.cpp | 2 +- src/binder/bind/bind_ddl.cpp | 44 +++++++++++-------- src/binder/bind/bind_export_database.cpp | 11 +++-- src/binder/bind/bind_file_scan.cpp | 4 +- src/binder/bind/bind_graph_pattern.cpp | 35 ++++++++------- src/binder/bind/bind_import_database.cpp | 12 +++-- src/binder/bind/bind_reading_clause.cpp | 9 ++-- src/binder/bind/bind_standalone_call.cpp | 3 +- src/binder/bind/bind_updating_clause.cpp | 17 ++++--- src/binder/bind/copy/bind_copy_rdf_graph.cpp | 11 ++--- .../bind_comparison_expression.cpp | 5 +-- .../bind_function_expression.cpp | 32 +++++++------- .../bind_subquery_expression.cpp | 6 +-- src/binder/binder.cpp | 17 ++++--- src/binder/expression_binder.cpp | 2 +- src/extension/extension.cpp | 4 -- src/include/binder/binder.h | 15 ++----- src/include/binder/expression_binder.h | 8 +++- src/include/extension/extension.h | 2 - src/include/main/client_context.h | 5 +++ src/main/client_context.cpp | 8 ++-- test/graph_test/graph_test.cpp | 5 +-- 24 files changed, 149 insertions(+), 125 deletions(-) diff --git a/src/binder/bind/bind_comment_on.cpp b/src/binder/bind/bind_comment_on.cpp index 1f1c845fd7f..22a044efacb 100644 --- a/src/binder/bind/bind_comment_on.cpp +++ b/src/binder/bind/bind_comment_on.cpp @@ -12,7 +12,7 @@ std::unique_ptr Binder::bindCommentOn(const parser::Statement& s auto tableName = commentOn.getTable(); auto comment = commentOn.getComment(); validateTableExist(tableName); - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); + auto tableID = clientContext->getCatalog()->getTableID(clientContext->getTx(), tableName); return std::make_unique(tableID, tableName, comment); } diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index 6fbc5fc17c1..15e143646f1 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -70,8 +70,9 @@ std::unique_ptr Binder::bindCopyFromClause(const Statement& stat auto tableName = copyStatement.getTableName(); validateTableExist(tableName); // Bind to table schema. - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); - auto tableEntry = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto catalog = clientContext->getCatalog(); + auto tableID = catalog->getTableID(clientContext->getTx(), tableName); + auto tableEntry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); switch (tableEntry->getTableType()) { case TableType::REL_GROUP: { throw BinderException(stringFormat("Cannot copy into {} table with type {}.", tableName, @@ -154,10 +155,11 @@ std::unique_ptr Binder::bindCopyRelFrom(const parser::Statement& std::make_unique(func, std::move(bindData), columns, offset); auto srcTableID = relTableEntry->getSrcTableID(); auto dstTableID = relTableEntry->getDstTableID(); + auto catalog = clientContext->getCatalog(); auto srcSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext->getTx(), srcTableID)); + catalog->getTableCatalogEntry(clientContext->getTx(), srcTableID)); auto dstSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext->getTx(), dstTableID)); + catalog->getTableCatalogEntry(clientContext->getTx(), dstTableID)); auto srcKey = columns[0]; auto dstKey = columns[1]; expression_vector propertyColumns; @@ -240,10 +242,11 @@ void Binder::bindExpectedRelColumns(RelTableCatalogEntry* relTableEntry, const std::vector& inputColumnNames, std::vector& columnNames, std::vector& columnTypes) { KU_ASSERT(columnNames.empty() && columnTypes.empty()); + auto catalog = clientContext->getCatalog(); auto srcTable = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext->getTx(), relTableEntry->getSrcTableID())); + catalog->getTableCatalogEntry(clientContext->getTx(), relTableEntry->getSrcTableID())); auto dstTable = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext->getTx(), relTableEntry->getDstTableID())); + catalog->getTableCatalogEntry(clientContext->getTx(), relTableEntry->getDstTableID())); columnNames.push_back("from"); columnNames.push_back("to"); auto srcPKColumnType = *srcTable->getPrimaryKey()->getDataType(); diff --git a/src/binder/bind/bind_create_macro.cpp b/src/binder/bind/bind_create_macro.cpp index 5f1aca07ef9..25d06523a0b 100644 --- a/src/binder/bind/bind_create_macro.cpp +++ b/src/binder/bind/bind_create_macro.cpp @@ -16,7 +16,7 @@ std::unique_ptr Binder::bindCreateMacro(const Statement& stateme auto& createMacro = ku_dynamic_cast(statement); auto macroName = createMacro.getMacroName(); StringUtils::toUpper(macroName); - if (catalog.containsMacro(clientContext->getTx(), macroName)) { + if (clientContext->getCatalog()->containsMacro(clientContext->getTx(), macroName)) { throw BinderException{stringFormat("Macro {} already exists.", macroName)}; } parser::default_macro_args defaultArgs; diff --git a/src/binder/bind/bind_ddl.cpp b/src/binder/bind/bind_ddl.cpp index bdb113d29a6..41ed5d18873 100644 --- a/src/binder/bind/bind_ddl.cpp +++ b/src/binder/bind/bind_ddl.cpp @@ -167,7 +167,7 @@ BoundCreateTableInfo Binder::bindCreateRelTableGroupInfo(const CreateTableInfo* std::unique_ptr Binder::bindCreateTable(const Statement& statement) { auto& createTable = ku_dynamic_cast(statement); auto tableName = createTable.getInfo()->tableName; - if (catalog.containsTable(clientContext->getTx(), tableName)) { + if (clientContext->getCatalog()->containsTable(clientContext->getTx(), tableName)) { throw BinderException(tableName + " already exists in catalog."); } auto boundCreateInfo = bindCreateTableInfo(createTable.getInfo()); @@ -178,12 +178,13 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement auto& dropTable = ku_dynamic_cast(statement); auto tableName = dropTable.getTableName(); validateTableExist(tableName); - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); - auto tableEntry = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto catalog = clientContext->getCatalog(); + auto tableID = catalog->getTableID(clientContext->getTx(), tableName); + auto tableEntry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); switch (tableEntry->getTableType()) { case TableType::NODE: { // Check node table is not referenced by rel table. - for (auto& relTableEntry : catalog.getRelTableEntries(clientContext->getTx())) { + for (auto& relTableEntry : catalog->getRelTableEntries(clientContext->getTx())) { if (relTableEntry->isParent(tableID)) { throw BinderException(stringFormat("Cannot delete node table {} because it is " "referenced by relationship table {}.", @@ -191,7 +192,7 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement } } // Check node table is not referenced by rdf graph - for (auto& rdfEntry : catalog.getRdfGraphEntries(clientContext->getTx())) { + for (auto& rdfEntry : catalog->getRdfGraphEntries(clientContext->getTx())) { if (rdfEntry->isParent(tableID)) { throw BinderException(stringFormat( "Cannot delete node table {} because it is referenced by rdfGraph {}.", @@ -201,7 +202,7 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement } break; case TableType::REL: { // Check rel table is not referenced by rel group. - for (auto& relTableGroupEntry : catalog.getRelTableGroupEntries(clientContext->getTx())) { + for (auto& relTableGroupEntry : catalog->getRelTableGroupEntries(clientContext->getTx())) { if (relTableGroupEntry->isParent(tableID)) { throw BinderException(stringFormat("Cannot delete relationship table {} because it " "is referenced by relationship group {}.", @@ -209,7 +210,7 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement } } // Check rel table is not referenced by rdf graph. - for (auto& rdfGraphEntry : catalog.getRdfGraphEntries(clientContext->getTx())) { + for (auto& rdfGraphEntry : catalog->getRdfGraphEntries(clientContext->getTx())) { if (rdfGraphEntry->isParent(tableID)) { throw BinderException(stringFormat( "Cannot delete relationship table {} because it is referenced by rdfGraph {}.", @@ -220,7 +221,7 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement case TableType::RDF: { auto rdfGraphEntry = ku_dynamic_cast(tableEntry); // Check resource table is not referenced by rel table other than its triple table. - for (auto& relTableEntry : catalog.getRelTableEntries(clientContext->getTx())) { + for (auto& relTableEntry : catalog->getRelTableEntries(clientContext->getTx())) { if (relTableEntry->getTableID() == rdfGraphEntry->getResourceTripleTableID() || relTableEntry->getTableID() == rdfGraphEntry->getLiteralTripleTableID()) { continue; @@ -232,7 +233,7 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement } } // Check literal table is not referenced by rel table other than its triple table. - for (auto& relTableEntry : catalog.getRelTableEntries(clientContext->getTx())) { + for (auto& relTableEntry : catalog->getRelTableEntries(clientContext->getTx())) { if (relTableEntry->getTableID() == rdfGraphEntry->getLiteralTripleTableID()) { continue; } @@ -251,8 +252,9 @@ std::unique_ptr Binder::bindDropTable(const Statement& statement std::unique_ptr Binder::bindAlter(const Statement& statement) { auto& alter = ku_dynamic_cast(statement); - auto tableID = catalog.getTableID(clientContext->getTx(), alter.getInfo()->tableName); - for (auto& schema : catalog.getRdfGraphEntries(clientContext->getTx())) { + auto catalog = clientContext->getCatalog(); + auto tableID = catalog->getTableID(clientContext->getTx(), alter.getInfo()->tableName); + for (auto& schema : catalog->getRdfGraphEntries(clientContext->getTx())) { if (schema->isParent(tableID)) { throw BinderException( stringFormat("Cannot alter table {} because it is referenced by rdfGraph {}.", @@ -285,10 +287,11 @@ std::unique_ptr Binder::bindRenameTable(const Statement& stateme auto tableName = info->tableName; auto newName = extraInfo->newName; validateTableExist(tableName); - if (catalog.containsTable(clientContext->getTx(), newName)) { + auto catalog = clientContext->getCatalog(); + if (catalog->containsTable(clientContext->getTx(), newName)) { throw BinderException("Table: " + newName + " already exists."); } - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); + auto tableID = catalog->getTableID(clientContext->getTx(), tableName); auto boundExtraInfo = std::make_unique(newName); auto boundInfo = BoundAlterInfo(AlterType::RENAME_TABLE, tableName, tableID, std::move(boundExtraInfo)); @@ -332,8 +335,9 @@ std::unique_ptr Binder::bindAddProperty(const Statement& stateme auto dataType = bindDataType(extraInfo->dataType); auto propertyName = extraInfo->propertyName; validateTableExist(tableName); - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); - auto tableSchema = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto catalog = clientContext->getCatalog(); + auto tableID = catalog->getTableID(clientContext->getTx(), tableName); + auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); validatePropertyDDLOnTable(tableSchema, "add"); validatePropertyNotExist(tableSchema, propertyName); if (dataType->getLogicalTypeID() == LogicalTypeID::SERIAL) { @@ -356,8 +360,9 @@ std::unique_ptr Binder::bindDropProperty(const Statement& statem auto tableName = info->tableName; auto propertyName = extraInfo->propertyName; validateTableExist(tableName); - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); - auto tableEntry = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto catalog = clientContext->getCatalog(); + auto tableID = catalog->getTableID(clientContext->getTx(), tableName); + auto tableEntry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); validatePropertyDDLOnTable(tableEntry, "drop"); validatePropertyExist(tableEntry, propertyName); auto propertyID = tableEntry->getPropertyID(propertyName); @@ -381,8 +386,9 @@ std::unique_ptr Binder::bindRenameProperty(const Statement& stat auto propertyName = extraInfo->propertyName; auto newName = extraInfo->newName; validateTableExist(tableName); - auto tableID = catalog.getTableID(clientContext->getTx(), tableName); - auto tableSchema = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto catalog = clientContext->getCatalog(); + auto tableID = catalog->getTableID(clientContext->getTx(), tableName); + auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); validatePropertyDDLOnTable(tableSchema, "rename"); validatePropertyExist(tableSchema, propertyName); auto propertyID = tableSchema->getPropertyID(propertyName); diff --git a/src/binder/bind/bind_export_database.cpp b/src/binder/bind/bind_export_database.cpp index 6006e22fba4..b8bd885385d 100644 --- a/src/binder/bind/bind_export_database.cpp +++ b/src/binder/bind/bind_export_database.cpp @@ -1,6 +1,9 @@ #include "binder/copy/bound_export_database.h" #include "binder/query/bound_regular_query.h" +#include "catalog/catalog_entry/node_table_catalog_entry.h" +#include "catalog/catalog_entry/rel_table_catalog_entry.h" #include "common/exception/binder.h" +#include "common/file_system/virtual_file_system.h" #include "common/string_utils.h" #include "main/client_context.h" #include "parser/parser.h" @@ -81,7 +84,7 @@ ExportedTableData Binder::extractExportData(std::string selQuery, std::string ta std::unique_ptr Binder::bindExportDatabaseClause(const Statement& statement) { auto& exportDatabaseStatement = ku_dynamic_cast(statement); auto boundFilePath = exportDatabaseStatement.getFilePath(); - auto exportData = getExportInfo(catalog, clientContext->getTx(), this); + auto exportData = getExportInfo(*clientContext->getCatalog(), clientContext->getTx(), this); auto parsedOptions = bindParsingOptions(exportDatabaseStatement.getParsingOptionsRef()); auto fileType = getFileType(parsedOptions); if (fileType != FileType::CSV && fileType != FileType::PARQUET) { @@ -90,9 +93,9 @@ std::unique_ptr Binder::bindExportDatabaseClause(const Statement if (fileType != FileType::CSV && parsedOptions.size() != 0) { throw BinderException{"Only export to csv can have options."}; } - // try to create the directory, if it doesn't exist yet - if (!vfs->fileOrPathExists(boundFilePath)) { - vfs->createDir(boundFilePath); + auto fs = clientContext->getVFSUnsafe(); + if (!fs->fileOrPathExists(boundFilePath)) { + fs->createDir(boundFilePath); } else { throw BinderException(stringFormat("Directory {} already exists.", boundFilePath)); } diff --git a/src/binder/bind/bind_file_scan.cpp b/src/binder/bind/bind_file_scan.cpp index 230b88e2711..0d0e2ea0477 100644 --- a/src/binder/bind/bind_file_scan.cpp +++ b/src/binder/bind/bind_file_scan.cpp @@ -18,7 +18,7 @@ namespace binder { */ FileType Binder::bindFileType(const std::string& filePath) { std::filesystem::path fileName(filePath); - auto extension = vfs->getFileExtension(fileName); + auto extension = clientContext->getVFSUnsafe()->getFileExtension(fileName); auto fileType = FileTypeUtils::getFileTypeFromExtension(extension); return fileType; } @@ -38,7 +38,7 @@ FileType Binder::bindFileType(const std::vector& filePaths) { std::vector Binder::bindFilePaths(const std::vector& filePaths) { std::vector boundFilePaths; for (auto& filePath : filePaths) { - auto globbedFilePaths = vfs->glob(clientContext, filePath); + auto globbedFilePaths = clientContext->getVFSUnsafe()->glob(clientContext, filePath); if (globbedFilePaths.empty()) { throw BinderException{ stringFormat("No file found that matches the pattern: {}.", filePath)}; diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index 51dc25ac33d..0343ba490e3 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -245,9 +245,10 @@ std::shared_ptr Binder::createNonRecursiveQueryRel(const std::str // expression to mock as if predicate IRI exists in rel table. common::table_id_set_t rdfGraphTableIDSet; common::table_id_set_t nonRdfRelTableIDSet; + auto catalog = clientContext->getCatalog(); for (auto& tableID : relTableIDs) { bool isRdfRelTable = false; - for (auto& rdfGraphEntry : catalog.getRdfGraphEntries(clientContext->getTx())) { + for (auto& rdfGraphEntry : catalog->getRdfGraphEntries(clientContext->getTx())) { if (rdfGraphEntry->isParent(tableID)) { KU_ASSERT(rdfGraphEntry->getTableType() == TableType::RDF); rdfGraphTableIDSet.insert(rdfGraphEntry->getTableID()); @@ -261,10 +262,10 @@ std::shared_ptr Binder::createNonRecursiveQueryRel(const std::str if (!rdfGraphTableIDSet.empty()) { if (!nonRdfRelTableIDSet.empty()) { auto relTableName = - catalog.getTableCatalogEntry(clientContext->getTx(), *nonRdfRelTableIDSet.begin()) + catalog->getTableCatalogEntry(clientContext->getTx(), *nonRdfRelTableIDSet.begin()) ->getName(); auto rdfGraphName = - catalog.getTableCatalogEntry(clientContext->getTx(), *rdfGraphTableIDSet.begin()) + catalog->getTableCatalogEntry(clientContext->getTx(), *rdfGraphTableIDSet.begin()) ->getName(); throw BinderException(stringFormat( "Relationship pattern {} contains both PropertyGraph relationship " @@ -274,7 +275,7 @@ std::shared_ptr Binder::createNonRecursiveQueryRel(const std::str } common::table_id_vector_t resourceTableIDs; for (auto& tableID : rdfGraphTableIDSet) { - auto entry = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto entry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); auto rdfGraphEntry = ku_dynamic_cast(entry); resourceTableIDs.push_back(rdfGraphEntry->getResourceTableID()); @@ -286,7 +287,7 @@ std::shared_ptr Binder::createNonRecursiveQueryRel(const std::str std::vector resourceTableSchemas; for (auto tableID : resourceTableIDs) { resourceTableSchemas.push_back( - catalog.getTableCatalogEntry(clientContext->getTx(), tableID)); + catalog->getTableCatalogEntry(clientContext->getTx(), tableID)); } // Mock existence of pIRI property. auto pIRI = createPropertyExpression(std::string(rdf::IRI), queryRel->getUniqueName(), @@ -329,7 +330,7 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel std::unordered_set nodeTableIDs; for (auto relTableID : relTableIDs) { auto relTableEntry = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext->getTx(), relTableID)); + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), relTableID)); nodeTableIDs.insert(relTableEntry->getSrcTableID()); nodeTableIDs.insert(relTableEntry->getDstTableID()); } @@ -478,10 +479,11 @@ std::pair Binder::bindVariableLengthRelBound( } void Binder::bindQueryRelProperties(RelExpression& rel) { + auto catalog = clientContext->getCatalog(); std::vector tableCatalogEntries; for (auto tableID : rel.getTableIDs()) { - tableCatalogEntries.push_back( - catalog.getTableCatalogEntry(clientContext->getTx(), tableID)); + auto entry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); + tableCatalogEntries.push_back(entry); } auto propertyNames = getPropertyNames(tableCatalogEntries); for (auto& propertyName : propertyNames) { @@ -557,7 +559,8 @@ std::shared_ptr Binder::createQueryNode( } void Binder::bindQueryNodeProperties(NodeExpression& node) { - auto tableSchemas = catalog.getTableSchemas(clientContext->getTx(), node.getTableIDs()); + auto tableSchemas = + clientContext->getCatalog()->getTableSchemas(clientContext->getTx(), node.getTableIDs()); auto propertyNames = getPropertyNames(tableSchemas); for (auto& propertyName : propertyNames) { auto property = createPropertyExpression( @@ -569,20 +572,21 @@ void Binder::bindQueryNodeProperties(NodeExpression& node) { std::vector Binder::bindTableIDs( const std::vector& tableNames, bool nodePattern) { auto tx = clientContext->getTx(); + auto catalog = clientContext->getCatalog(); std::unordered_set tableIDSet; if (tableNames.empty()) { // Rewrite empty table names as all tables. if (nodePattern) { // Fill all node table schemas to node pattern. - if (!catalog.containsNodeTable(tx)) { + if (!catalog->containsNodeTable(tx)) { throw BinderException("No node table exists in database."); } - for (auto tableID : catalog.getNodeTableIDs(tx)) { + for (auto tableID : catalog->getNodeTableIDs(tx)) { tableIDSet.insert(tableID); } } else { // Fill all rel table schemas to rel pattern. - if (!catalog.containsRelTable(tx)) { + if (!catalog->containsRelTable(tx)) { throw BinderException("No rel table exists in database."); } - for (auto tableID : catalog.getRelTableIDs(tx)) { + for (auto tableID : catalog->getRelTableIDs(tx)) { tableIDSet.insert(tableID); } } @@ -612,7 +616,8 @@ std::vector Binder::getNodeTableIDs(const std::vector& t } std::vector Binder::getNodeTableIDs(table_id_t tableID) { - auto tableSchema = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto tableSchema = + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), tableID); switch (tableSchema->getTableType()) { case TableType::NODE: { return {tableID}; @@ -639,7 +644,7 @@ std::vector Binder::getRelTableIDs(const std::vector& ta } std::vector Binder::getRelTableIDs(table_id_t tableID) { - auto entry = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto entry = clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), tableID); switch (entry->getTableType()) { case TableType::RDF: { auto rdfEntry = ku_dynamic_cast(entry); diff --git a/src/binder/bind/bind_import_database.cpp b/src/binder/bind/bind_import_database.cpp index 633e271afe9..f6bc6ce8d6d 100644 --- a/src/binder/bind/bind_import_database.cpp +++ b/src/binder/bind/bind_import_database.cpp @@ -1,6 +1,9 @@ +#include + #include "binder/binder.h" #include "binder/copy/bound_import_database.h" #include "common/exception/binder.h" +#include "common/file_system/virtual_file_system.h" #include "parser/port_db.h" using namespace kuzu::common; @@ -29,13 +32,14 @@ std::string getFilePath( std::unique_ptr Binder::bindImportDatabaseClause(const Statement& statement) { auto& importDatabaseStatement = ku_dynamic_cast(statement); auto boundFilePath = importDatabaseStatement.getFilePath(); - if (!vfs->fileOrPathExists(boundFilePath)) { + auto fs = clientContext->getVFSUnsafe(); + if (!fs->fileOrPathExists(boundFilePath)) { throw BinderException(stringFormat("Directory {} does not exist.", boundFilePath)); } std::string finalQueryStatements; - finalQueryStatements += getFilePath(vfs, boundFilePath, ImportDBConstants::SCHEMA_NAME); - finalQueryStatements += getFilePath(vfs, boundFilePath, ImportDBConstants::COPY_NAME); - finalQueryStatements += getFilePath(vfs, boundFilePath, ImportDBConstants::MACRO_NAME); + finalQueryStatements += getFilePath(fs, boundFilePath, ImportDBConstants::SCHEMA_NAME); + finalQueryStatements += getFilePath(fs, boundFilePath, ImportDBConstants::COPY_NAME); + finalQueryStatements += getFilePath(fs, boundFilePath, ImportDBConstants::MACRO_NAME); return std::make_unique(boundFilePath, finalQueryStatements); } } // namespace binder diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index 55ee466e8c4..afaec1f46ce 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -126,8 +126,9 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& for (auto& val : inputValues) { inputTypes.push_back(*val.getDataType()); } + auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); auto func = BuiltInFunctionsUtils::matchFunction( - functionExpr->getFunctionName(), inputTypes, catalog.getFunctions(clientContext->getTx())); + functionExpr->getFunctionName(), inputTypes, functions); auto tableFunc = ku_dynamic_cast(func); auto bindInput = std::make_unique(); bindInput->inputs = std::move(inputValues); @@ -156,9 +157,9 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re auto objectExpr = expressionBinder.bindVariableExpression(objectName); auto literalExpr = ku_dynamic_cast(objectExpr.get()); - auto func = BuiltInFunctionsUtils::matchFunction(READ_PANDAS_FUNC_NAME, - std::vector{objectExpr->getDataType()}, - catalog.getFunctions(clientContext->getTx())); + auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); + auto func = BuiltInFunctionsUtils::matchFunction( + READ_PANDAS_FUNC_NAME, std::vector{objectExpr->getDataType()}, functions); scanFunction = ku_dynamic_cast(func); bindInput = std::make_unique(); bindInput->inputs.push_back(*literalExpr->getValue()); diff --git a/src/binder/bind/bind_standalone_call.cpp b/src/binder/bind/bind_standalone_call.cpp index 5fa33023775..2f7c0bd0a94 100644 --- a/src/binder/bind/bind_standalone_call.cpp +++ b/src/binder/bind/bind_standalone_call.cpp @@ -15,7 +15,8 @@ std::unique_ptr Binder::bindStandaloneCall(const parser::Stateme ku_dynamic_cast(statement); main::Option* option = main::DBConfig::getOptionByName(callStatement.getOptionName()); if (option == nullptr) { - option = extensionOptions->getExtensionOption(callStatement.getOptionName()); + option = + clientContext->getExtensionOptions()->getExtensionOption(callStatement.getOptionName()); } if (option == nullptr) { throw BinderException{"Invalid option name: " + callStatement.getOptionName() + "."}; diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index a5d9acf7383..46d0a12248a 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -96,7 +96,7 @@ std::vector Binder::bindInsertInfos( const QueryGraphCollection& queryGraphCollection, const expression_set& nodeRelScope_) { auto nodeRelScope = nodeRelScope_; std::vector result; - auto analyzer = QueryGraphLabelAnalyzer(catalog); + auto analyzer = QueryGraphLabelAnalyzer(*clientContext->getCatalog()); for (auto i = 0u; i < queryGraphCollection.getNumQueryGraphs(); ++i) { auto queryGraph = queryGraphCollection.getQueryGraph(i); // Ensure query graph does not violate declared schema. @@ -149,13 +149,14 @@ void Binder::bindInsertNode( throw BinderException( "Create node " + node->toString() + " with multiple node labels is not supported."); } + auto catalog = clientContext->getCatalog(); auto tableID = node->getSingleTableID(); - auto tableSchema = catalog.getTableCatalogEntry(clientContext->getTx(), tableID); + auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); KU_ASSERT(tableSchema->getTableType() == TableType::NODE); validatePrimaryKeyExistence( ku_dynamic_cast(tableSchema), *node); auto insertInfo = BoundInsertInfo(TableType::NODE, node); - for (auto& entry : catalog.getRdfGraphEntries(clientContext->getTx())) { + for (auto& entry : catalog->getRdfGraphEntries(clientContext->getTx())) { auto rdfEntry = ku_dynamic_cast(entry); if (rdfEntry->isParent(tableID)) { insertInfo.conflictAction = ConflictAction::ON_CONFLICT_DO_NOTHING; @@ -185,9 +186,10 @@ void Binder::bindInsertRel( } rel->setTableIDs(std::vector{rel->getTableIDs()[0]}); auto relTableID = rel->getSingleTableID(); - auto tableEntry = catalog.getTableCatalogEntry(clientContext->getTx(), relTableID); + auto catalog = clientContext->getCatalog(); + auto tableEntry = catalog->getTableCatalogEntry(clientContext->getTx(), relTableID); TableCatalogEntry* parentTableEntry = nullptr; - for (auto& rdfGraphEntry : catalog.getRdfGraphEntries(clientContext->getTx())) { + for (auto& rdfGraphEntry : catalog->getRdfGraphEntries(clientContext->getTx())) { if (rdfGraphEntry->isParent(relTableID)) { parentTableEntry = rdfGraphEntry; } @@ -271,9 +273,10 @@ BoundSetPropertyInfo Binder::bindSetPropertyInfo( } auto patternExpr = ku_dynamic_cast(pattern.get()); auto boundSetItem = bindSetItem(lhs, rhs); + auto catalog = clientContext->getCatalog(); for (auto tableID : patternExpr->getTableIDs()) { - auto tableName = catalog.getTableCatalogEntry(clientContext->getTx(), tableID)->getName(); - for (auto& rdfGraphEntry : catalog.getRdfGraphEntries(clientContext->getTx())) { + auto tableName = catalog->getTableCatalogEntry(clientContext->getTx(), tableID)->getName(); + for (auto& rdfGraphEntry : catalog->getRdfGraphEntries(clientContext->getTx())) { if (rdfGraphEntry->isParent(tableID)) { throw BinderException( stringFormat("Cannot set properties of RDFGraph tables. Set {} requires " diff --git a/src/binder/bind/copy/bind_copy_rdf_graph.cpp b/src/binder/bind/copy/bind_copy_rdf_graph.cpp index 2774a263b1a..b89b4be6a61 100644 --- a/src/binder/bind/copy/bind_copy_rdf_graph.cpp +++ b/src/binder/bind/copy/bind_copy_rdf_graph.cpp @@ -18,7 +18,8 @@ namespace binder { std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement&, std::unique_ptr config, RDFGraphCatalogEntry* rdfGraphEntry) { - auto functions = catalog.getFunctions(clientContext->getTx()); + auto catalog = clientContext->getCatalog(); + auto functions = catalog->getFunctions(clientContext->getTx()); auto offset = expressionBinder.createVariableExpression( *LogicalType::INT64(), InternalKeyword::ROW_OFFSET); auto r = expressionBinder.createVariableExpression(*LogicalType::STRING(), rdf::IRI); @@ -50,7 +51,7 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& auto rScanInfo = std::make_unique( rScanFunc, bindData->copy(), std::move(rColumns), offset); auto rTableID = rdfGraphEntry->getResourceTableID(); - auto rSchema = catalog.getTableCatalogEntry(clientContext->getTx(), rTableID); + auto rSchema = catalog->getTableCatalogEntry(clientContext->getTx(), rTableID); auto rCopyInfo = BoundCopyFromInfo(rSchema, std::move(rScanInfo), false, nullptr); // Bind copy literal. func = inMemory ? @@ -61,7 +62,7 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& auto lScanInfo = std::make_unique( lScanFunc, bindData->copy(), std::move(lColumns), offset); auto lTableID = rdfGraphEntry->getLiteralTableID(); - auto lSchema = catalog.getTableCatalogEntry(clientContext->getTx(), lTableID); + auto lSchema = catalog->getTableCatalogEntry(clientContext->getTx(), lTableID); auto lCopyInfo = BoundCopyFromInfo(lSchema, std::move(lScanInfo), true, nullptr); // Bind copy resource triples func = inMemory ? @@ -73,7 +74,7 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& auto rrrScanInfo = std::make_unique(rrrScanFunc, bindData->copy(), rrrColumns, offset); auto rrrTableID = rdfGraphEntry->getResourceTripleTableID(); - auto rrrSchema = catalog.getTableCatalogEntry(clientContext->getTx(), rrrTableID); + auto rrrSchema = catalog->getTableCatalogEntry(clientContext->getTx(), rrrTableID); auto rrrExtraInfo = std::make_unique(); auto sLookUp = IndexLookupInfo(rTableID, sOffset, s, s->getDataType()); auto pLookUp = IndexLookupInfo(rTableID, pOffset, p, p->getDataType()); @@ -95,7 +96,7 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& auto rrlScanInfo = std::make_unique(rrlScanFunc, bindData->copy(), rrlColumns, offset); auto rrlTableID = rdfGraphEntry->getLiteralTripleTableID(); - auto rrlSchema = catalog.getTableCatalogEntry(clientContext->getTx(), rrlTableID); + auto rrlSchema = catalog->getTableCatalogEntry(clientContext->getTx(), rrlTableID); auto rrlExtraInfo = std::make_unique(); rrlExtraInfo->infos.push_back(sLookUp.copy()); rrlExtraInfo->infos.push_back(pLookUp.copy()); diff --git a/src/binder/bind_expression/bind_comparison_expression.cpp b/src/binder/bind_expression/bind_comparison_expression.cpp index b5f4366795c..53bd63a21f9 100644 --- a/src/binder/bind_expression/bind_comparison_expression.cpp +++ b/src/binder/bind_expression/bind_comparison_expression.cpp @@ -21,15 +21,14 @@ std::shared_ptr ExpressionBinder::bindComparisonExpression( std::shared_ptr ExpressionBinder::bindComparisonExpression( ExpressionType expressionType, const expression_vector& children) { - auto builtInFunctions = binder->catalog.getFunctions(binder->clientContext->getTx()); + auto functions = context->getCatalog()->getFunctions(binder->clientContext->getTx()); auto functionName = expressionTypeToString(expressionType); std::vector childrenTypes; for (auto& child : children) { childrenTypes.push_back(child->dataType); } auto function = ku_dynamic_cast( - function::BuiltInFunctionsUtils::matchFunction( - functionName, childrenTypes, builtInFunctions)); + function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, functions)); expression_vector childrenAfterCast; for (auto i = 0u; i < children.size(); ++i) { childrenAfterCast.push_back( diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index bbea8074381..fe55968f28b 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -27,7 +27,7 @@ std::shared_ptr ExpressionBinder::bindFunctionExpression( return result; } auto functionType = - binder->catalog.getFunctionType(binder->clientContext->getTx(), functionName); + context->getCatalog()->getFunctionType(binder->clientContext->getTx(), functionName); switch (functionType) { case ExpressionType::FUNCTION: return bindScalarFunctionExpression(parsedExpression, functionName); @@ -57,9 +57,9 @@ std::shared_ptr ExpressionBinder::bindScalarFunctionExpression( for (auto& child : children) { childrenTypes.push_back(child->dataType); } + auto functions = context->getCatalog()->getFunctions(context->getTx()); auto function = ku_dynamic_cast( - function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, - binder->catalog.getFunctions(binder->clientContext->getTx()))); + function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, functions)); expression_vector childrenAfterCast; std::unique_ptr bindData; if (functionName == CAST_FUNC_NAME) { @@ -110,8 +110,9 @@ std::shared_ptr ExpressionBinder::bindAggregateFunctionExpression( childrenTypes.push_back(child->dataType); children.push_back(std::move(child)); } - auto function = function::BuiltInFunctionsUtils::matchAggregateFunction(functionName, - childrenTypes, isDistinct, binder->catalog.getFunctions(binder->clientContext->getTx())) + auto functions = context->getCatalog()->getFunctions(context->getTx()); + auto function = function::BuiltInFunctionsUtils::matchAggregateFunction( + functionName, childrenTypes, isDistinct, functions) ->clone(); if (function->paramRewriteFunc) { function->paramRewriteFunc(children); @@ -134,7 +135,7 @@ std::shared_ptr ExpressionBinder::bindAggregateFunctionExpression( std::shared_ptr ExpressionBinder::bindMacroExpression( const ParsedExpression& parsedExpression, const std::string& macroName) { - auto scalarMacroFunction = binder->catalog.getScalarMacroFunction(macroName); + auto scalarMacroFunction = context->getCatalog()->getScalarMacroFunction(macroName); auto macroExpr = scalarMacroFunction->expression->copy(); auto parameterVals = scalarMacroFunction->getDefaultParameterVals(); auto& parsedFuncExpr = @@ -250,35 +251,34 @@ static std::vector> populateLabelValues(std::vector ExpressionBinder::bindLabelFunction(const Expression& expression) { + auto catalog = context->getCatalog(); auto listType = LogicalType::VAR_LIST(LogicalType::STRING()); expression_vector children; switch (expression.getDataType().getLogicalTypeID()) { case LogicalTypeID::NODE: { auto& node = (NodeExpression&)expression; if (!node.isMultiLabeled()) { - auto labelName = binder->catalog.getTableName( - binder->clientContext->getTx(), node.getSingleTableID()); + auto labelName = catalog->getTableName(context->getTx(), node.getSingleTableID()); return createLiteralExpression( std::make_unique(LogicalType::STRING(), labelName)); } - auto nodeTableIDs = binder->catalog.getNodeTableIDs(binder->clientContext->getTx()); + auto nodeTableIDs = catalog->getNodeTableIDs(context->getTx()); children.push_back(node.getInternalID()); - auto labelsValue = std::make_unique(std::move(listType), - populateLabelValues(nodeTableIDs, binder->catalog, binder->clientContext->getTx())); + auto labelsValue = std::make_unique( + std::move(listType), populateLabelValues(nodeTableIDs, *catalog, context->getTx())); children.push_back(createLiteralExpression(std::move(labelsValue))); } break; case LogicalTypeID::REL: { auto& rel = (RelExpression&)expression; if (!rel.isMultiLabeled()) { - auto labelName = binder->catalog.getTableName( - binder->clientContext->getTx(), rel.getSingleTableID()); + auto labelName = catalog->getTableName(context->getTx(), rel.getSingleTableID()); return createLiteralExpression( std::make_unique(LogicalType::STRING(), labelName)); } - auto relTableIDs = binder->catalog.getRelTableIDs(binder->clientContext->getTx()); + auto relTableIDs = catalog->getRelTableIDs(context->getTx()); children.push_back(rel.getInternalIDProperty()); - auto labelsValue = std::make_unique(std::move(listType), - populateLabelValues(relTableIDs, binder->catalog, binder->clientContext->getTx())); + auto labelsValue = std::make_unique( + std::move(listType), populateLabelValues(relTableIDs, *catalog, context->getTx())); children.push_back(createLiteralExpression(std::move(labelsValue))); } break; default: diff --git a/src/binder/bind_expression/bind_subquery_expression.cpp b/src/binder/bind_expression/bind_subquery_expression.cpp index ec8fd9eaee2..f564a93d5bd 100644 --- a/src/binder/bind_expression/bind_subquery_expression.cpp +++ b/src/binder/bind_expression/bind_subquery_expression.cpp @@ -31,9 +31,9 @@ std::shared_ptr ExpressionBinder::bindSubqueryExpression( std::move(boundGraphPattern.queryGraphCollection), uniqueName, std::move(rawName)); boundSubqueryExpr->setWhereExpression(boundGraphPattern.where); // Bind projection - auto function = BuiltInFunctionsUtils::matchAggregateFunction(COUNT_STAR_FUNC_NAME, - std::vector{}, false, - binder->catalog.getFunctions(binder->clientContext->getTx())); + auto functions = context->getCatalog()->getFunctions(context->getTx()); + auto function = BuiltInFunctionsUtils::matchAggregateFunction( + COUNT_STAR_FUNC_NAME, std::vector{}, false, functions); auto bindData = std::make_unique(std::make_unique(function->returnTypeID)); auto countStarExpr = std::make_shared(COUNT_STAR_FUNC_NAME, diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 9bf794d913c..418908dac41 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -8,6 +8,7 @@ #include "common/string_utils.h" #include "function/table_functions.h" #include "main/client_context.h" +#include "storage/storage_utils.h" using namespace kuzu::catalog; using namespace kuzu::common; @@ -65,7 +66,7 @@ std::unique_ptr Binder::bind(const Statement& statement) { KU_UNREACHABLE; } } - BoundStatementRewriter::rewrite(*boundStatement, catalog); + BoundStatementRewriter::rewrite(*boundStatement, *clientContext->getCatalog()); return boundStatement; } @@ -76,10 +77,11 @@ std::shared_ptr Binder::bindWhereExpression(const ParsedExpression& } common::table_id_t Binder::bindTableID(const std::string& tableName) const { - if (!catalog.containsTable(clientContext->getTx(), tableName)) { + auto catalog = clientContext->getCatalog(); + if (!catalog->containsTable(clientContext->getTx(), tableName)) { throw BinderException(common::stringFormat("Table {} does not exist.", tableName)); } - return catalog.getTableID(clientContext->getTx(), tableName); + return catalog->getTableID(clientContext->getTx(), tableName); } std::shared_ptr Binder::createVariable( @@ -172,14 +174,15 @@ void Binder::validateReadNotFollowUpdate(const NormalizedSingleQuery& singleQuer } void Binder::validateTableType(table_id_t tableID, TableType expectedTableType) { - if (catalog.getTableCatalogEntry(clientContext->getTx(), tableID)->getTableType() != - expectedTableType) { + auto tableEntry = + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), tableID); + if (tableEntry->getTableType() != expectedTableType) { throw BinderException("Table type mismatch."); } } void Binder::validateTableExist(const std::string& tableName) { - if (!catalog.containsTable(clientContext->getTx(), tableName)) { + if (!clientContext->getCatalog()->containsTable(clientContext->getTx(), tableName)) { throw BinderException("Table " + tableName + " does not exist."); } } @@ -212,7 +215,7 @@ function::TableFunction* Binder::getScanFunction(FileType fileType, const Reader auto stringType = LogicalType(LogicalTypeID::STRING); std::vector inputTypes; inputTypes.push_back(stringType); - auto functions = catalog.getFunctions(clientContext->getTx()); + auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); switch (fileType) { case FileType::PARQUET: { func = function::BuiltInFunctionsUtils::matchFunction( diff --git a/src/binder/expression_binder.cpp b/src/binder/expression_binder.cpp index 632d9c64357..2b2f71ca58b 100644 --- a/src/binder/expression_binder.cpp +++ b/src/binder/expression_binder.cpp @@ -60,7 +60,7 @@ std::shared_ptr ExpressionBinder::bindExpression( std::shared_ptr ExpressionBinder::foldExpression( const std::shared_ptr& expression) { auto value = evaluator::ExpressionEvaluatorUtils::evaluateConstantExpression( - expression, binder->memoryManager); + expression, context->getMemoryManager()); auto result = createLiteralExpression(std::move(value)); // Fold result should preserve the alias original expression. E.g. // RETURN 2, 1 + 1 AS x diff --git a/src/extension/extension.cpp b/src/extension/extension.cpp index f6abb8f621d..3282495f3bc 100644 --- a/src/extension/extension.cpp +++ b/src/extension/extension.cpp @@ -67,9 +67,5 @@ main::ExtensionOption* ExtensionOptions::getExtensionOption(std::string name) { return extensionOptions.contains(name) ? &extensionOptions.at(name) : nullptr; } -std::unordered_map& ExtensionOptions::getExtensionOptions() { - return extensionOptions; -} - } // namespace extension } // namespace kuzu diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index 47205bf5525..092d845d3d4 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -7,7 +7,6 @@ #include "expression_binder.h" #include "parser/query/graph_pattern/pattern_element.h" #include "parser/query/regular_query.h" -#include "storage/storage_manager.h" namespace kuzu { namespace parser { @@ -80,12 +79,9 @@ class Binder { friend class ExpressionBinder; public: - explicit Binder(const catalog::Catalog& catalog, storage::MemoryManager* memoryManager, - storage::StorageManager* storageManager, common::VirtualFileSystem* vfs, - main::ClientContext* clientContext, extension::ExtensionOptions* extensionOptions) - : catalog{catalog}, memoryManager{memoryManager}, storageManager{storageManager}, vfs{vfs}, - lastExpressionId{0}, scope{std::make_unique()}, expressionBinder{this}, - clientContext{clientContext}, extensionOptions{extensionOptions} {} + explicit Binder(main::ClientContext* clientContext) + : lastExpressionId{0}, scope{std::make_unique()}, + expressionBinder{this, clientContext}, clientContext{clientContext} {} std::unique_ptr bind(const parser::Statement& statement); @@ -294,15 +290,10 @@ class Binder { common::FileType fileType, const common::ReaderConfig& config); private: - const catalog::Catalog& catalog; - storage::MemoryManager* memoryManager; - storage::StorageManager* storageManager; - common::VirtualFileSystem* vfs; uint32_t lastExpressionId; std::unique_ptr scope; ExpressionBinder expressionBinder; main::ClientContext* clientContext; - extension::ExtensionOptions* extensionOptions; }; } // namespace binder diff --git a/src/include/binder/expression_binder.h b/src/include/binder/expression_binder.h index 23ef9398893..32da474015f 100644 --- a/src/include/binder/expression_binder.h +++ b/src/include/binder/expression_binder.h @@ -4,6 +4,10 @@ #include "parser/expression/parsed_expression.h" namespace kuzu { +namespace main { +class ClientContext; +} + namespace common { class Value; } @@ -17,7 +21,8 @@ class ExpressionBinder { friend class Binder; public: - explicit ExpressionBinder(Binder* queryBinder) : binder{queryBinder} {} + ExpressionBinder(Binder* queryBinder, main::ClientContext* context) + : binder{queryBinder}, context{context} {} std::shared_ptr bindExpression(const parser::ParsedExpression& parsedExpression); @@ -124,6 +129,7 @@ class ExpressionBinder { private: Binder* binder; + main::ClientContext* context; std::unordered_map> parameterMap; }; diff --git a/src/include/extension/extension.h b/src/include/extension/extension.h index 6b7288a5d02..9a59d648408 100644 --- a/src/include/extension/extension.h +++ b/src/include/extension/extension.h @@ -42,8 +42,6 @@ struct ExtensionOptions { std::string name, common::LogicalTypeID type, common::Value defaultValue); main::ExtensionOption* getExtensionOption(std::string name); - - std::unordered_map& getExtensionOptions(); }; } // namespace extension diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index 651d8370b34..c4b3cd6b398 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -27,6 +27,10 @@ namespace common { class RandomEngine; } +namespace extension { +struct ExtensionOptions; +} + namespace main { class Database; @@ -80,6 +84,7 @@ class ClientContext { // Extension KUZU_API void setExtensionOption(std::string name, common::Value value); + extension::ExtensionOptions* getExtensionOptions() const; std::string getExtensionDir() const; // Environment. diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index a510245c803..6e8bc71d8d1 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -120,6 +120,10 @@ void ClientContext::setExtensionOption(std::string name, common::Value value) { extensionOptionValues.insert_or_assign(name, std::move(value)); } +extension::ExtensionOptions* ClientContext::getExtensionOptions() const { + return database->extensionOptions.get(); +} + std::string ClientContext::getExtensionDir() const { return common::stringFormat("{}/.kuzu/extension", config.homeDirectory); } @@ -263,9 +267,7 @@ std::unique_ptr ClientContext::prepareNoLock( } } // binding - auto binder = Binder(*database->catalog, database->memoryManager.get(), - database->storageManager.get(), database->vfs.get(), this, - database->extensionOptions.get()); + auto binder = Binder(this); auto boundStatement = binder.bind(*parsedStatement); preparedStatement->parameterMap = binder.getParameterMap(); preparedStatement->statementResult = diff --git a/test/graph_test/graph_test.cpp b/test/graph_test/graph_test.cpp index c2c26fbc415..7f389184555 100644 --- a/test/graph_test/graph_test.cpp +++ b/test/graph_test/graph_test.cpp @@ -25,10 +25,7 @@ void PrivateGraphTest::validateQueryBestPlanJoinOrder( auto statement = parser::Parser::parseQuery(query); ASSERT_EQ(statement.size(), 1); auto parsedQuery = (parser::RegularQuery*)statement[0].get(); - auto boundQuery = - Binder(*catalog, database->memoryManager.get(), database->storageManager.get(), - database->vfs.get(), conn->clientContext.get(), database->extensionOptions.get()) - .bind(*parsedQuery); + auto boundQuery = Binder(conn->clientContext.get()).bind(*parsedQuery); auto planner = Planner(catalog, getStorageManager(*database)); auto plan = planner.getBestPlan(*boundQuery); ASSERT_STREQ(LogicalPlanUtil::encodeJoin(*plan).c_str(), expectedJoinOrder.c_str()); From 020c09bcdd139360c6eb4a9e64f0e7ec759d521e Mon Sep 17 00:00:00 2001 From: xiyang Date: Sat, 9 Mar 2024 17:39:07 -0500 Subject: [PATCH 012/136] Refactor cast functions --- src/binder/bind/bind_query.cpp | 2 +- .../bind_function_expression.cpp | 25 ++++---- src/function/built_in_function_utils.cpp | 3 - src/function/cast/cast_fixed_list.cpp | 4 +- src/function/cast_from_string_functions.cpp | 63 +++++++++---------- src/function/vector_cast_functions.cpp | 34 +++++----- .../function/cast/cast_function_bind_data.h | 21 +++++++ .../functions/cast_from_string_functions.h | 2 +- .../function/cast/vector_cast_functions.h | 2 - src/include/function/function.h | 9 --- .../function/unary_function_executor.h | 4 +- .../exceptions/binder/binder_error.test | 8 ++- 12 files changed, 93 insertions(+), 84 deletions(-) create mode 100644 src/include/function/cast/cast_function_bind_data.h diff --git a/src/binder/bind/bind_query.cpp b/src/binder/bind/bind_query.cpp index a2511e07373..12beed581bc 100644 --- a/src/binder/bind/bind_query.cpp +++ b/src/binder/bind/bind_query.cpp @@ -36,7 +36,7 @@ void validateIsAllUnionOrUnionAll(const BoundRegularQuery& regularQuery) { } if ((0 < unionAllExpressionCounter) && (unionAllExpressionCounter < regularQuery.getNumSingleQueries() - 1)) { - throw BinderException("Union and union all can't be used together."); + throw BinderException("Union and union all can not be used together."); } } diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index fe55968f28b..b887002fb7b 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -1,7 +1,6 @@ #include "binder/binder.h" #include "binder/expression/expression_util.h" #include "binder/expression/function_expression.h" -#include "binder/expression/literal_expression.h" #include "binder/expression/property_expression.h" #include "binder/expression_binder.h" #include "common/exception/binder.h" @@ -13,6 +12,7 @@ using namespace kuzu::common; using namespace kuzu::parser; +using namespace kuzu::function; namespace kuzu { namespace binder { @@ -58,24 +58,21 @@ std::shared_ptr ExpressionBinder::bindScalarFunctionExpression( childrenTypes.push_back(child->dataType); } auto functions = context->getCatalog()->getFunctions(context->getTx()); - auto function = ku_dynamic_cast( + auto function = ku_dynamic_cast( function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, functions)); expression_vector childrenAfterCast; std::unique_ptr bindData; if (functionName == CAST_FUNC_NAME) { - // If the expression to cast already has the same type as the target type, skip casting. - if (children.size() == 2) { - auto targetTypeStr = (ku_dynamic_cast(*children[1])) - .getValue() - ->getValue(); - auto outputType = binder::Binder::bindDataType(targetTypeStr); - if (*outputType == children[0]->dataType) { - return children[0]; - } - } bindData = function->bindFunc(children, function); - childrenAfterCast.push_back( - implicitCastIfNecessary(children[0], function->parameterTypeIDs[0])); + if (bindData == nullptr) { + return children[0]; + } + auto childAfterCast = children[0]; + // See castBindFunc for explanation. + if (children[0]->getDataType().getLogicalTypeID() == LogicalTypeID::ANY) { + childAfterCast = implicitCastIfNecessary(children[0], LogicalTypeID::STRING); + } + childrenAfterCast.push_back(std::move(childAfterCast)); } else { for (auto i = 0u; i < children.size(); ++i) { auto targetType = function->isVarLength ? function->parameterTypeIDs[0] : diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 726fd1f0eb9..9977400acc9 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -92,9 +92,6 @@ Function* BuiltInFunctionsUtils::matchFunction(const std::string& name, uint32_t minCost = UINT32_MAX; for (auto& function : functionSet) { auto func = reinterpret_cast(function.get()); - if (name == CAST_FUNC_NAME) { - return func; - } auto cost = getFunctionCost(inputTypes, func, isOverload); if (cost == UINT32_MAX) { continue; diff --git a/src/function/cast/cast_fixed_list.cpp b/src/function/cast/cast_fixed_list.cpp index f5185d0aff3..44cd72cba04 100644 --- a/src/function/cast/cast_fixed_list.cpp +++ b/src/function/cast/cast_fixed_list.cpp @@ -155,7 +155,7 @@ void CastFixedList::stringtoFixedListCastExecFunction( const std::vector>& params, ValueVector& result, void* dataPtr) { KU_ASSERT(params.size() == 1); const auto& param = params[0]; - auto option = &reinterpret_cast(dataPtr)->csvConfig.option; + auto option = &reinterpret_cast(dataPtr)->option; if (param->state->isFlat()) { auto inputPos = param->state->selVector->selectedPositions[0]; auto resultPos = result.state->selVector->selectedPositions[0]; @@ -197,7 +197,7 @@ void CastFixedList::stringtoFixedListCastExecFunction const std::vector>& params, ValueVector& result, void* dataPtr) { KU_ASSERT(params.size() == 1); auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - auto option = &reinterpret_cast(dataPtr)->csvConfig.option; + auto option = &reinterpret_cast(dataPtr)->option; auto inputVector = params[0].get(); for (auto i = 0u; i < numOfEntries; i++) { result.setNull(i, inputVector->isNull(i)); diff --git a/src/function/cast_from_string_functions.cpp b/src/function/cast_from_string_functions.cpp index eae769bb370..183536feaea 100644 --- a/src/function/cast_from_string_functions.cpp +++ b/src/function/cast_from_string_functions.cpp @@ -823,144 +823,143 @@ void CastString::operation(const ku_string_t& input, union_entry_t& result, } void CastString::copyStringToVector( - ValueVector* vector, uint64_t rowToAdd, std::string_view strVal, const CSVOption* option) { + ValueVector* vector, uint64_t vectorPos, std::string_view strVal, const CSVOption* option) { auto& type = vector->dataType; - if (strVal.empty() || isNull(strVal)) { - vector->setNull(rowToAdd, true /* isNull */); + vector->setNull(vectorPos, true /* isNull */); return; - } else { - vector->setNull(rowToAdd, false /* isNull */); } + vector->setNull(vectorPos, false /* isNull */); switch (type.getLogicalTypeID()) { case LogicalTypeID::INT128: { int128_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::INT64: { int64_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::INT32: { int32_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::INT16: { int16_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::INT8: { int8_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::UINT64: { uint64_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::UINT32: { uint32_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::UINT16: { uint16_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::UINT8: { uint8_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::FLOAT: { float val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::DOUBLE: { double val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::BOOL: { bool val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::BLOB: { blob_t val; - CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, rowToAdd, option); + CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; case LogicalTypeID::UUID: { ku_uuid_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val.value); + vector->setValue(vectorPos, val.value); } break; case LogicalTypeID::STRING: { if (!utf8proc::Utf8Proc::isValid(strVal.data(), strVal.length())) { throw CopyException{"Invalid UTF8-encoded string."}; } - StringVector::addString(vector, rowToAdd, strVal.data(), strVal.length()); + StringVector::addString(vector, vectorPos, strVal.data(), strVal.length()); } break; case LogicalTypeID::DATE: { date_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::TIMESTAMP_NS: { timestamp_ns_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::TIMESTAMP_MS: { timestamp_ms_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::TIMESTAMP_SEC: { timestamp_sec_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::TIMESTAMP_TZ: { timestamp_tz_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::TIMESTAMP: { timestamp_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::INTERVAL: { interval_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val); - vector->setValue(rowToAdd, val); + vector->setValue(vectorPos, val); } break; case LogicalTypeID::MAP: { map_entry_t val; - CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, rowToAdd, option); + CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; case LogicalTypeID::VAR_LIST: { list_entry_t val; - CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, rowToAdd, option); + CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; case LogicalTypeID::FIXED_LIST: { - CastStringHelper::castToFixedList(strVal.data(), strVal.length(), vector, rowToAdd, option); + CastStringHelper::castToFixedList( + strVal.data(), strVal.length(), vector, vectorPos, option); } break; case LogicalTypeID::STRUCT: { struct_entry_t val; - CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, rowToAdd, option); + CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; case LogicalTypeID::UNION: { union_entry_t val; - CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, rowToAdd, option); + CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; default: { KU_UNREACHABLE; diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index 02376b6f454..c54c7aa2ea4 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -10,6 +10,7 @@ #include "function/cast/functions/cast_rdf_variant.h" using namespace kuzu::common; +using namespace kuzu::binder; namespace kuzu { namespace function { @@ -1003,35 +1004,38 @@ function_set CastToUInt8Function::getFunctionSet() { return result; } -std::unique_ptr CastAnyFunction::bindFunc( +static std::unique_ptr castBindFunc( const binder::expression_vector& arguments, Function* function) { - // check the size of the arguments - if (arguments.size() != 2) { - throw BinderException(stringFormat( - "Invalid number of arguments for given function CAST. Expected: 2, Actual: {}.", - arguments.size())); + KU_ASSERT(arguments.size() == 2); + // Bind target type. + if (arguments[1]->expressionType != ExpressionType::LITERAL) { + throw BinderException( + stringFormat("Second parameter of CAST function must be an literal.")); } - + auto literalExpr = ku_dynamic_cast(arguments[1].get()); + auto targetTypeStr = literalExpr->getValue()->getValue(); + auto targetType = binder::Binder::bindDataType(targetTypeStr); + if (*targetType == arguments[0]->getDataType()) { // No need to cast. + return nullptr; + } + // Assign default type if input is ANY type, e.g. NULL auto inputTypeID = arguments[0]->dataType.getLogicalTypeID(); if (inputTypeID == LogicalTypeID::ANY) { inputTypeID = LogicalTypeID::STRING; } - auto str = ((binder::LiteralExpression&)*arguments[1]).getValue()->getValue(); - auto outputType = binder::Binder::bindDataType(str); auto func = ku_dynamic_cast(function); - func->name = "CAST_TO_" + str; - func->parameterTypeIDs[0] = inputTypeID; + func->name = "CAST_TO_" + targetTypeStr; func->execFunc = - CastFunction::bindCastFunction(func->name, inputTypeID, outputType->getLogicalTypeID()) + CastFunction::bindCastFunction(func->name, inputTypeID, targetType->getLogicalTypeID()) ->execFunc; - return std::make_unique(std::move(outputType)); + return std::make_unique(std::move(targetType)); } function_set CastAnyFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(CAST_FUNC_NAME, - std::vector{LogicalTypeID::ANY}, LogicalTypeID::ANY, nullptr, nullptr, - bindFunc, false)); + std::vector{LogicalTypeID::ANY, LogicalTypeID::STRING}, LogicalTypeID::ANY, + nullptr, nullptr, castBindFunc, false)); return result; } diff --git a/src/include/function/cast/cast_function_bind_data.h b/src/include/function/cast/cast_function_bind_data.h new file mode 100644 index 00000000000..13ff83f57fb --- /dev/null +++ b/src/include/function/cast/cast_function_bind_data.h @@ -0,0 +1,21 @@ +#pragma once + +#include "common/copier_config/csv_reader_config.h" +#include "function/function.h" + +namespace kuzu { +namespace function { + +struct CastFunctionBindData : public FunctionBindData { + // We don't allow configuring delimiters, ... in CAST function. + // For performance purpose, we generate a default option object during binding time. + common::CSVOption option; + // TODO(Mahn): the following field should be removed once we refactor fixed list. + uint64_t numOfEntries; + + explicit CastFunctionBindData(std::unique_ptr dataType) + : FunctionBindData{std::move(dataType)} {} +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/cast/functions/cast_from_string_functions.h b/src/include/function/cast/functions/cast_from_string_functions.h index 49ab83099ac..7df9181deec 100644 --- a/src/include/function/cast/functions/cast_from_string_functions.h +++ b/src/include/function/cast/functions/cast_from_string_functions.h @@ -14,7 +14,7 @@ namespace function { struct CastString { static void copyStringToVector( - ValueVector* vector, uint64_t rowToAdd, std::string_view strVal, const CSVOption* option); + ValueVector* vector, uint64_t vectorPos, std::string_view strVal, const CSVOption* option); template static inline bool tryCast(const ku_string_t& input, T& result) { diff --git a/src/include/function/cast/vector_cast_functions.h b/src/include/function/cast/vector_cast_functions.h index 97a94f0a959..d9bc85c27bd 100644 --- a/src/include/function/cast/vector_cast_functions.h +++ b/src/include/function/cast/vector_cast_functions.h @@ -98,8 +98,6 @@ struct CastToUInt8Function { }; struct CastAnyFunction { - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); static function_set getFunctionSet(); }; diff --git a/src/include/function/function.h b/src/include/function/function.h index 97dc56f89e0..b025e247f45 100644 --- a/src/include/function/function.h +++ b/src/include/function/function.h @@ -1,7 +1,6 @@ #pragma once #include "binder/expression/expression.h" -#include "common/copier_config/csv_reader_config.h" namespace kuzu { namespace function { @@ -15,14 +14,6 @@ struct FunctionBindData { virtual ~FunctionBindData() = default; }; -struct CastFunctionBindData : public FunctionBindData { - common::CSVReaderConfig csvConfig; - uint64_t numOfEntries; - - explicit CastFunctionBindData(std::unique_ptr dataType) - : FunctionBindData{std::move(dataType)} {} -}; - struct Function; using scalar_bind_func = std::function( const binder::expression_vector&, Function* definition)>; diff --git a/src/include/function/unary_function_executor.h b/src/include/function/unary_function_executor.h index 7ec14a0bfe3..7916bbbf5b4 100644 --- a/src/include/function/unary_function_executor.h +++ b/src/include/function/unary_function_executor.h @@ -1,7 +1,7 @@ #pragma once #include "common/vector/value_vector.h" -#include "function/function.h" +#include "function/cast/cast_function_bind_data.h" namespace kuzu { namespace function { @@ -41,7 +41,7 @@ struct UnaryCastStringFunctionWrapper { auto resultVector_ = (common::ValueVector*)resultVector; FUNC::operation(inputVector_.getValue(inputPos), resultVector_->getValue(resultPos), resultVector_, inputPos, - &reinterpret_cast(dataPtr)->csvConfig.option); + &reinterpret_cast(dataPtr)->option); } }; diff --git a/test/test_files/exceptions/binder/binder_error.test b/test/test_files/exceptions/binder/binder_error.test index 992e63da925..c815e938aeb 100644 --- a/test/test_files/exceptions/binder/binder_error.test +++ b/test/test_files/exceptions/binder/binder_error.test @@ -239,7 +239,7 @@ Binder exception: p1.age has data type INT64 but (STRING) was expected. -LOG UnionAndUnionAllInSingleQuery -STATEMENT MATCH (p:person) RETURN p.age UNION ALL MATCH (p1:person) RETURN p1.age UNION MATCH (p1:person) RETURN p1.age ---- error -Binder exception: Union and union all can't be used together. +Binder exception: Union and union all can not be used together. -LOG ReadAfterUpdate -STATEMENT MATCH (a:person) SET a.age = 35 WITH a MATCH (a)-[:knows]->(b:person) RETURN a.age @@ -587,10 +587,12 @@ Binder exception: COPY TO currently only supports csv and parquet files. -LOG InvalidArgCast -STATEMENT RETURN cast("[sdf, fsd, fad]", "STRING[]", "3rd arg"); ---- error -Binder exception: Invalid number of arguments for given function CAST. Expected: 2, Actual: 3. +Binder exception: Cannot match a built-in function for given function CAST(STRING,STRING,STRING). Supported inputs are +(ANY,STRING) -> ANY -STATEMENT RETURN cast("[sdf, fsd, fad]"); ---- error -Binder exception: Invalid number of arguments for given function CAST. Expected: 2, Actual: 1. +Binder exception: Cannot match a built-in function for given function CAST(STRING). Supported inputs are +(ANY,STRING) -> ANY -LOG InvalidImplicitCast -STATEMENT RETURN timestamp("2019-11-21") + "ok"; From c149349452338f2fee22a6b78f4f553b47dd8e5b Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Mon, 11 Mar 2024 00:45:39 +0800 Subject: [PATCH 013/136] Combine append(ValueVector) with appendOne --- src/include/storage/store/column_chunk.h | 10 +-- .../storage/store/string_column_chunk.h | 4 +- .../storage/store/struct_column_chunk.h | 4 +- .../storage/store/var_list_column_chunk.h | 8 +-- src/processor/operator/partitioner.cpp | 15 ++-- src/storage/store/column_chunk.cpp | 70 ++++++++----------- src/storage/store/node_group.cpp | 6 +- src/storage/store/string_column_chunk.cpp | 29 ++++---- src/storage/store/struct_column_chunk.cpp | 23 ++---- src/storage/store/var_list_column_chunk.cpp | 43 +++--------- 10 files changed, 81 insertions(+), 131 deletions(-) diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index af24d378a88..54cabac287c 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -3,6 +3,7 @@ #include #include "common/constants.h" +#include "common/data_chunk/sel_vector.h" #include "common/types/types.h" #include "common/vector/value_vector.h" #include "storage/buffer_manager/bm_file_handle.h" @@ -54,8 +55,7 @@ class ColumnChunk { // Note that the startPageIdx is not known, so it will always be common::INVALID_PAGE_IDX virtual ColumnChunkMetadata getMetadataToFlush() const; - virtual void append(common::ValueVector* vector); - virtual void appendOne(common::ValueVector* vector, common::vector_idx_t pos); + virtual void append(common::ValueVector* vector, common::SelectionVector& selVector); virtual void append( ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend); @@ -109,7 +109,8 @@ class ColumnChunk { common::offset_t getOffsetInBuffer(common::offset_t pos) const; - virtual void copyVectorToBuffer(common::ValueVector* vector, common::offset_t startPosInChunk); + virtual void copyVectorToBuffer(common::ValueVector* vector, common::offset_t startPosInChunk, + common::SelectionVector& selVector); private: uint64_t getBufferSize(uint64_t capacity_) const; @@ -150,8 +151,7 @@ class BoolColumnChunk : public ColumnChunk { // Booleans are always bitpacked, but this can also enable constant compression enableCompression, hasNullChunk) {} - void append(common::ValueVector* vector) final; - void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; + void append(common::ValueVector* vector, common::SelectionVector& sel) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) override; void write(common::ValueVector* vector, common::offset_t offsetInVector, diff --git a/src/include/storage/store/string_column_chunk.h b/src/include/storage/store/string_column_chunk.h index 2f999914d7d..a08dd04e929 100644 --- a/src/include/storage/store/string_column_chunk.h +++ b/src/include/storage/store/string_column_chunk.h @@ -1,6 +1,7 @@ #pragma once #include "common/assert.h" +#include "common/data_chunk/sel_vector.h" #include "common/types/types.h" #include "storage/store/column_chunk.h" #include "storage/store/dictionary_chunk.h" @@ -14,8 +15,7 @@ class StringColumnChunk : public ColumnChunk { common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); void resetToEmpty() final; - void append(common::ValueVector* vector) final; - void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; + void append(common::ValueVector* vector, common::SelectionVector& selVector) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final; diff --git a/src/include/storage/store/struct_column_chunk.h b/src/include/storage/store/struct_column_chunk.h index 110c424f095..508efd80412 100644 --- a/src/include/storage/store/struct_column_chunk.h +++ b/src/include/storage/store/struct_column_chunk.h @@ -1,5 +1,6 @@ #pragma once +#include "common/data_chunk/sel_vector.h" #include "common/types/internal_id_t.h" #include "common/types/types.h" #include "storage/store/column_chunk.h" @@ -22,8 +23,7 @@ class StructColumnChunk : public ColumnChunk { protected: void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final; - void append(common::ValueVector* vector) final; - void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; + void append(common::ValueVector* vector, common::SelectionVector& selVector) final; void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) final; diff --git a/src/include/storage/store/var_list_column_chunk.h b/src/include/storage/store/var_list_column_chunk.h index d2b896aeffe..15077ab3639 100644 --- a/src/include/storage/store/var_list_column_chunk.h +++ b/src/include/storage/store/var_list_column_chunk.h @@ -1,5 +1,6 @@ #pragma once +#include "common/data_chunk/sel_vector.h" #include "storage/store/column_chunk.h" namespace kuzu { @@ -17,8 +18,8 @@ struct VarListDataColumnChunk { void resizeBuffer(uint64_t numValues); - inline void append(common::ValueVector* dataVector) const { - dataColumnChunk->append(dataVector); + inline void append(common::ValueVector* dataVector, common::SelectionVector& selVector) const { + dataColumnChunk->append(dataVector, selVector); } inline uint64_t getNumValues() const { return dataColumnChunk->getNumValues(); } @@ -36,8 +37,7 @@ class VarListColumnChunk : public ColumnChunk { void resetToEmpty() final; - void append(common::ValueVector* vector) final; - void appendOne(common::ValueVector* vector, common::vector_idx_t pos) final; + void append(common::ValueVector* vector, common::SelectionVector& selVector) final; // Note: `write` assumes that no `append` will be called afterward. void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) final; diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 536d1af731c..816bc8f3b33 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -1,8 +1,7 @@ #include "processor/operator/partitioner.h" -#include - #include "common/constants.h" +#include "common/data_chunk/sel_vector.h" #include "processor/execution_context.h" #include "storage/store/column_chunk.h" #include "storage/store/node_table.h" @@ -154,6 +153,8 @@ void Partitioner::executeInternal(ExecutionContext* context) { void Partitioner::copyDataToPartitions( partition_idx_t partitioningIdx, DataChunk* chunkToCopyFrom) { + SelectionVector selVector(1); + selVector.resetSelectorToValuePosBufferWithSize(1); for (auto i = 0u; i < chunkToCopyFrom->state->selVector->selectedSize; i++) { auto posToCopyFrom = chunkToCopyFrom->state->selVector->selectedPositions[i]; auto partitionIdx = partitionIdxes->getValue(posToCopyFrom); @@ -165,16 +166,16 @@ void Partitioner::copyDataToPartitions( partition.chunks.back()[0]->getCapacity()) { partition.chunks.emplace_back(); partition.chunks.back().reserve(chunkToCopyFrom->getNumValueVectors()); - for (auto i = 0u; i < chunkToCopyFrom->getNumValueVectors(); i++) { + for (auto j = 0u; j < chunkToCopyFrom->getNumValueVectors(); j++) { partition.chunks.back().emplace_back(ColumnChunkFactory::createColumnChunk( - chunkToCopyFrom->getValueVector(i)->dataType, false /*enableCompression*/, + chunkToCopyFrom->getValueVector(j)->dataType, false /*enableCompression*/, Partitioner::CHUNK_SIZE)); } } KU_ASSERT(partition.chunks.back().size() == chunkToCopyFrom->getNumValueVectors()); - for (auto i = 0u; i < chunkToCopyFrom->getNumValueVectors(); i++) { - partition.chunks.back()[i]->appendOne( - chunkToCopyFrom->getValueVector(i).get(), posToCopyFrom); + selVector.selectedPositions[0] = posToCopyFrom; + for (auto j = 0u; j < chunkToCopyFrom->getNumValueVectors(); j++) { + partition.chunks.back()[j]->append(chunkToCopyFrom->getValueVector(j).get(), selVector); } } } diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 78de045f063..309dcf9833f 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -1,5 +1,6 @@ #include "storage/store/column_chunk.h" +#include "common/data_chunk/sel_vector.h" #include "common/exception/copy.h" #include "common/types/internal_id_t.h" #include "common/types/types.h" @@ -207,20 +208,10 @@ void ColumnChunk::resetToEmpty() { numValues = 0; } -void ColumnChunk::append(ValueVector* vector) { +void ColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { KU_ASSERT(vector->dataType.getPhysicalType() == dataType.getPhysicalType()); - copyVectorToBuffer(vector, numValues); - numValues += vector->state->selVector->selectedSize; -} - -void ColumnChunk::appendOne(common::ValueVector* vector, common::vector_idx_t pos) { - KU_ASSERT(vector->dataType.getPhysicalType() == dataType.getPhysicalType()); - KU_ASSERT(numValues < capacity); - memcpy(buffer.get() + numValues * numBytesPerValue, vector->getData() + pos * numBytesPerValue, - 1 * numBytesPerValue); - // TODO(Guodong): Should be wrapped into nullChunk->appendOne(vector); - nullChunk->setNull(this->numValues, vector->isNull(pos)); - numValues += 1; + copyVectorToBuffer(vector, numValues, selVector); + numValues += selVector.selectedSize; } void ColumnChunk::append( @@ -325,7 +316,7 @@ void ColumnChunk::populateWithDefaultVal(ValueVector* defaultValueVector) { auto numValuesToAppend = std::min(DEFAULT_VECTOR_CAPACITY, numValuesToPopulate - numValuesAppended); defaultValueVector->state->selVector->selectedSize = numValuesToAppend; - append(defaultValueVector); + append(defaultValueVector, *defaultValueVector->state->selVector); numValuesAppended += numValuesToAppend; } } @@ -340,20 +331,20 @@ offset_t ColumnChunk::getOffsetInBuffer(offset_t pos) const { return offsetInBuffer; } -void ColumnChunk::copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk) { +void ColumnChunk::copyVectorToBuffer( + ValueVector* vector, offset_t startPosInChunk, SelectionVector& selVector) { auto bufferToWrite = buffer.get() + startPosInChunk * numBytesPerValue; - KU_ASSERT(startPosInChunk + vector->state->selVector->selectedSize <= capacity); + KU_ASSERT(startPosInChunk + selVector.selectedSize <= capacity); auto vectorDataToWriteFrom = vector->getData(); - if (vector->state->selVector->isUnfiltered()) { - memcpy(bufferToWrite, vectorDataToWriteFrom, - vector->state->selVector->selectedSize * numBytesPerValue); + if (selVector.isUnfiltered()) { + memcpy(bufferToWrite, vectorDataToWriteFrom, selVector.selectedSize * numBytesPerValue); // TODO(Guodong): Should be wrapped into nullChunk->append(vector); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { + for (auto i = 0u; i < selVector.selectedSize; i++) { nullChunk->setNull(startPosInChunk + i, vector->isNull(i)); } } else { - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - auto pos = vector->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; // TODO(Guodong): Should be wrapped into nullChunk->append(vector); nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); memcpy(bufferToWrite, vectorDataToWriteFrom + pos * numBytesPerValue, numBytesPerValue); @@ -416,21 +407,14 @@ uint64_t ColumnChunk::getBufferSize(uint64_t capacity_) const { } } -void BoolColumnChunk::append(ValueVector* vector) { +void BoolColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::BOOL); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - auto pos = vector->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; nullChunk->setNull(numValues + i, vector->isNull(pos)); NullMask::setNull((uint64_t*)buffer.get(), numValues + i, vector->getValue(pos)); } - numValues += vector->state->selVector->selectedSize; -} - -void BoolColumnChunk::appendOne(ValueVector* vector, vector_idx_t pos) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::BOOL); - nullChunk->setNull(numValues, vector->isNull(pos)); - NullMask::setNull((uint64_t*)buffer.get(), numValues, vector->getValue(pos)); - numValues += 1; + numValues += selVector.selectedSize; } void BoolColumnChunk::append( @@ -553,10 +537,11 @@ class FixedListColumnChunk : public ColumnChunk { numValues = offsetInChunk >= numValues ? offsetInChunk + 1 : numValues; } - void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk) final { + void copyVectorToBuffer( + ValueVector* vector, offset_t startPosInChunk, SelectionVector& selVector) final { auto vectorDataToWriteFrom = vector->getData(); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - auto pos = vector->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); memcpy(buffer.get() + getOffsetInBuffer(startPosInChunk + i), vectorDataToWriteFrom + pos * numBytesPerValue, numBytesPerValue); @@ -570,16 +555,17 @@ class InternalIDColumnChunk final : public ColumnChunk { explicit InternalIDColumnChunk(uint64_t capacity) : ColumnChunk(*LogicalType::INT64(), capacity, false /*enableCompression*/) {} - void append(ValueVector* vector) override { + void append(ValueVector* vector, common::SelectionVector& selVector) override { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); - copyVectorToBuffer(vector, numValues); - numValues += vector->state->selVector->selectedSize; + copyVectorToBuffer(vector, numValues, selVector); + numValues += selVector.selectedSize; } - void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk) override { + void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk, + common::SelectionVector& selVector) override { auto relIDsInVector = (internalID_t*)vector->getData(); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - auto pos = vector->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); memcpy(buffer.get() + (startPosInChunk + i) * numBytesPerValue, &relIDsInVector[pos].offset, numBytesPerValue); diff --git a/src/storage/store/node_group.cpp b/src/storage/store/node_group.cpp index 2b4582503c8..a5b081f6a91 100644 --- a/src/storage/store/node_group.cpp +++ b/src/storage/store/node_group.cpp @@ -106,8 +106,10 @@ uint64_t NodeGroup::append(const std::vector& columnVectors, serialSkip++; continue; } - KU_ASSERT(chunk->getDataType() == columnVectors[i - serialSkip]->dataType); - chunk->append(columnVectors[i - serialSkip]); + KU_ASSERT((i - serialSkip) < columnVectors.size()); + auto columnVector = columnVectors[i - serialSkip]; + KU_ASSERT(chunk->getDataType() == columnVector->dataType); + chunk->append(columnVector, *columnVector->state->selVector); } columnState->selVector->selectedSize = originalSize; numRows += numValuesToAppendInChunk; diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index a392f6bf358..696b6e36a3f 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -1,5 +1,6 @@ #include "storage/store/string_column_chunk.h" +#include "common/data_chunk/sel_vector.h" #include "storage/store/column_chunk.h" #include "storage/store/dictionary_chunk.h" @@ -20,24 +21,20 @@ void StringColumnChunk::resetToEmpty() { dictionaryChunk->resetToEmpty(); } -void StringColumnChunk::append(ValueVector* vector) { - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { +void StringColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { + for (auto i = 0u; i < selVector.selectedSize; i++) { // index is stored in main chunk, data is stored in the data chunk - auto pos = vector->state->selVector->selectedPositions[i]; - appendOne(vector, pos); - } -} - -void StringColumnChunk::appendOne(common::ValueVector* vector, common::vector_idx_t pos) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); - // index is stored in main chunk, data is stored in the data chunk - nullChunk->setNull(numValues, vector->isNull(pos)); - auto dstPos = numValues++; - if (vector->isNull(pos)) { - return; + auto pos = selVector.selectedPositions[i]; + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); + // index is stored in main chunk, data is stored in the data chunk + nullChunk->setNull(numValues, vector->isNull(pos)); + auto dstPos = numValues++; + if (vector->isNull(pos)) { + continue; + } + auto kuString = vector->getValue(pos); + setValueFromString(kuString.getAsStringView(), dstPos); } - auto kuString = vector->getValue(pos); - setValueFromString(kuString.getAsStringView(), dstPos); } void StringColumnChunk::append( diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index cafd0e26f2d..97c9ce3ca66 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -1,5 +1,6 @@ #include "storage/store/struct_column_chunk.h" +#include "common/data_chunk/sel_vector.h" #include "common/types/internal_id_t.h" #include "common/types/types.h" #include "storage/store/column_chunk.h" @@ -41,27 +42,15 @@ void StructColumnChunk::append( numValues += numValuesToAppend; } -void StructColumnChunk::append(ValueVector* vector) { +void StructColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { auto numFields = StructType::getNumFields(&dataType); for (auto i = 0u; i < numFields; i++) { - childChunks[i]->append(StructVector::getFieldVector(vector, i).get()); + childChunks[i]->append(StructVector::getFieldVector(vector, i).get(), selVector); } - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - nullChunk->setNull( - numValues + i, vector->isNull(vector->state->selVector->selectedPositions[i])); + for (auto i = 0u; i < selVector.selectedSize; i++) { + nullChunk->setNull(numValues + i, vector->isNull(selVector.selectedPositions[i])); } - numValues += vector->state->selVector->selectedSize; -} - -void StructColumnChunk::appendOne(ValueVector* vector, vector_idx_t pos) { - auto numFields = StructType::getNumFields(&dataType); - for (auto i = 0u; i < numFields; i++) { - childChunks[i]->appendOne(StructVector::getFieldVector(vector, i).get(), pos); - } - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - nullChunk->setNull(numValues + i, vector->isNull(pos)); - } - numValues += 1; + numValues += selVector.selectedSize; } void StructColumnChunk::resize(uint64_t newCapacity) { diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index 733eddeb0f2..5ac1d22eefb 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -1,6 +1,7 @@ #include "storage/store/var_list_column_chunk.h" #include "common/cast.h" +#include "common/data_chunk/sel_vector.h" #include "common/types/value/value.h" #include "storage/store/column_chunk.h" @@ -60,8 +61,8 @@ void VarListColumnChunk::resetToEmpty() { enableCompression, 0 /* capacity */)); } -void VarListColumnChunk::append(ValueVector* vector) { - auto numToAppend = vector->state->selVector->selectedSize; +void VarListColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { + auto numToAppend = selVector.selectedSize; auto newCapacity = capacity; while (numValues + numToAppend >= newCapacity) { newCapacity *= 1.5; @@ -71,8 +72,8 @@ void VarListColumnChunk::append(ValueVector* vector) { } auto nextListOffsetInChunk = getListOffset(numValues); auto offsetBufferToWrite = (offset_t*)(buffer.get()); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - auto pos = vector->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; uint64_t listLen = vector->isNull(pos) ? 0 : vector->getValue(pos).size; nullChunk->setNull(numValues + i, vector->isNull(pos)); nextListOffsetInChunk += listLen; @@ -82,8 +83,8 @@ void VarListColumnChunk::append(ValueVector* vector) { auto dataVector = ListVector::getDataVector(vector); dataVector->setState(std::make_unique()); dataVector->state->selVector->resetSelectorToValuePosBuffer(); - for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - auto pos = vector->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; if (vector->isNull(pos)) { continue; } @@ -92,32 +93,6 @@ void VarListColumnChunk::append(ValueVector* vector) { numValues += numToAppend; } -void VarListColumnChunk::appendOne(common::ValueVector* vector, common::vector_idx_t pos) { - auto numToAppend = 1; - auto newCapacity = capacity; - while (numValues + numToAppend >= newCapacity) { - newCapacity *= 1.5; - } - if (capacity != newCapacity) { - resize(newCapacity); - } - auto nextListOffsetInChunk = getListOffset(numValues); - auto offsetBufferToWrite = (offset_t*)(buffer.get()); - uint64_t listLen = vector->isNull(pos) ? 0 : vector->getValue(pos).size; - nullChunk->setNull(numValues, vector->isNull(pos)); - nextListOffsetInChunk += listLen; - offsetBufferToWrite[numValues] = nextListOffsetInChunk; - - varListDataColumnChunk->resizeBuffer(nextListOffsetInChunk); - auto dataVector = ListVector::getDataVector(vector); - dataVector->setState(std::make_unique()); - dataVector->state->selVector->resetSelectorToValuePosBuffer(); - if (!vector->isNull(pos)) { - copyListValues(vector->getValue(pos), dataVector); - } - numValues += numToAppend; -} - void VarListColumnChunk::appendNullList() { auto nextListOffsetInChunk = getListOffset(numValues); auto offsetBufferToWrite = (offset_t*)(buffer.get()); @@ -156,7 +131,7 @@ void VarListColumnChunk::write( initializeIndices(); } auto currentIndex = numValues; - append(vector); + append(vector, *vector->state->selVector); KU_ASSERT(offsetInChunk < capacity); indicesColumnChunk->setValue(currentIndex, offsetInChunk); indicesColumnChunk->getNullChunk()->setNull(offsetInChunk, vector->isNull(offsetInVector)); @@ -214,7 +189,7 @@ void VarListColumnChunk::copyListValues(const list_entry_t& entry, ValueVector* dataVector->state->selVector->selectedPositions[j] = entry.offset + numListValuesCopied + j; } - varListDataColumnChunk->append(dataVector); + varListDataColumnChunk->append(dataVector, *dataVector->state->selVector); numListValuesCopied += numListValuesToCopyInBatch; } } From 2a5948f93485856676c1ba76771f0a310795663d Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Mon, 11 Mar 2024 01:34:20 +0800 Subject: [PATCH 014/136] clean up unique_ptr of LogicalType in NodeGroup and BatchInsert --- src/common/types/types.cpp | 10 ++++++- src/include/common/types/types.h | 1 + src/include/processor/operator/partitioner.h | 4 +-- .../operator/persistent/node_batch_insert.h | 4 +-- .../operator/persistent/rel_batch_insert.h | 5 ++-- src/include/processor/plan_mapper.h | 3 +- .../storage/local_storage/local_table.h | 4 +-- src/include/storage/store/node_group.h | 17 ++++++----- src/processor/map/map_copy_from.cpp | 28 +++++++++---------- src/processor/operator/partitioner.cpp | 5 ++-- .../operator/persistent/node_batch_insert.cpp | 6 ++-- src/storage/local_storage/local_rel_table.cpp | 2 +- src/storage/local_storage/local_table.cpp | 8 +++--- src/storage/store/node_group.cpp | 10 +++---- src/storage/store/node_table_data.cpp | 2 +- src/storage/store/rel_table_data.cpp | 4 +-- 16 files changed, 60 insertions(+), 53 deletions(-) diff --git a/src/common/types/types.cpp b/src/common/types/types.cpp index 5931e80da4b..e6b7f62f57f 100644 --- a/src/common/types/types.cpp +++ b/src/common/types/types.cpp @@ -436,13 +436,21 @@ std::unique_ptr LogicalType::copy() const { std::vector> LogicalType::copy( const std::vector>& types) { std::vector> typesCopy; - typesCopy.reserve(types.size()); for (auto& type : types) { typesCopy.push_back(type->copy()); } return typesCopy; } +std::vector LogicalType::copy(const std::vector& types) { + std::vector typesCopy; + typesCopy.reserve(types.size()); + for (auto& type : types) { + typesCopy.push_back(*type.copy()); + } + return typesCopy; +} + PhysicalTypeID LogicalType::getPhysicalType(LogicalTypeID typeID) { switch (typeID) { case LogicalTypeID::ANY: { diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index a0b90450d98..6ef8a4239bc 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -301,6 +301,7 @@ class LogicalType { static std::vector> copy( const std::vector>& types); + static std::vector copy(const std::vector& types); static std::unique_ptr ANY() { return std::make_unique(LogicalTypeID::ANY); diff --git a/src/include/processor/operator/partitioner.h b/src/include/processor/operator/partitioner.h index c6651840944..0ea13067b09 100644 --- a/src/include/processor/operator/partitioner.h +++ b/src/include/processor/operator/partitioner.h @@ -76,11 +76,11 @@ struct PartitionerLocalState { struct PartitioningInfo { DataPos keyDataPos; std::vector columnDataPositions; - common::logical_types_t columnTypes; + std::vector columnTypes; partitioner_func_t partitionerFunc; PartitioningInfo(DataPos keyDataPos, std::vector columnDataPositions, - common::logical_types_t columnTypes, partitioner_func_t partitionerFunc) + std::vector columnTypes, partitioner_func_t partitionerFunc) : keyDataPos{keyDataPos}, columnDataPositions{std::move(columnDataPositions)}, columnTypes{std::move(columnTypes)}, partitionerFunc{std::move(partitionerFunc)} {} inline std::unique_ptr copy() { diff --git a/src/include/processor/operator/persistent/node_batch_insert.h b/src/include/processor/operator/persistent/node_batch_insert.h index b1a4c14f644..a17962b9741 100644 --- a/src/include/processor/operator/persistent/node_batch_insert.h +++ b/src/include/processor/operator/persistent/node_batch_insert.h @@ -13,11 +13,11 @@ namespace processor { struct NodeBatchInsertInfo final : public BatchInsertInfo { std::vector columnPositions; bool containSerial = false; - std::vector> columnTypes; + std::vector columnTypes; NodeBatchInsertInfo(catalog::TableCatalogEntry* tableEntry, bool compressionEnabled, std::vector columnPositions, bool containSerial, - std::vector> columnTypes) + std::vector columnTypes) : BatchInsertInfo{tableEntry, compressionEnabled}, columnPositions{columnPositions}, containSerial{containSerial}, columnTypes{std::move(columnTypes)} {} diff --git a/src/include/processor/operator/persistent/rel_batch_insert.h b/src/include/processor/operator/persistent/rel_batch_insert.h index 8df5ab2000f..59233b8d9f7 100644 --- a/src/include/processor/operator/persistent/rel_batch_insert.h +++ b/src/include/processor/operator/persistent/rel_batch_insert.h @@ -13,12 +13,11 @@ struct RelBatchInsertInfo final : public BatchInsertInfo { common::RelDataDirection direction; uint64_t partitioningIdx; common::vector_idx_t offsetVectorIdx; - std::vector> columnTypes; + std::vector columnTypes; RelBatchInsertInfo(catalog::TableCatalogEntry* tableEntry, bool compressionEnabled, common::RelDataDirection direction, uint64_t partitioningIdx, - common::vector_idx_t offsetVectorIdx, - std::vector> columnTypes) + common::vector_idx_t offsetVectorIdx, std::vector columnTypes) : BatchInsertInfo{tableEntry, compressionEnabled}, direction{direction}, partitioningIdx{partitioningIdx}, offsetVectorIdx{offsetVectorIdx}, columnTypes{std::move( columnTypes)} {} diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index cf193bf9888..35944330969 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -110,8 +110,7 @@ class PlanMapper { std::unique_ptr createCopyRel( std::shared_ptr partitionerSharedState, std::shared_ptr sharedState, planner::LogicalCopyFrom* copyFrom, - common::RelDataDirection direction, - std::vector> columnTypes); + common::RelDataDirection direction, std::vector columnTypes); std::unique_ptr createResultCollector(common::AccumulateType accumulateType, const binder::expression_vector& expressions, planner::Schema* schema, diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index cb0f26a6150..061fb69947b 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -47,7 +47,7 @@ class LocalVector { // contains 64 vectors (chunks). class LocalVectorCollection { public: - LocalVectorCollection(std::unique_ptr dataType, MemoryManager* mm) + LocalVectorCollection(common::LogicalType dataType, MemoryManager* mm) : dataType{std::move(dataType)}, mm{mm}, numRows{0} {} void read(common::row_idx_t rowIdx, common::ValueVector* outputVector, @@ -69,7 +69,7 @@ class LocalVectorCollection { void prepareAppend(); private: - std::unique_ptr dataType; + common::LogicalType dataType; MemoryManager* mm; std::vector> vectors; common::row_idx_t numRows; diff --git a/src/include/storage/store/node_group.h b/src/include/storage/store/node_group.h index 755cfb98d13..1a59796fef9 100644 --- a/src/include/storage/store/node_group.h +++ b/src/include/storage/store/node_group.h @@ -10,17 +10,21 @@ class Column; class NodeGroup { public: - NodeGroup(const std::vector>& columnTypes, - bool enableCompression, uint64_t capacity); + NodeGroup(const std::vector& columnTypes, bool enableCompression, + uint64_t capacity); NodeGroup(const std::vector>& columns, bool enableCompression); virtual ~NodeGroup() = default; inline uint64_t getNodeGroupIdx() const { return nodeGroupIdx; } inline common::row_idx_t getNumRows() const { return numRows; } - inline ColumnChunk* getColumnChunk(common::column_id_t columnID) { + inline ColumnChunk* getColumnChunkUnsafe(common::column_id_t columnID) { KU_ASSERT(columnID < chunks.size()); return chunks[columnID].get(); } + inline const ColumnChunk& getColumnChunk(common::column_id_t columnID) { + KU_ASSERT(columnID < chunks.size()); + return *chunks[columnID]; + } inline bool isFull() const { return numRows == common::StorageConstants::NODE_GROUP_SIZE; } void resetToEmpty(); @@ -72,8 +76,7 @@ struct CSRHeaderChunks { class CSRNodeGroup : public NodeGroup { public: - CSRNodeGroup(const std::vector>& columnTypes, - bool enableCompression); + CSRNodeGroup(const std::vector& columnTypes, bool enableCompression); CSRHeaderChunks& getCSRHeader() { return csrHeaderChunks; } const CSRHeaderChunks& getCSRHeader() const { return csrHeaderChunks; } @@ -89,8 +92,8 @@ class CSRNodeGroup : public NodeGroup { struct NodeGroupFactory { static inline std::unique_ptr createNodeGroup(common::ColumnDataFormat dataFormat, - const std::vector>& columnTypes, - bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { + const std::vector& columnTypes, bool enableCompression, + uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { return dataFormat == common::ColumnDataFormat::REGULAR ? std::make_unique(columnTypes, enableCompression, capacity) : std::make_unique(columnTypes, enableCompression); diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index 11af63835af..e3ffaf29282 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -49,25 +49,25 @@ std::unique_ptr PlanMapper::mapCopyFrom(LogicalOperator* logic } static void getNodeColumnsInCopyOrder(TableCatalogEntry* tableEntry, - std::vector& columnNames, logical_types_t& columnTypes) { + std::vector& columnNames, std::vector& columnTypes) { for (auto& property : tableEntry->getPropertiesRef()) { columnNames.push_back(property.getName()); - columnTypes.push_back(property.getDataType()->copy()); + columnTypes.push_back(*property.getDataType()->copy()); } } static void getRelColumnNamesInCopyOrder(TableCatalogEntry* tableEntry, - std::vector& columnNames, logical_types_t& columnTypes) { + std::vector& columnNames, std::vector& columnTypes) { columnNames.emplace_back(InternalKeyword::SRC_OFFSET); columnNames.emplace_back(InternalKeyword::DST_OFFSET); columnNames.emplace_back(InternalKeyword::ROW_OFFSET); - columnTypes.emplace_back(std::make_unique(LogicalTypeID::INT64)); - columnTypes.emplace_back(std::make_unique(LogicalTypeID::INT64)); - columnTypes.emplace_back(std::make_unique(LogicalTypeID::INT64)); + columnTypes.emplace_back(LogicalType(LogicalTypeID::INT64)); + columnTypes.emplace_back(LogicalType(LogicalTypeID::INT64)); + columnTypes.emplace_back(LogicalType(LogicalTypeID::INT64)); auto& properties = tableEntry->getPropertiesRef(); for (auto i = 1u; i < properties.size(); ++i) { // skip internal ID columnNames.push_back(properties[i].getName()); - columnTypes.push_back(properties[i].getDataType()->copy()); + columnTypes.push_back(*properties[i].getDataType()->copy()); } } @@ -121,11 +121,11 @@ std::unique_ptr PlanMapper::mapCopyNodeFrom(LogicalOperator* l sharedState->pkColumnIdx = nodeTableEntry->getColumnID(pk->getPropertyID()); sharedState->pkType = *pk->getDataType(); std::vector columnNames; - logical_types_t columnTypes; + std::vector columnTypes; getNodeColumnsInCopyOrder(nodeTableEntry, columnNames, columnTypes); std::vector columnNamesExcludingSerial; for (auto i = 0u; i < columnNames.size(); ++i) { - if (columnTypes[i]->getLogicalTypeID() == common::LogicalTypeID::SERIAL) { + if (columnTypes[i].getLogicalTypeID() == common::LogicalTypeID::SERIAL) { continue; } columnNamesExcludingSerial.push_back(columnNames[i]); @@ -153,7 +153,7 @@ std::unique_ptr PlanMapper::mapPartitioner(LogicalOperator* lo auto info = logicalPartitioner->getInfo(i); auto keyPos = getDataPos(*info->key, *outFSchema); std::vector columnNames; - logical_types_t columnTypes; + std::vector columnTypes; getRelColumnNamesInCopyOrder(info->tableEntry, columnNames, columnTypes); auto columnPositions = getColumnDataPositions(columnNames, info->payloads, *outFSchema); infos.push_back(std::make_unique(keyPos, columnPositions, @@ -168,7 +168,7 @@ std::unique_ptr PlanMapper::mapPartitioner(LogicalOperator* lo std::unique_ptr PlanMapper::createCopyRel( std::shared_ptr partitionerSharedState, std::shared_ptr sharedState, LogicalCopyFrom* copyFrom, - RelDataDirection direction, std::vector> columnTypes) { + RelDataDirection direction, std::vector columnTypes) { auto copyFromInfo = copyFrom->getInfo(); auto outFSchema = copyFrom->getSchema(); auto partitioningIdx = direction == RelDataDirection::FWD ? 0 : 1; @@ -195,10 +195,10 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator partitionerSharedState->dstNodeTable = storageManager.getNodeTable(relTableEntry->getDstTableID()); // TODO(Xiyang): Move binding of column types to binder. - std::vector> columnTypes; - columnTypes.push_back(LogicalType::INTERNAL_ID()); // ADJ COLUMN. + std::vector columnTypes; + columnTypes.push_back(*LogicalType::INTERNAL_ID()); // NBR_ID COLUMN. for (auto& property : relTableEntry->getPropertiesRef()) { - columnTypes.push_back(property.getDataType()->copy()); + columnTypes.push_back(*property.getDataType()->copy()); } auto batchInsertSharedState = std::make_shared( storageManager.getRelTable(relTableEntry->getTableID()), getSingleStringColumnFTable(), diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 536d1af731c..f09d623f88e 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -106,14 +106,13 @@ void Partitioner::initLocalStateInternal(ResultSet* /*resultSet*/, ExecutionCont } static void constructDataChunk(DataChunk* dataChunk, const std::vector& columnPositions, - const logical_types_t& columnTypes, const ResultSet& resultSet) { + std::vector columnTypes, const ResultSet& resultSet) { for (auto i = 0u; i < columnPositions.size(); i++) { auto pos = columnPositions[i]; if (pos.isValid()) { dataChunk->insert(i, resultSet.getValueVector(pos)); } else { - auto columnType = columnTypes[i].get(); - auto nullVector = std::make_shared(*columnType); + auto nullVector = std::make_shared(columnTypes[i]); nullVector->setAllNull(); dataChunk->insert(i, nullVector); } diff --git a/src/processor/operator/persistent/node_batch_insert.cpp b/src/processor/operator/persistent/node_batch_insert.cpp index ecfdffdcda1..908d09d3092 100644 --- a/src/processor/operator/persistent/node_batch_insert.cpp +++ b/src/processor/operator/persistent/node_batch_insert.cpp @@ -87,8 +87,8 @@ void NodeBatchInsert::initLocalStateInternal(ResultSet* resultSet, ExecutionCont if (pos.isValid()) { nodeLocalState->columnVectors.push_back(resultSet->getValueVector(pos).get()); } else { - auto columnType = nodeInfo->columnTypes[i].get(); - auto nullVector = std::make_shared(*columnType); + auto& columnType = nodeInfo->columnTypes[i]; + auto nullVector = std::make_shared(columnType); nullVector->setState(state); nullVector->setAllNull(); nodeLocalState->nullColumnVectors.push_back(nullVector); @@ -134,7 +134,7 @@ void NodeBatchInsert::writeAndResetNodeGroup(node_group_idx_t nodeGroupIdx, if (indexBuilder) { auto nodeOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); indexBuilder->insert( - nodeGroup->getColumnChunk(pkColumnID), nodeOffset, nodeGroup->getNumRows()); + nodeGroup->getColumnChunkUnsafe(pkColumnID), nodeOffset, nodeGroup->getNumRows()); } table->append(nodeGroup); nodeGroup->resetToEmpty(); diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index ffdc53a8a07..1bef39a08b1 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -101,7 +101,7 @@ LocalRelNG::LocalRelNG(offset_t nodeGroupStartOffset, std::vector MemoryManager* mm, common::RelMultiplicity multiplicity) : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes), mm} { relNGInfo = std::make_unique(multiplicity, chunks.size()); - adjChunk = std::make_unique(LogicalType::INTERNAL_ID(), mm); + adjChunk = std::make_unique(*LogicalType::INTERNAL_ID(), mm); } // TODO(Guodong): We should change the map between relID and rowIdx to a vector of pairs, which is diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index 1310e2904d7..0851eae052e 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -39,18 +39,18 @@ row_idx_t LocalVectorCollection::append(ValueVector* vector) { void LocalVectorCollection::prepareAppend() { if (vectors.empty()) { - vectors.emplace_back(std::make_unique(*dataType, mm)); + vectors.emplace_back(std::make_unique(dataType, mm)); } auto lastVector = vectors.back().get(); if (lastVector->isFull()) { - vectors.emplace_back(std::make_unique(*dataType, mm)); + vectors.emplace_back(std::make_unique(dataType, mm)); } } std::unique_ptr LocalVectorCollection::getStructChildVectorCollection( common::struct_field_idx_t idx) { auto childCollection = std::make_unique( - StructType::getField(dataType.get(), idx)->getType()->copy(), mm); + *StructType::getField(&dataType, idx)->getType()->copy(), mm); for (auto i = 0u; i < numRows; i++) { auto fieldVector = @@ -68,7 +68,7 @@ LocalNodeGroup::LocalNodeGroup( for (auto i = 0u; i < dataTypes.size(); ++i) { // To avoid unnecessary memory consumption, we chunk local changes of each column in the // node group into chunks of size DEFAULT_VECTOR_CAPACITY. - chunks[i] = std::make_unique(dataTypes[i]->copy(), mm); + chunks[i] = std::make_unique(*dataTypes[i]->copy(), mm); } } diff --git a/src/storage/store/node_group.cpp b/src/storage/store/node_group.cpp index 2b4582503c8..b54975e097a 100644 --- a/src/storage/store/node_group.cpp +++ b/src/storage/store/node_group.cpp @@ -28,7 +28,6 @@ bool CSRHeaderChunks::sanityCheck() const { return true; } -// TODO(Guodong): Should be refactored to use copy of ColumnChunk. void CSRHeaderChunks::copyFrom(const CSRHeaderChunks& other) const { auto numValues = other.offset->getNumValues(); memcpy(offset->getData(), other.offset->getData(), numValues * sizeof(offset_t)); @@ -47,13 +46,13 @@ void CSRHeaderChunks::fillDefaultValues(offset_t newNumValues) const { offset->getNumValues() >= newNumValues && length->getNumValues() == offset->getNumValues()); } -NodeGroup::NodeGroup(const std::vector>& columnTypes, - bool enableCompression, uint64_t capacity) +NodeGroup::NodeGroup( + const std::vector& columnTypes, bool enableCompression, uint64_t capacity) : nodeGroupIdx{UINT64_MAX}, numRows{0} { chunks.reserve(columnTypes.size()); for (auto& type : columnTypes) { chunks.push_back( - ColumnChunkFactory::createColumnChunk(*type->copy(), enableCompression, capacity)); + ColumnChunkFactory::createColumnChunk(*type.copy(), enableCompression, capacity)); } } @@ -177,8 +176,7 @@ length_t CSRHeaderChunks::getCSRLength(offset_t nodeOffset) const { return nodeOffset >= length->getNumValues() ? 0 : length->getValue(nodeOffset); } -CSRNodeGroup::CSRNodeGroup( - const std::vector>& columnTypes, bool enableCompression) +CSRNodeGroup::CSRNodeGroup(const std::vector& columnTypes, bool enableCompression) // By default, initialize all column chunks except for the csrOffsetChunk to empty, as they // should be resized after csr offset calculation (e.g., during RelBatchInsert). : NodeGroup{columnTypes, enableCompression, 0 /* capacity */} { diff --git a/src/storage/store/node_table_data.cpp b/src/storage/store/node_table_data.cpp index 575a0b2cc64..041d6a5530b 100644 --- a/src/storage/store/node_table_data.cpp +++ b/src/storage/store/node_table_data.cpp @@ -99,7 +99,7 @@ void NodeTableData::lookup(Transaction* transaction, TableReadState& readState, void NodeTableData::append(kuzu::storage::NodeGroup* nodeGroup) { for (auto columnID = 0u; columnID < columns.size(); columnID++) { - auto columnChunk = nodeGroup->getColumnChunk(columnID); + auto columnChunk = nodeGroup->getColumnChunkUnsafe(columnID); KU_ASSERT(columnID < columns.size()); columns[columnID]->append(columnChunk, nodeGroup->getNodeGroupIdx()); } diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index ef3bcea03c8..65e9d999971 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -304,10 +304,10 @@ bool RelTableData::checkIfNodeHasRels(Transaction* transaction, offset_t nodeOff void RelTableData::append(NodeGroup* nodeGroup) { auto csrNodeGroup = ku_dynamic_cast(nodeGroup); csrHeaderColumns.append(csrNodeGroup->getCSRHeader(), nodeGroup->getNodeGroupIdx()); - adjColumn->append(nodeGroup->getColumnChunk(0), nodeGroup->getNodeGroupIdx()); + adjColumn->append(nodeGroup->getColumnChunkUnsafe(0), nodeGroup->getNodeGroupIdx()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { columns[columnID]->append( - nodeGroup->getColumnChunk(columnID + 1), nodeGroup->getNodeGroupIdx()); + nodeGroup->getColumnChunkUnsafe(columnID + 1), nodeGroup->getNodeGroupIdx()); } } From 6c01c8045f1727b4944180bff9e204d3bc75f075 Mon Sep 17 00:00:00 2001 From: mxwli Date: Wed, 28 Feb 2024 15:51:12 -0500 Subject: [PATCH 015/136] handle multiple database instantiations for import caching --- tools/python_api/src_cpp/include/py_database.h | 1 + tools/python_api/src_cpp/kuzu_binding.cpp | 5 +++++ tools/python_api/src_cpp/py_database.cpp | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/tools/python_api/src_cpp/include/py_database.h b/tools/python_api/src_cpp/include/py_database.h index 2e65ec9e56c..cc5425f0f16 100644 --- a/tools/python_api/src_cpp/include/py_database.h +++ b/tools/python_api/src_cpp/include/py_database.h @@ -2,6 +2,7 @@ #include "main/kuzu.h" #include "main/storage_driver.h" +#include "cached_import/py_cached_import.h" #include "pybind_include.h" // IWYU pragma: keep (used for py:: namespace) #define PYBIND11_DETAILED_ERROR_MESSAGES using namespace kuzu::main; diff --git a/tools/python_api/src_cpp/kuzu_binding.cpp b/tools/python_api/src_cpp/kuzu_binding.cpp index b3f8581e17d..69a51a4dfc4 100644 --- a/tools/python_api/src_cpp/kuzu_binding.cpp +++ b/tools/python_api/src_cpp/kuzu_binding.cpp @@ -1,3 +1,4 @@ +#include "include/cached_import/py_cached_import.h" #include "include/py_connection.h" #include "include/py_database.h" #include "include/py_prepared_statement.h" @@ -8,6 +9,10 @@ void bind(py::module& m) { PyConnection::initialize(m); PyPreparedStatement::initialize(m); PyQueryResult::initialize(m); + auto cleanImportCache = []() { + kuzu::importCache.reset(); + }; + m.add_object("_clean_import_cache", py::capsule(cleanImportCache)); } PYBIND11_MODULE(_kuzu, m) { diff --git a/tools/python_api/src_cpp/py_database.cpp b/tools/python_api/src_cpp/py_database.cpp index 0ed4c234fd3..fa02ef713af 100644 --- a/tools/python_api/src_cpp/py_database.cpp +++ b/tools/python_api/src_cpp/py_database.cpp @@ -48,8 +48,14 @@ PyDatabase::PyDatabase(const std::string& databasePath, uint64_t bufferPoolSize, database = std::make_unique(databasePath, systemConfig); database->addBuiltInFunction(READ_PANDAS_FUNC_NAME, kuzu::PandasScanFunction::getFunctionSet()); storageDriver = std::make_unique(database.get()); + py::gil_scoped_acquire acquire; + if (kuzu::importCache.get() == nullptr) { + kuzu::importCache = std::make_shared(); + } } +PyDatabase::~PyDatabase() {} + template void PyDatabase::scanNodeTable(const std::string& tableName, const std::string& propName, const py::array_t& indices, py::array_t& result, int numThreads) { From 3f84585ecec16c766fa510fd25510203d5f62dd0 Mon Sep 17 00:00:00 2001 From: mxwli Date: Mon, 11 Mar 2024 11:49:42 -0400 Subject: [PATCH 016/136] Revert "Revert "Implement Python Import Caching"" This reverts commit 1653b4026cec55a49747a17c8cb3c57ec6b0ed3c. --- tools/python_api/CMakeLists.txt | 2 + .../cached_import/py_cached_import.cpp | 18 +++ .../src_cpp/cached_import/py_cached_item.cpp | 24 ++++ .../include/cached_import/py_cached_import.h | 33 +++++ .../include/cached_import/py_cached_item.h | 26 ++++ .../include/cached_import/py_cached_modules.h | 128 ++++++++++++++++++ .../python_api/src_cpp/include/py_database.h | 2 +- .../src_cpp/pandas/pandas_analyzer.cpp | 7 +- .../python_api/src_cpp/pandas/pandas_scan.cpp | 4 +- tools/python_api/src_cpp/py_connection.cpp | 15 +- tools/python_api/src_cpp/py_conversion.cpp | 12 +- tools/python_api/src_cpp/py_database.cpp | 3 + tools/python_api/src_cpp/py_query_result.cpp | 29 ++-- .../src_cpp/py_query_result_converter.cpp | 9 +- 14 files changed, 275 insertions(+), 37 deletions(-) create mode 100644 tools/python_api/src_cpp/cached_import/py_cached_import.cpp create mode 100644 tools/python_api/src_cpp/cached_import/py_cached_item.cpp create mode 100644 tools/python_api/src_cpp/include/cached_import/py_cached_import.h create mode 100644 tools/python_api/src_cpp/include/cached_import/py_cached_item.h create mode 100644 tools/python_api/src_cpp/include/cached_import/py_cached_modules.h diff --git a/tools/python_api/CMakeLists.txt b/tools/python_api/CMakeLists.txt index e1c3e1f4d97..1319a8c43cb 100644 --- a/tools/python_api/CMakeLists.txt +++ b/tools/python_api/CMakeLists.txt @@ -9,6 +9,8 @@ file(GLOB SOURCE_PY pybind11_add_module(_kuzu SHARED src_cpp/kuzu_binding.cpp + src_cpp/cached_import/py_cached_item.cpp + src_cpp/cached_import/py_cached_import.cpp src_cpp/py_connection.cpp src_cpp/py_database.cpp src_cpp/py_prepared_statement.cpp diff --git a/tools/python_api/src_cpp/cached_import/py_cached_import.cpp b/tools/python_api/src_cpp/cached_import/py_cached_import.cpp new file mode 100644 index 00000000000..e0317ab9fda --- /dev/null +++ b/tools/python_api/src_cpp/cached_import/py_cached_import.cpp @@ -0,0 +1,18 @@ +#include "cached_import/py_cached_import.h" + +namespace kuzu { + +PythonCachedImport::~PythonCachedImport() { + py::gil_scoped_acquire acquire; + allObjects.clear(); +} + +py::handle PythonCachedImport::addToCache(py::object obj) { + auto ptr = obj.ptr(); + allObjects.push_back(obj); + return ptr; +} + +std::shared_ptr importCache; + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/cached_import/py_cached_item.cpp b/tools/python_api/src_cpp/cached_import/py_cached_item.cpp new file mode 100644 index 00000000000..ebbc1ecb392 --- /dev/null +++ b/tools/python_api/src_cpp/cached_import/py_cached_item.cpp @@ -0,0 +1,24 @@ +#include "cached_import/py_cached_item.h" + + +#include "cached_import/py_cached_import.h" +#include "common/exception/runtime.h" + +namespace kuzu { + +py::handle PythonCachedItem::operator()() { + assert((bool)PyGILState_Check()); + // load if unloaded, return cached object if already loaded + if (loaded) { + return object; + } + if (parent == nullptr) { + object = importCache->addToCache(std::move(py::module::import(name.c_str()))); + } else { + object = importCache->addToCache(std::move((*parent)().attr(name.c_str()))); + } + loaded = true; + return object; +} + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/include/cached_import/py_cached_import.h b/tools/python_api/src_cpp/include/cached_import/py_cached_import.h new file mode 100644 index 00000000000..cd093224e65 --- /dev/null +++ b/tools/python_api/src_cpp/include/cached_import/py_cached_import.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include "py_cached_modules.h" + +namespace kuzu { + +class PythonCachedImport { +public: + // Note: Callers generally acquire the GIL prior to entering functions + // that require the import cache. + + PythonCachedImport() = default; + ~PythonCachedImport(); + + py::handle addToCache(py::object obj); + + DateTimeCachedItem datetime; + DecimalCachedItem decimal; + InspectCachedItem inspect; + NumpyMaCachedItem numpyma; + PandasCachedItem pandas; + PyarrowCachedItem pyarrow; + UUIDCachedItem uuid; + +private: + std::vector allObjects; +}; + +extern std::shared_ptr importCache; + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/include/cached_import/py_cached_item.h b/tools/python_api/src_cpp/include/cached_import/py_cached_item.h new file mode 100644 index 00000000000..159220e79bb --- /dev/null +++ b/tools/python_api/src_cpp/include/cached_import/py_cached_item.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "pybind_include.h" + +namespace kuzu { + +class PythonCachedItem { +public: + explicit PythonCachedItem(const std::string& name, PythonCachedItem* parent = nullptr) + : name(name), parent(parent), loaded(false) {} + virtual ~PythonCachedItem() = default; + + bool isLoaded() const {return loaded;} + py::handle operator()(); + +private: + std::string name; + PythonCachedItem* parent; + bool loaded; + py::handle object; +}; + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h b/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h new file mode 100644 index 00000000000..6bc374df4c4 --- /dev/null +++ b/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h @@ -0,0 +1,128 @@ +#pragma once + +#include "py_cached_item.h" + +namespace kuzu { + +class DateTimeCachedItem : public PythonCachedItem { + +public: + DateTimeCachedItem() : PythonCachedItem("datetime"), date("date", this), + datetime("datetime", this), timedelta("timedelta", this) {} + + PythonCachedItem date; + PythonCachedItem datetime; + PythonCachedItem timedelta; +}; + +class DecimalCachedItem : public PythonCachedItem { + +public: + DecimalCachedItem() : PythonCachedItem("decimal"), Decimal("Decimal", this) {} + + PythonCachedItem Decimal; +}; + +class InspectCachedItem : public PythonCachedItem { + +public: + InspectCachedItem() : PythonCachedItem("inspect"), currentframe("currentframe", this) {} + + PythonCachedItem currentframe; +}; + +class NumpyMaCachedItem : public PythonCachedItem { + +public: + NumpyMaCachedItem() : PythonCachedItem("numpy.ma"), masked_array("masked_array", this) {} + + PythonCachedItem masked_array; +}; + +class PandasCachedItem : public PythonCachedItem { + + class SeriesCachedItem : public PythonCachedItem { + public: + explicit SeriesCachedItem(PythonCachedItem* parent): PythonCachedItem("series", parent), + Series("Series", this) {} + + PythonCachedItem Series; + }; + + class CoreCachedItem : public PythonCachedItem { + public: + explicit CoreCachedItem(PythonCachedItem* parent): PythonCachedItem("core", parent), + series(this) {} + + SeriesCachedItem series; + }; + + class DataFrameCachedItem : public PythonCachedItem { + public: + explicit DataFrameCachedItem(PythonCachedItem* parent): PythonCachedItem("DataFrame", parent), + from_dict("from_dict", this) {} + + PythonCachedItem from_dict; + }; + +public: + PandasCachedItem() : PythonCachedItem("pandas"), core(this), DataFrame(this), NA("NA", this), + NaT("NaT", this) {} + + CoreCachedItem core; + DataFrameCachedItem DataFrame; + PythonCachedItem NA; + PythonCachedItem NaT; +}; + +class PyarrowCachedItem : public PythonCachedItem { + + class RecordBatchCachedItem : public PythonCachedItem { + public: + explicit RecordBatchCachedItem(PythonCachedItem* parent): PythonCachedItem("RecordBatch", parent), + _import_from_c("_import_from_c", this) {} + + PythonCachedItem _import_from_c; + }; + + class SchemaCachedItem : public PythonCachedItem { + public: + explicit SchemaCachedItem(PythonCachedItem* parent): PythonCachedItem("Schema", parent), + _import_from_c("_import_from_c", this) {} + + PythonCachedItem _import_from_c; + }; + + class TableCachedItem : public PythonCachedItem { + public: + explicit TableCachedItem(PythonCachedItem* parent): PythonCachedItem("Table", parent), + from_batches("from_batches", this) {} + + PythonCachedItem from_batches; + }; + + class LibCachedItem : public PythonCachedItem { + public: + explicit LibCachedItem(PythonCachedItem* parent): PythonCachedItem("lib", parent), + RecordBatch(this), Schema(this), Table(this) {} + + RecordBatchCachedItem RecordBatch; + SchemaCachedItem Schema; + TableCachedItem Table; + }; + +public: + PyarrowCachedItem(): PythonCachedItem("pyarrow"), lib(this) {} + + LibCachedItem lib; +}; + +class UUIDCachedItem : public PythonCachedItem { + +public: + UUIDCachedItem() : PythonCachedItem("uuid"), UUID("UUID", this) {} + + PythonCachedItem UUID; +}; + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/include/py_database.h b/tools/python_api/src_cpp/include/py_database.h index cc5425f0f16..0cc9265e9c5 100644 --- a/tools/python_api/src_cpp/include/py_database.h +++ b/tools/python_api/src_cpp/include/py_database.h @@ -24,7 +24,7 @@ class PyDatabase { explicit PyDatabase(const std::string& databasePath, uint64_t bufferPoolSize, uint64_t maxNumThreads, bool compression, bool readOnly, uint64_t maxDBSize); - ~PyDatabase() = default; + ~PyDatabase(); template void scanNodeTable(const std::string& tableName, const std::string& propName, diff --git a/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp b/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp index 5fd2af3d43f..354aa9a55b3 100644 --- a/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp @@ -1,6 +1,7 @@ #include "pandas/pandas_analyzer.h" #include "function/built_in_function_utils.h" +#include "cached_import/py_cached_import.h" #include "py_conversion.h" namespace kuzu { @@ -37,7 +38,7 @@ common::LogicalType PandasAnalyzer::getListType(py::object& ele, bool& canConver for (auto pyVal : ele) { auto object = py::reinterpret_borrow(pyVal); auto itemType = getItemType(object, canConvert); - if (i != 0) { + if (i == 0) { listType = itemType; } else { if (!upgradeType(listType, itemType)) { @@ -88,8 +89,8 @@ static py::object findFirstNonNull(const py::handle& row, uint64_t numRows) { common::LogicalType PandasAnalyzer::innerAnalyze(py::object column, bool& canConvert) { auto numRows = py::len(column); - auto pandasModule = py::module::import("pandas"); - auto pandasSeries = pandasModule.attr("core").attr("series").attr("Series"); + auto pandasModule = importCache->pandas; + auto pandasSeries = pandasModule.core.series.Series(); if (py::isinstance(column, pandasSeries)) { column = column.attr("__array__")(); diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index a8027245bc5..f9473a2a9fa 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -1,6 +1,7 @@ #include "pandas/pandas_scan.h" #include "function/table/bind_input.h" +#include "cached_import/py_cached_import.h" #include "numpy/numpy_scan.h" #include "py_connection.h" #include "pybind11/pytypes.h" @@ -127,10 +128,9 @@ std::unique_ptr tryReplacePD(py::dict& dict, py::str& tableName) { } std::unique_ptr replacePD(common::Value* value) { - py::gil_scoped_acquire acquire; auto pyTableName = py::str(value->getValue()); // Here we do an exhaustive search on the frame lineage. - auto currentFrame = py::module::import("inspect").attr("currentframe")(); + auto currentFrame = importCache->inspect.currentframe()(); while (hasattr(currentFrame, "f_locals")) { auto localDict = py::reinterpret_borrow(currentFrame.attr("f_locals")); if (localDict) { diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 8ddef71b33f..6517cd09533 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -4,12 +4,14 @@ #include "common/string_format.h" #include "datetime.h" // from Python +#include "cached_import/py_cached_import.h" #include "main/connection.h" #include "pandas/pandas_scan.h" #include "processor/result/factorized_table.h" #include "common/types/uuid.h" using namespace kuzu::common; +using namespace kuzu; void PyConnection::initialize(py::handle& m) { py::class_(m, "Connection") @@ -151,9 +153,7 @@ void PyConnection::getAllEdgesForTorchGeometric(py::array_t& npArray, } bool PyConnection::isPandasDataframe(const py::object& object) { - // TODO(Ziyi): introduce PythonCachedImport to avoid unnecessary import. - py::module pandas = py::module::import("pandas"); - return py::isinstance(object, pandas.attr("DataFrame")); + return py::isinstance(object, importCache->pandas.DataFrame()); } static Value transformPythonValue(py::handle val); @@ -176,11 +176,10 @@ std::unordered_map> transformPythonParameter } Value transformPythonValue(py::handle val) { - auto datetime_mod = py::module::import("datetime"); - auto datetime_datetime = datetime_mod.attr("datetime"); - auto time_delta = datetime_mod.attr("timedelta"); - auto datetime_date = datetime_mod.attr("date"); - auto uuid = py::module::import("uuid").attr("UUID"); + auto datetime_datetime = importCache->datetime.datetime(); + auto time_delta = importCache->datetime.timedelta(); + auto datetime_date = importCache->datetime.date(); + auto uuid = importCache->uuid.UUID(); if (py::isinstance(val)) { return Value::createValue(val.cast()); } else if (py::isinstance(val)) { diff --git a/tools/python_api/src_cpp/py_conversion.cpp b/tools/python_api/src_cpp/py_conversion.cpp index d194a4b86cf..bad439c29d0 100644 --- a/tools/python_api/src_cpp/py_conversion.cpp +++ b/tools/python_api/src_cpp/py_conversion.cpp @@ -1,18 +1,18 @@ #include "py_conversion.h" #include "common/type_utils.h" +#include "cached_import/py_cached_import.h" namespace kuzu { using namespace kuzu::common; +using kuzu::importCache; PythonObjectType getPythonObjectType(py::handle& ele) { - py::object pandas = py::module::import("pandas"); - auto pandasNa = pandas.attr("NA"); - auto pandasNat = pandas.attr("NaT"); - py::object datetime = py::module::import("datetime"); - auto pyDateTime = datetime.attr("datetime"); - auto pyDate = datetime.attr("date"); + auto pandasNa = importCache->pandas.NA(); + auto pyDateTime = importCache->datetime.datetime(); + auto pandasNat = importCache->pandas.NaT(); + auto pyDate = importCache->datetime.date(); if (ele.is_none() || ele.is(pandasNa) || ele.is(pandasNat)) { return PythonObjectType::None; } else if (py::isinstance(ele)) { diff --git a/tools/python_api/src_cpp/py_database.cpp b/tools/python_api/src_cpp/py_database.cpp index fa02ef713af..b2ed26c506f 100644 --- a/tools/python_api/src_cpp/py_database.cpp +++ b/tools/python_api/src_cpp/py_database.cpp @@ -1,5 +1,8 @@ #include "include/py_database.h" +#include "include/cached_import/py_cached_import.h" +#include "pandas/pandas_scan.h" + #include #include "main/version.h" diff --git a/tools/python_api/src_cpp/py_query_result.cpp b/tools/python_api/src_cpp/py_query_result.cpp index a0c1edf388a..cfa88c6f544 100644 --- a/tools/python_api/src_cpp/py_query_result.cpp +++ b/tools/python_api/src_cpp/py_query_result.cpp @@ -9,9 +9,11 @@ #include "common/types/value/node.h" #include "common/types/value/rel.h" #include "datetime.h" // python lib +#include "cached_import/py_cached_import.h" #include "include/py_query_result_converter.h" using namespace kuzu::common; +using kuzu::importCache; #define PyDateTimeTZ_FromDateAndTime(year, month, day, hour, min, sec, usec, timezone) \ PyDateTimeAPI->DateTime_FromDateAndTime( \ @@ -125,8 +127,7 @@ py::object convertRdfVariantToPyObject(const Value& value) { case LogicalTypeID::INTERVAL: { auto intervalVal = RdfVariant::getValue(&value); auto days = Interval::DAYS_PER_MONTH * intervalVal.months + intervalVal.days; - return py::cast(py::module::import("datetime") - .attr("timedelta")(py::arg("days") = days, + return py::cast(importCache->datetime.timedelta()(py::arg("days") = days, py::arg("microseconds") = intervalVal.micros)); } default: { @@ -172,7 +173,8 @@ py::object PyQueryResult::convertValueToPyObject(const Value& value) { case LogicalTypeID::INT128: { kuzu::common::int128_t result = value.getValue(); std::string int128_string = kuzu::common::Int128_t::ToString(result); - py::object Decimal = py::module_::import("decimal").attr("Decimal"); + + auto Decimal = importCache->decimal.Decimal(); py::object largeInt = Decimal(int128_string); return largeInt; } @@ -193,7 +195,7 @@ py::object PyQueryResult::convertValueToPyObject(const Value& value) { case LogicalTypeID::UUID: { kuzu::common::int128_t result = value.getValue(); std::string uuidString = kuzu::common::UUID::toString(result); - py::object UUID = py::module_::import("uuid").attr("UUID"); + auto UUID = importCache->uuid.UUID(); return UUID(uuidString); } case LogicalTypeID::DATE: { @@ -236,8 +238,8 @@ py::object PyQueryResult::convertValueToPyObject(const Value& value) { case LogicalTypeID::INTERVAL: { auto intervalVal = value.getValue(); auto days = Interval::DAYS_PER_MONTH * intervalVal.months + intervalVal.days; - return py::cast(py::module::import("datetime") - .attr("timedelta")(py::arg("days") = days, + + return py::cast(importCache->datetime.timedelta()(py::arg("days") = days, py::arg("microseconds") = intervalVal.micros)); } case LogicalTypeID::VAR_LIST: @@ -331,9 +333,9 @@ bool PyQueryResult::getNextArrowChunk(const std::vectorpyarrow.lib.RecordBatch._import_from_c(); + auto schema = ArrowConverter::toArrowSchema(typesInfo); batches.append(batchImportFunc((std::uint64_t)&data, (std::uint64_t)schema.get())); return true; @@ -341,22 +343,19 @@ bool PyQueryResult::getNextArrowChunk(const std::vector>& typesInfo, std::int64_t chunkSize) { - auto pyarrowLibModule = py::module::import("pyarrow").attr("lib"); py::list batches; while (getNextArrowChunk(typesInfo, batches, chunkSize)) {} return batches; } kuzu::pyarrow::Table PyQueryResult::getAsArrow(std::int64_t chunkSize) { - py::gil_scoped_acquire acquire; - - auto pyarrowLibModule = py::module::import("pyarrow").attr("lib"); - auto fromBatchesFunc = pyarrowLibModule.attr("Table").attr("from_batches"); - auto schemaImportFunc = pyarrowLibModule.attr("Schema").attr("_import_from_c"); auto typesInfo = queryResult->getColumnTypesInfo(); py::list batches = getArrowChunks(typesInfo, chunkSize); auto schema = ArrowConverter::toArrowSchema(typesInfo); + + auto fromBatchesFunc = importCache->pyarrow.lib.Table.from_batches(); + auto schemaImportFunc = importCache->pyarrow.lib.Schema._import_from_c(); auto schemaObj = schemaImportFunc((std::uint64_t)schema.get()); return py::cast(fromBatchesFunc(batches, schemaObj)); } diff --git a/tools/python_api/src_cpp/py_query_result_converter.cpp b/tools/python_api/src_cpp/py_query_result_converter.cpp index 7b2a4e5bca1..d7e996b50db 100644 --- a/tools/python_api/src_cpp/py_query_result_converter.cpp +++ b/tools/python_api/src_cpp/py_query_result_converter.cpp @@ -1,9 +1,11 @@ #include "include/py_query_result_converter.h" #include "common/types/value/value.h" +#include "cached_import/py_cached_import.h" #include "include/py_query_result.h" using namespace kuzu::common; +using namespace kuzu; NPArrayWrapper::NPArrayWrapper(const LogicalType& type, uint64_t numFlatTuple) : type{type}, numElements{0} { @@ -205,9 +207,12 @@ py::object QueryResultConverter::toDF() { py::dict result; auto colNames = queryResult->getColumnNames(); + auto maskedArray = importCache->numpyma.masked_array(); + auto fromDict = importCache->pandas.DataFrame.from_dict(); + for (auto i = 0u; i < colNames.size(); i++) { result[colNames[i].c_str()] = - py::module::import("numpy.ma").attr("masked_array")(columns[i]->data, columns[i]->mask); + maskedArray(columns[i]->data, columns[i]->mask); } - return py::module::import("pandas").attr("DataFrame").attr("from_dict")(result); + return fromDict(result); } From 7c25a3bbc6c4f1002d848dac2c57272bc3f2f2c0 Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Thu, 7 Mar 2024 17:57:41 -0500 Subject: [PATCH 017/136] Rewrite the Hash Index overflow file to support multiple copies and full parallelism --- src/include/storage/index/hash_index.h | 13 +- .../storage/index/hash_index_builder.h | 8 +- .../storage_structure/disk_overflow_file.h | 83 ------ .../storage/storage_structure/in_mem_file.h | 55 ---- .../storage/storage_structure/overflow_file.h | 149 +++++++++++ src/include/storage/wal/wal_record.h | 20 -- src/include/storage/wal_replayer.h | 1 - src/storage/index/hash_index.cpp | 36 +-- src/storage/index/hash_index_builder.cpp | 35 ++- src/storage/storage_structure/CMakeLists.txt | 3 +- .../storage_structure/disk_overflow_file.cpp | 126 --------- src/storage/storage_structure/in_mem_file.cpp | 128 ---------- .../storage_structure/overflow_file.cpp | 240 ++++++++++++++++++ src/storage/wal/wal.cpp | 7 - src/storage/wal/wal_record.cpp | 15 -- src/storage/wal_replayer.cpp | 34 +-- 16 files changed, 439 insertions(+), 514 deletions(-) delete mode 100644 src/include/storage/storage_structure/disk_overflow_file.h delete mode 100644 src/include/storage/storage_structure/in_mem_file.h create mode 100644 src/include/storage/storage_structure/overflow_file.h delete mode 100644 src/storage/storage_structure/disk_overflow_file.cpp delete mode 100644 src/storage/storage_structure/in_mem_file.cpp create mode 100644 src/storage/storage_structure/overflow_file.cpp diff --git a/src/include/storage/index/hash_index.h b/src/include/storage/index/hash_index.h index 79b7f6366b4..a06f2ce8eae 100644 --- a/src/include/storage/index/hash_index.h +++ b/src/include/storage/index/hash_index.h @@ -7,7 +7,7 @@ #include "hash_index_slot.h" #include "storage/index/hash_index_utils.h" #include "storage/storage_structure/disk_array.h" -#include "storage/storage_structure/disk_overflow_file.h" +#include "storage/storage_structure/overflow_file.h" #include "transaction/transaction.h" namespace kuzu { @@ -51,9 +51,8 @@ class HashIndex final : public OnDiskHashIndex { public: HashIndex(const DBFileIDAndName& dbFileIDAndName, - const std::shared_ptr& fileHandle, - const std::shared_ptr& overflowFile, uint64_t indexPos, - BufferManager& bufferManager, WAL* wal); + const std::shared_ptr& fileHandle, OverflowFileHandle* overflowFileHandle, + uint64_t indexPos, BufferManager& bufferManager, WAL* wal); ~HashIndex() override; @@ -181,7 +180,7 @@ class HashIndex final : public OnDiskHashIndex { std::unique_ptr> headerArray; std::unique_ptr>> pSlots; std::unique_ptr>> oSlots; - std::shared_ptr diskOverflowFile; + OverflowFileHandle* overflowFileHandle; std::unique_ptr> localStorage; std::unique_ptr indexHeaderForReadTrx; std::unique_ptr indexHeaderForWriteTrx; @@ -262,12 +261,12 @@ class PrimaryKeyIndex { void prepareCommit(); void prepareRollback(); BMFileHandle* getFileHandle() { return fileHandle.get(); } - DiskOverflowFile* getDiskOverflowFile() { return overflowFile.get(); } + OverflowFile* getOverflowFile() { return overflowFile.get(); } private: common::PhysicalTypeID keyDataTypeID; std::shared_ptr fileHandle; - std::shared_ptr overflowFile; + std::unique_ptr overflowFile; std::vector> hashIndices; }; diff --git a/src/include/storage/index/hash_index_builder.h b/src/include/storage/index/hash_index_builder.h index aaf2e81bc48..fcd6d1e6d9a 100644 --- a/src/include/storage/index/hash_index_builder.h +++ b/src/include/storage/index/hash_index_builder.h @@ -6,7 +6,7 @@ #include "storage/index/hash_index_slot.h" #include "storage/index/hash_index_utils.h" #include "storage/storage_structure/disk_array.h" -#include "storage/storage_structure/in_mem_file.h" +#include "storage/storage_structure/overflow_file.h" namespace kuzu { namespace storage { @@ -55,7 +55,7 @@ class HashIndexBuilder final : public InMemHashIndex { public: HashIndexBuilder(const std::shared_ptr& handle, - std::unique_ptr overflowFile, uint64_t indexPos, + OverflowFileHandle* overflowFileHandle, uint64_t indexPos, common::PhysicalTypeID keyDataType); public: @@ -116,7 +116,7 @@ class HashIndexBuilder final : public InMemHashIndex { private: std::shared_ptr fileHandle; - std::unique_ptr inMemOverflowFile; + OverflowFileHandle* overflowFileHandle; std::unique_ptr> headerArray; std::unique_ptr>> pSlots; std::unique_ptr>> oSlots; @@ -181,7 +181,7 @@ class PrimaryKeyIndexBuilder { private: common::PhysicalTypeID keyDataTypeID; - std::atomic overflowPageCounter; + std::unique_ptr overflowFile; std::vector> hashIndexBuilders; }; diff --git a/src/include/storage/storage_structure/disk_overflow_file.h b/src/include/storage/storage_structure/disk_overflow_file.h deleted file mode 100644 index 39e1be23de2..00000000000 --- a/src/include/storage/storage_structure/disk_overflow_file.h +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once - -#include - -#include "common/constants.h" -#include "common/types/types.h" -#include "storage/buffer_manager/buffer_manager.h" -#include "storage/storage_utils.h" -#include "storage/wal/wal.h" -#include "transaction/transaction.h" - -namespace kuzu { -namespace storage { - -class DiskOverflowFile { - -public: - DiskOverflowFile(const DBFileIDAndName& dbFileIdAndName, BufferManager* bufferManager, WAL* wal, - bool readOnly, common::VirtualFileSystem* vfs) - : bufferManager{bufferManager}, wal{wal}, loggedNewOverflowFileNextBytePosRecord{false} { - auto overflowFileIDAndName = constructDBFileIDAndName(dbFileIdAndName); - dbFileID = overflowFileIDAndName.dbFileID; - fileHandle = bufferManager->getBMFileHandle(overflowFileIDAndName.fName, - readOnly ? FileHandle::O_PERSISTENT_FILE_READ_ONLY : - FileHandle::O_PERSISTENT_FILE_NO_CREATE, - BMFileHandle::FileVersionedType::VERSIONED_FILE, vfs); - nextPosToWriteTo.elemPosInPage = 0; - nextPosToWriteTo.pageIdx = fileHandle->getNumPages(); - } - - std::string readString(transaction::TransactionType trxType, const common::ku_string_t& str); - - common::ku_string_t writeString(std::string_view rawString); - inline common::ku_string_t writeString(const char* rawString) { - return writeString(std::string_view(rawString)); - } - - inline BMFileHandle* getFileHandle() { return fileHandle.get(); } - inline void resetNextBytePosToWriteTo(uint64_t nextBytePosToWriteTo_) { - nextPosToWriteTo.elemPosInPage = - nextBytePosToWriteTo_ % common::BufferPoolConstants::PAGE_4KB_SIZE; - nextPosToWriteTo.pageIdx = - nextBytePosToWriteTo_ / common::BufferPoolConstants::PAGE_4KB_SIZE; - } - void resetLoggedNewOverflowFileNextBytePosRecord() { - loggedNewOverflowFileNextBytePosRecord = false; - } - -private: - static inline DBFileIDAndName constructDBFileIDAndName( - const DBFileIDAndName& dbFileIdAndNameForMainDBFile) { - DBFileIDAndName copy = dbFileIdAndNameForMainDBFile; - copy.dbFileID.isOverflow = true; - copy.fName = StorageUtils::getOverflowFileName(dbFileIdAndNameForMainDBFile.fName); - return copy; - } - -private: - bool addNewPageIfNecessaryWithoutLock(uint32_t numBytesToAppend); - void setStringOverflowWithoutLock( - const char* inMemSrcStr, uint64_t len, common::ku_string_t& diskDstString); - void logNewOverflowFileNextBytePosRecordIfNecessaryWithoutLock(); - -private: - static const common::page_idx_t END_OF_PAGE = - common::BufferPoolConstants::PAGE_4KB_SIZE - sizeof(common::page_idx_t); - DBFileID dbFileID; - std::unique_ptr fileHandle; - BufferManager* bufferManager; - WAL* wal; - // This is the index of the last free byte to which we can write. - PageCursor nextPosToWriteTo; - // Mtx is obtained if multiple threads want to write to the overflows to coordinate them. - // We cannot directly coordinate using the locks of the pages in the overflow fileHandle. - // This is because multiple threads will be trying to edit the nextBytePosToWriteTo. - // For simplicity, currently only a single thread can update overflow pages at ant time. See the - // note in writeStringOverflowAndUpdateOverflowPtr for more details. - std::mutex mtx; - bool loggedNewOverflowFileNextBytePosRecord; -}; - -} // namespace storage -} // namespace kuzu diff --git a/src/include/storage/storage_structure/in_mem_file.h b/src/include/storage/storage_structure/in_mem_file.h deleted file mode 100644 index e6945c1bfc1..00000000000 --- a/src/include/storage/storage_structure/in_mem_file.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include - -#include "common/constants.h" -#include "common/types/ku_string.h" -#include "common/types/types.h" -#include "storage/storage_structure/in_mem_page.h" -#include "storage/storage_utils.h" - -namespace kuzu { -namespace common { -class VirtualFileSystem; -} - -namespace storage { - -// InMemFile holds a collection of in-memory page in the memory. -class InMemFile { -public: - explicit InMemFile( - std::shared_ptr fileInfo, std::atomic& pageCounter); - - void addANewPage(); - - inline InMemPage* getPage(common::page_idx_t pageIdx) const { return pages.at(pageIdx).get(); } - - // This function appends a string if the length of the string is larger than SHORT_STR_LENGTH, - // otherwise, construct the ku_string for the rawString and return it. - // Note that this function is not thread safe. - void appendString(std::string_view rawString, common::ku_string_t& result); - inline void appendString(const char* rawString, common::ku_string_t& result) { - appendString(std::string_view(rawString), result); - } - - std::string readString(common::ku_string_t* strInInMemOvfFile) const; - bool equals(std::string_view keyToLookup, const common::ku_string_t& keyInEntry) const; - - void flush(); - - inline common::page_idx_t getNextPageIndex(common::page_idx_t currentPageIndex) const { - return *(common::page_idx_t*)(getPage(currentPageIndex)->data + END_OF_PAGE); - } - -private: - static const uint64_t END_OF_PAGE = - common::BufferPoolConstants::PAGE_4KB_SIZE - sizeof(common::page_idx_t); - std::shared_ptr fileInfo; - std::unordered_map> pages; - PageCursor nextPosToAppend; - std::atomic& pageCounter; -}; - -} // namespace storage -} // namespace kuzu diff --git a/src/include/storage/storage_structure/overflow_file.h b/src/include/storage/storage_structure/overflow_file.h new file mode 100644 index 00000000000..78e803cc810 --- /dev/null +++ b/src/include/storage/storage_structure/overflow_file.h @@ -0,0 +1,149 @@ +#pragma once + +#include + +#include +#include +#include +#include + +#include "common/cast.h" +#include "common/constants.h" +#include "common/types/types.h" +#include "storage/buffer_manager/bm_file_handle.h" +#include "storage/buffer_manager/buffer_manager.h" +#include "storage/file_handle.h" +#include "storage/index/hash_index_utils.h" +#include "storage/storage_structure/in_mem_page.h" +#include "storage/storage_utils.h" +#include "storage/wal/wal.h" +#include "storage/wal/wal_record.h" +#include "transaction/transaction.h" + +namespace kuzu { +namespace storage { + +class OverflowFile; + +class OverflowFileHandle { + +public: + OverflowFileHandle(OverflowFile& overflowFile, PageCursor& nextPosToWriteTo) + : nextPosToWriteTo(nextPosToWriteTo), overflowFile{overflowFile} {} + // The OverflowFile stores the handles and returns pointers to them. + // Moving the handle would invalidate those pointers + OverflowFileHandle(OverflowFileHandle&& other) = delete; + + std::string readString(transaction::TransactionType trxType, const common::ku_string_t& str); + + bool equals(transaction::TransactionType trxType, std::string_view keyToLookup, + const common::ku_string_t& keyInEntry) const; + + common::ku_string_t writeString(std::string_view rawString); + inline common::ku_string_t writeString(const char* rawString) { + return writeString(std::string_view(rawString)); + } + + void prepareCommit(); + inline void checkpointInMemory() { pageWriteCache.clear(); } + inline void rollbackInMemory(PageCursor nextPosToWriteTo_) { + pageWriteCache.clear(); + this->nextPosToWriteTo = nextPosToWriteTo_; + } + +private: + uint8_t* addANewPage(); + void setStringOverflow( + const char* inMemSrcStr, uint64_t len, common::ku_string_t& diskDstString); + + inline void read(transaction::TransactionType trxType, common::page_idx_t pageIdx, + const std::function& func) const; + +private: + static const common::page_idx_t END_OF_PAGE = + common::BufferPoolConstants::PAGE_4KB_SIZE - sizeof(common::page_idx_t); + // This is the index of the last free byte to which we can write. + PageCursor& nextPosToWriteTo; + OverflowFile& overflowFile; + // Cached pages which have been written in the current transaction + std::unordered_map> pageWriteCache; +}; + +// Stores the current state of the overflow file +// The number of pages in use are stored here so that we can write new pages directly +// to the overflow file, and in the case of an interruption and rollback the header will +// still record the correct place in the file to allocate new pages +struct StringOverflowFileHeader { + common::page_idx_t pages; + PageCursor cursors[NUM_HASH_INDEXES]; + + // pages starts at one to reserve space for this header + StringOverflowFileHeader() : pages{1} { + std::fill(cursors, cursors + NUM_HASH_INDEXES, PageCursor()); + } +}; + +class OverflowFile { + friend class OverflowFileHandle; + +public: + // For reading an existing overflow file + OverflowFile(const DBFileIDAndName& dbFileIdAndName, BufferManager* bufferManager, WAL* wal, + bool readOnly, common::VirtualFileSystem* vfs); + + // For creating an overflow file from scratch + OverflowFile(const std::string& fName, common::VirtualFileSystem* vfs) + : numPagesOnDisk{0}, fileHandle{std::make_unique( + fName, FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs)}, + bufferManager{nullptr}, wal{nullptr}, pageCounter{0}, headerChanged{true} { + // Reserve a page for the header + getNewPageIdx(); + } + + // Handles contain a reference to the overflow file + OverflowFile(OverflowFile&& other) = delete; + + void rollbackInMemory(); + void prepareCommit(); + void checkpointInMemory(); + + inline OverflowFileHandle* addHandle() { + KU_ASSERT(handles.size() < NUM_HASH_INDEXES); + handles.emplace_back( + std::make_unique(*this, header.cursors[handles.size()])); + return handles.back().get(); + } + + inline BMFileHandle* getBMFileHandle() const { + return common::ku_dynamic_cast(fileHandle.get()); + } + +private: + void readFromDisk(transaction::TransactionType trxType, common::page_idx_t pageIdx, + const std::function& func) const; + + // Writes new pages directly to the file and existing pages to the WAL + void writePageToDisk(common::page_idx_t pageIdx, uint8_t* data) const; + + inline common::page_idx_t getNewPageIdx() { + // If this isn't the first call reserving the page header, then the header flag must be set + // prior to this + KU_ASSERT(pageCounter == HEADER_PAGE_IDX || headerChanged); + return pageCounter.fetch_add(1); + } + +private: + static const uint64_t HEADER_PAGE_IDX = 0; + + std::vector> handles; + StringOverflowFileHeader header; + common::page_idx_t numPagesOnDisk; + DBFileID dbFileID; + std::unique_ptr fileHandle; + BufferManager* bufferManager; + WAL* wal; + std::atomic pageCounter; + std::atomic headerChanged; +}; +} // namespace storage +} // namespace kuzu diff --git a/src/include/storage/wal/wal_record.h b/src/include/storage/wal/wal_record.h index ef11cd24310..018f55c9bf9 100644 --- a/src/include/storage/wal/wal_record.h +++ b/src/include/storage/wal/wal_record.h @@ -51,9 +51,6 @@ enum class WALRecordType : uint8_t { CREATE_TABLE_RECORD = 6, CREATE_REL_TABLE_GROUP_RECORD = 7, CREATE_RDF_GRAPH_RECORD = 8, - // Records the nextBytePosToWriteTo field's last value before the write trx started. This is - // used when rolling back to restore this value. - OVERFLOW_FILE_NEXT_BYTE_POS_RECORD = 17, COPY_TABLE_RECORD = 19, DROP_TABLE_RECORD = 20, DROP_PROPERTY_RECORD = 21, @@ -131,20 +128,6 @@ struct RdfGraphRecord { } }; -struct DiskOverflowFileNextBytePosRecord { - DBFileID dbFileID; - uint64_t prevNextBytePosToWriteTo; - - DiskOverflowFileNextBytePosRecord() = default; - - DiskOverflowFileNextBytePosRecord(DBFileID dbFileID, uint64_t prevNextByteToWriteTo) - : dbFileID{dbFileID}, prevNextBytePosToWriteTo{prevNextByteToWriteTo} {} - - inline bool operator==(const DiskOverflowFileNextBytePosRecord& rhs) const { - return dbFileID == rhs.dbFileID && prevNextBytePosToWriteTo == rhs.prevNextBytePosToWriteTo; - } -}; - struct CopyTableRecord { common::table_id_t tableID; @@ -213,7 +196,6 @@ struct WALRecord { CommitRecord commitRecord; CreateTableRecord createTableRecord; RdfGraphRecord rdfGraphRecord; - DiskOverflowFileNextBytePosRecord diskOverflowFileNextBytePosRecord; CopyTableRecord copyTableRecord; TableStatisticsRecord tableStatisticsRecord; DropTableRecord dropTableRecord; @@ -234,8 +216,6 @@ struct WALRecord { static WALRecord newRdfGraphRecord(common::table_id_t rdfGraphID, common::table_id_t resourceTableID, common::table_id_t literalTableID, common::table_id_t resourceTripleTableID, common::table_id_t literalTripleTableID); - static WALRecord newOverflowFileNextBytePosRecord( - DBFileID dbFileID, uint64_t prevNextByteToWriteTo_); static WALRecord newCopyTableRecord(common::table_id_t tableID); static WALRecord newDropTableRecord(common::table_id_t tableID); static WALRecord newDropPropertyRecord( diff --git a/src/include/storage/wal_replayer.h b/src/include/storage/wal_replayer.h index 6be113cb76e..2c7fb789982 100644 --- a/src/include/storage/wal_replayer.h +++ b/src/include/storage/wal_replayer.h @@ -33,7 +33,6 @@ class WALReplayer { void replayCatalogRecord(); void replayCreateTableRecord(const WALRecord& walRecord); void replayRdfGraphRecord(const WALRecord& walRecord); - void replayOverflowFileNextBytePosRecord(const WALRecord& walRecord); void replayCopyTableRecord(const WALRecord& walRecord); void replayDropTableRecord(const WALRecord& walRecord); void replayDropPropertyRecord(const WALRecord& walRecord); diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp index c905eda99fe..6e3911217e8 100644 --- a/src/storage/index/hash_index.cpp +++ b/src/storage/index/hash_index.cpp @@ -83,9 +83,6 @@ class HashIndexLocalStorage { } } -public: - std::shared_mutex localStorageSharedMutex; - private: // When the storage type is string, allow the key type to be string_view with a custom hash // function @@ -97,11 +94,10 @@ class HashIndexLocalStorage { template HashIndex::HashIndex(const DBFileIDAndName& dbFileIDAndName, - const std::shared_ptr& fileHandle, - const std::shared_ptr& overflowFile, uint64_t indexPos, - BufferManager& bufferManager, WAL* wal) + const std::shared_ptr& fileHandle, OverflowFileHandle* overflowFileHandle, + uint64_t indexPos, BufferManager& bufferManager, WAL* wal) : dbFileIDAndName{dbFileIDAndName}, bm{bufferManager}, wal{wal}, fileHandle(fileHandle), - diskOverflowFile(overflowFile) { + overflowFileHandle(overflowFileHandle) { headerArray = std::make_unique>(*fileHandle, dbFileIDAndName.dbFileID, NUM_HEADER_PAGES * indexPos + INDEX_HEADER_ARRAY_HEADER_PAGE_IDX, &bm, wal, Transaction::getDummyReadOnlyTrx().get()); @@ -235,7 +231,7 @@ template<> inline common::hash_t HashIndex::hashStored( transaction::TransactionType /*trxType*/, const ku_string_t& key) const { common::hash_t hash; - auto str = diskOverflowFile->readString(TransactionType::WRITE, key); + auto str = overflowFileHandle->readString(TransactionType::WRITE, key); function::Hash::operation(str, hash); return hash; } @@ -255,7 +251,6 @@ entry_pos_t HashIndex::findMatchedEntryInSlot( template void HashIndex::prepareCommit() { - std::unique_lock xlock{localStorage->localStorageSharedMutex}; if (localStorage->hasUpdates()) { wal->addToUpdatedTables(dbFileIDAndName.dbFileID.nodeIndexID.tableID); localStorage->applyLocalChanges( @@ -267,7 +262,6 @@ void HashIndex::prepareCommit() { template void HashIndex::prepareRollback() { - std::unique_lock xlock{localStorage->localStorageSharedMutex}; if (localStorage->hasUpdates()) { wal->addToUpdatedTables(dbFileIDAndName.dbFileID.nodeIndexID.tableID); } @@ -283,6 +277,9 @@ void HashIndex::checkpointInMemory() { pSlots->checkpointInMemoryIfNecessary(); oSlots->checkpointInMemoryIfNecessary(); localStorage->clear(); + if constexpr (std::same_as) { + overflowFileHandle->checkpointInMemory(); + } } template @@ -301,7 +298,7 @@ template<> inline bool HashIndex::equals(transaction::TransactionType trxType, std::string_view keyToLookup, const ku_string_t& keyInEntry) const { if (HashIndexUtils::areStringPrefixAndLenEqual(keyToLookup, keyInEntry)) { - auto entryKeyString = diskOverflowFile->readString(trxType, keyInEntry); + auto entryKeyString = overflowFileHandle->readString(trxType, keyInEntry); return memcmp(keyToLookup.data(), entryKeyString.c_str(), entryKeyString.length()) == 0; } return false; @@ -310,7 +307,7 @@ inline bool HashIndex::equals(transaction::Transa template<> inline void HashIndex::insert( std::string_view key, uint8_t* entry, common::offset_t offset) { - auto kuString = diskOverflowFile->writeString(key); + auto kuString = overflowFileHandle->writeString(key); memcpy(entry, &kuString, NUM_BYTES_FOR_STRING_KEY); memcpy(entry + NUM_BYTES_FOR_STRING_KEY, &offset, sizeof(common::offset_t)); } @@ -389,7 +386,7 @@ PrimaryKeyIndex::PrimaryKeyIndex(const DBFileIDAndName& dbFileIDAndName, bool re if (keyDataTypeID == PhysicalTypeID::STRING) { overflowFile = - std::make_shared(dbFileIDAndName, &bufferManager, wal, readOnly, vfs); + std::make_unique(dbFileIDAndName, &bufferManager, wal, readOnly, vfs); } hashIndices.reserve(NUM_HASH_INDEXES); @@ -397,12 +394,12 @@ PrimaryKeyIndex::PrimaryKeyIndex(const DBFileIDAndName& dbFileIDAndName, bool re if constexpr (std::is_same_v) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndices.push_back(std::make_unique>( - dbFileIDAndName, fileHandle, overflowFile, i, bufferManager, wal)); + dbFileIDAndName, fileHandle, overflowFile->addHandle(), i, bufferManager, wal)); } } else if constexpr (HashablePrimitive) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndices.push_back(std::make_unique>( - dbFileIDAndName, fileHandle, overflowFile, i, bufferManager, wal)); + dbFileIDAndName, fileHandle, nullptr, i, bufferManager, wal)); } } else { KU_UNREACHABLE; @@ -456,18 +453,27 @@ void PrimaryKeyIndex::checkpointInMemory() { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndices[i]->checkpointInMemory(); } + if (overflowFile) { + overflowFile->checkpointInMemory(); + } } void PrimaryKeyIndex::rollbackInMemory() { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndices[i]->rollbackInMemory(); } + if (overflowFile) { + overflowFile->rollbackInMemory(); + } } void PrimaryKeyIndex::prepareCommit() { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndices[i]->prepareCommit(); } + if (overflowFile) { + overflowFile->prepareCommit(); + } } void PrimaryKeyIndex::prepareRollback() { diff --git a/src/storage/index/hash_index_builder.cpp b/src/storage/index/hash_index_builder.cpp index 0584d005964..3499267eeed 100644 --- a/src/storage/index/hash_index_builder.cpp +++ b/src/storage/index/hash_index_builder.cpp @@ -9,7 +9,7 @@ #include "common/types/types.h" #include "storage/index/hash_index_slot.h" #include "storage/index/hash_index_utils.h" -#include "storage/storage_structure/in_mem_file.h" +#include "storage/storage_structure/overflow_file.h" using namespace kuzu::common; @@ -18,8 +18,8 @@ namespace storage { template HashIndexBuilder::HashIndexBuilder(const std::shared_ptr& fileHandle, - std::unique_ptr overflowFile, uint64_t indexPos, PhysicalTypeID keyDataType) - : fileHandle(fileHandle), inMemOverflowFile(std::move(overflowFile)) { + OverflowFileHandle* overflowFileHandle, uint64_t indexPos, PhysicalTypeID keyDataType) + : fileHandle(fileHandle), overflowFileHandle(overflowFileHandle) { this->indexHeader = std::make_unique(keyDataType); headerArray = std::make_unique>(*fileHandle, NUM_HEADER_PAGES * indexPos + INDEX_HEADER_ARRAY_HEADER_PAGE_IDX, 0 /* numElements */); @@ -195,9 +195,6 @@ void HashIndexBuilder::flush() { headerArray->saveToDisk(); pSlots->saveToDisk(); oSlots->saveToDisk(); - if constexpr (std::is_same_v) { - inMemOverflowFile->flush(); - } } template @@ -214,7 +211,7 @@ template<> void HashIndexBuilder::insert(std::string_view key, Slot* slot, uint8_t entryPos, offset_t offset, uint8_t fingerprint) { auto entry = slot->entries[entryPos].data; - inMemOverflowFile->appendString(key, *(ku_string_t*)entry); + *(ku_string_t*)entry = overflowFileHandle->writeString(key); memcpy(entry + NUM_BYTES_FOR_STRING_KEY, &offset, sizeof(common::offset_t)); slot->header.setEntryValid(entryPos, fingerprint); } @@ -228,7 +225,8 @@ template<> common::hash_t HashIndexBuilder::hashStored( const ku_string_t& key) const { auto kuString = key; - return HashIndexUtils::hash(inMemOverflowFile->readString(&kuString)); + return HashIndexUtils::hash( + overflowFileHandle->readString(transaction::TransactionType::WRITE, kuString)); } template<> @@ -247,7 +245,8 @@ bool HashIndexBuilder::equals( return memcmp(keyToLookup.data(), keyInEntry.prefix, keyInEntry.len) == 0; } else { // For long strings, compare with overflow data - return inMemOverflowFile->equals(keyToLookup, keyInEntry); + return overflowFileHandle->equals( + transaction::TransactionType::WRITE, keyToLookup, keyInEntry); } } @@ -266,7 +265,7 @@ template class HashIndexBuilder; PrimaryKeyIndexBuilder::PrimaryKeyIndexBuilder( const std::string& fName, PhysicalTypeID keyDataType, VirtualFileSystem* vfs) - : keyDataTypeID{keyDataType}, overflowPageCounter(0) { + : keyDataTypeID{keyDataType} { auto fileHandle = std::make_shared(fName, FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs); fileHandle->addNewPages(NUM_HEADER_PAGES * NUM_HASH_INDEXES); @@ -275,20 +274,17 @@ PrimaryKeyIndexBuilder::PrimaryKeyIndexBuilder( keyDataTypeID, [&](T) { if constexpr (std::is_same_v) { - auto overflowFileInfo = std::shared_ptr(vfs->openFile( - StorageUtils::getOverflowFileName(fileHandle->getFileInfo()->path), - O_CREAT | O_WRONLY)); + overflowFile = std::make_unique( + StorageUtils::getOverflowFileName(fileHandle->getFileInfo()->path), vfs); for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { - auto overflowFile = - std::make_unique(overflowFileInfo, overflowPageCounter); hashIndexBuilders.push_back( std::make_unique>( - fileHandle, std::move(overflowFile), i, keyDataType)); + fileHandle, overflowFile->addHandle(), i, keyDataType)); } } else if constexpr (HashablePrimitive) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { - hashIndexBuilders.push_back(std::make_unique>( - fileHandle, std::unique_ptr(), i, keyDataType)); + hashIndexBuilders.push_back( + std::make_unique>(fileHandle, nullptr, i, keyDataType)); } } else { KU_UNREACHABLE; @@ -305,6 +301,9 @@ void PrimaryKeyIndexBuilder::bulkReserve(uint32_t numEntries) { } void PrimaryKeyIndexBuilder::flush() { + if (overflowFile) { + overflowFile->prepareCommit(); + } for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndexBuilders[i]->flush(); } diff --git a/src/storage/storage_structure/CMakeLists.txt b/src/storage/storage_structure/CMakeLists.txt index 5b86666bedc..479d01c47f0 100644 --- a/src/storage/storage_structure/CMakeLists.txt +++ b/src/storage/storage_structure/CMakeLists.txt @@ -1,8 +1,7 @@ add_library(kuzu_storage_structure OBJECT disk_array.cpp - disk_overflow_file.cpp - in_mem_file.cpp + overflow_file.cpp in_mem_page.cpp db_file_utils.cpp) diff --git a/src/storage/storage_structure/disk_overflow_file.cpp b/src/storage/storage_structure/disk_overflow_file.cpp deleted file mode 100644 index 37a0091a1cb..00000000000 --- a/src/storage/storage_structure/disk_overflow_file.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "storage/storage_structure/disk_overflow_file.h" - -#include - -#include "common/constants.h" -#include "common/exception/message.h" -#include "common/type_utils.h" -#include "common/types/types.h" -#include "storage/storage_structure/db_file_utils.h" -#include "storage/storage_utils.h" - -using lock_t = std::unique_lock; - -using namespace kuzu::transaction; -using namespace kuzu::common; - -namespace kuzu { -namespace storage { - -std::string DiskOverflowFile::readString(TransactionType trxType, const ku_string_t& str) { - if (ku_string_t::isShortString(str.len)) { - return str.getAsShortString(); - } else { - PageCursor cursor; - TypeUtils::decodeOverflowPtr(str.overflowPtr, cursor.pageIdx, cursor.elemPosInPage); - std::string retVal; - retVal.reserve(str.len); - int32_t remainingLength = str.len; - while (remainingLength > 0) { - auto [fileHandleToPin, pageIdxToPin] = - DBFileUtils::getFileHandleAndPhysicalPageIdxToPin( - *fileHandle, cursor.pageIdx, *wal, trxType); - auto numBytesToReadInPage = std::min( - static_cast(remainingLength), END_OF_PAGE - cursor.elemPosInPage); - page_idx_t nextPage; - auto startPosInSrc = retVal.size(); - bufferManager->optimisticRead(*fileHandleToPin, pageIdxToPin, [&](uint8_t* frame) { - // Replace rather than append, since optimistic read may call the function multiple - // times - retVal.replace(startPosInSrc, numBytesToReadInPage, - std::string_view(reinterpret_cast(frame) + cursor.elemPosInPage, - numBytesToReadInPage)); - nextPage = *(page_idx_t*)(frame + END_OF_PAGE); - }); - remainingLength -= numBytesToReadInPage; - // After the first page we always start reading from the beginning of the page. - cursor.elemPosInPage = 0; - KU_ASSERT(nextPage < fileHandle->getNumPages()); - cursor.pageIdx = nextPage; - } - return retVal; - } -} - -bool DiskOverflowFile::addNewPageIfNecessaryWithoutLock(uint32_t numBytesToAppend) { - if ((nextPosToWriteTo.elemPosInPage == 0) || - ((nextPosToWriteTo.elemPosInPage + numBytesToAppend - 1) > END_OF_PAGE)) { - page_idx_t newPageIdx = - DBFileUtils::insertNewPage(*fileHandle, dbFileID, *bufferManager, *wal); - // Write new page index to end of previous page - if (nextPosToWriteTo.pageIdx > 0) { - DBFileUtils::updatePage(*fileHandle, dbFileID, nextPosToWriteTo.pageIdx - 1, - false /* existing page */, *bufferManager, *wal, - [&](auto frame) { memcpy(frame + END_OF_PAGE, &newPageIdx, sizeof(page_idx_t)); }); - } - return true; - } - return false; -} - -void DiskOverflowFile::setStringOverflowWithoutLock( - const char* srcRawString, uint64_t len, ku_string_t& diskDstString) { - if (len <= ku_string_t::SHORT_STR_LENGTH) { - return; - } else if (len > BufferPoolConstants::PAGE_256KB_SIZE) { - if constexpr (StorageConstants::TRUNCATE_OVER_LARGE_STRINGS) { - len = BufferPoolConstants::PAGE_256KB_SIZE; - diskDstString.len = len; - } else { - throw RuntimeException(ExceptionMessage::overLargeStringPKValueException(len)); - } - } - int32_t remainingLength = len; - TypeUtils::encodeOverflowPtr( - diskDstString.overflowPtr, nextPosToWriteTo.pageIdx, nextPosToWriteTo.elemPosInPage); - while (remainingLength > 0) { - auto bytesWritten = len - remainingLength; - auto numBytesToWriteInPage = std::min( - static_cast(remainingLength), END_OF_PAGE - nextPosToWriteTo.elemPosInPage); - bool insertingNewPage = addNewPageIfNecessaryWithoutLock(remainingLength); - DBFileUtils::updatePage(*fileHandle, dbFileID, nextPosToWriteTo.pageIdx, insertingNewPage, - *bufferManager, *wal, [&](auto frame) { - memcpy(frame + nextPosToWriteTo.elemPosInPage, srcRawString + bytesWritten, - numBytesToWriteInPage); - }); - remainingLength -= numBytesToWriteInPage; - nextPosToWriteTo.elemPosInPage += numBytesToWriteInPage; - if (nextPosToWriteTo.elemPosInPage >= END_OF_PAGE) { - nextPosToWriteTo.nextPage(); - } - } -} - -ku_string_t DiskOverflowFile::writeString(std::string_view rawString) { - lock_t lck{mtx}; - ku_string_t result; - result.len = rawString.length(); - auto shortStrLen = ku_string_t::SHORT_STR_LENGTH; - auto inlineLen = std::min(shortStrLen, (uint64_t)result.len); - memcpy(result.prefix, rawString.data(), inlineLen); - logNewOverflowFileNextBytePosRecordIfNecessaryWithoutLock(); - setStringOverflowWithoutLock(rawString.data(), result.len, result); - return result; -} - -void DiskOverflowFile::logNewOverflowFileNextBytePosRecordIfNecessaryWithoutLock() { - if (!loggedNewOverflowFileNextBytePosRecord) { - loggedNewOverflowFileNextBytePosRecord = true; - wal->logOverflowFileNextBytePosRecord( - dbFileID, nextPosToWriteTo.pageIdx * BufferPoolConstants::PAGE_4KB_SIZE + - nextPosToWriteTo.elemPosInPage); - } -} - -} // namespace storage -} // namespace kuzu diff --git a/src/storage/storage_structure/in_mem_file.cpp b/src/storage/storage_structure/in_mem_file.cpp deleted file mode 100644 index 9d4c1d21075..00000000000 --- a/src/storage/storage_structure/in_mem_file.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include "storage/storage_structure/in_mem_file.h" - -#include "common/constants.h" -#include "common/exception/copy.h" -#include "common/exception/message.h" -#include "common/type_utils.h" -#include "common/types/ku_string.h" -#include "common/types/types.h" - -using namespace kuzu::common; - -namespace kuzu { -namespace storage { - -InMemFile::InMemFile(std::shared_ptr fileInfo, std::atomic& pageCounter) - : fileInfo{fileInfo}, nextPosToAppend(0, 0), pageCounter(pageCounter) {} - -void InMemFile::addANewPage() { - page_idx_t newPageIdx = pageCounter.fetch_add(1); - // Write the index of the next page to the end of the current page, in case a string overflows - // from one page to another This is always done, as strings are unlikely to end exactly at the - // end of a page and it's probably not worth the additional complexity to save a few bytes on - // the occasions that a string does - if (pages.size() > 0) { - pages[nextPosToAppend.pageIdx]->write( - END_OF_PAGE, reinterpret_cast(&newPageIdx), sizeof(page_idx_t)); - } - pages.emplace(newPageIdx, std::make_unique()); - nextPosToAppend.elemPosInPage = 0; - nextPosToAppend.pageIdx = newPageIdx; -} - -void InMemFile::appendString(std::string_view rawString, ku_string_t& result) { - auto length = rawString.length(); - result.len = length; - std::memcpy(result.prefix, rawString.data(), - length <= ku_string_t::SHORT_STR_LENGTH ? length : ku_string_t::PREFIX_LENGTH); - if (length > ku_string_t::SHORT_STR_LENGTH) { - if (length > BufferPoolConstants::PAGE_256KB_SIZE) { - if constexpr (StorageConstants::TRUNCATE_OVER_LARGE_STRINGS) { - length = BufferPoolConstants::PAGE_256KB_SIZE; - result.len = length; - } else { - throw CopyException(ExceptionMessage::overLargeStringPKValueException(length)); - } - } - if (pages.size() == 0) { - addANewPage(); - } - - int32_t remainingLength = length; - // There should always be some space to write. The constructor adds an empty page, and - // we always add new pages if we run out of space at the end of the following loop - KU_ASSERT(nextPosToAppend.elemPosInPage < END_OF_PAGE); - - TypeUtils::encodeOverflowPtr( - result.overflowPtr, nextPosToAppend.pageIdx, nextPosToAppend.elemPosInPage); - while (remainingLength > 0) { - auto numBytesToWriteInPage = std::min(static_cast(remainingLength), - END_OF_PAGE - nextPosToAppend.elemPosInPage); - pages[nextPosToAppend.pageIdx]->write(nextPosToAppend.elemPosInPage, - reinterpret_cast(rawString.data()) + (length - remainingLength), - numBytesToWriteInPage); - remainingLength -= numBytesToWriteInPage; - // Allocate a new page if necessary. - nextPosToAppend.elemPosInPage += numBytesToWriteInPage; - if (nextPosToAppend.elemPosInPage >= END_OF_PAGE) { - addANewPage(); - } - } - } -} - -std::string InMemFile::readString(ku_string_t* strInInMemOvfFile) const { - auto length = strInInMemOvfFile->len; - if (ku_string_t::isShortString(length)) { - return strInInMemOvfFile->getAsShortString(); - } else { - PageCursor cursor; - TypeUtils::decodeOverflowPtr( - strInInMemOvfFile->overflowPtr, cursor.pageIdx, cursor.elemPosInPage); - std::string result; - result.reserve(length); - auto remainingLength = length; - while (remainingLength > 0) { - auto numBytesToReadInPage = std::min( - static_cast(remainingLength), END_OF_PAGE - cursor.elemPosInPage); - result += - std::string_view(reinterpret_cast(pages.at(cursor.pageIdx)->data) + - cursor.elemPosInPage, - numBytesToReadInPage); - cursor.elemPosInPage = 0; - cursor.pageIdx = getNextPageIndex(cursor.pageIdx); - remainingLength -= numBytesToReadInPage; - } - return result; - } -} - -bool InMemFile::equals(std::string_view keyToLookup, const ku_string_t& keyInEntry) const { - PageCursor cursor; - TypeUtils::decodeOverflowPtr(keyInEntry.overflowPtr, cursor.pageIdx, cursor.elemPosInPage); - auto lengthRead = 0u; - while (lengthRead < keyInEntry.len) { - auto numBytesToCheckInPage = std::min( - static_cast(keyInEntry.len) - lengthRead, END_OF_PAGE - cursor.elemPosInPage); - if (memcmp(keyToLookup.data() + lengthRead, - getPage(cursor.pageIdx)->data + cursor.elemPosInPage, numBytesToCheckInPage) != 0) { - return false; - } - cursor.elemPosInPage = 0; - cursor.pageIdx = getNextPageIndex(cursor.pageIdx); - lengthRead += numBytesToCheckInPage; - } - return true; -} - -void InMemFile::flush() { - for (auto& [pageIndex, page] : pages) { - // actual page index is stored inside of the InMemPage and does not correspond to the index - // in the vector - fileInfo->writeFile(page->data, BufferPoolConstants::PAGE_4KB_SIZE, - pageIndex * BufferPoolConstants::PAGE_4KB_SIZE); - } -} - -} // namespace storage -} // namespace kuzu diff --git a/src/storage/storage_structure/overflow_file.cpp b/src/storage/storage_structure/overflow_file.cpp new file mode 100644 index 00000000000..7f984b9ba7d --- /dev/null +++ b/src/storage/storage_structure/overflow_file.cpp @@ -0,0 +1,240 @@ +#include "storage/storage_structure/overflow_file.h" + +#include + +#include "common/constants.h" +#include "common/exception/message.h" +#include "common/type_utils.h" +#include "common/types/types.h" +#include "storage/buffer_manager/bm_file_handle.h" +#include "storage/file_handle.h" +#include "storage/storage_structure/db_file_utils.h" +#include "storage/storage_structure/in_mem_page.h" +#include "storage/storage_utils.h" +#include "transaction/transaction.h" + +using namespace kuzu::transaction; +using namespace kuzu::common; + +namespace kuzu { +namespace storage { + +std::string OverflowFileHandle::readString(TransactionType trxType, const ku_string_t& str) { + if (ku_string_t::isShortString(str.len)) { + return str.getAsShortString(); + } else { + PageCursor cursor; + TypeUtils::decodeOverflowPtr(str.overflowPtr, cursor.pageIdx, cursor.elemPosInPage); + std::string retVal; + retVal.reserve(str.len); + int32_t remainingLength = str.len; + while (remainingLength > 0) { + auto numBytesToReadInPage = std::min( + static_cast(remainingLength), END_OF_PAGE - cursor.elemPosInPage); + auto startPosInSrc = retVal.size(); + read(trxType, cursor.pageIdx, [&](uint8_t* frame) { + // Replace rather than append, since optimistic read may call the function multiple + // times + retVal.replace(startPosInSrc, numBytesToReadInPage, + std::string_view(reinterpret_cast(frame) + cursor.elemPosInPage, + numBytesToReadInPage)); + cursor.pageIdx = *(page_idx_t*)(frame + END_OF_PAGE); + }); + remainingLength -= numBytesToReadInPage; + // After the first page we always start reading from the beginning of the page. + cursor.elemPosInPage = 0; + } + return retVal; + } +} + +bool OverflowFileHandle::equals(TransactionType trxType, std::string_view keyToLookup, + const common::ku_string_t& keyInEntry) const { + PageCursor cursor; + TypeUtils::decodeOverflowPtr(keyInEntry.overflowPtr, cursor.pageIdx, cursor.elemPosInPage); + auto lengthRead = 0u; + while (lengthRead < keyInEntry.len) { + auto numBytesToCheckInPage = std::min(static_cast(keyInEntry.len) - lengthRead, + END_OF_PAGE - cursor.elemPosInPage); + bool equal = true; + read(trxType, cursor.pageIdx, [&](auto* frame) { + equal = memcmp(keyToLookup.data() + lengthRead, frame + cursor.elemPosInPage, + numBytesToCheckInPage) == 0; + // Update the next page index + cursor.pageIdx = *(page_idx_t*)(frame + END_OF_PAGE); + }); + if (!equal) { + return false; + } + cursor.elemPosInPage = 0; + lengthRead += numBytesToCheckInPage; + } + return true; +} + +uint8_t* OverflowFileHandle::addANewPage() { + page_idx_t newPageIdx = overflowFile.getNewPageIdx(); + if (pageWriteCache.size() > 0) { + pageWriteCache[nextPosToWriteTo.pageIdx]->write( + END_OF_PAGE, reinterpret_cast(&newPageIdx), sizeof(page_idx_t)); + } + pageWriteCache.emplace(newPageIdx, std::make_unique()); + nextPosToWriteTo.elemPosInPage = 0; + nextPosToWriteTo.pageIdx = newPageIdx; + return pageWriteCache[newPageIdx]->data; +} + +void OverflowFileHandle::setStringOverflow( + const char* srcRawString, uint64_t len, ku_string_t& diskDstString) { + if (len <= ku_string_t::SHORT_STR_LENGTH) { + return; + } else if (len > BufferPoolConstants::PAGE_256KB_SIZE) { + if constexpr (StorageConstants::TRUNCATE_OVER_LARGE_STRINGS) { + len = BufferPoolConstants::PAGE_256KB_SIZE; + diskDstString.len = len; + } else { + throw RuntimeException(ExceptionMessage::overLargeStringPKValueException(len)); + } + } + overflowFile.headerChanged = true; + uint8_t* pageToWrite = nullptr; + if (nextPosToWriteTo.pageIdx == INVALID_PAGE_IDX) { + pageToWrite = addANewPage(); + } else { + auto cached = pageWriteCache.find(nextPosToWriteTo.pageIdx); + if (cached != pageWriteCache.end()) { + pageToWrite = cached->second->data; + } else { + overflowFile.readFromDisk( + TransactionType::WRITE, nextPosToWriteTo.pageIdx, [&](auto* frame) { + auto page = std::make_unique(); + memcpy(page->data, frame, BufferPoolConstants::PAGE_4KB_SIZE); + pageToWrite = page->data; + pageWriteCache.emplace(nextPosToWriteTo.pageIdx, std::move(page)); + }); + } + } + int32_t remainingLength = len; + TypeUtils::encodeOverflowPtr( + diskDstString.overflowPtr, nextPosToWriteTo.pageIdx, nextPosToWriteTo.elemPosInPage); + while (remainingLength > 0) { + auto bytesWritten = len - remainingLength; + auto numBytesToWriteInPage = std::min( + static_cast(remainingLength), END_OF_PAGE - nextPosToWriteTo.elemPosInPage); + memcpy(pageToWrite + nextPosToWriteTo.elemPosInPage, srcRawString + bytesWritten, + numBytesToWriteInPage); + remainingLength -= numBytesToWriteInPage; + nextPosToWriteTo.elemPosInPage += numBytesToWriteInPage; + if (nextPosToWriteTo.elemPosInPage >= END_OF_PAGE) { + pageToWrite = addANewPage(); + } + } +} + +ku_string_t OverflowFileHandle::writeString(std::string_view rawString) { + ku_string_t result; + result.len = rawString.length(); + auto shortStrLen = ku_string_t::SHORT_STR_LENGTH; + auto inlineLen = std::min(shortStrLen, (uint64_t)result.len); + memcpy(result.prefix, rawString.data(), inlineLen); + setStringOverflow(rawString.data(), result.len, result); + return result; +} + +void OverflowFileHandle::prepareCommit() { + for (auto& [pageIndex, page] : pageWriteCache) { + overflowFile.writePageToDisk(pageIndex, page->data); + } +} + +void OverflowFileHandle::read(transaction::TransactionType trxType, common::page_idx_t pageIdx, + const std::function& func) const { + if (trxType == TransactionType::WRITE) { + auto cachedPage = pageWriteCache.find(pageIdx); + if (cachedPage != pageWriteCache.end()) { + return func(cachedPage->second->data); + } + } + overflowFile.readFromDisk(trxType, pageIdx, func); +} + +static inline DBFileIDAndName constructDBFileIDAndName( + const DBFileIDAndName& dbFileIdAndNameForMainDBFile) { + DBFileIDAndName copy = dbFileIdAndNameForMainDBFile; + copy.dbFileID.isOverflow = true; + copy.fName = StorageUtils::getOverflowFileName(dbFileIdAndNameForMainDBFile.fName); + return copy; +} + +OverflowFile::OverflowFile(const DBFileIDAndName& dbFileIdAndName, BufferManager* bufferManager, + WAL* wal, bool readOnly, common::VirtualFileSystem* vfs) + : bufferManager{bufferManager}, wal{wal}, headerChanged{false} { + auto overflowFileIDAndName = constructDBFileIDAndName(dbFileIdAndName); + dbFileID = overflowFileIDAndName.dbFileID; + fileHandle = bufferManager->getBMFileHandle(overflowFileIDAndName.fName, + readOnly ? FileHandle::O_PERSISTENT_FILE_READ_ONLY : + FileHandle::O_PERSISTENT_FILE_NO_CREATE, + BMFileHandle::FileVersionedType::VERSIONED_FILE, vfs); + if (vfs->fileOrPathExists(overflowFileIDAndName.fName)) { + readFromDisk(transaction::TransactionType::READ_ONLY, HEADER_PAGE_IDX, + [&](auto* frame) { memcpy(&header, frame, sizeof(header)); }); + pageCounter = numPagesOnDisk = header.pages; + } else { + // Reserve a page for the header + getNewPageIdx(); + } +} + +void OverflowFile::readFromDisk(transaction::TransactionType trxType, common::page_idx_t pageIdx, + const std::function& func) const { + auto [fileHandleToPin, pageIdxToPin] = + storage::DBFileUtils::getFileHandleAndPhysicalPageIdxToPin( + *getBMFileHandle(), pageIdx, *wal, trxType); + bufferManager->optimisticRead(*fileHandleToPin, pageIdxToPin, func); +} + +void OverflowFile::writePageToDisk(common::page_idx_t pageIdx, uint8_t* data) const { + if (pageIdx < numPagesOnDisk) { + // TODO: updatePage does an unnecessary read + copy. We just want to overwrite + DBFileUtils::updatePage(*getBMFileHandle(), dbFileID, pageIdx, false, *bufferManager, *wal, + [&](auto* frame) { memcpy(frame, data, BufferPoolConstants::PAGE_4KB_SIZE); }); + } else { + fileHandle->writePage(data, pageIdx); + } +} + +void OverflowFile::prepareCommit() { + if (fileHandle->getNumPages() < pageCounter) { + fileHandle->addNewPages(pageCounter - fileHandle->getNumPages()); + } + // TODO(bmwinger): Ideally this could be done separately and in parallel by each HashIndex + // However fileHandle->addNewPages needs to be called beforehand, + // but after each HashIndex::prepareCommit has written to the in-memory pages + for (auto& handle : handles) { + handle->prepareCommit(); + } + if (headerChanged) { + uint8_t page[BufferPoolConstants::PAGE_4KB_SIZE]; + header.pages = pageCounter; + memcpy(page, &header, sizeof(header)); + writePageToDisk(HEADER_PAGE_IDX, page); + } +} + +void OverflowFile::checkpointInMemory() { + headerChanged = false; + numPagesOnDisk = pageCounter; +} + +void OverflowFile::rollbackInMemory() { + readFromDisk(transaction::TransactionType::READ_ONLY, HEADER_PAGE_IDX, + [&](auto* frame) { memcpy(&header, frame, sizeof(header)); }); + numPagesOnDisk = pageCounter = header.pages; + for (auto i = 0u; i < handles.size(); i++) { + auto& handle = handles[i]; + handle->rollbackInMemory(header.cursors[i]); + } +} + +} // namespace storage +} // namespace kuzu diff --git a/src/storage/wal/wal.cpp b/src/storage/wal/wal.cpp index 29255101d61..dfc729dd543 100644 --- a/src/storage/wal/wal.cpp +++ b/src/storage/wal/wal.cpp @@ -85,13 +85,6 @@ void WAL::logRdfGraphRecord(table_id_t rdfGraphID, table_id_t resourceTableID, addNewWALRecordNoLock(walRecord); } -void WAL::logOverflowFileNextBytePosRecord(DBFileID dbFileID, uint64_t prevNextByteToWriteTo) { - lock_t lck{mtx}; - WALRecord walRecord = - WALRecord::newOverflowFileNextBytePosRecord(dbFileID, prevNextByteToWriteTo); - addNewWALRecordNoLock(walRecord); -} - void WAL::logCopyTableRecord(table_id_t tableID) { lock_t lck{mtx}; WALRecord walRecord = WALRecord::newCopyTableRecord(tableID); diff --git a/src/storage/wal/wal_record.cpp b/src/storage/wal/wal_record.cpp index 54879e79117..e818d9c561e 100644 --- a/src/storage/wal/wal_record.cpp +++ b/src/storage/wal/wal_record.cpp @@ -60,9 +60,6 @@ bool WALRecord::operator==(const WALRecord& rhs) const { case WALRecordType::CREATE_RDF_GRAPH_RECORD: { return rdfGraphRecord == rhs.rdfGraphRecord; } - case WALRecordType::OVERFLOW_FILE_NEXT_BYTE_POS_RECORD: { - return diskOverflowFileNextBytePosRecord == rhs.diskOverflowFileNextBytePosRecord; - } case WALRecordType::COPY_TABLE_RECORD: { return copyTableRecord == rhs.copyTableRecord; } @@ -104,9 +101,6 @@ std::string walRecordTypeToString(WALRecordType walRecordType) { case WALRecordType::CREATE_RDF_GRAPH_RECORD: { return "CREATE_RDF_GRAPH_RECORD"; } - case WALRecordType::OVERFLOW_FILE_NEXT_BYTE_POS_RECORD: { - return "OVERFLOW_FILE_NEXT_BYTE_POS_RECORD"; - } case WALRecordType::COPY_TABLE_RECORD: { return "COPY_TABLE_RECORD"; } @@ -185,15 +179,6 @@ WALRecord WALRecord::newRdfGraphRecord(table_id_t rdfGraphID, table_id_t resourc return retVal; } -WALRecord WALRecord::newOverflowFileNextBytePosRecord( - DBFileID dbFileID_, uint64_t prevNextByteToWriteTo_) { - WALRecord retVal; - retVal.recordType = WALRecordType::OVERFLOW_FILE_NEXT_BYTE_POS_RECORD; - retVal.diskOverflowFileNextBytePosRecord = - DiskOverflowFileNextBytePosRecord(dbFileID_, prevNextByteToWriteTo_); - return retVal; -} - WALRecord WALRecord::newCopyTableRecord(table_id_t tableID) { WALRecord retVal; retVal.recordType = WALRecordType::COPY_TABLE_RECORD; diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index 011eaa868ba..a170cf21da5 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -75,9 +75,6 @@ void WALReplayer::replayWALRecord(WALRecord& walRecord) { case WALRecordType::CREATE_RDF_GRAPH_RECORD: { replayRdfGraphRecord(walRecord); } break; - case WALRecordType::OVERFLOW_FILE_NEXT_BYTE_POS_RECORD: { - replayOverflowFileNextBytePosRecord(walRecord); - } break; case WALRecordType::COPY_TABLE_RECORD: { replayCopyTableRecord(walRecord); } break; @@ -190,35 +187,6 @@ void WALReplayer::replayRdfGraphRecord(const WALRecord& walRecord) { replayCreateTableRecord(literalTripleTableWALRecord); } -void WALReplayer::replayOverflowFileNextBytePosRecord(const WALRecord& walRecord) { - // If we are recovering we do not replay OVERFLOW_FILE_NEXT_BYTE_POS_RECORD because - // this record is intended for rolling back a transaction to ensure that we can - // recover the overflow space allocated for the write transaction by calling - // DiskOverflowFile::resetNextBytePosToWriteTo(...). However during recovery, storageManager - // is null, so we cannot construct this value. - if (isRecovering) { - return; - } - KU_ASSERT(walRecord.diskOverflowFileNextBytePosRecord.dbFileID.isOverflow); - auto dbFileID = walRecord.diskOverflowFileNextBytePosRecord.dbFileID; - DiskOverflowFile* diskOverflowFile; - switch (dbFileID.dbFileType) { - case DBFileType::NODE_INDEX: { - auto index = storageManager->getPKIndex(dbFileID.nodeIndexID.tableID); - diskOverflowFile = index->getDiskOverflowFile(); - } break; - default: - throw RuntimeException("Unsupported dbFileID " + dbFileTypeToString(dbFileID.dbFileType) + - " for OVERFLOW_FILE_NEXT_BYTE_POS_RECORD."); - } - // Reset NextBytePosToWriteTo if we are rolling back. - if (!isCheckpoint) { - diskOverflowFile->resetNextBytePosToWriteTo( - walRecord.diskOverflowFileNextBytePosRecord.prevNextBytePosToWriteTo); - } - diskOverflowFile->resetLoggedNewOverflowFileNextBytePosRecord(); -} - void WALReplayer::replayCopyTableRecord(const kuzu::storage::WALRecord& walRecord) { auto tableID = walRecord.copyTableRecord.tableID; if (isCheckpoint) { @@ -398,7 +366,7 @@ BMFileHandle* WALReplayer::getVersionedFileHandleIfWALVersionAndBMShouldBeCleare } case DBFileType::NODE_INDEX: { auto index = storageManager->getPKIndex(dbFileID.nodeIndexID.tableID); - return dbFileID.isOverflow ? index->getDiskOverflowFile()->getFileHandle() : + return dbFileID.isOverflow ? index->getOverflowFile()->getBMFileHandle() : index->getFileHandle(); } default: { From 2397c02e711b90af011d42ffd9696a89b3ba4834 Mon Sep 17 00:00:00 2001 From: xiyang Date: Mon, 11 Mar 2024 16:08:41 -0400 Subject: [PATCH 018/136] Fix issue-2984 --- scripts/antlr4/Cypher.g4.copy | 10 +- src/antlr4/Cypher.g4 | 10 +- test/test_files/common/comment.test | 23 ++ test/test_runner/test_runner.cpp | 5 + third_party/antlr4_cypher/cypher_lexer.cpp | 312 +++++++++--------- third_party/antlr4_cypher/cypher_parser.cpp | 30 +- .../antlr4_cypher/include/cypher_lexer.h | 2 +- .../antlr4_cypher/include/cypher_parser.h | 6 +- 8 files changed, 219 insertions(+), 179 deletions(-) create mode 100644 test/test_files/common/comment.test diff --git a/scripts/antlr4/Cypher.g4.copy b/scripts/antlr4/Cypher.g4.copy index 763bb33a916..b2a757176cd 100644 --- a/scripts/antlr4/Cypher.g4.copy +++ b/scripts/antlr4/Cypher.g4.copy @@ -58,9 +58,9 @@ kU_StandaloneCall CALL : ( 'C' | 'c' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'L' | 'l' ) ; kU_CommentOn - : COMMENT SP ON SP TABLE SP oC_SchemaName SP IS SP StringLiteral ; + : COMMENT_ SP ON SP TABLE SP oC_SchemaName SP IS SP StringLiteral ; -COMMENT : ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ( 'M' | 'm' ) ( 'E' | 'e' ) ( 'N' | 'n' ) ( 'T' | 't' ) ; +COMMENT_ : ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ( 'M' | 'm' ) ( 'E' | 'e' ) ( 'N' | 'n' ) ( 'T' | 't' ) ; kU_CreateMacro : CREATE SP MACRO SP oC_FunctionName SP? '(' SP? kU_PositionalArgs? SP? kU_DefaultArg? ( SP? ',' SP? kU_DefaultArg )* SP? ')' SP AS SP oC_Expression ; @@ -754,7 +754,7 @@ oC_SymbolicName // example of BEGIN and END: TCKWith2.Scenario1 kU_NonReservedKeywords - : COMMENT + : COMMENT_ | COUNT | NODE | REL @@ -819,7 +819,9 @@ WHITESPACE ; Comment - : ( '/*' ( Comment_1 | ( '*' Comment_2 ) )* '*/' ) ; + : ( '/*' ( Comment_1 | ( '*' Comment_2 ) )* '*/' ) + | ( '//' ( Comment_3 )* CR? ( LF | EOF ) ) + ; oC_LeftArrowHead : '<' diff --git a/src/antlr4/Cypher.g4 b/src/antlr4/Cypher.g4 index 763bb33a916..b2a757176cd 100644 --- a/src/antlr4/Cypher.g4 +++ b/src/antlr4/Cypher.g4 @@ -58,9 +58,9 @@ kU_StandaloneCall CALL : ( 'C' | 'c' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'L' | 'l' ) ; kU_CommentOn - : COMMENT SP ON SP TABLE SP oC_SchemaName SP IS SP StringLiteral ; + : COMMENT_ SP ON SP TABLE SP oC_SchemaName SP IS SP StringLiteral ; -COMMENT : ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ( 'M' | 'm' ) ( 'E' | 'e' ) ( 'N' | 'n' ) ( 'T' | 't' ) ; +COMMENT_ : ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'M' | 'm' ) ( 'M' | 'm' ) ( 'E' | 'e' ) ( 'N' | 'n' ) ( 'T' | 't' ) ; kU_CreateMacro : CREATE SP MACRO SP oC_FunctionName SP? '(' SP? kU_PositionalArgs? SP? kU_DefaultArg? ( SP? ',' SP? kU_DefaultArg )* SP? ')' SP AS SP oC_Expression ; @@ -754,7 +754,7 @@ oC_SymbolicName // example of BEGIN and END: TCKWith2.Scenario1 kU_NonReservedKeywords - : COMMENT + : COMMENT_ | COUNT | NODE | REL @@ -819,7 +819,9 @@ WHITESPACE ; Comment - : ( '/*' ( Comment_1 | ( '*' Comment_2 ) )* '*/' ) ; + : ( '/*' ( Comment_1 | ( '*' Comment_2 ) )* '*/' ) + | ( '//' ( Comment_3 )* CR? ( LF | EOF ) ) + ; oC_LeftArrowHead : '<' diff --git a/test/test_files/common/comment.test b/test/test_files/common/comment.test new file mode 100644 index 00000000000..710ab478834 --- /dev/null +++ b/test/test_files/common/comment.test @@ -0,0 +1,23 @@ +-GROUP CommentTests +-DATASET CSV empty + +-- + +-CASE CommentTest + +-STATEMENT RETURN 1; // This is a comment +---- 1 +1 +-STATEMENT RETURN 1 // This is a comment ; +---- 1 +1 +-STATEMENT RETURN 1; /* This is a commnet */ +---- 1 +1 +-STATEMENT RETURN 1 /* This is a commnet */ ; +---- 1 +1 +-STATEMENT /* This is a commnet */ + RETURN 1; +---- 1 +1 \ No newline at end of file diff --git a/test/test_runner/test_runner.cpp b/test/test_runner/test_runner.cpp index 055d3ae6f38..0f110434235 100644 --- a/test/test_runner/test_runner.cpp +++ b/test/test_runner/test_runner.cpp @@ -116,6 +116,11 @@ bool TestRunner::checkLogicalPlan(std::unique_ptr& preparedSt } else if (statement->expectedOk && result->isSuccess()) { return true; } else { + if (!preparedStatement->success) { + spdlog::info( + "Query compilation failed with error: {}", preparedStatement->getErrorMessage()); + return false; + } auto planStr = preparedStatement->logicalPlans[planIdx]->toString(); if (checkPlanResult(result, statement, planStr, planIdx)) { return true; diff --git a/third_party/antlr4_cypher/cypher_lexer.cpp b/third_party/antlr4_cypher/cypher_lexer.cpp index ef3eedf02ce..c821166ff20 100644 --- a/third_party/antlr4_cypher/cypher_lexer.cpp +++ b/third_party/antlr4_cypher/cypher_lexer.cpp @@ -62,7 +62,7 @@ void cypherlexerLexerInitialize() { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", - "T__41", "T__42", "T__43", "T__44", "CALL", "COMMENT", "MACRO", "GLOB", + "T__41", "T__42", "T__43", "T__44", "CALL", "COMMENT_", "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", "BEGIN", @@ -106,7 +106,7 @@ void cypherlexerLexerInitialize() { std::vector{ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "", "", "CALL", "COMMENT", + "", "", "", "", "", "", "", "", "", "", "", "", "CALL", "COMMENT_", "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", @@ -126,7 +126,7 @@ void cypherlexerLexerInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,0,150,1166,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,0,150,1183,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2, 14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2, 21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2, @@ -213,134 +213,136 @@ void cypherlexerLexerInitialize() { 4,145,1088,8,145,11,145,12,145,1089,1,146,4,146,1093,8,146,11,146,12, 146,1094,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147, 1,147,1,147,3,147,1109,8,147,1,148,1,148,1,148,1,148,1,148,1,148,5,148, - 1117,8,148,10,148,12,148,1120,9,148,1,148,1,148,1,148,1,149,1,149,1,150, - 1,150,1,151,1,151,1,152,1,152,1,153,1,153,1,154,1,154,1,155,1,155,1,156, - 1,156,1,157,1,157,1,158,1,158,1,159,1,159,1,160,1,160,1,161,1,161,1,162, - 1,162,1,163,1,163,1,164,1,164,1,165,1,165,1,166,1,166,1,167,1,167,1,168, - 1,168,1,169,1,169,0,0,170,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19, - 10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, - 43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65, - 33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44, - 89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, - 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65, - 131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75, - 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85, - 171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95, - 191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,104,209, - 105,211,106,213,107,215,108,217,109,219,110,221,111,223,112,225,113,227, - 114,229,115,231,116,233,117,235,118,237,119,239,120,241,121,243,122,245, - 123,247,124,249,125,251,126,253,127,255,128,257,129,259,130,261,131,263, - 132,265,133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281, - 141,283,142,285,143,287,144,289,145,291,146,293,147,295,148,297,149,299, - 0,301,0,303,0,305,0,307,0,309,0,311,0,313,0,315,0,317,0,319,0,321,0,323, - 0,325,0,327,0,329,0,331,0,333,0,335,0,337,0,339,150,1,0,45,2,0,67,67, - 99,99,2,0,65,65,97,97,2,0,76,76,108,108,2,0,79,79,111,111,2,0,77,77,109, - 109,2,0,69,69,101,101,2,0,78,78,110,110,2,0,84,84,116,116,2,0,82,82,114, - 114,2,0,71,71,103,103,2,0,66,66,98,98,2,0,80,80,112,112,2,0,89,89,121, - 121,2,0,70,70,102,102,2,0,85,85,117,117,2,0,88,88,120,120,2,0,73,73,105, - 105,2,0,68,68,100,100,2,0,83,83,115,115,2,0,72,72,104,104,2,0,75,75,107, - 107,2,0,87,87,119,119,13,0,34,34,39,39,66,66,70,70,78,78,82,82,84,84, - 92,92,98,98,102,102,110,110,114,114,116,116,2,0,65,70,97,102,8,0,160, - 160,5760,5760,6158,6158,8192,8202,8232,8233,8239,8239,8287,8287,12288, - 12288,1,0,12,12,1,0,96,96,1,0,30,30,768,0,48,57,65,90,95,95,97,122,170, - 170,181,181,183,183,186,186,192,214,216,246,248,705,710,721,736,740,748, - 748,750,750,768,884,886,887,890,893,895,895,902,906,908,908,910,929,931, - 1013,1015,1153,1155,1159,1162,1327,1329,1366,1369,1369,1376,1416,1425, - 1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1519,1522,1552, - 1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808, - 1866,1869,1969,1984,2037,2042,2042,2045,2045,2048,2093,2112,2139,2144, - 2154,2160,2183,2185,2190,2200,2273,2275,2403,2406,2415,2417,2435,2437, - 2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503, - 2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2556,2556,2558, - 2558,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613, - 2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649, - 2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730, - 2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784, - 2787,2790,2799,2809,2815,2817,2819,2821,2828,2831,2832,2835,2856,2858, - 2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2901,2903,2908, - 2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962, - 2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006, - 3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3072,3084,3086, - 3088,3090,3112,3114,3129,3132,3140,3142,3144,3146,3149,3157,3158,3160, - 3162,3165,3165,3168,3171,3174,3183,3200,3203,3205,3212,3214,3216,3218, - 3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3293, - 3294,3296,3299,3302,3311,3313,3315,3328,3340,3342,3344,3346,3396,3398, - 3400,3402,3406,3412,3415,3423,3427,3430,3439,3450,3455,3457,3459,3461, - 3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542, - 3542,3544,3551,3558,3567,3570,3571,3585,3642,3648,3662,3664,3673,3713, - 3714,3716,3716,3718,3722,3724,3747,3749,3749,3751,3773,3776,3780,3782, - 3782,3784,3790,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893, - 3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993, - 4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304, - 4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746, - 4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824, - 4880,4882,4885,4888,4954,4957,4959,4969,4977,4992,5007,5024,5109,5112, - 5117,5121,5740,5743,5759,5761,5786,5792,5866,5870,5880,5888,5909,5919, - 5940,5952,5971,5984,5996,5998,6000,6002,6003,6016,6099,6103,6103,6108, - 6109,6112,6121,6155,6157,6159,6169,6176,6264,6272,6314,6320,6389,6400, - 6430,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608, - 6618,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6832, - 6845,6847,6862,6912,6988,6992,7001,7019,7027,7040,7155,7168,7223,7232, - 7241,7245,7293,7296,7304,7312,7354,7357,7359,7376,7378,7380,7418,7424, - 7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029, - 8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144, - 8147,8150,8155,8160,8172,8178,8180,8182,8188,8255,8256,8276,8276,8305, - 8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455, - 8455,8458,8467,8469,8469,8472,8477,8484,8484,8486,8486,8488,8488,8490, - 8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11492,11499,11507, - 11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670, - 11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726, - 11728,11734,11736,11742,11744,11775,12293,12295,12321,12335,12337,12341, - 12344,12348,12353,12438,12441,12447,12449,12538,12540,12543,12549,12591, - 12593,12686,12704,12735,12784,12799,13312,19903,19968,42124,42192,42237, - 42240,42508,42512,42539,42560,42607,42612,42621,42623,42737,42775,42783, - 42786,42888,42891,42954,42960,42961,42963,42963,42965,42969,42994,43047, - 43052,43052,43072,43123,43136,43205,43216,43225,43232,43255,43259,43259, - 43261,43309,43312,43347,43360,43388,43392,43456,43471,43481,43488,43518, - 43520,43574,43584,43597,43600,43609,43616,43638,43642,43714,43739,43741, - 43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814, - 43816,43822,43824,43866,43868,43881,43888,44010,44012,44013,44016,44025, - 44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262, - 64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321, - 64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019, - 65024,65039,65056,65071,65075,65076,65101,65103,65136,65140,65142,65276, - 65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479, - 65482,65487,65490,65495,65498,65500,65536,65547,65549,65574,65576,65594, - 65596,65597,65599,65613,65616,65629,65664,65786,65856,65908,66045,66045, - 66176,66204,66208,66256,66272,66272,66304,66335,66349,66378,66384,66426, - 66432,66461,66464,66499,66504,66511,66513,66517,66560,66717,66720,66729, - 66736,66771,66776,66811,66816,66855,66864,66915,66928,66938,66940,66954, - 66956,66962,66964,66965,66967,66977,66979,66993,66995,67001,67003,67004, - 67072,67382,67392,67413,67424,67431,67456,67461,67463,67504,67506,67514, - 67584,67589,67592,67592,67594,67637,67639,67640,67644,67644,67647,67669, - 67680,67702,67712,67742,67808,67826,67828,67829,67840,67861,67872,67897, - 67968,68023,68030,68031,68096,68099,68101,68102,68108,68115,68117,68119, - 68121,68149,68152,68154,68159,68159,68192,68220,68224,68252,68288,68295, - 68297,68326,68352,68405,68416,68437,68448,68466,68480,68497,68608,68680, - 68736,68786,68800,68850,68864,68903,68912,68921,69248,69289,69291,69292, - 69296,69297,69373,69404,69415,69415,69424,69456,69488,69509,69552,69572, - 69600,69622,69632,69702,69734,69749,69759,69818,69826,69826,69840,69864, - 69872,69881,69888,69940,69942,69951,69956,69959,69968,70003,70006,70006, - 70016,70084,70089,70092,70094,70106,70108,70108,70144,70161,70163,70199, - 70206,70209,70272,70278,70280,70280,70282,70285,70287,70301,70303,70312, - 70320,70378,70384,70393,70400,70403,70405,70412,70415,70416,70419,70440, - 70442,70448,70450,70451,70453,70457,70459,70468,70471,70472,70475,70477, - 70480,70480,70487,70487,70493,70499,70502,70508,70512,70516,70656,70730, - 70736,70745,70750,70753,70784,70853,70855,70855,70864,70873,71040,71093, - 71096,71104,71128,71133,71168,71232,71236,71236,71248,71257,71296,71352, - 71360,71369,71424,71450,71453,71467,71472,71481,71488,71494,71680,71738, - 71840,71913,71935,71942,71945,71945,71948,71955,71957,71958,71960,71989, - 71991,71992,71995,72003,72016,72025,72096,72103,72106,72151,72154,72161, - 72163,72164,72192,72254,72263,72263,72272,72345,72349,72349,72368,72440, - 72704,72712,72714,72758,72760,72768,72784,72793,72818,72847,72850,72871, - 72873,72886,72960,72966,72968,72969,72971,73014,73018,73018,73020,73021, - 73023,73031,73040,73049,73056,73061,73063,73064,73066,73102,73104,73105, - 73107,73112,73120,73129,73440,73462,73472,73488,73490,73530,73534,73538, - 73552,73561,73648,73648,73728,74649,74752,74862,74880,75075,77712,77808, - 77824,78895,78912,78933,82944,83526,92160,92728,92736,92766,92768,92777, - 92784,92862,92864,92873,92880,92909,92912,92916,92928,92982,92992,92995, - 93008,93017,93027,93047,93053,93071,93760,93823,93952,94026,94031,94087, - 94095,94111,94176,94177,94179,94180,94192,94193,94208,100343,100352,101589, + 1117,8,148,10,148,12,148,1120,9,148,1,148,1,148,1,148,1,148,1,148,1,148, + 5,148,1128,8,148,10,148,12,148,1131,9,148,1,148,3,148,1134,8,148,1,148, + 1,148,3,148,1138,8,148,3,148,1140,8,148,1,149,1,149,1,150,1,150,1,151, + 1,151,1,152,1,152,1,153,1,153,1,154,1,154,1,155,1,155,1,156,1,156,1,157, + 1,157,1,158,1,158,1,159,1,159,1,160,1,160,1,161,1,161,1,162,1,162,1,163, + 1,163,1,164,1,164,1,165,1,165,1,166,1,166,1,167,1,167,1,168,1,168,1,169, + 1,169,0,0,170,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23, + 12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, + 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69, + 35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, + 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113, + 57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133, + 67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153, + 77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173, + 87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193, + 97,195,98,197,99,199,100,201,101,203,102,205,103,207,104,209,105,211, + 106,213,107,215,108,217,109,219,110,221,111,223,112,225,113,227,114,229, + 115,231,116,233,117,235,118,237,119,239,120,241,121,243,122,245,123,247, + 124,249,125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265, + 133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281,141,283, + 142,285,143,287,144,289,145,291,146,293,147,295,148,297,149,299,0,301, + 0,303,0,305,0,307,0,309,0,311,0,313,0,315,0,317,0,319,0,321,0,323,0,325, + 0,327,0,329,0,331,0,333,0,335,0,337,0,339,150,1,0,45,2,0,67,67,99,99, + 2,0,65,65,97,97,2,0,76,76,108,108,2,0,79,79,111,111,2,0,77,77,109,109, + 2,0,69,69,101,101,2,0,78,78,110,110,2,0,84,84,116,116,2,0,82,82,114,114, + 2,0,71,71,103,103,2,0,66,66,98,98,2,0,80,80,112,112,2,0,89,89,121,121, + 2,0,70,70,102,102,2,0,85,85,117,117,2,0,88,88,120,120,2,0,73,73,105,105, + 2,0,68,68,100,100,2,0,83,83,115,115,2,0,72,72,104,104,2,0,75,75,107,107, + 2,0,87,87,119,119,13,0,34,34,39,39,66,66,70,70,78,78,82,82,84,84,92,92, + 98,98,102,102,110,110,114,114,116,116,2,0,65,70,97,102,8,0,160,160,5760, + 5760,6158,6158,8192,8202,8232,8233,8239,8239,8287,8287,12288,12288,1, + 0,12,12,1,0,96,96,1,0,30,30,768,0,48,57,65,90,95,95,97,122,170,170,181, + 181,183,183,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750, + 750,768,884,886,887,890,893,895,895,902,906,908,908,910,929,931,1013, + 1015,1153,1155,1159,1162,1327,1329,1366,1369,1369,1376,1416,1425,1469, + 1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1519,1522,1552,1562, + 1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866, + 1869,1969,1984,2037,2042,2042,2045,2045,2048,2093,2112,2139,2144,2154, + 2160,2183,2185,2190,2200,2273,2275,2403,2406,2415,2417,2435,2437,2444, + 2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504, + 2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2556,2556,2558,2558, + 2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614, + 2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652, + 2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736, + 2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787, + 2790,2799,2809,2815,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864, + 2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2901,2903,2908,2909, + 2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965, + 2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010, + 3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3072,3084,3086,3088, + 3090,3112,3114,3129,3132,3140,3142,3144,3146,3149,3157,3158,3160,3162, + 3165,3165,3168,3171,3174,3183,3200,3203,3205,3212,3214,3216,3218,3240, + 3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3293,3294, + 3296,3299,3302,3311,3313,3315,3328,3340,3342,3344,3346,3396,3398,3400, + 3402,3406,3412,3415,3423,3427,3430,3439,3450,3455,3457,3459,3461,3478, + 3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542, + 3544,3551,3558,3567,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714, + 3716,3716,3718,3722,3724,3747,3749,3749,3751,3773,3776,3780,3782,3782, + 3784,3790,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893, + 3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028, + 4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346, + 4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749, + 4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880, + 4882,4885,4888,4954,4957,4959,4969,4977,4992,5007,5024,5109,5112,5117, + 5121,5740,5743,5759,5761,5786,5792,5866,5870,5880,5888,5909,5919,5940, + 5952,5971,5984,5996,5998,6000,6002,6003,6016,6099,6103,6103,6108,6109, + 6112,6121,6155,6157,6159,6169,6176,6264,6272,6314,6320,6389,6400,6430, + 6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6618, + 6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6832,6845, + 6847,6862,6912,6988,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241, + 7245,7293,7296,7304,7312,7354,7357,7359,7376,7378,7380,7418,7424,7957, + 7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029, + 8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147, + 8150,8155,8160,8172,8178,8180,8182,8188,8255,8256,8276,8276,8305,8305, + 8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455, + 8458,8467,8469,8469,8472,8477,8484,8484,8486,8486,8488,8488,8490,8505, + 8508,8511,8517,8521,8526,8526,8544,8584,11264,11492,11499,11507,11520, + 11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680, + 11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728, + 11734,11736,11742,11744,11775,12293,12295,12321,12335,12337,12341,12344, + 12348,12353,12438,12441,12447,12449,12538,12540,12543,12549,12591,12593, + 12686,12704,12735,12784,12799,13312,19903,19968,42124,42192,42237,42240, + 42508,42512,42539,42560,42607,42612,42621,42623,42737,42775,42783,42786, + 42888,42891,42954,42960,42961,42963,42963,42965,42969,42994,43047,43052, + 43052,43072,43123,43136,43205,43216,43225,43232,43255,43259,43259,43261, + 43309,43312,43347,43360,43388,43392,43456,43471,43481,43488,43518,43520, + 43574,43584,43597,43600,43609,43616,43638,43642,43714,43739,43741,43744, + 43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816, + 43822,43824,43866,43868,43881,43888,44010,44012,44013,44016,44025,44032, + 55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275, + 64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323, + 64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024, + 65039,65056,65071,65075,65076,65101,65103,65136,65140,65142,65276,65296, + 65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482, + 65487,65490,65495,65498,65500,65536,65547,65549,65574,65576,65594,65596, + 65597,65599,65613,65616,65629,65664,65786,65856,65908,66045,66045,66176, + 66204,66208,66256,66272,66272,66304,66335,66349,66378,66384,66426,66432, + 66461,66464,66499,66504,66511,66513,66517,66560,66717,66720,66729,66736, + 66771,66776,66811,66816,66855,66864,66915,66928,66938,66940,66954,66956, + 66962,66964,66965,66967,66977,66979,66993,66995,67001,67003,67004,67072, + 67382,67392,67413,67424,67431,67456,67461,67463,67504,67506,67514,67584, + 67589,67592,67592,67594,67637,67639,67640,67644,67644,67647,67669,67680, + 67702,67712,67742,67808,67826,67828,67829,67840,67861,67872,67897,67968, + 68023,68030,68031,68096,68099,68101,68102,68108,68115,68117,68119,68121, + 68149,68152,68154,68159,68159,68192,68220,68224,68252,68288,68295,68297, + 68326,68352,68405,68416,68437,68448,68466,68480,68497,68608,68680,68736, + 68786,68800,68850,68864,68903,68912,68921,69248,69289,69291,69292,69296, + 69297,69373,69404,69415,69415,69424,69456,69488,69509,69552,69572,69600, + 69622,69632,69702,69734,69749,69759,69818,69826,69826,69840,69864,69872, + 69881,69888,69940,69942,69951,69956,69959,69968,70003,70006,70006,70016, + 70084,70089,70092,70094,70106,70108,70108,70144,70161,70163,70199,70206, + 70209,70272,70278,70280,70280,70282,70285,70287,70301,70303,70312,70320, + 70378,70384,70393,70400,70403,70405,70412,70415,70416,70419,70440,70442, + 70448,70450,70451,70453,70457,70459,70468,70471,70472,70475,70477,70480, + 70480,70487,70487,70493,70499,70502,70508,70512,70516,70656,70730,70736, + 70745,70750,70753,70784,70853,70855,70855,70864,70873,71040,71093,71096, + 71104,71128,71133,71168,71232,71236,71236,71248,71257,71296,71352,71360, + 71369,71424,71450,71453,71467,71472,71481,71488,71494,71680,71738,71840, + 71913,71935,71942,71945,71945,71948,71955,71957,71958,71960,71989,71991, + 71992,71995,72003,72016,72025,72096,72103,72106,72151,72154,72161,72163, + 72164,72192,72254,72263,72263,72272,72345,72349,72349,72368,72440,72704, + 72712,72714,72758,72760,72768,72784,72793,72818,72847,72850,72871,72873, + 72886,72960,72966,72968,72969,72971,73014,73018,73018,73020,73021,73023, + 73031,73040,73049,73056,73061,73063,73064,73066,73102,73104,73105,73107, + 73112,73120,73129,73440,73462,73472,73488,73490,73530,73534,73538,73552, + 73561,73648,73648,73728,74649,74752,74862,74880,75075,77712,77808,77824, + 78895,78912,78933,82944,83526,92160,92728,92736,92766,92768,92777,92784, + 92862,92864,92873,92880,92909,92912,92916,92928,92982,92992,92995,93008, + 93017,93027,93047,93053,93071,93760,93823,93952,94026,94031,94087,94095, + 94111,94176,94177,94179,94180,94192,94193,94208,100343,100352,101589, 101632,101640,110576,110579,110581,110587,110589,110590,110592,110882, 110898,110898,110928,110930,110933,110933,110948,110951,110960,111355, 113664,113770,113776,113788,113792,113800,113808,113817,113821,113822, @@ -479,7 +481,7 @@ void cypherlexerLexerInitialize() { 126585,126588,126590,126590,126592,126601,126603,126619,126625,126627, 126629,126633,126635,126651,131072,173791,173824,177977,177984,178205, 178208,183969,183984,191456,194560,195101,196608,201546,201552,205743, - 1178,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, + 1199,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, 1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0, 0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0, 0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43, @@ -541,12 +543,12 @@ void cypherlexerLexerInitialize() { 1003,1,0,0,0,269,1031,1,0,0,0,271,1034,1,0,0,0,273,1038,1,0,0,0,275,1042, 1,0,0,0,277,1046,1,0,0,0,279,1048,1,0,0,0,281,1050,1,0,0,0,283,1055,1, 0,0,0,285,1064,1,0,0,0,287,1073,1,0,0,0,289,1077,1,0,0,0,291,1087,1,0, - 0,0,293,1092,1,0,0,0,295,1108,1,0,0,0,297,1110,1,0,0,0,299,1124,1,0,0, - 0,301,1126,1,0,0,0,303,1128,1,0,0,0,305,1130,1,0,0,0,307,1132,1,0,0,0, - 309,1134,1,0,0,0,311,1136,1,0,0,0,313,1138,1,0,0,0,315,1140,1,0,0,0,317, - 1142,1,0,0,0,319,1144,1,0,0,0,321,1146,1,0,0,0,323,1148,1,0,0,0,325,1150, - 1,0,0,0,327,1152,1,0,0,0,329,1154,1,0,0,0,331,1156,1,0,0,0,333,1158,1, - 0,0,0,335,1160,1,0,0,0,337,1162,1,0,0,0,339,1164,1,0,0,0,341,342,5,59, + 0,0,293,1092,1,0,0,0,295,1108,1,0,0,0,297,1139,1,0,0,0,299,1141,1,0,0, + 0,301,1143,1,0,0,0,303,1145,1,0,0,0,305,1147,1,0,0,0,307,1149,1,0,0,0, + 309,1151,1,0,0,0,311,1153,1,0,0,0,313,1155,1,0,0,0,315,1157,1,0,0,0,317, + 1159,1,0,0,0,319,1161,1,0,0,0,321,1163,1,0,0,0,323,1165,1,0,0,0,325,1167, + 1,0,0,0,327,1169,1,0,0,0,329,1171,1,0,0,0,331,1173,1,0,0,0,333,1175,1, + 0,0,0,335,1177,1,0,0,0,337,1179,1,0,0,0,339,1181,1,0,0,0,341,342,5,59, 0,0,342,2,1,0,0,0,343,344,5,40,0,0,344,4,1,0,0,0,345,346,5,41,0,0,346, 6,1,0,0,0,347,348,5,44,0,0,348,8,1,0,0,0,349,350,5,61,0,0,350,10,1,0, 0,0,351,352,5,91,0,0,352,12,1,0,0,0,353,354,5,93,0,0,354,14,1,0,0,0,355, @@ -742,20 +744,26 @@ void cypherlexerLexerInitialize() { 296,1,0,0,0,1110,1111,5,47,0,0,1111,1112,5,42,0,0,1112,1118,1,0,0,0,1113, 1117,3,307,153,0,1114,1115,5,42,0,0,1115,1117,3,313,156,0,1116,1113,1, 0,0,0,1116,1114,1,0,0,0,1117,1120,1,0,0,0,1118,1116,1,0,0,0,1118,1119, - 1,0,0,0,1119,1121,1,0,0,0,1120,1118,1,0,0,0,1121,1122,5,42,0,0,1122,1123, - 5,47,0,0,1123,298,1,0,0,0,1124,1125,7,25,0,0,1125,300,1,0,0,0,1126,1127, - 8,26,0,0,1127,302,1,0,0,0,1128,1129,7,27,0,0,1129,304,1,0,0,0,1130,1131, - 7,28,0,0,1131,306,1,0,0,0,1132,1133,8,29,0,0,1133,308,1,0,0,0,1134,1135, - 8,30,0,0,1135,310,1,0,0,0,1136,1137,8,31,0,0,1137,312,1,0,0,0,1138,1139, - 8,32,0,0,1139,314,1,0,0,0,1140,1141,7,33,0,0,1141,316,1,0,0,0,1142,1143, - 7,34,0,0,1143,318,1,0,0,0,1144,1145,7,35,0,0,1145,320,1,0,0,0,1146,1147, - 7,36,0,0,1147,322,1,0,0,0,1148,1149,7,37,0,0,1149,324,1,0,0,0,1150,1151, - 7,38,0,0,1151,326,1,0,0,0,1152,1153,7,39,0,0,1153,328,1,0,0,0,1154,1155, - 8,40,0,0,1155,330,1,0,0,0,1156,1157,7,41,0,0,1157,332,1,0,0,0,1158,1159, - 7,42,0,0,1159,334,1,0,0,0,1160,1161,7,43,0,0,1161,336,1,0,0,0,1162,1163, - 7,44,0,0,1163,338,1,0,0,0,1164,1165,9,0,0,0,1165,340,1,0,0,0,24,0,986, - 988,995,997,1001,1021,1028,1031,1034,1038,1042,1046,1055,1062,1068,1073, - 1077,1083,1089,1094,1108,1116,1118,0 + 1,0,0,0,1119,1121,1,0,0,0,1120,1118,1,0,0,0,1121,1122,5,42,0,0,1122,1140, + 5,47,0,0,1123,1124,5,47,0,0,1124,1125,5,47,0,0,1125,1129,1,0,0,0,1126, + 1128,3,311,155,0,1127,1126,1,0,0,0,1128,1131,1,0,0,0,1129,1127,1,0,0, + 0,1129,1130,1,0,0,0,1130,1133,1,0,0,0,1131,1129,1,0,0,0,1132,1134,3,319, + 159,0,1133,1132,1,0,0,0,1133,1134,1,0,0,0,1134,1137,1,0,0,0,1135,1138, + 3,331,165,0,1136,1138,5,0,0,1,1137,1135,1,0,0,0,1137,1136,1,0,0,0,1138, + 1140,1,0,0,0,1139,1110,1,0,0,0,1139,1123,1,0,0,0,1140,298,1,0,0,0,1141, + 1142,7,25,0,0,1142,300,1,0,0,0,1143,1144,8,26,0,0,1144,302,1,0,0,0,1145, + 1146,7,27,0,0,1146,304,1,0,0,0,1147,1148,7,28,0,0,1148,306,1,0,0,0,1149, + 1150,8,29,0,0,1150,308,1,0,0,0,1151,1152,8,30,0,0,1152,310,1,0,0,0,1153, + 1154,8,31,0,0,1154,312,1,0,0,0,1155,1156,8,32,0,0,1156,314,1,0,0,0,1157, + 1158,7,33,0,0,1158,316,1,0,0,0,1159,1160,7,34,0,0,1160,318,1,0,0,0,1161, + 1162,7,35,0,0,1162,320,1,0,0,0,1163,1164,7,36,0,0,1164,322,1,0,0,0,1165, + 1166,7,37,0,0,1166,324,1,0,0,0,1167,1168,7,38,0,0,1168,326,1,0,0,0,1169, + 1170,7,39,0,0,1170,328,1,0,0,0,1171,1172,8,40,0,0,1172,330,1,0,0,0,1173, + 1174,7,41,0,0,1174,332,1,0,0,0,1175,1176,7,42,0,0,1176,334,1,0,0,0,1177, + 1178,7,43,0,0,1178,336,1,0,0,0,1179,1180,7,44,0,0,1180,338,1,0,0,0,1181, + 1182,9,0,0,0,1182,340,1,0,0,0,28,0,986,988,995,997,1001,1021,1028,1031, + 1034,1038,1042,1046,1055,1062,1068,1073,1077,1083,1089,1094,1108,1116, + 1118,1129,1133,1137,1139,0 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); diff --git a/third_party/antlr4_cypher/cypher_parser.cpp b/third_party/antlr4_cypher/cypher_parser.cpp index da4f0be3d7f..4555c6900d8 100644 --- a/third_party/antlr4_cypher/cypher_parser.cpp +++ b/third_party/antlr4_cypher/cypher_parser.cpp @@ -109,7 +109,7 @@ void cypherParserInitialize() { std::vector{ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "", "", "CALL", "COMMENT", + "", "", "", "", "", "", "", "", "", "", "", "", "CALL", "COMMENT_", "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", @@ -1593,7 +1593,7 @@ CypherParser::KU_CopyFromContext* CypherParser::kU_CopyFrom() { break; } - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -2294,8 +2294,8 @@ CypherParser::KU_CommentOnContext::KU_CommentOnContext(ParserRuleContext *parent : ParserRuleContext(parent, invokingState) { } -tree::TerminalNode* CypherParser::KU_CommentOnContext::COMMENT() { - return getToken(CypherParser::COMMENT, 0); +tree::TerminalNode* CypherParser::KU_CommentOnContext::COMMENT_() { + return getToken(CypherParser::COMMENT_, 0); } std::vector CypherParser::KU_CommentOnContext::SP() { @@ -2346,7 +2346,7 @@ CypherParser::KU_CommentOnContext* CypherParser::kU_CommentOn() { try { enterOuterAlt(_localctx, 1); setState(490); - match(CypherParser::COMMENT); + match(CypherParser::COMMENT_); setState(491); match(CypherParser::SP); setState(492); @@ -5358,7 +5358,7 @@ CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { break; } - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -6517,7 +6517,7 @@ CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { break; } - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -7723,7 +7723,7 @@ CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { case CypherParser::T__5: case CypherParser::T__7: case CypherParser::T__25: - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -8354,7 +8354,7 @@ CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { setState(1394); _errHandler->sync(this); switch (_input->LA(1)) { - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -12850,7 +12850,7 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { setState(2065); _errHandler->sync(this); switch (_input->LA(1)) { - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -13699,7 +13699,7 @@ CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { setState(2214); _errHandler->sync(this); switch (_input->LA(1)) { - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -14168,7 +14168,7 @@ CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { setState(2278); _errHandler->sync(this); switch (_input->LA(1)) { - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -14500,7 +14500,7 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { break; } - case CypherParser::COMMENT: + case CypherParser::COMMENT_: case CypherParser::EXPORT: case CypherParser::IMPORT: case CypherParser::DATABASE: @@ -14536,8 +14536,8 @@ CypherParser::KU_NonReservedKeywordsContext::KU_NonReservedKeywordsContext(Parse : ParserRuleContext(parent, invokingState) { } -tree::TerminalNode* CypherParser::KU_NonReservedKeywordsContext::COMMENT() { - return getToken(CypherParser::COMMENT, 0); +tree::TerminalNode* CypherParser::KU_NonReservedKeywordsContext::COMMENT_() { + return getToken(CypherParser::COMMENT_, 0); } tree::TerminalNode* CypherParser::KU_NonReservedKeywordsContext::COUNT() { diff --git a/third_party/antlr4_cypher/include/cypher_lexer.h b/third_party/antlr4_cypher/include/cypher_lexer.h index ef7e9367f06..ff904a1f414 100644 --- a/third_party/antlr4_cypher/include/cypher_lexer.h +++ b/third_party/antlr4_cypher/include/cypher_lexer.h @@ -19,7 +19,7 @@ class CypherLexer : public antlr4::Lexer { T__26 = 27, T__27 = 28, T__28 = 29, T__29 = 30, T__30 = 31, T__31 = 32, T__32 = 33, T__33 = 34, T__34 = 35, T__35 = 36, T__36 = 37, T__37 = 38, T__38 = 39, T__39 = 40, T__40 = 41, T__41 = 42, T__42 = 43, T__43 = 44, - T__44 = 45, CALL = 46, COMMENT = 47, MACRO = 48, GLOB = 49, COPY = 50, + T__44 = 45, CALL = 46, COMMENT_ = 47, MACRO = 48, GLOB = 49, COPY = 50, FROM = 51, COLUMN = 52, EXPORT = 53, IMPORT = 54, DATABASE = 55, NODE = 56, TABLE = 57, GROUP = 58, RDFGRAPH = 59, DROP = 60, ALTER = 61, DEFAULT = 62, RENAME = 63, ADD = 64, PRIMARY = 65, KEY = 66, REL = 67, TO = 68, EXPLAIN = 69, diff --git a/third_party/antlr4_cypher/include/cypher_parser.h b/third_party/antlr4_cypher/include/cypher_parser.h index 7b1e2a803ff..e38c621b026 100644 --- a/third_party/antlr4_cypher/include/cypher_parser.h +++ b/third_party/antlr4_cypher/include/cypher_parser.h @@ -19,7 +19,7 @@ class CypherParser : public antlr4::Parser { T__26 = 27, T__27 = 28, T__28 = 29, T__29 = 30, T__30 = 31, T__31 = 32, T__32 = 33, T__33 = 34, T__34 = 35, T__35 = 36, T__36 = 37, T__37 = 38, T__38 = 39, T__39 = 40, T__40 = 41, T__41 = 42, T__42 = 43, T__43 = 44, - T__44 = 45, CALL = 46, COMMENT = 47, MACRO = 48, GLOB = 49, COPY = 50, + T__44 = 45, CALL = 46, COMMENT_ = 47, MACRO = 48, GLOB = 49, COPY = 50, FROM = 51, COLUMN = 52, EXPORT = 53, IMPORT = 54, DATABASE = 55, NODE = 56, TABLE = 57, GROUP = 58, RDFGRAPH = 59, DROP = 60, ALTER = 61, DEFAULT = 62, RENAME = 63, ADD = 64, PRIMARY = 65, KEY = 66, REL = 67, TO = 68, EXPLAIN = 69, @@ -427,7 +427,7 @@ class CypherParser : public antlr4::Parser { public: KU_CommentOnContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - antlr4::tree::TerminalNode *COMMENT(); + antlr4::tree::TerminalNode *COMMENT_(); std::vector SP(); antlr4::tree::TerminalNode* SP(size_t i); antlr4::tree::TerminalNode *ON(); @@ -2338,7 +2338,7 @@ class CypherParser : public antlr4::Parser { public: KU_NonReservedKeywordsContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - antlr4::tree::TerminalNode *COMMENT(); + antlr4::tree::TerminalNode *COMMENT_(); antlr4::tree::TerminalNode *COUNT(); antlr4::tree::TerminalNode *NODE(); antlr4::tree::TerminalNode *REL(); From 8f5f64a9dc7248d3aeb60c243f9eb02670c9d16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Tue, 12 Mar 2024 16:23:30 +0800 Subject: [PATCH 019/136] Add multiplaform test report bot (#3027) --- .../workflows/multiplatform-build-test.yml | 473 +++++++++++++----- .../collect-results.py | 68 +++ .../notify-discord.py | 55 ++ tools/python_api/test/test_exception.py | 4 +- 4 files changed, 473 insertions(+), 127 deletions(-) create mode 100644 scripts/multiplatform-test-helper/collect-results.py create mode 100644 scripts/multiplatform-test-helper/notify-discord.py diff --git a/.github/workflows/multiplatform-build-test.yml b/.github/workflows/multiplatform-build-test.yml index a4009cfc528..b730bd021d6 100644 --- a/.github/workflows/multiplatform-build-test.yml +++ b/.github/workflows/multiplatform-build-test.yml @@ -9,118 +9,206 @@ jobs: ubuntu-2004-build-test: name: ubuntu-20.04 runs-on: ubuntu-20.04 + defaults: + run: + shell: bash env: CC: gcc-11 CXX: g++-11 steps: - uses: actions/checkout@v3 + continue-on-error: true - name: Install packages + continue-on-error: true run: | sudo apt-get update sudo apt-get install -y build-essential manpages-dev software-properties-common sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt-get update - sudo apt-get install -y gcc-11 g++-11 python3.9 + sudo apt-get install -y gcc-11 g++-11 + + - uses: actions/setup-python@v5 + continue-on-error: true + with: + python-version: "3.11" - name: Ensure Python dependencies + continue-on-error: true run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu pip install --user -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html - pip install --user backports.zoneinfo - name: Ensure Node.js dependencies + continue-on-error: true working-directory: tools/nodejs_api run: npm install --include=dev - name: Build - run: make release NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make release NUM_THREADS=$(nproc) + echo "Build,$?" > status.txt - name: Test - run: make test NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make test NUM_THREADS=$(nproc) + echo "Test,$?" >> status.txt - name: C and C++ examples - run: make example NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make example NUM_THREADS=$(nproc) + echo "C and C++ examples,$?" >> status.txt - name: Python test - run: make pytest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make pytest NUM_THREADS=$(nproc) + echo "Python test,$?" >> status.txt - name: Node.js test - run: make nodejstest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make nodejstest NUM_THREADS=$(nproc) + echo "Node.js test,$?" >> status.txt - name: Java test - run: make javatest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make javatest NUM_THREADS=$(nproc) + echo "Java test,$?" >> status.txt - name: Rust share build + continue-on-error: true run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]' > Cargo.toml - name: Rust set env + continue-on-error: true run: echo "CARGO_BUILD_JOBS=$(nproc)" >> $GITHUB_ENV - name: Rust test + continue-on-error: true working-directory: tools/rust_api run: | cargo test --release --features arrow -- --test-threads=1 + echo "Rust test,$?" >> ../../status.txt - name: Rust example + continue-on-error: true working-directory: examples/rust - run: cargo build --release --features arrow + run: | + cargo build --release --features arrow + echo "Rust example,$?" >> ../../status.txt + + - name: Rename status.txt + continue-on-error: true + run: mv status.txt ubuntu-20.04.csv + + - uses: actions/upload-artifact@v4 + continue-on-error: true + with: + name: ubuntu-20.04 + path: ubuntu-20.04.csv macos-build-test: strategy: matrix: - runner: [macos-12, macos-13] + runner: [macos-13, macos-14] fail-fast: false name: ${{ matrix.runner }} runs-on: ${{ matrix.runner }} + defaults: + run: + shell: bash steps: - uses: actions/checkout@v3 + continue-on-error: true - uses: actions/setup-python@v4 + continue-on-error: true with: python-version: "3.10" - name: Ensure Python dependencies + continue-on-error: true run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu pip install --user -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html - name: Ensure Node.js dependencies + continue-on-error: true working-directory: tools/nodejs_api run: npm install --include=dev - name: Build - run: make release NUM_THREADS=$(sysctl -n hw.physicalcpu) + continue-on-error: true + run: | + make release NUM_THREADS=$(sysctl -n hw.physicalcpu) + echo "Build,$?" > status.txt - name: Test - run: make test NUM_THREADS=$(sysctl -n hw.physicalcpu) + continue-on-error: true + run: | + make test NUM_THREADS=$(sysctl -n hw.physicalcpu) + echo "Test,$?" >> status.txt - name: C and C++ examples - run: make example NUM_THREADS=$(sysctl -n hw.physicalcpu) + continue-on-error: true + run: | + make example NUM_THREADS=$(sysctl -n hw.physicalcpu) + echo "C and C++ examples,$?" >> status.txt - name: Python test - run: make pytest NUM_THREADS=$(sysctl -n hw.physicalcpu) + continue-on-error: true + run: | + make pytest NUM_THREADS=$(sysctl -n hw.physicalcpu) + echo "Python test,$?" >> status.txt - name: Node.js test - run: make nodejstest NUM_THREADS=$(sysctl -n hw.physicalcpu) + continue-on-error: true + run: | + make nodejstest NUM_THREADS=$(sysctl -n hw.physicalcpu) + echo "Node.js test,$?" >> status.txt - name: Java test - run: make javatest NUM_THREADS=$(sysctl -n hw.physicalcpu) + continue-on-error: true + run: | + make javatest NUM_THREADS=$(sysctl -n hw.physicalcpu) + echo "Java test,$?" >> status.txt - name: Rust share build + continue-on-error: true run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]' > Cargo.toml - name: Rust set env + continue-on-error: true run: echo "CARGO_BUILD_JOBS=$(sysctl -n hw.physicalcpu)" >> $GITHUB_ENV - name: Rust test + continue-on-error: true working-directory: tools/rust_api run: | cargo test --release --features arrow -- --test-threads=1 + echo "Rust test,$?" >> ../../status.txt - name: Rust example + continue-on-error: true working-directory: examples/rust - run: cargo build --release --features arrow + run: | + cargo build --release --features arrow + echo "Rust example,$?" >> ../../status.txt + + - name: Rename status.txt + continue-on-error: true + run: mv status.txt ${{ matrix.runner }}.csv + + - uses: actions/upload-artifact@v4 + continue-on-error: true + with: + name: ${{ matrix.runner }} + path: ${{ matrix.runner }}.csv windows-build-test: strategy: @@ -131,6 +219,7 @@ jobs: runs-on: ${{ matrix.runner }} steps: - name: Disable Windows Defender + continue-on-error: true shell: powershell run: | Set-MpPreference -DisableRealtimeMonitoring $true @@ -145,53 +234,78 @@ jobs: Set-MpPreference -SubmitSamplesConsent NeverSend - uses: actions/checkout@v3 + continue-on-error: true - uses: ilammy/msvc-dev-cmd@v1 + continue-on-error: true - uses: actions/setup-python@v4 + continue-on-error: true with: python-version: "3.10" - name: Ensure Python dependencies + continue-on-error: true shell: cmd run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu pip install --user -r tools\python_api\requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html - name: Ensure Node.js dependencies + continue-on-error: true shell: cmd working-directory: .\tools\nodejs_api run: npm install --include=dev - name: Build + continue-on-error: true shell: cmd - run: make release NUM_THREADS=%NUMBER_OF_PROCESSORS% + run: | + make release NUM_THREADS=%NUMBER_OF_PROCESSORS% + echo Build,%ERRORLEVEL% > status.txt - name: Test + continue-on-error: true shell: cmd - run: make test NUM_THREADS=%NUMBER_OF_PROCESSORS% + run: | + make test NUM_THREADS=%NUMBER_OF_PROCESSORS% + echo Test,%ERRORLEVEL% >> status.txt - name: C and C++ examples + continue-on-error: true shell: cmd - run: make example NUM_THREADS=%NUMBER_OF_PROCESSORS% + run: | + make example NUM_THREADS=%NUMBER_OF_PROCESSORS% + echo C and C++ examples,%ERRORLEVEL% >> status.txt - name: Python test + continue-on-error: true shell: cmd - run: make pytest NUM_THREADS=%NUMBER_OF_PROCESSORS% + run: | + make pytest NUM_THREADS=%NUMBER_OF_PROCESSORS% + echo Python test,%ERRORLEVEL% >> status.txt - name: Node.js test + continue-on-error: true shell: cmd - run: make nodejstest NUM_THREADS=%NUMBER_OF_PROCESSORS% + run: | + make nodejstest NUM_THREADS=%NUMBER_OF_PROCESSORS% + echo Node.js test,%ERRORLEVEL% >> status.txt - name: Java test + continue-on-error: true shell: cmd - run: make javatest NUM_THREADS=%NUMBER_OF_PROCESSORS% + run: | + make javatest NUM_THREADS=%NUMBER_OF_PROCESSORS% + echo Java test,%ERRORLEVEL% >> status.txt - name: Rust share build + continue-on-error: true shell: cmd run: (echo [workspace]& echo members = ["tools/rust_api","examples/rust"]) > Cargo.toml - name: Rust test + continue-on-error: true shell: cmd run: | make clean @@ -199,12 +313,27 @@ jobs: set CXXFLAGS=/std:c++20 set CARGO_BUILD_JOBS=%NUMBER_OF_PROCESSORS% cargo test --release --features arrow -- --test-threads=1 + echo Rust test,%ERRORLEVEL% >> status.txt - name: Rust example + continue-on-error: true shell: cmd run: | set CARGO_BUILD_JOBS=%NUMBER_OF_PROCESSORS% cargo build --release --features arrow + echo Rust example,%ERRORLEVEL% >> status.txt + + - name: Rename status.txt + continue-on-error: true + shell: cmd + run: | + rename status.txt ${{ matrix.runner }}.csv + + - uses: actions/upload-artifact@v4 + continue-on-error: true + with: + name: ${{ matrix.runner }} + path: ${{ matrix.runner }}.csv debian-ubuntu-build-test: strategy: @@ -221,6 +350,7 @@ jobs: JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 steps: - name: Install packages + continue-on-error: true run: | apt-get update apt-get install -y ca-certificates curl gnupg @@ -231,59 +361,101 @@ jobs: apt-get install -y git build-essential cmake gcc g++ python3 python3-dev python3-pip openjdk-17-jdk nodejs - uses: actions/checkout@v3 + continue-on-error: true - name: Ensure Python dependencies + continue-on-error: true run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu ${{ matrix.image != 'debian:11' && '--break-system-packages' || '' }} pip install --user -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html ${{ matrix.image != 'debian:11' && '--break-system-packages' || '' }} - name: Ensure Node.js dependencies working-directory: tools/nodejs_api + continue-on-error: true run: npm install --include=dev - name: Install Rust + continue-on-error: true run: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain echo "$HOME/.cargo/bin" >> $GITHUB_PATH - $HOME/.cargo/bin/rustup toolchain install 1.67 + $HOME/.cargo/bin/rustup toolchain install 1.76 - name: Build - run: make release NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make release NUM_THREADS=$(nproc) + echo "Build,$?" > status.txt - name: Test - run: make test NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make test NUM_THREADS=$(nproc) + echo "Test,$?" >> status.txt - name: C and C++ examples - run: make example NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make example NUM_THREADS=$(nproc) + echo "C and C++ examples,$?" >> status.txt - name: Python test - run: make pytest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make pytest NUM_THREADS=$(nproc) + echo "Python test,$?" >> status.txt - name: Node.js test - run: make nodejstest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make nodejstest NUM_THREADS=$(nproc) + echo "Node.js test,$?" >> status.txt - name: Java test - run: make javatest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make javatest NUM_THREADS=$(nproc) + echo "Java test,$?" >> status.txt - name: Rust share build + continue-on-error: true run: echo '[workspace]\nmembers = ["tools/rust_api","examples/rust"]' > Cargo.toml - name: Rust set env + continue-on-error: true run: echo "CARGO_BUILD_JOBS=$(nproc)" >> $GITHUB_ENV - name: Rust test + continue-on-error: true working-directory: tools/rust_api run: | cargo test --release --features arrow -- --test-threads=1 + echo "Rust test,$?" >> ../../status.txt - name: Rust example + continue-on-error: true working-directory: examples/rust - run: cargo build --release --features arrow + run: | + cargo build --release --features arrow + echo "Rust example,$?" >> ../../status.txt + + - name: Rename status.txt + continue-on-error: true + run: | + PLATFORM=$(echo ${{ matrix.image }} | tr ':' '-') + echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV + mv status.txt $PLATFORM.csv + + - uses: actions/upload-artifact@v4 + continue-on-error: true + with: + name: ${{env.PLATFORM}} + path: ${{env.PLATFORM}}.csv - rhel-fedora-build-test: + rhel-fedora-build-test: strategy: matrix: - image: ["rockylinux:8", "rockylinux:9", "fedora:38"] + image: ["rockylinux:8", "rockylinux:9", "fedora:38", "fedora:39"] fail-fast: false name: ${{ matrix.image }} runs-on: ubuntu-latest @@ -296,6 +468,7 @@ jobs: HOME: /root steps: - name: Enable EPEL + continue-on-error: true if: ${{ matrix.image == 'rockylinux:8' || matrix.image == 'rockylinux:9' }} run: | dnf update -y @@ -303,150 +476,121 @@ jobs: dnf update -y - name: Enable SHA-1 on Rocky Linux 9 + continue-on-error: true if: matrix.image == 'rockylinux:9' run: update-crypto-policies --set LEGACY - name: Install packages + continue-on-error: true run: | curl -fsSL https://rpm.nodesource.com/setup_20.x | bash - - dnf install -y git cmake ${{ matrix.image == 'rockylinux:8' && 'gcc-toolset-12 python39 python39-devel' || 'gcc gcc-c++ python3-devel' }} java-17-openjdk-devel nodejs + dnf install -y git cmake ${{ matrix.image == 'rockylinux:8' && 'gcc-toolset-12 python3.11 python3.11-devel' || 'gcc gcc-c++ python3-devel' }} java-17-openjdk-devel nodejs - - name: Enable gcc-toolset-12 and python39 on Rocky Linux 8 + - name: Enable gcc-toolset-12 and python3.11 on Rocky Linux 8 + continue-on-error: true if: matrix.image == 'rockylinux:8' run: | - alternatives --set python /usr/bin/python3.9 - alternatives --set python3 /usr/bin/python3.9 - echo "PYTHON_EXECUTABLE=/usr/bin/python3.9" >> $GITHUB_ENV - echo "PYBIND11_PYTHON_VERSION=3.9" >> $GITHUB_ENV + alternatives --set python /usr/bin/python3.11 + alternatives --set python3 /usr/bin/python3.11 + echo "PYTHON_EXECUTABLE=/usr/bin/python3.11" >> $GITHUB_ENV + echo "PYBIND11_PYTHON_VERSION=3.11" >> $GITHUB_ENV source /opt/rh/gcc-toolset-12/enable echo $PATH >> $GITHUB_PATH - uses: actions/checkout@v3 + continue-on-error: true - name: Ensure Python dependencies + continue-on-error: true run: | python3 -m venv /opt/venv source /opt/venv/bin/activate - pip3 install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu - pip3 install -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html + pip3 install torch~=2.2.1 --extra-index-url https://download.pytorch.org/whl/cpu + pip3 install -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.2.1+cpu.html - name: Ensure Node.js dependencies + continue-on-error: true working-directory: tools/nodejs_api run: npm install --include=dev - name: Install Rust + continue-on-error: true run: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain echo "$HOME/.cargo/bin" >> $GITHUB_PATH - $HOME/.cargo/bin/rustup toolchain install 1.67 + $HOME/.cargo/bin/rustup toolchain install 1.76 - name: Build - run: make release NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make release NUM_THREADS=$(nproc) + echo "Build,$?" > status.txt - name: Test - run: make test NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make test NUM_THREADS=$(nproc) + echo "Test,$?" >> status.txt - name: C and C++ examples - run: make example NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make example NUM_THREADS=$(nproc) + echo "C and C++ examples,$?" >> status.txt - name: Python test + continue-on-error: true run: | source /opt/venv/bin/activate make pytest NUM_THREADS=$(nproc) + echo "Python test,$?" >> status.txt - name: Node.js test - run: make nodejstest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make nodejstest NUM_THREADS=$(nproc) + echo "Node.js test,$?" >> status.txt - name: Java test - run: make javatest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make javatest NUM_THREADS=$(nproc) + echo "Java test,$?" >> status.txt - name: Rust share build + continue-on-error: true run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]' > Cargo.toml - name: Rust set env + continue-on-error: true run: echo "CARGO_BUILD_JOBS=$(nproc)" >> $GITHUB_ENV - name: Rust test + continue-on-error: true working-directory: tools/rust_api run: | cargo test --release --features arrow -- --test-threads=1 + echo "Rust test,$?" >> ../../status.txt - name: Rust example + continue-on-error: true working-directory: examples/rust - run: cargo build --release --features arrow - - centos-7-build-test: - name: centos-7 - runs-on: ubuntu-latest - container: - image: quay.io/pypa/manylinux2014_x86_64 - env: - CC: gcc - CXX: g++ - PYBIND11_PYTHON_VERSION: 3.10 - PYTHON_EXECUTABLE: /usr/local/bin/python3.10 - JAVA_HOME: /usr/lib/jvm/java-11-openjdk - steps: - - name: Install packages - run: | - yum update -y - yum install -y npm java-11-openjdk-devel devtoolset-11 - - - name: Enable gcc-toolset-11 run: | - source /opt/rh/devtoolset-11/enable - echo $PATH >> $GITHUB_PATH - - - uses: actions/checkout@v3 - - - name: Ensure Python dependencies - run: | - ln -s /usr/local/bin/python3.10 /usr/bin/python3 - python3 -m pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu - python3 -m pip install --user -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html - - - name: Ensure Node.js dependencies - working-directory: tools/nodejs_api - run: npm install --include=dev - - - name: Install Rust - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain - echo "$HOME/.cargo/bin" >> $GITHUB_PATH - $HOME/.cargo/bin/rustup toolchain install 1.67 - - - name: Build - run: make release NUM_THREADS=$(nproc) - - - name: Test - run: make test NUM_THREADS=$(nproc) - - - name: C and C++ examples - run: make example NUM_THREADS=$(nproc) - - - name: Python test - run: make pytest NUM_THREADS=$(nproc) - - - name: Node.js test - run: make nodejstest NUM_THREADS=$(nproc) - - - name: Java test - run: make javatest NUM_THREADS=$(nproc) - - - name: Rust share build - run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]' > Cargo.toml - - - name: Rust set env - run: echo "CARGO_BUILD_JOBS=$(nproc)" >> $GITHUB_ENV + cargo build --release --features arrow + echo "Rust example,$?" >> ../../status.txt - - name: Rust test - working-directory: tools/rust_api + - name: Rename status.txt + continue-on-error: true run: | - cargo test --release --features arrow -- --test-threads=1 + PLATFORM=$(echo ${{ matrix.image }} | tr ':' '-') + echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV + mv status.txt $PLATFORM.csv - - name: Rust example - working-directory: examples/rust - run: cargo build --release --features arrow + - uses: actions/upload-artifact@v4 + continue-on-error: true + with: + name: ${{env.PLATFORM}} + path: ${{env.PLATFORM}}.csv archlinux-build-test: name: archlinux @@ -459,56 +603,135 @@ jobs: JAVA_HOME: /usr/lib/jvm/java-17-openjdk steps: - name: Install packages + continue-on-error: true run: | pacman -Syu --noconfirm pacman -S --needed --noconfirm git base-devel cmake gcc python python-pip npm jdk17-openjdk - uses: actions/checkout@v3 + continue-on-error: true - name: Ensure Python dependencies + continue-on-error: true run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu --break-system-packages pip install --user -r tools/python_api/requirements_dev.txt -f https://data.pyg.org/whl/torch-2.0.0+cpu.html --break-system-packages - name: Ensure Node.js dependencies + continue-on-error: true working-directory: tools/nodejs_api run: npm install --include=dev - name: Install Rust + continue-on-error: true run: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-update-default-toolchain echo "$HOME/.cargo/bin" >> $GITHUB_PATH - $HOME/.cargo/bin/rustup toolchain install 1.67 + $HOME/.cargo/bin/rustup toolchain install 1.76 - name: Build - run: make release NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make release NUM_THREADS=$(nproc) + echo "Build,$?" > status.txt - name: Test - run: make test NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make test NUM_THREADS=$(nproc) + echo "Test,$?" >> status.txt - name: C and C++ examples - run: make example NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make example NUM_THREADS=$(nproc) + echo "C and C++ examples,$?" >> status.txt - name: Python test - run: make pytest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make pytest NUM_THREADS=$(nproc) + echo "Python test,$?" >> status.txt - name: Node.js test - run: make nodejstest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make nodejstest NUM_THREADS=$(nproc) + echo "Node.js test,$?" >> status.txt - name: Java test - run: make javatest NUM_THREADS=$(nproc) + continue-on-error: true + run: | + make javatest NUM_THREADS=$(nproc) + echo "Java test,$?" >> status.txt - name: Rust share build + continue-on-error: true run: echo $'[workspace]\nmembers = ["tools/rust_api","examples/rust"]' > Cargo.toml - name: Rust set env + continue-on-error: true run: echo "CARGO_BUILD_JOBS=$(nproc)" >> $GITHUB_ENV - name: Rust test working-directory: tools/rust_api + continue-on-error: true run: | cargo test --release --features arrow -- --test-threads=1 + echo "Rust test,$?" >> ../../status.txt - name: Rust example working-directory: examples/rust - run: cargo build --release --features arrow + continue-on-error: true + run: | + cargo build --release --features arrow + echo "Rust example,$?" >> ../../status.txt + + - name: Rename status.txt + continue-on-error: true + run: | + mv status.txt archlinux.csv + + - uses: actions/upload-artifact@v4 + continue-on-error: true + with: + name: archlinux + path: archlinux.csv + + collect-results: + runs-on: ubuntu-latest + env: + DISCORD_CHANNEL_ID: ${{ secrets.DISCORD_CHANNEL_ID }} + DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }} + GITHUB_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + needs: + [ + ubuntu-2004-build-test, + macos-build-test, + windows-build-test, + debian-ubuntu-build-test, + rhel-fedora-build-test, + archlinux-build-test, + ] + steps: + - uses: actions/checkout@v3 + + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: results + + - name: List artifacts + run: ls -R results + + - name: Create summary + run: | + pip3 install pandas tabulate discord.py + python3 scripts/multiplatform-test-helper/collect-results.py results + python3 scripts/multiplatform-test-helper/notify-discord.py results.json + + - name: Upload summary + uses: actions/upload-artifact@v4 + with: + name: results + path: results.md diff --git a/scripts/multiplatform-test-helper/collect-results.py b/scripts/multiplatform-test-helper/collect-results.py new file mode 100644 index 00000000000..968ed4a6b8b --- /dev/null +++ b/scripts/multiplatform-test-helper/collect-results.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +import os +import sys +import pandas as pd +import json + + +def main(): + if len(sys.argv) != 2: + print("Usage: collect-results.py ") + sys.exit(1) + if not os.path.isdir(sys.argv[1]): + print(f"Error: {sys.argv[1]} is not a directory") + sys.exit(1) + results_dir = sys.argv[1] + results_df_hash = {} + results_exit_codes_hash = {} + results_summary = {} + stages = [] + for root, _, files in os.walk(results_dir): + for csv_file in files: + if not csv_file.endswith(".csv"): + continue + platform = csv_file.split(".")[0] + df = pd.read_csv(os.path.join(root, csv_file), header=None) + df.columns = ["stage", "exit_code"] + results_df_hash[platform] = df + + for platform, df in results_df_hash.items(): + for stage, exit_code in df.values: + if stage not in stages: + stages.append(stage) + if platform not in results_exit_codes_hash: + results_exit_codes_hash[platform] = {} + results_exit_codes_hash[platform][stage] = int(exit_code) + + for platform in results_df_hash.keys(): + results_summary[platform] = [] + for stage in stages: + status = ( + "✅" + if stage in results_exit_codes_hash[platform] + and results_exit_codes_hash[platform][stage] == 0 + else "❌" + ) + results_summary[platform].append({"stage": stage, "status": status}) + + summary_df = {"stage": stages} + for platform, summary in results_summary.items(): + df = pd.DataFrame(summary) + status = df["status"] + summary_df[platform] = status + summary_df = pd.DataFrame(summary_df) + summary_df.index = summary_df["stage"] + del summary_df["stage"] + summary_df.index.name = None + + markdown = summary_df.to_markdown() + with open("results.md", "w") as f: + f.write(markdown) + + with open("results.json", "w") as f: + json.dump(results_summary, f, indent=4) + + +if __name__ == "__main__": + main() diff --git a/scripts/multiplatform-test-helper/notify-discord.py b/scripts/multiplatform-test-helper/notify-discord.py new file mode 100644 index 00000000000..a5046b044ed --- /dev/null +++ b/scripts/multiplatform-test-helper/notify-discord.py @@ -0,0 +1,55 @@ +import discord +import os +import json +import sys + +TOKEN = os.getenv("DISCORD_BOT_TOKEN") +CHANNEL_ID = os.getenv("DISCORD_CHANNEL_ID") +GITHUB_URL = os.getenv("GITHUB_URL") + +messages = [] + + +if __name__ == "__main__": + if not len(sys.argv) == 2: + print("Usage: python send-dicord-notification.py ") + sys.exit(1) + if not os.path.isfile(sys.argv[1]): + print(f"Error: {sys.argv[1]} is not a file") + sys.exit(1) + if not TOKEN: + print("Error: DISCORD_BOT_TOKEN is not set") + sys.exit(1) + + if not CHANNEL_ID: + print("Error: DISCORD_CHANNEL_ID is not set") + sys.exit(1) + client = discord.Client(intents=discord.Intents.default()) + + @client.event + async def on_ready(): + channel = client.get_channel(int(CHANNEL_ID)) + for message in messages: + try: + await channel.send(message) + except Exception as e: + print(f"Error: {e}") + sys.exit(1) + await client.close() + + message = "" + message += "## Multiplatform test result:\n" + with open(sys.argv[1], "r") as f: + result = json.load(f) + for platform in result: + if len(message) >= 1500: + messages.append(message) + message = "" + message += f"- **{platform}**:\n" + for r in result[platform]: + message += f" - {r['stage']}: {r['status']}\n" + if GITHUB_URL: + message += f" [Github]({GITHUB_URL})" + if message: + messages.append(message) + client.run(TOKEN) diff --git a/tools/python_api/test/test_exception.py b/tools/python_api/test/test_exception.py index 46f493f4ae7..1d3dd14868b 100644 --- a/tools/python_api/test/test_exception.py +++ b/tools/python_api/test/test_exception.py @@ -14,13 +14,13 @@ def test_exception(establish_connection): def test_db_path_exception(): - path = '/:* /? " < > |' + path = "" if sys.platform == "win32": error_message = 'Failed to create directory' else: error_message = 'filesystem error' with pytest.raises(RuntimeError, match=error_message): - kuzu.Database(str(path)) + kuzu.Database(path) def test_read_only_exception(establish_connection): # TODO: Enable this test on Windows when the read-only mode is implemented. From 3bdc752f027c8fc033fd09d6dd87eff6971308b6 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Tue, 12 Mar 2024 13:35:21 +0400 Subject: [PATCH 020/136] Python API typing, lint, config/makefile (#3023) * Python API typing, lint, config/makefile * Fix pyproject.toml for wheel building * Add linter check on CI --------- Co-authored-by: Chang Liu --- .github/workflows/ci-workflow.yml | 33 +- .gitignore | 1 + scripts/pip-package/package_tar.py | 28 +- tools/python_api/Makefile | 42 ++ tools/python_api/pyproject.toml | 97 +++ tools/python_api/requirements_dev.txt | 18 +- tools/python_api/src_cpp/py_connection.cpp | 2 +- tools/python_api/src_py/__init__.py | 37 +- tools/python_api/src_py/connection.py | 91 ++- tools/python_api/src_py/database.py | 149 ++-- tools/python_api/src_py/prepared_statement.py | 19 +- tools/python_api/src_py/py.typed | 0 tools/python_api/src_py/query_result.py | 141 ++-- .../src_py/torch_geometric_feature_store.py | 112 +-- .../src_py/torch_geometric_graph_store.py | 112 +-- .../torch_geometric_result_converter.py | 177 ++--- tools/python_api/src_py/types.py | 1 + tools/python_api/test/conftest.py | 162 +++-- tools/python_api/test/example.py | 7 +- tools/python_api/test/ground_truth.py | 643 +++++++++-------- tools/python_api/test/test_arrow.py | 199 ++++-- tools/python_api/test/test_datatype.py | 251 +++---- tools/python_api/test/test_df.py | 654 +++++++++++------- tools/python_api/test/test_exception.py | 34 +- tools/python_api/test/test_extension.py | 7 +- tools/python_api/test/test_get_header.py | 57 +- tools/python_api/test/test_helper.py | 4 +- tools/python_api/test/test_networkx.py | 366 ++++++---- tools/python_api/test/test_parameter.py | 44 +- .../test/test_prepared_statement.py | 65 +- tools/python_api/test/test_query_result.py | 16 +- .../test/test_query_result_close.py | 53 +- tools/python_api/test/test_scan_pandas.py | 390 +++++++---- tools/python_api/test/test_timeout.py | 12 +- tools/python_api/test/test_torch_geometric.py | 650 ++++++++++------- .../test_torch_geometric_remote_backend.py | 74 +- tools/python_api/test/test_version.py | 3 +- tools/python_api/test/type_aliases.py | 10 + 38 files changed, 2869 insertions(+), 1892 deletions(-) create mode 100644 tools/python_api/Makefile create mode 100644 tools/python_api/pyproject.toml create mode 100644 tools/python_api/src_py/py.typed create mode 100644 tools/python_api/test/type_aliases.py diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index b25ae646230..aec034dfc39 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -24,7 +24,7 @@ concurrency: jobs: gcc-build-test: name: gcc build & test - needs: [clang-formatting-check, sanity-checks] + needs: [clang-formatting-check, sanity-checks, python-lint-check] runs-on: kuzu-self-hosted-testing env: NUM_THREADS: 32 @@ -95,10 +95,10 @@ jobs: - name: Start Docker container run: | - docker run -d --name kuzu-x86 \ - -v $PWD:/kuzu -w /kuzu \ - -e NUM_THREADS=2 -e GEN=ninja -e CC=gcc -e CXX=g++ \ - i386/debian:latest tail -f /dev/null + docker run -d --name kuzu-x86 \ + -v $PWD:/kuzu -w /kuzu \ + -e NUM_THREADS=2 -e GEN=ninja -e CC=gcc -e CXX=g++ \ + i386/debian:latest tail -f /dev/null - name: Install dependencies run: | @@ -161,7 +161,7 @@ jobs: clang-build-test: name: clang build and test - needs: [clang-formatting-check, sanity-checks] + needs: [clang-formatting-check, sanity-checks, python-lint-check] runs-on: kuzu-self-hosted-testing env: NUM_THREADS: 32 @@ -209,7 +209,7 @@ jobs: msvc-build-test: name: msvc build & test - needs: [clang-formatting-check, sanity-checks] + needs: [clang-formatting-check, sanity-checks, python-lint-check] runs-on: self-hosted-windows env: # Shorten build path as much as possible @@ -343,6 +343,23 @@ jobs: - name: Check extension format run: python3 scripts/run-clang-format.py --clang-format-executable /usr/bin/clang-format-11 -r extension/ + python-lint-check: + name: python lint check + runs-on: macos-14 + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: "3.11" + + - name: Run Python lint + working-directory: tools/python_api + run: | + make requirements + ./.venv/bin/ruff check src_py test --verbose + rustfmt-check: name: rustfmt check runs-on: ubuntu-22.04 @@ -399,7 +416,7 @@ jobs: macos-build-test: name: apple clang build & test - needs: [clang-formatting-check, sanity-checks, rustfmt-check] + needs: [clang-formatting-check, sanity-checks, rustfmt-check, python-lint-check] runs-on: self-hosted-mac-x64 env: NUM_THREADS: 32 diff --git a/.gitignore b/.gitignore index a073684b3d1..6c496cb8e21 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ compile_commands.json ### Python # Byte-compiled / optimized / DLL files __pycache__/ +.venv/ *.py[cod] *$py.class cmake-build-debug/ diff --git a/scripts/pip-package/package_tar.py b/scripts/pip-package/package_tar.py index 3bb5771d17e..243131c90b9 100755 --- a/scripts/pip-package/package_tar.py +++ b/scripts/pip-package/package_tar.py @@ -9,21 +9,23 @@ base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + def _get_kuzu_version(): - cmake_file = os.path.abspath(os.path.join(base_dir, '..', 'CMakeLists.txt')) + cmake_file = os.path.abspath(os.path.join(base_dir, "..", "CMakeLists.txt")) with open(cmake_file) as f: for line in f: - if line.startswith('project(Kuzu VERSION'): - raw_version = line.split(' ')[2].strip() - version_nums = raw_version.split('.') + if line.startswith("project(Kuzu VERSION"): + raw_version = line.split(" ")[2].strip() + version_nums = raw_version.split(".") if len(version_nums) <= 3: return raw_version else: dev_suffix = version_nums[3] - version = '.'.join(version_nums[:3]) + version = ".".join(version_nums[:3]) version += ".dev%s" % dev_suffix return version + if __name__ == "__main__": if len(sys.argv) == 2: file_name = sys.argv[1] @@ -53,8 +55,22 @@ def _get_kuzu_version(): os.makedirs(os.path.join(tempdir, "kuzu")) for path in ["setup.py", "setup.cfg", "MANIFEST.in"]: shutil.copy2(path, os.path.join(tempdir, path)) - shutil.copy2("../../LICENSE", os.path.join(tempdir, "LICENSE.txt")) + shutil.copy2("../../LICENSE", os.path.join(tempdir, "LICENSE")) shutil.copy2("../../README.md", os.path.join(tempdir, "README.md")) + + shutil.copy2( + "../../tools/python_api/pyproject.toml", + os.path.join(tempdir, "pyproject.toml"), + ) + # Update the version in pyproject.toml + with open(os.path.join(tempdir, "pyproject.toml"), "r") as f: + lines = f.readlines() + with open(os.path.join(tempdir, "pyproject.toml"), "w") as f: + for line in lines: + if line.startswith("version ="): + f.write('version = "%s"\n' % _get_kuzu_version()) + else: + f.write(line) shutil.copy2("README.md", os.path.join(tempdir, "README_PYTHON_BUILD.md")) subprocess.check_call([sys.executable, "setup.py", "egg_info"], cwd=tempdir) diff --git a/tools/python_api/Makefile b/tools/python_api/Makefile new file mode 100644 index 00000000000..fbf95585adf --- /dev/null +++ b/tools/python_api/Makefile @@ -0,0 +1,42 @@ +.DEFAULT_GOAL := help + +PYTHONPATH= +SHELL=/bin/bash +VENV=.venv + +ifeq ($(OS),Windows_NT) + VENV_BIN=$(VENV)/Scripts +else + VENV_BIN=$(VENV)/bin +endif + +.venv: ## Set up a Python virtual environment and install dev packages + python3 -m venv $(VENV) + $(MAKE) requirements + +.PHONY: requirements +requirements: .venv ## Install/update Python dev packages + @unset CONDA_PREFIX \ + && $(VENV_BIN)/python -m pip install -U uv \ + && $(VENV_BIN)/uv pip install --upgrade -r requirements_dev.txt \ + +.PHONY: lint +lint: ## Apply autoformatting and linting rules + $(VENV_BIN)/ruff check src_py test + $(VENV_BIN)/ruff format src_py test + -$(VENV_BIN)/mypy src_py test + +.PHONY: build +build: ## Compile kuzu (and install in 'build') for Python + $(MAKE) -C ../../ python + cp src_py/*.py build/kuzu/ + +.PHONY: test +test: ## Run the Python unit tests + cp src_py/*.py build/kuzu/ && cd build + $(VENV_BIN)/pytest test + +.PHONY: help +help: ## Display this help information + @echo -e "\033[1mAvailable commands:\033[0m" + @grep -E '^[a-z.A-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-18s\033[0m %s\n", $$1, $$2}' | sort diff --git a/tools/python_api/pyproject.toml b/tools/python_api/pyproject.toml new file mode 100644 index 00000000000..29f8a5ac578 --- /dev/null +++ b/tools/python_api/pyproject.toml @@ -0,0 +1,97 @@ +[project] +name = "kuzu" +description = "Highly scalable, extremely fast, easy-to-use embeddable graph database" +readme = "README.md" +license = { file = "LICENSE" } +keywords = ["graph", "database"] +version = "0.0.1" + +[project.urls] +Homepage = "https://kuzudb.com/" +Documentation = "https://docs.kuzudb.com/" +Repository = "https://github.com/kuzudb/kuzu" +Changelog = "https://github.com/kuzudb/kuzu/releases" + +[tool.mypy] +files = ["src_py", "test"] +strict = true +enable_error_code = [ + "redundant-expr", + "truthy-bool", + "ignore-without-code", +] +disable_error_code = [ + "import-not-found", + "no-any-return", +] + +[[tool.mypy.overrides]] +module = [ + "_kuzu.*", + "networkx.*", + "pandas.*", + "pyarrow.*", + "pytz.*", + "torch_geometric.*", +] +ignore_missing_imports = true + +[tool.ruff] +line-length = 119 +preview = true +fix = true + +[tool.ruff.lint] +select = [ + "E", # pycodestyle + "W", # pycodestyle + "F", # Pyflakes + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "D", # flake8-docstrings + "D213", # Augment NumPy docstring convention: Multi-line docstring summary should start at the second line + "D417", # Augment NumPy docstring convention: Missing argument descriptions + "I", # isort + "SIM", # flake8-simplify + "TCH", # flake8-type-checking + "TID", # flake8-tidy-imports + "UP", # pyupgrade + "PT", # flake8-pytest-style + "RUF", # Ruff-specific rules + "PTH", # flake8-use-pathlib + "FA", # flake8-future-annotations + "PIE", # flake8-pie + "TD", # flake8-todos + "TRY", # tryceratops + "EM", # flake8-errmsg + "FBT001", # flake8-boolean-trap +] +ignore = [ + "D401", # First line should be in imperative mood + "D105", # Missing docstring in magic method + "D100", # Missing docstring in public module + "D104", # Missing docstring in public package + "D205", # 1 blank line required between summary line and description + "TD002", # Missing author in TODO + "TD003", # Missing issue link on the line following TODO +] + +[tool.ruff.lint.per-file-ignores] +"test/**/*.py" = ["D100", "D102", "D103", "E501", "F841", "TCH002"] +"src_py/torch_geo*.py" = ["E501", "FBT001"] + +[tool.ruff.lint.pycodestyle] +max-doc-length = 119 + +[tool.ruff.lint.pydocstyle] +convention = "numpy" + +[tool.ruff.lint.flake8-type-checking] +strict = true + +[tool.ruff.format] +docstring-code-format = true + +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/tools/python_api/requirements_dev.txt b/tools/python_api/requirements_dev.txt index 00501dea8f3..7643f05bccf 100644 --- a/tools/python_api/requirements_dev.txt +++ b/tools/python_api/requirements_dev.txt @@ -1,8 +1,16 @@ -pybind11>=2.6.0 -pytest +# required for tests +networkx~=3.0 +numpy pandas polars -networkx~=3.0.0 -numpy -pyarrow==14.0.1 +pyarrow>=14 +pybind11>=2.6.0 +pytest +torch torch-geometric~=2.3.0 +setuptools~=69.0 + +# required for lint/formatting +ruff==0.3.2 +mypy==1.9.0 +uv==0.1.17 diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 6517cd09533..2a86c4d7047 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -165,7 +165,7 @@ std::unordered_map> transformPythonParameter if (!py::isinstance(key)) { // TODO(Chang): remove ROLLBACK once we can guarantee database is deleted after conn conn->query("ROLLBACK"); - throw std::runtime_error("Parameter name must be of type string but get " + + throw std::runtime_error("Parameter name must be of type string but got " + py::str(key.get_type()).cast()); } auto name = key.cast(); diff --git a/tools/python_api/src_py/__init__.py b/tools/python_api/src_py/__init__.py index 899bc394bce..525dcc7f4b5 100644 --- a/tools/python_api/src_py/__init__.py +++ b/tools/python_api/src_py/__init__.py @@ -1,5 +1,5 @@ """ -# Kùzu Python API bindings +# Kùzu Python API bindings. This package provides a Python API for Kùzu graph database management system. @@ -12,7 +12,7 @@ ```python import kuzu -db = kuzu.Database('./test') +db = kuzu.Database("./test") conn = kuzu.Connection(db) # Define the schema @@ -28,7 +28,7 @@ conn.execute('COPY LivesIn FROM "lives-in.csv"') # Query the data -results = conn.execute('MATCH (u:User) RETURN u.name, u.age;') +results = conn.execute("MATCH (u:User) RETURN u.name, u.age;") while results.has_next(): print(results.get_next()) ``` @@ -37,8 +37,10 @@ """ -import sys +from __future__ import annotations + import os +import sys # Set RTLD_GLOBAL and RTLD_LAZY flags on Linux to fix the issue with loading # extensions @@ -46,20 +48,33 @@ original_dlopen_flags = sys.getdlopenflags() sys.setdlopenflags(os.RTLD_GLOBAL | os.RTLD_LAZY) -from .database import * -from .connection import * -from .query_result import * -from .types import * +from .connection import Connection +from .database import Database +from .prepared_statement import PreparedStatement +from .query_result import QueryResult +from .types import Type -def __getattr__(name): + +def __getattr__(name: str) -> str | int: if name == "version": return Database.get_version() elif name == "storage_version": return Database.get_storage_version() else: - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") - + msg = f"module {__name__!r} has no attribute {name!r}" + raise AttributeError(msg) + # Restore the original dlopen flags if sys.platform == "linux": sys.setdlopenflags(original_dlopen_flags) + +__all__ = [ + "Connection", + "Database", + "PreparedStatement", + "QueryResult", + "Type", + "storage_version", + "version", +] diff --git a/tools/python_api/src_py/connection.py b/tools/python_api/src_py/connection.py index 102073d86dd..4a8154325af 100644 --- a/tools/python_api/src_py/connection.py +++ b/tools/python_api/src_py/connection.py @@ -1,15 +1,22 @@ -from .query_result import QueryResult -from .prepared_statement import PreparedStatement +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + from . import _kuzu +from .prepared_statement import PreparedStatement +from .query_result import QueryResult + +if TYPE_CHECKING: + from .database import Database class Connection: - """ - Connection to a database. - """ + """Connection to a database.""" - def __init__(self, database, num_threads=0): + def __init__(self, database: Database, num_threads: int = 0): """ + Initialise kuzu database connection. + Parameters ---------- database : Database @@ -19,27 +26,22 @@ def __init__(self, database, num_threads=0): Maximum number of threads to use for executing queries. """ - + self._connection: Any = None # (type: _kuzu.Connection from pybind11) self.database = database self.num_threads = num_threads - self._connection = None self.init_connection() - def __getstate__(self): - state = { - "database": self.database, - "num_threads": self.num_threads, - "_connection": None - } + def __getstate__(self) -> dict[str, Any]: + state = {"database": self.database, "num_threads": self.num_threads, "_connection": None} return state - def init_connection(self): + def init_connection(self) -> None: + """Establish a connection to the database, if not already initalised.""" self.database.init_database() if self._connection is None: - self._connection = _kuzu.Connection( - self.database._database, self.num_threads) + self._connection = _kuzu.Connection(self.database._database, self.num_threads) # type: ignore[union-attr] - def set_max_threads_for_exec(self, num_threads): + def set_max_threads_for_exec(self, num_threads: int) -> None: """ Set the maximum number of threads for executing queries. @@ -52,7 +54,11 @@ def set_max_threads_for_exec(self, num_threads): self.init_connection() self._connection.set_max_threads_for_exec(num_threads) - def execute(self, query, parameters={}): + def execute( + self, + query: str | PreparedStatement, + parameters: dict[str, Any] | None = None, + ) -> QueryResult: """ Execute a query. @@ -72,21 +78,23 @@ def execute(self, query, parameters={}): Query result. """ + if parameters is None: + parameters = {} + self.init_connection() - if type(parameters) != dict: + if not isinstance(parameters, dict): # TODO(Chang): remove ROLLBACK once we can guarantee database is deleted after conn self._connection.execute(self.prepare("ROLLBACK")._prepared_statement, {}) - raise RuntimeError("Parameters must be a dict") - prepared_statement = self.prepare( - query) if type(query) == str else query - _query_result = self._connection.execute( - prepared_statement._prepared_statement, - parameters) + msg = f"Parameters must be a dict; found {type(parameters)}." + raise RuntimeError(msg) # noqa: TRY004 + + prepared_statement = self.prepare(query) if isinstance(query, str) else query + _query_result = self._connection.execute(prepared_statement._prepared_statement, parameters) if not _query_result.isSuccess(): raise RuntimeError(_query_result.getErrorMessage()) return QueryResult(self, _query_result) - def prepare(self, query): + def prepare(self, query: str) -> PreparedStatement: """ Create a prepared statement for a query. @@ -101,22 +109,19 @@ def prepare(self, query): Prepared statement. """ - return PreparedStatement(self, query) - def _get_node_property_names(self, table_name): - PRIMARY_KEY_SYMBOL = "(PRIMARY KEY)" + def _get_node_property_names(self, table_name: str) -> dict[str, Any]: LIST_START_SYMBOL = "[" LIST_END_SYMBOL = "]" self.init_connection() - query_result = self.execute( - "CALL table_info('%s') RETURN *;" % table_name) + query_result = self.execute(f"CALL table_info('{table_name}') RETURN *;") results = {} while query_result.has_next(): row = query_result.get_next() prop_name = row[1] prop_type = row[2] - is_primary_key = row[3] == True + is_primary_key = row[3] is True dimension = prop_type.count(LIST_START_SYMBOL) splitted = prop_type.split(LIST_START_SYMBOL) shape = [] @@ -127,16 +132,12 @@ def _get_node_property_names(self, table_name): if s != "": shape.append(int(s)) prop_type = splitted[0] - results[prop_name] = { - "type": prop_type, - "dimension": dimension, - "is_primary_key": is_primary_key - } + results[prop_name] = {"type": prop_type, "dimension": dimension, "is_primary_key": is_primary_key} if len(shape) > 0: results[prop_name]["shape"] = tuple(shape) return results - def _get_node_table_names(self): + def _get_node_table_names(self) -> list[Any]: results = [] self.init_connection() query_result = self.execute("CALL show_tables() RETURN *;") @@ -146,7 +147,7 @@ def _get_node_table_names(self): results.append(row[0]) return results - def _get_rel_table_names(self): + def _get_rel_table_names(self) -> list[dict[str, Any]]: results = [] self.init_connection() tables_result = self.execute("CALL show_tables() RETURN *;") @@ -158,14 +159,10 @@ def _get_rel_table_names(self): src_dst_row = connections_result.get_next() src_node = src_dst_row[0] dst_node = src_dst_row[1] - results.append({ - "name": name, - "src": src_node, - "dst": dst_node - }) + results.append({"name": name, "src": src_node, "dst": dst_node}) return results - def set_query_timeout(self, timeout_in_ms): + def set_query_timeout(self, timeout_in_ms: int) -> None: """ Set the query timeout value in ms for executing queries. @@ -173,7 +170,7 @@ def set_query_timeout(self, timeout_in_ms): ---------- timeout_in_ms : int query timeout value in ms for executing queries. - + """ self.init_connection() self._connection.set_query_timeout(timeout_in_ms) diff --git a/tools/python_api/src_py/database.py b/tools/python_api/src_py/database.py index 2b0b4470f22..64fc3911619 100644 --- a/tools/python_api/src_py/database.py +++ b/tools/python_api/src_py/database.py @@ -1,23 +1,47 @@ +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING, Any + from . import _kuzu from .types import Type +if TYPE_CHECKING: + from numpy.typing import NDArray + from torch_geometric.data.feature_store import IndexType -class Database: - """ - Kùzu database instance. - """ + from .torch_geometric_feature_store import KuzuFeatureStore + from .torch_geometric_graph_store import KuzuGraphStore - def __init__(self, database_path, buffer_pool_size=0, max_num_threads=0, compression=True, lazy_init=False, - read_only=False, max_db_size= 1 << 43): + +class Database: + """Kùzu database instance.""" + + def __init__( + self, + database_path: str | Path, + *, + buffer_pool_size: int = 0, + max_num_threads: int = 0, + compression: bool = True, + lazy_init: bool = False, + read_only: bool = False, + max_db_size: int = (1 << 43), + ): """ Parameters ---------- - database_path : str + database_path : str, Path The path to database files buffer_pool_size : int - The maximum size of buffer pool in bytes (Optional). Default to 80% - of system memory. + The maximum size of buffer pool in bytes. Defaults to ~80% of system memory. + + max_num_threads : int + The maximum number of threads to use for executing queries. + + compression : bool + Enable database compression. lazy_init : bool If True, the database will not be initialized until the first query. @@ -41,17 +65,22 @@ def __init__(self, database_path, buffer_pool_size=0, max_num_threads=0, compres environment and 1GB under 32-bit one. """ + if isinstance(database_path, Path): + database_path = str(database_path) + self.database_path = database_path self.buffer_pool_size = buffer_pool_size self.max_num_threads = max_num_threads self.compression = compression self.read_only = read_only self.max_db_size = max_db_size - self._database = None + + self._database: Any = None # (type: _kuzu.Database from pybind11) if not lazy_init: self.init_database() - - def get_version(): + + @staticmethod + def get_version() -> str: """ Get the version of the database. @@ -60,9 +89,10 @@ def get_version(): str The version of the database. """ - return _kuzu.Database.get_version() - - def get_storage_version(): + return _kuzu.Database.get_version() # type: ignore[union-attr] + + @staticmethod + def get_storage_version() -> int: """ Get the storage version of the database. @@ -71,28 +101,31 @@ def get_storage_version(): int The storage version of the database. """ - return _kuzu.Database.get_storage_version() + return _kuzu.Database.get_storage_version() # type: ignore[union-attr] - def __getstate__(self): + def __getstate__(self) -> dict[str, Any]: state = { "database_path": self.database_path, "buffer_pool_size": self.buffer_pool_size, "compression": self.compression, "read_only": self.read_only, - "_database": None + "_database": None, } return state - def init_database(self): - """ - Initialize the database. - """ + def init_database(self) -> None: + """Initialize the database.""" if self._database is None: - self._database = _kuzu.Database(self.database_path, - self.buffer_pool_size, self.max_num_threads, self.compression, - self.read_only, self.max_db_size) + self._database = _kuzu.Database( # type: ignore[union-attr] + self.database_path, + self.buffer_pool_size, + self.max_num_threads, + self.compression, + self.read_only, + self.max_db_size, + ) - def set_logging_level(self, level): + def set_logging_level(self, level: str) -> None: """ Set the logging level. @@ -100,24 +133,25 @@ def set_logging_level(self, level): ---------- level : str Logging level. One of "debug", "info", "err". - - """ + """ self._database.set_logging_level(level) - def get_torch_geometric_remote_backend(self, num_threads=None): + def get_torch_geometric_remote_backend( + self, num_threads: int | None = None + ) -> tuple[KuzuFeatureStore, KuzuGraphStore]: """ - Use the database as the remote backend for torch_geometric. + Use the database as the remote backend for torch_geometric. - For the interface of the remote backend, please refer to + For the interface of the remote backend, please refer to https://pytorch-geometric.readthedocs.io/en/latest/advanced/remote.html. The current implementation is read-only and does not support edge features. The IDs of the nodes are based on the internal IDs (i.e., node offsets). For the remote node IDs to be consistent with the positions in the output tensors, please ensure that no deletion has been performed - on the node tables. + on the node tables. - The remote backend can also be plugged into the data loader of + The remote backend can also be plugged into the data loader of torch_geometric, which is useful for mini-batch training. For example: ```python @@ -130,7 +164,7 @@ def get_torch_geometric_remote_backend(self, num_threads=None): filter_per_worker=False, ) ``` - + Please note that the database instance is not fork-safe, so if more than one worker is used, `filter_per_worker` must be set to False. @@ -149,38 +183,49 @@ def get_torch_geometric_remote_backend(self, num_threads=None): """ from .torch_geometric_feature_store import KuzuFeatureStore from .torch_geometric_graph_store import KuzuGraphStore - return KuzuFeatureStore(self, num_threads), KuzuGraphStore(self, num_threads) - def _scan_node_table(self, table_name, prop_name, prop_type, dim, indices, num_threads): + return ( + KuzuFeatureStore(self, num_threads), + KuzuGraphStore(self, num_threads), + ) + + def _scan_node_table( + self, + table_name: str, + prop_name: str, + prop_type: str, + dim: int, + indices: IndexType, + num_threads: int, + ) -> NDArray[Any]: import numpy as np + """ Scan a node table from storage directly, bypassing query engine. Used internally by torch_geometric remote backend only. """ self.init_database() indices_cast = np.array(indices, dtype=np.uint64) - result = None + if prop_type == Type.INT64.value: result = np.empty(len(indices) * dim, dtype=np.int64) - self._database.scan_node_table_as_int64( - table_name, prop_name, indices_cast, result, num_threads) - if prop_type == Type.INT32.value: + self._database.scan_node_table_as_int64(table_name, prop_name, indices_cast, result, num_threads) + elif prop_type == Type.INT32.value: result = np.empty(len(indices) * dim, dtype=np.int32) - self._database.scan_node_table_as_int32( - table_name, prop_name, indices_cast, result, num_threads) - if prop_type == Type.INT16.value: + self._database.scan_node_table_as_int32(table_name, prop_name, indices_cast, result, num_threads) + elif prop_type == Type.INT16.value: result = np.empty(len(indices) * dim, dtype=np.int16) - self._database.scan_node_table_as_int16( - table_name, prop_name, indices_cast, result, num_threads) - if prop_type == Type.DOUBLE.value: + self._database.scan_node_table_as_int16(table_name, prop_name, indices_cast, result, num_threads) + elif prop_type == Type.DOUBLE.value: result = np.empty(len(indices) * dim, dtype=np.float64) - self._database.scan_node_table_as_double( - table_name, prop_name, indices_cast, result, num_threads) - if prop_type == Type.FLOAT.value: + self._database.scan_node_table_as_double(table_name, prop_name, indices_cast, result, num_threads) + elif prop_type == Type.FLOAT.value: result = np.empty(len(indices) * dim, dtype=np.float32) - self._database.scan_node_table_as_float( - table_name, prop_name, indices_cast, result, num_threads) + self._database.scan_node_table_as_float(table_name, prop_name, indices_cast, result, num_threads) + if result is not None: return result - raise ValueError("Unsupported property type: {}".format(prop_type)) + + msg = f"Unsupported property type: {prop_type}" + raise ValueError(msg) diff --git a/tools/python_api/src_py/prepared_statement.py b/tools/python_api/src_py/prepared_statement.py index f0e67dd2adb..a528a37e782 100644 --- a/tools/python_api/src_py/prepared_statement.py +++ b/tools/python_api/src_py/prepared_statement.py @@ -1,10 +1,18 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .connection import Connection + + class PreparedStatement: """ - A prepared statement is a parameterized query which can avoid planning the + A prepared statement is a parameterized query which can avoid planning the same query for repeated execution. """ - def __init__(self, connection, query): + def __init__(self, connection: Connection, query: str): """ Parameters ---------- @@ -13,10 +21,9 @@ def __init__(self, connection, query): query : str Query to prepare. """ - self._prepared_statement = connection._connection.prepare(query) - def is_success(self): + def is_success(self) -> bool: """ Check if the prepared statement is successfully prepared. @@ -25,10 +32,9 @@ def is_success(self): bool True if the prepared statement is successfully prepared. """ - return self._prepared_statement.is_success() - def get_error_message(self): + def get_error_message(self) -> str: """ Get the error message if the query is not prepared successfully. @@ -37,5 +43,4 @@ def get_error_message(self): str Error message. """ - return self._prepared_statement.get_error_message() diff --git a/tools/python_api/src_py/py.typed b/tools/python_api/src_py/py.typed new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/python_api/src_py/query_result.py b/tools/python_api/src_py/query_result.py index 27736aa62e9..a2b88688f64 100644 --- a/tools/python_api/src_py/query_result.py +++ b/tools/python_api/src_py/query_result.py @@ -1,13 +1,32 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + from .torch_geometric_result_converter import TorchGeometricResultConverter from .types import Type +if TYPE_CHECKING: + import sys + from types import TracebackType + + import networkx as nx + import pandas as pd + import polars as pl + import pyarrow as pa + import torch_geometric.data as geo + + from . import _kuzu + + if sys.version_info >= (3, 11): + from typing import Self + else: + from typing_extensions import Self + class QueryResult: - """ - QueryResult stores the result of a query execution. - """ + """QueryResult stores the result of a query execution.""" - def __init__(self, connection, query_result): + def __init__(self, connection: _kuzu.Connection, query_result: _kuzu.QueryResult): # type: ignore[name-defined] """ Parameters ---------- @@ -18,21 +37,25 @@ def __init__(self, connection, query_result): The underlying C++ query result object from pybind11. """ - self.connection = connection self._query_result = query_result self.is_closed = False - def __enter__(self): + def __enter__(self) -> Self: return self - def __exit__(self, exc_type, exc_value, traceback): + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: self.close() - def __del__(self): + def __del__(self) -> None: self.close() - def check_for_query_result_close(self): + def check_for_query_result_close(self) -> None: """ Check if the query result is closed and raise an exception if it is. @@ -42,11 +65,11 @@ def check_for_query_result_close(self): If the query result is closed. """ - if self.is_closed: - raise Exception("Query result is closed") + msg = "Query result is closed" + raise RuntimeError(msg) - def has_next(self): + def has_next(self) -> bool: """ Check if there are more rows in the query result. @@ -56,11 +79,10 @@ def has_next(self): True if there are more rows in the query result, False otherwise. """ - self.check_for_query_result_close() return self._query_result.hasNext() - def get_next(self): + def get_next(self) -> list[Any]: """ Get the next row in the query result. @@ -70,15 +92,11 @@ def get_next(self): Next row in the query result. """ - self.check_for_query_result_close() return self._query_result.getNext() - def close(self): - """ - Close the query result. - """ - + def close(self) -> None: + """Close the query result.""" if not self.is_closed: # Allows the connection to be garbage collected if the query result # is closed manually by the user. @@ -86,7 +104,7 @@ def close(self): self.connection = None self.is_closed = True - def get_as_df(self): + def get_as_df(self) -> pd.DataFrame: """ Get the query result as a Pandas DataFrame. @@ -101,14 +119,11 @@ def get_as_df(self): Query result as a Pandas DataFrame. """ - self.check_for_query_result_close() - import numpy - import pandas return self._query_result.getAsDF() - def get_as_pl(self): + def get_as_pl(self) -> pl.DataFrame: """ Get the query result as a Polars DataFrame. @@ -122,18 +137,15 @@ def get_as_pl(self): polars.DataFrame Query result as a Polars DataFrame. """ - import polars as pl - target_n_elems = ( - 10_000_000 # adaptive chunk_size; target 10m elements per chunk - ) + target_n_elems = 10_000_000 # adaptive chunk_size; target 10m elements per chunk target_chunk_size = max(target_n_elems // len(self.get_column_names()), 10) - return pl.from_arrow( + return pl.from_arrow( # type: ignore[return-value] data=self.get_as_arrow(chunk_size=target_chunk_size), ) - def get_as_arrow(self, chunk_size): + def get_as_arrow(self, chunk_size: int) -> pa.Table: """ Get the query result as a PyArrow Table. @@ -152,13 +164,11 @@ def get_as_arrow(self, chunk_size): pyarrow.Table Query result as a PyArrow Table. """ - self.check_for_query_result_close() - import pyarrow return self._query_result.getAsArrow(chunk_size) - def get_column_data_types(self): + def get_column_data_types(self) -> list[str]: """ Get the data types of the columns in the query result. @@ -168,11 +178,10 @@ def get_column_data_types(self): Data types of the columns in the query result. """ - self.check_for_query_result_close() return self._query_result.getColumnDataTypes() - def get_column_names(self): + def get_column_names(self) -> list[str]: """ Get the names of the columns in the query result. @@ -182,11 +191,10 @@ def get_column_names(self): Names of the columns in the query result. """ - self.check_for_query_result_close() return self._query_result.getColumnNames() - def get_schema(self): + def get_schema(self) -> dict[str, str]: """ Get the column schema of the query result. @@ -196,25 +204,20 @@ def get_schema(self): Schema of the query result. """ - self.check_for_query_result_close() - return { - name: dtype - for name, dtype in zip( + return dict( + zip( self._query_result.getColumnNames(), self._query_result.getColumnDataTypes(), ) - } - - def reset_iterator(self): - """ - Reset the iterator of the query result. - """ + ) + def reset_iterator(self) -> None: + """Reset the iterator of the query result.""" self.check_for_query_result_close() self._query_result.resetIterator() - def get_as_networkx(self, directed=True): + def get_as_networkx(self, directed: bool = True) -> nx.Graph | nx.DiGraph: # noqa: FBT001 """ Convert the nodes and rels in query result into a NetworkX directed or undirected graph with the following rules: @@ -232,14 +235,10 @@ def get_as_networkx(self, directed=True): Query result as a NetworkX graph. """ - self.check_for_query_result_close() import networkx as nx - if directed: - nx_graph = nx.DiGraph() - else: - nx_graph = nx.Graph() + nx_graph = nx.DiGraph() if directed else nx.Graph() properties_to_extract = self._get_properties_to_extract() self.reset_iterator() @@ -249,10 +248,9 @@ def get_as_networkx(self, directed=True): table_to_label_dict = {} table_primary_key_dict = {} - def encode_node_id(node, table_primary_key_dict): - return ( - node["_label"] + "_" + str(node[table_primary_key_dict[node["_label"]]]) - ) + def encode_node_id(node: dict[str, Any], table_primary_key_dict: dict[str, Any]) -> str: + node_label = node["_label"] + return f"{node_label}_{node[table_primary_key_dict[node_label]]!s}" # De-duplicate nodes and rels while self.has_next(): @@ -267,9 +265,7 @@ def encode_node_id(node, table_primary_key_dict): elif column_type == Type.REL.value: _src = row[i]["_src"] _dst = row[i]["_dst"] - rels[ - (_src["table"], _src["offset"], _dst["table"], _dst["offset"]) - ] = row[i] + rels[(_src["table"], _src["offset"], _dst["table"], _dst["offset"])] = row[i] elif column_type == Type.RECURSIVE_REL.value: for node in row[i]["_nodes"]: @@ -282,14 +278,7 @@ def encode_node_id(node, table_primary_key_dict): del rel[key] _src = rel["_src"] _dst = rel["_dst"] - rels[ - ( - _src["table"], - _src["offset"], - _dst["table"], - _dst["offset"], - ) - ] = rel + rels[(_src["table"], _src["offset"], _dst["table"], _dst["offset"])] = rel # Add nodes for node in nodes.values(): @@ -316,7 +305,7 @@ def encode_node_id(node, table_primary_key_dict): nx_graph.add_edge(src_id, dst_id, **rel) return nx_graph - def _get_properties_to_extract(self): + def _get_properties_to_extract(self) -> dict[int, tuple[str, str]]: column_names = self.get_column_names() column_types = self.get_column_data_types() properties_to_extract = {} @@ -333,7 +322,7 @@ def _get_properties_to_extract(self): properties_to_extract[i] = (column_type, column_name) return properties_to_extract - def get_as_torch_geometric(self): + def get_as_torch_geometric(self) -> tuple[geo.Data | geo.HeteroData, dict, dict, dict]: # type: ignore[type-arg] """ Converts the nodes and rels in query result into a PyTorch Geometric graph representation torch_geometric.data.Data or torch_geometric.data.HeteroData. @@ -376,19 +365,15 @@ def get_as_torch_geometric(self): A dictionary contains edge properties. The order of values for each property is aligned with edge_index in Data/HeteroData. """ - self.check_for_query_result_close() # Despite we are not using torch_geometric in this file, we need to # import it here to throw an error early if the user does not have # torch_geometric or torch installed. - import torch - import torch_geometric - converter = TorchGeometricResultConverter(self) return converter.get_as_torch_geometric() - def get_execution_time(self): + def get_execution_time(self) -> int: """ Get the time in ms which was required for executing the query. @@ -401,7 +386,7 @@ def get_execution_time(self): self.check_for_query_result_close() return self._query_result.getExecutionTime() - def get_compiling_time(self): + def get_compiling_time(self) -> int: """ Get the time in ms which was required for compiling the query. @@ -414,7 +399,7 @@ def get_compiling_time(self): self.check_for_query_result_close() return self._query_result.getCompilingTime() - def get_num_tuples(self): + def get_num_tuples(self) -> int: """ Get the number of tuples which the query returned. diff --git a/tools/python_api/src_py/torch_geometric_feature_store.py b/tools/python_api/src_py/torch_geometric_feature_store.py index 3ac812dabb1..6f5b6215891 100644 --- a/tools/python_api/src_py/torch_geometric_feature_store.py +++ b/tools/python_api/src_py/torch_geometric_feature_store.py @@ -1,46 +1,61 @@ -from .connection import Connection -from typing import List, Optional, Tuple -from .types import Type -import numpy as np +from __future__ import annotations -import torch import multiprocessing -from torch import Tensor +from typing import TYPE_CHECKING, Any +import numpy as np +import torch +from torch import Tensor from torch_geometric.data.feature_store import FeatureStore, TensorAttr -from torch_geometric.typing import FeatureTensorType +from .connection import Connection +from .types import Type + +if TYPE_CHECKING: + from torch_geometric.typing import FeatureTensorType + + from .database import Database + + +class KuzuFeatureStore(FeatureStore): # type: ignore[misc] + """Feature store compatible with `torch_geometric`.""" -class KuzuFeatureStore(FeatureStore): - def __init__(self, db, num_threads): + def __init__(self, db: Database, num_threads: int | None = None): super().__init__() self.db = db - self.connection = None - self.node_properties_cache = {} + self.connection: Connection = None # type: ignore[assignment] + self.node_properties_cache: dict[str, dict[str, Any]] = {} if num_threads is None: num_threads = multiprocessing.cpu_count() self.num_threads = num_threads - def __get_connection(self): - if not self.connection: + def __get_connection(self) -> Connection: + if self.connection is None: self.connection = Connection(self.db, self.num_threads) return self.connection def _put_tensor(self, tensor: FeatureTensorType, attr: TensorAttr) -> bool: raise NotImplementedError - def _get_tensor(self, attr: TensorAttr) -> Optional[FeatureTensorType]: + def _get_tensor(self, attr: TensorAttr) -> FeatureTensorType | None: table_name = attr.group_name attr_name = attr.attr_name attr_info = self.__get_node_property(table_name, attr_name) - if (not attr_info["type"] in [ - Type.INT64.value, Type.INT32.value, Type.INT16.value, - Type.DOUBLE.value, Type.FLOAT.value, Type.BOOL.value - ]) or (attr_info["dimension"] > 0 and "shape" not in attr_info): + if ( + attr_info["type"] + not in [ + Type.INT64.value, + Type.INT32.value, + Type.INT16.value, + Type.DOUBLE.value, + Type.FLOAT.value, + Type.BOOL.value, + ] + ) or (attr_info["dimension"] > 0 and "shape" not in attr_info): return self.__get_tensor_by_query(attr) return self.__get_tensor_by_scan(attr) - def __get_tensor_by_scan(self, attr: TensorAttr) -> Optional[FeatureTensorType]: + def __get_tensor_by_scan(self, attr: TensorAttr) -> FeatureTensorType | None: table_name = attr.group_name attr_name = attr.attr_name indices = attr.index @@ -51,17 +66,14 @@ def __get_tensor_by_scan(self, attr: TensorAttr) -> Optional[FeatureTensorType]: indices = np.arange(shape[0], dtype=np.uint64) elif isinstance(indices, slice): if indices.step is None or indices.step == 1: - indices = np.arange( - indices.start, indices.stop, dtype=np.uint64) + indices = np.arange(indices.start, indices.stop, dtype=np.uint64) else: - indices = np.arange(indices.start, indices.stop, - indices.step, dtype=np.uint64) + indices = np.arange(indices.start, indices.stop, indices.step, dtype=np.uint64) elif isinstance(indices, int): indices = np.array([indices]) if table_name not in self.node_properties_cache: - self.node_properties_cache[table_name] = self.connection._get_node_property_names( - table_name) + self.node_properties_cache[table_name] = self.connection._get_node_property_names(table_name) attr_info = self.node_properties_cache[table_name][attr_name] flat_dim = 1 @@ -69,16 +81,17 @@ def __get_tensor_by_scan(self, attr: TensorAttr) -> Optional[FeatureTensorType]: for i in range(attr_info["dimension"]): flat_dim *= attr_info["shape"][i] scan_result = self.connection.database._scan_node_table( - table_name, attr_name, attr_info["type"], flat_dim, indices, self.num_threads) + table_name, attr_name, attr_info["type"], flat_dim, indices, self.num_threads + ) - if attr_info['dimension'] > 0 and "shape" in attr_info: + if attr_info["dimension"] > 0 and "shape" in attr_info: result_shape = (len(indices),) + attr_info["shape"] scan_result = scan_result.reshape(result_shape) result = torch.from_numpy(scan_result) return result - def __get_tensor_by_query(self, attr: TensorAttr) -> Optional[FeatureTensorType]: + def __get_tensor_by_query(self, attr: TensorAttr) -> FeatureTensorType | None: table_name = attr.group_name attr_name = attr.attr_name indices = attr.index @@ -94,12 +107,13 @@ def __get_tensor_by_query(self, attr: TensorAttr) -> Optional[FeatureTensorType] where_clause = "WHERE offset(id(item)) = %d" % indices elif isinstance(indices, slice): if indices.step is None or indices.step == 1: - where_clause = "WHERE offset(id(item)) >= %d AND offset(id(item)) < %d" % ( - indices.start, indices.stop) + where_clause = "WHERE offset(id(item)) >= %d AND offset(id(item)) < %d" % (indices.start, indices.stop) else: - where_clause = "WHERE offset(id(item)) >= %d AND offset(id(item)) < %d AND (offset(id(item)) - %d) %% %d = 0" % ( - indices.start, indices.stop, indices.start, indices.step) - elif isinstance(indices, Tensor) or isinstance(indices, list) or isinstance(indices, np.ndarray) or isinstance(indices, tuple): + where_clause = ( + "WHERE offset(id(item)) >= %d AND offset(id(item)) < %d AND (offset(id(item)) - %d) %% %d = 0" + % (indices.start, indices.stop, indices.start, indices.step) + ) + elif isinstance(indices, (Tensor, list, np.ndarray, tuple)): where_clause = "WHERE" for i in indices: where_clause += " offset(id(item)) = %d OR" % int(i) @@ -107,7 +121,7 @@ def __get_tensor_by_query(self, attr: TensorAttr) -> Optional[FeatureTensorType] else: raise ValueError("Invalid attr.index type: %s" % type(indices)) - query = "%s %s %s" % (match_clause, where_clause, return_clause) + query = f"{match_clause} {where_clause} {return_clause}" res = self.connection.execute(query) result_list = [] @@ -117,15 +131,14 @@ def __get_tensor_by_query(self, attr: TensorAttr) -> Optional[FeatureTensorType] value_array = value_array[0] result_list.append(value_array) try: - tensor_result = torch.tensor(result_list) - return tensor_result - except: + return torch.tensor(result_list) + except Exception: return result_list def _remove_tensor(self, attr: TensorAttr) -> bool: raise NotImplementedError - def _get_tensor_size(self, attr: TensorAttr) -> Tuple: + def _get_tensor_size(self, attr: TensorAttr) -> tuple[Any, ...]: self.__get_connection() length_query = "MATCH (item:%s) RETURN count(item)" % attr.group_name res = self.connection.execute(length_query) @@ -136,30 +149,33 @@ def _get_tensor_size(self, attr: TensorAttr) -> Tuple: else: return (length,) + attr_info["shape"] - def __get_node_property(self, table_name: str, attr_name: str) -> str: + def __get_node_property(self, table_name: str, attr_name: str) -> dict[str, Any]: if table_name in self.node_properties_cache and attr_name in self.node_properties_cache[table_name]: return self.node_properties_cache[table_name][attr_name] self.__get_connection() if table_name not in self.node_properties_cache: - self.node_properties_cache[table_name] = self.connection._get_node_property_names( - table_name) + self.node_properties_cache[table_name] = self.connection._get_node_property_names(table_name) if attr_name not in self.node_properties_cache[table_name]: - raise ValueError("Attribute %s not found in group %s" % - (attr_name, table_name)) + msg = f"Attribute {attr_name} not found in group {table_name}" + raise ValueError(msg) attr_info = self.node_properties_cache[table_name][attr_name] return attr_info - def get_all_tensor_attrs(self) -> List[TensorAttr]: + def get_all_tensor_attrs(self) -> list[TensorAttr]: + """Return all TensorAttr from the table nodes.""" result_list = [] self.__get_connection() for table_name in self.connection._get_node_table_names(): if table_name not in self.node_properties_cache: - self.node_properties_cache[table_name] = self.connection._get_node_property_names( - table_name) + self.node_properties_cache[table_name] = self.connection._get_node_property_names(table_name) for attr_name in self.node_properties_cache[table_name]: if self.node_properties_cache[table_name][attr_name]["type"] in [ - Type.INT64.value, Type.INT32.value, Type.INT16.value, - Type.DOUBLE.value, Type.FLOAT.value, Type.BOOL.value + Type.INT64.value, + Type.INT32.value, + Type.INT16.value, + Type.DOUBLE.value, + Type.FLOAT.value, + Type.BOOL.value, ] and ( self.node_properties_cache[table_name][attr_name]["dimension"] == 0 or "shape" in self.node_properties_cache[table_name][attr_name] diff --git a/tools/python_api/src_py/torch_geometric_graph_store.py b/tools/python_api/src_py/torch_geometric_graph_store.py index 5686cbf292b..7d615a50622 100644 --- a/tools/python_api/src_py/torch_geometric_graph_store.py +++ b/tools/python_api/src_py/torch_geometric_graph_store.py @@ -1,111 +1,131 @@ -from typing import Dict, List, Optional, Tuple +from __future__ import annotations -import torch import multiprocessing -from torch_geometric.data.graph_store import EdgeAttr, GraphStore, EdgeLayout -from torch_geometric.typing import EdgeTensorType -from .connection import Connection +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any + import numpy as np +import torch +from torch_geometric.data.graph_store import EdgeAttr, EdgeLayout, GraphStore + +from .connection import Connection + +if TYPE_CHECKING: + import sys + + from torch_geometric.typing import EdgeTensorType + + from .database import Database + + if sys.version_info >= (3, 10): + from typing import TypeAlias + else: + from typing_extensions import TypeAlias + +StoreKeyType: TypeAlias = tuple[tuple[str], Any, bool] REL_BATCH_SIZE = 1000000 -class Rel: - def __init__(self, edge_type, layout, is_sorted, size, materialized=False, edge_index=None): - self.edge_type = edge_type - self.layout = layout - self.is_sorted = is_sorted - self.size = size - self.materialized = materialized - self.edge_index = edge_index +@dataclass +class Rel: # noqa: D101 + edge_type: tuple[str, ...] + layout: str + is_sorted: bool + size: tuple[int, ...] + materialized: bool = False + edge_index: EdgeTensorType | None = None + +class KuzuGraphStore(GraphStore): # type: ignore[misc] + """Graph store compatible with `torch_geometric`.""" -class KuzuGraphStore(GraphStore): - def __init__(self, db, num_threads): + def __init__(self, db: Database, num_threads: int | None = None): super().__init__() self.db = db - self.connection = None - self.store = {} + self.connection: Connection | None = None + self.store: dict[StoreKeyType, Rel] = {} if num_threads is None: num_threads = multiprocessing.cpu_count() self.num_threads = num_threads self.__populate_edge_attrs() @staticmethod - def key(attr: EdgeAttr) -> Tuple: - return (attr.edge_type, attr.layout.value, attr.is_sorted) + def key(attr: EdgeAttr) -> tuple[tuple[str], Any, bool]: # noqa: D102 + return attr.edge_type, attr.layout.value, attr.is_sorted - def _put_edge_index(self, edge_index: EdgeTensorType, - edge_attr: EdgeAttr) -> bool: + def _put_edge_index(self, edge_index: EdgeTensorType, edge_attr: EdgeAttr) -> None: key = self.key(edge_attr) if key in self.store: self.store[key].edge_index = edge_index self.store[key].materialized = True self.store[key].size = edge_attr.size else: - self.store[key] = Rel(key[0], key[1], key[2], edge_attr.size, True, - edge_index) + self.store[key] = Rel(key[0], key[1], key[2], edge_attr.size, True, edge_index) - def _get_edge_index(self, edge_attr: EdgeAttr) -> Optional[EdgeTensorType]: - if edge_attr.layout.value == EdgeLayout.COO.value: + def _get_edge_index(self, edge_attr: EdgeAttr) -> EdgeTensorType | None: + if edge_attr.layout.value == EdgeLayout.COO.value: # noqa: SIM102 # We always return a sorted COO edge index, if the request is # for an unsorted COO edge index, we change the is_sorted flag # to True and return the sorted COO edge index. - if edge_attr.is_sorted == False: + if edge_attr.is_sorted is False: edge_attr.is_sorted = True + key = self.key(edge_attr) if key in self.store: rel = self.store[self.key(edge_attr)] - if not rel.materialized: - if rel.layout != EdgeLayout.COO.value: - raise ValueError("Only COO layout is supported") + if not rel.materialized and rel.layout != EdgeLayout.COO.value: + msg = "Only COO layout is supported" + raise ValueError(msg) + if rel.layout == EdgeLayout.COO.value: self.__get_edge_coo_from_database(self.key(edge_attr)) return rel.edge_index else: return None - def _remove_edge_index(self, edge_attr: EdgeAttr) -> bool: + def _remove_edge_index(self, edge_attr: EdgeAttr) -> None: key = self.key(edge_attr) if key in self.store: del self.store[key] - def get_all_edge_attrs(self) -> List[EdgeAttr]: + def get_all_edge_attrs(self) -> list[EdgeAttr]: + """Return all EdgeAttr from the store values.""" return [EdgeAttr(rel.edge_type, rel.layout, rel.is_sorted, rel.size) for rel in self.store.values()] - def __get_edge_coo_from_database(self, key): + def __get_edge_coo_from_database(self, key: StoreKeyType) -> None: if not self.connection: self.connection = Connection(self.db, self.num_threads) rel = self.store[key] if rel.layout != EdgeLayout.COO.value: - raise ValueError("Only COO layout is supported") + msg = "Only COO layout is supported" + raise ValueError(msg) if rel.materialized: return + edge_type = rel.edge_type num_edges = self.connection._connection.get_num_rels(edge_type[1]) result = np.empty(2 * num_edges, dtype=np.int64) self.connection._connection.get_all_edges_for_torch_geometric( - result, edge_type[0], edge_type[1], edge_type[2], REL_BATCH_SIZE) + result, edge_type[0], edge_type[1], edge_type[2], REL_BATCH_SIZE + ) edge_list = torch.from_numpy(result) edge_list = edge_list.reshape((2, edge_list.shape[0] // 2)) rel.edge_index = edge_list rel.materialized = True - def __populate_edge_attrs(self): + def __populate_edge_attrs(self) -> None: if not self.connection: self.connection = Connection(self.db, self.num_threads) rel_tables = self.connection._get_rel_table_names() for rel_table in rel_tables: - edge_type = (rel_table['src'], rel_table['name'], rel_table['dst']) + edge_type = (rel_table["src"], rel_table["name"], rel_table["dst"]) size = self.__get_size(edge_type) - rel = Rel(edge_type, EdgeLayout.COO.value, - True, size, False, None) - self.store[self.key( - EdgeAttr(edge_type, EdgeLayout.COO, True))] = rel - - def __get_size(self, edge_type): - src_count = self.connection._connection.get_num_nodes(edge_type[0]) - dst_count = self.connection._connection.get_num_nodes(edge_type[-1]) - size = (src_count, dst_count) - return size + rel = Rel(edge_type, EdgeLayout.COO.value, True, size, False, None) + self.store[self.key(EdgeAttr(edge_type, EdgeLayout.COO, True))] = rel + + def __get_size(self, edge_type: tuple[str, ...]) -> tuple[int, int]: + num_nodes = self.connection._connection.get_num_nodes # type: ignore[union-attr] + src_count, dst_count = num_nodes(edge_type[0]), num_nodes(edge_type[-1]) + return (src_count, dst_count) diff --git a/tools/python_api/src_py/torch_geometric_result_converter.py b/tools/python_api/src_py/torch_geometric_result_converter.py index ee6e09ab652..991e1e17660 100644 --- a/tools/python_api/src_py/torch_geometric_result_converter.py +++ b/tools/python_api/src_py/torch_geometric_result_converter.py @@ -1,31 +1,41 @@ -from .types import Type +from __future__ import annotations + import warnings +from typing import TYPE_CHECKING, Any + +from .types import Type + +if TYPE_CHECKING: + import torch_geometric.data as geo + + from .query_result import QueryResult class TorchGeometricResultConverter: - def __init__(self, query_result): + """Convert graph results to `torch_geometric`.""" + + def __init__(self, query_result: QueryResult): self.query_result = query_result - self.nodes_dict = {} - self.edges_dict = {} - self.edges_properties = {} - self.rels = {} - self.nodes_property_names_dict = {} - self.table_to_label_dict = {} - self.internal_id_to_pos_dict = {} - self.pos_to_primary_key_dict = {} - self.warning_messages = set() - self.unconverted_properties = {} + self.nodes_dict: dict[str, Any] = {} + self.edges_dict: dict[str, Any] = {} + self.edges_properties: dict[str | tuple[str, str], dict[str, Any]] = {} + self.rels: dict[tuple[Any, ...], dict[str, Any]] = {} + self.nodes_property_names_dict: dict[str, Any] = {} + self.table_to_label_dict: dict[int, str] = {} + self.internal_id_to_pos_dict: dict[tuple[int, int], int | None] = {} + self.pos_to_primary_key_dict: dict[str, Any] = {} + self.warning_messages: set[str] = set() + self.unconverted_properties: dict[str, Any] = {} self.properties_to_extract = self.query_result._get_properties_to_extract() - def __get_node_property_names(self, table_name): + def __get_node_property_names(self, table_name: str) -> dict[str, Any]: if table_name in self.nodes_property_names_dict: return self.nodes_property_names_dict[table_name] - results = self.query_result.connection._get_node_property_names( - table_name) + results = self.query_result.connection._get_node_property_names(table_name) self.nodes_property_names_dict[table_name] = results return results - def __populate_nodes_dict_and_deduplicte_edges(self): + def __populate_nodes_dict_and_deduplicte_edges(self) -> None: self.query_result.reset_iterator() while self.query_result.has_next(): row = self.query_result.get_next() @@ -40,14 +50,11 @@ def __populate_nodes_dict_and_deduplicte_edges(self): if (_id["table"], _id["offset"]) in self.internal_id_to_pos_dict: continue - node_property_names = self.__get_node_property_names( - label) + node_property_names = self.__get_node_property_names(label) - pos, primary_key = self.__extract_properties_from_node( - node, label, node_property_names) + pos, primary_key = self.__extract_properties_from_node(node, label, node_property_names) - self.internal_id_to_pos_dict[( - _id["table"], _id["offset"])] = pos + self.internal_id_to_pos_dict[(_id["table"], _id["offset"])] = pos if label not in self.pos_to_primary_key_dict: self.pos_to_primary_key_dict[label] = {} self.pos_to_primary_key_dict[label][pos] = primary_key @@ -55,12 +62,17 @@ def __populate_nodes_dict_and_deduplicte_edges(self): elif column_type == Type.REL.value: _src = row[i]["_src"] _dst = row[i]["_dst"] - self.rels[(_src["table"], _src["offset"], - _dst["table"], _dst["offset"])] = row[i] + self.rels[(_src["table"], _src["offset"], _dst["table"], _dst["offset"])] = row[i] - def __extract_properties_from_node(self, node, label, node_property_names): + def __extract_properties_from_node( + self, + node: dict[str, Any], + label: str, + node_property_names: dict[str, Any], + ) -> tuple[int | None, Any]: pos = None import torch + for prop_name in node_property_names: # Read primary key if node_property_names[prop_name]["is_primary_key"]: @@ -74,47 +86,48 @@ def __extract_properties_from_node(self, node, label, node_property_names): # Mark properties that are not supported by torch_geometric as unconverted if node_property_names[prop_name]["type"] not in [Type.INT64.value, Type.DOUBLE.value, Type.BOOL.value]: self.warning_messages.add( - "Property {}.{} of type {} is not supported by torch_geometric. The property is marked as unconverted." - .format(label, prop_name, node_property_names[prop_name]["type"])) + "Property {}.{} of type {} is not supported by torch_geometric. The property is marked as unconverted.".format( + label, prop_name, node_property_names[prop_name]["type"] + ) + ) self.__mark_property_unconverted(label, prop_name) pos = self.__add_unconverted_property(node, label, prop_name) continue if node[prop_name] is None: self.warning_messages.add( - "Property {}.{} has a null value. torch_geometric does not support null values. The property is marked as unconverted." - .format(label, prop_name)) + f"Property {label}.{prop_name} has a null value. torch_geometric does not support null values. The property is marked as unconverted." + ) self.__mark_property_unconverted(label, prop_name) pos = self.__add_unconverted_property(node, label, prop_name) continue - if node_property_names[prop_name]['dimension'] == 0: + if node_property_names[prop_name]["dimension"] == 0: curr_value = node[prop_name] else: try: - if node_property_names[prop_name]['type'] == Type.INT64.value: + if node_property_names[prop_name]["type"] == Type.INT64.value: curr_value = torch.LongTensor(node[prop_name]) - elif node_property_names[prop_name]['type'] == Type.DOUBLE.value: + elif node_property_names[prop_name]["type"] == Type.DOUBLE.value: curr_value = torch.FloatTensor(node[prop_name]) - elif node_property_names[prop_name]['type'] == Type.BOOL.value: + elif node_property_names[prop_name]["type"] == Type.BOOL.value: curr_value = torch.BoolTensor(node[prop_name]) except ValueError: self.warning_messages.add( - "Property {}.{} cannot be converted to Tensor (likely due to nested list of variable length). The property is marked as unconverted." - .format(label, prop_name)) + f"Property {label}.{prop_name} cannot be converted to Tensor (likely due to nested list of variable length). The property is marked as unconverted." + ) self.__mark_property_unconverted(label, prop_name) - pos = self.__add_unconverted_property( - node, label, prop_name) + pos = self.__add_unconverted_property(node, label, prop_name) continue + # Check if the shape of the property is consistent - if label in self.nodes_dict and prop_name in self.nodes_dict[label]: + if label in self.nodes_dict and prop_name in self.nodes_dict[label]: # noqa: SIM102 # If the shape is inconsistent, then mark the property as unconverted if curr_value.shape != self.nodes_dict[label][prop_name][0].shape: self.warning_messages.add( - "Property {}.{} has an inconsistent shape. The property is marked as unconverted." - .format(label, prop_name)) + f"Property {label}.{prop_name} has an inconsistent shape. The property is marked as unconverted." + ) self.__mark_property_unconverted(label, prop_name) - pos = self.__add_unconverted_property( - node, label, prop_name) + pos = self.__add_unconverted_property(node, label, prop_name) continue # Create the dictionary for the label if it does not exist @@ -131,13 +144,13 @@ def __extract_properties_from_node(self, node, label, node_property_names): pos = len(self.nodes_dict[label][prop_name]) - 1 return pos, primary_key - def __add_unconverted_property(self, node, label, prop_name): - self.unconverted_properties[label][prop_name].append( - node[prop_name]) + def __add_unconverted_property(self, node: dict[str, Any], label: str, prop_name: str) -> int: + self.unconverted_properties[label][prop_name].append(node[prop_name]) return len(self.unconverted_properties[label][prop_name]) - 1 - def __mark_property_unconverted(self, label, prop_name): + def __mark_property_unconverted(self, label: str, prop_name: str) -> None: import torch + if label not in self.unconverted_properties: self.unconverted_properties[label] = {} if prop_name not in self.unconverted_properties[label]: @@ -148,13 +161,14 @@ def __mark_property_unconverted(self, label, prop_name): del self.nodes_dict[label] for i in range(len(self.unconverted_properties[label][prop_name])): # If the property is a tensor, convert it back to list (consistent with the original type) - if torch.is_tensor(self.unconverted_properties[label][prop_name][i]): - self.unconverted_properties[label][prop_name][i] = self.unconverted_properties[label][prop_name][i].tolist( - ) + if torch.is_tensor(self.unconverted_properties[label][prop_name][i]): # type: ignore[no-untyped-call] + self.unconverted_properties[label][prop_name][i] = self.unconverted_properties[label][ + prop_name + ][i].tolist() else: self.unconverted_properties[label][prop_name] = [] - def __populate_edges_dict(self): + def __populate_edges_dict(self) -> None: # Post-process edges, map internal ids to positions for r in self.rels: src_pos = self.internal_id_to_pos_dict[(r[0], r[1])] @@ -170,24 +184,29 @@ def __populate_edges_dict(self): if (src_label, dst_label) not in self.edges_properties: self.edges_properties[src_label, dst_label] = {} for prop_name in curr_edge_properties: - if prop_name in ['_src', '_dst', '_id']: + if prop_name in ["_src", "_dst", "_id"]: continue if prop_name not in self.edges_properties[src_label, dst_label]: - self.edges_properties[src_label, dst_label][prop_name] = [ - ] - self.edges_properties[src_label, dst_label][prop_name].append( - curr_edge_properties[prop_name]) + self.edges_properties[src_label, dst_label][prop_name] = [] + self.edges_properties[src_label, dst_label][prop_name].append(curr_edge_properties[prop_name]) - def __print_warnings(self): + def __print_warnings(self) -> None: for message in self.warning_messages: - warnings.warn(message) + warnings.warn(message, stacklevel=2) - def __convert_to_torch_geometric(self): + def __convert_to_torch_geometric( + self, + ) -> tuple[ + geo.Data | geo.HeteroData, + dict[str, Any], + dict[str, Any], + dict[str | tuple[str, str], dict[str, Any]], + ]: import torch import torch_geometric + if len(self.nodes_dict) == 0: - self.warning_messages.add( - "No nodes found or all node properties are not converted.") + self.warning_messages.add("No nodes found or all node properties are not converted.") # If there is only one node type, then convert to torch_geometric.data.Data # Otherwise, convert to torch_geometric.data.HeteroData @@ -199,23 +218,20 @@ def __convert_to_torch_geometric(self): is_hetero = True # Convert nodes to tensors + converted: torch.Tensor for label in self.nodes_dict: for prop_name in self.nodes_dict[label]: prop_type = self.nodes_property_names_dict[label][prop_name]["type"] prop_dimension = self.nodes_property_names_dict[label][prop_name]["dimension"] if prop_dimension == 0: if prop_type == Type.INT64.value: - converted = torch.LongTensor( - self.nodes_dict[label][prop_name]) + converted = torch.LongTensor(self.nodes_dict[label][prop_name]) elif prop_type == Type.BOOL.value: - converted = torch.BoolTensor( - self.nodes_dict[label][prop_name]) + converted = torch.BoolTensor(self.nodes_dict[label][prop_name]) elif prop_type == Type.DOUBLE.value: - converted = torch.FloatTensor( - self.nodes_dict[label][prop_name]) + converted = torch.FloatTensor(self.nodes_dict[label][prop_name]) else: - converted = torch.stack( - self.nodes_dict[label][prop_name], dim=0) + converted = torch.stack(self.nodes_dict[label][prop_name], dim=0) if is_hetero: data[label][prop_name] = converted else: @@ -224,14 +240,15 @@ def __convert_to_torch_geometric(self): # Convert edges to tensors for src_label in self.edges_dict: for dst_label in self.edges_dict[src_label]: - edge_idx = torch.tensor( - self.edges_dict[src_label][dst_label], dtype=torch.long).t().contiguous() + edge_idx = torch.tensor(self.edges_dict[src_label][dst_label], dtype=torch.long).t().contiguous() if is_hetero: data[src_label, dst_label].edge_index = edge_idx else: data.edge_index = edge_idx - pos_to_primary_key_dict = self.pos_to_primary_key_dict[ - label] if not is_hetero else self.pos_to_primary_key_dict + + pos_to_primary_key_dict: dict[str, Any] = ( + self.pos_to_primary_key_dict[label] if not is_hetero else self.pos_to_primary_key_dict + ) if is_hetero: unconverted_properties = self.unconverted_properties @@ -240,16 +257,22 @@ def __convert_to_torch_geometric(self): if len(self.unconverted_properties) == 0: unconverted_properties = {} else: - unconverted_properties = self.unconverted_properties[next( - iter(self.unconverted_properties))] + unconverted_properties = self.unconverted_properties[next(iter(self.unconverted_properties))] if len(self.edges_properties) == 0: edge_properties = {} else: - edge_properties = self.edges_properties[next( - iter(self.edges_properties))] + edge_properties = self.edges_properties[next(iter(self.edges_properties))] # type: ignore[assignment] return data, pos_to_primary_key_dict, unconverted_properties, edge_properties - def get_as_torch_geometric(self): + def get_as_torch_geometric( + self, + ) -> tuple[ + geo.Data | geo.HeteroData, + dict[str, Any], + dict[str, Any], + dict[str | tuple[str, str], dict[str, Any]], + ]: + """Convert graph data to `torch_geometric`.""" self.__populate_nodes_dict_and_deduplicte_edges() self.__populate_edges_dict() result = self.__convert_to_torch_geometric() diff --git a/tools/python_api/src_py/types.py b/tools/python_api/src_py/types.py index 10ab55308d7..1410a272e1d 100644 --- a/tools/python_api/src_py/types.py +++ b/tools/python_api/src_py/types.py @@ -3,6 +3,7 @@ class Type(Enum): """The type of a value in the database.""" + ANY = "ANY" NODE = "NODE" REL = "REL" diff --git a/tools/python_api/test/conftest.py b/tools/python_api/test/conftest.py index df741c13f24..94f8e4c819b 100644 --- a/tools/python_api/test/conftest.py +++ b/tools/python_api/test/conftest.py @@ -1,63 +1,103 @@ -import os -import pytest +from __future__ import annotations + import shutil +import sys +from pathlib import Path + +import pytest from test_helper import KUZU_ROOT -import kuzu +python_build_dir = Path(__file__).parent.parent / "build" +try: + import kuzu +except ModuleNotFoundError: + sys.path.append(str(python_build_dir)) + import kuzu -def init_npy(conn): +def init_npy(conn: kuzu.Connection) -> None: conn.execute( - 'create node table npyoned (i64 INT64,i32 INT32,i16 INT16,f64 DOUBLE,f32 FLOAT, PRIMARY KEY(i64));' + """ + CREATE NODE TABLE npyoned ( + i64 INT64, + i32 INT32, + i16 INT16, + f64 DOUBLE, + f32 FLOAT, + PRIMARY KEY(i64) + ); + """ ) conn.execute( - f'copy npyoned from ("{KUZU_ROOT}/dataset/npy-1d/one_dim_int64.npy", "{KUZU_ROOT}/dataset/npy-1d/one_dim_int32.npy", ' - f' "{KUZU_ROOT}/dataset/npy-1d/one_dim_int16.npy", "{KUZU_ROOT}/dataset/npy-1d/one_dim_double.npy", ' - f'"{KUZU_ROOT}/dataset/npy-1d/one_dim_float.npy") by column;' + f""" + COPY npyoned from ( + "{KUZU_ROOT}/dataset/npy-1d/one_dim_int64.npy", + "{KUZU_ROOT}/dataset/npy-1d/one_dim_int32.npy", + "{KUZU_ROOT}/dataset/npy-1d/one_dim_int16.npy", + "{KUZU_ROOT}/dataset/npy-1d/one_dim_double.npy", + "{KUZU_ROOT}/dataset/npy-1d/one_dim_float.npy") BY COLUMN; + """ ) conn.execute( - 'create node table npytwod (id INT64, i64 INT64[3], i32 INT32[3], i16 INT16[3], f64 DOUBLE[3], f32 FLOAT[3],' - 'PRIMARY KEY(id));' + """ + CREATE NODE TABLE npytwod ( + id INT64, + i64 INT64[3], + i32 INT32[3], + i16 INT16[3], + f64 DOUBLE[3], + f32 FLOAT[3], + PRIMARY KEY(id) + ); + """ ) conn.execute( - f'copy npytwod from ("{KUZU_ROOT}/dataset/npy-2d/id_int64.npy", "{KUZU_ROOT}/dataset/npy-2d/two_dim_int64.npy", ' - f'"{KUZU_ROOT}/dataset/npy-2d/two_dim_int32.npy", "{KUZU_ROOT}/dataset/npy-2d/two_dim_int16.npy", ' - f' "{KUZU_ROOT}/dataset/npy-2d/two_dim_double.npy", "{KUZU_ROOT}/dataset/npy-2d/two_dim_float.npy") by column;' + f""" + COPY npytwod FROM ( + "{KUZU_ROOT}/dataset/npy-2d/id_int64.npy", + "{KUZU_ROOT}/dataset/npy-2d/two_dim_int64.npy", + "{KUZU_ROOT}/dataset/npy-2d/two_dim_int32.npy", + "{KUZU_ROOT}/dataset/npy-2d/two_dim_int16.npy", + "{KUZU_ROOT}/dataset/npy-2d/two_dim_double.npy", + "{KUZU_ROOT}/dataset/npy-2d/two_dim_float.npy") BY COLUMN; + """ ) -def init_tensor(conn): - conn.execute('create node table tensor (ID INT64, boolTensor BOOLEAN[], doubleTensor DOUBLE[][], ' - 'intTensor INT64[][][], oneDimInt INT64, PRIMARY KEY (ID));') +def init_tensor(conn: kuzu.Connection) -> None: conn.execute( - f'COPY tensor FROM "{KUZU_ROOT}/dataset/tensor-list/vTensor.csv" (HEADER=true)') + """ + CREATE NODE TABLE tensor ( + ID INT64, + boolTensor BOOLEAN[], + doubleTensor DOUBLE[][], + intTensor INT64[][][], + oneDimInt INT64, + PRIMARY KEY (ID) + ); + """ + ) + conn.execute(f'COPY tensor FROM "{KUZU_ROOT}/dataset/tensor-list/vTensor.csv" (HEADER=true)') -def init_long_str(conn): - conn.execute( - f"CREATE NODE TABLE personLongString (name STRING, spouse STRING, PRIMARY KEY(name))") - conn.execute( - f'COPY personLongString FROM "{KUZU_ROOT}/dataset/long-string-pk-tests/vPerson.csv"') - conn.execute( - f"CREATE REL TABLE knowsLongString (FROM personLongString TO personLongString, MANY_MANY)") - conn.execute( - f'COPY knowsLongString FROM "{KUZU_ROOT}/dataset/long-string-pk-tests/eKnows.csv"') +def init_long_str(conn: kuzu.Connection) -> None: + conn.execute("CREATE NODE TABLE personLongString (name STRING, spouse STRING, PRIMARY KEY(name))") + conn.execute(f'COPY personLongString FROM "{KUZU_ROOT}/dataset/long-string-pk-tests/vPerson.csv"') + conn.execute("CREATE REL TABLE knowsLongString (FROM personLongString TO personLongString, MANY_MANY)") + conn.execute(f'COPY knowsLongString FROM "{KUZU_ROOT}/dataset/long-string-pk-tests/eKnows.csv"') -def init_tinysnb(conn): - tiny_snb_path = os.path.abspath( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - f"{KUZU_ROOT}/dataset/tinysnb") - ) - schema_path = os.path.join(tiny_snb_path, "schema.cypher") - with open(schema_path, "r") as f: +def init_tinysnb(conn: kuzu.Connection) -> None: + tiny_snb_path = (Path(__file__).parent / f"{KUZU_ROOT}/dataset/tinysnb").resolve() + schema_path = tiny_snb_path / "schema.cypher" + with schema_path.open(mode="r") as f: for line in f.readlines(): line = line.strip() if line: conn.execute(line) - copy_path = os.path.join(tiny_snb_path, "copy.cypher") - with open(copy_path, "r") as f: + + copy_path = tiny_snb_path / "copy.cypher" + with copy_path.open(mode="r") as f: for line in f.readlines(): line = line.strip() line = line.replace("dataset/tinysnb", f"{KUZU_ROOT}/dataset/tinysnb") @@ -65,36 +105,36 @@ def init_tinysnb(conn): conn.execute(line) -def init_movie_serial(conn): - conn.execute( - "create node table moviesSerial (ID SERIAL, name STRING, length INT32, note STRING, PRIMARY KEY (ID));" - ) +def init_movie_serial(conn: kuzu.Connection) -> None: conn.execute( - f'copy moviesSerial from "{KUZU_ROOT}/dataset/tinysnb-serial/vMovies.csv"' + """ + CREATE NODE TABLE moviesSerial ( + ID SERIAL, + name STRING, + length INT32, + note STRING, + PRIMARY KEY (ID) + );""" ) + conn.execute(f'COPY moviesSerial from "{KUZU_ROOT}/dataset/tinysnb-serial/vMovies.csv"') -def init_rdf(conn): - rdf_path = os.path.abspath( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - f"{KUZU_ROOT}/dataset/rdf/rdf_variant") - ) - scripts = [os.path.join(rdf_path, "schema.cypher"), os.path.join(rdf_path, "copy.cypher")] + +def init_rdf(conn: kuzu.Connection) -> None: + rdf_path = (Path(__file__).parent / f"{KUZU_ROOT}/dataset/rdf/rdf_variant").resolve() + scripts = [Path(rdf_path) / "schema.cypher", Path(rdf_path) / "copy.cypher"] for script in scripts: - with open(script, "r") as f: + with script.open(mode="r") as f: for line in f.readlines(): line = line.strip() if line: conn.execute(line) - -@pytest.fixture -def init_db(tmp_path): - if os.path.exists(tmp_path): +@pytest.fixture() +def init_db(tmp_path: Path) -> Path: + if Path(tmp_path).exists(): shutil.rmtree(tmp_path) - output_path = str(tmp_path) - db = kuzu.Database(output_path) + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) init_tinysnb(conn) init_npy(conn) @@ -102,16 +142,16 @@ def init_db(tmp_path): init_long_str(conn) init_movie_serial(conn) init_rdf(conn) - return output_path + return tmp_path -@pytest.fixture -def establish_connection(init_db): +@pytest.fixture() +def establish_connection(init_db: Path) -> tuple[kuzu.Connection, kuzu.Database]: db = kuzu.Database(init_db, buffer_pool_size=256 * 1024 * 1024) conn = kuzu.Connection(db, num_threads=4) return conn, db -@pytest.fixture -def get_tmp_path(tmp_path): - return str(tmp_path) +@pytest.fixture() +def build_dir() -> Path: + return python_build_dir diff --git a/tools/python_api/test/example.py b/tools/python_api/test/example.py index d6b2601a39e..428c2076855 100644 --- a/tools/python_api/test/example.py +++ b/tools/python_api/test/example.py @@ -1,8 +1,9 @@ import sys -sys.path.append('/home/lc/Developer/guodong/kuzu/tools/python_api/build') + +sys.path.append("/home/lc/Developer/guodong/kuzu/tools/python_api/build") import kuzu -DB_PATH = '/home/lc/Developer/kuzu_ogb_mag' -db = kuzu.Database(DB_PATH, (10*1024**3)) +DB_PATH = "/home/lc/Developer/kuzu_ogb_mag" +db = kuzu.Database(DB_PATH, (10 * 1024**3)) conn = kuzu.Connection(db) t = conn.get_all_edges_for_torch_geometric(10792672, "paper", "cites", "paper", 1000000) diff --git a/tools/python_api/test/ground_truth.py b/tools/python_api/test/ground_truth.py index 0bb5a6517a1..a587b288c86 100644 --- a/tools/python_api/test/ground_truth.py +++ b/tools/python_api/test/ground_truth.py @@ -1,157 +1,182 @@ -import datetime +from datetime import date, datetime, timedelta -TINY_SNB_PERSONS_GROUND_TRUTH = {0: {'ID': 0, - 'fName': 'Alice', - 'gender': 1, - 'isStudent': True, - 'isWorker': False, - 'age': 35, - 'eyeSight': 5.0, - 'birthdate': datetime.date(1900, 1, 1), - 'registerTime': datetime.datetime(2011, 8, 20, 11, 25, 30), - 'lastJobDuration': datetime.timedelta(days=1082, seconds=46920), - 'workedHours': [10, 5], - 'usedNames': ['Aida'], - 'courseScoresPerTerm': [[10, 8], [6, 7, 8]], - '_label': 'person', - '_id': {'offset': 0, 'table': 0}}, - 2: {'ID': 2, - 'fName': 'Bob', - 'gender': 2, - 'isStudent': True, - 'isWorker': False, - 'age': 30, - 'eyeSight': 5.1, - 'birthdate': datetime.date(1900, 1, 1), - 'registerTime': datetime.datetime(2008, 11, 3, 15, 25, 30, 526), - 'lastJobDuration': datetime.timedelta(days=3750, seconds=46800, microseconds=24), - 'workedHours': [12, 8], - 'usedNames': ['Bobby'], - 'courseScoresPerTerm': [[8, 9], [9, 10]], - '_label': 'person', - '_id': {'offset': 1, 'table': 0}}, - 3: {'ID': 3, - 'fName': 'Carol', - 'gender': 1, - 'isStudent': False, - 'isWorker': True, - 'age': 45, - 'eyeSight': 5.0, - 'birthdate': datetime.date(1940, 6, 22), - 'registerTime': datetime.datetime(1911, 8, 20, 2, 32, 21), - 'lastJobDuration': datetime.timedelta(days=2, seconds=1451), - 'workedHours': [4, 5], - 'usedNames': ['Carmen', 'Fred'], - 'courseScoresPerTerm': [[8, 10]], - '_label': 'person', - '_id': {'offset': 2, 'table': 0}}, - 5: {'ID': 5, - 'fName': 'Dan', - 'gender': 2, - 'isStudent': False, - 'isWorker': True, - 'age': 20, - 'eyeSight': 4.8, - 'birthdate': datetime.date(1950, 7, 23), - 'registerTime': datetime.datetime(2031, 11, 30, 12, 25, 30), - 'lastJobDuration': datetime.timedelta(days=3750, seconds=46800, microseconds=24), - 'workedHours': [1, 9], - 'usedNames': ['Wolfeschlegelstein', 'Daniel'], - 'courseScoresPerTerm': [[7, 4], [8, 8], [9]], - '_label': 'person', - '_id': {'offset': 3, 'table': 0}}, - 7: {'ID': 7, - 'fName': 'Elizabeth', - 'gender': 1, - 'isStudent': False, - 'isWorker': True, - 'age': 20, - 'eyeSight': 4.7, - 'birthdate': datetime.date(1980, 10, 26), - 'registerTime': datetime.datetime(1976, 12, 23, 11, 21, 42), - 'lastJobDuration': datetime.timedelta(days=2, seconds=1451), - 'workedHours': [2], - 'usedNames': ['Ein'], - 'courseScoresPerTerm': [[6], [7], [8]], - '_label': 'person', - '_id': {'offset': 4, 'table': 0}}, - 8: {'ID': 8, - 'fName': 'Farooq', - 'gender': 2, - 'isStudent': True, - 'isWorker': False, - 'age': 25, - 'eyeSight': 4.5, - 'birthdate': datetime.date(1980, 10, 26), - 'registerTime': datetime.datetime(1972, 7, 31, 13, 22, 30, 678559), - 'lastJobDuration': datetime.timedelta(seconds=1080, microseconds=24000), - 'workedHours': [3, 4, 5, 6, 7], - 'usedNames': ['Fesdwe'], - 'courseScoresPerTerm': [[8]], - '_label': 'person', - '_id': {'offset': 5, 'table': 0}}, - 9: {'ID': 9, - 'fName': 'Greg', - 'gender': 2, - 'isStudent': False, - 'isWorker': False, - 'age': 40, - 'eyeSight': 4.9, - 'birthdate': datetime.date(1980, 10, 26), - 'registerTime': datetime.datetime(1976, 12, 23, 4, 41, 42), - 'lastJobDuration': datetime.timedelta(days=3750, seconds=46800, microseconds=24), - 'workedHours': [1], - 'usedNames': ['Grad'], - 'courseScoresPerTerm': [[10]], - '_label': 'person', - '_id': {'offset': 6, 'table': 0}}, - 10: {'ID': 10, - 'fName': 'Hubert Blaine Wolfeschlegelsteinhausenbergerdorff', - 'gender': 2, - 'isStudent': False, - 'isWorker': True, - 'age': 83, - 'eyeSight': 4.9, - 'birthdate': datetime.date(1990, 11, 27), - 'registerTime': datetime.datetime(2023, 2, 21, 13, 25, 30), - 'lastJobDuration': datetime.timedelta(days=1082, seconds=46920), - 'workedHours': [10, 11, 12, 3, 4, 5, 6, 7], - 'usedNames': ['Ad', 'De', 'Hi', 'Kye', 'Orlan'], - 'courseScoresPerTerm': [[7], [10], [6, 7]], - '_label': 'person', - '_id': {'offset': 7, 'table': 0}}} +TINY_SNB_PERSONS_GROUND_TRUTH = { + 0: { + "ID": 0, + "fName": "Alice", + "gender": 1, + "isStudent": True, + "isWorker": False, + "age": 35, + "eyeSight": 5.0, + "birthdate": date(1900, 1, 1), + "registerTime": datetime(2011, 8, 20, 11, 25, 30), + "lastJobDuration": timedelta(days=1082, seconds=46920), + "workedHours": [10, 5], + "usedNames": ["Aida"], + "courseScoresPerTerm": [[10, 8], [6, 7, 8]], + "_label": "person", + "_id": {"offset": 0, "table": 0}, + }, + 2: { + "ID": 2, + "fName": "Bob", + "gender": 2, + "isStudent": True, + "isWorker": False, + "age": 30, + "eyeSight": 5.1, + "birthdate": date(1900, 1, 1), + "registerTime": datetime(2008, 11, 3, 15, 25, 30, 526), + "lastJobDuration": timedelta(days=3750, seconds=46800, microseconds=24), + "workedHours": [12, 8], + "usedNames": ["Bobby"], + "courseScoresPerTerm": [[8, 9], [9, 10]], + "_label": "person", + "_id": {"offset": 1, "table": 0}, + }, + 3: { + "ID": 3, + "fName": "Carol", + "gender": 1, + "isStudent": False, + "isWorker": True, + "age": 45, + "eyeSight": 5.0, + "birthdate": date(1940, 6, 22), + "registerTime": datetime(1911, 8, 20, 2, 32, 21), + "lastJobDuration": timedelta(days=2, seconds=1451), + "workedHours": [4, 5], + "usedNames": ["Carmen", "Fred"], + "courseScoresPerTerm": [[8, 10]], + "_label": "person", + "_id": {"offset": 2, "table": 0}, + }, + 5: { + "ID": 5, + "fName": "Dan", + "gender": 2, + "isStudent": False, + "isWorker": True, + "age": 20, + "eyeSight": 4.8, + "birthdate": date(1950, 7, 23), + "registerTime": datetime(2031, 11, 30, 12, 25, 30), + "lastJobDuration": timedelta(days=3750, seconds=46800, microseconds=24), + "workedHours": [1, 9], + "usedNames": ["Wolfeschlegelstein", "Daniel"], + "courseScoresPerTerm": [[7, 4], [8, 8], [9]], + "_label": "person", + "_id": {"offset": 3, "table": 0}, + }, + 7: { + "ID": 7, + "fName": "Elizabeth", + "gender": 1, + "isStudent": False, + "isWorker": True, + "age": 20, + "eyeSight": 4.7, + "birthdate": date(1980, 10, 26), + "registerTime": datetime(1976, 12, 23, 11, 21, 42), + "lastJobDuration": timedelta(days=2, seconds=1451), + "workedHours": [2], + "usedNames": ["Ein"], + "courseScoresPerTerm": [[6], [7], [8]], + "_label": "person", + "_id": {"offset": 4, "table": 0}, + }, + 8: { + "ID": 8, + "fName": "Farooq", + "gender": 2, + "isStudent": True, + "isWorker": False, + "age": 25, + "eyeSight": 4.5, + "birthdate": date(1980, 10, 26), + "registerTime": datetime(1972, 7, 31, 13, 22, 30, 678559), + "lastJobDuration": timedelta(seconds=1080, microseconds=24000), + "workedHours": [3, 4, 5, 6, 7], + "usedNames": ["Fesdwe"], + "courseScoresPerTerm": [[8]], + "_label": "person", + "_id": {"offset": 5, "table": 0}, + }, + 9: { + "ID": 9, + "fName": "Greg", + "gender": 2, + "isStudent": False, + "isWorker": False, + "age": 40, + "eyeSight": 4.9, + "birthdate": date(1980, 10, 26), + "registerTime": datetime(1976, 12, 23, 4, 41, 42), + "lastJobDuration": timedelta(days=3750, seconds=46800, microseconds=24), + "workedHours": [1], + "usedNames": ["Grad"], + "courseScoresPerTerm": [[10]], + "_label": "person", + "_id": {"offset": 6, "table": 0}, + }, + 10: { + "ID": 10, + "fName": "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + "gender": 2, + "isStudent": False, + "isWorker": True, + "age": 83, + "eyeSight": 4.9, + "birthdate": date(1990, 11, 27), + "registerTime": datetime(2023, 2, 21, 13, 25, 30), + "lastJobDuration": timedelta(days=1082, seconds=46920), + "workedHours": [10, 11, 12, 3, 4, 5, 6, 7], + "usedNames": ["Ad", "De", "Hi", "Kye", "Orlan"], + "courseScoresPerTerm": [[7], [10], [6, 7]], + "_label": "person", + "_id": {"offset": 7, "table": 0}, + }, +} -TINY_SNB_ORGANISATIONS_GROUND_TRUTH = {1: {'ID': 1, - 'name': 'ABFsUni', - 'orgCode': 325, - 'mark': 3.7, - 'score': -2, - 'history': '10 years 5 months 13 hours 24 us', - 'licenseValidInterval': datetime.timedelta(days=1085), - 'rating': 1.0, - '_label': 'organisation', - '_id': {'offset': 0, 'table': 2}}, - 4: {'ID': 4, - 'name': 'CsWork', - 'orgCode': 934, - 'mark': 4.1, - 'score': -100, - 'history': '2 years 4 days 10 hours', - 'licenseValidInterval': datetime.timedelta(days=9414), - 'rating': 0.78, - '_label': 'organisation', - '_id': {'offset': 1, 'table': 2}}, - 6: {'ID': 6, - 'name': 'DEsWork', - 'orgCode': 824, - 'mark': 4.1, - 'score': 7, - 'history': '2 years 4 hours 22 us 34 minutes', - 'licenseValidInterval': datetime.timedelta(days=3, seconds=36000, - microseconds=100000), - 'rating': 0.52, - '_label': 'organisation', - '_id': {'offset': 2, 'table': 2}}} +TINY_SNB_ORGANISATIONS_GROUND_TRUTH = { + 1: { + "ID": 1, + "name": "ABFsUni", + "orgCode": 325, + "mark": 3.7, + "score": -2, + "history": "10 years 5 months 13 hours 24 us", + "licenseValidInterval": timedelta(days=1085), + "rating": 1.0, + "_label": "organisation", + "_id": {"offset": 0, "table": 2}, + }, + 4: { + "ID": 4, + "name": "CsWork", + "orgCode": 934, + "mark": 4.1, + "score": -100, + "history": "2 years 4 days 10 hours", + "licenseValidInterval": timedelta(days=9414), + "rating": 0.78, + "_label": "organisation", + "_id": {"offset": 1, "table": 2}, + }, + 6: { + "ID": 6, + "name": "DEsWork", + "orgCode": 824, + "mark": 4.1, + "score": 7, + "history": "2 years 4 hours 22 us 34 minutes", + "licenseValidInterval": timedelta(days=3, seconds=36000, microseconds=100000), + "rating": 0.52, + "_label": "organisation", + "_id": {"offset": 2, "table": 2}, + }, +} TINY_SNB_KNOWS_GROUND_TRUTH = { 0: [2, 3, 5], @@ -162,118 +187,150 @@ } TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH = { - (0, 2): {'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(1986, 10, 21, 21, 8, 31, 521000), - 'validInterval': datetime.timedelta(days=3750, seconds=46800, microseconds=24), - 'comments': ['rnme', 'm8sihsdnf2990nfiwf'], - 'summary': {'locations': ["'toronto'", "'waterloo'"], - 'transfer': {'day': datetime.date(2021, 1, 2), 'amount': [100, 200]}}, - 'notes': 1, - 'someMap': {'a': 'b'}}, - (0, 3): {'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(1946, 8, 25, 19, 7, 22), - 'validInterval': datetime.timedelta(days=7232), - 'comments': ['njnojppo9u0jkmf', 'fjiojioh9h9h89hph'], - 'summary': {'locations': None, 'transfer': None}, - 'notes': datetime.date(2020, 10, 10), - 'someMap': {'c': 'd', 'e': 'f', '1': '2'}}, - (0, 5): {'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(2012, 12, 11, 20, 7, 22), - 'validInterval': datetime.timedelta(days=10), - 'comments': ['ioji232', 'jifhe8w99u43434'], - 'summary': {'locations': ["'shanghai'"], 'transfer': {'day': datetime.date(1990, 9, 10), 'amount': [10]}}, - 'notes': 'nice weather', - 'someMap': None}, - (2, 0): {'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(1946, 8, 25, 19, 7, 22), - 'validInterval': datetime.timedelta(days=3750, seconds=46800, microseconds=24), - 'comments': ['2huh9y89fsfw23', '23nsihufhw723'], - 'summary': {'locations': ["'paris'"], - 'transfer': {'day': datetime.date(2000, 1, 1), 'amount': [20, 5000]}}, - 'notes': 4, - 'someMap': None}, - (2, 3): {'date': datetime.date(1950, 5, 14), - 'meetTime': datetime.datetime(1946, 8, 25, 19, 7, 22), - 'validInterval': datetime.timedelta(seconds=1380), - 'comments': ['fwehu9h9832wewew', '23u9h989sdfsss'], - 'summary': {'locations': ["'paris'"], - 'transfer': {'day': datetime.date(2011, 5, 1), 'amount': [2000, 5340]}}, - 'notes': 'cool stuff found', - 'someMap': None}, - (2, 5): {'date': datetime.date(1950, 5, 14), - 'meetTime': datetime.datetime(2012, 12, 11, 20, 7, 22), - 'validInterval': datetime.timedelta(days=7232), - 'comments': ['fwh9y81232uisuiehuf', 'ewnuihxy8dyf232'], - 'summary': {'locations': ["'vancouver'"], - 'transfer': {'day': datetime.date(2020, 1, 1), 'amount': [120, 50]}}, - 'notes': 'matthew perry', - 'someMap': None}, - (3, 0): {'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(2002, 7, 31, 11, 42, 53, 123420), - 'validInterval': datetime.timedelta(days=41, seconds=21600), - 'comments': ['fnioh8323aeweae34d', 'osd89e2ejshuih12'], - 'summary': {'locations': ["'london'", "'toronto'"], - 'transfer': {'day': datetime.date(2012, 11, 21), 'amount': [223, 5230]}}, - 'notes': 10, - 'someMap': None}, - (3, 2): {'date': datetime.date(1950, 5, 14), - 'meetTime': datetime.datetime(2007, 2, 12, 12, 11, 42, 123000), - 'validInterval': datetime.timedelta(seconds=1680, microseconds=30000), - 'comments': ['fwh983-sdjisdfji', 'ioh89y32r2huir'], - 'summary': {'locations': ["'paris'", "'beijing'"], - 'transfer': {'day': datetime.date(2011, 3, 11), 'amount': [2323, 50]}}, - 'notes': 1, - 'someMap': None}, - (3, 5): {'date': datetime.date(2000, 1, 1), - 'meetTime': datetime.datetime(1998, 10, 2, 13, 9, 22, 423000), - 'validInterval': datetime.timedelta(microseconds=300000), - 'comments': ['psh989823oaaioe', 'nuiuah1nosndfisf'], - 'summary': {'locations': [], 'transfer': {'day': datetime.date(1980, 11, 21), 'amount': [20, 5]}}, - 'notes': 2, - 'someMap': None}, - (5, 0): {'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(1936, 11, 2, 11, 2, 1), - 'validInterval': datetime.timedelta(microseconds=480), - 'comments': ['fwewe'], - 'summary': {'locations': ["'shanghai'", "'nanjing'"], - 'transfer': {'day': datetime.date(1998, 11, 12), 'amount': [22, 53240]}}, - 'notes': 15, - 'someMap': None}, - (5, 2): {'date': datetime.date(1950, 5, 14), - 'meetTime': datetime.datetime(1982, 11, 11, 13, 12, 5, 123000), - 'validInterval': datetime.timedelta(seconds=1380), - 'comments': ['fewh9182912e3', - 'h9y8y89soidfsf', - 'nuhudf78w78efw', - 'hioshe0f9023sdsd'], - 'summary': {'locations': ["'paris'"], - 'transfer': {'day': datetime.date(2000, 1, 1), 'amount': [20, 5000]}}, - 'notes': 'happy new year', - 'someMap': None}, - (5, 3): {'date': datetime.date(2000, 1, 1), - 'meetTime': datetime.datetime(1999, 4, 21, 15, 12, 11, 420000), - 'validInterval': datetime.timedelta(days=2, microseconds=52000), - 'comments': ['23h9sdslnfowhu2932', 'shuhf98922323sf'], - 'summary': {'locations': ["'paris'"], - 'transfer': {'day': datetime.date(2000, 1, 1), 'amount': [20, 5000]}}, - 'notes': 4, - 'someMap': None}, - (7, 8): {'date': datetime.date(1905, 12, 12), - 'meetTime': datetime.datetime(2025, 1, 1, 11, 22, 33, 520000), - 'validInterval': datetime.timedelta(seconds=2878), - 'comments': ['ahu2333333333333', '12weeeeeeeeeeeeeeeeee'], - 'summary': {'locations': ["'toronto'", "'thisisalongcityname'"], - 'transfer': {'day': datetime.date(1930, 11, 22), 'amount': [18, 323]}}, - 'notes': 8, - 'someMap': None}, - (7, 9): {'date': datetime.date(1905, 12, 12), - 'meetTime': datetime.datetime(2020, 3, 1, 12, 11, 41, 655200), - 'validInterval': datetime.timedelta(seconds=2878), - 'comments': ['peweeeeeeeeeeeeeeeee', 'kowje9w0eweeeeeeeee'], - 'summary': {'locations': ["'waterloo'"], - 'transfer': {'day': datetime.date(2000, 1, 1), 'amount': [1000, 5000]}}, - 'notes': 10, - 'someMap': None} + (0, 2): { + "date": date(2021, 6, 30), + "meetTime": datetime(1986, 10, 21, 21, 8, 31, 521000), + "validInterval": timedelta(days=3750, seconds=46800, microseconds=24), + "comments": ["rnme", "m8sihsdnf2990nfiwf"], + "summary": { + "locations": ["'toronto'", "'waterloo'"], + "transfer": {"day": date(2021, 1, 2), "amount": [100, 200]}, + }, + "notes": 1, + "someMap": {"a": "b"}, + }, + (0, 3): { + "date": date(2021, 6, 30), + "meetTime": datetime(1946, 8, 25, 19, 7, 22), + "validInterval": timedelta(days=7232), + "comments": ["njnojppo9u0jkmf", "fjiojioh9h9h89hph"], + "summary": {"locations": None, "transfer": None}, + "notes": date(2020, 10, 10), + "someMap": {"c": "d", "e": "f", "1": "2"}, + }, + (0, 5): { + "date": date(2021, 6, 30), + "meetTime": datetime(2012, 12, 11, 20, 7, 22), + "validInterval": timedelta(days=10), + "comments": ["ioji232", "jifhe8w99u43434"], + "summary": {"locations": ["'shanghai'"], "transfer": {"day": date(1990, 9, 10), "amount": [10]}}, + "notes": "nice weather", + "someMap": None, + }, + (2, 0): { + "date": date(2021, 6, 30), + "meetTime": datetime(1946, 8, 25, 19, 7, 22), + "validInterval": timedelta(days=3750, seconds=46800, microseconds=24), + "comments": ["2huh9y89fsfw23", "23nsihufhw723"], + "summary": {"locations": ["'paris'"], "transfer": {"day": date(2000, 1, 1), "amount": [20, 5000]}}, + "notes": 4, + "someMap": None, + }, + (2, 3): { + "date": date(1950, 5, 14), + "meetTime": datetime(1946, 8, 25, 19, 7, 22), + "validInterval": timedelta(seconds=1380), + "comments": ["fwehu9h9832wewew", "23u9h989sdfsss"], + "summary": {"locations": ["'paris'"], "transfer": {"day": date(2011, 5, 1), "amount": [2000, 5340]}}, + "notes": "cool stuff found", + "someMap": None, + }, + (2, 5): { + "date": date(1950, 5, 14), + "meetTime": datetime(2012, 12, 11, 20, 7, 22), + "validInterval": timedelta(days=7232), + "comments": ["fwh9y81232uisuiehuf", "ewnuihxy8dyf232"], + "summary": {"locations": ["'vancouver'"], "transfer": {"day": date(2020, 1, 1), "amount": [120, 50]}}, + "notes": "matthew perry", + "someMap": None, + }, + (3, 0): { + "date": date(2021, 6, 30), + "meetTime": datetime(2002, 7, 31, 11, 42, 53, 123420), + "validInterval": timedelta(days=41, seconds=21600), + "comments": ["fnioh8323aeweae34d", "osd89e2ejshuih12"], + "summary": { + "locations": ["'london'", "'toronto'"], + "transfer": {"day": date(2012, 11, 21), "amount": [223, 5230]}, + }, + "notes": 10, + "someMap": None, + }, + (3, 2): { + "date": date(1950, 5, 14), + "meetTime": datetime(2007, 2, 12, 12, 11, 42, 123000), + "validInterval": timedelta(seconds=1680, microseconds=30000), + "comments": ["fwh983-sdjisdfji", "ioh89y32r2huir"], + "summary": { + "locations": ["'paris'", "'beijing'"], + "transfer": {"day": date(2011, 3, 11), "amount": [2323, 50]}, + }, + "notes": 1, + "someMap": None, + }, + (3, 5): { + "date": date(2000, 1, 1), + "meetTime": datetime(1998, 10, 2, 13, 9, 22, 423000), + "validInterval": timedelta(microseconds=300000), + "comments": ["psh989823oaaioe", "nuiuah1nosndfisf"], + "summary": {"locations": [], "transfer": {"day": date(1980, 11, 21), "amount": [20, 5]}}, + "notes": 2, + "someMap": None, + }, + (5, 0): { + "date": date(2021, 6, 30), + "meetTime": datetime(1936, 11, 2, 11, 2, 1), + "validInterval": timedelta(microseconds=480), + "comments": ["fwewe"], + "summary": { + "locations": ["'shanghai'", "'nanjing'"], + "transfer": {"day": date(1998, 11, 12), "amount": [22, 53240]}, + }, + "notes": 15, + "someMap": None, + }, + (5, 2): { + "date": date(1950, 5, 14), + "meetTime": datetime(1982, 11, 11, 13, 12, 5, 123000), + "validInterval": timedelta(seconds=1380), + "comments": ["fewh9182912e3", "h9y8y89soidfsf", "nuhudf78w78efw", "hioshe0f9023sdsd"], + "summary": {"locations": ["'paris'"], "transfer": {"day": date(2000, 1, 1), "amount": [20, 5000]}}, + "notes": "happy new year", + "someMap": None, + }, + (5, 3): { + "date": date(2000, 1, 1), + "meetTime": datetime(1999, 4, 21, 15, 12, 11, 420000), + "validInterval": timedelta(days=2, microseconds=52000), + "comments": ["23h9sdslnfowhu2932", "shuhf98922323sf"], + "summary": {"locations": ["'paris'"], "transfer": {"day": date(2000, 1, 1), "amount": [20, 5000]}}, + "notes": 4, + "someMap": None, + }, + (7, 8): { + "date": date(1905, 12, 12), + "meetTime": datetime(2025, 1, 1, 11, 22, 33, 520000), + "validInterval": timedelta(seconds=2878), + "comments": ["ahu2333333333333", "12weeeeeeeeeeeeeeeeee"], + "summary": { + "locations": ["'toronto'", "'thisisalongcityname'"], + "transfer": {"day": date(1930, 11, 22), "amount": [18, 323]}, + }, + "notes": 8, + "someMap": None, + }, + (7, 9): { + "date": date(1905, 12, 12), + "meetTime": datetime(2020, 3, 1, 12, 11, 41, 655200), + "validInterval": timedelta(seconds=2878), + "comments": ["peweeeeeeeeeeeeeeeee", "kowje9w0eweeeeeeeee"], + "summary": { + "locations": ["'waterloo'"], + "transfer": {"day": date(2000, 1, 1), "amount": [1000, 5000]}, + }, + "notes": 10, + "someMap": None, + }, } TINY_SNB_WORKS_AT_GROUND_TRUTH = { @@ -282,56 +339,52 @@ 7: [6], } -TINY_SNB_WORKS_AT_PROPERTIES_GROUND_TRUTH = { - (3, 4): {'year': 2015}, - (5, 6): {'year': 2010}, - (7, 6): {'year': 2015} -} +TINY_SNB_WORKS_AT_PROPERTIES_GROUND_TRUTH = {(3, 4): {"year": 2015}, (5, 6): {"year": 2010}, (7, 6): {"year": 2015}} TENSOR_LIST_GROUND_TRUTH = { 0: { - 'boolTensor': [True, False], - 'doubleTensor': [[0.1, 0.2], [0.3, 0.4]], - 'intTensor': [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] + "boolTensor": [True, False], + "doubleTensor": [[0.1, 0.2], [0.3, 0.4]], + "intTensor": [[[1, 2], [3, 4]], [[5, 6], [7, 8]]], }, 3: { - 'boolTensor': [True, False], - 'doubleTensor': [[0.1, 0.2], [0.3, 0.4]], - 'intTensor': [[[3, 4], [5, 6]], [[7, 8], [9, 10]]] + "boolTensor": [True, False], + "doubleTensor": [[0.1, 0.2], [0.3, 0.4]], + "intTensor": [[[3, 4], [5, 6]], [[7, 8], [9, 10]]], }, 4: { - 'boolTensor': [False, True], - 'doubleTensor': [[0.4, 0.8], [0.7, 0.6]], - 'intTensor': [[[5, 6], [7, 8]], [[9, 10], [11, 12]]] + "boolTensor": [False, True], + "doubleTensor": [[0.4, 0.8], [0.7, 0.6]], + "intTensor": [[[5, 6], [7, 8]], [[9, 10], [11, 12]]], }, 5: { - 'boolTensor': [True, True], - 'doubleTensor': [[0.4, 0.9], [0.5, 0.2]], - 'intTensor': [[[7, 8], [9, 10]], [[11, 12], [13, 14]]] + "boolTensor": [True, True], + "doubleTensor": [[0.4, 0.9], [0.5, 0.2]], + "intTensor": [[[7, 8], [9, 10]], [[11, 12], [13, 14]]], }, 6: { - 'boolTensor': [False, True], - 'doubleTensor': [[0.2, 0.4], [0.5, 0.1]], - 'intTensor': [[[9, 10], [11, 12]], [[13, 14], [15, 16]]] + "boolTensor": [False, True], + "doubleTensor": [[0.2, 0.4], [0.5, 0.1]], + "intTensor": [[[9, 10], [11, 12]], [[13, 14], [15, 16]]], }, 8: { - 'boolTensor': [False, True], - 'doubleTensor': [[0.6, 0.4], [0.6, 0.1]], - 'intTensor': [[[11, 12], [13, 14]], [[15, 16], [17, 18]]] - } + "boolTensor": [False, True], + "doubleTensor": [[0.6, 0.4], [0.6, 0.1]], + "intTensor": [[[11, 12], [13, 14]], [[15, 16], [17, 18]]], + }, } PERSONLONGSTRING_GROUND_TRUTH = { - 'AAAAAAAAAAAAAAAAAAAA': { - 'name': 'AAAAAAAAAAAAAAAAAAAA', - 'spouse': 'Bob', + "AAAAAAAAAAAAAAAAAAAA": { + "name": "AAAAAAAAAAAAAAAAAAAA", + "spouse": "Bob", }, - 'Bob': { - 'name': 'Bob', - 'spouse': 'AAAAAAAAAAAAAAAAAAAA', + "Bob": { + "name": "Bob", + "spouse": "AAAAAAAAAAAAAAAAAAAA", }, } PERSONLONGSTRING_KNOWS_GROUND_TRUTH = { - 'AAAAAAAAAAAAAAAAAAAA': ['Bob'], + "AAAAAAAAAAAAAAAAAAAA": ["Bob"], } diff --git a/tools/python_api/test/test_arrow.py b/tools/python_api/test/test_arrow.py index 408cb38617a..eb324383e65 100644 --- a/tools/python_api/test/test_arrow.py +++ b/tools/python_api/test/test_arrow.py @@ -1,11 +1,16 @@ -import polars as pl -import pyarrow as pa -import ground_truth +from __future__ import annotations + from datetime import date, datetime, timedelta from decimal import Decimal -from pandas import Timestamp -import pytz +from typing import Any +import ground_truth +import kuzu +import polars as pl +import pyarrow as pa +import pytz +from pandas import Timestamp +from type_aliases import ConnDB # enable polars' decimal support pl.Config.activate_decimals(True) @@ -37,42 +42,38 @@ "a.length": {"arrow": pa.int32(), "pl": pl.Int32}, "m.name": {"arrow": pa.string(), "pl": pl.String}, "a.description": { - "arrow": pa.struct( - [ - ("rating", pa.float64()), - ("stars", pa.int8()), - ("views", pa.int64()), - ("release", pa.timestamp("us")), - ("release_ns", pa.timestamp("ns")), - ("release_ms", pa.timestamp("ms")), - ("release_sec", pa.timestamp("s")), - ("release_tz", pa.timestamp("us", tz="UTC")), - ("film", pa.date32()), - ("u8", pa.uint8()), - ("u16", pa.uint16()), - ("u32", pa.uint32()), - ("u64", pa.uint64()), - ("hugedata", pa.decimal128(38, 0)), - ] - ), - "pl": pl.Struct( - { - "rating": pl.Float64, - "stars": pl.Int8, - "views": pl.Int64, - "release": pl.Datetime(time_unit="us"), - "release_ns": pl.Datetime(time_unit="ns"), - "release_ms": pl.Datetime(time_unit="ms"), - "release_sec": pl.Datetime(time_unit="ms"), - "release_tz": pl.Datetime(time_unit="us", time_zone="UTC"), - "film": pl.Date, - "u8": pl.UInt8, - "u16": pl.UInt16, - "u32": pl.UInt32, - "u64": pl.UInt64, - "hugedata": pl.Decimal(precision=38, scale=0), - } - ), + "arrow": pa.struct([ + ("rating", pa.float64()), + ("stars", pa.int8()), + ("views", pa.int64()), + ("release", pa.timestamp("us")), + ("release_ns", pa.timestamp("ns")), + ("release_ms", pa.timestamp("ms")), + ("release_sec", pa.timestamp("s")), + ("release_tz", pa.timestamp("us", tz="UTC")), + ("film", pa.date32()), + ("u8", pa.uint8()), + ("u16", pa.uint16()), + ("u32", pa.uint32()), + ("u64", pa.uint64()), + ("hugedata", pa.decimal128(38, 0)), + ]), + "pl": pl.Struct({ + "rating": pl.Float64, + "stars": pl.Int8, + "views": pl.Int64, + "release": pl.Datetime(time_unit="us"), + "release_ns": pl.Datetime(time_unit="ns"), + "release_ms": pl.Datetime(time_unit="ms"), + "release_sec": pl.Datetime(time_unit="ms"), + "release_tz": pl.Datetime(time_unit="us", time_zone="UTC"), + "film": pl.Date, + "u8": pl.UInt8, + "u16": pl.UInt16, + "u32": pl.UInt32, + "u64": pl.UInt64, + "hugedata": pl.Decimal(precision=38, scale=0), + }), }, # ------------------------------------------------ # miscellaneous @@ -82,12 +83,12 @@ } -def get_result(query_result, result_type, chunk_size): +def get_result(query_result: kuzu.QueryResult, result_type: str, chunk_size: int | None) -> Any: sz = [] if chunk_size is None else [chunk_size] return getattr(query_result, f"get_as_{result_type}")(*sz) -def assert_column_equals(data, col_name, return_type, expected_values): +def assert_column_equals(data: Any, col_name: str, return_type: str, expected_values: list[Any]) -> None: col = data[col_name] col_dtype = col.dtype if hasattr(col, "dtype") else col.type values = col.to_pylist() if return_type == "arrow" else col.to_list() @@ -97,15 +98,15 @@ def assert_column_equals(data, col_name, return_type, expected_values): assert col_dtype == _expected_dtypes[col_name][return_type], f"Unexpected dtype for {col_name} ({return_type!r})" -def assert_col_names(data, expected_col_names): +def assert_col_names(data: Any, expected_col_names: list[str]) -> None: col_names = [(c._name if hasattr(c, "_name") else c.name) for c in data] assert col_names == expected_col_names, f"Unexpected column names: {col_names!r}" -def test_to_arrow(establish_connection): +def test_to_arrow(establish_connection: ConnDB) -> None: conn, db = establish_connection - def _test_person_table(_conn, return_type, chunk_size=None): + def _test_person_table(_conn: kuzu.Connection, return_type: str, chunk_size: int | None = None) -> None: query = "MATCH (a:person) RETURN a.* ORDER BY a.ID" data = get_result(_conn.execute(query), return_type, chunk_size) assert len(data.columns) == 16 @@ -121,7 +122,16 @@ def _test_person_table(_conn, return_type, chunk_size=None): data=data, col_name="a.fName", return_type=return_type, - expected_values=["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], + expected_values=[ + "Alice", + "Bob", + "Carol", + "Dan", + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ], ) assert_column_equals( @@ -218,14 +228,32 @@ def _test_person_table(_conn, return_type, chunk_size=None): data=data, col_name="a.usedNames", return_type=return_type, - expected_values=[["Aida"], ["Bobby"], ["Carmen", "Fred"], ["Wolfeschlegelstein", "Daniel"], ["Ein"], ["Fesdwe"], ["Grad"], ["Ad", "De", "Hi", "Kye", "Orlan"]], + expected_values=[ + ["Aida"], + ["Bobby"], + ["Carmen", "Fred"], + ["Wolfeschlegelstein", "Daniel"], + ["Ein"], + ["Fesdwe"], + ["Grad"], + ["Ad", "De", "Hi", "Kye", "Orlan"], + ], ) assert_column_equals( data=data, col_name="a.courseScoresPerTerm", return_type=return_type, - expected_values=[[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], [[7, 4], [8, 8], [9]], [[6], [7], [8]], [[8]], [[10]], [[7], [10], [6, 7]]], + expected_values=[ + [[10, 8], [6, 7, 8]], + [[8, 9], [9, 10]], + [[8, 10]], + [[7, 4], [8, 8], [9]], + [[6], [7], [8]], + [[8]], + [[10]], + [[7], [10], [6, 7]], + ], ) assert_column_equals( @@ -260,7 +288,7 @@ def _test_person_table(_conn, return_type, chunk_size=None): ], ) - def _test_movies_table(_conn, return_type, chunk_size=None): + def _test_movies_table(_conn: kuzu.Connection, return_type: str, chunk_size: int | None = None) -> None: query = "MATCH (a:movies) RETURN a.length, a.description ORDER BY a.length" data = get_result(_conn.execute(query), return_type, chunk_size) @@ -282,7 +310,9 @@ def _test_movies_table(_conn, return_type, chunk_size=None): "stars": 2, "views": 152, "release": datetime(2011, 8, 20, 11, 25, 30), - "release_ns": datetime(2011, 8, 20, 11, 25, 30, 123456) if return_type == "pl" else Timestamp("2011-08-20 11:25:30.123456"), + "release_ns": datetime(2011, 8, 20, 11, 25, 30, 123456) + if return_type == "pl" + else Timestamp("2011-08-20 11:25:30.123456"), "release_ms": datetime(2011, 8, 20, 11, 25, 30, 123000), "release_sec": datetime(2011, 8, 20, 11, 25, 30), "release_tz": datetime(2011, 8, 20, 11, 25, 30, 123456, pytz.UTC), @@ -298,7 +328,9 @@ def _test_movies_table(_conn, return_type, chunk_size=None): "stars": 100, "views": 10003, "release": datetime(2011, 2, 11, 16, 44, 22), - "release_ns": datetime(2011, 2, 11, 16, 44, 22, 123456) if return_type == "pl" else Timestamp("2011-02-11 16:44:22.123456"), + "release_ns": datetime(2011, 2, 11, 16, 44, 22, 123456) + if return_type == "pl" + else Timestamp("2011-02-11 16:44:22.123456"), "release_ms": datetime(2011, 2, 11, 16, 44, 22, 123000), "release_sec": datetime(2011, 2, 11, 16, 44, 22), "release_tz": datetime(2011, 2, 11, 16, 44, 22, 123456, pytz.UTC), @@ -314,7 +346,9 @@ def _test_movies_table(_conn, return_type, chunk_size=None): "stars": 10, "views": 982, "release": datetime(2018, 11, 13, 13, 33, 11), - "release_ns": datetime(2018, 11, 13, 13, 33, 11, 123456) if return_type == "pl" else Timestamp("2018-11-13 13:33:11.123456"), + "release_ns": datetime(2018, 11, 13, 13, 33, 11, 123456) + if return_type == "pl" + else Timestamp("2018-11-13 13:33:11.123456"), "release_ms": datetime(2018, 11, 13, 13, 33, 11, 123000), "release_sec": datetime(2018, 11, 13, 13, 33, 11), "release_tz": datetime(2018, 11, 13, 13, 33, 11, 123456, pytz.UTC), @@ -328,7 +362,7 @@ def _test_movies_table(_conn, return_type, chunk_size=None): ], ) - def _test_utf8_string(_conn, return_type, chunk_size=None): + def _test_utf8_string(_conn: kuzu.Connection, return_type: str, chunk_size: int | None = None) -> None: query = "MATCH (m:movies) RETURN m.name" data = get_result(_conn.execute(query), return_type, chunk_size) @@ -340,7 +374,7 @@ def _test_utf8_string(_conn, return_type, chunk_size=None): expected_values=["Sóló cón tu párejâ", "The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie", "Roma"], ) - def _test_in_small_chunk_size(_conn, return_type, chunk_size=None): + def _test_in_small_chunk_size(_conn: kuzu.Connection, return_type: str, chunk_size: int | None = None) -> None: query = "MATCH (a:person) RETURN a.age, a.fName ORDER BY a.ID" data = get_result(_conn.execute(query), return_type, chunk_size) @@ -356,10 +390,19 @@ def _test_in_small_chunk_size(_conn, return_type, chunk_size=None): data=data, col_name="a.fName", return_type=return_type, - expected_values=["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], + expected_values=[ + "Alice", + "Bob", + "Carol", + "Dan", + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ], ) - def _test_with_nulls(_conn, return_type, chunk_size=None): + def _test_with_nulls(_conn: kuzu.Connection, return_type: str, chunk_size: int | None = None) -> None: query = "MATCH (a:person:organisation) RETURN label(a) AS `a.lbl`, a.fName, a.orgCode ORDER BY a.ID" data = get_result(_conn.execute(query), return_type, chunk_size) @@ -368,14 +411,38 @@ def _test_with_nulls(_conn, return_type, chunk_size=None): data=data, col_name="a.lbl", return_type=return_type, - expected_values=["person", "organisation", "person", "person", "organisation", "person", "organisation", "person", "person", "person", "person"], + expected_values=[ + "person", + "organisation", + "person", + "person", + "organisation", + "person", + "organisation", + "person", + "person", + "person", + "person", + ], ) assert_column_equals( data=data, col_name="a.fName", return_type=return_type, - expected_values=["Alice", None, "Bob", "Carol", None, "Dan", None, "Elizabeth", "Farooq", "Greg", "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], + expected_values=[ + "Alice", + None, + "Bob", + "Carol", + None, + "Dan", + None, + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ], ) assert_column_equals( @@ -397,10 +464,10 @@ def _test_with_nulls(_conn, return_type, chunk_size=None): _test_with_nulls(conn, "pl") -def test_to_arrow_complex(establish_connection): +def test_to_arrow_complex(establish_connection: ConnDB) -> None: conn, db = establish_connection - def _test_node(_conn): + def _test_node(_conn: kuzu.Connection) -> None: query = "MATCH (p:person) RETURN p ORDER BY p.ID" query_result = _conn.execute(query) arrow_tbl = query_result.get_as_arrow(12) @@ -417,7 +484,7 @@ def _test_node(_conn): ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[10], ] - def _test_node_rel(_conn): + def _test_node_rel(_conn: kuzu.Connection) -> None: query = "MATCH (a:person)-[e:workAt]->(b:organisation) RETURN a, e, b;" query_result = _conn.execute(query) arrow_tbl = query_result.get_as_arrow(12) @@ -459,7 +526,7 @@ def _test_node_rel(_conn): ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[6], ] - def _test_marries_table(_conn): + def _test_marries_table(_conn: kuzu.Connection) -> None: query = "MATCH (:person)-[e:marries]->(:person) RETURN e.*" arrow_tbl = _conn.execute(query).get_as_arrow(8) assert arrow_tbl.num_columns == 3 @@ -469,12 +536,12 @@ def _test_marries_table(_conn): assert len(used_addr_col) == 3 assert used_addr_col.to_pylist() == [["toronto"], None, []] - addr_col = arrow_tbl.column(1) + arrow_tbl.column(1) assert used_addr_col.type == pa.list_(pa.int16(), 2) assert len(used_addr_col) == 3 assert used_addr_col.to_pylist() == [[4, 5], [2, 5], [3, 9]] - note_col = arrow_tbl.column(2) + arrow_tbl.column(2) assert used_addr_col.type == pa.string() assert len(used_addr_col) == 3 assert used_addr_col.to_pylist() == [None, "long long long string", "short str"] @@ -483,7 +550,7 @@ def _test_marries_table(_conn): # _test_node_rel(conn) # _test_marries_table(conn) - def test_to_arrow1(establish_connection): + def test_to_arrow1(establish_connection: ConnDB) -> None: conn, db = establish_connection query = "MATCH (a:person)-[e:knows]->(:person) RETURN e.summary" arrow_tbl = conn.execute(query).get_as_arrow(8) diff --git a/tools/python_api/test/test_datatype.py b/tools/python_api/test/test_datatype.py index 36c72dd4611..ae7b486e55d 100644 --- a/tools/python_api/test/test_datatype.py +++ b/tools/python_api/test/test_datatype.py @@ -1,18 +1,22 @@ +from __future__ import annotations + import datetime -import pytz from uuid import UUID -def test_bool(establish_connection): +import pytz +from type_aliases import ConnDB + + +def test_bool(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:person) WHERE a.ID = 0 RETURN a.isStudent;") + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.isStudent;") assert result.has_next() assert result.get_next() == [True] assert not result.has_next() result.close() -def test_int(establish_connection): +def test_int(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.age;") assert result.has_next() @@ -20,7 +24,8 @@ def test_int(establish_connection): assert not result.has_next() result.close() -def test_int8(establish_connection): + +def test_int8(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.level;") assert result.has_next() @@ -28,7 +33,8 @@ def test_int8(establish_connection): assert not result.has_next() result.close() -def test_uint8(establish_connection): + +def test_uint8(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.ulevel;") assert result.has_next() @@ -36,7 +42,8 @@ def test_uint8(establish_connection): assert not result.has_next() result.close() -def test_uint16(establish_connection): + +def test_uint16(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.ulength;") assert result.has_next() @@ -44,7 +51,8 @@ def test_uint16(establish_connection): assert not result.has_next() result.close() -def test_uint32(establish_connection): + +def test_uint32(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.temprature;") assert result.has_next() @@ -52,7 +60,8 @@ def test_uint32(establish_connection): assert not result.has_next() result.close() -def test_uint64(establish_connection): + +def test_uint64(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.code;") assert result.has_next() @@ -60,7 +69,8 @@ def test_uint64(establish_connection): assert not result.has_next() result.close() -def test_int128(establish_connection): + +def test_int128(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.hugedata;") assert result.has_next() @@ -68,16 +78,17 @@ def test_int128(establish_connection): assert not result.has_next() result.close() -def test_serial(establish_connection): - conn, db = establish_connection - result = conn.execute("MATCH (a:moviesSerial) WHERE a.ID = 2 RETURN a.ID;") - assert result.has_next() - assert result.get_next() == [2] - assert not result.has_next() - result.close() +def test_serial(establish_connection: ConnDB) -> None: + conn, db = establish_connection + result = conn.execute("MATCH (a:moviesSerial) WHERE a.ID = 2 RETURN a.ID;") + assert result.has_next() + assert result.get_next() == [2] + assert not result.has_next() + result.close() -def test_double(establish_connection): + +def test_double(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.eyeSight;") assert result.has_next() @@ -86,16 +97,16 @@ def test_double(establish_connection): result.close() -def test_string(establish_connection): +def test_string(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.fName;") assert result.has_next() - assert result.get_next() == ['Alice'] + assert result.get_next() == ["Alice"] assert not result.has_next() result.close() -def test_blob(establish_connection): +def test_blob(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("RETURN BLOB('\\\\xAA\\\\xBB\\\\xCD\\\\x1A')") assert result.has_next() @@ -108,213 +119,207 @@ def test_blob(establish_connection): assert not result.has_next() result.close() -def test_uuid(establish_connection): + +def test_uuid(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("RETURN UUID('A0EEBC99-9c0b-4ef8-bb6d-6bb9bd380a12')") assert result.has_next() - assert result.get_next() == [UUID('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12')] + assert result.get_next() == [UUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12")] assert not result.has_next() result.close() -def test_date(establish_connection): + +def test_date(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:person) WHERE a.ID = 0 RETURN a.birthdate;") + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.birthdate;") assert result.has_next() assert result.get_next() == [datetime.date(1900, 1, 1)] assert not result.has_next() result.close() -def test_timestamp(establish_connection): +def test_timestamp(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:person) WHERE a.ID = 0 RETURN a.registerTime;") + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.registerTime;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30)] assert not result.has_next() result.close() -def test_timestamp_tz(establish_connection): + +def test_timestamp_tz(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_tz;") + result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_tz;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30, 123456, pytz.UTC)] assert not result.has_next() result.close() -def test_timestamp_ns(establish_connection): + +def test_timestamp_ns(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_ns;") + result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_ns;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30, 123456)] assert not result.has_next() result.close() -def test_timestamp_ms(establish_connection): + +def test_timestamp_ms(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_ms;") + result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_ms;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30, 123000)] assert not result.has_next() result.close() -def test_timestamp_ns(establish_connection): + +def test_timestamp_s(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_sec;") + result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_sec;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30)] assert not result.has_next() result.close() -def test_interval(establish_connection): + +def test_interval(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:person) WHERE a.ID = 0 RETURN a.lastJobDuration;") + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.lastJobDuration;") assert result.has_next() assert result.get_next() == [datetime.timedelta(days=1082, seconds=46920)] assert not result.has_next() result.close() -def test_list(establish_connection): +def test_list(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:person) WHERE a.ID = 0 RETURN a.courseScoresPerTerm;") + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.courseScoresPerTerm;") assert result.has_next() assert result.get_next() == [[[10, 8], [6, 7, 8]]] assert not result.has_next() result.close() -def test_map(establish_connection): +def test_map(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (m:movies) WHERE m.length = 2544 RETURN m.audience;") + result = conn.execute("MATCH (m:movies) WHERE m.length = 2544 RETURN m.audience;") assert result.has_next() - assert result.get_next() == [{'audience1': 33}] + assert result.get_next() == [{"audience1": 33}] assert not result.has_next() result.close() -def test_union(establish_connection): +def test_union(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (m:movies) WHERE m.length = 2544 RETURN m.grade;") + result = conn.execute("MATCH (m:movies) WHERE m.length = 2544 RETURN m.grade;") assert result.has_next() assert result.get_next() == [8.989] assert not result.has_next() result.close() -def test_node(establish_connection): +def test_node(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.has_next() n = result.get_next() - assert (len(n) == 1) + assert len(n) == 1 n = n[0] - assert (n['_label'] == 'person') - assert (n['ID'] == 0) - assert (n['fName'] == 'Alice') - assert (n['gender'] == 1) - assert (n['isStudent'] == True) - assert (n['eyeSight'] == 5.0) - assert (n['birthdate'] == datetime.date(1900, 1, 1)) - assert (n['registerTime'] == datetime.datetime(2011, 8, 20, 11, 25, 30)) - assert (n['lastJobDuration'] == datetime.timedelta( - days=1082, seconds=46920)) - assert (n['courseScoresPerTerm'] == [[10, 8], [6, 7, 8]]) - assert (n['usedNames'] == ['Aida']) + assert n["_label"] == "person" + assert n["ID"] == 0 + assert n["fName"] == "Alice" + assert n["gender"] == 1 + assert n["isStudent"] is True + assert n["eyeSight"] == 5.0 + assert n["birthdate"] == datetime.date(1900, 1, 1) + assert n["registerTime"] == datetime.datetime(2011, 8, 20, 11, 25, 30) + assert n["lastJobDuration"] == datetime.timedelta(days=1082, seconds=46920) + assert n["courseScoresPerTerm"] == [[10, 8], [6, 7, 8]] + assert n["usedNames"] == ["Aida"] assert not result.has_next() result.close() -def test_rel(establish_connection): +def test_rel(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (p:person)-[r:workAt]->(o:organisation) WHERE p.ID = 5 RETURN p, r, o") + result = conn.execute("MATCH (p:person)-[r:workAt]->(o:organisation) WHERE p.ID = 5 RETURN p, r, o") assert result.has_next() n = result.get_next() - assert (len(n) == 3) + assert len(n) == 3 p = n[0] r = n[1] o = n[2] - assert (p['_label'] == 'person') - assert (p['ID'] == 5) - assert (o['_label'] == 'organisation') - assert (o['ID'] == 6) - assert (r['year'] == 2010) - assert (r['_src'] == p['_id']) - assert (r['_dst'] == o['_id']) - assert (r['_label'] == 'workAt') + assert p["_label"] == "person" + assert p["ID"] == 5 + assert o["_label"] == "organisation" + assert o["ID"] == 6 + assert r["year"] == 2010 + assert r["_src"] == p["_id"] + assert r["_dst"] == o["_id"] + assert r["_label"] == "workAt" assert not result.has_next() result.close() -def test_struct(establish_connection): +def test_struct(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - 'MATCH (m:movies) WHERE m.name="Roma" RETURN m.description') + result = conn.execute('MATCH (m:movies) WHERE m.name="Roma" RETURN m.description') assert result.has_next() n = result.get_next() - assert (len(n) == 1) + assert len(n) == 1 description = n[0] print(description) - assert (description['rating'] == 1223) - assert (description['views'] == 10003) - assert (description['release'] == - datetime.datetime(2011, 2, 11, 16, 44, 22)) - assert (description['release_ns'] == - datetime.datetime(2011, 2, 11, 16, 44, 22, 123456)) - assert (description['release_ms'] == - datetime.datetime(2011, 2, 11, 16, 44, 22, 123000)) - assert (description['release_sec'] == - datetime.datetime(2011, 2, 11, 16, 44, 22)) - assert (description['release_tz'] == - datetime.datetime(2011, 2, 11, 16, 44, 22, 123456, pytz.UTC)) - assert (description['film'] == datetime.date(2013, 2, 22)) - assert (description['stars'] == 100) - assert (description['u8'] == 1) - assert (description['u16'] == 15) - assert (description['u32'] == 200) - assert (description['u64'] == 4) - assert (description['hugedata'] == -15) + assert description["rating"] == 1223 + assert description["views"] == 10003 + assert description["release"] == datetime.datetime(2011, 2, 11, 16, 44, 22) + assert description["release_ns"] == datetime.datetime(2011, 2, 11, 16, 44, 22, 123456) + assert description["release_ms"] == datetime.datetime(2011, 2, 11, 16, 44, 22, 123000) + assert description["release_sec"] == datetime.datetime(2011, 2, 11, 16, 44, 22) + assert description["release_tz"] == datetime.datetime(2011, 2, 11, 16, 44, 22, 123456, pytz.UTC) + assert description["film"] == datetime.date(2013, 2, 22) + assert description["stars"] == 100 + assert description["u8"] == 1 + assert description["u16"] == 15 + assert description["u32"] == 200 + assert description["u64"] == 4 + assert description["hugedata"] == -15 assert not result.has_next() result.close() -def test_recursive_rel(establish_connection): +def test_recursive_rel(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute( - "MATCH (a:person)-[e:studyAt*1..1]->(b:organisation) WHERE a.fName = 'Alice' RETURN e;" - ) + result = conn.execute("MATCH (a:person)-[e:studyAt*1..1]->(b:organisation) WHERE a.fName = 'Alice' RETURN e;") assert result.has_next() n = result.get_next() - assert (len(n) == 1) + assert len(n) == 1 e = n[0] - assert ("_nodes" in e) - assert ("_rels" in e) - assert (len(e["_nodes"]) == 0) - assert (len(e["_rels"]) == 1) + assert "_nodes" in e + assert "_rels" in e + assert len(e["_nodes"]) == 0 + assert len(e["_rels"]) == 1 rel = e["_rels"][0] - excepted_rel = {'_src': {'offset': 0, 'table': 0}, - '_dst': {'offset': 0, 'table': 1}, - '_label': 'studyAt', - 'year': 2021, - 'places': ['wwAewsdndweusd', 'wek'], - 'length': 5, 'level': 5, 'code': 9223372036854775808, 'temprature':32800, - 'ulength':33768, 'ulevel': 250, 'hugedata': 1844674407370955161811111111, - } - assert (rel == excepted_rel) + excepted_rel = { + "_src": {"offset": 0, "table": 0}, + "_dst": {"offset": 0, "table": 1}, + "_label": "studyAt", + "year": 2021, + "places": ["wwAewsdndweusd", "wek"], + "length": 5, + "level": 5, + "code": 9223372036854775808, + "temprature": 32800, + "ulength": 33768, + "ulevel": 250, + "hugedata": 1844674407370955161811111111, + } + assert rel == excepted_rel assert not result.has_next() result.close() -def test_rdf_variant(establish_connection): + +def test_rdf_variant(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:T_l) RETURN a.val ORDER BY a.id") assert result.has_next() diff --git a/tools/python_api/test/test_df.py b/tools/python_api/test/test_df.py index 180b7621364..715e8381f1f 100644 --- a/tools/python_api/test/test_df.py +++ b/tools/python_api/test/test_df.py @@ -1,146 +1,225 @@ +from __future__ import annotations + import datetime -import pytz import math -import sys from decimal import Decimal +from typing import Any from uuid import UUID import kuzu -from pandas import Timestamp, Timedelta, isna +import pytz +from pandas import Timedelta, Timestamp +from type_aliases import ConnDB -def test_to_df(establish_connection): +def test_to_df(establish_connection: ConnDB) -> None: conn, db = establish_connection - def _test_person_to_df(conn): + def _test_person_to_df(conn: kuzu.Connection) -> None: query = "MATCH (p:person) return p.* ORDER BY p.ID" pd = conn.execute(query).get_as_df() - assert pd['p.ID'].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] - assert str(pd['p.ID'].dtype) == "int64" - assert pd['p.fName'].tolist() == ["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"] - assert str(pd['p.fName'].dtype) == "object" - assert pd['p.gender'].tolist() == [1, 2, 1, 2, 1, 2, 2, 2] - assert str(pd['p.gender'].dtype) == "int64" - assert pd['p.isStudent'].tolist() == [True, True, False, False, False, True, False, False] - assert str(pd['p.isStudent'].dtype) == "bool" - assert pd['p.eyeSight'].tolist() == [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9] - assert str(pd['p.eyeSight'].dtype) == "float64" - assert pd['p.birthdate'].tolist() == [Timestamp('1900-01-01'), Timestamp('1900-01-01'), - Timestamp('1940-06-22'), Timestamp('1950-07-23 '), - Timestamp('1980-10-26'), Timestamp('1980-10-26'), - Timestamp('1980-10-26'), Timestamp('1990-11-27')] - assert str(pd['p.birthdate'].dtype) == "datetime64[us]" - assert pd['p.registerTime'].tolist() == [Timestamp('2011-08-20 11:25:30'), - Timestamp('2008-11-03 15:25:30.000526'), - Timestamp('1911-08-20 02:32:21'), Timestamp('2031-11-30 12:25:30'), - Timestamp('1976-12-23 11:21:42'), - Timestamp('1972-07-31 13:22:30.678559'), - Timestamp('1976-12-23 04:41:42'), Timestamp('2023-02-21 13:25:30')] - assert str(pd['p.registerTime'].dtype) == "datetime64[us]" - assert pd['p.lastJobDuration'].tolist() == [Timedelta('1082 days 13:02:00'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), Timedelta('0 days 00:18:00.024000'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('1082 days 13:02:00')] - assert str(pd['p.lastJobDuration'].dtype) == "timedelta64[ns]" - assert pd['p.workedHours'].tolist() == [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], - [10, 11, 12, 3, 4, 5, 6, 7]] - assert str(pd['p.workedHours'].dtype) == "object" - assert pd['p.usedNames'].tolist() == [["Aida"], ['Bobby'], ['Carmen', 'Fred'], - ['Wolfeschlegelstein', 'Daniel'], ['Ein'], ['Fesdwe'], ['Grad'], - ['Ad', 'De', 'Hi', 'Kye', 'Orlan']] - assert str(pd['p.usedNames'].dtype) == "object" - assert pd['p.courseScoresPerTerm'].tolist() == [[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], - [[7, 4], [8, 8], [9]], [[6], [7], [8]], [[8]], [[10]], - [[7], [10], [6, 7]]] - assert str(pd['p.courseScoresPerTerm'].dtype) == "object" - assert pd['p.grades'].tolist() == [[96, 54, 86, 92], [98, 42, 93, 88], [91, 75, 21, 95], [76, 88, 99, 89], - [96, 59, 65, 88], [80, 78, 34, 83], [43, 83, 67, 43], [77, 64, 100, 54]] - assert str(pd['p.grades'].dtype) == "object" + assert pd["p.ID"].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] + assert str(pd["p.ID"].dtype) == "int64" + assert pd["p.fName"].tolist() == [ + "Alice", + "Bob", + "Carol", + "Dan", + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ] + assert str(pd["p.fName"].dtype) == "object" + assert pd["p.gender"].tolist() == [1, 2, 1, 2, 1, 2, 2, 2] + assert str(pd["p.gender"].dtype) == "int64" + assert pd["p.isStudent"].tolist() == [True, True, False, False, False, True, False, False] + assert str(pd["p.isStudent"].dtype) == "bool" + assert pd["p.eyeSight"].tolist() == [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9] + assert str(pd["p.eyeSight"].dtype) == "float64" + assert pd["p.birthdate"].tolist() == [ + Timestamp("1900-01-01"), + Timestamp("1900-01-01"), + Timestamp("1940-06-22"), + Timestamp("1950-07-23 "), + Timestamp("1980-10-26"), + Timestamp("1980-10-26"), + Timestamp("1980-10-26"), + Timestamp("1990-11-27"), + ] + assert str(pd["p.birthdate"].dtype) == "datetime64[us]" + assert pd["p.registerTime"].tolist() == [ + Timestamp("2011-08-20 11:25:30"), + Timestamp("2008-11-03 15:25:30.000526"), + Timestamp("1911-08-20 02:32:21"), + Timestamp("2031-11-30 12:25:30"), + Timestamp("1976-12-23 11:21:42"), + Timestamp("1972-07-31 13:22:30.678559"), + Timestamp("1976-12-23 04:41:42"), + Timestamp("2023-02-21 13:25:30"), + ] + assert str(pd["p.registerTime"].dtype) == "datetime64[us]" + assert pd["p.lastJobDuration"].tolist() == [ + Timedelta("1082 days 13:02:00"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("0 days 00:18:00.024000"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("1082 days 13:02:00"), + ] + assert str(pd["p.lastJobDuration"].dtype) == "timedelta64[ns]" + assert pd["p.workedHours"].tolist() == [ + [10, 5], + [12, 8], + [4, 5], + [1, 9], + [2], + [3, 4, 5, 6, 7], + [1], + [10, 11, 12, 3, 4, 5, 6, 7], + ] + assert str(pd["p.workedHours"].dtype) == "object" + assert pd["p.usedNames"].tolist() == [ + ["Aida"], + ["Bobby"], + ["Carmen", "Fred"], + ["Wolfeschlegelstein", "Daniel"], + ["Ein"], + ["Fesdwe"], + ["Grad"], + ["Ad", "De", "Hi", "Kye", "Orlan"], + ] + assert str(pd["p.usedNames"].dtype) == "object" + assert pd["p.courseScoresPerTerm"].tolist() == [ + [[10, 8], [6, 7, 8]], + [[8, 9], [9, 10]], + [[8, 10]], + [[7, 4], [8, 8], [9]], + [[6], [7], [8]], + [[8]], + [[10]], + [[7], [10], [6, 7]], + ] + assert str(pd["p.courseScoresPerTerm"].dtype) == "object" + assert pd["p.grades"].tolist() == [ + [96, 54, 86, 92], + [98, 42, 93, 88], + [91, 75, 21, 95], + [76, 88, 99, 89], + [96, 59, 65, 88], + [80, 78, 34, 83], + [43, 83, 67, 43], + [77, 64, 100, 54], + ] + assert str(pd["p.grades"].dtype) == "object" expected_values = [1.731, 0.99, 1.00, 1.30, 1.463, 1.51, 1.6, 1.323] - actual_values = pd['p.height'].tolist() + actual_values = pd["p.height"].tolist() for expected, actual in zip(expected_values, actual_values): assert math.isclose(actual, expected, rel_tol=1e-5) - assert str(pd['p.height'].dtype) == "float32" + assert str(pd["p.height"].dtype) == "float32" - def _test_study_at_to_df(conn): + def _test_study_at_to_df(conn: kuzu.Connection) -> None: query = "MATCH (p:person)-[r:studyAt]->(o:organisation) return r.* order by r.length;" pd = conn.execute(query).get_as_df() - assert pd['r.year'].tolist() == [2021, 2020, 2020] - assert str(pd['r.year'].dtype) == "int64" - assert pd['r.places'].tolist() == [["wwAewsdndweusd", "wek"], ["awndsnjwejwen", "isuhuwennjnuhuhuwewe"], - ["anew", "jsdnwusklklklwewsd"]] - assert str(pd['r.places'].dtype) == "object" - assert pd['r.length'].tolist() == [5, 22, 55] - assert str(pd['r.length'].dtype) == "int16" - assert pd['r.level'].tolist() == [5, 2, 120] - assert str(pd['r.level'].dtype) == "int8" - assert pd['r.code'].tolist() == [9223372036854775808, 23, 6689] - assert str(pd['r.code'].dtype) == "uint64" - assert pd['r.temprature'].tolist() == [32800, 20, 1] - assert str(pd['r.temprature'].dtype) == "uint32" - assert pd['r.ulength'].tolist() == [33768, 180, 90] - assert str(pd['r.ulength'].dtype) == "uint16" - assert pd['r.ulevel'].tolist() == [250, 12, 220] - assert str(pd['r.ulevel'].dtype) == "uint8" - assert pd['r.hugedata'].tolist() == [1.8446744073709552e+27, -15.0, -1.8446744073709552e+21] - assert str(pd['r.hugedata'].dtype) == "float64" + assert pd["r.year"].tolist() == [2021, 2020, 2020] + assert str(pd["r.year"].dtype) == "int64" + assert pd["r.places"].tolist() == [ + ["wwAewsdndweusd", "wek"], + ["awndsnjwejwen", "isuhuwennjnuhuhuwewe"], + ["anew", "jsdnwusklklklwewsd"], + ] + assert str(pd["r.places"].dtype) == "object" + assert pd["r.length"].tolist() == [5, 22, 55] + assert str(pd["r.length"].dtype) == "int16" + assert pd["r.level"].tolist() == [5, 2, 120] + assert str(pd["r.level"].dtype) == "int8" + assert pd["r.code"].tolist() == [9223372036854775808, 23, 6689] + assert str(pd["r.code"].dtype) == "uint64" + assert pd["r.temprature"].tolist() == [32800, 20, 1] + assert str(pd["r.temprature"].dtype) == "uint32" + assert pd["r.ulength"].tolist() == [33768, 180, 90] + assert str(pd["r.ulength"].dtype) == "uint16" + assert pd["r.ulevel"].tolist() == [250, 12, 220] + assert str(pd["r.ulevel"].dtype) == "uint8" + assert pd["r.hugedata"].tolist() == [1.8446744073709552e27, -15.0, -1.8446744073709552e21] + assert str(pd["r.hugedata"].dtype) == "float64" - def _test_timestamps_to_df(conn): + def _test_timestamps_to_df(conn: kuzu.Connection) -> None: query = ( - "RETURN cast(\"2012-01-01 11:12:12.12345\", \"TIMESTAMP_NS\") as A, cast(\"2012-01-01 11:12:12.12345\", " - "\"TIMESTAMP_MS\") as B, cast(\"2012-01-01 11:12:12.12345\", \"TIMESTAMP_SEC\") as C, " - "cast(\"2012-01-01 11:12:12.12345\", \"TIMESTAMP_TZ\") as D") + 'RETURN cast("2012-01-01 11:12:12.12345", "TIMESTAMP_NS") as A, cast("2012-01-01 11:12:12.12345", ' + '"TIMESTAMP_MS") as B, cast("2012-01-01 11:12:12.12345", "TIMESTAMP_SEC") as C, ' + 'cast("2012-01-01 11:12:12.12345", "TIMESTAMP_TZ") as D' + ) pd = conn.execute(query).get_as_df() - assert pd['A'].tolist() == [Timestamp('2012-01-01 11:12:12.123450')] - assert pd['B'].tolist() == [Timestamp('2012-01-01 11:12:12.123000')] - assert pd['C'].tolist() == [Timestamp('2012-01-01 11:12:12')] - assert pd['D'].tolist() == [Timestamp('2012-01-01 11:12:12.123450')] + assert pd["A"].tolist() == [Timestamp("2012-01-01 11:12:12.123450")] + assert pd["B"].tolist() == [Timestamp("2012-01-01 11:12:12.123000")] + assert pd["C"].tolist() == [Timestamp("2012-01-01 11:12:12")] + assert pd["D"].tolist() == [Timestamp("2012-01-01 11:12:12.123450")] - def _test_movies_to_df(conn): + def _test_movies_to_df(conn: kuzu.Connection) -> None: query = "MATCH (m:movies) return m.* order by m.length;" pd = conn.execute(query).get_as_df() - assert pd['m.length'].tolist() == [126, 298, 2544] - assert str(pd['m.length'].dtype) == "int32" - assert pd['m.description'].tolist() == [{'rating': 5.3, 'stars': 2, 'views': 152, - 'release': datetime.datetime(2011, 8, 20, 11, 25, 30), - 'release_ns': datetime.datetime(2011, 8, 20, 11, 25, 30, 123456), - 'release_ms': datetime.datetime(2011, 8, 20, 11, 25, 30, 123000), - 'release_sec': datetime.datetime(2011, 8, 20, 11, 25, 30), - 'release_tz': datetime.datetime(2011, 8, 20, 11, 25, 30, 123456, - pytz.UTC), - 'film': datetime.date(2012, 5, 11), 'u8': 220, 'u16': 20, 'u32': 1, - 'u64': 180, 'hugedata': Decimal('1844674407370955161811111111')}, - {'rating': 1223.0, 'stars': 100, 'views': 10003, - 'release': datetime.datetime(2011, 2, 11, 16, 44, 22), - 'release_ns': datetime.datetime(2011, 2, 11, 16, 44, 22, 123456), - 'release_ms': datetime.datetime(2011, 2, 11, 16, 44, 22, 123000), - 'release_sec': datetime.datetime(2011, 2, 11, 16, 44, 22), - 'release_tz': datetime.datetime(2011, 2, 11, 16, 44, 22, 123456, - pytz.UTC), - 'film': datetime.date(2013, 2, 22), 'u8': 1, 'u16': 15, - 'u32': 200, - 'u64': 4, 'hugedata': Decimal(-15)}, - {'rating': 7.0, 'stars': 10, 'views': 982, - 'release': datetime.datetime(2018, 11, 13, 13, 33, 11), - 'release_ns': datetime.datetime(2018, 11, 13, 13, 33, 11, 123456), - 'release_ms': datetime.datetime(2018, 11, 13, 13, 33, 11, 123000), - 'release_sec': datetime.datetime(2018, 11, 13, 13, 33, 11), - 'release_tz': datetime.datetime(2018, 11, 13, 13, 33, 11, 123456, - pytz.UTC), - 'film': datetime.date(2014, 9, 12), 'u8': 12, - 'u16': 120, 'u32': 55, - 'u64': 1, 'hugedata': Decimal(-1844674407370955161511)}] - assert str(pd['m.description'].dtype) == "object" - assert pd['m.content'].tolist() == [b'\xaa\xabinteresting\x0b', b'pure ascii characters', b'\xab\xcd'] - assert str(pd['m.content'].dtype) == "object" - assert pd['m.audience'].tolist() == [{'audience1': 52, 'audience53': 42}, {}, {'audience1': 33}] - assert str(pd['m.audience'].dtype) == "object" - assert pd['m.grade'].tolist() == [True, 254.0, 8.989] - assert str(pd['m.grade'].dtype) == "object" + assert pd["m.length"].tolist() == [126, 298, 2544] + assert str(pd["m.length"].dtype) == "int32" + assert pd["m.description"].tolist() == [ + { + "rating": 5.3, + "stars": 2, + "views": 152, + "release": datetime.datetime(2011, 8, 20, 11, 25, 30), + "release_ns": datetime.datetime(2011, 8, 20, 11, 25, 30, 123456), + "release_ms": datetime.datetime(2011, 8, 20, 11, 25, 30, 123000), + "release_sec": datetime.datetime(2011, 8, 20, 11, 25, 30), + "release_tz": datetime.datetime(2011, 8, 20, 11, 25, 30, 123456, pytz.UTC), + "film": datetime.date(2012, 5, 11), + "u8": 220, + "u16": 20, + "u32": 1, + "u64": 180, + "hugedata": Decimal("1844674407370955161811111111"), + }, + { + "rating": 1223.0, + "stars": 100, + "views": 10003, + "release": datetime.datetime(2011, 2, 11, 16, 44, 22), + "release_ns": datetime.datetime(2011, 2, 11, 16, 44, 22, 123456), + "release_ms": datetime.datetime(2011, 2, 11, 16, 44, 22, 123000), + "release_sec": datetime.datetime(2011, 2, 11, 16, 44, 22), + "release_tz": datetime.datetime(2011, 2, 11, 16, 44, 22, 123456, pytz.UTC), + "film": datetime.date(2013, 2, 22), + "u8": 1, + "u16": 15, + "u32": 200, + "u64": 4, + "hugedata": Decimal(-15), + }, + { + "rating": 7.0, + "stars": 10, + "views": 982, + "release": datetime.datetime(2018, 11, 13, 13, 33, 11), + "release_ns": datetime.datetime(2018, 11, 13, 13, 33, 11, 123456), + "release_ms": datetime.datetime(2018, 11, 13, 13, 33, 11, 123000), + "release_sec": datetime.datetime(2018, 11, 13, 13, 33, 11), + "release_tz": datetime.datetime(2018, 11, 13, 13, 33, 11, 123456, pytz.UTC), + "film": datetime.date(2014, 9, 12), + "u8": 12, + "u16": 120, + "u32": 55, + "u64": 1, + "hugedata": Decimal(-1844674407370955161511), + }, + ] + assert str(pd["m.description"].dtype) == "object" + assert pd["m.content"].tolist() == [b"\xaa\xabinteresting\x0b", b"pure ascii characters", b"\xab\xcd"] + assert str(pd["m.content"].dtype) == "object" + assert pd["m.audience"].tolist() == [{"audience1": 52, "audience53": 42}, {}, {"audience1": 33}] + assert str(pd["m.audience"].dtype) == "object" + assert pd["m.grade"].tolist() == [True, 254.0, 8.989] + assert str(pd["m.grade"].dtype) == "object" _test_person_to_df(conn) conn.set_max_threads_for_exec(2) @@ -149,65 +228,94 @@ def _test_movies_to_df(conn): _test_timestamps_to_df(conn) -def test_df_multiple_times(establish_connection): +def test_df_multiple_times(establish_connection: ConnDB) -> None: conn, _ = establish_connection query = "MATCH (p:person) return p.ID ORDER BY p.ID" res = conn.execute(query) df = res.get_as_df() df_2 = res.get_as_df() df_3 = res.get_as_df() - assert df['p.ID'].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] - assert df_2['p.ID'].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] - assert df_3['p.ID'].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] + assert df["p.ID"].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] + assert df_2["p.ID"].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] + assert df_3["p.ID"].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] -def test_df_get_node(establish_connection): +def test_df_get_node(establish_connection: ConnDB) -> None: conn, _ = establish_connection query = "MATCH (p:person) return p" res = conn.execute(query) df = res.get_as_df() - p_list = df['p'].tolist() + p_list = df["p"].tolist() assert len(p_list) == 8 - ground_truth = { - 'ID': [0, 2, 3, 5, 7, 8, 9, 10], - 'fName': ["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], - 'gender': [1, 2, 1, 2, 1, 2, 2, 2], - 'isStudent': [True, True, False, False, False, True, False, False], - 'eyeSight': [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], - 'birthdate': [datetime.date(1900, 1, 1), datetime.date(1900, 1, 1), - datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), - datetime.date(1980, 10, 26), datetime.date(1980, 10, 26), - datetime.date(1980, 10, 26), datetime.date(1990, 11, 27)], - 'registerTime': [Timestamp('2011-08-20 11:25:30'), - Timestamp('2008-11-03 15:25:30.000526'), - Timestamp( - '1911-08-20 02:32:21'), Timestamp('2031-11-30 12:25:30'), - Timestamp('1976-12-23 11:21:42'), - Timestamp('1972-07-31 13:22:30.678559'), - Timestamp('1976-12-23 04:41:42'), Timestamp('2023-02-21 13:25:30')], - 'lastJobDuration': [Timedelta('1082 days 13:02:00'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), Timedelta( - '0 days 00:18:00.024000'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('1082 days 13:02:00')], - 'workedHours': [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], - [10, 11, 12, 3, 4, 5, 6, 7]], - 'usedNames': [["Aida"], ['Bobby'], ['Carmen', 'Fred'], - ['Wolfeschlegelstein', 'Daniel'], [ - 'Ein'], ['Fesdwe'], ['Grad'], - ['Ad', 'De', 'Hi', 'Kye', 'Orlan']], - 'courseScoresPerTerm': [[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], - [[7, 4], [8, 8], [9]], [ - [6], [7], [8]], [[8]], [[10]], - [[7], [10], [6, 7]]], - '_label': ['person', 'person', 'person', 'person', 'person', 'person', - 'person', 'person'], + ground_truth: dict[str, list[Any]] = { + "ID": [0, 2, 3, 5, 7, 8, 9, 10], + "fName": [ + "Alice", + "Bob", + "Carol", + "Dan", + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ], + "gender": [1, 2, 1, 2, 1, 2, 2, 2], + "isStudent": [True, True, False, False, False, True, False, False], + "eyeSight": [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], + "birthdate": [ + datetime.date(1900, 1, 1), + datetime.date(1900, 1, 1), + datetime.date(1940, 6, 22), + datetime.date(1950, 7, 23), + datetime.date(1980, 10, 26), + datetime.date(1980, 10, 26), + datetime.date(1980, 10, 26), + datetime.date(1990, 11, 27), + ], + "registerTime": [ + Timestamp("2011-08-20 11:25:30"), + Timestamp("2008-11-03 15:25:30.000526"), + Timestamp("1911-08-20 02:32:21"), + Timestamp("2031-11-30 12:25:30"), + Timestamp("1976-12-23 11:21:42"), + Timestamp("1972-07-31 13:22:30.678559"), + Timestamp("1976-12-23 04:41:42"), + Timestamp("2023-02-21 13:25:30"), + ], + "lastJobDuration": [ + Timedelta("1082 days 13:02:00"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("0 days 00:18:00.024000"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("1082 days 13:02:00"), + ], + "workedHours": [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], [10, 11, 12, 3, 4, 5, 6, 7]], + "usedNames": [ + ["Aida"], + ["Bobby"], + ["Carmen", "Fred"], + ["Wolfeschlegelstein", "Daniel"], + ["Ein"], + ["Fesdwe"], + ["Grad"], + ["Ad", "De", "Hi", "Kye", "Orlan"], + ], + "courseScoresPerTerm": [ + [[10, 8], [6, 7, 8]], + [[8, 9], [9, 10]], + [[8, 10]], + [[7, 4], [8, 8], [9]], + [[6], [7], [8]], + [[8]], + [[10]], + [[7], [10], [6, 7]], + ], + "_label": ["person", "person", "person", "person", "person", "person", "person", "person"], } for i in range(len(p_list)): p = p_list[i] @@ -215,123 +323,155 @@ def test_df_get_node(establish_connection): assert p[key] == ground_truth[key][i] -def test_df_get_node_rel(establish_connection): +def test_df_get_node_rel(establish_connection: ConnDB) -> None: conn, _ = establish_connection - res = conn.execute( - "MATCH (p:person)-[r:workAt]->(o:organisation) RETURN p, r, o ORDER BY p.fName") + res = conn.execute("MATCH (p:person)-[r:workAt]->(o:organisation) RETURN p, r, o ORDER BY p.fName") df = res.get_as_df() - p_list = df['p'].tolist() - o_list = df['o'].tolist() + p_list = df["p"].tolist() + o_list = df["o"].tolist() assert len(p_list) == 3 assert len(o_list) == 3 - ground_truth_p = { - 'ID': [3, 5, 7], - 'fName': ["Carol", "Dan", "Elizabeth"], - 'gender': [1, 2, 1], - 'isStudent': [False, False, False], - 'eyeSight': [5.0, 4.8, 4.7], - 'birthdate': [datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), - datetime.date(1980, 10, 26)], - 'registerTime': [Timestamp('1911-08-20 02:32:21'), Timestamp('2031-11-30 12:25:30'), - Timestamp('1976-12-23 11:21:42') - ], - 'lastJobDuration': [ - Timedelta('48 hours 24 minutes 11 seconds'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11')], - 'workedHours': [[4, 5], [1, 9], [2]], - 'usedNames': [["Carmen", "Fred"], ['Wolfeschlegelstein', 'Daniel'], ['Ein']], - 'courseScoresPerTerm': [[[8, 10]], [[7, 4], [8, 8], [9]], [[6], [7], [8]]], - '_label': ['person', 'person', 'person'], + ground_truth_p: dict[str, list[Any]] = { + "ID": [3, 5, 7], + "fName": ["Carol", "Dan", "Elizabeth"], + "gender": [1, 2, 1], + "isStudent": [False, False, False], + "eyeSight": [5.0, 4.8, 4.7], + "birthdate": [datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), datetime.date(1980, 10, 26)], + "registerTime": [ + Timestamp("1911-08-20 02:32:21"), + Timestamp("2031-11-30 12:25:30"), + Timestamp("1976-12-23 11:21:42"), + ], + "lastJobDuration": [ + Timedelta("48 hours 24 minutes 11 seconds"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + ], + "workedHours": [[4, 5], [1, 9], [2]], + "usedNames": [["Carmen", "Fred"], ["Wolfeschlegelstein", "Daniel"], ["Ein"]], + "courseScoresPerTerm": [[[8, 10]], [[7, 4], [8, 8], [9]], [[6], [7], [8]]], + "_label": ["person", "person", "person"], } for i in range(len(p_list)): p = p_list[i] for key in ground_truth_p: assert p[key] == ground_truth_p[key][i] - ground_truth_o = {'ID': [4, 6, 6], - 'name': ['CsWork', 'DEsWork', 'DEsWork'], - 'orgCode': [934, 824, 824], - 'mark': [4.1, 4.1, 4.1], - 'score': [-100, 7, 7], - 'history': ['2 years 4 days 10 hours', '2 years 4 hours 22 us 34 minutes', - '2 years 4 hours 22 us 34 minutes'], - 'licenseValidInterval': [Timedelta(days=9414), - Timedelta(days=3, seconds=36000, microseconds=100000), - Timedelta(days=3, seconds=36000, microseconds=100000)], - 'rating': [0.78, 0.52, 0.52], - '_label': ['organisation', 'organisation', 'organisation'], - } + ground_truth_o: dict[str, list[Any]] = { + "ID": [4, 6, 6], + "name": ["CsWork", "DEsWork", "DEsWork"], + "orgCode": [934, 824, 824], + "mark": [4.1, 4.1, 4.1], + "score": [-100, 7, 7], + "history": ["2 years 4 days 10 hours", "2 years 4 hours 22 us 34 minutes", "2 years 4 hours 22 us 34 minutes"], + "licenseValidInterval": [ + Timedelta(days=9414), + Timedelta(days=3, seconds=36000, microseconds=100000), + Timedelta(days=3, seconds=36000, microseconds=100000), + ], + "rating": [0.78, 0.52, 0.52], + "_label": ["organisation", "organisation", "organisation"], + } for i in range(len(o_list)): - o = df['o'][i] + o = df["o"][i] for key in ground_truth_o: assert o[key] == ground_truth_o[key][i] - assert (df['r'][0]['year'] == 2015) - assert (df['r'][1]['year'] == 2010) - assert (df['r'][2]['year'] == 2015) + assert df["r"][0]["year"] == 2015 + assert df["r"][1]["year"] == 2010 + assert df["r"][2]["year"] == 2015 - for i in range(len(df['r'])): - assert (df['r'][i]['_src'] == df['p'][i]['_id']) - assert (df['r'][i]['_dst'] == df['o'][i]['_id']) + for i in range(len(df["r"])): + assert df["r"][i]["_src"] == df["p"][i]["_id"] + assert df["r"][i]["_dst"] == df["o"][i]["_id"] -def test_df_get_recursive_join(establish_connection): +def test_df_get_recursive_join(establish_connection: ConnDB) -> None: conn, _ = establish_connection res = conn.execute( "MATCH (p:person)-[r:knows*1..2 (e, n | WHERE e.comments = ['rnme','m8sihsdnf2990nfiwf'])]-(m:person) WHERE " - "p.ID = 0 and m.ID = 0 RETURN r").get_as_df() - assert res['r'][0] == {'_nodes': [{'ID': 2, - '_id': {'offset': 1, 'table': 0}, - '_label': 'person', - 'age': 30, - 'birthdate': datetime.date(1900, 1, 1), - 'courseScoresPerTerm': [[8, 9], [9, 10]], - 'eyeSight': 5.1, - 'fName': 'Bob', - 'gender': 2, - 'grades': [98, 42, 93, 88], - 'height': 0.9900000095367432, - 'u': UUID('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12'), - 'isStudent': True, - 'isWorker': False, - 'lastJobDuration': datetime.timedelta(days=3750, seconds=46800, microseconds=24), - 'registerTime': datetime.datetime(2008, 11, 3, 15, 25, 30, 526), - 'usedNames': ['Bobby'], - 'workedHours': [12, 8]}], - '_rels': [{'_dst': {'offset': 1, 'table': 0}, - '_label': 'knows', - '_src': {'offset': 0, 'table': 0}, - 'comments': ['rnme', 'm8sihsdnf2990nfiwf'], - 'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(1986, 10, 21, 21, 8, 31, 521000), - 'notes': 1, - 'summary': {'locations': ["'toronto'", "'waterloo'"], - 'transfer': {'amount': [100, 200], - 'day': datetime.date(2021, 1, 2)}}, - 'someMap': {'a': 'b'}, - 'validInterval': datetime.timedelta(days=3750, seconds=46800, microseconds=24)}, - {'_dst': {'offset': 0, 'table': 0}, - '_label': 'knows', - '_src': {'offset': 1, 'table': 0}, - 'comments': ['rnme', 'm8sihsdnf2990nfiwf'], - 'date': datetime.date(2021, 6, 30), - 'meetTime': datetime.datetime(1986, 10, 21, 21, 8, 31, 521000), - 'notes': 1, - 'summary': {'locations': ["'toronto'", "'waterloo'"], - 'transfer': {'amount': [100, 200], - 'day': datetime.date(2021, 1, 2)}}, - 'someMap': {'a': 'b'}, - 'validInterval': datetime.timedelta(days=3750, seconds=46800, microseconds=24)}]} + "p.ID = 0 and m.ID = 0 RETURN r" + ).get_as_df() + assert res["r"][0] == { + "_nodes": [ + { + "ID": 2, + "_id": {"offset": 1, "table": 0}, + "_label": "person", + "age": 30, + "birthdate": datetime.date(1900, 1, 1), + "courseScoresPerTerm": [[8, 9], [9, 10]], + "eyeSight": 5.1, + "fName": "Bob", + "gender": 2, + "grades": [98, 42, 93, 88], + "height": 0.9900000095367432, + "u": UUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12"), + "isStudent": True, + "isWorker": False, + "lastJobDuration": datetime.timedelta(days=3750, seconds=46800, microseconds=24), + "registerTime": datetime.datetime(2008, 11, 3, 15, 25, 30, 526), + "usedNames": ["Bobby"], + "workedHours": [12, 8], + } + ], + "_rels": [ + { + "_dst": {"offset": 1, "table": 0}, + "_label": "knows", + "_src": {"offset": 0, "table": 0}, + "comments": ["rnme", "m8sihsdnf2990nfiwf"], + "date": datetime.date(2021, 6, 30), + "meetTime": datetime.datetime(1986, 10, 21, 21, 8, 31, 521000), + "notes": 1, + "summary": { + "locations": ["'toronto'", "'waterloo'"], + "transfer": {"amount": [100, 200], "day": datetime.date(2021, 1, 2)}, + }, + "someMap": {"a": "b"}, + "validInterval": datetime.timedelta(days=3750, seconds=46800, microseconds=24), + }, + { + "_dst": {"offset": 0, "table": 0}, + "_label": "knows", + "_src": {"offset": 1, "table": 0}, + "comments": ["rnme", "m8sihsdnf2990nfiwf"], + "date": datetime.date(2021, 6, 30), + "meetTime": datetime.datetime(1986, 10, 21, 21, 8, 31, 521000), + "notes": 1, + "summary": { + "locations": ["'toronto'", "'waterloo'"], + "transfer": {"amount": [100, 200], "day": datetime.date(2021, 1, 2)}, + }, + "someMap": {"a": "b"}, + "validInterval": datetime.timedelta(days=3750, seconds=46800, microseconds=24), + }, + ], + } -def test_get_rdf_variant(establish_connection): +def test_get_rdf_variant(establish_connection: ConnDB) -> None: conn, _ = establish_connection - res = conn.execute( - "MATCH (a:T_l) RETURN a.val ORDER BY a.id").get_as_df() - assert res['a.val'].tolist() == [12, 43, 33, 2, 90, 77, 12, 1, 4.4, 1.2000000476837158, True, "hhh", - datetime.date(2024, 1, 1), - datetime.datetime(2024, 1, 1, 11, 25, 30), datetime.timedelta(days=2), b'\xb2'] + res = conn.execute("MATCH (a:T_l) RETURN a.val ORDER BY a.id").get_as_df() + assert res["a.val"].tolist() == [ + 12, + 43, + 33, + 2, + 90, + 77, + 12, + 1, + 4.4, + 1.2000000476837158, + True, + "hhh", + datetime.date(2024, 1, 1), + datetime.datetime(2024, 1, 1, 11, 25, 30), + datetime.timedelta(days=2), + b"\xb2", + ] diff --git a/tools/python_api/test/test_exception.py b/tools/python_api/test/test_exception.py index 1d3dd14868b..1c964664a8d 100644 --- a/tools/python_api/test/test_exception.py +++ b/tools/python_api/test/test_exception.py @@ -1,9 +1,13 @@ -import pytest +from __future__ import annotations + import sys + import kuzu +import pytest +from type_aliases import ConnDB -def test_exception(establish_connection): +def test_exception(establish_connection: ConnDB) -> None: conn, db = establish_connection with pytest.raises(RuntimeError, match="Parameter asd not found."): @@ -13,16 +17,17 @@ def test_exception(establish_connection): conn.execute("MATCH (a:person) RETURN a.dummy;") -def test_db_path_exception(): +def test_db_path_exception() -> None: path = "" if sys.platform == "win32": - error_message = 'Failed to create directory' + error_message = "Failed to create directory" else: - error_message = 'filesystem error' + error_message = "filesystem error" with pytest.raises(RuntimeError, match=error_message): kuzu.Database(path) -def test_read_only_exception(establish_connection): + +def test_read_only_exception(establish_connection: ConnDB) -> None: # TODO: Enable this test on Windows when the read-only mode is implemented. if sys.platform == "win32": pytest.skip("Read-only mode has not been implemented on Windows yet") @@ -33,18 +38,25 @@ def test_read_only_exception(establish_connection): with pytest.raises(RuntimeError, match="Cannot execute write operations in a read-only database!"): conn.execute("CREATE NODE TABLE test (id INT64, PRIMARY KEY(id));") -def test_max_db_size_exception(): - with pytest.raises(RuntimeError, match="Buffer manager exception: The given max db size should be at least 4194304 bytes."): + +def test_max_db_size_exception() -> None: + with pytest.raises( + RuntimeError, match="Buffer manager exception: The given max db size should be at least 4194304 bytes." + ): kuzu.Database("test.db", max_db_size=1024) with pytest.raises(RuntimeError, match="Buffer manager exception: The given max db size should be a power of 2."): kuzu.Database("test.db", max_db_size=4194305) -def test_buffer_pool_size_exception(): - with pytest.raises(RuntimeError, match="Buffer manager exception: The given buffer pool size should be at least 4KB."): + +def test_buffer_pool_size_exception() -> None: + with pytest.raises( + RuntimeError, match="Buffer manager exception: The given buffer pool size should be at least 4KB." + ): kuzu.Database("test.db", buffer_pool_size=1024) -def test_query_exception(establish_connection): + +def test_query_exception(establish_connection: ConnDB) -> None: conn, db = establish_connection with pytest.raises(RuntimeError, match="Binder exception: Table nonexisting does not exist."): conn.execute("MATCH (a:nonexisting) RETURN a;") diff --git a/tools/python_api/test/test_extension.py b/tools/python_api/test/test_extension.py index 162ebb6142f..a936a8436b2 100644 --- a/tools/python_api/test/test_extension.py +++ b/tools/python_api/test/test_extension.py @@ -1,4 +1,9 @@ -def test_install_and_load_httpfs(establish_connection): +from __future__ import annotations + +from type_aliases import ConnDB + + +def test_install_and_load_httpfs(establish_connection: ConnDB) -> None: conn, db = establish_connection conn.execute("INSTALL httpfs") conn.execute("LOAD EXTENSION httpfs") diff --git a/tools/python_api/test/test_get_header.py b/tools/python_api/test/test_get_header.py index 1d378e4b30b..c4c9de6cd47 100644 --- a/tools/python_api/test/test_get_header.py +++ b/tools/python_api/test/test_get_header.py @@ -1,46 +1,49 @@ -def test_get_column_names(establish_connection): +from __future__ import annotations + +from type_aliases import ConnDB + + +def test_get_column_names(establish_connection: ConnDB) -> None: conn, db = establish_connection - with conn.execute( - "MATCH (a:person)-[e:knows]->(b:person) RETURN a.fName, e.date, b.ID;" - ) as result: + with conn.execute("MATCH (a:person)-[e:knows]->(b:person) RETURN a.fName, e.date, b.ID;") as result: column_names = result.get_column_names() - assert column_names[0] == 'a.fName' - assert column_names[1] == 'e.date' - assert column_names[2] == 'b.ID' + assert column_names[0] == "a.fName" + assert column_names[1] == "e.date" + assert column_names[2] == "b.ID" -def test_get_column_data_types(establish_connection): +def test_get_column_data_types(establish_connection: ConnDB) -> None: conn, db = establish_connection with conn.execute( "MATCH (p:person) RETURN p.ID, p.fName, p.isStudent, p.eyeSight, p.birthdate, p.registerTime, " "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;" ) as result: column_data_types = result.get_column_data_types() - assert column_data_types[0] == 'INT64' - assert column_data_types[1] == 'STRING' - assert column_data_types[2] == 'BOOL' - assert column_data_types[3] == 'DOUBLE' - assert column_data_types[4] == 'DATE' - assert column_data_types[5] == 'TIMESTAMP' - assert column_data_types[6] == 'INTERVAL' - assert column_data_types[7] == 'INT64[]' - assert column_data_types[8] == 'INT64[][]' + assert column_data_types[0] == "INT64" + assert column_data_types[1] == "STRING" + assert column_data_types[2] == "BOOL" + assert column_data_types[3] == "DOUBLE" + assert column_data_types[4] == "DATE" + assert column_data_types[5] == "TIMESTAMP" + assert column_data_types[6] == "INTERVAL" + assert column_data_types[7] == "INT64[]" + assert column_data_types[8] == "INT64[][]" -def test_get_schema(establish_connection): +def test_get_schema(establish_connection: ConnDB) -> None: conn, db = establish_connection with conn.execute( "MATCH (p:person) RETURN p.ID, p.fName, p.isStudent, p.eyeSight, p.birthdate, p.registerTime, " "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;" ) as result: assert result.get_schema() == { - 'p.ID': 'INT64', - 'p.fName': 'STRING', - 'p.isStudent': 'BOOL', - 'p.eyeSight': 'DOUBLE', - 'p.birthdate': 'DATE', - 'p.registerTime': 'TIMESTAMP', - 'p.lastJobDuration': 'INTERVAL', - 'p.workedHours': 'INT64[]', - 'p.courseScoresPerTerm': 'INT64[][]' + "p.ID": "INT64", + "p.fName": "STRING", + "p.isStudent": "BOOL", + "p.eyeSight": "DOUBLE", + "p.birthdate": "DATE", + "p.registerTime": "TIMESTAMP", + "p.lastJobDuration": "INTERVAL", + "p.workedHours": "INT64[]", + "p.courseScoresPerTerm": "INT64[][]", } diff --git a/tools/python_api/test/test_helper.py b/tools/python_api/test/test_helper.py index 57a0696b12e..cdffb07c1e7 100644 --- a/tools/python_api/test/test_helper.py +++ b/tools/python_api/test/test_helper.py @@ -1,8 +1,8 @@ -from pathlib import Path import sys +from pathlib import Path KUZU_ROOT = Path(__file__).parent.parent.parent.parent if sys.platform == "win32": # \ in paths is not supported by kuzu's parser - KUZU_ROOT=str(KUZU_ROOT).replace("\\", "/") + KUZU_ROOT = str(KUZU_ROOT).replace("\\", "/") diff --git a/tools/python_api/test/test_networkx.py b/tools/python_api/test/test_networkx.py index d49da0be117..46fbac7da21 100644 --- a/tools/python_api/test/test_networkx.py +++ b/tools/python_api/test/test_networkx.py @@ -1,8 +1,13 @@ +from __future__ import annotations + import datetime -from pandas import Timestamp, Timedelta +from typing import Any + +from pandas import Timedelta, Timestamp +from type_aliases import ConnDB -def test_to_networkx_node(establish_connection): +def test_to_networkx_node(establish_connection: ConnDB) -> None: conn, _ = establish_connection query = "MATCH (p:person) return p" @@ -11,58 +16,94 @@ def test_to_networkx_node(establish_connection): nodes = list(nx_graph.nodes(data=True)) assert len(nodes) == 8 - ground_truth = { - 'ID': [0, 2, 3, 5, 7, 8, 9, 10], - 'fName': ["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], - 'gender': [1, 2, 1, 2, 1, 2, 2, 2], - 'isStudent': [True, True, False, False, False, True, False, False], - 'eyeSight': [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], - 'birthdate': [datetime.date(1900, 1, 1), datetime.date(1900, 1, 1), - datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), - datetime.date(1980, 10, 26), datetime.date(1980, 10, 26), - datetime.date(1980, 10, 26), datetime.date(1990, 11, 27)], - 'registerTime': [Timestamp('2011-08-20 11:25:30'), - Timestamp('2008-11-03 15:25:30.000526'), - Timestamp( - '1911-08-20 02:32:21'), Timestamp('2031-11-30 12:25:30'), - Timestamp('1976-12-23 11:21:42'), - Timestamp('1972-07-31 13:22:30.678559'), - Timestamp('1976-12-23 04:41:42'), Timestamp('2023-02-21 13:25:30')], - 'lastJobDuration': [Timedelta('1082 days 13:02:00'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), Timedelta( - '0 days 00:18:00.024000'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('1082 days 13:02:00')], - 'workedHours': [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], - [10, 11, 12, 3, 4, 5, 6, 7]], - 'usedNames': [["Aida"], ['Bobby'], ['Carmen', 'Fred'], - ['Wolfeschlegelstein', 'Daniel'], [ - 'Ein'], ['Fesdwe'], ['Grad'], - ['Ad', 'De', 'Hi', 'Kye', 'Orlan']], - 'courseScoresPerTerm': [[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], - [[7, 4], [8, 8], [9]], [ - [6], [7], [8]], [[8]], [[10]], - [[7], [10], [6, 7]]], - 'grades': [[96, 54, 86, 92], [98, 42, 93, 88], [91, 75, 21, 95], [76, 88, 99, 89], [96, 59, 65, 88], - [80, 78, 34, 83], [43, 83, 67, 43], [77, 64, 100, 54]], - '_label': ['person', 'person', 'person', 'person', 'person', 'person', - 'person', 'person'], + ground_truth: dict[str, list[Any]] = { + "ID": [0, 2, 3, 5, 7, 8, 9, 10], + "fName": [ + "Alice", + "Bob", + "Carol", + "Dan", + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ], + "gender": [1, 2, 1, 2, 1, 2, 2, 2], + "isStudent": [True, True, False, False, False, True, False, False], + "eyeSight": [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], + "birthdate": [ + datetime.date(1900, 1, 1), + datetime.date(1900, 1, 1), + datetime.date(1940, 6, 22), + datetime.date(1950, 7, 23), + datetime.date(1980, 10, 26), + datetime.date(1980, 10, 26), + datetime.date(1980, 10, 26), + datetime.date(1990, 11, 27), + ], + "registerTime": [ + Timestamp("2011-08-20 11:25:30"), + Timestamp("2008-11-03 15:25:30.000526"), + Timestamp("1911-08-20 02:32:21"), + Timestamp("2031-11-30 12:25:30"), + Timestamp("1976-12-23 11:21:42"), + Timestamp("1972-07-31 13:22:30.678559"), + Timestamp("1976-12-23 04:41:42"), + Timestamp("2023-02-21 13:25:30"), + ], + "lastJobDuration": [ + Timedelta("1082 days 13:02:00"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("0 days 00:18:00.024000"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("1082 days 13:02:00"), + ], + "workedHours": [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], [10, 11, 12, 3, 4, 5, 6, 7]], + "usedNames": [ + ["Aida"], + ["Bobby"], + ["Carmen", "Fred"], + ["Wolfeschlegelstein", "Daniel"], + ["Ein"], + ["Fesdwe"], + ["Grad"], + ["Ad", "De", "Hi", "Kye", "Orlan"], + ], + "courseScoresPerTerm": [ + [[10, 8], [6, 7, 8]], + [[8, 9], [9, 10]], + [[8, 10]], + [[7, 4], [8, 8], [9]], + [[6], [7], [8]], + [[8]], + [[10]], + [[7], [10], [6, 7]], + ], + "grades": [ + [96, 54, 86, 92], + [98, 42, 93, 88], + [91, 75, 21, 95], + [76, 88, 99, 89], + [96, 59, 65, 88], + [80, 78, 34, 83], + [43, 83, 67, 43], + [77, 64, 100, 54], + ], + "_label": ["person", "person", "person", "person", "person", "person", "person", "person"], } for i in range(len(nodes)): node_id, node = nodes[i] - assert node_id == "%s_%d" % (node['_label'], node['ID']) + assert node_id == "%s_%d" % (node["_label"], node["ID"]) for key in ground_truth: assert node[key] == ground_truth[key][i] -def test_networkx_undirected(establish_connection): +def test_networkx_undirected(establish_connection: ConnDB) -> None: conn, _ = establish_connection - res = conn.execute( - "MATCH (p1:person)-[r:knows]->(p2:person) WHERE p1.ID <= 3 RETURN p1, r, p2") + res = conn.execute("MATCH (p1:person)-[r:knows]->(p2:person) WHERE p1.ID <= 3 RETURN p1, r, p2") nx_graph = res.get_as_networkx(directed=False) assert not nx_graph.is_directed() @@ -72,54 +113,91 @@ def test_networkx_undirected(establish_connection): edges = list(nx_graph.edges(data=True)) - ground_truth_p = { - 'ID': [0, 2, 3, 5, 7, 8, 9, 10], - 'fName': ["Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"], - 'gender': [1, 2, 1, 2, 1, 2, 2, 2], - 'isStudent': [True, True, False, False, False, True, False, False], - 'eyeSight': [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], - 'birthdate': [datetime.date(1900, 1, 1), datetime.date(1900, 1, 1), - datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), - datetime.date(1980, 10, 26), datetime.date(1980, 10, 26), - datetime.date(1980, 10, 26), datetime.date(1990, 11, 27)], - 'registerTime': [Timestamp('2011-08-20 11:25:30'), - Timestamp('2008-11-03 15:25:30.000526'), - Timestamp( - '1911-08-20 02:32:21'), Timestamp('2031-11-30 12:25:30'), - Timestamp('1976-12-23 11:21:42'), - Timestamp('1972-07-31 13:22:30.678559'), - Timestamp('1976-12-23 04:41:42'), Timestamp('2023-02-21 13:25:30')], - 'lastJobDuration': [Timedelta('1082 days 13:02:00'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11'), Timedelta( - '0 days 00:18:00.024000'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('1082 days 13:02:00')], - 'workedHours': [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], - [10, 11, 12, 3, 4, 5, 6, 7]], - 'usedNames': [["Aida"], ['Bobby'], ['Carmen', 'Fred'], - ['Wolfeschlegelstein', 'Daniel'], [ - 'Ein'], ['Fesdwe'], ['Grad'], - ['Ad', 'De', 'Hi', 'Kye', 'Orlan']], - 'courseScoresPerTerm': [[[10, 8], [6, 7, 8]], [[8, 9], [9, 10]], [[8, 10]], - [[7, 4], [8, 8], [9]], [ - [6], [7], [8]], [[8]], [[10]], - [[7], [10], [6, 7]]], - 'grades': [[96, 54, 86, 92], [98, 42, 93, 88], [91, 75, 21, 95], [76, 88, 99, 89], [96, 59, 65, 88], - [80, 78, 34, 83], [43, 83, 67, 43], [77, 64, 100, 54]], - '_label': ['person', 'person', 'person', 'person', 'person', 'person', - 'person', 'person'], + ground_truth_p: dict[str, list[Any]] = { + "ID": [0, 2, 3, 5, 7, 8, 9, 10], + "fName": [ + "Alice", + "Bob", + "Carol", + "Dan", + "Elizabeth", + "Farooq", + "Greg", + "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff", + ], + "gender": [1, 2, 1, 2, 1, 2, 2, 2], + "isStudent": [True, True, False, False, False, True, False, False], + "eyeSight": [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9], + "birthdate": [ + datetime.date(1900, 1, 1), + datetime.date(1900, 1, 1), + datetime.date(1940, 6, 22), + datetime.date(1950, 7, 23), + datetime.date(1980, 10, 26), + datetime.date(1980, 10, 26), + datetime.date(1980, 10, 26), + datetime.date(1990, 11, 27), + ], + "registerTime": [ + Timestamp("2011-08-20 11:25:30"), + Timestamp("2008-11-03 15:25:30.000526"), + Timestamp("1911-08-20 02:32:21"), + Timestamp("2031-11-30 12:25:30"), + Timestamp("1976-12-23 11:21:42"), + Timestamp("1972-07-31 13:22:30.678559"), + Timestamp("1976-12-23 04:41:42"), + Timestamp("2023-02-21 13:25:30"), + ], + "lastJobDuration": [ + Timedelta("1082 days 13:02:00"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + Timedelta("0 days 00:18:00.024000"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("1082 days 13:02:00"), + ], + "workedHours": [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], [10, 11, 12, 3, 4, 5, 6, 7]], + "usedNames": [ + ["Aida"], + ["Bobby"], + ["Carmen", "Fred"], + ["Wolfeschlegelstein", "Daniel"], + ["Ein"], + ["Fesdwe"], + ["Grad"], + ["Ad", "De", "Hi", "Kye", "Orlan"], + ], + "courseScoresPerTerm": [ + [[10, 8], [6, 7, 8]], + [[8, 9], [9, 10]], + [[8, 10]], + [[7, 4], [8, 8], [9]], + [[6], [7], [8]], + [[8]], + [[10]], + [[7], [10], [6, 7]], + ], + "grades": [ + [96, 54, 86, 92], + [98, 42, 93, 88], + [91, 75, 21, 95], + [76, 88, 99, 89], + [96, 59, 65, 88], + [80, 78, 34, 83], + [43, 83, 67, 43], + [77, 64, 100, 54], + ], + "_label": ["person", "person", "person", "person", "person", "person", "person", "person"], } - for (node_id, node) in nodes: - assert node_id == "%s_%d" % (node['_label'], node['ID']) + for node_id, node in nodes: + assert node_id == "%s_%d" % (node["_label"], node["ID"]) - for (_, node) in nodes: + for _, node in nodes: found = False - for i in range(len(ground_truth_p['ID'])): - if node['ID'] != ground_truth_p['ID'][i]: + for i in range(len(ground_truth_p["ID"])): + if node["ID"] != ground_truth_p["ID"][i]: continue found = True for key in ground_truth_p: @@ -135,10 +213,9 @@ def test_networkx_undirected(establish_connection): assert nx_graph.has_edge(nodes[i][0], nodes[j][0]) -def test_networkx_directed(establish_connection): +def test_networkx_directed(establish_connection: ConnDB) -> None: conn, _ = establish_connection - res = conn.execute( - "MATCH (p:person)-[r:workAt]->(o:organisation) RETURN p, r, o") + res = conn.execute("MATCH (p:person)-[r:workAt]->(o:organisation) RETURN p, r, o") nx_graph = res.get_as_networkx(directed=True) assert nx_graph.is_directed() @@ -148,61 +225,63 @@ def test_networkx_directed(establish_connection): edges = list(nx_graph.edges(data=True)) - ground_truth_p = { - 'ID': [3, 5, 7], - 'fName': ["Carol", "Dan", "Elizabeth"], - 'gender': [1, 2, 1], - 'isStudent': [False, False, False], - 'eyeSight': [5.0, 4.8, 4.7], - 'birthdate': [datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), - datetime.date(1980, 10, 26)], - 'registerTime': [Timestamp('1911-08-20 02:32:21'), Timestamp('2031-11-30 12:25:30'), - Timestamp('1976-12-23 11:21:42') - ], - 'lastJobDuration': [ - Timedelta('48 hours 24 minutes 11 seconds'), - Timedelta('3750 days 13:00:00.000024'), - Timedelta('2 days 00:24:11')], - 'workedHours': [[4, 5], [1, 9], [2]], - 'usedNames': [["Carmen", "Fred"], ['Wolfeschlegelstein', 'Daniel'], ['Ein']], - 'courseScoresPerTerm': [[[8, 10]], [[7, 4], [8, 8], [9]], [[6], [7], [8]]], - 'grades': [[91, 75, 21, 95], [76, 88, 99, 89], [96, 59, 65, 88]], - '_label': ['person', 'person', 'person'], + ground_truth_p: dict[str, list[Any]] = { + "ID": [3, 5, 7], + "fName": ["Carol", "Dan", "Elizabeth"], + "gender": [1, 2, 1], + "isStudent": [False, False, False], + "eyeSight": [5.0, 4.8, 4.7], + "birthdate": [datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), datetime.date(1980, 10, 26)], + "registerTime": [ + Timestamp("1911-08-20 02:32:21"), + Timestamp("2031-11-30 12:25:30"), + Timestamp("1976-12-23 11:21:42"), + ], + "lastJobDuration": [ + Timedelta("48 hours 24 minutes 11 seconds"), + Timedelta("3750 days 13:00:00.000024"), + Timedelta("2 days 00:24:11"), + ], + "workedHours": [[4, 5], [1, 9], [2]], + "usedNames": [["Carmen", "Fred"], ["Wolfeschlegelstein", "Daniel"], ["Ein"]], + "courseScoresPerTerm": [[[8, 10]], [[7, 4], [8, 8], [9]], [[6], [7], [8]]], + "grades": [[91, 75, 21, 95], [76, 88, 99, 89], [96, 59, 65, 88]], + "_label": ["person", "person", "person"], } - for (node_id, node) in nodes: - assert node_id == "%s_%d" % (node['_label'], node['ID']) + for node_id, node in nodes: + assert node_id == "%s_%d" % (node["_label"], node["ID"]) - for (_, node) in nodes: - if 'person' not in node: + for _, node in nodes: + if "person" not in node: continue found = False - for i in range(len(ground_truth_p['ID'])): - if node['ID'] != ground_truth_p['ID'][i]: + for i in range(len(ground_truth_p["ID"])): + if node["ID"] != ground_truth_p["ID"][i]: continue found = True for key in ground_truth_p: assert node[key] == ground_truth_p[key][i] assert found - ground_truth_o = {'ID': [4, 6], - 'name': ['CsWork', 'DEsWork'], - 'orgCode': [934, 824], - 'mark': [4.1, 4.1], - 'score': [-100, 7], - 'history': ['2 years 4 days 10 hours', '2 years 4 hours 22 us 34 minutes'], - 'licenseValidInterval': [Timedelta(days=9414), - Timedelta(days=3, seconds=36000, microseconds=100000)], - 'rating': [0.78, 0.52], - '_label': ['organisation', 'organisation'], - } - - for (_, node) in nodes: - if 'organisation' not in node: + ground_truth_o: dict[str, list[Any]] = { + "ID": [4, 6], + "name": ["CsWork", "DEsWork"], + "orgCode": [934, 824], + "mark": [4.1, 4.1], + "score": [-100, 7], + "history": ["2 years 4 days 10 hours", "2 years 4 hours 22 us 34 minutes"], + "licenseValidInterval": [Timedelta(days=9414), Timedelta(days=3, seconds=36000, microseconds=100000)], + "rating": [0.78, 0.52], + "_label": ["organisation", "organisation"], + } + + for _, node in nodes: + if "organisation" not in node: continue found = False - for i in range(len(ground_truth_o['ID'])): - if node['ID'] != ground_truth_o['ID'][i]: + for i in range(len(ground_truth_o["ID"])): + if node["ID"] != ground_truth_o["ID"][i]: continue found = True for key in ground_truth_o: @@ -214,17 +293,16 @@ def test_networkx_directed(establish_connection): assert len(edges) == 3 years_ground_truth = [2010, 2015, 2015] - for (src, dst, edge) in edges: - assert nodes_dict[dst]['_label'] == 'organisation' - assert nodes_dict[dst]['ID'] in [4, 6] - - assert nodes_dict[src]['_label'] == 'person' - assert nodes_dict[src]['ID'] in [3, 5, 7] - assert edge['year'] in years_ground_truth + for src, dst, edge in edges: + assert nodes_dict[dst]["_label"] == "organisation" + assert nodes_dict[dst]["ID"] in [4, 6] + assert nodes_dict[src]["_label"] == "person" + assert nodes_dict[src]["ID"] in [3, 5, 7] + assert edge["year"] in years_ground_truth # If the edge is found, remove it from ground truth so we can check # that all edges were found and no extra edges were found - del years_ground_truth[years_ground_truth.index(edge['year'])] + del years_ground_truth[years_ground_truth.index(edge["year"])] del nodes_dict[src] assert len(years_ground_truth) == 0 diff --git a/tools/python_api/test/test_parameter.py b/tools/python_api/test/test_parameter.py index b2a677617bb..7509fa4e507 100644 --- a/tools/python_api/test/test_parameter.py +++ b/tools/python_api/test/test_parameter.py @@ -1,77 +1,83 @@ +from __future__ import annotations + import datetime + import pytest +from type_aliases import ConnDB -def test_bool_param(establish_connection): +def test_bool_param(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute("MATCH (a:person) WHERE a.isStudent = $1 AND a.isWorker = $k RETURN COUNT(*)", - {"1": False, "k": False}) + result = conn.execute( + "MATCH (a:person) WHERE a.isStudent = $1 AND a.isWorker = $k RETURN COUNT(*)", {"1": False, "k": False} + ) assert result.has_next() assert result.get_next() == [1] assert not result.has_next() result.close() -def test_int_param(establish_connection): +def test_int_param(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute("MATCH (a:person) WHERE a.age < $AGE RETURN COUNT(*)", { "AGE": 1 }) + result = conn.execute("MATCH (a:person) WHERE a.age < $AGE RETURN COUNT(*)", {"AGE": 1}) assert result.has_next() assert result.get_next() == [0] assert not result.has_next() result.close() -def test_double_param(establish_connection): +def test_double_param(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute("MATCH (a:person) WHERE a.eyeSight = $E RETURN COUNT(*)", { "E": 5.0 }) + result = conn.execute("MATCH (a:person) WHERE a.eyeSight = $E RETURN COUNT(*)", {"E": 5.0}) assert result.has_next() assert result.get_next() == [2] assert not result.has_next() result.close() -def test_str_param(establish_connection): +def test_str_param(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN concat(a.fName, $S);", { "S": "HH" }) + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN concat(a.fName, $S);", {"S": "HH"}) assert result.has_next() assert result.get_next() == ["AliceHH"] assert not result.has_next() result.close() -def test_date_param(establish_connection): +def test_date_param(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute("MATCH (a:person) WHERE a.birthdate = $1 RETURN COUNT(*);", - { "1": datetime.date(1900, 1, 1) }) + result = conn.execute("MATCH (a:person) WHERE a.birthdate = $1 RETURN COUNT(*);", {"1": datetime.date(1900, 1, 1)}) assert result.has_next() assert result.get_next() == [2] assert not result.has_next() result.close() -def test_timestamp_param(establish_connection): +def test_timestamp_param(establish_connection: ConnDB) -> None: conn, db = establish_connection - result = conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", - { "1": datetime.datetime(2011, 8, 20, 11, 25, 30) }) + result = conn.execute( + "MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", + {"1": datetime.datetime(2011, 8, 20, 11, 25, 30)}, + ) assert result.has_next() assert result.get_next() == [1] assert not result.has_next() result.close() -def test_param_error1(establish_connection): +def test_param_error1(establish_connection: ConnDB) -> None: conn, db = establish_connection - with pytest.raises(RuntimeError, match="Parameter name must be of type string but get "): + with pytest.raises(RuntimeError, match="Parameter name must be of type string but got "): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", {1: 1}) -def test_param_error2(establish_connection): +def test_param_error2(establish_connection: ConnDB) -> None: conn, db = establish_connection with pytest.raises(RuntimeError, match="Parameters must be a dict"): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", ["asd"]) -def test_param_error3(establish_connection): +def test_param_error3(establish_connection: ConnDB) -> None: conn, db = establish_connection with pytest.raises(RuntimeError, match="Parameters must be a dict"): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", [("asd", 1, 1)]) diff --git a/tools/python_api/test/test_prepared_statement.py b/tools/python_api/test/test_prepared_statement.py index e5c59e37306..b234a46a18a 100644 --- a/tools/python_api/test/test_prepared_statement.py +++ b/tools/python_api/test/test_prepared_statement.py @@ -1,13 +1,14 @@ -import uuid +from __future__ import annotations -import pytest import datetime +import uuid + +from type_aliases import ConnDB -def test_read(establish_connection): +def test_read(establish_connection: ConnDB) -> None: conn, _ = establish_connection - prepared_statement = conn.prepare( - "MATCH (a:person) WHERE a.isStudent = $1 AND a.isWorker = $k RETURN COUNT(*)") + prepared_statement = conn.prepare("MATCH (a:person) WHERE a.isStudent = $1 AND a.isWorker = $k RETURN COUNT(*)") assert prepared_statement.is_success() assert prepared_statement.get_error_message() == "" @@ -31,7 +32,8 @@ def test_read(establish_connection): assert result.get_next() == [0] assert not result.has_next() -def test_write(establish_connection): + +def test_write(establish_connection: ConnDB) -> None: conn, _ = establish_connection orgs = [ { @@ -42,7 +44,7 @@ def test_write(establish_connection): "score": 1, "history": "history1", "licenseValidInterval": datetime.timedelta(days=1), - "rating": 1.0 + "rating": 1.0, }, { "ID": 1002, @@ -52,7 +54,7 @@ def test_write(establish_connection): "score": 2, "history": "history2", "licenseValidInterval": datetime.timedelta(days=2), - "rating": 2.0 + "rating": 2.0, }, { "ID": 1003, @@ -62,12 +64,13 @@ def test_write(establish_connection): "score": 3, "history": "history3", "licenseValidInterval": datetime.timedelta(days=3), - "rating": 3.0 + "rating": 3.0, }, ] prepared_statement = conn.prepare( - "CREATE (n:organisation {ID: $ID, name: $name, orgCode: $orgCode, mark: $mark, score: $score, history: $history, licenseValidInterval: $licenseValidInterval, rating: $rating})") + "CREATE (n:organisation {ID: $ID, name: $name, orgCode: $orgCode, mark: $mark, score: $score, history: $history, licenseValidInterval: $licenseValidInterval, rating: $rating})" + ) assert prepared_statement.is_success() for org in orgs: org_dict = {str(k): v for k, v in org.items()} @@ -76,35 +79,31 @@ def test_write(establish_connection): all_orgs_res = conn.execute("MATCH (n:organisation) RETURN n") while all_orgs_res.has_next(): n = all_orgs_res.get_next()[0] - if n['ID'] not in [o['ID'] for o in orgs]: + if n["ID"] not in [o["ID"] for o in orgs]: continue for expected_org in orgs: - if n['ID'] == expected_org['ID']: - assert n['ID'] == expected_org['ID'] - assert n['name'] == expected_org['name'] - assert n['orgCode'] == expected_org['orgCode'] - assert n['mark'] == expected_org['mark'] - assert n['score'] == expected_org['score'] - assert n['history'] == expected_org['history'] - assert n['licenseValidInterval'] == expected_org['licenseValidInterval'] - assert n['rating'] == expected_org['rating'] + if n["ID"] == expected_org["ID"]: + assert n["ID"] == expected_org["ID"] + assert n["name"] == expected_org["name"] + assert n["orgCode"] == expected_org["orgCode"] + assert n["mark"] == expected_org["mark"] + assert n["score"] == expected_org["score"] + assert n["history"] == expected_org["history"] + assert n["licenseValidInterval"] == expected_org["licenseValidInterval"] + assert n["rating"] == expected_org["rating"] break - conn.execute('CREATE NODE TABLE uuid_table (id UUID, PRIMARY KEY(id));') - conn.execute('CREATE (:uuid_table {id: $1});', {'1': uuid.uuid5(uuid.NAMESPACE_DNS, 'kuzu')}) - result = conn.execute('MATCH (n:uuid_table) RETURN n.id;') - assert result.get_next() == [uuid.uuid5(uuid.NAMESPACE_DNS, 'kuzu')] + conn.execute("CREATE NODE TABLE uuid_table (id UUID, PRIMARY KEY(id));") + conn.execute("CREATE (:uuid_table {id: $1});", {"1": uuid.uuid5(uuid.NAMESPACE_DNS, "kuzu")}) + result = conn.execute("MATCH (n:uuid_table) RETURN n.id;") + assert result.get_next() == [uuid.uuid5(uuid.NAMESPACE_DNS, "kuzu")] -def test_error(establish_connection): - prepared_statement = establish_connection[0].prepare( - "MATCH (d:dog) WHERE d.isServiceDog = $1 RETURN COUNT(*)") +def test_error(establish_connection: ConnDB) -> None: + prepared_statement = establish_connection[0].prepare("MATCH (d:dog) WHERE d.isServiceDog = $1 RETURN COUNT(*)") assert not prepared_statement.is_success() - assert prepared_statement.get_error_message( - ) == "Binder exception: Table dog does not exist." + assert prepared_statement.get_error_message() == "Binder exception: Table dog does not exist." - prepared_statement = establish_connection[0].prepare( - "SELECT * FROM person") + prepared_statement = establish_connection[0].prepare("SELECT * FROM person") assert not prepared_statement.is_success() - assert prepared_statement.get_error_message( - ).startswith("Parser exception: extraneous input 'SELECT'") + assert prepared_statement.get_error_message().startswith("Parser exception: extraneous input 'SELECT'") diff --git a/tools/python_api/test/test_query_result.py b/tools/python_api/test/test_query_result.py index 17eadb3177a..169488f37dd 100644 --- a/tools/python_api/test/test_query_result.py +++ b/tools/python_api/test/test_query_result.py @@ -1,31 +1,37 @@ -def test_get_execution_time(establish_connection): +from __future__ import annotations + +from type_aliases import ConnDB + + +def test_get_execution_time(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_execution_time() > 0 result.close() -def test_get_compiling_time(establish_connection): +def test_get_compiling_time(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_compiling_time() > 0 result.close() -def test_get_num_tuples(establish_connection): +def test_get_num_tuples(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_num_tuples() == 1 result.close() -def test_explain(establish_connection): +def test_explain(establish_connection: ConnDB) -> None: conn, db = establish_connection result = conn.execute("EXPLAIN MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_num_tuples() == 1 result.close() -def test_context_manager(establish_connection): + +def test_context_manager(establish_connection: ConnDB) -> None: conn, db = establish_connection with conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") as result: assert result.get_num_tuples() == 1 diff --git a/tools/python_api/test/test_query_result_close.py b/tools/python_api/test/test_query_result_close.py index c68abb61b47..d3a9bf5811b 100644 --- a/tools/python_api/test/test_query_result_close.py +++ b/tools/python_api/test/test_query_result_close.py @@ -1,23 +1,42 @@ import subprocess import sys +from pathlib import Path +from textwrap import dedent + from test_helper import KUZU_ROOT -def test_query_result_close(get_tmp_path): - code = [ - 'import kuzu', - # Note: Windows paths include backslashes, which need to be raw strings or escaped. - 'db = kuzu.Database(r"' + get_tmp_path + '")', - 'conn = kuzu.Connection(db)', - 'conn.execute(\'CREATE NODE TABLE person (ID INT64, fName STRING, gender INT64,\ - isStudent BOOLEAN, isWorker BOOLEAN, age INT64, eyeSight DOUBLE,\ - birthdate DATE, registerTime TIMESTAMP, lastJobDuration INTERVAL,\ - workedHours INT64[], usedNames STRING[], courseScoresPerTerm INT64[][], grades INT64[4], height float, u UUID, \ - PRIMARY KEY (ID))\')', - f'conn.execute(\'COPY person FROM \"{KUZU_ROOT}/dataset/tinysnb/vPerson.csv\" (HEADER=true)\')', - 'result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.isStudent;")', - # 'result.close()', - ] - code = ';'.join(code) - result = subprocess.run([sys.executable, '-c', code]) +def test_query_result_close(tmp_path: Path, build_dir: Path) -> None: + code = dedent(f""" + import sys + sys.path.append(r"{build_dir!s}") + + import kuzu + db = kuzu.Database(r"{tmp_path!s}") + conn = kuzu.Connection(db) + conn.execute(''' + CREATE NODE TABLE person ( + ID INT64, + fName STRING, + gender INT64, + isStudent BOOLEAN, + isWorker BOOLEAN, + age INT64, + eyeSight DOUBLE, + birthdate DATE, + registerTime TIMESTAMP, + lastJobDuration INTERVAL, + workedHours INT64[], + usedNames STRING[], + courseScoresPerTerm INT64[][], + grades INT64[4], + height float, + u UUID, + PRIMARY KEY (ID)) + ''') + conn.execute('COPY person FROM "{KUZU_ROOT}/dataset/tinysnb/vPerson.csv" (HEADER=true)') + result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.isStudent;") + # result.close() + """) + result = subprocess.run([sys.executable, "-c", code]) assert result.returncode == 0 diff --git a/tools/python_api/test/test_scan_pandas.py b/tools/python_api/test/test_scan_pandas.py index bcc2e31784d..d073bf4a310 100644 --- a/tools/python_api/test/test_scan_pandas.py +++ b/tools/python_api/test/test_scan_pandas.py @@ -1,131 +1,218 @@ +import datetime +import re +from pathlib import Path + import numpy as np import pandas as pd -import datetime import pytest -import re + try: from zoneinfo import ZoneInfo except ImportError: - from backports.zoneinfo import ZoneInfo + from backports.zoneinfo import ZoneInfo # type: ignore[no-redef] + import kuzu -def validate_scan_pandas_results(results): - assert results.get_next() == [True, 1, 10, 100, 1000, -1, -10, -100, -1000, -0.5199999809265137, 5132.12321, - datetime.datetime(1996, 4, 1, 12, 0, 11, 500001), - datetime.datetime(1996, 4, 1, 12, 0, 11, 500001, ZoneInfo("US/Eastern")), - datetime.datetime(1996, 4, 1, 12, 0, 11, 500001), - datetime.datetime(1996, 4, 1, 12, 0, 11, 500000), - datetime.datetime(1996, 4, 1, 12, 0, 11), - datetime.timedelta(microseconds=500), None, [], 528, 3.562, ['Alice', None], - datetime.date(1996, 2, 15), '12331'] - assert results.get_next() == [False, 2, 20, 200, 2000, -2, -20, -200, -2000, None, 24.222, - datetime.datetime(1981, 11, 13, 22, 2, 52, 2), - datetime.datetime(1981, 11, 13, 22, 2, 52, 2, ZoneInfo("US/Eastern")), - datetime.datetime(1981, 11, 13, 22, 2, 52, 2), - datetime.datetime(1981, 11, 13, 22, 2, 52), - datetime.datetime(1981, 11, 13, 22, 2, 52), - datetime.timedelta(seconds=1), 'Ascii only', [40, 20, 10], -9999, 4.213, [], - datetime.date(2013, 2, 22), 'test string'] - assert results.get_next() == [None, 3, 30, 300, 3000, -3, -30, -300, -3000, -3.299999952316284, None, - datetime.datetime(1972, 12, 21, 12, 5, 44, 500003), - datetime.datetime(1972, 12, 21, 12, 5, 44, 500003, ZoneInfo("US/Eastern")), - datetime.datetime(1972, 12, 21, 12, 5, 44, 500003), - datetime.datetime(1972, 12, 21, 12, 5, 44, 500000), - datetime.datetime(1972, 12, 21, 12, 5, 44), - datetime.timedelta(seconds=2, milliseconds=500), 'ñ中国字', [30, None], None, None, - None, datetime.date(2055, 1, 14), '5.623'] - assert results.get_next() == [False, 4, 40, 400, 4000, -4, -40, -400, -4000, 4.400000095367432, 4.444, - datetime.datetime(2008, 1, 11, 22, 10, 3, 4), - datetime.datetime(2008, 1, 11, 22, 10, 3, 4, ZoneInfo("US/Eastern")), - datetime.datetime(2008, 1, 11, 22, 10, 3, 4), - datetime.datetime(2008, 1, 11, 22, 10, 3), - datetime.datetime(2008, 1, 11, 22, 10, 3), - datetime.timedelta(seconds=3, milliseconds=22), '😂', None, 56677, 67.13, - ['Dan, Ella', 'George'], datetime.date(2018, 3, 17), - None] - - -def test_scan_pandas(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def validate_scan_pandas_results(results: kuzu.QueryResult) -> None: + assert results.get_next() == [ + True, + 1, + 10, + 100, + 1000, + -1, + -10, + -100, + -1000, + -0.5199999809265137, + 5132.12321, + datetime.datetime(1996, 4, 1, 12, 0, 11, 500001), + datetime.datetime(1996, 4, 1, 12, 0, 11, 500001, ZoneInfo("US/Eastern")), + datetime.datetime(1996, 4, 1, 12, 0, 11, 500001), + datetime.datetime(1996, 4, 1, 12, 0, 11, 500000), + datetime.datetime(1996, 4, 1, 12, 0, 11), + datetime.timedelta(microseconds=500), + None, + [], + 528, + 3.562, + ["Alice", None], + datetime.date(1996, 2, 15), + "12331", + ] + assert results.get_next() == [ + False, + 2, + 20, + 200, + 2000, + -2, + -20, + -200, + -2000, + None, + 24.222, + datetime.datetime(1981, 11, 13, 22, 2, 52, 2), + datetime.datetime(1981, 11, 13, 22, 2, 52, 2, ZoneInfo("US/Eastern")), + datetime.datetime(1981, 11, 13, 22, 2, 52, 2), + datetime.datetime(1981, 11, 13, 22, 2, 52), + datetime.datetime(1981, 11, 13, 22, 2, 52), + datetime.timedelta(seconds=1), + "Ascii only", + [40, 20, 10], + -9999, + 4.213, + [], + datetime.date(2013, 2, 22), + "test string", + ] + assert results.get_next() == [ + None, + 3, + 30, + 300, + 3000, + -3, + -30, + -300, + -3000, + -3.299999952316284, + None, + datetime.datetime(1972, 12, 21, 12, 5, 44, 500003), + datetime.datetime(1972, 12, 21, 12, 5, 44, 500003, ZoneInfo("US/Eastern")), + datetime.datetime(1972, 12, 21, 12, 5, 44, 500003), + datetime.datetime(1972, 12, 21, 12, 5, 44, 500000), + datetime.datetime(1972, 12, 21, 12, 5, 44), + datetime.timedelta(seconds=2, milliseconds=500), + "ñ中国字", + [30, None], + None, + None, + None, + datetime.date(2055, 1, 14), + "5.623", + ] + assert results.get_next() == [ + False, + 4, + 40, + 400, + 4000, + -4, + -40, + -400, + -4000, + 4.400000095367432, + 4.444, + datetime.datetime(2008, 1, 11, 22, 10, 3, 4), + datetime.datetime(2008, 1, 11, 22, 10, 3, 4, ZoneInfo("US/Eastern")), + datetime.datetime(2008, 1, 11, 22, 10, 3, 4), + datetime.datetime(2008, 1, 11, 22, 10, 3), + datetime.datetime(2008, 1, 11, 22, 10, 3), + datetime.timedelta(seconds=3, milliseconds=22), + "😂", + None, + 56677, + 67.13, + ["Dan, Ella", "George"], + datetime.date(2018, 3, 17), + None, + ] + + +def test_scan_pandas(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) data = { - 'BOOL': [True, False, None, False], - 'UINT8': np.array([1, 2, 3, 4], dtype=np.uint8), - 'UINT16': np.array([10, 20, 30, 40], dtype=np.uint16), - 'UINT32': np.array([100, 200, 300, 400], dtype=np.uint32), - 'UINT64': np.array([1000, 2000, 3000, 4000], dtype=np.uint64), - 'INT8': np.array([-1, -2, -3, -4], dtype=np.int8), - 'INT16': np.array([-10, -20, -30, -40], dtype=np.int16), - 'INT32': np.array([-100, -200, -300, -400], dtype=np.int32), - 'INT64': np.array([-1000, -2000, -3000, -4000], dtype=np.int64), - 'FLOAT_32': np.array([-0.5199999809265137, float("nan"), -3.299999952316284, 4.400000095367432], - dtype=np.float32), - 'FLOAT_64': np.array([5132.12321, 24.222, float("nan"), 4.444], dtype=np.float64), - 'datetime_microseconds': np.array([ - np.datetime64('1996-04-01T12:00:11.500001000'), - np.datetime64('1981-11-13T22:02:52.000002000'), - np.datetime64('1972-12-21T12:05:44.500003000'), - np.datetime64('2008-01-11T22:10:03.000004000') - ]).astype('datetime64[us]'), - 'datetime_microseconds_tz': np.array([ - np.datetime64('1996-04-01T12:00:11.500001000'), - np.datetime64('1981-11-13T22:02:52.000002000'), - np.datetime64('1972-12-21T12:05:44.500003000'), - np.datetime64('2008-01-11T22:10:03.000004000'), - ]).astype('datetime64[us]'), - 'datetime_nanoseconds': np.array([ - np.datetime64('1996-04-01T12:00:11.500001'), - np.datetime64('1981-11-13T22:02:52.000002'), - np.datetime64('1972-12-21T12:05:44.500003'), - np.datetime64('2008-01-11T22:10:03.000004') - ]).astype('datetime64[ns]'), - 'datetime_milliseconds': np.array([ - np.datetime64('1996-04-01T12:00:11.500001'), - np.datetime64('1981-11-13T22:02:52.000002'), - np.datetime64('1972-12-21T12:05:44.500003'), - np.datetime64('2008-01-11T22:10:03.000004') - ]).astype('datetime64[ms]'), - 'datetime_seconds': np.array([ - np.datetime64('1996-04-01T12:00:11'), - np.datetime64('1981-11-13T22:02:52'), - np.datetime64('1972-12-21T12:05:44'), - np.datetime64('2008-01-11T22:10:03') - ]).astype('datetime64[s]'), - 'timedelta_nanoseconds': [ - np.timedelta64(500000, 'ns'), - np.timedelta64(1000000000, 'ns'), - np.timedelta64(2500000000, 'ns'), - np.timedelta64(3022000000, 'ns') + "BOOL": [True, False, None, False], + "UINT8": np.array([1, 2, 3, 4], dtype=np.uint8), + "UINT16": np.array([10, 20, 30, 40], dtype=np.uint16), + "UINT32": np.array([100, 200, 300, 400], dtype=np.uint32), + "UINT64": np.array([1000, 2000, 3000, 4000], dtype=np.uint64), + "INT8": np.array([-1, -2, -3, -4], dtype=np.int8), + "INT16": np.array([-10, -20, -30, -40], dtype=np.int16), + "INT32": np.array([-100, -200, -300, -400], dtype=np.int32), + "INT64": np.array([-1000, -2000, -3000, -4000], dtype=np.int64), + "FLOAT_32": np.array( + [-0.5199999809265137, float("nan"), -3.299999952316284, 4.400000095367432], dtype=np.float32 + ), + "FLOAT_64": np.array([5132.12321, 24.222, float("nan"), 4.444], dtype=np.float64), + "datetime_microseconds": np.array([ + np.datetime64("1996-04-01T12:00:11.500001000"), + np.datetime64("1981-11-13T22:02:52.000002000"), + np.datetime64("1972-12-21T12:05:44.500003000"), + np.datetime64("2008-01-11T22:10:03.000004000"), + ]).astype("datetime64[us]"), + "datetime_microseconds_tz": np.array([ + np.datetime64("1996-04-01T12:00:11.500001000"), + np.datetime64("1981-11-13T22:02:52.000002000"), + np.datetime64("1972-12-21T12:05:44.500003000"), + np.datetime64("2008-01-11T22:10:03.000004000"), + ]).astype("datetime64[us]"), + "datetime_nanoseconds": np.array([ + np.datetime64("1996-04-01T12:00:11.500001"), + np.datetime64("1981-11-13T22:02:52.000002"), + np.datetime64("1972-12-21T12:05:44.500003"), + np.datetime64("2008-01-11T22:10:03.000004"), + ]).astype("datetime64[ns]"), + "datetime_milliseconds": np.array([ + np.datetime64("1996-04-01T12:00:11.500001"), + np.datetime64("1981-11-13T22:02:52.000002"), + np.datetime64("1972-12-21T12:05:44.500003"), + np.datetime64("2008-01-11T22:10:03.000004"), + ]).astype("datetime64[ms]"), + "datetime_seconds": np.array([ + np.datetime64("1996-04-01T12:00:11"), + np.datetime64("1981-11-13T22:02:52"), + np.datetime64("1972-12-21T12:05:44"), + np.datetime64("2008-01-11T22:10:03"), + ]).astype("datetime64[s]"), + "timedelta_nanoseconds": [ + np.timedelta64(500000, "ns"), + np.timedelta64(1000000000, "ns"), + np.timedelta64(2500000000, "ns"), + np.timedelta64(3022000000, "ns"), ], - 'name': [None, 'Ascii only', 'ñ中国字', '😂'], - 'worked_hours': [[], [40, 20, 10], [30, None], None], - 'int_object': np.array([528, -9999, None, 56677], dtype=object), - 'float_object': np.array([3.562, 4.213, None, 67.13], dtype=object), - 'used_names': np.array([['Alice', None], [], None, ['Dan, Ella', 'George']], dtype=object), - 'past_date': np.array([datetime.date(1996, 2, 15), datetime.date(2013, 2, 22), - datetime.date(2055, 1, 14), datetime.date(2018, 3, 17)], dtype=object), - 'mixed_type': np.array([12331, 'test string', 5.623, None], dtype='object') + "name": [None, "Ascii only", "ñ中国字", "😂"], + "worked_hours": [[], [40, 20, 10], [30, None], None], + "int_object": np.array([528, -9999, None, 56677], dtype=object), + "float_object": np.array([3.562, 4.213, None, 67.13], dtype=object), + "used_names": np.array([["Alice", None], [], None, ["Dan, Ella", "George"]], dtype=object), + "past_date": np.array( + [ + datetime.date(1996, 2, 15), + datetime.date(2013, 2, 22), + datetime.date(2055, 1, 14), + datetime.date(2018, 3, 17), + ], + dtype=object, + ), + "mixed_type": np.array([12331, "test string", 5.623, None], dtype="object"), } df = pd.DataFrame(data) - df['datetime_microseconds_tz'] = df['datetime_microseconds_tz'].dt.tz_localize("US/Eastern") + df["datetime_microseconds_tz"] = df["datetime_microseconds_tz"].dt.tz_localize("US/Eastern") results = conn.execute("CALL READ_PANDAS(df) RETURN *") validate_scan_pandas_results(results) results2 = conn.execute("LOAD FROM df RETURN *") validate_scan_pandas_results(results2) -def test_scan_pandas_timestamp(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_scan_pandas_timestamp(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) ts = np.array( - [datetime.datetime(1996, 2, 15, hour=12, minute=22, second=54), - datetime.datetime(2011, 3, 11, minute=11, hour=5), - None, - datetime.datetime(2033, 2, 11, microsecond=55)], dtype='object') - df = pd.DataFrame({'timestamp': ts}) - # Pandas will automatically convert the column from object to timestamp, so we need to manually cast back to object. - df = df.astype({'timestamp': 'object'}, copy=False) + [ + datetime.datetime(1996, 2, 15, hour=12, minute=22, second=54), + datetime.datetime(2011, 3, 11, minute=11, hour=5), + None, + datetime.datetime(2033, 2, 11, microsecond=55), + ], + dtype="object", + ) + df = pd.DataFrame({"timestamp": ts}) + # Pandas automatically converts the column from object to timestamp, so we need to manually cast back to object. + df = df.astype({"timestamp": "object"}, copy=False) results = conn.execute("CALL READ_PANDAS(df) RETURN *") assert results.get_next() == [datetime.datetime(1996, 2, 15, hour=12, minute=22, second=54)] assert results.get_next() == [datetime.datetime(2011, 3, 11, minute=11, hour=5)] @@ -133,59 +220,70 @@ def test_scan_pandas_timestamp(get_tmp_path): assert results.get_next() == [datetime.datetime(2033, 2, 11, microsecond=55)] -def test_replace_failure(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_replace_failure(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) with pytest.raises(RuntimeError, match=re.escape("Binder exception: Variable x is not in scope.")): conn.execute("LOAD FROM x RETURN *;") - with pytest.raises(RuntimeError, - match=re.escape("Binder exception: Cannot match a built-in function for given function " - "READ_PANDAS(STRING). Supported inputs are\n(POINTER)\n")): + with pytest.raises( + RuntimeError, + match=re.escape( + "Binder exception: Cannot match a built-in function for given function " + "READ_PANDAS(STRING). Supported inputs are\n(POINTER)\n" + ), + ): conn.execute("CALL READ_PANDAS('df213') WHERE id > 20 RETURN id + 5, weight") -def test_int64_overflow(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_int64_overflow(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) - overflow_pd = pd.DataFrame({'id': [4, 2 ** 125]}) - with pytest.raises(RuntimeError, match=re.escape( + overflow_pd = pd.DataFrame({"id": [4, 2**125]}) + with pytest.raises( + RuntimeError, + match=re.escape( "Conversion exception: Failed to cast value: " - "Python value '42535295865117307932921825928971026432' to INT64")): + "Python value '42535295865117307932921825928971026432' to INT64" + ), + ): conn.execute("LOAD FROM overflow_pd RETURN *;") -def test_scan_pandas_with_filter(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_scan_pandas_with_filter(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) data = { - 'id': np.array([22, 3, 100], dtype=np.uint8), - 'weight': np.array([23.2, 31.7, 42.9], dtype=np.float64), - 'name': ['ñ', '日本字', '😊'] + "id": np.array([22, 3, 100], dtype=np.uint8), + "weight": np.array([23.2, 31.7, 42.9], dtype=np.float64), + "name": ["ñ", "日本字", "😊"], } df = pd.DataFrame(data) # Dummy query to ensure the READ_PANDAS function is persistent after a write transaction. conn.execute("CREATE NODE TABLE PERSON1(ID INT64, PRIMARY KEY(ID))") results = conn.execute("CALL READ_PANDAS(df) WHERE id > 20 RETURN id + 5, weight, name") - assert results.get_next() == [27, 23.2, 'ñ'] - assert results.get_next() == [105, 42.9, '😊'] + assert results.get_next() == [27, 23.2, "ñ"] + assert results.get_next() == [105, 42.9, "😊"] -def test_large_pd(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_large_pd(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) num_rows = 40000 odd_numbers = [2 * i + 1 for i in range(num_rows)] even_numbers = [2 * i for i in range(num_rows)] - df = pd.DataFrame({'odd': np.array(odd_numbers, dtype=np.int64), 'even': np.array(even_numbers, dtype=np.int64)}) + df = pd.DataFrame({ + "odd": np.array(odd_numbers, dtype=np.int64), + "even": np.array(even_numbers, dtype=np.int64), + }) result = conn.execute("CALL READ_PANDAS(df) RETURN *").get_as_df() - assert result['odd'].to_list() == odd_numbers - assert result['even'].to_list() == even_numbers + assert result["odd"].to_list() == odd_numbers + assert result["even"].to_list() == even_numbers -def test_pandas_scan_demo(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_pandas_scan_demo(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) conn.execute("CREATE NODE TABLE student (ID int64, height int32, PRIMARY KEY(ID))") @@ -198,31 +296,31 @@ def test_pandas_scan_demo(get_tmp_path): age = np.array([42, 23, 33, 57, 67, 39, 11], dtype=np.uint16) height_in_cm = np.array([167, 172, 183, 199, 149, 154, 165], dtype=np.uint32) is_student = np.array([False, True, False, False, False, False, True], dtype=bool) - person = pd.DataFrame({'id': id, 'age': age, 'height': height_in_cm, 'is_student': is_student}) + person = pd.DataFrame({"id": id, "age": age, "height": height_in_cm, "is_student": is_student}) result = conn.execute( - 'CALL READ_PANDAS(person) with avg(height / 2.54) as height_in_inch MATCH (s:student) WHERE s.height > ' - 'height_in_inch RETURN s').get_as_df() + "CALL READ_PANDAS(person) with avg(height / 2.54) as height_in_inch MATCH (s:student) WHERE s.height > " + "height_in_inch RETURN s" + ).get_as_df() assert len(result) == 2 - assert result['s'][0] == {'ID': 0, '_id': {'offset': 0, 'table': 0}, '_label': 'student', 'height': 70} - assert result['s'][1] == {'ID': 4, '_id': {'offset': 2, 'table': 0}, '_label': 'student', 'height': 67} + assert result["s"][0] == {"ID": 0, "_id": {"offset": 0, "table": 0}, "_label": "student", "height": 70} + assert result["s"][1] == {"ID": 4, "_id": {"offset": 2, "table": 0}, "_label": "student", "height": 67} - conn.execute('CREATE NODE TABLE person(ID INT64, age UINT16, height UINT32, is_student BOOLean, PRIMARY KEY(ID))') + conn.execute("CREATE NODE TABLE person(ID INT64, age UINT16, height UINT32, is_student BOOLean, PRIMARY KEY(ID))") conn.execute( - 'CALL READ_PANDAS(person) CREATE (p:person {ID: id, age: age, height: height, is_student: is_student})') + "CALL READ_PANDAS(person) CREATE (p:person {ID: id, age: age, height: height, is_student: is_student})" + ) result = conn.execute("MATCH (p:person) return p.*").get_as_df() - assert np.all(result['p.ID'].to_list() == id) - assert np.all(result['p.age'].to_list() == age) - assert np.all(result['p.height'].to_list() == height_in_cm) - assert np.all(result['p.is_student'].to_list() == is_student) + assert np.all(result["p.ID"].to_list() == id) + assert np.all(result["p.age"].to_list() == age) + assert np.all(result["p.height"].to_list() == height_in_cm) + assert np.all(result["p.is_student"].to_list() == is_student) -def test_scan_all_null(get_tmp_path): - db = kuzu.Database(get_tmp_path) +def test_scan_all_null(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) - data = { - 'id': np.array([None, None, None], dtype=object) - } + data = {"id": np.array([None, None, None], dtype=object)} df = pd.DataFrame(data) result = conn.execute("CALL READ_PANDAS(df) RETURN *") assert result.get_next() == [None] diff --git a/tools/python_api/test/test_timeout.py b/tools/python_api/test/test_timeout.py index 01f359b7253..9a74fbd5da9 100644 --- a/tools/python_api/test/test_timeout.py +++ b/tools/python_api/test/test_timeout.py @@ -1,7 +1,11 @@ -def test_timeout(establish_connection): +from __future__ import annotations + +import pytest +from type_aliases import ConnDB + + +def test_timeout(establish_connection: ConnDB) -> None: conn, _ = establish_connection conn.set_query_timeout(1000) - try: + with pytest.raises(RuntimeError, match="Interrupted."): conn.execute("MATCH (a:person)-[:knows*1..28]->(b:person) RETURN COUNT(*);") - except RuntimeError as err: - assert str(err) == "Interrupted." diff --git a/tools/python_api/test/test_torch_geometric.py b/tools/python_api/test/test_torch_geometric.py index 81123576191..dd572498de9 100644 --- a/tools/python_api/test/test_torch_geometric.py +++ b/tools/python_api/test/test_torch_geometric.py @@ -1,15 +1,20 @@ -import torch +from __future__ import annotations + import warnings + import ground_truth +import torch +from type_aliases import ConnDB + -def test_to_torch_geometric_nodes_only(establish_connection): +def test_to_torch_geometric_nodes_only(establish_connection: ConnDB) -> None: conn, _ = establish_connection query = "MATCH (p:person) return p" res = conn.execute(query) with warnings.catch_warnings(record=True) as ws: torch_geometric_data, pos_to_idx, unconverted_properties, _ = res.get_as_torch_geometric() - warnings_ground_truth = set([ + warnings_ground_truth = { "Property person.courseScoresPerTerm cannot be converted to Tensor (likely due to nested list of variable length). The property is marked as unconverted.", "Property person.height of type FLOAT is not supported by torch_geometric. The property is marked as unconverted.", "Property person.u of type UUID is not supported by torch_geometric. The property is marked as unconverted.", @@ -19,7 +24,7 @@ def test_to_torch_geometric_nodes_only(establish_connection): "Property person.fName of type STRING is not supported by torch_geometric. The property is marked as unconverted.", "Property person.workedHours has an inconsistent shape. The property is marked as unconverted.", "Property person.usedNames of type STRING is not supported by torch_geometric. The property is marked as unconverted.", - ]) + } assert len(ws) == 9 for w in ws: assert str(w.message) in warnings_ground_truth @@ -27,79 +32,97 @@ def test_to_torch_geometric_nodes_only(establish_connection): assert torch_geometric_data.ID.shape == torch.Size([8]) assert torch_geometric_data.ID.dtype == torch.int64 for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['ID'] == torch_geometric_data.ID[i].item() + assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["ID"] == torch_geometric_data.ID[i].item() assert torch_geometric_data.gender.shape == torch.Size([8]) assert torch_geometric_data.gender.dtype == torch.int64 for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['gender'] == torch_geometric_data.gender[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["gender"] + == torch_geometric_data.gender[i].item() + ) assert torch_geometric_data.isStudent.shape == torch.Size([8]) assert torch_geometric_data.isStudent.dtype == torch.bool for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['isStudent'] == torch_geometric_data.isStudent[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["isStudent"] + == torch_geometric_data.isStudent[i].item() + ) assert torch_geometric_data.isWorker.shape == torch.Size([8]) assert torch_geometric_data.isWorker.dtype == torch.bool for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['isWorker'] == torch_geometric_data.isWorker[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["isWorker"] + == torch_geometric_data.isWorker[i].item() + ) assert torch_geometric_data.age.shape == torch.Size([8]) assert torch_geometric_data.age.dtype == torch.int64 for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['age'] == torch_geometric_data.age[i].item() + assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["age"] == torch_geometric_data.age[i].item() assert torch_geometric_data.eyeSight.shape == torch.Size([8]) assert torch_geometric_data.eyeSight.dtype == torch.float32 for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]['eyeSight'] - \ - torch_geometric_data.eyeSight[i].item() < 1e-6 + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["eyeSight"] + - torch_geometric_data.eyeSight[i].item() + < 1e-6 + ) assert len(unconverted_properties) == 9 - assert 'courseScoresPerTerm' in unconverted_properties + assert "courseScoresPerTerm" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['courseScoresPerTerm'] == unconverted_properties['courseScoresPerTerm'][i] - assert 'lastJobDuration' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["courseScoresPerTerm"] + == unconverted_properties["courseScoresPerTerm"][i] + ) + assert "lastJobDuration" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['lastJobDuration'] == unconverted_properties['lastJobDuration'][i] - assert 'registerTime' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["lastJobDuration"] + == unconverted_properties["lastJobDuration"][i] + ) + assert "registerTime" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['registerTime'] == unconverted_properties['registerTime'][i] - assert 'birthdate' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["registerTime"] + == unconverted_properties["registerTime"][i] + ) + assert "birthdate" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['birthdate'] == unconverted_properties['birthdate'][i] - assert 'fName' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["birthdate"] + == unconverted_properties["birthdate"][i] + ) + assert "fName" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['fName'] == unconverted_properties['fName'][i] - assert 'usedNames' in unconverted_properties + assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["fName"] == unconverted_properties["fName"][i] + assert "usedNames" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['usedNames'] == unconverted_properties['usedNames'][i] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["usedNames"] + == unconverted_properties["usedNames"][i] + ) - assert 'workedHours' in unconverted_properties + assert "workedHours" in unconverted_properties for i in range(8): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['workedHours'] == unconverted_properties['workedHours'][i] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["workedHours"] + == unconverted_properties["workedHours"][i] + ) -def test_to_torch_geometric_homogeneous_graph(establish_connection): +def test_to_torch_geometric_homogeneous_graph(establish_connection: ConnDB) -> None: conn, _ = establish_connection query = "MATCH (p:person)-[r:knows]->(q:person) RETURN p, r, q" res = conn.execute(query) with warnings.catch_warnings(record=True) as ws: torch_geometric_data, pos_to_idx, unconverted_properties, edge_properties = res.get_as_torch_geometric() - warnings_ground_truth = set([ + warnings_ground_truth = { "Property person.courseScoresPerTerm cannot be converted to Tensor (likely due to nested list of variable length). The property is marked as unconverted.", "Property person.height of type FLOAT is not supported by torch_geometric. The property is marked as unconverted.", "Property person.u of type UUID is not supported by torch_geometric. The property is marked as unconverted.", @@ -109,7 +132,7 @@ def test_to_torch_geometric_homogeneous_graph(establish_connection): "Property person.fName of type STRING is not supported by torch_geometric. The property is marked as unconverted.", "Property person.workedHours has an inconsistent shape. The property is marked as unconverted.", "Property person.usedNames of type STRING is not supported by torch_geometric. The property is marked as unconverted.", - ]) + } assert len(ws) == 9 for w in ws: assert str(w.message) in warnings_ground_truth @@ -117,110 +140,140 @@ def test_to_torch_geometric_homogeneous_graph(establish_connection): assert torch_geometric_data.ID.shape == torch.Size([7]) assert torch_geometric_data.ID.dtype == torch.int64 for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['ID'] == torch_geometric_data.ID[i].item() + assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["ID"] == torch_geometric_data.ID[i].item() assert torch_geometric_data.gender.shape == torch.Size([7]) assert torch_geometric_data.gender.dtype == torch.int64 for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['gender'] == torch_geometric_data.gender[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["gender"] + == torch_geometric_data.gender[i].item() + ) assert torch_geometric_data.isStudent.shape == torch.Size([7]) assert torch_geometric_data.isStudent.dtype == torch.bool for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['isStudent'] == torch_geometric_data.isStudent[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["isStudent"] + == torch_geometric_data.isStudent[i].item() + ) assert torch_geometric_data.isWorker.shape == torch.Size([7]) assert torch_geometric_data.isWorker.dtype == torch.bool for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['isWorker'] == torch_geometric_data.isWorker[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["isWorker"] + == torch_geometric_data.isWorker[i].item() + ) assert torch_geometric_data.age.shape == torch.Size([7]) assert torch_geometric_data.age.dtype == torch.int64 for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['age'] == torch_geometric_data.age[i].item() + assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["age"] == torch_geometric_data.age[i].item() assert torch_geometric_data.eyeSight.shape == torch.Size([7]) assert torch_geometric_data.eyeSight.dtype == torch.float32 for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]['eyeSight'] - \ - torch_geometric_data.eyeSight[i].item() < 1e-6 + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["eyeSight"] + - torch_geometric_data.eyeSight[i].item() + < 1e-6 + ) assert len(unconverted_properties) == 9 - assert 'courseScoresPerTerm' in unconverted_properties + assert "courseScoresPerTerm" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['courseScoresPerTerm'] == unconverted_properties['courseScoresPerTerm'][i] - assert 'lastJobDuration' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["courseScoresPerTerm"] + == unconverted_properties["courseScoresPerTerm"][i] + ) + assert "lastJobDuration" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['lastJobDuration'] == unconverted_properties['lastJobDuration'][i] - assert 'registerTime' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["lastJobDuration"] + == unconverted_properties["lastJobDuration"][i] + ) + assert "registerTime" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['registerTime'] == unconverted_properties['registerTime'][i] - assert 'birthdate' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["registerTime"] + == unconverted_properties["registerTime"][i] + ) + assert "birthdate" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['birthdate'] == unconverted_properties['birthdate'][i] - assert 'fName' in unconverted_properties + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["birthdate"] + == unconverted_properties["birthdate"][i] + ) + assert "fName" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['fName'] == unconverted_properties['fName'][i] - assert 'usedNames' in unconverted_properties + assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["fName"] == unconverted_properties["fName"][i] + assert "usedNames" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['usedNames'] == unconverted_properties['usedNames'][i] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["usedNames"] + == unconverted_properties["usedNames"][i] + ) - assert 'workedHours' in unconverted_properties + assert "workedHours" in unconverted_properties for i in range(7): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i] - ]['workedHours'] == unconverted_properties['workedHours'][i] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx[i]]["workedHours"] + == unconverted_properties["workedHours"][i] + ) assert torch_geometric_data.edge_index.shape == torch.Size([2, 14]) for i in range(14): - src, dst = torch_geometric_data.edge_index[0][i].item( - ), torch_geometric_data.edge_index[1][i].item() + src, dst = torch_geometric_data.edge_index[0][i].item(), torch_geometric_data.edge_index[1][i].item() assert src in pos_to_idx assert dst in pos_to_idx assert src != dst assert pos_to_idx[dst] in ground_truth.TINY_SNB_KNOWS_GROUND_TRUTH[pos_to_idx[src]] assert len(edge_properties) == 8 - assert 'date' in edge_properties - assert 'meetTime' in edge_properties - assert 'validInterval' in edge_properties - assert 'comments' in edge_properties - assert 'summary' in edge_properties - assert 'notes' in edge_properties + assert "date" in edge_properties + assert "meetTime" in edge_properties + assert "validInterval" in edge_properties + assert "comments" in edge_properties + assert "summary" in edge_properties + assert "notes" in edge_properties for i in range(14): - src, dst = torch_geometric_data.edge_index[0][i].item( - ), torch_geometric_data.edge_index[1][i].item() + src, dst = torch_geometric_data.edge_index[0][i].item(), torch_geometric_data.edge_index[1][i].item() orginal_src = pos_to_idx[src] orginal_dst = pos_to_idx[dst] assert (orginal_src, orginal_dst) in ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['date'] == edge_properties['date'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['meetTime'] == edge_properties['meetTime'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['validInterval'] == edge_properties['validInterval'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['comments'] == edge_properties['comments'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['summary'] == edge_properties['summary'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['notes'] == edge_properties['notes'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - orginal_src, orginal_dst)]['someMap'] == edge_properties['someMap'][i] - - -def test_to_torch_geometric_heterogeneous_graph(establish_connection): + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["date"] + == edge_properties["date"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["meetTime"] + == edge_properties["meetTime"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["validInterval"] + == edge_properties["validInterval"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["comments"] + == edge_properties["comments"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["summary"] + == edge_properties["summary"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["notes"] + == edge_properties["notes"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(orginal_src, orginal_dst)]["someMap"] + == edge_properties["someMap"][i] + ) + + +def test_to_torch_geometric_heterogeneous_graph(establish_connection: ConnDB) -> None: conn, _ = establish_connection query = "MATCH (p:person)-[r1:knows]->(q:person)-[r2:workAt]->(o:organisation) RETURN p, q, o, r1, r2" @@ -229,7 +282,7 @@ def test_to_torch_geometric_heterogeneous_graph(establish_connection): torch_geometric_data, pos_to_idx, unconverted_properties, edge_properties = res.get_as_torch_geometric() assert len(ws) == 13 - warnings_ground_truth = set([ + warnings_ground_truth = { "Property organisation.name of type STRING is not supported by torch_geometric. The property is marked as unconverted.", "Property person.height of type FLOAT is not supported by torch_geometric. The property is marked as unconverted.", "Property person.u of type UUID is not supported by torch_geometric. The property is marked as unconverted.", @@ -242,182 +295,249 @@ def test_to_torch_geometric_heterogeneous_graph(establish_connection): "Property person.usedNames of type STRING is not supported by torch_geometric. The property is marked as unconverted.", "Property organisation.licenseValidInterval of type INTERVAL is not supported by torch_geometric. The property is marked as unconverted.", "Property organisation.state of type STRUCT(revenue:INT16, location:STRING is not supported by torch_geometric. The property is marked as unconverted.", - "Property organisation.info of type UNION(price:FLOAT, movein:DATE, note:STRING) is not supported by torch_geometric. The property is marked as unconverted." - ]) + "Property organisation.info of type UNION(price:FLOAT, movein:DATE, note:STRING) is not supported by torch_geometric. The property is marked as unconverted.", + } for w in ws: assert str(w.message) in warnings_ground_truth - assert torch_geometric_data['person'].ID.shape == torch.Size([4]) - assert torch_geometric_data['person'].ID.dtype == torch.int64 + assert torch_geometric_data["person"].ID.shape == torch.Size([4]) + assert torch_geometric_data["person"].ID.dtype == torch.int64 for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['ID'] == torch_geometric_data['person'].ID[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["ID"] + == torch_geometric_data["person"].ID[i].item() + ) - assert torch_geometric_data['person'].gender.shape == torch.Size([4]) - assert torch_geometric_data['person'].gender.dtype == torch.int64 + assert torch_geometric_data["person"].gender.shape == torch.Size([4]) + assert torch_geometric_data["person"].gender.dtype == torch.int64 for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['gender'] == torch_geometric_data['person'].gender[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["gender"] + == torch_geometric_data["person"].gender[i].item() + ) - assert torch_geometric_data['person'].isStudent.shape == torch.Size([4]) - assert torch_geometric_data['person'].isStudent.dtype == torch.bool + assert torch_geometric_data["person"].isStudent.shape == torch.Size([4]) + assert torch_geometric_data["person"].isStudent.dtype == torch.bool for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['isStudent'] == torch_geometric_data['person'].isStudent[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["isStudent"] + == torch_geometric_data["person"].isStudent[i].item() + ) - assert torch_geometric_data['person'].isWorker.shape == torch.Size([4]) - assert torch_geometric_data['person'].isWorker.dtype == torch.bool + assert torch_geometric_data["person"].isWorker.shape == torch.Size([4]) + assert torch_geometric_data["person"].isWorker.dtype == torch.bool for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['isWorker'] == torch_geometric_data['person'].isWorker[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["isWorker"] + == torch_geometric_data["person"].isWorker[i].item() + ) - assert torch_geometric_data['person'].age.shape == torch.Size([4]) - assert torch_geometric_data['person'].age.dtype == torch.int64 + assert torch_geometric_data["person"].age.shape == torch.Size([4]) + assert torch_geometric_data["person"].age.dtype == torch.int64 for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['age'] == torch_geometric_data['person'].age[i].item() + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["age"] + == torch_geometric_data["person"].age[i].item() + ) - assert torch_geometric_data['person'].eyeSight.shape == torch.Size([4]) - assert torch_geometric_data['person'].eyeSight.dtype == torch.float32 + assert torch_geometric_data["person"].eyeSight.shape == torch.Size([4]) + assert torch_geometric_data["person"].eyeSight.dtype == torch.float32 for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i]]['eyeSight'] - \ - torch_geometric_data['person'].eyeSight[i].item() < 1e-6 - - assert 'person' in unconverted_properties - assert len(unconverted_properties['person']) == 8 - assert 'courseScoresPerTerm' in unconverted_properties['person'] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["eyeSight"] + - torch_geometric_data["person"].eyeSight[i].item() + < 1e-6 + ) + + assert "person" in unconverted_properties + assert len(unconverted_properties["person"]) == 8 + assert "courseScoresPerTerm" in unconverted_properties["person"] for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['courseScoresPerTerm'] == unconverted_properties['person']['courseScoresPerTerm'][i] - assert 'lastJobDuration' in unconverted_properties['person'] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["courseScoresPerTerm"] + == unconverted_properties["person"]["courseScoresPerTerm"][i] + ) + assert "lastJobDuration" in unconverted_properties["person"] for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['lastJobDuration'] == unconverted_properties['person']['lastJobDuration'][i] - assert 'registerTime' in unconverted_properties['person'] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["lastJobDuration"] + == unconverted_properties["person"]["lastJobDuration"][i] + ) + assert "registerTime" in unconverted_properties["person"] for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['registerTime'] == unconverted_properties['person']['registerTime'][i] - assert 'birthdate' in unconverted_properties['person'] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["registerTime"] + == unconverted_properties["person"]["registerTime"][i] + ) + assert "birthdate" in unconverted_properties["person"] for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['birthdate'] == unconverted_properties['person']['birthdate'][i] - assert 'fName' in unconverted_properties['person'] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["birthdate"] + == unconverted_properties["person"]["birthdate"][i] + ) + assert "fName" in unconverted_properties["person"] for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['fName'] == unconverted_properties['person']['fName'][i] - assert 'usedNames' in unconverted_properties['person'] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["fName"] + == unconverted_properties["person"]["fName"][i] + ) + assert "usedNames" in unconverted_properties["person"] for i in range(4): - assert ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx['person'][i] - ]['usedNames'] == unconverted_properties['person']['usedNames'][i] + assert ( + ground_truth.TINY_SNB_PERSONS_GROUND_TRUTH[pos_to_idx["person"][i]]["usedNames"] + == unconverted_properties["person"]["usedNames"][i] + ) - assert torch_geometric_data['person', 'person'].edge_index.shape == torch.Size([ - 2, 6]) + assert torch_geometric_data["person", "person"].edge_index.shape == torch.Size([2, 6]) for i in range(3): - src, dst = torch_geometric_data['person', 'person'].edge_index[0][i].item( - ), torch_geometric_data['person', 'person'].edge_index[1][i].item() - assert src in pos_to_idx['person'] - assert dst in pos_to_idx['person'] + src, dst = ( + torch_geometric_data["person", "person"].edge_index[0][i].item(), + torch_geometric_data["person", "person"].edge_index[1][i].item(), + ) + assert src in pos_to_idx["person"] + assert dst in pos_to_idx["person"] assert src != dst - assert pos_to_idx['person'][dst] in ground_truth.TINY_SNB_KNOWS_GROUND_TRUTH[pos_to_idx['person'][src]] - - assert len(edge_properties['person', 'person']) == 8 - assert 'date' in edge_properties['person', 'person'] - assert 'meetTime' in edge_properties['person', 'person'] - assert 'validInterval' in edge_properties['person', 'person'] - assert 'comments' in edge_properties['person', 'person'] - assert 'summary' in edge_properties['person', 'person'] - assert 'notes' in edge_properties['person', 'person'] - assert '_label' in edge_properties['person', 'person'] + assert pos_to_idx["person"][dst] in ground_truth.TINY_SNB_KNOWS_GROUND_TRUTH[pos_to_idx["person"][src]] + + assert len(edge_properties["person", "person"]) == 8 + assert "date" in edge_properties["person", "person"] + assert "meetTime" in edge_properties["person", "person"] + assert "validInterval" in edge_properties["person", "person"] + assert "comments" in edge_properties["person", "person"] + assert "summary" in edge_properties["person", "person"] + assert "notes" in edge_properties["person", "person"] + assert "_label" in edge_properties["person", "person"] for i in range(3): - src, dst = torch_geometric_data['person', 'person'].edge_index[0][i].item( - ), torch_geometric_data['person', 'person'].edge_index[1][i].item() - original_src, original_dst = pos_to_idx['person'][src], pos_to_idx['person'][dst] + src, dst = ( + torch_geometric_data["person", "person"].edge_index[0][i].item(), + torch_geometric_data["person", "person"].edge_index[1][i].item(), + ) + original_src, original_dst = pos_to_idx["person"][src], pos_to_idx["person"][dst] assert (original_src, original_dst) in ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['date'] == edge_properties['person', 'person']['date'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['meetTime'] == edge_properties['person', 'person']['meetTime'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['validInterval'] == edge_properties['person', 'person']['validInterval'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['comments'] == edge_properties['person', 'person']['comments'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['summary'] == edge_properties['person', 'person']['summary'][i] - assert ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['notes'] == edge_properties['person', 'person']['notes'][i] - assert edge_properties['person', 'person']['_label'][i] == 'knows' - - assert torch_geometric_data['organisation'].ID.shape == torch.Size([2]) - assert torch_geometric_data['organisation'].ID.dtype == torch.int64 + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["date"] + == edge_properties["person", "person"]["date"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["meetTime"] + == edge_properties["person", "person"]["meetTime"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["validInterval"] + == edge_properties["person", "person"]["validInterval"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["comments"] + == edge_properties["person", "person"]["comments"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["summary"] + == edge_properties["person", "person"]["summary"][i] + ) + assert ( + ground_truth.TINY_SNB_KNOWS_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["notes"] + == edge_properties["person", "person"]["notes"][i] + ) + assert edge_properties["person", "person"]["_label"][i] == "knows" + + assert torch_geometric_data["organisation"].ID.shape == torch.Size([2]) + assert torch_geometric_data["organisation"].ID.dtype == torch.int64 for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['ID'] == torch_geometric_data['organisation'].ID[i].item() + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["ID"] + == torch_geometric_data["organisation"].ID[i].item() + ) - assert torch_geometric_data['organisation'].orgCode.shape == torch.Size([ - 2]) - assert torch_geometric_data['organisation'].orgCode.dtype == torch.int64 + assert torch_geometric_data["organisation"].orgCode.shape == torch.Size([2]) + assert torch_geometric_data["organisation"].orgCode.dtype == torch.int64 for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['orgCode'] == torch_geometric_data['organisation'].orgCode[i].item() + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["orgCode"] + == torch_geometric_data["organisation"].orgCode[i].item() + ) - assert torch_geometric_data['organisation'].mark.shape == torch.Size([2]) - assert torch_geometric_data['organisation'].mark.dtype == torch.float32 + assert torch_geometric_data["organisation"].mark.shape == torch.Size([2]) + assert torch_geometric_data["organisation"].mark.dtype == torch.float32 for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['mark'] - torch_geometric_data['organisation'].mark[i].item() < 1e-6 - - assert torch_geometric_data['organisation'].score.shape == torch.Size([2]) - assert torch_geometric_data['organisation'].score.dtype == torch.int64 + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["mark"] + - torch_geometric_data["organisation"].mark[i].item() + < 1e-6 + ) + + assert torch_geometric_data["organisation"].score.shape == torch.Size([2]) + assert torch_geometric_data["organisation"].score.dtype == torch.int64 for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['score'] - torch_geometric_data['organisation'].score[i].item() < 1e-6 - - assert torch_geometric_data['organisation'].rating.shape == torch.Size([2]) - assert torch_geometric_data['organisation'].rating.dtype == torch.float32 + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["score"] + - torch_geometric_data["organisation"].score[i].item() + < 1e-6 + ) + + assert torch_geometric_data["organisation"].rating.shape == torch.Size([2]) + assert torch_geometric_data["organisation"].rating.dtype == torch.float32 for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['rating'] - torch_geometric_data['organisation'].rating[i].item() < 1e-6 - - assert 'organisation' in unconverted_properties - assert len(unconverted_properties['organisation']) == 5 - assert 'name' in unconverted_properties['organisation'] + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["rating"] + - torch_geometric_data["organisation"].rating[i].item() + < 1e-6 + ) + + assert "organisation" in unconverted_properties + assert len(unconverted_properties["organisation"]) == 5 + assert "name" in unconverted_properties["organisation"] for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['name'] == unconverted_properties['organisation']['name'][i] + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["name"] + == unconverted_properties["organisation"]["name"][i] + ) - assert 'history' in unconverted_properties['organisation'] + assert "history" in unconverted_properties["organisation"] for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['history'] == unconverted_properties['organisation']['history'][i] + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["history"] + == unconverted_properties["organisation"]["history"][i] + ) - assert 'licenseValidInterval' in unconverted_properties['organisation'] + assert "licenseValidInterval" in unconverted_properties["organisation"] for i in range(2): - assert ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx['organisation'][i] - ]['licenseValidInterval'] == unconverted_properties['organisation']['licenseValidInterval'][i] + assert ( + ground_truth.TINY_SNB_ORGANISATIONS_GROUND_TRUTH[pos_to_idx["organisation"][i]]["licenseValidInterval"] + == unconverted_properties["organisation"]["licenseValidInterval"][i] + ) - assert torch_geometric_data['person', 'organisation'].edge_index.shape == torch.Size([ - 2, 2]) + assert torch_geometric_data["person", "organisation"].edge_index.shape == torch.Size([2, 2]) for i in range(2): - src, dst = torch_geometric_data['person', 'organisation'].edge_index[0][i].item( - ), torch_geometric_data['person', 'organisation'].edge_index[1][i].item() - assert src in pos_to_idx['person'] - assert dst in pos_to_idx['organisation'] + src, dst = ( + torch_geometric_data["person", "organisation"].edge_index[0][i].item(), + torch_geometric_data["person", "organisation"].edge_index[1][i].item(), + ) + assert src in pos_to_idx["person"] + assert dst in pos_to_idx["organisation"] assert src != dst - assert pos_to_idx['organisation'][dst] in ground_truth.TINY_SNB_WORKS_AT_GROUND_TRUTH[pos_to_idx['person'][src]] - assert len(edge_properties['person', 'organisation']) == 4 - assert 'year' in edge_properties['person', 'organisation'] - assert '_label' in edge_properties['person', 'organisation'] + assert ( + pos_to_idx["organisation"][dst] in ground_truth.TINY_SNB_WORKS_AT_GROUND_TRUTH[pos_to_idx["person"][src]] + ) + assert len(edge_properties["person", "organisation"]) == 4 + assert "year" in edge_properties["person", "organisation"] + assert "_label" in edge_properties["person", "organisation"] for i in range(2): - src, dst = torch_geometric_data['person', 'organisation'].edge_index[0][i].item( - ), torch_geometric_data['person', 'organisation'].edge_index[1][i].item() - original_src, original_dst = pos_to_idx['person'][src], pos_to_idx['organisation'][dst] - assert ground_truth.TINY_SNB_WORKS_AT_PROPERTIES_GROUND_TRUTH[( - original_src, original_dst)]['year'] == edge_properties['person', 'organisation']['year'][i] - assert edge_properties['person', 'organisation']['_label'][i] == 'workAt' - - -def test_to_torch_geometric_multi_dimensional_lists(establish_connection): + src, dst = ( + torch_geometric_data["person", "organisation"].edge_index[0][i].item(), + torch_geometric_data["person", "organisation"].edge_index[1][i].item(), + ) + original_src, original_dst = pos_to_idx["person"][src], pos_to_idx["organisation"][dst] + assert ( + ground_truth.TINY_SNB_WORKS_AT_PROPERTIES_GROUND_TRUTH[(original_src, original_dst)]["year"] + == edge_properties["person", "organisation"]["year"][i] + ) + assert edge_properties["person", "organisation"]["_label"][i] == "workAt" + + +def test_to_torch_geometric_multi_dimensional_lists( + establish_connection: ConnDB, +) -> None: conn, _ = establish_connection query = "MATCH (t:tensor) RETURN t" @@ -425,7 +545,10 @@ def test_to_torch_geometric_multi_dimensional_lists(establish_connection): with warnings.catch_warnings(record=True) as ws: torch_geometric_data, pos_to_idx, unconverted_properties, _ = res.get_as_torch_geometric() assert len(ws) == 1 - assert str(ws[0].message) == "Property tensor.oneDimInt has a null value. torch_geometric does not support null values. The property is marked as unconverted." + assert ( + str(ws[0].message) + == "Property tensor.oneDimInt has a null value. torch_geometric does not support null values. The property is marked as unconverted." + ) bool_list = [] float_list = [] @@ -433,9 +556,9 @@ def test_to_torch_geometric_multi_dimensional_lists(establish_connection): for i in range(len(pos_to_idx)): idx = pos_to_idx[i] - bool_list.append(ground_truth.TENSOR_LIST_GROUND_TRUTH[idx]['boolTensor']) - float_list.append(ground_truth.TENSOR_LIST_GROUND_TRUTH[idx]['doubleTensor']) - int_list.append(ground_truth.TENSOR_LIST_GROUND_TRUTH[idx]['intTensor']) + bool_list.append(ground_truth.TENSOR_LIST_GROUND_TRUTH[idx]["boolTensor"]) + float_list.append(ground_truth.TENSOR_LIST_GROUND_TRUTH[idx]["doubleTensor"]) + int_list.append(ground_truth.TENSOR_LIST_GROUND_TRUTH[idx]["intTensor"]) bool_tensor = torch.tensor(bool_list, dtype=torch.bool) float_tensor = torch.tensor(float_list, dtype=torch.float32) @@ -464,7 +587,9 @@ def test_to_torch_geometric_multi_dimensional_lists(establish_connection): assert unconverted_properties["oneDimInt"] == [1, 2, None, None, 5, 6] -def test_to_torch_geometric_no_properties_converted(establish_connection): +def test_to_torch_geometric_no_properties_converted( + establish_connection: ConnDB, +) -> None: conn, _ = establish_connection query = "MATCH (p:personLongString)-[r:knowsLongString]->(q:personLongString) RETURN p, r, q" @@ -472,34 +597,43 @@ def test_to_torch_geometric_no_properties_converted(establish_connection): with warnings.catch_warnings(record=True) as ws: torch_geometric_data, pos_to_idx, unconverted_properties, _ = res.get_as_torch_geometric() assert len(ws) == 3 - warnings_ground_truth = set([ + warnings_ground_truth = { "Property personLongString.name of type STRING is not supported by torch_geometric. The property is marked as unconverted.", "Property personLongString.spouse of type STRING is not supported by torch_geometric. The property is marked as unconverted.", - "No nodes found or all node properties are not converted."]) + "No nodes found or all node properties are not converted.", + } for w in ws: assert str(w.message) in warnings_ground_truth - assert torch_geometric_data['personLongString'] == {} - assert torch_geometric_data['personLongString', - 'personLongString'].edge_index.shape == torch.Size([2, 1]) + assert torch_geometric_data["personLongString"] == {} + assert torch_geometric_data["personLongString", "personLongString"].edge_index.shape == torch.Size([2, 1]) for i in range(1): - src, dst = torch_geometric_data['personLongString', 'personLongString'].edge_index[0][i].item( - ), torch_geometric_data['personLongString', 'personLongString'].edge_index[1][i].item() - assert src in pos_to_idx['personLongString'] - assert dst in pos_to_idx['personLongString'] + src, dst = ( + torch_geometric_data["personLongString", "personLongString"].edge_index[0][i].item(), + torch_geometric_data["personLongString", "personLongString"].edge_index[1][i].item(), + ) + assert src in pos_to_idx["personLongString"] + assert dst in pos_to_idx["personLongString"] assert src != dst - assert pos_to_idx['personLongString'][dst] in ground_truth.PERSONLONGSTRING_KNOWS_GROUND_TRUTH[pos_to_idx['personLongString'][src]] + assert ( + pos_to_idx["personLongString"][dst] + in ground_truth.PERSONLONGSTRING_KNOWS_GROUND_TRUTH[pos_to_idx["personLongString"][src]] + ) assert len(unconverted_properties) == 1 - assert len(unconverted_properties['personLongString']) == 2 + assert len(unconverted_properties["personLongString"]) == 2 - assert 'spouse' in unconverted_properties['personLongString'] - assert len(unconverted_properties['personLongString']['spouse']) == 2 + assert "spouse" in unconverted_properties["personLongString"] + assert len(unconverted_properties["personLongString"]["spouse"]) == 2 for i in range(2): - assert ground_truth.PERSONLONGSTRING_GROUND_TRUTH[pos_to_idx['personLongString'][i] - ]['spouse'] == unconverted_properties['personLongString']['spouse'][i] + assert ( + ground_truth.PERSONLONGSTRING_GROUND_TRUTH[pos_to_idx["personLongString"][i]]["spouse"] + == unconverted_properties["personLongString"]["spouse"][i] + ) - assert 'name' in unconverted_properties['personLongString'] + assert "name" in unconverted_properties["personLongString"] for i in range(2): - assert ground_truth.PERSONLONGSTRING_GROUND_TRUTH[pos_to_idx['personLongString'][i] - ]['name'] == unconverted_properties['personLongString']['name'][i] + assert ( + ground_truth.PERSONLONGSTRING_GROUND_TRUTH[pos_to_idx["personLongString"][i]]["name"] + == unconverted_properties["personLongString"]["name"][i] + ) diff --git a/tools/python_api/test/test_torch_geometric_remote_backend.py b/tools/python_api/test/test_torch_geometric_remote_backend.py index e44b0ff959b..618ed0a6be6 100644 --- a/tools/python_api/test/test_torch_geometric_remote_backend.py +++ b/tools/python_api/test/test_torch_geometric_remote_backend.py @@ -1,9 +1,11 @@ -import torch +from __future__ import annotations + import random -import sys -from test_helper import KUZU_ROOT import kuzu +import torch +from test_helper import KUZU_ROOT +from type_aliases import ConnDB TINY_SNB_KNOWS_GROUND_TRUTH = { 0: [2, 3, 5], @@ -16,95 +18,101 @@ TINY_SNB_PERSON_IDS_GROUND_TRUTH = [0, 2, 3, 5, 7, 8, 9, 10] -def test_remote_backend_graph_store(establish_connection): +def test_remote_backend_graph_store(establish_connection: ConnDB) -> None: _, db = establish_connection fs, gs = db.get_torch_geometric_remote_backend() - edge_idx = gs.get_edge_index( - ('person', 'knows', 'person'), layout='coo', is_sorted=False) + edge_idx = gs.get_edge_index(("person", "knows", "person"), layout="coo", is_sorted=False) assert edge_idx.shape == torch.Size([2, 14]) for i in range(14): src = edge_idx[0, i].item() - src_id = fs['person', 'ID', src].item() + src_id = fs["person", "ID", src].item() dst = edge_idx[1, i].item() - dst_id = fs['person', 'ID', dst].item() + dst_id = fs["person", "ID", dst].item() assert src_id in TINY_SNB_KNOWS_GROUND_TRUTH assert dst_id in TINY_SNB_KNOWS_GROUND_TRUTH[src_id] -def test_remote_backend_feature_store_idx(establish_connection): +def test_remote_backend_feature_store_idx(establish_connection: ConnDB) -> None: _, db = establish_connection fs, _ = db.get_torch_geometric_remote_backend() id_set = set(TINY_SNB_PERSON_IDS_GROUND_TRUTH) index_to_id = {} # Individual index access for i in range(len(id_set)): - assert fs['person', 'ID', i].item() in id_set - id_set.remove(fs['person', 'ID', i].item()) - index_to_id[i] = fs['person', 'ID', i].item() + assert fs["person", "ID", i].item() in id_set + id_set.remove(fs["person", "ID", i].item()) + index_to_id[i] = fs["person", "ID", i].item() # Range index access - for i in range(len(index_to_id)-3): - ids = fs['person', 'ID', i:i+3] + for i in range(len(index_to_id) - 3): + ids = fs["person", "ID", i : i + 3] for j in range(3): - assert ids[j].item() == index_to_id[i+j] + assert ids[j].item() == index_to_id[i + j] # Multiple index access indicies = random.sample(range(len(index_to_id)), 4) - ids = fs['person', 'ID', indicies] + ids = fs["person", "ID", indicies] for i in range(4): idx = indicies[i] assert ids[i].item() == index_to_id[idx] # No index access - ids = fs['person', 'ID', None] + ids = fs["person", "ID", None] assert len(ids) == len(index_to_id) for i in range(len(ids)): assert ids[i].item() == index_to_id[i] -def test_remote_backend_feature_store_types_1d(establish_connection): +def test_remote_backend_feature_store_types_1d(establish_connection: ConnDB) -> None: _, db = establish_connection fs, _ = db.get_torch_geometric_remote_backend() for i in range(3): - assert fs['npyoned', 'i64', i].item() - i == 1 - assert fs['npyoned', 'i32', i].item() - i == 1 - assert fs['npyoned', 'i16', i].item() - i == 1 - assert fs['npyoned', 'f64', i].item() - i - 1 < 1e-6 - assert fs['npyoned', 'f32', i].item() - i - 1 < 1e-6 + assert fs["npyoned", "i64", i].item() - i == 1 + assert fs["npyoned", "i32", i].item() - i == 1 + assert fs["npyoned", "i16", i].item() - i == 1 + assert fs["npyoned", "f64", i].item() - i - 1 < 1e-6 + assert fs["npyoned", "f32", i].item() - i - 1 < 1e-6 -def test_remote_backend_feature_store_types_2d(establish_connection): +def test_remote_backend_feature_store_types_2d(establish_connection: ConnDB) -> None: _, db = establish_connection fs, _ = db.get_torch_geometric_remote_backend() for i in range(3): - i64 = fs['npytwod', 'i64', i] + i64 = fs["npytwod", "i64", i] assert i64.shape == torch.Size([1, 3]) base_number = (i * 3) + 1 for j in range(3): assert i64[0, j].item() == base_number + j - i32 = fs['npytwod', 'i32', i] + i32 = fs["npytwod", "i32", i] assert i32.shape == torch.Size([1, 3]) for j in range(3): assert i32[0, j].item() == base_number + j - i16 = fs['npytwod', 'i16', i] + i16 = fs["npytwod", "i16", i] assert i16.shape == torch.Size([1, 3]) for j in range(3): assert i16[0, j].item() == base_number + j - f64 = fs['npytwod', 'f64', i] + f64 = fs["npytwod", "f64", i] assert f64.shape == torch.Size([1, 3]) for j in range(3): assert f64[0, j].item() - (base_number + j) - 1 < 1e-6 - f32 = fs['npytwod', 'f32', i] + f32 = fs["npytwod", "f32", i] assert f32.shape == torch.Size([1, 3]) for j in range(3): assert f32[0, j].item() - (base_number + j) - 1 < 1e-6 -def test_remote_backend_20k(establish_connection): + +def test_remote_backend_20k(establish_connection: ConnDB) -> None: _, db = establish_connection conn = kuzu.Connection(db, num_threads=1) - conn.execute('create node table npy20k (id INT64,f32 FLOAT[10],PRIMARY KEY(id));') - conn.execute(f'copy npy20k from ("{KUZU_ROOT}/dataset/npy-20k/id_int64.npy", "{KUZU_ROOT}/dataset/npy-20k/two_dim_float.npy") by column;') + conn.execute("CREATE NODE TABLE npy20k (id INT64,f32 FLOAT[10],PRIMARY KEY(id));") + conn.execute( + f""" + COPY npy20k FROM ( + "{KUZU_ROOT}/dataset/npy-20k/id_int64.npy", + "{KUZU_ROOT}/dataset/npy-20k/two_dim_float.npy") BY COLUMN; + """ + ) del conn fs, _ = db.get_torch_geometric_remote_backend(8) for i in range(20000): - assert fs['npy20k', 'id', i].item() == i + assert fs["npy20k", "id", i].item() == i diff --git a/tools/python_api/test/test_version.py b/tools/python_api/test/test_version.py index f5ed761d02e..05c27981dda 100644 --- a/tools/python_api/test/test_version.py +++ b/tools/python_api/test/test_version.py @@ -1,4 +1,5 @@ -def test_version(): +def test_version() -> None: import kuzu + assert kuzu.version != "" assert kuzu.storage_version > 0 diff --git a/tools/python_api/test/type_aliases.py b/tools/python_api/test/type_aliases.py new file mode 100644 index 00000000000..8baf0dc57b4 --- /dev/null +++ b/tools/python_api/test/type_aliases.py @@ -0,0 +1,10 @@ +import sys + +from kuzu import Connection, Database + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +ConnDB: TypeAlias = tuple[Connection, Database] From 18c2c8fe39860e45038eac0c7d1b503492ac765c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Tue, 12 Mar 2024 22:19:24 +0800 Subject: [PATCH 021/136] Fix unicode conversion for pandas dataframe (#3029) --- .../src_cpp/py_query_result_converter.cpp | 11 +-- tools/python_api/test/test_df.py | 83 ++++++++++++++++--- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/tools/python_api/src_cpp/py_query_result_converter.cpp b/tools/python_api/src_cpp/py_query_result_converter.cpp index d7e996b50db..07b85f681dc 100644 --- a/tools/python_api/src_cpp/py_query_result_converter.cpp +++ b/tools/python_api/src_cpp/py_query_result_converter.cpp @@ -1,7 +1,7 @@ #include "include/py_query_result_converter.h" -#include "common/types/value/value.h" #include "cached_import/py_cached_import.h" +#include "common/types/value/value.h" #include "include/py_query_result.h" using namespace kuzu::common; @@ -79,10 +79,8 @@ void NPArrayWrapper::appendElement(Value* value) { } break; case LogicalTypeID::STRING: { auto val = value->getValue(); - auto result = PyUnicode_New(val.length(), 127); - auto target_data = PyUnicode_DATA(result); - memcpy(target_data, val.c_str(), val.length()); - ((PyObject**)dataBuffer)[numElements] = result; + py::str result(val); + ((py::str*)dataBuffer)[numElements] = result; } break; case LogicalTypeID::BLOB: { ((py::bytes*)dataBuffer)[numElements] = PyQueryResult::convertValueToPyObject(*value); @@ -211,8 +209,7 @@ py::object QueryResultConverter::toDF() { auto fromDict = importCache->pandas.DataFrame.from_dict(); for (auto i = 0u; i < colNames.size(); i++) { - result[colNames[i].c_str()] = - maskedArray(columns[i]->data, columns[i]->mask); + result[colNames[i].c_str()] = maskedArray(columns[i]->data, columns[i]->mask); } return fromDict(result); } diff --git a/tools/python_api/test/test_df.py b/tools/python_api/test/test_df.py index 715e8381f1f..0e97c598a09 100644 --- a/tools/python_api/test/test_df.py +++ b/tools/python_api/test/test_df.py @@ -33,7 +33,16 @@ def _test_person_to_df(conn: kuzu.Connection) -> None: assert str(pd["p.fName"].dtype) == "object" assert pd["p.gender"].tolist() == [1, 2, 1, 2, 1, 2, 2, 2] assert str(pd["p.gender"].dtype) == "int64" - assert pd["p.isStudent"].tolist() == [True, True, False, False, False, True, False, False] + assert pd["p.isStudent"].tolist() == [ + True, + True, + False, + False, + False, + True, + False, + False, + ] assert str(pd["p.isStudent"].dtype) == "bool" assert pd["p.eyeSight"].tolist() == [5.0, 5.1, 5.0, 4.8, 4.7, 4.5, 4.9, 4.9] assert str(pd["p.eyeSight"].dtype) == "float64" @@ -143,7 +152,11 @@ def _test_study_at_to_df(conn: kuzu.Connection) -> None: assert str(pd["r.ulength"].dtype) == "uint16" assert pd["r.ulevel"].tolist() == [250, 12, 220] assert str(pd["r.ulevel"].dtype) == "uint8" - assert pd["r.hugedata"].tolist() == [1.8446744073709552e27, -15.0, -1.8446744073709552e21] + assert pd["r.hugedata"].tolist() == [ + 1.8446744073709552e27, + -15.0, + -1.8446744073709552e21, + ] assert str(pd["r.hugedata"].dtype) == "float64" def _test_timestamps_to_df(conn: kuzu.Connection) -> None: @@ -214,9 +227,17 @@ def _test_movies_to_df(conn: kuzu.Connection) -> None: }, ] assert str(pd["m.description"].dtype) == "object" - assert pd["m.content"].tolist() == [b"\xaa\xabinteresting\x0b", b"pure ascii characters", b"\xab\xcd"] + assert pd["m.content"].tolist() == [ + b"\xaa\xabinteresting\x0b", + b"pure ascii characters", + b"\xab\xcd", + ] assert str(pd["m.content"].dtype) == "object" - assert pd["m.audience"].tolist() == [{"audience1": 52, "audience53": 42}, {}, {"audience1": 33}] + assert pd["m.audience"].tolist() == [ + {"audience1": 52, "audience53": 42}, + {}, + {"audience1": 33}, + ] assert str(pd["m.audience"].dtype) == "object" assert pd["m.grade"].tolist() == [True, 254.0, 8.989] assert str(pd["m.grade"].dtype) == "object" @@ -294,7 +315,16 @@ def test_df_get_node(establish_connection: ConnDB) -> None: Timedelta("3750 days 13:00:00.000024"), Timedelta("1082 days 13:02:00"), ], - "workedHours": [[10, 5], [12, 8], [4, 5], [1, 9], [2], [3, 4, 5, 6, 7], [1], [10, 11, 12, 3, 4, 5, 6, 7]], + "workedHours": [ + [10, 5], + [12, 8], + [4, 5], + [1, 9], + [2], + [3, 4, 5, 6, 7], + [1], + [10, 11, 12, 3, 4, 5, 6, 7], + ], "usedNames": [ ["Aida"], ["Bobby"], @@ -315,7 +345,16 @@ def test_df_get_node(establish_connection: ConnDB) -> None: [[10]], [[7], [10], [6, 7]], ], - "_label": ["person", "person", "person", "person", "person", "person", "person", "person"], + "_label": [ + "person", + "person", + "person", + "person", + "person", + "person", + "person", + "person", + ], } for i in range(len(p_list)): p = p_list[i] @@ -340,7 +379,11 @@ def test_df_get_node_rel(establish_connection: ConnDB) -> None: "gender": [1, 2, 1], "isStudent": [False, False, False], "eyeSight": [5.0, 4.8, 4.7], - "birthdate": [datetime.date(1940, 6, 22), datetime.date(1950, 7, 23), datetime.date(1980, 10, 26)], + "birthdate": [ + datetime.date(1940, 6, 22), + datetime.date(1950, 7, 23), + datetime.date(1980, 10, 26), + ], "registerTime": [ Timestamp("1911-08-20 02:32:21"), Timestamp("2031-11-30 12:25:30"), @@ -367,7 +410,11 @@ def test_df_get_node_rel(establish_connection: ConnDB) -> None: "orgCode": [934, 824, 824], "mark": [4.1, 4.1, 4.1], "score": [-100, 7, 7], - "history": ["2 years 4 days 10 hours", "2 years 4 hours 22 us 34 minutes", "2 years 4 hours 22 us 34 minutes"], + "history": [ + "2 years 4 days 10 hours", + "2 years 4 hours 22 us 34 minutes", + "2 years 4 hours 22 us 34 minutes", + ], "licenseValidInterval": [ Timedelta(days=9414), Timedelta(days=3, seconds=36000, microseconds=100000), @@ -430,7 +477,10 @@ def test_df_get_recursive_join(establish_connection: ConnDB) -> None: "notes": 1, "summary": { "locations": ["'toronto'", "'waterloo'"], - "transfer": {"amount": [100, 200], "day": datetime.date(2021, 1, 2)}, + "transfer": { + "amount": [100, 200], + "day": datetime.date(2021, 1, 2), + }, }, "someMap": {"a": "b"}, "validInterval": datetime.timedelta(days=3750, seconds=46800, microseconds=24), @@ -445,7 +495,10 @@ def test_df_get_recursive_join(establish_connection: ConnDB) -> None: "notes": 1, "summary": { "locations": ["'toronto'", "'waterloo'"], - "transfer": {"amount": [100, 200], "day": datetime.date(2021, 1, 2)}, + "transfer": { + "amount": [100, 200], + "day": datetime.date(2021, 1, 2), + }, }, "someMap": {"a": "b"}, "validInterval": datetime.timedelta(days=3750, seconds=46800, microseconds=24), @@ -475,3 +528,13 @@ def test_get_rdf_variant(establish_connection: ConnDB) -> None: datetime.timedelta(days=2), b"\xb2", ] + + +def test_get_df_unicode(establish_connection: ConnDB) -> None: + conn, _ = establish_connection + res = conn.execute("MATCH (m:movies) RETURN m.name").get_as_df() + assert res["m.name"].tolist() == [ + "Sóló cón tu párejâ", + "The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie", + "Roma", + ] From 339a4719b346db07da30040c296c4374c820f252 Mon Sep 17 00:00:00 2001 From: Semih Salihoglu Date: Tue, 12 Mar 2024 21:02:00 +0300 Subject: [PATCH 022/136] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 2eac1b77815..60179b0a3ec 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Kùzu Contributors +Copyright (c) 2022-2024 Kùzu Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From bdd650e25ea455b2955d71657bb0ef668f61d25f Mon Sep 17 00:00:00 2001 From: xiyang Date: Mon, 4 Mar 2024 16:10:06 +0800 Subject: [PATCH 023/136] Add copy from subquery --- scripts/antlr4/Cypher.g4.copy | 18 +- src/antlr4/Cypher.g4 | 18 +- src/binder/bind/bind_copy.cpp | 156 +- src/binder/bind/bind_file_scan.cpp | 60 +- src/binder/bind/bind_reading_clause.cpp | 23 +- src/binder/bind/copy/bind_copy_rdf_graph.cpp | 60 +- src/binder/expression_binder.cpp | 7 + src/common/exception/message.cpp | 5 - src/common/types/types.cpp | 13 +- src/include/binder/binder.h | 28 +- src/include/binder/bound_scan_source.h | 71 + src/include/binder/copy/bound_copy_from.h | 21 +- .../binder/copy/bound_file_scan_info.h | 10 +- src/include/binder/expression_binder.h | 1 + src/include/common/enums/scan_source_type.h | 16 + src/include/common/exception/message.h | 7 - src/include/common/types/types.h | 2 +- .../optimizer/logical_operator_visitor.h | 6 + .../projection_push_down_optimizer.h | 1 + src/include/parser/copy.h | 9 +- .../parser/query/reading_clause/load_from.h | 17 +- src/include/parser/scan_source.h | 44 + src/include/parser/transformer.h | 2 + .../planner/operator/logical_accumulate.h | 15 +- .../planner/operator/scan/logical_scan_file.h | 18 +- src/include/planner/planner.h | 19 +- src/include/processor/plan_mapper.h | 48 +- src/optimizer/acc_hash_join_optimizer.cpp | 2 +- src/optimizer/logical_operator_visitor.cpp | 6 + .../projection_push_down_optimizer.cpp | 10 + src/parser/transform/transform_copy.cpp | 26 +- .../transform/transform_reading_clause.cpp | 9 +- src/planner/operator/logical_accumulate.cpp | 11 +- .../operator/scan/logical_scan_file.cpp | 8 +- src/planner/plan/append_accumulate.cpp | 18 +- src/planner/plan/append_scan_file.cpp | 9 +- src/planner/plan/plan_copy.cpp | 51 +- .../map/create_factorized_table_scan.cpp | 93 +- src/processor/map/map_accumulate.cpp | 16 +- src/processor/map/map_copy_from.cpp | 22 +- src/processor/map/map_copy_to.cpp | 3 +- src/processor/map/map_dummy_scan.cpp | 3 +- src/processor/map/map_explain.cpp | 8 +- src/processor/map/map_expressions_scan.cpp | 4 +- src/processor/map/map_scan_file.cpp | 6 +- .../test_files/exceptions/copy/npy_fault.test | 5 +- .../tck/expressions/list/List1.test | 10 +- .../tck/expressions/list/List11.test | 10 +- test/test_files/tinysnb/copy/copy_from.test | 88 + test/test_files/tinysnb/exception/list.test | 9 +- third_party/antlr4_cypher/cypher_lexer.cpp | 6 +- third_party/antlr4_cypher/cypher_parser.cpp | 5573 ++++++++--------- .../antlr4_cypher/include/cypher_parser.h | 122 +- tools/python_api/test/test_scan_pandas.py | 14 + 54 files changed, 3657 insertions(+), 3180 deletions(-) create mode 100644 src/include/binder/bound_scan_source.h create mode 100644 src/include/common/enums/scan_source_type.h create mode 100644 src/include/parser/scan_source.h create mode 100644 test/test_files/tinysnb/copy/copy_from.test diff --git a/scripts/antlr4/Cypher.g4.copy b/scripts/antlr4/Cypher.g4.copy index b2a757176cd..4fdaa086014 100644 --- a/scripts/antlr4/Cypher.g4.copy +++ b/scripts/antlr4/Cypher.g4.copy @@ -34,24 +34,28 @@ oC_Statement | kU_ImportDatabase; kU_CopyFrom - : COPY SP oC_SchemaName ( ( SP? '(' SP? kU_ColumnNames SP? ')' SP? ) | SP ) FROM SP (kU_FilePaths | oC_Variable) ( SP? '(' SP? kU_ParsingOptions SP? ')' )? ; + : COPY SP oC_SchemaName ( ( SP? kU_ColumnNames SP? ) | SP ) FROM SP kU_ScanSource ( SP? kU_ParsingOptions )? ; kU_ColumnNames - : oC_SchemaName ( SP? ',' SP? oC_SchemaName )* ; + : '(' SP? oC_SchemaName ( SP? ',' SP? oC_SchemaName )* SP? ')'; + +kU_ScanSource + : kU_FilePaths + | '(' SP? oC_Query SP? ')' + | oC_Variable ; kU_CopyFromByColumn : COPY SP oC_SchemaName SP FROM SP '(' SP? StringLiteral ( SP? ',' SP? StringLiteral )* ')' SP BY SP COLUMN ; kU_CopyTO - : COPY SP '(' SP? oC_Query SP? ')' SP TO SP StringLiteral ( SP? '(' SP? kU_ParsingOptions SP? ')' )? ; + : COPY SP '(' SP? oC_Query SP? ')' SP TO SP StringLiteral ( SP? kU_ParsingOptions )? ; kU_ExportDatabase - : EXPORT SP DATABASE SP StringLiteral ( SP? '(' SP? kU_ParsingOptions SP? ')' )? ; + : EXPORT SP DATABASE SP StringLiteral ( SP? kU_ParsingOptions )? ; kU_ImportDatabase : IMPORT SP DATABASE SP StringLiteral; - kU_StandaloneCall : CALL SP oC_SymbolicName SP? '=' SP? oC_Literal ; @@ -81,7 +85,7 @@ kU_FilePaths GLOB : ( 'G' | 'g' ) ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'B' | 'b' ) ; kU_ParsingOptions - : kU_ParsingOption ( SP? ',' SP? kU_ParsingOption )* ; + : '(' SP? kU_ParsingOption ( SP? ',' SP? kU_ParsingOption )* SP? ')' ; kU_ParsingOption : oC_SymbolicName SP? '=' SP? oC_Literal; @@ -291,7 +295,7 @@ oC_ReadingClause ; kU_LoadFrom - : LOAD ( SP WITH SP HEADERS SP? '(' SP? kU_PropertyDefinitions SP? ')' )? SP FROM SP (kU_FilePaths ( SP? '(' SP? kU_ParsingOptions SP? ')' )? | oC_Variable) (SP? oC_Where)? ; + : LOAD ( SP WITH SP HEADERS SP? '(' SP? kU_PropertyDefinitions SP? ')' )? SP FROM SP kU_ScanSource (SP? kU_ParsingOptions)? (SP? oC_Where)? ; LOAD : ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'A' | 'a' ) ( 'D' | 'd' ) ; diff --git a/src/antlr4/Cypher.g4 b/src/antlr4/Cypher.g4 index b2a757176cd..4fdaa086014 100644 --- a/src/antlr4/Cypher.g4 +++ b/src/antlr4/Cypher.g4 @@ -34,24 +34,28 @@ oC_Statement | kU_ImportDatabase; kU_CopyFrom - : COPY SP oC_SchemaName ( ( SP? '(' SP? kU_ColumnNames SP? ')' SP? ) | SP ) FROM SP (kU_FilePaths | oC_Variable) ( SP? '(' SP? kU_ParsingOptions SP? ')' )? ; + : COPY SP oC_SchemaName ( ( SP? kU_ColumnNames SP? ) | SP ) FROM SP kU_ScanSource ( SP? kU_ParsingOptions )? ; kU_ColumnNames - : oC_SchemaName ( SP? ',' SP? oC_SchemaName )* ; + : '(' SP? oC_SchemaName ( SP? ',' SP? oC_SchemaName )* SP? ')'; + +kU_ScanSource + : kU_FilePaths + | '(' SP? oC_Query SP? ')' + | oC_Variable ; kU_CopyFromByColumn : COPY SP oC_SchemaName SP FROM SP '(' SP? StringLiteral ( SP? ',' SP? StringLiteral )* ')' SP BY SP COLUMN ; kU_CopyTO - : COPY SP '(' SP? oC_Query SP? ')' SP TO SP StringLiteral ( SP? '(' SP? kU_ParsingOptions SP? ')' )? ; + : COPY SP '(' SP? oC_Query SP? ')' SP TO SP StringLiteral ( SP? kU_ParsingOptions )? ; kU_ExportDatabase - : EXPORT SP DATABASE SP StringLiteral ( SP? '(' SP? kU_ParsingOptions SP? ')' )? ; + : EXPORT SP DATABASE SP StringLiteral ( SP? kU_ParsingOptions )? ; kU_ImportDatabase : IMPORT SP DATABASE SP StringLiteral; - kU_StandaloneCall : CALL SP oC_SymbolicName SP? '=' SP? oC_Literal ; @@ -81,7 +85,7 @@ kU_FilePaths GLOB : ( 'G' | 'g' ) ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'B' | 'b' ) ; kU_ParsingOptions - : kU_ParsingOption ( SP? ',' SP? kU_ParsingOption )* ; + : '(' SP? kU_ParsingOption ( SP? ',' SP? kU_ParsingOption )* SP? ')' ; kU_ParsingOption : oC_SymbolicName SP? '=' SP? oC_Literal; @@ -291,7 +295,7 @@ oC_ReadingClause ; kU_LoadFrom - : LOAD ( SP WITH SP HEADERS SP? '(' SP? kU_PropertyDefinitions SP? ')' )? SP FROM SP (kU_FilePaths ( SP? '(' SP? kU_ParsingOptions SP? ')' )? | oC_Variable) (SP? oC_Where)? ; + : LOAD ( SP WITH SP HEADERS SP? '(' SP? kU_PropertyDefinitions SP? ')' )? SP FROM SP kU_ScanSource (SP? kU_ParsingOptions)? (SP? oC_Where)? ; LOAD : ( 'L' | 'l' ) ( 'O' | 'o' ) ( 'A' | 'a' ) ( 'D' | 'd' ) ; diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index 15e143646f1..d8e0620d1a8 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -16,6 +16,7 @@ using namespace kuzu::binder; using namespace kuzu::catalog; using namespace kuzu::common; using namespace kuzu::parser; +using namespace kuzu::function; namespace kuzu { namespace binder { @@ -47,24 +48,6 @@ std::unique_ptr Binder::bindCopyToClause(const Statement& statem std::move(columnTypes), std::move(query), csvConfig.option.copy()); } -// As a temporary constraint, we require npy files loaded with COPY FROM BY COLUMN keyword. -// And csv and parquet files loaded with COPY FROM keyword. -static void validateByColumnKeyword(FileType fileType, bool byColumn) { - if (fileType == FileType::NPY && !byColumn) { - throw BinderException(ExceptionMessage::validateCopyNPYByColumnException()); - } - if (fileType != FileType::NPY && byColumn) { - throw BinderException(ExceptionMessage::validateCopyCSVParquetByColumnException()); - } -} - -static void validateCopyNpyNotForRelTables(TableCatalogEntry* tableEntry) { - if (tableEntry->getTableType() == TableType::REL) { - throw BinderException( - ExceptionMessage::validateCopyNpyNotForRelTablesException(tableEntry->getName())); - } -} - std::unique_ptr Binder::bindCopyFromClause(const Statement& statement) { auto& copyStatement = ku_dynamic_cast(statement); auto tableName = copyStatement.getTableName(); @@ -81,85 +64,84 @@ std::unique_ptr Binder::bindCopyFromClause(const Statement& stat default: break; } - auto filePaths = bindFilePaths(copyStatement.getFilePaths()); - auto fileType = bindFileType(filePaths); - auto readerConfig = std::make_unique(fileType, std::move(filePaths)); - readerConfig->options = bindParsingOptions(copyStatement.getParsingOptionsRef()); - validateByColumnKeyword(readerConfig->fileType, copyStatement.byColumn()); - if (readerConfig->fileType == FileType::NPY) { - validateCopyNpyNotForRelTables(tableEntry); - } switch (tableEntry->getTableType()) { - case TableType::NODE: - return bindCopyNodeFrom(statement, std::move(readerConfig), - ku_dynamic_cast(tableEntry)); - case TableType::REL: - return bindCopyRelFrom(statement, std::move(readerConfig), - ku_dynamic_cast(tableEntry)); - case TableType::RDF: - return bindCopyRdfFrom(statement, std::move(readerConfig), - ku_dynamic_cast(tableEntry)); + case TableType::NODE: { + auto nodeTableEntry = + ku_dynamic_cast(tableEntry); + return bindCopyNodeFrom(statement, nodeTableEntry); + } + case TableType::REL: { + auto relTableEntry = ku_dynamic_cast(tableEntry); + return bindCopyRelFrom(statement, relTableEntry); + } + case TableType::RDF: { + auto rdfGraphEntry = ku_dynamic_cast(tableEntry); + return bindCopyRdfFrom(statement, rdfGraphEntry); + } default: { KU_UNREACHABLE; } } } -std::unique_ptr Binder::bindCopyNodeFrom(const Statement& statement, - std::unique_ptr config, NodeTableCatalogEntry* nodeTableEntry) { +static void bindExpectedNodeColumns(NodeTableCatalogEntry* nodeTableEntry, + const std::vector& inputColumnNames, std::vector& columnNames, + std::vector& columnTypes); +static void bindExpectedRelColumns(RelTableCatalogEntry* relTableEntry, + const std::vector& inputColumnNames, std::vector& columnNames, + std::vector& columnTypes, main::ClientContext* context); + +std::unique_ptr Binder::bindCopyNodeFrom( + const Statement& statement, NodeTableCatalogEntry* nodeTableEntry) { auto& copyStatement = ku_dynamic_cast(statement); - auto func = getScanFunction(config->fileType, *config); - // For table with SERIAL columns, we need to read in serial from files. - auto containsSerial = nodeTableEntry->containPropertyType(*LogicalType::SERIAL()); + // Bind expected columns based on catalog information. std::vector expectedColumnNames; - std::vector expectedColumnTypes; + std::vector expectedColumnTypes; bindExpectedNodeColumns( nodeTableEntry, copyStatement.getColumnNames(), expectedColumnNames, expectedColumnTypes); - auto bindInput = std::make_unique(config->copy(), - std::move(expectedColumnNames), std::move(expectedColumnTypes), clientContext); - auto bindData = func->bindFunc(clientContext, bindInput.get()); - expression_vector columns; - for (auto i = 0u; i < bindData->columnTypes.size(); i++) { - columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); + auto boundSource = bindScanSource(copyStatement.getSource(), + copyStatement.getParsingOptionsRef(), expectedColumnNames, expectedColumnTypes); + if (boundSource->type == ScanSourceType::FILE) { + auto fileSource = + ku_dynamic_cast(boundSource.get()); + auto bindData = ku_dynamic_cast( + fileSource->fileScanInfo.bindData.get()); + if (copyStatement.byColumn() && bindData->config.fileType != FileType::NPY) { + throw BinderException(stringFormat("Copy by column with {} file type is not supported.", + FileTypeUtils::toString(bindData->config.fileType))); + } } auto offset = expressionBinder.createVariableExpression( - LogicalType(LogicalTypeID::INT64), std::string(InternalKeyword::ANONYMOUS)); - auto boundFileScanInfo = - std::make_unique(func, std::move(bindData), columns, std::move(offset)); - auto boundCopyFromInfo = BoundCopyFromInfo( - nodeTableEntry, std::move(boundFileScanInfo), containsSerial, nullptr /* extraInfo */); + *LogicalType::INT64(), std::string(InternalKeyword::ANONYMOUS)); + auto boundCopyFromInfo = + BoundCopyFromInfo(nodeTableEntry, std::move(boundSource), offset, nullptr /* extraInfo */); return std::make_unique(std::move(boundCopyFromInfo)); } -std::unique_ptr Binder::bindCopyRelFrom(const parser::Statement& statement, - std::unique_ptr config, RelTableCatalogEntry* relTableEntry) { +std::unique_ptr Binder::bindCopyRelFrom( + const parser::Statement& statement, RelTableCatalogEntry* relTableEntry) { auto& copyStatement = ku_dynamic_cast(statement); - auto func = getScanFunction(config->fileType, *config); - // For table with SERIAL columns, we need to read in serial from files. - auto containsSerial = relTableEntry->containPropertyType(*LogicalType::SERIAL()); - KU_ASSERT(containsSerial == false); - std::vector expectedColumnNames; - std::vector expectedColumnTypes; - bindExpectedRelColumns( - relTableEntry, copyStatement.getColumnNames(), expectedColumnNames, expectedColumnTypes); - auto bindInput = std::make_unique(std::move(*config), - std::move(expectedColumnNames), std::move(expectedColumnTypes), clientContext); - auto bindData = func->bindFunc(clientContext, bindInput.get()); - expression_vector columns; - for (auto i = 0u; i < bindData->columnTypes.size(); i++) { - columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); + if (copyStatement.byColumn()) { + throw BinderException( + stringFormat("Copy by column is not supported for relationship table.")); } + // Bind expected columns based on catalog information. + std::vector expectedColumnNames; + std::vector expectedColumnTypes; + bindExpectedRelColumns(relTableEntry, copyStatement.getColumnNames(), expectedColumnNames, + expectedColumnTypes, clientContext); + auto boundSource = bindScanSource(copyStatement.getSource(), + copyStatement.getParsingOptionsRef(), expectedColumnNames, expectedColumnTypes); + auto columns = boundSource->getColumns(); auto offset = expressionBinder.createVariableExpression( *LogicalType::INT64(), std::string(InternalKeyword::ROW_OFFSET)); - auto boundFileScanInfo = - std::make_unique(func, std::move(bindData), columns, offset); auto srcTableID = relTableEntry->getSrcTableID(); auto dstTableID = relTableEntry->getDstTableID(); auto catalog = clientContext->getCatalog(); - auto srcSchema = ku_dynamic_cast( - catalog->getTableCatalogEntry(clientContext->getTx(), srcTableID)); - auto dstSchema = ku_dynamic_cast( - catalog->getTableCatalogEntry(clientContext->getTx(), dstTableID)); + auto srcEntry = catalog->getTableCatalogEntry(clientContext->getTx(), srcTableID); + auto dstEntry = catalog->getTableCatalogEntry(clientContext->getTx(), dstTableID); + auto srcNodeEntry = ku_dynamic_cast(srcEntry); + auto dstNodeEntry = ku_dynamic_cast(dstEntry); auto srcKey = columns[0]; auto dstKey = columns[1]; expression_vector propertyColumns; @@ -168,8 +150,8 @@ std::unique_ptr Binder::bindCopyRelFrom(const parser::Statement& } auto srcOffset = createVariable(InternalKeyword::SRC_OFFSET, LogicalTypeID::INT64); auto dstOffset = createVariable(InternalKeyword::DST_OFFSET, LogicalTypeID::INT64); - auto srcPkType = srcSchema->getPrimaryKey()->getDataType(); - auto dstPkType = dstSchema->getPrimaryKey()->getDataType(); + auto srcPkType = srcNodeEntry->getPrimaryKey()->getDataType(); + auto dstPkType = dstNodeEntry->getPrimaryKey()->getDataType(); auto srcLookUpInfo = IndexLookupInfo(srcTableID, srcOffset, srcKey, *srcPkType); auto dstLookUpInfo = IndexLookupInfo(dstTableID, dstOffset, dstKey, *dstPkType); auto extraCopyRelInfo = std::make_unique(); @@ -178,8 +160,8 @@ std::unique_ptr Binder::bindCopyRelFrom(const parser::Statement& extraCopyRelInfo->propertyColumns = std::move(propertyColumns); extraCopyRelInfo->infos.push_back(std::move(srcLookUpInfo)); extraCopyRelInfo->infos.push_back(std::move(dstLookUpInfo)); - auto boundCopyFromInfo = BoundCopyFromInfo( - relTableEntry, std::move(boundFileScanInfo), containsSerial, std::move(extraCopyRelInfo)); + auto boundCopyFromInfo = + BoundCopyFromInfo(relTableEntry, boundSource->copy(), offset, std::move(extraCopyRelInfo)); return std::make_unique(std::move(boundCopyFromInfo)); } @@ -231,22 +213,22 @@ static void bindExpectedColumns(TableCatalogEntry* tableEntry, } } -void Binder::bindExpectedNodeColumns(NodeTableCatalogEntry* nodeTableEntry, +void bindExpectedNodeColumns(NodeTableCatalogEntry* nodeTableEntry, const std::vector& inputColumnNames, std::vector& columnNames, - std::vector& columnTypes) { + std::vector& columnTypes) { KU_ASSERT(columnNames.empty() && columnTypes.empty()); bindExpectedColumns(nodeTableEntry, inputColumnNames, columnNames, columnTypes); } -void Binder::bindExpectedRelColumns(RelTableCatalogEntry* relTableEntry, +void bindExpectedRelColumns(RelTableCatalogEntry* relTableEntry, const std::vector& inputColumnNames, std::vector& columnNames, - std::vector& columnTypes) { + std::vector& columnTypes, main::ClientContext* context) { KU_ASSERT(columnNames.empty() && columnTypes.empty()); - auto catalog = clientContext->getCatalog(); - auto srcTable = ku_dynamic_cast( - catalog->getTableCatalogEntry(clientContext->getTx(), relTableEntry->getSrcTableID())); - auto dstTable = ku_dynamic_cast( - catalog->getTableCatalogEntry(clientContext->getTx(), relTableEntry->getDstTableID())); + auto catalog = context->getCatalog(); + auto srcEntry = catalog->getTableCatalogEntry(context->getTx(), relTableEntry->getSrcTableID()); + auto srcTable = ku_dynamic_cast(srcEntry); + auto dstEntry = catalog->getTableCatalogEntry(context->getTx(), relTableEntry->getDstTableID()); + auto dstTable = ku_dynamic_cast(dstEntry); columnNames.push_back("from"); columnNames.push_back("to"); auto srcPKColumnType = *srcTable->getPrimaryKey()->getDataType(); diff --git a/src/binder/bind/bind_file_scan.cpp b/src/binder/bind/bind_file_scan.cpp index 0d0e2ea0477..dbbddf35d0e 100644 --- a/src/binder/bind/bind_file_scan.cpp +++ b/src/binder/bind/bind_file_scan.cpp @@ -1,21 +1,22 @@ #include "binder/binder.h" +#include "binder/bound_scan_source.h" #include "binder/expression/literal_expression.h" #include "common/exception/binder.h" #include "common/exception/copy.h" #include "common/file_system/virtual_file_system.h" #include "common/string_format.h" #include "common/string_utils.h" +#include "function/table/bind_input.h" +#include "parser/scan_source.h" using namespace kuzu::parser; using namespace kuzu::binder; using namespace kuzu::common; +using namespace kuzu::function; namespace kuzu { namespace binder { -/* - * Bind file. - */ FileType Binder::bindFileType(const std::string& filePath) { std::filesystem::path fileName(filePath); auto extension = clientContext->getVFSUnsafe()->getFileExtension(fileName); @@ -63,5 +64,58 @@ std::unordered_map Binder::bindParsingOptions( return options; } +std::unique_ptr Binder::bindScanSource(BaseScanSource* source, + const parsing_option_t& options, const std::vector& expectedColumnNames, + const std::vector& expectedColumnTypes) { + switch (source->type) { + case common::ScanSourceType::FILE: { + auto fileSource = ku_dynamic_cast(source); + // Bind path. + auto filePaths = bindFilePaths(fileSource->filePaths); + // Bind file type. + auto fileType = bindFileType(filePaths); + auto config = std::make_unique(fileType, std::move(filePaths)); + // Bind options. + config->options = bindParsingOptions(options); + // Bind file scan function. + auto func = getScanFunction(config->fileType, *config); + auto bindInput = std::make_unique(config->copy(), + std::move(expectedColumnNames), std::move(expectedColumnTypes), clientContext); + auto bindData = func->bindFunc(clientContext, bindInput.get()); + // Bind input columns + expression_vector inputColumns; + for (auto i = 0u; i < bindData->columnTypes.size(); i++) { + inputColumns.push_back( + createVariable(bindData->columnNames[i], bindData->columnTypes[i])); + } + auto fileScanInfo = BoundFileScanInfo(func, std::move(bindData), inputColumns); + return std::make_unique(std::move(fileScanInfo)); + } + case ScanSourceType::QUERY: { + auto querySource = ku_dynamic_cast(source); + auto boundStatement = bind(*querySource->statement); + // Bind input columns. + auto columns = boundStatement->getStatementResult()->getColumns(); + if (columns.size() != expectedColumnNames.size()) { + throw BinderException( + stringFormat("Query returns {} columns but {} columns were expected.", + columns.size(), expectedColumnNames.size())); + } + for (auto i = 0u; i < columns.size(); ++i) { + expressionBinder.validateDataType(*columns[i], expectedColumnTypes[i]); + columns[i]->setAlias(expectedColumnNames[i]); + } + return std::make_unique(std::move(boundStatement)); + } + case ScanSourceType::OBJECT: { + auto objectSource = ku_dynamic_cast(source); + throw BinderException(stringFormat( + "Scan from external object {} is not supported.", objectSource->objectName)); + } + default: + KU_UNREACHABLE; + } +} + } // namespace binder } // namespace kuzu diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index afaec1f46ce..6ab95a01e02 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -152,8 +152,11 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re auto& loadFrom = ku_dynamic_cast(readingClause); function::TableFunction* scanFunction; std::unique_ptr bindInput; - if (loadFrom.hasObjectName()) { - auto objectName = loadFrom.getObjectname(); + auto source = loadFrom.getSource(); + switch (source->type) { + case ScanSourceType::OBJECT: { + auto objectSource = ku_dynamic_cast(source); + auto objectName = objectSource->objectName; auto objectExpr = expressionBinder.bindVariableExpression(objectName); auto literalExpr = ku_dynamic_cast(objectExpr.get()); @@ -163,8 +166,10 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re scanFunction = ku_dynamic_cast(func); bindInput = std::make_unique(); bindInput->inputs.push_back(*literalExpr->getValue()); - } else { - auto filePaths = bindFilePaths(loadFrom.getFilePaths()); + } break; + case ScanSourceType::FILE: { + auto fileSource = ku_dynamic_cast(source); + auto filePaths = bindFilePaths(fileSource->filePaths); auto fileType = bindFileType(filePaths); auto readerConfig = std::make_unique(fileType, std::move(filePaths)); readerConfig->options = bindParsingOptions(loadFrom.getParsingOptionsRef()); @@ -182,7 +187,7 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re } // Bind columns from input. std::vector expectedColumnNames; - std::vector expectedColumnTypes; + std::vector expectedColumnTypes; for (auto& [name, type] : loadFrom.getColumnNameDataTypesRef()) { expectedColumnNames.push_back(name); expectedColumnTypes.push_back(*bindDataType(type)); @@ -193,16 +198,16 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re bindInput_->expectedColumnTypes = std::move(expectedColumnTypes); bindInput_->context = clientContext; bindInput = std::move(bindInput_); + } break; + default: + throw BinderException(stringFormat("LOAD FROM subquery is not supported.")); } auto bindData = scanFunction->bindFunc(clientContext, bindInput.get()); expression_vector columns; for (auto i = 0u; i < bindData->columnTypes.size(); i++) { columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); } - auto offset = expressionBinder.createVariableExpression( - LogicalType(LogicalTypeID::INT64), std::string(InternalKeyword::ROW_OFFSET)); - auto info = - BoundFileScanInfo(scanFunction, std::move(bindData), std::move(columns), std::move(offset)); + auto info = BoundFileScanInfo(scanFunction, std::move(bindData), std::move(columns)); auto boundLoadFrom = std::make_unique(std::move(info)); if (loadFrom.hasWherePredicate()) { auto wherePredicate = expressionBinder.bindExpression(*loadFrom.getWherePredicate()); diff --git a/src/binder/bind/copy/bind_copy_rdf_graph.cpp b/src/binder/bind/copy/bind_copy_rdf_graph.cpp index b89b4be6a61..7fbd5ab32b6 100644 --- a/src/binder/bind/copy/bind_copy_rdf_graph.cpp +++ b/src/binder/bind/copy/bind_copy_rdf_graph.cpp @@ -6,18 +6,29 @@ #include "common/keyword/rdf_keyword.h" #include "function/table/bind_input.h" #include "main/client_context.h" +#include "parser/copy.h" using namespace kuzu::binder; using namespace kuzu::catalog; using namespace kuzu::common; using namespace kuzu::function; using namespace kuzu::processor; +using namespace kuzu::parser; namespace kuzu { namespace binder { -std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement&, - std::unique_ptr config, RDFGraphCatalogEntry* rdfGraphEntry) { +std::unique_ptr Binder::bindCopyRdfFrom( + const parser::Statement& statement, RDFGraphCatalogEntry* rdfGraphEntry) { + auto& copyStatement = ku_dynamic_cast(statement); + // Bind path. + KU_ASSERT(copyStatement.getSource()->type == ScanSourceType::FILE); + auto fileSource = ku_dynamic_cast(copyStatement.getSource()); + auto filePaths = bindFilePaths(fileSource->filePaths); + // Bind file type. + auto fileType = bindFileType(filePaths); + auto config = std::make_unique(fileType, std::move(filePaths)); + config->options = bindParsingOptions(copyStatement.getParsingOptionsRef()); auto catalog = clientContext->getCatalog(); auto functions = catalog->getFunctions(clientContext->getTx()); auto offset = expressionBinder.createVariableExpression( @@ -40,30 +51,28 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& func = BuiltInFunctionsUtils::matchFunction(READ_RDF_ALL_TRIPLE_FUNC_NAME, functions); auto scanFunc = ku_dynamic_cast(func); auto bindData = scanFunc->bindFunc(clientContext, bindInput.get()); - auto scanInfo = std::make_unique( - scanFunc, bindData->copy(), expression_vector{}, offset); // Bind copy resource. func = inMemory ? BuiltInFunctionsUtils::matchFunction(IN_MEM_READ_RDF_RESOURCE_FUNC_NAME, functions) : BuiltInFunctionsUtils::matchFunction(READ_RDF_RESOURCE_FUNC_NAME, functions); auto rScanFunc = ku_dynamic_cast(func); auto rColumns = expression_vector{r}; - auto rScanInfo = std::make_unique( - rScanFunc, bindData->copy(), std::move(rColumns), offset); + auto rFileScanInfo = BoundFileScanInfo(rScanFunc, bindData->copy(), std::move(rColumns)); + auto rSource = std::make_unique(std::move(rFileScanInfo)); auto rTableID = rdfGraphEntry->getResourceTableID(); - auto rSchema = catalog->getTableCatalogEntry(clientContext->getTx(), rTableID); - auto rCopyInfo = BoundCopyFromInfo(rSchema, std::move(rScanInfo), false, nullptr); + auto rEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rTableID); + auto rCopyInfo = BoundCopyFromInfo(rEntry, std::move(rSource), offset, nullptr /* extraInfo */); // Bind copy literal. func = inMemory ? BuiltInFunctionsUtils::matchFunction(IN_MEM_READ_RDF_LITERAL_FUNC_NAME, functions) : BuiltInFunctionsUtils::matchFunction(READ_RDF_LITERAL_FUNC_NAME, functions); auto lScanFunc = ku_dynamic_cast(func); auto lColumns = expression_vector{l, lang}; - auto lScanInfo = std::make_unique( - lScanFunc, bindData->copy(), std::move(lColumns), offset); + auto lFileScanInfo = BoundFileScanInfo(lScanFunc, bindData->copy(), std::move(lColumns)); + auto lSource = std::make_unique(std::move(lFileScanInfo)); auto lTableID = rdfGraphEntry->getLiteralTableID(); - auto lSchema = catalog->getTableCatalogEntry(clientContext->getTx(), lTableID); - auto lCopyInfo = BoundCopyFromInfo(lSchema, std::move(lScanInfo), true, nullptr); + auto lEntry = catalog->getTableCatalogEntry(clientContext->getTx(), lTableID); + auto lCopyInfo = BoundCopyFromInfo(lEntry, std::move(lSource), offset, nullptr /* extraInfo */); // Bind copy resource triples func = inMemory ? BuiltInFunctionsUtils::matchFunction( @@ -71,10 +80,10 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& BuiltInFunctionsUtils::matchFunction(READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, functions); auto rrrScanFunc = ku_dynamic_cast(func); auto rrrColumns = expression_vector{s, p, o}; - auto rrrScanInfo = - std::make_unique(rrrScanFunc, bindData->copy(), rrrColumns, offset); + auto rrrFileScanInfo = BoundFileScanInfo(rrrScanFunc, bindData->copy(), rrrColumns); + auto rrrSource = std::make_unique(std::move(rrrFileScanInfo)); auto rrrTableID = rdfGraphEntry->getResourceTripleTableID(); - auto rrrSchema = catalog->getTableCatalogEntry(clientContext->getTx(), rrrTableID); + auto rrrEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rrrTableID); auto rrrExtraInfo = std::make_unique(); auto sLookUp = IndexLookupInfo(rTableID, sOffset, s, s->getDataType()); auto pLookUp = IndexLookupInfo(rTableID, pOffset, p, p->getDataType()); @@ -85,7 +94,7 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& rrrExtraInfo->fromOffset = sOffset; rrrExtraInfo->toOffset = oOffset; auto rrrCopyInfo = - BoundCopyFromInfo(rrrSchema, std::move(rrrScanInfo), false, std::move(rrrExtraInfo)); + BoundCopyFromInfo(rrrEntry, std::move(rrrSource), offset, std::move(rrrExtraInfo)); // Bind copy literal triples func = inMemory ? BuiltInFunctionsUtils::matchFunction( @@ -93,10 +102,10 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& BuiltInFunctionsUtils::matchFunction(READ_RDF_LITERAL_TRIPLE_FUNC_NAME, functions); auto rrlScanFunc = ku_dynamic_cast(func); auto rrlColumns = expression_vector{s, p, oOffset}; - auto rrlScanInfo = - std::make_unique(rrlScanFunc, bindData->copy(), rrlColumns, offset); + auto rrlFileScanInfo = BoundFileScanInfo(rrlScanFunc, bindData->copy(), rrlColumns); + auto rrlSource = std::make_unique(std::move(rrlFileScanInfo)); auto rrlTableID = rdfGraphEntry->getLiteralTripleTableID(); - auto rrlSchema = catalog->getTableCatalogEntry(clientContext->getTx(), rrlTableID); + auto rrlEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rrlTableID); auto rrlExtraInfo = std::make_unique(); rrlExtraInfo->infos.push_back(sLookUp.copy()); rrlExtraInfo->infos.push_back(pLookUp.copy()); @@ -104,12 +113,19 @@ std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& rrlExtraInfo->fromOffset = sOffset; rrlExtraInfo->toOffset = oOffset; auto rrLCopyInfo = - BoundCopyFromInfo(rrlSchema, std::move(rrlScanInfo), false, std::move(rrlExtraInfo)); + BoundCopyFromInfo(rrlEntry, std::move(rrlSource), offset, std::move(rrlExtraInfo)); // Bind copy rdf auto rdfExtraInfo = std::make_unique( std::move(rCopyInfo), std::move(lCopyInfo), std::move(rrrCopyInfo), std::move(rrLCopyInfo)); - auto rdfCopyInfo = BoundCopyFromInfo( - rdfGraphEntry, inMemory ? std::move(scanInfo) : nullptr, false, std::move(rdfExtraInfo)); + std::unique_ptr source; + if (inMemory) { + auto fileScanInfo = BoundFileScanInfo(scanFunc, bindData->copy(), expression_vector{}); + source = std::make_unique(std::move(fileScanInfo)); + } else { + source = std::make_unique(); + } + auto rdfCopyInfo = + BoundCopyFromInfo(rdfGraphEntry, std::move(source), offset, std::move(rdfExtraInfo)); return std::make_unique(std::move(rdfCopyInfo)); } diff --git a/src/binder/expression_binder.cpp b/src/binder/expression_binder.cpp index 2b2f71ca58b..48de08098c5 100644 --- a/src/binder/expression_binder.cpp +++ b/src/binder/expression_binder.cpp @@ -147,6 +147,13 @@ void ExpressionBinder::validateExpectedDataType( } } +void ExpressionBinder::validateDataType(const Expression& expr, const LogicalType& expectedType) { + if (expr.getDataType() != expectedType) { + throw BinderException(stringFormat("{} has data type {} but {} was expected.", + expr.toString(), expr.getDataType().toString(), expectedType.toString())); + } +} + void ExpressionBinder::validateAggregationExpressionIsNotNested(const Expression& expression) { if (expression.getNumChildren() == 0) { return; diff --git a/src/common/exception/message.cpp b/src/common/exception/message.cpp index 73225116cd5..94b70cd9d1d 100644 --- a/src/common/exception/message.cpp +++ b/src/common/exception/message.cpp @@ -47,10 +47,5 @@ std::string ExceptionMessage::violateRelMultiplicityConstraint( offset, tableName, direction); } -std::string ExceptionMessage::validateCopyNpyNotForRelTablesException( - const std::string& tableName) { - return stringFormat("Copy from npy files to rel table {} is not supported yet.", tableName); -} - } // namespace common } // namespace kuzu diff --git a/src/common/types/types.cpp b/src/common/types/types.cpp index e6b7f62f57f..abad6d61c17 100644 --- a/src/common/types/types.cpp +++ b/src/common/types/types.cpp @@ -689,12 +689,15 @@ std::string LogicalTypeUtils::toString(LogicalTypeID dataTypeID) { } std::string LogicalTypeUtils::toString(const std::vector& dataTypes) { - std::vector dataTypeIDs; - dataTypeIDs.reserve(dataTypes.size()); - for (auto& dataType : dataTypes) { - dataTypeIDs.push_back(dataType.typeID); + if (dataTypes.empty()) { + return {""}; + } + std::string result = "(" + dataTypes[0].toString(); + for (auto i = 1u; i < dataTypes.size(); ++i) { + result += "," + dataTypes[i].toString(); } - return toString(dataTypeIDs); + result += ")"; + return result; } std::string LogicalTypeUtils::toString(const std::vector& dataTypeIDs) { diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index 092d845d3d4..8e07a2b009f 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -11,7 +11,8 @@ namespace kuzu { namespace parser { struct CreateTableInfo; -} +struct BaseScanSource; +} // namespace parser namespace extension { struct ExtensionOptions; @@ -28,6 +29,7 @@ struct TableFunction; namespace binder { +struct BoundBaseScanSource; struct BoundInsertInfo; struct BoundSetPropertyInfo; struct BoundDeleteInfo; @@ -125,26 +127,22 @@ class Binder { /*** bind copy ***/ std::unique_ptr bindCopyFromClause(const parser::Statement& statement); - std::unique_ptr bindCopyNodeFrom(const parser::Statement& statement, - std::unique_ptr config, - catalog::NodeTableCatalogEntry* nodeTableEntry); - std::unique_ptr bindCopyRelFrom(const parser::Statement& statement, - std::unique_ptr config, catalog::RelTableCatalogEntry* relTableEntry); - std::unique_ptr bindCopyRdfFrom(const parser::Statement& statement, - std::unique_ptr config, catalog::RDFGraphCatalogEntry* rdfGraphEntry); - void bindExpectedNodeColumns(catalog::NodeTableCatalogEntry* nodeTableEntry, - const std::vector& inputColumnNames, std::vector& columnNames, - std::vector& columnTypes); - void bindExpectedRelColumns(catalog::RelTableCatalogEntry* relTableEntry, - const std::vector& inputColumnNames, std::vector& columnNames, - std::vector& columnTypes); + std::unique_ptr bindCopyNodeFrom( + const parser::Statement& statement, catalog::NodeTableCatalogEntry* nodeTableEntry); + std::unique_ptr bindCopyRelFrom( + const parser::Statement& statement, catalog::RelTableCatalogEntry* relTableEntry); + std::unique_ptr bindCopyRdfFrom( + const parser::Statement& statement, catalog::RDFGraphCatalogEntry* rdfGraphEntry); std::unique_ptr bindCopyToClause(const parser::Statement& statement); std::unique_ptr bindExportDatabaseClause(const parser::Statement& statement); std::unique_ptr bindImportDatabaseClause(const parser::Statement& statement); - /*** bind file scan ***/ + /*** bind scan source ***/ + std::unique_ptr bindScanSource(parser::BaseScanSource* scanSource, + const parser::parsing_option_t& options, const std::vector& columnNames, + const std::vector& columnTypes); std::unordered_map bindParsingOptions( const parser::parsing_option_t& parsingOptions); common::FileType bindFileType(const std::vector& filePaths); diff --git a/src/include/binder/bound_scan_source.h b/src/include/binder/bound_scan_source.h new file mode 100644 index 00000000000..d94a9d90bbd --- /dev/null +++ b/src/include/binder/bound_scan_source.h @@ -0,0 +1,71 @@ +#pragma once + +#include "binder/bound_statement.h" +#include "binder/copy/bound_file_scan_info.h" +#include "common/enums/scan_source_type.h" + +namespace kuzu { +namespace binder { + +struct BoundBaseScanSource { + common::ScanSourceType type; + + explicit BoundBaseScanSource(common::ScanSourceType type) : type{type} {} + virtual ~BoundBaseScanSource() = default; + + virtual expression_vector getColumns() = 0; + + virtual std::unique_ptr copy() const = 0; + +protected: + BoundBaseScanSource(const BoundBaseScanSource& other) : type{other.type} {} +}; + +struct BoundEmptyScanSource : public BoundBaseScanSource { + BoundEmptyScanSource() : BoundBaseScanSource{common::ScanSourceType::EMPTY} {} + BoundEmptyScanSource(const BoundEmptyScanSource& other) : BoundBaseScanSource{other} {} + + expression_vector getColumns() override { return expression_vector{}; } + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } +}; + +struct BoundFileScanSource : public BoundBaseScanSource { + BoundFileScanInfo fileScanInfo; + + explicit BoundFileScanSource(BoundFileScanInfo fileScanInfo) + : BoundBaseScanSource{common::ScanSourceType::FILE}, fileScanInfo{std::move(fileScanInfo)} { + } + BoundFileScanSource(const BoundFileScanSource& other) + : BoundBaseScanSource{other}, fileScanInfo{other.fileScanInfo.copy()} {} + + expression_vector getColumns() override { return fileScanInfo.columns; } + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } +}; + +struct BoundQueryScanSource : public BoundBaseScanSource { + // Use shared ptr to avoid copy BoundStatement. + // We should consider implement a copy constructor though. + std::shared_ptr statement; + + explicit BoundQueryScanSource(std::shared_ptr statement) + : BoundBaseScanSource{common::ScanSourceType::QUERY}, statement{std::move(statement)} {} + BoundQueryScanSource(const BoundQueryScanSource& other) + : BoundBaseScanSource{other}, statement{other.statement} {} + + expression_vector getColumns() override { + return statement->getStatementResult()->getColumns(); + } + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } +}; + +} // namespace binder +} // namespace kuzu diff --git a/src/include/binder/copy/bound_copy_from.h b/src/include/binder/copy/bound_copy_from.h index 9df2089bc7c..84d9ef337d7 100644 --- a/src/include/binder/copy/bound_copy_from.h +++ b/src/include/binder/copy/bound_copy_from.h @@ -1,7 +1,6 @@ #pragma once -#include "binder/bound_statement.h" -#include "bound_file_scan_info.h" +#include "binder/bound_scan_source.h" #include "catalog/catalog_entry/table_catalog_entry.h" #include "index_look_up_info.h" @@ -14,24 +13,24 @@ struct ExtraBoundCopyFromInfo { }; struct BoundCopyFromInfo { + // Table entry to copy into. catalog::TableCatalogEntry* tableEntry; - std::unique_ptr fileScanInfo; - bool containsSerial; + // Data source + std::unique_ptr source; + // Row offset of input data to generate internal ID. + std::shared_ptr offset; std::unique_ptr extraInfo; BoundCopyFromInfo(catalog::TableCatalogEntry* tableEntry, - std::unique_ptr fileScanInfo, bool containsSerial, + std::unique_ptr source, std::shared_ptr offset, std::unique_ptr extraInfo) - : tableEntry{tableEntry}, fileScanInfo{std::move(fileScanInfo)}, - containsSerial{containsSerial}, extraInfo{std::move(extraInfo)} {} + : tableEntry{tableEntry}, source{std::move(source)}, offset{offset}, extraInfo{std::move( + extraInfo)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundCopyFromInfo); private: BoundCopyFromInfo(const BoundCopyFromInfo& other) - : tableEntry{other.tableEntry}, containsSerial{other.containsSerial} { - if (other.fileScanInfo) { - fileScanInfo = std::make_unique(other.fileScanInfo->copy()); - } + : tableEntry{other.tableEntry}, source{other.source->copy()}, offset{other.offset} { if (other.extraInfo) { extraInfo = other.extraInfo->copy(); } diff --git a/src/include/binder/copy/bound_file_scan_info.h b/src/include/binder/copy/bound_file_scan_info.h index a734fc28141..2bf8f5de117 100644 --- a/src/include/binder/copy/bound_file_scan_info.h +++ b/src/include/binder/copy/bound_file_scan_info.h @@ -11,19 +11,15 @@ struct BoundFileScanInfo { function::TableFunction* copyFunc; std::unique_ptr bindData; binder::expression_vector columns; - std::shared_ptr offset; BoundFileScanInfo(function::TableFunction* copyFunc, - std::unique_ptr bindData, binder::expression_vector columns, - std::shared_ptr offset) - : copyFunc{copyFunc}, bindData{std::move(bindData)}, columns{std::move(columns)}, - offset{std::move(offset)} {} + std::unique_ptr bindData, binder::expression_vector columns) + : copyFunc{copyFunc}, bindData{std::move(bindData)}, columns{std::move(columns)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundFileScanInfo); private: BoundFileScanInfo(const BoundFileScanInfo& other) - : copyFunc{other.copyFunc}, bindData{other.bindData->copy()}, columns{other.columns}, - offset{other.offset} {} + : copyFunc{other.copyFunc}, bindData{other.bindData->copy()}, columns{other.columns} {} }; } // namespace binder diff --git a/src/include/binder/expression_binder.h b/src/include/binder/expression_binder.h index 32da474015f..f26cb2a9a91 100644 --- a/src/include/binder/expression_binder.h +++ b/src/include/binder/expression_binder.h @@ -35,6 +35,7 @@ class ExpressionBinder { } static void validateExpectedDataType( const Expression& expression, const std::vector& targets); + static void validateDataType(const Expression& expr, const common::LogicalType& expectedType); private: // TODO(Xiyang): move to an expression rewriter diff --git a/src/include/common/enums/scan_source_type.h b/src/include/common/enums/scan_source_type.h new file mode 100644 index 00000000000..90468f57a17 --- /dev/null +++ b/src/include/common/enums/scan_source_type.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace kuzu { +namespace common { + +enum class ScanSourceType : uint8_t { + EMPTY = 0, + FILE = 1, + OBJECT = 2, + QUERY = 3, +}; + +} +} // namespace kuzu diff --git a/src/include/common/exception/message.h b/src/include/common/exception/message.h index bf6cd9bb301..a7ef56f34ca 100644 --- a/src/include/common/exception/message.h +++ b/src/include/common/exception/message.h @@ -23,16 +23,9 @@ struct ExceptionMessage { static std::string violateRelMultiplicityConstraint( const std::string& tableName, const std::string& offset, const std::string& direction); - static inline std::string validateCopyNPYByColumnException() { - return "Please use COPY FROM BY COLUMN statement for copying npy files."; - } - static inline std::string validateCopyCSVParquetByColumnException() { - return "Please use COPY FROM statement for copying csv and parquet files."; - } static inline std::string validateCopyToCSVParquetExtensionsException() { return "COPY TO currently only supports csv and parquet files."; } - static std::string validateCopyNpyNotForRelTablesException(const std::string& tableName); }; } // namespace common diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 6ef8a4239bc..16c0887d6e4 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -557,7 +557,7 @@ struct PhysicalTypeUtils { class LogicalTypeUtils { public: KUZU_API static std::string toString(LogicalTypeID dataTypeID); - static std::string toString(const std::vector& dataTypes); + KUZU_API static std::string toString(const std::vector& dataTypes); KUZU_API static std::string toString(const std::vector& dataTypeIDs); KUZU_API static LogicalType dataTypeFromString(const std::string& dataTypeString); static uint32_t getRowLayoutSize(const LogicalType& logicalType); diff --git a/src/include/optimizer/logical_operator_visitor.h b/src/include/optimizer/logical_operator_visitor.h index ed19ca34daa..6929ebc3058 100644 --- a/src/include/optimizer/logical_operator_visitor.h +++ b/src/include/optimizer/logical_operator_visitor.h @@ -170,6 +170,12 @@ class LogicalOperatorVisitor { std::shared_ptr op) { return op; } + + virtual void visitCopyFrom(planner::LogicalOperator* /*op*/) {} + virtual std::shared_ptr visitCopyFromReplace( + std::shared_ptr op) { + return op; + } }; } // namespace optimizer diff --git a/src/include/optimizer/projection_push_down_optimizer.h b/src/include/optimizer/projection_push_down_optimizer.h index c6f2ddb703d..2fb5d07170d 100644 --- a/src/include/optimizer/projection_push_down_optimizer.h +++ b/src/include/optimizer/projection_push_down_optimizer.h @@ -38,6 +38,7 @@ class ProjectionPushDownOptimizer : public LogicalOperatorVisitor { void visitDeleteNode(planner::LogicalOperator* op) override; void visitDeleteRel(planner::LogicalOperator* op) override; void visitMerge(planner::LogicalOperator* op) override; + void visitCopyFrom(planner::LogicalOperator* op) override; void collectExpressionsInUse(std::shared_ptr expression); diff --git a/src/include/parser/copy.h b/src/include/parser/copy.h index e481039570c..bbc9b23ad80 100644 --- a/src/include/parser/copy.h +++ b/src/include/parser/copy.h @@ -3,6 +3,7 @@ #include #include "parser/expression/parsed_expression.h" +#include "parser/scan_source.h" #include "parser/statement.h" namespace kuzu { @@ -21,14 +22,14 @@ class Copy : public Statement { class CopyFrom : public Copy { public: - CopyFrom(std::vector filePaths, std::string tableName) - : Copy{common::StatementType::COPY_FROM}, byColumn_{false}, filePaths{std::move(filePaths)}, + CopyFrom(std::unique_ptr source, std::string tableName) + : Copy{common::StatementType::COPY_FROM}, byColumn_{false}, source{std::move(source)}, tableName{std::move(tableName)} {} inline void setByColumn() { byColumn_ = true; } inline bool byColumn() const { return byColumn_; } - inline std::vector getFilePaths() const { return filePaths; } + inline BaseScanSource* getSource() const { return source.get(); } inline std::string getTableName() const { return tableName; } @@ -37,7 +38,7 @@ class CopyFrom : public Copy { private: bool byColumn_; - std::vector filePaths; + std::unique_ptr source; std::string tableName; std::vector columnNames; }; diff --git a/src/include/parser/query/reading_clause/load_from.h b/src/include/parser/query/reading_clause/load_from.h index 0674167f12b..386116186b5 100644 --- a/src/include/parser/query/reading_clause/load_from.h +++ b/src/include/parser/query/reading_clause/load_from.h @@ -1,6 +1,7 @@ #pragma once #include "parser/expression/parsed_expression.h" +#include "parser/scan_source.h" #include "reading_clause.h" namespace kuzu { @@ -8,17 +9,10 @@ namespace parser { class LoadFrom : public ReadingClause { public: - LoadFrom() : ReadingClause{common::ClauseType::LOAD_FROM} {} + explicit LoadFrom(std::unique_ptr source) + : ReadingClause{common::ClauseType::LOAD_FROM}, source{std::move(source)} {} - inline bool hasObjectName() const { return !objectName.empty(); } - inline std::string getObjectname() const { return objectName; } - inline void setObjectName(const std::string& name) { objectName = name; } - - inline bool hasFilePaths() const { return !filePaths.empty(); } - inline std::vector getFilePaths() const { return filePaths; } - inline void setFilePaths(std::vector filePaths_) { - filePaths = std::move(filePaths_); - } + inline BaseScanSource* getSource() const { return source.get(); } inline void setParingOptions(parsing_option_t options) { parsingOptions = std::move(options); } inline const parsing_option_t& getParsingOptionsRef() const { return parsingOptions; } @@ -39,8 +33,7 @@ class LoadFrom : public ReadingClause { inline const ParsedExpression* getWherePredicate() const { return wherePredicate.get(); } private: - std::string objectName; - std::vector filePaths; + std::unique_ptr source; std::vector> columnNameDataTypes; parsing_option_t parsingOptions; std::unique_ptr wherePredicate; diff --git a/src/include/parser/scan_source.h b/src/include/parser/scan_source.h new file mode 100644 index 00000000000..c5345116c2e --- /dev/null +++ b/src/include/parser/scan_source.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +#include "common/copy_constructors.h" +#include "common/enums/scan_source_type.h" +#include "parser/statement.h" + +namespace kuzu { +namespace parser { + +struct BaseScanSource { + common::ScanSourceType type; + + explicit BaseScanSource(common::ScanSourceType type) : type{type} {} + virtual ~BaseScanSource() = default; + DELETE_COPY_AND_MOVE(BaseScanSource); +}; + +struct FileScanSource : public BaseScanSource { + std::vector filePaths; + + explicit FileScanSource(std::vector paths) + : BaseScanSource{common::ScanSourceType::FILE}, filePaths{std::move(paths)} {} +}; + +struct ObjectScanSource : public BaseScanSource { + std::string objectName; + + explicit ObjectScanSource(std::string objectName) + : BaseScanSource{common::ScanSourceType::OBJECT}, objectName{std::move(objectName)} {} +}; + +struct QueryScanSource : public BaseScanSource { + std::unique_ptr statement; + + explicit QueryScanSource(std::unique_ptr statement) + : BaseScanSource{common::ScanSourceType::QUERY}, statement{std::move(statement)} {} +}; + +} // namespace parser +} // namespace kuzu diff --git a/src/include/parser/transformer.h b/src/include/parser/transformer.h index ccd3a40029b..cde91c72d41 100644 --- a/src/include/parser/transformer.h +++ b/src/include/parser/transformer.h @@ -25,6 +25,7 @@ class NodePattern; class PatternElementChain; class RelPattern; struct ParsedCaseAlternative; +struct BaseScanSource; class Transformer { public: @@ -50,6 +51,7 @@ class Transformer { std::vector transformColumnNames(CypherParser::KU_ColumnNamesContext& ctx); std::vector transformFilePaths( const std::vector& stringLiteral); + std::unique_ptr transformScanSource(CypherParser::KU_ScanSourceContext& ctx); parsing_option_t transformParsingOptions(CypherParser::KU_ParsingOptionsContext& ctx); std::unique_ptr transformExportDatabase(CypherParser::KU_ExportDatabaseContext& ctx); diff --git a/src/include/planner/operator/logical_accumulate.h b/src/include/planner/operator/logical_accumulate.h index 8a8e546f9bd..1f1a3399357 100644 --- a/src/include/planner/operator/logical_accumulate.h +++ b/src/include/planner/operator/logical_accumulate.h @@ -8,10 +8,11 @@ namespace planner { class LogicalAccumulate : public LogicalOperator { public: - LogicalAccumulate(common::AccumulateType accumulateType, - binder::expression_vector expressionsToFlatten, std::shared_ptr child) + LogicalAccumulate(common::AccumulateType accumulateType, binder::expression_vector flatExprs, + std::shared_ptr offset, std::shared_ptr child) : LogicalOperator{LogicalOperatorType::ACCUMULATE, std::move(child)}, - accumulateType{accumulateType}, expressionsToFlatten{std::move(expressionsToFlatten)} {} + accumulateType{accumulateType}, flatExprs{std::move(flatExprs)}, offset{ + std::move(offset)} {} void computeFactorizedSchema() final; void computeFlatSchema() final; @@ -24,15 +25,19 @@ class LogicalAccumulate : public LogicalOperator { inline binder::expression_vector getExpressionsToAccumulate() const { return children[0]->getSchema()->getExpressionsInScope(); } + inline std::shared_ptr getOffset() const { return offset; } inline std::unique_ptr copy() final { return make_unique( - accumulateType, expressionsToFlatten, children[0]->copy()); + accumulateType, flatExprs, offset, children[0]->copy()); } private: common::AccumulateType accumulateType; - binder::expression_vector expressionsToFlatten; + binder::expression_vector flatExprs; + // Accumulate may be used as a source operator for COPY pipeline. In such case, row offset needs + // to be provided in order to generate internal ID. + std::shared_ptr offset; }; } // namespace planner diff --git a/src/include/planner/operator/scan/logical_scan_file.h b/src/include/planner/operator/scan/logical_scan_file.h index cc7c4ed134d..4e070354198 100644 --- a/src/include/planner/operator/scan/logical_scan_file.h +++ b/src/include/planner/operator/scan/logical_scan_file.h @@ -8,22 +8,28 @@ namespace planner { class LogicalScanFile : public LogicalOperator { public: - explicit LogicalScanFile(binder::BoundFileScanInfo info) - : LogicalOperator{LogicalOperatorType::SCAN_FILE}, info{std::move(info)} {} + LogicalScanFile(binder::BoundFileScanInfo info, std::shared_ptr offset) + : LogicalOperator{LogicalOperatorType::SCAN_FILE}, info{std::move(info)}, offset{std::move( + offset)} {} - inline std::string getExpressionsForPrinting() const override { return std::string(); } + std::string getExpressionsForPrinting() const override { return std::string(); } - inline const binder::BoundFileScanInfo* getInfo() const { return &info; } + const binder::BoundFileScanInfo* getInfo() const { return &info; } + bool hasOffset() const { return offset != nullptr; } + std::shared_ptr getOffset() const { return offset; } void computeFactorizedSchema() final; void computeFlatSchema() final; - inline std::unique_ptr copy() final { - return std::make_unique(info.copy()); + std::unique_ptr copy() final { + return std::make_unique(info.copy(), offset); } private: binder::BoundFileScanInfo info; + // ScanFile may be used as a source operator for COPY pipeline. In such case, row offset needs + // to be provided in order to generate internal ID. + std::shared_ptr offset; }; } // namespace planner diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index 48448695bc7..c18a60191de 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -234,11 +234,16 @@ class Planner { void appendCrossProduct( common::AccumulateType accumulateType, LogicalPlan& probePlan, LogicalPlan& buildPlan); - inline void appendAccumulate(common::AccumulateType accumulateType, LogicalPlan& plan) { - appendAccumulate(accumulateType, binder::expression_vector{}, plan); - } + // Append accumulate + void appendAccumulate(common::AccumulateType accumulateType, LogicalPlan& plan); + // Append accumulate with a set of expressions being flattened first. void appendAccumulate(common::AccumulateType accumulateType, - const binder::expression_vector& expressionsToFlatten, LogicalPlan& plan); + const binder::expression_vector& flatExprs, LogicalPlan& plan); + // Append accumulate with a set of expressions being flattened first. + // Additionally, scan table with row offset. + void appendAccumulate(common::AccumulateType accumulateType, + const binder::expression_vector& flatExprs, std::shared_ptr offset, + LogicalPlan& plan); void appendDummyScan(LogicalPlan& plan); @@ -252,7 +257,11 @@ class Planner { void appendFilters(const binder::expression_vector& predicates, LogicalPlan& plan); void appendFilter(const std::shared_ptr& predicate, LogicalPlan& plan); - void appendScanFile(const binder::BoundFileScanInfo* fileScanInfo, LogicalPlan& plan); + // Append scan file. + void appendScanFile(const binder::BoundFileScanInfo* info, LogicalPlan& plan); + // Append scan file. Additionally, scan row offset. + void appendScanFile(const binder::BoundFileScanInfo* info, + std::shared_ptr offset, LogicalPlan& plan); void appendDistinct(const binder::expression_vector& expressionsToDistinct, LogicalPlan& plan); diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index 35944330969..1a35c769b26 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -115,15 +115,47 @@ class PlanMapper { std::unique_ptr createResultCollector(common::AccumulateType accumulateType, const binder::expression_vector& expressions, planner::Schema* schema, std::unique_ptr prevOperator); - std::unique_ptr createFactorizedTableScan( - const binder::expression_vector& expressions, std::vector colIndices, - planner::Schema* schema, const std::shared_ptr& table, - uint64_t maxMorselSize, std::unique_ptr prevOperator); + // Scan fTable with row offset. + std::unique_ptr createFTableScan(const binder::expression_vector& exprs, + std::vector colIndices, std::shared_ptr offset, + planner::Schema* schema, std::shared_ptr table, uint64_t maxMorselSize, + std::unique_ptr child); + // Scan fTable without row offset. + std::unique_ptr createFTableScan(const binder::expression_vector& exprs, + std::vector colIndices, planner::Schema* schema, + std::shared_ptr table, uint64_t maxMorselSize, + std::unique_ptr child); + // Scan fTable without row offset. + // Scan is the leaf operator of physical plan. + std::unique_ptr createFTableScan(const binder::expression_vector& exprs, + std::vector colIndices, planner::Schema* schema, + std::shared_ptr table, uint64_t maxMorselSize); + // Do not scan anything from table. Serves as a control logic of pull model. + std::unique_ptr createEmptyFTableScan(std::shared_ptr table, + uint64_t maxMorselSize, std::unique_ptr child); + // Do not scan anything from table. Serves as a control logic of pull model. + // Scan is the leaf operator of physical plan. + std::unique_ptr createEmptyFTableScan( + std::shared_ptr table, uint64_t maxMorselSize); // Assume scans all columns of table in the same order as given expressions. - std::unique_ptr createFactorizedTableScanAligned( - const binder::expression_vector& expressions, planner::Schema* schema, - const std::shared_ptr& table, uint64_t maxMorselSize, - std::unique_ptr prevOperator); + // Scan fTable with row offset. + std::unique_ptr createFTableScanAligned( + const binder::expression_vector& exprs, planner::Schema* schema, + std::shared_ptr offset, std::shared_ptr table, + uint64_t maxMorselSize, std::unique_ptr child); + // Assume scans all columns of table in the same order as given expressions. + // Scan fTable without row offset. + std::unique_ptr createFTableScanAligned( + const binder::expression_vector& exprs, planner::Schema* schema, + std::shared_ptr table, uint64_t maxMorselSize, + std::unique_ptr child); + // Assume scans all columns of table in the same order as given expressions. + // Scan fTable without row offset. + // Scan is the leaf operator of physical plan. + std::unique_ptr createFTableScanAligned( + const binder::expression_vector& exprs, planner::Schema* schema, + std::shared_ptr table, uint64_t maxMorselSize); + std::unique_ptr createHashBuildInfo(const planner::Schema& buildSideSchema, const binder::expression_vector& keys, const binder::expression_vector& payloads); std::unique_ptr createHashAggregate( diff --git a/src/optimizer/acc_hash_join_optimizer.cpp b/src/optimizer/acc_hash_join_optimizer.cpp index a629277e32a..a729115b8cd 100644 --- a/src/optimizer/acc_hash_join_optimizer.cpp +++ b/src/optimizer/acc_hash_join_optimizer.cpp @@ -261,7 +261,7 @@ std::shared_ptr HashJoinSIPOptimizer::appendPathSemiMa std::shared_ptr HashJoinSIPOptimizer::appendAccumulate( std::shared_ptr child) { auto accumulate = std::make_shared( - AccumulateType::REGULAR, expression_vector{}, std::move(child)); + AccumulateType::REGULAR, expression_vector{}, nullptr /* offset */, std::move(child)); accumulate->computeFlatSchema(); return accumulate; } diff --git a/src/optimizer/logical_operator_visitor.cpp b/src/optimizer/logical_operator_visitor.cpp index 53b38d24cc8..b43c85167b8 100644 --- a/src/optimizer/logical_operator_visitor.cpp +++ b/src/optimizer/logical_operator_visitor.cpp @@ -85,6 +85,9 @@ void LogicalOperatorVisitor::visitOperatorSwitch(planner::LogicalOperator* op) { case LogicalOperatorType::COPY_TO: { visitCopyTo(op); } break; + case LogicalOperatorType::COPY_FROM: { + visitCopyFrom(op); + } break; default: return; } @@ -171,6 +174,9 @@ std::shared_ptr LogicalOperatorVisitor::visitOperatorR case LogicalOperatorType::COPY_TO: { return visitCopyToReplace(op); } + case LogicalOperatorType::COPY_FROM: { + return visitCopyFromReplace(op); + } default: return op; } diff --git a/src/optimizer/projection_push_down_optimizer.cpp b/src/optimizer/projection_push_down_optimizer.cpp index db1eebb7b9d..1519ca7f3e5 100644 --- a/src/optimizer/projection_push_down_optimizer.cpp +++ b/src/optimizer/projection_push_down_optimizer.cpp @@ -1,6 +1,7 @@ #include "optimizer/projection_push_down_optimizer.h" #include "binder/expression_visitor.h" +#include "common/cast.h" #include "planner/operator/extend/logical_extend.h" #include "planner/operator/extend/logical_recursive_extend.h" #include "planner/operator/logical_accumulate.h" @@ -10,6 +11,7 @@ #include "planner/operator/logical_order_by.h" #include "planner/operator/logical_projection.h" #include "planner/operator/logical_unwind.h" +#include "planner/operator/persistent/logical_copy_from.h" #include "planner/operator/persistent/logical_delete.h" #include "planner/operator/persistent/logical_insert.h" #include "planner/operator/persistent/logical_merge.h" @@ -251,6 +253,14 @@ void ProjectionPushDownOptimizer::visitSetRelProperty(planner::LogicalOperator* } } +void ProjectionPushDownOptimizer::visitCopyFrom(planner::LogicalOperator* op) { + auto copyFrom = ku_dynamic_cast(op); + for (auto& expr : copyFrom->getInfo()->source->getColumns()) { + collectExpressionsInUse(expr); + } + collectExpressionsInUse(copyFrom->getInfo()->offset); +} + // See comments above this class for how to collect expressions in use. void ProjectionPushDownOptimizer::collectExpressionsInUse( std::shared_ptr expression) { diff --git a/src/parser/transform/transform_copy.cpp b/src/parser/transform/transform_copy.cpp index 9bf52f9413a..65947143e2c 100644 --- a/src/parser/transform/transform_copy.cpp +++ b/src/parser/transform/transform_copy.cpp @@ -1,4 +1,6 @@ +#include "common/assert.h" #include "parser/copy.h" +#include "parser/scan_source.h" #include "parser/transformer.h" using namespace kuzu::common; @@ -17,9 +19,9 @@ std::unique_ptr Transformer::transformCopyTo(CypherParser::KU_CopyTOC } std::unique_ptr Transformer::transformCopyFrom(CypherParser::KU_CopyFromContext& ctx) { - auto filePaths = transformFilePaths(ctx.kU_FilePaths()->StringLiteral()); + auto source = transformScanSource(*ctx.kU_ScanSource()); auto tableName = transformSchemaName(*ctx.oC_SchemaName()); - auto copyFrom = std::make_unique(std::move(filePaths), std::move(tableName)); + auto copyFrom = std::make_unique(std::move(source), std::move(tableName)); if (ctx.kU_ColumnNames()) { copyFrom->setColumnNames(transformColumnNames(*ctx.kU_ColumnNames())); } @@ -31,9 +33,9 @@ std::unique_ptr Transformer::transformCopyFrom(CypherParser::KU_CopyF std::unique_ptr Transformer::transformCopyFromByColumn( CypherParser::KU_CopyFromByColumnContext& ctx) { - auto filePaths = transformFilePaths(ctx.StringLiteral()); + auto source = std::make_unique(transformFilePaths(ctx.StringLiteral())); auto tableName = transformSchemaName(*ctx.oC_SchemaName()); - auto copyFrom = std::make_unique(std::move(filePaths), std::move(tableName)); + auto copyFrom = std::make_unique(std::move(source), std::move(tableName)); copyFrom->setByColumn(); return copyFrom; } @@ -57,6 +59,22 @@ std::vector Transformer::transformFilePaths( return csvFiles; } +std::unique_ptr Transformer::transformScanSource( + CypherParser::KU_ScanSourceContext& ctx) { + if (ctx.kU_FilePaths()) { + auto filePaths = transformFilePaths(ctx.kU_FilePaths()->StringLiteral()); + return std::make_unique(std::move(filePaths)); + } else if (ctx.oC_Query()) { + auto query = transformQuery(*ctx.oC_Query()); + return std::make_unique(std::move(query)); + } else if (ctx.oC_Variable()) { + auto variable = transformVariable(*ctx.oC_Variable()); + return std::make_unique(std::move(variable)); + } else { + KU_UNREACHABLE; + } +} + parsing_option_t Transformer::transformParsingOptions(CypherParser::KU_ParsingOptionsContext& ctx) { std::unordered_map> copyOptions; for (auto loadOption : ctx.kU_ParsingOption()) { diff --git a/src/parser/transform/transform_reading_clause.cpp b/src/parser/transform/transform_reading_clause.cpp index 69f9b99f247..522907bb290 100644 --- a/src/parser/transform/transform_reading_clause.cpp +++ b/src/parser/transform/transform_reading_clause.cpp @@ -53,13 +53,8 @@ std::unique_ptr Transformer::transformInQueryCall( std::unique_ptr Transformer::transformLoadFrom( CypherParser::KU_LoadFromContext& ctx) { - auto loadFrom = std::make_unique(); - if (ctx.kU_FilePaths()) { - loadFrom->setFilePaths(transformFilePaths(ctx.kU_FilePaths()->StringLiteral())); - } else { - KU_ASSERT(ctx.oC_Variable()); - loadFrom->setObjectName(transformVariable(*ctx.oC_Variable())); - } + auto source = transformScanSource(*ctx.kU_ScanSource()); + auto loadFrom = std::make_unique(std::move(source)); if (ctx.kU_PropertyDefinitions()) { loadFrom->setColumnNameDataTypes( transformPropertyDefinitions(*ctx.kU_PropertyDefinitions())); diff --git a/src/planner/operator/logical_accumulate.cpp b/src/planner/operator/logical_accumulate.cpp index d05a224edde..35c402422fd 100644 --- a/src/planner/operator/logical_accumulate.cpp +++ b/src/planner/operator/logical_accumulate.cpp @@ -10,16 +10,25 @@ void LogicalAccumulate::computeFactorizedSchema() { createEmptySchema(); auto childSchema = children[0]->getSchema(); SinkOperatorUtil::recomputeSchema(*childSchema, getExpressionsToAccumulate(), *schema); + if (offset != nullptr) { + // If we need to generate row offset. Then all expressions must have been flattened and + // accumulated. So the new schema should just have one group. + KU_ASSERT(schema->getNumGroups() == 1); + schema->insertToGroupAndScope(offset, 0); + } } void LogicalAccumulate::computeFlatSchema() { copyChildSchema(0); + if (offset != nullptr) { + schema->insertToGroupAndScope(offset, 0); + } } f_group_pos_set LogicalAccumulate::getGroupPositionsToFlatten() const { f_group_pos_set result; auto childSchema = children[0]->getSchema(); - for (auto& expression : expressionsToFlatten) { + for (auto& expression : flatExprs) { auto groupPos = childSchema->getGroupPos(*expression); result.insert(groupPos); } diff --git a/src/planner/operator/scan/logical_scan_file.cpp b/src/planner/operator/scan/logical_scan_file.cpp index d2c3795aa2c..3142c94554d 100644 --- a/src/planner/operator/scan/logical_scan_file.cpp +++ b/src/planner/operator/scan/logical_scan_file.cpp @@ -7,14 +7,18 @@ void LogicalScanFile::computeFactorizedSchema() { createEmptySchema(); auto groupPos = schema->createGroup(); schema->insertToGroupAndScope(info.columns, groupPos); - schema->insertToGroupAndScope(info.offset, groupPos); + if (offset != nullptr) { + schema->insertToGroupAndScope(offset, groupPos); + } } void LogicalScanFile::computeFlatSchema() { createEmptySchema(); schema->createGroup(); schema->insertToGroupAndScope(info.columns, 0); - schema->insertToGroupAndScope(info.offset, 0); + if (offset != nullptr) { + schema->insertToGroupAndScope(offset, 0); + } } } // namespace planner diff --git a/src/planner/plan/append_accumulate.cpp b/src/planner/plan/append_accumulate.cpp index 17d76e32b25..5ec40918a51 100644 --- a/src/planner/plan/append_accumulate.cpp +++ b/src/planner/plan/append_accumulate.cpp @@ -7,11 +7,21 @@ using namespace kuzu::common; namespace kuzu { namespace planner { -void Planner::appendAccumulate(AccumulateType accumulateType, - const expression_vector& expressionsToFlatten, LogicalPlan& plan) { - auto op = make_shared( - accumulateType, expressionsToFlatten, plan.getLastOperator()); +void Planner::appendAccumulate(AccumulateType accumulateType, LogicalPlan& plan) { + appendAccumulate(accumulateType, expression_vector{}, plan); +} + +void Planner::appendAccumulate( + AccumulateType accumulateType, const expression_vector& flatExprs, LogicalPlan& plan) { + appendAccumulate(accumulateType, flatExprs, nullptr, plan); +} + +void Planner::appendAccumulate(AccumulateType accumulateType, const expression_vector& flatExprs, + std::shared_ptr offset, LogicalPlan& plan) { + auto op = + make_shared(accumulateType, flatExprs, offset, plan.getLastOperator()); appendFlattens(op->getGroupPositionsToFlatten(), plan); + op->setChild(0, plan.getLastOperator()); op->computeFactorizedSchema(); plan.setLastOperator(std::move(op)); } diff --git a/src/planner/plan/append_scan_file.cpp b/src/planner/plan/append_scan_file.cpp index 1672a06ea06..923db472470 100644 --- a/src/planner/plan/append_scan_file.cpp +++ b/src/planner/plan/append_scan_file.cpp @@ -6,9 +6,14 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendScanFile(const BoundFileScanInfo* fileScanInfo, LogicalPlan& plan) { +void Planner::appendScanFile(const BoundFileScanInfo* info, LogicalPlan& plan) { + appendScanFile(info, nullptr /* offset */, plan); +} + +void Planner::appendScanFile(const binder::BoundFileScanInfo* info, + std::shared_ptr offset, kuzu::planner::LogicalPlan& plan) { KU_ASSERT(plan.isEmpty()); - auto scanFile = std::make_shared(fileScanInfo->copy()); + auto scanFile = std::make_shared(info->copy(), offset); scanFile->computeFactorizedSchema(); plan.setLastOperator(std::move(scanFile)); } diff --git a/src/planner/plan/plan_copy.cpp b/src/planner/plan/plan_copy.cpp index 4917a1ca9a8..c4fe93505c5 100644 --- a/src/planner/plan/plan_copy.cpp +++ b/src/planner/plan/plan_copy.cpp @@ -30,7 +30,7 @@ static void appendPartitioner(const BoundCopyFromInfo& copyFromInfo, LogicalPlan for (auto& column : extraInfo->propertyColumns) { payloads.push_back(column); } - payloads.push_back(copyFromInfo.fileScanInfo->offset); + payloads.push_back(copyFromInfo.offset); for (auto& lookupInfo : extraInfo->infos) { payloads.push_back(lookupInfo.offset); } @@ -84,8 +84,22 @@ std::unique_ptr Planner::planCopyFrom(const BoundStatement& stateme std::unique_ptr Planner::planCopyNodeFrom( const BoundCopyFromInfo* info, binder::expression_vector results) { auto plan = std::make_unique(); - auto scanInfo = info->fileScanInfo.get(); - appendScanFile(scanInfo, *plan); + switch (info->source->type) { + case ScanSourceType::FILE: { + auto fileSource = + ku_dynamic_cast(info->source.get()); + appendScanFile(&fileSource->fileScanInfo, *plan); + } break; + case ScanSourceType::QUERY: { + auto querySource = + ku_dynamic_cast(info->source.get()); + plan = getBestPlan(planQuery(*querySource->statement)); + appendAccumulate(AccumulateType::REGULAR, plan->getSchema()->getExpressionsInScope(), + info->offset, *plan); + } break; + default: + KU_UNREACHABLE; + } appendCopyFrom(*info, results, *plan); return plan; } @@ -93,9 +107,11 @@ std::unique_ptr Planner::planCopyNodeFrom( std::unique_ptr Planner::planCopyResourceFrom( const BoundCopyFromInfo* info, binder::expression_vector results) { auto plan = std::make_unique(); - auto scanInfo = info->fileScanInfo.get(); - appendScanFile(scanInfo, *plan); - appendDistinct(scanInfo->columns, *plan); + KU_ASSERT(info->source->type == ScanSourceType::FILE); + auto fileSource = + ku_dynamic_cast(info->source.get()); + appendScanFile(&fileSource->fileScanInfo, *plan); + appendDistinct(fileSource->fileScanInfo.columns, *plan); appendCopyFrom(*info, results, *plan); return plan; } @@ -103,7 +119,22 @@ std::unique_ptr Planner::planCopyResourceFrom( std::unique_ptr Planner::planCopyRelFrom( const BoundCopyFromInfo* info, binder::expression_vector results) { auto plan = std::make_unique(); - appendScanFile(info->fileScanInfo.get(), *plan); + switch (info->source->type) { + case ScanSourceType::FILE: { + auto fileSource = + ku_dynamic_cast(info->source.get()); + appendScanFile(&fileSource->fileScanInfo, info->offset, *plan); + } break; + case ScanSourceType::QUERY: { + auto querySource = + ku_dynamic_cast(info->source.get()); + plan = getBestPlan(planQuery(*querySource->statement)); + appendAccumulate(AccumulateType::REGULAR, plan->getSchema()->getExpressionsInScope(), + info->offset, *plan); + } break; + default: + KU_UNREACHABLE; + } auto extraInfo = ku_dynamic_cast(info->extraInfo.get()); appendIndexScan(copyVector(extraInfo->infos), *plan); @@ -122,9 +153,11 @@ std::unique_ptr Planner::planCopyRdfFrom( auto rrlPlan = planCopyRelFrom(&extraRdfInfo->rrlInfo, results); auto children = logical_op_vector_t{rrlPlan->getLastOperator(), rrrPlan->getLastOperator(), lPlan->getLastOperator(), rPlan->getLastOperator()}; - if (info->fileScanInfo != nullptr) { + if (info->source->type == ScanSourceType::FILE) { auto readerPlan = LogicalPlan(); - appendScanFile(info->fileScanInfo.get(), readerPlan); + auto fileSource = + ku_dynamic_cast(info->source.get()); + appendScanFile(&fileSource->fileScanInfo, readerPlan); children.push_back(readerPlan.getLastOperator()); } auto resultPlan = std::make_unique(); diff --git a/src/processor/map/create_factorized_table_scan.cpp b/src/processor/map/create_factorized_table_scan.cpp index 7be22f159b4..c5b1279396a 100644 --- a/src/processor/map/create_factorized_table_scan.cpp +++ b/src/processor/map/create_factorized_table_scan.cpp @@ -13,14 +13,14 @@ using namespace kuzu::function; namespace kuzu { namespace processor { -std::unique_ptr PlanMapper::createFactorizedTableScan( - const expression_vector& expressions, std::vector colIndices, Schema* schema, - const std::shared_ptr& table, uint64_t maxMorselSize, - std::unique_ptr prevOperator) { +std::unique_ptr PlanMapper::createFTableScan(const expression_vector& exprs, + std::vector colIndices, std::shared_ptr offset, Schema* schema, + std::shared_ptr table, uint64_t maxMorselSize, + std::unique_ptr child) { std::vector outPosV; - outPosV.reserve(expressions.size()); - for (auto i = 0u; i < expressions.size(); ++i) { - outPosV.emplace_back(schema->getExpressionPos(*expressions[i])); + outPosV.reserve(exprs.size()); + for (auto i = 0u; i < exprs.size(); ++i) { + outPosV.emplace_back(schema->getExpressionPos(*exprs[i])); } auto bindData = std::make_unique(table, std::move(colIndices), maxMorselSize); @@ -30,28 +30,73 @@ std::unique_ptr PlanMapper::createFactorizedTableScan( info.function = ku_dynamic_cast(function); info.bindData = std::move(bindData); info.outPosV = std::move(outPosV); - info.rowOffsetPos = DataPos(); // Invalid data pos. + if (offset != nullptr) { + info.rowOffsetPos = getDataPos(*offset, *schema); + } else { + info.rowOffsetPos = DataPos::getInvalidPos(); // Invalid data pos. + } info.outputType = TableScanOutputType::MULTI_DATA_CHUNK; auto sharedState = std::make_shared(); - if (prevOperator == nullptr) { + if (child == nullptr) { return std::make_unique( - std::move(info), sharedState, getOperatorID(), ExpressionUtil::toString(expressions)); + std::move(info), sharedState, getOperatorID(), ExpressionUtil::toString(exprs)); } - return std::make_unique(std::move(info), sharedState, std::move(prevOperator), - getOperatorID(), ExpressionUtil::toString(expressions)); -} - -std::unique_ptr PlanMapper::createFactorizedTableScanAligned( - const expression_vector& expressions, Schema* schema, - const std::shared_ptr& table, uint64_t maxMorselSize, - std::unique_ptr prevOperator) { - std::vector columnIndices; - columnIndices.reserve(expressions.size()); - for (auto i = 0u; i < expressions.size(); ++i) { - columnIndices.push_back(i); + return std::make_unique(std::move(info), sharedState, std::move(child), + getOperatorID(), ExpressionUtil::toString(exprs)); +} + +std::unique_ptr PlanMapper::createFTableScan(const expression_vector& exprs, + std::vector colIndices, Schema* schema, std::shared_ptr table, + uint64_t maxMorselSize, std::unique_ptr child) { + return createFTableScan(exprs, colIndices, nullptr /* offset */, schema, std::move(table), + maxMorselSize, std::move(child)); +} + +std::unique_ptr PlanMapper::createFTableScan(const expression_vector& exprs, + std::vector colIndices, Schema* schema, std::shared_ptr table, + uint64_t maxMorselSize) { + return createFTableScan(exprs, colIndices, nullptr /* offset */, schema, std::move(table), + maxMorselSize, nullptr /* child */); +} + +std::unique_ptr PlanMapper::createEmptyFTableScan( + std::shared_ptr table, uint64_t maxMorselSize, + std::unique_ptr child) { + return createFTableScan(expression_vector{}, std::vector{}, nullptr /* offset */, + std::move(table), maxMorselSize, std::move(child)); +} + +std::unique_ptr PlanMapper::createEmptyFTableScan( + std::shared_ptr table, uint64_t maxMorselSize) { + return createFTableScan(expression_vector{}, std::vector{}, nullptr /* offset */, + std::move(table), maxMorselSize, nullptr /* child */); +} + +std::unique_ptr PlanMapper::createFTableScanAligned( + const expression_vector& exprs, Schema* schema, std::shared_ptr offset, + std::shared_ptr table, uint64_t maxMorselSize, + std::unique_ptr child) { + std::vector colIndices; + colIndices.reserve(exprs.size()); + for (auto i = 0u; i < exprs.size(); ++i) { + colIndices.push_back(i); } - return createFactorizedTableScan(expressions, std::move(columnIndices), schema, table, - maxMorselSize, std::move(prevOperator)); + return createFTableScan(exprs, std::move(colIndices), std::move(offset), schema, table, + maxMorselSize, std::move(child)); +} + +std::unique_ptr PlanMapper::createFTableScanAligned( + const expression_vector& exprs, Schema* schema, std::shared_ptr table, + uint64_t maxMorselSize, std::unique_ptr child) { + return createFTableScanAligned( + exprs, schema, nullptr /* offset*/, std::move(table), maxMorselSize, std::move(child)); +} + +std::unique_ptr PlanMapper::createFTableScanAligned( + const expression_vector& exprs, planner::Schema* schema, std::shared_ptr table, + uint64_t maxMorselSize) { + return createFTableScanAligned( + exprs, schema, std::move(table), maxMorselSize, nullptr /* child */); } } // namespace processor diff --git a/src/processor/map/map_accumulate.cpp b/src/processor/map/map_accumulate.cpp index 9785f8fc6d4..2cb4d64b994 100644 --- a/src/processor/map/map_accumulate.cpp +++ b/src/processor/map/map_accumulate.cpp @@ -9,17 +9,17 @@ namespace kuzu { namespace processor { std::unique_ptr PlanMapper::mapAccumulate(LogicalOperator* logicalOperator) { - auto logicalAccumulate = (LogicalAccumulate*)logicalOperator; - auto outSchema = logicalAccumulate->getSchema(); - auto inSchema = logicalAccumulate->getChild(0)->getSchema(); - auto prevOperator = mapOperator(logicalAccumulate->getChild(0).get()); - auto expressions = logicalAccumulate->getExpressionsToAccumulate(); + auto acc = (LogicalAccumulate*)logicalOperator; + auto outSchema = acc->getSchema(); + auto inSchema = acc->getChild(0)->getSchema(); + auto prevOperator = mapOperator(acc->getChild(0).get()); + auto expressions = acc->getExpressionsToAccumulate(); auto resultCollector = createResultCollector( - logicalAccumulate->getAccumulateType(), expressions, inSchema, std::move(prevOperator)); + acc->getAccumulateType(), expressions, inSchema, std::move(prevOperator)); auto table = resultCollector->getResultFactorizedTable(); auto maxMorselSize = table->hasUnflatCol() ? 1 : DEFAULT_VECTOR_CAPACITY; - return createFactorizedTableScanAligned( - expressions, outSchema, table, maxMorselSize, std::move(resultCollector)); + return createFTableScanAligned( + expressions, outSchema, acc->getOffset(), table, maxMorselSize, std::move(resultCollector)); } } // namespace processor diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index e3ffaf29282..7376f6ab5b0 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -1,4 +1,3 @@ -#include "binder/expression/variable_expression.h" #include "catalog/catalog_entry/table_catalog_entry.h" #include "planner/operator/logical_partitioner.h" #include "planner/operator/persistent/logical_copy_from.h" @@ -27,15 +26,15 @@ std::unique_ptr PlanMapper::mapCopyFrom(LogicalOperator* logic auto op = mapCopyNodeFrom(logicalOperator); auto copy = ku_dynamic_cast(op.get()); auto table = copy->getSharedState()->fTable; - return createFactorizedTableScanAligned(copyFrom->getOutExprs(), copyFrom->getSchema(), - table, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, std::move(op)); + return createFTableScanAligned(copyFrom->getOutExprs(), copyFrom->getSchema(), table, + DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, std::move(op)); } case TableType::REL: { auto ops = mapCopyRelFrom(logicalOperator); auto relBatchInsert = ku_dynamic_cast(ops[0].get()); auto fTable = relBatchInsert->getSharedState()->fTable; - auto scan = createFactorizedTableScanAligned(copyFrom->getOutExprs(), copyFrom->getSchema(), - fTable, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, std::move(ops[0])); + auto scan = createFTableScanAligned(copyFrom->getOutExprs(), copyFrom->getSchema(), fTable, + DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, std::move(ops[0])); for (auto i = 1u; i < ops.size(); ++i) { scan->addChild(std::move(ops[i])); } @@ -74,9 +73,7 @@ static void getRelColumnNamesInCopyOrder(TableCatalogEntry* tableEntry, static std::shared_ptr matchColumnExpression( const expression_vector& columnExpressions, const std::string& columnName) { for (auto& expression : columnExpressions) { - KU_ASSERT(expression->expressionType == ExpressionType::VARIABLE); - auto var = ku_dynamic_cast(expression.get()); - if (columnName == var->getVariableName()) { + if (columnName == expression->toString()) { return expression; } } @@ -130,13 +127,14 @@ std::unique_ptr PlanMapper::mapCopyNodeFrom(LogicalOperator* l } columnNamesExcludingSerial.push_back(columnNames[i]); } - auto inputColumns = copyFromInfo->fileScanInfo->columns; - inputColumns.push_back(copyFromInfo->fileScanInfo->offset); + auto inputColumns = copyFromInfo->source->getColumns(); + inputColumns.push_back(copyFromInfo->offset); auto columnPositions = getColumnDataPositions(columnNamesExcludingSerial, inputColumns, *outFSchema); + auto containsSerial = nodeTableEntry->containPropertyType(*LogicalType::SERIAL()); auto info = std::make_unique(nodeTableEntry, storageManager.compressionEnabled(), - std::move(columnPositions), copyFromInfo->containsSerial, std::move(columnTypes)); + std::move(columnPositions), containsSerial, std::move(columnTypes)); return std::make_unique(std::move(info), sharedState, std::make_unique(copyFrom->getSchema()), std::move(prevOperator), getOperatorID(), copyFrom->getExpressionsForPrinting()); @@ -268,7 +266,7 @@ std::unique_ptr PlanMapper::mapCopyRdfFrom(LogicalOperator* lo if (scanChild != nullptr) { copyRdf->addChild(std::move(scanChild)); } - return createFactorizedTableScanAligned(copyFrom->getOutExprs(), copyFrom->getSchema(), fTable, + return createFTableScanAligned(copyFrom->getOutExprs(), copyFrom->getSchema(), fTable, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, std::move(copyRdf)); } diff --git a/src/processor/map/map_copy_to.cpp b/src/processor/map/map_copy_to.cpp index 9b72adf05f3..58e8257f822 100644 --- a/src/processor/map/map_copy_to.cpp +++ b/src/processor/map/map_copy_to.cpp @@ -86,8 +86,7 @@ std::unique_ptr PlanMapper::mapCopyTo(LogicalOperator* logical std::shared_ptr fTable; auto ftTableSchema = std::make_unique(); fTable = std::make_shared(memoryManager, std::move(ftTableSchema)); - return createFactorizedTableScan(binder::expression_vector{}, std::vector{}, - childSchema, fTable, 0, std::move(copyTo)); + return createEmptyFTableScan(fTable, 0, std::move(copyTo)); } } // namespace processor diff --git a/src/processor/map/map_dummy_scan.cpp b/src/processor/map/map_dummy_scan.cpp index cd622babfdd..1b48be28496 100644 --- a/src/processor/map/map_dummy_scan.cpp +++ b/src/processor/map/map_dummy_scan.cpp @@ -25,8 +25,7 @@ std::unique_ptr PlanMapper::mapDummyScan(LogicalOperator* /*lo vectorsToAppend.push_back(expressionEvaluator->resultVector.get()); auto table = std::make_shared(memoryManager, std::move(tableSchema)); table->append(vectorsToAppend); - return createFactorizedTableScan(binder::expression_vector{}, std::vector{}, - inSchema.get(), table, 1 /* maxMorselSize */, nullptr /* child */); + return createEmptyFTableScan(table, 1 /* maxMorselSize */); } } // namespace processor diff --git a/src/processor/map/map_explain.cpp b/src/processor/map/map_explain.cpp index a0043d141c0..0f7a08807ef 100644 --- a/src/processor/map/map_explain.cpp +++ b/src/processor/map/map_explain.cpp @@ -6,12 +6,12 @@ using namespace kuzu::common; using namespace kuzu::planner; +using namespace kuzu::binder; namespace kuzu { namespace processor { -std::unique_ptr PlanMapper::mapExplain( - planner::LogicalOperator* logicalOperator) { +std::unique_ptr PlanMapper::mapExplain(LogicalOperator* logicalOperator) { auto logicalExplain = (LogicalExplain*)logicalOperator; auto outSchema = logicalExplain->getSchema(); auto inSchema = logicalExplain->getChild(0)->getSchema(); @@ -32,8 +32,8 @@ std::unique_ptr PlanMapper::mapExplain( auto explainStr = planPrinter->printPlanToOstream().str(); auto factorizedTable = FactorizedTableUtils::getFactorizedTableForOutputMsg(explainStr, memoryManager); - return createFactorizedTableScanAligned(binder::expression_vector{outputExpression}, - outSchema, factorizedTable, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, nullptr); + return createFTableScanAligned(expression_vector{outputExpression}, outSchema, + factorizedTable, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */); } } diff --git a/src/processor/map/map_expressions_scan.cpp b/src/processor/map/map_expressions_scan.cpp index 6c1b5462b55..123a3d564a5 100644 --- a/src/processor/map/map_expressions_scan.cpp +++ b/src/processor/map/map_expressions_scan.cpp @@ -31,8 +31,8 @@ std::unique_ptr PlanMapper::mapExpressionsScan( KU_ASSERT(physicalOp->getChild(0)->getOperatorType() == PhysicalOperatorType::RESULT_COLLECTOR); auto resultCollector = (ResultCollector*)physicalOp->getChild(0); auto table = resultCollector->getResultFactorizedTable(); - return createFactorizedTableScan(expressionsToScan, colIndicesToScan, schema, table, - DEFAULT_VECTOR_CAPACITY /* maxMorselSize */, nullptr); + return createFTableScan(expressionsToScan, colIndicesToScan, schema, table, + DEFAULT_VECTOR_CAPACITY /* maxMorselSize */); } } // namespace processor diff --git a/src/processor/map/map_scan_file.cpp b/src/processor/map/map_scan_file.cpp index b1d70b0489e..a006f2bf4fa 100644 --- a/src/processor/map/map_scan_file.cpp +++ b/src/processor/map/map_scan_file.cpp @@ -22,7 +22,11 @@ std::unique_ptr PlanMapper::mapScanFile(LogicalOperator* logic info.function = scanFileInfo->copyFunc; info.bindData = scanFileInfo->bindData->copy(); info.outPosV = outPosV; - info.rowOffsetPos = getDataPos(*scanFileInfo->offset, *outSchema); + if (scanFile->hasOffset()) { + info.rowOffsetPos = getDataPos(*scanFile->getOffset(), *outSchema); + } else { + info.rowOffsetPos = DataPos::getInvalidPos(); + } info.outputType = outPosV.empty() ? TableScanOutputType::EMPTY : TableScanOutputType::SINGLE_DATA_CHUNK; auto sharedState = std::make_shared(); diff --git a/test/test_files/exceptions/copy/npy_fault.test b/test/test_files/exceptions/copy/npy_fault.test index 4eadc0bd150..b3776ba1c6d 100644 --- a/test/test_files/exceptions/copy/npy_fault.test +++ b/test/test_files/exceptions/copy/npy_fault.test @@ -10,4 +10,7 @@ ---- ok -STATEMENT copy knows from ("${KUZU_ROOT_DIRECTORY}/dataset/npy-20k/id_int64.npy") by column; ---- error -Binder exception: Copy from npy files to rel table knows is not supported yet. +Binder exception: Copy by column is not supported for relationship table. +-STATEMENT copy person from ("${KUZU_ROOT_DIRECTORY}/dataset/read-list-tests/large-list/vPerson.csv") by column; +---- error +Binder exception: Copy by column with CSV file type is not supported. diff --git a/test/test_files/tck/expressions/list/List1.test b/test/test_files/tck/expressions/list/List1.test index fe1608680f5..9099c5684f5 100644 --- a/test/test_files/tck/expressions/list/List1.test +++ b/test/test_files/tck/expressions/list/List1.test @@ -103,34 +103,34 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA -STATEMENT WITH [1, 2, 3, 4, 5] AS list, true AS idx RETURN list[idx]; ---- error -Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(VAR_LIST,BOOL). Supported inputs are +Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],BOOL). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING -STATEMENT WITH [1, 2, 3, 4, 5] AS list, 4.7 AS idx RETURN list[idx]; ---- error -Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(VAR_LIST,DOUBLE). Supported inputs are +Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],DOUBLE). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING -STATEMENT WITH [1, 2, 3, 4, 5] AS list, '1' AS idx RETURN list[idx]; ---- error -Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(VAR_LIST,STRING). Supported inputs are +Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],STRING). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING -STATEMENT WITH [1, 2, 3, 4, 5] AS list, [1] AS idx RETURN list[idx]; ---- error -Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(VAR_LIST,VAR_LIST). Supported inputs are +Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],INT64[]). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING -STATEMENT WITH [1, 2, 3, 4, 5] AS list, {x: 3} AS idx RETURN list[idx]; ---- error -Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(VAR_LIST,STRUCT). Supported inputs are +Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],STRUCT(x:INT64)). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING diff --git a/test/test_files/tck/expressions/list/List11.test b/test/test_files/tck/expressions/list/List11.test index 1e8e2cbb04e..cc59d17d122 100644 --- a/test/test_files/tck/expressions/list/List11.test +++ b/test/test_files/tck/expressions/list/List11.test @@ -423,7 +423,7 @@ Binder exception: Cannot match a built-in function for given function RANGE(INT6 -STATEMENT RETURN range([0], 1, 1); ---- error -Binder exception: Cannot match a built-in function for given function RANGE(VAR_LIST,INT64,INT64). Supported inputs are +Binder exception: Cannot match a built-in function for given function RANGE(INT64[],INT64,INT64). Supported inputs are (INT64,INT64) -> VAR_LIST (INT64,INT64,INT64) -> VAR_LIST (INT32,INT32) -> VAR_LIST @@ -437,7 +437,7 @@ Binder exception: Cannot match a built-in function for given function RANGE(VAR_ -STATEMENT RETURN range(0, [1], 1); ---- error -Binder exception: Cannot match a built-in function for given function RANGE(INT64,VAR_LIST,INT64). Supported inputs are +Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64[],INT64). Supported inputs are (INT64,INT64) -> VAR_LIST (INT64,INT64,INT64) -> VAR_LIST (INT32,INT32) -> VAR_LIST @@ -451,7 +451,7 @@ Binder exception: Cannot match a built-in function for given function RANGE(INT6 -STATEMENT RETURN range(0, 1, [1]); ---- error -Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,VAR_LIST). Supported inputs are +Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,INT64[]). Supported inputs are (INT64,INT64) -> VAR_LIST (INT64,INT64,INT64) -> VAR_LIST (INT32,INT32) -> VAR_LIST @@ -465,7 +465,7 @@ Binder exception: Cannot match a built-in function for given function RANGE(INT6 -STATEMENT RETURN range({start: 0}, 1, 1); ---- error -Binder exception: Cannot match a built-in function for given function RANGE(STRUCT,INT64,INT64). Supported inputs are +Binder exception: Cannot match a built-in function for given function RANGE(STRUCT(start:INT64),INT64,INT64). Supported inputs are (INT64,INT64) -> VAR_LIST (INT64,INT64,INT64) -> VAR_LIST (INT32,INT32) -> VAR_LIST @@ -480,7 +480,7 @@ Binder exception: Cannot match a built-in function for given function RANGE(STRU -STATEMENT RETURN range(0, 1, {step: 1}); ---- error -Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,STRUCT). Supported inputs are +Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,STRUCT(step:INT64)). Supported inputs are (INT64,INT64) -> VAR_LIST (INT64,INT64,INT64) -> VAR_LIST (INT32,INT32) -> VAR_LIST diff --git a/test/test_files/tinysnb/copy/copy_from.test b/test/test_files/tinysnb/copy/copy_from.test new file mode 100644 index 00000000000..77e90572c62 --- /dev/null +++ b/test/test_files/tinysnb/copy/copy_from.test @@ -0,0 +1,88 @@ +-GROUP TinySnbReadTest +-DATASET CSV tinysnb + +-- + +-CASE CopyFromSubquery + +-STATEMENT CREATE NODE TABLE A(name STRING, PRIMARY KEY (name)); +---- ok +-STATEMENT COPY A FROM (MATCH (a:person) RETURN a.ID, a.fName); +---- error +Binder exception: Query returns 2 columns but 1 columns were expected. +-STATEMENT COPY A FROM (MATCH (a:person) RETURN a.ID); +---- error +Binder exception: a.ID has data type INT64 but STRING was expected. +-STATEMENT COPY A FROM x; +---- error +Binder exception: Scan from external object x is not supported. +-STATEMENT COPY A FROM (MATCH (a:person) RETURN a.fName); +---- ok +-STATEMENT MATCH (a:A) RETURN a.*; +---- 8 +Alice +Bob +Carol +Dan +Elizabeth +Farooq +Greg +Hubert Blaine Wolfeschlegelsteinhausenbergerdorff +-STATEMENT CREATE REL TABLE R(FROM A TO A); +---- ok +-STATEMENT COPY R FROM (MATCH (a:person)-[r:knows]->(b:person) RETURN a.fName, b.fName); +---- ok +-STATEMENT MATCH (a:A)-[r:R]->(b:A) RETURN a.name, b.name; +---- 14 +Alice|Bob +Alice|Carol +Alice|Dan +Bob|Alice +Bob|Carol +Bob|Dan +Carol|Alice +Carol|Bob +Carol|Dan +Dan|Alice +Dan|Bob +Dan|Carol +Elizabeth|Farooq +Elizabeth|Greg +-STATEMENT create node table person2 (ID INt64, fName StRING, gender INT64, isStudent BoOLEAN, isWorker BOOLEAN, age INT64, eyeSight DOUBLE, birthdate DATE, registerTime TIMESTAMP, lastJobDuration interval, workedHours INT64[], usedNames STRING[], courseScoresPerTerm INT64[][], grades INT64[4], height float, u UUID, PRIMARY KEY (ID)); +---- ok +-STATEMENT copy person2 from (MATCH (a:person) RETURN a.*); +---- ok +-STATEMENT MATCH (a:person2) RETURN a.*; +---- 8 +0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]]|[96,54,86,92]|1.731000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 +10|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|2|False|True|83|4.900000|1990-11-27|2023-02-21 13:25:30|3 years 2 days 13:02:00|[10,11,12,3,4,5,6,7]|[Ad,De,Hi,Kye,Orlan]|[[7],[10],[6,7]]|[77,64,100,54]|1.323000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18 +2|Bob|2|True|False|30|5.100000|1900-01-01|2008-11-03 15:25:30.000526|10 years 5 months 13:00:00.000024|[12,8]|[Bobby]|[[8,9],[9,10]]|[98,42,93,88]|0.990000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12 +3|Carol|1|False|True|45|5.000000|1940-06-22|1911-08-20 02:32:21|48:24:11|[4,5]|[Carmen,Fred]|[[8,10]]|[91,75,21,95]|1.000000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13 +5|Dan|2|False|True|20|4.800000|1950-07-23|2031-11-30 12:25:30|10 years 5 months 13:00:00.000024|[1,9]|[Wolfeschlegelstein,Daniel]|[[7,4],[8,8],[9]]|[76,88,99,89]|1.300000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14 +7|Elizabeth|1|False|True|20|4.700000|1980-10-26|1976-12-23 11:21:42|48:24:11|[2]|[Ein]|[[6],[7],[8]]|[96,59,65,88]|1.463000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15 +8|Farooq|2|True|False|25|4.500000|1980-10-26|1972-07-31 13:22:30.678559|00:18:00.024|[3,4,5,6,7]|[Fesdwe]|[[8]]|[80,78,34,83]|1.510000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16 +9|Greg|2|False|False|40|4.900000|1980-10-26|1976-12-23 04:41:42|10 years 5 months 13:00:00.000024|[1]|[Grad]|[[10]]|[43,83,67,43]|1.600000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17 +-STATEMENT create rel table knows2 (FROM person2 TO person2, date DATE, meetTime TIMESTAMP, validInterval INTERVAL, comments STRING[], summary STRUCT(locations STRING[], transfer STRUCT(day DATE, amount INT64[])), notes UNION(firstmet DATE, type INT16, comment STRING), someMap MAP(STRING, STRING), MANY_MANY); +---- ok +-STATEMENT copy knows2 from (MATCH (a:person)-[r:knows]->(b:person) RETURN a.ID, b.ID, r.*); +---- ok +-STATEMENT MATCH (a:person2)-[r:knows2]->(b:person2) RETURN a.fName, b.fName, r.*; +---- 14 +Alice|Bob|2021-06-30|1986-10-21 21:08:31.521|10 years 5 months 13:00:00.000024|[rnme,m8sihsdnf2990nfiwf]|{locations: ['toronto','waterloo'], transfer: {day: 2021-01-02, amount: [100,200]}}|1|{a=b} +Alice|Carol|2021-06-30|1946-08-25 19:07:22|20 years 30 days 48:00:00|[njnojppo9u0jkmf,fjiojioh9h9h89hph]|{locations: , transfer: }|2020-10-10|{c=d, e=f, 1=2} +Alice|Dan|2021-06-30|2012-12-11 20:07:22|10 days|[ioji232,jifhe8w99u43434]|{locations: ['shanghai'], transfer: {day: 1990-09-10, amount: [10]}}|nice weather| +Bob|Alice|2021-06-30|1946-08-25 19:07:22|10 years 5 months 13:00:00.000024|[2huh9y89fsfw23,23nsihufhw723]|{locations: ['paris'], transfer: {day: 2000-01-01, amount: [20,5000]}}|4| +Bob|Carol|1950-05-14|1946-08-25 19:07:22|00:23:00|[fwehu9h9832wewew,23u9h989sdfsss]|{locations: ['paris'], transfer: {day: 2011-05-01, amount: [2000,5340]}}|cool stuff found| +Bob|Dan|1950-05-14|2012-12-11 20:07:22|20 years 30 days 48:00:00|[fwh9y81232uisuiehuf,ewnuihxy8dyf232]|{locations: ['vancouver'], transfer: {day: 2020-01-01, amount: [120,50]}}|matthew perry| +Carol|Alice|2021-06-30|2002-07-31 11:42:53.12342|40 days 30:00:00|[fnioh8323aeweae34d,osd89e2ejshuih12]|{locations: ['london','toronto'], transfer: {day: 2012-11-21, amount: [223,5230]}}|10| +Carol|Bob|1950-05-14|2007-02-12 12:11:42.123|00:28:00.03|[fwh983-sdjisdfji,ioh89y32r2huir]|{locations: ['paris','beijing'], transfer: {day: 2011-03-11, amount: [2323,50]}}|1| +Carol|Dan|2000-01-01|1998-10-02 13:09:22.423|00:00:00.3|[psh989823oaaioe,nuiuah1nosndfisf]|{locations: [], transfer: {day: 1980-11-21, amount: [20,5]}}|2| +Dan|Alice|2021-06-30|1936-11-02 11:02:01|00:00:00.00048|[fwewe]|{locations: ['shanghai','nanjing'], transfer: {day: 1998-11-12, amount: [22,53240]}}|15| +Dan|Bob|1950-05-14|1982-11-11 13:12:05.123|00:23:00|[fewh9182912e3,h9y8y89soidfsf,nuhudf78w78efw,hioshe0f9023sdsd]|{locations: ['paris'], transfer: {day: 2000-01-01, amount: [20,5000]}}|happy new year| +Dan|Carol|2000-01-01|1999-04-21 15:12:11.42|48:00:00.052|[23h9sdslnfowhu2932,shuhf98922323sf]|{locations: ['paris'], transfer: {day: 2000-01-01, amount: [20,5000]}}|4| +Elizabeth|Farooq|1905-12-12|2025-01-01 11:22:33.52|00:47:58|[ahu2333333333333,12weeeeeeeeeeeeeeeeee]|{locations: ['toronto','thisisalongcityname'], transfer: {day: 1930-11-22, amount: [18,323]}}|8| +Elizabeth|Greg|1905-12-12|2020-03-01 12:11:41.6552|00:47:58|[peweeeeeeeeeeeeeeeee,kowje9w0eweeeeeeeee]|{locations: ['waterloo'], transfer: {day: 2000-01-01, amount: [1000,5000]}}|10| + +-STATEMENT LOAD FROM (MATCH (a) RETURN a.ID) RETURN *; +---- error +Binder exception: LOAD FROM subquery is not supported. diff --git a/test/test_files/tinysnb/exception/list.test b/test/test_files/tinysnb/exception/list.test index 59b3e743568..20f8eef086f 100644 --- a/test/test_files/tinysnb/exception/list.test +++ b/test/test_files/tinysnb/exception/list.test @@ -3,28 +3,25 @@ -- --CASE SetListPropertyError +-CASE ListFunctionException + -STATEMENT MATCH (a:person) SET a.workedHours=['A', 'B'] ---- error Binder exception: Expression LIST_CREATION(A,B) has data type STRING[] but expected INT64[]. Implicit cast is not supported. --CASE ListFunctionMatchError1 -STATEMENT MATCH (a:person) RETURN array_concat(a.workedHours, a.age) ---- error -Binder exception: Cannot match a built-in function for given function ARRAY_CONCAT(VAR_LIST,INT64). Supported inputs are +Binder exception: Cannot match a built-in function for given function ARRAY_CONCAT(INT64[],INT64). Supported inputs are (VAR_LIST,VAR_LIST) -> VAR_LIST --CASE ListFunctionMatchError2 -STATEMENT MATCH (a:person) RETURN array_concat(a.workedHours, ['A']) ---- error Binder exception: Cannot bind LIST_CONCAT with parameter type INT64[] and STRING[]. --CASE ListFunctionMatchError3 -STATEMENT MATCH (a:person) RETURN [a.age, a.fName] ---- error Binder exception: Cannot bind LIST_CREATION with parameter type INT64 and STRING. --CASE ListPrepareError -STATEMENT MATCH (a:person) RETURN list_sort($1) ---- error Binder exception: Cannot resolve recursive data type for expression $1. diff --git a/third_party/antlr4_cypher/cypher_lexer.cpp b/third_party/antlr4_cypher/cypher_lexer.cpp index c821166ff20..e3339bddb60 100644 --- a/third_party/antlr4_cypher/cypher_lexer.cpp +++ b/third_party/antlr4_cypher/cypher_lexer.cpp @@ -90,7 +90,7 @@ void cypherlexerLexerInitialize() { "DEFAULT_MODE" }, std::vector{ - "", "';'", "'('", "')'", "','", "'='", "'['", "']'", "'{'", "'}'", + "", "';'", "'('", "','", "')'", "'='", "'['", "']'", "'{'", "'}'", "'|'", "'..'", "'<>'", "'<'", "'<='", "'>'", "'>='", "'&'", "'>>'", "'<<'", "'+'", "'/'", "'%'", "'^'", "'=~'", "'.'", "'$'", "'\\u27E8'", "'\\u3008'", "'\\uFE64'", "'\\uFF1C'", "'\\u27E9'", "'\\u3009'", "'\\uFE65'", @@ -549,8 +549,8 @@ void cypherlexerLexerInitialize() { 1159,1,0,0,0,319,1161,1,0,0,0,321,1163,1,0,0,0,323,1165,1,0,0,0,325,1167, 1,0,0,0,327,1169,1,0,0,0,329,1171,1,0,0,0,331,1173,1,0,0,0,333,1175,1, 0,0,0,335,1177,1,0,0,0,337,1179,1,0,0,0,339,1181,1,0,0,0,341,342,5,59, - 0,0,342,2,1,0,0,0,343,344,5,40,0,0,344,4,1,0,0,0,345,346,5,41,0,0,346, - 6,1,0,0,0,347,348,5,44,0,0,348,8,1,0,0,0,349,350,5,61,0,0,350,10,1,0, + 0,0,342,2,1,0,0,0,343,344,5,40,0,0,344,4,1,0,0,0,345,346,5,44,0,0,346, + 6,1,0,0,0,347,348,5,41,0,0,348,8,1,0,0,0,349,350,5,61,0,0,350,10,1,0, 0,0,351,352,5,91,0,0,352,12,1,0,0,0,353,354,5,93,0,0,354,14,1,0,0,0,355, 356,5,123,0,0,356,16,1,0,0,0,357,358,5,125,0,0,358,18,1,0,0,0,359,360, 5,124,0,0,360,20,1,0,0,0,361,362,5,46,0,0,362,363,5,46,0,0,363,22,1,0, diff --git a/third_party/antlr4_cypher/cypher_parser.cpp b/third_party/antlr4_cypher/cypher_parser.cpp index 4555c6900d8..d60a8a0faf1 100644 --- a/third_party/antlr4_cypher/cypher_parser.cpp +++ b/third_party/antlr4_cypher/cypher_parser.cpp @@ -52,31 +52,31 @@ void cypherParserInitialize() { auto staticData = std::make_unique( std::vector{ "ku_Statements", "oC_Cypher", "oC_Statement", "kU_CopyFrom", "kU_ColumnNames", - "kU_CopyFromByColumn", "kU_CopyTO", "kU_ExportDatabase", "kU_ImportDatabase", - "kU_StandaloneCall", "kU_CommentOn", "kU_CreateMacro", "kU_PositionalArgs", - "kU_DefaultArg", "kU_FilePaths", "kU_ParsingOptions", "kU_ParsingOption", - "kU_DDL", "kU_CreateNodeTable", "kU_CreateRelTable", "kU_CreateRelTableGroup", - "kU_RelTableConnection", "kU_CreateRdfGraph", "kU_DropTable", "kU_AlterTable", - "kU_AlterOptions", "kU_AddProperty", "kU_DropProperty", "kU_RenameTable", - "kU_RenameProperty", "kU_PropertyDefinitions", "kU_PropertyDefinition", - "kU_CreateNodeConstraint", "kU_DataType", "kU_ListIdentifiers", "kU_ListIdentifier", - "oC_AnyCypherOption", "oC_Explain", "oC_Profile", "kU_Transaction", - "kU_Extension", "kU_LoadExtension", "kU_InstallExtension", "oC_Query", - "oC_RegularQuery", "oC_Union", "oC_SingleQuery", "oC_SinglePartQuery", - "oC_MultiPartQuery", "kU_QueryPart", "oC_UpdatingClause", "oC_ReadingClause", - "kU_LoadFrom", "kU_InQueryCall", "oC_Match", "oC_Unwind", "oC_Create", - "oC_Merge", "oC_MergeAction", "oC_Set", "oC_SetItem", "oC_Delete", - "oC_With", "oC_Return", "oC_ProjectionBody", "oC_ProjectionItems", - "oC_ProjectionItem", "oC_Order", "oC_Skip", "oC_Limit", "oC_SortItem", - "oC_Where", "oC_Pattern", "oC_PatternPart", "oC_AnonymousPatternPart", - "oC_PatternElement", "oC_NodePattern", "oC_PatternElementChain", "oC_RelationshipPattern", - "oC_RelationshipDetail", "kU_Properties", "oC_RelationshipTypes", - "oC_NodeLabels", "oC_NodeLabel", "oC_RangeLiteral", "kU_RecursiveRelationshipComprehension", - "kU_IntermediateNodeProjectionItems", "kU_IntermediateRelProjectionItems", - "oC_LowerBound", "oC_UpperBound", "oC_LabelName", "oC_RelTypeName", - "oC_Expression", "oC_OrExpression", "oC_XorExpression", "oC_AndExpression", - "oC_NotExpression", "oC_ComparisonExpression", "kU_ComparisonOperator", - "kU_BitwiseOrOperatorExpression", "kU_BitwiseAndOperatorExpression", + "kU_ScanSource", "kU_CopyFromByColumn", "kU_CopyTO", "kU_ExportDatabase", + "kU_ImportDatabase", "kU_StandaloneCall", "kU_CommentOn", "kU_CreateMacro", + "kU_PositionalArgs", "kU_DefaultArg", "kU_FilePaths", "kU_ParsingOptions", + "kU_ParsingOption", "kU_DDL", "kU_CreateNodeTable", "kU_CreateRelTable", + "kU_CreateRelTableGroup", "kU_RelTableConnection", "kU_CreateRdfGraph", + "kU_DropTable", "kU_AlterTable", "kU_AlterOptions", "kU_AddProperty", + "kU_DropProperty", "kU_RenameTable", "kU_RenameProperty", "kU_PropertyDefinitions", + "kU_PropertyDefinition", "kU_CreateNodeConstraint", "kU_DataType", + "kU_ListIdentifiers", "kU_ListIdentifier", "oC_AnyCypherOption", "oC_Explain", + "oC_Profile", "kU_Transaction", "kU_Extension", "kU_LoadExtension", + "kU_InstallExtension", "oC_Query", "oC_RegularQuery", "oC_Union", + "oC_SingleQuery", "oC_SinglePartQuery", "oC_MultiPartQuery", "kU_QueryPart", + "oC_UpdatingClause", "oC_ReadingClause", "kU_LoadFrom", "kU_InQueryCall", + "oC_Match", "oC_Unwind", "oC_Create", "oC_Merge", "oC_MergeAction", + "oC_Set", "oC_SetItem", "oC_Delete", "oC_With", "oC_Return", "oC_ProjectionBody", + "oC_ProjectionItems", "oC_ProjectionItem", "oC_Order", "oC_Skip", + "oC_Limit", "oC_SortItem", "oC_Where", "oC_Pattern", "oC_PatternPart", + "oC_AnonymousPatternPart", "oC_PatternElement", "oC_NodePattern", + "oC_PatternElementChain", "oC_RelationshipPattern", "oC_RelationshipDetail", + "kU_Properties", "oC_RelationshipTypes", "oC_NodeLabels", "oC_NodeLabel", + "oC_RangeLiteral", "kU_RecursiveRelationshipComprehension", "kU_IntermediateNodeProjectionItems", + "kU_IntermediateRelProjectionItems", "oC_LowerBound", "oC_UpperBound", + "oC_LabelName", "oC_RelTypeName", "oC_Expression", "oC_OrExpression", + "oC_XorExpression", "oC_AndExpression", "oC_NotExpression", "oC_ComparisonExpression", + "kU_ComparisonOperator", "kU_BitwiseOrOperatorExpression", "kU_BitwiseAndOperatorExpression", "kU_BitShiftOperatorExpression", "kU_BitShiftOperator", "oC_AddOrSubtractExpression", "kU_AddOrSubtractOperator", "oC_MultiplyDivideModuloExpression", "kU_MultiplyDivideModuloOperator", "oC_PowerOfExpression", "oC_UnaryAddSubtractOrFactorialExpression", @@ -93,7 +93,7 @@ void cypherParserInitialize() { "oC_Dash" }, std::vector{ - "", "';'", "'('", "')'", "','", "'='", "'['", "']'", "'{'", "'}'", + "", "';'", "'('", "','", "')'", "'='", "'['", "']'", "'{'", "'}'", "'|'", "'..'", "'<>'", "'<'", "'<='", "'>'", "'>='", "'&'", "'>>'", "'<<'", "'+'", "'/'", "'%'", "'^'", "'=~'", "'.'", "'$'", "'\\u27E8'", "'\\u3008'", "'\\uFE64'", "'\\uFF1C'", "'\\u27E9'", "'\\u3009'", "'\\uFE65'", @@ -129,7 +129,7 @@ void cypherParserInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,1,150,2310,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6, + 4,1,150,2294,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6, 2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14, 7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21, 7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28, @@ -150,891 +150,885 @@ void cypherParserInitialize() { 7,122,2,123,7,123,2,124,7,124,2,125,7,125,2,126,7,126,2,127,7,127,2,128, 7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133,7,133,2,134, 7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140, - 7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,1,0,1,0,3,0,293, - 8,0,1,0,1,0,3,0,297,8,0,1,0,5,0,300,8,0,10,0,12,0,303,9,0,1,0,3,0,306, - 8,0,1,0,1,0,1,1,3,1,311,8,1,1,1,3,1,314,8,1,1,1,1,1,3,1,318,8,1,1,1,3, - 1,321,8,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3,2,335,8,2, - 1,3,1,3,1,3,1,3,3,3,341,8,3,1,3,1,3,3,3,345,8,3,1,3,1,3,3,3,349,8,3,1, - 3,1,3,3,3,353,8,3,1,3,3,3,356,8,3,1,3,1,3,1,3,1,3,3,3,362,8,3,1,3,3,3, - 365,8,3,1,3,1,3,3,3,369,8,3,1,3,1,3,3,3,373,8,3,1,3,1,3,3,3,377,8,3,1, - 4,1,4,3,4,381,8,4,1,4,1,4,3,4,385,8,4,1,4,5,4,388,8,4,10,4,12,4,391,9, - 4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,401,8,5,1,5,1,5,3,5,405,8,5,1,5, - 1,5,3,5,409,8,5,1,5,5,5,412,8,5,10,5,12,5,415,9,5,1,5,1,5,1,5,1,5,1,5, - 1,5,1,6,1,6,1,6,1,6,3,6,427,8,6,1,6,1,6,3,6,431,8,6,1,6,1,6,1,6,1,6,1, - 6,1,6,3,6,439,8,6,1,6,1,6,3,6,443,8,6,1,6,1,6,3,6,447,8,6,1,6,1,6,3,6, - 451,8,6,1,7,1,7,1,7,1,7,1,7,1,7,3,7,459,8,7,1,7,1,7,3,7,463,8,7,1,7,1, - 7,3,7,467,8,7,1,7,1,7,3,7,471,8,7,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9, - 1,9,3,9,483,8,9,1,9,1,9,3,9,487,8,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,3,11, - 509,8,11,1,11,1,11,3,11,513,8,11,1,11,3,11,516,8,11,1,11,3,11,519,8,11, - 1,11,3,11,522,8,11,1,11,3,11,525,8,11,1,11,1,11,3,11,529,8,11,1,11,5, - 11,532,8,11,10,11,12,11,535,9,11,1,11,3,11,538,8,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,12,1,12,3,12,548,8,12,1,12,1,12,3,12,552,8,12,1,12,5,12, - 555,8,12,10,12,12,12,558,9,12,1,13,1,13,3,13,562,8,13,1,13,1,13,1,13, - 3,13,567,8,13,1,13,1,13,1,14,1,14,3,14,573,8,14,1,14,1,14,3,14,577,8, - 14,1,14,1,14,3,14,581,8,14,1,14,5,14,584,8,14,10,14,12,14,587,9,14,1, - 14,1,14,1,14,1,14,3,14,593,8,14,1,14,1,14,3,14,597,8,14,1,14,1,14,3,14, - 601,8,14,1,14,3,14,604,8,14,1,15,1,15,3,15,608,8,15,1,15,1,15,3,15,612, - 8,15,1,15,5,15,615,8,15,10,15,12,15,618,9,15,1,16,1,16,3,16,622,8,16, - 1,16,1,16,3,16,626,8,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,3,17, - 636,8,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,646,8,18,1,18,1, - 18,3,18,650,8,18,1,18,1,18,3,18,654,8,18,1,18,1,18,3,18,658,8,18,1,18, - 1,18,1,18,3,18,663,8,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19, - 1,19,3,19,675,8,19,1,19,1,19,3,19,679,8,19,1,19,1,19,3,19,683,8,19,1, - 19,1,19,3,19,687,8,19,1,19,1,19,3,19,691,8,19,3,19,693,8,19,1,19,1,19, - 3,19,697,8,19,1,19,1,19,3,19,701,8,19,3,19,703,8,19,1,19,1,19,1,20,1, - 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,717,8,20,1,20,1,20,3, - 20,721,8,20,1,20,1,20,3,20,725,8,20,1,20,1,20,3,20,729,8,20,1,20,4,20, - 732,8,20,11,20,12,20,733,1,20,3,20,737,8,20,1,20,1,20,3,20,741,8,20,1, - 20,1,20,3,20,745,8,20,3,20,747,8,20,1,20,1,20,3,20,751,8,20,1,20,1,20, - 3,20,755,8,20,3,20,757,8,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1, - 21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1, - 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,3,25,793,8, - 25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,3,26,804,8,26,1,27,1, - 27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1, - 29,1,29,1,29,1,30,1,30,3,30,826,8,30,1,30,1,30,3,30,830,8,30,1,30,5,30, - 833,8,30,10,30,12,30,836,9,30,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32, - 3,32,846,8,32,1,32,1,32,3,32,850,8,32,1,32,1,32,3,32,854,8,32,1,32,1, - 32,1,33,1,33,1,33,1,33,3,33,862,8,33,1,33,1,33,3,33,866,8,33,1,33,1,33, - 3,33,870,8,33,1,33,1,33,1,33,1,33,3,33,876,8,33,1,33,1,33,3,33,880,8, - 33,1,33,1,33,3,33,884,8,33,1,33,1,33,1,33,1,33,3,33,890,8,33,1,33,1,33, - 3,33,894,8,33,1,33,1,33,3,33,898,8,33,1,33,1,33,3,33,902,8,33,1,33,1, - 33,3,33,906,8,33,1,33,1,33,3,33,910,8,33,1,33,1,33,5,33,914,8,33,10,33, - 12,33,917,9,33,1,34,1,34,5,34,921,8,34,10,34,12,34,924,9,34,1,35,1,35, - 3,35,928,8,35,1,35,1,35,1,36,1,36,3,36,934,8,36,1,37,1,37,1,38,1,38,1, - 39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,3, - 39,954,8,39,1,40,1,40,3,40,958,8,40,1,41,1,41,1,41,1,41,1,41,1,41,3,41, - 966,8,41,1,42,1,42,1,42,1,42,1,43,1,43,1,44,1,44,3,44,976,8,44,1,44,5, - 44,979,8,44,10,44,12,44,982,9,44,1,44,1,44,3,44,986,8,44,4,44,988,8,44, - 11,44,12,44,989,1,44,1,44,1,44,3,44,995,8,44,1,45,1,45,1,45,1,45,3,45, - 1001,8,45,1,45,1,45,1,45,3,45,1006,8,45,1,45,3,45,1009,8,45,1,46,1,46, - 3,46,1013,8,46,1,47,1,47,3,47,1017,8,47,5,47,1019,8,47,10,47,12,47,1022, - 9,47,1,47,1,47,1,47,3,47,1027,8,47,5,47,1029,8,47,10,47,12,47,1032,9, - 47,1,47,1,47,3,47,1036,8,47,1,47,5,47,1039,8,47,10,47,12,47,1042,9,47, - 1,47,3,47,1045,8,47,1,47,3,47,1048,8,47,1,47,1,47,3,47,1052,8,47,4,47, - 1054,8,47,11,47,12,47,1055,1,47,1,47,3,47,1060,8,47,1,48,1,48,3,48,1064, - 8,48,4,48,1066,8,48,11,48,12,48,1067,1,48,1,48,1,49,1,49,3,49,1074,8, - 49,5,49,1076,8,49,10,49,12,49,1079,9,49,1,49,1,49,3,49,1083,8,49,5,49, - 1085,8,49,10,49,12,49,1088,9,49,1,49,1,49,1,50,1,50,1,50,1,50,3,50,1096, - 8,50,1,51,1,51,1,51,1,51,3,51,1102,8,51,1,52,1,52,1,52,1,52,1,52,1,52, - 3,52,1110,8,52,1,52,1,52,3,52,1114,8,52,1,52,1,52,3,52,1118,8,52,1,52, - 1,52,3,52,1122,8,52,1,52,1,52,1,52,1,52,1,52,3,52,1129,8,52,1,52,1,52, - 3,52,1133,8,52,1,52,1,52,3,52,1137,8,52,1,52,1,52,3,52,1141,8,52,1,52, - 3,52,1144,8,52,1,52,3,52,1147,8,52,1,52,3,52,1150,8,52,1,53,1,53,1,53, - 1,53,3,53,1156,8,53,1,53,3,53,1159,8,53,1,54,1,54,3,54,1163,8,54,1,54, - 1,54,3,54,1167,8,54,1,54,1,54,3,54,1171,8,54,1,54,3,54,1174,8,54,1,55, - 1,55,3,55,1178,8,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,3,56,1188, - 8,56,1,56,1,56,1,57,1,57,3,57,1194,8,57,1,57,1,57,1,57,5,57,1199,8,57, - 10,57,12,57,1202,9,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,3,58,1214,8,58,1,59,1,59,3,59,1218,8,59,1,59,1,59,3,59,1222,8,59,1, - 59,1,59,3,59,1226,8,59,1,59,5,59,1229,8,59,10,59,12,59,1232,9,59,1,60, - 1,60,3,60,1236,8,60,1,60,1,60,3,60,1240,8,60,1,60,1,60,1,61,1,61,3,61, - 1246,8,61,1,61,1,61,3,61,1250,8,61,1,61,1,61,3,61,1254,8,61,1,61,1,61, - 3,61,1258,8,61,1,61,5,61,1261,8,61,10,61,12,61,1264,9,61,1,62,1,62,1, - 62,3,62,1269,8,62,1,62,3,62,1272,8,62,1,63,1,63,1,63,1,64,3,64,1278,8, - 64,1,64,3,64,1281,8,64,1,64,1,64,1,64,1,64,3,64,1287,8,64,1,64,1,64,3, - 64,1291,8,64,1,64,1,64,3,64,1295,8,64,1,65,1,65,3,65,1299,8,65,1,65,1, - 65,3,65,1303,8,65,1,65,5,65,1306,8,65,10,65,12,65,1309,9,65,1,65,1,65, - 3,65,1313,8,65,1,65,1,65,3,65,1317,8,65,1,65,5,65,1320,8,65,10,65,12, - 65,1323,9,65,3,65,1325,8,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1334, - 8,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1343,8,67,1,67,5,67,1346, - 8,67,10,67,12,67,1349,9,67,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1, - 70,1,70,3,70,1361,8,70,1,70,3,70,1364,8,70,1,71,1,71,1,71,1,71,1,72,1, - 72,3,72,1372,8,72,1,72,1,72,3,72,1376,8,72,1,72,5,72,1379,8,72,10,72, - 12,72,1382,9,72,1,73,1,73,3,73,1386,8,73,1,73,1,73,3,73,1390,8,73,1,73, - 1,73,1,73,3,73,1395,8,73,1,74,1,74,1,75,1,75,3,75,1401,8,75,1,75,5,75, - 1404,8,75,10,75,12,75,1407,9,75,1,75,1,75,1,75,1,75,3,75,1413,8,75,1, - 76,1,76,3,76,1417,8,76,1,76,1,76,3,76,1421,8,76,3,76,1423,8,76,1,76,1, - 76,3,76,1427,8,76,3,76,1429,8,76,1,76,1,76,3,76,1433,8,76,3,76,1435,8, - 76,1,76,1,76,1,77,1,77,3,77,1441,8,77,1,77,1,77,1,78,1,78,3,78,1447,8, - 78,1,78,1,78,3,78,1451,8,78,1,78,3,78,1454,8,78,1,78,3,78,1457,8,78,1, - 78,1,78,1,78,1,78,3,78,1463,8,78,1,78,3,78,1466,8,78,1,78,3,78,1469,8, - 78,1,78,1,78,3,78,1473,8,78,1,78,1,78,1,78,1,78,3,78,1479,8,78,1,78,3, - 78,1482,8,78,1,78,3,78,1485,8,78,1,78,1,78,3,78,1489,8,78,1,79,1,79,3, - 79,1493,8,79,1,79,1,79,3,79,1497,8,79,3,79,1499,8,79,1,79,1,79,3,79,1503, - 8,79,3,79,1505,8,79,1,79,1,79,3,79,1509,8,79,3,79,1511,8,79,1,79,1,79, - 3,79,1515,8,79,3,79,1517,8,79,1,79,1,79,1,80,1,80,3,80,1523,8,80,1,80, - 1,80,3,80,1527,8,80,1,80,1,80,3,80,1531,8,80,1,80,1,80,3,80,1535,8,80, - 1,80,1,80,3,80,1539,8,80,1,80,1,80,3,80,1543,8,80,1,80,1,80,3,80,1547, - 8,80,1,80,1,80,3,80,1551,8,80,5,80,1553,8,80,10,80,12,80,1556,9,80,3, - 80,1558,8,80,1,80,1,80,1,81,1,81,3,81,1564,8,81,1,81,1,81,3,81,1568,8, - 81,1,81,1,81,3,81,1572,8,81,1,81,3,81,1575,8,81,1,81,5,81,1578,8,81,10, - 81,12,81,1581,9,81,1,82,1,82,3,82,1585,8,82,1,82,5,82,1588,8,82,10,82, - 12,82,1591,9,82,1,83,1,83,3,83,1595,8,83,1,83,1,83,1,84,1,84,3,84,1601, - 8,84,1,84,1,84,1,84,1,84,3,84,1607,8,84,1,84,3,84,1610,8,84,1,84,3,84, - 1613,8,84,1,84,3,84,1616,8,84,1,84,1,84,3,84,1620,8,84,1,84,3,84,1623, - 8,84,1,84,3,84,1626,8,84,1,84,3,84,1629,8,84,1,84,3,84,1632,8,84,1,85, - 1,85,3,85,1636,8,85,1,85,1,85,3,85,1640,8,85,1,85,1,85,3,85,1644,8,85, - 1,85,1,85,3,85,1648,8,85,1,85,1,85,3,85,1652,8,85,1,85,3,85,1655,8,85, - 1,85,3,85,1658,8,85,1,85,1,85,3,85,1662,8,85,1,85,1,85,3,85,1666,8,85, - 1,85,1,85,3,85,1670,8,85,1,85,1,85,3,85,1674,8,85,3,85,1676,8,85,1,85, - 1,85,1,86,1,86,3,86,1682,8,86,1,86,3,86,1685,8,86,1,86,3,86,1688,8,86, - 1,86,1,86,1,87,1,87,3,87,1694,8,87,1,87,3,87,1697,8,87,1,87,3,87,1700, - 8,87,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90,1,91,1,91,1,92,1,92,1,93, - 1,93,1,93,1,93,1,93,5,93,1719,8,93,10,93,12,93,1722,9,93,1,94,1,94,1, - 94,1,94,1,94,5,94,1729,8,94,10,94,12,94,1732,9,94,1,95,1,95,1,95,1,95, - 1,95,5,95,1739,8,95,10,95,12,95,1742,9,95,1,96,1,96,3,96,1746,8,96,5, - 96,1748,8,96,10,96,12,96,1751,9,96,1,96,1,96,1,97,1,97,3,97,1757,8,97, - 1,97,1,97,3,97,1761,8,97,1,97,1,97,3,97,1765,8,97,1,97,1,97,3,97,1769, - 8,97,1,97,1,97,3,97,1773,8,97,1,97,1,97,1,97,1,97,1,97,1,97,3,97,1781, - 8,97,1,97,1,97,3,97,1785,8,97,1,97,1,97,3,97,1789,8,97,1,97,1,97,3,97, - 1793,8,97,1,97,1,97,4,97,1797,8,97,11,97,12,97,1798,1,97,1,97,3,97,1803, - 8,97,1,98,1,98,1,99,1,99,3,99,1809,8,99,1,99,1,99,3,99,1813,8,99,1,99, - 5,99,1816,8,99,10,99,12,99,1819,9,99,1,100,1,100,3,100,1823,8,100,1,100, - 1,100,3,100,1827,8,100,1,100,5,100,1830,8,100,10,100,12,100,1833,9,100, - 1,101,1,101,3,101,1837,8,101,1,101,1,101,3,101,1841,8,101,1,101,1,101, - 5,101,1845,8,101,10,101,12,101,1848,9,101,1,102,1,102,1,103,1,103,3,103, - 1854,8,103,1,103,1,103,3,103,1858,8,103,1,103,1,103,5,103,1862,8,103, - 10,103,12,103,1865,9,103,1,104,1,104,1,105,1,105,3,105,1871,8,105,1,105, - 1,105,3,105,1875,8,105,1,105,1,105,5,105,1879,8,105,10,105,12,105,1882, - 9,105,1,106,1,106,1,107,1,107,3,107,1888,8,107,1,107,1,107,3,107,1892, - 8,107,1,107,5,107,1895,8,107,10,107,12,107,1898,9,107,1,108,1,108,3,108, - 1902,8,108,5,108,1904,8,108,10,108,12,108,1907,9,108,1,108,1,108,3,108, - 1911,8,108,1,108,3,108,1914,8,108,1,109,1,109,1,109,4,109,1919,8,109, - 11,109,12,109,1920,1,109,3,109,1924,8,109,1,110,1,110,1,110,3,110,1929, - 8,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,3,110,1938,8,110,1,110, - 1,110,3,110,1942,8,110,1,110,3,110,1945,8,110,1,111,1,111,1,111,1,111, - 1,111,1,111,1,111,1,111,1,111,1,111,1,111,3,111,1958,8,111,1,111,3,111, - 1961,8,111,1,111,1,111,1,112,3,112,1966,8,112,1,112,1,112,1,113,1,113, - 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,3,113,1980,8,113,1,114, - 1,114,3,114,1984,8,114,1,114,5,114,1987,8,114,10,114,12,114,1990,9,114, - 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,115,3,115,2001,8,115, - 1,116,1,116,1,116,1,116,1,116,1,116,3,116,2009,8,116,1,117,1,117,1,118, - 1,118,3,118,2015,8,118,1,118,1,118,3,118,2019,8,118,1,118,1,118,3,118, - 2023,8,118,5,118,2025,8,118,10,118,12,118,2028,9,118,3,118,2030,8,118, - 1,118,1,118,1,119,1,119,3,119,2036,8,119,1,119,3,119,2039,8,119,1,120, - 1,120,3,120,2043,8,120,1,120,1,120,3,120,2047,8,120,1,120,1,120,3,120, - 2051,8,120,1,120,1,120,3,120,2055,8,120,5,120,2057,8,120,10,120,12,120, - 2060,9,120,1,120,1,120,1,121,1,121,3,121,2066,8,121,1,121,3,121,2069, - 8,121,1,121,1,121,3,121,2073,8,121,1,121,1,121,1,122,1,122,3,122,2079, - 8,122,1,122,1,122,3,122,2083,8,122,1,122,1,122,1,123,1,123,3,123,2089, - 8,123,1,123,1,123,3,123,2093,8,123,1,123,1,123,3,123,2097,8,123,1,123, - 1,123,1,123,3,123,2102,8,123,1,123,1,123,3,123,2106,8,123,1,123,1,123, - 3,123,2110,8,123,3,123,2112,8,123,1,123,1,123,3,123,2116,8,123,1,123, - 1,123,3,123,2120,8,123,1,123,1,123,3,123,2124,8,123,5,123,2126,8,123, - 10,123,12,123,2129,9,123,3,123,2131,8,123,1,123,1,123,3,123,2135,8,123, - 1,124,1,124,1,125,1,125,3,125,2141,8,125,1,125,1,125,1,125,3,125,2146, - 8,125,3,125,2148,8,125,1,125,1,125,1,126,1,126,3,126,2154,8,126,1,126, - 4,126,2157,8,126,11,126,12,126,2158,1,127,1,127,3,127,2163,8,127,1,127, - 1,127,3,127,2167,8,127,1,127,1,127,3,127,2171,8,127,1,127,1,127,3,127, - 2175,8,127,1,127,3,127,2178,8,127,1,127,3,127,2181,8,127,1,127,1,127, - 1,128,1,128,3,128,2187,8,128,1,128,1,128,3,128,2191,8,128,1,128,1,128, - 3,128,2195,8,128,1,128,1,128,3,128,2199,8,128,1,128,3,128,2202,8,128, - 1,128,3,128,2205,8,128,1,128,1,128,1,129,1,129,3,129,2211,8,129,1,129, - 1,129,3,129,2215,8,129,1,130,1,130,3,130,2219,8,130,1,130,4,130,2222, - 8,130,11,130,12,130,2223,1,130,1,130,3,130,2228,8,130,1,130,1,130,3,130, - 2232,8,130,1,130,4,130,2235,8,130,11,130,12,130,2236,3,130,2239,8,130, - 1,130,3,130,2242,8,130,1,130,1,130,3,130,2246,8,130,1,130,3,130,2249, - 8,130,1,130,3,130,2252,8,130,1,130,1,130,1,131,1,131,3,131,2258,8,131, - 1,131,1,131,3,131,2262,8,131,1,131,1,131,3,131,2266,8,131,1,131,1,131, - 1,132,1,132,1,133,1,133,3,133,2274,8,133,1,134,1,134,1,134,3,134,2279, - 8,134,1,135,1,135,3,135,2283,8,135,1,135,1,135,1,136,1,136,1,137,1,137, - 1,138,1,138,1,139,1,139,1,140,1,140,1,140,1,140,1,140,3,140,2300,8,140, - 1,141,1,141,1,142,1,142,1,143,1,143,1,144,1,144,1,144,0,1,66,145,0,2, - 4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50, - 52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96, - 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132, - 134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168, - 170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204, - 206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240, - 242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276, - 278,280,282,284,286,288,0,11,2,0,57,57,59,59,1,0,104,107,2,0,5,5,12,16, - 1,0,18,19,2,0,20,20,115,115,2,0,21,22,98,98,1,0,124,125,7,0,47,47,53, - 56,67,67,71,71,118,118,126,126,130,130,2,0,13,13,27,30,2,0,15,15,31,34, - 2,0,35,45,115,115,2615,0,290,1,0,0,0,2,310,1,0,0,0,4,334,1,0,0,0,6,336, - 1,0,0,0,8,378,1,0,0,0,10,392,1,0,0,0,12,422,1,0,0,0,14,452,1,0,0,0,16, - 472,1,0,0,0,18,478,1,0,0,0,20,490,1,0,0,0,22,502,1,0,0,0,24,545,1,0,0, - 0,26,559,1,0,0,0,28,603,1,0,0,0,30,605,1,0,0,0,32,619,1,0,0,0,34,635, - 1,0,0,0,36,637,1,0,0,0,38,666,1,0,0,0,40,706,1,0,0,0,42,760,1,0,0,0,44, - 768,1,0,0,0,46,774,1,0,0,0,48,780,1,0,0,0,50,792,1,0,0,0,52,794,1,0,0, - 0,54,805,1,0,0,0,56,809,1,0,0,0,58,815,1,0,0,0,60,823,1,0,0,0,62,837, - 1,0,0,0,64,841,1,0,0,0,66,909,1,0,0,0,68,918,1,0,0,0,70,925,1,0,0,0,72, - 933,1,0,0,0,74,935,1,0,0,0,76,937,1,0,0,0,78,953,1,0,0,0,80,957,1,0,0, - 0,82,959,1,0,0,0,84,967,1,0,0,0,86,971,1,0,0,0,88,994,1,0,0,0,90,1008, - 1,0,0,0,92,1012,1,0,0,0,94,1059,1,0,0,0,96,1065,1,0,0,0,98,1077,1,0,0, - 0,100,1095,1,0,0,0,102,1101,1,0,0,0,104,1103,1,0,0,0,106,1151,1,0,0,0, - 108,1162,1,0,0,0,110,1175,1,0,0,0,112,1185,1,0,0,0,114,1191,1,0,0,0,116, - 1213,1,0,0,0,118,1215,1,0,0,0,120,1233,1,0,0,0,122,1245,1,0,0,0,124,1265, - 1,0,0,0,126,1273,1,0,0,0,128,1280,1,0,0,0,130,1324,1,0,0,0,132,1333,1, - 0,0,0,134,1335,1,0,0,0,136,1350,1,0,0,0,138,1354,1,0,0,0,140,1358,1,0, - 0,0,142,1365,1,0,0,0,144,1369,1,0,0,0,146,1394,1,0,0,0,148,1396,1,0,0, - 0,150,1412,1,0,0,0,152,1414,1,0,0,0,154,1438,1,0,0,0,156,1488,1,0,0,0, - 158,1490,1,0,0,0,160,1520,1,0,0,0,162,1561,1,0,0,0,164,1582,1,0,0,0,166, - 1592,1,0,0,0,168,1598,1,0,0,0,170,1633,1,0,0,0,172,1679,1,0,0,0,174,1691, - 1,0,0,0,176,1703,1,0,0,0,178,1705,1,0,0,0,180,1707,1,0,0,0,182,1709,1, - 0,0,0,184,1711,1,0,0,0,186,1713,1,0,0,0,188,1723,1,0,0,0,190,1733,1,0, - 0,0,192,1749,1,0,0,0,194,1802,1,0,0,0,196,1804,1,0,0,0,198,1806,1,0,0, - 0,200,1820,1,0,0,0,202,1834,1,0,0,0,204,1849,1,0,0,0,206,1851,1,0,0,0, - 208,1866,1,0,0,0,210,1868,1,0,0,0,212,1883,1,0,0,0,214,1885,1,0,0,0,216, - 1905,1,0,0,0,218,1915,1,0,0,0,220,1944,1,0,0,0,222,1957,1,0,0,0,224,1965, - 1,0,0,0,226,1979,1,0,0,0,228,1981,1,0,0,0,230,2000,1,0,0,0,232,2008,1, - 0,0,0,234,2010,1,0,0,0,236,2012,1,0,0,0,238,2033,1,0,0,0,240,2040,1,0, - 0,0,242,2065,1,0,0,0,244,2076,1,0,0,0,246,2134,1,0,0,0,248,2136,1,0,0, - 0,250,2147,1,0,0,0,252,2151,1,0,0,0,254,2160,1,0,0,0,256,2184,1,0,0,0, - 258,2208,1,0,0,0,260,2238,1,0,0,0,262,2255,1,0,0,0,264,2269,1,0,0,0,266, - 2273,1,0,0,0,268,2275,1,0,0,0,270,2280,1,0,0,0,272,2286,1,0,0,0,274,2288, - 1,0,0,0,276,2290,1,0,0,0,278,2292,1,0,0,0,280,2299,1,0,0,0,282,2301,1, - 0,0,0,284,2303,1,0,0,0,286,2305,1,0,0,0,288,2307,1,0,0,0,290,301,3,2, - 1,0,291,293,5,147,0,0,292,291,1,0,0,0,292,293,1,0,0,0,293,294,1,0,0,0, - 294,296,5,1,0,0,295,297,5,147,0,0,296,295,1,0,0,0,296,297,1,0,0,0,297, - 298,1,0,0,0,298,300,3,2,1,0,299,292,1,0,0,0,300,303,1,0,0,0,301,299,1, - 0,0,0,301,302,1,0,0,0,302,305,1,0,0,0,303,301,1,0,0,0,304,306,5,147,0, - 0,305,304,1,0,0,0,305,306,1,0,0,0,306,307,1,0,0,0,307,308,5,0,0,1,308, - 1,1,0,0,0,309,311,3,72,36,0,310,309,1,0,0,0,310,311,1,0,0,0,311,313,1, - 0,0,0,312,314,5,147,0,0,313,312,1,0,0,0,313,314,1,0,0,0,314,315,1,0,0, - 0,315,320,3,4,2,0,316,318,5,147,0,0,317,316,1,0,0,0,317,318,1,0,0,0,318, - 319,1,0,0,0,319,321,5,1,0,0,320,317,1,0,0,0,320,321,1,0,0,0,321,3,1,0, - 0,0,322,335,3,86,43,0,323,335,3,34,17,0,324,335,3,6,3,0,325,335,3,10, - 5,0,326,335,3,12,6,0,327,335,3,18,9,0,328,335,3,22,11,0,329,335,3,20, - 10,0,330,335,3,78,39,0,331,335,3,80,40,0,332,335,3,14,7,0,333,335,3,16, - 8,0,334,322,1,0,0,0,334,323,1,0,0,0,334,324,1,0,0,0,334,325,1,0,0,0,334, - 326,1,0,0,0,334,327,1,0,0,0,334,328,1,0,0,0,334,329,1,0,0,0,334,330,1, - 0,0,0,334,331,1,0,0,0,334,332,1,0,0,0,334,333,1,0,0,0,335,5,1,0,0,0,336, - 337,5,50,0,0,337,338,5,147,0,0,338,355,3,278,139,0,339,341,5,147,0,0, - 340,339,1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,344,5,2,0,0,343,345, - 5,147,0,0,344,343,1,0,0,0,344,345,1,0,0,0,345,346,1,0,0,0,346,348,3,8, - 4,0,347,349,5,147,0,0,348,347,1,0,0,0,348,349,1,0,0,0,349,350,1,0,0,0, - 350,352,5,3,0,0,351,353,5,147,0,0,352,351,1,0,0,0,352,353,1,0,0,0,353, - 356,1,0,0,0,354,356,5,147,0,0,355,340,1,0,0,0,355,354,1,0,0,0,356,357, - 1,0,0,0,357,358,5,51,0,0,358,361,5,147,0,0,359,362,3,28,14,0,360,362, - 3,264,132,0,361,359,1,0,0,0,361,360,1,0,0,0,362,376,1,0,0,0,363,365,5, - 147,0,0,364,363,1,0,0,0,364,365,1,0,0,0,365,366,1,0,0,0,366,368,5,2,0, - 0,367,369,5,147,0,0,368,367,1,0,0,0,368,369,1,0,0,0,369,370,1,0,0,0,370, - 372,3,30,15,0,371,373,5,147,0,0,372,371,1,0,0,0,372,373,1,0,0,0,373,374, - 1,0,0,0,374,375,5,3,0,0,375,377,1,0,0,0,376,364,1,0,0,0,376,377,1,0,0, - 0,377,7,1,0,0,0,378,389,3,278,139,0,379,381,5,147,0,0,380,379,1,0,0,0, - 380,381,1,0,0,0,381,382,1,0,0,0,382,384,5,4,0,0,383,385,5,147,0,0,384, - 383,1,0,0,0,384,385,1,0,0,0,385,386,1,0,0,0,386,388,3,278,139,0,387,380, - 1,0,0,0,388,391,1,0,0,0,389,387,1,0,0,0,389,390,1,0,0,0,390,9,1,0,0,0, - 391,389,1,0,0,0,392,393,5,50,0,0,393,394,5,147,0,0,394,395,3,278,139, - 0,395,396,5,147,0,0,396,397,5,51,0,0,397,398,5,147,0,0,398,400,5,2,0, - 0,399,401,5,147,0,0,400,399,1,0,0,0,400,401,1,0,0,0,401,402,1,0,0,0,402, - 413,5,133,0,0,403,405,5,147,0,0,404,403,1,0,0,0,404,405,1,0,0,0,405,406, - 1,0,0,0,406,408,5,4,0,0,407,409,5,147,0,0,408,407,1,0,0,0,408,409,1,0, - 0,0,409,410,1,0,0,0,410,412,5,133,0,0,411,404,1,0,0,0,412,415,1,0,0,0, - 413,411,1,0,0,0,413,414,1,0,0,0,414,416,1,0,0,0,415,413,1,0,0,0,416,417, - 5,3,0,0,417,418,5,147,0,0,418,419,5,101,0,0,419,420,5,147,0,0,420,421, - 5,52,0,0,421,11,1,0,0,0,422,423,5,50,0,0,423,424,5,147,0,0,424,426,5, - 2,0,0,425,427,5,147,0,0,426,425,1,0,0,0,426,427,1,0,0,0,427,428,1,0,0, - 0,428,430,3,86,43,0,429,431,5,147,0,0,430,429,1,0,0,0,430,431,1,0,0,0, - 431,432,1,0,0,0,432,433,5,3,0,0,433,434,5,147,0,0,434,435,5,68,0,0,435, - 436,5,147,0,0,436,450,5,133,0,0,437,439,5,147,0,0,438,437,1,0,0,0,438, - 439,1,0,0,0,439,440,1,0,0,0,440,442,5,2,0,0,441,443,5,147,0,0,442,441, - 1,0,0,0,442,443,1,0,0,0,443,444,1,0,0,0,444,446,3,30,15,0,445,447,5,147, - 0,0,446,445,1,0,0,0,446,447,1,0,0,0,447,448,1,0,0,0,448,449,5,3,0,0,449, - 451,1,0,0,0,450,438,1,0,0,0,450,451,1,0,0,0,451,13,1,0,0,0,452,453,5, - 53,0,0,453,454,5,147,0,0,454,455,5,55,0,0,455,456,5,147,0,0,456,470,5, - 133,0,0,457,459,5,147,0,0,458,457,1,0,0,0,458,459,1,0,0,0,459,460,1,0, - 0,0,460,462,5,2,0,0,461,463,5,147,0,0,462,461,1,0,0,0,462,463,1,0,0,0, - 463,464,1,0,0,0,464,466,3,30,15,0,465,467,5,147,0,0,466,465,1,0,0,0,466, - 467,1,0,0,0,467,468,1,0,0,0,468,469,5,3,0,0,469,471,1,0,0,0,470,458,1, - 0,0,0,470,471,1,0,0,0,471,15,1,0,0,0,472,473,5,54,0,0,473,474,5,147,0, - 0,474,475,5,55,0,0,475,476,5,147,0,0,476,477,5,133,0,0,477,17,1,0,0,0, - 478,479,5,46,0,0,479,480,5,147,0,0,480,482,3,280,140,0,481,483,5,147, - 0,0,482,481,1,0,0,0,482,483,1,0,0,0,483,484,1,0,0,0,484,486,5,5,0,0,485, - 487,5,147,0,0,486,485,1,0,0,0,486,487,1,0,0,0,487,488,1,0,0,0,488,489, - 3,232,116,0,489,19,1,0,0,0,490,491,5,47,0,0,491,492,5,147,0,0,492,493, - 5,91,0,0,493,494,5,147,0,0,494,495,5,57,0,0,495,496,5,147,0,0,496,497, - 3,278,139,0,497,498,5,147,0,0,498,499,5,122,0,0,499,500,5,147,0,0,500, - 501,5,133,0,0,501,21,1,0,0,0,502,503,5,89,0,0,503,504,5,147,0,0,504,505, - 5,48,0,0,505,506,5,147,0,0,506,508,3,248,124,0,507,509,5,147,0,0,508, - 507,1,0,0,0,508,509,1,0,0,0,509,510,1,0,0,0,510,512,5,2,0,0,511,513,5, - 147,0,0,512,511,1,0,0,0,512,513,1,0,0,0,513,515,1,0,0,0,514,516,3,24, - 12,0,515,514,1,0,0,0,515,516,1,0,0,0,516,518,1,0,0,0,517,519,5,147,0, - 0,518,517,1,0,0,0,518,519,1,0,0,0,519,521,1,0,0,0,520,522,3,26,13,0,521, - 520,1,0,0,0,521,522,1,0,0,0,522,533,1,0,0,0,523,525,5,147,0,0,524,523, - 1,0,0,0,524,525,1,0,0,0,525,526,1,0,0,0,526,528,5,4,0,0,527,529,5,147, - 0,0,528,527,1,0,0,0,528,529,1,0,0,0,529,530,1,0,0,0,530,532,3,26,13,0, - 531,524,1,0,0,0,532,535,1,0,0,0,533,531,1,0,0,0,533,534,1,0,0,0,534,537, - 1,0,0,0,535,533,1,0,0,0,536,538,5,147,0,0,537,536,1,0,0,0,537,538,1,0, - 0,0,538,539,1,0,0,0,539,540,5,3,0,0,540,541,5,147,0,0,541,542,5,99,0, - 0,542,543,5,147,0,0,543,544,3,184,92,0,544,23,1,0,0,0,545,556,3,280,140, - 0,546,548,5,147,0,0,547,546,1,0,0,0,547,548,1,0,0,0,548,549,1,0,0,0,549, - 551,5,4,0,0,550,552,5,147,0,0,551,550,1,0,0,0,551,552,1,0,0,0,552,553, - 1,0,0,0,553,555,3,280,140,0,554,547,1,0,0,0,555,558,1,0,0,0,556,554,1, - 0,0,0,556,557,1,0,0,0,557,25,1,0,0,0,558,556,1,0,0,0,559,561,3,280,140, - 0,560,562,5,147,0,0,561,560,1,0,0,0,561,562,1,0,0,0,562,563,1,0,0,0,563, - 564,5,117,0,0,564,566,5,5,0,0,565,567,5,147,0,0,566,565,1,0,0,0,566,567, - 1,0,0,0,567,568,1,0,0,0,568,569,3,232,116,0,569,27,1,0,0,0,570,572,5, - 6,0,0,571,573,5,147,0,0,572,571,1,0,0,0,572,573,1,0,0,0,573,574,1,0,0, - 0,574,585,5,133,0,0,575,577,5,147,0,0,576,575,1,0,0,0,576,577,1,0,0,0, - 577,578,1,0,0,0,578,580,5,4,0,0,579,581,5,147,0,0,580,579,1,0,0,0,580, - 581,1,0,0,0,581,582,1,0,0,0,582,584,5,133,0,0,583,576,1,0,0,0,584,587, - 1,0,0,0,585,583,1,0,0,0,585,586,1,0,0,0,586,588,1,0,0,0,587,585,1,0,0, - 0,588,604,5,7,0,0,589,604,5,133,0,0,590,592,5,49,0,0,591,593,5,147,0, - 0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,5,2,0,0,595, - 597,5,147,0,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,600, - 5,133,0,0,599,601,5,147,0,0,600,599,1,0,0,0,600,601,1,0,0,0,601,602,1, - 0,0,0,602,604,5,3,0,0,603,570,1,0,0,0,603,589,1,0,0,0,603,590,1,0,0,0, - 604,29,1,0,0,0,605,616,3,32,16,0,606,608,5,147,0,0,607,606,1,0,0,0,607, - 608,1,0,0,0,608,609,1,0,0,0,609,611,5,4,0,0,610,612,5,147,0,0,611,610, - 1,0,0,0,611,612,1,0,0,0,612,613,1,0,0,0,613,615,3,32,16,0,614,607,1,0, - 0,0,615,618,1,0,0,0,616,614,1,0,0,0,616,617,1,0,0,0,617,31,1,0,0,0,618, - 616,1,0,0,0,619,621,3,280,140,0,620,622,5,147,0,0,621,620,1,0,0,0,621, - 622,1,0,0,0,622,623,1,0,0,0,623,625,5,5,0,0,624,626,5,147,0,0,625,624, - 1,0,0,0,625,626,1,0,0,0,626,627,1,0,0,0,627,628,3,232,116,0,628,33,1, - 0,0,0,629,636,3,36,18,0,630,636,3,38,19,0,631,636,3,40,20,0,632,636,3, - 44,22,0,633,636,3,46,23,0,634,636,3,48,24,0,635,629,1,0,0,0,635,630,1, - 0,0,0,635,631,1,0,0,0,635,632,1,0,0,0,635,633,1,0,0,0,635,634,1,0,0,0, - 636,35,1,0,0,0,637,638,5,89,0,0,638,639,5,147,0,0,639,640,5,56,0,0,640, - 641,5,147,0,0,641,642,5,57,0,0,642,643,5,147,0,0,643,645,3,278,139,0, - 644,646,5,147,0,0,645,644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0,0,647, - 649,5,2,0,0,648,650,5,147,0,0,649,648,1,0,0,0,649,650,1,0,0,0,650,651, - 1,0,0,0,651,653,3,60,30,0,652,654,5,147,0,0,653,652,1,0,0,0,653,654,1, - 0,0,0,654,655,1,0,0,0,655,657,5,4,0,0,656,658,5,147,0,0,657,656,1,0,0, - 0,657,658,1,0,0,0,658,659,1,0,0,0,659,660,3,64,32,0,660,662,1,0,0,0,661, - 663,5,147,0,0,662,661,1,0,0,0,662,663,1,0,0,0,663,664,1,0,0,0,664,665, - 5,3,0,0,665,37,1,0,0,0,666,667,5,89,0,0,667,668,5,147,0,0,668,669,5,67, - 0,0,669,670,5,147,0,0,670,671,5,57,0,0,671,672,5,147,0,0,672,674,3,278, - 139,0,673,675,5,147,0,0,674,673,1,0,0,0,674,675,1,0,0,0,675,676,1,0,0, - 0,676,678,5,2,0,0,677,679,5,147,0,0,678,677,1,0,0,0,678,679,1,0,0,0,679, - 680,1,0,0,0,680,682,3,42,21,0,681,683,5,147,0,0,682,681,1,0,0,0,682,683, - 1,0,0,0,683,692,1,0,0,0,684,686,5,4,0,0,685,687,5,147,0,0,686,685,1,0, - 0,0,686,687,1,0,0,0,687,688,1,0,0,0,688,690,3,60,30,0,689,691,5,147,0, - 0,690,689,1,0,0,0,690,691,1,0,0,0,691,693,1,0,0,0,692,684,1,0,0,0,692, - 693,1,0,0,0,693,702,1,0,0,0,694,696,5,4,0,0,695,697,5,147,0,0,696,695, - 1,0,0,0,696,697,1,0,0,0,697,698,1,0,0,0,698,700,3,280,140,0,699,701,5, - 147,0,0,700,699,1,0,0,0,700,701,1,0,0,0,701,703,1,0,0,0,702,694,1,0,0, - 0,702,703,1,0,0,0,703,704,1,0,0,0,704,705,5,3,0,0,705,39,1,0,0,0,706, - 707,5,89,0,0,707,708,5,147,0,0,708,709,5,67,0,0,709,710,5,147,0,0,710, - 711,5,57,0,0,711,712,5,147,0,0,712,713,5,58,0,0,713,714,5,147,0,0,714, - 716,3,278,139,0,715,717,5,147,0,0,716,715,1,0,0,0,716,717,1,0,0,0,717, - 718,1,0,0,0,718,720,5,2,0,0,719,721,5,147,0,0,720,719,1,0,0,0,720,721, - 1,0,0,0,721,722,1,0,0,0,722,724,3,42,21,0,723,725,5,147,0,0,724,723,1, - 0,0,0,724,725,1,0,0,0,725,731,1,0,0,0,726,728,5,4,0,0,727,729,5,147,0, - 0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0,0,730,732,3,42,21,0,731, - 726,1,0,0,0,732,733,1,0,0,0,733,731,1,0,0,0,733,734,1,0,0,0,734,736,1, - 0,0,0,735,737,5,147,0,0,736,735,1,0,0,0,736,737,1,0,0,0,737,746,1,0,0, - 0,738,740,5,4,0,0,739,741,5,147,0,0,740,739,1,0,0,0,740,741,1,0,0,0,741, - 742,1,0,0,0,742,744,3,60,30,0,743,745,5,147,0,0,744,743,1,0,0,0,744,745, - 1,0,0,0,745,747,1,0,0,0,746,738,1,0,0,0,746,747,1,0,0,0,747,756,1,0,0, - 0,748,750,5,4,0,0,749,751,5,147,0,0,750,749,1,0,0,0,750,751,1,0,0,0,751, - 752,1,0,0,0,752,754,3,280,140,0,753,755,5,147,0,0,754,753,1,0,0,0,754, - 755,1,0,0,0,755,757,1,0,0,0,756,748,1,0,0,0,756,757,1,0,0,0,757,758,1, - 0,0,0,758,759,5,3,0,0,759,41,1,0,0,0,760,761,5,51,0,0,761,762,5,147,0, - 0,762,763,3,278,139,0,763,764,5,147,0,0,764,765,5,68,0,0,765,766,5,147, - 0,0,766,767,3,278,139,0,767,43,1,0,0,0,768,769,5,89,0,0,769,770,5,147, - 0,0,770,771,5,59,0,0,771,772,5,147,0,0,772,773,3,278,139,0,773,45,1,0, - 0,0,774,775,5,60,0,0,775,776,5,147,0,0,776,777,7,0,0,0,777,778,5,147, - 0,0,778,779,3,278,139,0,779,47,1,0,0,0,780,781,5,61,0,0,781,782,5,147, - 0,0,782,783,5,57,0,0,783,784,5,147,0,0,784,785,3,278,139,0,785,786,5, - 147,0,0,786,787,3,50,25,0,787,49,1,0,0,0,788,793,3,52,26,0,789,793,3, - 54,27,0,790,793,3,56,28,0,791,793,3,58,29,0,792,788,1,0,0,0,792,789,1, - 0,0,0,792,790,1,0,0,0,792,791,1,0,0,0,793,51,1,0,0,0,794,795,5,64,0,0, - 795,796,5,147,0,0,796,797,3,272,136,0,797,798,5,147,0,0,798,803,3,66, - 33,0,799,800,5,147,0,0,800,801,5,62,0,0,801,802,5,147,0,0,802,804,3,184, - 92,0,803,799,1,0,0,0,803,804,1,0,0,0,804,53,1,0,0,0,805,806,5,60,0,0, - 806,807,5,147,0,0,807,808,3,272,136,0,808,55,1,0,0,0,809,810,5,63,0,0, - 810,811,5,147,0,0,811,812,5,68,0,0,812,813,5,147,0,0,813,814,3,278,139, - 0,814,57,1,0,0,0,815,816,5,63,0,0,816,817,5,147,0,0,817,818,3,272,136, - 0,818,819,5,147,0,0,819,820,5,68,0,0,820,821,5,147,0,0,821,822,3,272, - 136,0,822,59,1,0,0,0,823,834,3,62,31,0,824,826,5,147,0,0,825,824,1,0, - 0,0,825,826,1,0,0,0,826,827,1,0,0,0,827,829,5,4,0,0,828,830,5,147,0,0, - 829,828,1,0,0,0,829,830,1,0,0,0,830,831,1,0,0,0,831,833,3,62,31,0,832, - 825,1,0,0,0,833,836,1,0,0,0,834,832,1,0,0,0,834,835,1,0,0,0,835,61,1, - 0,0,0,836,834,1,0,0,0,837,838,3,272,136,0,838,839,5,147,0,0,839,840,3, - 66,33,0,840,63,1,0,0,0,841,842,5,65,0,0,842,843,5,147,0,0,843,845,5,66, - 0,0,844,846,5,147,0,0,845,844,1,0,0,0,845,846,1,0,0,0,846,847,1,0,0,0, - 847,849,5,2,0,0,848,850,5,147,0,0,849,848,1,0,0,0,849,850,1,0,0,0,850, - 851,1,0,0,0,851,853,3,272,136,0,852,854,5,147,0,0,853,852,1,0,0,0,853, - 854,1,0,0,0,854,855,1,0,0,0,855,856,5,3,0,0,856,65,1,0,0,0,857,858,6, - 33,-1,0,858,910,3,280,140,0,859,861,5,82,0,0,860,862,5,147,0,0,861,860, - 1,0,0,0,861,862,1,0,0,0,862,863,1,0,0,0,863,865,5,2,0,0,864,866,5,147, - 0,0,865,864,1,0,0,0,865,866,1,0,0,0,866,867,1,0,0,0,867,869,3,60,30,0, - 868,870,5,147,0,0,869,868,1,0,0,0,869,870,1,0,0,0,870,871,1,0,0,0,871, - 872,5,3,0,0,872,910,1,0,0,0,873,875,3,280,140,0,874,876,5,147,0,0,875, - 874,1,0,0,0,875,876,1,0,0,0,876,877,1,0,0,0,877,879,5,2,0,0,878,880,5, - 147,0,0,879,878,1,0,0,0,879,880,1,0,0,0,880,881,1,0,0,0,881,883,3,60, - 30,0,882,884,5,147,0,0,883,882,1,0,0,0,883,884,1,0,0,0,884,885,1,0,0, - 0,885,886,5,3,0,0,886,910,1,0,0,0,887,889,3,280,140,0,888,890,5,147,0, - 0,889,888,1,0,0,0,889,890,1,0,0,0,890,891,1,0,0,0,891,893,5,2,0,0,892, - 894,5,147,0,0,893,892,1,0,0,0,893,894,1,0,0,0,894,895,1,0,0,0,895,897, - 3,66,33,0,896,898,5,147,0,0,897,896,1,0,0,0,897,898,1,0,0,0,898,899,1, - 0,0,0,899,901,5,4,0,0,900,902,5,147,0,0,901,900,1,0,0,0,901,902,1,0,0, - 0,902,903,1,0,0,0,903,905,3,66,33,0,904,906,5,147,0,0,905,904,1,0,0,0, - 905,906,1,0,0,0,906,907,1,0,0,0,907,908,5,3,0,0,908,910,1,0,0,0,909,857, - 1,0,0,0,909,859,1,0,0,0,909,873,1,0,0,0,909,887,1,0,0,0,910,915,1,0,0, - 0,911,912,10,4,0,0,912,914,3,68,34,0,913,911,1,0,0,0,914,917,1,0,0,0, - 915,913,1,0,0,0,915,916,1,0,0,0,916,67,1,0,0,0,917,915,1,0,0,0,918,922, - 3,70,35,0,919,921,3,70,35,0,920,919,1,0,0,0,921,924,1,0,0,0,922,920,1, - 0,0,0,922,923,1,0,0,0,923,69,1,0,0,0,924,922,1,0,0,0,925,927,5,6,0,0, - 926,928,3,274,137,0,927,926,1,0,0,0,927,928,1,0,0,0,928,929,1,0,0,0,929, - 930,5,7,0,0,930,71,1,0,0,0,931,934,3,74,37,0,932,934,3,76,38,0,933,931, - 1,0,0,0,933,932,1,0,0,0,934,73,1,0,0,0,935,936,5,69,0,0,936,75,1,0,0, - 0,937,938,5,70,0,0,938,77,1,0,0,0,939,940,5,71,0,0,940,941,5,147,0,0, - 941,954,5,72,0,0,942,943,5,71,0,0,943,944,5,147,0,0,944,945,5,72,0,0, - 945,946,5,147,0,0,946,947,5,73,0,0,947,948,5,147,0,0,948,954,5,74,0,0, - 949,954,5,76,0,0,950,954,5,77,0,0,951,954,5,78,0,0,952,954,5,79,0,0,953, - 939,1,0,0,0,953,942,1,0,0,0,953,949,1,0,0,0,953,950,1,0,0,0,953,951,1, - 0,0,0,953,952,1,0,0,0,954,79,1,0,0,0,955,958,3,82,41,0,956,958,3,84,42, - 0,957,955,1,0,0,0,957,956,1,0,0,0,958,81,1,0,0,0,959,960,5,84,0,0,960, - 961,5,147,0,0,961,962,5,81,0,0,962,965,5,147,0,0,963,966,5,133,0,0,964, - 966,3,264,132,0,965,963,1,0,0,0,965,964,1,0,0,0,966,83,1,0,0,0,967,968, - 5,80,0,0,968,969,5,147,0,0,969,970,3,264,132,0,970,85,1,0,0,0,971,972, - 3,88,44,0,972,87,1,0,0,0,973,980,3,92,46,0,974,976,5,147,0,0,975,974, - 1,0,0,0,975,976,1,0,0,0,976,977,1,0,0,0,977,979,3,90,45,0,978,975,1,0, - 0,0,979,982,1,0,0,0,980,978,1,0,0,0,980,981,1,0,0,0,981,995,1,0,0,0,982, - 980,1,0,0,0,983,985,3,126,63,0,984,986,5,147,0,0,985,984,1,0,0,0,985, - 986,1,0,0,0,986,988,1,0,0,0,987,983,1,0,0,0,988,989,1,0,0,0,989,987,1, - 0,0,0,989,990,1,0,0,0,990,991,1,0,0,0,991,992,3,92,46,0,992,993,6,44, - -1,0,993,995,1,0,0,0,994,973,1,0,0,0,994,987,1,0,0,0,995,89,1,0,0,0,996, - 997,5,82,0,0,997,998,5,147,0,0,998,1000,5,83,0,0,999,1001,5,147,0,0,1000, - 999,1,0,0,0,1000,1001,1,0,0,0,1001,1002,1,0,0,0,1002,1009,3,92,46,0,1003, - 1005,5,82,0,0,1004,1006,5,147,0,0,1005,1004,1,0,0,0,1005,1006,1,0,0,0, - 1006,1007,1,0,0,0,1007,1009,3,92,46,0,1008,996,1,0,0,0,1008,1003,1,0, - 0,0,1009,91,1,0,0,0,1010,1013,3,94,47,0,1011,1013,3,96,48,0,1012,1010, - 1,0,0,0,1012,1011,1,0,0,0,1013,93,1,0,0,0,1014,1016,3,102,51,0,1015,1017, - 5,147,0,0,1016,1015,1,0,0,0,1016,1017,1,0,0,0,1017,1019,1,0,0,0,1018, - 1014,1,0,0,0,1019,1022,1,0,0,0,1020,1018,1,0,0,0,1020,1021,1,0,0,0,1021, - 1023,1,0,0,0,1022,1020,1,0,0,0,1023,1060,3,126,63,0,1024,1026,3,102,51, - 0,1025,1027,5,147,0,0,1026,1025,1,0,0,0,1026,1027,1,0,0,0,1027,1029,1, - 0,0,0,1028,1024,1,0,0,0,1029,1032,1,0,0,0,1030,1028,1,0,0,0,1030,1031, - 1,0,0,0,1031,1033,1,0,0,0,1032,1030,1,0,0,0,1033,1040,3,100,50,0,1034, - 1036,5,147,0,0,1035,1034,1,0,0,0,1035,1036,1,0,0,0,1036,1037,1,0,0,0, - 1037,1039,3,100,50,0,1038,1035,1,0,0,0,1039,1042,1,0,0,0,1040,1038,1, - 0,0,0,1040,1041,1,0,0,0,1041,1047,1,0,0,0,1042,1040,1,0,0,0,1043,1045, - 5,147,0,0,1044,1043,1,0,0,0,1044,1045,1,0,0,0,1045,1046,1,0,0,0,1046, - 1048,3,126,63,0,1047,1044,1,0,0,0,1047,1048,1,0,0,0,1048,1060,1,0,0,0, - 1049,1051,3,102,51,0,1050,1052,5,147,0,0,1051,1050,1,0,0,0,1051,1052, - 1,0,0,0,1052,1054,1,0,0,0,1053,1049,1,0,0,0,1054,1055,1,0,0,0,1055,1053, - 1,0,0,0,1055,1056,1,0,0,0,1056,1057,1,0,0,0,1057,1058,6,47,-1,0,1058, - 1060,1,0,0,0,1059,1020,1,0,0,0,1059,1030,1,0,0,0,1059,1053,1,0,0,0,1060, - 95,1,0,0,0,1061,1063,3,98,49,0,1062,1064,5,147,0,0,1063,1062,1,0,0,0, - 1063,1064,1,0,0,0,1064,1066,1,0,0,0,1065,1061,1,0,0,0,1066,1067,1,0,0, - 0,1067,1065,1,0,0,0,1067,1068,1,0,0,0,1068,1069,1,0,0,0,1069,1070,3,94, - 47,0,1070,97,1,0,0,0,1071,1073,3,102,51,0,1072,1074,5,147,0,0,1073,1072, - 1,0,0,0,1073,1074,1,0,0,0,1074,1076,1,0,0,0,1075,1071,1,0,0,0,1076,1079, - 1,0,0,0,1077,1075,1,0,0,0,1077,1078,1,0,0,0,1078,1086,1,0,0,0,1079,1077, - 1,0,0,0,1080,1082,3,100,50,0,1081,1083,5,147,0,0,1082,1081,1,0,0,0,1082, - 1083,1,0,0,0,1083,1085,1,0,0,0,1084,1080,1,0,0,0,1085,1088,1,0,0,0,1086, - 1084,1,0,0,0,1086,1087,1,0,0,0,1087,1089,1,0,0,0,1088,1086,1,0,0,0,1089, - 1090,3,124,62,0,1090,99,1,0,0,0,1091,1096,3,112,56,0,1092,1096,3,114, - 57,0,1093,1096,3,118,59,0,1094,1096,3,122,61,0,1095,1091,1,0,0,0,1095, - 1092,1,0,0,0,1095,1093,1,0,0,0,1095,1094,1,0,0,0,1096,101,1,0,0,0,1097, - 1102,3,108,54,0,1098,1102,3,110,55,0,1099,1102,3,106,53,0,1100,1102,3, - 104,52,0,1101,1097,1,0,0,0,1101,1098,1,0,0,0,1101,1099,1,0,0,0,1101,1100, - 1,0,0,0,1102,103,1,0,0,0,1103,1121,5,84,0,0,1104,1105,5,147,0,0,1105, - 1106,5,95,0,0,1106,1107,5,147,0,0,1107,1109,5,85,0,0,1108,1110,5,147, - 0,0,1109,1108,1,0,0,0,1109,1110,1,0,0,0,1110,1111,1,0,0,0,1111,1113,5, - 2,0,0,1112,1114,5,147,0,0,1113,1112,1,0,0,0,1113,1114,1,0,0,0,1114,1115, - 1,0,0,0,1115,1117,3,60,30,0,1116,1118,5,147,0,0,1117,1116,1,0,0,0,1117, - 1118,1,0,0,0,1118,1119,1,0,0,0,1119,1120,5,3,0,0,1120,1122,1,0,0,0,1121, - 1104,1,0,0,0,1121,1122,1,0,0,0,1122,1123,1,0,0,0,1123,1124,5,147,0,0, - 1124,1125,5,51,0,0,1125,1143,5,147,0,0,1126,1140,3,28,14,0,1127,1129, - 5,147,0,0,1128,1127,1,0,0,0,1128,1129,1,0,0,0,1129,1130,1,0,0,0,1130, - 1132,5,2,0,0,1131,1133,5,147,0,0,1132,1131,1,0,0,0,1132,1133,1,0,0,0, - 1133,1134,1,0,0,0,1134,1136,3,30,15,0,1135,1137,5,147,0,0,1136,1135,1, - 0,0,0,1136,1137,1,0,0,0,1137,1138,1,0,0,0,1138,1139,5,3,0,0,1139,1141, - 1,0,0,0,1140,1128,1,0,0,0,1140,1141,1,0,0,0,1141,1144,1,0,0,0,1142,1144, - 3,264,132,0,1143,1126,1,0,0,0,1143,1142,1,0,0,0,1144,1149,1,0,0,0,1145, - 1147,5,147,0,0,1146,1145,1,0,0,0,1146,1147,1,0,0,0,1147,1148,1,0,0,0, - 1148,1150,3,142,71,0,1149,1146,1,0,0,0,1149,1150,1,0,0,0,1150,105,1,0, - 0,0,1151,1152,5,46,0,0,1152,1153,5,147,0,0,1153,1158,3,246,123,0,1154, - 1156,5,147,0,0,1155,1154,1,0,0,0,1155,1156,1,0,0,0,1156,1157,1,0,0,0, - 1157,1159,3,142,71,0,1158,1155,1,0,0,0,1158,1159,1,0,0,0,1159,107,1,0, - 0,0,1160,1161,5,86,0,0,1161,1163,5,147,0,0,1162,1160,1,0,0,0,1162,1163, - 1,0,0,0,1163,1164,1,0,0,0,1164,1166,5,87,0,0,1165,1167,5,147,0,0,1166, - 1165,1,0,0,0,1166,1167,1,0,0,0,1167,1168,1,0,0,0,1168,1173,3,144,72,0, - 1169,1171,5,147,0,0,1170,1169,1,0,0,0,1170,1171,1,0,0,0,1171,1172,1,0, - 0,0,1172,1174,3,142,71,0,1173,1170,1,0,0,0,1173,1174,1,0,0,0,1174,109, - 1,0,0,0,1175,1177,5,88,0,0,1176,1178,5,147,0,0,1177,1176,1,0,0,0,1177, - 1178,1,0,0,0,1178,1179,1,0,0,0,1179,1180,3,184,92,0,1180,1181,5,147,0, - 0,1181,1182,5,99,0,0,1182,1183,5,147,0,0,1183,1184,3,264,132,0,1184,111, - 1,0,0,0,1185,1187,5,89,0,0,1186,1188,5,147,0,0,1187,1186,1,0,0,0,1187, - 1188,1,0,0,0,1188,1189,1,0,0,0,1189,1190,3,144,72,0,1190,113,1,0,0,0, - 1191,1193,5,90,0,0,1192,1194,5,147,0,0,1193,1192,1,0,0,0,1193,1194,1, - 0,0,0,1194,1195,1,0,0,0,1195,1200,3,144,72,0,1196,1197,5,147,0,0,1197, - 1199,3,116,58,0,1198,1196,1,0,0,0,1199,1202,1,0,0,0,1200,1198,1,0,0,0, - 1200,1201,1,0,0,0,1201,115,1,0,0,0,1202,1200,1,0,0,0,1203,1204,5,91,0, - 0,1204,1205,5,147,0,0,1205,1206,5,87,0,0,1206,1207,5,147,0,0,1207,1214, - 3,118,59,0,1208,1209,5,91,0,0,1209,1210,5,147,0,0,1210,1211,5,89,0,0, - 1211,1212,5,147,0,0,1212,1214,3,118,59,0,1213,1203,1,0,0,0,1213,1208, - 1,0,0,0,1214,117,1,0,0,0,1215,1217,5,92,0,0,1216,1218,5,147,0,0,1217, - 1216,1,0,0,0,1217,1218,1,0,0,0,1218,1219,1,0,0,0,1219,1230,3,120,60,0, - 1220,1222,5,147,0,0,1221,1220,1,0,0,0,1221,1222,1,0,0,0,1222,1223,1,0, - 0,0,1223,1225,5,4,0,0,1224,1226,5,147,0,0,1225,1224,1,0,0,0,1225,1226, - 1,0,0,0,1226,1227,1,0,0,0,1227,1229,3,120,60,0,1228,1221,1,0,0,0,1229, - 1232,1,0,0,0,1230,1228,1,0,0,0,1230,1231,1,0,0,0,1231,119,1,0,0,0,1232, - 1230,1,0,0,0,1233,1235,3,270,135,0,1234,1236,5,147,0,0,1235,1234,1,0, - 0,0,1235,1236,1,0,0,0,1236,1237,1,0,0,0,1237,1239,5,5,0,0,1238,1240,5, - 147,0,0,1239,1238,1,0,0,0,1239,1240,1,0,0,0,1240,1241,1,0,0,0,1241,1242, - 3,184,92,0,1242,121,1,0,0,0,1243,1244,5,93,0,0,1244,1246,5,147,0,0,1245, - 1243,1,0,0,0,1245,1246,1,0,0,0,1246,1247,1,0,0,0,1247,1249,5,94,0,0,1248, - 1250,5,147,0,0,1249,1248,1,0,0,0,1249,1250,1,0,0,0,1250,1251,1,0,0,0, - 1251,1262,3,184,92,0,1252,1254,5,147,0,0,1253,1252,1,0,0,0,1253,1254, - 1,0,0,0,1254,1255,1,0,0,0,1255,1257,5,4,0,0,1256,1258,5,147,0,0,1257, - 1256,1,0,0,0,1257,1258,1,0,0,0,1258,1259,1,0,0,0,1259,1261,3,184,92,0, - 1260,1253,1,0,0,0,1261,1264,1,0,0,0,1262,1260,1,0,0,0,1262,1263,1,0,0, - 0,1263,123,1,0,0,0,1264,1262,1,0,0,0,1265,1266,5,95,0,0,1266,1271,3,128, - 64,0,1267,1269,5,147,0,0,1268,1267,1,0,0,0,1268,1269,1,0,0,0,1269,1270, - 1,0,0,0,1270,1272,3,142,71,0,1271,1268,1,0,0,0,1271,1272,1,0,0,0,1272, - 125,1,0,0,0,1273,1274,5,96,0,0,1274,1275,3,128,64,0,1275,127,1,0,0,0, - 1276,1278,5,147,0,0,1277,1276,1,0,0,0,1277,1278,1,0,0,0,1278,1279,1,0, - 0,0,1279,1281,5,97,0,0,1280,1277,1,0,0,0,1280,1281,1,0,0,0,1281,1282, - 1,0,0,0,1282,1283,5,147,0,0,1283,1286,3,130,65,0,1284,1285,5,147,0,0, - 1285,1287,3,134,67,0,1286,1284,1,0,0,0,1286,1287,1,0,0,0,1287,1290,1, - 0,0,0,1288,1289,5,147,0,0,1289,1291,3,136,68,0,1290,1288,1,0,0,0,1290, - 1291,1,0,0,0,1291,1294,1,0,0,0,1292,1293,5,147,0,0,1293,1295,3,138,69, - 0,1294,1292,1,0,0,0,1294,1295,1,0,0,0,1295,129,1,0,0,0,1296,1307,5,98, - 0,0,1297,1299,5,147,0,0,1298,1297,1,0,0,0,1298,1299,1,0,0,0,1299,1300, - 1,0,0,0,1300,1302,5,4,0,0,1301,1303,5,147,0,0,1302,1301,1,0,0,0,1302, - 1303,1,0,0,0,1303,1304,1,0,0,0,1304,1306,3,132,66,0,1305,1298,1,0,0,0, - 1306,1309,1,0,0,0,1307,1305,1,0,0,0,1307,1308,1,0,0,0,1308,1325,1,0,0, - 0,1309,1307,1,0,0,0,1310,1321,3,132,66,0,1311,1313,5,147,0,0,1312,1311, - 1,0,0,0,1312,1313,1,0,0,0,1313,1314,1,0,0,0,1314,1316,5,4,0,0,1315,1317, - 5,147,0,0,1316,1315,1,0,0,0,1316,1317,1,0,0,0,1317,1318,1,0,0,0,1318, - 1320,3,132,66,0,1319,1312,1,0,0,0,1320,1323,1,0,0,0,1321,1319,1,0,0,0, - 1321,1322,1,0,0,0,1322,1325,1,0,0,0,1323,1321,1,0,0,0,1324,1296,1,0,0, - 0,1324,1310,1,0,0,0,1325,131,1,0,0,0,1326,1327,3,184,92,0,1327,1328,5, - 147,0,0,1328,1329,5,99,0,0,1329,1330,5,147,0,0,1330,1331,3,264,132,0, - 1331,1334,1,0,0,0,1332,1334,3,184,92,0,1333,1326,1,0,0,0,1333,1332,1, - 0,0,0,1334,133,1,0,0,0,1335,1336,5,100,0,0,1336,1337,5,147,0,0,1337,1338, - 5,101,0,0,1338,1339,5,147,0,0,1339,1347,3,140,70,0,1340,1342,5,4,0,0, - 1341,1343,5,147,0,0,1342,1341,1,0,0,0,1342,1343,1,0,0,0,1343,1344,1,0, - 0,0,1344,1346,3,140,70,0,1345,1340,1,0,0,0,1346,1349,1,0,0,0,1347,1345, - 1,0,0,0,1347,1348,1,0,0,0,1348,135,1,0,0,0,1349,1347,1,0,0,0,1350,1351, - 5,102,0,0,1351,1352,5,147,0,0,1352,1353,3,184,92,0,1353,137,1,0,0,0,1354, - 1355,5,103,0,0,1355,1356,5,147,0,0,1356,1357,3,184,92,0,1357,139,1,0, - 0,0,1358,1363,3,184,92,0,1359,1361,5,147,0,0,1360,1359,1,0,0,0,1360,1361, - 1,0,0,0,1361,1362,1,0,0,0,1362,1364,7,1,0,0,1363,1360,1,0,0,0,1363,1364, - 1,0,0,0,1364,141,1,0,0,0,1365,1366,5,108,0,0,1366,1367,5,147,0,0,1367, - 1368,3,184,92,0,1368,143,1,0,0,0,1369,1380,3,146,73,0,1370,1372,5,147, - 0,0,1371,1370,1,0,0,0,1371,1372,1,0,0,0,1372,1373,1,0,0,0,1373,1375,5, - 4,0,0,1374,1376,5,147,0,0,1375,1374,1,0,0,0,1375,1376,1,0,0,0,1376,1377, - 1,0,0,0,1377,1379,3,146,73,0,1378,1371,1,0,0,0,1379,1382,1,0,0,0,1380, - 1378,1,0,0,0,1380,1381,1,0,0,0,1381,145,1,0,0,0,1382,1380,1,0,0,0,1383, - 1385,3,264,132,0,1384,1386,5,147,0,0,1385,1384,1,0,0,0,1385,1386,1,0, - 0,0,1386,1387,1,0,0,0,1387,1389,5,5,0,0,1388,1390,5,147,0,0,1389,1388, - 1,0,0,0,1389,1390,1,0,0,0,1390,1391,1,0,0,0,1391,1392,3,148,74,0,1392, - 1395,1,0,0,0,1393,1395,3,148,74,0,1394,1383,1,0,0,0,1394,1393,1,0,0,0, - 1395,147,1,0,0,0,1396,1397,3,150,75,0,1397,149,1,0,0,0,1398,1405,3,152, - 76,0,1399,1401,5,147,0,0,1400,1399,1,0,0,0,1400,1401,1,0,0,0,1401,1402, - 1,0,0,0,1402,1404,3,154,77,0,1403,1400,1,0,0,0,1404,1407,1,0,0,0,1405, - 1403,1,0,0,0,1405,1406,1,0,0,0,1406,1413,1,0,0,0,1407,1405,1,0,0,0,1408, - 1409,5,2,0,0,1409,1410,3,150,75,0,1410,1411,5,3,0,0,1411,1413,1,0,0,0, - 1412,1398,1,0,0,0,1412,1408,1,0,0,0,1413,151,1,0,0,0,1414,1416,5,2,0, - 0,1415,1417,5,147,0,0,1416,1415,1,0,0,0,1416,1417,1,0,0,0,1417,1422,1, - 0,0,0,1418,1420,3,264,132,0,1419,1421,5,147,0,0,1420,1419,1,0,0,0,1420, - 1421,1,0,0,0,1421,1423,1,0,0,0,1422,1418,1,0,0,0,1422,1423,1,0,0,0,1423, - 1428,1,0,0,0,1424,1426,3,164,82,0,1425,1427,5,147,0,0,1426,1425,1,0,0, - 0,1426,1427,1,0,0,0,1427,1429,1,0,0,0,1428,1424,1,0,0,0,1428,1429,1,0, - 0,0,1429,1434,1,0,0,0,1430,1432,3,160,80,0,1431,1433,5,147,0,0,1432,1431, - 1,0,0,0,1432,1433,1,0,0,0,1433,1435,1,0,0,0,1434,1430,1,0,0,0,1434,1435, - 1,0,0,0,1435,1436,1,0,0,0,1436,1437,5,3,0,0,1437,153,1,0,0,0,1438,1440, - 3,156,78,0,1439,1441,5,147,0,0,1440,1439,1,0,0,0,1440,1441,1,0,0,0,1441, - 1442,1,0,0,0,1442,1443,3,152,76,0,1443,155,1,0,0,0,1444,1446,3,284,142, - 0,1445,1447,5,147,0,0,1446,1445,1,0,0,0,1446,1447,1,0,0,0,1447,1448,1, - 0,0,0,1448,1450,3,288,144,0,1449,1451,5,147,0,0,1450,1449,1,0,0,0,1450, - 1451,1,0,0,0,1451,1453,1,0,0,0,1452,1454,3,158,79,0,1453,1452,1,0,0,0, - 1453,1454,1,0,0,0,1454,1456,1,0,0,0,1455,1457,5,147,0,0,1456,1455,1,0, - 0,0,1456,1457,1,0,0,0,1457,1458,1,0,0,0,1458,1459,3,288,144,0,1459,1489, - 1,0,0,0,1460,1462,3,288,144,0,1461,1463,5,147,0,0,1462,1461,1,0,0,0,1462, - 1463,1,0,0,0,1463,1465,1,0,0,0,1464,1466,3,158,79,0,1465,1464,1,0,0,0, - 1465,1466,1,0,0,0,1466,1468,1,0,0,0,1467,1469,5,147,0,0,1468,1467,1,0, - 0,0,1468,1469,1,0,0,0,1469,1470,1,0,0,0,1470,1472,3,288,144,0,1471,1473, - 5,147,0,0,1472,1471,1,0,0,0,1472,1473,1,0,0,0,1473,1474,1,0,0,0,1474, - 1475,3,286,143,0,1475,1489,1,0,0,0,1476,1478,3,288,144,0,1477,1479,5, - 147,0,0,1478,1477,1,0,0,0,1478,1479,1,0,0,0,1479,1481,1,0,0,0,1480,1482, - 3,158,79,0,1481,1480,1,0,0,0,1481,1482,1,0,0,0,1482,1484,1,0,0,0,1483, - 1485,5,147,0,0,1484,1483,1,0,0,0,1484,1485,1,0,0,0,1485,1486,1,0,0,0, - 1486,1487,3,288,144,0,1487,1489,1,0,0,0,1488,1444,1,0,0,0,1488,1460,1, - 0,0,0,1488,1476,1,0,0,0,1489,157,1,0,0,0,1490,1492,5,6,0,0,1491,1493, - 5,147,0,0,1492,1491,1,0,0,0,1492,1493,1,0,0,0,1493,1498,1,0,0,0,1494, - 1496,3,264,132,0,1495,1497,5,147,0,0,1496,1495,1,0,0,0,1496,1497,1,0, - 0,0,1497,1499,1,0,0,0,1498,1494,1,0,0,0,1498,1499,1,0,0,0,1499,1504,1, - 0,0,0,1500,1502,3,162,81,0,1501,1503,5,147,0,0,1502,1501,1,0,0,0,1502, - 1503,1,0,0,0,1503,1505,1,0,0,0,1504,1500,1,0,0,0,1504,1505,1,0,0,0,1505, - 1510,1,0,0,0,1506,1508,3,168,84,0,1507,1509,5,147,0,0,1508,1507,1,0,0, - 0,1508,1509,1,0,0,0,1509,1511,1,0,0,0,1510,1506,1,0,0,0,1510,1511,1,0, - 0,0,1511,1516,1,0,0,0,1512,1514,3,160,80,0,1513,1515,5,147,0,0,1514,1513, - 1,0,0,0,1514,1515,1,0,0,0,1515,1517,1,0,0,0,1516,1512,1,0,0,0,1516,1517, - 1,0,0,0,1517,1518,1,0,0,0,1518,1519,5,7,0,0,1519,159,1,0,0,0,1520,1522, - 5,8,0,0,1521,1523,5,147,0,0,1522,1521,1,0,0,0,1522,1523,1,0,0,0,1523, - 1557,1,0,0,0,1524,1526,3,272,136,0,1525,1527,5,147,0,0,1526,1525,1,0, - 0,0,1526,1527,1,0,0,0,1527,1528,1,0,0,0,1528,1530,5,117,0,0,1529,1531, - 5,147,0,0,1530,1529,1,0,0,0,1530,1531,1,0,0,0,1531,1532,1,0,0,0,1532, - 1534,3,184,92,0,1533,1535,5,147,0,0,1534,1533,1,0,0,0,1534,1535,1,0,0, - 0,1535,1554,1,0,0,0,1536,1538,5,4,0,0,1537,1539,5,147,0,0,1538,1537,1, - 0,0,0,1538,1539,1,0,0,0,1539,1540,1,0,0,0,1540,1542,3,272,136,0,1541, - 1543,5,147,0,0,1542,1541,1,0,0,0,1542,1543,1,0,0,0,1543,1544,1,0,0,0, - 1544,1546,5,117,0,0,1545,1547,5,147,0,0,1546,1545,1,0,0,0,1546,1547,1, - 0,0,0,1547,1548,1,0,0,0,1548,1550,3,184,92,0,1549,1551,5,147,0,0,1550, - 1549,1,0,0,0,1550,1551,1,0,0,0,1551,1553,1,0,0,0,1552,1536,1,0,0,0,1553, - 1556,1,0,0,0,1554,1552,1,0,0,0,1554,1555,1,0,0,0,1555,1558,1,0,0,0,1556, - 1554,1,0,0,0,1557,1524,1,0,0,0,1557,1558,1,0,0,0,1558,1559,1,0,0,0,1559, - 1560,5,9,0,0,1560,161,1,0,0,0,1561,1563,5,117,0,0,1562,1564,5,147,0,0, - 1563,1562,1,0,0,0,1563,1564,1,0,0,0,1564,1565,1,0,0,0,1565,1579,3,182, - 91,0,1566,1568,5,147,0,0,1567,1566,1,0,0,0,1567,1568,1,0,0,0,1568,1569, - 1,0,0,0,1569,1571,5,10,0,0,1570,1572,5,117,0,0,1571,1570,1,0,0,0,1571, - 1572,1,0,0,0,1572,1574,1,0,0,0,1573,1575,5,147,0,0,1574,1573,1,0,0,0, - 1574,1575,1,0,0,0,1575,1576,1,0,0,0,1576,1578,3,182,91,0,1577,1567,1, - 0,0,0,1578,1581,1,0,0,0,1579,1577,1,0,0,0,1579,1580,1,0,0,0,1580,163, - 1,0,0,0,1581,1579,1,0,0,0,1582,1589,3,166,83,0,1583,1585,5,147,0,0,1584, - 1583,1,0,0,0,1584,1585,1,0,0,0,1585,1586,1,0,0,0,1586,1588,3,166,83,0, - 1587,1584,1,0,0,0,1588,1591,1,0,0,0,1589,1587,1,0,0,0,1589,1590,1,0,0, - 0,1590,165,1,0,0,0,1591,1589,1,0,0,0,1592,1594,5,117,0,0,1593,1595,5, - 147,0,0,1594,1593,1,0,0,0,1594,1595,1,0,0,0,1595,1596,1,0,0,0,1596,1597, - 3,180,90,0,1597,167,1,0,0,0,1598,1600,5,98,0,0,1599,1601,5,147,0,0,1600, - 1599,1,0,0,0,1600,1601,1,0,0,0,1601,1606,1,0,0,0,1602,1607,5,109,0,0, - 1603,1604,5,83,0,0,1604,1605,5,147,0,0,1605,1607,5,109,0,0,1606,1602, - 1,0,0,0,1606,1603,1,0,0,0,1606,1607,1,0,0,0,1607,1609,1,0,0,0,1608,1610, - 5,147,0,0,1609,1608,1,0,0,0,1609,1610,1,0,0,0,1610,1625,1,0,0,0,1611, - 1613,3,176,88,0,1612,1611,1,0,0,0,1612,1613,1,0,0,0,1613,1615,1,0,0,0, - 1614,1616,5,147,0,0,1615,1614,1,0,0,0,1615,1616,1,0,0,0,1616,1617,1,0, - 0,0,1617,1619,5,11,0,0,1618,1620,5,147,0,0,1619,1618,1,0,0,0,1619,1620, - 1,0,0,0,1620,1622,1,0,0,0,1621,1623,3,178,89,0,1622,1621,1,0,0,0,1622, - 1623,1,0,0,0,1623,1626,1,0,0,0,1624,1626,3,274,137,0,1625,1612,1,0,0, - 0,1625,1624,1,0,0,0,1625,1626,1,0,0,0,1626,1631,1,0,0,0,1627,1629,5,147, - 0,0,1628,1627,1,0,0,0,1628,1629,1,0,0,0,1629,1630,1,0,0,0,1630,1632,3, - 170,85,0,1631,1628,1,0,0,0,1631,1632,1,0,0,0,1632,169,1,0,0,0,1633,1635, - 5,2,0,0,1634,1636,5,147,0,0,1635,1634,1,0,0,0,1635,1636,1,0,0,0,1636, - 1637,1,0,0,0,1637,1639,3,264,132,0,1638,1640,5,147,0,0,1639,1638,1,0, - 0,0,1639,1640,1,0,0,0,1640,1641,1,0,0,0,1641,1643,5,4,0,0,1642,1644,5, - 147,0,0,1643,1642,1,0,0,0,1643,1644,1,0,0,0,1644,1645,1,0,0,0,1645,1654, - 3,264,132,0,1646,1648,5,147,0,0,1647,1646,1,0,0,0,1647,1648,1,0,0,0,1648, - 1649,1,0,0,0,1649,1651,5,10,0,0,1650,1652,5,147,0,0,1651,1650,1,0,0,0, - 1651,1652,1,0,0,0,1652,1653,1,0,0,0,1653,1655,3,142,71,0,1654,1647,1, - 0,0,0,1654,1655,1,0,0,0,1655,1675,1,0,0,0,1656,1658,5,147,0,0,1657,1656, - 1,0,0,0,1657,1658,1,0,0,0,1658,1659,1,0,0,0,1659,1661,5,10,0,0,1660,1662, - 5,147,0,0,1661,1660,1,0,0,0,1661,1662,1,0,0,0,1662,1663,1,0,0,0,1663, - 1665,3,174,87,0,1664,1666,5,147,0,0,1665,1664,1,0,0,0,1665,1666,1,0,0, - 0,1666,1667,1,0,0,0,1667,1669,5,4,0,0,1668,1670,5,147,0,0,1669,1668,1, - 0,0,0,1669,1670,1,0,0,0,1670,1671,1,0,0,0,1671,1673,3,172,86,0,1672,1674, - 5,147,0,0,1673,1672,1,0,0,0,1673,1674,1,0,0,0,1674,1676,1,0,0,0,1675, - 1657,1,0,0,0,1675,1676,1,0,0,0,1676,1677,1,0,0,0,1677,1678,5,3,0,0,1678, - 171,1,0,0,0,1679,1681,5,8,0,0,1680,1682,5,147,0,0,1681,1680,1,0,0,0,1681, - 1682,1,0,0,0,1682,1684,1,0,0,0,1683,1685,3,130,65,0,1684,1683,1,0,0,0, - 1684,1685,1,0,0,0,1685,1687,1,0,0,0,1686,1688,5,147,0,0,1687,1686,1,0, - 0,0,1687,1688,1,0,0,0,1688,1689,1,0,0,0,1689,1690,5,9,0,0,1690,173,1, - 0,0,0,1691,1693,5,8,0,0,1692,1694,5,147,0,0,1693,1692,1,0,0,0,1693,1694, - 1,0,0,0,1694,1696,1,0,0,0,1695,1697,3,130,65,0,1696,1695,1,0,0,0,1696, - 1697,1,0,0,0,1697,1699,1,0,0,0,1698,1700,5,147,0,0,1699,1698,1,0,0,0, - 1699,1700,1,0,0,0,1700,1701,1,0,0,0,1701,1702,5,9,0,0,1702,175,1,0,0, - 0,1703,1704,5,135,0,0,1704,177,1,0,0,0,1705,1706,5,135,0,0,1706,179,1, - 0,0,0,1707,1708,3,278,139,0,1708,181,1,0,0,0,1709,1710,3,278,139,0,1710, - 183,1,0,0,0,1711,1712,3,186,93,0,1712,185,1,0,0,0,1713,1720,3,188,94, - 0,1714,1715,5,147,0,0,1715,1716,5,110,0,0,1716,1717,5,147,0,0,1717,1719, - 3,188,94,0,1718,1714,1,0,0,0,1719,1722,1,0,0,0,1720,1718,1,0,0,0,1720, - 1721,1,0,0,0,1721,187,1,0,0,0,1722,1720,1,0,0,0,1723,1730,3,190,95,0, - 1724,1725,5,147,0,0,1725,1726,5,111,0,0,1726,1727,5,147,0,0,1727,1729, - 3,190,95,0,1728,1724,1,0,0,0,1729,1732,1,0,0,0,1730,1728,1,0,0,0,1730, - 1731,1,0,0,0,1731,189,1,0,0,0,1732,1730,1,0,0,0,1733,1740,3,192,96,0, - 1734,1735,5,147,0,0,1735,1736,5,112,0,0,1736,1737,5,147,0,0,1737,1739, - 3,192,96,0,1738,1734,1,0,0,0,1739,1742,1,0,0,0,1740,1738,1,0,0,0,1740, - 1741,1,0,0,0,1741,191,1,0,0,0,1742,1740,1,0,0,0,1743,1745,5,113,0,0,1744, - 1746,5,147,0,0,1745,1744,1,0,0,0,1745,1746,1,0,0,0,1746,1748,1,0,0,0, - 1747,1743,1,0,0,0,1748,1751,1,0,0,0,1749,1747,1,0,0,0,1749,1750,1,0,0, - 0,1750,1752,1,0,0,0,1751,1749,1,0,0,0,1752,1753,3,194,97,0,1753,193,1, - 0,0,0,1754,1764,3,198,99,0,1755,1757,5,147,0,0,1756,1755,1,0,0,0,1756, - 1757,1,0,0,0,1757,1758,1,0,0,0,1758,1760,3,196,98,0,1759,1761,5,147,0, - 0,1760,1759,1,0,0,0,1760,1761,1,0,0,0,1761,1762,1,0,0,0,1762,1763,3,198, - 99,0,1763,1765,1,0,0,0,1764,1756,1,0,0,0,1764,1765,1,0,0,0,1765,1803, - 1,0,0,0,1766,1768,3,198,99,0,1767,1769,5,147,0,0,1768,1767,1,0,0,0,1768, - 1769,1,0,0,0,1769,1770,1,0,0,0,1770,1772,5,114,0,0,1771,1773,5,147,0, - 0,1772,1771,1,0,0,0,1772,1773,1,0,0,0,1773,1774,1,0,0,0,1774,1775,3,198, - 99,0,1775,1776,1,0,0,0,1776,1777,6,97,-1,0,1777,1803,1,0,0,0,1778,1780, - 3,198,99,0,1779,1781,5,147,0,0,1780,1779,1,0,0,0,1780,1781,1,0,0,0,1781, - 1782,1,0,0,0,1782,1784,3,196,98,0,1783,1785,5,147,0,0,1784,1783,1,0,0, - 0,1784,1785,1,0,0,0,1785,1786,1,0,0,0,1786,1796,3,198,99,0,1787,1789, - 5,147,0,0,1788,1787,1,0,0,0,1788,1789,1,0,0,0,1789,1790,1,0,0,0,1790, - 1792,3,196,98,0,1791,1793,5,147,0,0,1792,1791,1,0,0,0,1792,1793,1,0,0, - 0,1793,1794,1,0,0,0,1794,1795,3,198,99,0,1795,1797,1,0,0,0,1796,1788, - 1,0,0,0,1797,1798,1,0,0,0,1798,1796,1,0,0,0,1798,1799,1,0,0,0,1799,1800, - 1,0,0,0,1800,1801,6,97,-1,0,1801,1803,1,0,0,0,1802,1754,1,0,0,0,1802, - 1766,1,0,0,0,1802,1778,1,0,0,0,1803,195,1,0,0,0,1804,1805,7,2,0,0,1805, - 197,1,0,0,0,1806,1817,3,200,100,0,1807,1809,5,147,0,0,1808,1807,1,0,0, - 0,1808,1809,1,0,0,0,1809,1810,1,0,0,0,1810,1812,5,10,0,0,1811,1813,5, - 147,0,0,1812,1811,1,0,0,0,1812,1813,1,0,0,0,1813,1814,1,0,0,0,1814,1816, - 3,200,100,0,1815,1808,1,0,0,0,1816,1819,1,0,0,0,1817,1815,1,0,0,0,1817, - 1818,1,0,0,0,1818,199,1,0,0,0,1819,1817,1,0,0,0,1820,1831,3,202,101,0, - 1821,1823,5,147,0,0,1822,1821,1,0,0,0,1822,1823,1,0,0,0,1823,1824,1,0, - 0,0,1824,1826,5,17,0,0,1825,1827,5,147,0,0,1826,1825,1,0,0,0,1826,1827, - 1,0,0,0,1827,1828,1,0,0,0,1828,1830,3,202,101,0,1829,1822,1,0,0,0,1830, - 1833,1,0,0,0,1831,1829,1,0,0,0,1831,1832,1,0,0,0,1832,201,1,0,0,0,1833, - 1831,1,0,0,0,1834,1846,3,206,103,0,1835,1837,5,147,0,0,1836,1835,1,0, - 0,0,1836,1837,1,0,0,0,1837,1838,1,0,0,0,1838,1840,3,204,102,0,1839,1841, - 5,147,0,0,1840,1839,1,0,0,0,1840,1841,1,0,0,0,1841,1842,1,0,0,0,1842, - 1843,3,206,103,0,1843,1845,1,0,0,0,1844,1836,1,0,0,0,1845,1848,1,0,0, - 0,1846,1844,1,0,0,0,1846,1847,1,0,0,0,1847,203,1,0,0,0,1848,1846,1,0, - 0,0,1849,1850,7,3,0,0,1850,205,1,0,0,0,1851,1863,3,210,105,0,1852,1854, - 5,147,0,0,1853,1852,1,0,0,0,1853,1854,1,0,0,0,1854,1855,1,0,0,0,1855, - 1857,3,208,104,0,1856,1858,5,147,0,0,1857,1856,1,0,0,0,1857,1858,1,0, - 0,0,1858,1859,1,0,0,0,1859,1860,3,210,105,0,1860,1862,1,0,0,0,1861,1853, - 1,0,0,0,1862,1865,1,0,0,0,1863,1861,1,0,0,0,1863,1864,1,0,0,0,1864,207, - 1,0,0,0,1865,1863,1,0,0,0,1866,1867,7,4,0,0,1867,209,1,0,0,0,1868,1880, - 3,214,107,0,1869,1871,5,147,0,0,1870,1869,1,0,0,0,1870,1871,1,0,0,0,1871, - 1872,1,0,0,0,1872,1874,3,212,106,0,1873,1875,5,147,0,0,1874,1873,1,0, - 0,0,1874,1875,1,0,0,0,1875,1876,1,0,0,0,1876,1877,3,214,107,0,1877,1879, - 1,0,0,0,1878,1870,1,0,0,0,1879,1882,1,0,0,0,1880,1878,1,0,0,0,1880,1881, - 1,0,0,0,1881,211,1,0,0,0,1882,1880,1,0,0,0,1883,1884,7,5,0,0,1884,213, - 1,0,0,0,1885,1896,3,216,108,0,1886,1888,5,147,0,0,1887,1886,1,0,0,0,1887, - 1888,1,0,0,0,1888,1889,1,0,0,0,1889,1891,5,23,0,0,1890,1892,5,147,0,0, - 1891,1890,1,0,0,0,1891,1892,1,0,0,0,1892,1893,1,0,0,0,1893,1895,3,216, - 108,0,1894,1887,1,0,0,0,1895,1898,1,0,0,0,1896,1894,1,0,0,0,1896,1897, - 1,0,0,0,1897,215,1,0,0,0,1898,1896,1,0,0,0,1899,1901,5,115,0,0,1900,1902, - 5,147,0,0,1901,1900,1,0,0,0,1901,1902,1,0,0,0,1902,1904,1,0,0,0,1903, - 1899,1,0,0,0,1904,1907,1,0,0,0,1905,1903,1,0,0,0,1905,1906,1,0,0,0,1906, - 1908,1,0,0,0,1907,1905,1,0,0,0,1908,1913,3,218,109,0,1909,1911,5,147, - 0,0,1910,1909,1,0,0,0,1910,1911,1,0,0,0,1911,1912,1,0,0,0,1912,1914,5, - 116,0,0,1913,1910,1,0,0,0,1913,1914,1,0,0,0,1914,217,1,0,0,0,1915,1923, - 3,228,114,0,1916,1924,3,222,111,0,1917,1919,3,220,110,0,1918,1917,1,0, - 0,0,1919,1920,1,0,0,0,1920,1918,1,0,0,0,1920,1921,1,0,0,0,1921,1924,1, - 0,0,0,1922,1924,3,226,113,0,1923,1916,1,0,0,0,1923,1918,1,0,0,0,1923, - 1922,1,0,0,0,1923,1924,1,0,0,0,1924,219,1,0,0,0,1925,1926,5,147,0,0,1926, - 1928,5,118,0,0,1927,1929,5,147,0,0,1928,1927,1,0,0,0,1928,1929,1,0,0, - 0,1929,1930,1,0,0,0,1930,1945,3,228,114,0,1931,1932,5,6,0,0,1932,1933, - 3,184,92,0,1933,1934,5,7,0,0,1934,1945,1,0,0,0,1935,1937,5,6,0,0,1936, - 1938,3,184,92,0,1937,1936,1,0,0,0,1937,1938,1,0,0,0,1938,1939,1,0,0,0, - 1939,1941,5,117,0,0,1940,1942,3,184,92,0,1941,1940,1,0,0,0,1941,1942, - 1,0,0,0,1942,1943,1,0,0,0,1943,1945,5,7,0,0,1944,1925,1,0,0,0,1944,1931, - 1,0,0,0,1944,1935,1,0,0,0,1945,221,1,0,0,0,1946,1958,3,224,112,0,1947, - 1948,5,147,0,0,1948,1949,5,119,0,0,1949,1950,5,147,0,0,1950,1958,5,95, - 0,0,1951,1952,5,147,0,0,1952,1953,5,120,0,0,1953,1954,5,147,0,0,1954, - 1958,5,95,0,0,1955,1956,5,147,0,0,1956,1958,5,121,0,0,1957,1946,1,0,0, - 0,1957,1947,1,0,0,0,1957,1951,1,0,0,0,1957,1955,1,0,0,0,1958,1960,1,0, - 0,0,1959,1961,5,147,0,0,1960,1959,1,0,0,0,1960,1961,1,0,0,0,1961,1962, - 1,0,0,0,1962,1963,3,228,114,0,1963,223,1,0,0,0,1964,1966,5,147,0,0,1965, - 1964,1,0,0,0,1965,1966,1,0,0,0,1966,1967,1,0,0,0,1967,1968,5,24,0,0,1968, - 225,1,0,0,0,1969,1970,5,147,0,0,1970,1971,5,122,0,0,1971,1972,5,147,0, - 0,1972,1980,5,123,0,0,1973,1974,5,147,0,0,1974,1975,5,122,0,0,1975,1976, - 5,147,0,0,1976,1977,5,113,0,0,1977,1978,5,147,0,0,1978,1980,5,123,0,0, - 1979,1969,1,0,0,0,1979,1973,1,0,0,0,1980,227,1,0,0,0,1981,1988,3,230, - 115,0,1982,1984,5,147,0,0,1983,1982,1,0,0,0,1983,1984,1,0,0,0,1984,1985, - 1,0,0,0,1985,1987,3,258,129,0,1986,1983,1,0,0,0,1987,1990,1,0,0,0,1988, - 1986,1,0,0,0,1988,1989,1,0,0,0,1989,229,1,0,0,0,1990,1988,1,0,0,0,1991, - 2001,3,232,116,0,1992,2001,3,268,134,0,1993,2001,3,260,130,0,1994,2001, - 3,244,122,0,1995,2001,3,246,123,0,1996,2001,3,252,126,0,1997,2001,3,254, - 127,0,1998,2001,3,256,128,0,1999,2001,3,264,132,0,2000,1991,1,0,0,0,2000, - 1992,1,0,0,0,2000,1993,1,0,0,0,2000,1994,1,0,0,0,2000,1995,1,0,0,0,2000, - 1996,1,0,0,0,2000,1997,1,0,0,0,2000,1998,1,0,0,0,2000,1999,1,0,0,0,2001, - 231,1,0,0,0,2002,2009,3,266,133,0,2003,2009,5,133,0,0,2004,2009,3,234, - 117,0,2005,2009,5,123,0,0,2006,2009,3,236,118,0,2007,2009,3,240,120,0, - 2008,2002,1,0,0,0,2008,2003,1,0,0,0,2008,2004,1,0,0,0,2008,2005,1,0,0, - 0,2008,2006,1,0,0,0,2008,2007,1,0,0,0,2009,233,1,0,0,0,2010,2011,7,6, - 0,0,2011,235,1,0,0,0,2012,2014,5,6,0,0,2013,2015,5,147,0,0,2014,2013, - 1,0,0,0,2014,2015,1,0,0,0,2015,2029,1,0,0,0,2016,2018,3,184,92,0,2017, - 2019,5,147,0,0,2018,2017,1,0,0,0,2018,2019,1,0,0,0,2019,2026,1,0,0,0, - 2020,2022,3,238,119,0,2021,2023,5,147,0,0,2022,2021,1,0,0,0,2022,2023, - 1,0,0,0,2023,2025,1,0,0,0,2024,2020,1,0,0,0,2025,2028,1,0,0,0,2026,2024, - 1,0,0,0,2026,2027,1,0,0,0,2027,2030,1,0,0,0,2028,2026,1,0,0,0,2029,2016, - 1,0,0,0,2029,2030,1,0,0,0,2030,2031,1,0,0,0,2031,2032,5,7,0,0,2032,237, - 1,0,0,0,2033,2035,5,4,0,0,2034,2036,5,147,0,0,2035,2034,1,0,0,0,2035, - 2036,1,0,0,0,2036,2038,1,0,0,0,2037,2039,3,184,92,0,2038,2037,1,0,0,0, - 2038,2039,1,0,0,0,2039,239,1,0,0,0,2040,2042,5,8,0,0,2041,2043,5,147, - 0,0,2042,2041,1,0,0,0,2042,2043,1,0,0,0,2043,2044,1,0,0,0,2044,2046,3, - 242,121,0,2045,2047,5,147,0,0,2046,2045,1,0,0,0,2046,2047,1,0,0,0,2047, - 2058,1,0,0,0,2048,2050,5,4,0,0,2049,2051,5,147,0,0,2050,2049,1,0,0,0, - 2050,2051,1,0,0,0,2051,2052,1,0,0,0,2052,2054,3,242,121,0,2053,2055,5, - 147,0,0,2054,2053,1,0,0,0,2054,2055,1,0,0,0,2055,2057,1,0,0,0,2056,2048, - 1,0,0,0,2057,2060,1,0,0,0,2058,2056,1,0,0,0,2058,2059,1,0,0,0,2059,2061, - 1,0,0,0,2060,2058,1,0,0,0,2061,2062,5,9,0,0,2062,241,1,0,0,0,2063,2066, - 3,280,140,0,2064,2066,5,133,0,0,2065,2063,1,0,0,0,2065,2064,1,0,0,0,2066, - 2068,1,0,0,0,2067,2069,5,147,0,0,2068,2067,1,0,0,0,2068,2069,1,0,0,0, - 2069,2070,1,0,0,0,2070,2072,5,117,0,0,2071,2073,5,147,0,0,2072,2071,1, - 0,0,0,2072,2073,1,0,0,0,2073,2074,1,0,0,0,2074,2075,3,184,92,0,2075,243, - 1,0,0,0,2076,2078,5,2,0,0,2077,2079,5,147,0,0,2078,2077,1,0,0,0,2078, - 2079,1,0,0,0,2079,2080,1,0,0,0,2080,2082,3,184,92,0,2081,2083,5,147,0, - 0,2082,2081,1,0,0,0,2082,2083,1,0,0,0,2083,2084,1,0,0,0,2084,2085,5,3, - 0,0,2085,245,1,0,0,0,2086,2088,5,126,0,0,2087,2089,5,147,0,0,2088,2087, - 1,0,0,0,2088,2089,1,0,0,0,2089,2090,1,0,0,0,2090,2092,5,2,0,0,2091,2093, - 5,147,0,0,2092,2091,1,0,0,0,2092,2093,1,0,0,0,2093,2094,1,0,0,0,2094, - 2096,5,98,0,0,2095,2097,5,147,0,0,2096,2095,1,0,0,0,2096,2097,1,0,0,0, - 2097,2098,1,0,0,0,2098,2135,5,3,0,0,2099,2101,3,248,124,0,2100,2102,5, - 147,0,0,2101,2100,1,0,0,0,2101,2102,1,0,0,0,2102,2103,1,0,0,0,2103,2105, - 5,2,0,0,2104,2106,5,147,0,0,2105,2104,1,0,0,0,2105,2106,1,0,0,0,2106, - 2111,1,0,0,0,2107,2109,5,97,0,0,2108,2110,5,147,0,0,2109,2108,1,0,0,0, - 2109,2110,1,0,0,0,2110,2112,1,0,0,0,2111,2107,1,0,0,0,2111,2112,1,0,0, - 0,2112,2130,1,0,0,0,2113,2115,3,250,125,0,2114,2116,5,147,0,0,2115,2114, - 1,0,0,0,2115,2116,1,0,0,0,2116,2127,1,0,0,0,2117,2119,5,4,0,0,2118,2120, - 5,147,0,0,2119,2118,1,0,0,0,2119,2120,1,0,0,0,2120,2121,1,0,0,0,2121, - 2123,3,250,125,0,2122,2124,5,147,0,0,2123,2122,1,0,0,0,2123,2124,1,0, - 0,0,2124,2126,1,0,0,0,2125,2117,1,0,0,0,2126,2129,1,0,0,0,2127,2125,1, - 0,0,0,2127,2128,1,0,0,0,2128,2131,1,0,0,0,2129,2127,1,0,0,0,2130,2113, - 1,0,0,0,2130,2131,1,0,0,0,2131,2132,1,0,0,0,2132,2133,5,3,0,0,2133,2135, - 1,0,0,0,2134,2086,1,0,0,0,2134,2099,1,0,0,0,2135,247,1,0,0,0,2136,2137, - 3,280,140,0,2137,249,1,0,0,0,2138,2140,3,280,140,0,2139,2141,5,147,0, - 0,2140,2139,1,0,0,0,2140,2141,1,0,0,0,2141,2142,1,0,0,0,2142,2143,5,117, - 0,0,2143,2145,5,5,0,0,2144,2146,5,147,0,0,2145,2144,1,0,0,0,2145,2146, - 1,0,0,0,2146,2148,1,0,0,0,2147,2138,1,0,0,0,2147,2148,1,0,0,0,2148,2149, - 1,0,0,0,2149,2150,3,184,92,0,2150,251,1,0,0,0,2151,2156,3,152,76,0,2152, - 2154,5,147,0,0,2153,2152,1,0,0,0,2153,2154,1,0,0,0,2154,2155,1,0,0,0, - 2155,2157,3,154,77,0,2156,2153,1,0,0,0,2157,2158,1,0,0,0,2158,2156,1, - 0,0,0,2158,2159,1,0,0,0,2159,253,1,0,0,0,2160,2162,5,127,0,0,2161,2163, - 5,147,0,0,2162,2161,1,0,0,0,2162,2163,1,0,0,0,2163,2164,1,0,0,0,2164, - 2166,5,8,0,0,2165,2167,5,147,0,0,2166,2165,1,0,0,0,2166,2167,1,0,0,0, - 2167,2168,1,0,0,0,2168,2170,5,87,0,0,2169,2171,5,147,0,0,2170,2169,1, - 0,0,0,2170,2171,1,0,0,0,2171,2172,1,0,0,0,2172,2177,3,144,72,0,2173,2175, - 5,147,0,0,2174,2173,1,0,0,0,2174,2175,1,0,0,0,2175,2176,1,0,0,0,2176, - 2178,3,142,71,0,2177,2174,1,0,0,0,2177,2178,1,0,0,0,2178,2180,1,0,0,0, - 2179,2181,5,147,0,0,2180,2179,1,0,0,0,2180,2181,1,0,0,0,2181,2182,1,0, - 0,0,2182,2183,5,9,0,0,2183,255,1,0,0,0,2184,2186,5,126,0,0,2185,2187, - 5,147,0,0,2186,2185,1,0,0,0,2186,2187,1,0,0,0,2187,2188,1,0,0,0,2188, - 2190,5,8,0,0,2189,2191,5,147,0,0,2190,2189,1,0,0,0,2190,2191,1,0,0,0, - 2191,2192,1,0,0,0,2192,2194,5,87,0,0,2193,2195,5,147,0,0,2194,2193,1, - 0,0,0,2194,2195,1,0,0,0,2195,2196,1,0,0,0,2196,2201,3,144,72,0,2197,2199, - 5,147,0,0,2198,2197,1,0,0,0,2198,2199,1,0,0,0,2199,2200,1,0,0,0,2200, - 2202,3,142,71,0,2201,2198,1,0,0,0,2201,2202,1,0,0,0,2202,2204,1,0,0,0, - 2203,2205,5,147,0,0,2204,2203,1,0,0,0,2204,2205,1,0,0,0,2205,2206,1,0, - 0,0,2206,2207,5,9,0,0,2207,257,1,0,0,0,2208,2210,5,25,0,0,2209,2211,5, - 147,0,0,2210,2209,1,0,0,0,2210,2211,1,0,0,0,2211,2214,1,0,0,0,2212,2215, - 3,272,136,0,2213,2215,5,98,0,0,2214,2212,1,0,0,0,2214,2213,1,0,0,0,2215, - 259,1,0,0,0,2216,2221,5,128,0,0,2217,2219,5,147,0,0,2218,2217,1,0,0,0, - 2218,2219,1,0,0,0,2219,2220,1,0,0,0,2220,2222,3,262,131,0,2221,2218,1, - 0,0,0,2222,2223,1,0,0,0,2223,2221,1,0,0,0,2223,2224,1,0,0,0,2224,2239, - 1,0,0,0,2225,2227,5,128,0,0,2226,2228,5,147,0,0,2227,2226,1,0,0,0,2227, - 2228,1,0,0,0,2228,2229,1,0,0,0,2229,2234,3,184,92,0,2230,2232,5,147,0, - 0,2231,2230,1,0,0,0,2231,2232,1,0,0,0,2232,2233,1,0,0,0,2233,2235,3,262, - 131,0,2234,2231,1,0,0,0,2235,2236,1,0,0,0,2236,2234,1,0,0,0,2236,2237, - 1,0,0,0,2237,2239,1,0,0,0,2238,2216,1,0,0,0,2238,2225,1,0,0,0,2239,2248, - 1,0,0,0,2240,2242,5,147,0,0,2241,2240,1,0,0,0,2241,2242,1,0,0,0,2242, - 2243,1,0,0,0,2243,2245,5,129,0,0,2244,2246,5,147,0,0,2245,2244,1,0,0, - 0,2245,2246,1,0,0,0,2246,2247,1,0,0,0,2247,2249,3,184,92,0,2248,2241, - 1,0,0,0,2248,2249,1,0,0,0,2249,2251,1,0,0,0,2250,2252,5,147,0,0,2251, - 2250,1,0,0,0,2251,2252,1,0,0,0,2252,2253,1,0,0,0,2253,2254,5,130,0,0, - 2254,261,1,0,0,0,2255,2257,5,131,0,0,2256,2258,5,147,0,0,2257,2256,1, - 0,0,0,2257,2258,1,0,0,0,2258,2259,1,0,0,0,2259,2261,3,184,92,0,2260,2262, - 5,147,0,0,2261,2260,1,0,0,0,2261,2262,1,0,0,0,2262,2263,1,0,0,0,2263, - 2265,5,132,0,0,2264,2266,5,147,0,0,2265,2264,1,0,0,0,2265,2266,1,0,0, - 0,2266,2267,1,0,0,0,2267,2268,3,184,92,0,2268,263,1,0,0,0,2269,2270,3, - 280,140,0,2270,265,1,0,0,0,2271,2274,3,276,138,0,2272,2274,3,274,137, - 0,2273,2271,1,0,0,0,2273,2272,1,0,0,0,2274,267,1,0,0,0,2275,2278,5,26, - 0,0,2276,2279,3,280,140,0,2277,2279,5,135,0,0,2278,2276,1,0,0,0,2278, - 2277,1,0,0,0,2279,269,1,0,0,0,2280,2282,3,230,115,0,2281,2283,5,147,0, - 0,2282,2281,1,0,0,0,2282,2283,1,0,0,0,2283,2284,1,0,0,0,2284,2285,3,258, - 129,0,2285,271,1,0,0,0,2286,2287,3,278,139,0,2287,273,1,0,0,0,2288,2289, - 5,135,0,0,2289,275,1,0,0,0,2290,2291,5,142,0,0,2291,277,1,0,0,0,2292, - 2293,3,280,140,0,2293,279,1,0,0,0,2294,2300,5,143,0,0,2295,2296,5,146, - 0,0,2296,2300,6,140,-1,0,2297,2300,5,136,0,0,2298,2300,3,282,141,0,2299, - 2294,1,0,0,0,2299,2295,1,0,0,0,2299,2297,1,0,0,0,2299,2298,1,0,0,0,2300, - 281,1,0,0,0,2301,2302,7,7,0,0,2302,283,1,0,0,0,2303,2304,7,8,0,0,2304, - 285,1,0,0,0,2305,2306,7,9,0,0,2306,287,1,0,0,0,2307,2308,7,10,0,0,2308, - 289,1,0,0,0,401,292,296,301,305,310,313,317,320,334,340,344,348,352,355, - 361,364,368,372,376,380,384,389,400,404,408,413,426,430,438,442,446,450, - 458,462,466,470,482,486,508,512,515,518,521,524,528,533,537,547,551,556, - 561,566,572,576,580,585,592,596,600,603,607,611,616,621,625,635,645,649, - 653,657,662,674,678,682,686,690,692,696,700,702,716,720,724,728,733,736, - 740,744,746,750,754,756,792,803,825,829,834,845,849,853,861,865,869,875, - 879,883,889,893,897,901,905,909,915,922,927,933,953,957,965,975,980,985, - 989,994,1000,1005,1008,1012,1016,1020,1026,1030,1035,1040,1044,1047,1051, - 1055,1059,1063,1067,1073,1077,1082,1086,1095,1101,1109,1113,1117,1121, - 1128,1132,1136,1140,1143,1146,1149,1155,1158,1162,1166,1170,1173,1177, - 1187,1193,1200,1213,1217,1221,1225,1230,1235,1239,1245,1249,1253,1257, - 1262,1268,1271,1277,1280,1286,1290,1294,1298,1302,1307,1312,1316,1321, - 1324,1333,1342,1347,1360,1363,1371,1375,1380,1385,1389,1394,1400,1405, - 1412,1416,1420,1422,1426,1428,1432,1434,1440,1446,1450,1453,1456,1462, - 1465,1468,1472,1478,1481,1484,1488,1492,1496,1498,1502,1504,1508,1510, - 1514,1516,1522,1526,1530,1534,1538,1542,1546,1550,1554,1557,1563,1567, - 1571,1574,1579,1584,1589,1594,1600,1606,1609,1612,1615,1619,1622,1625, - 1628,1631,1635,1639,1643,1647,1651,1654,1657,1661,1665,1669,1673,1675, - 1681,1684,1687,1693,1696,1699,1720,1730,1740,1745,1749,1756,1760,1764, - 1768,1772,1780,1784,1788,1792,1798,1802,1808,1812,1817,1822,1826,1831, - 1836,1840,1846,1853,1857,1863,1870,1874,1880,1887,1891,1896,1901,1905, - 1910,1913,1920,1923,1928,1937,1941,1944,1957,1960,1965,1979,1983,1988, - 2000,2008,2014,2018,2022,2026,2029,2035,2038,2042,2046,2050,2054,2058, - 2065,2068,2072,2078,2082,2088,2092,2096,2101,2105,2109,2111,2115,2119, - 2123,2127,2130,2134,2140,2145,2147,2153,2158,2162,2166,2170,2174,2177, - 2180,2186,2190,2194,2198,2201,2204,2210,2214,2218,2223,2227,2231,2236, - 2238,2241,2245,2248,2251,2257,2261,2265,2273,2278,2282,2299 + 7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,1,0, + 1,0,3,0,295,8,0,1,0,1,0,3,0,299,8,0,1,0,5,0,302,8,0,10,0,12,0,305,9,0, + 1,0,3,0,308,8,0,1,0,1,0,1,1,3,1,313,8,1,1,1,3,1,316,8,1,1,1,1,1,3,1,320, + 8,1,1,1,3,1,323,8,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3, + 2,337,8,2,1,3,1,3,1,3,1,3,3,3,343,8,3,1,3,1,3,3,3,347,8,3,1,3,3,3,350, + 8,3,1,3,1,3,1,3,1,3,3,3,356,8,3,1,3,3,3,359,8,3,1,4,1,4,3,4,363,8,4,1, + 4,1,4,3,4,367,8,4,1,4,1,4,3,4,371,8,4,1,4,5,4,374,8,4,10,4,12,4,377,9, + 4,1,4,3,4,380,8,4,1,4,1,4,1,5,1,5,1,5,3,5,387,8,5,1,5,1,5,3,5,391,8,5, + 1,5,1,5,1,5,3,5,396,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,406,8,6,1, + 6,1,6,3,6,410,8,6,1,6,1,6,3,6,414,8,6,1,6,5,6,417,8,6,10,6,12,6,420,9, + 6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,3,7,432,8,7,1,7,1,7,3,7,436, + 8,7,1,7,1,7,1,7,1,7,1,7,1,7,3,7,444,8,7,1,7,3,7,447,8,7,1,8,1,8,1,8,1, + 8,1,8,1,8,3,8,455,8,8,1,8,3,8,458,8,8,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1, + 10,1,10,1,10,3,10,470,8,10,1,10,1,10,3,10,474,8,10,1,10,1,10,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12, + 1,12,1,12,3,12,496,8,12,1,12,1,12,3,12,500,8,12,1,12,3,12,503,8,12,1, + 12,3,12,506,8,12,1,12,3,12,509,8,12,1,12,3,12,512,8,12,1,12,1,12,3,12, + 516,8,12,1,12,5,12,519,8,12,10,12,12,12,522,9,12,1,12,3,12,525,8,12,1, + 12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,3,13,535,8,13,1,13,1,13,3,13,539, + 8,13,1,13,5,13,542,8,13,10,13,12,13,545,9,13,1,14,1,14,3,14,549,8,14, + 1,14,1,14,1,14,3,14,554,8,14,1,14,1,14,1,15,1,15,3,15,560,8,15,1,15,1, + 15,3,15,564,8,15,1,15,1,15,3,15,568,8,15,1,15,5,15,571,8,15,10,15,12, + 15,574,9,15,1,15,1,15,1,15,1,15,3,15,580,8,15,1,15,1,15,3,15,584,8,15, + 1,15,1,15,3,15,588,8,15,1,15,3,15,591,8,15,1,16,1,16,3,16,595,8,16,1, + 16,1,16,3,16,599,8,16,1,16,1,16,3,16,603,8,16,1,16,5,16,606,8,16,10,16, + 12,16,609,9,16,1,16,3,16,612,8,16,1,16,1,16,1,17,1,17,3,17,618,8,17,1, + 17,1,17,3,17,622,8,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,3,18,632, + 8,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,642,8,19,1,19,1,19, + 3,19,646,8,19,1,19,1,19,3,19,650,8,19,1,19,1,19,3,19,654,8,19,1,19,1, + 19,1,19,3,19,659,8,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,3,20,671,8,20,1,20,1,20,3,20,675,8,20,1,20,1,20,3,20,679,8,20,1,20, + 1,20,3,20,683,8,20,1,20,1,20,3,20,687,8,20,3,20,689,8,20,1,20,1,20,3, + 20,693,8,20,1,20,1,20,3,20,697,8,20,3,20,699,8,20,1,20,1,20,1,21,1,21, + 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,713,8,21,1,21,1,21,3,21, + 717,8,21,1,21,1,21,3,21,721,8,21,1,21,1,21,3,21,725,8,21,1,21,4,21,728, + 8,21,11,21,12,21,729,1,21,3,21,733,8,21,1,21,1,21,3,21,737,8,21,1,21, + 1,21,3,21,741,8,21,3,21,743,8,21,1,21,1,21,3,21,747,8,21,1,21,1,21,3, + 21,751,8,21,3,21,753,8,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,25, + 1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,3,26,789,8,26, + 1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,3,27,800,8,27,1,28,1,28, + 1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30, + 1,30,1,30,1,31,1,31,3,31,822,8,31,1,31,1,31,3,31,826,8,31,1,31,5,31,829, + 8,31,10,31,12,31,832,9,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,3,33, + 842,8,33,1,33,1,33,3,33,846,8,33,1,33,1,33,3,33,850,8,33,1,33,1,33,1, + 34,1,34,1,34,1,34,3,34,858,8,34,1,34,1,34,3,34,862,8,34,1,34,1,34,3,34, + 866,8,34,1,34,1,34,1,34,1,34,3,34,872,8,34,1,34,1,34,3,34,876,8,34,1, + 34,1,34,3,34,880,8,34,1,34,1,34,1,34,1,34,3,34,886,8,34,1,34,1,34,3,34, + 890,8,34,1,34,1,34,3,34,894,8,34,1,34,1,34,3,34,898,8,34,1,34,1,34,3, + 34,902,8,34,1,34,1,34,3,34,906,8,34,1,34,1,34,5,34,910,8,34,10,34,12, + 34,913,9,34,1,35,1,35,5,35,917,8,35,10,35,12,35,920,9,35,1,36,1,36,3, + 36,924,8,36,1,36,1,36,1,37,1,37,3,37,930,8,37,1,38,1,38,1,39,1,39,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40, + 950,8,40,1,41,1,41,3,41,954,8,41,1,42,1,42,1,42,1,42,1,42,1,42,3,42,962, + 8,42,1,43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,3,45,972,8,45,1,45,5,45, + 975,8,45,10,45,12,45,978,9,45,1,45,1,45,3,45,982,8,45,4,45,984,8,45,11, + 45,12,45,985,1,45,1,45,1,45,3,45,991,8,45,1,46,1,46,1,46,1,46,3,46,997, + 8,46,1,46,1,46,1,46,3,46,1002,8,46,1,46,3,46,1005,8,46,1,47,1,47,3,47, + 1009,8,47,1,48,1,48,3,48,1013,8,48,5,48,1015,8,48,10,48,12,48,1018,9, + 48,1,48,1,48,1,48,3,48,1023,8,48,5,48,1025,8,48,10,48,12,48,1028,9,48, + 1,48,1,48,3,48,1032,8,48,1,48,5,48,1035,8,48,10,48,12,48,1038,9,48,1, + 48,3,48,1041,8,48,1,48,3,48,1044,8,48,1,48,1,48,3,48,1048,8,48,4,48,1050, + 8,48,11,48,12,48,1051,1,48,1,48,3,48,1056,8,48,1,49,1,49,3,49,1060,8, + 49,4,49,1062,8,49,11,49,12,49,1063,1,49,1,49,1,50,1,50,3,50,1070,8,50, + 5,50,1072,8,50,10,50,12,50,1075,9,50,1,50,1,50,3,50,1079,8,50,5,50,1081, + 8,50,10,50,12,50,1084,9,50,1,50,1,50,1,51,1,51,1,51,1,51,3,51,1092,8, + 51,1,52,1,52,1,52,1,52,3,52,1098,8,52,1,53,1,53,1,53,1,53,1,53,1,53,3, + 53,1106,8,53,1,53,1,53,3,53,1110,8,53,1,53,1,53,3,53,1114,8,53,1,53,1, + 53,3,53,1118,8,53,1,53,1,53,1,53,1,53,1,53,3,53,1125,8,53,1,53,3,53,1128, + 8,53,1,53,3,53,1131,8,53,1,53,3,53,1134,8,53,1,54,1,54,1,54,1,54,3,54, + 1140,8,54,1,54,3,54,1143,8,54,1,55,1,55,3,55,1147,8,55,1,55,1,55,3,55, + 1151,8,55,1,55,1,55,3,55,1155,8,55,1,55,3,55,1158,8,55,1,56,1,56,3,56, + 1162,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,3,57,1172,8,57,1,57, + 1,57,1,58,1,58,3,58,1178,8,58,1,58,1,58,1,58,5,58,1183,8,58,10,58,12, + 58,1186,9,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1198, + 8,59,1,60,1,60,3,60,1202,8,60,1,60,1,60,3,60,1206,8,60,1,60,1,60,3,60, + 1210,8,60,1,60,5,60,1213,8,60,10,60,12,60,1216,9,60,1,61,1,61,3,61,1220, + 8,61,1,61,1,61,3,61,1224,8,61,1,61,1,61,1,62,1,62,3,62,1230,8,62,1,62, + 1,62,3,62,1234,8,62,1,62,1,62,3,62,1238,8,62,1,62,1,62,3,62,1242,8,62, + 1,62,5,62,1245,8,62,10,62,12,62,1248,9,62,1,63,1,63,1,63,3,63,1253,8, + 63,1,63,3,63,1256,8,63,1,64,1,64,1,64,1,65,3,65,1262,8,65,1,65,3,65,1265, + 8,65,1,65,1,65,1,65,1,65,3,65,1271,8,65,1,65,1,65,3,65,1275,8,65,1,65, + 1,65,3,65,1279,8,65,1,66,1,66,3,66,1283,8,66,1,66,1,66,3,66,1287,8,66, + 1,66,5,66,1290,8,66,10,66,12,66,1293,9,66,1,66,1,66,3,66,1297,8,66,1, + 66,1,66,3,66,1301,8,66,1,66,5,66,1304,8,66,10,66,12,66,1307,9,66,3,66, + 1309,8,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1318,8,67,1,68,1,68, + 1,68,1,68,1,68,1,68,1,68,3,68,1327,8,68,1,68,5,68,1330,8,68,10,68,12, + 68,1333,9,68,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71,1,71,3,71,1345, + 8,71,1,71,3,71,1348,8,71,1,72,1,72,1,72,1,72,1,73,1,73,3,73,1356,8,73, + 1,73,1,73,3,73,1360,8,73,1,73,5,73,1363,8,73,10,73,12,73,1366,9,73,1, + 74,1,74,3,74,1370,8,74,1,74,1,74,3,74,1374,8,74,1,74,1,74,1,74,3,74,1379, + 8,74,1,75,1,75,1,76,1,76,3,76,1385,8,76,1,76,5,76,1388,8,76,10,76,12, + 76,1391,9,76,1,76,1,76,1,76,1,76,3,76,1397,8,76,1,77,1,77,3,77,1401,8, + 77,1,77,1,77,3,77,1405,8,77,3,77,1407,8,77,1,77,1,77,3,77,1411,8,77,3, + 77,1413,8,77,1,77,1,77,3,77,1417,8,77,3,77,1419,8,77,1,77,1,77,1,78,1, + 78,3,78,1425,8,78,1,78,1,78,1,79,1,79,3,79,1431,8,79,1,79,1,79,3,79,1435, + 8,79,1,79,3,79,1438,8,79,1,79,3,79,1441,8,79,1,79,1,79,1,79,1,79,3,79, + 1447,8,79,1,79,3,79,1450,8,79,1,79,3,79,1453,8,79,1,79,1,79,3,79,1457, + 8,79,1,79,1,79,1,79,1,79,3,79,1463,8,79,1,79,3,79,1466,8,79,1,79,3,79, + 1469,8,79,1,79,1,79,3,79,1473,8,79,1,80,1,80,3,80,1477,8,80,1,80,1,80, + 3,80,1481,8,80,3,80,1483,8,80,1,80,1,80,3,80,1487,8,80,3,80,1489,8,80, + 1,80,1,80,3,80,1493,8,80,3,80,1495,8,80,1,80,1,80,3,80,1499,8,80,3,80, + 1501,8,80,1,80,1,80,1,81,1,81,3,81,1507,8,81,1,81,1,81,3,81,1511,8,81, + 1,81,1,81,3,81,1515,8,81,1,81,1,81,3,81,1519,8,81,1,81,1,81,3,81,1523, + 8,81,1,81,1,81,3,81,1527,8,81,1,81,1,81,3,81,1531,8,81,1,81,1,81,3,81, + 1535,8,81,5,81,1537,8,81,10,81,12,81,1540,9,81,3,81,1542,8,81,1,81,1, + 81,1,82,1,82,3,82,1548,8,82,1,82,1,82,3,82,1552,8,82,1,82,1,82,3,82,1556, + 8,82,1,82,3,82,1559,8,82,1,82,5,82,1562,8,82,10,82,12,82,1565,9,82,1, + 83,1,83,3,83,1569,8,83,1,83,5,83,1572,8,83,10,83,12,83,1575,9,83,1,84, + 1,84,3,84,1579,8,84,1,84,1,84,1,85,1,85,3,85,1585,8,85,1,85,1,85,1,85, + 1,85,3,85,1591,8,85,1,85,3,85,1594,8,85,1,85,3,85,1597,8,85,1,85,3,85, + 1600,8,85,1,85,1,85,3,85,1604,8,85,1,85,3,85,1607,8,85,1,85,3,85,1610, + 8,85,1,85,3,85,1613,8,85,1,85,3,85,1616,8,85,1,86,1,86,3,86,1620,8,86, + 1,86,1,86,3,86,1624,8,86,1,86,1,86,3,86,1628,8,86,1,86,1,86,3,86,1632, + 8,86,1,86,1,86,3,86,1636,8,86,1,86,3,86,1639,8,86,1,86,3,86,1642,8,86, + 1,86,1,86,3,86,1646,8,86,1,86,1,86,3,86,1650,8,86,1,86,1,86,3,86,1654, + 8,86,1,86,1,86,3,86,1658,8,86,3,86,1660,8,86,1,86,1,86,1,87,1,87,3,87, + 1666,8,87,1,87,3,87,1669,8,87,1,87,3,87,1672,8,87,1,87,1,87,1,88,1,88, + 3,88,1678,8,88,1,88,3,88,1681,8,88,1,88,3,88,1684,8,88,1,88,1,88,1,89, + 1,89,1,90,1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,94,1,94,1,94, + 5,94,1703,8,94,10,94,12,94,1706,9,94,1,95,1,95,1,95,1,95,1,95,5,95,1713, + 8,95,10,95,12,95,1716,9,95,1,96,1,96,1,96,1,96,1,96,5,96,1723,8,96,10, + 96,12,96,1726,9,96,1,97,1,97,3,97,1730,8,97,5,97,1732,8,97,10,97,12,97, + 1735,9,97,1,97,1,97,1,98,1,98,3,98,1741,8,98,1,98,1,98,3,98,1745,8,98, + 1,98,1,98,3,98,1749,8,98,1,98,1,98,3,98,1753,8,98,1,98,1,98,3,98,1757, + 8,98,1,98,1,98,1,98,1,98,1,98,1,98,3,98,1765,8,98,1,98,1,98,3,98,1769, + 8,98,1,98,1,98,3,98,1773,8,98,1,98,1,98,3,98,1777,8,98,1,98,1,98,4,98, + 1781,8,98,11,98,12,98,1782,1,98,1,98,3,98,1787,8,98,1,99,1,99,1,100,1, + 100,3,100,1793,8,100,1,100,1,100,3,100,1797,8,100,1,100,5,100,1800,8, + 100,10,100,12,100,1803,9,100,1,101,1,101,3,101,1807,8,101,1,101,1,101, + 3,101,1811,8,101,1,101,5,101,1814,8,101,10,101,12,101,1817,9,101,1,102, + 1,102,3,102,1821,8,102,1,102,1,102,3,102,1825,8,102,1,102,1,102,5,102, + 1829,8,102,10,102,12,102,1832,9,102,1,103,1,103,1,104,1,104,3,104,1838, + 8,104,1,104,1,104,3,104,1842,8,104,1,104,1,104,5,104,1846,8,104,10,104, + 12,104,1849,9,104,1,105,1,105,1,106,1,106,3,106,1855,8,106,1,106,1,106, + 3,106,1859,8,106,1,106,1,106,5,106,1863,8,106,10,106,12,106,1866,9,106, + 1,107,1,107,1,108,1,108,3,108,1872,8,108,1,108,1,108,3,108,1876,8,108, + 1,108,5,108,1879,8,108,10,108,12,108,1882,9,108,1,109,1,109,3,109,1886, + 8,109,5,109,1888,8,109,10,109,12,109,1891,9,109,1,109,1,109,3,109,1895, + 8,109,1,109,3,109,1898,8,109,1,110,1,110,1,110,4,110,1903,8,110,11,110, + 12,110,1904,1,110,3,110,1908,8,110,1,111,1,111,1,111,3,111,1913,8,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,3,111,1922,8,111,1,111,1,111, + 3,111,1926,8,111,1,111,3,111,1929,8,111,1,112,1,112,1,112,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,3,112,1942,8,112,1,112,3,112,1945, + 8,112,1,112,1,112,1,113,3,113,1950,8,113,1,113,1,113,1,114,1,114,1,114, + 1,114,1,114,1,114,1,114,1,114,1,114,1,114,3,114,1964,8,114,1,115,1,115, + 3,115,1968,8,115,1,115,5,115,1971,8,115,10,115,12,115,1974,9,115,1,116, + 1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116,3,116,1985,8,116,1,117, + 1,117,1,117,1,117,1,117,1,117,3,117,1993,8,117,1,118,1,118,1,119,1,119, + 3,119,1999,8,119,1,119,1,119,3,119,2003,8,119,1,119,1,119,3,119,2007, + 8,119,5,119,2009,8,119,10,119,12,119,2012,9,119,3,119,2014,8,119,1,119, + 1,119,1,120,1,120,3,120,2020,8,120,1,120,3,120,2023,8,120,1,121,1,121, + 3,121,2027,8,121,1,121,1,121,3,121,2031,8,121,1,121,1,121,3,121,2035, + 8,121,1,121,1,121,3,121,2039,8,121,5,121,2041,8,121,10,121,12,121,2044, + 9,121,1,121,1,121,1,122,1,122,3,122,2050,8,122,1,122,3,122,2053,8,122, + 1,122,1,122,3,122,2057,8,122,1,122,1,122,1,123,1,123,3,123,2063,8,123, + 1,123,1,123,3,123,2067,8,123,1,123,1,123,1,124,1,124,3,124,2073,8,124, + 1,124,1,124,3,124,2077,8,124,1,124,1,124,3,124,2081,8,124,1,124,1,124, + 1,124,3,124,2086,8,124,1,124,1,124,3,124,2090,8,124,1,124,1,124,3,124, + 2094,8,124,3,124,2096,8,124,1,124,1,124,3,124,2100,8,124,1,124,1,124, + 3,124,2104,8,124,1,124,1,124,3,124,2108,8,124,5,124,2110,8,124,10,124, + 12,124,2113,9,124,3,124,2115,8,124,1,124,1,124,3,124,2119,8,124,1,125, + 1,125,1,126,1,126,3,126,2125,8,126,1,126,1,126,1,126,3,126,2130,8,126, + 3,126,2132,8,126,1,126,1,126,1,127,1,127,3,127,2138,8,127,1,127,4,127, + 2141,8,127,11,127,12,127,2142,1,128,1,128,3,128,2147,8,128,1,128,1,128, + 3,128,2151,8,128,1,128,1,128,3,128,2155,8,128,1,128,1,128,3,128,2159, + 8,128,1,128,3,128,2162,8,128,1,128,3,128,2165,8,128,1,128,1,128,1,129, + 1,129,3,129,2171,8,129,1,129,1,129,3,129,2175,8,129,1,129,1,129,3,129, + 2179,8,129,1,129,1,129,3,129,2183,8,129,1,129,3,129,2186,8,129,1,129, + 3,129,2189,8,129,1,129,1,129,1,130,1,130,3,130,2195,8,130,1,130,1,130, + 3,130,2199,8,130,1,131,1,131,3,131,2203,8,131,1,131,4,131,2206,8,131, + 11,131,12,131,2207,1,131,1,131,3,131,2212,8,131,1,131,1,131,3,131,2216, + 8,131,1,131,4,131,2219,8,131,11,131,12,131,2220,3,131,2223,8,131,1,131, + 3,131,2226,8,131,1,131,1,131,3,131,2230,8,131,1,131,3,131,2233,8,131, + 1,131,3,131,2236,8,131,1,131,1,131,1,132,1,132,3,132,2242,8,132,1,132, + 1,132,3,132,2246,8,132,1,132,1,132,3,132,2250,8,132,1,132,1,132,1,133, + 1,133,1,134,1,134,3,134,2258,8,134,1,135,1,135,1,135,3,135,2263,8,135, + 1,136,1,136,3,136,2267,8,136,1,136,1,136,1,137,1,137,1,138,1,138,1,139, + 1,139,1,140,1,140,1,141,1,141,1,141,1,141,1,141,3,141,2284,8,141,1,142, + 1,142,1,143,1,143,1,144,1,144,1,145,1,145,1,145,0,1,68,146,0,2,4,6,8, + 10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54, + 56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100, + 102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136, + 138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172, + 174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208, + 210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244, + 246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280, + 282,284,286,288,290,0,11,2,0,57,57,59,59,1,0,104,107,2,0,5,5,12,16,1, + 0,18,19,2,0,20,20,115,115,2,0,21,22,98,98,1,0,124,125,7,0,47,47,53,56, + 67,67,71,71,118,118,126,126,130,130,2,0,13,13,27,30,2,0,15,15,31,34,2, + 0,35,45,115,115,2594,0,292,1,0,0,0,2,312,1,0,0,0,4,336,1,0,0,0,6,338, + 1,0,0,0,8,360,1,0,0,0,10,395,1,0,0,0,12,397,1,0,0,0,14,427,1,0,0,0,16, + 448,1,0,0,0,18,459,1,0,0,0,20,465,1,0,0,0,22,477,1,0,0,0,24,489,1,0,0, + 0,26,532,1,0,0,0,28,546,1,0,0,0,30,590,1,0,0,0,32,592,1,0,0,0,34,615, + 1,0,0,0,36,631,1,0,0,0,38,633,1,0,0,0,40,662,1,0,0,0,42,702,1,0,0,0,44, + 756,1,0,0,0,46,764,1,0,0,0,48,770,1,0,0,0,50,776,1,0,0,0,52,788,1,0,0, + 0,54,790,1,0,0,0,56,801,1,0,0,0,58,805,1,0,0,0,60,811,1,0,0,0,62,819, + 1,0,0,0,64,833,1,0,0,0,66,837,1,0,0,0,68,905,1,0,0,0,70,914,1,0,0,0,72, + 921,1,0,0,0,74,929,1,0,0,0,76,931,1,0,0,0,78,933,1,0,0,0,80,949,1,0,0, + 0,82,953,1,0,0,0,84,955,1,0,0,0,86,963,1,0,0,0,88,967,1,0,0,0,90,990, + 1,0,0,0,92,1004,1,0,0,0,94,1008,1,0,0,0,96,1055,1,0,0,0,98,1061,1,0,0, + 0,100,1073,1,0,0,0,102,1091,1,0,0,0,104,1097,1,0,0,0,106,1099,1,0,0,0, + 108,1135,1,0,0,0,110,1146,1,0,0,0,112,1159,1,0,0,0,114,1169,1,0,0,0,116, + 1175,1,0,0,0,118,1197,1,0,0,0,120,1199,1,0,0,0,122,1217,1,0,0,0,124,1229, + 1,0,0,0,126,1249,1,0,0,0,128,1257,1,0,0,0,130,1264,1,0,0,0,132,1308,1, + 0,0,0,134,1317,1,0,0,0,136,1319,1,0,0,0,138,1334,1,0,0,0,140,1338,1,0, + 0,0,142,1342,1,0,0,0,144,1349,1,0,0,0,146,1353,1,0,0,0,148,1378,1,0,0, + 0,150,1380,1,0,0,0,152,1396,1,0,0,0,154,1398,1,0,0,0,156,1422,1,0,0,0, + 158,1472,1,0,0,0,160,1474,1,0,0,0,162,1504,1,0,0,0,164,1545,1,0,0,0,166, + 1566,1,0,0,0,168,1576,1,0,0,0,170,1582,1,0,0,0,172,1617,1,0,0,0,174,1663, + 1,0,0,0,176,1675,1,0,0,0,178,1687,1,0,0,0,180,1689,1,0,0,0,182,1691,1, + 0,0,0,184,1693,1,0,0,0,186,1695,1,0,0,0,188,1697,1,0,0,0,190,1707,1,0, + 0,0,192,1717,1,0,0,0,194,1733,1,0,0,0,196,1786,1,0,0,0,198,1788,1,0,0, + 0,200,1790,1,0,0,0,202,1804,1,0,0,0,204,1818,1,0,0,0,206,1833,1,0,0,0, + 208,1835,1,0,0,0,210,1850,1,0,0,0,212,1852,1,0,0,0,214,1867,1,0,0,0,216, + 1869,1,0,0,0,218,1889,1,0,0,0,220,1899,1,0,0,0,222,1928,1,0,0,0,224,1941, + 1,0,0,0,226,1949,1,0,0,0,228,1963,1,0,0,0,230,1965,1,0,0,0,232,1984,1, + 0,0,0,234,1992,1,0,0,0,236,1994,1,0,0,0,238,1996,1,0,0,0,240,2017,1,0, + 0,0,242,2024,1,0,0,0,244,2049,1,0,0,0,246,2060,1,0,0,0,248,2118,1,0,0, + 0,250,2120,1,0,0,0,252,2131,1,0,0,0,254,2135,1,0,0,0,256,2144,1,0,0,0, + 258,2168,1,0,0,0,260,2192,1,0,0,0,262,2222,1,0,0,0,264,2239,1,0,0,0,266, + 2253,1,0,0,0,268,2257,1,0,0,0,270,2259,1,0,0,0,272,2264,1,0,0,0,274,2270, + 1,0,0,0,276,2272,1,0,0,0,278,2274,1,0,0,0,280,2276,1,0,0,0,282,2283,1, + 0,0,0,284,2285,1,0,0,0,286,2287,1,0,0,0,288,2289,1,0,0,0,290,2291,1,0, + 0,0,292,303,3,2,1,0,293,295,5,147,0,0,294,293,1,0,0,0,294,295,1,0,0,0, + 295,296,1,0,0,0,296,298,5,1,0,0,297,299,5,147,0,0,298,297,1,0,0,0,298, + 299,1,0,0,0,299,300,1,0,0,0,300,302,3,2,1,0,301,294,1,0,0,0,302,305,1, + 0,0,0,303,301,1,0,0,0,303,304,1,0,0,0,304,307,1,0,0,0,305,303,1,0,0,0, + 306,308,5,147,0,0,307,306,1,0,0,0,307,308,1,0,0,0,308,309,1,0,0,0,309, + 310,5,0,0,1,310,1,1,0,0,0,311,313,3,74,37,0,312,311,1,0,0,0,312,313,1, + 0,0,0,313,315,1,0,0,0,314,316,5,147,0,0,315,314,1,0,0,0,315,316,1,0,0, + 0,316,317,1,0,0,0,317,322,3,4,2,0,318,320,5,147,0,0,319,318,1,0,0,0,319, + 320,1,0,0,0,320,321,1,0,0,0,321,323,5,1,0,0,322,319,1,0,0,0,322,323,1, + 0,0,0,323,3,1,0,0,0,324,337,3,88,44,0,325,337,3,36,18,0,326,337,3,6,3, + 0,327,337,3,12,6,0,328,337,3,14,7,0,329,337,3,20,10,0,330,337,3,24,12, + 0,331,337,3,22,11,0,332,337,3,80,40,0,333,337,3,82,41,0,334,337,3,16, + 8,0,335,337,3,18,9,0,336,324,1,0,0,0,336,325,1,0,0,0,336,326,1,0,0,0, + 336,327,1,0,0,0,336,328,1,0,0,0,336,329,1,0,0,0,336,330,1,0,0,0,336,331, + 1,0,0,0,336,332,1,0,0,0,336,333,1,0,0,0,336,334,1,0,0,0,336,335,1,0,0, + 0,337,5,1,0,0,0,338,339,5,50,0,0,339,340,5,147,0,0,340,349,3,280,140, + 0,341,343,5,147,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0,0,0,344, + 346,3,8,4,0,345,347,5,147,0,0,346,345,1,0,0,0,346,347,1,0,0,0,347,350, + 1,0,0,0,348,350,5,147,0,0,349,342,1,0,0,0,349,348,1,0,0,0,350,351,1,0, + 0,0,351,352,5,51,0,0,352,353,5,147,0,0,353,358,3,10,5,0,354,356,5,147, + 0,0,355,354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,359,3,32,16,0, + 358,355,1,0,0,0,358,359,1,0,0,0,359,7,1,0,0,0,360,362,5,2,0,0,361,363, + 5,147,0,0,362,361,1,0,0,0,362,363,1,0,0,0,363,364,1,0,0,0,364,375,3,280, + 140,0,365,367,5,147,0,0,366,365,1,0,0,0,366,367,1,0,0,0,367,368,1,0,0, + 0,368,370,5,3,0,0,369,371,5,147,0,0,370,369,1,0,0,0,370,371,1,0,0,0,371, + 372,1,0,0,0,372,374,3,280,140,0,373,366,1,0,0,0,374,377,1,0,0,0,375,373, + 1,0,0,0,375,376,1,0,0,0,376,379,1,0,0,0,377,375,1,0,0,0,378,380,5,147, + 0,0,379,378,1,0,0,0,379,380,1,0,0,0,380,381,1,0,0,0,381,382,5,4,0,0,382, + 9,1,0,0,0,383,396,3,30,15,0,384,386,5,2,0,0,385,387,5,147,0,0,386,385, + 1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388,390,3,88,44,0,389,391,5,147, + 0,0,390,389,1,0,0,0,390,391,1,0,0,0,391,392,1,0,0,0,392,393,5,4,0,0,393, + 396,1,0,0,0,394,396,3,266,133,0,395,383,1,0,0,0,395,384,1,0,0,0,395,394, + 1,0,0,0,396,11,1,0,0,0,397,398,5,50,0,0,398,399,5,147,0,0,399,400,3,280, + 140,0,400,401,5,147,0,0,401,402,5,51,0,0,402,403,5,147,0,0,403,405,5, + 2,0,0,404,406,5,147,0,0,405,404,1,0,0,0,405,406,1,0,0,0,406,407,1,0,0, + 0,407,418,5,133,0,0,408,410,5,147,0,0,409,408,1,0,0,0,409,410,1,0,0,0, + 410,411,1,0,0,0,411,413,5,3,0,0,412,414,5,147,0,0,413,412,1,0,0,0,413, + 414,1,0,0,0,414,415,1,0,0,0,415,417,5,133,0,0,416,409,1,0,0,0,417,420, + 1,0,0,0,418,416,1,0,0,0,418,419,1,0,0,0,419,421,1,0,0,0,420,418,1,0,0, + 0,421,422,5,4,0,0,422,423,5,147,0,0,423,424,5,101,0,0,424,425,5,147,0, + 0,425,426,5,52,0,0,426,13,1,0,0,0,427,428,5,50,0,0,428,429,5,147,0,0, + 429,431,5,2,0,0,430,432,5,147,0,0,431,430,1,0,0,0,431,432,1,0,0,0,432, + 433,1,0,0,0,433,435,3,88,44,0,434,436,5,147,0,0,435,434,1,0,0,0,435,436, + 1,0,0,0,436,437,1,0,0,0,437,438,5,4,0,0,438,439,5,147,0,0,439,440,5,68, + 0,0,440,441,5,147,0,0,441,446,5,133,0,0,442,444,5,147,0,0,443,442,1,0, + 0,0,443,444,1,0,0,0,444,445,1,0,0,0,445,447,3,32,16,0,446,443,1,0,0,0, + 446,447,1,0,0,0,447,15,1,0,0,0,448,449,5,53,0,0,449,450,5,147,0,0,450, + 451,5,55,0,0,451,452,5,147,0,0,452,457,5,133,0,0,453,455,5,147,0,0,454, + 453,1,0,0,0,454,455,1,0,0,0,455,456,1,0,0,0,456,458,3,32,16,0,457,454, + 1,0,0,0,457,458,1,0,0,0,458,17,1,0,0,0,459,460,5,54,0,0,460,461,5,147, + 0,0,461,462,5,55,0,0,462,463,5,147,0,0,463,464,5,133,0,0,464,19,1,0,0, + 0,465,466,5,46,0,0,466,467,5,147,0,0,467,469,3,282,141,0,468,470,5,147, + 0,0,469,468,1,0,0,0,469,470,1,0,0,0,470,471,1,0,0,0,471,473,5,5,0,0,472, + 474,5,147,0,0,473,472,1,0,0,0,473,474,1,0,0,0,474,475,1,0,0,0,475,476, + 3,234,117,0,476,21,1,0,0,0,477,478,5,47,0,0,478,479,5,147,0,0,479,480, + 5,91,0,0,480,481,5,147,0,0,481,482,5,57,0,0,482,483,5,147,0,0,483,484, + 3,280,140,0,484,485,5,147,0,0,485,486,5,122,0,0,486,487,5,147,0,0,487, + 488,5,133,0,0,488,23,1,0,0,0,489,490,5,89,0,0,490,491,5,147,0,0,491,492, + 5,48,0,0,492,493,5,147,0,0,493,495,3,250,125,0,494,496,5,147,0,0,495, + 494,1,0,0,0,495,496,1,0,0,0,496,497,1,0,0,0,497,499,5,2,0,0,498,500,5, + 147,0,0,499,498,1,0,0,0,499,500,1,0,0,0,500,502,1,0,0,0,501,503,3,26, + 13,0,502,501,1,0,0,0,502,503,1,0,0,0,503,505,1,0,0,0,504,506,5,147,0, + 0,505,504,1,0,0,0,505,506,1,0,0,0,506,508,1,0,0,0,507,509,3,28,14,0,508, + 507,1,0,0,0,508,509,1,0,0,0,509,520,1,0,0,0,510,512,5,147,0,0,511,510, + 1,0,0,0,511,512,1,0,0,0,512,513,1,0,0,0,513,515,5,3,0,0,514,516,5,147, + 0,0,515,514,1,0,0,0,515,516,1,0,0,0,516,517,1,0,0,0,517,519,3,28,14,0, + 518,511,1,0,0,0,519,522,1,0,0,0,520,518,1,0,0,0,520,521,1,0,0,0,521,524, + 1,0,0,0,522,520,1,0,0,0,523,525,5,147,0,0,524,523,1,0,0,0,524,525,1,0, + 0,0,525,526,1,0,0,0,526,527,5,4,0,0,527,528,5,147,0,0,528,529,5,99,0, + 0,529,530,5,147,0,0,530,531,3,186,93,0,531,25,1,0,0,0,532,543,3,282,141, + 0,533,535,5,147,0,0,534,533,1,0,0,0,534,535,1,0,0,0,535,536,1,0,0,0,536, + 538,5,3,0,0,537,539,5,147,0,0,538,537,1,0,0,0,538,539,1,0,0,0,539,540, + 1,0,0,0,540,542,3,282,141,0,541,534,1,0,0,0,542,545,1,0,0,0,543,541,1, + 0,0,0,543,544,1,0,0,0,544,27,1,0,0,0,545,543,1,0,0,0,546,548,3,282,141, + 0,547,549,5,147,0,0,548,547,1,0,0,0,548,549,1,0,0,0,549,550,1,0,0,0,550, + 551,5,117,0,0,551,553,5,5,0,0,552,554,5,147,0,0,553,552,1,0,0,0,553,554, + 1,0,0,0,554,555,1,0,0,0,555,556,3,234,117,0,556,29,1,0,0,0,557,559,5, + 6,0,0,558,560,5,147,0,0,559,558,1,0,0,0,559,560,1,0,0,0,560,561,1,0,0, + 0,561,572,5,133,0,0,562,564,5,147,0,0,563,562,1,0,0,0,563,564,1,0,0,0, + 564,565,1,0,0,0,565,567,5,3,0,0,566,568,5,147,0,0,567,566,1,0,0,0,567, + 568,1,0,0,0,568,569,1,0,0,0,569,571,5,133,0,0,570,563,1,0,0,0,571,574, + 1,0,0,0,572,570,1,0,0,0,572,573,1,0,0,0,573,575,1,0,0,0,574,572,1,0,0, + 0,575,591,5,7,0,0,576,591,5,133,0,0,577,579,5,49,0,0,578,580,5,147,0, + 0,579,578,1,0,0,0,579,580,1,0,0,0,580,581,1,0,0,0,581,583,5,2,0,0,582, + 584,5,147,0,0,583,582,1,0,0,0,583,584,1,0,0,0,584,585,1,0,0,0,585,587, + 5,133,0,0,586,588,5,147,0,0,587,586,1,0,0,0,587,588,1,0,0,0,588,589,1, + 0,0,0,589,591,5,4,0,0,590,557,1,0,0,0,590,576,1,0,0,0,590,577,1,0,0,0, + 591,31,1,0,0,0,592,594,5,2,0,0,593,595,5,147,0,0,594,593,1,0,0,0,594, + 595,1,0,0,0,595,596,1,0,0,0,596,607,3,34,17,0,597,599,5,147,0,0,598,597, + 1,0,0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,602,5,3,0,0,601,603,5,147, + 0,0,602,601,1,0,0,0,602,603,1,0,0,0,603,604,1,0,0,0,604,606,3,34,17,0, + 605,598,1,0,0,0,606,609,1,0,0,0,607,605,1,0,0,0,607,608,1,0,0,0,608,611, + 1,0,0,0,609,607,1,0,0,0,610,612,5,147,0,0,611,610,1,0,0,0,611,612,1,0, + 0,0,612,613,1,0,0,0,613,614,5,4,0,0,614,33,1,0,0,0,615,617,3,282,141, + 0,616,618,5,147,0,0,617,616,1,0,0,0,617,618,1,0,0,0,618,619,1,0,0,0,619, + 621,5,5,0,0,620,622,5,147,0,0,621,620,1,0,0,0,621,622,1,0,0,0,622,623, + 1,0,0,0,623,624,3,234,117,0,624,35,1,0,0,0,625,632,3,38,19,0,626,632, + 3,40,20,0,627,632,3,42,21,0,628,632,3,46,23,0,629,632,3,48,24,0,630,632, + 3,50,25,0,631,625,1,0,0,0,631,626,1,0,0,0,631,627,1,0,0,0,631,628,1,0, + 0,0,631,629,1,0,0,0,631,630,1,0,0,0,632,37,1,0,0,0,633,634,5,89,0,0,634, + 635,5,147,0,0,635,636,5,56,0,0,636,637,5,147,0,0,637,638,5,57,0,0,638, + 639,5,147,0,0,639,641,3,280,140,0,640,642,5,147,0,0,641,640,1,0,0,0,641, + 642,1,0,0,0,642,643,1,0,0,0,643,645,5,2,0,0,644,646,5,147,0,0,645,644, + 1,0,0,0,645,646,1,0,0,0,646,647,1,0,0,0,647,649,3,62,31,0,648,650,5,147, + 0,0,649,648,1,0,0,0,649,650,1,0,0,0,650,651,1,0,0,0,651,653,5,3,0,0,652, + 654,5,147,0,0,653,652,1,0,0,0,653,654,1,0,0,0,654,655,1,0,0,0,655,656, + 3,66,33,0,656,658,1,0,0,0,657,659,5,147,0,0,658,657,1,0,0,0,658,659,1, + 0,0,0,659,660,1,0,0,0,660,661,5,4,0,0,661,39,1,0,0,0,662,663,5,89,0,0, + 663,664,5,147,0,0,664,665,5,67,0,0,665,666,5,147,0,0,666,667,5,57,0,0, + 667,668,5,147,0,0,668,670,3,280,140,0,669,671,5,147,0,0,670,669,1,0,0, + 0,670,671,1,0,0,0,671,672,1,0,0,0,672,674,5,2,0,0,673,675,5,147,0,0,674, + 673,1,0,0,0,674,675,1,0,0,0,675,676,1,0,0,0,676,678,3,44,22,0,677,679, + 5,147,0,0,678,677,1,0,0,0,678,679,1,0,0,0,679,688,1,0,0,0,680,682,5,3, + 0,0,681,683,5,147,0,0,682,681,1,0,0,0,682,683,1,0,0,0,683,684,1,0,0,0, + 684,686,3,62,31,0,685,687,5,147,0,0,686,685,1,0,0,0,686,687,1,0,0,0,687, + 689,1,0,0,0,688,680,1,0,0,0,688,689,1,0,0,0,689,698,1,0,0,0,690,692,5, + 3,0,0,691,693,5,147,0,0,692,691,1,0,0,0,692,693,1,0,0,0,693,694,1,0,0, + 0,694,696,3,282,141,0,695,697,5,147,0,0,696,695,1,0,0,0,696,697,1,0,0, + 0,697,699,1,0,0,0,698,690,1,0,0,0,698,699,1,0,0,0,699,700,1,0,0,0,700, + 701,5,4,0,0,701,41,1,0,0,0,702,703,5,89,0,0,703,704,5,147,0,0,704,705, + 5,67,0,0,705,706,5,147,0,0,706,707,5,57,0,0,707,708,5,147,0,0,708,709, + 5,58,0,0,709,710,5,147,0,0,710,712,3,280,140,0,711,713,5,147,0,0,712, + 711,1,0,0,0,712,713,1,0,0,0,713,714,1,0,0,0,714,716,5,2,0,0,715,717,5, + 147,0,0,716,715,1,0,0,0,716,717,1,0,0,0,717,718,1,0,0,0,718,720,3,44, + 22,0,719,721,5,147,0,0,720,719,1,0,0,0,720,721,1,0,0,0,721,727,1,0,0, + 0,722,724,5,3,0,0,723,725,5,147,0,0,724,723,1,0,0,0,724,725,1,0,0,0,725, + 726,1,0,0,0,726,728,3,44,22,0,727,722,1,0,0,0,728,729,1,0,0,0,729,727, + 1,0,0,0,729,730,1,0,0,0,730,732,1,0,0,0,731,733,5,147,0,0,732,731,1,0, + 0,0,732,733,1,0,0,0,733,742,1,0,0,0,734,736,5,3,0,0,735,737,5,147,0,0, + 736,735,1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,740,3,62,31,0,739, + 741,5,147,0,0,740,739,1,0,0,0,740,741,1,0,0,0,741,743,1,0,0,0,742,734, + 1,0,0,0,742,743,1,0,0,0,743,752,1,0,0,0,744,746,5,3,0,0,745,747,5,147, + 0,0,746,745,1,0,0,0,746,747,1,0,0,0,747,748,1,0,0,0,748,750,3,282,141, + 0,749,751,5,147,0,0,750,749,1,0,0,0,750,751,1,0,0,0,751,753,1,0,0,0,752, + 744,1,0,0,0,752,753,1,0,0,0,753,754,1,0,0,0,754,755,5,4,0,0,755,43,1, + 0,0,0,756,757,5,51,0,0,757,758,5,147,0,0,758,759,3,280,140,0,759,760, + 5,147,0,0,760,761,5,68,0,0,761,762,5,147,0,0,762,763,3,280,140,0,763, + 45,1,0,0,0,764,765,5,89,0,0,765,766,5,147,0,0,766,767,5,59,0,0,767,768, + 5,147,0,0,768,769,3,280,140,0,769,47,1,0,0,0,770,771,5,60,0,0,771,772, + 5,147,0,0,772,773,7,0,0,0,773,774,5,147,0,0,774,775,3,280,140,0,775,49, + 1,0,0,0,776,777,5,61,0,0,777,778,5,147,0,0,778,779,5,57,0,0,779,780,5, + 147,0,0,780,781,3,280,140,0,781,782,5,147,0,0,782,783,3,52,26,0,783,51, + 1,0,0,0,784,789,3,54,27,0,785,789,3,56,28,0,786,789,3,58,29,0,787,789, + 3,60,30,0,788,784,1,0,0,0,788,785,1,0,0,0,788,786,1,0,0,0,788,787,1,0, + 0,0,789,53,1,0,0,0,790,791,5,64,0,0,791,792,5,147,0,0,792,793,3,274,137, + 0,793,794,5,147,0,0,794,799,3,68,34,0,795,796,5,147,0,0,796,797,5,62, + 0,0,797,798,5,147,0,0,798,800,3,186,93,0,799,795,1,0,0,0,799,800,1,0, + 0,0,800,55,1,0,0,0,801,802,5,60,0,0,802,803,5,147,0,0,803,804,3,274,137, + 0,804,57,1,0,0,0,805,806,5,63,0,0,806,807,5,147,0,0,807,808,5,68,0,0, + 808,809,5,147,0,0,809,810,3,280,140,0,810,59,1,0,0,0,811,812,5,63,0,0, + 812,813,5,147,0,0,813,814,3,274,137,0,814,815,5,147,0,0,815,816,5,68, + 0,0,816,817,5,147,0,0,817,818,3,274,137,0,818,61,1,0,0,0,819,830,3,64, + 32,0,820,822,5,147,0,0,821,820,1,0,0,0,821,822,1,0,0,0,822,823,1,0,0, + 0,823,825,5,3,0,0,824,826,5,147,0,0,825,824,1,0,0,0,825,826,1,0,0,0,826, + 827,1,0,0,0,827,829,3,64,32,0,828,821,1,0,0,0,829,832,1,0,0,0,830,828, + 1,0,0,0,830,831,1,0,0,0,831,63,1,0,0,0,832,830,1,0,0,0,833,834,3,274, + 137,0,834,835,5,147,0,0,835,836,3,68,34,0,836,65,1,0,0,0,837,838,5,65, + 0,0,838,839,5,147,0,0,839,841,5,66,0,0,840,842,5,147,0,0,841,840,1,0, + 0,0,841,842,1,0,0,0,842,843,1,0,0,0,843,845,5,2,0,0,844,846,5,147,0,0, + 845,844,1,0,0,0,845,846,1,0,0,0,846,847,1,0,0,0,847,849,3,274,137,0,848, + 850,5,147,0,0,849,848,1,0,0,0,849,850,1,0,0,0,850,851,1,0,0,0,851,852, + 5,4,0,0,852,67,1,0,0,0,853,854,6,34,-1,0,854,906,3,282,141,0,855,857, + 5,82,0,0,856,858,5,147,0,0,857,856,1,0,0,0,857,858,1,0,0,0,858,859,1, + 0,0,0,859,861,5,2,0,0,860,862,5,147,0,0,861,860,1,0,0,0,861,862,1,0,0, + 0,862,863,1,0,0,0,863,865,3,62,31,0,864,866,5,147,0,0,865,864,1,0,0,0, + 865,866,1,0,0,0,866,867,1,0,0,0,867,868,5,4,0,0,868,906,1,0,0,0,869,871, + 3,282,141,0,870,872,5,147,0,0,871,870,1,0,0,0,871,872,1,0,0,0,872,873, + 1,0,0,0,873,875,5,2,0,0,874,876,5,147,0,0,875,874,1,0,0,0,875,876,1,0, + 0,0,876,877,1,0,0,0,877,879,3,62,31,0,878,880,5,147,0,0,879,878,1,0,0, + 0,879,880,1,0,0,0,880,881,1,0,0,0,881,882,5,4,0,0,882,906,1,0,0,0,883, + 885,3,282,141,0,884,886,5,147,0,0,885,884,1,0,0,0,885,886,1,0,0,0,886, + 887,1,0,0,0,887,889,5,2,0,0,888,890,5,147,0,0,889,888,1,0,0,0,889,890, + 1,0,0,0,890,891,1,0,0,0,891,893,3,68,34,0,892,894,5,147,0,0,893,892,1, + 0,0,0,893,894,1,0,0,0,894,895,1,0,0,0,895,897,5,3,0,0,896,898,5,147,0, + 0,897,896,1,0,0,0,897,898,1,0,0,0,898,899,1,0,0,0,899,901,3,68,34,0,900, + 902,5,147,0,0,901,900,1,0,0,0,901,902,1,0,0,0,902,903,1,0,0,0,903,904, + 5,4,0,0,904,906,1,0,0,0,905,853,1,0,0,0,905,855,1,0,0,0,905,869,1,0,0, + 0,905,883,1,0,0,0,906,911,1,0,0,0,907,908,10,4,0,0,908,910,3,70,35,0, + 909,907,1,0,0,0,910,913,1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,69, + 1,0,0,0,913,911,1,0,0,0,914,918,3,72,36,0,915,917,3,72,36,0,916,915,1, + 0,0,0,917,920,1,0,0,0,918,916,1,0,0,0,918,919,1,0,0,0,919,71,1,0,0,0, + 920,918,1,0,0,0,921,923,5,6,0,0,922,924,3,276,138,0,923,922,1,0,0,0,923, + 924,1,0,0,0,924,925,1,0,0,0,925,926,5,7,0,0,926,73,1,0,0,0,927,930,3, + 76,38,0,928,930,3,78,39,0,929,927,1,0,0,0,929,928,1,0,0,0,930,75,1,0, + 0,0,931,932,5,69,0,0,932,77,1,0,0,0,933,934,5,70,0,0,934,79,1,0,0,0,935, + 936,5,71,0,0,936,937,5,147,0,0,937,950,5,72,0,0,938,939,5,71,0,0,939, + 940,5,147,0,0,940,941,5,72,0,0,941,942,5,147,0,0,942,943,5,73,0,0,943, + 944,5,147,0,0,944,950,5,74,0,0,945,950,5,76,0,0,946,950,5,77,0,0,947, + 950,5,78,0,0,948,950,5,79,0,0,949,935,1,0,0,0,949,938,1,0,0,0,949,945, + 1,0,0,0,949,946,1,0,0,0,949,947,1,0,0,0,949,948,1,0,0,0,950,81,1,0,0, + 0,951,954,3,84,42,0,952,954,3,86,43,0,953,951,1,0,0,0,953,952,1,0,0,0, + 954,83,1,0,0,0,955,956,5,84,0,0,956,957,5,147,0,0,957,958,5,81,0,0,958, + 961,5,147,0,0,959,962,5,133,0,0,960,962,3,266,133,0,961,959,1,0,0,0,961, + 960,1,0,0,0,962,85,1,0,0,0,963,964,5,80,0,0,964,965,5,147,0,0,965,966, + 3,266,133,0,966,87,1,0,0,0,967,968,3,90,45,0,968,89,1,0,0,0,969,976,3, + 94,47,0,970,972,5,147,0,0,971,970,1,0,0,0,971,972,1,0,0,0,972,973,1,0, + 0,0,973,975,3,92,46,0,974,971,1,0,0,0,975,978,1,0,0,0,976,974,1,0,0,0, + 976,977,1,0,0,0,977,991,1,0,0,0,978,976,1,0,0,0,979,981,3,128,64,0,980, + 982,5,147,0,0,981,980,1,0,0,0,981,982,1,0,0,0,982,984,1,0,0,0,983,979, + 1,0,0,0,984,985,1,0,0,0,985,983,1,0,0,0,985,986,1,0,0,0,986,987,1,0,0, + 0,987,988,3,94,47,0,988,989,6,45,-1,0,989,991,1,0,0,0,990,969,1,0,0,0, + 990,983,1,0,0,0,991,91,1,0,0,0,992,993,5,82,0,0,993,994,5,147,0,0,994, + 996,5,83,0,0,995,997,5,147,0,0,996,995,1,0,0,0,996,997,1,0,0,0,997,998, + 1,0,0,0,998,1005,3,94,47,0,999,1001,5,82,0,0,1000,1002,5,147,0,0,1001, + 1000,1,0,0,0,1001,1002,1,0,0,0,1002,1003,1,0,0,0,1003,1005,3,94,47,0, + 1004,992,1,0,0,0,1004,999,1,0,0,0,1005,93,1,0,0,0,1006,1009,3,96,48,0, + 1007,1009,3,98,49,0,1008,1006,1,0,0,0,1008,1007,1,0,0,0,1009,95,1,0,0, + 0,1010,1012,3,104,52,0,1011,1013,5,147,0,0,1012,1011,1,0,0,0,1012,1013, + 1,0,0,0,1013,1015,1,0,0,0,1014,1010,1,0,0,0,1015,1018,1,0,0,0,1016,1014, + 1,0,0,0,1016,1017,1,0,0,0,1017,1019,1,0,0,0,1018,1016,1,0,0,0,1019,1056, + 3,128,64,0,1020,1022,3,104,52,0,1021,1023,5,147,0,0,1022,1021,1,0,0,0, + 1022,1023,1,0,0,0,1023,1025,1,0,0,0,1024,1020,1,0,0,0,1025,1028,1,0,0, + 0,1026,1024,1,0,0,0,1026,1027,1,0,0,0,1027,1029,1,0,0,0,1028,1026,1,0, + 0,0,1029,1036,3,102,51,0,1030,1032,5,147,0,0,1031,1030,1,0,0,0,1031,1032, + 1,0,0,0,1032,1033,1,0,0,0,1033,1035,3,102,51,0,1034,1031,1,0,0,0,1035, + 1038,1,0,0,0,1036,1034,1,0,0,0,1036,1037,1,0,0,0,1037,1043,1,0,0,0,1038, + 1036,1,0,0,0,1039,1041,5,147,0,0,1040,1039,1,0,0,0,1040,1041,1,0,0,0, + 1041,1042,1,0,0,0,1042,1044,3,128,64,0,1043,1040,1,0,0,0,1043,1044,1, + 0,0,0,1044,1056,1,0,0,0,1045,1047,3,104,52,0,1046,1048,5,147,0,0,1047, + 1046,1,0,0,0,1047,1048,1,0,0,0,1048,1050,1,0,0,0,1049,1045,1,0,0,0,1050, + 1051,1,0,0,0,1051,1049,1,0,0,0,1051,1052,1,0,0,0,1052,1053,1,0,0,0,1053, + 1054,6,48,-1,0,1054,1056,1,0,0,0,1055,1016,1,0,0,0,1055,1026,1,0,0,0, + 1055,1049,1,0,0,0,1056,97,1,0,0,0,1057,1059,3,100,50,0,1058,1060,5,147, + 0,0,1059,1058,1,0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0,1061,1057,1, + 0,0,0,1062,1063,1,0,0,0,1063,1061,1,0,0,0,1063,1064,1,0,0,0,1064,1065, + 1,0,0,0,1065,1066,3,96,48,0,1066,99,1,0,0,0,1067,1069,3,104,52,0,1068, + 1070,5,147,0,0,1069,1068,1,0,0,0,1069,1070,1,0,0,0,1070,1072,1,0,0,0, + 1071,1067,1,0,0,0,1072,1075,1,0,0,0,1073,1071,1,0,0,0,1073,1074,1,0,0, + 0,1074,1082,1,0,0,0,1075,1073,1,0,0,0,1076,1078,3,102,51,0,1077,1079, + 5,147,0,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079,1081,1,0,0,0,1080, + 1076,1,0,0,0,1081,1084,1,0,0,0,1082,1080,1,0,0,0,1082,1083,1,0,0,0,1083, + 1085,1,0,0,0,1084,1082,1,0,0,0,1085,1086,3,126,63,0,1086,101,1,0,0,0, + 1087,1092,3,114,57,0,1088,1092,3,116,58,0,1089,1092,3,120,60,0,1090,1092, + 3,124,62,0,1091,1087,1,0,0,0,1091,1088,1,0,0,0,1091,1089,1,0,0,0,1091, + 1090,1,0,0,0,1092,103,1,0,0,0,1093,1098,3,110,55,0,1094,1098,3,112,56, + 0,1095,1098,3,108,54,0,1096,1098,3,106,53,0,1097,1093,1,0,0,0,1097,1094, + 1,0,0,0,1097,1095,1,0,0,0,1097,1096,1,0,0,0,1098,105,1,0,0,0,1099,1117, + 5,84,0,0,1100,1101,5,147,0,0,1101,1102,5,95,0,0,1102,1103,5,147,0,0,1103, + 1105,5,85,0,0,1104,1106,5,147,0,0,1105,1104,1,0,0,0,1105,1106,1,0,0,0, + 1106,1107,1,0,0,0,1107,1109,5,2,0,0,1108,1110,5,147,0,0,1109,1108,1,0, + 0,0,1109,1110,1,0,0,0,1110,1111,1,0,0,0,1111,1113,3,62,31,0,1112,1114, + 5,147,0,0,1113,1112,1,0,0,0,1113,1114,1,0,0,0,1114,1115,1,0,0,0,1115, + 1116,5,4,0,0,1116,1118,1,0,0,0,1117,1100,1,0,0,0,1117,1118,1,0,0,0,1118, + 1119,1,0,0,0,1119,1120,5,147,0,0,1120,1121,5,51,0,0,1121,1122,5,147,0, + 0,1122,1127,3,10,5,0,1123,1125,5,147,0,0,1124,1123,1,0,0,0,1124,1125, + 1,0,0,0,1125,1126,1,0,0,0,1126,1128,3,32,16,0,1127,1124,1,0,0,0,1127, + 1128,1,0,0,0,1128,1133,1,0,0,0,1129,1131,5,147,0,0,1130,1129,1,0,0,0, + 1130,1131,1,0,0,0,1131,1132,1,0,0,0,1132,1134,3,144,72,0,1133,1130,1, + 0,0,0,1133,1134,1,0,0,0,1134,107,1,0,0,0,1135,1136,5,46,0,0,1136,1137, + 5,147,0,0,1137,1142,3,248,124,0,1138,1140,5,147,0,0,1139,1138,1,0,0,0, + 1139,1140,1,0,0,0,1140,1141,1,0,0,0,1141,1143,3,144,72,0,1142,1139,1, + 0,0,0,1142,1143,1,0,0,0,1143,109,1,0,0,0,1144,1145,5,86,0,0,1145,1147, + 5,147,0,0,1146,1144,1,0,0,0,1146,1147,1,0,0,0,1147,1148,1,0,0,0,1148, + 1150,5,87,0,0,1149,1151,5,147,0,0,1150,1149,1,0,0,0,1150,1151,1,0,0,0, + 1151,1152,1,0,0,0,1152,1157,3,146,73,0,1153,1155,5,147,0,0,1154,1153, + 1,0,0,0,1154,1155,1,0,0,0,1155,1156,1,0,0,0,1156,1158,3,144,72,0,1157, + 1154,1,0,0,0,1157,1158,1,0,0,0,1158,111,1,0,0,0,1159,1161,5,88,0,0,1160, + 1162,5,147,0,0,1161,1160,1,0,0,0,1161,1162,1,0,0,0,1162,1163,1,0,0,0, + 1163,1164,3,186,93,0,1164,1165,5,147,0,0,1165,1166,5,99,0,0,1166,1167, + 5,147,0,0,1167,1168,3,266,133,0,1168,113,1,0,0,0,1169,1171,5,89,0,0,1170, + 1172,5,147,0,0,1171,1170,1,0,0,0,1171,1172,1,0,0,0,1172,1173,1,0,0,0, + 1173,1174,3,146,73,0,1174,115,1,0,0,0,1175,1177,5,90,0,0,1176,1178,5, + 147,0,0,1177,1176,1,0,0,0,1177,1178,1,0,0,0,1178,1179,1,0,0,0,1179,1184, + 3,146,73,0,1180,1181,5,147,0,0,1181,1183,3,118,59,0,1182,1180,1,0,0,0, + 1183,1186,1,0,0,0,1184,1182,1,0,0,0,1184,1185,1,0,0,0,1185,117,1,0,0, + 0,1186,1184,1,0,0,0,1187,1188,5,91,0,0,1188,1189,5,147,0,0,1189,1190, + 5,87,0,0,1190,1191,5,147,0,0,1191,1198,3,120,60,0,1192,1193,5,91,0,0, + 1193,1194,5,147,0,0,1194,1195,5,89,0,0,1195,1196,5,147,0,0,1196,1198, + 3,120,60,0,1197,1187,1,0,0,0,1197,1192,1,0,0,0,1198,119,1,0,0,0,1199, + 1201,5,92,0,0,1200,1202,5,147,0,0,1201,1200,1,0,0,0,1201,1202,1,0,0,0, + 1202,1203,1,0,0,0,1203,1214,3,122,61,0,1204,1206,5,147,0,0,1205,1204, + 1,0,0,0,1205,1206,1,0,0,0,1206,1207,1,0,0,0,1207,1209,5,3,0,0,1208,1210, + 5,147,0,0,1209,1208,1,0,0,0,1209,1210,1,0,0,0,1210,1211,1,0,0,0,1211, + 1213,3,122,61,0,1212,1205,1,0,0,0,1213,1216,1,0,0,0,1214,1212,1,0,0,0, + 1214,1215,1,0,0,0,1215,121,1,0,0,0,1216,1214,1,0,0,0,1217,1219,3,272, + 136,0,1218,1220,5,147,0,0,1219,1218,1,0,0,0,1219,1220,1,0,0,0,1220,1221, + 1,0,0,0,1221,1223,5,5,0,0,1222,1224,5,147,0,0,1223,1222,1,0,0,0,1223, + 1224,1,0,0,0,1224,1225,1,0,0,0,1225,1226,3,186,93,0,1226,123,1,0,0,0, + 1227,1228,5,93,0,0,1228,1230,5,147,0,0,1229,1227,1,0,0,0,1229,1230,1, + 0,0,0,1230,1231,1,0,0,0,1231,1233,5,94,0,0,1232,1234,5,147,0,0,1233,1232, + 1,0,0,0,1233,1234,1,0,0,0,1234,1235,1,0,0,0,1235,1246,3,186,93,0,1236, + 1238,5,147,0,0,1237,1236,1,0,0,0,1237,1238,1,0,0,0,1238,1239,1,0,0,0, + 1239,1241,5,3,0,0,1240,1242,5,147,0,0,1241,1240,1,0,0,0,1241,1242,1,0, + 0,0,1242,1243,1,0,0,0,1243,1245,3,186,93,0,1244,1237,1,0,0,0,1245,1248, + 1,0,0,0,1246,1244,1,0,0,0,1246,1247,1,0,0,0,1247,125,1,0,0,0,1248,1246, + 1,0,0,0,1249,1250,5,95,0,0,1250,1255,3,130,65,0,1251,1253,5,147,0,0,1252, + 1251,1,0,0,0,1252,1253,1,0,0,0,1253,1254,1,0,0,0,1254,1256,3,144,72,0, + 1255,1252,1,0,0,0,1255,1256,1,0,0,0,1256,127,1,0,0,0,1257,1258,5,96,0, + 0,1258,1259,3,130,65,0,1259,129,1,0,0,0,1260,1262,5,147,0,0,1261,1260, + 1,0,0,0,1261,1262,1,0,0,0,1262,1263,1,0,0,0,1263,1265,5,97,0,0,1264,1261, + 1,0,0,0,1264,1265,1,0,0,0,1265,1266,1,0,0,0,1266,1267,5,147,0,0,1267, + 1270,3,132,66,0,1268,1269,5,147,0,0,1269,1271,3,136,68,0,1270,1268,1, + 0,0,0,1270,1271,1,0,0,0,1271,1274,1,0,0,0,1272,1273,5,147,0,0,1273,1275, + 3,138,69,0,1274,1272,1,0,0,0,1274,1275,1,0,0,0,1275,1278,1,0,0,0,1276, + 1277,5,147,0,0,1277,1279,3,140,70,0,1278,1276,1,0,0,0,1278,1279,1,0,0, + 0,1279,131,1,0,0,0,1280,1291,5,98,0,0,1281,1283,5,147,0,0,1282,1281,1, + 0,0,0,1282,1283,1,0,0,0,1283,1284,1,0,0,0,1284,1286,5,3,0,0,1285,1287, + 5,147,0,0,1286,1285,1,0,0,0,1286,1287,1,0,0,0,1287,1288,1,0,0,0,1288, + 1290,3,134,67,0,1289,1282,1,0,0,0,1290,1293,1,0,0,0,1291,1289,1,0,0,0, + 1291,1292,1,0,0,0,1292,1309,1,0,0,0,1293,1291,1,0,0,0,1294,1305,3,134, + 67,0,1295,1297,5,147,0,0,1296,1295,1,0,0,0,1296,1297,1,0,0,0,1297,1298, + 1,0,0,0,1298,1300,5,3,0,0,1299,1301,5,147,0,0,1300,1299,1,0,0,0,1300, + 1301,1,0,0,0,1301,1302,1,0,0,0,1302,1304,3,134,67,0,1303,1296,1,0,0,0, + 1304,1307,1,0,0,0,1305,1303,1,0,0,0,1305,1306,1,0,0,0,1306,1309,1,0,0, + 0,1307,1305,1,0,0,0,1308,1280,1,0,0,0,1308,1294,1,0,0,0,1309,133,1,0, + 0,0,1310,1311,3,186,93,0,1311,1312,5,147,0,0,1312,1313,5,99,0,0,1313, + 1314,5,147,0,0,1314,1315,3,266,133,0,1315,1318,1,0,0,0,1316,1318,3,186, + 93,0,1317,1310,1,0,0,0,1317,1316,1,0,0,0,1318,135,1,0,0,0,1319,1320,5, + 100,0,0,1320,1321,5,147,0,0,1321,1322,5,101,0,0,1322,1323,5,147,0,0,1323, + 1331,3,142,71,0,1324,1326,5,3,0,0,1325,1327,5,147,0,0,1326,1325,1,0,0, + 0,1326,1327,1,0,0,0,1327,1328,1,0,0,0,1328,1330,3,142,71,0,1329,1324, + 1,0,0,0,1330,1333,1,0,0,0,1331,1329,1,0,0,0,1331,1332,1,0,0,0,1332,137, + 1,0,0,0,1333,1331,1,0,0,0,1334,1335,5,102,0,0,1335,1336,5,147,0,0,1336, + 1337,3,186,93,0,1337,139,1,0,0,0,1338,1339,5,103,0,0,1339,1340,5,147, + 0,0,1340,1341,3,186,93,0,1341,141,1,0,0,0,1342,1347,3,186,93,0,1343,1345, + 5,147,0,0,1344,1343,1,0,0,0,1344,1345,1,0,0,0,1345,1346,1,0,0,0,1346, + 1348,7,1,0,0,1347,1344,1,0,0,0,1347,1348,1,0,0,0,1348,143,1,0,0,0,1349, + 1350,5,108,0,0,1350,1351,5,147,0,0,1351,1352,3,186,93,0,1352,145,1,0, + 0,0,1353,1364,3,148,74,0,1354,1356,5,147,0,0,1355,1354,1,0,0,0,1355,1356, + 1,0,0,0,1356,1357,1,0,0,0,1357,1359,5,3,0,0,1358,1360,5,147,0,0,1359, + 1358,1,0,0,0,1359,1360,1,0,0,0,1360,1361,1,0,0,0,1361,1363,3,148,74,0, + 1362,1355,1,0,0,0,1363,1366,1,0,0,0,1364,1362,1,0,0,0,1364,1365,1,0,0, + 0,1365,147,1,0,0,0,1366,1364,1,0,0,0,1367,1369,3,266,133,0,1368,1370, + 5,147,0,0,1369,1368,1,0,0,0,1369,1370,1,0,0,0,1370,1371,1,0,0,0,1371, + 1373,5,5,0,0,1372,1374,5,147,0,0,1373,1372,1,0,0,0,1373,1374,1,0,0,0, + 1374,1375,1,0,0,0,1375,1376,3,150,75,0,1376,1379,1,0,0,0,1377,1379,3, + 150,75,0,1378,1367,1,0,0,0,1378,1377,1,0,0,0,1379,149,1,0,0,0,1380,1381, + 3,152,76,0,1381,151,1,0,0,0,1382,1389,3,154,77,0,1383,1385,5,147,0,0, + 1384,1383,1,0,0,0,1384,1385,1,0,0,0,1385,1386,1,0,0,0,1386,1388,3,156, + 78,0,1387,1384,1,0,0,0,1388,1391,1,0,0,0,1389,1387,1,0,0,0,1389,1390, + 1,0,0,0,1390,1397,1,0,0,0,1391,1389,1,0,0,0,1392,1393,5,2,0,0,1393,1394, + 3,152,76,0,1394,1395,5,4,0,0,1395,1397,1,0,0,0,1396,1382,1,0,0,0,1396, + 1392,1,0,0,0,1397,153,1,0,0,0,1398,1400,5,2,0,0,1399,1401,5,147,0,0,1400, + 1399,1,0,0,0,1400,1401,1,0,0,0,1401,1406,1,0,0,0,1402,1404,3,266,133, + 0,1403,1405,5,147,0,0,1404,1403,1,0,0,0,1404,1405,1,0,0,0,1405,1407,1, + 0,0,0,1406,1402,1,0,0,0,1406,1407,1,0,0,0,1407,1412,1,0,0,0,1408,1410, + 3,166,83,0,1409,1411,5,147,0,0,1410,1409,1,0,0,0,1410,1411,1,0,0,0,1411, + 1413,1,0,0,0,1412,1408,1,0,0,0,1412,1413,1,0,0,0,1413,1418,1,0,0,0,1414, + 1416,3,162,81,0,1415,1417,5,147,0,0,1416,1415,1,0,0,0,1416,1417,1,0,0, + 0,1417,1419,1,0,0,0,1418,1414,1,0,0,0,1418,1419,1,0,0,0,1419,1420,1,0, + 0,0,1420,1421,5,4,0,0,1421,155,1,0,0,0,1422,1424,3,158,79,0,1423,1425, + 5,147,0,0,1424,1423,1,0,0,0,1424,1425,1,0,0,0,1425,1426,1,0,0,0,1426, + 1427,3,154,77,0,1427,157,1,0,0,0,1428,1430,3,286,143,0,1429,1431,5,147, + 0,0,1430,1429,1,0,0,0,1430,1431,1,0,0,0,1431,1432,1,0,0,0,1432,1434,3, + 290,145,0,1433,1435,5,147,0,0,1434,1433,1,0,0,0,1434,1435,1,0,0,0,1435, + 1437,1,0,0,0,1436,1438,3,160,80,0,1437,1436,1,0,0,0,1437,1438,1,0,0,0, + 1438,1440,1,0,0,0,1439,1441,5,147,0,0,1440,1439,1,0,0,0,1440,1441,1,0, + 0,0,1441,1442,1,0,0,0,1442,1443,3,290,145,0,1443,1473,1,0,0,0,1444,1446, + 3,290,145,0,1445,1447,5,147,0,0,1446,1445,1,0,0,0,1446,1447,1,0,0,0,1447, + 1449,1,0,0,0,1448,1450,3,160,80,0,1449,1448,1,0,0,0,1449,1450,1,0,0,0, + 1450,1452,1,0,0,0,1451,1453,5,147,0,0,1452,1451,1,0,0,0,1452,1453,1,0, + 0,0,1453,1454,1,0,0,0,1454,1456,3,290,145,0,1455,1457,5,147,0,0,1456, + 1455,1,0,0,0,1456,1457,1,0,0,0,1457,1458,1,0,0,0,1458,1459,3,288,144, + 0,1459,1473,1,0,0,0,1460,1462,3,290,145,0,1461,1463,5,147,0,0,1462,1461, + 1,0,0,0,1462,1463,1,0,0,0,1463,1465,1,0,0,0,1464,1466,3,160,80,0,1465, + 1464,1,0,0,0,1465,1466,1,0,0,0,1466,1468,1,0,0,0,1467,1469,5,147,0,0, + 1468,1467,1,0,0,0,1468,1469,1,0,0,0,1469,1470,1,0,0,0,1470,1471,3,290, + 145,0,1471,1473,1,0,0,0,1472,1428,1,0,0,0,1472,1444,1,0,0,0,1472,1460, + 1,0,0,0,1473,159,1,0,0,0,1474,1476,5,6,0,0,1475,1477,5,147,0,0,1476,1475, + 1,0,0,0,1476,1477,1,0,0,0,1477,1482,1,0,0,0,1478,1480,3,266,133,0,1479, + 1481,5,147,0,0,1480,1479,1,0,0,0,1480,1481,1,0,0,0,1481,1483,1,0,0,0, + 1482,1478,1,0,0,0,1482,1483,1,0,0,0,1483,1488,1,0,0,0,1484,1486,3,164, + 82,0,1485,1487,5,147,0,0,1486,1485,1,0,0,0,1486,1487,1,0,0,0,1487,1489, + 1,0,0,0,1488,1484,1,0,0,0,1488,1489,1,0,0,0,1489,1494,1,0,0,0,1490,1492, + 3,170,85,0,1491,1493,5,147,0,0,1492,1491,1,0,0,0,1492,1493,1,0,0,0,1493, + 1495,1,0,0,0,1494,1490,1,0,0,0,1494,1495,1,0,0,0,1495,1500,1,0,0,0,1496, + 1498,3,162,81,0,1497,1499,5,147,0,0,1498,1497,1,0,0,0,1498,1499,1,0,0, + 0,1499,1501,1,0,0,0,1500,1496,1,0,0,0,1500,1501,1,0,0,0,1501,1502,1,0, + 0,0,1502,1503,5,7,0,0,1503,161,1,0,0,0,1504,1506,5,8,0,0,1505,1507,5, + 147,0,0,1506,1505,1,0,0,0,1506,1507,1,0,0,0,1507,1541,1,0,0,0,1508,1510, + 3,274,137,0,1509,1511,5,147,0,0,1510,1509,1,0,0,0,1510,1511,1,0,0,0,1511, + 1512,1,0,0,0,1512,1514,5,117,0,0,1513,1515,5,147,0,0,1514,1513,1,0,0, + 0,1514,1515,1,0,0,0,1515,1516,1,0,0,0,1516,1518,3,186,93,0,1517,1519, + 5,147,0,0,1518,1517,1,0,0,0,1518,1519,1,0,0,0,1519,1538,1,0,0,0,1520, + 1522,5,3,0,0,1521,1523,5,147,0,0,1522,1521,1,0,0,0,1522,1523,1,0,0,0, + 1523,1524,1,0,0,0,1524,1526,3,274,137,0,1525,1527,5,147,0,0,1526,1525, + 1,0,0,0,1526,1527,1,0,0,0,1527,1528,1,0,0,0,1528,1530,5,117,0,0,1529, + 1531,5,147,0,0,1530,1529,1,0,0,0,1530,1531,1,0,0,0,1531,1532,1,0,0,0, + 1532,1534,3,186,93,0,1533,1535,5,147,0,0,1534,1533,1,0,0,0,1534,1535, + 1,0,0,0,1535,1537,1,0,0,0,1536,1520,1,0,0,0,1537,1540,1,0,0,0,1538,1536, + 1,0,0,0,1538,1539,1,0,0,0,1539,1542,1,0,0,0,1540,1538,1,0,0,0,1541,1508, + 1,0,0,0,1541,1542,1,0,0,0,1542,1543,1,0,0,0,1543,1544,5,9,0,0,1544,163, + 1,0,0,0,1545,1547,5,117,0,0,1546,1548,5,147,0,0,1547,1546,1,0,0,0,1547, + 1548,1,0,0,0,1548,1549,1,0,0,0,1549,1563,3,184,92,0,1550,1552,5,147,0, + 0,1551,1550,1,0,0,0,1551,1552,1,0,0,0,1552,1553,1,0,0,0,1553,1555,5,10, + 0,0,1554,1556,5,117,0,0,1555,1554,1,0,0,0,1555,1556,1,0,0,0,1556,1558, + 1,0,0,0,1557,1559,5,147,0,0,1558,1557,1,0,0,0,1558,1559,1,0,0,0,1559, + 1560,1,0,0,0,1560,1562,3,184,92,0,1561,1551,1,0,0,0,1562,1565,1,0,0,0, + 1563,1561,1,0,0,0,1563,1564,1,0,0,0,1564,165,1,0,0,0,1565,1563,1,0,0, + 0,1566,1573,3,168,84,0,1567,1569,5,147,0,0,1568,1567,1,0,0,0,1568,1569, + 1,0,0,0,1569,1570,1,0,0,0,1570,1572,3,168,84,0,1571,1568,1,0,0,0,1572, + 1575,1,0,0,0,1573,1571,1,0,0,0,1573,1574,1,0,0,0,1574,167,1,0,0,0,1575, + 1573,1,0,0,0,1576,1578,5,117,0,0,1577,1579,5,147,0,0,1578,1577,1,0,0, + 0,1578,1579,1,0,0,0,1579,1580,1,0,0,0,1580,1581,3,182,91,0,1581,169,1, + 0,0,0,1582,1584,5,98,0,0,1583,1585,5,147,0,0,1584,1583,1,0,0,0,1584,1585, + 1,0,0,0,1585,1590,1,0,0,0,1586,1591,5,109,0,0,1587,1588,5,83,0,0,1588, + 1589,5,147,0,0,1589,1591,5,109,0,0,1590,1586,1,0,0,0,1590,1587,1,0,0, + 0,1590,1591,1,0,0,0,1591,1593,1,0,0,0,1592,1594,5,147,0,0,1593,1592,1, + 0,0,0,1593,1594,1,0,0,0,1594,1609,1,0,0,0,1595,1597,3,178,89,0,1596,1595, + 1,0,0,0,1596,1597,1,0,0,0,1597,1599,1,0,0,0,1598,1600,5,147,0,0,1599, + 1598,1,0,0,0,1599,1600,1,0,0,0,1600,1601,1,0,0,0,1601,1603,5,11,0,0,1602, + 1604,5,147,0,0,1603,1602,1,0,0,0,1603,1604,1,0,0,0,1604,1606,1,0,0,0, + 1605,1607,3,180,90,0,1606,1605,1,0,0,0,1606,1607,1,0,0,0,1607,1610,1, + 0,0,0,1608,1610,3,276,138,0,1609,1596,1,0,0,0,1609,1608,1,0,0,0,1609, + 1610,1,0,0,0,1610,1615,1,0,0,0,1611,1613,5,147,0,0,1612,1611,1,0,0,0, + 1612,1613,1,0,0,0,1613,1614,1,0,0,0,1614,1616,3,172,86,0,1615,1612,1, + 0,0,0,1615,1616,1,0,0,0,1616,171,1,0,0,0,1617,1619,5,2,0,0,1618,1620, + 5,147,0,0,1619,1618,1,0,0,0,1619,1620,1,0,0,0,1620,1621,1,0,0,0,1621, + 1623,3,266,133,0,1622,1624,5,147,0,0,1623,1622,1,0,0,0,1623,1624,1,0, + 0,0,1624,1625,1,0,0,0,1625,1627,5,3,0,0,1626,1628,5,147,0,0,1627,1626, + 1,0,0,0,1627,1628,1,0,0,0,1628,1629,1,0,0,0,1629,1638,3,266,133,0,1630, + 1632,5,147,0,0,1631,1630,1,0,0,0,1631,1632,1,0,0,0,1632,1633,1,0,0,0, + 1633,1635,5,10,0,0,1634,1636,5,147,0,0,1635,1634,1,0,0,0,1635,1636,1, + 0,0,0,1636,1637,1,0,0,0,1637,1639,3,144,72,0,1638,1631,1,0,0,0,1638,1639, + 1,0,0,0,1639,1659,1,0,0,0,1640,1642,5,147,0,0,1641,1640,1,0,0,0,1641, + 1642,1,0,0,0,1642,1643,1,0,0,0,1643,1645,5,10,0,0,1644,1646,5,147,0,0, + 1645,1644,1,0,0,0,1645,1646,1,0,0,0,1646,1647,1,0,0,0,1647,1649,3,176, + 88,0,1648,1650,5,147,0,0,1649,1648,1,0,0,0,1649,1650,1,0,0,0,1650,1651, + 1,0,0,0,1651,1653,5,3,0,0,1652,1654,5,147,0,0,1653,1652,1,0,0,0,1653, + 1654,1,0,0,0,1654,1655,1,0,0,0,1655,1657,3,174,87,0,1656,1658,5,147,0, + 0,1657,1656,1,0,0,0,1657,1658,1,0,0,0,1658,1660,1,0,0,0,1659,1641,1,0, + 0,0,1659,1660,1,0,0,0,1660,1661,1,0,0,0,1661,1662,5,4,0,0,1662,173,1, + 0,0,0,1663,1665,5,8,0,0,1664,1666,5,147,0,0,1665,1664,1,0,0,0,1665,1666, + 1,0,0,0,1666,1668,1,0,0,0,1667,1669,3,132,66,0,1668,1667,1,0,0,0,1668, + 1669,1,0,0,0,1669,1671,1,0,0,0,1670,1672,5,147,0,0,1671,1670,1,0,0,0, + 1671,1672,1,0,0,0,1672,1673,1,0,0,0,1673,1674,5,9,0,0,1674,175,1,0,0, + 0,1675,1677,5,8,0,0,1676,1678,5,147,0,0,1677,1676,1,0,0,0,1677,1678,1, + 0,0,0,1678,1680,1,0,0,0,1679,1681,3,132,66,0,1680,1679,1,0,0,0,1680,1681, + 1,0,0,0,1681,1683,1,0,0,0,1682,1684,5,147,0,0,1683,1682,1,0,0,0,1683, + 1684,1,0,0,0,1684,1685,1,0,0,0,1685,1686,5,9,0,0,1686,177,1,0,0,0,1687, + 1688,5,135,0,0,1688,179,1,0,0,0,1689,1690,5,135,0,0,1690,181,1,0,0,0, + 1691,1692,3,280,140,0,1692,183,1,0,0,0,1693,1694,3,280,140,0,1694,185, + 1,0,0,0,1695,1696,3,188,94,0,1696,187,1,0,0,0,1697,1704,3,190,95,0,1698, + 1699,5,147,0,0,1699,1700,5,110,0,0,1700,1701,5,147,0,0,1701,1703,3,190, + 95,0,1702,1698,1,0,0,0,1703,1706,1,0,0,0,1704,1702,1,0,0,0,1704,1705, + 1,0,0,0,1705,189,1,0,0,0,1706,1704,1,0,0,0,1707,1714,3,192,96,0,1708, + 1709,5,147,0,0,1709,1710,5,111,0,0,1710,1711,5,147,0,0,1711,1713,3,192, + 96,0,1712,1708,1,0,0,0,1713,1716,1,0,0,0,1714,1712,1,0,0,0,1714,1715, + 1,0,0,0,1715,191,1,0,0,0,1716,1714,1,0,0,0,1717,1724,3,194,97,0,1718, + 1719,5,147,0,0,1719,1720,5,112,0,0,1720,1721,5,147,0,0,1721,1723,3,194, + 97,0,1722,1718,1,0,0,0,1723,1726,1,0,0,0,1724,1722,1,0,0,0,1724,1725, + 1,0,0,0,1725,193,1,0,0,0,1726,1724,1,0,0,0,1727,1729,5,113,0,0,1728,1730, + 5,147,0,0,1729,1728,1,0,0,0,1729,1730,1,0,0,0,1730,1732,1,0,0,0,1731, + 1727,1,0,0,0,1732,1735,1,0,0,0,1733,1731,1,0,0,0,1733,1734,1,0,0,0,1734, + 1736,1,0,0,0,1735,1733,1,0,0,0,1736,1737,3,196,98,0,1737,195,1,0,0,0, + 1738,1748,3,200,100,0,1739,1741,5,147,0,0,1740,1739,1,0,0,0,1740,1741, + 1,0,0,0,1741,1742,1,0,0,0,1742,1744,3,198,99,0,1743,1745,5,147,0,0,1744, + 1743,1,0,0,0,1744,1745,1,0,0,0,1745,1746,1,0,0,0,1746,1747,3,200,100, + 0,1747,1749,1,0,0,0,1748,1740,1,0,0,0,1748,1749,1,0,0,0,1749,1787,1,0, + 0,0,1750,1752,3,200,100,0,1751,1753,5,147,0,0,1752,1751,1,0,0,0,1752, + 1753,1,0,0,0,1753,1754,1,0,0,0,1754,1756,5,114,0,0,1755,1757,5,147,0, + 0,1756,1755,1,0,0,0,1756,1757,1,0,0,0,1757,1758,1,0,0,0,1758,1759,3,200, + 100,0,1759,1760,1,0,0,0,1760,1761,6,98,-1,0,1761,1787,1,0,0,0,1762,1764, + 3,200,100,0,1763,1765,5,147,0,0,1764,1763,1,0,0,0,1764,1765,1,0,0,0,1765, + 1766,1,0,0,0,1766,1768,3,198,99,0,1767,1769,5,147,0,0,1768,1767,1,0,0, + 0,1768,1769,1,0,0,0,1769,1770,1,0,0,0,1770,1780,3,200,100,0,1771,1773, + 5,147,0,0,1772,1771,1,0,0,0,1772,1773,1,0,0,0,1773,1774,1,0,0,0,1774, + 1776,3,198,99,0,1775,1777,5,147,0,0,1776,1775,1,0,0,0,1776,1777,1,0,0, + 0,1777,1778,1,0,0,0,1778,1779,3,200,100,0,1779,1781,1,0,0,0,1780,1772, + 1,0,0,0,1781,1782,1,0,0,0,1782,1780,1,0,0,0,1782,1783,1,0,0,0,1783,1784, + 1,0,0,0,1784,1785,6,98,-1,0,1785,1787,1,0,0,0,1786,1738,1,0,0,0,1786, + 1750,1,0,0,0,1786,1762,1,0,0,0,1787,197,1,0,0,0,1788,1789,7,2,0,0,1789, + 199,1,0,0,0,1790,1801,3,202,101,0,1791,1793,5,147,0,0,1792,1791,1,0,0, + 0,1792,1793,1,0,0,0,1793,1794,1,0,0,0,1794,1796,5,10,0,0,1795,1797,5, + 147,0,0,1796,1795,1,0,0,0,1796,1797,1,0,0,0,1797,1798,1,0,0,0,1798,1800, + 3,202,101,0,1799,1792,1,0,0,0,1800,1803,1,0,0,0,1801,1799,1,0,0,0,1801, + 1802,1,0,0,0,1802,201,1,0,0,0,1803,1801,1,0,0,0,1804,1815,3,204,102,0, + 1805,1807,5,147,0,0,1806,1805,1,0,0,0,1806,1807,1,0,0,0,1807,1808,1,0, + 0,0,1808,1810,5,17,0,0,1809,1811,5,147,0,0,1810,1809,1,0,0,0,1810,1811, + 1,0,0,0,1811,1812,1,0,0,0,1812,1814,3,204,102,0,1813,1806,1,0,0,0,1814, + 1817,1,0,0,0,1815,1813,1,0,0,0,1815,1816,1,0,0,0,1816,203,1,0,0,0,1817, + 1815,1,0,0,0,1818,1830,3,208,104,0,1819,1821,5,147,0,0,1820,1819,1,0, + 0,0,1820,1821,1,0,0,0,1821,1822,1,0,0,0,1822,1824,3,206,103,0,1823,1825, + 5,147,0,0,1824,1823,1,0,0,0,1824,1825,1,0,0,0,1825,1826,1,0,0,0,1826, + 1827,3,208,104,0,1827,1829,1,0,0,0,1828,1820,1,0,0,0,1829,1832,1,0,0, + 0,1830,1828,1,0,0,0,1830,1831,1,0,0,0,1831,205,1,0,0,0,1832,1830,1,0, + 0,0,1833,1834,7,3,0,0,1834,207,1,0,0,0,1835,1847,3,212,106,0,1836,1838, + 5,147,0,0,1837,1836,1,0,0,0,1837,1838,1,0,0,0,1838,1839,1,0,0,0,1839, + 1841,3,210,105,0,1840,1842,5,147,0,0,1841,1840,1,0,0,0,1841,1842,1,0, + 0,0,1842,1843,1,0,0,0,1843,1844,3,212,106,0,1844,1846,1,0,0,0,1845,1837, + 1,0,0,0,1846,1849,1,0,0,0,1847,1845,1,0,0,0,1847,1848,1,0,0,0,1848,209, + 1,0,0,0,1849,1847,1,0,0,0,1850,1851,7,4,0,0,1851,211,1,0,0,0,1852,1864, + 3,216,108,0,1853,1855,5,147,0,0,1854,1853,1,0,0,0,1854,1855,1,0,0,0,1855, + 1856,1,0,0,0,1856,1858,3,214,107,0,1857,1859,5,147,0,0,1858,1857,1,0, + 0,0,1858,1859,1,0,0,0,1859,1860,1,0,0,0,1860,1861,3,216,108,0,1861,1863, + 1,0,0,0,1862,1854,1,0,0,0,1863,1866,1,0,0,0,1864,1862,1,0,0,0,1864,1865, + 1,0,0,0,1865,213,1,0,0,0,1866,1864,1,0,0,0,1867,1868,7,5,0,0,1868,215, + 1,0,0,0,1869,1880,3,218,109,0,1870,1872,5,147,0,0,1871,1870,1,0,0,0,1871, + 1872,1,0,0,0,1872,1873,1,0,0,0,1873,1875,5,23,0,0,1874,1876,5,147,0,0, + 1875,1874,1,0,0,0,1875,1876,1,0,0,0,1876,1877,1,0,0,0,1877,1879,3,218, + 109,0,1878,1871,1,0,0,0,1879,1882,1,0,0,0,1880,1878,1,0,0,0,1880,1881, + 1,0,0,0,1881,217,1,0,0,0,1882,1880,1,0,0,0,1883,1885,5,115,0,0,1884,1886, + 5,147,0,0,1885,1884,1,0,0,0,1885,1886,1,0,0,0,1886,1888,1,0,0,0,1887, + 1883,1,0,0,0,1888,1891,1,0,0,0,1889,1887,1,0,0,0,1889,1890,1,0,0,0,1890, + 1892,1,0,0,0,1891,1889,1,0,0,0,1892,1897,3,220,110,0,1893,1895,5,147, + 0,0,1894,1893,1,0,0,0,1894,1895,1,0,0,0,1895,1896,1,0,0,0,1896,1898,5, + 116,0,0,1897,1894,1,0,0,0,1897,1898,1,0,0,0,1898,219,1,0,0,0,1899,1907, + 3,230,115,0,1900,1908,3,224,112,0,1901,1903,3,222,111,0,1902,1901,1,0, + 0,0,1903,1904,1,0,0,0,1904,1902,1,0,0,0,1904,1905,1,0,0,0,1905,1908,1, + 0,0,0,1906,1908,3,228,114,0,1907,1900,1,0,0,0,1907,1902,1,0,0,0,1907, + 1906,1,0,0,0,1907,1908,1,0,0,0,1908,221,1,0,0,0,1909,1910,5,147,0,0,1910, + 1912,5,118,0,0,1911,1913,5,147,0,0,1912,1911,1,0,0,0,1912,1913,1,0,0, + 0,1913,1914,1,0,0,0,1914,1929,3,230,115,0,1915,1916,5,6,0,0,1916,1917, + 3,186,93,0,1917,1918,5,7,0,0,1918,1929,1,0,0,0,1919,1921,5,6,0,0,1920, + 1922,3,186,93,0,1921,1920,1,0,0,0,1921,1922,1,0,0,0,1922,1923,1,0,0,0, + 1923,1925,5,117,0,0,1924,1926,3,186,93,0,1925,1924,1,0,0,0,1925,1926, + 1,0,0,0,1926,1927,1,0,0,0,1927,1929,5,7,0,0,1928,1909,1,0,0,0,1928,1915, + 1,0,0,0,1928,1919,1,0,0,0,1929,223,1,0,0,0,1930,1942,3,226,113,0,1931, + 1932,5,147,0,0,1932,1933,5,119,0,0,1933,1934,5,147,0,0,1934,1942,5,95, + 0,0,1935,1936,5,147,0,0,1936,1937,5,120,0,0,1937,1938,5,147,0,0,1938, + 1942,5,95,0,0,1939,1940,5,147,0,0,1940,1942,5,121,0,0,1941,1930,1,0,0, + 0,1941,1931,1,0,0,0,1941,1935,1,0,0,0,1941,1939,1,0,0,0,1942,1944,1,0, + 0,0,1943,1945,5,147,0,0,1944,1943,1,0,0,0,1944,1945,1,0,0,0,1945,1946, + 1,0,0,0,1946,1947,3,230,115,0,1947,225,1,0,0,0,1948,1950,5,147,0,0,1949, + 1948,1,0,0,0,1949,1950,1,0,0,0,1950,1951,1,0,0,0,1951,1952,5,24,0,0,1952, + 227,1,0,0,0,1953,1954,5,147,0,0,1954,1955,5,122,0,0,1955,1956,5,147,0, + 0,1956,1964,5,123,0,0,1957,1958,5,147,0,0,1958,1959,5,122,0,0,1959,1960, + 5,147,0,0,1960,1961,5,113,0,0,1961,1962,5,147,0,0,1962,1964,5,123,0,0, + 1963,1953,1,0,0,0,1963,1957,1,0,0,0,1964,229,1,0,0,0,1965,1972,3,232, + 116,0,1966,1968,5,147,0,0,1967,1966,1,0,0,0,1967,1968,1,0,0,0,1968,1969, + 1,0,0,0,1969,1971,3,260,130,0,1970,1967,1,0,0,0,1971,1974,1,0,0,0,1972, + 1970,1,0,0,0,1972,1973,1,0,0,0,1973,231,1,0,0,0,1974,1972,1,0,0,0,1975, + 1985,3,234,117,0,1976,1985,3,270,135,0,1977,1985,3,262,131,0,1978,1985, + 3,246,123,0,1979,1985,3,248,124,0,1980,1985,3,254,127,0,1981,1985,3,256, + 128,0,1982,1985,3,258,129,0,1983,1985,3,266,133,0,1984,1975,1,0,0,0,1984, + 1976,1,0,0,0,1984,1977,1,0,0,0,1984,1978,1,0,0,0,1984,1979,1,0,0,0,1984, + 1980,1,0,0,0,1984,1981,1,0,0,0,1984,1982,1,0,0,0,1984,1983,1,0,0,0,1985, + 233,1,0,0,0,1986,1993,3,268,134,0,1987,1993,5,133,0,0,1988,1993,3,236, + 118,0,1989,1993,5,123,0,0,1990,1993,3,238,119,0,1991,1993,3,242,121,0, + 1992,1986,1,0,0,0,1992,1987,1,0,0,0,1992,1988,1,0,0,0,1992,1989,1,0,0, + 0,1992,1990,1,0,0,0,1992,1991,1,0,0,0,1993,235,1,0,0,0,1994,1995,7,6, + 0,0,1995,237,1,0,0,0,1996,1998,5,6,0,0,1997,1999,5,147,0,0,1998,1997, + 1,0,0,0,1998,1999,1,0,0,0,1999,2013,1,0,0,0,2000,2002,3,186,93,0,2001, + 2003,5,147,0,0,2002,2001,1,0,0,0,2002,2003,1,0,0,0,2003,2010,1,0,0,0, + 2004,2006,3,240,120,0,2005,2007,5,147,0,0,2006,2005,1,0,0,0,2006,2007, + 1,0,0,0,2007,2009,1,0,0,0,2008,2004,1,0,0,0,2009,2012,1,0,0,0,2010,2008, + 1,0,0,0,2010,2011,1,0,0,0,2011,2014,1,0,0,0,2012,2010,1,0,0,0,2013,2000, + 1,0,0,0,2013,2014,1,0,0,0,2014,2015,1,0,0,0,2015,2016,5,7,0,0,2016,239, + 1,0,0,0,2017,2019,5,3,0,0,2018,2020,5,147,0,0,2019,2018,1,0,0,0,2019, + 2020,1,0,0,0,2020,2022,1,0,0,0,2021,2023,3,186,93,0,2022,2021,1,0,0,0, + 2022,2023,1,0,0,0,2023,241,1,0,0,0,2024,2026,5,8,0,0,2025,2027,5,147, + 0,0,2026,2025,1,0,0,0,2026,2027,1,0,0,0,2027,2028,1,0,0,0,2028,2030,3, + 244,122,0,2029,2031,5,147,0,0,2030,2029,1,0,0,0,2030,2031,1,0,0,0,2031, + 2042,1,0,0,0,2032,2034,5,3,0,0,2033,2035,5,147,0,0,2034,2033,1,0,0,0, + 2034,2035,1,0,0,0,2035,2036,1,0,0,0,2036,2038,3,244,122,0,2037,2039,5, + 147,0,0,2038,2037,1,0,0,0,2038,2039,1,0,0,0,2039,2041,1,0,0,0,2040,2032, + 1,0,0,0,2041,2044,1,0,0,0,2042,2040,1,0,0,0,2042,2043,1,0,0,0,2043,2045, + 1,0,0,0,2044,2042,1,0,0,0,2045,2046,5,9,0,0,2046,243,1,0,0,0,2047,2050, + 3,282,141,0,2048,2050,5,133,0,0,2049,2047,1,0,0,0,2049,2048,1,0,0,0,2050, + 2052,1,0,0,0,2051,2053,5,147,0,0,2052,2051,1,0,0,0,2052,2053,1,0,0,0, + 2053,2054,1,0,0,0,2054,2056,5,117,0,0,2055,2057,5,147,0,0,2056,2055,1, + 0,0,0,2056,2057,1,0,0,0,2057,2058,1,0,0,0,2058,2059,3,186,93,0,2059,245, + 1,0,0,0,2060,2062,5,2,0,0,2061,2063,5,147,0,0,2062,2061,1,0,0,0,2062, + 2063,1,0,0,0,2063,2064,1,0,0,0,2064,2066,3,186,93,0,2065,2067,5,147,0, + 0,2066,2065,1,0,0,0,2066,2067,1,0,0,0,2067,2068,1,0,0,0,2068,2069,5,4, + 0,0,2069,247,1,0,0,0,2070,2072,5,126,0,0,2071,2073,5,147,0,0,2072,2071, + 1,0,0,0,2072,2073,1,0,0,0,2073,2074,1,0,0,0,2074,2076,5,2,0,0,2075,2077, + 5,147,0,0,2076,2075,1,0,0,0,2076,2077,1,0,0,0,2077,2078,1,0,0,0,2078, + 2080,5,98,0,0,2079,2081,5,147,0,0,2080,2079,1,0,0,0,2080,2081,1,0,0,0, + 2081,2082,1,0,0,0,2082,2119,5,4,0,0,2083,2085,3,250,125,0,2084,2086,5, + 147,0,0,2085,2084,1,0,0,0,2085,2086,1,0,0,0,2086,2087,1,0,0,0,2087,2089, + 5,2,0,0,2088,2090,5,147,0,0,2089,2088,1,0,0,0,2089,2090,1,0,0,0,2090, + 2095,1,0,0,0,2091,2093,5,97,0,0,2092,2094,5,147,0,0,2093,2092,1,0,0,0, + 2093,2094,1,0,0,0,2094,2096,1,0,0,0,2095,2091,1,0,0,0,2095,2096,1,0,0, + 0,2096,2114,1,0,0,0,2097,2099,3,252,126,0,2098,2100,5,147,0,0,2099,2098, + 1,0,0,0,2099,2100,1,0,0,0,2100,2111,1,0,0,0,2101,2103,5,3,0,0,2102,2104, + 5,147,0,0,2103,2102,1,0,0,0,2103,2104,1,0,0,0,2104,2105,1,0,0,0,2105, + 2107,3,252,126,0,2106,2108,5,147,0,0,2107,2106,1,0,0,0,2107,2108,1,0, + 0,0,2108,2110,1,0,0,0,2109,2101,1,0,0,0,2110,2113,1,0,0,0,2111,2109,1, + 0,0,0,2111,2112,1,0,0,0,2112,2115,1,0,0,0,2113,2111,1,0,0,0,2114,2097, + 1,0,0,0,2114,2115,1,0,0,0,2115,2116,1,0,0,0,2116,2117,5,4,0,0,2117,2119, + 1,0,0,0,2118,2070,1,0,0,0,2118,2083,1,0,0,0,2119,249,1,0,0,0,2120,2121, + 3,282,141,0,2121,251,1,0,0,0,2122,2124,3,282,141,0,2123,2125,5,147,0, + 0,2124,2123,1,0,0,0,2124,2125,1,0,0,0,2125,2126,1,0,0,0,2126,2127,5,117, + 0,0,2127,2129,5,5,0,0,2128,2130,5,147,0,0,2129,2128,1,0,0,0,2129,2130, + 1,0,0,0,2130,2132,1,0,0,0,2131,2122,1,0,0,0,2131,2132,1,0,0,0,2132,2133, + 1,0,0,0,2133,2134,3,186,93,0,2134,253,1,0,0,0,2135,2140,3,154,77,0,2136, + 2138,5,147,0,0,2137,2136,1,0,0,0,2137,2138,1,0,0,0,2138,2139,1,0,0,0, + 2139,2141,3,156,78,0,2140,2137,1,0,0,0,2141,2142,1,0,0,0,2142,2140,1, + 0,0,0,2142,2143,1,0,0,0,2143,255,1,0,0,0,2144,2146,5,127,0,0,2145,2147, + 5,147,0,0,2146,2145,1,0,0,0,2146,2147,1,0,0,0,2147,2148,1,0,0,0,2148, + 2150,5,8,0,0,2149,2151,5,147,0,0,2150,2149,1,0,0,0,2150,2151,1,0,0,0, + 2151,2152,1,0,0,0,2152,2154,5,87,0,0,2153,2155,5,147,0,0,2154,2153,1, + 0,0,0,2154,2155,1,0,0,0,2155,2156,1,0,0,0,2156,2161,3,146,73,0,2157,2159, + 5,147,0,0,2158,2157,1,0,0,0,2158,2159,1,0,0,0,2159,2160,1,0,0,0,2160, + 2162,3,144,72,0,2161,2158,1,0,0,0,2161,2162,1,0,0,0,2162,2164,1,0,0,0, + 2163,2165,5,147,0,0,2164,2163,1,0,0,0,2164,2165,1,0,0,0,2165,2166,1,0, + 0,0,2166,2167,5,9,0,0,2167,257,1,0,0,0,2168,2170,5,126,0,0,2169,2171, + 5,147,0,0,2170,2169,1,0,0,0,2170,2171,1,0,0,0,2171,2172,1,0,0,0,2172, + 2174,5,8,0,0,2173,2175,5,147,0,0,2174,2173,1,0,0,0,2174,2175,1,0,0,0, + 2175,2176,1,0,0,0,2176,2178,5,87,0,0,2177,2179,5,147,0,0,2178,2177,1, + 0,0,0,2178,2179,1,0,0,0,2179,2180,1,0,0,0,2180,2185,3,146,73,0,2181,2183, + 5,147,0,0,2182,2181,1,0,0,0,2182,2183,1,0,0,0,2183,2184,1,0,0,0,2184, + 2186,3,144,72,0,2185,2182,1,0,0,0,2185,2186,1,0,0,0,2186,2188,1,0,0,0, + 2187,2189,5,147,0,0,2188,2187,1,0,0,0,2188,2189,1,0,0,0,2189,2190,1,0, + 0,0,2190,2191,5,9,0,0,2191,259,1,0,0,0,2192,2194,5,25,0,0,2193,2195,5, + 147,0,0,2194,2193,1,0,0,0,2194,2195,1,0,0,0,2195,2198,1,0,0,0,2196,2199, + 3,274,137,0,2197,2199,5,98,0,0,2198,2196,1,0,0,0,2198,2197,1,0,0,0,2199, + 261,1,0,0,0,2200,2205,5,128,0,0,2201,2203,5,147,0,0,2202,2201,1,0,0,0, + 2202,2203,1,0,0,0,2203,2204,1,0,0,0,2204,2206,3,264,132,0,2205,2202,1, + 0,0,0,2206,2207,1,0,0,0,2207,2205,1,0,0,0,2207,2208,1,0,0,0,2208,2223, + 1,0,0,0,2209,2211,5,128,0,0,2210,2212,5,147,0,0,2211,2210,1,0,0,0,2211, + 2212,1,0,0,0,2212,2213,1,0,0,0,2213,2218,3,186,93,0,2214,2216,5,147,0, + 0,2215,2214,1,0,0,0,2215,2216,1,0,0,0,2216,2217,1,0,0,0,2217,2219,3,264, + 132,0,2218,2215,1,0,0,0,2219,2220,1,0,0,0,2220,2218,1,0,0,0,2220,2221, + 1,0,0,0,2221,2223,1,0,0,0,2222,2200,1,0,0,0,2222,2209,1,0,0,0,2223,2232, + 1,0,0,0,2224,2226,5,147,0,0,2225,2224,1,0,0,0,2225,2226,1,0,0,0,2226, + 2227,1,0,0,0,2227,2229,5,129,0,0,2228,2230,5,147,0,0,2229,2228,1,0,0, + 0,2229,2230,1,0,0,0,2230,2231,1,0,0,0,2231,2233,3,186,93,0,2232,2225, + 1,0,0,0,2232,2233,1,0,0,0,2233,2235,1,0,0,0,2234,2236,5,147,0,0,2235, + 2234,1,0,0,0,2235,2236,1,0,0,0,2236,2237,1,0,0,0,2237,2238,5,130,0,0, + 2238,263,1,0,0,0,2239,2241,5,131,0,0,2240,2242,5,147,0,0,2241,2240,1, + 0,0,0,2241,2242,1,0,0,0,2242,2243,1,0,0,0,2243,2245,3,186,93,0,2244,2246, + 5,147,0,0,2245,2244,1,0,0,0,2245,2246,1,0,0,0,2246,2247,1,0,0,0,2247, + 2249,5,132,0,0,2248,2250,5,147,0,0,2249,2248,1,0,0,0,2249,2250,1,0,0, + 0,2250,2251,1,0,0,0,2251,2252,3,186,93,0,2252,265,1,0,0,0,2253,2254,3, + 282,141,0,2254,267,1,0,0,0,2255,2258,3,278,139,0,2256,2258,3,276,138, + 0,2257,2255,1,0,0,0,2257,2256,1,0,0,0,2258,269,1,0,0,0,2259,2262,5,26, + 0,0,2260,2263,3,282,141,0,2261,2263,5,135,0,0,2262,2260,1,0,0,0,2262, + 2261,1,0,0,0,2263,271,1,0,0,0,2264,2266,3,232,116,0,2265,2267,5,147,0, + 0,2266,2265,1,0,0,0,2266,2267,1,0,0,0,2267,2268,1,0,0,0,2268,2269,3,260, + 130,0,2269,273,1,0,0,0,2270,2271,3,280,140,0,2271,275,1,0,0,0,2272,2273, + 5,135,0,0,2273,277,1,0,0,0,2274,2275,5,142,0,0,2275,279,1,0,0,0,2276, + 2277,3,282,141,0,2277,281,1,0,0,0,2278,2284,5,143,0,0,2279,2280,5,146, + 0,0,2280,2284,6,141,-1,0,2281,2284,5,136,0,0,2282,2284,3,284,142,0,2283, + 2278,1,0,0,0,2283,2279,1,0,0,0,2283,2281,1,0,0,0,2283,2282,1,0,0,0,2284, + 283,1,0,0,0,2285,2286,7,7,0,0,2286,285,1,0,0,0,2287,2288,7,8,0,0,2288, + 287,1,0,0,0,2289,2290,7,9,0,0,2290,289,1,0,0,0,2291,2292,7,10,0,0,2292, + 291,1,0,0,0,396,294,298,303,307,312,315,319,322,336,342,346,349,355,358, + 362,366,370,375,379,386,390,395,405,409,413,418,431,435,443,446,454,457, + 469,473,495,499,502,505,508,511,515,520,524,534,538,543,548,553,559,563, + 567,572,579,583,587,590,594,598,602,607,611,617,621,631,641,645,649,653, + 658,670,674,678,682,686,688,692,696,698,712,716,720,724,729,732,736,740, + 742,746,750,752,788,799,821,825,830,841,845,849,857,861,865,871,875,879, + 885,889,893,897,901,905,911,918,923,929,949,953,961,971,976,981,985,990, + 996,1001,1004,1008,1012,1016,1022,1026,1031,1036,1040,1043,1047,1051, + 1055,1059,1063,1069,1073,1078,1082,1091,1097,1105,1109,1113,1117,1124, + 1127,1130,1133,1139,1142,1146,1150,1154,1157,1161,1171,1177,1184,1197, + 1201,1205,1209,1214,1219,1223,1229,1233,1237,1241,1246,1252,1255,1261, + 1264,1270,1274,1278,1282,1286,1291,1296,1300,1305,1308,1317,1326,1331, + 1344,1347,1355,1359,1364,1369,1373,1378,1384,1389,1396,1400,1404,1406, + 1410,1412,1416,1418,1424,1430,1434,1437,1440,1446,1449,1452,1456,1462, + 1465,1468,1472,1476,1480,1482,1486,1488,1492,1494,1498,1500,1506,1510, + 1514,1518,1522,1526,1530,1534,1538,1541,1547,1551,1555,1558,1563,1568, + 1573,1578,1584,1590,1593,1596,1599,1603,1606,1609,1612,1615,1619,1623, + 1627,1631,1635,1638,1641,1645,1649,1653,1657,1659,1665,1668,1671,1677, + 1680,1683,1704,1714,1724,1729,1733,1740,1744,1748,1752,1756,1764,1768, + 1772,1776,1782,1786,1792,1796,1801,1806,1810,1815,1820,1824,1830,1837, + 1841,1847,1854,1858,1864,1871,1875,1880,1885,1889,1894,1897,1904,1907, + 1912,1921,1925,1928,1941,1944,1949,1963,1967,1972,1984,1992,1998,2002, + 2006,2010,2013,2019,2022,2026,2030,2034,2038,2042,2049,2052,2056,2062, + 2066,2072,2076,2080,2085,2089,2093,2095,2099,2103,2107,2111,2114,2118, + 2124,2129,2131,2137,2142,2146,2150,2154,2158,2161,2164,2170,2174,2178, + 2182,2185,2188,2194,2198,2202,2207,2211,2215,2220,2222,2225,2229,2232, + 2235,2241,2245,2249,2257,2262,2266,2283 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); @@ -1130,29 +1124,29 @@ CypherParser::Ku_StatementsContext* CypherParser::ku_Statements() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(290); + setState(292); oC_Cypher(); - setState(301); + setState(303); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 2, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(292); + setState(294); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(291); + setState(293); match(CypherParser::SP); } - setState(294); - match(CypherParser::T__0); setState(296); + match(CypherParser::T__0); + setState(298); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 1, _ctx)) { case 1: { - setState(295); + setState(297); match(CypherParser::SP); break; } @@ -1160,22 +1154,22 @@ CypherParser::Ku_StatementsContext* CypherParser::ku_Statements() { default: break; } - setState(298); + setState(300); oC_Cypher(); } - setState(303); + setState(305); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 2, _ctx); } - setState(305); + setState(307); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(304); + setState(306); match(CypherParser::SP); } - setState(307); + setState(309); match(CypherParser::EOF); } @@ -1230,41 +1224,41 @@ CypherParser::OC_CypherContext* CypherParser::oC_Cypher() { }); try { enterOuterAlt(_localctx, 1); - setState(310); + setState(312); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::EXPLAIN || _la == CypherParser::PROFILE) { - setState(309); + setState(311); oC_AnyCypherOption(); } - setState(313); + setState(315); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(312); + setState(314); match(CypherParser::SP); } - setState(315); + setState(317); oC_Statement(); - setState(320); + setState(322); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 7, _ctx)) { case 1: { - setState(317); + setState(319); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(316); + setState(318); match(CypherParser::SP); } - setState(319); + setState(321); match(CypherParser::T__0); break; } @@ -1355,89 +1349,89 @@ CypherParser::OC_StatementContext* CypherParser::oC_Statement() { exitRule(); }); try { - setState(334); + setState(336); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 8, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(322); + setState(324); oC_Query(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(323); + setState(325); kU_DDL(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(324); + setState(326); kU_CopyFrom(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(325); + setState(327); kU_CopyFromByColumn(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(326); + setState(328); kU_CopyTO(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(327); + setState(329); kU_StandaloneCall(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(328); + setState(330); kU_CreateMacro(); break; } case 8: { enterOuterAlt(_localctx, 8); - setState(329); + setState(331); kU_CommentOn(); break; } case 9: { enterOuterAlt(_localctx, 9); - setState(330); + setState(332); kU_Transaction(); break; } case 10: { enterOuterAlt(_localctx, 10); - setState(331); + setState(333); kU_Extension(); break; } case 11: { enterOuterAlt(_localctx, 11); - setState(332); + setState(334); kU_ExportDatabase(); break; } case 12: { enterOuterAlt(_localctx, 12); - setState(333); + setState(335); kU_ImportDatabase(); break; } @@ -1482,12 +1476,8 @@ tree::TerminalNode* CypherParser::KU_CopyFromContext::FROM() { return getToken(CypherParser::FROM, 0); } -CypherParser::KU_FilePathsContext* CypherParser::KU_CopyFromContext::kU_FilePaths() { - return getRuleContext(0); -} - -CypherParser::OC_VariableContext* CypherParser::KU_CopyFromContext::oC_Variable() { - return getRuleContext(0); +CypherParser::KU_ScanSourceContext* CypherParser::KU_CopyFromContext::kU_ScanSource() { + return getRuleContext(0); } CypherParser::KU_ParsingOptionsContext* CypherParser::KU_CopyFromContext::kU_ParsingOptions() { @@ -1518,59 +1508,39 @@ CypherParser::KU_CopyFromContext* CypherParser::kU_CopyFrom() { }); try { enterOuterAlt(_localctx, 1); - setState(336); + setState(338); match(CypherParser::COPY); - setState(337); + setState(339); match(CypherParser::SP); - setState(338); + setState(340); oC_SchemaName(); - setState(355); + setState(349); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 13, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 11, _ctx)) { case 1: { - setState(340); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(339); - match(CypherParser::SP); - } setState(342); - match(CypherParser::T__1); - setState(344); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(343); + setState(341); match(CypherParser::SP); } - setState(346); + setState(344); kU_ColumnNames(); - setState(348); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(347); - match(CypherParser::SP); - } - setState(350); - match(CypherParser::T__2); - setState(352); + setState(346); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(351); + setState(345); match(CypherParser::SP); } break; } case 2: { - setState(354); + setState(348); match(CypherParser::SP); break; } @@ -1578,77 +1548,27 @@ CypherParser::KU_CopyFromContext* CypherParser::kU_CopyFrom() { default: break; } - setState(357); + setState(351); match(CypherParser::FROM); - setState(358); + setState(352); match(CypherParser::SP); - setState(361); - _errHandler->sync(this); - switch (_input->LA(1)) { - case CypherParser::T__5: - case CypherParser::GLOB: - case CypherParser::StringLiteral: { - setState(359); - kU_FilePaths(); - break; - } - - case CypherParser::COMMENT_: - case CypherParser::EXPORT: - case CypherParser::IMPORT: - case CypherParser::DATABASE: - case CypherParser::NODE: - case CypherParser::REL: - case CypherParser::BEGIN: - case CypherParser::IN: - case CypherParser::COUNT: - case CypherParser::END: - case CypherParser::HexLetter: - case CypherParser::UnescapedSymbolicName: - case CypherParser::EscapedSymbolicName: { - setState(360); - oC_Variable(); - break; - } - - default: - throw NoViableAltException(this); - } - setState(376); + setState(353); + kU_ScanSource(); + setState(358); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 18, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 13, _ctx)) { case 1: { - setState(364); + setState(355); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(363); + setState(354); match(CypherParser::SP); } - setState(366); - match(CypherParser::T__1); - setState(368); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(367); - match(CypherParser::SP); - } - setState(370); + setState(357); kU_ParsingOptions(); - setState(372); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(371); - match(CypherParser::SP); - } - setState(374); - match(CypherParser::T__2); break; } @@ -1709,37 +1629,174 @@ CypherParser::KU_ColumnNamesContext* CypherParser::kU_ColumnNames() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(378); + setState(360); + match(CypherParser::T__1); + setState(362); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(361); + match(CypherParser::SP); + } + setState(364); oC_SchemaName(); - setState(389); + setState(375); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 21, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 17, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(380); + setState(366); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(379); + setState(365); match(CypherParser::SP); } - setState(382); - match(CypherParser::T__3); - setState(384); + setState(368); + match(CypherParser::T__2); + setState(370); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(383); + setState(369); match(CypherParser::SP); } - setState(386); + setState(372); oC_SchemaName(); } - setState(391); + setState(377); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 21, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 17, _ctx); + } + setState(379); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(378); + match(CypherParser::SP); + } + setState(381); + match(CypherParser::T__3); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- KU_ScanSourceContext ------------------------------------------------------------------ + +CypherParser::KU_ScanSourceContext::KU_ScanSourceContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +CypherParser::KU_FilePathsContext* CypherParser::KU_ScanSourceContext::kU_FilePaths() { + return getRuleContext(0); +} + +CypherParser::OC_QueryContext* CypherParser::KU_ScanSourceContext::oC_Query() { + return getRuleContext(0); +} + +std::vector CypherParser::KU_ScanSourceContext::SP() { + return getTokens(CypherParser::SP); +} + +tree::TerminalNode* CypherParser::KU_ScanSourceContext::SP(size_t i) { + return getToken(CypherParser::SP, i); +} + +CypherParser::OC_VariableContext* CypherParser::KU_ScanSourceContext::oC_Variable() { + return getRuleContext(0); +} + + +size_t CypherParser::KU_ScanSourceContext::getRuleIndex() const { + return CypherParser::RuleKU_ScanSource; +} + + +CypherParser::KU_ScanSourceContext* CypherParser::kU_ScanSource() { + KU_ScanSourceContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 10, CypherParser::RuleKU_ScanSource); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(395); + _errHandler->sync(this); + switch (_input->LA(1)) { + case CypherParser::T__5: + case CypherParser::GLOB: + case CypherParser::StringLiteral: { + enterOuterAlt(_localctx, 1); + setState(383); + kU_FilePaths(); + break; + } + + case CypherParser::T__1: { + enterOuterAlt(_localctx, 2); + setState(384); + match(CypherParser::T__1); + setState(386); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(385); + match(CypherParser::SP); + } + setState(388); + oC_Query(); + setState(390); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(389); + match(CypherParser::SP); + } + setState(392); + match(CypherParser::T__3); + break; + } + + case CypherParser::COMMENT_: + case CypherParser::EXPORT: + case CypherParser::IMPORT: + case CypherParser::DATABASE: + case CypherParser::NODE: + case CypherParser::REL: + case CypherParser::BEGIN: + case CypherParser::IN: + case CypherParser::COUNT: + case CypherParser::END: + case CypherParser::HexLetter: + case CypherParser::UnescapedSymbolicName: + case CypherParser::EscapedSymbolicName: { + enterOuterAlt(_localctx, 3); + setState(394); + oC_Variable(); + break; + } + + default: + throw NoViableAltException(this); } } @@ -1802,7 +1859,7 @@ size_t CypherParser::KU_CopyFromByColumnContext::getRuleIndex() const { CypherParser::KU_CopyFromByColumnContext* CypherParser::kU_CopyFromByColumn() { KU_CopyFromByColumnContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 10, CypherParser::RuleKU_CopyFromByColumn); + enterRule(_localctx, 12, CypherParser::RuleKU_CopyFromByColumn); size_t _la = 0; #if __cplusplus > 201703L @@ -1814,67 +1871,67 @@ CypherParser::KU_CopyFromByColumnContext* CypherParser::kU_CopyFromByColumn() { }); try { enterOuterAlt(_localctx, 1); - setState(392); + setState(397); match(CypherParser::COPY); - setState(393); + setState(398); match(CypherParser::SP); - setState(394); + setState(399); oC_SchemaName(); - setState(395); + setState(400); match(CypherParser::SP); - setState(396); + setState(401); match(CypherParser::FROM); - setState(397); + setState(402); match(CypherParser::SP); - setState(398); + setState(403); match(CypherParser::T__1); - setState(400); + setState(405); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(399); + setState(404); match(CypherParser::SP); } - setState(402); + setState(407); match(CypherParser::StringLiteral); - setState(413); + setState(418); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3 || _la == CypherParser::SP) { - setState(404); + while (_la == CypherParser::T__2 || _la == CypherParser::SP) { + setState(409); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(403); + setState(408); match(CypherParser::SP); } - setState(406); - match(CypherParser::T__3); - setState(408); + setState(411); + match(CypherParser::T__2); + setState(413); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(407); + setState(412); match(CypherParser::SP); } - setState(410); - match(CypherParser::StringLiteral); setState(415); + match(CypherParser::StringLiteral); + setState(420); _errHandler->sync(this); _la = _input->LA(1); } - setState(416); - match(CypherParser::T__2); - setState(417); + setState(421); + match(CypherParser::T__3); + setState(422); match(CypherParser::SP); - setState(418); + setState(423); match(CypherParser::BY); - setState(419); + setState(424); match(CypherParser::SP); - setState(420); + setState(425); match(CypherParser::COLUMN); } @@ -1929,7 +1986,7 @@ size_t CypherParser::KU_CopyTOContext::getRuleIndex() const { CypherParser::KU_CopyTOContext* CypherParser::kU_CopyTO() { KU_CopyTOContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 12, CypherParser::RuleKU_CopyTO); + enterRule(_localctx, 14, CypherParser::RuleKU_CopyTO); size_t _la = 0; #if __cplusplus > 201703L @@ -1941,75 +1998,55 @@ CypherParser::KU_CopyTOContext* CypherParser::kU_CopyTO() { }); try { enterOuterAlt(_localctx, 1); - setState(422); + setState(427); match(CypherParser::COPY); - setState(423); + setState(428); match(CypherParser::SP); - setState(424); + setState(429); match(CypherParser::T__1); - setState(426); + setState(431); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(425); + setState(430); match(CypherParser::SP); } - setState(428); + setState(433); oC_Query(); - setState(430); + setState(435); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(429); + setState(434); match(CypherParser::SP); } - setState(432); - match(CypherParser::T__2); - setState(433); + setState(437); + match(CypherParser::T__3); + setState(438); match(CypherParser::SP); - setState(434); + setState(439); match(CypherParser::TO); - setState(435); + setState(440); match(CypherParser::SP); - setState(436); + setState(441); match(CypherParser::StringLiteral); - setState(450); + setState(446); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 29, _ctx)) { case 1: { - setState(438); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(437); - match(CypherParser::SP); - } - setState(440); - match(CypherParser::T__1); - setState(442); + setState(443); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(441); + setState(442); match(CypherParser::SP); } - setState(444); + setState(445); kU_ParsingOptions(); - setState(446); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(445); - match(CypherParser::SP); - } - setState(448); - match(CypherParser::T__2); break; } @@ -2065,7 +2102,7 @@ size_t CypherParser::KU_ExportDatabaseContext::getRuleIndex() const { CypherParser::KU_ExportDatabaseContext* CypherParser::kU_ExportDatabase() { KU_ExportDatabaseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 14, CypherParser::RuleKU_ExportDatabase); + enterRule(_localctx, 16, CypherParser::RuleKU_ExportDatabase); size_t _la = 0; #if __cplusplus > 201703L @@ -2077,51 +2114,31 @@ CypherParser::KU_ExportDatabaseContext* CypherParser::kU_ExportDatabase() { }); try { enterOuterAlt(_localctx, 1); - setState(452); + setState(448); match(CypherParser::EXPORT); - setState(453); + setState(449); match(CypherParser::SP); - setState(454); + setState(450); match(CypherParser::DATABASE); - setState(455); + setState(451); match(CypherParser::SP); - setState(456); + setState(452); match(CypherParser::StringLiteral); - setState(470); + setState(457); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 35, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { case 1: { - setState(458); + setState(454); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(457); + setState(453); match(CypherParser::SP); } - setState(460); - match(CypherParser::T__1); - setState(462); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(461); - match(CypherParser::SP); - } - setState(464); + setState(456); kU_ParsingOptions(); - setState(466); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(465); - match(CypherParser::SP); - } - setState(468); - match(CypherParser::T__2); break; } @@ -2173,7 +2190,7 @@ size_t CypherParser::KU_ImportDatabaseContext::getRuleIndex() const { CypherParser::KU_ImportDatabaseContext* CypherParser::kU_ImportDatabase() { KU_ImportDatabaseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 16, CypherParser::RuleKU_ImportDatabase); + enterRule(_localctx, 18, CypherParser::RuleKU_ImportDatabase); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2184,15 +2201,15 @@ CypherParser::KU_ImportDatabaseContext* CypherParser::kU_ImportDatabase() { }); try { enterOuterAlt(_localctx, 1); - setState(472); + setState(459); match(CypherParser::IMPORT); - setState(473); + setState(460); match(CypherParser::SP); - setState(474); + setState(461); match(CypherParser::DATABASE); - setState(475); + setState(462); match(CypherParser::SP); - setState(476); + setState(463); match(CypherParser::StringLiteral); } @@ -2239,7 +2256,7 @@ size_t CypherParser::KU_StandaloneCallContext::getRuleIndex() const { CypherParser::KU_StandaloneCallContext* CypherParser::kU_StandaloneCall() { KU_StandaloneCallContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 18, CypherParser::RuleKU_StandaloneCall); + enterRule(_localctx, 20, CypherParser::RuleKU_StandaloneCall); size_t _la = 0; #if __cplusplus > 201703L @@ -2251,31 +2268,31 @@ CypherParser::KU_StandaloneCallContext* CypherParser::kU_StandaloneCall() { }); try { enterOuterAlt(_localctx, 1); - setState(478); + setState(465); match(CypherParser::CALL); - setState(479); + setState(466); match(CypherParser::SP); - setState(480); + setState(467); oC_SymbolicName(); - setState(482); + setState(469); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(481); + setState(468); match(CypherParser::SP); } - setState(484); + setState(471); match(CypherParser::T__4); - setState(486); + setState(473); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(485); + setState(472); match(CypherParser::SP); } - setState(488); + setState(475); oC_Literal(); } @@ -2334,7 +2351,7 @@ size_t CypherParser::KU_CommentOnContext::getRuleIndex() const { CypherParser::KU_CommentOnContext* CypherParser::kU_CommentOn() { KU_CommentOnContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 20, CypherParser::RuleKU_CommentOn); + enterRule(_localctx, 22, CypherParser::RuleKU_CommentOn); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2345,27 +2362,27 @@ CypherParser::KU_CommentOnContext* CypherParser::kU_CommentOn() { }); try { enterOuterAlt(_localctx, 1); - setState(490); + setState(477); match(CypherParser::COMMENT_); - setState(491); + setState(478); match(CypherParser::SP); - setState(492); + setState(479); match(CypherParser::ON); - setState(493); + setState(480); match(CypherParser::SP); - setState(494); + setState(481); match(CypherParser::TABLE); - setState(495); + setState(482); match(CypherParser::SP); - setState(496); + setState(483); oC_SchemaName(); - setState(497); + setState(484); match(CypherParser::SP); - setState(498); + setState(485); match(CypherParser::IS); - setState(499); + setState(486); match(CypherParser::SP); - setState(500); + setState(487); match(CypherParser::StringLiteral); } @@ -2432,7 +2449,7 @@ size_t CypherParser::KU_CreateMacroContext::getRuleIndex() const { CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { KU_CreateMacroContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 22, CypherParser::RuleKU_CreateMacro); + enterRule(_localctx, 24, CypherParser::RuleKU_CreateMacro); size_t _la = 0; #if __cplusplus > 201703L @@ -2445,32 +2462,32 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(502); + setState(489); match(CypherParser::CREATE); - setState(503); + setState(490); match(CypherParser::SP); - setState(504); + setState(491); match(CypherParser::MACRO); - setState(505); + setState(492); match(CypherParser::SP); - setState(506); + setState(493); oC_FunctionName(); - setState(508); + setState(495); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(507); + setState(494); match(CypherParser::SP); } - setState(510); + setState(497); match(CypherParser::T__1); - setState(512); + setState(499); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 39, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 35, _ctx)) { case 1: { - setState(511); + setState(498); match(CypherParser::SP); break; } @@ -2478,12 +2495,12 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { default: break; } - setState(515); + setState(502); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 40, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 36, _ctx)) { case 1: { - setState(514); + setState(501); kU_PositionalArgs(); break; } @@ -2491,12 +2508,12 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { default: break; } - setState(518); + setState(505); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 41, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 37, _ctx)) { case 1: { - setState(517); + setState(504); match(CypherParser::SP); break; } @@ -2504,63 +2521,63 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { default: break; } - setState(521); + setState(508); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 47) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(520); + setState(507); kU_DefaultArg(); } - setState(533); + setState(520); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 45, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 41, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(524); + setState(511); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(523); + setState(510); match(CypherParser::SP); } - setState(526); - match(CypherParser::T__3); - setState(528); + setState(513); + match(CypherParser::T__2); + setState(515); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(527); + setState(514); match(CypherParser::SP); } - setState(530); + setState(517); kU_DefaultArg(); } - setState(535); + setState(522); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 45, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 41, _ctx); } - setState(537); + setState(524); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(536); + setState(523); match(CypherParser::SP); } - setState(539); - match(CypherParser::T__2); - setState(540); + setState(526); + match(CypherParser::T__3); + setState(527); match(CypherParser::SP); - setState(541); + setState(528); match(CypherParser::AS); - setState(542); + setState(529); match(CypherParser::SP); - setState(543); + setState(530); oC_Expression(); } @@ -2603,7 +2620,7 @@ size_t CypherParser::KU_PositionalArgsContext::getRuleIndex() const { CypherParser::KU_PositionalArgsContext* CypherParser::kU_PositionalArgs() { KU_PositionalArgsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 24, CypherParser::RuleKU_PositionalArgs); + enterRule(_localctx, 26, CypherParser::RuleKU_PositionalArgs); size_t _la = 0; #if __cplusplus > 201703L @@ -2616,37 +2633,37 @@ CypherParser::KU_PositionalArgsContext* CypherParser::kU_PositionalArgs() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(545); + setState(532); oC_SymbolicName(); - setState(556); + setState(543); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 49, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 45, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(547); + setState(534); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(546); + setState(533); match(CypherParser::SP); } - setState(549); - match(CypherParser::T__3); - setState(551); + setState(536); + match(CypherParser::T__2); + setState(538); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(550); + setState(537); match(CypherParser::SP); } - setState(553); + setState(540); oC_SymbolicName(); } - setState(558); + setState(545); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 49, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 45, _ctx); } } @@ -2693,7 +2710,7 @@ size_t CypherParser::KU_DefaultArgContext::getRuleIndex() const { CypherParser::KU_DefaultArgContext* CypherParser::kU_DefaultArg() { KU_DefaultArgContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 26, CypherParser::RuleKU_DefaultArg); + enterRule(_localctx, 28, CypherParser::RuleKU_DefaultArg); size_t _la = 0; #if __cplusplus > 201703L @@ -2705,29 +2722,29 @@ CypherParser::KU_DefaultArgContext* CypherParser::kU_DefaultArg() { }); try { enterOuterAlt(_localctx, 1); - setState(559); + setState(546); oC_SymbolicName(); - setState(561); + setState(548); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(560); + setState(547); match(CypherParser::SP); } - setState(563); + setState(550); match(CypherParser::COLON); - setState(564); + setState(551); match(CypherParser::T__4); - setState(566); + setState(553); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(565); + setState(552); match(CypherParser::SP); } - setState(568); + setState(555); oC_Literal(); } @@ -2774,7 +2791,7 @@ size_t CypherParser::KU_FilePathsContext::getRuleIndex() const { CypherParser::KU_FilePathsContext* CypherParser::kU_FilePaths() { KU_FilePathsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 28, CypherParser::RuleKU_FilePaths); + enterRule(_localctx, 30, CypherParser::RuleKU_FilePaths); size_t _la = 0; #if __cplusplus > 201703L @@ -2785,97 +2802,97 @@ CypherParser::KU_FilePathsContext* CypherParser::kU_FilePaths() { exitRule(); }); try { - setState(603); + setState(590); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::T__5: { enterOuterAlt(_localctx, 1); - setState(570); + setState(557); match(CypherParser::T__5); - setState(572); + setState(559); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(571); + setState(558); match(CypherParser::SP); } - setState(574); + setState(561); match(CypherParser::StringLiteral); - setState(585); + setState(572); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3 || _la == CypherParser::SP) { - setState(576); + while (_la == CypherParser::T__2 || _la == CypherParser::SP) { + setState(563); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(575); + setState(562); match(CypherParser::SP); } - setState(578); - match(CypherParser::T__3); - setState(580); + setState(565); + match(CypherParser::T__2); + setState(567); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(579); + setState(566); match(CypherParser::SP); } - setState(582); + setState(569); match(CypherParser::StringLiteral); - setState(587); + setState(574); _errHandler->sync(this); _la = _input->LA(1); } - setState(588); + setState(575); match(CypherParser::T__6); break; } case CypherParser::StringLiteral: { enterOuterAlt(_localctx, 2); - setState(589); + setState(576); match(CypherParser::StringLiteral); break; } case CypherParser::GLOB: { enterOuterAlt(_localctx, 3); - setState(590); + setState(577); match(CypherParser::GLOB); - setState(592); + setState(579); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(591); + setState(578); match(CypherParser::SP); } - setState(594); + setState(581); match(CypherParser::T__1); - setState(596); + setState(583); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(595); + setState(582); match(CypherParser::SP); } - setState(598); + setState(585); match(CypherParser::StringLiteral); - setState(600); + setState(587); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(599); + setState(586); match(CypherParser::SP); } - setState(602); - match(CypherParser::T__2); + setState(589); + match(CypherParser::T__3); break; } @@ -2923,7 +2940,7 @@ size_t CypherParser::KU_ParsingOptionsContext::getRuleIndex() const { CypherParser::KU_ParsingOptionsContext* CypherParser::kU_ParsingOptions() { KU_ParsingOptionsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 30, CypherParser::RuleKU_ParsingOptions); + enterRule(_localctx, 32, CypherParser::RuleKU_ParsingOptions); size_t _la = 0; #if __cplusplus > 201703L @@ -2936,38 +2953,58 @@ CypherParser::KU_ParsingOptionsContext* CypherParser::kU_ParsingOptions() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(605); + setState(592); + match(CypherParser::T__1); + setState(594); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(593); + match(CypherParser::SP); + } + setState(596); kU_ParsingOption(); - setState(616); + setState(607); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 62, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(607); + setState(598); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(606); + setState(597); match(CypherParser::SP); } - setState(609); - match(CypherParser::T__3); - setState(611); + setState(600); + match(CypherParser::T__2); + setState(602); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(610); + setState(601); match(CypherParser::SP); } - setState(613); + setState(604); kU_ParsingOption(); } - setState(618); + setState(609); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 62, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + } + setState(611); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(610); + match(CypherParser::SP); } + setState(613); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -3009,7 +3046,7 @@ size_t CypherParser::KU_ParsingOptionContext::getRuleIndex() const { CypherParser::KU_ParsingOptionContext* CypherParser::kU_ParsingOption() { KU_ParsingOptionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 32, CypherParser::RuleKU_ParsingOption); + enterRule(_localctx, 34, CypherParser::RuleKU_ParsingOption); size_t _la = 0; #if __cplusplus > 201703L @@ -3021,27 +3058,27 @@ CypherParser::KU_ParsingOptionContext* CypherParser::kU_ParsingOption() { }); try { enterOuterAlt(_localctx, 1); - setState(619); + setState(615); oC_SymbolicName(); - setState(621); + setState(617); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(620); + setState(616); match(CypherParser::SP); } - setState(623); + setState(619); match(CypherParser::T__4); - setState(625); + setState(621); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(624); + setState(620); match(CypherParser::SP); } - setState(627); + setState(623); oC_Literal(); } @@ -3092,7 +3129,7 @@ size_t CypherParser::KU_DDLContext::getRuleIndex() const { CypherParser::KU_DDLContext* CypherParser::kU_DDL() { KU_DDLContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 34, CypherParser::RuleKU_DDL); + enterRule(_localctx, 36, CypherParser::RuleKU_DDL); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3102,47 +3139,47 @@ CypherParser::KU_DDLContext* CypherParser::kU_DDL() { exitRule(); }); try { - setState(635); + setState(631); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 65, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 63, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(629); + setState(625); kU_CreateNodeTable(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(630); + setState(626); kU_CreateRelTable(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(631); + setState(627); kU_CreateRelTableGroup(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(632); + setState(628); kU_CreateRdfGraph(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(633); + setState(629); kU_DropTable(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(634); + setState(630); kU_AlterTable(); break; } @@ -3207,7 +3244,7 @@ size_t CypherParser::KU_CreateNodeTableContext::getRuleIndex() const { CypherParser::KU_CreateNodeTableContext* CypherParser::kU_CreateNodeTable() { KU_CreateNodeTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 36, CypherParser::RuleKU_CreateNodeTable); + enterRule(_localctx, 38, CypherParser::RuleKU_CreateNodeTable); size_t _la = 0; #if __cplusplus > 201703L @@ -3219,71 +3256,71 @@ CypherParser::KU_CreateNodeTableContext* CypherParser::kU_CreateNodeTable() { }); try { enterOuterAlt(_localctx, 1); - setState(637); + setState(633); match(CypherParser::CREATE); - setState(638); + setState(634); match(CypherParser::SP); - setState(639); + setState(635); match(CypherParser::NODE); - setState(640); + setState(636); match(CypherParser::SP); - setState(641); + setState(637); match(CypherParser::TABLE); - setState(642); + setState(638); match(CypherParser::SP); - setState(643); + setState(639); oC_SchemaName(); - setState(645); + setState(641); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(644); + setState(640); match(CypherParser::SP); } - setState(647); + setState(643); match(CypherParser::T__1); - setState(649); + setState(645); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(648); + setState(644); match(CypherParser::SP); } - setState(651); + setState(647); kU_PropertyDefinitions(); - setState(653); + setState(649); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(652); + setState(648); match(CypherParser::SP); } - setState(655); - match(CypherParser::T__3); - setState(657); + setState(651); + match(CypherParser::T__2); + setState(653); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(656); + setState(652); match(CypherParser::SP); } - setState(659); + setState(655); kU_CreateNodeConstraint(); - setState(662); + setState(658); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(661); + setState(657); match(CypherParser::SP); } - setState(664); - match(CypherParser::T__2); + setState(660); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -3345,7 +3382,7 @@ size_t CypherParser::KU_CreateRelTableContext::getRuleIndex() const { CypherParser::KU_CreateRelTableContext* CypherParser::kU_CreateRelTable() { KU_CreateRelTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 38, CypherParser::RuleKU_CreateRelTable); + enterRule(_localctx, 40, CypherParser::RuleKU_CreateRelTable); size_t _la = 0; #if __cplusplus > 201703L @@ -3357,71 +3394,71 @@ CypherParser::KU_CreateRelTableContext* CypherParser::kU_CreateRelTable() { }); try { enterOuterAlt(_localctx, 1); - setState(666); + setState(662); match(CypherParser::CREATE); - setState(667); + setState(663); match(CypherParser::SP); - setState(668); + setState(664); match(CypherParser::REL); - setState(669); + setState(665); match(CypherParser::SP); - setState(670); + setState(666); match(CypherParser::TABLE); - setState(671); + setState(667); match(CypherParser::SP); - setState(672); + setState(668); oC_SchemaName(); - setState(674); + setState(670); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(673); + setState(669); match(CypherParser::SP); } - setState(676); + setState(672); match(CypherParser::T__1); - setState(678); + setState(674); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(677); + setState(673); match(CypherParser::SP); } - setState(680); + setState(676); kU_RelTableConnection(); - setState(682); + setState(678); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(681); + setState(677); match(CypherParser::SP); } - setState(692); + setState(688); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 76, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 74, _ctx)) { case 1: { - setState(684); - match(CypherParser::T__3); - setState(686); + setState(680); + match(CypherParser::T__2); + setState(682); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(685); + setState(681); match(CypherParser::SP); } - setState(688); + setState(684); kU_PropertyDefinitions(); - setState(690); + setState(686); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(689); + setState(685); match(CypherParser::SP); } break; @@ -3430,34 +3467,34 @@ CypherParser::KU_CreateRelTableContext* CypherParser::kU_CreateRelTable() { default: break; } - setState(702); + setState(698); _errHandler->sync(this); _la = _input->LA(1); - if (_la == CypherParser::T__3) { - setState(694); - match(CypherParser::T__3); - setState(696); + if (_la == CypherParser::T__2) { + setState(690); + match(CypherParser::T__2); + setState(692); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(695); + setState(691); match(CypherParser::SP); } - setState(698); + setState(694); oC_SymbolicName(); - setState(700); + setState(696); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(699); + setState(695); match(CypherParser::SP); } } - setState(704); - match(CypherParser::T__2); + setState(700); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -3527,7 +3564,7 @@ size_t CypherParser::KU_CreateRelTableGroupContext::getRuleIndex() const { CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGroup() { KU_CreateRelTableGroupContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 40, CypherParser::RuleKU_CreateRelTableGroup); + enterRule(_localctx, 42, CypherParser::RuleKU_CreateRelTableGroup); size_t _la = 0; #if __cplusplus > 201703L @@ -3540,69 +3577,69 @@ CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGrou try { size_t alt; enterOuterAlt(_localctx, 1); - setState(706); + setState(702); match(CypherParser::CREATE); - setState(707); + setState(703); match(CypherParser::SP); - setState(708); + setState(704); match(CypherParser::REL); - setState(709); + setState(705); match(CypherParser::SP); - setState(710); + setState(706); match(CypherParser::TABLE); - setState(711); + setState(707); match(CypherParser::SP); - setState(712); + setState(708); match(CypherParser::GROUP); - setState(713); + setState(709); match(CypherParser::SP); - setState(714); + setState(710); oC_SchemaName(); - setState(716); + setState(712); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(715); + setState(711); match(CypherParser::SP); } - setState(718); + setState(714); match(CypherParser::T__1); - setState(720); + setState(716); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(719); + setState(715); match(CypherParser::SP); } - setState(722); + setState(718); kU_RelTableConnection(); - setState(724); + setState(720); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(723); + setState(719); match(CypherParser::SP); } - setState(731); + setState(727); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(726); - match(CypherParser::T__3); - setState(728); + setState(722); + match(CypherParser::T__2); + setState(724); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(727); + setState(723); match(CypherParser::SP); } - setState(730); + setState(726); kU_RelTableConnection(); break; } @@ -3610,41 +3647,41 @@ CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGrou default: throw NoViableAltException(this); } - setState(733); + setState(729); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 84, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 82, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); - setState(736); + setState(732); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(735); + setState(731); match(CypherParser::SP); } - setState(746); + setState(742); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 88, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 86, _ctx)) { case 1: { - setState(738); - match(CypherParser::T__3); - setState(740); + setState(734); + match(CypherParser::T__2); + setState(736); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(739); + setState(735); match(CypherParser::SP); } - setState(742); + setState(738); kU_PropertyDefinitions(); - setState(744); + setState(740); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(743); + setState(739); match(CypherParser::SP); } break; @@ -3653,34 +3690,34 @@ CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGrou default: break; } - setState(756); + setState(752); _errHandler->sync(this); _la = _input->LA(1); - if (_la == CypherParser::T__3) { - setState(748); - match(CypherParser::T__3); - setState(750); + if (_la == CypherParser::T__2) { + setState(744); + match(CypherParser::T__2); + setState(746); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(749); + setState(745); match(CypherParser::SP); } - setState(752); + setState(748); oC_SymbolicName(); - setState(754); + setState(750); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(753); + setState(749); match(CypherParser::SP); } } - setState(758); - match(CypherParser::T__2); + setState(754); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -3730,7 +3767,7 @@ size_t CypherParser::KU_RelTableConnectionContext::getRuleIndex() const { CypherParser::KU_RelTableConnectionContext* CypherParser::kU_RelTableConnection() { KU_RelTableConnectionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 42, CypherParser::RuleKU_RelTableConnection); + enterRule(_localctx, 44, CypherParser::RuleKU_RelTableConnection); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3741,19 +3778,19 @@ CypherParser::KU_RelTableConnectionContext* CypherParser::kU_RelTableConnection( }); try { enterOuterAlt(_localctx, 1); - setState(760); + setState(756); match(CypherParser::FROM); - setState(761); + setState(757); match(CypherParser::SP); - setState(762); + setState(758); oC_SchemaName(); - setState(763); + setState(759); match(CypherParser::SP); - setState(764); + setState(760); match(CypherParser::TO); - setState(765); + setState(761); match(CypherParser::SP); - setState(766); + setState(762); oC_SchemaName(); } @@ -3800,7 +3837,7 @@ size_t CypherParser::KU_CreateRdfGraphContext::getRuleIndex() const { CypherParser::KU_CreateRdfGraphContext* CypherParser::kU_CreateRdfGraph() { KU_CreateRdfGraphContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 44, CypherParser::RuleKU_CreateRdfGraph); + enterRule(_localctx, 46, CypherParser::RuleKU_CreateRdfGraph); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3811,15 +3848,15 @@ CypherParser::KU_CreateRdfGraphContext* CypherParser::kU_CreateRdfGraph() { }); try { enterOuterAlt(_localctx, 1); - setState(768); + setState(764); match(CypherParser::CREATE); - setState(769); + setState(765); match(CypherParser::SP); - setState(770); + setState(766); match(CypherParser::RDFGRAPH); - setState(771); + setState(767); match(CypherParser::SP); - setState(772); + setState(768); oC_SchemaName(); } @@ -3870,7 +3907,7 @@ size_t CypherParser::KU_DropTableContext::getRuleIndex() const { CypherParser::KU_DropTableContext* CypherParser::kU_DropTable() { KU_DropTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 46, CypherParser::RuleKU_DropTable); + enterRule(_localctx, 48, CypherParser::RuleKU_DropTable); size_t _la = 0; #if __cplusplus > 201703L @@ -3882,11 +3919,11 @@ CypherParser::KU_DropTableContext* CypherParser::kU_DropTable() { }); try { enterOuterAlt(_localctx, 1); - setState(774); + setState(770); match(CypherParser::DROP); - setState(775); + setState(771); match(CypherParser::SP); - setState(776); + setState(772); _la = _input->LA(1); if (!(_la == CypherParser::TABLE @@ -3897,9 +3934,9 @@ CypherParser::KU_DropTableContext* CypherParser::kU_DropTable() { _errHandler->reportMatch(this); consume(); } - setState(777); + setState(773); match(CypherParser::SP); - setState(778); + setState(774); oC_SchemaName(); } @@ -3950,7 +3987,7 @@ size_t CypherParser::KU_AlterTableContext::getRuleIndex() const { CypherParser::KU_AlterTableContext* CypherParser::kU_AlterTable() { KU_AlterTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 48, CypherParser::RuleKU_AlterTable); + enterRule(_localctx, 50, CypherParser::RuleKU_AlterTable); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3961,19 +3998,19 @@ CypherParser::KU_AlterTableContext* CypherParser::kU_AlterTable() { }); try { enterOuterAlt(_localctx, 1); - setState(780); + setState(776); match(CypherParser::ALTER); - setState(781); + setState(777); match(CypherParser::SP); - setState(782); + setState(778); match(CypherParser::TABLE); - setState(783); + setState(779); match(CypherParser::SP); - setState(784); + setState(780); oC_SchemaName(); - setState(785); + setState(781); match(CypherParser::SP); - setState(786); + setState(782); kU_AlterOptions(); } @@ -4016,7 +4053,7 @@ size_t CypherParser::KU_AlterOptionsContext::getRuleIndex() const { CypherParser::KU_AlterOptionsContext* CypherParser::kU_AlterOptions() { KU_AlterOptionsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 50, CypherParser::RuleKU_AlterOptions); + enterRule(_localctx, 52, CypherParser::RuleKU_AlterOptions); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4026,33 +4063,33 @@ CypherParser::KU_AlterOptionsContext* CypherParser::kU_AlterOptions() { exitRule(); }); try { - setState(792); + setState(788); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 92, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 90, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(788); + setState(784); kU_AddProperty(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(789); + setState(785); kU_DropProperty(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(790); + setState(786); kU_RenameTable(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(791); + setState(787); kU_RenameProperty(); break; } @@ -4113,7 +4150,7 @@ size_t CypherParser::KU_AddPropertyContext::getRuleIndex() const { CypherParser::KU_AddPropertyContext* CypherParser::kU_AddProperty() { KU_AddPropertyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 52, CypherParser::RuleKU_AddProperty); + enterRule(_localctx, 54, CypherParser::RuleKU_AddProperty); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4124,28 +4161,28 @@ CypherParser::KU_AddPropertyContext* CypherParser::kU_AddProperty() { }); try { enterOuterAlt(_localctx, 1); - setState(794); + setState(790); match(CypherParser::ADD); - setState(795); + setState(791); match(CypherParser::SP); - setState(796); + setState(792); oC_PropertyKeyName(); - setState(797); + setState(793); match(CypherParser::SP); - setState(798); + setState(794); kU_DataType(0); - setState(803); + setState(799); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 93, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 91, _ctx)) { case 1: { - setState(799); + setState(795); match(CypherParser::SP); - setState(800); + setState(796); match(CypherParser::DEFAULT); - setState(801); + setState(797); match(CypherParser::SP); - setState(802); + setState(798); oC_Expression(); break; } @@ -4190,7 +4227,7 @@ size_t CypherParser::KU_DropPropertyContext::getRuleIndex() const { CypherParser::KU_DropPropertyContext* CypherParser::kU_DropProperty() { KU_DropPropertyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 54, CypherParser::RuleKU_DropProperty); + enterRule(_localctx, 56, CypherParser::RuleKU_DropProperty); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4201,11 +4238,11 @@ CypherParser::KU_DropPropertyContext* CypherParser::kU_DropProperty() { }); try { enterOuterAlt(_localctx, 1); - setState(805); + setState(801); match(CypherParser::DROP); - setState(806); + setState(802); match(CypherParser::SP); - setState(807); + setState(803); oC_PropertyKeyName(); } @@ -4252,7 +4289,7 @@ size_t CypherParser::KU_RenameTableContext::getRuleIndex() const { CypherParser::KU_RenameTableContext* CypherParser::kU_RenameTable() { KU_RenameTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 56, CypherParser::RuleKU_RenameTable); + enterRule(_localctx, 58, CypherParser::RuleKU_RenameTable); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4263,15 +4300,15 @@ CypherParser::KU_RenameTableContext* CypherParser::kU_RenameTable() { }); try { enterOuterAlt(_localctx, 1); - setState(809); + setState(805); match(CypherParser::RENAME); - setState(810); + setState(806); match(CypherParser::SP); - setState(811); + setState(807); match(CypherParser::TO); - setState(812); + setState(808); match(CypherParser::SP); - setState(813); + setState(809); oC_SchemaName(); } @@ -4322,7 +4359,7 @@ size_t CypherParser::KU_RenamePropertyContext::getRuleIndex() const { CypherParser::KU_RenamePropertyContext* CypherParser::kU_RenameProperty() { KU_RenamePropertyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 58, CypherParser::RuleKU_RenameProperty); + enterRule(_localctx, 60, CypherParser::RuleKU_RenameProperty); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4333,19 +4370,19 @@ CypherParser::KU_RenamePropertyContext* CypherParser::kU_RenameProperty() { }); try { enterOuterAlt(_localctx, 1); - setState(815); + setState(811); match(CypherParser::RENAME); - setState(816); + setState(812); match(CypherParser::SP); - setState(817); + setState(813); oC_PropertyKeyName(); - setState(818); + setState(814); match(CypherParser::SP); - setState(819); + setState(815); match(CypherParser::TO); - setState(820); + setState(816); match(CypherParser::SP); - setState(821); + setState(817); oC_PropertyKeyName(); } @@ -4388,7 +4425,7 @@ size_t CypherParser::KU_PropertyDefinitionsContext::getRuleIndex() const { CypherParser::KU_PropertyDefinitionsContext* CypherParser::kU_PropertyDefinitions() { KU_PropertyDefinitionsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 60, CypherParser::RuleKU_PropertyDefinitions); + enterRule(_localctx, 62, CypherParser::RuleKU_PropertyDefinitions); size_t _la = 0; #if __cplusplus > 201703L @@ -4401,37 +4438,37 @@ CypherParser::KU_PropertyDefinitionsContext* CypherParser::kU_PropertyDefinition try { size_t alt; enterOuterAlt(_localctx, 1); - setState(823); + setState(819); kU_PropertyDefinition(); - setState(834); + setState(830); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 96, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(825); + setState(821); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(824); + setState(820); match(CypherParser::SP); } - setState(827); - match(CypherParser::T__3); - setState(829); + setState(823); + match(CypherParser::T__2); + setState(825); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(828); + setState(824); match(CypherParser::SP); } - setState(831); + setState(827); kU_PropertyDefinition(); } - setState(836); + setState(832); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 96, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); } } @@ -4470,7 +4507,7 @@ size_t CypherParser::KU_PropertyDefinitionContext::getRuleIndex() const { CypherParser::KU_PropertyDefinitionContext* CypherParser::kU_PropertyDefinition() { KU_PropertyDefinitionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 62, CypherParser::RuleKU_PropertyDefinition); + enterRule(_localctx, 64, CypherParser::RuleKU_PropertyDefinition); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4481,11 +4518,11 @@ CypherParser::KU_PropertyDefinitionContext* CypherParser::kU_PropertyDefinition( }); try { enterOuterAlt(_localctx, 1); - setState(837); + setState(833); oC_PropertyKeyName(); - setState(838); + setState(834); match(CypherParser::SP); - setState(839); + setState(835); kU_DataType(0); } @@ -4532,7 +4569,7 @@ size_t CypherParser::KU_CreateNodeConstraintContext::getRuleIndex() const { CypherParser::KU_CreateNodeConstraintContext* CypherParser::kU_CreateNodeConstraint() { KU_CreateNodeConstraintContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 64, CypherParser::RuleKU_CreateNodeConstraint); + enterRule(_localctx, 66, CypherParser::RuleKU_CreateNodeConstraint); size_t _la = 0; #if __cplusplus > 201703L @@ -4544,42 +4581,42 @@ CypherParser::KU_CreateNodeConstraintContext* CypherParser::kU_CreateNodeConstra }); try { enterOuterAlt(_localctx, 1); - setState(841); + setState(837); match(CypherParser::PRIMARY); - setState(842); + setState(838); match(CypherParser::SP); - setState(843); + setState(839); match(CypherParser::KEY); - setState(845); + setState(841); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(844); + setState(840); match(CypherParser::SP); } - setState(847); + setState(843); match(CypherParser::T__1); - setState(849); + setState(845); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(848); + setState(844); match(CypherParser::SP); } - setState(851); + setState(847); oC_PropertyKeyName(); - setState(853); + setState(849); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(852); + setState(848); match(CypherParser::SP); } - setState(855); - match(CypherParser::T__2); + setState(851); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -4646,8 +4683,8 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { CypherParser::KU_DataTypeContext *_localctx = _tracker.createInstance(_ctx, parentState); CypherParser::KU_DataTypeContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 66; - enterRecursionRule(_localctx, 66, CypherParser::RuleKU_DataType, precedence); + size_t startState = 68; + enterRecursionRule(_localctx, 68, CypherParser::RuleKU_DataType, precedence); size_t _la = 0; @@ -4661,18 +4698,28 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(909); + setState(905); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 111, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 109, _ctx)) { case 1: { - setState(858); + setState(854); oC_SymbolicName(); break; } case 2: { - setState(859); + setState(855); match(CypherParser::UNION); + setState(857); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(856); + match(CypherParser::SP); + } + setState(859); + match(CypherParser::T__1); setState(861); _errHandler->sync(this); @@ -4682,7 +4729,7 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(863); - match(CypherParser::T__1); + kU_PropertyDefinitions(); setState(865); _errHandler->sync(this); @@ -4692,23 +4739,23 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(867); - kU_PropertyDefinitions(); + match(CypherParser::T__3); + break; + } + + case 3: { setState(869); + oC_SymbolicName(); + setState(871); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(868); + setState(870); match(CypherParser::SP); } - setState(871); - match(CypherParser::T__2); - break; - } - - case 3: { setState(873); - oC_SymbolicName(); + match(CypherParser::T__1); setState(875); _errHandler->sync(this); @@ -4718,7 +4765,7 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(877); - match(CypherParser::T__1); + kU_PropertyDefinitions(); setState(879); _errHandler->sync(this); @@ -4728,23 +4775,23 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(881); - kU_PropertyDefinitions(); + match(CypherParser::T__3); + break; + } + + case 4: { setState(883); + oC_SymbolicName(); + setState(885); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(882); + setState(884); match(CypherParser::SP); } - setState(885); - match(CypherParser::T__2); - break; - } - - case 4: { setState(887); - oC_SymbolicName(); + match(CypherParser::T__1); setState(889); _errHandler->sync(this); @@ -4754,7 +4801,7 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(891); - match(CypherParser::T__1); + kU_DataType(0); setState(893); _errHandler->sync(this); @@ -4764,7 +4811,7 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(895); - kU_DataType(0); + match(CypherParser::T__2); setState(897); _errHandler->sync(this); @@ -4774,7 +4821,7 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(899); - match(CypherParser::T__3); + kU_DataType(0); setState(901); _errHandler->sync(this); @@ -4784,17 +4831,7 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { match(CypherParser::SP); } setState(903); - kU_DataType(0); - setState(905); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(904); - match(CypherParser::SP); - } - setState(907); - match(CypherParser::T__2); + match(CypherParser::T__3); break; } @@ -4802,9 +4839,9 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(915); + setState(911); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 112, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 110, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) @@ -4812,15 +4849,15 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { previousContext = _localctx; _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleKU_DataType); - setState(911); + setState(907); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(912); + setState(908); kU_ListIdentifiers(); } - setState(917); + setState(913); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 112, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 110, _ctx); } } catch (RecognitionException &e) { @@ -4853,7 +4890,7 @@ size_t CypherParser::KU_ListIdentifiersContext::getRuleIndex() const { CypherParser::KU_ListIdentifiersContext* CypherParser::kU_ListIdentifiers() { KU_ListIdentifiersContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 68, CypherParser::RuleKU_ListIdentifiers); + enterRule(_localctx, 70, CypherParser::RuleKU_ListIdentifiers); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4865,19 +4902,19 @@ CypherParser::KU_ListIdentifiersContext* CypherParser::kU_ListIdentifiers() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(918); + setState(914); kU_ListIdentifier(); - setState(922); + setState(918); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 113, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 111, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(919); + setState(915); kU_ListIdentifier(); } - setState(924); + setState(920); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 113, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 111, _ctx); } } @@ -4908,7 +4945,7 @@ size_t CypherParser::KU_ListIdentifierContext::getRuleIndex() const { CypherParser::KU_ListIdentifierContext* CypherParser::kU_ListIdentifier() { KU_ListIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 70, CypherParser::RuleKU_ListIdentifier); + enterRule(_localctx, 72, CypherParser::RuleKU_ListIdentifier); size_t _la = 0; #if __cplusplus > 201703L @@ -4920,17 +4957,17 @@ CypherParser::KU_ListIdentifierContext* CypherParser::kU_ListIdentifier() { }); try { enterOuterAlt(_localctx, 1); - setState(925); + setState(921); match(CypherParser::T__5); - setState(927); + setState(923); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DecimalInteger) { - setState(926); + setState(922); oC_IntegerLiteral(); } - setState(929); + setState(925); match(CypherParser::T__6); } @@ -4965,7 +5002,7 @@ size_t CypherParser::OC_AnyCypherOptionContext::getRuleIndex() const { CypherParser::OC_AnyCypherOptionContext* CypherParser::oC_AnyCypherOption() { OC_AnyCypherOptionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 72, CypherParser::RuleOC_AnyCypherOption); + enterRule(_localctx, 74, CypherParser::RuleOC_AnyCypherOption); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4975,19 +5012,19 @@ CypherParser::OC_AnyCypherOptionContext* CypherParser::oC_AnyCypherOption() { exitRule(); }); try { - setState(933); + setState(929); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::EXPLAIN: { enterOuterAlt(_localctx, 1); - setState(931); + setState(927); oC_Explain(); break; } case CypherParser::PROFILE: { enterOuterAlt(_localctx, 2); - setState(932); + setState(928); oC_Profile(); break; } @@ -5024,7 +5061,7 @@ size_t CypherParser::OC_ExplainContext::getRuleIndex() const { CypherParser::OC_ExplainContext* CypherParser::oC_Explain() { OC_ExplainContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 74, CypherParser::RuleOC_Explain); + enterRule(_localctx, 76, CypherParser::RuleOC_Explain); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5035,7 +5072,7 @@ CypherParser::OC_ExplainContext* CypherParser::oC_Explain() { }); try { enterOuterAlt(_localctx, 1); - setState(935); + setState(931); match(CypherParser::EXPLAIN); } @@ -5066,7 +5103,7 @@ size_t CypherParser::OC_ProfileContext::getRuleIndex() const { CypherParser::OC_ProfileContext* CypherParser::oC_Profile() { OC_ProfileContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 76, CypherParser::RuleOC_Profile); + enterRule(_localctx, 78, CypherParser::RuleOC_Profile); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5077,7 +5114,7 @@ CypherParser::OC_ProfileContext* CypherParser::oC_Profile() { }); try { enterOuterAlt(_localctx, 1); - setState(937); + setState(933); match(CypherParser::PROFILE); } @@ -5144,7 +5181,7 @@ size_t CypherParser::KU_TransactionContext::getRuleIndex() const { CypherParser::KU_TransactionContext* CypherParser::kU_Transaction() { KU_TransactionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 78, CypherParser::RuleKU_Transaction); + enterRule(_localctx, 80, CypherParser::RuleKU_Transaction); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5154,63 +5191,63 @@ CypherParser::KU_TransactionContext* CypherParser::kU_Transaction() { exitRule(); }); try { - setState(953); + setState(949); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 116, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 114, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(939); + setState(935); match(CypherParser::BEGIN); - setState(940); + setState(936); match(CypherParser::SP); - setState(941); + setState(937); match(CypherParser::TRANSACTION); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(942); + setState(938); match(CypherParser::BEGIN); - setState(943); + setState(939); match(CypherParser::SP); - setState(944); + setState(940); match(CypherParser::TRANSACTION); - setState(945); + setState(941); match(CypherParser::SP); - setState(946); + setState(942); match(CypherParser::READ); - setState(947); + setState(943); match(CypherParser::SP); - setState(948); + setState(944); match(CypherParser::ONLY); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(949); + setState(945); match(CypherParser::COMMIT); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(950); + setState(946); match(CypherParser::COMMIT_SKIP_CHECKPOINT); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(951); + setState(947); match(CypherParser::ROLLBACK); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(952); + setState(948); match(CypherParser::ROLLBACK_SKIP_CHECKPOINT); break; } @@ -5251,7 +5288,7 @@ size_t CypherParser::KU_ExtensionContext::getRuleIndex() const { CypherParser::KU_ExtensionContext* CypherParser::kU_Extension() { KU_ExtensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 80, CypherParser::RuleKU_Extension); + enterRule(_localctx, 82, CypherParser::RuleKU_Extension); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5261,19 +5298,19 @@ CypherParser::KU_ExtensionContext* CypherParser::kU_Extension() { exitRule(); }); try { - setState(957); + setState(953); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::LOAD: { enterOuterAlt(_localctx, 1); - setState(955); + setState(951); kU_LoadExtension(); break; } case CypherParser::INSTALL: { enterOuterAlt(_localctx, 2); - setState(956); + setState(952); kU_InstallExtension(); break; } @@ -5330,7 +5367,7 @@ size_t CypherParser::KU_LoadExtensionContext::getRuleIndex() const { CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { KU_LoadExtensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 82, CypherParser::RuleKU_LoadExtension); + enterRule(_localctx, 84, CypherParser::RuleKU_LoadExtension); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5341,19 +5378,19 @@ CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { }); try { enterOuterAlt(_localctx, 1); - setState(959); + setState(955); match(CypherParser::LOAD); - setState(960); + setState(956); match(CypherParser::SP); - setState(961); + setState(957); match(CypherParser::EXTENSION); - setState(962); + setState(958); match(CypherParser::SP); - setState(965); + setState(961); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::StringLiteral: { - setState(963); + setState(959); match(CypherParser::StringLiteral); break; } @@ -5371,7 +5408,7 @@ CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(964); + setState(960); oC_Variable(); break; } @@ -5416,7 +5453,7 @@ size_t CypherParser::KU_InstallExtensionContext::getRuleIndex() const { CypherParser::KU_InstallExtensionContext* CypherParser::kU_InstallExtension() { KU_InstallExtensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 84, CypherParser::RuleKU_InstallExtension); + enterRule(_localctx, 86, CypherParser::RuleKU_InstallExtension); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5427,11 +5464,11 @@ CypherParser::KU_InstallExtensionContext* CypherParser::kU_InstallExtension() { }); try { enterOuterAlt(_localctx, 1); - setState(967); + setState(963); match(CypherParser::INSTALL); - setState(968); + setState(964); match(CypherParser::SP); - setState(969); + setState(965); oC_Variable(); } @@ -5462,7 +5499,7 @@ size_t CypherParser::OC_QueryContext::getRuleIndex() const { CypherParser::OC_QueryContext* CypherParser::oC_Query() { OC_QueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 86, CypherParser::RuleOC_Query); + enterRule(_localctx, 88, CypherParser::RuleOC_Query); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5473,7 +5510,7 @@ CypherParser::OC_QueryContext* CypherParser::oC_Query() { }); try { enterOuterAlt(_localctx, 1); - setState(971); + setState(967); oC_RegularQuery(); } @@ -5528,7 +5565,7 @@ size_t CypherParser::OC_RegularQueryContext::getRuleIndex() const { CypherParser::OC_RegularQueryContext* CypherParser::oC_RegularQuery() { OC_RegularQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 88, CypherParser::RuleOC_RegularQuery); + enterRule(_localctx, 90, CypherParser::RuleOC_RegularQuery); size_t _la = 0; #if __cplusplus > 201703L @@ -5540,52 +5577,52 @@ CypherParser::OC_RegularQueryContext* CypherParser::oC_RegularQuery() { }); try { size_t alt; - setState(994); + setState(990); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 123, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 121, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(973); + setState(969); oC_SingleQuery(); - setState(980); + setState(976); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 120, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 118, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(975); + setState(971); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(974); + setState(970); match(CypherParser::SP); } - setState(977); + setState(973); oC_Union(); } - setState(982); + setState(978); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 120, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 118, _ctx); } break; } case 2: { enterOuterAlt(_localctx, 2); - setState(987); + setState(983); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(983); + setState(979); oC_Return(); - setState(985); + setState(981); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(984); + setState(980); match(CypherParser::SP); } break; @@ -5594,11 +5631,11 @@ CypherParser::OC_RegularQueryContext* CypherParser::oC_RegularQuery() { default: throw NoViableAltException(this); } - setState(989); + setState(985); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 122, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 120, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); - setState(991); + setState(987); oC_SingleQuery(); notifyReturnNotAtEnd(_localctx->start); break; @@ -5652,7 +5689,7 @@ size_t CypherParser::OC_UnionContext::getRuleIndex() const { CypherParser::OC_UnionContext* CypherParser::oC_Union() { OC_UnionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 90, CypherParser::RuleOC_Union); + enterRule(_localctx, 92, CypherParser::RuleOC_Union); size_t _la = 0; #if __cplusplus > 201703L @@ -5663,43 +5700,43 @@ CypherParser::OC_UnionContext* CypherParser::oC_Union() { exitRule(); }); try { - setState(1008); + setState(1004); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 126, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 124, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(996); + setState(992); match(CypherParser::UNION); - setState(997); + setState(993); match(CypherParser::SP); - setState(998); + setState(994); match(CypherParser::ALL); - setState(1000); + setState(996); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(999); + setState(995); match(CypherParser::SP); } - setState(1002); + setState(998); oC_SingleQuery(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1003); + setState(999); match(CypherParser::UNION); - setState(1005); + setState(1001); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1004); + setState(1000); match(CypherParser::SP); } - setState(1007); + setState(1003); oC_SingleQuery(); break; } @@ -5740,7 +5777,7 @@ size_t CypherParser::OC_SingleQueryContext::getRuleIndex() const { CypherParser::OC_SingleQueryContext* CypherParser::oC_SingleQuery() { OC_SingleQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 92, CypherParser::RuleOC_SingleQuery); + enterRule(_localctx, 94, CypherParser::RuleOC_SingleQuery); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5750,19 +5787,19 @@ CypherParser::OC_SingleQueryContext* CypherParser::oC_SingleQuery() { exitRule(); }); try { - setState(1012); + setState(1008); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 127, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 125, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1010); + setState(1006); oC_SinglePartQuery(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1011); + setState(1007); oC_MultiPartQuery(); break; } @@ -5823,7 +5860,7 @@ size_t CypherParser::OC_SinglePartQueryContext::getRuleIndex() const { CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { OC_SinglePartQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 94, CypherParser::RuleOC_SinglePartQuery); + enterRule(_localctx, 96, CypherParser::RuleOC_SinglePartQuery); size_t _la = 0; #if __cplusplus > 201703L @@ -5835,92 +5872,92 @@ CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { }); try { size_t alt; - setState(1059); + setState(1055); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 138, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1020); + setState(1016); _errHandler->sync(this); _la = _input->LA(1); while (((((_la - 46) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 46)) & 7971459301377) != 0)) { - setState(1014); + setState(1010); oC_ReadingClause(); - setState(1016); + setState(1012); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1015); + setState(1011); match(CypherParser::SP); } - setState(1022); + setState(1018); _errHandler->sync(this); _la = _input->LA(1); } - setState(1023); + setState(1019); oC_Return(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1030); + setState(1026); _errHandler->sync(this); _la = _input->LA(1); while (((((_la - 46) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 46)) & 7971459301377) != 0)) { - setState(1024); + setState(1020); oC_ReadingClause(); - setState(1026); + setState(1022); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1025); + setState(1021); match(CypherParser::SP); } - setState(1032); + setState(1028); _errHandler->sync(this); _la = _input->LA(1); } - setState(1033); + setState(1029); oC_UpdatingClause(); - setState(1040); + setState(1036); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 133, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1035); + setState(1031); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1034); + setState(1030); match(CypherParser::SP); } - setState(1037); + setState(1033); oC_UpdatingClause(); } - setState(1042); + setState(1038); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 133, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); } - setState(1047); + setState(1043); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 135, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 133, _ctx)) { case 1: { - setState(1044); + setState(1040); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1043); + setState(1039); match(CypherParser::SP); } - setState(1046); + setState(1042); oC_Return(); break; } @@ -5933,18 +5970,18 @@ CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { case 3: { enterOuterAlt(_localctx, 3); - setState(1053); + setState(1049); _errHandler->sync(this); _la = _input->LA(1); do { - setState(1049); + setState(1045); oC_ReadingClause(); - setState(1051); + setState(1047); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 134, _ctx)) { case 1: { - setState(1050); + setState(1046); match(CypherParser::SP); break; } @@ -5952,7 +5989,7 @@ CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { default: break; } - setState(1055); + setState(1051); _errHandler->sync(this); _la = _input->LA(1); } while (((((_la - 46) & ~ 0x3fULL) == 0) && @@ -6009,7 +6046,7 @@ size_t CypherParser::OC_MultiPartQueryContext::getRuleIndex() const { CypherParser::OC_MultiPartQueryContext* CypherParser::oC_MultiPartQuery() { OC_MultiPartQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 96, CypherParser::RuleOC_MultiPartQuery); + enterRule(_localctx, 98, CypherParser::RuleOC_MultiPartQuery); size_t _la = 0; #if __cplusplus > 201703L @@ -6022,20 +6059,20 @@ CypherParser::OC_MultiPartQueryContext* CypherParser::oC_MultiPartQuery() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1065); + setState(1061); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(1061); + setState(1057); kU_QueryPart(); - setState(1063); + setState(1059); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1062); + setState(1058); match(CypherParser::SP); } break; @@ -6044,11 +6081,11 @@ CypherParser::OC_MultiPartQueryContext* CypherParser::oC_MultiPartQuery() { default: throw NoViableAltException(this); } - setState(1067); + setState(1063); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 140, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 138, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); - setState(1069); + setState(1065); oC_SinglePartQuery(); } @@ -6103,7 +6140,7 @@ size_t CypherParser::KU_QueryPartContext::getRuleIndex() const { CypherParser::KU_QueryPartContext* CypherParser::kU_QueryPart() { KU_QueryPartContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 98, CypherParser::RuleKU_QueryPart); + enterRule(_localctx, 100, CypherParser::RuleKU_QueryPart); size_t _la = 0; #if __cplusplus > 201703L @@ -6115,45 +6152,45 @@ CypherParser::KU_QueryPartContext* CypherParser::kU_QueryPart() { }); try { enterOuterAlt(_localctx, 1); - setState(1077); + setState(1073); _errHandler->sync(this); _la = _input->LA(1); while (((((_la - 46) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 46)) & 7971459301377) != 0)) { - setState(1071); + setState(1067); oC_ReadingClause(); - setState(1073); + setState(1069); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1072); + setState(1068); match(CypherParser::SP); } - setState(1079); + setState(1075); _errHandler->sync(this); _la = _input->LA(1); } - setState(1086); + setState(1082); _errHandler->sync(this); _la = _input->LA(1); while (((((_la - 89) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 89)) & 59) != 0)) { - setState(1080); + setState(1076); oC_UpdatingClause(); - setState(1082); + setState(1078); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1081); + setState(1077); match(CypherParser::SP); } - setState(1088); + setState(1084); _errHandler->sync(this); _la = _input->LA(1); } - setState(1089); + setState(1085); oC_With(); } @@ -6196,7 +6233,7 @@ size_t CypherParser::OC_UpdatingClauseContext::getRuleIndex() const { CypherParser::OC_UpdatingClauseContext* CypherParser::oC_UpdatingClause() { OC_UpdatingClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 100, CypherParser::RuleOC_UpdatingClause); + enterRule(_localctx, 102, CypherParser::RuleOC_UpdatingClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6206,26 +6243,26 @@ CypherParser::OC_UpdatingClauseContext* CypherParser::oC_UpdatingClause() { exitRule(); }); try { - setState(1095); + setState(1091); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::CREATE: { enterOuterAlt(_localctx, 1); - setState(1091); + setState(1087); oC_Create(); break; } case CypherParser::MERGE: { enterOuterAlt(_localctx, 2); - setState(1092); + setState(1088); oC_Merge(); break; } case CypherParser::SET: { enterOuterAlt(_localctx, 3); - setState(1093); + setState(1089); oC_Set(); break; } @@ -6233,7 +6270,7 @@ CypherParser::OC_UpdatingClauseContext* CypherParser::oC_UpdatingClause() { case CypherParser::DETACH: case CypherParser::DELETE: { enterOuterAlt(_localctx, 4); - setState(1094); + setState(1090); oC_Delete(); break; } @@ -6282,7 +6319,7 @@ size_t CypherParser::OC_ReadingClauseContext::getRuleIndex() const { CypherParser::OC_ReadingClauseContext* CypherParser::oC_ReadingClause() { OC_ReadingClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 102, CypherParser::RuleOC_ReadingClause); + enterRule(_localctx, 104, CypherParser::RuleOC_ReadingClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6292,34 +6329,34 @@ CypherParser::OC_ReadingClauseContext* CypherParser::oC_ReadingClause() { exitRule(); }); try { - setState(1101); + setState(1097); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::OPTIONAL: case CypherParser::MATCH: { enterOuterAlt(_localctx, 1); - setState(1097); + setState(1093); oC_Match(); break; } case CypherParser::UNWIND: { enterOuterAlt(_localctx, 2); - setState(1098); + setState(1094); oC_Unwind(); break; } case CypherParser::CALL: { enterOuterAlt(_localctx, 3); - setState(1099); + setState(1095); kU_InQueryCall(); break; } case CypherParser::LOAD: { enterOuterAlt(_localctx, 4); - setState(1100); + setState(1096); kU_LoadFrom(); break; } @@ -6360,12 +6397,8 @@ tree::TerminalNode* CypherParser::KU_LoadFromContext::FROM() { return getToken(CypherParser::FROM, 0); } -CypherParser::KU_FilePathsContext* CypherParser::KU_LoadFromContext::kU_FilePaths() { - return getRuleContext(0); -} - -CypherParser::OC_VariableContext* CypherParser::KU_LoadFromContext::oC_Variable() { - return getRuleContext(0); +CypherParser::KU_ScanSourceContext* CypherParser::KU_LoadFromContext::kU_ScanSource() { + return getRuleContext(0); } tree::TerminalNode* CypherParser::KU_LoadFromContext::WITH() { @@ -6380,14 +6413,14 @@ CypherParser::KU_PropertyDefinitionsContext* CypherParser::KU_LoadFromContext::k return getRuleContext(0); } -CypherParser::OC_WhereContext* CypherParser::KU_LoadFromContext::oC_Where() { - return getRuleContext(0); -} - CypherParser::KU_ParsingOptionsContext* CypherParser::KU_LoadFromContext::kU_ParsingOptions() { return getRuleContext(0); } +CypherParser::OC_WhereContext* CypherParser::KU_LoadFromContext::oC_Where() { + return getRuleContext(0); +} + size_t CypherParser::KU_LoadFromContext::getRuleIndex() const { return CypherParser::RuleKU_LoadFrom; @@ -6396,7 +6429,7 @@ size_t CypherParser::KU_LoadFromContext::getRuleIndex() const { CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { KU_LoadFromContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 104, CypherParser::RuleKU_LoadFrom); + enterRule(_localctx, 106, CypherParser::RuleKU_LoadFrom); size_t _la = 0; #if __cplusplus > 201703L @@ -6408,150 +6441,100 @@ CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { }); try { enterOuterAlt(_localctx, 1); - setState(1103); + setState(1099); match(CypherParser::LOAD); - setState(1121); + setState(1117); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 150, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 148, _ctx)) { case 1: { - setState(1104); + setState(1100); match(CypherParser::SP); - setState(1105); + setState(1101); match(CypherParser::WITH); - setState(1106); + setState(1102); match(CypherParser::SP); - setState(1107); + setState(1103); match(CypherParser::HEADERS); - setState(1109); + setState(1105); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1108); + setState(1104); match(CypherParser::SP); } - setState(1111); + setState(1107); match(CypherParser::T__1); - setState(1113); + setState(1109); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1112); + setState(1108); match(CypherParser::SP); } - setState(1115); + setState(1111); kU_PropertyDefinitions(); - setState(1117); + setState(1113); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1116); + setState(1112); match(CypherParser::SP); } - setState(1119); - match(CypherParser::T__2); + setState(1115); + match(CypherParser::T__3); break; } default: break; } - setState(1123); + setState(1119); match(CypherParser::SP); - setState(1124); + setState(1120); match(CypherParser::FROM); - setState(1125); + setState(1121); match(CypherParser::SP); - setState(1143); + setState(1122); + kU_ScanSource(); + setState(1127); _errHandler->sync(this); - switch (_input->LA(1)) { - case CypherParser::T__5: - case CypherParser::GLOB: - case CypherParser::StringLiteral: { - setState(1126); - kU_FilePaths(); - setState(1140); - _errHandler->sync(this); - - switch (getInterpreter()->adaptivePredict(_input, 154, _ctx)) { - case 1: { - setState(1128); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(1127); - match(CypherParser::SP); - } - setState(1130); - match(CypherParser::T__1); - setState(1132); - _errHandler->sync(this); - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(1131); - match(CypherParser::SP); - } - setState(1134); - kU_ParsingOptions(); - setState(1136); - _errHandler->sync(this); - - _la = _input->LA(1); - if (_la == CypherParser::SP) { - setState(1135); - match(CypherParser::SP); - } - setState(1138); - match(CypherParser::T__2); - break; - } - - default: - break; - } - break; - } + switch (getInterpreter()->adaptivePredict(_input, 150, _ctx)) { + case 1: { + setState(1124); + _errHandler->sync(this); - case CypherParser::COMMENT_: - case CypherParser::EXPORT: - case CypherParser::IMPORT: - case CypherParser::DATABASE: - case CypherParser::NODE: - case CypherParser::REL: - case CypherParser::BEGIN: - case CypherParser::IN: - case CypherParser::COUNT: - case CypherParser::END: - case CypherParser::HexLetter: - case CypherParser::UnescapedSymbolicName: - case CypherParser::EscapedSymbolicName: { - setState(1142); - oC_Variable(); - break; + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(1123); + match(CypherParser::SP); } + setState(1126); + kU_ParsingOptions(); + break; + } default: - throw NoViableAltException(this); + break; } - setState(1149); + setState(1133); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 157, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 152, _ctx)) { case 1: { - setState(1146); + setState(1130); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1145); + setState(1129); match(CypherParser::SP); } - setState(1148); + setState(1132); oC_Where(); break; } @@ -6604,7 +6587,7 @@ size_t CypherParser::KU_InQueryCallContext::getRuleIndex() const { CypherParser::KU_InQueryCallContext* CypherParser::kU_InQueryCall() { KU_InQueryCallContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 106, CypherParser::RuleKU_InQueryCall); + enterRule(_localctx, 108, CypherParser::RuleKU_InQueryCall); size_t _la = 0; #if __cplusplus > 201703L @@ -6616,26 +6599,26 @@ CypherParser::KU_InQueryCallContext* CypherParser::kU_InQueryCall() { }); try { enterOuterAlt(_localctx, 1); - setState(1151); + setState(1135); match(CypherParser::CALL); - setState(1152); + setState(1136); match(CypherParser::SP); - setState(1153); + setState(1137); oC_FunctionInvocation(); - setState(1158); + setState(1142); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 159, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 154, _ctx)) { case 1: { - setState(1155); + setState(1139); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1154); + setState(1138); match(CypherParser::SP); } - setState(1157); + setState(1141); oC_Where(); break; } @@ -6692,7 +6675,7 @@ size_t CypherParser::OC_MatchContext::getRuleIndex() const { CypherParser::OC_MatchContext* CypherParser::oC_Match() { OC_MatchContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 108, CypherParser::RuleOC_Match); + enterRule(_localctx, 110, CypherParser::RuleOC_Match); size_t _la = 0; #if __cplusplus > 201703L @@ -6704,42 +6687,42 @@ CypherParser::OC_MatchContext* CypherParser::oC_Match() { }); try { enterOuterAlt(_localctx, 1); - setState(1162); + setState(1146); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::OPTIONAL) { - setState(1160); + setState(1144); match(CypherParser::OPTIONAL); - setState(1161); + setState(1145); match(CypherParser::SP); } - setState(1164); + setState(1148); match(CypherParser::MATCH); - setState(1166); + setState(1150); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1165); + setState(1149); match(CypherParser::SP); } - setState(1168); + setState(1152); oC_Pattern(); - setState(1173); + setState(1157); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 163, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 158, _ctx)) { case 1: { - setState(1170); + setState(1154); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1169); + setState(1153); match(CypherParser::SP); } - setState(1172); + setState(1156); oC_Where(); break; } @@ -6796,7 +6779,7 @@ size_t CypherParser::OC_UnwindContext::getRuleIndex() const { CypherParser::OC_UnwindContext* CypherParser::oC_Unwind() { OC_UnwindContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 110, CypherParser::RuleOC_Unwind); + enterRule(_localctx, 112, CypherParser::RuleOC_Unwind); size_t _la = 0; #if __cplusplus > 201703L @@ -6808,25 +6791,25 @@ CypherParser::OC_UnwindContext* CypherParser::oC_Unwind() { }); try { enterOuterAlt(_localctx, 1); - setState(1175); + setState(1159); match(CypherParser::UNWIND); - setState(1177); + setState(1161); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1176); + setState(1160); match(CypherParser::SP); } - setState(1179); + setState(1163); oC_Expression(); - setState(1180); + setState(1164); match(CypherParser::SP); - setState(1181); + setState(1165); match(CypherParser::AS); - setState(1182); + setState(1166); match(CypherParser::SP); - setState(1183); + setState(1167); oC_Variable(); } @@ -6865,7 +6848,7 @@ size_t CypherParser::OC_CreateContext::getRuleIndex() const { CypherParser::OC_CreateContext* CypherParser::oC_Create() { OC_CreateContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 112, CypherParser::RuleOC_Create); + enterRule(_localctx, 114, CypherParser::RuleOC_Create); size_t _la = 0; #if __cplusplus > 201703L @@ -6877,17 +6860,17 @@ CypherParser::OC_CreateContext* CypherParser::oC_Create() { }); try { enterOuterAlt(_localctx, 1); - setState(1185); + setState(1169); match(CypherParser::CREATE); - setState(1187); + setState(1171); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1186); + setState(1170); match(CypherParser::SP); } - setState(1189); + setState(1173); oC_Pattern(); } @@ -6938,7 +6921,7 @@ size_t CypherParser::OC_MergeContext::getRuleIndex() const { CypherParser::OC_MergeContext* CypherParser::oC_Merge() { OC_MergeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 114, CypherParser::RuleOC_Merge); + enterRule(_localctx, 116, CypherParser::RuleOC_Merge); size_t _la = 0; #if __cplusplus > 201703L @@ -6951,31 +6934,31 @@ CypherParser::OC_MergeContext* CypherParser::oC_Merge() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1191); + setState(1175); match(CypherParser::MERGE); - setState(1193); + setState(1177); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1192); + setState(1176); match(CypherParser::SP); } - setState(1195); + setState(1179); oC_Pattern(); - setState(1200); + setState(1184); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 162, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1196); + setState(1180); match(CypherParser::SP); - setState(1197); + setState(1181); oC_MergeAction(); } - setState(1202); + setState(1186); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 162, _ctx); } } @@ -7026,7 +7009,7 @@ size_t CypherParser::OC_MergeActionContext::getRuleIndex() const { CypherParser::OC_MergeActionContext* CypherParser::oC_MergeAction() { OC_MergeActionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 116, CypherParser::RuleOC_MergeAction); + enterRule(_localctx, 118, CypherParser::RuleOC_MergeAction); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7036,35 +7019,35 @@ CypherParser::OC_MergeActionContext* CypherParser::oC_MergeAction() { exitRule(); }); try { - setState(1213); + setState(1197); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 168, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 163, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1203); + setState(1187); match(CypherParser::ON); - setState(1204); + setState(1188); match(CypherParser::SP); - setState(1205); + setState(1189); match(CypherParser::MATCH); - setState(1206); + setState(1190); match(CypherParser::SP); - setState(1207); + setState(1191); oC_Set(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1208); + setState(1192); match(CypherParser::ON); - setState(1209); + setState(1193); match(CypherParser::SP); - setState(1210); + setState(1194); match(CypherParser::CREATE); - setState(1211); + setState(1195); match(CypherParser::SP); - setState(1212); + setState(1196); oC_Set(); break; } @@ -7117,7 +7100,7 @@ size_t CypherParser::OC_SetContext::getRuleIndex() const { CypherParser::OC_SetContext* CypherParser::oC_Set() { OC_SetContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 118, CypherParser::RuleOC_Set); + enterRule(_localctx, 120, CypherParser::RuleOC_Set); size_t _la = 0; #if __cplusplus > 201703L @@ -7130,47 +7113,47 @@ CypherParser::OC_SetContext* CypherParser::oC_Set() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1215); + setState(1199); match(CypherParser::SET); - setState(1217); + setState(1201); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1216); + setState(1200); match(CypherParser::SP); } - setState(1219); + setState(1203); oC_SetItem(); - setState(1230); + setState(1214); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 172, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1221); + setState(1205); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1220); + setState(1204); match(CypherParser::SP); } - setState(1223); - match(CypherParser::T__3); - setState(1225); + setState(1207); + match(CypherParser::T__2); + setState(1209); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1224); + setState(1208); match(CypherParser::SP); } - setState(1227); + setState(1211); oC_SetItem(); } - setState(1232); + setState(1216); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 172, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); } } @@ -7213,7 +7196,7 @@ size_t CypherParser::OC_SetItemContext::getRuleIndex() const { CypherParser::OC_SetItemContext* CypherParser::oC_SetItem() { OC_SetItemContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 120, CypherParser::RuleOC_SetItem); + enterRule(_localctx, 122, CypherParser::RuleOC_SetItem); size_t _la = 0; #if __cplusplus > 201703L @@ -7225,27 +7208,27 @@ CypherParser::OC_SetItemContext* CypherParser::oC_SetItem() { }); try { enterOuterAlt(_localctx, 1); - setState(1233); + setState(1217); oC_PropertyExpression(); - setState(1235); + setState(1219); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1234); + setState(1218); match(CypherParser::SP); } - setState(1237); + setState(1221); match(CypherParser::T__4); - setState(1239); + setState(1223); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1238); + setState(1222); match(CypherParser::SP); } - setState(1241); + setState(1225); oC_Expression(); } @@ -7296,7 +7279,7 @@ size_t CypherParser::OC_DeleteContext::getRuleIndex() const { CypherParser::OC_DeleteContext* CypherParser::oC_Delete() { OC_DeleteContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 122, CypherParser::RuleOC_Delete); + enterRule(_localctx, 124, CypherParser::RuleOC_Delete); size_t _la = 0; #if __cplusplus > 201703L @@ -7309,57 +7292,57 @@ CypherParser::OC_DeleteContext* CypherParser::oC_Delete() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1245); + setState(1229); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DETACH) { - setState(1243); + setState(1227); match(CypherParser::DETACH); - setState(1244); + setState(1228); match(CypherParser::SP); } - setState(1247); + setState(1231); match(CypherParser::DELETE); - setState(1249); + setState(1233); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1248); + setState(1232); match(CypherParser::SP); } - setState(1251); + setState(1235); oC_Expression(); - setState(1262); + setState(1246); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 179, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 174, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1253); + setState(1237); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1252); + setState(1236); match(CypherParser::SP); } - setState(1255); - match(CypherParser::T__3); - setState(1257); + setState(1239); + match(CypherParser::T__2); + setState(1241); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1256); + setState(1240); match(CypherParser::SP); } - setState(1259); + setState(1243); oC_Expression(); } - setState(1264); + setState(1248); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 179, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 174, _ctx); } } @@ -7402,7 +7385,7 @@ size_t CypherParser::OC_WithContext::getRuleIndex() const { CypherParser::OC_WithContext* CypherParser::oC_With() { OC_WithContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 124, CypherParser::RuleOC_With); + enterRule(_localctx, 126, CypherParser::RuleOC_With); size_t _la = 0; #if __cplusplus > 201703L @@ -7414,24 +7397,24 @@ CypherParser::OC_WithContext* CypherParser::oC_With() { }); try { enterOuterAlt(_localctx, 1); - setState(1265); + setState(1249); match(CypherParser::WITH); - setState(1266); + setState(1250); oC_ProjectionBody(); - setState(1271); + setState(1255); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 181, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 176, _ctx)) { case 1: { - setState(1268); + setState(1252); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1267); + setState(1251); match(CypherParser::SP); } - setState(1270); + setState(1254); oC_Where(); break; } @@ -7472,7 +7455,7 @@ size_t CypherParser::OC_ReturnContext::getRuleIndex() const { CypherParser::OC_ReturnContext* CypherParser::oC_Return() { OC_ReturnContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 126, CypherParser::RuleOC_Return); + enterRule(_localctx, 128, CypherParser::RuleOC_Return); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7483,9 +7466,9 @@ CypherParser::OC_ReturnContext* CypherParser::oC_Return() { }); try { enterOuterAlt(_localctx, 1); - setState(1273); + setState(1257); match(CypherParser::RETURN); - setState(1274); + setState(1258); oC_ProjectionBody(); } @@ -7540,7 +7523,7 @@ size_t CypherParser::OC_ProjectionBodyContext::getRuleIndex() const { CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { OC_ProjectionBodyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 128, CypherParser::RuleOC_ProjectionBody); + enterRule(_localctx, 130, CypherParser::RuleOC_ProjectionBody); size_t _la = 0; #if __cplusplus > 201703L @@ -7552,20 +7535,20 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { }); try { enterOuterAlt(_localctx, 1); - setState(1280); + setState(1264); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 183, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 178, _ctx)) { case 1: { - setState(1277); + setState(1261); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1276); + setState(1260); match(CypherParser::SP); } - setState(1279); + setState(1263); match(CypherParser::DISTINCT); break; } @@ -7573,18 +7556,18 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { default: break; } - setState(1282); + setState(1266); match(CypherParser::SP); - setState(1283); + setState(1267); oC_ProjectionItems(); - setState(1286); + setState(1270); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 184, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 179, _ctx)) { case 1: { - setState(1284); + setState(1268); match(CypherParser::SP); - setState(1285); + setState(1269); oC_Order(); break; } @@ -7592,14 +7575,14 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { default: break; } - setState(1290); + setState(1274); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 185, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 180, _ctx)) { case 1: { - setState(1288); + setState(1272); match(CypherParser::SP); - setState(1289); + setState(1273); oC_Skip(); break; } @@ -7607,14 +7590,14 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { default: break; } - setState(1294); + setState(1278); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 186, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 181, _ctx)) { case 1: { - setState(1292); + setState(1276); match(CypherParser::SP); - setState(1293); + setState(1277); oC_Limit(); break; } @@ -7667,7 +7650,7 @@ size_t CypherParser::OC_ProjectionItemsContext::getRuleIndex() const { CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { OC_ProjectionItemsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 130, CypherParser::RuleOC_ProjectionItems); + enterRule(_localctx, 132, CypherParser::RuleOC_ProjectionItems); size_t _la = 0; #if __cplusplus > 201703L @@ -7679,42 +7662,42 @@ CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { }); try { size_t alt; - setState(1324); + setState(1308); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::STAR: { enterOuterAlt(_localctx, 1); - setState(1296); + setState(1280); match(CypherParser::STAR); - setState(1307); + setState(1291); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 189, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 184, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1298); + setState(1282); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1297); + setState(1281); match(CypherParser::SP); } - setState(1300); - match(CypherParser::T__3); - setState(1302); + setState(1284); + match(CypherParser::T__2); + setState(1286); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1301); + setState(1285); match(CypherParser::SP); } - setState(1304); + setState(1288); oC_ProjectionItem(); } - setState(1309); + setState(1293); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 189, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 184, _ctx); } break; } @@ -7747,37 +7730,37 @@ CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 2); - setState(1310); + setState(1294); oC_ProjectionItem(); - setState(1321); + setState(1305); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 192, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 187, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1312); + setState(1296); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1311); + setState(1295); match(CypherParser::SP); } - setState(1314); - match(CypherParser::T__3); - setState(1316); + setState(1298); + match(CypherParser::T__2); + setState(1300); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1315); + setState(1299); match(CypherParser::SP); } - setState(1318); + setState(1302); oC_ProjectionItem(); } - setState(1323); + setState(1307); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 192, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 187, _ctx); } break; } @@ -7830,7 +7813,7 @@ size_t CypherParser::OC_ProjectionItemContext::getRuleIndex() const { CypherParser::OC_ProjectionItemContext* CypherParser::oC_ProjectionItem() { OC_ProjectionItemContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 132, CypherParser::RuleOC_ProjectionItem); + enterRule(_localctx, 134, CypherParser::RuleOC_ProjectionItem); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7840,27 +7823,27 @@ CypherParser::OC_ProjectionItemContext* CypherParser::oC_ProjectionItem() { exitRule(); }); try { - setState(1333); + setState(1317); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 194, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 189, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1326); + setState(1310); oC_Expression(); - setState(1327); + setState(1311); match(CypherParser::SP); - setState(1328); + setState(1312); match(CypherParser::AS); - setState(1329); + setState(1313); match(CypherParser::SP); - setState(1330); + setState(1314); oC_Variable(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1332); + setState(1316); oC_Expression(); break; } @@ -7917,7 +7900,7 @@ size_t CypherParser::OC_OrderContext::getRuleIndex() const { CypherParser::OC_OrderContext* CypherParser::oC_Order() { OC_OrderContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 134, CypherParser::RuleOC_Order); + enterRule(_localctx, 136, CypherParser::RuleOC_Order); size_t _la = 0; #if __cplusplus > 201703L @@ -7929,33 +7912,33 @@ CypherParser::OC_OrderContext* CypherParser::oC_Order() { }); try { enterOuterAlt(_localctx, 1); - setState(1335); + setState(1319); match(CypherParser::ORDER); - setState(1336); + setState(1320); match(CypherParser::SP); - setState(1337); + setState(1321); match(CypherParser::BY); - setState(1338); + setState(1322); match(CypherParser::SP); - setState(1339); + setState(1323); oC_SortItem(); - setState(1347); + setState(1331); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3) { - setState(1340); - match(CypherParser::T__3); - setState(1342); + while (_la == CypherParser::T__2) { + setState(1324); + match(CypherParser::T__2); + setState(1326); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1341); + setState(1325); match(CypherParser::SP); } - setState(1344); + setState(1328); oC_SortItem(); - setState(1349); + setState(1333); _errHandler->sync(this); _la = _input->LA(1); } @@ -7996,7 +7979,7 @@ size_t CypherParser::OC_SkipContext::getRuleIndex() const { CypherParser::OC_SkipContext* CypherParser::oC_Skip() { OC_SkipContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 136, CypherParser::RuleOC_Skip); + enterRule(_localctx, 138, CypherParser::RuleOC_Skip); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8007,11 +7990,11 @@ CypherParser::OC_SkipContext* CypherParser::oC_Skip() { }); try { enterOuterAlt(_localctx, 1); - setState(1350); + setState(1334); match(CypherParser::L_SKIP); - setState(1351); + setState(1335); match(CypherParser::SP); - setState(1352); + setState(1336); oC_Expression(); } @@ -8050,7 +8033,7 @@ size_t CypherParser::OC_LimitContext::getRuleIndex() const { CypherParser::OC_LimitContext* CypherParser::oC_Limit() { OC_LimitContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 138, CypherParser::RuleOC_Limit); + enterRule(_localctx, 140, CypherParser::RuleOC_Limit); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8061,11 +8044,11 @@ CypherParser::OC_LimitContext* CypherParser::oC_Limit() { }); try { enterOuterAlt(_localctx, 1); - setState(1354); + setState(1338); match(CypherParser::LIMIT); - setState(1355); + setState(1339); match(CypherParser::SP); - setState(1356); + setState(1340); oC_Expression(); } @@ -8116,7 +8099,7 @@ size_t CypherParser::OC_SortItemContext::getRuleIndex() const { CypherParser::OC_SortItemContext* CypherParser::oC_SortItem() { OC_SortItemContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 140, CypherParser::RuleOC_SortItem); + enterRule(_localctx, 142, CypherParser::RuleOC_SortItem); size_t _la = 0; #if __cplusplus > 201703L @@ -8128,22 +8111,22 @@ CypherParser::OC_SortItemContext* CypherParser::oC_SortItem() { }); try { enterOuterAlt(_localctx, 1); - setState(1358); + setState(1342); oC_Expression(); - setState(1363); + setState(1347); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 198, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 193, _ctx)) { case 1: { - setState(1360); + setState(1344); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1359); + setState(1343); match(CypherParser::SP); } - setState(1362); + setState(1346); _la = _input->LA(1); if (!(((((_la - 104) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 104)) & 15) != 0))) { @@ -8196,7 +8179,7 @@ size_t CypherParser::OC_WhereContext::getRuleIndex() const { CypherParser::OC_WhereContext* CypherParser::oC_Where() { OC_WhereContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 142, CypherParser::RuleOC_Where); + enterRule(_localctx, 144, CypherParser::RuleOC_Where); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8207,11 +8190,11 @@ CypherParser::OC_WhereContext* CypherParser::oC_Where() { }); try { enterOuterAlt(_localctx, 1); - setState(1365); + setState(1349); match(CypherParser::WHERE); - setState(1366); + setState(1350); match(CypherParser::SP); - setState(1367); + setState(1351); oC_Expression(); } @@ -8254,7 +8237,7 @@ size_t CypherParser::OC_PatternContext::getRuleIndex() const { CypherParser::OC_PatternContext* CypherParser::oC_Pattern() { OC_PatternContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 144, CypherParser::RuleOC_Pattern); + enterRule(_localctx, 146, CypherParser::RuleOC_Pattern); size_t _la = 0; #if __cplusplus > 201703L @@ -8267,37 +8250,37 @@ CypherParser::OC_PatternContext* CypherParser::oC_Pattern() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1369); + setState(1353); oC_PatternPart(); - setState(1380); + setState(1364); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 196, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1371); + setState(1355); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1370); + setState(1354); match(CypherParser::SP); } - setState(1373); - match(CypherParser::T__3); - setState(1375); + setState(1357); + match(CypherParser::T__2); + setState(1359); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1374); + setState(1358); match(CypherParser::SP); } - setState(1377); + setState(1361); oC_PatternPart(); } - setState(1382); + setState(1366); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 196, _ctx); } } @@ -8340,7 +8323,7 @@ size_t CypherParser::OC_PatternPartContext::getRuleIndex() const { CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { OC_PatternPartContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 146, CypherParser::RuleOC_PatternPart); + enterRule(_localctx, 148, CypherParser::RuleOC_PatternPart); size_t _la = 0; #if __cplusplus > 201703L @@ -8351,7 +8334,7 @@ CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { exitRule(); }); try { - setState(1394); + setState(1378); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -8368,34 +8351,34 @@ CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 1); - setState(1383); + setState(1367); oC_Variable(); - setState(1385); + setState(1369); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1384); + setState(1368); match(CypherParser::SP); } - setState(1387); + setState(1371); match(CypherParser::T__4); - setState(1389); + setState(1373); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1388); + setState(1372); match(CypherParser::SP); } - setState(1391); + setState(1375); oC_AnonymousPatternPart(); break; } case CypherParser::T__1: { enterOuterAlt(_localctx, 2); - setState(1393); + setState(1377); oC_AnonymousPatternPart(); break; } @@ -8432,7 +8415,7 @@ size_t CypherParser::OC_AnonymousPatternPartContext::getRuleIndex() const { CypherParser::OC_AnonymousPatternPartContext* CypherParser::oC_AnonymousPatternPart() { OC_AnonymousPatternPartContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 148, CypherParser::RuleOC_AnonymousPatternPart); + enterRule(_localctx, 150, CypherParser::RuleOC_AnonymousPatternPart); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8443,7 +8426,7 @@ CypherParser::OC_AnonymousPatternPartContext* CypherParser::oC_AnonymousPatternP }); try { enterOuterAlt(_localctx, 1); - setState(1396); + setState(1380); oC_PatternElement(); } @@ -8494,7 +8477,7 @@ size_t CypherParser::OC_PatternElementContext::getRuleIndex() const { CypherParser::OC_PatternElementContext* CypherParser::oC_PatternElement() { OC_PatternElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 150, CypherParser::RuleOC_PatternElement); + enterRule(_localctx, 152, CypherParser::RuleOC_PatternElement); size_t _la = 0; #if __cplusplus > 201703L @@ -8506,44 +8489,44 @@ CypherParser::OC_PatternElementContext* CypherParser::oC_PatternElement() { }); try { size_t alt; - setState(1412); + setState(1396); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 207, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 202, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1398); + setState(1382); oC_NodePattern(); - setState(1405); + setState(1389); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 206, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1400); + setState(1384); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1399); + setState(1383); match(CypherParser::SP); } - setState(1402); + setState(1386); oC_PatternElementChain(); } - setState(1407); + setState(1391); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 206, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); } break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1408); + setState(1392); match(CypherParser::T__1); - setState(1409); + setState(1393); oC_PatternElement(); - setState(1410); - match(CypherParser::T__2); + setState(1394); + match(CypherParser::T__3); break; } @@ -8595,7 +8578,7 @@ size_t CypherParser::OC_NodePatternContext::getRuleIndex() const { CypherParser::OC_NodePatternContext* CypherParser::oC_NodePattern() { OC_NodePatternContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 152, CypherParser::RuleOC_NodePattern); + enterRule(_localctx, 154, CypherParser::RuleOC_NodePattern); size_t _la = 0; #if __cplusplus > 201703L @@ -8607,68 +8590,68 @@ CypherParser::OC_NodePatternContext* CypherParser::oC_NodePattern() { }); try { enterOuterAlt(_localctx, 1); - setState(1414); + setState(1398); match(CypherParser::T__1); - setState(1416); + setState(1400); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1415); + setState(1399); match(CypherParser::SP); } - setState(1422); + setState(1406); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 47) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(1418); + setState(1402); oC_Variable(); - setState(1420); + setState(1404); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1419); + setState(1403); match(CypherParser::SP); } } - setState(1428); + setState(1412); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::COLON) { - setState(1424); + setState(1408); oC_NodeLabels(); - setState(1426); + setState(1410); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1425); + setState(1409); match(CypherParser::SP); } } - setState(1434); + setState(1418); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__7) { - setState(1430); + setState(1414); kU_Properties(); - setState(1432); + setState(1416); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1431); + setState(1415); match(CypherParser::SP); } } - setState(1436); - match(CypherParser::T__2); + setState(1420); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -8706,7 +8689,7 @@ size_t CypherParser::OC_PatternElementChainContext::getRuleIndex() const { CypherParser::OC_PatternElementChainContext* CypherParser::oC_PatternElementChain() { OC_PatternElementChainContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 154, CypherParser::RuleOC_PatternElementChain); + enterRule(_localctx, 156, CypherParser::RuleOC_PatternElementChain); size_t _la = 0; #if __cplusplus > 201703L @@ -8718,17 +8701,17 @@ CypherParser::OC_PatternElementChainContext* CypherParser::oC_PatternElementChai }); try { enterOuterAlt(_localctx, 1); - setState(1438); + setState(1422); oC_RelationshipPattern(); - setState(1440); + setState(1424); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1439); + setState(1423); match(CypherParser::SP); } - setState(1442); + setState(1426); oC_NodePattern(); } @@ -8783,7 +8766,7 @@ size_t CypherParser::OC_RelationshipPatternContext::getRuleIndex() const { CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPattern() { OC_RelationshipPatternContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 156, CypherParser::RuleOC_RelationshipPattern); + enterRule(_localctx, 158, CypherParser::RuleOC_RelationshipPattern); size_t _la = 0; #if __cplusplus > 201703L @@ -8794,29 +8777,29 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter exitRule(); }); try { - setState(1488); + setState(1472); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 227, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 222, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1444); + setState(1428); oC_LeftArrowHead(); - setState(1446); + setState(1430); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1445); + setState(1429); match(CypherParser::SP); } - setState(1448); + setState(1432); oC_Dash(); - setState(1450); + setState(1434); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 217, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 212, _ctx)) { case 1: { - setState(1449); + setState(1433); match(CypherParser::SP); break; } @@ -8824,37 +8807,37 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter default: break; } - setState(1453); + setState(1437); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__5) { - setState(1452); + setState(1436); oC_RelationshipDetail(); } - setState(1456); + setState(1440); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1455); + setState(1439); match(CypherParser::SP); } - setState(1458); + setState(1442); oC_Dash(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1460); + setState(1444); oC_Dash(); - setState(1462); + setState(1446); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 220, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 215, _ctx)) { case 1: { - setState(1461); + setState(1445); match(CypherParser::SP); break; } @@ -8862,47 +8845,47 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter default: break; } - setState(1465); + setState(1449); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__5) { - setState(1464); + setState(1448); oC_RelationshipDetail(); } - setState(1468); + setState(1452); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1467); + setState(1451); match(CypherParser::SP); } - setState(1470); + setState(1454); oC_Dash(); - setState(1472); + setState(1456); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1471); + setState(1455); match(CypherParser::SP); } - setState(1474); + setState(1458); oC_RightArrowHead(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1476); + setState(1460); oC_Dash(); - setState(1478); + setState(1462); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 224, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 219, _ctx)) { case 1: { - setState(1477); + setState(1461); match(CypherParser::SP); break; } @@ -8910,23 +8893,23 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter default: break; } - setState(1481); + setState(1465); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__5) { - setState(1480); + setState(1464); oC_RelationshipDetail(); } - setState(1484); + setState(1468); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1483); + setState(1467); match(CypherParser::SP); } - setState(1486); + setState(1470); oC_Dash(); break; } @@ -8983,7 +8966,7 @@ size_t CypherParser::OC_RelationshipDetailContext::getRuleIndex() const { CypherParser::OC_RelationshipDetailContext* CypherParser::oC_RelationshipDetail() { OC_RelationshipDetailContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 158, CypherParser::RuleOC_RelationshipDetail); + enterRule(_localctx, 160, CypherParser::RuleOC_RelationshipDetail); size_t _la = 0; #if __cplusplus > 201703L @@ -8995,83 +8978,83 @@ CypherParser::OC_RelationshipDetailContext* CypherParser::oC_RelationshipDetail( }); try { enterOuterAlt(_localctx, 1); - setState(1490); + setState(1474); match(CypherParser::T__5); - setState(1492); + setState(1476); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1491); + setState(1475); match(CypherParser::SP); } - setState(1498); + setState(1482); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 47) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(1494); + setState(1478); oC_Variable(); - setState(1496); + setState(1480); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1495); + setState(1479); match(CypherParser::SP); } } - setState(1504); + setState(1488); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::COLON) { - setState(1500); + setState(1484); oC_RelationshipTypes(); - setState(1502); + setState(1486); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1501); + setState(1485); match(CypherParser::SP); } } - setState(1510); + setState(1494); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::STAR) { - setState(1506); + setState(1490); oC_RangeLiteral(); - setState(1508); + setState(1492); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1507); + setState(1491); match(CypherParser::SP); } } - setState(1516); + setState(1500); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__7) { - setState(1512); + setState(1496); kU_Properties(); - setState(1514); + setState(1498); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1513); + setState(1497); match(CypherParser::SP); } } - setState(1518); + setState(1502); match(CypherParser::T__6); } @@ -9130,7 +9113,7 @@ size_t CypherParser::KU_PropertiesContext::getRuleIndex() const { CypherParser::KU_PropertiesContext* CypherParser::kU_Properties() { KU_PropertiesContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 160, CypherParser::RuleKU_Properties); + enterRule(_localctx, 162, CypherParser::RuleKU_Properties); size_t _la = 0; #if __cplusplus > 201703L @@ -9142,103 +9125,103 @@ CypherParser::KU_PropertiesContext* CypherParser::kU_Properties() { }); try { enterOuterAlt(_localctx, 1); - setState(1520); + setState(1504); match(CypherParser::T__7); - setState(1522); + setState(1506); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1521); + setState(1505); match(CypherParser::SP); } - setState(1557); + setState(1541); _errHandler->sync(this); _la = _input->LA(1); if (((((_la - 47) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(1524); + setState(1508); oC_PropertyKeyName(); - setState(1526); + setState(1510); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1525); + setState(1509); match(CypherParser::SP); } - setState(1528); + setState(1512); match(CypherParser::COLON); - setState(1530); + setState(1514); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1529); + setState(1513); match(CypherParser::SP); } - setState(1532); + setState(1516); oC_Expression(); - setState(1534); + setState(1518); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1533); + setState(1517); match(CypherParser::SP); } - setState(1554); + setState(1538); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3) { - setState(1536); - match(CypherParser::T__3); - setState(1538); + while (_la == CypherParser::T__2) { + setState(1520); + match(CypherParser::T__2); + setState(1522); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1537); + setState(1521); match(CypherParser::SP); } - setState(1540); + setState(1524); oC_PropertyKeyName(); - setState(1542); + setState(1526); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1541); + setState(1525); match(CypherParser::SP); } - setState(1544); + setState(1528); match(CypherParser::COLON); - setState(1546); + setState(1530); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1545); + setState(1529); match(CypherParser::SP); } - setState(1548); + setState(1532); oC_Expression(); - setState(1550); + setState(1534); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1549); + setState(1533); match(CypherParser::SP); } - setState(1556); + setState(1540); _errHandler->sync(this); _la = _input->LA(1); } } - setState(1559); + setState(1543); match(CypherParser::T__8); } @@ -9289,7 +9272,7 @@ size_t CypherParser::OC_RelationshipTypesContext::getRuleIndex() const { CypherParser::OC_RelationshipTypesContext* CypherParser::oC_RelationshipTypes() { OC_RelationshipTypesContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 162, CypherParser::RuleOC_RelationshipTypes); + enterRule(_localctx, 164, CypherParser::RuleOC_RelationshipTypes); size_t _la = 0; #if __cplusplus > 201703L @@ -9302,55 +9285,55 @@ CypherParser::OC_RelationshipTypesContext* CypherParser::oC_RelationshipTypes() try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1561); + setState(1545); match(CypherParser::COLON); - setState(1563); + setState(1547); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1562); + setState(1546); match(CypherParser::SP); } - setState(1565); + setState(1549); oC_RelTypeName(); - setState(1579); + setState(1563); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 251, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 246, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1567); + setState(1551); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1566); + setState(1550); match(CypherParser::SP); } - setState(1569); + setState(1553); match(CypherParser::T__9); - setState(1571); + setState(1555); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::COLON) { - setState(1570); + setState(1554); match(CypherParser::COLON); } - setState(1574); + setState(1558); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1573); + setState(1557); match(CypherParser::SP); } - setState(1576); + setState(1560); oC_RelTypeName(); } - setState(1581); + setState(1565); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 251, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 246, _ctx); } } @@ -9393,7 +9376,7 @@ size_t CypherParser::OC_NodeLabelsContext::getRuleIndex() const { CypherParser::OC_NodeLabelsContext* CypherParser::oC_NodeLabels() { OC_NodeLabelsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 164, CypherParser::RuleOC_NodeLabels); + enterRule(_localctx, 166, CypherParser::RuleOC_NodeLabels); size_t _la = 0; #if __cplusplus > 201703L @@ -9406,27 +9389,27 @@ CypherParser::OC_NodeLabelsContext* CypherParser::oC_NodeLabels() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1582); + setState(1566); oC_NodeLabel(); - setState(1589); + setState(1573); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 253, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 248, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1584); + setState(1568); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1583); + setState(1567); match(CypherParser::SP); } - setState(1586); + setState(1570); oC_NodeLabel(); } - setState(1591); + setState(1575); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 253, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 248, _ctx); } } @@ -9465,7 +9448,7 @@ size_t CypherParser::OC_NodeLabelContext::getRuleIndex() const { CypherParser::OC_NodeLabelContext* CypherParser::oC_NodeLabel() { OC_NodeLabelContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 166, CypherParser::RuleOC_NodeLabel); + enterRule(_localctx, 168, CypherParser::RuleOC_NodeLabel); size_t _la = 0; #if __cplusplus > 201703L @@ -9477,17 +9460,17 @@ CypherParser::OC_NodeLabelContext* CypherParser::oC_NodeLabel() { }); try { enterOuterAlt(_localctx, 1); - setState(1592); + setState(1576); match(CypherParser::COLON); - setState(1594); + setState(1578); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1593); + setState(1577); match(CypherParser::SP); } - setState(1596); + setState(1580); oC_LabelName(); } @@ -9550,7 +9533,7 @@ size_t CypherParser::OC_RangeLiteralContext::getRuleIndex() const { CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { OC_RangeLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 168, CypherParser::RuleOC_RangeLiteral); + enterRule(_localctx, 170, CypherParser::RuleOC_RangeLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -9562,14 +9545,14 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(1598); + setState(1582); match(CypherParser::STAR); - setState(1600); + setState(1584); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 255, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 250, _ctx)) { case 1: { - setState(1599); + setState(1583); match(CypherParser::SP); break; } @@ -9577,21 +9560,21 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1606); + setState(1590); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::SHORTEST: { - setState(1602); + setState(1586); match(CypherParser::SHORTEST); break; } case CypherParser::ALL: { - setState(1603); + setState(1587); match(CypherParser::ALL); - setState(1604); + setState(1588); match(CypherParser::SP); - setState(1605); + setState(1589); match(CypherParser::SHORTEST); break; } @@ -9608,12 +9591,12 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1609); + setState(1593); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 257, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 252, _ctx)) { case 1: { - setState(1608); + setState(1592); match(CypherParser::SP); break; } @@ -9621,35 +9604,35 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1625); + setState(1609); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 262, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 257, _ctx)) { case 1: { - setState(1612); + setState(1596); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DecimalInteger) { - setState(1611); + setState(1595); oC_LowerBound(); } - setState(1615); + setState(1599); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1614); + setState(1598); match(CypherParser::SP); } - setState(1617); + setState(1601); match(CypherParser::T__10); - setState(1619); + setState(1603); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 260, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 255, _ctx)) { case 1: { - setState(1618); + setState(1602); match(CypherParser::SP); break; } @@ -9657,19 +9640,19 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1622); + setState(1606); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DecimalInteger) { - setState(1621); + setState(1605); oC_UpperBound(); } break; } case 2: { - setState(1624); + setState(1608); oC_IntegerLiteral(); break; } @@ -9677,20 +9660,20 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1631); + setState(1615); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 264, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 259, _ctx)) { case 1: { - setState(1628); + setState(1612); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1627); + setState(1611); match(CypherParser::SP); } - setState(1630); + setState(1614); kU_RecursiveRelationshipComprehension(); break; } @@ -9751,7 +9734,7 @@ size_t CypherParser::KU_RecursiveRelationshipComprehensionContext::getRuleIndex( CypherParser::KU_RecursiveRelationshipComprehensionContext* CypherParser::kU_RecursiveRelationshipComprehension() { KU_RecursiveRelationshipComprehensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 170, CypherParser::RuleKU_RecursiveRelationshipComprehension); + enterRule(_localctx, 172, CypherParser::RuleKU_RecursiveRelationshipComprehension); size_t _la = 0; #if __cplusplus > 201703L @@ -9763,62 +9746,62 @@ CypherParser::KU_RecursiveRelationshipComprehensionContext* CypherParser::kU_Rec }); try { enterOuterAlt(_localctx, 1); - setState(1633); + setState(1617); match(CypherParser::T__1); - setState(1635); + setState(1619); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1634); + setState(1618); match(CypherParser::SP); } - setState(1637); + setState(1621); oC_Variable(); - setState(1639); + setState(1623); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1638); + setState(1622); match(CypherParser::SP); } - setState(1641); - match(CypherParser::T__3); - setState(1643); + setState(1625); + match(CypherParser::T__2); + setState(1627); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1642); + setState(1626); match(CypherParser::SP); } - setState(1645); + setState(1629); oC_Variable(); - setState(1654); + setState(1638); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 270, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 265, _ctx)) { case 1: { - setState(1647); + setState(1631); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1646); + setState(1630); match(CypherParser::SP); } - setState(1649); + setState(1633); match(CypherParser::T__9); - setState(1651); + setState(1635); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1650); + setState(1634); match(CypherParser::SP); } - setState(1653); + setState(1637); oC_Where(); break; } @@ -9826,62 +9809,62 @@ CypherParser::KU_RecursiveRelationshipComprehensionContext* CypherParser::kU_Rec default: break; } - setState(1675); + setState(1659); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__9 || _la == CypherParser::SP) { - setState(1657); + setState(1641); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1656); + setState(1640); match(CypherParser::SP); } - setState(1659); + setState(1643); match(CypherParser::T__9); - setState(1661); + setState(1645); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1660); + setState(1644); match(CypherParser::SP); } - setState(1663); + setState(1647); kU_IntermediateRelProjectionItems(); - setState(1665); + setState(1649); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1664); + setState(1648); match(CypherParser::SP); } - setState(1667); - match(CypherParser::T__3); - setState(1669); + setState(1651); + match(CypherParser::T__2); + setState(1653); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1668); + setState(1652); match(CypherParser::SP); } - setState(1671); + setState(1655); kU_IntermediateNodeProjectionItems(); - setState(1673); + setState(1657); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1672); + setState(1656); match(CypherParser::SP); } } - setState(1677); - match(CypherParser::T__2); + setState(1661); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -9919,7 +9902,7 @@ size_t CypherParser::KU_IntermediateNodeProjectionItemsContext::getRuleIndex() c CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_IntermediateNodeProjectionItems() { KU_IntermediateNodeProjectionItemsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 172, CypherParser::RuleKU_IntermediateNodeProjectionItems); + enterRule(_localctx, 174, CypherParser::RuleKU_IntermediateNodeProjectionItems); size_t _la = 0; #if __cplusplus > 201703L @@ -9931,14 +9914,14 @@ CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_Interm }); try { enterOuterAlt(_localctx, 1); - setState(1679); + setState(1663); match(CypherParser::T__7); - setState(1681); + setState(1665); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 277, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 272, _ctx)) { case 1: { - setState(1680); + setState(1664); match(CypherParser::SP); break; } @@ -9946,7 +9929,7 @@ CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_Interm default: break; } - setState(1684); + setState(1668); _errHandler->sync(this); _la = _input->LA(1); @@ -9954,18 +9937,18 @@ CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_Interm ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139966783258607) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1683); + setState(1667); oC_ProjectionItems(); } - setState(1687); + setState(1671); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1686); + setState(1670); match(CypherParser::SP); } - setState(1689); + setState(1673); match(CypherParser::T__8); } @@ -10004,7 +9987,7 @@ size_t CypherParser::KU_IntermediateRelProjectionItemsContext::getRuleIndex() co CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_IntermediateRelProjectionItems() { KU_IntermediateRelProjectionItemsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 174, CypherParser::RuleKU_IntermediateRelProjectionItems); + enterRule(_localctx, 176, CypherParser::RuleKU_IntermediateRelProjectionItems); size_t _la = 0; #if __cplusplus > 201703L @@ -10016,14 +9999,14 @@ CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_Interme }); try { enterOuterAlt(_localctx, 1); - setState(1691); + setState(1675); match(CypherParser::T__7); - setState(1693); + setState(1677); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 280, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 275, _ctx)) { case 1: { - setState(1692); + setState(1676); match(CypherParser::SP); break; } @@ -10031,7 +10014,7 @@ CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_Interme default: break; } - setState(1696); + setState(1680); _errHandler->sync(this); _la = _input->LA(1); @@ -10039,18 +10022,18 @@ CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_Interme ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139966783258607) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1695); + setState(1679); oC_ProjectionItems(); } - setState(1699); + setState(1683); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1698); + setState(1682); match(CypherParser::SP); } - setState(1701); + setState(1685); match(CypherParser::T__8); } @@ -10081,7 +10064,7 @@ size_t CypherParser::OC_LowerBoundContext::getRuleIndex() const { CypherParser::OC_LowerBoundContext* CypherParser::oC_LowerBound() { OC_LowerBoundContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 176, CypherParser::RuleOC_LowerBound); + enterRule(_localctx, 178, CypherParser::RuleOC_LowerBound); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10092,7 +10075,7 @@ CypherParser::OC_LowerBoundContext* CypherParser::oC_LowerBound() { }); try { enterOuterAlt(_localctx, 1); - setState(1703); + setState(1687); match(CypherParser::DecimalInteger); } @@ -10123,7 +10106,7 @@ size_t CypherParser::OC_UpperBoundContext::getRuleIndex() const { CypherParser::OC_UpperBoundContext* CypherParser::oC_UpperBound() { OC_UpperBoundContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 178, CypherParser::RuleOC_UpperBound); + enterRule(_localctx, 180, CypherParser::RuleOC_UpperBound); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10134,7 +10117,7 @@ CypherParser::OC_UpperBoundContext* CypherParser::oC_UpperBound() { }); try { enterOuterAlt(_localctx, 1); - setState(1705); + setState(1689); match(CypherParser::DecimalInteger); } @@ -10165,7 +10148,7 @@ size_t CypherParser::OC_LabelNameContext::getRuleIndex() const { CypherParser::OC_LabelNameContext* CypherParser::oC_LabelName() { OC_LabelNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 180, CypherParser::RuleOC_LabelName); + enterRule(_localctx, 182, CypherParser::RuleOC_LabelName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10176,7 +10159,7 @@ CypherParser::OC_LabelNameContext* CypherParser::oC_LabelName() { }); try { enterOuterAlt(_localctx, 1); - setState(1707); + setState(1691); oC_SchemaName(); } @@ -10207,7 +10190,7 @@ size_t CypherParser::OC_RelTypeNameContext::getRuleIndex() const { CypherParser::OC_RelTypeNameContext* CypherParser::oC_RelTypeName() { OC_RelTypeNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 182, CypherParser::RuleOC_RelTypeName); + enterRule(_localctx, 184, CypherParser::RuleOC_RelTypeName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10218,7 +10201,7 @@ CypherParser::OC_RelTypeNameContext* CypherParser::oC_RelTypeName() { }); try { enterOuterAlt(_localctx, 1); - setState(1709); + setState(1693); oC_SchemaName(); } @@ -10249,7 +10232,7 @@ size_t CypherParser::OC_ExpressionContext::getRuleIndex() const { CypherParser::OC_ExpressionContext* CypherParser::oC_Expression() { OC_ExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 184, CypherParser::RuleOC_Expression); + enterRule(_localctx, 186, CypherParser::RuleOC_Expression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10260,7 +10243,7 @@ CypherParser::OC_ExpressionContext* CypherParser::oC_Expression() { }); try { enterOuterAlt(_localctx, 1); - setState(1711); + setState(1695); oC_OrExpression(); } @@ -10311,7 +10294,7 @@ size_t CypherParser::OC_OrExpressionContext::getRuleIndex() const { CypherParser::OC_OrExpressionContext* CypherParser::oC_OrExpression() { OC_OrExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 186, CypherParser::RuleOC_OrExpression); + enterRule(_localctx, 188, CypherParser::RuleOC_OrExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10323,25 +10306,25 @@ CypherParser::OC_OrExpressionContext* CypherParser::oC_OrExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1713); + setState(1697); oC_XorExpression(); - setState(1720); + setState(1704); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 283, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 278, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1714); + setState(1698); match(CypherParser::SP); - setState(1715); + setState(1699); match(CypherParser::OR); - setState(1716); + setState(1700); match(CypherParser::SP); - setState(1717); + setState(1701); oC_XorExpression(); } - setState(1722); + setState(1706); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 283, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 278, _ctx); } } @@ -10392,7 +10375,7 @@ size_t CypherParser::OC_XorExpressionContext::getRuleIndex() const { CypherParser::OC_XorExpressionContext* CypherParser::oC_XorExpression() { OC_XorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 188, CypherParser::RuleOC_XorExpression); + enterRule(_localctx, 190, CypherParser::RuleOC_XorExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10404,25 +10387,25 @@ CypherParser::OC_XorExpressionContext* CypherParser::oC_XorExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1723); + setState(1707); oC_AndExpression(); - setState(1730); + setState(1714); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 284, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 279, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1724); + setState(1708); match(CypherParser::SP); - setState(1725); + setState(1709); match(CypherParser::XOR); - setState(1726); + setState(1710); match(CypherParser::SP); - setState(1727); + setState(1711); oC_AndExpression(); } - setState(1732); + setState(1716); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 284, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 279, _ctx); } } @@ -10473,7 +10456,7 @@ size_t CypherParser::OC_AndExpressionContext::getRuleIndex() const { CypherParser::OC_AndExpressionContext* CypherParser::oC_AndExpression() { OC_AndExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 190, CypherParser::RuleOC_AndExpression); + enterRule(_localctx, 192, CypherParser::RuleOC_AndExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10485,25 +10468,25 @@ CypherParser::OC_AndExpressionContext* CypherParser::oC_AndExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1733); + setState(1717); oC_NotExpression(); - setState(1740); + setState(1724); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 285, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 280, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1734); + setState(1718); match(CypherParser::SP); - setState(1735); + setState(1719); match(CypherParser::AND); - setState(1736); + setState(1720); match(CypherParser::SP); - setState(1737); + setState(1721); oC_NotExpression(); } - setState(1742); + setState(1726); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 285, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 280, _ctx); } } @@ -10550,7 +10533,7 @@ size_t CypherParser::OC_NotExpressionContext::getRuleIndex() const { CypherParser::OC_NotExpressionContext* CypherParser::oC_NotExpression() { OC_NotExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 192, CypherParser::RuleOC_NotExpression); + enterRule(_localctx, 194, CypherParser::RuleOC_NotExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10562,25 +10545,25 @@ CypherParser::OC_NotExpressionContext* CypherParser::oC_NotExpression() { }); try { enterOuterAlt(_localctx, 1); - setState(1749); + setState(1733); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::NOT) { - setState(1743); + setState(1727); match(CypherParser::NOT); - setState(1745); + setState(1729); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1744); + setState(1728); match(CypherParser::SP); } - setState(1751); + setState(1735); _errHandler->sync(this); _la = _input->LA(1); } - setState(1752); + setState(1736); oC_ComparisonExpression(); } @@ -10635,7 +10618,7 @@ size_t CypherParser::OC_ComparisonExpressionContext::getRuleIndex() const { CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpression() { OC_ComparisonExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 194, CypherParser::RuleOC_ComparisonExpression); + enterRule(_localctx, 196, CypherParser::RuleOC_ComparisonExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10647,37 +10630,37 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress }); try { size_t alt; - setState(1802); + setState(1786); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 298, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 293, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1754); + setState(1738); kU_BitwiseOrOperatorExpression(); - setState(1764); + setState(1748); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 290, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 285, _ctx)) { case 1: { - setState(1756); + setState(1740); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1755); + setState(1739); match(CypherParser::SP); } - setState(1758); + setState(1742); kU_ComparisonOperator(); - setState(1760); + setState(1744); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1759); + setState(1743); match(CypherParser::SP); } - setState(1762); + setState(1746); kU_BitwiseOrOperatorExpression(); break; } @@ -10690,28 +10673,28 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress case 2: { enterOuterAlt(_localctx, 2); - setState(1766); + setState(1750); kU_BitwiseOrOperatorExpression(); - setState(1768); + setState(1752); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1767); + setState(1751); match(CypherParser::SP); } - setState(1770); + setState(1754); antlrcpp::downCast(_localctx)->invalid_not_equalToken = match(CypherParser::INVALID_NOT_EQUAL); - setState(1772); + setState(1756); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1771); + setState(1755); match(CypherParser::SP); } - setState(1774); + setState(1758); kU_BitwiseOrOperatorExpression(); notifyInvalidNotEqualOperator(antlrcpp::downCast(_localctx)->invalid_not_equalToken); break; @@ -10719,53 +10702,53 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress case 3: { enterOuterAlt(_localctx, 3); - setState(1778); + setState(1762); kU_BitwiseOrOperatorExpression(); - setState(1780); + setState(1764); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1779); + setState(1763); match(CypherParser::SP); } - setState(1782); + setState(1766); kU_ComparisonOperator(); - setState(1784); + setState(1768); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1783); + setState(1767); match(CypherParser::SP); } - setState(1786); + setState(1770); kU_BitwiseOrOperatorExpression(); - setState(1796); + setState(1780); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(1788); + setState(1772); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1787); + setState(1771); match(CypherParser::SP); } - setState(1790); + setState(1774); kU_ComparisonOperator(); - setState(1792); + setState(1776); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1791); + setState(1775); match(CypherParser::SP); } - setState(1794); + setState(1778); kU_BitwiseOrOperatorExpression(); break; } @@ -10773,9 +10756,9 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress default: throw NoViableAltException(this); } - setState(1798); + setState(1782); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 297, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 292, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); notifyNonBinaryComparison(_localctx->start); break; @@ -10809,7 +10792,7 @@ size_t CypherParser::KU_ComparisonOperatorContext::getRuleIndex() const { CypherParser::KU_ComparisonOperatorContext* CypherParser::kU_ComparisonOperator() { KU_ComparisonOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 196, CypherParser::RuleKU_ComparisonOperator); + enterRule(_localctx, 198, CypherParser::RuleKU_ComparisonOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -10821,7 +10804,7 @@ CypherParser::KU_ComparisonOperatorContext* CypherParser::kU_ComparisonOperator( }); try { enterOuterAlt(_localctx, 1); - setState(1804); + setState(1788); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 127008) != 0))) { @@ -10872,7 +10855,7 @@ size_t CypherParser::KU_BitwiseOrOperatorExpressionContext::getRuleIndex() const CypherParser::KU_BitwiseOrOperatorExpressionContext* CypherParser::kU_BitwiseOrOperatorExpression() { KU_BitwiseOrOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 198, CypherParser::RuleKU_BitwiseOrOperatorExpression); + enterRule(_localctx, 200, CypherParser::RuleKU_BitwiseOrOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10885,37 +10868,37 @@ CypherParser::KU_BitwiseOrOperatorExpressionContext* CypherParser::kU_BitwiseOrO try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1806); + setState(1790); kU_BitwiseAndOperatorExpression(); - setState(1817); + setState(1801); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 301, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 296, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1808); + setState(1792); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1807); + setState(1791); match(CypherParser::SP); } - setState(1810); + setState(1794); match(CypherParser::T__9); - setState(1812); + setState(1796); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1811); + setState(1795); match(CypherParser::SP); } - setState(1814); + setState(1798); kU_BitwiseAndOperatorExpression(); } - setState(1819); + setState(1803); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 301, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 296, _ctx); } } @@ -10958,7 +10941,7 @@ size_t CypherParser::KU_BitwiseAndOperatorExpressionContext::getRuleIndex() cons CypherParser::KU_BitwiseAndOperatorExpressionContext* CypherParser::kU_BitwiseAndOperatorExpression() { KU_BitwiseAndOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 200, CypherParser::RuleKU_BitwiseAndOperatorExpression); + enterRule(_localctx, 202, CypherParser::RuleKU_BitwiseAndOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10971,37 +10954,37 @@ CypherParser::KU_BitwiseAndOperatorExpressionContext* CypherParser::kU_BitwiseAn try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1820); + setState(1804); kU_BitShiftOperatorExpression(); - setState(1831); + setState(1815); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 304, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 299, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1822); + setState(1806); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1821); + setState(1805); match(CypherParser::SP); } - setState(1824); + setState(1808); match(CypherParser::T__16); - setState(1826); + setState(1810); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1825); + setState(1809); match(CypherParser::SP); } - setState(1828); + setState(1812); kU_BitShiftOperatorExpression(); } - setState(1833); + setState(1817); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 304, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 299, _ctx); } } @@ -11052,7 +11035,7 @@ size_t CypherParser::KU_BitShiftOperatorExpressionContext::getRuleIndex() const CypherParser::KU_BitShiftOperatorExpressionContext* CypherParser::kU_BitShiftOperatorExpression() { KU_BitShiftOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 202, CypherParser::RuleKU_BitShiftOperatorExpression); + enterRule(_localctx, 204, CypherParser::RuleKU_BitShiftOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11065,37 +11048,37 @@ CypherParser::KU_BitShiftOperatorExpressionContext* CypherParser::kU_BitShiftOpe try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1834); + setState(1818); oC_AddOrSubtractExpression(); - setState(1846); + setState(1830); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 307, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 302, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1836); + setState(1820); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1835); + setState(1819); match(CypherParser::SP); } - setState(1838); + setState(1822); kU_BitShiftOperator(); - setState(1840); + setState(1824); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1839); + setState(1823); match(CypherParser::SP); } - setState(1842); + setState(1826); oC_AddOrSubtractExpression(); } - setState(1848); + setState(1832); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 307, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 302, _ctx); } } @@ -11122,7 +11105,7 @@ size_t CypherParser::KU_BitShiftOperatorContext::getRuleIndex() const { CypherParser::KU_BitShiftOperatorContext* CypherParser::kU_BitShiftOperator() { KU_BitShiftOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 204, CypherParser::RuleKU_BitShiftOperator); + enterRule(_localctx, 206, CypherParser::RuleKU_BitShiftOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -11134,7 +11117,7 @@ CypherParser::KU_BitShiftOperatorContext* CypherParser::kU_BitShiftOperator() { }); try { enterOuterAlt(_localctx, 1); - setState(1849); + setState(1833); _la = _input->LA(1); if (!(_la == CypherParser::T__17 @@ -11194,7 +11177,7 @@ size_t CypherParser::OC_AddOrSubtractExpressionContext::getRuleIndex() const { CypherParser::OC_AddOrSubtractExpressionContext* CypherParser::oC_AddOrSubtractExpression() { OC_AddOrSubtractExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 206, CypherParser::RuleOC_AddOrSubtractExpression); + enterRule(_localctx, 208, CypherParser::RuleOC_AddOrSubtractExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11207,37 +11190,37 @@ CypherParser::OC_AddOrSubtractExpressionContext* CypherParser::oC_AddOrSubtractE try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1851); + setState(1835); oC_MultiplyDivideModuloExpression(); - setState(1863); + setState(1847); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 310, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 305, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1853); + setState(1837); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1852); + setState(1836); match(CypherParser::SP); } - setState(1855); + setState(1839); kU_AddOrSubtractOperator(); - setState(1857); + setState(1841); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1856); + setState(1840); match(CypherParser::SP); } - setState(1859); + setState(1843); oC_MultiplyDivideModuloExpression(); } - setState(1865); + setState(1849); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 310, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 305, _ctx); } } @@ -11268,7 +11251,7 @@ size_t CypherParser::KU_AddOrSubtractOperatorContext::getRuleIndex() const { CypherParser::KU_AddOrSubtractOperatorContext* CypherParser::kU_AddOrSubtractOperator() { KU_AddOrSubtractOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 208, CypherParser::RuleKU_AddOrSubtractOperator); + enterRule(_localctx, 210, CypherParser::RuleKU_AddOrSubtractOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -11280,7 +11263,7 @@ CypherParser::KU_AddOrSubtractOperatorContext* CypherParser::kU_AddOrSubtractOpe }); try { enterOuterAlt(_localctx, 1); - setState(1866); + setState(1850); _la = _input->LA(1); if (!(_la == CypherParser::T__19 || _la == CypherParser::MINUS)) { _errHandler->recoverInline(this); @@ -11338,7 +11321,7 @@ size_t CypherParser::OC_MultiplyDivideModuloExpressionContext::getRuleIndex() co CypherParser::OC_MultiplyDivideModuloExpressionContext* CypherParser::oC_MultiplyDivideModuloExpression() { OC_MultiplyDivideModuloExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 210, CypherParser::RuleOC_MultiplyDivideModuloExpression); + enterRule(_localctx, 212, CypherParser::RuleOC_MultiplyDivideModuloExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11351,37 +11334,37 @@ CypherParser::OC_MultiplyDivideModuloExpressionContext* CypherParser::oC_Multipl try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1868); + setState(1852); oC_PowerOfExpression(); - setState(1880); + setState(1864); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 313, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 308, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1870); + setState(1854); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1869); + setState(1853); match(CypherParser::SP); } - setState(1872); + setState(1856); kU_MultiplyDivideModuloOperator(); - setState(1874); + setState(1858); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1873); + setState(1857); match(CypherParser::SP); } - setState(1876); + setState(1860); oC_PowerOfExpression(); } - setState(1882); + setState(1866); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 313, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 308, _ctx); } } @@ -11412,7 +11395,7 @@ size_t CypherParser::KU_MultiplyDivideModuloOperatorContext::getRuleIndex() cons CypherParser::KU_MultiplyDivideModuloOperatorContext* CypherParser::kU_MultiplyDivideModuloOperator() { KU_MultiplyDivideModuloOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 212, CypherParser::RuleKU_MultiplyDivideModuloOperator); + enterRule(_localctx, 214, CypherParser::RuleKU_MultiplyDivideModuloOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -11424,7 +11407,7 @@ CypherParser::KU_MultiplyDivideModuloOperatorContext* CypherParser::kU_MultiplyD }); try { enterOuterAlt(_localctx, 1); - setState(1883); + setState(1867); _la = _input->LA(1); if (!(_la == CypherParser::T__20 @@ -11476,7 +11459,7 @@ size_t CypherParser::OC_PowerOfExpressionContext::getRuleIndex() const { CypherParser::OC_PowerOfExpressionContext* CypherParser::oC_PowerOfExpression() { OC_PowerOfExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 214, CypherParser::RuleOC_PowerOfExpression); + enterRule(_localctx, 216, CypherParser::RuleOC_PowerOfExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11489,37 +11472,37 @@ CypherParser::OC_PowerOfExpressionContext* CypherParser::oC_PowerOfExpression() try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1885); + setState(1869); oC_UnaryAddSubtractOrFactorialExpression(); - setState(1896); + setState(1880); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 316, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 311, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1887); + setState(1871); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1886); + setState(1870); match(CypherParser::SP); } - setState(1889); + setState(1873); match(CypherParser::T__22); - setState(1891); + setState(1875); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1890); + setState(1874); match(CypherParser::SP); } - setState(1893); + setState(1877); oC_UnaryAddSubtractOrFactorialExpression(); } - setState(1898); + setState(1882); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 316, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 311, _ctx); } } @@ -11570,7 +11553,7 @@ size_t CypherParser::OC_UnaryAddSubtractOrFactorialExpressionContext::getRuleInd CypherParser::OC_UnaryAddSubtractOrFactorialExpressionContext* CypherParser::oC_UnaryAddSubtractOrFactorialExpression() { OC_UnaryAddSubtractOrFactorialExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 216, CypherParser::RuleOC_UnaryAddSubtractOrFactorialExpression); + enterRule(_localctx, 218, CypherParser::RuleOC_UnaryAddSubtractOrFactorialExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11582,40 +11565,40 @@ CypherParser::OC_UnaryAddSubtractOrFactorialExpressionContext* CypherParser::oC_ }); try { enterOuterAlt(_localctx, 1); - setState(1905); + setState(1889); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::MINUS) { - setState(1899); + setState(1883); match(CypherParser::MINUS); - setState(1901); + setState(1885); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1900); + setState(1884); match(CypherParser::SP); } - setState(1907); + setState(1891); _errHandler->sync(this); _la = _input->LA(1); } - setState(1908); + setState(1892); oC_StringListNullOperatorExpression(); - setState(1913); + setState(1897); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 320, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 315, _ctx)) { case 1: { - setState(1910); + setState(1894); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1909); + setState(1893); match(CypherParser::SP); } - setState(1912); + setState(1896); match(CypherParser::FACTORIAL); break; } @@ -11668,7 +11651,7 @@ size_t CypherParser::OC_StringListNullOperatorExpressionContext::getRuleIndex() CypherParser::OC_StringListNullOperatorExpressionContext* CypherParser::oC_StringListNullOperatorExpression() { OC_StringListNullOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 218, CypherParser::RuleOC_StringListNullOperatorExpression); + enterRule(_localctx, 220, CypherParser::RuleOC_StringListNullOperatorExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11680,26 +11663,26 @@ CypherParser::OC_StringListNullOperatorExpressionContext* CypherParser::oC_Strin try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1915); + setState(1899); oC_PropertyOrLabelsExpression(); - setState(1923); + setState(1907); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 322, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 317, _ctx)) { case 1: { - setState(1916); + setState(1900); oC_StringOperatorExpression(); break; } case 2: { - setState(1918); + setState(1902); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(1917); + setState(1901); oC_ListOperatorExpression(); break; } @@ -11707,15 +11690,15 @@ CypherParser::OC_StringListNullOperatorExpressionContext* CypherParser::oC_Strin default: throw NoViableAltException(this); } - setState(1920); + setState(1904); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 321, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 316, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); break; } case 3: { - setState(1922); + setState(1906); oC_NullOperatorExpression(); break; } @@ -11776,7 +11759,7 @@ size_t CypherParser::OC_ListOperatorExpressionContext::getRuleIndex() const { CypherParser::OC_ListOperatorExpressionContext* CypherParser::oC_ListOperatorExpression() { OC_ListOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 220, CypherParser::RuleOC_ListOperatorExpression); + enterRule(_localctx, 222, CypherParser::RuleOC_ListOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11787,44 +11770,44 @@ CypherParser::OC_ListOperatorExpressionContext* CypherParser::oC_ListOperatorExp exitRule(); }); try { - setState(1944); + setState(1928); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 326, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 321, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1925); + setState(1909); match(CypherParser::SP); - setState(1926); + setState(1910); match(CypherParser::IN); - setState(1928); + setState(1912); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1927); + setState(1911); match(CypherParser::SP); } - setState(1930); + setState(1914); oC_PropertyOrLabelsExpression(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1931); + setState(1915); match(CypherParser::T__5); - setState(1932); + setState(1916); oC_Expression(); - setState(1933); + setState(1917); match(CypherParser::T__6); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1935); + setState(1919); match(CypherParser::T__5); - setState(1937); + setState(1921); _errHandler->sync(this); _la = _input->LA(1); @@ -11832,12 +11815,12 @@ CypherParser::OC_ListOperatorExpressionContext* CypherParser::oC_ListOperatorExp ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1936); + setState(1920); oC_Expression(); } - setState(1939); + setState(1923); match(CypherParser::COLON); - setState(1941); + setState(1925); _errHandler->sync(this); _la = _input->LA(1); @@ -11845,10 +11828,10 @@ CypherParser::OC_ListOperatorExpressionContext* CypherParser::oC_ListOperatorExp ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1940); + setState(1924); oC_Expression(); } - setState(1943); + setState(1927); match(CypherParser::T__6); break; } @@ -11913,7 +11896,7 @@ size_t CypherParser::OC_StringOperatorExpressionContext::getRuleIndex() const { CypherParser::OC_StringOperatorExpressionContext* CypherParser::oC_StringOperatorExpression() { OC_StringOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 222, CypherParser::RuleOC_StringOperatorExpression); + enterRule(_localctx, 224, CypherParser::RuleOC_StringOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11925,43 +11908,43 @@ CypherParser::OC_StringOperatorExpressionContext* CypherParser::oC_StringOperato }); try { enterOuterAlt(_localctx, 1); - setState(1957); + setState(1941); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 327, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 322, _ctx)) { case 1: { - setState(1946); + setState(1930); oC_RegularExpression(); break; } case 2: { - setState(1947); + setState(1931); match(CypherParser::SP); - setState(1948); + setState(1932); match(CypherParser::STARTS); - setState(1949); + setState(1933); match(CypherParser::SP); - setState(1950); + setState(1934); match(CypherParser::WITH); break; } case 3: { - setState(1951); + setState(1935); match(CypherParser::SP); - setState(1952); + setState(1936); match(CypherParser::ENDS); - setState(1953); + setState(1937); match(CypherParser::SP); - setState(1954); + setState(1938); match(CypherParser::WITH); break; } case 4: { - setState(1955); + setState(1939); match(CypherParser::SP); - setState(1956); + setState(1940); match(CypherParser::CONTAINS); break; } @@ -11969,15 +11952,15 @@ CypherParser::OC_StringOperatorExpressionContext* CypherParser::oC_StringOperato default: break; } - setState(1960); + setState(1944); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1959); + setState(1943); match(CypherParser::SP); } - setState(1962); + setState(1946); oC_PropertyOrLabelsExpression(); } @@ -12008,7 +11991,7 @@ size_t CypherParser::OC_RegularExpressionContext::getRuleIndex() const { CypherParser::OC_RegularExpressionContext* CypherParser::oC_RegularExpression() { OC_RegularExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 224, CypherParser::RuleOC_RegularExpression); + enterRule(_localctx, 226, CypherParser::RuleOC_RegularExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -12020,15 +12003,15 @@ CypherParser::OC_RegularExpressionContext* CypherParser::oC_RegularExpression() }); try { enterOuterAlt(_localctx, 1); - setState(1965); + setState(1949); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1964); + setState(1948); match(CypherParser::SP); } - setState(1967); + setState(1951); match(CypherParser::T__23); } @@ -12075,7 +12058,7 @@ size_t CypherParser::OC_NullOperatorExpressionContext::getRuleIndex() const { CypherParser::OC_NullOperatorExpressionContext* CypherParser::oC_NullOperatorExpression() { OC_NullOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 226, CypherParser::RuleOC_NullOperatorExpression); + enterRule(_localctx, 228, CypherParser::RuleOC_NullOperatorExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12085,35 +12068,35 @@ CypherParser::OC_NullOperatorExpressionContext* CypherParser::oC_NullOperatorExp exitRule(); }); try { - setState(1979); + setState(1963); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 330, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 325, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1969); + setState(1953); match(CypherParser::SP); - setState(1970); + setState(1954); match(CypherParser::IS); - setState(1971); + setState(1955); match(CypherParser::SP); - setState(1972); + setState(1956); match(CypherParser::NULL_); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1973); + setState(1957); match(CypherParser::SP); - setState(1974); + setState(1958); match(CypherParser::IS); - setState(1975); + setState(1959); match(CypherParser::SP); - setState(1976); + setState(1960); match(CypherParser::NOT); - setState(1977); + setState(1961); match(CypherParser::SP); - setState(1978); + setState(1962); match(CypherParser::NULL_); break; } @@ -12166,7 +12149,7 @@ size_t CypherParser::OC_PropertyOrLabelsExpressionContext::getRuleIndex() const CypherParser::OC_PropertyOrLabelsExpressionContext* CypherParser::oC_PropertyOrLabelsExpression() { OC_PropertyOrLabelsExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 228, CypherParser::RuleOC_PropertyOrLabelsExpression); + enterRule(_localctx, 230, CypherParser::RuleOC_PropertyOrLabelsExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -12179,27 +12162,27 @@ CypherParser::OC_PropertyOrLabelsExpressionContext* CypherParser::oC_PropertyOrL try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1981); + setState(1965); oC_Atom(); - setState(1988); + setState(1972); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 332, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 327, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1983); + setState(1967); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1982); + setState(1966); match(CypherParser::SP); } - setState(1985); + setState(1969); oC_PropertyLookup(); } - setState(1990); + setState(1974); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 332, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 327, _ctx); } } @@ -12262,7 +12245,7 @@ size_t CypherParser::OC_AtomContext::getRuleIndex() const { CypherParser::OC_AtomContext* CypherParser::oC_Atom() { OC_AtomContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 230, CypherParser::RuleOC_Atom); + enterRule(_localctx, 232, CypherParser::RuleOC_Atom); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12272,68 +12255,68 @@ CypherParser::OC_AtomContext* CypherParser::oC_Atom() { exitRule(); }); try { - setState(2000); + setState(1984); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 333, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 328, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1991); + setState(1975); oC_Literal(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1992); + setState(1976); oC_Parameter(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1993); + setState(1977); oC_CaseExpression(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(1994); + setState(1978); oC_ParenthesizedExpression(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(1995); + setState(1979); oC_FunctionInvocation(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(1996); + setState(1980); oC_PathPatterns(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(1997); + setState(1981); oC_ExistSubquery(); break; } case 8: { enterOuterAlt(_localctx, 8); - setState(1998); + setState(1982); kU_CountSubquery(); break; } case 9: { enterOuterAlt(_localctx, 9); - setState(1999); + setState(1983); oC_Variable(); break; } @@ -12390,7 +12373,7 @@ size_t CypherParser::OC_LiteralContext::getRuleIndex() const { CypherParser::OC_LiteralContext* CypherParser::oC_Literal() { OC_LiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 232, CypherParser::RuleOC_Literal); + enterRule(_localctx, 234, CypherParser::RuleOC_Literal); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12400,20 +12383,20 @@ CypherParser::OC_LiteralContext* CypherParser::oC_Literal() { exitRule(); }); try { - setState(2008); + setState(1992); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::DecimalInteger: case CypherParser::RegularDecimalReal: { enterOuterAlt(_localctx, 1); - setState(2002); + setState(1986); oC_NumberLiteral(); break; } case CypherParser::StringLiteral: { enterOuterAlt(_localctx, 2); - setState(2003); + setState(1987); match(CypherParser::StringLiteral); break; } @@ -12421,28 +12404,28 @@ CypherParser::OC_LiteralContext* CypherParser::oC_Literal() { case CypherParser::TRUE: case CypherParser::FALSE: { enterOuterAlt(_localctx, 3); - setState(2004); + setState(1988); oC_BooleanLiteral(); break; } case CypherParser::NULL_: { enterOuterAlt(_localctx, 4); - setState(2005); + setState(1989); match(CypherParser::NULL_); break; } case CypherParser::T__5: { enterOuterAlt(_localctx, 5); - setState(2006); + setState(1990); oC_ListLiteral(); break; } case CypherParser::T__7: { enterOuterAlt(_localctx, 6); - setState(2007); + setState(1991); kU_StructLiteral(); break; } @@ -12483,7 +12466,7 @@ size_t CypherParser::OC_BooleanLiteralContext::getRuleIndex() const { CypherParser::OC_BooleanLiteralContext* CypherParser::oC_BooleanLiteral() { OC_BooleanLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 234, CypherParser::RuleOC_BooleanLiteral); + enterRule(_localctx, 236, CypherParser::RuleOC_BooleanLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -12495,7 +12478,7 @@ CypherParser::OC_BooleanLiteralContext* CypherParser::oC_BooleanLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2010); + setState(1994); _la = _input->LA(1); if (!(_la == CypherParser::TRUE @@ -12551,7 +12534,7 @@ size_t CypherParser::OC_ListLiteralContext::getRuleIndex() const { CypherParser::OC_ListLiteralContext* CypherParser::oC_ListLiteral() { OC_ListLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 236, CypherParser::RuleOC_ListLiteral); + enterRule(_localctx, 238, CypherParser::RuleOC_ListLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -12563,17 +12546,17 @@ CypherParser::OC_ListLiteralContext* CypherParser::oC_ListLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2012); + setState(1996); match(CypherParser::T__5); - setState(2014); + setState(1998); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2013); + setState(1997); match(CypherParser::SP); } - setState(2029); + setState(2013); _errHandler->sync(this); _la = _input->LA(1); @@ -12581,36 +12564,36 @@ CypherParser::OC_ListLiteralContext* CypherParser::oC_ListLiteral() { ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(2016); + setState(2000); oC_Expression(); - setState(2018); + setState(2002); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2017); + setState(2001); match(CypherParser::SP); } - setState(2026); + setState(2010); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3) { - setState(2020); + while (_la == CypherParser::T__2) { + setState(2004); kU_ListEntry(); - setState(2022); + setState(2006); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2021); + setState(2005); match(CypherParser::SP); } - setState(2028); + setState(2012); _errHandler->sync(this); _la = _input->LA(1); } } - setState(2031); + setState(2015); match(CypherParser::T__6); } @@ -12645,7 +12628,7 @@ size_t CypherParser::KU_ListEntryContext::getRuleIndex() const { CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { KU_ListEntryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 238, CypherParser::RuleKU_ListEntry); + enterRule(_localctx, 240, CypherParser::RuleKU_ListEntry); size_t _la = 0; #if __cplusplus > 201703L @@ -12657,14 +12640,14 @@ CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { }); try { enterOuterAlt(_localctx, 1); - setState(2033); - match(CypherParser::T__3); - setState(2035); + setState(2017); + match(CypherParser::T__2); + setState(2019); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 340, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 335, _ctx)) { case 1: { - setState(2034); + setState(2018); match(CypherParser::SP); break; } @@ -12672,7 +12655,7 @@ CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { default: break; } - setState(2038); + setState(2022); _errHandler->sync(this); _la = _input->LA(1); @@ -12680,7 +12663,7 @@ CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(2037); + setState(2021); oC_Expression(); } @@ -12724,7 +12707,7 @@ size_t CypherParser::KU_StructLiteralContext::getRuleIndex() const { CypherParser::KU_StructLiteralContext* CypherParser::kU_StructLiteral() { KU_StructLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 240, CypherParser::RuleKU_StructLiteral); + enterRule(_localctx, 242, CypherParser::RuleKU_StructLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -12736,55 +12719,55 @@ CypherParser::KU_StructLiteralContext* CypherParser::kU_StructLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2040); + setState(2024); match(CypherParser::T__7); - setState(2042); + setState(2026); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2041); + setState(2025); match(CypherParser::SP); } - setState(2044); + setState(2028); kU_StructField(); - setState(2046); + setState(2030); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2045); + setState(2029); match(CypherParser::SP); } - setState(2058); + setState(2042); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3) { - setState(2048); - match(CypherParser::T__3); - setState(2050); + while (_la == CypherParser::T__2) { + setState(2032); + match(CypherParser::T__2); + setState(2034); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2049); + setState(2033); match(CypherParser::SP); } - setState(2052); + setState(2036); kU_StructField(); - setState(2054); + setState(2038); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2053); + setState(2037); match(CypherParser::SP); } - setState(2060); + setState(2044); _errHandler->sync(this); _la = _input->LA(1); } - setState(2061); + setState(2045); match(CypherParser::T__8); } @@ -12835,7 +12818,7 @@ size_t CypherParser::KU_StructFieldContext::getRuleIndex() const { CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { KU_StructFieldContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 242, CypherParser::RuleKU_StructField); + enterRule(_localctx, 244, CypherParser::RuleKU_StructField); size_t _la = 0; #if __cplusplus > 201703L @@ -12847,7 +12830,7 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { }); try { enterOuterAlt(_localctx, 1); - setState(2065); + setState(2049); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -12863,13 +12846,13 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(2063); + setState(2047); oC_SymbolicName(); break; } case CypherParser::StringLiteral: { - setState(2064); + setState(2048); match(CypherParser::StringLiteral); break; } @@ -12877,25 +12860,25 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { default: throw NoViableAltException(this); } - setState(2068); + setState(2052); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2067); + setState(2051); match(CypherParser::SP); } - setState(2070); + setState(2054); match(CypherParser::COLON); - setState(2072); + setState(2056); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2071); + setState(2055); match(CypherParser::SP); } - setState(2074); + setState(2058); oC_Expression(); } @@ -12934,7 +12917,7 @@ size_t CypherParser::OC_ParenthesizedExpressionContext::getRuleIndex() const { CypherParser::OC_ParenthesizedExpressionContext* CypherParser::oC_ParenthesizedExpression() { OC_ParenthesizedExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 244, CypherParser::RuleOC_ParenthesizedExpression); + enterRule(_localctx, 246, CypherParser::RuleOC_ParenthesizedExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -12946,28 +12929,28 @@ CypherParser::OC_ParenthesizedExpressionContext* CypherParser::oC_ParenthesizedE }); try { enterOuterAlt(_localctx, 1); - setState(2076); + setState(2060); match(CypherParser::T__1); - setState(2078); + setState(2062); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2077); + setState(2061); match(CypherParser::SP); } - setState(2080); + setState(2064); oC_Expression(); - setState(2082); + setState(2066); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2081); + setState(2065); match(CypherParser::SP); } - setState(2084); - match(CypherParser::T__2); + setState(2068); + match(CypherParser::T__3); } catch (RecognitionException &e) { @@ -13025,7 +13008,7 @@ size_t CypherParser::OC_FunctionInvocationContext::getRuleIndex() const { CypherParser::OC_FunctionInvocationContext* CypherParser::oC_FunctionInvocation() { OC_FunctionInvocationContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 246, CypherParser::RuleOC_FunctionInvocation); + enterRule(_localctx, 248, CypherParser::RuleOC_FunctionInvocation); size_t _la = 0; #if __cplusplus > 201703L @@ -13036,85 +13019,85 @@ CypherParser::OC_FunctionInvocationContext* CypherParser::oC_FunctionInvocation( exitRule(); }); try { - setState(2134); + setState(2118); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 364, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 359, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(2086); + setState(2070); match(CypherParser::COUNT); - setState(2088); + setState(2072); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2087); + setState(2071); match(CypherParser::SP); } - setState(2090); + setState(2074); match(CypherParser::T__1); - setState(2092); + setState(2076); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2091); + setState(2075); match(CypherParser::SP); } - setState(2094); + setState(2078); match(CypherParser::STAR); - setState(2096); + setState(2080); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2095); + setState(2079); match(CypherParser::SP); } - setState(2098); - match(CypherParser::T__2); + setState(2082); + match(CypherParser::T__3); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(2099); + setState(2083); oC_FunctionName(); - setState(2101); + setState(2085); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2100); + setState(2084); match(CypherParser::SP); } - setState(2103); + setState(2087); match(CypherParser::T__1); - setState(2105); + setState(2089); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2104); + setState(2088); match(CypherParser::SP); } - setState(2111); + setState(2095); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DISTINCT) { - setState(2107); + setState(2091); match(CypherParser::DISTINCT); - setState(2109); + setState(2093); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2108); + setState(2092); match(CypherParser::SP); } } - setState(2130); + setState(2114); _errHandler->sync(this); _la = _input->LA(1); @@ -13122,47 +13105,47 @@ CypherParser::OC_FunctionInvocationContext* CypherParser::oC_FunctionInvocation( ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(2113); + setState(2097); kU_FunctionParameter(); - setState(2115); + setState(2099); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2114); + setState(2098); match(CypherParser::SP); } - setState(2127); + setState(2111); _errHandler->sync(this); _la = _input->LA(1); - while (_la == CypherParser::T__3) { - setState(2117); - match(CypherParser::T__3); - setState(2119); + while (_la == CypherParser::T__2) { + setState(2101); + match(CypherParser::T__2); + setState(2103); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2118); + setState(2102); match(CypherParser::SP); } - setState(2121); + setState(2105); kU_FunctionParameter(); - setState(2123); + setState(2107); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2122); + setState(2106); match(CypherParser::SP); } - setState(2129); + setState(2113); _errHandler->sync(this); _la = _input->LA(1); } } - setState(2132); - match(CypherParser::T__2); + setState(2116); + match(CypherParser::T__3); break; } @@ -13198,7 +13181,7 @@ size_t CypherParser::OC_FunctionNameContext::getRuleIndex() const { CypherParser::OC_FunctionNameContext* CypherParser::oC_FunctionName() { OC_FunctionNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 248, CypherParser::RuleOC_FunctionName); + enterRule(_localctx, 250, CypherParser::RuleOC_FunctionName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -13209,7 +13192,7 @@ CypherParser::OC_FunctionNameContext* CypherParser::oC_FunctionName() { }); try { enterOuterAlt(_localctx, 1); - setState(2136); + setState(2120); oC_SymbolicName(); } @@ -13256,7 +13239,7 @@ size_t CypherParser::KU_FunctionParameterContext::getRuleIndex() const { CypherParser::KU_FunctionParameterContext* CypherParser::kU_FunctionParameter() { KU_FunctionParameterContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 250, CypherParser::RuleKU_FunctionParameter); + enterRule(_localctx, 252, CypherParser::RuleKU_FunctionParameter); size_t _la = 0; #if __cplusplus > 201703L @@ -13268,31 +13251,31 @@ CypherParser::KU_FunctionParameterContext* CypherParser::kU_FunctionParameter() }); try { enterOuterAlt(_localctx, 1); - setState(2147); + setState(2131); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 367, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 362, _ctx)) { case 1: { - setState(2138); + setState(2122); oC_SymbolicName(); - setState(2140); + setState(2124); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2139); + setState(2123); match(CypherParser::SP); } - setState(2142); + setState(2126); match(CypherParser::COLON); - setState(2143); + setState(2127); match(CypherParser::T__4); - setState(2145); + setState(2129); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2144); + setState(2128); match(CypherParser::SP); } break; @@ -13301,7 +13284,7 @@ CypherParser::KU_FunctionParameterContext* CypherParser::kU_FunctionParameter() default: break; } - setState(2149); + setState(2133); oC_Expression(); } @@ -13348,7 +13331,7 @@ size_t CypherParser::OC_PathPatternsContext::getRuleIndex() const { CypherParser::OC_PathPatternsContext* CypherParser::oC_PathPatterns() { OC_PathPatternsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 252, CypherParser::RuleOC_PathPatterns); + enterRule(_localctx, 254, CypherParser::RuleOC_PathPatterns); size_t _la = 0; #if __cplusplus > 201703L @@ -13361,23 +13344,23 @@ CypherParser::OC_PathPatternsContext* CypherParser::oC_PathPatterns() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(2151); + setState(2135); oC_NodePattern(); - setState(2156); + setState(2140); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(2153); + setState(2137); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2152); + setState(2136); match(CypherParser::SP); } - setState(2155); + setState(2139); oC_PatternElementChain(); break; } @@ -13385,9 +13368,9 @@ CypherParser::OC_PathPatternsContext* CypherParser::oC_PathPatterns() { default: throw NoViableAltException(this); } - setState(2158); + setState(2142); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 369, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 364, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); } @@ -13438,7 +13421,7 @@ size_t CypherParser::OC_ExistSubqueryContext::getRuleIndex() const { CypherParser::OC_ExistSubqueryContext* CypherParser::oC_ExistSubquery() { OC_ExistSubqueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 254, CypherParser::RuleOC_ExistSubquery); + enterRule(_localctx, 256, CypherParser::RuleOC_ExistSubquery); size_t _la = 0; #if __cplusplus > 201703L @@ -13450,52 +13433,52 @@ CypherParser::OC_ExistSubqueryContext* CypherParser::oC_ExistSubquery() { }); try { enterOuterAlt(_localctx, 1); - setState(2160); + setState(2144); match(CypherParser::EXISTS); - setState(2162); + setState(2146); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2161); + setState(2145); match(CypherParser::SP); } - setState(2164); + setState(2148); match(CypherParser::T__7); - setState(2166); + setState(2150); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2165); + setState(2149); match(CypherParser::SP); } - setState(2168); + setState(2152); match(CypherParser::MATCH); - setState(2170); + setState(2154); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2169); + setState(2153); match(CypherParser::SP); } - setState(2172); + setState(2156); oC_Pattern(); - setState(2177); + setState(2161); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 374, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 369, _ctx)) { case 1: { - setState(2174); + setState(2158); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2173); + setState(2157); match(CypherParser::SP); } - setState(2176); + setState(2160); oC_Where(); break; } @@ -13503,15 +13486,15 @@ CypherParser::OC_ExistSubqueryContext* CypherParser::oC_ExistSubquery() { default: break; } - setState(2180); + setState(2164); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2179); + setState(2163); match(CypherParser::SP); } - setState(2182); + setState(2166); match(CypherParser::T__8); } @@ -13562,7 +13545,7 @@ size_t CypherParser::KU_CountSubqueryContext::getRuleIndex() const { CypherParser::KU_CountSubqueryContext* CypherParser::kU_CountSubquery() { KU_CountSubqueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 256, CypherParser::RuleKU_CountSubquery); + enterRule(_localctx, 258, CypherParser::RuleKU_CountSubquery); size_t _la = 0; #if __cplusplus > 201703L @@ -13574,52 +13557,52 @@ CypherParser::KU_CountSubqueryContext* CypherParser::kU_CountSubquery() { }); try { enterOuterAlt(_localctx, 1); - setState(2184); + setState(2168); match(CypherParser::COUNT); - setState(2186); + setState(2170); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2185); + setState(2169); match(CypherParser::SP); } - setState(2188); + setState(2172); match(CypherParser::T__7); - setState(2190); + setState(2174); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2189); + setState(2173); match(CypherParser::SP); } - setState(2192); + setState(2176); match(CypherParser::MATCH); - setState(2194); + setState(2178); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2193); + setState(2177); match(CypherParser::SP); } - setState(2196); + setState(2180); oC_Pattern(); - setState(2201); + setState(2185); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 380, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 375, _ctx)) { case 1: { - setState(2198); + setState(2182); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2197); + setState(2181); match(CypherParser::SP); } - setState(2200); + setState(2184); oC_Where(); break; } @@ -13627,15 +13610,15 @@ CypherParser::KU_CountSubqueryContext* CypherParser::kU_CountSubquery() { default: break; } - setState(2204); + setState(2188); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2203); + setState(2187); match(CypherParser::SP); } - setState(2206); + setState(2190); match(CypherParser::T__8); } @@ -13674,7 +13657,7 @@ size_t CypherParser::OC_PropertyLookupContext::getRuleIndex() const { CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { OC_PropertyLookupContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 258, CypherParser::RuleOC_PropertyLookup); + enterRule(_localctx, 260, CypherParser::RuleOC_PropertyLookup); size_t _la = 0; #if __cplusplus > 201703L @@ -13686,17 +13669,17 @@ CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { }); try { enterOuterAlt(_localctx, 1); - setState(2208); + setState(2192); match(CypherParser::T__24); - setState(2210); + setState(2194); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2209); + setState(2193); match(CypherParser::SP); } - setState(2214); + setState(2198); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -13712,13 +13695,13 @@ CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(2212); + setState(2196); oC_PropertyKeyName(); break; } case CypherParser::STAR: { - setState(2213); + setState(2197); match(CypherParser::STAR); break; } @@ -13787,7 +13770,7 @@ size_t CypherParser::OC_CaseExpressionContext::getRuleIndex() const { CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { OC_CaseExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 260, CypherParser::RuleOC_CaseExpression); + enterRule(_localctx, 262, CypherParser::RuleOC_CaseExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -13800,27 +13783,27 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(2238); + setState(2222); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 389, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 384, _ctx)) { case 1: { - setState(2216); + setState(2200); match(CypherParser::CASE); - setState(2221); + setState(2205); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(2218); + setState(2202); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2217); + setState(2201); match(CypherParser::SP); } - setState(2220); + setState(2204); oC_CaseAlternative(); break; } @@ -13828,41 +13811,41 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: throw NoViableAltException(this); } - setState(2223); + setState(2207); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 385, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 380, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); break; } case 2: { - setState(2225); + setState(2209); match(CypherParser::CASE); - setState(2227); + setState(2211); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2226); + setState(2210); match(CypherParser::SP); } - setState(2229); + setState(2213); oC_Expression(); - setState(2234); + setState(2218); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(2231); + setState(2215); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2230); + setState(2214); match(CypherParser::SP); } - setState(2233); + setState(2217); oC_CaseAlternative(); break; } @@ -13870,9 +13853,9 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: throw NoViableAltException(this); } - setState(2236); + setState(2220); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 388, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 383, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); break; } @@ -13880,30 +13863,30 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: break; } - setState(2248); + setState(2232); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 392, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 387, _ctx)) { case 1: { - setState(2241); + setState(2225); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2240); + setState(2224); match(CypherParser::SP); } - setState(2243); + setState(2227); match(CypherParser::ELSE); - setState(2245); + setState(2229); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2244); + setState(2228); match(CypherParser::SP); } - setState(2247); + setState(2231); oC_Expression(); break; } @@ -13911,15 +13894,15 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: break; } - setState(2251); + setState(2235); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2250); + setState(2234); match(CypherParser::SP); } - setState(2253); + setState(2237); match(CypherParser::END); } @@ -13970,7 +13953,7 @@ size_t CypherParser::OC_CaseAlternativeContext::getRuleIndex() const { CypherParser::OC_CaseAlternativeContext* CypherParser::oC_CaseAlternative() { OC_CaseAlternativeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 262, CypherParser::RuleOC_CaseAlternative); + enterRule(_localctx, 264, CypherParser::RuleOC_CaseAlternative); size_t _la = 0; #if __cplusplus > 201703L @@ -13982,37 +13965,37 @@ CypherParser::OC_CaseAlternativeContext* CypherParser::oC_CaseAlternative() { }); try { enterOuterAlt(_localctx, 1); - setState(2255); + setState(2239); match(CypherParser::WHEN); - setState(2257); + setState(2241); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2256); + setState(2240); match(CypherParser::SP); } - setState(2259); + setState(2243); oC_Expression(); - setState(2261); + setState(2245); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2260); + setState(2244); match(CypherParser::SP); } - setState(2263); + setState(2247); match(CypherParser::THEN); - setState(2265); + setState(2249); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2264); + setState(2248); match(CypherParser::SP); } - setState(2267); + setState(2251); oC_Expression(); } @@ -14043,7 +14026,7 @@ size_t CypherParser::OC_VariableContext::getRuleIndex() const { CypherParser::OC_VariableContext* CypherParser::oC_Variable() { OC_VariableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 264, CypherParser::RuleOC_Variable); + enterRule(_localctx, 266, CypherParser::RuleOC_Variable); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14054,7 +14037,7 @@ CypherParser::OC_VariableContext* CypherParser::oC_Variable() { }); try { enterOuterAlt(_localctx, 1); - setState(2269); + setState(2253); oC_SymbolicName(); } @@ -14089,7 +14072,7 @@ size_t CypherParser::OC_NumberLiteralContext::getRuleIndex() const { CypherParser::OC_NumberLiteralContext* CypherParser::oC_NumberLiteral() { OC_NumberLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 266, CypherParser::RuleOC_NumberLiteral); + enterRule(_localctx, 268, CypherParser::RuleOC_NumberLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14099,19 +14082,19 @@ CypherParser::OC_NumberLiteralContext* CypherParser::oC_NumberLiteral() { exitRule(); }); try { - setState(2273); + setState(2257); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::RegularDecimalReal: { enterOuterAlt(_localctx, 1); - setState(2271); + setState(2255); oC_DoubleLiteral(); break; } case CypherParser::DecimalInteger: { enterOuterAlt(_localctx, 2); - setState(2272); + setState(2256); oC_IntegerLiteral(); break; } @@ -14152,7 +14135,7 @@ size_t CypherParser::OC_ParameterContext::getRuleIndex() const { CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { OC_ParameterContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 268, CypherParser::RuleOC_Parameter); + enterRule(_localctx, 270, CypherParser::RuleOC_Parameter); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14163,9 +14146,9 @@ CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { }); try { enterOuterAlt(_localctx, 1); - setState(2275); + setState(2259); match(CypherParser::T__25); - setState(2278); + setState(2262); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -14181,13 +14164,13 @@ CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(2276); + setState(2260); oC_SymbolicName(); break; } case CypherParser::DecimalInteger: { - setState(2277); + setState(2261); match(CypherParser::DecimalInteger); break; } @@ -14232,7 +14215,7 @@ size_t CypherParser::OC_PropertyExpressionContext::getRuleIndex() const { CypherParser::OC_PropertyExpressionContext* CypherParser::oC_PropertyExpression() { OC_PropertyExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 270, CypherParser::RuleOC_PropertyExpression); + enterRule(_localctx, 272, CypherParser::RuleOC_PropertyExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -14244,17 +14227,17 @@ CypherParser::OC_PropertyExpressionContext* CypherParser::oC_PropertyExpression( }); try { enterOuterAlt(_localctx, 1); - setState(2280); + setState(2264); oC_Atom(); - setState(2282); + setState(2266); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2281); + setState(2265); match(CypherParser::SP); } - setState(2284); + setState(2268); oC_PropertyLookup(); } @@ -14285,7 +14268,7 @@ size_t CypherParser::OC_PropertyKeyNameContext::getRuleIndex() const { CypherParser::OC_PropertyKeyNameContext* CypherParser::oC_PropertyKeyName() { OC_PropertyKeyNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 272, CypherParser::RuleOC_PropertyKeyName); + enterRule(_localctx, 274, CypherParser::RuleOC_PropertyKeyName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14296,7 +14279,7 @@ CypherParser::OC_PropertyKeyNameContext* CypherParser::oC_PropertyKeyName() { }); try { enterOuterAlt(_localctx, 1); - setState(2286); + setState(2270); oC_SchemaName(); } @@ -14327,7 +14310,7 @@ size_t CypherParser::OC_IntegerLiteralContext::getRuleIndex() const { CypherParser::OC_IntegerLiteralContext* CypherParser::oC_IntegerLiteral() { OC_IntegerLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 274, CypherParser::RuleOC_IntegerLiteral); + enterRule(_localctx, 276, CypherParser::RuleOC_IntegerLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14338,7 +14321,7 @@ CypherParser::OC_IntegerLiteralContext* CypherParser::oC_IntegerLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2288); + setState(2272); match(CypherParser::DecimalInteger); } @@ -14369,7 +14352,7 @@ size_t CypherParser::OC_DoubleLiteralContext::getRuleIndex() const { CypherParser::OC_DoubleLiteralContext* CypherParser::oC_DoubleLiteral() { OC_DoubleLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 276, CypherParser::RuleOC_DoubleLiteral); + enterRule(_localctx, 278, CypherParser::RuleOC_DoubleLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14380,7 +14363,7 @@ CypherParser::OC_DoubleLiteralContext* CypherParser::oC_DoubleLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2290); + setState(2274); match(CypherParser::RegularDecimalReal); } @@ -14411,7 +14394,7 @@ size_t CypherParser::OC_SchemaNameContext::getRuleIndex() const { CypherParser::OC_SchemaNameContext* CypherParser::oC_SchemaName() { OC_SchemaNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 278, CypherParser::RuleOC_SchemaName); + enterRule(_localctx, 280, CypherParser::RuleOC_SchemaName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14422,7 +14405,7 @@ CypherParser::OC_SchemaNameContext* CypherParser::oC_SchemaName() { }); try { enterOuterAlt(_localctx, 1); - setState(2292); + setState(2276); oC_SymbolicName(); } @@ -14465,7 +14448,7 @@ size_t CypherParser::OC_SymbolicNameContext::getRuleIndex() const { CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { OC_SymbolicNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 280, CypherParser::RuleOC_SymbolicName); + enterRule(_localctx, 282, CypherParser::RuleOC_SymbolicName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14475,19 +14458,19 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { exitRule(); }); try { - setState(2299); + setState(2283); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::UnescapedSymbolicName: { enterOuterAlt(_localctx, 1); - setState(2294); + setState(2278); match(CypherParser::UnescapedSymbolicName); break; } case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 2); - setState(2295); + setState(2279); antlrcpp::downCast(_localctx)->escapedsymbolicnameToken = match(CypherParser::EscapedSymbolicName); if ((antlrcpp::downCast(_localctx)->escapedsymbolicnameToken != nullptr ? antlrcpp::downCast(_localctx)->escapedsymbolicnameToken->getText() : "") == "``") { notifyEmptyToken(antlrcpp::downCast(_localctx)->escapedsymbolicnameToken); } break; @@ -14495,7 +14478,7 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { case CypherParser::HexLetter: { enterOuterAlt(_localctx, 3); - setState(2297); + setState(2281); match(CypherParser::HexLetter); break; } @@ -14511,7 +14494,7 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { case CypherParser::COUNT: case CypherParser::END: { enterOuterAlt(_localctx, 4); - setState(2298); + setState(2282); kU_NonReservedKeywords(); break; } @@ -14584,7 +14567,7 @@ size_t CypherParser::KU_NonReservedKeywordsContext::getRuleIndex() const { CypherParser::KU_NonReservedKeywordsContext* CypherParser::kU_NonReservedKeywords() { KU_NonReservedKeywordsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 282, CypherParser::RuleKU_NonReservedKeywords); + enterRule(_localctx, 284, CypherParser::RuleKU_NonReservedKeywords); size_t _la = 0; #if __cplusplus > 201703L @@ -14596,7 +14579,7 @@ CypherParser::KU_NonReservedKeywordsContext* CypherParser::kU_NonReservedKeyword }); try { enterOuterAlt(_localctx, 1); - setState(2301); + setState(2285); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 135248726309470208) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && @@ -14632,7 +14615,7 @@ size_t CypherParser::OC_LeftArrowHeadContext::getRuleIndex() const { CypherParser::OC_LeftArrowHeadContext* CypherParser::oC_LeftArrowHead() { OC_LeftArrowHeadContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 284, CypherParser::RuleOC_LeftArrowHead); + enterRule(_localctx, 286, CypherParser::RuleOC_LeftArrowHead); size_t _la = 0; #if __cplusplus > 201703L @@ -14644,7 +14627,7 @@ CypherParser::OC_LeftArrowHeadContext* CypherParser::oC_LeftArrowHead() { }); try { enterOuterAlt(_localctx, 1); - setState(2303); + setState(2287); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 2013274112) != 0))) { @@ -14679,7 +14662,7 @@ size_t CypherParser::OC_RightArrowHeadContext::getRuleIndex() const { CypherParser::OC_RightArrowHeadContext* CypherParser::oC_RightArrowHead() { OC_RightArrowHeadContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 286, CypherParser::RuleOC_RightArrowHead); + enterRule(_localctx, 288, CypherParser::RuleOC_RightArrowHead); size_t _la = 0; #if __cplusplus > 201703L @@ -14691,7 +14674,7 @@ CypherParser::OC_RightArrowHeadContext* CypherParser::oC_RightArrowHead() { }); try { enterOuterAlt(_localctx, 1); - setState(2305); + setState(2289); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 32212287488) != 0))) { @@ -14730,7 +14713,7 @@ size_t CypherParser::OC_DashContext::getRuleIndex() const { CypherParser::OC_DashContext* CypherParser::oC_Dash() { OC_DashContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 288, CypherParser::RuleOC_Dash); + enterRule(_localctx, 290, CypherParser::RuleOC_Dash); size_t _la = 0; #if __cplusplus > 201703L @@ -14742,7 +14725,7 @@ CypherParser::OC_DashContext* CypherParser::oC_Dash() { }); try { enterOuterAlt(_localctx, 1); - setState(2307); + setState(2291); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 70334384439296) != 0) || _la == CypherParser::MINUS)) { @@ -14765,7 +14748,7 @@ CypherParser::OC_DashContext* CypherParser::oC_Dash() { bool CypherParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) { switch (ruleIndex) { - case 33: return kU_DataTypeSempred(antlrcpp::downCast(context), predicateIndex); + case 34: return kU_DataTypeSempred(antlrcpp::downCast(context), predicateIndex); default: break; diff --git a/third_party/antlr4_cypher/include/cypher_parser.h b/third_party/antlr4_cypher/include/cypher_parser.h index e38c621b026..a92c4ae3bb9 100644 --- a/third_party/antlr4_cypher/include/cypher_parser.h +++ b/third_party/antlr4_cypher/include/cypher_parser.h @@ -43,55 +43,55 @@ class CypherParser : public antlr4::Parser { enum { RuleKu_Statements = 0, RuleOC_Cypher = 1, RuleOC_Statement = 2, RuleKU_CopyFrom = 3, - RuleKU_ColumnNames = 4, RuleKU_CopyFromByColumn = 5, RuleKU_CopyTO = 6, - RuleKU_ExportDatabase = 7, RuleKU_ImportDatabase = 8, RuleKU_StandaloneCall = 9, - RuleKU_CommentOn = 10, RuleKU_CreateMacro = 11, RuleKU_PositionalArgs = 12, - RuleKU_DefaultArg = 13, RuleKU_FilePaths = 14, RuleKU_ParsingOptions = 15, - RuleKU_ParsingOption = 16, RuleKU_DDL = 17, RuleKU_CreateNodeTable = 18, - RuleKU_CreateRelTable = 19, RuleKU_CreateRelTableGroup = 20, RuleKU_RelTableConnection = 21, - RuleKU_CreateRdfGraph = 22, RuleKU_DropTable = 23, RuleKU_AlterTable = 24, - RuleKU_AlterOptions = 25, RuleKU_AddProperty = 26, RuleKU_DropProperty = 27, - RuleKU_RenameTable = 28, RuleKU_RenameProperty = 29, RuleKU_PropertyDefinitions = 30, - RuleKU_PropertyDefinition = 31, RuleKU_CreateNodeConstraint = 32, RuleKU_DataType = 33, - RuleKU_ListIdentifiers = 34, RuleKU_ListIdentifier = 35, RuleOC_AnyCypherOption = 36, - RuleOC_Explain = 37, RuleOC_Profile = 38, RuleKU_Transaction = 39, RuleKU_Extension = 40, - RuleKU_LoadExtension = 41, RuleKU_InstallExtension = 42, RuleOC_Query = 43, - RuleOC_RegularQuery = 44, RuleOC_Union = 45, RuleOC_SingleQuery = 46, - RuleOC_SinglePartQuery = 47, RuleOC_MultiPartQuery = 48, RuleKU_QueryPart = 49, - RuleOC_UpdatingClause = 50, RuleOC_ReadingClause = 51, RuleKU_LoadFrom = 52, - RuleKU_InQueryCall = 53, RuleOC_Match = 54, RuleOC_Unwind = 55, RuleOC_Create = 56, - RuleOC_Merge = 57, RuleOC_MergeAction = 58, RuleOC_Set = 59, RuleOC_SetItem = 60, - RuleOC_Delete = 61, RuleOC_With = 62, RuleOC_Return = 63, RuleOC_ProjectionBody = 64, - RuleOC_ProjectionItems = 65, RuleOC_ProjectionItem = 66, RuleOC_Order = 67, - RuleOC_Skip = 68, RuleOC_Limit = 69, RuleOC_SortItem = 70, RuleOC_Where = 71, - RuleOC_Pattern = 72, RuleOC_PatternPart = 73, RuleOC_AnonymousPatternPart = 74, - RuleOC_PatternElement = 75, RuleOC_NodePattern = 76, RuleOC_PatternElementChain = 77, - RuleOC_RelationshipPattern = 78, RuleOC_RelationshipDetail = 79, RuleKU_Properties = 80, - RuleOC_RelationshipTypes = 81, RuleOC_NodeLabels = 82, RuleOC_NodeLabel = 83, - RuleOC_RangeLiteral = 84, RuleKU_RecursiveRelationshipComprehension = 85, - RuleKU_IntermediateNodeProjectionItems = 86, RuleKU_IntermediateRelProjectionItems = 87, - RuleOC_LowerBound = 88, RuleOC_UpperBound = 89, RuleOC_LabelName = 90, - RuleOC_RelTypeName = 91, RuleOC_Expression = 92, RuleOC_OrExpression = 93, - RuleOC_XorExpression = 94, RuleOC_AndExpression = 95, RuleOC_NotExpression = 96, - RuleOC_ComparisonExpression = 97, RuleKU_ComparisonOperator = 98, RuleKU_BitwiseOrOperatorExpression = 99, - RuleKU_BitwiseAndOperatorExpression = 100, RuleKU_BitShiftOperatorExpression = 101, - RuleKU_BitShiftOperator = 102, RuleOC_AddOrSubtractExpression = 103, - RuleKU_AddOrSubtractOperator = 104, RuleOC_MultiplyDivideModuloExpression = 105, - RuleKU_MultiplyDivideModuloOperator = 106, RuleOC_PowerOfExpression = 107, - RuleOC_UnaryAddSubtractOrFactorialExpression = 108, RuleOC_StringListNullOperatorExpression = 109, - RuleOC_ListOperatorExpression = 110, RuleOC_StringOperatorExpression = 111, - RuleOC_RegularExpression = 112, RuleOC_NullOperatorExpression = 113, - RuleOC_PropertyOrLabelsExpression = 114, RuleOC_Atom = 115, RuleOC_Literal = 116, - RuleOC_BooleanLiteral = 117, RuleOC_ListLiteral = 118, RuleKU_ListEntry = 119, - RuleKU_StructLiteral = 120, RuleKU_StructField = 121, RuleOC_ParenthesizedExpression = 122, - RuleOC_FunctionInvocation = 123, RuleOC_FunctionName = 124, RuleKU_FunctionParameter = 125, - RuleOC_PathPatterns = 126, RuleOC_ExistSubquery = 127, RuleKU_CountSubquery = 128, - RuleOC_PropertyLookup = 129, RuleOC_CaseExpression = 130, RuleOC_CaseAlternative = 131, - RuleOC_Variable = 132, RuleOC_NumberLiteral = 133, RuleOC_Parameter = 134, - RuleOC_PropertyExpression = 135, RuleOC_PropertyKeyName = 136, RuleOC_IntegerLiteral = 137, - RuleOC_DoubleLiteral = 138, RuleOC_SchemaName = 139, RuleOC_SymbolicName = 140, - RuleKU_NonReservedKeywords = 141, RuleOC_LeftArrowHead = 142, RuleOC_RightArrowHead = 143, - RuleOC_Dash = 144 + RuleKU_ColumnNames = 4, RuleKU_ScanSource = 5, RuleKU_CopyFromByColumn = 6, + RuleKU_CopyTO = 7, RuleKU_ExportDatabase = 8, RuleKU_ImportDatabase = 9, + RuleKU_StandaloneCall = 10, RuleKU_CommentOn = 11, RuleKU_CreateMacro = 12, + RuleKU_PositionalArgs = 13, RuleKU_DefaultArg = 14, RuleKU_FilePaths = 15, + RuleKU_ParsingOptions = 16, RuleKU_ParsingOption = 17, RuleKU_DDL = 18, + RuleKU_CreateNodeTable = 19, RuleKU_CreateRelTable = 20, RuleKU_CreateRelTableGroup = 21, + RuleKU_RelTableConnection = 22, RuleKU_CreateRdfGraph = 23, RuleKU_DropTable = 24, + RuleKU_AlterTable = 25, RuleKU_AlterOptions = 26, RuleKU_AddProperty = 27, + RuleKU_DropProperty = 28, RuleKU_RenameTable = 29, RuleKU_RenameProperty = 30, + RuleKU_PropertyDefinitions = 31, RuleKU_PropertyDefinition = 32, RuleKU_CreateNodeConstraint = 33, + RuleKU_DataType = 34, RuleKU_ListIdentifiers = 35, RuleKU_ListIdentifier = 36, + RuleOC_AnyCypherOption = 37, RuleOC_Explain = 38, RuleOC_Profile = 39, + RuleKU_Transaction = 40, RuleKU_Extension = 41, RuleKU_LoadExtension = 42, + RuleKU_InstallExtension = 43, RuleOC_Query = 44, RuleOC_RegularQuery = 45, + RuleOC_Union = 46, RuleOC_SingleQuery = 47, RuleOC_SinglePartQuery = 48, + RuleOC_MultiPartQuery = 49, RuleKU_QueryPart = 50, RuleOC_UpdatingClause = 51, + RuleOC_ReadingClause = 52, RuleKU_LoadFrom = 53, RuleKU_InQueryCall = 54, + RuleOC_Match = 55, RuleOC_Unwind = 56, RuleOC_Create = 57, RuleOC_Merge = 58, + RuleOC_MergeAction = 59, RuleOC_Set = 60, RuleOC_SetItem = 61, RuleOC_Delete = 62, + RuleOC_With = 63, RuleOC_Return = 64, RuleOC_ProjectionBody = 65, RuleOC_ProjectionItems = 66, + RuleOC_ProjectionItem = 67, RuleOC_Order = 68, RuleOC_Skip = 69, RuleOC_Limit = 70, + RuleOC_SortItem = 71, RuleOC_Where = 72, RuleOC_Pattern = 73, RuleOC_PatternPart = 74, + RuleOC_AnonymousPatternPart = 75, RuleOC_PatternElement = 76, RuleOC_NodePattern = 77, + RuleOC_PatternElementChain = 78, RuleOC_RelationshipPattern = 79, RuleOC_RelationshipDetail = 80, + RuleKU_Properties = 81, RuleOC_RelationshipTypes = 82, RuleOC_NodeLabels = 83, + RuleOC_NodeLabel = 84, RuleOC_RangeLiteral = 85, RuleKU_RecursiveRelationshipComprehension = 86, + RuleKU_IntermediateNodeProjectionItems = 87, RuleKU_IntermediateRelProjectionItems = 88, + RuleOC_LowerBound = 89, RuleOC_UpperBound = 90, RuleOC_LabelName = 91, + RuleOC_RelTypeName = 92, RuleOC_Expression = 93, RuleOC_OrExpression = 94, + RuleOC_XorExpression = 95, RuleOC_AndExpression = 96, RuleOC_NotExpression = 97, + RuleOC_ComparisonExpression = 98, RuleKU_ComparisonOperator = 99, RuleKU_BitwiseOrOperatorExpression = 100, + RuleKU_BitwiseAndOperatorExpression = 101, RuleKU_BitShiftOperatorExpression = 102, + RuleKU_BitShiftOperator = 103, RuleOC_AddOrSubtractExpression = 104, + RuleKU_AddOrSubtractOperator = 105, RuleOC_MultiplyDivideModuloExpression = 106, + RuleKU_MultiplyDivideModuloOperator = 107, RuleOC_PowerOfExpression = 108, + RuleOC_UnaryAddSubtractOrFactorialExpression = 109, RuleOC_StringListNullOperatorExpression = 110, + RuleOC_ListOperatorExpression = 111, RuleOC_StringOperatorExpression = 112, + RuleOC_RegularExpression = 113, RuleOC_NullOperatorExpression = 114, + RuleOC_PropertyOrLabelsExpression = 115, RuleOC_Atom = 116, RuleOC_Literal = 117, + RuleOC_BooleanLiteral = 118, RuleOC_ListLiteral = 119, RuleKU_ListEntry = 120, + RuleKU_StructLiteral = 121, RuleKU_StructField = 122, RuleOC_ParenthesizedExpression = 123, + RuleOC_FunctionInvocation = 124, RuleOC_FunctionName = 125, RuleKU_FunctionParameter = 126, + RuleOC_PathPatterns = 127, RuleOC_ExistSubquery = 128, RuleKU_CountSubquery = 129, + RuleOC_PropertyLookup = 130, RuleOC_CaseExpression = 131, RuleOC_CaseAlternative = 132, + RuleOC_Variable = 133, RuleOC_NumberLiteral = 134, RuleOC_Parameter = 135, + RuleOC_PropertyExpression = 136, RuleOC_PropertyKeyName = 137, RuleOC_IntegerLiteral = 138, + RuleOC_DoubleLiteral = 139, RuleOC_SchemaName = 140, RuleOC_SymbolicName = 141, + RuleKU_NonReservedKeywords = 142, RuleOC_LeftArrowHead = 143, RuleOC_RightArrowHead = 144, + RuleOC_Dash = 145 }; explicit CypherParser(antlr4::TokenStream *input); @@ -116,6 +116,7 @@ class CypherParser : public antlr4::Parser { class OC_StatementContext; class KU_CopyFromContext; class KU_ColumnNamesContext; + class KU_ScanSourceContext; class KU_CopyFromByColumnContext; class KU_CopyTOContext; class KU_ExportDatabaseContext; @@ -317,8 +318,7 @@ class CypherParser : public antlr4::Parser { antlr4::tree::TerminalNode* SP(size_t i); OC_SchemaNameContext *oC_SchemaName(); antlr4::tree::TerminalNode *FROM(); - KU_FilePathsContext *kU_FilePaths(); - OC_VariableContext *oC_Variable(); + KU_ScanSourceContext *kU_ScanSource(); KU_ParsingOptionsContext *kU_ParsingOptions(); KU_ColumnNamesContext *kU_ColumnNames(); @@ -341,6 +341,21 @@ class CypherParser : public antlr4::Parser { KU_ColumnNamesContext* kU_ColumnNames(); + class KU_ScanSourceContext : public antlr4::ParserRuleContext { + public: + KU_ScanSourceContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + KU_FilePathsContext *kU_FilePaths(); + OC_QueryContext *oC_Query(); + std::vector SP(); + antlr4::tree::TerminalNode* SP(size_t i); + OC_VariableContext *oC_Variable(); + + + }; + + KU_ScanSourceContext* kU_ScanSource(); + class KU_CopyFromByColumnContext : public antlr4::ParserRuleContext { public: KU_CopyFromByColumnContext(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -1063,13 +1078,12 @@ class CypherParser : public antlr4::Parser { std::vector SP(); antlr4::tree::TerminalNode* SP(size_t i); antlr4::tree::TerminalNode *FROM(); - KU_FilePathsContext *kU_FilePaths(); - OC_VariableContext *oC_Variable(); + KU_ScanSourceContext *kU_ScanSource(); antlr4::tree::TerminalNode *WITH(); antlr4::tree::TerminalNode *HEADERS(); KU_PropertyDefinitionsContext *kU_PropertyDefinitions(); - OC_WhereContext *oC_Where(); KU_ParsingOptionsContext *kU_ParsingOptions(); + OC_WhereContext *oC_Where(); }; diff --git a/tools/python_api/test/test_scan_pandas.py b/tools/python_api/test/test_scan_pandas.py index d073bf4a310..ca3904b0d42 100644 --- a/tools/python_api/test/test_scan_pandas.py +++ b/tools/python_api/test/test_scan_pandas.py @@ -316,6 +316,20 @@ def test_pandas_scan_demo(tmp_path: Path) -> None: assert np.all(result["p.height"].to_list() == height_in_cm) assert np.all(result["p.is_student"].to_list() == is_student) +def test_scan_pandas_copy_subquery(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) + conn = kuzu.Connection(db) + data = { + 'id': np.array([22, 3, 100], dtype=np.int64), + 'name': ['A', 'B', 'C'] + } + df = pd.DataFrame(data) + conn.execute("CREATE NODE TABLE person(ID INT64, NAME STRING, PRIMARY KEY(ID))") + conn.execute("COPY person FROM (LOAD FROM df RETURN *)") + result = conn.execute("MATCH (p:person) RETURN p.*").get_as_df() + assert result['p.ID'].to_list() == [22, 3, 100] + assert result['p.NAME'].to_list() == ['A', 'B', 'C'] + def test_scan_all_null(tmp_path: Path) -> None: db = kuzu.Database(tmp_path) From af50489b008b9cf860ec6e4a058217554aee427e Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Tue, 5 Mar 2024 09:47:18 -0500 Subject: [PATCH 024/136] Insert into the hash index builder one chunk at a time --- src/include/common/type_utils.h | 2 +- src/include/common/types/types.h | 2 +- .../operator/persistent/index_builder.h | 9 +- .../storage/index/hash_index_builder.h | 93 ++++++++------- .../operator/persistent/index_builder.cpp | 48 ++++---- src/storage/index/hash_index_builder.cpp | 111 ++++++++++-------- 6 files changed, 139 insertions(+), 126 deletions(-) diff --git a/src/include/common/type_utils.h b/src/include/common/type_utils.h index 43b03dbd2ae..b396fe1985c 100644 --- a/src/include/common/type_utils.h +++ b/src/include/common/type_utils.h @@ -80,7 +80,7 @@ class TypeUtils { return common::PhysicalTypeID::INT128; } else if constexpr (std::is_same_v) { return common::PhysicalTypeID::INTERVAL; - } else if constexpr (std::is_same_v) { + } else if constexpr (std::same_as || std::same_as) { return common::PhysicalTypeID::STRING; } else { KU_UNREACHABLE; diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 6ef8a4239bc..874c2d7b41d 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -85,7 +85,7 @@ template concept IndexHashable = ((std::integral && !std::is_same_v) || std::floating_point || std::is_same_v || std::is_same_v || - std::is_same_v); + std::is_same_v || std::same_as); enum class KUZU_API LogicalTypeID : uint8_t { ANY = 0, diff --git a/src/include/processor/operator/persistent/index_builder.h b/src/include/processor/operator/persistent/index_builder.h index 529e28e0724..12b5c5222de 100644 --- a/src/include/processor/operator/persistent/index_builder.h +++ b/src/include/processor/operator/persistent/index_builder.h @@ -16,9 +16,6 @@ namespace kuzu { namespace processor { -constexpr size_t BUFFER_SIZE = 1024; -template -using Buffer = common::StaticVector, BUFFER_SIZE>; const size_t SHOULD_FLUSH_QUEUE_SIZE = 32; class IndexBuilderGlobalQueues { @@ -28,7 +25,7 @@ class IndexBuilderGlobalQueues { void flushToDisk() const; template - void insert(size_t index, Buffer elem) { + void insert(size_t index, storage::IndexBuffer elem) { auto& typedQueues = std::get>(queues).array; typedQueues[index].push(std::move(elem)); if (typedQueues[index].approxSize() < SHOULD_FLUSH_QUEUE_SIZE) { @@ -49,7 +46,7 @@ class IndexBuilderGlobalQueues { template struct Queue { - std::array>, storage::NUM_HASH_INDEXES> array; + std::array>, storage::NUM_HASH_INDEXES> array; // Type information to help std::visit. Value is not used T type; }; @@ -92,7 +89,7 @@ class IndexBuilderLocalBuffers { // These arrays are much too large to be inline. template - using Buffers = std::array, storage::NUM_HASH_INDEXES>; + using Buffers = std::array, storage::NUM_HASH_INDEXES>; template using UniqueBuffers = std::unique_ptr>; std::variant, UniqueBuffers, UniqueBuffers, diff --git a/src/include/storage/index/hash_index_builder.h b/src/include/storage/index/hash_index_builder.h index fcd6d1e6d9a..9458479f215 100644 --- a/src/include/storage/index/hash_index_builder.h +++ b/src/include/storage/index/hash_index_builder.h @@ -1,6 +1,9 @@ #pragma once +#include "common/static_vector.h" #include "common/type_utils.h" +#include "common/types/internal_id_t.h" +#include "common/types/ku_string.h" #include "common/types/types.h" #include "storage/index/hash_index_header.h" #include "storage/index/hash_index_slot.h" @@ -18,6 +21,10 @@ class InMemHashIndex { virtual void bulkReserve(uint32_t numEntries) = 0; }; +constexpr size_t BUFFER_SIZE = 1024; +template +using IndexBuffer = common::StaticVector, BUFFER_SIZE>; + /** * Basic index file consists of three disk arrays: indexHeader, primary slots (pSlots), and overflow * slots (oSlots). @@ -44,9 +51,10 @@ class InMemHashIndex { * * */ -// T is the key type used to access values -// S is the stored type, which is usually the same as T, with the exception of strings -template +// T is the key type stored in the slots. +// For strings this is different than the type used when inserting/searching +// (see BufferKeyType and Key) +template class HashIndexBuilder final : public InMemHashIndex { static_assert(getSlotCapacity() <= SlotHeader::FINGERPRINT_CAPACITY); // Size of the validity mask @@ -62,13 +70,21 @@ class HashIndexBuilder final : public InMemHashIndex { // Reserves space for at least the specified number of elements. void bulkReserve(uint32_t numEntries) override; - bool append(T key, common::offset_t value); - bool lookup(T key, common::offset_t& result); + using BufferKeyType = + typename std::conditional, std::string, T>::type; + // Appends the buffer to the index. Returns the number of values successfully inserted. + // I.e. if a key fails to insert, its index will be the return value + size_t append(const IndexBuffer& buffer); + using Key = + typename std::conditional, std::string_view, T>::type; + bool lookup(Key key, common::offset_t& result); void flush() override; private: - Slot* getSlot(const SlotInfo& slotInfo); + // Assumes that space has already been allocated for the entry + bool appendInternal(Key key, common::offset_t value, common::hash_t hash); + Slot* getSlot(const SlotInfo& slotInfo); uint32_t allocatePSlots(uint32_t numSlotsToAllocate); uint32_t allocateAOSlot(); @@ -80,12 +96,12 @@ class HashIndexBuilder final : public InMemHashIndex { */ void splitSlot(HashIndexHeader& header); - inline bool equals(T keyToLookup, const S& keyInEntry) const { + inline bool equals(Key keyToLookup, const T& keyInEntry) const { return keyToLookup == keyInEntry; } inline void insert( - T key, Slot* slot, uint8_t entryPos, common::offset_t value, uint8_t fingerprint) { + Key key, Slot* slot, uint8_t entryPos, common::offset_t value, uint8_t fingerprint) { auto entry = slot->entries[entryPos].data; memcpy(entry, &key, sizeof(T)); memcpy(entry + sizeof(T), &value, sizeof(common::offset_t)); @@ -94,14 +110,14 @@ class HashIndexBuilder final : public InMemHashIndex { } void copy(const uint8_t* oldEntry, slot_id_t newSlotId, uint8_t fingerprint); void insertToNewOvfSlot( - T key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint); - common::hash_t hashStored(const S& key) const; + Key key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint); + common::hash_t hashStored(const T& key) const; struct SlotIterator { - explicit SlotIterator(slot_id_t newSlotId, HashIndexBuilder* builder) + explicit SlotIterator(slot_id_t newSlotId, HashIndexBuilder* builder) : slotInfo{newSlotId, SlotType::PRIMARY}, slot(builder->getSlot(slotInfo)) {} SlotInfo slotInfo; - Slot* slot; + Slot* slot; }; inline bool nextChainedSlot(SlotIterator& iter) { @@ -118,13 +134,13 @@ class HashIndexBuilder final : public InMemHashIndex { std::shared_ptr fileHandle; OverflowFileHandle* overflowFileHandle; std::unique_ptr> headerArray; - std::unique_ptr>> pSlots; - std::unique_ptr>> oSlots; + std::unique_ptr>> pSlots; + std::unique_ptr>> oSlots; std::unique_ptr indexHeader; }; template<> -bool HashIndexBuilder::equals( +bool HashIndexBuilder::equals( std::string_view keyToLookup, const common::ku_string_t& keyInEntry) const; class PrimaryKeyIndexBuilder { @@ -134,26 +150,15 @@ class PrimaryKeyIndexBuilder { void bulkReserve(uint32_t numEntries); - // Note: append assumes that bulkRserve has been called before it and the index has reserved - // enough space already. - template - bool append(T key, common::offset_t value) { - return appendWithIndexPos(key, value, HashIndexUtils::getHashIndexPosition(key)); - } - bool append(std::string_view key, common::offset_t value) { - return appendWithIndexPos(key, value, HashIndexUtils::getHashIndexPosition(key)); - } - template - bool appendWithIndexPos(T key, common::offset_t value, uint64_t indexPos) { + // Appends the buffer to the index. Returns the number of values successfully inserted. + // I.e. if a key fails to insert, its index will be the return value + template + size_t appendWithIndexPos(const IndexBuffer& buffer, uint64_t indexPos) { KU_ASSERT(keyDataTypeID == common::TypeUtils::getPhysicalTypeIDForType()); - KU_ASSERT(HashIndexUtils::getHashIndexPosition(key) == indexPos); - return getTypedHashIndex(indexPos)->append(key, value); - } - bool appendWithIndexPos(std::string_view key, common::offset_t value, uint64_t indexPos) { - KU_ASSERT(keyDataTypeID == common::PhysicalTypeID::STRING); - KU_ASSERT(HashIndexUtils::getHashIndexPosition(key) == indexPos); - return getTypedHashIndex(indexPos)->append( - key, value); + KU_ASSERT(std::all_of(buffer.begin(), buffer.end(), [&](auto& elem) { + return HashIndexUtils::getHashIndexPosition(elem.first) == indexPos; + })); + return getTypedHashIndex(indexPos)->append(buffer); } template bool lookup(T key, common::offset_t& result) { @@ -162,8 +167,7 @@ class PrimaryKeyIndexBuilder { } bool lookup(std::string_view key, common::offset_t& result) { KU_ASSERT(keyDataTypeID == common::PhysicalTypeID::STRING); - return getTypedHashIndex( - HashIndexUtils::getHashIndexPosition(key)) + return getTypedHashIndex(HashIndexUtils::getHashIndexPosition(key)) ->lookup(key, result); } @@ -173,10 +177,19 @@ class PrimaryKeyIndexBuilder { common::PhysicalTypeID keyTypeID() const { return keyDataTypeID; } private: - template - inline HashIndexBuilder* getTypedHashIndex(uint64_t indexPos) { - return common::ku_dynamic_cast*>( - hashIndexBuilders[indexPos].get()); + template + using HashIndexType = + typename std::conditional || std::same_as, + common::ku_string_t, T>::type; + template + inline HashIndexBuilder>* getTypedHashIndex(uint64_t indexPos) { + if constexpr (std::same_as, common::ku_string_t>) { + return common::ku_dynamic_cast*>( + hashIndexBuilders[indexPos].get()); + } else { + return common::ku_dynamic_cast*>( + hashIndexBuilders[indexPos].get()); + } } private: diff --git a/src/processor/operator/persistent/index_builder.cpp b/src/processor/operator/persistent/index_builder.cpp index 9ea69537b24..acb0c313dfb 100644 --- a/src/processor/operator/persistent/index_builder.cpp +++ b/src/processor/operator/persistent/index_builder.cpp @@ -34,34 +34,26 @@ void IndexBuilderGlobalQueues::maybeConsumeIndex(size_t index) { if (!mutexes[index].try_lock()) { return; } - std::unique_lock lck{mutexes[index], std::adopt_lock}; - - std::visit(overload{[&](Queue&& queues) { - using T = std::decay_t; - Buffer elem; - while (queues.array[index].pop(elem)) { - for (auto [key, value] : elem) { - if (!pkIndex->appendWithIndexPos(key, value, index)) { - throw CopyException( - ExceptionMessage::duplicatePKException(std::move(key))); - } - } - } - return; - }, - [&](auto&& queues) { - using T = std::decay_t; - Buffer elem; - while (queues.array[index].pop(elem)) { - for (auto [key, value] : elem) { - if (!pkIndex->appendWithIndexPos(key, value, index)) { - throw CopyException(ExceptionMessage::duplicatePKException( - TypeUtils::toString(key))); - } - } - } - return; - }}, + + std::visit( + [&](auto&& queues) { + using T = std::decay_t; + std::unique_lock lck{mutexes[index], std::adopt_lock}; + IndexBuffer buffer; + while (queues.array[index].pop(buffer)) { + auto numValuesInserted = pkIndex->appendWithIndexPos(buffer, index); + if (numValuesInserted < buffer.size()) { + if constexpr (std::same_as) { + throw CopyException(ExceptionMessage::duplicatePKException( + std::move(buffer[numValuesInserted].first))); + } else { + throw CopyException(ExceptionMessage::duplicatePKException( + TypeUtils::toString(buffer[numValuesInserted].first))); + } + } + } + return; + }, std::move(queues)); } diff --git a/src/storage/index/hash_index_builder.cpp b/src/storage/index/hash_index_builder.cpp index 3499267eeed..ef1b13f3573 100644 --- a/src/storage/index/hash_index_builder.cpp +++ b/src/storage/index/hash_index_builder.cpp @@ -16,27 +16,27 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -template -HashIndexBuilder::HashIndexBuilder(const std::shared_ptr& fileHandle, +template +HashIndexBuilder::HashIndexBuilder(const std::shared_ptr& fileHandle, OverflowFileHandle* overflowFileHandle, uint64_t indexPos, PhysicalTypeID keyDataType) : fileHandle(fileHandle), overflowFileHandle(overflowFileHandle) { this->indexHeader = std::make_unique(keyDataType); headerArray = std::make_unique>(*fileHandle, NUM_HEADER_PAGES * indexPos + INDEX_HEADER_ARRAY_HEADER_PAGE_IDX, 0 /* numElements */); - pSlots = std::make_unique>>( + pSlots = std::make_unique>>( *fileHandle, NUM_HEADER_PAGES * indexPos + P_SLOTS_HEADER_PAGE_IDX, 0 /* numElements */); // Reserve a slot for oSlots, which is always skipped, as we treat slot idx 0 as NULL. - oSlots = std::make_unique>>( + oSlots = std::make_unique>>( *fileHandle, NUM_HEADER_PAGES * indexPos + O_SLOTS_HEADER_PAGE_IDX, 1 /* numElements */); allocatePSlots(1u << this->indexHeader->currentLevel); } -template -void HashIndexBuilder::bulkReserve(uint32_t numEntries_) { +template +void HashIndexBuilder::bulkReserve(uint32_t numEntries_) { slot_id_t numRequiredEntries = HashIndexUtils::getNumRequiredEntries(this->indexHeader->numEntries, numEntries_); // Build from scratch. - auto numRequiredSlots = (numRequiredEntries + getSlotCapacity() - 1) / getSlotCapacity(); + auto numRequiredSlots = (numRequiredEntries + getSlotCapacity() - 1) / getSlotCapacity(); auto numSlotsOfCurrentLevel = 1u << this->indexHeader->currentLevel; while ((numSlotsOfCurrentLevel << 1) < numRequiredSlots) { this->indexHeader->incrementLevel(); @@ -51,12 +51,11 @@ void HashIndexBuilder::bulkReserve(uint32_t numEntries_) { } } -template -void HashIndexBuilder::copy( - const uint8_t* oldEntry, slot_id_t newSlotId, uint8_t fingerprint) { +template +void HashIndexBuilder::copy(const uint8_t* oldEntry, slot_id_t newSlotId, uint8_t fingerprint) { SlotIterator iter(newSlotId, this); do { - for (auto newEntryPos = 0u; newEntryPos < getSlotCapacity(); newEntryPos++) { + for (auto newEntryPos = 0u; newEntryPos < getSlotCapacity(); newEntryPos++) { if (!iter.slot->header.isEntryValid(newEntryPos)) { // The original slot was marked as unused, but // copying to the original slot is unnecessary and will cause undefined behaviour @@ -78,8 +77,8 @@ void HashIndexBuilder::copy( newOvfSlot->header.setEntryValid(newEntryPos, fingerprint); } -template -void HashIndexBuilder::splitSlot(HashIndexHeader& header) { +template +void HashIndexBuilder::splitSlot(HashIndexHeader& header) { // Add new slot allocatePSlots(1); @@ -91,12 +90,12 @@ void HashIndexBuilder::splitSlot(HashIndexHeader& header) { // Reset everything except the next overflow id so we can reuse the overflow slot iter.slot->header.reset(); iter.slot->header.nextOvfSlotId = slotHeader.nextOvfSlotId; - for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { + for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (!slotHeader.isEntryValid(entryPos)) { continue; // Skip invalid entries. } const auto* data = (iter.slot->entries[entryPos].data); - hash_t hash = this->hashStored(*reinterpret_cast(data)); + hash_t hash = this->hashStored(*reinterpret_cast(data)); auto fingerprint = HashIndexUtils::getFingerprintForHash(hash); auto newSlotId = hash & header.higherLevelHashMask; copy(data, newSlotId, fingerprint); @@ -106,21 +105,35 @@ void HashIndexBuilder::splitSlot(HashIndexHeader& header) { header.incrementNextSplitSlotId(); } -template -bool HashIndexBuilder::append(T key, offset_t value) { +template +size_t HashIndexBuilder::append(const IndexBuffer& buffer) { slot_id_t numRequiredEntries = - HashIndexUtils::getNumRequiredEntries(this->indexHeader->numEntries, 1); - while (numRequiredEntries > pSlots->getNumElements() * getSlotCapacity()) { + HashIndexUtils::getNumRequiredEntries(this->indexHeader->numEntries, buffer.size()); + while (numRequiredEntries > pSlots->getNumElements() * getSlotCapacity()) { this->splitSlot(*this->indexHeader); } // Do both searches after splitting. Returning early if the key already exists isn't a // particular concern and doing both after splitting allows the slotID to be reused - auto hashValue = HashIndexUtils::hash(key); - auto fingerprint = HashIndexUtils::getFingerprintForHash(hashValue); - auto slotID = HashIndexUtils::getPrimarySlotIdForHash(*this->indexHeader, hashValue); + common::hash_t hashes[BUFFER_SIZE]; + for (size_t i = 0; i < buffer.size(); i++) { + hashes[i] = HashIndexUtils::hash(buffer[i].first); + } + for (size_t i = 0; i < buffer.size(); i++) { + auto& [key, value] = buffer[i]; + if (!appendInternal(key, value, hashes[i])) { + return i; + } + } + return buffer.size(); +} + +template +bool HashIndexBuilder::appendInternal(Key key, common::offset_t value, common::hash_t hash) { + auto fingerprint = HashIndexUtils::getFingerprintForHash(hash); + auto slotID = HashIndexUtils::getPrimarySlotIdForHash(*this->indexHeader, hash); SlotIterator iter(slotID, this); do { - for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { + for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (!iter.slot->header.isEntryValid(entryPos)) { // Insert to this position // The builder never keeps holes and doesn't support deletions, so this must be the @@ -130,7 +143,7 @@ bool HashIndexBuilder::append(T key, offset_t value) { this->indexHeader->numEntries++; return true; } else if (iter.slot->header.fingerprints[entryPos] == fingerprint && - equals(key, *(S*)iter.slot->entries[entryPos].data)) { + equals(key, *(T*)iter.slot->entries[entryPos].data)) { // Value already exists return false; } @@ -142,17 +155,17 @@ bool HashIndexBuilder::append(T key, offset_t value) { return true; } -template -bool HashIndexBuilder::lookup(T key, offset_t& result) { +template +bool HashIndexBuilder::lookup(Key key, offset_t& result) { auto hashValue = HashIndexUtils::hash(key); auto fingerprint = HashIndexUtils::getFingerprintForHash(hashValue); auto slotId = HashIndexUtils::getPrimarySlotIdForHash(*this->indexHeader, hashValue); SlotIterator iter(slotId, this); do { - for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { + for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (iter.slot->header.isEntryValid(entryPos) && iter.slot->header.fingerprints[entryPos] == fingerprint && - equals(key, *(S*)iter.slot->entries[entryPos].data)) { + equals(key, *(T*)iter.slot->entries[entryPos].data)) { // Value already exists result = *(common::offset_t*)(iter.slot->entries[entryPos].data + this->indexHeader->numBytesPerKey); @@ -163,24 +176,24 @@ bool HashIndexBuilder::lookup(T key, offset_t& result) { return false; } -template -uint32_t HashIndexBuilder::allocatePSlots(uint32_t numSlotsToAllocate) { +template +uint32_t HashIndexBuilder::allocatePSlots(uint32_t numSlotsToAllocate) { auto oldNumSlots = pSlots->getNumElements(); auto newNumSlots = oldNumSlots + numSlotsToAllocate; pSlots->resize(newNumSlots, true /* setToZero */); return oldNumSlots; } -template -uint32_t HashIndexBuilder::allocateAOSlot() { +template +uint32_t HashIndexBuilder::allocateAOSlot() { auto oldNumSlots = oSlots->getNumElements(); auto newNumSlots = oldNumSlots + 1; oSlots->resize(newNumSlots, true /* setToZero */); return oldNumSlots; } -template -Slot* HashIndexBuilder::getSlot(const SlotInfo& slotInfo) { +template +Slot* HashIndexBuilder::getSlot(const SlotInfo& slotInfo) { if (slotInfo.slotType == SlotType::PRIMARY) { return &pSlots->operator[](slotInfo.slotId); } else { @@ -188,8 +201,8 @@ Slot* HashIndexBuilder::getSlot(const SlotInfo& slotInfo) { } } -template -void HashIndexBuilder::flush() { +template +void HashIndexBuilder::flush() { headerArray->resize(1, true /* setToZero */); headerArray->operator[](0) = *this->indexHeader; headerArray->saveToDisk(); @@ -197,9 +210,9 @@ void HashIndexBuilder::flush() { oSlots->saveToDisk(); } -template -inline void HashIndexBuilder::insertToNewOvfSlot( - T key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint) { +template +inline void HashIndexBuilder::insertToNewOvfSlot( + Key key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint) { auto newSlotId = allocateAOSlot(); previousSlot->header.nextOvfSlotId = newSlotId; auto newSlot = getSlot(SlotInfo{newSlotId, SlotType::OVF}); @@ -208,29 +221,28 @@ inline void HashIndexBuilder::insertToNewOvfSlot( } template<> -void HashIndexBuilder::insert(std::string_view key, - Slot* slot, uint8_t entryPos, offset_t offset, uint8_t fingerprint) { +void HashIndexBuilder::insert(std::string_view key, Slot* slot, + uint8_t entryPos, offset_t offset, uint8_t fingerprint) { auto entry = slot->entries[entryPos].data; *(ku_string_t*)entry = overflowFileHandle->writeString(key); memcpy(entry + NUM_BYTES_FOR_STRING_KEY, &offset, sizeof(common::offset_t)); slot->header.setEntryValid(entryPos, fingerprint); } -template -common::hash_t HashIndexBuilder::hashStored(const S& key) const { +template +common::hash_t HashIndexBuilder::hashStored(const T& key) const { return HashIndexUtils::hash(key); } template<> -common::hash_t HashIndexBuilder::hashStored( - const ku_string_t& key) const { +common::hash_t HashIndexBuilder::hashStored(const ku_string_t& key) const { auto kuString = key; return HashIndexUtils::hash( overflowFileHandle->readString(transaction::TransactionType::WRITE, kuString)); } template<> -bool HashIndexBuilder::equals( +bool HashIndexBuilder::equals( std::string_view keyToLookup, const ku_string_t& keyInEntry) const { // Checks if prefix and len matches first. if (!HashIndexUtils::areStringPrefixAndLenEqual(keyToLookup, keyInEntry)) { @@ -261,7 +273,7 @@ template class HashIndexBuilder; template class HashIndexBuilder; template class HashIndexBuilder; template class HashIndexBuilder; -template class HashIndexBuilder; +template class HashIndexBuilder; PrimaryKeyIndexBuilder::PrimaryKeyIndexBuilder( const std::string& fName, PhysicalTypeID keyDataType, VirtualFileSystem* vfs) @@ -277,9 +289,8 @@ PrimaryKeyIndexBuilder::PrimaryKeyIndexBuilder( overflowFile = std::make_unique( StorageUtils::getOverflowFileName(fileHandle->getFileInfo()->path), vfs); for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { - hashIndexBuilders.push_back( - std::make_unique>( - fileHandle, overflowFile->addHandle(), i, keyDataType)); + hashIndexBuilders.push_back(std::make_unique>( + fileHandle, overflowFile->addHandle(), i, keyDataType)); } } else if constexpr (HashablePrimitive) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { From d9d277f11a74f116092b14643a949ba59f2cfa49 Mon Sep 17 00:00:00 2001 From: xiyang Date: Tue, 12 Mar 2024 10:15:39 -0400 Subject: [PATCH 025/136] Fix issue-3004 --- src/binder/bind/bind_copy.cpp | 4 +-- src/binder/bind/bind_projection_clause.cpp | 10 -------- src/binder/bound_statement_rewriter.cpp | 4 +++ src/binder/bound_statement_visitor.cpp | 16 ++++++++++++ src/binder/expression/CMakeLists.txt | 4 ++- src/binder/expression/expression.cpp | 9 +++++++ src/binder/expression/literal_expression.cpp | 23 +++++++++++++++++ .../expression/parameter_expression.cpp | 23 +++++++++++++++++ src/binder/expression_binder.cpp | 13 +--------- src/binder/visitor/CMakeLists.txt | 1 + src/binder/visitor/default_type_solver.cpp | 25 +++++++++++++++++++ src/common/vector/value_vector.cpp | 7 ++++++ src/function/vector_list_functions.cpp | 3 +-- src/function/vector_struct_functions.cpp | 3 +-- src/function/vector_union_functions.cpp | 4 +-- src/include/binder/binder.h | 1 - src/include/binder/bound_statement_visitor.h | 4 +-- src/include/binder/copy/bound_copy_to.h | 18 +++++-------- src/include/binder/expression/expression.h | 11 ++++---- .../binder/expression/literal_expression.h | 14 ++++------- .../binder/expression/parameter_expression.h | 13 +++------- src/include/binder/expression_binder.h | 2 -- .../binder/visitor/default_type_solver.h | 21 ++++++++++++++++ .../binder/visitor/property_collector.h | 1 + src/planner/plan/plan_copy.cpp | 9 +++++-- test/test_files/common/types/null.test | 16 ++++++++++++ test/test_files/copy/copy_to_parquet.test | 1 - 27 files changed, 185 insertions(+), 75 deletions(-) create mode 100644 src/binder/expression/literal_expression.cpp create mode 100644 src/binder/expression/parameter_expression.cpp create mode 100644 src/binder/visitor/default_type_solver.cpp create mode 100644 src/include/binder/visitor/default_type_solver.h create mode 100644 test/test_files/common/types/null.test diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index d8e0620d1a8..f79f7c1f36f 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -44,8 +44,8 @@ std::unique_ptr Binder::bindCopyToClause(const Statement& statem } auto csvConfig = CSVReaderConfig::construct(bindParsingOptions(copyToStatement.getParsingOptionsRef())); - return std::make_unique(boundFilePath, fileType, std::move(columnNames), - std::move(columnTypes), std::move(query), csvConfig.option.copy()); + return std::make_unique( + boundFilePath, fileType, std::move(query), csvConfig.option.copy()); } std::unique_ptr Binder::bindCopyFromClause(const Statement& statement) { diff --git a/src/binder/bind/bind_projection_clause.cpp b/src/binder/bind/bind_projection_clause.cpp index 63e0e9c41bf..5bb71c68b94 100644 --- a/src/binder/bind/bind_projection_clause.cpp +++ b/src/binder/bind/bind_projection_clause.cpp @@ -207,7 +207,6 @@ expression_vector Binder::bindProjectionExpressions( result.push_back(expressionBinder.bindExpression(*expression)); } } - resolveAnyDataTypeWithDefaultType(result); validateProjectionColumnNamesAreUnique(result); return result; } @@ -224,7 +223,6 @@ expression_vector Binder::bindOrderByExpressions( } boundOrderByExpressions.push_back(std::move(boundExpression)); } - resolveAnyDataTypeWithDefaultType(boundOrderByExpressions); return boundOrderByExpressions; } @@ -264,13 +262,5 @@ void Binder::addExpressionsToScope(const expression_vector& projectionExpression } } -void Binder::resolveAnyDataTypeWithDefaultType(const expression_vector& expressions) { - for (auto& expression : expressions) { - if (expression->dataType.getLogicalTypeID() == LogicalTypeID::ANY) { - ExpressionBinder::implicitCastIfNecessary(expression, LogicalTypeID::STRING); - } - } -} - } // namespace binder } // namespace kuzu diff --git a/src/binder/bound_statement_rewriter.cpp b/src/binder/bound_statement_rewriter.cpp index 3bdcac3799e..39595982077 100644 --- a/src/binder/bound_statement_rewriter.cpp +++ b/src/binder/bound_statement_rewriter.cpp @@ -2,6 +2,7 @@ #include "binder/rewriter/match_clause_pattern_label_rewriter.h" #include "binder/rewriter/with_clause_projection_rewriter.h" +#include "binder/visitor/default_type_solver.h" namespace kuzu { namespace binder { @@ -13,6 +14,9 @@ void BoundStatementRewriter::rewrite( auto matchClausePatternLabelRewriter = MatchClausePatternLabelRewriter(catalog); matchClausePatternLabelRewriter.visit(boundStatement); + + auto defaultTypeSolver = DefaultTypeSolver(); + defaultTypeSolver.visit(boundStatement); } } // namespace binder diff --git a/src/binder/bound_statement_visitor.cpp b/src/binder/bound_statement_visitor.cpp index 880a5793197..fe67f121116 100644 --- a/src/binder/bound_statement_visitor.cpp +++ b/src/binder/bound_statement_visitor.cpp @@ -1,6 +1,8 @@ #include "binder/bound_statement_visitor.h" #include "binder/bound_explain.h" +#include "binder/copy/bound_copy_from.h" +#include "binder/copy/bound_copy_to.h" #include "binder/query/bound_regular_query.h" #include "common/cast.h" @@ -68,6 +70,20 @@ void BoundStatementVisitor::visitUnsafe(BoundStatement& statement) { } } +void BoundStatementVisitor::visitCopyFrom(const BoundStatement& statement) { + auto& copyFrom = ku_dynamic_cast(statement); + if (copyFrom.getInfo()->source->type == ScanSourceType::QUERY) { + auto querySource = ku_dynamic_cast( + copyFrom.getInfo()->source.get()); + visit(*querySource->statement); + } +} + +void BoundStatementVisitor::visitCopyTo(const BoundStatement& statement) { + auto& copyTo = ku_dynamic_cast(statement); + visitRegularQuery(*copyTo.getRegularQuery()); +} + void BoundStatementVisitor::visitRegularQuery(const BoundStatement& statement) { auto& regularQuery = ku_dynamic_cast(statement); diff --git a/src/binder/expression/CMakeLists.txt b/src/binder/expression/CMakeLists.txt index fbfacda7697..ee106d6723d 100644 --- a/src/binder/expression/CMakeLists.txt +++ b/src/binder/expression/CMakeLists.txt @@ -4,7 +4,9 @@ add_library( case_expression.cpp expression.cpp expression_util.cpp - function_expression.cpp) + function_expression.cpp + literal_expression.cpp + parameter_expression.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/binder/expression/expression.cpp b/src/binder/expression/expression.cpp index 25192ffe963..bbcfc82fd5c 100644 --- a/src/binder/expression/expression.cpp +++ b/src/binder/expression/expression.cpp @@ -1,10 +1,19 @@ #include "binder/expression/expression.h" +#include "common/exception/binder.h" + using namespace kuzu::common; namespace kuzu { namespace binder { +void Expression::cast(const LogicalType&) { + // LCOV_EXCL_START + throw BinderException( + stringFormat("Data type of expression {} should not be modified.", toString())); + // LCOV_EXCL_STOP +} + expression_vector Expression::splitOnAND() { expression_vector result; if (ExpressionType::AND == expressionType) { diff --git a/src/binder/expression/literal_expression.cpp b/src/binder/expression/literal_expression.cpp new file mode 100644 index 00000000000..c0ed03e85a3 --- /dev/null +++ b/src/binder/expression/literal_expression.cpp @@ -0,0 +1,23 @@ +#include "binder/expression/literal_expression.h" + +#include "common/exception/binder.h" + +namespace kuzu { +using namespace common; + +namespace binder { + +void LiteralExpression::cast(const LogicalType& type) { + if (dataType.getLogicalTypeID() != LogicalTypeID::ANY) { + // LCOV_EXCL_START + throw BinderException( + stringFormat("Cannot change literal expression data type from {} to {}.", + dataType.toString(), type.toString())); + // LCOV_EXCL_STOP + } + dataType = type; + value->setDataType(type); +} + +} // namespace binder +} // namespace kuzu diff --git a/src/binder/expression/parameter_expression.cpp b/src/binder/expression/parameter_expression.cpp new file mode 100644 index 00000000000..c0a93cbf2ed --- /dev/null +++ b/src/binder/expression/parameter_expression.cpp @@ -0,0 +1,23 @@ +#include "binder/expression/parameter_expression.h" + +#include "common/exception/binder.h" + +namespace kuzu { +using namespace common; + +namespace binder { + +void ParameterExpression::cast(const LogicalType& type) { + if (dataType.getLogicalTypeID() != LogicalTypeID::ANY) { + // LCOV_EXCL_START + throw BinderException( + stringFormat("Cannot change parameter expression data type from {} to {}.", + dataType.toString(), type.toString())); + // LCOV_EXCL_STOP + } + dataType = type; + value->setDataType(type); +} + +} // namespace binder +} // namespace kuzu diff --git a/src/binder/expression_binder.cpp b/src/binder/expression_binder.cpp index 48de08098c5..d70cd229434 100644 --- a/src/binder/expression_binder.cpp +++ b/src/binder/expression_binder.cpp @@ -2,8 +2,6 @@ #include "binder/binder.h" #include "binder/expression/function_expression.h" -#include "binder/expression/literal_expression.h" -#include "binder/expression/parameter_expression.h" #include "binder/expression_visitor.h" #include "common/exception/binder.h" #include "common/exception/not_implemented.h" @@ -104,7 +102,7 @@ std::shared_ptr ExpressionBinder::implicitCastIfNecessary( return expression; } if (expression->dataType.getLogicalTypeID() == LogicalTypeID::ANY) { - resolveAnyDataType(*expression, targetType); + expression->cast(targetType); return expression; } return implicitCast(expression, targetType); @@ -127,15 +125,6 @@ std::shared_ptr ExpressionBinder::implicitCast( } } -void ExpressionBinder::resolveAnyDataType(Expression& expression, const LogicalType& targetType) { - if (expression.expressionType == ExpressionType::PARAMETER) { // expression is parameter - ((ParameterExpression&)expression).setDataType(targetType); - } else { // expression is null literal - KU_ASSERT(expression.expressionType == ExpressionType::LITERAL); - ((LiteralExpression&)expression).setDataType(targetType); - } -} - void ExpressionBinder::validateExpectedDataType( const Expression& expression, const std::vector& targets) { auto dataType = expression.dataType; diff --git a/src/binder/visitor/CMakeLists.txt b/src/binder/visitor/CMakeLists.txt index ddf93f29ddc..5bd4ed88b07 100644 --- a/src/binder/visitor/CMakeLists.txt +++ b/src/binder/visitor/CMakeLists.txt @@ -1,6 +1,7 @@ add_library( kuzu_binder_visitor OBJECT + default_type_solver.cpp property_collector.cpp) set(ALL_OBJECT_FILES diff --git a/src/binder/visitor/default_type_solver.cpp b/src/binder/visitor/default_type_solver.cpp new file mode 100644 index 00000000000..8315f654a8d --- /dev/null +++ b/src/binder/visitor/default_type_solver.cpp @@ -0,0 +1,25 @@ +#include "binder/visitor/default_type_solver.h" + +using namespace kuzu::common; + +namespace kuzu { +namespace binder { + +static void resolveAnyType(Expression& expr) { + if (expr.getDataType().getLogicalTypeID() != LogicalTypeID::ANY) { + return; + } + expr.cast(*LogicalType::STRING()); +} + +void DefaultTypeSolver::visitProjectionBody(const BoundProjectionBody& projectionBody) { + for (auto& expr : projectionBody.getProjectionExpressions()) { + resolveAnyType(*expr); + } + for (auto& expr : projectionBody.getOrderByExpressions()) { + resolveAnyType(*expr); + } +} + +} // namespace binder +} // namespace kuzu diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index ef06921fd6b..b99d1bb4e7f 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -12,6 +12,13 @@ namespace common { ValueVector::ValueVector(LogicalType dataType, storage::MemoryManager* memoryManager) : dataType{std::move(dataType)} { + if (this->dataType.getLogicalTypeID() == LogicalTypeID::ANY) { + // LCOV_EXCL_START + // Alternatively we can assign + throw RuntimeException("Trying to a create a vector with ANY type. This should not happen. " + "Data type is expected to be resolved during binding."); + // LCOV_EXCL_STOP + } numBytesPerValue = getDataTypeSize(this->dataType); initializeValueBuffer(); nullMask = std::make_unique(); diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index 4b2b5e810e5..d97167fb7c9 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -1,6 +1,5 @@ #include "function/list/vector_list_functions.h" -#include "binder/expression_binder.h" #include "common/exception/binder.h" #include "common/exception/runtime.h" #include "function/list/functions/list_any_value_function.h" @@ -76,7 +75,7 @@ std::unique_ptr ListCreationFunction::bindFunc( auto& parameterType = argument->getDataTypeReference(); if (parameterType != childType) { if (parameterType.getLogicalTypeID() == LogicalTypeID::ANY) { - binder::ExpressionBinder::resolveAnyDataType(*argument, childType); + argument->cast(childType); } else { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( LIST_CREATION_FUNC_NAME, arguments[0]->getDataType(), argument->getDataType())); diff --git a/src/function/vector_struct_functions.cpp b/src/function/vector_struct_functions.cpp index dde88007805..5c5f74e3ab8 100644 --- a/src/function/vector_struct_functions.cpp +++ b/src/function/vector_struct_functions.cpp @@ -24,8 +24,7 @@ std::unique_ptr StructPackFunctions::bindFunc( std::vector fields; for (auto& argument : arguments) { if (argument->getDataType().getLogicalTypeID() == LogicalTypeID::ANY) { - binder::ExpressionBinder::resolveAnyDataType( - *argument, LogicalType{LogicalTypeID::STRING}); + argument->cast(*LogicalType::STRING()); } fields.emplace_back(argument->getAlias(), argument->getDataType().copy()); } diff --git a/src/function/vector_union_functions.cpp b/src/function/vector_union_functions.cpp index 33c720209c2..0c9b83b5586 100644 --- a/src/function/vector_union_functions.cpp +++ b/src/function/vector_union_functions.cpp @@ -1,6 +1,5 @@ #include "function/union/vector_union_functions.h" -#include "binder/expression_binder.h" #include "function/struct/vector_struct_functions.h" #include "function/union/functions/union_tag.h" @@ -25,8 +24,7 @@ std::unique_ptr UnionValueFunction::bindFunc( fields.emplace_back( UnionType::TAG_FIELD_NAME, std::make_unique(UnionType::TAG_FIELD_TYPE)); if (arguments[0]->getDataType().getLogicalTypeID() == common::LogicalTypeID::ANY) { - binder::ExpressionBinder::resolveAnyDataType( - *arguments[0], LogicalType(LogicalTypeID::STRING)); + arguments[0]->cast(*LogicalType::STRING()); } fields.emplace_back(arguments[0]->getAlias(), arguments[0]->getDataType().copy()); auto resultType = LogicalType::UNION(std::move(fields)); diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index 8e07a2b009f..faa1a8275be 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -220,7 +220,6 @@ class Binder { uint64_t bindSkipLimitExpression(const parser::ParsedExpression& expression); void addExpressionsToScope(const expression_vector& projectionExpressions); - void resolveAnyDataTypeWithDefaultType(const expression_vector& expressions); /*** bind graph pattern ***/ BoundGraphPattern bindGraphPattern(const std::vector& graphPattern); diff --git a/src/include/binder/bound_statement_visitor.h b/src/include/binder/bound_statement_visitor.h index 45a1652b193..2691255797c 100644 --- a/src/include/binder/bound_statement_visitor.h +++ b/src/include/binder/bound_statement_visitor.h @@ -20,8 +20,8 @@ class BoundStatementVisitor { virtual void visitCreateTable(const BoundStatement&) {} virtual void visitDropTable(const BoundStatement&) {} virtual void visitAlter(const BoundStatement&) {} - virtual void visitCopyFrom(const BoundStatement&) {} - virtual void visitCopyTo(const BoundStatement&) {} + virtual void visitCopyFrom(const BoundStatement&); + virtual void visitCopyTo(const BoundStatement&); virtual void visitExportDatabase(const BoundStatement&) {} virtual void visitImportDatabase(const BoundStatement&) {} virtual void visitStandaloneCall(const BoundStatement&) {} diff --git a/src/include/binder/copy/bound_copy_to.h b/src/include/binder/copy/bound_copy_to.h index c7dac956f1d..d306c8d05d7 100644 --- a/src/include/binder/copy/bound_copy_to.h +++ b/src/include/binder/copy/bound_copy_to.h @@ -1,6 +1,6 @@ #pragma once -#include "binder/query/bound_regular_query.h" +#include "binder/bound_statement.h" #include "common/copier_config/csv_reader_config.h" #include "common/copier_config/reader_config.h" @@ -10,27 +10,21 @@ namespace binder { class BoundCopyTo : public BoundStatement { public: BoundCopyTo(std::string filePath, common::FileType fileType, - std::vector columnNames, std::vector columnTypes, - std::unique_ptr regularQuery, common::CSVOption csvOption) + std::unique_ptr query, common::CSVOption csvOption) : BoundStatement{common::StatementType::COPY_TO, BoundStatementResult::createEmptyResult()}, - filePath{std::move(filePath)}, fileType{fileType}, columnNames{std::move(columnNames)}, - columnTypes{std::move(columnTypes)}, - regularQuery{std::move(regularQuery)}, csvOption{std::move(csvOption)} {} + filePath{std::move(filePath)}, fileType{fileType}, query{std::move(query)}, + csvOption{std::move(csvOption)} {} inline std::string getFilePath() const { return filePath; } inline common::FileType getFileType() const { return fileType; } - inline std::vector getColumnNames() const { return columnNames; } - inline const std::vector& getColumnTypesRef() const { return columnTypes; } - inline const BoundRegularQuery* getRegularQuery() const { return regularQuery.get(); } + inline const BoundStatement* getRegularQuery() const { return query.get(); } inline const common::CSVOption* getCopyOption() const { return &csvOption; } private: std::string filePath; common::FileType fileType; - std::vector columnNames; - std::vector columnTypes; - std::unique_ptr regularQuery; + std::unique_ptr query; common::CSVOption csvOption; }; diff --git a/src/include/binder/expression/expression.h b/src/include/binder/expression/expression.h index 59b67b717d6..3275f0be250 100644 --- a/src/include/binder/expression/expression.h +++ b/src/include/binder/expression/expression.h @@ -53,16 +53,17 @@ class Expression : public std::enable_shared_from_this { DELETE_COPY_DEFAULT_MOVE(Expression); virtual ~Expression() = default; - inline void setAlias(const std::string& name) { alias = name; } + void setAlias(const std::string& name) { alias = name; } - inline void setUniqueName(const std::string& name) { uniqueName = name; } - inline std::string getUniqueName() const { + void setUniqueName(const std::string& name) { uniqueName = name; } + std::string getUniqueName() const { KU_ASSERT(!uniqueName.empty()); return uniqueName; } - inline common::LogicalType getDataType() const { return dataType; } - inline common::LogicalType& getDataTypeReference() { return dataType; } + virtual void cast(const common::LogicalType& type); + common::LogicalType getDataType() const { return dataType; } + common::LogicalType& getDataTypeReference() { return dataType; } inline bool hasAlias() const { return !alias.empty(); } inline std::string getAlias() const { return alias; } diff --git a/src/include/binder/expression/literal_expression.h b/src/include/binder/expression/literal_expression.h index b8f7ab0ac77..5a49e36603c 100644 --- a/src/include/binder/expression/literal_expression.h +++ b/src/include/binder/expression/literal_expression.h @@ -6,25 +6,21 @@ namespace kuzu { namespace binder { -class LiteralExpression : public Expression { +class LiteralExpression final : public Expression { public: LiteralExpression(std::unique_ptr value, const std::string& uniqueName) : Expression{common::ExpressionType::LITERAL, *value->getDataType(), uniqueName}, value{std::move(value)} {} - inline bool isNull() const { return value->isNull(); } + bool isNull() const { return value->isNull(); } - inline void setDataType(const common::LogicalType& targetType) { - KU_ASSERT(dataType.getLogicalTypeID() == common::LogicalTypeID::ANY && isNull()); - dataType = targetType; - value->setDataType(targetType); - } + void cast(const common::LogicalType& type) override; - inline common::Value* getValue() const { return value.get(); } + common::Value* getValue() const { return value.get(); } std::string toStringInternal() const final { return value->toString(); } - inline std::unique_ptr copy() const final { + std::unique_ptr copy() const final { return std::make_unique(value->copy(), uniqueName); } diff --git a/src/include/binder/expression/parameter_expression.h b/src/include/binder/expression/parameter_expression.h index 7eae97087f4..12598a63d45 100644 --- a/src/include/binder/expression/parameter_expression.h +++ b/src/include/binder/expression/parameter_expression.h @@ -14,18 +14,13 @@ class ParameterExpression : public Expression { common::LogicalType(common::LogicalTypeID::ANY), createUniqueName(parameterName)}, parameterName(parameterName), value{std::move(value)} {} - inline void setDataType(const common::LogicalType& targetType) { - KU_ASSERT(dataType.getLogicalTypeID() == common::LogicalTypeID::ANY); - dataType = targetType; - value->setDataType(targetType); - } + void cast(const common::LogicalType& type) override; - inline std::shared_ptr getLiteral() const { return value; } - - inline std::string toStringInternal() const final { return "$" + parameterName; } + std::shared_ptr getLiteral() const { return value; } private: - inline static std::string createUniqueName(const std::string& input) { return "$" + input; } + std::string toStringInternal() const final { return "$" + parameterName; } + static std::string createUniqueName(const std::string& input) { return "$" + input; } private: std::string parameterName; diff --git a/src/include/binder/expression_binder.h b/src/include/binder/expression_binder.h index f26cb2a9a91..70221ddcf8e 100644 --- a/src/include/binder/expression_binder.h +++ b/src/include/binder/expression_binder.h @@ -26,8 +26,6 @@ class ExpressionBinder { std::shared_ptr bindExpression(const parser::ParsedExpression& parsedExpression); - static void resolveAnyDataType(Expression& expression, const common::LogicalType& targetType); - /****** validation *****/ static void validateExpectedDataType( const Expression& expression, common::LogicalTypeID target) { diff --git a/src/include/binder/visitor/default_type_solver.h b/src/include/binder/visitor/default_type_solver.h new file mode 100644 index 00000000000..3fc5ec965ba --- /dev/null +++ b/src/include/binder/visitor/default_type_solver.h @@ -0,0 +1,21 @@ +#pragma once + +#include "binder/bound_statement_visitor.h" + +namespace kuzu { +namespace binder { + +// Assign a default data type (STRING) for expressions with ANY data type for a given statement. +// E.g. RETURN NULL; Expression NULL can be resolved as any type based on semantic. +// We don't iterate all expressions because +// - predicates must have been resolved to BOOL type +// - lhs expressions for update must have been resolved to column type +// So we only need to resolve for expressions appear in the projection clause. This assumption might +// change as we add more features. +class DefaultTypeSolver final : public BoundStatementVisitor { +private: + void visitProjectionBody(const BoundProjectionBody& projectionBody) override; +}; + +} // namespace binder +} // namespace kuzu diff --git a/src/include/binder/visitor/property_collector.h b/src/include/binder/visitor/property_collector.h index d592de959ed..7c7cb352e17 100644 --- a/src/include/binder/visitor/property_collector.h +++ b/src/include/binder/visitor/property_collector.h @@ -5,6 +5,7 @@ namespace kuzu { namespace binder { +// Collect all property expressions for a given statement. class PropertyCollector final : public BoundStatementVisitor { public: expression_vector getProperties(); diff --git a/src/planner/plan/plan_copy.cpp b/src/planner/plan/plan_copy.cpp index c4fe93505c5..3f0fb909669 100644 --- a/src/planner/plan/plan_copy.cpp +++ b/src/planner/plan/plan_copy.cpp @@ -170,11 +170,16 @@ std::unique_ptr Planner::planCopyRdfFrom( std::unique_ptr Planner::planCopyTo(const BoundStatement& statement) { auto& boundCopy = ku_dynamic_cast(statement); auto regularQuery = boundCopy.getRegularQuery(); + std::vector columnNames; + std::vector columnTypes; + for (auto& column : regularQuery->getStatementResult()->getColumns()) { + columnNames.push_back(column->toString()); + columnTypes.push_back(column->dataType); + } KU_ASSERT(regularQuery->getStatementType() == StatementType::QUERY); auto plan = getBestPlan(*regularQuery); auto copyTo = make_shared(boundCopy.getFilePath(), boundCopy.getFileType(), - boundCopy.getColumnNames(), boundCopy.getColumnTypesRef(), - boundCopy.getCopyOption()->copy(), plan->getLastOperator()); + columnNames, columnTypes, boundCopy.getCopyOption()->copy(), plan->getLastOperator()); plan->setLastOperator(std::move(copyTo)); return plan; } diff --git a/test/test_files/common/types/null.test b/test/test_files/common/types/null.test new file mode 100644 index 00000000000..f66647a64d3 --- /dev/null +++ b/test/test_files/common/types/null.test @@ -0,0 +1,16 @@ +-GROUP IntervalTests +-DATASET CSV empty + +-- + +-CASE NullTest + +-STATEMENT CREATE NODE TABLE V1 (id UUID, PRIMARY KEY(id)); +---- ok +-STATEMENT CREATE NODE TABLE V2 (id INT64, PRIMARY KEY(id)); +---- ok +-STATEMENT WITH NULL as bid MATCH (b:V1 {id: bid}) RETURN b; +---- 0 + +-STATEMENT WITH NULL as bid MATCH (b:V2 {id: bid}) RETURN b; +---- 0 diff --git a/test/test_files/copy/copy_to_parquet.test b/test/test_files/copy/copy_to_parquet.test index 344abba4ad9..c855d84bb01 100644 --- a/test/test_files/copy/copy_to_parquet.test +++ b/test/test_files/copy/copy_to_parquet.test @@ -5,7 +5,6 @@ -CASE TinySnbCopyToParquet --CASE CopyPersonToParquet -STATEMENT COPY (MATCH (p:person) return p.ID, p.fName, p.gender, p.isStudent, p.isWorker, p.age, p.eyeSight, p.birthdate, p.registerTime, p.lastJobDuration, p.workedHours, p.usedNames, p.courseScoresPerTerm, p.height) to '${DATABASE_PATH}/tinysnb.parquet'; ---- ok -STATEMENT LOAD FROM '${DATABASE_PATH}/tinysnb.parquet' RETURN *; From 7da8a62d20bbacbbf96bbf3f45eca5a84d1f1c90 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Wed, 13 Mar 2024 13:05:16 +0400 Subject: [PATCH 026/136] Optimise Python unit test runtime (~7x speedup) (#3032) * Optimise Python unit test runtime (~7x speedup) * Do not cache database for all write tests; Workaround for Windows --------- Co-authored-by: Chang Liu --- tools/python_api/src_py/connection.py | 2 +- tools/python_api/src_py/query_result.py | 4 +- .../src_py/torch_geometric_feature_store.py | 19 +- tools/python_api/test/conftest.py | 48 ++++- tools/python_api/test/test_arrow.py | 12 +- tools/python_api/test/test_datatype.py | 198 +++++++++--------- tools/python_api/test/test_df.py | 28 +-- tools/python_api/test/test_exception.py | 12 +- tools/python_api/test/test_extension.py | 4 +- tools/python_api/test/test_get_header.py | 12 +- tools/python_api/test/test_networkx.py | 12 +- tools/python_api/test/test_parameter.py | 36 ++-- .../test/test_prepared_statement.py | 14 +- tools/python_api/test/test_query_result.py | 20 +- tools/python_api/test/test_scan_pandas.py | 10 +- tools/python_api/test/test_timeout.py | 4 +- tools/python_api/test/test_torch_geometric.py | 20 +- .../test_torch_geometric_remote_backend.py | 20 +- 18 files changed, 252 insertions(+), 223 deletions(-) diff --git a/tools/python_api/src_py/connection.py b/tools/python_api/src_py/connection.py index 4a8154325af..50f8f8cff18 100644 --- a/tools/python_api/src_py/connection.py +++ b/tools/python_api/src_py/connection.py @@ -155,7 +155,7 @@ def _get_rel_table_names(self) -> list[dict[str, Any]]: row = tables_result.get_next() if row[1] == "REL": name = row[0] - connections_result = self.execute("CALL show_connection('%s') RETURN *;" % name) + connections_result = self.execute(f"CALL show_connection({name!r}) RETURN *;") src_dst_row = connections_result.get_next() src_node = src_dst_row[0] dst_node = src_dst_row[1] diff --git a/tools/python_api/src_py/query_result.py b/tools/python_api/src_py/query_result.py index a2b88688f64..f91d8c28244 100644 --- a/tools/python_api/src_py/query_result.py +++ b/tools/python_api/src_py/query_result.py @@ -47,8 +47,8 @@ def __enter__(self) -> Self: def __exit__( self, exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, + exc_value: BaseException | None, + exc_traceback: TracebackType | None, ) -> None: self.close() diff --git a/tools/python_api/src_py/torch_geometric_feature_store.py b/tools/python_api/src_py/torch_geometric_feature_store.py index 6f5b6215891..149e49702c7 100644 --- a/tools/python_api/src_py/torch_geometric_feature_store.py +++ b/tools/python_api/src_py/torch_geometric_feature_store.py @@ -98,28 +98,29 @@ def __get_tensor_by_query(self, attr: TensorAttr) -> FeatureTensorType | None: self.__get_connection() - match_clause = "MATCH (item:%s)" % table_name - return_clause = "RETURN item.%s" % attr_name + match_clause = f"MATCH (item:{table_name})" + return_clause = f"RETURN item.{attr_name}" if indices is None: where_clause = "" elif isinstance(indices, int): - where_clause = "WHERE offset(id(item)) = %d" % indices + where_clause = f"WHERE offset(id(item)) = {indices}" elif isinstance(indices, slice): if indices.step is None or indices.step == 1: - where_clause = "WHERE offset(id(item)) >= %d AND offset(id(item)) < %d" % (indices.start, indices.stop) + where_clause = f"WHERE offset(id(item)) >= {indices.start} AND offset(id(item)) < {indices.stop}" else: where_clause = ( - "WHERE offset(id(item)) >= %d AND offset(id(item)) < %d AND (offset(id(item)) - %d) %% %d = 0" - % (indices.start, indices.stop, indices.start, indices.step) + f"WHERE offset(id(item)) >= {indices.start} AND offset(id(item)) < {indices.stop} " + f"AND (offset(id(item)) - {indices.start}) % {indices.step} = 0" ) elif isinstance(indices, (Tensor, list, np.ndarray, tuple)): where_clause = "WHERE" for i in indices: - where_clause += " offset(id(item)) = %d OR" % int(i) + where_clause += f" offset(id(item)) = {int(i)} OR" where_clause = where_clause[:-3] else: - raise ValueError("Invalid attr.index type: %s" % type(indices)) + msg = f"Invalid attr.index type: {type(indices)!s}" + raise ValueError(msg) query = f"{match_clause} {where_clause} {return_clause}" res = self.connection.execute(query) @@ -140,7 +141,7 @@ def _remove_tensor(self, attr: TensorAttr) -> bool: def _get_tensor_size(self, attr: TensorAttr) -> tuple[Any, ...]: self.__get_connection() - length_query = "MATCH (item:%s) RETURN count(item)" % attr.group_name + length_query = f"MATCH (item:{attr.group_name}) RETURN count(item)" res = self.connection.execute(length_query) length = res.get_next()[0] attr_info = self.__get_node_property(attr.group_name, attr.attr_name) diff --git a/tools/python_api/test/conftest.py b/tools/python_api/test/conftest.py index 94f8e4c819b..86fadae001a 100644 --- a/tools/python_api/test/conftest.py +++ b/tools/python_api/test/conftest.py @@ -3,6 +3,7 @@ import shutil import sys from pathlib import Path +from typing import TYPE_CHECKING import pytest from test_helper import KUZU_ROOT @@ -14,6 +15,9 @@ sys.path.append(str(python_build_dir)) import kuzu +if TYPE_CHECKING: + from type_aliases import ConnDB + def init_npy(conn: kuzu.Connection) -> None: conn.execute( @@ -125,16 +129,15 @@ def init_rdf(conn: kuzu.Connection) -> None: for script in scripts: with script.open(mode="r") as f: for line in f.readlines(): - line = line.strip() - if line: + if line := line.strip(): conn.execute(line) -@pytest.fixture() -def init_db(tmp_path: Path) -> Path: - if Path(tmp_path).exists(): - shutil.rmtree(tmp_path) - db = kuzu.Database(tmp_path) +def init_db(path: Path) -> Path: + if Path(path).exists(): + shutil.rmtree(path) + + db = kuzu.Database(path) conn = kuzu.Connection(db) init_tinysnb(conn) init_npy(conn) @@ -142,16 +145,39 @@ def init_db(tmp_path: Path) -> Path: init_long_str(conn) init_movie_serial(conn) init_rdf(conn) - return tmp_path + return path -@pytest.fixture() -def establish_connection(init_db: Path) -> tuple[kuzu.Connection, kuzu.Database]: - db = kuzu.Database(init_db, buffer_pool_size=256 * 1024 * 1024) +_READONLY_CONN_DB_: ConnDB | None = None +_POOL_SIZE_: int = 256 * 1024 * 1024 + + +def _create_conn_db(path: Path, *, read_only: bool) -> ConnDB: + """Return a new connection and database.""" + db = kuzu.Database(init_db(path), buffer_pool_size=_POOL_SIZE_, read_only=read_only) conn = kuzu.Connection(db, num_threads=4) return conn, db +@pytest.fixture() +def conn_db_readonly(tmp_path: Path) -> ConnDB: + """Return a cached read-only connection and database.""" + global _READONLY_CONN_DB_ + if _READONLY_CONN_DB_ is None: + # On Windows, the read-only mode is not implemented yet. + # Therefore, we create a writable database on Windows. + # However, the caller should ensure that the database is not modified. + # TODO: Remove this workaround when the read-only mode is implemented on Windows. + _READONLY_CONN_DB_ = _create_conn_db(tmp_path, read_only=sys.platform != "win32") + return _READONLY_CONN_DB_ + + +@pytest.fixture() +def conn_db_readwrite(tmp_path: Path) -> ConnDB: + """Return a new writable connection and database.""" + return _create_conn_db(tmp_path, read_only=False) + + @pytest.fixture() def build_dir() -> Path: return python_build_dir diff --git a/tools/python_api/test/test_arrow.py b/tools/python_api/test/test_arrow.py index eb324383e65..91697cdb794 100644 --- a/tools/python_api/test/test_arrow.py +++ b/tools/python_api/test/test_arrow.py @@ -103,8 +103,8 @@ def assert_col_names(data: Any, expected_col_names: list[str]) -> None: assert col_names == expected_col_names, f"Unexpected column names: {col_names!r}" -def test_to_arrow(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_to_arrow(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly def _test_person_table(_conn: kuzu.Connection, return_type: str, chunk_size: int | None = None) -> None: query = "MATCH (a:person) RETURN a.* ORDER BY a.ID" @@ -464,8 +464,8 @@ def _test_with_nulls(_conn: kuzu.Connection, return_type: str, chunk_size: int | _test_with_nulls(conn, "pl") -def test_to_arrow_complex(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_to_arrow_complex(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly def _test_node(_conn: kuzu.Connection) -> None: query = "MATCH (p:person) RETURN p ORDER BY p.ID" @@ -550,8 +550,8 @@ def _test_marries_table(_conn: kuzu.Connection) -> None: # _test_node_rel(conn) # _test_marries_table(conn) - def test_to_arrow1(establish_connection: ConnDB) -> None: - conn, db = establish_connection + def test_to_arrow1(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly query = "MATCH (a:person)-[e:knows]->(:person) RETURN e.summary" arrow_tbl = conn.execute(query).get_as_arrow(8) assert arrow_tbl == [] diff --git a/tools/python_api/test/test_datatype.py b/tools/python_api/test/test_datatype.py index ae7b486e55d..7688be736c5 100644 --- a/tools/python_api/test/test_datatype.py +++ b/tools/python_api/test/test_datatype.py @@ -7,8 +7,8 @@ from type_aliases import ConnDB -def test_bool(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_bool(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.isStudent;") assert result.has_next() assert result.get_next() == [True] @@ -16,8 +16,8 @@ def test_bool(establish_connection: ConnDB) -> None: result.close() -def test_int(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_int(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.age;") assert result.has_next() assert result.get_next() == [35] @@ -25,8 +25,8 @@ def test_int(establish_connection: ConnDB) -> None: result.close() -def test_int8(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_int8(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.level;") assert result.has_next() assert result.get_next() == [5] @@ -34,8 +34,8 @@ def test_int8(establish_connection: ConnDB) -> None: result.close() -def test_uint8(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_uint8(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.ulevel;") assert result.has_next() assert result.get_next() == [250] @@ -43,8 +43,8 @@ def test_uint8(establish_connection: ConnDB) -> None: result.close() -def test_uint16(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_uint16(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.ulength;") assert result.has_next() assert result.get_next() == [33768] @@ -52,8 +52,8 @@ def test_uint16(establish_connection: ConnDB) -> None: result.close() -def test_uint32(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_uint32(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.temprature;") assert result.has_next() assert result.get_next() == [32800] @@ -61,8 +61,8 @@ def test_uint32(establish_connection: ConnDB) -> None: result.close() -def test_uint64(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_uint64(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.code;") assert result.has_next() assert result.get_next() == [9223372036854775808] @@ -70,8 +70,8 @@ def test_uint64(establish_connection: ConnDB) -> None: result.close() -def test_int128(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_int128(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) -[r:studyAt]-> (b:organisation) WHERE r.length = 5 RETURN r.hugedata;") assert result.has_next() assert result.get_next() == [1844674407370955161811111111] @@ -79,8 +79,8 @@ def test_int128(establish_connection: ConnDB) -> None: result.close() -def test_serial(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_serial(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:moviesSerial) WHERE a.ID = 2 RETURN a.ID;") assert result.has_next() assert result.get_next() == [2] @@ -88,8 +88,8 @@ def test_serial(establish_connection: ConnDB) -> None: result.close() -def test_double(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_double(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.eyeSight;") assert result.has_next() assert result.get_next() == [5.0] @@ -97,8 +97,8 @@ def test_double(establish_connection: ConnDB) -> None: result.close() -def test_string(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_string(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.fName;") assert result.has_next() assert result.get_next() == ["Alice"] @@ -106,8 +106,8 @@ def test_string(establish_connection: ConnDB) -> None: result.close() -def test_blob(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_blob(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("RETURN BLOB('\\\\xAA\\\\xBB\\\\xCD\\\\x1A')") assert result.has_next() result_blob = result.get_next()[0] @@ -120,8 +120,8 @@ def test_blob(establish_connection: ConnDB) -> None: result.close() -def test_uuid(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_uuid(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("RETURN UUID('A0EEBC99-9c0b-4ef8-bb6d-6bb9bd380a12')") assert result.has_next() assert result.get_next() == [UUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12")] @@ -129,8 +129,8 @@ def test_uuid(establish_connection: ConnDB) -> None: result.close() -def test_date(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_date(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.birthdate;") assert result.has_next() assert result.get_next() == [datetime.date(1900, 1, 1)] @@ -138,8 +138,8 @@ def test_date(establish_connection: ConnDB) -> None: result.close() -def test_timestamp(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_timestamp(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.registerTime;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30)] @@ -147,8 +147,8 @@ def test_timestamp(establish_connection: ConnDB) -> None: result.close() -def test_timestamp_tz(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_timestamp_tz(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_tz;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30, 123456, pytz.UTC)] @@ -156,8 +156,8 @@ def test_timestamp_tz(establish_connection: ConnDB) -> None: result.close() -def test_timestamp_ns(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_timestamp_ns(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_ns;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30, 123456)] @@ -165,8 +165,8 @@ def test_timestamp_ns(establish_connection: ConnDB) -> None: result.close() -def test_timestamp_ms(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_timestamp_ms(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_ms;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30, 123000)] @@ -174,8 +174,8 @@ def test_timestamp_ms(establish_connection: ConnDB) -> None: result.close() -def test_timestamp_s(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_timestamp_s(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:movies) WHERE a.length = 126 RETURN a.description.release_sec;") assert result.has_next() assert result.get_next() == [datetime.datetime(2011, 8, 20, 11, 25, 30)] @@ -183,8 +183,8 @@ def test_timestamp_s(establish_connection: ConnDB) -> None: result.close() -def test_interval(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_interval(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.lastJobDuration;") assert result.has_next() assert result.get_next() == [datetime.timedelta(days=1082, seconds=46920)] @@ -192,8 +192,8 @@ def test_interval(establish_connection: ConnDB) -> None: result.close() -def test_list(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_list(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a.courseScoresPerTerm;") assert result.has_next() assert result.get_next() == [[[10, 8], [6, 7, 8]]] @@ -201,8 +201,8 @@ def test_list(establish_connection: ConnDB) -> None: result.close() -def test_map(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_map(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (m:movies) WHERE m.length = 2544 RETURN m.audience;") assert result.has_next() assert result.get_next() == [{"audience1": 33}] @@ -210,8 +210,8 @@ def test_map(establish_connection: ConnDB) -> None: result.close() -def test_union(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_union(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (m:movies) WHERE m.length = 2544 RETURN m.grade;") assert result.has_next() assert result.get_next() == [8.989] @@ -219,8 +219,8 @@ def test_union(establish_connection: ConnDB) -> None: result.close() -def test_node(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_node(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.has_next() n = result.get_next() @@ -241,8 +241,8 @@ def test_node(establish_connection: ConnDB) -> None: result.close() -def test_rel(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_rel(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (p:person)-[r:workAt]->(o:organisation) WHERE p.ID = 5 RETURN p, r, o") assert result.has_next() n = result.get_next() @@ -262,8 +262,8 @@ def test_rel(establish_connection: ConnDB) -> None: result.close() -def test_struct(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_struct(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute('MATCH (m:movies) WHERE m.name="Roma" RETURN m.description') assert result.has_next() n = result.get_next() @@ -288,8 +288,8 @@ def test_struct(establish_connection: ConnDB) -> None: result.close() -def test_recursive_rel(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_recursive_rel(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person)-[e:studyAt*1..1]->(b:organisation) WHERE a.fName = 'Alice' RETURN e;") assert result.has_next() n = result.get_next() @@ -319,46 +319,50 @@ def test_recursive_rel(establish_connection: ConnDB) -> None: result.close() -def test_rdf_variant(establish_connection: ConnDB) -> None: - conn, db = establish_connection - result = conn.execute("MATCH (a:T_l) RETURN a.val ORDER BY a.id") - assert result.has_next() - assert result.get_next() == [12] - assert result.has_next() - assert result.get_next() == [43] - assert result.has_next() - assert result.get_next() == [33] - assert result.has_next() - assert result.get_next() == [2] - assert result.has_next() - assert result.get_next() == [90] - assert result.has_next() - assert result.get_next() == [77] - assert result.has_next() - assert result.get_next() == [12] - assert result.has_next() - assert result.get_next() == [1] - assert result.has_next() - float_result = result.get_next()[0] - assert abs(float_result - 4.4) < 0.00001 - assert result.has_next() - float_result = result.get_next()[0] - assert abs(float_result - 1.2) < 0.00001 - assert result.has_next() - assert result.get_next() == [True] - assert result.has_next() - assert result.get_next() == ["hhh"] - assert result.has_next() - assert result.get_next() == [datetime.date(2024, 1, 1)] - assert result.has_next() - assert result.get_next() == [datetime.datetime(2024, 1, 1, 11, 25, 30)] - assert result.has_next() - assert result.get_next() == [datetime.timedelta(days=2)] - assert result.has_next() - result_blob = result.get_next()[0] - assert len(result_blob) == 1 - assert result_blob[0] == 0xB2 - assert not result.has_next() - result.close() - result = conn.execute("DROP RDFGraph T;") - result.close() +def test_rdf_variant(conn_db_readwrite: ConnDB) -> None: + conn, db = conn_db_readwrite + + with conn.execute("MATCH (a:T_l) RETURN a.val ORDER BY a.id") as result: + assert result.has_next() + assert result.get_next() == [12] + assert result.has_next() + assert result.get_next() == [43] + assert result.has_next() + assert result.get_next() == [33] + assert result.has_next() + assert result.get_next() == [2] + assert result.has_next() + assert result.get_next() == [90] + assert result.has_next() + assert result.get_next() == [77] + assert result.has_next() + assert result.get_next() == [12] + assert result.has_next() + assert result.get_next() == [1] + assert result.has_next() + + float_result = result.get_next()[0] + assert abs(float_result - 4.4) < 0.00001 + assert result.has_next() + + float_result = result.get_next()[0] + assert abs(float_result - 1.2) < 0.00001 + assert result.has_next() + assert result.get_next() == [True] + assert result.has_next() + assert result.get_next() == ["hhh"] + assert result.has_next() + assert result.get_next() == [datetime.date(2024, 1, 1)] + assert result.has_next() + assert result.get_next() == [datetime.datetime(2024, 1, 1, 11, 25, 30)] + assert result.has_next() + assert result.get_next() == [datetime.timedelta(days=2)] + assert result.has_next() + + result_blob = result.get_next()[0] + assert len(result_blob) == 1 + assert result_blob[0] == 0xB2 + assert not result.has_next() + + with conn.execute("DROP RDFGraph T;") as result: + result.close() diff --git a/tools/python_api/test/test_df.py b/tools/python_api/test/test_df.py index 0e97c598a09..34293aba2f4 100644 --- a/tools/python_api/test/test_df.py +++ b/tools/python_api/test/test_df.py @@ -12,8 +12,8 @@ from type_aliases import ConnDB -def test_to_df(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_to_df(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly def _test_person_to_df(conn: kuzu.Connection) -> None: query = "MATCH (p:person) return p.* ORDER BY p.ID" @@ -249,8 +249,8 @@ def _test_movies_to_df(conn: kuzu.Connection) -> None: _test_timestamps_to_df(conn) -def test_df_multiple_times(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_df_multiple_times(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly query = "MATCH (p:person) return p.ID ORDER BY p.ID" res = conn.execute(query) df = res.get_as_df() @@ -261,8 +261,8 @@ def test_df_multiple_times(establish_connection: ConnDB) -> None: assert df_3["p.ID"].tolist() == [0, 2, 3, 5, 7, 8, 9, 10] -def test_df_get_node(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_df_get_node(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly query = "MATCH (p:person) return p" res = conn.execute(query) @@ -362,8 +362,8 @@ def test_df_get_node(establish_connection: ConnDB) -> None: assert p[key] == ground_truth[key][i] -def test_df_get_node_rel(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_df_get_node_rel(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly res = conn.execute("MATCH (p:person)-[r:workAt]->(o:organisation) RETURN p, r, o ORDER BY p.fName") df = res.get_as_df() @@ -437,8 +437,8 @@ def test_df_get_node_rel(establish_connection: ConnDB) -> None: assert df["r"][i]["_dst"] == df["o"][i]["_id"] -def test_df_get_recursive_join(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_df_get_recursive_join(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly res = conn.execute( "MATCH (p:person)-[r:knows*1..2 (e, n | WHERE e.comments = ['rnme','m8sihsdnf2990nfiwf'])]-(m:person) WHERE " "p.ID = 0 and m.ID = 0 RETURN r" @@ -507,8 +507,8 @@ def test_df_get_recursive_join(establish_connection: ConnDB) -> None: } -def test_get_rdf_variant(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_get_rdf_variant(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly res = conn.execute("MATCH (a:T_l) RETURN a.val ORDER BY a.id").get_as_df() assert res["a.val"].tolist() == [ 12, @@ -530,8 +530,8 @@ def test_get_rdf_variant(establish_connection: ConnDB) -> None: ] -def test_get_df_unicode(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_get_df_unicode(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly res = conn.execute("MATCH (m:movies) RETURN m.name").get_as_df() assert res["m.name"].tolist() == [ "Sóló cón tu párejâ", diff --git a/tools/python_api/test/test_exception.py b/tools/python_api/test/test_exception.py index 1c964664a8d..16fb9fdaea5 100644 --- a/tools/python_api/test/test_exception.py +++ b/tools/python_api/test/test_exception.py @@ -7,8 +7,8 @@ from type_aliases import ConnDB -def test_exception(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_exception(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Parameter asd not found."): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", {"asd": 1}) @@ -27,11 +27,11 @@ def test_db_path_exception() -> None: kuzu.Database(path) -def test_read_only_exception(establish_connection: ConnDB) -> None: +def test_read_only_exception(conn_db_readonly: ConnDB) -> None: # TODO: Enable this test on Windows when the read-only mode is implemented. if sys.platform == "win32": pytest.skip("Read-only mode has not been implemented on Windows yet") - _, db = establish_connection + _, db = conn_db_readonly path = db.database_path read_only_db = kuzu.Database(path, read_only=True) conn = kuzu.Connection(read_only_db) @@ -56,7 +56,7 @@ def test_buffer_pool_size_exception() -> None: kuzu.Database("test.db", buffer_pool_size=1024) -def test_query_exception(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_query_exception(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Binder exception: Table nonexisting does not exist."): conn.execute("MATCH (a:nonexisting) RETURN a;") diff --git a/tools/python_api/test/test_extension.py b/tools/python_api/test/test_extension.py index a936a8436b2..ad2a3e5eb7e 100644 --- a/tools/python_api/test/test_extension.py +++ b/tools/python_api/test/test_extension.py @@ -3,7 +3,7 @@ from type_aliases import ConnDB -def test_install_and_load_httpfs(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_install_and_load_httpfs(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly conn.execute("INSTALL httpfs") conn.execute("LOAD EXTENSION httpfs") diff --git a/tools/python_api/test/test_get_header.py b/tools/python_api/test/test_get_header.py index c4c9de6cd47..89570ed98a9 100644 --- a/tools/python_api/test/test_get_header.py +++ b/tools/python_api/test/test_get_header.py @@ -3,8 +3,8 @@ from type_aliases import ConnDB -def test_get_column_names(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_get_column_names(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with conn.execute("MATCH (a:person)-[e:knows]->(b:person) RETURN a.fName, e.date, b.ID;") as result: column_names = result.get_column_names() assert column_names[0] == "a.fName" @@ -12,8 +12,8 @@ def test_get_column_names(establish_connection: ConnDB) -> None: assert column_names[2] == "b.ID" -def test_get_column_data_types(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_get_column_data_types(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with conn.execute( "MATCH (p:person) RETURN p.ID, p.fName, p.isStudent, p.eyeSight, p.birthdate, p.registerTime, " "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;" @@ -30,8 +30,8 @@ def test_get_column_data_types(establish_connection: ConnDB) -> None: assert column_data_types[8] == "INT64[][]" -def test_get_schema(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_get_schema(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with conn.execute( "MATCH (p:person) RETURN p.ID, p.fName, p.isStudent, p.eyeSight, p.birthdate, p.registerTime, " "p.lastJobDuration, p.workedHours, p.courseScoresPerTerm;" diff --git a/tools/python_api/test/test_networkx.py b/tools/python_api/test/test_networkx.py index 46fbac7da21..103a9eaaf93 100644 --- a/tools/python_api/test/test_networkx.py +++ b/tools/python_api/test/test_networkx.py @@ -7,8 +7,8 @@ from type_aliases import ConnDB -def test_to_networkx_node(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_to_networkx_node(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly query = "MATCH (p:person) return p" res = conn.execute(query) @@ -101,8 +101,8 @@ def test_to_networkx_node(establish_connection: ConnDB) -> None: assert node[key] == ground_truth[key][i] -def test_networkx_undirected(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_networkx_undirected(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly res = conn.execute("MATCH (p1:person)-[r:knows]->(p2:person) WHERE p1.ID <= 3 RETURN p1, r, p2") nx_graph = res.get_as_networkx(directed=False) @@ -213,8 +213,8 @@ def test_networkx_undirected(establish_connection: ConnDB) -> None: assert nx_graph.has_edge(nodes[i][0], nodes[j][0]) -def test_networkx_directed(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_networkx_directed(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly res = conn.execute("MATCH (p:person)-[r:workAt]->(o:organisation) RETURN p, r, o") nx_graph = res.get_as_networkx(directed=True) diff --git a/tools/python_api/test/test_parameter.py b/tools/python_api/test/test_parameter.py index 7509fa4e507..9a0452a6349 100644 --- a/tools/python_api/test/test_parameter.py +++ b/tools/python_api/test/test_parameter.py @@ -6,8 +6,8 @@ from type_aliases import ConnDB -def test_bool_param(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_bool_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute( "MATCH (a:person) WHERE a.isStudent = $1 AND a.isWorker = $k RETURN COUNT(*)", {"1": False, "k": False} ) @@ -17,8 +17,8 @@ def test_bool_param(establish_connection: ConnDB) -> None: result.close() -def test_int_param(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_int_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.age < $AGE RETURN COUNT(*)", {"AGE": 1}) assert result.has_next() assert result.get_next() == [0] @@ -26,8 +26,8 @@ def test_int_param(establish_connection: ConnDB) -> None: result.close() -def test_double_param(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_double_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.eyeSight = $E RETURN COUNT(*)", {"E": 5.0}) assert result.has_next() assert result.get_next() == [2] @@ -35,8 +35,8 @@ def test_double_param(establish_connection: ConnDB) -> None: result.close() -def test_str_param(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_str_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN concat(a.fName, $S);", {"S": "HH"}) assert result.has_next() assert result.get_next() == ["AliceHH"] @@ -44,8 +44,8 @@ def test_str_param(establish_connection: ConnDB) -> None: result.close() -def test_date_param(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_date_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.birthdate = $1 RETURN COUNT(*);", {"1": datetime.date(1900, 1, 1)}) assert result.has_next() assert result.get_next() == [2] @@ -53,8 +53,8 @@ def test_date_param(establish_connection: ConnDB) -> None: result.close() -def test_timestamp_param(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_timestamp_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute( "MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", {"1": datetime.datetime(2011, 8, 20, 11, 25, 30)}, @@ -65,19 +65,19 @@ def test_timestamp_param(establish_connection: ConnDB) -> None: result.close() -def test_param_error1(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_param_error1(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Parameter name must be of type string but got "): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", {1: 1}) -def test_param_error2(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_param_error2(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Parameters must be a dict"): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", ["asd"]) -def test_param_error3(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_param_error3(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Parameters must be a dict"): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", [("asd", 1, 1)]) diff --git a/tools/python_api/test/test_prepared_statement.py b/tools/python_api/test/test_prepared_statement.py index b234a46a18a..dc057d13650 100644 --- a/tools/python_api/test/test_prepared_statement.py +++ b/tools/python_api/test/test_prepared_statement.py @@ -6,8 +6,8 @@ from type_aliases import ConnDB -def test_read(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_read(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly prepared_statement = conn.prepare("MATCH (a:person) WHERE a.isStudent = $1 AND a.isWorker = $k RETURN COUNT(*)") assert prepared_statement.is_success() assert prepared_statement.get_error_message() == "" @@ -33,8 +33,8 @@ def test_read(establish_connection: ConnDB) -> None: assert not result.has_next() -def test_write(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_write(conn_db_readwrite: ConnDB) -> None: + conn, _ = conn_db_readwrite orgs = [ { "ID": 1001, @@ -99,11 +99,11 @@ def test_write(establish_connection: ConnDB) -> None: assert result.get_next() == [uuid.uuid5(uuid.NAMESPACE_DNS, "kuzu")] -def test_error(establish_connection: ConnDB) -> None: - prepared_statement = establish_connection[0].prepare("MATCH (d:dog) WHERE d.isServiceDog = $1 RETURN COUNT(*)") +def test_error(conn_db_readonly: ConnDB) -> None: + prepared_statement = conn_db_readonly[0].prepare("MATCH (d:dog) WHERE d.isServiceDog = $1 RETURN COUNT(*)") assert not prepared_statement.is_success() assert prepared_statement.get_error_message() == "Binder exception: Table dog does not exist." - prepared_statement = establish_connection[0].prepare("SELECT * FROM person") + prepared_statement = conn_db_readonly[0].prepare("SELECT * FROM person") assert not prepared_statement.is_success() assert prepared_statement.get_error_message().startswith("Parser exception: extraneous input 'SELECT'") diff --git a/tools/python_api/test/test_query_result.py b/tools/python_api/test/test_query_result.py index 169488f37dd..372fcb358e0 100644 --- a/tools/python_api/test/test_query_result.py +++ b/tools/python_api/test/test_query_result.py @@ -3,36 +3,36 @@ from type_aliases import ConnDB -def test_get_execution_time(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_get_execution_time(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_execution_time() > 0 result.close() -def test_get_compiling_time(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_get_compiling_time(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_compiling_time() > 0 result.close() -def test_get_num_tuples(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_get_num_tuples(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_num_tuples() == 1 result.close() -def test_explain(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_explain(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly result = conn.execute("EXPLAIN MATCH (a:person) WHERE a.ID = 0 RETURN a") assert result.get_num_tuples() == 1 result.close() -def test_context_manager(establish_connection: ConnDB) -> None: - conn, db = establish_connection +def test_context_manager(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly with conn.execute("MATCH (a:person) WHERE a.ID = 0 RETURN a") as result: assert result.get_num_tuples() == 1 assert result.get_compiling_time() > 0 diff --git a/tools/python_api/test/test_scan_pandas.py b/tools/python_api/test/test_scan_pandas.py index ca3904b0d42..15ed188c43a 100644 --- a/tools/python_api/test/test_scan_pandas.py +++ b/tools/python_api/test/test_scan_pandas.py @@ -316,19 +316,17 @@ def test_pandas_scan_demo(tmp_path: Path) -> None: assert np.all(result["p.height"].to_list() == height_in_cm) assert np.all(result["p.is_student"].to_list() == is_student) + def test_scan_pandas_copy_subquery(tmp_path: Path) -> None: db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) - data = { - 'id': np.array([22, 3, 100], dtype=np.int64), - 'name': ['A', 'B', 'C'] - } + data = {"id": np.array([22, 3, 100], dtype=np.int64), "name": ["A", "B", "C"]} df = pd.DataFrame(data) conn.execute("CREATE NODE TABLE person(ID INT64, NAME STRING, PRIMARY KEY(ID))") conn.execute("COPY person FROM (LOAD FROM df RETURN *)") result = conn.execute("MATCH (p:person) RETURN p.*").get_as_df() - assert result['p.ID'].to_list() == [22, 3, 100] - assert result['p.NAME'].to_list() == ['A', 'B', 'C'] + assert result["p.ID"].to_list() == [22, 3, 100] + assert result["p.NAME"].to_list() == ["A", "B", "C"] def test_scan_all_null(tmp_path: Path) -> None: diff --git a/tools/python_api/test/test_timeout.py b/tools/python_api/test/test_timeout.py index 9a74fbd5da9..683aef30b71 100644 --- a/tools/python_api/test/test_timeout.py +++ b/tools/python_api/test/test_timeout.py @@ -4,8 +4,8 @@ from type_aliases import ConnDB -def test_timeout(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_timeout(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly conn.set_query_timeout(1000) with pytest.raises(RuntimeError, match="Interrupted."): conn.execute("MATCH (a:person)-[:knows*1..28]->(b:person) RETURN COUNT(*);") diff --git a/tools/python_api/test/test_torch_geometric.py b/tools/python_api/test/test_torch_geometric.py index dd572498de9..cd4a14f948c 100644 --- a/tools/python_api/test/test_torch_geometric.py +++ b/tools/python_api/test/test_torch_geometric.py @@ -7,8 +7,8 @@ from type_aliases import ConnDB -def test_to_torch_geometric_nodes_only(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_to_torch_geometric_nodes_only(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly query = "MATCH (p:person) return p" res = conn.execute(query) @@ -115,8 +115,8 @@ def test_to_torch_geometric_nodes_only(establish_connection: ConnDB) -> None: ) -def test_to_torch_geometric_homogeneous_graph(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_to_torch_geometric_homogeneous_graph(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly query = "MATCH (p:person)-[r:knows]->(q:person) RETURN p, r, q" res = conn.execute(query) @@ -273,8 +273,8 @@ def test_to_torch_geometric_homogeneous_graph(establish_connection: ConnDB) -> N ) -def test_to_torch_geometric_heterogeneous_graph(establish_connection: ConnDB) -> None: - conn, _ = establish_connection +def test_to_torch_geometric_heterogeneous_graph(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly query = "MATCH (p:person)-[r1:knows]->(q:person)-[r2:workAt]->(o:organisation) RETURN p, q, o, r1, r2" res = conn.execute(query) @@ -536,9 +536,9 @@ def test_to_torch_geometric_heterogeneous_graph(establish_connection: ConnDB) -> def test_to_torch_geometric_multi_dimensional_lists( - establish_connection: ConnDB, + conn_db_readonly: ConnDB, ) -> None: - conn, _ = establish_connection + conn, _ = conn_db_readonly query = "MATCH (t:tensor) RETURN t" res = conn.execute(query) @@ -588,9 +588,9 @@ def test_to_torch_geometric_multi_dimensional_lists( def test_to_torch_geometric_no_properties_converted( - establish_connection: ConnDB, + conn_db_readonly: ConnDB, ) -> None: - conn, _ = establish_connection + conn, _ = conn_db_readonly query = "MATCH (p:personLongString)-[r:knowsLongString]->(q:personLongString) RETURN p, r, q" res = conn.execute(query) diff --git a/tools/python_api/test/test_torch_geometric_remote_backend.py b/tools/python_api/test/test_torch_geometric_remote_backend.py index 618ed0a6be6..ccd90288e69 100644 --- a/tools/python_api/test/test_torch_geometric_remote_backend.py +++ b/tools/python_api/test/test_torch_geometric_remote_backend.py @@ -18,8 +18,8 @@ TINY_SNB_PERSON_IDS_GROUND_TRUTH = [0, 2, 3, 5, 7, 8, 9, 10] -def test_remote_backend_graph_store(establish_connection: ConnDB) -> None: - _, db = establish_connection +def test_remote_backend_graph_store(conn_db_readonly: ConnDB) -> None: + _, db = conn_db_readonly fs, gs = db.get_torch_geometric_remote_backend() edge_idx = gs.get_edge_index(("person", "knows", "person"), layout="coo", is_sorted=False) assert edge_idx.shape == torch.Size([2, 14]) @@ -32,8 +32,8 @@ def test_remote_backend_graph_store(establish_connection: ConnDB) -> None: assert dst_id in TINY_SNB_KNOWS_GROUND_TRUTH[src_id] -def test_remote_backend_feature_store_idx(establish_connection: ConnDB) -> None: - _, db = establish_connection +def test_remote_backend_feature_store_idx(conn_db_readonly: ConnDB) -> None: + _, db = conn_db_readonly fs, _ = db.get_torch_geometric_remote_backend() id_set = set(TINY_SNB_PERSON_IDS_GROUND_TRUTH) index_to_id = {} @@ -63,8 +63,8 @@ def test_remote_backend_feature_store_idx(establish_connection: ConnDB) -> None: assert ids[i].item() == index_to_id[i] -def test_remote_backend_feature_store_types_1d(establish_connection: ConnDB) -> None: - _, db = establish_connection +def test_remote_backend_feature_store_types_1d(conn_db_readonly: ConnDB) -> None: + _, db = conn_db_readonly fs, _ = db.get_torch_geometric_remote_backend() for i in range(3): assert fs["npyoned", "i64", i].item() - i == 1 @@ -74,8 +74,8 @@ def test_remote_backend_feature_store_types_1d(establish_connection: ConnDB) -> assert fs["npyoned", "f32", i].item() - i - 1 < 1e-6 -def test_remote_backend_feature_store_types_2d(establish_connection: ConnDB) -> None: - _, db = establish_connection +def test_remote_backend_feature_store_types_2d(conn_db_readonly: ConnDB) -> None: + _, db = conn_db_readonly fs, _ = db.get_torch_geometric_remote_backend() for i in range(3): i64 = fs["npytwod", "i64", i] @@ -101,8 +101,8 @@ def test_remote_backend_feature_store_types_2d(establish_connection: ConnDB) -> assert f32[0, j].item() - (base_number + j) - 1 < 1e-6 -def test_remote_backend_20k(establish_connection: ConnDB) -> None: - _, db = establish_connection +def test_remote_backend_20k(conn_db_readwrite: ConnDB) -> None: + _, db = conn_db_readwrite conn = kuzu.Connection(db, num_threads=1) conn.execute("CREATE NODE TABLE npy20k (id INT64,f32 FLOAT[10],PRIMARY KEY(id));") conn.execute( From 7c16897d8c0063e1e20d6270e0c4c9335a9de8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Wed, 13 Mar 2024 20:01:23 +0800 Subject: [PATCH 027/136] Add more parameter types for Node.js API (#3037) * Add more parameter types for Node.js API * Fix gcc compile error --- tools/nodejs_api/src_cpp/node_util.cpp | 77 +++++++-- tools/nodejs_api/src_js/connection.js | 5 +- tools/nodejs_api/test/test_connection.js | 2 +- tools/nodejs_api/test/test_parameter.js | 192 ++++++++++++++++++++++- 4 files changed, 256 insertions(+), 20 deletions(-) diff --git a/tools/nodejs_api/src_cpp/node_util.cpp b/tools/nodejs_api/src_cpp/node_util.cpp index c4573778d51..51c5ca41343 100644 --- a/tools/nodejs_api/src_cpp/node_util.cpp +++ b/tools/nodejs_api/src_cpp/node_util.cpp @@ -310,11 +310,11 @@ Value Util::TransformNapiValue( case LogicalTypeID::BOOL: { return Value(napiValue.ToBoolean().Value()); } - case LogicalTypeID::INT16: { + case LogicalTypeID::INT64: { if (!napiValue.IsNumber()) { throw Exception("Expected a number for parameter " + key + "."); } - int16_t val = napiValue.ToNumber().Int32Value(); + int64_t val = napiValue.ToNumber().Int64Value(); return Value(val); } case LogicalTypeID::INT32: { @@ -324,18 +324,65 @@ Value Util::TransformNapiValue( int32_t val = napiValue.ToNumber().Int32Value(); return Value(val); } - case LogicalTypeID::INT64: { + case LogicalTypeID::INT16: { if (!napiValue.IsNumber()) { throw Exception("Expected a number for parameter " + key + "."); } - int64_t val = napiValue.ToNumber().Int64Value(); + int16_t val = napiValue.ToNumber().Int32Value(); return Value(val); } - case LogicalTypeID::FLOAT: { + case LogicalTypeID::INT8: { if (!napiValue.IsNumber()) { throw Exception("Expected a number for parameter " + key + "."); } - float val = napiValue.ToNumber().FloatValue(); + int8_t val = napiValue.ToNumber().Int32Value(); + return Value(val); + } + case LogicalTypeID::UINT64: { + if (!napiValue.IsNumber()) { + throw Exception("Expected a number for parameter " + key + "."); + } + auto valStr = napiValue.ToNumber().ToString(); + uint64_t val = std::stoull(valStr); + return Value(val); + } + case LogicalTypeID::UINT32: { + if (!napiValue.IsNumber()) { + throw Exception("Expected a number for parameter " + key + "."); + } + uint32_t val = napiValue.ToNumber().Uint32Value(); + return Value(val); + } + case LogicalTypeID::UINT16: { + if (!napiValue.IsNumber()) { + throw Exception("Expected a number for parameter " + key + "."); + } + uint16_t val = napiValue.ToNumber().Uint32Value(); + return Value(val); + } + case LogicalTypeID::UINT8: { + if (!napiValue.IsNumber()) { + throw Exception("Expected a number for parameter " + key + "."); + } + uint8_t val = napiValue.ToNumber().Uint32Value(); + return Value(val); + } + case LogicalTypeID::INT128: { + if (!napiValue.IsBigInt()) { + throw Exception("Expected a BigInt for parameter " + key + "."); + } + auto bigInt = napiValue.As(); + size_t wordsCount = bigInt.WordCount(); + std::unique_ptr words(new uint64_t[wordsCount]); + int signBit; + bigInt.ToWords(&signBit, &wordsCount, words.get()); + kuzu::common::int128_t val; + val.low = words[0]; + val.high = words[1]; + // Ignore words[2] and beyond as we only support 128-bit integers but BigInt can be larger. + if (signBit) { + kuzu::common::Int128_t::negateInPlace(val); + } return Value(val); } case LogicalTypeID::DOUBLE: { @@ -345,9 +392,12 @@ Value Util::TransformNapiValue( double val = napiValue.ToNumber().DoubleValue(); return Value(val); } - case LogicalTypeID::STRING: { - std::string val = napiValue.ToString().Utf8Value(); - return Value(LogicalType::STRING(), val); + case LogicalTypeID::FLOAT: { + if (!napiValue.IsNumber()) { + throw Exception("Expected a number for parameter " + key + "."); + } + float val = napiValue.ToNumber().FloatValue(); + return Value(val); } case LogicalTypeID::DATE: { if (!napiValue.IsDate()) { @@ -416,6 +466,15 @@ Value Util::TransformNapiValue( auto normalizedInterval = interval_t(normalizedMonths, normalizedDays, normalizedMicros); return Value(normalizedInterval); } + case LogicalTypeID::STRING: { + std::string val = napiValue.ToString().Utf8Value(); + return Value(LogicalType::STRING(), val); + } + case LogicalTypeID::UUID: { + std::string stringVal = napiValue.ToString().Utf8Value(); + auto val = UUID::fromString(stringVal); + return Value(val); + } default: throw Exception( "Unsupported type " + expectedDataType->toString() + " for parameter: " + key); diff --git a/tools/nodejs_api/src_js/connection.js b/tools/nodejs_api/src_js/connection.js index 56f92ef2d36..05ff41ccf14 100644 --- a/tools/nodejs_api/src_js/connection.js +++ b/tools/nodejs_api/src_js/connection.js @@ -116,13 +116,14 @@ class Connection { typeof value === "boolean" || typeof value === "number" || typeof value === "string" || - (typeof value === "object" && value.constructor.name === "Date") + (typeof value === "object" && value.constructor.name === "Date") || + typeof value === "bigint" ) { paramArray.push([key, value]); } else { return reject( new Error( - "The value of each parameter must be a boolean, number, string, or Date object." + "The value of each parameter must be a boolean, number, string, Date or BigInt." ) ); } diff --git a/tools/nodejs_api/test/test_connection.js b/tools/nodejs_api/test/test_connection.js index 3454ba51262..3f2a4628001 100644 --- a/tools/nodejs_api/test/test_connection.js +++ b/tools/nodejs_api/test/test_connection.js @@ -133,7 +133,7 @@ describe("Execute", function () { } catch (e) { assert.equal( e.message, - "The value of each parameter must be a boolean, number, string, or Date object." + "The value of each parameter must be a boolean, number, string, Date or BigInt." ); } }); diff --git a/tools/nodejs_api/test/test_parameter.js b/tools/nodejs_api/test/test_parameter.js index 1db1276683c..d8ebd9b5f8b 100644 --- a/tools/nodejs_api/test/test_parameter.js +++ b/tools/nodejs_api/test/test_parameter.js @@ -152,6 +152,169 @@ describe("INT16", function () { }); }); +describe("INT8", function () { + it("should transform number as INT8 parameter", async function () { + const preparedStatement = await conn.prepare( + "MATCH (m:movies) WHERE m.description.stars > $1 RETURN COUNT(*)" + ); + const queryResult = await conn.execute(preparedStatement, { + 1: 10, + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["COUNT_STAR()"], 1); + }); + + it("should reject other type as INT8 parameter", async function () { + const preparedStatement = await conn.prepare( + "MATCH (m:movies) WHERE m.description.stars > $1 RETURN COUNT(*)" + ); + try { + await conn.execute(preparedStatement, { + 1: "4", + }); + } catch (e) { + assert.equal(e.message, "Expected a number for parameter 1."); + } + }); +}); + +describe("UINT64", function () { + it("should transform number as UINT64 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT64')"); + const queryResult = await conn.execute(preparedStatement, { + 1: 10000000000000000000, + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, UINT64)"], "10000000000000000000"); + }); + + it("should reject other type as UINT64 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT64')"); + try { + await conn.execute(preparedStatement, { + 1: "10000000000000000000", + }); + } catch (e) { + assert.equal(e.message, "Expected a number for parameter 1."); + } + }); +}); + +describe("UINT32", function () { + it("should transform number as UINT32 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT32')"); + const queryResult = await conn.execute(preparedStatement, { + 1: 4294967295, + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, UINT32)"], "4294967295"); + }); + + it("should reject other type as UINT32 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT32')"); + try { + await conn.execute(preparedStatement, { + 1: "4294967295", + }); + } catch (e) { + assert.equal(e.message, "Expected a number for parameter 1."); + } + }); +}); + +describe("UINT16", function () { + it("should transform number as UINT16 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT16')"); + const queryResult = await conn.execute(preparedStatement, { + 1: 65535, + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, UINT16)"], "65535"); + }); + + it("should reject other type as UINT16 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT16')"); + try { + await conn.execute(preparedStatement, { + 1: "65535", + }); + } catch (e) { + assert.equal(e.message, "Expected a number for parameter 1."); + } + }); +}); + +describe("UINT8", function () { + it("should transform number as UINT8 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT8')"); + const queryResult = await conn.execute(preparedStatement, { + 1: 255, + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, UINT8)"], "255"); + }); + + it("should reject other type as UINT8 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'UINT8')"); + try { + await conn.execute(preparedStatement, { + 1: "255", + }); + } catch (e) { + assert.equal(e.message, "Expected a number for parameter 1."); + } + }); +}); + +describe("INT128", function () { + it("should transform single-word positive BigInt as INT128 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); + const queryResult = await conn.execute(preparedStatement, { + 1: BigInt("123456789"), + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, STRING)"], "123456789"); + }); + + it("should transform single-word negative BigInt as INT128 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); + const queryResult = await conn.execute(preparedStatement, { + 1: BigInt("-123456789"), + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, STRING)"], "-123456789"); + }); + + it("should transform two-word positive BigInt as INT128 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); + const queryResult = await conn.execute(preparedStatement, { + 1: BigInt("18446744073709551610"), + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, STRING)"], "18446744073709551610"); + }); + + it("should transform two-word negative BigInt as INT128 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); + const queryResult = await conn.execute(preparedStatement, { + 1: BigInt("-18446744073709551610"), + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["CAST($1, STRING)"], "-18446744073709551610"); + }); + + it("should reject other type as INT128 parameter", async function () { + const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); + try { + await conn.execute(preparedStatement, { + 1: "123456789", + }); + } catch (e) { + assert.equal(e.message, "Expected a BigInt for parameter 1."); + } + }); +}); + describe("DOUBLE", function () { it("should transform number as DOUBLE parameter", async function () { const preparedStatement = await conn.prepare( @@ -359,7 +522,7 @@ describe("TIMESTAMP", function () { describe("TIMESTAMP_TZ", function () { it("should transform date as TIMESTAMP_TZ parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_tz > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_tz > $1 RETURN COUNT(*)" ); const queryResult = await conn.execute(preparedStatement, { 1: new Date(0), @@ -370,7 +533,7 @@ describe("TIMESTAMP_TZ", function () { it("should reject other type as TIMESTAMP_TZ parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_tz > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_tz > $1 RETURN COUNT(*)" ); try { await conn.execute(preparedStatement, { @@ -401,7 +564,7 @@ describe("TIMESTAMP_TZ", function () { describe("TIMESTAMP_NS", function () { it("should transform date as TIMESTAMP_NS parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_ns > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_ns > $1 RETURN COUNT(*)" ); const queryResult = await conn.execute(preparedStatement, { 1: new Date(0), @@ -412,7 +575,7 @@ describe("TIMESTAMP_NS", function () { it("should reject other type as TIMESTAMP_NS parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_ns > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_ns > $1 RETURN COUNT(*)" ); try { await conn.execute(preparedStatement, { @@ -443,7 +606,7 @@ describe("TIMESTAMP_NS", function () { describe("TIMESTAMP_MS", function () { it("should transform date as TIMESTAMP_MS parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_ms > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_ms > $1 RETURN COUNT(*)" ); const queryResult = await conn.execute(preparedStatement, { 1: new Date(0), @@ -454,7 +617,7 @@ describe("TIMESTAMP_MS", function () { it("should reject other type as TIMESTAMP_MS parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_ms > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_ms > $1 RETURN COUNT(*)" ); try { await conn.execute(preparedStatement, { @@ -485,7 +648,7 @@ describe("TIMESTAMP_MS", function () { describe("TIMESTAMP_SEC", function () { it("should transform date as TIMESTAMP_SEC parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_sec > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_sec > $1 RETURN COUNT(*)" ); const queryResult = await conn.execute(preparedStatement, { 1: new Date(0), @@ -496,7 +659,7 @@ describe("TIMESTAMP_SEC", function () { it("should reject other type as TIMESTAMP_SEC parameter", async function () { const preparedStatement = await conn.prepare( - "MATCH (a:movies) WHERE a.description.release_sec > $1 RETURN COUNT(*)" + "MATCH (a:movies) WHERE a.description.release_sec > $1 RETURN COUNT(*)" ); try { await conn.execute(preparedStatement, { @@ -565,3 +728,16 @@ describe("INTERVAL", function () { } }); }); + +describe("UUID", function () { + it("should transform string as UUID parameter", async function () { + const preparedStatement = await conn.prepare( + "RETURN CAST($1, 'STRING') AS UUID" + ); + const queryResult = await conn.execute(preparedStatement, { + 1: "123e4567-e89b-12d3-a456-426614174000", + }); + const result = await queryResult.getAll(); + assert.equal(result[0]["UUID"], "123e4567-e89b-12d3-a456-426614174000"); + }); +}); From b30438988288f4d1177cd7b580f8391af84836bf Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Tue, 12 Mar 2024 10:08:59 -0400 Subject: [PATCH 028/136] Remove the constraint on the HashIndexBuilder template parameter The constraint seems to cause issues with MSVC 19.27 (#3022) --- .../storage/index/hash_index_builder.h | 5 ++-- src/storage/index/hash_index_builder.cpp | 26 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/include/storage/index/hash_index_builder.h b/src/include/storage/index/hash_index_builder.h index 9458479f215..766bc400f47 100644 --- a/src/include/storage/index/hash_index_builder.h +++ b/src/include/storage/index/hash_index_builder.h @@ -2,7 +2,6 @@ #include "common/static_vector.h" #include "common/type_utils.h" -#include "common/types/internal_id_t.h" #include "common/types/ku_string.h" #include "common/types/types.h" #include "storage/index/hash_index_header.h" @@ -54,7 +53,7 @@ using IndexBuffer = common::StaticVector, BUFFER_ // T is the key type stored in the slots. // For strings this is different than the type used when inserting/searching // (see BufferKeyType and Key) -template +template class HashIndexBuilder final : public InMemHashIndex { static_assert(getSlotCapacity() <= SlotHeader::FINGERPRINT_CAPACITY); // Size of the validity mask @@ -177,7 +176,7 @@ class PrimaryKeyIndexBuilder { common::PhysicalTypeID keyTypeID() const { return keyDataTypeID; } private: - template + template using HashIndexType = typename std::conditional || std::same_as, common::ku_string_t, T>::type; diff --git a/src/storage/index/hash_index_builder.cpp b/src/storage/index/hash_index_builder.cpp index ef1b13f3573..540938f7131 100644 --- a/src/storage/index/hash_index_builder.cpp +++ b/src/storage/index/hash_index_builder.cpp @@ -16,7 +16,7 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -template +template HashIndexBuilder::HashIndexBuilder(const std::shared_ptr& fileHandle, OverflowFileHandle* overflowFileHandle, uint64_t indexPos, PhysicalTypeID keyDataType) : fileHandle(fileHandle), overflowFileHandle(overflowFileHandle) { @@ -31,7 +31,7 @@ HashIndexBuilder::HashIndexBuilder(const std::shared_ptr& fileHan allocatePSlots(1u << this->indexHeader->currentLevel); } -template +template void HashIndexBuilder::bulkReserve(uint32_t numEntries_) { slot_id_t numRequiredEntries = HashIndexUtils::getNumRequiredEntries(this->indexHeader->numEntries, numEntries_); @@ -51,7 +51,7 @@ void HashIndexBuilder::bulkReserve(uint32_t numEntries_) { } } -template +template void HashIndexBuilder::copy(const uint8_t* oldEntry, slot_id_t newSlotId, uint8_t fingerprint) { SlotIterator iter(newSlotId, this); do { @@ -77,7 +77,7 @@ void HashIndexBuilder::copy(const uint8_t* oldEntry, slot_id_t newSlotId, uin newOvfSlot->header.setEntryValid(newEntryPos, fingerprint); } -template +template void HashIndexBuilder::splitSlot(HashIndexHeader& header) { // Add new slot allocatePSlots(1); @@ -105,7 +105,7 @@ void HashIndexBuilder::splitSlot(HashIndexHeader& header) { header.incrementNextSplitSlotId(); } -template +template size_t HashIndexBuilder::append(const IndexBuffer& buffer) { slot_id_t numRequiredEntries = HashIndexUtils::getNumRequiredEntries(this->indexHeader->numEntries, buffer.size()); @@ -127,7 +127,7 @@ size_t HashIndexBuilder::append(const IndexBuffer& buffer) { return buffer.size(); } -template +template bool HashIndexBuilder::appendInternal(Key key, common::offset_t value, common::hash_t hash) { auto fingerprint = HashIndexUtils::getFingerprintForHash(hash); auto slotID = HashIndexUtils::getPrimarySlotIdForHash(*this->indexHeader, hash); @@ -155,7 +155,7 @@ bool HashIndexBuilder::appendInternal(Key key, common::offset_t value, common return true; } -template +template bool HashIndexBuilder::lookup(Key key, offset_t& result) { auto hashValue = HashIndexUtils::hash(key); auto fingerprint = HashIndexUtils::getFingerprintForHash(hashValue); @@ -176,7 +176,7 @@ bool HashIndexBuilder::lookup(Key key, offset_t& result) { return false; } -template +template uint32_t HashIndexBuilder::allocatePSlots(uint32_t numSlotsToAllocate) { auto oldNumSlots = pSlots->getNumElements(); auto newNumSlots = oldNumSlots + numSlotsToAllocate; @@ -184,7 +184,7 @@ uint32_t HashIndexBuilder::allocatePSlots(uint32_t numSlotsToAllocate) { return oldNumSlots; } -template +template uint32_t HashIndexBuilder::allocateAOSlot() { auto oldNumSlots = oSlots->getNumElements(); auto newNumSlots = oldNumSlots + 1; @@ -192,7 +192,7 @@ uint32_t HashIndexBuilder::allocateAOSlot() { return oldNumSlots; } -template +template Slot* HashIndexBuilder::getSlot(const SlotInfo& slotInfo) { if (slotInfo.slotType == SlotType::PRIMARY) { return &pSlots->operator[](slotInfo.slotId); @@ -201,7 +201,7 @@ Slot* HashIndexBuilder::getSlot(const SlotInfo& slotInfo) { } } -template +template void HashIndexBuilder::flush() { headerArray->resize(1, true /* setToZero */); headerArray->operator[](0) = *this->indexHeader; @@ -210,7 +210,7 @@ void HashIndexBuilder::flush() { oSlots->saveToDisk(); } -template +template inline void HashIndexBuilder::insertToNewOvfSlot( Key key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint) { auto newSlotId = allocateAOSlot(); @@ -229,7 +229,7 @@ void HashIndexBuilder::insert(std::string_view key, Slotheader.setEntryValid(entryPos, fingerprint); } -template +template common::hash_t HashIndexBuilder::hashStored(const T& key) const { return HashIndexUtils::hash(key); } From 0dbcef69dbbe26ae85f58ba076798447b0892687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Wed, 13 Mar 2024 23:47:07 +0800 Subject: [PATCH 029/136] Allow CI workflow to be manually dispatched (#3043) --- .github/workflows/ci-workflow.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index aec034dfc39..dac5b9a7627 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -11,6 +11,7 @@ on: push: branches: - master + workflow_dispatch: # Only allow one run in this group to run at a time, and cancel any runs in progress in this group. # We use the workflow name and then add the pull request number, or (if it's a push to master), we use the name of the branch. From 2dfe495718811ff6a3750111cd7d92ccb3652802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Thu, 14 Mar 2024 00:07:41 +0800 Subject: [PATCH 030/136] Bump extensions version to 0.2.0 (#3041) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8520f18aaa3..3848081df63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -196,7 +196,7 @@ endif () if(${BUILD_KUZU}) add_definitions(-DKUZU_ROOT_DIRECTORY="${PROJECT_SOURCE_DIR}") add_definitions(-DKUZU_CMAKE_VERSION="${CMAKE_PROJECT_VERSION}") -add_definitions(-DKUZU_EXTENSION_VERSION="0.1.0") +add_definitions(-DKUZU_EXTENSION_VERSION="0.2.0") include_directories(src/include) include_directories(third_party/antlr4_cypher/include) From 7110f91a7d3fa7d685318ff86cfd200c1bb52c75 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Wed, 13 Mar 2024 22:14:33 +0400 Subject: [PATCH 031/136] First-pass lint/format for Python `shell` tests (#3034) --- tools/shell/test/conftest.py | 99 +++++----- tools/shell/test/test_helper.py | 73 ++++--- tools/shell/test/test_shell_basics.py | 136 ++++++------- tools/shell/test/test_shell_commands.py | 97 +++++----- tools/shell/test/test_shell_control_edit.py | 177 ++++++++--------- tools/shell/test/test_shell_control_search.py | 141 ++++++++------ tools/shell/test/test_shell_esc_edit.py | 78 ++++---- tools/shell/test/test_shell_esc_search.py | 67 ++++--- tools/shell/test/test_shell_flags.py | 179 ++++++------------ 9 files changed, 506 insertions(+), 541 deletions(-) diff --git a/tools/shell/test/conftest.py b/tools/shell/test/conftest.py index 0c0673fb993..b90a48e8200 100644 --- a/tools/shell/test/conftest.py +++ b/tools/shell/test/conftest.py @@ -1,18 +1,24 @@ -from encodings import utf_8 -import pytest +from __future__ import annotations + import os import shutil import subprocess + import pexpect -from test_helper import * -from typing import List, Union +import pytest +from test_helper import KUZU_EXEC_PATH, KUZU_ROOT, deleteIfExists -def pytest_addoption(parser): - parser.addoption("--start-offset", action="store", type=int, help="Skip the first 'n' tests") +def pytest_addoption(parser) -> None: + parser.addoption( + "--start-offset", + action="store", + type=int, + help="Skip the first 'n' tests", + ) -def pytest_collection_modifyitems(config, items): +def pytest_collection_modifyitems(config, items) -> None: start_offset = config.getoption("--start-offset") if not start_offset: # --skiplist not given in cli, therefore move on @@ -25,32 +31,32 @@ def pytest_collection_modifyitems(config, items): class TestResult: - def __init__(self, stdout, stderr, status_code): - self.stdout: Union[str, bytes] = stdout - self.stderr: Union[str, bytes] = stderr + def __init__(self, stdout, stderr, status_code) -> None: + self.stdout: str | bytes = stdout + self.stderr: str | bytes = stderr self.status_code: int = status_code - def check_stdout(self, expected: Union[str, List[str], bytes]): + def check_stdout(self, expected: str | list[str] | bytes) -> None: if isinstance(expected, list): - expected = '\n'.join(expected) + expected = "\n".join(expected) assert self.status_code == 0 assert expected in self.stdout - - def check_not_stdout(self, expected: Union[str, List[str], bytes]): + + def check_not_stdout(self, expected: str | list[str] | bytes) -> None: if isinstance(expected, list): - expected = '\n'.join(expected) + expected = "\n".join(expected) assert self.status_code == 0 assert expected not in self.stdout - def check_stderr(self, expected: str): + def check_stderr(self, expected: str) -> None: assert expected in self.stderr class ShellTest: - def __init__(self): + def __init__(self) -> None: self.shell = KUZU_EXEC_PATH self.arguments = [self.shell] - self.statements: List[str] = [] + self.statements: list[str] = [] self.input = None self.output = None self.environment = {} @@ -78,7 +84,7 @@ def output_file(self, file_path): # Test Running methods - def get_command(self, cmd: str) -> List[str]: + def get_command(self, cmd: str) -> list[str]: command = self.arguments if self.input: command += [cmd] @@ -86,29 +92,30 @@ def get_command(self, cmd: str) -> List[str]: def get_input_data(self, cmd: str): if self.input: - input_data = open(self.input, 'rb').read() + with open(self.input, "rb") as f: + input_data = f.read() else: - input_data = bytearray(cmd, 'utf8') + input_data = bytearray(cmd, "utf8") return input_data def get_output_pipe(self): output_pipe = subprocess.PIPE if self.output: - output_pipe = open(self.output, 'w+') + output_pipe = open(self.output, "w+") return output_pipe def get_statements(self): statements = [] for statement in self.statements: statements.append(statement) - return '\n'.join(statements) + return "\n".join(statements) def get_output_data(self, res): if self.output: - stdout = open(self.output, 'r').read() + stdout = open(self.output).read() else: - stdout = res.stdout.decode('utf8').strip() - stderr = res.stderr.decode('utf8').strip() + stdout = res.stdout.decode("utf8").strip() + stderr = res.stderr.decode("utf8").strip() return stdout, stderr def run(self): @@ -121,56 +128,62 @@ def run(self): for key, val in self.environment.items(): my_env[key] = val - res = subprocess.run(command, input=input_data, stdout=output_pipe, stderr=subprocess.PIPE, env=my_env) + res = subprocess.run( + command, + input=input_data, + stdout=output_pipe, + stderr=subprocess.PIPE, + env=my_env, + check=False, + ) stdout, stderr = self.get_output_data(res) return TestResult(stdout, stderr, res.returncode) - - def start(self): + + def start(self) -> None: command = " ".join(self.arguments) my_env = os.environ.copy() for key, val in self.environment.items(): my_env[key] = val - - self.shell_process = pexpect.spawn(command, encoding = "utf_8", env = my_env) - def send_finished_statement(self, stmt: str): + self.shell_process = pexpect.spawn(command, encoding="utf_8", env=my_env) + + def send_finished_statement(self, stmt: str) -> None: if self.shell_process: assert self.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 self.shell_process.send(stmt) assert self.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 - def send_statement(self, stmt: str): + def send_statement(self, stmt: str) -> None: if self.shell_process: assert self.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 self.shell_process.send(stmt) - def send_control_statement(self, stmt: str): + def send_control_statement(self, stmt: str) -> None: if self.shell_process: assert self.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 self.shell_process.sendcontrol(stmt) -@pytest.fixture +@pytest.fixture() def temp_db(tmp_path): shutil.rmtree(tmp_path, ignore_errors=True) - output_path = str(tmp_path) - return output_path + return str(tmp_path) -@pytest.fixture +@pytest.fixture() def get_tmp_path(tmp_path): return str(tmp_path) -@pytest.fixture +@pytest.fixture() def history_path(): - path = os.path.join(KUZU_ROOT, 'tools', 'shell', 'test', 'files') - deleteIfExists(os.path.join(path, 'history.txt')) + path = os.path.join(KUZU_ROOT, "tools", "shell", "test", "files") + deleteIfExists(os.path.join(path, "history.txt")) return path -@pytest.fixture +@pytest.fixture() def csv_path(): - return os.path.join(KUZU_ROOT, 'tools', 'shell', 'test', 'files', 'vPerson.csv') + return os.path.join(KUZU_ROOT, "tools", "shell", "test", "files", "vPerson.csv") diff --git a/tools/shell/test/test_helper.py b/tools/shell/test/test_helper.py index 45a4152ee5e..d438145b516 100644 --- a/tools/shell/test/test_helper.py +++ b/tools/shell/test/test_helper.py @@ -1,49 +1,60 @@ import os -from pathlib import Path import sys from enum import Enum +from pathlib import Path KUZU_ROOT = Path(__file__).parent.parent.parent.parent if sys.platform == "win32": # \ in paths is not supported by kuzu's parser - KUZU_ROOT=str(KUZU_ROOT).replace("\\", "/") + KUZU_ROOT = str(KUZU_ROOT).replace("\\", "/") + +KUZU_EXEC_PATH = os.path.join( + KUZU_ROOT, + "build", + "release", + "tools", + "shell", + "kuzu_shell", +) -KUZU_EXEC_PATH = os.path.join(KUZU_ROOT, 'build', 'release', 'tools', 'shell', 'kuzu_shell') def _get_kuzu_version(): - cmake_file = os.path.join(KUZU_ROOT, 'CMakeLists.txt') + cmake_file = os.path.join(KUZU_ROOT, "CMakeLists.txt") with open(cmake_file) as f: for line in f: - if line.startswith('project(Kuzu VERSION'): - return line.split(' ')[2].strip() + if line.startswith("project(Kuzu VERSION"): + return line.split(" ")[2].strip() + return None + KUZU_VERSION = _get_kuzu_version() + class KEY_ACTION(Enum): - KEY_NULL = '\0' # NULL - CTRL_A = 'a' # Ctrl-a - CTRL_B = 'b' # Ctrl-b - CTRL_C = 'c' # Ctrl-c - CTRL_D = 'd' # Ctrl-d - CTRL_E = 'e' # Ctrl-e - CTRL_F = 'f' # Ctrl-f - CTRL_G = 'g' # Ctrl-g - CTRL_H = chr(8) # Ctrl-h - TAB = '\t' # Tab - CTRL_K = 'k' # Ctrl-k - CTRL_L = 'l' # Ctrl-l - ENTER = '\r' # Enter - CTRL_N = 'n' # Ctrl-n - CTRL_P = 'p' # Ctrl-p - CTRL_R = 'r' # Ctrl-r - CTRL_S = 's' # Ctrl-s - CTRL_T = 't' # Ctrl-t - CTRL_U = 'u' # Ctrl-u - CTRL_W = chr(23) # Ctrl-w - ESC = '\27' # Escape - BACKSPACE = chr(127) # Backspace - - -def deleteIfExists(file): + KEY_NULL = "\0" # NULL + CTRL_A = "a" # Ctrl-a + CTRL_B = "b" # Ctrl-b + CTRL_C = "c" # Ctrl-c + CTRL_D = "d" # Ctrl-d + CTRL_E = "e" # Ctrl-e + CTRL_F = "f" # Ctrl-f + CTRL_G = "g" # Ctrl-g + CTRL_H = chr(8) # Ctrl-h + TAB = "\t" # Tab + CTRL_K = "k" # Ctrl-k + CTRL_L = "l" # Ctrl-l + ENTER = "\r" # Enter + CTRL_N = "n" # Ctrl-n + CTRL_P = "p" # Ctrl-p + CTRL_R = "r" # Ctrl-r + CTRL_S = "s" # Ctrl-s + CTRL_T = "t" # Ctrl-t + CTRL_U = "u" # Ctrl-u + CTRL_W = chr(23) # Ctrl-w + ESC = "\27" # Escape + BACKSPACE = chr(127) # Backspace + + +def deleteIfExists(file) -> None: if os.path.exists(file): os.remove(file) diff --git a/tools/shell/test/test_shell_basics.py b/tools/shell/test/test_shell_basics.py index bbb475babcf..5e153cba1b6 100644 --- a/tools/shell/test/test_shell_basics.py +++ b/tools/shell/test/test_shell_basics.py @@ -1,47 +1,37 @@ +import os + import pytest -from test_helper import * from conftest import ShellTest +from test_helper import deleteIfExists -def test_basic(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .statement('RETURN "databases rule" AS a;') - ) +def test_basic(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement('RETURN "databases rule" AS a;') result = test.run() result.check_stdout("databases rule") -def test_range(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .statement('RETURN RANGE(0, 10) AS a;') - ) +def test_range(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement("RETURN RANGE(0, 10) AS a;") result = test.run() result.check_stdout("[0,1,2,3,4,5,6,7,8,9,10]") @pytest.mark.parametrize( - ["input", "output"], + ("input", "output"), [ ("RETURN LIST_CREATION(1,2);", "[1,2]"), ("RETURN STRUCT_PACK(x:=2,y:=3);", "{x: 2, y: 3}"), ("RETURN STRUCT_PACK(x:=2,y:=LIST_CREATION(1,2));", "{x: 2, y: [1,2]}"), ], ) -def test_nested_types(temp_db, input, output): - test = ( - ShellTest() - .add_argument(temp_db) - .statement(input) - ) +def test_nested_types(temp_db, input, output) -> None: + test = ShellTest().add_argument(temp_db).statement(input) result = test.run() result.check_stdout(output) - -def test_invalid_cast(temp_db): + +def test_invalid_cast(temp_db) -> None: test = ( ShellTest() .add_argument(temp_db) @@ -50,10 +40,12 @@ def test_invalid_cast(temp_db): .statement('MATCH (t:a) RETURN CAST(t.i, "INT8");') ) result = test.run() - result.check_stdout('Error: Conversion exception: Cast failed. Could not convert "****" to INT8.') - + result.check_stdout( + 'Error: Conversion exception: Cast failed. Could not convert "****" to INT8.', + ) -def test_multiline(temp_db): + +def test_multiline(temp_db) -> None: test = ( ShellTest() .add_argument(temp_db) @@ -65,62 +57,50 @@ def test_multiline(temp_db): ) result = test.run() result.check_stdout("databases rule") - -def test_multi_queries_one_line(temp_db): + +def test_multi_queries_one_line(temp_db) -> None: # two successful queries - test = ( - ShellTest() - .add_argument(temp_db) - .statement('RETURN "databases rule" AS a; RETURN "kuzu is cool" AS b;') - ) + test = ShellTest().add_argument(temp_db).statement('RETURN "databases rule" AS a; RETURN "kuzu is cool" AS b;') result = test.run() - result.check_stdout("databases rule") + result.check_stdout("databases rule") result.check_stdout("kuzu is cool") - + # one success one failure - test = ( - ShellTest() - .add_argument(temp_db) - .statement('RETURN "databases rule" AS a; ;') - ) + test = ShellTest().add_argument(temp_db).statement('RETURN "databases rule" AS a; ;') result = test.run() result.check_stdout("databases rule") - result.check_stdout(["Error: Parser exception: mismatched input '' expecting {CALL, COMMENT, COPY, EXPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", - '" "']) - - # two failing queries - test = ( - ShellTest() - .add_argument(temp_db) - .statement('RETURN "databases rule" S a; ;') + result.check_stdout( + [ + "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT, COPY, EXPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", + '" "', + ], ) + + # two failing queries + test = ShellTest().add_argument(temp_db).statement('RETURN "databases rule" S a; ;') result = test.run() - result.check_stdout(["Error: Parser exception: Invalid input < S>: expected rule ku_Statements (line: 1, offset: 24)", - '"RETURN "databases rule" S a"', - " ^", - "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT, COPY, EXPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", - '" "']) + result.check_stdout( + [ + "Error: Parser exception: Invalid input < S>: expected rule ku_Statements (line: 1, offset: 24)", + '"RETURN "databases rule" S a"', + " ^", + "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT, COPY, EXPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", + '" "', + ], + ) -def test_row_truncation(temp_db, csv_path): - test = ( - ShellTest() - .add_argument(temp_db) - .statement(f'LOAD FROM "{csv_path}" (HEADER=true) RETURN id;') - ) +def test_row_truncation(temp_db, csv_path) -> None: + test = ShellTest().add_argument(temp_db).statement(f'LOAD FROM "{csv_path}" (HEADER=true) RETURN id;') result = test.run() result.check_stdout("(21 tuples, 20 shown)") result.check_stdout(["| . |", "| . |", "| . |"]) - -def test_column_truncation(temp_db, csv_path): + +def test_column_truncation(temp_db, csv_path) -> None: # width when running test is 80 - test = ( - ShellTest() - .add_argument(temp_db) - .statement(f'LOAD FROM "{csv_path}" (HEADER=true) RETURN *;') - ) + test = ShellTest().add_argument(temp_db).statement(f'LOAD FROM "{csv_path}" (HEADER=true) RETURN *;') result = test.run() result.check_stdout("-" * 80) result.check_not_stdout("-" * 81) @@ -128,18 +108,14 @@ def test_column_truncation(temp_db, csv_path): result.check_stdout("(13 columns, 4 shown)") -def long_messages(temp_db): - long_message = '-' * 4096 - test = ( - ShellTest() - .add_argument(temp_db) - .statement(f'RETURN "{long_message}" AS a;') - ) +def long_messages(temp_db) -> None: + long_message = "-" * 4096 + test = ShellTest().add_argument(temp_db).statement(f'RETURN "{long_message}" AS a;') result = test.run() result.check_stdout(long_message) -def test_history_consecutive_repeats(temp_db, history_path): +def test_history_consecutive_repeats(temp_db, history_path) -> None: test = ( ShellTest() .add_argument(temp_db) @@ -150,11 +126,9 @@ def test_history_consecutive_repeats(temp_db, history_path): ) result = test.run() result.check_stdout("| databases rule |") - - f = open(os.path.join(history_path, "history.txt")) - assert f.readline() == 'RETURN "databases rule" AS a;\n' - assert f.readline() == '' - f.close() - - deleteIfExists(os.path.join(history_path, 'history.txt')) - \ No newline at end of file + + with open(os.path.join(history_path, "history.txt")) as f: + assert f.readline() == 'RETURN "databases rule" AS a;\n' + assert f.readline() == "" + + deleteIfExists(os.path.join(history_path, "history.txt")) diff --git a/tools/shell/test/test_shell_commands.py b/tools/shell/test/test_shell_commands.py index 84f75cd992a..9c4f0fd5b07 100644 --- a/tools/shell/test/test_shell_commands.py +++ b/tools/shell/test/test_shell_commands.py @@ -1,49 +1,39 @@ -from test_helper import * from conftest import ShellTest -def test_help(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .statement(":help") - ) +def test_help(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement(":help") result = test.run() - result.check_stdout([" :help get command list", - " :clear clear shell", - " :quit exit from shell", - " :max_rows [max_rows] set maximum number of rows for display (default: 20)", - " :max_width [max_width] set maximum width in characters for display", - "", - " Note: you can change and see several system configurations, such as num-threads, ", - " timeout, and logging_level using Cypher CALL statements.", - " e.g. CALL THREADS=5; or CALL current_setting('threads') return *;", - " See: https://kuzudb.com/docusaurus/cypher/configuration"]) - - -def test_clear(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .statement(":clear") + result.check_stdout( + [ + " :help get command list", + " :clear clear shell", + " :quit exit from shell", + " :max_rows [max_rows] set maximum number of rows for display (default: 20)", + " :max_width [max_width] set maximum width in characters for display", + "", + " Note: you can change and see several system configurations, such as num-threads, ", + " timeout, and logging_level using Cypher CALL statements.", + " e.g. CALL THREADS=5; or CALL current_setting('threads') return *;", + " See: https://kuzudb.com/docusaurus/cypher/configuration", + ], ) + + +def test_clear(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement(":clear") result = test.run() result.check_stdout("\x1b[H\x1b[2J") - -def test_quit(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .statement(":quit") - .statement('RETURN RANGE(0,10) AS a;') - ) + +def test_quit(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement(":quit").statement("RETURN RANGE(0,10) AS a;") result = test.run() # check to make sure the return query did not execute result.check_not_stdout("[0,1,2,3,4,5,6,7,8,9,10]") - -def test_max_rows(temp_db, csv_path): + +def test_max_rows(temp_db, csv_path) -> None: # test all rows shown test = ( ShellTest() @@ -54,8 +44,8 @@ def test_max_rows(temp_db, csv_path): result = test.run() result.check_stdout("(21 tuples)") result.check_not_stdout(["| . |", "| . |", "| . |"]) - - # test 1 row shown + + # test 1 row shown test = ( ShellTest() .add_argument(temp_db) @@ -65,7 +55,7 @@ def test_max_rows(temp_db, csv_path): result = test.run() result.check_stdout("(21 tuples, 1 shown)") result.check_stdout(["| . |", "| . |", "| . |"]) - + # test setting back to default test = ( ShellTest() @@ -78,7 +68,7 @@ def test_max_rows(temp_db, csv_path): result.check_stdout(["| . |", "| . |", "| . |"]) -def test_max_width(temp_db, csv_path): +def test_max_width(temp_db, csv_path) -> None: # test all columns shown test = ( ShellTest() @@ -91,7 +81,7 @@ def test_max_width(temp_db, csv_path): result.check_not_stdout("-" * 267) result.check_not_stdout("| ... |") result.check_stdout("(13 columns)") - + # test 2 columns shown test = ( ShellTest() @@ -105,7 +95,7 @@ def test_max_width(temp_db, csv_path): result.check_not_stdout("-" * 35) result.check_stdout("| ... |") result.check_stdout("(13 columns, 2 shown)") - + # test too small to display (back to terminal width) test = ( ShellTest() @@ -119,32 +109,31 @@ def test_max_width(temp_db, csv_path): result.check_not_stdout("-" * 81) result.check_stdout("| ... |") result.check_stdout("(13 columns, 4 shown)") - + # test result tuples unaffected by width test = ( ShellTest() .add_argument(temp_db) .statement(":max_width 2") - .statement('CREATE NODE TABLE LANGUAGE_CODE(alpha2 STRING, English STRING, PRIMARY KEY (alpha2));') + .statement( + "CREATE NODE TABLE LANGUAGE_CODE(alpha2 STRING, English STRING, PRIMARY KEY (alpha2));", + ) ) result = test.run() # terminal width when running test is 80 result.check_stdout("Node table: LANGUAGE_CODE has been created.") result.check_not_stdout("| ... |") result.check_stdout("(1 column)") - - - def test_bad_command(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .statement(":maxrows") - .statement(":quiy") - .statement("clearr;") - ) + + def test_bad_command(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement(":maxrows").statement(":quiy").statement("clearr;") result = test.run() - result.check_stdout('Error: Unknown command: ":maxrows". Enter ":help" for help') + result.check_stdout( + 'Error: Unknown command: ":maxrows". Enter ":help" for help', + ) result.check_stdout('Did you mean: ":max_rows"?') result.check_stdout('Error: Unknown command: ":quiy". Enter ":help" for help') result.check_stdout('Did you mean: ":quit"?') - result.check_stdout('Error: "clearr;" is not a valid Cypher query. Did you mean to issue a CLI command, e.g., ":clear"?') + result.check_stdout( + 'Error: "clearr;" is not a valid Cypher query. Did you mean to issue a CLI command, e.g., ":clear"?', + ) diff --git a/tools/shell/test/test_shell_control_edit.py b/tools/shell/test/test_shell_control_edit.py index bb00abb613d..95910c27bdb 100644 --- a/tools/shell/test/test_shell_control_edit.py +++ b/tools/shell/test/test_shell_control_edit.py @@ -1,24 +1,26 @@ -import pytest +import os + import pexpect -from test_helper import * +import pytest from conftest import ShellTest +from test_helper import KEY_ACTION, deleteIfExists @pytest.mark.parametrize( "key", [ - (KEY_ACTION.CTRL_C.value), - (KEY_ACTION.CTRL_G.value), + KEY_ACTION.CTRL_C.value, + KEY_ACTION.CTRL_G.value, ], ) -def test_sigint(temp_db, key): +def test_sigint(temp_db, key) -> None: # test two consecutive signit required to exit shell test = ShellTest().add_argument(temp_db) test.start() test.send_control_statement(key) test.send_control_statement(key) assert test.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 1 - + # test sending line interupts the two signits to quit test = ShellTest().add_argument(temp_db) test.start() @@ -28,49 +30,49 @@ def test_sigint(temp_db, key): test.send_control_statement(key) test.send_control_statement(key) assert test.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 1 - + # test sigint cancels the query test = ShellTest().add_argument(temp_db) test.start() - test.send_statement('CREATE NODE TABLE t0(i STRING, PRIMARY KEY(i));') + test.send_statement("CREATE NODE TABLE t0(i STRING, PRIMARY KEY(i));") test.send_control_statement(key) test.send_finished_statement("MATCH (a:t0) RETURN *;\r") - assert test.shell_process.expect_exact(["Error: Binder exception: Table t0 does not exist.", pexpect.EOF]) == 0 - + assert ( + test.shell_process.expect_exact( + ["Error: Binder exception: Table t0 does not exist.", pexpect.EOF], + ) + == 0 + ) + @pytest.mark.parametrize( "key", [ - (KEY_ACTION.ENTER.value), - ('\n'), + KEY_ACTION.ENTER.value, + "\n", ], ) -def test_enter(temp_db, key, history_path): - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("-p") - .add_argument(history_path) - ) +def test_enter(temp_db, key, history_path) -> None: + test = ShellTest().add_argument(temp_db).add_argument("-p").add_argument(history_path) test.start() test.send_statement('RETURN "databases rule" AS a;') test.send_finished_statement(key) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 assert test.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 - f = open(os.path.join(history_path, "history.txt")) - assert f.readline() == 'RETURN "databases rule" AS a;\n' - f.close() - deleteIfExists(os.path.join(history_path, 'history.txt')) - + + with open(os.path.join(history_path, "history.txt")) as f: + assert f.readline() == 'RETURN "databases rule" AS a;\n' + deleteIfExists(os.path.join(history_path, "history.txt")) + @pytest.mark.parametrize( "key", [ - (KEY_ACTION.BACKSPACE.value), - (KEY_ACTION.CTRL_H.value), + KEY_ACTION.BACKSPACE.value, + KEY_ACTION.CTRL_H.value, ], ) -def test_backspace(temp_db, key): +def test_backspace(temp_db, key) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a;abc') @@ -79,7 +81,7 @@ def test_backspace(temp_db, key): assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_d(temp_db): +def test_ctrl_d(temp_db) -> None: # ctrl d acts as EOF when line is empty test = ShellTest().add_argument(temp_db) test.start() @@ -90,46 +92,46 @@ def test_ctrl_d(temp_db): test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a;abc') - test.send_statement("\x1b[D" * 3) # move cursor to the left + test.send_statement("\x1b[D" * 3) # move cursor to the left for _ in range(4): test.send_control_statement(KEY_ACTION.CTRL_D.value) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_ctrl_t(temp_db): + +def test_ctrl_t(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS ;a') - test.send_statement("\x1b[D") # move cursor to the left + test.send_statement("\x1b[D") # move cursor to the left test.send_control_statement(KEY_ACTION.CTRL_T.value) - test.shell_process.sendcontrol(KEY_ACTION.CTRL_T.value) # line does not refresh + test.shell_process.sendcontrol(KEY_ACTION.CTRL_T.value) # line does not refresh test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_ctrl_b(temp_db): + +def test_ctrl_b(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() - test.send_statement(';') + test.send_statement(";") test.send_control_statement(KEY_ACTION.CTRL_B.value) - test.shell_process.sendcontrol(KEY_ACTION.CTRL_B.value) # line does not refresh + test.shell_process.sendcontrol(KEY_ACTION.CTRL_B.value) # line does not refresh test.send_finished_statement('RETURN "databases rule" AS a\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_ctrl_f(temp_db): + +def test_ctrl_f(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a') - test.send_statement("\x1b[D") # move cursor to the left + test.send_statement("\x1b[D") # move cursor to the left test.send_control_statement(KEY_ACTION.CTRL_F.value) - test.shell_process.sendcontrol(KEY_ACTION.CTRL_F.value) # line does not refresh - test.send_finished_statement(';\r') + test.shell_process.sendcontrol(KEY_ACTION.CTRL_F.value) # line does not refresh + test.send_finished_statement(";\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - - -def test_ctrl_p(temp_db): + + +def test_ctrl_p(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases rule" AS a;\r') @@ -137,36 +139,36 @@ def test_ctrl_p(temp_db): test.send_control_statement(KEY_ACTION.CTRL_P.value) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_ctrl_n(temp_db): + +def test_ctrl_n(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "kuzu is cool" AS b;\r') assert test.shell_process.expect_exact(["| kuzu is cool |", pexpect.EOF]) == 0 test.send_finished_statement('RETURN "databases rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - test.send_statement("\x1b[A" * 2) # move up in history + test.send_statement("\x1b[A" * 2) # move up in history test.send_control_statement(KEY_ACTION.CTRL_N.value) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + @pytest.mark.parametrize( "key", [ - (KEY_ACTION.CTRL_R.value), - (KEY_ACTION.CTRL_S.value), + KEY_ACTION.CTRL_R.value, + KEY_ACTION.CTRL_S.value, ], ) -def test_search(temp_db, key, history_path): +def test_search(temp_db, key, history_path) -> None: # test search opens test = ShellTest().add_argument(temp_db) test.start() test.send_control_statement(key) assert test.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 assert test.shell_process.expect_exact(["bck-i-search: _", pexpect.EOF]) == 0 - + # test successful search test = ShellTest().add_argument(temp_db) test.start() @@ -175,30 +177,25 @@ def test_search(temp_db, key, history_path): test.send_finished_statement('RETURN "kuzu is cool" AS b;\r') assert test.shell_process.expect_exact(["| kuzu is cool |", pexpect.EOF]) == 0 test.send_control_statement(key) - test.send_statement('databases') + test.send_statement("databases") test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 # test failing search - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("-p") - .add_argument(history_path) - ) + test = ShellTest().add_argument(temp_db).add_argument("-p").add_argument(history_path) test.start() test.send_finished_statement('RETURN "databases rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 test.send_finished_statement('RETURN "kuzu is cool" AS b;\r') assert test.shell_process.expect_exact(["| kuzu is cool |", pexpect.EOF]) == 0 test.send_control_statement(key) - test.send_statement('databases*******************') + test.send_statement("databases*******************") assert test.shell_process.expect_exact(["failing-bck-i-search:", pexpect.EOF]) == 0 # enter should process last match test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - deleteIfExists(os.path.join(history_path, 'history.txt')) - + deleteIfExists(os.path.join(history_path, "history.txt")) + # test starting search with text inputted already test = ShellTest().add_argument(temp_db) test.start() @@ -208,92 +205,102 @@ def test_search(temp_db, key, history_path): assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_u(temp_db): +def test_ctrl_u(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() - test.send_statement('CREATE NODE TABLE t0(i STRING, PRIMARY KEY(i));') + test.send_statement("CREATE NODE TABLE t0(i STRING, PRIMARY KEY(i));") test.send_control_statement(KEY_ACTION.CTRL_U.value) test.send_finished_statement(KEY_ACTION.ENTER.value) test.send_finished_statement("MATCH (a:t0) RETURN *;\r") - assert test.shell_process.expect_exact(["Error: Binder exception: Table t0 does not exist.", pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + ["Error: Binder exception: Table t0 does not exist.", pexpect.EOF], + ) + == 0 + ) -def test_ctrl_k(temp_db): +def test_ctrl_k(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a;abc') - test.send_statement("\x1b[D" * 3) # move cursor to the left + test.send_statement("\x1b[D" * 3) # move cursor to the left test.send_control_statement(KEY_ACTION.CTRL_K.value) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_a(temp_db): +def test_ctrl_a(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('ETURN "databases rule" AS a;') test.send_control_statement(KEY_ACTION.CTRL_A.value) - test.send_finished_statement('R\r') + test.send_finished_statement("R\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_e(temp_db): +def test_ctrl_e(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a') - test.send_statement("\x1b[H") # move cursor to the front + test.send_statement("\x1b[H") # move cursor to the front test.send_control_statement(KEY_ACTION.CTRL_E.value) - test.send_finished_statement(';\r') + test.send_finished_statement(";\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_l(temp_db): +def test_ctrl_l(temp_db) -> None: # clear screen with empty line test = ShellTest().add_argument(temp_db) test.start() test.send_control_statement(KEY_ACTION.CTRL_L.value) assert test.shell_process.expect_exact(["\x1b[H\x1b[2J", pexpect.EOF]) == 0 - + # clear screen with non empty line test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a') test.send_control_statement(KEY_ACTION.CTRL_L.value) assert test.shell_process.expect_exact(["\x1b[H\x1b[2J", pexpect.EOF]) == 0 - test.send_finished_statement(';\r') + test.send_finished_statement(";\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_w(temp_db): +def test_ctrl_w(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a; abc def ghi ') test.send_statement(KEY_ACTION.CTRL_W.value * 3) - test.send_statement("\x1b[H") # move cursor to the front + test.send_statement("\x1b[H") # move cursor to the front test.send_statement(KEY_ACTION.CTRL_W.value) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_tab(temp_db): +def test_tab(temp_db) -> None: # tab is interpreted as four psaces when pasting input test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases\trule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + # tab completion test = ShellTest().add_argument(temp_db) test.start() - test.send_statement('CRE') + test.send_statement("CRE") test.send_statement(KEY_ACTION.TAB.value) - test.send_statement(' N') + test.send_statement(" N") test.send_statement(KEY_ACTION.TAB.value) test.send_statement(KEY_ACTION.TAB.value) - test.send_statement(' TAB') + test.send_statement(" TAB") test.send_statement(KEY_ACTION.TAB.value) test.send_statement(KEY_ACTION.TAB.value) - test.send_statement('LE t0(i STRING, PRIMARY KEY(i));') + test.send_statement("LE t0(i STRING, PRIMARY KEY(i));") test.send_statement(KEY_ACTION.TAB.value) test.send_finished_statement(KEY_ACTION.ENTER.value) - assert test.shell_process.expect_exact(["| Node table: t0 has been created. |", pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + ["| Node table: t0 has been created. |", pexpect.EOF], + ) + == 0 + ) diff --git a/tools/shell/test/test_shell_control_search.py b/tools/shell/test/test_shell_control_search.py index c862d013a93..7958441dccc 100644 --- a/tools/shell/test/test_shell_control_search.py +++ b/tools/shell/test/test_shell_control_search.py @@ -1,10 +1,12 @@ -import pytest +import os + import pexpect -from test_helper import * +import pytest from conftest import ShellTest +from test_helper import KEY_ACTION, deleteIfExists -def set_up_search(test): +def set_up_search(test) -> None: test.send_finished_statement('RETURN "databases rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 test.send_finished_statement('RETURN "kuzu is cool" AS b;\r') @@ -17,27 +19,27 @@ def set_up_search(test): @pytest.mark.parametrize( "key", [ - (KEY_ACTION.ENTER.value), - ('\n'), + KEY_ACTION.ENTER.value, + "\n", ], ) -def test_enter(temp_db, key): +def test_enter(temp_db, key) -> None: test = ShellTest().add_argument(temp_db) test.start() set_up_search(test) test.send_statement("databases") test.send_finished_statement(key) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + @pytest.mark.parametrize( "key", [ - (KEY_ACTION.CTRL_R.value), - (KEY_ACTION.CTRL_N.value), + KEY_ACTION.CTRL_R.value, + KEY_ACTION.CTRL_N.value, ], ) -def test_search_next(temp_db, key, history_path): +def test_search_next(temp_db, key, history_path) -> None: # test search next once test = ShellTest().add_argument(temp_db) test.start() @@ -45,31 +47,26 @@ def test_search_next(temp_db, key, history_path): test.send_control_statement(key) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| the shell is fun |", pexpect.EOF]) == 0 - + # test search next until top of history - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("-p") - .add_argument(history_path) - ) + test = ShellTest().add_argument(temp_db).add_argument("-p").add_argument(history_path) test.start() set_up_search(test) for _ in range(4): test.send_control_statement(key) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - deleteIfExists(os.path.join(history_path, 'history.txt')) + deleteIfExists(os.path.join(history_path, "history.txt")) @pytest.mark.parametrize( "key", [ - (KEY_ACTION.CTRL_S.value), - (KEY_ACTION.CTRL_P.value), + KEY_ACTION.CTRL_S.value, + KEY_ACTION.CTRL_P.value, ], ) -def test_search_prev(temp_db, key): +def test_search_prev(temp_db, key) -> None: # test search prev once test = ShellTest().add_argument(temp_db) test.start() @@ -79,7 +76,7 @@ def test_search_prev(temp_db, key): test.send_control_statement(key) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| the shell is fun |", pexpect.EOF]) == 0 - + # test search prev until bottom of history test = ShellTest().add_argument(temp_db) test.start() @@ -96,13 +93,21 @@ def test_search_prev(temp_db, key): test.send_control_statement(key) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| searching history |", pexpect.EOF]) == 0 - -def test_ctrl_a(temp_db): + +def test_ctrl_a(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('"databases rule" AS a;\r') - assert test.shell_process.expect_exact(['Error: Parser exception: extraneous input \'"databases rule"\'', pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + [ + "Error: Parser exception: extraneous input '\"databases rule\"'", + pexpect.EOF, + ], + ) + == 0 + ) test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databases") test.send_control_statement(KEY_ACTION.CTRL_A.value) @@ -111,7 +116,7 @@ def test_ctrl_a(temp_db): assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_tab(temp_db): +def test_tab(temp_db) -> None: # test tab becomes space when part of pasted input test = ShellTest().add_argument(temp_db) test.start() @@ -119,34 +124,44 @@ def test_tab(temp_db): test.send_statement("databases\trule") test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + # test tab complete search and go to end of line test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases ;\r') - assert test.shell_process.expect_exact(['Error: Parser exception: Invalid input :', pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + ['Error: Parser exception: Invalid input :', pexpect.EOF], + ) + == 0 + ) test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databases") test.send_statement(KEY_ACTION.TAB.value) - test.send_statement(KEY_ACTION.BACKSPACE.value) # remove semicolon + test.send_statement(KEY_ACTION.BACKSPACE.value) # remove semicolon test.send_finished_statement('rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_ctrl_e(temp_db): + +def test_ctrl_e(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases ;\r') - assert test.shell_process.expect_exact(['Error: Parser exception: Invalid input :', pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + ['Error: Parser exception: Invalid input :', pexpect.EOF], + ) + == 0 + ) test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databases") test.send_control_statement(KEY_ACTION.CTRL_E.value) - test.send_statement(KEY_ACTION.BACKSPACE.value) # remove semicolon + test.send_statement(KEY_ACTION.BACKSPACE.value) # remove semicolon test.send_finished_statement('rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_ctrl_b(temp_db): + +def test_ctrl_b(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databasesrule" AS a;\r') @@ -154,11 +169,11 @@ def test_ctrl_b(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databasesr") test.send_control_statement(KEY_ACTION.CTRL_B.value) - test.send_finished_statement(' \r') + test.send_finished_statement(" \r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_f(temp_db): +def test_ctrl_f(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databasesrule" AS a;\r') @@ -166,11 +181,11 @@ def test_ctrl_f(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("database") test.send_control_statement(KEY_ACTION.CTRL_F.value) - test.send_finished_statement(' \r') + test.send_finished_statement(" \r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_t(temp_db): +def test_ctrl_t(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "database srule" AS a;\r') @@ -178,11 +193,11 @@ def test_ctrl_t(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("database ") test.send_control_statement(KEY_ACTION.CTRL_T.value) - test.send_finished_statement('\r') + test.send_finished_statement("\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_u(temp_db): +def test_ctrl_u(temp_db) -> None: # check if line was cleared test = ShellTest().add_argument(temp_db) test.start() @@ -193,7 +208,7 @@ def test_ctrl_u(temp_db): test.send_control_statement(KEY_ACTION.CTRL_U.value) test.send_finished_statement('RETURN "kuzu is cool" AS a;\r') assert test.shell_process.expect_exact(["| kuzu is cool |", pexpect.EOF]) == 0 - + # check if position in history was maintained test = ShellTest().add_argument(temp_db) test.start() @@ -201,11 +216,11 @@ def test_ctrl_u(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("is cool") test.send_control_statement(KEY_ACTION.CTRL_U.value) - test.send_finished_statement("\x1b[A\r") # move up in history + test.send_finished_statement("\x1b[A\r") # move up in history assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_k(temp_db): +def test_ctrl_k(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases rule" AS aabc;\r') @@ -213,21 +228,21 @@ def test_ctrl_k(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("As a") test.send_control_statement(KEY_ACTION.CTRL_K.value) - test.send_finished_statement(';\r') + test.send_finished_statement(";\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_d(temp_db): +def test_ctrl_d(temp_db) -> None: # ctrl d accepts search and acts as EOF when line is empty test = ShellTest().add_argument(temp_db) test.start() test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_control_statement(KEY_ACTION.CTRL_D.value) - #search gets accepted + # search gets accepted assert test.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 0 # acts as EOF assert test.shell_process.expect_exact(["kuzu", pexpect.EOF]) == 1 - + # test accepts search and delete test = ShellTest().add_argument(temp_db) test.start() @@ -240,8 +255,8 @@ def test_ctrl_d(temp_db): assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_ctrl_l(temp_db): - #clear screen with empty line +def test_ctrl_l(temp_db) -> None: + # clear screen with empty line test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases rule" AS a;\r') @@ -252,7 +267,7 @@ def test_ctrl_l(temp_db): test.send_statement("databases") test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + # clear screen with non empty line test = ShellTest().add_argument(temp_db) test.start() @@ -262,16 +277,16 @@ def test_ctrl_l(temp_db): assert test.shell_process.expect_exact(["\x1b[H\x1b[2J", pexpect.EOF]) == 0 test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + @pytest.mark.parametrize( "key", [ - (KEY_ACTION.CTRL_C.value), - (KEY_ACTION.CTRL_G.value), - ] + KEY_ACTION.CTRL_C.value, + KEY_ACTION.CTRL_G.value, + ], ) -def test_cancel_search(temp_db, key): +def test_cancel_search(temp_db, key) -> None: # check if line is cleared test = ShellTest().add_argument(temp_db) test.start() @@ -282,7 +297,7 @@ def test_cancel_search(temp_db, key): test.send_control_statement(key) test.send_finished_statement('RETURN "kuzu is cool" AS a;\r') assert test.shell_process.expect_exact(["| kuzu is cool |", pexpect.EOF]) == 0 - + # check if position in history was maintained test = ShellTest().add_argument(temp_db) test.start() @@ -290,7 +305,7 @@ def test_cancel_search(temp_db, key): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("is cool") test.send_control_statement(KEY_ACTION.CTRL_U.value) - test.send_statement("\x1b[B") # move down in history + test.send_statement("\x1b[B") # move down in history test.send_finished_statement('RETURN "databases rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 @@ -298,12 +313,12 @@ def test_cancel_search(temp_db, key): @pytest.mark.parametrize( "key", [ - (KEY_ACTION.CTRL_H.value), - (KEY_ACTION.BACKSPACE.value), - (KEY_ACTION.CTRL_W.value) - ] + KEY_ACTION.CTRL_H.value, + KEY_ACTION.BACKSPACE.value, + KEY_ACTION.CTRL_W.value, + ], ) -def test_backspace(temp_db, key): +def test_backspace(temp_db, key) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases rule" AS a;\r') diff --git a/tools/shell/test/test_shell_esc_edit.py b/tools/shell/test/test_shell_esc_edit.py index eae29fa23f9..6f6924e5a62 100644 --- a/tools/shell/test/test_shell_esc_edit.py +++ b/tools/shell/test/test_shell_esc_edit.py @@ -1,37 +1,37 @@ -import pytest import pexpect -from test_helper import * +import pytest from conftest import ShellTest +from test_helper import KEY_ACTION @pytest.mark.parametrize( "esc", [ - ("\x1bb"), - ("\x1b[1;5D"), + "\x1bb", + "\x1b[1;5D", ], ) -def test_move_word_left(temp_db, esc): +def test_move_word_left(temp_db, esc) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement("RETURN AS a;") test.send_statement(esc * 3) test.send_finished_statement(' "databases rule"\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + @pytest.mark.parametrize( "esc", [ - ("\x1bf"), - ("\x1b[1;5C"), + "\x1bf", + "\x1b[1;5C", ], ) -def test_move_word_right(temp_db, esc): +def test_move_word_right(temp_db, esc) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases a;') - test.send_control_statement(KEY_ACTION.CTRL_A.value) # move cursor to front of line + test.send_control_statement(KEY_ACTION.CTRL_A.value) # move cursor to front of line test.send_statement(esc * 3) test.send_finished_statement(' rule" AS\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 @@ -40,21 +40,21 @@ def test_move_word_right(temp_db, esc): @pytest.mark.parametrize( "esc", [ - ("\x1b[H"), - ("\x1b[1~"), - ("\x1bOH"), - ] + "\x1b[H", + "\x1b[1~", + "\x1bOH", + ], ) -def test_move_home(temp_db, esc): +def test_move_home(temp_db, esc) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('ETURN "databases rule" AS a;') test.send_statement(esc) - test.send_finished_statement('R\r') + test.send_finished_statement("R\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_delete(temp_db): + +def test_delete(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a;abc') @@ -63,27 +63,27 @@ def test_delete(temp_db): test.send_statement("\x1b[3~" * 4) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + @pytest.mark.parametrize( "esc", [ - ("\x1b[F"), - ("\x1b[4~"), - ("\x1bOF"), - ] + "\x1b[F", + "\x1b[4~", + "\x1bOF", + ], ) -def test_move_end(temp_db, esc): +def test_move_end(temp_db, esc) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a') - test.send_control_statement(KEY_ACTION.CTRL_A.value) # move cursor to front of line + test.send_control_statement(KEY_ACTION.CTRL_A.value) # move cursor to front of line test.send_statement(esc) - test.send_finished_statement(';\r') + test.send_finished_statement(";\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_next_history(temp_db): +def test_next_history(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases rule" AS a;\r') @@ -91,37 +91,37 @@ def test_next_history(temp_db): test.send_statement("\x1b[A") test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_prev_history(temp_db): + +def test_prev_history(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "kuzu is cool" AS b;\r') assert test.shell_process.expect_exact(["| kuzu is cool |", pexpect.EOF]) == 0 test.send_finished_statement('RETURN "databases rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - test.send_control_statement(KEY_ACTION.CTRL_P.value) # move up in history - test.send_control_statement(KEY_ACTION.CTRL_P.value) # move up in history + test.send_control_statement(KEY_ACTION.CTRL_P.value) # move up in history + test.send_control_statement(KEY_ACTION.CTRL_P.value) # move up in history test.send_statement("\x1b[B") test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_move_left(temp_db): + +def test_move_left(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() - test.send_statement(' a;') + test.send_statement(" a;") test.send_statement("\x1b[D" * 4) test.send_finished_statement('RETURN "databases rule" AS\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_move_right(temp_db): + +def test_move_right(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_statement('RETURN "databases rule" AS a') for _ in range(3): - test.send_control_statement(KEY_ACTION.CTRL_B.value) # move cursor to the left - test.send_statement("\x1b[C" * 4) - test.send_finished_statement(';\r') + test.send_control_statement(KEY_ACTION.CTRL_B.value) # move cursor to the left + test.send_statement("\x1b[C" * 4) + test.send_finished_statement(";\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 diff --git a/tools/shell/test/test_shell_esc_search.py b/tools/shell/test/test_shell_esc_search.py index c1d5412857a..f64da1be108 100644 --- a/tools/shell/test/test_shell_esc_search.py +++ b/tools/shell/test/test_shell_esc_search.py @@ -1,10 +1,10 @@ -import pytest import pexpect -from test_helper import * +import pytest from conftest import ShellTest +from test_helper import KEY_ACTION -def set_up_search(test): +def set_up_search(test) -> None: test.send_finished_statement('RETURN "databases rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 test.send_finished_statement('RETURN "kuzu is cool" AS b;\r') @@ -12,9 +12,9 @@ def set_up_search(test): test.send_finished_statement('RETURN "the shell is fun" AS c;\r') assert test.shell_process.expect_exact(["| the shell is fun |", pexpect.EOF]) == 0 test.send_control_statement(KEY_ACTION.CTRL_R.value) - -def test_accept_search(temp_db): + +def test_accept_search(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases" AS a;\r') @@ -24,21 +24,29 @@ def test_accept_search(temp_db): test.send_statement("\x1b\x1b") test.send_finished_statement(" rule\r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - + @pytest.mark.parametrize( "esc", [ - ("\x1b[H"), - ("\x1b[1~"), - ("\x1bOH"), - ] + "\x1b[H", + "\x1b[1~", + "\x1bOH", + ], ) -def test_accept_move_home(temp_db, esc): +def test_accept_move_home(temp_db, esc) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('"databases rule" AS a;\r') - assert test.shell_process.expect_exact(['Error: Parser exception: extraneous input \'"databases rule"\'', pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + [ + "Error: Parser exception: extraneous input '\"databases rule\"'", + pexpect.EOF, + ], + ) + == 0 + ) test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databases") test.send_statement(esc) @@ -50,26 +58,31 @@ def test_accept_move_home(temp_db, esc): @pytest.mark.parametrize( "esc", [ - ("\x1b[4~"), - ("\x1b[8~"), - ("\x1b[F"), - ("\x1bOF"), - ] + "\x1b[4~", + "\x1b[8~", + "\x1b[F", + "\x1bOF", + ], ) -def test_accept_move_end(temp_db, esc): +def test_accept_move_end(temp_db, esc) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databases ;\r') - assert test.shell_process.expect_exact(['Error: Parser exception: Invalid input :', pexpect.EOF]) == 0 + assert ( + test.shell_process.expect_exact( + ['Error: Parser exception: Invalid input :', pexpect.EOF], + ) + == 0 + ) test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databases") test.send_statement(esc) - test.send_statement(KEY_ACTION.BACKSPACE.value) # remove semicolon + test.send_statement(KEY_ACTION.BACKSPACE.value) # remove semicolon test.send_finished_statement('rule" AS a;\r') assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_next_history(temp_db): +def test_next_history(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() set_up_search(test) @@ -78,9 +91,9 @@ def test_next_history(temp_db): test.send_statement("\x1b[A" * 2) test.send_finished_statement(KEY_ACTION.ENTER.value) assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 - -def test_prev_history(temp_db): + +def test_prev_history(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() set_up_search(test) @@ -91,7 +104,7 @@ def test_prev_history(temp_db): assert test.shell_process.expect_exact(["| the shell is fun |", pexpect.EOF]) == 0 -def test_move_left(temp_db): +def test_move_left(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databasesrule" AS a;\r') @@ -99,11 +112,11 @@ def test_move_left(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("databasesr") test.send_statement("\x1b[D") - test.send_finished_statement(' \r') + test.send_finished_statement(" \r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 -def test_move_right(temp_db): +def test_move_right(temp_db) -> None: test = ShellTest().add_argument(temp_db) test.start() test.send_finished_statement('RETURN "databasesrule" AS a;\r') @@ -111,5 +124,5 @@ def test_move_right(temp_db): test.send_control_statement(KEY_ACTION.CTRL_R.value) test.send_statement("database") test.send_statement("\x1b[C") - test.send_finished_statement(' \r') + test.send_finished_statement(" \r") assert test.shell_process.expect_exact(["| databases rule |", pexpect.EOF]) == 0 diff --git a/tools/shell/test/test_shell_flags.py b/tools/shell/test/test_shell_flags.py index 19720f109c9..8eadd2b3e41 100644 --- a/tools/shell/test/test_shell_flags.py +++ b/tools/shell/test/test_shell_flags.py @@ -1,115 +1,79 @@ +import os + import pytest -from test_helper import * from conftest import ShellTest -import os +from test_helper import KUZU_VERSION, deleteIfExists -def test_database_path(temp_db): +def test_database_path(temp_db) -> None: # no database path - test = ( - ShellTest() - .statement('RETURN "databases rule" AS a;') - ) + test = ShellTest().statement('RETURN "databases rule" AS a;') result = test.run() result.check_stderr("Option 'databasePath' is required") - + # invalid database path - test = ( - ShellTest() - .add_argument("///////") - .statement('RETURN "databases rule" AS a;') - ) + test = ShellTest().add_argument("///////").statement('RETURN "databases rule" AS a;') result = test.run() result.check_stderr("Cannot open file ///////.lock: Permission denied") - + # valid database path - test = ( - ShellTest() - .add_argument(temp_db) - .statement('RETURN "databases rule" AS a;') - ) + test = ShellTest().add_argument(temp_db).statement('RETURN "databases rule" AS a;') result = test.run() result.check_stdout("databases rule") @pytest.mark.parametrize( "flag", - [ - ("-h"), - ("--help"), - ], + ["-h", "--help"], ) -def test_help(temp_db, flag): - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument(flag) - ) +def test_help(temp_db, flag) -> None: + test = ShellTest().add_argument(temp_db).add_argument(flag) result = test.run() result.check_stderr("help") - + @pytest.mark.parametrize( "flag", [ - ("-d"), - ("--defaultBPSize"), + "-d", + "--defaultBPSize", ], ) -def test_default_bp_size(temp_db, flag): +def test_default_bp_size(temp_db, flag) -> None: # empty flag argument - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument(flag) - ) + test = ShellTest().add_argument(temp_db).add_argument(flag) result = test.run() - result.check_stderr(f"Flag '{flag.replace('-', '')}' requires an argument but received none") - - # flag argument is not a number - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument(flag) - .add_argument("kuzu") + result.check_stderr( + f"Flag '{flag.replace('-', '')}' requires an argument but received none", ) + + # flag argument is not a number + test = ShellTest().add_argument(temp_db).add_argument(flag).add_argument("kuzu") result = test.run() result.check_stderr("Argument '' received invalid value type 'kuzu'") - + # successful flag - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument(flag) - .add_argument("1000") - ) + test = ShellTest().add_argument(temp_db).add_argument(flag).add_argument("1000") result = test.run() result.check_stdout(f"Opened the database at path: {temp_db} in read-write mode.") - -def test_no_compression(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("--nocompression") - ) + +def test_no_compression(temp_db) -> None: + test = ShellTest().add_argument(temp_db).add_argument("--nocompression") result = test.run() result.check_stdout(f"Opened the database at path: {temp_db} in read-write mode.") - + @pytest.mark.parametrize( "flag", [ - ("-r"), - ("--readOnly"), + "-r", + "--readOnly", ], ) -def test_read_only(temp_db, flag): +def test_read_only(temp_db, flag) -> None: # cannot open an empty database in read only mode so initialize database - test = ( - ShellTest() - .add_argument(temp_db) - ) + test = ShellTest().add_argument(temp_db) result = test.run() result.check_stdout(f"Opened the database at path: {temp_db} in read-write mode.") @@ -125,30 +89,23 @@ def test_read_only(temp_db, flag): result = test.run() result.check_stdout(f"Opened the database at path: {temp_db} in read-only mode.") result.check_stdout("databases rule") - result.check_stdout("Error: Cannot execute write operations in a read-only database!") + result.check_stdout( + "Error: Cannot execute write operations in a read-only database!", + ) result.check_stdout("kuzu is cool") - -def test_history_path(temp_db, history_path): + +def test_history_path(temp_db, history_path) -> None: # empty flag argument - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("-p") - ) + test = ShellTest().add_argument(temp_db).add_argument("-p") result = test.run() result.check_stderr("Flag 'p' requires an argument but received none") - + # invalid path - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("-p") - .add_argument("///////") - ) + test = ShellTest().add_argument(temp_db).add_argument("-p").add_argument("///////") result = test.run() result.check_stderr("Invalid path to directory for history file") - + # valid path, file doesn't exist test = ( ShellTest() @@ -159,10 +116,9 @@ def test_history_path(temp_db, history_path): ) result = test.run() result.check_stdout("databases rule") - f = open(os.path.join(history_path, "history.txt")) - assert f.readline() == 'RETURN "databases rule" AS a;\n' - f.close() - + with open(os.path.join(history_path, "history.txt")) as f: + assert f.readline() == 'RETURN "databases rule" AS a;\n' + # valid path, file exists test = ( ShellTest() @@ -172,44 +128,31 @@ def test_history_path(temp_db, history_path): .statement('RETURN "kuzu is cool" AS b;') ) result = test.run() - f = open(os.path.join(history_path, "history.txt")) - assert f.readline() == 'RETURN "databases rule" AS a;\n' - assert f.readline() == 'RETURN "kuzu is cool" AS b;\n' - f.close() - - deleteIfExists(os.path.join(history_path, 'history.txt')) - + with open(os.path.join(history_path, "history.txt")) as f: + assert f.readline() == 'RETURN "databases rule" AS a;\n' + assert f.readline() == 'RETURN "kuzu is cool" AS b;\n' + + deleteIfExists(os.path.join(history_path, "history.txt")) + @pytest.mark.parametrize( "flag", [ - ("-v"), - ("--version"), + "-v", + "--version", ], ) -def test_version(temp_db, flag): - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument(flag) - ) +def test_version(temp_db, flag) -> None: + test = ShellTest().add_argument(temp_db).add_argument(flag) result = test.run() result.check_stdout(KUZU_VERSION) - -def test_bad_flag(temp_db): - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("-b") - ) + +def test_bad_flag(temp_db) -> None: + test = ShellTest().add_argument(temp_db).add_argument("-b") result = test.run() - result.check_stderr(f"Flag could not be matched: 'b'") - - test = ( - ShellTest() - .add_argument(temp_db) - .add_argument("--badflag") - ) + result.check_stderr("Flag could not be matched: 'b'") + + test = ShellTest().add_argument(temp_db).add_argument("--badflag") result = test.run() - result.check_stderr(f"Flag could not be matched: badflag") + result.check_stderr("Flag could not be matched: badflag") From 930ba459b6b0c1003d1fe692d6af94d877655b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Thu, 14 Mar 2024 08:42:20 +0800 Subject: [PATCH 032/136] Bump master branch version to 0.3.2.1 (#3044) --- CMakeLists.txt | 2 +- examples/rust/Cargo.lock | 2 +- src/include/storage/storage_info.h | 8 ++++---- tools/rust_api/Cargo.lock | 2 +- tools/rust_api/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3848081df63..10d87523836 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.15) -project(Kuzu VERSION 0.3.1.1 LANGUAGES CXX C) +project(Kuzu VERSION 0.3.2.1 LANGUAGES CXX C) find_package(Threads REQUIRED) diff --git a/examples/rust/Cargo.lock b/examples/rust/Cargo.lock index f6e2e480e29..d47685b733c 100644 --- a/examples/rust/Cargo.lock +++ b/examples/rust/Cargo.lock @@ -404,7 +404,7 @@ dependencies = [ [[package]] name = "kuzu" -version = "0.3.1" +version = "0.3.2" dependencies = [ "arrow", "cmake", diff --git a/src/include/storage/storage_info.h b/src/include/storage/storage_info.h index 59c1aa12d33..c6b2ec6cf45 100644 --- a/src/include/storage/storage_info.h +++ b/src/include/storage/storage_info.h @@ -11,10 +11,10 @@ using storage_version_t = uint64_t; struct StorageVersionInfo { static std::unordered_map getStorageVersionInfo() { - return {{"0.3.1", 26}, {"0.3.0", 26}, {"0.2.1", 25}, {"0.2.0", 25}, {"0.1.0", 24}, - {"0.0.12.3", 24}, {"0.0.12.2", 24}, {"0.0.12.1", 24}, {"0.0.12", 23}, {"0.0.11", 23}, - {"0.0.10", 23}, {"0.0.9", 23}, {"0.0.8", 17}, {"0.0.7", 15}, {"0.0.6", 9}, {"0.0.5", 8}, - {"0.0.4", 7}, {"0.0.3", 1}}; + return {{"0.3.2", 26}, {"0.3.1", 26}, {"0.3.0", 26}, {"0.2.1", 25}, {"0.2.0", 25}, + {"0.1.0", 24}, {"0.0.12.3", 24}, {"0.0.12.2", 24}, {"0.0.12.1", 24}, {"0.0.12", 23}, + {"0.0.11", 23}, {"0.0.10", 23}, {"0.0.9", 23}, {"0.0.8", 17}, {"0.0.7", 15}, + {"0.0.6", 9}, {"0.0.5", 8}, {"0.0.4", 7}, {"0.0.3", 1}}; } static storage_version_t getStorageVersion(); diff --git a/tools/rust_api/Cargo.lock b/tools/rust_api/Cargo.lock index 5ca7ff68fc2..ad0d80540a6 100644 --- a/tools/rust_api/Cargo.lock +++ b/tools/rust_api/Cargo.lock @@ -426,7 +426,7 @@ dependencies = [ [[package]] name = "kuzu" -version = "0.3.1" +version = "0.3.2" dependencies = [ "anyhow", "arrow", diff --git a/tools/rust_api/Cargo.toml b/tools/rust_api/Cargo.toml index 9e9577e772f..c4a675456c9 100644 --- a/tools/rust_api/Cargo.toml +++ b/tools/rust_api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kuzu" -version = "0.3.1" +version = "0.3.2" description = "An in-process property graph database management system built for query speed and scalability" # Note: 1.72 required for testing due to latest dependencies of the arrow feature rust-version = "1.60" From 1b6f7416d001189d548f5831718ac8d1a54e6e7d Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Wed, 13 Mar 2024 18:37:10 -0700 Subject: [PATCH 033/136] Fixed failing shell tests (#3045) --- tools/shell/test/test_shell_basics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/shell/test/test_shell_basics.py b/tools/shell/test/test_shell_basics.py index 5e153cba1b6..1325e7ccdd5 100644 --- a/tools/shell/test/test_shell_basics.py +++ b/tools/shell/test/test_shell_basics.py @@ -72,7 +72,7 @@ def test_multi_queries_one_line(temp_db) -> None: result.check_stdout("databases rule") result.check_stdout( [ - "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT, COPY, EXPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", + "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT_, COPY, EXPORT, IMPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", '" "', ], ) @@ -85,7 +85,7 @@ def test_multi_queries_one_line(temp_db) -> None: "Error: Parser exception: Invalid input < S>: expected rule ku_Statements (line: 1, offset: 24)", '"RETURN "databases rule" S a"', " ^", - "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT, COPY, EXPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", + "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT_, COPY, EXPORT, IMPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", '" "', ], ) From ff186a5bc805cbaa6d82e66bae05765a21dd731d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Thu, 14 Mar 2024 10:32:54 +0800 Subject: [PATCH 034/136] Add shell tests to CI (#3039) --- .github/workflows/ci-workflow.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index dac5b9a7627..6c6a6fff337 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -417,7 +417,8 @@ jobs: macos-build-test: name: apple clang build & test - needs: [clang-formatting-check, sanity-checks, rustfmt-check, python-lint-check] + needs: + [clang-formatting-check, sanity-checks, rustfmt-check, python-lint-check] runs-on: self-hosted-mac-x64 env: NUM_THREADS: 32 @@ -487,3 +488,21 @@ jobs: ulimit -n 10240 source /Users/runner/.cargo/env cargo build --locked --features arrow + + shell-test: + name: shell test + runs-on: ubuntu-latest + needs: [clang-formatting-check, sanity-checks] + env: + WERROR: 0 + steps: + - uses: actions/checkout@v3 + + - name: Build + run: make release NUM_THREADS=$(nproc) + + - name: Test + working-directory: tools/shell/test + run: | + pip3 install pytest pexpect + python3 -m pytest -v . From 77489a50eb65f9e4de3652b73ec874c5f9eaa041 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Thu, 14 Mar 2024 02:15:05 +0800 Subject: [PATCH 035/136] fix issue 3042 --- src/storage/store/var_list_column_chunk.cpp | 4 ++-- test/test_files/issue/issue.test | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index 5ac1d22eefb..e1635a7e14e 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -20,7 +20,7 @@ void VarListDataColumnChunk::resizeBuffer(uint64_t numValues) { } capacity = capacity == 0 ? 1 : capacity; while (capacity < numValues) { - capacity *= CHUNK_RESIZE_RATIO; + capacity = std::ceil(capacity * CHUNK_RESIZE_RATIO); } dataColumnChunk->resize(capacity); } @@ -65,7 +65,7 @@ void VarListColumnChunk::append(ValueVector* vector, SelectionVector& selVector) auto numToAppend = selVector.selectedSize; auto newCapacity = capacity; while (numValues + numToAppend >= newCapacity) { - newCapacity *= 1.5; + newCapacity = std::ceil(newCapacity * 1.5); } if (capacity < newCapacity) { resize(newCapacity); diff --git a/test/test_files/issue/issue.test b/test/test_files/issue/issue.test index 76965889a69..4efb7beaaf3 100644 --- a/test/test_files/issue/issue.test +++ b/test/test_files/issue/issue.test @@ -397,3 +397,12 @@ v3|v2 {_ID: 1:1, _LABEL: R, id: r12}|v12 |v11 |v111 + +-CASE 3042 +-STATEMENT CREATE NODE TABLE MyTask (id STRING, inputs MAP(STRING, STRING)[], PRIMARY KEY(id)); +---- ok +-STATEMENT CREATE (:MyTask {id: 'myid', inputs: [MAP(['input1'], ['value1'])]}); +---- ok +-STATEMENT MATCH (n:MyTask) RETURN n.*; +---- 1 +myid|[{input1=value1}] From 0b7adb98ca59f36a047eb9fc8777fb96822043a1 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Tue, 12 Mar 2024 19:58:36 +0800 Subject: [PATCH 036/136] fix sliding out-of-place commit and null strings --- src/storage/store/column.cpp | 22 ++--- src/storage/store/column_chunk.cpp | 12 ++- src/storage/store/dictionary_chunk.cpp | 4 +- src/storage/store/rel_table_data.cpp | 1 + src/storage/store/string_column.cpp | 3 + src/storage/store/string_column_chunk.cpp | 4 + test/test_files/issue/issue2.test | 112 ++++++++++++++++++++++ 7 files changed, 140 insertions(+), 18 deletions(-) create mode 100644 test/test_files/issue/issue2.test diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index e9e78bfa7f6..90023563531 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -776,21 +776,15 @@ void Column::commitColumnChunkOutOfPlace(Transaction* transaction, node_group_id append(chunk, nodeGroupIdx); } else { auto chunkMeta = getMetadata(nodeGroupIdx, transaction->getType()); - auto maxDstOffset = getMaxOffset(dstOffsets); - if (maxDstOffset < chunkMeta.numValues) { - // TODO(Guodong): Should consider caching the scanned column chunk to avoid redundant - // scans in the same transaction. - auto columnChunk = getEmptyChunkForCommit(chunkMeta.numValues + dstOffsets.size()); - scan(transaction, nodeGroupIdx, columnChunk.get()); - for (auto i = 0u; i < dstOffsets.size(); i++) { - columnChunk->write(chunk, srcOffset + i, dstOffsets[i], 1 /* numValues */); - } - columnChunk->finalize(); - append(columnChunk.get(), nodeGroupIdx); - } else { - chunk->finalize(); - append(chunk, nodeGroupIdx); + // TODO(Guodong): Should consider caching the scanned column chunk to avoid redundant + // scans in the same transaction. + auto columnChunk = getEmptyChunkForCommit(chunkMeta.numValues + dstOffsets.size()); + scan(transaction, nodeGroupIdx, columnChunk.get()); + for (auto i = 0u; i < dstOffsets.size(); i++) { + columnChunk->write(chunk, srcOffset + i, dstOffsets[i], 1 /* numValues */); } + columnChunk->finalize(); + append(columnChunk.get(), nodeGroupIdx); } } diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 309dcf9833f..986c08a6e6a 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -267,8 +267,10 @@ void ColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset_t o void ColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { - KU_ASSERT(numValues >= (dstOffsetInChunk + numValuesToCopy)); KU_ASSERT(srcChunk->dataType.getPhysicalType() == dataType.getPhysicalType()); + if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy; + } memcpy(buffer.get() + dstOffsetInChunk * numBytesPerValue, srcChunk->buffer.get() + srcOffsetInChunk * numBytesPerValue, numValuesToCopy * numBytesPerValue); @@ -454,7 +456,9 @@ void BoolColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset void BoolColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { - KU_ASSERT(numValues >= (dstOffsetInChunk + numValuesToCopy)); + if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy; + } NullMask::copyNullMask((uint64_t*)static_cast(srcChunk)->buffer.get(), srcOffsetInChunk, (uint64_t*)buffer.get(), dstOffsetInChunk, numValuesToCopy); } @@ -478,7 +482,9 @@ void NullColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset void NullColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { - KU_ASSERT(numValues >= (dstOffsetInChunk + numValuesToCopy)); + if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy; + } copyFromBuffer((uint64_t*)static_cast(srcChunk)->buffer.get(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); } diff --git a/src/storage/store/dictionary_chunk.cpp b/src/storage/store/dictionary_chunk.cpp index 69dc48ffda7..8f6f853e689 100644 --- a/src/storage/store/dictionary_chunk.cpp +++ b/src/storage/store/dictionary_chunk.cpp @@ -35,7 +35,9 @@ void DictionaryChunk::resetToEmpty() { } uint64_t DictionaryChunk::getStringLength(string_index_t index) const { - if (index + 1 < offsetChunk->getNumValues()) { + if (stringDataChunk->getNumValues() == 0) { + return 0; + } else if (index + 1 < offsetChunk->getNumValues()) { KU_ASSERT(offsetChunk->getValue(index + 1) >= offsetChunk->getValue(index)); return offsetChunk->getValue(index + 1) - diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 65e9d999971..a10ea4392b4 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -507,6 +507,7 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, auto newSize = localState.rightCSROffset - localState.leftCSROffset + 1; auto newChunk = ColumnChunkFactory::createColumnChunk( *column->getDataType().copy(), enableCompression, newSize); + newChunk->getNullChunk()->resetToAllNull(); auto maxNumNodesToDistribute = std::min( rightNodeBoundary - leftNodeBoundary + 1, persistentState.header.offset->getNumValues()); // Third, copy the rels to the new chunk. diff --git a/src/storage/store/string_column.cpp b/src/storage/store/string_column.cpp index eb333fbc6e8..42cb4f1ddbc 100644 --- a/src/storage/store/string_column.cpp +++ b/src/storage/store/string_column.cpp @@ -204,6 +204,9 @@ bool StringColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t n auto strChunk = ku_dynamic_cast(chunk); auto length = std::min((uint64_t)dstOffsets.size(), strChunk->getNumValues()); for (auto i = 0u; i < length; i++) { + if (strChunk->getNullChunk()->isNull(i)) { + continue; + } strLenToAdd += strChunk->getStringLength(i + srcOffset); } auto numStrings = dstOffsets.size(); diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index 696b6e36a3f..e0c18523546 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -91,6 +91,9 @@ void StringColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool void StringColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { KU_ASSERT(srcChunk->getDataType().getPhysicalType() == PhysicalTypeID::STRING); + if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy; + } for (auto i = 0u; i < numValuesToCopy; i++) { auto srcPos = srcOffsetInChunk + i; auto dstPos = dstOffsetInChunk + i; @@ -163,6 +166,7 @@ void StringColumnChunk::finalize() { template<> std::string_view StringColumnChunk::getValue(offset_t pos) const { KU_ASSERT(pos < numValues); + KU_ASSERT(!nullChunk->isNull(pos)); auto index = ColumnChunk::getValue(pos); return dictionaryChunk->getString(index); } diff --git a/test/test_files/issue/issue2.test b/test/test_files/issue/issue2.test new file mode 100644 index 00000000000..fa51eba6ca1 --- /dev/null +++ b/test/test_files/issue/issue2.test @@ -0,0 +1,112 @@ +-GROUP IssueTest +-DATASET CSV empty + +-- + +-CASE 3055 +-STATEMENT CREATE NODE TABLE test ( id STRING, prop1 STRING, prop2 INT64, prop3 STRING, prop4 STRING, PRIMARY KEY(id) ) +---- ok +-STATEMENT MERGE (n:test { id: "ewm8ewnn@l23:" }) SET n.prop1 = "model", n.prop2 = 6, n.prop3 = "trips_2", n.prop4 = "0bbhfwnenwafnw88989382932wwewej332938293jiwojewie923892389283923" RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "ewm8ewnn ewweklnbgeireg@l23:ewe" }) SET n.prop1 = "model", n.prop2 = 16, n.prop3 = "normalize_data", n.prop4 = "1bbhfwnenwafnw88989234342wwewej332938293jiwojewie923892389283923" RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "ewm8ewnn ewweklnbgew888g@lew3:ewe" }) SET n.prop1 = "model", n.prop2 = 74, n.prop3 = "zones", n.prop4 = "2bbhfwnenaafnw88989234342wwewej332938293jiwojewie923192389283923" RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "ewm8ew43lnbgew888g@lew3:ewe" }) SET n.prop1 = "expectation", n.prop2 = 27, n.prop3 = "test_trips_1", n.prop4 = "3bbhfwnenaafnw88989234342wwewej332938213jiwojewie923192389283923" RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "ewm8ew43ffbgew888g@lew3:ewe" }) SET n.prop1 = "expectation", n.prop2 = 37, n.prop3 = "test_trips_2", n.prop4 = "4bbhfwnenaafnw88989234312wwewej332938213jiwojewie923192389283923" RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "ewm8ew43ffrrr88g@lew3:ewe" }) SET n.prop1 = "expectation", n.prop2 = 47, n.prop3 = "test_norm_data_1", n.prop4 = "5bbhfwnenaafnw88989234312wwewej332938213jiwojewie923192389283923" RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "fwfwfe8g@lew3:ewe" }) SET n.prop1 = "model", n.prop4 = "6bbhfwnenaafnw88989234312wwewej332938213jiwojewie923192389283923" RETURN n.id +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "fwfwfe8g@lew3:ewe" AND n.prop1 = "model" AND n.prop2 IS NULL AND n.prop3 IS NULL RETURN n +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "ewm8ewnn ewweklnbgew888g@lew3:ewe" AND n.prop1 = "model" AND n.prop2 = 74 AND n.prop3 = "zones" RETURN n +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "ewm8ewnn@l23:" AND n.prop1 = "model" AND n.prop2 = 6 AND n.prop3 = "trips_2" RETURN n +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "ewm8ewnn ewweklnbgeireg@l23:ewe" AND n.prop1 = "model" AND n.prop2 = 16 AND n.prop3 = "normalize_data" RETURN n +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "ewm8ew43lnbgew888g@lew3:ewe" AND n.prop1 = "expectation" AND n.prop2 = 27 AND n.prop3 = "test_trips_1" RETURN n +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "ewm8ew43ffbgew888g@lew3:ewe" AND n.prop1 = "expectation" AND n.prop2 = 37 AND n.prop3 = "test_trips_2" RETURN n +---- ok +-STATEMENT MATCH (n:test) WHERE n.id = "ewm8ew43ffrrr88g@lew3:ewe" AND n.prop1 = "expectation" AND n.prop2 = 47 AND n.prop3 = "test_norm_data_1" RETURN n +---- ok +-STATEMENT MERGE (n:test { id: "nfewnfwn+wnfw"}) RETURN n.id +---- ok +-STATEMENT MERGE (n:test { id: "nfewn32n+wnfw"}) RETURN n.id +---- ok +-STATEMENT CREATE NODE TABLE res ( name STRING, PRIMARY KEY(name) ) +---- ok +-STATEMENT MERGE (n:res { name: "nfewnnfw" }) RETURN n.name +---- ok +-STATEMENT CREATE REL TABLE etable ( FROM res TO test , eprop1 STRING, eprop2 STRING, eprop3 STRING ) +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "nfewnfwn+wnfw" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "nfewj932-ew2b-5f33-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "fwfsiewmk" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "fwfsiewmk" AND t.id = "nfewnfwn+wnfw" CREATE (f)-[r:etable { eprop1 : "0.0.0", eprop3 : "nfewj932-ew2b-5f33-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "nfewnnfw" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "nfewn32n+wnfw" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "mdewj932-ew2b-5f44-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "s3scan+taxi_fhvhv" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "mdewj932-ew2b-5f44-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "fwfsiewmk" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "fwfsiewmk" AND t.id = "nfewn32n+wnfw" CREATE (f)-[r:etable { eprop1 : "0.0.0", eprop3 : "mdewj932-ew2b-5f44-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "fwfsiewmk" AND t.id = "s3scan+taxi_fhvhv" CREATE (f)-[r:etable { eprop1 : "0.0.0", eprop3 : "mdewj932-ew2b-5f44-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "nfewnnfw" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "ewm8ewnn ewweklnbgew888g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "qqewj932-ew2b-5f88-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "ewm8ewnn@l23:" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "qqewj932-ew2b-5f88-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "ewm8ew43ffrrr88g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "qqewj932-ew2b-5f88-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MATCH (f) - [r:etable] -> (t) WHERE t.id = 'ewm8ewnn@l23:' and r.eprop3 = 'qqewj932-ew2b-5f88-nfew' RETURN COUNT(*); +---- 1 +1 +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "ewm8ew43ffbgew888g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "ooewj932-ew2b-5f19-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "pdanwewer" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "pdanwewer" AND t.id = "ewm8ew43ffbgew888g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.2.4", eprop3 : "ooewj932-ew2b-5f19-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "another_dep" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "another_dep" AND t.id = "ewm8ew43ffbgew888g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "9.9.9", eprop3 : "ooewj932-ew2b-5f19-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "nfewnnfw" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "ewm8ewnn ewweklnbgeireg@l23:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "rrewj932-ew2b-5f92-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "pdanwewer" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "pdanwewer" AND t.id = "ewm8ewnn ewweklnbgeireg@l23:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "rrewj932-ew2b-5f92-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "numpy" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "numpy" AND t.id = "ewm8ewnn ewweklnbgeireg@l23:ewe" CREATE (f)-[r:etable { eprop1 : "2.2.2", eprop3 : "rrewj932-ew2b-5f92-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "nfewnnfw" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "fwfwfe8g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "mmewj932-ew2b-5f00-nfew" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "nfewnnfw" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "nfewnnfw" AND t.id = "ewm8ew43lnbgew888g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.1.1", eprop3 : "piewj932-ew2b-5f00-nfrr" }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:res { name: "pdanwewer" }) RETURN n.name +---- ok +-STATEMENT MATCH (f:res), (t:test) WHERE f.name = "pdanwewer" AND t.id = "ewm8ew43lnbgew888g@lew3:ewe" CREATE (f)-[r:etable { eprop1 : "1.2.3", eprop3 : "piewj932-ew2b-5f00-nfrr" }]->(t) RETURN r +---- ok +-STATEMENT MATCH (f) - [r:etable] -> (t) WHERE t.id = 'ewm8ewnn@l23:' and r.eprop3 = 'qqewj932-ew2b-5f88-nfew' RETURN COUNT(*); +---- 1 +1 From 1f88b3f1a2160d416bfce6a0693b2f094ce94479 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Thu, 14 Mar 2024 17:46:07 +0800 Subject: [PATCH 037/136] rework local storage: separate the storage of insertions and updates --- CMakeLists.txt | 2 +- .../catalog_entry/rel_table_catalog_entry.cpp | 41 +- .../data_chunk/data_chunk_collection.cpp | 42 +- src/common/types/types.cpp | 9 + src/function/table/call/storage_info.cpp | 8 +- .../catalog_entry/rel_table_catalog_entry.h | 1 + .../catalog_entry/table_catalog_entry.h | 4 +- src/include/common/column_data_format.h | 2 +- .../common/data_chunk/data_chunk_collection.h | 24 +- src/include/common/types/types.h | 1 + src/include/processor/operator/partitioner.h | 5 +- .../storage/local_storage/local_node_table.h | 34 +- .../storage/local_storage/local_rel_table.h | 96 +-- .../storage/local_storage/local_table.h | 195 ++++-- .../storage/stats/rel_table_statistics.h | 24 +- .../storage/stats/rels_store_statistics.h | 4 +- src/include/storage/storage_utils.h | 5 +- src/include/storage/store/column.h | 40 +- src/include/storage/store/node_table_data.h | 10 +- src/include/storage/store/null_column.h | 12 +- src/include/storage/store/rel_table.h | 4 - src/include/storage/store/rel_table_data.h | 37 +- src/include/storage/store/string_column.h | 9 +- src/include/storage/store/struct_column.h | 11 +- src/include/storage/store/table_data.h | 4 +- src/include/storage/store/var_list_column.h | 7 +- src/processor/operator/partitioner.cpp | 42 +- .../operator/persistent/delete_executor.cpp | 6 + .../operator/persistent/rel_batch_insert.cpp | 2 +- .../local_storage/local_node_table.cpp | 110 ++- src/storage/local_storage/local_rel_table.cpp | 325 ++++----- src/storage/local_storage/local_table.cpp | 152 +++-- src/storage/stats/property_statistics.cpp | 4 +- src/storage/stats/rel_table_statistics.cpp | 51 +- src/storage/stats/rels_store_statistics.cpp | 16 +- src/storage/storage_manager.cpp | 6 +- src/storage/storage_utils.cpp | 3 - src/storage/store/column.cpp | 112 +-- src/storage/store/node_table_data.cpp | 37 +- src/storage/store/null_column.cpp | 33 +- src/storage/store/rel_table.cpp | 26 +- src/storage/store/rel_table_data.cpp | 257 +++---- src/storage/store/string_column.cpp | 25 +- src/storage/store/struct_column.cpp | 30 +- src/storage/wal_replayer.cpp | 12 +- test/test_files/tinysnb/call/call.test | 4 +- test/test_files/update_node/set_tinysnb.test | 644 +++++++++--------- test/test_files/update_rel/create_empty.test | 3 + 48 files changed, 1238 insertions(+), 1293 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10d87523836..a2bbff5f91d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.15) -project(Kuzu VERSION 0.3.2.1 LANGUAGES CXX C) +project(Kuzu VERSION 0.3.2.2 LANGUAGES CXX C) find_package(Threads REQUIRED) diff --git a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp index 82922f68708..0ea59ba5e59 100644 --- a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp @@ -2,12 +2,14 @@ #include "catalog/catalog.h" +using namespace kuzu::common; + namespace kuzu { namespace catalog { -RelTableCatalogEntry::RelTableCatalogEntry(std::string name, common::table_id_t tableID, +RelTableCatalogEntry::RelTableCatalogEntry(std::string name, table_id_t tableID, common::RelMultiplicity srcMultiplicity, common::RelMultiplicity dstMultiplicity, - common::table_id_t srcTableID, common::table_id_t dstTableID) + table_id_t srcTableID, table_id_t dstTableID) : TableCatalogEntry{CatalogEntryType::REL_TABLE_ENTRY, std::move(name), tableID}, srcMultiplicity{srcMultiplicity}, dstMultiplicity{dstMultiplicity}, srcTableID{srcTableID}, dstTableID{dstTableID} {} @@ -20,27 +22,32 @@ RelTableCatalogEntry::RelTableCatalogEntry(const RelTableCatalogEntry& other) dstTableID = other.dstTableID; } -bool RelTableCatalogEntry::isParent(common::table_id_t tableID) { +bool RelTableCatalogEntry::isParent(table_id_t tableID) { return srcTableID == tableID || dstTableID == tableID; } -bool RelTableCatalogEntry::isSingleMultiplicity(common::RelDataDirection direction) const { +column_id_t RelTableCatalogEntry::getColumnID(property_id_t propertyID) const { + auto it = std::find_if(properties.begin(), properties.end(), + [&propertyID](const auto& property) { return property.getPropertyID() == propertyID; }); + // Skip the first column in the rel table, which is reserved for nbrID. + return it == properties.end() ? common::INVALID_COLUMN_ID : + std::distance(properties.begin(), it) + 1; +} + +bool RelTableCatalogEntry::isSingleMultiplicity(RelDataDirection direction) const { return getMultiplicity(direction) == common::RelMultiplicity::ONE; } -common::RelMultiplicity RelTableCatalogEntry::getMultiplicity( - common::RelDataDirection direction) const { - return direction == common::RelDataDirection::FWD ? dstMultiplicity : srcMultiplicity; +common::RelMultiplicity RelTableCatalogEntry::getMultiplicity(RelDataDirection direction) const { + return direction == RelDataDirection::FWD ? dstMultiplicity : srcMultiplicity; } -common::table_id_t RelTableCatalogEntry::getBoundTableID( - common::RelDataDirection relDirection) const { - return relDirection == common::RelDataDirection::FWD ? srcTableID : dstTableID; +table_id_t RelTableCatalogEntry::getBoundTableID(RelDataDirection relDirection) const { + return relDirection == RelDataDirection::FWD ? srcTableID : dstTableID; } -common::table_id_t RelTableCatalogEntry::getNbrTableID( - common::RelDataDirection relDirection) const { - return relDirection == common::RelDataDirection::FWD ? dstTableID : srcTableID; +table_id_t RelTableCatalogEntry::getNbrTableID(RelDataDirection relDirection) const { + return relDirection == RelDataDirection::FWD ? dstTableID : srcTableID; } -void RelTableCatalogEntry::serialize(common::Serializer& serializer) const { +void RelTableCatalogEntry::serialize(Serializer& serializer) const { TableCatalogEntry::serialize(serializer); serializer.write(srcMultiplicity); serializer.write(dstMultiplicity); @@ -49,11 +56,11 @@ void RelTableCatalogEntry::serialize(common::Serializer& serializer) const { } std::unique_ptr RelTableCatalogEntry::deserialize( - common::Deserializer& deserializer) { + Deserializer& deserializer) { common::RelMultiplicity srcMultiplicity; common::RelMultiplicity dstMultiplicity; - common::table_id_t srcTableID; - common::table_id_t dstTableID; + table_id_t srcTableID; + table_id_t dstTableID; deserializer.deserializeValue(srcMultiplicity); deserializer.deserializeValue(dstMultiplicity); deserializer.deserializeValue(srcTableID); diff --git a/src/common/data_chunk/data_chunk_collection.cpp b/src/common/data_chunk/data_chunk_collection.cpp index c0a142d8dd8..be9d1824b87 100644 --- a/src/common/data_chunk/data_chunk_collection.cpp +++ b/src/common/data_chunk/data_chunk_collection.cpp @@ -7,35 +7,35 @@ DataChunkCollection::DataChunkCollection(storage::MemoryManager* mm) : mm{mm} {} void DataChunkCollection::append(DataChunk& chunk) { auto numTuplesToAppend = chunk.state->selVector->selectedSize; - auto chunkToAppendInfo = chunks.empty() ? allocateChunk(chunk) : chunks.back().get(); auto numTuplesAppended = 0u; while (numTuplesAppended < numTuplesToAppend) { - if (chunkToAppendInfo->state->selVector->selectedSize == DEFAULT_VECTOR_CAPACITY) { - chunkToAppendInfo = allocateChunk(chunk); + if (chunks.empty() || + chunks.back().state->selVector->selectedSize == DEFAULT_VECTOR_CAPACITY) { + allocateChunk(chunk); } + auto& chunkToAppend = chunks.back(); auto numTuplesToCopy = std::min(numTuplesToAppend - numTuplesAppended, - DEFAULT_VECTOR_CAPACITY - chunkToAppendInfo->state->selVector->selectedSize); + DEFAULT_VECTOR_CAPACITY - chunkToAppend.state->selVector->selectedSize); for (auto vectorIdx = 0u; vectorIdx < chunk.getNumValueVectors(); vectorIdx++) { for (auto i = 0u; i < numTuplesToCopy; i++) { auto srcPos = chunk.state->selVector->selectedPositions[numTuplesAppended + i]; - auto dstPos = chunkToAppendInfo->state->selVector->selectedSize + i; - chunkToAppendInfo->getValueVector(vectorIdx)->copyFromVectorData( + auto dstPos = chunkToAppend.state->selVector->selectedSize + i; + chunkToAppend.getValueVector(vectorIdx)->copyFromVectorData( dstPos, chunk.getValueVector(vectorIdx).get(), srcPos); } } - chunkToAppendInfo->state->selVector->selectedSize += numTuplesToCopy; + chunkToAppend.state->selVector->selectedSize += numTuplesToCopy; numTuplesAppended += numTuplesToCopy; } } -void DataChunkCollection::append(std::unique_ptr chunk) { - KU_ASSERT(chunk); +void DataChunkCollection::merge(DataChunk chunk) { if (chunks.empty()) { - initTypes(*chunk); + initTypes(chunk); } - KU_ASSERT(chunk->getNumValueVectors() == types.size()); - for (auto vectorIdx = 0u; vectorIdx < chunk->getNumValueVectors(); vectorIdx++) { - KU_ASSERT(chunk->getValueVector(vectorIdx)->dataType == types[vectorIdx]); + KU_ASSERT(chunk.getNumValueVectors() == types.size()); + for (auto vectorIdx = 0u; vectorIdx < chunk.getNumValueVectors(); vectorIdx++) { + KU_ASSERT(chunk.getValueVector(vectorIdx)->dataType == types[vectorIdx]); } chunks.push_back(std::move(chunk)); } @@ -47,28 +47,18 @@ void DataChunkCollection::initTypes(DataChunk& chunk) { } } -std::vector DataChunkCollection::getChunks() const { - std::vector ret; - ret.reserve(chunks.size()); - for (auto& chunk : chunks) { - ret.push_back(chunk.get()); - } - return ret; -} - -DataChunk* DataChunkCollection::allocateChunk(DataChunk& chunk) { +void DataChunkCollection::allocateChunk(DataChunk& chunk) { if (chunks.empty()) { types.reserve(chunk.getNumValueVectors()); for (auto vectorIdx = 0u; vectorIdx < chunk.getNumValueVectors(); vectorIdx++) { types.push_back(chunk.getValueVector(vectorIdx)->dataType); } } - auto newChunk = std::make_unique(types.size(), std::make_shared()); + DataChunk newChunk(types.size(), std::make_shared()); for (auto i = 0u; i < types.size(); i++) { - newChunk->insert(i, std::make_shared(types[i], mm)); + newChunk.insert(i, std::make_shared(types[i], mm)); } chunks.push_back(std::move(newChunk)); - return chunks.back().get(); } } // namespace common diff --git a/src/common/types/types.cpp b/src/common/types/types.cpp index abad6d61c17..27ce9f88ae8 100644 --- a/src/common/types/types.cpp +++ b/src/common/types/types.cpp @@ -451,6 +451,15 @@ std::vector LogicalType::copy(const std::vector& types return typesCopy; } +std::vector LogicalType::copy(const std::vector& types) { + std::vector typesCopy; + typesCopy.reserve(types.size()); + for (auto& type : types) { + typesCopy.push_back(*type->copy()); + } + return typesCopy; +} + PhysicalTypeID LogicalType::getPhysicalType(LogicalTypeID typeID) { switch (typeID) { case LogicalTypeID::ANY: { diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index 6cdd3026345..2fdf75fb6ac 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -48,8 +48,6 @@ struct StorageInfoSharedState final : public CallFuncSharedState { columns.push_back(relTable->getCSRLengthColumn(RelDataDirection::FWD)); columns.push_back(relTable->getCSROffsetColumn(RelDataDirection::BWD)); columns.push_back(relTable->getCSRLengthColumn(RelDataDirection::BWD)); - columns.push_back(relTable->getAdjColumn(RelDataDirection::FWD)); - columns.push_back(relTable->getAdjColumn(RelDataDirection::BWD)); for (auto columnID = 0u; columnID < relTable->getNumColumns(); columnID++) { auto column = relTable->getColumn(columnID, RelDataDirection::FWD); auto collectedColumns = collectColumns(column); @@ -167,10 +165,10 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output while (true) { if (localState->currChunkIdx < localState->dataChunkCollection->getNumChunks()) { // Copy from local state chunk. - auto chunk = localState->dataChunkCollection->getChunk(localState->currChunkIdx); - auto numValuesToOutput = chunk->state->selVector->selectedSize; + auto& chunk = localState->dataChunkCollection->getChunkUnsafe(localState->currChunkIdx); + auto numValuesToOutput = chunk.state->selVector->selectedSize; for (auto columnIdx = 0u; columnIdx < dataChunk.getNumValueVectors(); columnIdx++) { - auto localVector = chunk->getValueVector(columnIdx); + auto localVector = chunk.getValueVector(columnIdx); auto outputVector = dataChunk.getValueVector(columnIdx); for (auto i = 0u; i < numValuesToOutput; i++) { outputVector->copyFromVectorData(i, localVector.get(), i); diff --git a/src/include/catalog/catalog_entry/rel_table_catalog_entry.h b/src/include/catalog/catalog_entry/rel_table_catalog_entry.h index 5fedd1dc5bd..7fa776b4bc7 100644 --- a/src/include/catalog/catalog_entry/rel_table_catalog_entry.h +++ b/src/include/catalog/catalog_entry/rel_table_catalog_entry.h @@ -23,6 +23,7 @@ class RelTableCatalogEntry final : public TableCatalogEntry { //===--------------------------------------------------------------------===// bool isParent(common::table_id_t tableID) override; common::TableType getTableType() const override { return common::TableType::REL; } + common::column_id_t getColumnID(common::property_id_t propertyID) const override; common::table_id_t getSrcTableID() const { return srcTableID; } common::table_id_t getDstTableID() const { return dstTableID; } bool isSingleMultiplicity(common::RelDataDirection direction) const; diff --git a/src/include/catalog/catalog_entry/table_catalog_entry.h b/src/include/catalog/catalog_entry/table_catalog_entry.h index e3c0ba6d283..93990ea4d6f 100644 --- a/src/include/catalog/catalog_entry/table_catalog_entry.h +++ b/src/include/catalog/catalog_entry/table_catalog_entry.h @@ -39,7 +39,7 @@ class TableCatalogEntry : public CatalogEntry { bool containProperty(const std::string& propertyName) const; common::property_id_t getPropertyID(const std::string& propertyName) const; const Property* getProperty(common::property_id_t propertyID) const; - common::column_id_t getColumnID(common::property_id_t propertyID) const; + virtual common::column_id_t getColumnID(common::property_id_t propertyID) const; bool containPropertyType(const common::LogicalType& logicalType) const; void addProperty(std::string propertyName, std::unique_ptr dataType); void dropProperty(common::property_id_t propertyID); @@ -52,7 +52,7 @@ class TableCatalogEntry : public CatalogEntry { static std::unique_ptr deserialize( common::Deserializer& deserializer, CatalogEntryType type); -private: +protected: common::table_id_t tableID; std::string comment; common::property_id_t nextPID; diff --git a/src/include/common/column_data_format.h b/src/include/common/column_data_format.h index 5f4b3ad8803..ebaa367658c 100644 --- a/src/include/common/column_data_format.h +++ b/src/include/common/column_data_format.h @@ -7,5 +7,5 @@ namespace common { enum class ColumnDataFormat : uint8_t { REGULAR = 0, CSR = 1 }; -} +} // namespace common } // namespace kuzu diff --git a/src/include/common/data_chunk/data_chunk_collection.h b/src/include/common/data_chunk/data_chunk_collection.h index e6b0aa89e9f..e3d6db14938 100644 --- a/src/include/common/data_chunk/data_chunk_collection.h +++ b/src/include/common/data_chunk/data_chunk_collection.h @@ -5,36 +5,40 @@ namespace kuzu { namespace common { -// TODO(Guodong/Ziyi): We should extend this to ColumnDataCollection, which takes ResultSet into -// consideration for storage and scan. +// TODO(Guodong): Should rework this to use ColumnChunk. class DataChunkCollection { public: explicit DataChunkCollection(storage::MemoryManager* mm); + DELETE_COPY_DEFAULT_MOVE(DataChunkCollection); void append(DataChunk& chunk); - void append(std::unique_ptr chunk); - std::vector getChunks() const; - + inline const std::vector& getChunks() const { return chunks; } + inline std::vector& getChunksUnsafe() { return chunks; } inline uint64_t getNumChunks() const { return chunks.size(); } - inline DataChunk* getChunk(uint64_t idx) const { + inline const DataChunk& getChunk(uint64_t idx) const { + KU_ASSERT(idx < chunks.size()); + return chunks[idx]; + } + inline DataChunk& getChunkUnsafe(uint64_t idx) { KU_ASSERT(idx < chunks.size()); - return chunks[idx].get(); + return chunks[idx]; } inline void merge(DataChunkCollection* other) { for (auto& chunk : other->chunks) { - append(std::move(chunk)); + merge(std::move(chunk)); } } + void merge(DataChunk chunk); private: - DataChunk* allocateChunk(DataChunk& chunk); + void allocateChunk(DataChunk& chunk); void initTypes(DataChunk& chunk); private: storage::MemoryManager* mm; std::vector types; - std::vector> chunks; + std::vector chunks; }; } // namespace common diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 8a42d2c3702..d19f79ccfec 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -302,6 +302,7 @@ class LogicalType { static std::vector> copy( const std::vector>& types); static std::vector copy(const std::vector& types); + static std::vector copy(const std::vector& types); static std::unique_ptr ANY() { return std::make_unique(LogicalTypeID::ANY); diff --git a/src/include/processor/operator/partitioner.h b/src/include/processor/operator/partitioner.h index 0ea13067b09..19a327ee33a 100644 --- a/src/include/processor/operator/partitioner.h +++ b/src/include/processor/operator/partitioner.h @@ -112,10 +112,13 @@ class Partitioner : public Sink { std::vector numPartitions); private: + common::DataChunk constructDataChunk(const std::vector& columnPositions, + const std::vector& columnTypes, const ResultSet& resultSet, + const std::shared_ptr& state); // TODO: For now, RelBatchInsert will guarantee all data are inside one data chunk. Should be // generalized to resultSet later if needed. void copyDataToPartitions( - common::partition_idx_t partitioningIdx, common::DataChunk* chunkToCopyFrom); + common::partition_idx_t partitioningIdx, common::DataChunk chunkToCopyFrom); private: // Same size as a value vector. Each thread will allocate a chunk for each node group, diff --git a/src/include/storage/local_storage/local_node_table.h b/src/include/storage/local_storage/local_node_table.h index 8672e313c31..42343b40ec0 100644 --- a/src/include/storage/local_storage/local_node_table.h +++ b/src/include/storage/local_storage/local_node_table.h @@ -11,35 +11,26 @@ class LocalNodeNG final : public LocalNodeGroup { public: LocalNodeNG(common::offset_t nodeGroupStartOffset, const std::vector& dataTypes, MemoryManager* mm) - : LocalNodeGroup{nodeGroupStartOffset, dataTypes, mm} { - insertInfo.resize(dataTypes.size()); - updateInfo.resize(dataTypes.size()); - } + : LocalNodeGroup{nodeGroupStartOffset, dataTypes, mm} {} void scan(common::ValueVector* nodeIDVector, const std::vector& columnIDs, const std::vector& outputVectors); void lookup(common::offset_t nodeOffset, common::column_id_t columnID, common::ValueVector* outputVector, common::sel_t posInOutputVector); - void insert(common::ValueVector* nodeIDVector, - const std::vector& propertyVectors); - void update(common::ValueVector* nodeIDVector, common::column_id_t columnID, - common::ValueVector* propertyVector); - void delete_(common::ValueVector* nodeIDVector); - common::row_idx_t getRowIdx(common::column_id_t columnID, common::offset_t nodeOffset); + bool insert(std::vector nodeIDVectors, + std::vector propertyVectors) override; + bool update(std::vector nodeIDVectors, common::column_id_t columnID, + common::ValueVector* propertyVector) override; + bool delete_( + common::ValueVector* nodeIDVector, common::ValueVector* /*extraVector*/ = nullptr) override; - inline const offset_to_row_idx_t& getInsertInfoRef(common::column_id_t columnID) { - KU_ASSERT(columnID < insertInfo.size()); - return insertInfo[columnID]; + inline const offset_to_row_idx_t& getInsertInfoRef() { + return insertChunks.getOffsetToRowIdx(); } inline const offset_to_row_idx_t& getUpdateInfoRef(common::column_id_t columnID) { - KU_ASSERT(columnID < updateInfo.size()); - return updateInfo[columnID]; + return getUpdateChunks(columnID).getOffsetToRowIdx(); } - -private: - std::vector insertInfo; - std::vector updateInfo; }; class LocalNodeTableData final : public LocalTableData { @@ -52,11 +43,6 @@ class LocalNodeTableData final : public LocalTableData { void lookup(common::ValueVector* nodeIDVector, const std::vector& columnIDs, const std::vector& outputVectors); - void insert(common::ValueVector* nodeIDVector, - const std::vector& propertyVectors); - void update(common::ValueVector* nodeIDVector, common::column_id_t columnID, - common::ValueVector* propertyVector); - void delete_(common::ValueVector* nodeIDVector); private: LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) override; diff --git a/src/include/storage/local_storage/local_rel_table.h b/src/include/storage/local_storage/local_rel_table.h index 553b083ea8c..96c49be7c0f 100644 --- a/src/include/storage/local_storage/local_rel_table.h +++ b/src/include/storage/local_storage/local_rel_table.h @@ -7,89 +7,46 @@ namespace kuzu { namespace storage { -static constexpr common::column_id_t REL_ID_COLUMN_ID = 0; - -// Info of node groups with CSR chunks for rel tables. -// Note that srcNodeOffset here are the relative offset within each node group. -struct RelNGInfo { - update_insert_info_t adjInsertInfo; - std::vector insertInfoPerChunk; - std::vector updateInfoPerChunk; - delete_info_t deleteInfo; - common::RelMultiplicity multiplicity; - - RelNGInfo(common::RelMultiplicity multiplicity, common::column_id_t numChunks) - : multiplicity{multiplicity} { - insertInfoPerChunk.resize(numChunks); - updateInfoPerChunk.resize(numChunks); - } - - bool insert(common::offset_t srcOffsetInChunk, common::offset_t relOffset, - common::row_idx_t adjNodeRowIdx, const std::vector& propertyNodesRowIdx); - void update(common::offset_t srcOffsetInChunk, common::offset_t relOffset, - common::column_id_t columnID, common::row_idx_t rowIdx); - bool delete_(common::offset_t srcOffsetInChunk, common::offset_t relOffset); - - bool hasUpdates(); - - uint64_t getNumInsertedTuples(common::offset_t srcOffsetInChunk); - - const update_insert_info_t& getUpdateInfo(common::column_id_t columnID) { - KU_ASSERT(columnID == common::INVALID_COLUMN_ID || columnID < updateInfoPerChunk.size()); - return columnID == common::INVALID_COLUMN_ID ? getEmptyInfo() : - updateInfoPerChunk[columnID]; - } - const update_insert_info_t& getInsertInfo(common::column_id_t columnID) { - KU_ASSERT(columnID == common::INVALID_COLUMN_ID || columnID < insertInfoPerChunk.size()); - return columnID == common::INVALID_COLUMN_ID ? adjInsertInfo : insertInfoPerChunk[columnID]; - } - const delete_info_t& getDeleteInfo() const { return deleteInfo; } - - const update_insert_info_t& getEmptyInfo(); - -private: - inline static bool contains( - const std::unordered_set& set, common::offset_t value) { - return set.find(value) != set.end(); - } -}; +static constexpr common::column_id_t LOCAL_NBR_ID_COLUMN_ID = 0; +static constexpr common::column_id_t LOCAL_REL_ID_COLUMN_ID = 1; class LocalRelNG final : public LocalNodeGroup { + friend class RelTableData; + public: LocalRelNG(common::offset_t nodeGroupStartOffset, std::vector dataTypes, MemoryManager* mm, common::RelMultiplicity multiplicity); - common::row_idx_t scanCSR(common::offset_t srcOffsetInChunk, - common::offset_t posToReadForOffset, const std::vector& columnIDs, + common::row_idx_t scanCSR(common::offset_t srcOffset, common::offset_t posToReadForOffset, + const std::vector& columnIDs, const std::vector& outputVector); // For CSR, we need to apply updates and deletions here, while insertions are handled by // `scanCSR`. - void applyLocalChangesForCSRColumns(common::offset_t srcOffsetInChunk, + void applyLocalChangesToScannedVectors(common::offset_t srcOffset, const std::vector& columnIDs, common::ValueVector* relIDVector, const std::vector& outputVectors); - bool insert(common::ValueVector* srcNodeIDVector, common::ValueVector* dstNodeIDVector, - const std::vector& propertyVectors); - void update(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, - common::column_id_t columnID, common::ValueVector* propertyVector); - bool delete_(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); + bool insert(std::vector nodeIDVectors, + std::vector vectors) override; + bool update(std::vector nodeIDVectors, common::column_id_t columnID, + common::ValueVector* propertyVector) override; + bool delete_(common::ValueVector* srcNodeVector, common::ValueVector* relIDVector) override; - inline LocalVectorCollection* getAdjChunk() { return adjChunk.get(); } - inline LocalVectorCollection* getPropertyChunk(common::column_id_t columnID) { - KU_ASSERT(columnID < chunks.size()); - return chunks[columnID].get(); - } - inline RelNGInfo* getRelNGInfo() { return relNGInfo.get(); } + common::offset_t getNumInsertedRels(common::offset_t srcOffset) const; + void getChangesPerCSRSegment( + std::vector& sizeChangesPerSegment, std::vector& hasChangesPerSegment); private: - void applyCSRUpdates(common::offset_t srcOffsetInChunk, common::column_id_t columnID, - common::ValueVector* relIDVector, common::ValueVector* outputVector); - void applyCSRDeletions(common::offset_t srcOffsetInChunk, const delete_info_t& deleteInfo, - common::ValueVector* relIDVector); + static common::vector_idx_t getSegmentIdx(common::offset_t offset) { + return offset >> common::StorageConstants::CSR_SEGMENT_SIZE_LOG2; + } + + void applyCSRUpdates(common::column_id_t columnID, common::ValueVector* relIDVector, + common::ValueVector* outputVector); + void applyCSRDeletions(common::offset_t srcOffsetInChunk, common::ValueVector* relIDVector); private: - std::unique_ptr adjChunk; - std::unique_ptr relNGInfo; + common::RelMultiplicity multiplicity; }; class LocalRelTableData final : public LocalTableData { @@ -100,13 +57,6 @@ class LocalRelTableData final : public LocalTableData { std::vector dataTypes, MemoryManager* mm) : LocalTableData{std::move(dataTypes), mm}, multiplicity{multiplicity} {} - bool insert(common::ValueVector* srcNodeIDVector, common::ValueVector* dstNodeIDVector, - const std::vector& propertyVectors); - void update(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, - common::column_id_t columnID, common::ValueVector* propertyVector); - bool delete_(common::ValueVector* srcNodeIDVector, common::ValueVector* dstNodeIDVector, - common::ValueVector* relIDVector); - private: LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) override; diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index 061fb69947b..989e324df56 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -1,95 +1,177 @@ #pragma once -#include +#include +#include "common/data_chunk/data_chunk_collection.h" #include "common/enums/rel_multiplicity.h" #include "common/enums/table_type.h" #include "common/vector/value_vector.h" namespace kuzu { -namespace catalog { -class TableCatalogEntry; -} // namespace catalog namespace storage { -class TableData; -using offset_to_row_idx_t = std::map; +using offset_to_row_idx_t = std::unordered_map; +using offset_to_row_idx_vec_t = + std::unordered_map>; using offset_set_t = std::unordered_set; -using update_insert_info_t = std::map; -using delete_info_t = std::map>; -// TODO(Guodong): Instead of using ValueVector, we should switch to ColumnChunk. -// This class is used to store a chunk of local changes to a column in a node group. -// Values are stored inside `vector`. -class LocalVector { -public: - LocalVector(const common::LogicalType& dataType, MemoryManager* mm) : numValues{0} { - vector = std::make_unique(dataType, mm); - vector->setState(std::make_shared()); - vector->state->selVector->resetSelectorToValuePosBufferWithSize(1); - } +static constexpr common::column_id_t NBR_ID_COLUMN_ID = 0; +static constexpr common::column_id_t REL_ID_COLUMN_ID = 1; - void read(common::sel_t offsetInLocalVector, common::ValueVector* resultVector, - common::sel_t offsetInResultVector); - void append(common::ValueVector* valueVector); +struct LocalVectorCollection { + std::vector vectors; - inline common::ValueVector* getVector() { return vector.get(); } - inline bool isFull() const { return numValues == common::DEFAULT_VECTOR_CAPACITY; } + static LocalVectorCollection empty() { return LocalVectorCollection{}; } -private: - std::unique_ptr vector; - common::sel_t numValues; + inline bool isEmpty() const { return vectors.empty(); } + inline void appendVector(common::ValueVector* vector) { vectors.push_back(vector); } + inline common::ValueVector* getLocalVector(common::row_idx_t rowIdx) const { + auto vectorIdx = rowIdx >> common::DEFAULT_VECTOR_CAPACITY_LOG_2; + KU_ASSERT(vectorIdx < vectors.size()); + return vectors[vectorIdx]; + } + + LocalVectorCollection getStructChildVectorCollection(common::struct_field_idx_t idx) const; }; -// This class is used to store local changes of a column in a node group. -// It consists of a collection of LocalVector, each of which is a chunk of the local changes. -// By default, the size of each vector (chunk) is DEFAULT_VECTOR_CAPACITY, and the collection -// contains 64 vectors (chunks). -class LocalVectorCollection { +class LocalDataChunkCollection { public: - LocalVectorCollection(common::LogicalType dataType, MemoryManager* mm) - : dataType{std::move(dataType)}, mm{mm}, numRows{0} {} + LocalDataChunkCollection(MemoryManager* mm, std::vector dataTypes) + : dataChunkCollection{mm}, mm{mm}, dataTypes{std::move(dataTypes)}, numRows{0} {} - void read(common::row_idx_t rowIdx, common::ValueVector* outputVector, - common::sel_t posInOutputVector); - inline uint64_t getNumRows() const { return numRows; } - inline LocalVector* getLocalVector(common::row_idx_t rowIdx) { - auto vectorIdx = rowIdx >> common::DEFAULT_VECTOR_CAPACITY_LOG_2; - KU_ASSERT(vectorIdx < vectors.size()); - return vectors[vectorIdx].get(); + inline common::row_idx_t getRowIdxFromOffset(common::offset_t offset) { + KU_ASSERT(offsetToRowIdx.contains(offset)); + return offsetToRowIdx.at(offset); + } + inline std::vector& getRelOffsetsFromSrcOffset(common::offset_t srcOffset) { + KU_ASSERT(srcNodeOffsetToRelOffsets.contains(srcOffset)); + return srcNodeOffsetToRelOffsets.at(srcOffset); } + inline bool hasOffset(common::offset_t offset) const { return offsetToRowIdx.contains(offset); } + inline bool hasRelOffsetsFromSrcOffset(common::offset_t srcOffset) const { + return srcNodeOffsetToRelOffsets.contains(srcOffset); + } + inline uint64_t getNumRelsFromSrcOffset(common::offset_t srcOffset) const { + return srcNodeOffsetToRelOffsets.at(srcOffset).size(); + } + inline const offset_to_row_idx_vec_t& getSrcNodeOffsetToRelOffsets() const { + return srcNodeOffsetToRelOffsets; + } + inline const offset_to_row_idx_t& getOffsetToRowIdx() const { return offsetToRowIdx; } - std::unique_ptr getStructChildVectorCollection( - common::struct_field_idx_t idx); + bool isEmpty() const { return offsetToRowIdx.empty() && srcNodeOffsetToRelOffsets.empty(); } + void readValueAtRowIdx(common::row_idx_t rowIdx, common::column_id_t columnID, + common::ValueVector* outputVector, common::sel_t posInOutputVector); + bool read(common::offset_t offset, common::column_id_t columnID, + common::ValueVector* outputVector, common::sel_t posInOutputVector); - // TODO(Guodong): Change this interface to take an extra `SelVector` or `DataChunkState`. - common::row_idx_t append(common::ValueVector* vector); + inline void append(common::offset_t offset, std::vector vectors) { + offsetToRowIdx[offset] = appendToDataChunkCollection(vectors); + } + // Only used for rel tables. Should be moved out later. + inline void append(common::offset_t nodeOffset, common::offset_t relOffset, + std::vector vectors) { + append(relOffset, vectors); + srcNodeOffsetToRelOffsets[nodeOffset].push_back(relOffset); + } + void update( + common::offset_t offset, common::column_id_t columnID, common::ValueVector* propertyVector); + void remove(common::offset_t offset) { + if (offsetToRowIdx.contains(offset)) { + offsetToRowIdx.erase(offset); + } + } + // Only used for rel tables. Should be moved out later. + void remove(common::offset_t srcNodeOffset, common::offset_t relOffset); + + inline LocalVectorCollection getLocalChunk(common::column_id_t columnID) { + LocalVectorCollection localVectorCollection; + for (auto& chunk : dataChunkCollection.getChunksUnsafe()) { + localVectorCollection.appendVector(chunk.getValueVector(columnID).get()); + } + return localVectorCollection; + } private: - void prepareAppend(); + common::row_idx_t appendToDataChunkCollection(std::vector vectors); + common::DataChunk createNewDataChunk(); private: - common::LogicalType dataType; - MemoryManager* mm; - std::vector> vectors; + common::DataChunkCollection dataChunkCollection; + // The offset here can either be nodeOffset ( for node table) or relOffset (for rel table). + offset_to_row_idx_t offsetToRowIdx; + storage::MemoryManager* mm; + std::vector dataTypes; common::row_idx_t numRows; + + // Only used for rel tables. Should be moved out later. + offset_to_row_idx_vec_t srcNodeOffsetToRelOffsets; }; -class LocalNodeGroup { - friend class NodeTableData; +class LocalDeletionInfo { +public: + bool isEmpty() const { return deletedOffsets.empty() && srcNodeOffsetToRelOffsetVec.empty(); } + bool isEmpty(common::offset_t srcOffset) const { + return !srcNodeOffsetToRelOffsetVec.contains(srcOffset) || + srcNodeOffsetToRelOffsetVec.at(srcOffset).empty(); + } + bool containsOffset(common::offset_t offset) { return deletedOffsets.contains(offset); } + bool deleteOffset(common::offset_t offset) { + if (deletedOffsets.contains(offset)) { + return false; + } + deletedOffsets.insert(offset); + return true; + } + // For rel tables only. + void deleteRelAux(common::offset_t srcNodeOffset, common::offset_t relOffset) { + srcNodeOffsetToRelOffsetVec[srcNodeOffset].push_back(relOffset); + } + const offset_to_row_idx_vec_t& getSrcNodeOffsetToRelOffsetVec() const { + return srcNodeOffsetToRelOffsetVec; + } + uint64_t getNumDeletedRelsFromSrcOffset(common::offset_t srcOffset) const { + return srcNodeOffsetToRelOffsetVec.contains(srcOffset) ? + srcNodeOffsetToRelOffsetVec.at(srcOffset).size() : + 0; + } + +private: + // The offset here can either be nodeOffset ( for node table) or relOffset (for rel table). + offset_set_t deletedOffsets; + + // Only used for rel tables. Should be moved out later. + offset_to_row_idx_vec_t srcNodeOffsetToRelOffsetVec; +}; + +class LocalNodeGroup { public: LocalNodeGroup(common::offset_t nodeGroupStartOffset, std::vector dataTypes, MemoryManager* mm); virtual ~LocalNodeGroup() = default; - inline LocalVectorCollection* getLocalColumnChunk(common::column_id_t columnID) { - return chunks[columnID].get(); + virtual bool insert(std::vector nodeIDVectors, + std::vector propertyVectors) = 0; + virtual bool update(std::vector nodeIDVectors, + common::column_id_t columnID, common::ValueVector* propertyVector) = 0; + virtual bool delete_(common::ValueVector* IDVector, common::ValueVector* extraVector) = 0; + + LocalDataChunkCollection& getUpdateChunks(common::column_id_t columnID) { + KU_ASSERT(columnID < updateChunks.size()); + return updateChunks[columnID]; } + LocalDataChunkCollection& getInsesrtChunks() { return insertChunks; } + + bool hasUpdatesOrDeletions() const; protected: common::offset_t nodeGroupStartOffset; - std::vector> chunks; + storage::MemoryManager* mm; + + LocalDataChunkCollection insertChunks; + LocalDeletionInfo deleteInfo; + std::vector updateChunks; }; class LocalTableData { @@ -102,12 +184,19 @@ class LocalTableData { inline void clear() { nodeGroups.clear(); } + bool insert(std::vector nodeIDVectors, + std::vector propertyVectors); + bool update(std::vector nodeIDVectors, common::column_id_t columnID, + common::ValueVector* propertyVector); + bool delete_(common::ValueVector* nodeIDVector, common::ValueVector* extraVector = nullptr); + protected: virtual LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) = 0; protected: std::vector dataTypes; MemoryManager* mm; + std::unordered_map> nodeGroups; }; diff --git a/src/include/storage/stats/rel_table_statistics.h b/src/include/storage/stats/rel_table_statistics.h index 2a9348630e3..7249688006b 100644 --- a/src/include/storage/stats/rel_table_statistics.h +++ b/src/include/storage/stats/rel_table_statistics.h @@ -30,12 +30,12 @@ class RelTableStats : public TableStatistics { inline void addMetadataDAHInfoForColumn( std::unique_ptr metadataDAHInfo, common::RelDataDirection direction) { - auto& metadataDAHInfos = getDirectedPropertyMetadataDAHInfosRef(direction); + auto& metadataDAHInfos = getDirectedMetadataDAHInfosRef(direction); metadataDAHInfos.push_back(std::move(metadataDAHInfo)); } inline void removeMetadataDAHInfoForColumn( common::column_id_t columnID, common::RelDataDirection direction) { - auto& metadataDAHInfos = getDirectedPropertyMetadataDAHInfosRef(direction); + auto& metadataDAHInfos = getDirectedMetadataDAHInfosRef(direction); KU_ASSERT(columnID < metadataDAHInfos.size()); metadataDAHInfos.erase(metadataDAHInfos.begin() + columnID); } @@ -47,13 +47,9 @@ class RelTableStats : public TableStatistics { return direction == common::RelDataDirection::FWD ? fwdCSRLengthMetadataDAHInfo.get() : bwdCSRLengthMetadataDAHInfo.get(); } - inline MetadataDAHInfo* getAdjMetadataDAHInfo(common::RelDataDirection direction) { - return direction == common::RelDataDirection::FWD ? fwdAdjMetadataDAHInfo.get() : - bwdAdjMetadataDAHInfo.get(); - } - inline MetadataDAHInfo* getPropertyMetadataDAHInfo( + inline MetadataDAHInfo* getColumnMetadataDAHInfo( common::column_id_t columnID, common::RelDataDirection direction) { - auto& metadataDAHInfos = getDirectedPropertyMetadataDAHInfosRef(direction); + auto& metadataDAHInfos = getDirectedMetadataDAHInfosRef(direction); KU_ASSERT(columnID < metadataDAHInfos.size()); return metadataDAHInfos[columnID].get(); } @@ -67,10 +63,10 @@ class RelTableStats : public TableStatistics { } private: - inline std::vector>& getDirectedPropertyMetadataDAHInfosRef( + inline std::vector>& getDirectedMetadataDAHInfosRef( common::RelDataDirection direction) { - return direction == common::RelDataDirection::FWD ? fwdPropertyMetadataDAHInfos : - bwdPropertyMetadataDAHInfos; + return direction == common::RelDataDirection::FWD ? fwdMetadataDAHInfos : + bwdMetadataDAHInfos; } private: @@ -80,10 +76,8 @@ class RelTableStats : public TableStatistics { std::unique_ptr bwdCSROffsetMetadataDAHInfo; std::unique_ptr fwdCSRLengthMetadataDAHInfo; std::unique_ptr bwdCSRLengthMetadataDAHInfo; - std::unique_ptr fwdAdjMetadataDAHInfo; - std::unique_ptr bwdAdjMetadataDAHInfo; - std::vector> fwdPropertyMetadataDAHInfos; - std::vector> bwdPropertyMetadataDAHInfos; + std::vector> fwdMetadataDAHInfos; + std::vector> bwdMetadataDAHInfos; }; } // namespace storage diff --git a/src/include/storage/stats/rels_store_statistics.h b/src/include/storage/stats/rels_store_statistics.h index 48c79f4dcc7..d4faab037cb 100644 --- a/src/include/storage/stats/rels_store_statistics.h +++ b/src/include/storage/stats/rels_store_statistics.h @@ -48,9 +48,7 @@ class RelsStoreStats : public TablesStatistics { common::table_id_t tableID, common::RelDataDirection direction); MetadataDAHInfo* getCSRLengthMetadataDAHInfo(transaction::Transaction* transaction, common::table_id_t tableID, common::RelDataDirection direction); - MetadataDAHInfo* getAdjMetadataDAHInfo(transaction::Transaction* transaction, - common::table_id_t tableID, common::RelDataDirection direction); - MetadataDAHInfo* getPropertyMetadataDAHInfo(transaction::Transaction* transaction, + MetadataDAHInfo* getColumnMetadataDAHInfo(transaction::Transaction* transaction, common::table_id_t tableID, common::column_id_t columnID, common::RelDataDirection direction); diff --git a/src/include/storage/storage_utils.h b/src/include/storage/storage_utils.h index 7d55457cf6b..9ac95a005f9 100644 --- a/src/include/storage/storage_utils.h +++ b/src/include/storage/storage_utils.h @@ -69,9 +69,8 @@ class StorageUtils { DATA = 3, // This is used for data columns in VAR_LIST and STRING columns. CSR_OFFSET = 4, CSR_LENGTH = 5, - ADJ = 6, - STRUCT_CHILD = 7, - NULL_MASK = 8, + STRUCT_CHILD = 6, + NULL_MASK = 7, }; // TODO: Constrain T1 and T2 to numerics. diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index f691db1e477..69277a3b010 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -28,7 +28,7 @@ using batch_lookup_func_t = read_values_to_page_func_t; class NullColumn; class StructColumn; -class LocalVectorCollection; +struct LocalVectorCollection; class Column { friend class StringColumn; friend class VarListLocalColumn; @@ -63,7 +63,8 @@ class Column { virtual void lookup(transaction::Transaction* transaction, common::ValueVector* nodeIDVector, common::ValueVector* resultVector); - virtual void append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx); + // Append column chunk in a new node group. + virtual void append(ColumnChunk* columnChunk, common::node_group_idx_t nodeGroupIdx); inline common::LogicalType& getDataType() { return dataType; } inline const common::LogicalType& getDataType() const { return dataType; } @@ -75,9 +76,9 @@ class Column { Column* getNullColumn(); virtual void prepareCommitForChunk(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localColumnChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo, - const offset_set_t& deleteInfo); + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo); virtual void prepareCommitForChunk(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t startSrcOffset); @@ -113,7 +114,8 @@ class Column { ReadState getReadState( transaction::TransactionType transactionType, common::node_group_idx_t nodeGroupIdx) const; - static void applyLocalChunkToColumnChunk(LocalVectorCollection* localChunk, + virtual std::unique_ptr getEmptyChunkForCommit(uint64_t capacity); + static void applyLocalChunkToColumnChunk(const LocalVectorCollection& localChunk, ColumnChunk* columnChunk, const offset_to_row_idx_t& info); protected: @@ -148,8 +150,6 @@ class Column { void updatePageWithCursor( PageCursor cursor, const std::function& writeOp); - virtual std::unique_ptr getEmptyChunkForCommit(uint64_t capacity); - inline common::offset_t getMaxOffset(const std::vector& offsets) { common::offset_t maxOffset = 0u; for (auto offset : offsets) { @@ -163,22 +163,24 @@ class Column { const ColumnChunkMetadata& metadata, const offset_to_row_idx_t& insertInfo); bool isMaxOffsetOutOfPagesCapacity( const ColumnChunkMetadata& metadata, common::offset_t maxOffset); - bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo); + bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, + const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo); virtual bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo); + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo); virtual bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t srcOffset); virtual void commitLocalChunkInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo, - const offset_set_t& deleteInfo); - virtual void commitLocalChunkOutOfPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - bool isNewNodeGroup, const offset_to_row_idx_t& insertInfo, + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo); + virtual void commitLocalChunkOutOfPlace(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, bool isNewNodeGroup, + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const offset_set_t& deleteInfo); virtual void commitColumnChunkInPlace(common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t srcOffset); @@ -188,7 +190,7 @@ class Column { common::offset_t srcOffset); void applyLocalChunkToColumn(common::node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& info); + const LocalVectorCollection& localChunk, const offset_to_row_idx_t& info); // check if val is in range [start, end) static inline bool isInRange(uint64_t val, uint64_t start, uint64_t end) { diff --git a/src/include/storage/store/node_table_data.h b/src/include/storage/store/node_table_data.h index 75617ae8e4a..370e524fe13 100644 --- a/src/include/storage/store/node_table_data.h +++ b/src/include/storage/store/node_table_data.h @@ -27,13 +27,15 @@ class NodeTableData final : public TableData { common::ValueVector* nodeIDVector, const std::vector& outputVectors) override; - // These two interfaces are node table specific, as rel table requires also relIDVector. + // These interfaces are node table specific, as rel table requires also relIDVector. + // insert/update/delete_ keeps changes inside the local storage. void insert(transaction::Transaction* transaction, common::ValueVector* nodeIDVector, const std::vector& propertyVectors); void update(transaction::Transaction* transaction, common::column_id_t columnID, common::ValueVector* nodeIDVector, common::ValueVector* propertyVector); void delete_(transaction::Transaction* transaction, common::ValueVector* nodeIDVector); + // Flush the nodeGroup to disk and update metadataDAs. void append(NodeGroup* nodeGroup) override; void prepareLocalTableToCommit( @@ -43,6 +45,12 @@ class NodeTableData final : public TableData { transaction::Transaction* transaction) const override { return columns[0]->getNumNodeGroups(transaction); } + +private: + void append(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, + LocalNodeGroup* localNodeGroup); + void merge(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, + LocalNodeGroup* nodeGroup); }; } // namespace storage diff --git a/src/include/storage/store/null_column.h b/src/include/storage/store/null_column.h index 4a1a71ef184..5a507a90bc1 100644 --- a/src/include/storage/store/null_column.h +++ b/src/include/storage/store/null_column.h @@ -44,16 +44,20 @@ class NullColumn final : public Column { ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues) override; bool canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) override; bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t srcOffset) override; - void commitLocalChunkInPlace(Transaction* /*transaction*/, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override; + void commitLocalChunkInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const offset_set_t& deleteInfo) override; private: + bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, + const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo); std::unique_ptr getEmptyChunkForCommit(uint64_t capacity) override { return ColumnChunkFactory::createNullColumnChunk(enableCompression, capacity); } diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index 27f8c517728..305ca0d7399 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -54,10 +54,6 @@ class RelTable final : public Table { fwdRelTableData->dropColumn(columnID); bwdRelTableData->dropColumn(columnID); } - inline Column* getAdjColumn(common::RelDataDirection direction) { - return direction == common::RelDataDirection::FWD ? fwdRelTableData->getAdjColumn() : - bwdRelTableData->getAdjColumn(); - } inline Column* getCSROffsetColumn(common::RelDataDirection direction) { return direction == common::RelDataDirection::FWD ? fwdRelTableData->getCSROffsetColumn() : bwdRelTableData->getCSROffsetColumn(); diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index ab9a7fca0c4..dd37d955fa6 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -123,12 +123,9 @@ class RelTableData final : public TableData { common::offset_t rightCSROffset = common::INVALID_OFFSET; bool needSliding = false; - explicit LocalState(LocalRelNG* localNG) : localNG{localNG} { initChangesPerSegment(); } + explicit LocalState(LocalRelNG* localNG); inline void setRegion(PackedCSRRegion& region_) { region = region_; } - - private: - void initChangesPerSegment(); }; RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, @@ -152,7 +149,7 @@ class RelTableData final : public TableData { common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, common::ValueVector* propertyVector); bool delete_(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, - common::ValueVector* dstNodeIDVector, common::ValueVector* relIDVector); + common::ValueVector* relIDVector); void checkRelMultiplicityConstraint( transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector) const; @@ -160,10 +157,9 @@ class RelTableData final : public TableData { transaction::Transaction* transaction, common::offset_t nodeOffset) const; void append(NodeGroup* nodeGroup) override; - inline Column* getAdjColumn() const { return adjColumn.get(); } + inline Column* getNbrIDColumn() const { return columns[NBR_ID_COLUMN_ID].get(); } inline Column* getCSROffsetColumn() const { return csrHeaderColumns.offset.get(); } inline Column* getCSRLengthColumn() const { return csrHeaderColumns.length.get(); } - Column* getColumn(common::column_id_t columnID) override; void prepareLocalTableToCommit( transaction::Transaction* transaction, LocalTableData* localTable) override; @@ -173,10 +169,13 @@ class RelTableData final : public TableData { inline common::node_group_idx_t getNumNodeGroups( transaction::Transaction* transaction) const override { - return adjColumn->getNumNodeGroups(transaction); + return columns[NBR_ID_COLUMN_ID]->getNumNodeGroups(transaction); } private: + static common::offset_t getMaxNumNodesInRegion( + const CSRHeaderChunks& header, const PackedCSRRegion& region, const LocalRelNG* localNG); + std::vector findRegions( const CSRHeaderChunks& headerChunks, LocalState& localState); common::length_t getNewRegionSize(const CSRHeaderChunks& header, @@ -211,14 +210,12 @@ class RelTableData final : public TableData { void slideRightForInsertions(common::offset_t nodeOffset, common::offset_t rightBoundary, LocalState& localState, uint64_t numValuesToInsert); - void applyUpdatesToChunk(const PersistentState& persistentState, const PackedCSRRegion& region, - LocalVectorCollection* localChunk, const update_insert_info_t& updateInfo, - ColumnChunk* chunk); + void applyUpdatesToChunk(const PersistentState& persistentState, LocalState& localState, + const LocalVectorCollection& localChunk, ColumnChunk* chunk, common::column_id_t columnID); void applyInsertionsToChunk(const PersistentState& persistentState, - const LocalState& localState, LocalVectorCollection* localChunk, - const update_insert_info_t& insertInfo, ColumnChunk* chunk); - void applyDeletionsToChunk(const PersistentState& persistentState, const LocalState& localState, - const delete_info_t& deleteInfo, ColumnChunk* chunk); + const LocalState& localState, const LocalVectorCollection& localChunk, ColumnChunk* chunk); + void applyDeletionsToChunk( + const PersistentState& persistentState, const LocalState& localState, ColumnChunk* chunk); void applyUpdatesToColumn(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::column_id_t columnID, @@ -233,25 +230,22 @@ class RelTableData final : public TableData { LocalState& localState, const PersistentState& persistentState, Column* column); std::vector> getSlidesForDeletions( - const PersistentState& persistentState, const LocalState& localState, - const delete_info_t& deleteInfo); + const PersistentState& persistentState, const LocalState& localState); LocalRelNG* getLocalNodeGroup( transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx); - // TODO: Constrain T1 and T2 to numerics. template static double divideNoRoundUp(T1 v1, T2 v2) { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value); return (double)v1 / (double)v2; } template static uint64_t multiplyAndRoundUpTo(T1 v1, T2 v2) { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value); return std::ceil((double)v1 * (double)v2); } - LocalVectorCollection* getLocalChunk( - const LocalState& localState, common::column_id_t columnID); - inline void fillSequence(std::span offsets, common::offset_t startOffset) { for (auto i = 0u; i < offsets.size(); i++) { offsets[i] = i + startOffset; @@ -268,7 +262,6 @@ class RelTableData final : public TableData { private: PackedCSRInfo packedCSRInfo; CSRHeaderColumns csrHeaderColumns; - std::unique_ptr adjColumn; common::RelDataDirection direction; common::RelMultiplicity multiplicity; }; diff --git a/src/include/storage/store/string_column.h b/src/include/storage/store/string_column.h index fac763194cc..4b1eff6a8ae 100644 --- a/src/include/storage/store/string_column.h +++ b/src/include/storage/store/string_column.h @@ -49,8 +49,9 @@ class StringColumn final : public Column { private: bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo) override; + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo) override; bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t srcOffset) override; @@ -58,6 +59,10 @@ class StringColumn final : public Column { bool canIndexCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, uint64_t numStrings, common::offset_t maxOffset); + bool checkUpdateInPlace(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localChunk, + const offset_to_row_idx_t& writeInfo); + private: // Main column stores indices of values in the dictionary DictionaryColumn dictionary; diff --git a/src/include/storage/store/struct_column.h b/src/include/storage/store/struct_column.h index 696e1002b0a..613dfff7c96 100644 --- a/src/include/storage/store/struct_column.h +++ b/src/include/storage/store/struct_column.h @@ -34,9 +34,9 @@ class StructColumn final : public Column { ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues) override; void prepareCommitForChunk(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localColumnChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo, - const offset_set_t& deleteInfo) override; + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override; void prepareCommitForChunk(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t startSrcOffset) override; @@ -48,8 +48,9 @@ class StructColumn final : public Column { common::ValueVector* resultVector) override; bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo) override; + common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo) override; bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t dataOffset) override; diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index 13f3cc80b65..c9ba360cb39 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -35,8 +35,8 @@ class TableData { TablesStatistics* tableStats); inline common::vector_idx_t getNumColumns() const { return columns.size(); } - inline virtual Column* getColumn(common::column_id_t columnID) { - KU_ASSERT(columnID < columns.size()); + inline Column* getColumn(common::column_id_t columnID) { + KU_ASSERT(columnID < columns.size() && columnID != common::INVALID_COLUMN_ID); return columns[columnID].get(); } diff --git a/src/include/storage/store/var_list_column.h b/src/include/storage/store/var_list_column.h index 9fc7cdcb420..186ee43c7ff 100644 --- a/src/include/storage/store/var_list_column.h +++ b/src/include/storage/store/var_list_column.h @@ -82,10 +82,9 @@ class VarListColumn : public Column { void scanFiltered(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::ValueVector* offsetVector, const ListOffsetInfoInStorage& listOffsetInfoInStorage); - inline bool canCommitInPlace(transaction::Transaction* /*transaction*/, - common::node_group_idx_t /*nodeGroupIdx*/, LocalVectorCollection* /*localChunk*/, - const offset_to_row_idx_t& /*insertInfo*/, - const offset_to_row_idx_t& /*updateInfo*/) override { + inline bool canCommitInPlace(transaction::Transaction*, common::node_group_idx_t, + const LocalVectorCollection&, const offset_to_row_idx_t&, const LocalVectorCollection&, + const offset_to_row_idx_t&) override { // Always perform out-of-place commit for VAR_LIST columns. return false; } diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 83720c0ad4f..868480410ee 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -33,7 +33,7 @@ std::vector> PartitioningInfo::copy( return result; } -static common::partition_idx_t getNumPartitions(offset_t maxOffset) { +static partition_idx_t getNumPartitions(offset_t maxOffset) { return (maxOffset + StorageConstants::NODE_GROUP_SIZE) / StorageConstants::NODE_GROUP_SIZE; } @@ -104,23 +104,26 @@ void Partitioner::initLocalStateInternal(ResultSet* /*resultSet*/, ExecutionCont initializePartitioningStates(localState->partitioningBuffers, sharedState->numPartitions); } -static void constructDataChunk(DataChunk* dataChunk, const std::vector& columnPositions, - std::vector columnTypes, const ResultSet& resultSet) { +DataChunk Partitioner::constructDataChunk(const std::vector& columnPositions, + const std::vector& columnTypes, const ResultSet& resultSet, + const std::shared_ptr& state) { + DataChunk dataChunk(columnTypes.size(), state); for (auto i = 0u; i < columnPositions.size(); i++) { auto pos = columnPositions[i]; if (pos.isValid()) { - dataChunk->insert(i, resultSet.getValueVector(pos)); + dataChunk.insert(i, resultSet.getValueVector(pos)); } else { auto nullVector = std::make_shared(columnTypes[i]); nullVector->setAllNull(); - dataChunk->insert(i, nullVector); + dataChunk.insert(i, nullVector); } } + return dataChunk; } void Partitioner::initializePartitioningStates( std::vector>& partitioningBuffers, - std::vector numPartitions) { + std::vector numPartitions) { partitioningBuffers.resize(numPartitions.size()); for (auto partitioningIdx = 0u; partitioningIdx < numPartitions.size(); partitioningIdx++) { auto numPartition = numPartitions[partitioningIdx]; @@ -140,22 +143,19 @@ void Partitioner::executeInternal(ExecutionContext* context) { auto keyVector = resultSet->getValueVector(info->keyDataPos); partitionIdxes->state = resultSet->getValueVector(info->keyDataPos)->state; info->partitionerFunc(keyVector.get(), partitionIdxes.get()); - auto columnDataChunk = - std::make_unique(info->columnTypes.size(), keyVector->state); - constructDataChunk( - columnDataChunk.get(), info->columnDataPositions, info->columnTypes, *resultSet); - copyDataToPartitions(partitioningIdx, columnDataChunk.get()); + auto chunkToCopyFrom = constructDataChunk( + info->columnDataPositions, info->columnTypes, *resultSet, keyVector->state); + copyDataToPartitions(partitioningIdx, std::move(chunkToCopyFrom)); } } sharedState->merge(std::move(localState->partitioningBuffers)); } -void Partitioner::copyDataToPartitions( - partition_idx_t partitioningIdx, DataChunk* chunkToCopyFrom) { +void Partitioner::copyDataToPartitions(partition_idx_t partitioningIdx, DataChunk chunkToCopyFrom) { SelectionVector selVector(1); selVector.resetSelectorToValuePosBufferWithSize(1); - for (auto i = 0u; i < chunkToCopyFrom->state->selVector->selectedSize; i++) { - auto posToCopyFrom = chunkToCopyFrom->state->selVector->selectedPositions[i]; + for (auto i = 0u; i < chunkToCopyFrom.state->selVector->selectedSize; i++) { + auto posToCopyFrom = chunkToCopyFrom.state->selVector->selectedPositions[i]; auto partitionIdx = partitionIdxes->getValue(posToCopyFrom); KU_ASSERT( partitionIdx < localState->getPartitioningBuffer(partitioningIdx)->partitions.size()); @@ -164,17 +164,17 @@ void Partitioner::copyDataToPartitions( if (partition.chunks.empty() || partition.chunks.back()[0]->getNumValues() + 1 > partition.chunks.back()[0]->getCapacity()) { partition.chunks.emplace_back(); - partition.chunks.back().reserve(chunkToCopyFrom->getNumValueVectors()); - for (auto j = 0u; j < chunkToCopyFrom->getNumValueVectors(); j++) { + partition.chunks.back().reserve(chunkToCopyFrom.getNumValueVectors()); + for (auto j = 0u; j < chunkToCopyFrom.getNumValueVectors(); j++) { partition.chunks.back().emplace_back(ColumnChunkFactory::createColumnChunk( - chunkToCopyFrom->getValueVector(j)->dataType, false /*enableCompression*/, + chunkToCopyFrom.getValueVector(j)->dataType, false /*enableCompression*/, Partitioner::CHUNK_SIZE)); } } - KU_ASSERT(partition.chunks.back().size() == chunkToCopyFrom->getNumValueVectors()); + KU_ASSERT(partition.chunks.back().size() == chunkToCopyFrom.getNumValueVectors()); selVector.selectedPositions[0] = posToCopyFrom; - for (auto j = 0u; j < chunkToCopyFrom->getNumValueVectors(); j++) { - partition.chunks.back()[j]->append(chunkToCopyFrom->getValueVector(j).get(), selVector); + for (auto j = 0u; j < chunkToCopyFrom.getNumValueVectors(); j++) { + partition.chunks.back()[j]->append(chunkToCopyFrom.getValueVector(j).get(), selVector); } } } diff --git a/src/processor/operator/persistent/delete_executor.cpp b/src/processor/operator/persistent/delete_executor.cpp index 59abfe16a75..5cdf314dba1 100644 --- a/src/processor/operator/persistent/delete_executor.cpp +++ b/src/processor/operator/persistent/delete_executor.cpp @@ -82,6 +82,12 @@ void MultiLabelNodeDeleteExecutor::delete_(ExecutionContext* context) { detachDeleteState.get()); } for (auto& relTable : bwdRelTables) { + // TODO(Guodong): For detach delete, there can possibly be a case where the same relTable is + // in both fwd and bwd rel tables set. the rels can be deleted twice. This is a temporary + // hack. + if (deleteType == DeleteNodeType::DETACH_DELETE && fwdRelTables.contains(relTable)) { + continue; + } deleteFromRelTable(context, deleteType, RelDataDirection::BWD, relTable, nodeIDVector, detachDeleteState.get()); } diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index 8fad55e9d20..859fb45fc8c 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -36,9 +36,9 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { relLocalState->nodeGroupIdx = partitionerSharedState->getNextPartition(relInfo->partitioningIdx); if (relLocalState->nodeGroupIdx == INVALID_PARTITION_IDX) { + // No more partitions left in the partitioning buffer. break; } - // Read the whole partition, and set to node group. auto& partitioningBuffer = partitionerSharedState->getPartitionBuffer( relInfo->partitioningIdx, relLocalState->nodeGroupIdx); auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(relLocalState->nodeGroupIdx); diff --git a/src/storage/local_storage/local_node_table.cpp b/src/storage/local_storage/local_node_table.cpp index b9356602922..543cbb78f47 100644 --- a/src/storage/local_storage/local_node_table.cpp +++ b/src/storage/local_storage/local_node_table.cpp @@ -13,7 +13,6 @@ void LocalNodeNG::scan(ValueVector* nodeIDVector, const std::vector KU_ASSERT(columnIDs.size() == outputVectors.size()); for (auto i = 0u; i < columnIDs.size(); i++) { auto columnID = columnIDs[i]; - KU_ASSERT(columnID < chunks.size()); for (auto pos = 0u; pos < nodeIDVector->state->selVector->selectedSize; pos++) { auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[pos]; auto nodeOffset = nodeIDVector->getValue(nodeIDPos).offset; @@ -25,73 +24,71 @@ void LocalNodeNG::scan(ValueVector* nodeIDVector, const std::vector void LocalNodeNG::lookup( offset_t nodeOffset, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { - KU_ASSERT(columnID < chunks.size()); - row_idx_t rowIdx = getRowIdx(columnID, nodeOffset - nodeGroupStartOffset); - if (rowIdx != INVALID_ROW_IDX) { - chunks[columnID]->read(rowIdx, outputVector, posInOutputVector); + if (deleteInfo.containsOffset(nodeOffset)) { + // Node has been deleted. + return; + } + if (insertChunks.read(nodeOffset, columnID, outputVector, posInOutputVector)) { + // Node has been newly inserted. + return; } + updateChunks[columnID].read(nodeOffset, 0 /*columnID*/, outputVector, posInOutputVector); } -void LocalNodeNG::insert( - ValueVector* nodeIDVector, const std::vector& propertyVectors) { - KU_ASSERT(propertyVectors.size() == chunks.size() && - nodeIDVector->state->selVector->selectedSize == 1); +bool LocalNodeNG::insert(std::vector nodeIDVectors, + std::vector propertyVectors) { + KU_ASSERT(nodeIDVectors.size() == 1); + auto nodeIDVector = nodeIDVectors[0]; + KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[0]; if (nodeIDVector->isNull(nodeIDPos)) { - return; + return false; } + // The nodeOffset here should be the offset within the node group. auto nodeOffset = nodeIDVector->getValue(nodeIDPos).offset - nodeGroupStartOffset; KU_ASSERT(nodeOffset < StorageConstants::NODE_GROUP_SIZE); - for (auto columnID = 0u; columnID < chunks.size(); columnID++) { - auto rowIdx = chunks[columnID]->append(propertyVectors[columnID]); - KU_ASSERT(!updateInfo[columnID].contains(nodeOffset)); - insertInfo[columnID][nodeOffset] = rowIdx; - } + insertChunks.append(nodeOffset, propertyVectors); + return true; } -void LocalNodeNG::update( - ValueVector* nodeIDVector, column_id_t columnID, ValueVector* propertyVector) { - KU_ASSERT(columnID < chunks.size() && nodeIDVector->state->selVector->selectedSize == 1); +bool LocalNodeNG::update(std::vector nodeIDVectors, + common::column_id_t columnID, common::ValueVector* propertyVector) { + KU_ASSERT(nodeIDVectors.size() == 1); + auto nodeIDVector = nodeIDVectors[0]; + KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[0]; if (nodeIDVector->isNull(nodeIDPos)) { - return; + return false; } auto nodeOffset = nodeIDVector->getValue(nodeIDPos).offset - nodeGroupStartOffset; - KU_ASSERT(nodeOffset < StorageConstants::NODE_GROUP_SIZE); - auto rowIdx = chunks[columnID]->append(propertyVector); - if (insertInfo[columnID].contains(nodeOffset)) { - // This node is in local storage, and had been newly inserted. - insertInfo.at(columnID)[nodeOffset] = rowIdx; + KU_ASSERT(nodeOffset < StorageConstants::NODE_GROUP_SIZE && columnID < updateChunks.size()); + // Check if the node is newly inserted or in persistent storage. + if (insertChunks.hasOffset(nodeOffset)) { + insertChunks.update(nodeOffset, columnID, propertyVector); } else { - updateInfo[columnID][nodeOffset] = rowIdx; + updateChunks[columnID].append(nodeOffset, {propertyVector}); } + return true; } -void LocalNodeNG::delete_(ValueVector* nodeIDVector) { +bool LocalNodeNG::delete_(common::ValueVector* nodeIDVector, common::ValueVector* /*extraVector*/) { KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[0]; if (nodeIDVector->isNull(nodeIDPos)) { - return; + return false; } auto nodeOffset = nodeIDVector->getValue(nodeIDPos).offset - nodeGroupStartOffset; KU_ASSERT(nodeOffset < StorageConstants::NODE_GROUP_SIZE); - for (auto i = 0u; i < chunks.size(); i++) { - insertInfo[i].erase(nodeOffset); - updateInfo[i].erase(nodeOffset); - } -} - -row_idx_t LocalNodeNG::getRowIdx(column_id_t columnID, offset_t offsetInChunk) { - KU_ASSERT(columnID < chunks.size()); - if (updateInfo[columnID].contains(offsetInChunk)) { - // This node is in persistent storage, and had been updated. - return updateInfo[columnID][offsetInChunk]; - } else if (insertInfo[columnID].contains(offsetInChunk)) { - // This node is in local storage, and had been newly inserted. - return insertInfo[columnID][offsetInChunk]; + // Check if the node is newly inserted or in persistent storage. + if (insertChunks.hasOffset(nodeOffset)) { + insertChunks.remove(nodeOffset); } else { - return INVALID_ROW_IDX; + for (auto i = 0u; i < updateChunks.size(); i++) { + updateChunks[i].remove(nodeOffset); + } + deleteInfo.deleteOffset(nodeOffset); } + return true; } void LocalNodeTableData::scan(ValueVector* nodeIDVector, const std::vector& columnIDs, @@ -125,35 +122,6 @@ void LocalNodeTableData::lookup(ValueVector* nodeIDVector, } } -void LocalNodeTableData::insert( - ValueVector* nodeIDVector, const std::vector& propertyVectors) { - KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); - auto localNodeGroup = - ku_dynamic_cast(getOrCreateLocalNodeGroup(nodeIDVector)); - KU_ASSERT(localNodeGroup); - localNodeGroup->insert(nodeIDVector, propertyVectors); -} - -void LocalNodeTableData::update( - ValueVector* nodeIDVector, column_id_t columnID, ValueVector* propertyVector) { - auto localNodeGroup = - ku_dynamic_cast(getOrCreateLocalNodeGroup(nodeIDVector)); - KU_ASSERT(localNodeGroup); - localNodeGroup->update(nodeIDVector, columnID, propertyVector); -} - -void LocalNodeTableData::delete_(ValueVector* nodeIDVector) { - auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[0]; - auto nodeOffset = nodeIDVector->getValue(nodeIDPos).offset; - auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(nodeOffset); - if (!nodeGroups.contains(nodeGroupIdx)) { - return; - } - auto localNodeGroup = - ku_dynamic_cast(nodeGroups.at(nodeGroupIdx).get()); - localNodeGroup->delete_(nodeIDVector); -} - LocalNodeGroup* LocalNodeTableData::getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) { auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[0]; auto nodeOffset = nodeIDVector->getValue(nodeIDPos).offset; diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index 1bef39a08b1..7f40321acb8 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -1,6 +1,5 @@ #include "storage/local_storage/local_rel_table.h" -#include "common/cast.h" #include "storage/storage_utils.h" using namespace kuzu::common; @@ -8,181 +7,69 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -bool RelNGInfo::insert(offset_t srcOffsetInChunk, offset_t relOffset, row_idx_t adjNodeRowIdx, - const std::vector& propertyNodesRowIdx) { - KU_ASSERT(propertyNodesRowIdx.size() == insertInfoPerChunk.size()); - if (deleteInfo.contains(srcOffsetInChunk) && - contains(deleteInfo.at(srcOffsetInChunk), relOffset)) { - deleteInfo.at(srcOffsetInChunk).erase(relOffset); - } - if (adjInsertInfo.contains(srcOffsetInChunk)) { - if (multiplicity == RelMultiplicity::ONE) { - throw RuntimeException("Inserting multiple edges to a single node in a " - "ONE_ONE/MANY_ONE relationship is not allowed."); - } - adjInsertInfo.at(srcOffsetInChunk)[relOffset] = adjNodeRowIdx; - } else { - adjInsertInfo[srcOffsetInChunk] = {{relOffset, adjNodeRowIdx}}; - } - for (auto i = 0u; i < propertyNodesRowIdx.size(); ++i) { - if (insertInfoPerChunk[i].contains(srcOffsetInChunk)) { - insertInfoPerChunk[i].at(srcOffsetInChunk)[relOffset] = propertyNodesRowIdx[i]; - } else { - insertInfoPerChunk[i][srcOffsetInChunk] = {{relOffset, propertyNodesRowIdx[i]}}; - } - } - return false; -} - -void RelNGInfo::update( - offset_t srcOffsetInChunk, offset_t relOffset, column_id_t columnID, row_idx_t rowIdx) { - // REL_ID_COLUMN_ID is immutable. - KU_ASSERT(columnID != REL_ID_COLUMN_ID && columnID < updateInfoPerChunk.size()); - if (deleteInfo.contains(srcOffsetInChunk) && - contains(deleteInfo.at(srcOffsetInChunk), relOffset)) { - // We choose to ignore the update operation if the node is deleted. - return; - } - if (insertInfoPerChunk[columnID].contains(srcOffsetInChunk) && - insertInfoPerChunk[columnID].at(srcOffsetInChunk).contains(relOffset)) { - // Update newly inserted value. - insertInfoPerChunk[columnID].at(srcOffsetInChunk)[relOffset] = rowIdx; - } else { - if (updateInfoPerChunk[columnID].contains(srcOffsetInChunk)) { - updateInfoPerChunk[columnID].at(srcOffsetInChunk)[relOffset] = rowIdx; - } else { - updateInfoPerChunk[columnID][srcOffsetInChunk] = {{relOffset, rowIdx}}; - } - } -} - -bool RelNGInfo::delete_(offset_t srcOffsetInChunk, offset_t relOffset) { - if (adjInsertInfo.contains(srcOffsetInChunk) && - adjInsertInfo.at(srcOffsetInChunk).contains(relOffset)) { - // Delete newly inserted tuple. - adjInsertInfo.at(srcOffsetInChunk).erase(relOffset); - for (auto& insertInfo : insertInfoPerChunk) { - insertInfo.at(srcOffsetInChunk).erase(relOffset); - } - } else { - if (deleteInfo.contains(srcOffsetInChunk)) { - if (deleteInfo.at(srcOffsetInChunk).contains(relOffset)) { - // The node is already deleted. - return false; - } else { - deleteInfo.at(srcOffsetInChunk).insert(relOffset); - } - } else { - deleteInfo[srcOffsetInChunk] = {relOffset}; - } - } - return true; -} - -bool RelNGInfo::hasUpdates() { - for (auto& updateInfo : updateInfoPerChunk) { - if (!updateInfo.empty()) { - return true; - } - } - return false; -} - -const update_insert_info_t& RelNGInfo::getEmptyInfo() { - static update_insert_info_t emptyInfo; - return emptyInfo; -} - -uint64_t RelNGInfo::getNumInsertedTuples(offset_t srcOffsetInChunk) { - return adjInsertInfo.contains(srcOffsetInChunk) ? adjInsertInfo.at(srcOffsetInChunk).size() : 0; -} - LocalRelNG::LocalRelNG(offset_t nodeGroupStartOffset, std::vector dataTypes, - MemoryManager* mm, common::RelMultiplicity multiplicity) - : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes), mm} { - relNGInfo = std::make_unique(multiplicity, chunks.size()); - adjChunk = std::make_unique(*LogicalType::INTERNAL_ID(), mm); -} + MemoryManager* mm, RelMultiplicity multiplicity) + : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes), mm}, multiplicity{multiplicity} {} -// TODO(Guodong): We should change the map between relID and rowIdx to a vector of pairs, which is -// more friendly for scan. row_idx_t LocalRelNG::scanCSR(offset_t srcOffsetInChunk, offset_t posToReadForOffset, const std::vector& columnIDs, const std::vector& outputVectors) { - KU_ASSERT(columnIDs.size() + 1 == outputVectors.size()); - KU_ASSERT(relNGInfo->adjInsertInfo.contains(srcOffsetInChunk)); - uint64_t posInVector = 0; - auto iteratorIdx = 0u; - for (auto& [relID, rowIdx] : relNGInfo->adjInsertInfo.at(srcOffsetInChunk)) { - if (iteratorIdx++ < posToReadForOffset) { - continue; + KU_ASSERT(columnIDs.size() == outputVectors.size()); + std::vector rowIdxesToRead; + rowIdxesToRead.reserve(DEFAULT_VECTOR_CAPACITY); + auto& insertedRelOffsets = insertChunks.getRelOffsetsFromSrcOffset(srcOffsetInChunk); + for (auto i = posToReadForOffset; i < insertedRelOffsets.size(); i++) { + if (rowIdxesToRead.size() == DEFAULT_VECTOR_CAPACITY) { + break; } - auto posInLocalVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - outputVectors[0]->copyFromVectorData( - posInVector++, adjChunk->getLocalVector(rowIdx)->getVector(), posInLocalVector); + rowIdxesToRead.push_back(insertChunks.getRowIdxFromOffset(insertedRelOffsets[i])); } - for (auto i = 0u; i < columnIDs.size(); ++i) { - auto columnID = columnIDs[i]; - posInVector = 0; - iteratorIdx = 0u; - auto& insertInfo = relNGInfo->insertInfoPerChunk[columnID]; - KU_ASSERT(insertInfo.contains(srcOffsetInChunk)); - for (auto& [relID, rowIdx] : insertInfo.at(srcOffsetInChunk)) { - if (iteratorIdx++ < posToReadForOffset) { - continue; - } - auto posInLocalVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - outputVectors[i + 1]->copyFromVectorData(posInVector++, - chunks[columnID]->getLocalVector(rowIdx)->getVector(), posInLocalVector); + for (auto i = 0u; i < columnIDs.size(); i++) { + uint64_t posInOutputVector = 0; + for (auto rowIdx : rowIdxesToRead) { + insertChunks.readValueAtRowIdx( + rowIdx, columnIDs[i], outputVectors[i], posInOutputVector++); } } - outputVectors[0]->state->selVector->resetSelectorToUnselectedWithSize(posInVector); - return posInVector; + auto numRelsRead = rowIdxesToRead.size(); + outputVectors[0]->state->selVector->resetSelectorToUnselectedWithSize(numRelsRead); + return numRelsRead; } -void LocalRelNG::applyLocalChangesForCSRColumns(offset_t srcOffsetInChunk, +void LocalRelNG::applyLocalChangesToScannedVectors(offset_t srcOffset, const std::vector& columnIDs, ValueVector* relIDVector, const std::vector& outputVectors) { - KU_ASSERT(columnIDs.size() + 1 == outputVectors.size()); + KU_ASSERT(columnIDs.size() == outputVectors.size()); // Apply updates first, as applying deletions might change selected state. for (auto i = 0u; i < columnIDs.size(); ++i) { - applyCSRUpdates(srcOffsetInChunk, columnIDs[i], relIDVector, outputVectors[i + 1]); + applyCSRUpdates(columnIDs[i], relIDVector, outputVectors[i]); } // Apply deletions and update selVector if necessary. - if (relNGInfo->deleteInfo.contains(srcOffsetInChunk) && - relNGInfo->deleteInfo.at(srcOffsetInChunk).size() > 0) { - applyCSRDeletions(srcOffsetInChunk, relNGInfo->deleteInfo, relIDVector); - } + applyCSRDeletions(srcOffset, relIDVector); } -void LocalRelNG::applyCSRUpdates(offset_t srcOffsetInChunk, column_id_t columnID, - ValueVector* relIDVector, ValueVector* outputVector) { - auto updateInfo = relNGInfo->updateInfoPerChunk[columnID]; - if (!updateInfo.contains(srcOffsetInChunk) || updateInfo.at(srcOffsetInChunk).empty()) { - return; - } - auto& updateInfoForOffset = updateInfo.at(srcOffsetInChunk); +void LocalRelNG::applyCSRUpdates( + column_id_t columnID, ValueVector* relIDVector, ValueVector* outputVector) { + auto& updateChunk = updateChunks[columnID]; for (auto i = 0u; i < relIDVector->state->selVector->selectedSize; i++) { auto pos = relIDVector->state->selVector->selectedPositions[i]; auto relOffset = relIDVector->getValue(pos).offset; - if (updateInfoForOffset.contains(relOffset)) { - auto rowIdx = updateInfoForOffset.at(relOffset); - auto posInLocalVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - outputVector->copyFromVectorData( - pos, chunks[columnID]->getLocalVector(rowIdx)->getVector(), posInLocalVector); + if (updateChunk.hasOffset(relOffset)) { + updateChunk.read(relOffset, 0, outputVector, pos); } } } -void LocalRelNG::applyCSRDeletions( - offset_t srcOffsetInChunk, const delete_info_t& deleteInfo, ValueVector* relIDVector) { - auto& deleteInfoForOffset = deleteInfo.at(srcOffsetInChunk); +void LocalRelNG::applyCSRDeletions(offset_t srcOffset, ValueVector* relIDVector) { + if (deleteInfo.isEmpty(srcOffset)) { + return; + } auto selectPos = 0u; auto selVector = std::make_unique(DEFAULT_VECTOR_CAPACITY); selVector->resetSelectorToValuePosBuffer(); for (auto i = 0u; i < relIDVector->state->selVector->selectedSize; i++) { auto relIDPos = relIDVector->state->selVector->selectedPositions[i]; auto relOffset = relIDVector->getValue(relIDPos).offset; - if (deleteInfoForOffset.contains(relOffset)) { + if (deleteInfo.containsOffset(relOffset)) { continue; } selVector->selectedPositions[selectPos++] = relIDPos; @@ -195,88 +82,116 @@ void LocalRelNG::applyCSRDeletions( } } -bool LocalRelNG::insert(ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, - const std::vector& propertyVectors) { - KU_ASSERT(propertyVectors.size() == chunks.size() && propertyVectors.size() >= 1); - auto adjNodeIDRowIdx = adjChunk->append(dstNodeIDVector); - std::vector propertyValuesRowIdx; - propertyValuesRowIdx.reserve(propertyVectors.size()); - for (auto i = 0u; i < propertyVectors.size(); ++i) { - propertyValuesRowIdx.push_back(chunks[i]->append(propertyVectors[i])); - } +// nodeIDVectors: srcNodeIDVector, dstNodeIDVector. +bool LocalRelNG::insert( + std::vector nodeIDVectors, std::vector propertyVectors) { + KU_ASSERT(nodeIDVectors.size() == 2); + auto srcNodeIDVector = nodeIDVectors[0]; + auto dstNodeIDVector = nodeIDVectors[1]; + KU_ASSERT(srcNodeIDVector->state->selVector->selectedSize == 1 && + dstNodeIDVector->state->selVector->selectedSize == 1); auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; + auto dstNodeIDPos = dstNodeIDVector->state->selVector->selectedPositions[0]; + if (srcNodeIDVector->isNull(srcNodeIDPos) || dstNodeIDVector->isNull(dstNodeIDPos)) { + return false; + } auto srcNodeOffset = srcNodeIDVector->getValue(srcNodeIDPos).offset - nodeGroupStartOffset; KU_ASSERT(srcNodeOffset < StorageConstants::NODE_GROUP_SIZE); - auto relIDPos = propertyVectors[REL_ID_COLUMN_ID]->state->selVector->selectedPositions[0]; - auto relOffset = propertyVectors[REL_ID_COLUMN_ID]->getValue(relIDPos).offset; - return relNGInfo->insert(srcNodeOffset, relOffset, adjNodeIDRowIdx, propertyValuesRowIdx); + std::vector vectorsToInsert; + vectorsToInsert.push_back(dstNodeIDVector); + for (auto i = 0u; i < propertyVectors.size(); i++) { + vectorsToInsert.push_back(propertyVectors[i]); + } + auto relIDPos = vectorsToInsert[LOCAL_REL_ID_COLUMN_ID]->state->selVector->selectedPositions[0]; + auto relOffset = vectorsToInsert[LOCAL_REL_ID_COLUMN_ID]->getValue(relIDPos).offset; + insertChunks.append(srcNodeOffset, relOffset, vectorsToInsert); + return true; } -void LocalRelNG::update(ValueVector* srcNodeIDVector, ValueVector* relIDVector, - column_id_t columnID, ValueVector* propertyVector) { - KU_ASSERT(columnID < chunks.size()); - auto rowIdx = chunks[columnID]->append(propertyVector); +// IDVectors: srcNodeIDVector, relIDVector. +bool LocalRelNG::update( + std::vector IDVectors, column_id_t columnID, ValueVector* propertyVector) { + KU_ASSERT(IDVectors.size() == 2); + auto srcNodeIDVector = IDVectors[0]; + auto relIDVector = IDVectors[1]; + KU_ASSERT(srcNodeIDVector->state->selVector->selectedSize == 1 && + relIDVector->state->selVector->selectedSize == 1); auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; + auto relIDPos = relIDVector->state->selVector->selectedPositions[0]; + if (srcNodeIDVector->isNull(srcNodeIDPos) || relIDVector->isNull(relIDPos)) { + return false; + } auto srcNodeOffset = srcNodeIDVector->getValue(srcNodeIDPos).offset - nodeGroupStartOffset; - KU_ASSERT(srcNodeOffset < StorageConstants::NODE_GROUP_SIZE); - auto relIDPos = relIDVector->state->selVector->selectedPositions[0]; + KU_ASSERT(srcNodeOffset < StorageConstants::NODE_GROUP_SIZE && columnID < updateChunks.size()); auto relOffset = relIDVector->getValue(relIDPos).offset; - relNGInfo->update(srcNodeOffset, relOffset, columnID, rowIdx); + // Check if the rel is newly inserted or in persistent storage. + if (insertChunks.hasOffset(relOffset)) { + insertChunks.update(relOffset, columnID, propertyVector); + } else { + updateChunks[columnID].append(srcNodeOffset, relOffset, {propertyVector}); + } + return true; } -bool LocalRelNG::delete_(ValueVector* srcNodeIDVector, ValueVector* relIDVector) { - auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; - auto srcNodeOffset = - srcNodeIDVector->getValue(srcNodeIDPos).offset - nodeGroupStartOffset; - KU_ASSERT(srcNodeOffset < StorageConstants::NODE_GROUP_SIZE); +bool LocalRelNG::delete_(ValueVector* srcNodeVector, ValueVector* relIDVector) { + KU_ASSERT(srcNodeVector->state->selVector->selectedSize == 1 && + relIDVector->state->selVector->selectedSize == 1); + auto srcNodePos = srcNodeVector->state->selVector->selectedPositions[0]; auto relIDPos = relIDVector->state->selVector->selectedPositions[0]; + if (srcNodeVector->isNull(srcNodePos) || relIDVector->isNull(relIDPos)) { + return false; + } + auto srcNodeOffset = + srcNodeVector->getValue(srcNodePos).offset - nodeGroupStartOffset; auto relOffset = relIDVector->getValue(relIDPos).offset; - return relNGInfo->delete_(srcNodeOffset, relOffset); -} - -bool LocalRelTableData::insert(ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, - const std::vector& propertyVectors) { - KU_ASSERT(srcNodeIDVector->state->selVector->selectedSize == 1 && - dstNodeIDVector->state->selVector->selectedSize == 1); - auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; - auto dstNodeIDPos = dstNodeIDVector->state->selVector->selectedPositions[0]; - if (srcNodeIDVector->isNull(srcNodeIDPos) || dstNodeIDVector->isNull(dstNodeIDPos)) { + // If the rel is newly inserted, remove the rel from insertChunks. + if (insertChunks.hasOffset(relOffset)) { + insertChunks.remove(srcNodeOffset, relOffset); + return true; + } + // If the rel is updated, remove the rel from updateChunks if exists. + for (auto i = 0u; i < updateChunks.size(); i++) { + if (updateChunks[i].hasOffset(relOffset)) { + updateChunks[i].remove(srcNodeOffset, relOffset); + } + } + if (!deleteInfo.deleteOffset(relOffset)) { return false; } - auto localNodeGroup = - ku_dynamic_cast(getOrCreateLocalNodeGroup(srcNodeIDVector)); - return localNodeGroup->insert(srcNodeIDVector, dstNodeIDVector, propertyVectors); + deleteInfo.deleteRelAux(srcNodeOffset, relOffset); + return true; } -void LocalRelTableData::update(ValueVector* srcNodeIDVector, ValueVector* relIDVector, - column_id_t columnID, ValueVector* propertyVector) { - KU_ASSERT(srcNodeIDVector->state->selVector->selectedSize == 1 && - relIDVector->state->selVector->selectedSize == 1); - auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; - auto relIDPos = relIDVector->state->selVector->selectedPositions[0]; - if (srcNodeIDVector->isNull(srcNodeIDPos) || relIDVector->isNull(relIDPos)) { - return; +offset_t LocalRelNG::getNumInsertedRels(offset_t srcOffset) const { + if (!insertChunks.hasRelOffsetsFromSrcOffset(srcOffset)) { + return 0; } - auto localNodeGroup = - ku_dynamic_cast(getOrCreateLocalNodeGroup(srcNodeIDVector)); - localNodeGroup->update(srcNodeIDVector, relIDVector, columnID, propertyVector); + return insertChunks.getNumRelsFromSrcOffset(srcOffset); } -bool LocalRelTableData::delete_( - ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, ValueVector* relIDVector) { - KU_ASSERT(srcNodeIDVector->state->selVector->selectedSize == 1 && - dstNodeIDVector->state->selVector->selectedSize == 1 && - relIDVector->state->selVector->selectedSize == 1); - auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; - auto dstNodeIDPos = dstNodeIDVector->state->selVector->selectedPositions[0]; - if (srcNodeIDVector->isNull(srcNodeIDPos) || dstNodeIDVector->isNull(dstNodeIDPos)) { - return false; +void LocalRelNG::getChangesPerCSRSegment( + std::vector& sizeChangesPerSegment, std::vector& hasChangesPerSegment) { + auto numSegments = StorageConstants::NODE_GROUP_SIZE / StorageConstants::CSR_SEGMENT_SIZE; + sizeChangesPerSegment.resize(numSegments, 0 /*initValue*/); + hasChangesPerSegment.resize(numSegments, false /*initValue*/); + for (auto& [srcOffset, insertions] : insertChunks.getSrcNodeOffsetToRelOffsets()) { + auto segmentIdx = getSegmentIdx(srcOffset); + sizeChangesPerSegment[segmentIdx] += insertions.size(); + hasChangesPerSegment[segmentIdx] = true; + } + for (auto& [srcOffset, deletions] : deleteInfo.getSrcNodeOffsetToRelOffsetVec()) { + auto segmentIdx = getSegmentIdx(srcOffset); + sizeChangesPerSegment[segmentIdx] -= deletions.size(); + hasChangesPerSegment[segmentIdx] = true; + } + for (auto& updateChunk : updateChunks) { + for (auto& [srcOffset, _] : updateChunk.getSrcNodeOffsetToRelOffsets()) { + auto segmentIdx = getSegmentIdx(srcOffset); + hasChangesPerSegment[segmentIdx] = true; + } } - auto localNodeGroup = - ku_dynamic_cast(getOrCreateLocalNodeGroup(srcNodeIDVector)); - return localNodeGroup->delete_(srcNodeIDVector, relIDVector); } LocalNodeGroup* LocalRelTableData::getOrCreateLocalNodeGroup(ValueVector* nodeIDVector) { diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index 0851eae052e..d44ba287442 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -9,67 +9,129 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -void LocalVector::read( - sel_t offsetInLocalVector, ValueVector* resultVector, sel_t offsetInResultVector) { - resultVector->copyFromVectorData(offsetInResultVector, vector.get(), offsetInLocalVector); +LocalVectorCollection LocalVectorCollection::getStructChildVectorCollection( + struct_field_idx_t idx) const { + LocalVectorCollection childCollection; + for (auto vector : vectors) { + auto fieldVector = StructVector::getFieldVector(vector, idx).get(); + childCollection.vectors.push_back(fieldVector); + } + return childCollection; } -void LocalVector::append(ValueVector* valueVector) { - KU_ASSERT(valueVector->state->selVector->selectedSize == 1); - auto pos = valueVector->state->selVector->selectedPositions[0]; - vector->copyFromVectorData(numValues, valueVector, pos); - numValues++; +LocalNodeGroup::LocalNodeGroup( + offset_t nodeGroupStartOffset, std::vector dataTypes, MemoryManager* mm) + : nodeGroupStartOffset{nodeGroupStartOffset}, insertChunks{mm, LogicalType::copy(dataTypes)} { + for (auto i = 0u; i < dataTypes.size(); i++) { + std::vector chunkCollectionTypes; + chunkCollectionTypes.push_back(*dataTypes[i]->copy()); + LocalDataChunkCollection localDataChunkCollection(mm, std::move(chunkCollectionTypes)); + updateChunks.push_back(std::move(localDataChunkCollection)); + } } -void LocalVectorCollection::read( - row_idx_t rowIdx, ValueVector* outputVector, sel_t posInOutputVector) { - auto vectorIdx = rowIdx >> DEFAULT_VECTOR_CAPACITY_LOG_2; - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - KU_ASSERT(vectorIdx < vectors.size()); - vectors[vectorIdx]->read(offsetInVector, outputVector, posInOutputVector); +bool LocalNodeGroup::hasUpdatesOrDeletions() const { + if (!deleteInfo.isEmpty()) { + return true; + } + for (auto& updateChunk : updateChunks) { + if (!updateChunk.isEmpty()) { + return true; + } + } + return false; } -row_idx_t LocalVectorCollection::append(ValueVector* vector) { - prepareAppend(); - auto lastVector = vectors.back().get(); - KU_ASSERT(!lastVector->isFull()); - lastVector->append(vector); - return numRows++; +void LocalDataChunkCollection::readValueAtRowIdx( + row_idx_t rowIdx, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { + outputVector->copyFromVectorData(posInOutputVector, + dataChunkCollection.getChunkUnsafe(rowIdx >> DEFAULT_VECTOR_CAPACITY_LOG_2) + .getValueVector(columnID) + .get(), + rowIdx % DEFAULT_VECTOR_CAPACITY); } -void LocalVectorCollection::prepareAppend() { - if (vectors.empty()) { - vectors.emplace_back(std::make_unique(dataType, mm)); - } - auto lastVector = vectors.back().get(); - if (lastVector->isFull()) { - vectors.emplace_back(std::make_unique(dataType, mm)); +bool LocalDataChunkCollection::read( + offset_t offset, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { + if (!offsetToRowIdx.contains(offset)) { + return false; } + auto rowIdx = offsetToRowIdx.at(offset); + readValueAtRowIdx(rowIdx, columnID, outputVector, posInOutputVector); + return true; } -std::unique_ptr LocalVectorCollection::getStructChildVectorCollection( - common::struct_field_idx_t idx) { - auto childCollection = std::make_unique( - *StructType::getField(&dataType, idx)->getType()->copy(), mm); +void LocalDataChunkCollection::update( + offset_t offset, column_id_t columnID, ValueVector* propertyVector) { + KU_ASSERT(offsetToRowIdx.contains(offset)); + auto rowIdx = offsetToRowIdx.at(offset); + dataChunkCollection.getChunkUnsafe(rowIdx >> DEFAULT_VECTOR_CAPACITY_LOG_2) + .getValueVector(columnID) + ->copyFromVectorData(rowIdx % DEFAULT_VECTOR_CAPACITY, propertyVector, + propertyVector->state->selVector->selectedPositions[0]); +} - for (auto i = 0u; i < numRows; i++) { - auto fieldVector = - common::StructVector::getFieldVector(getLocalVector(i)->getVector(), idx); - fieldVector->state->selVector->selectedPositions[0] = i & (DEFAULT_VECTOR_CAPACITY - 1); - childCollection->append(fieldVector.get()); +void LocalDataChunkCollection::remove(offset_t srcNodeOffset, offset_t relOffset) { + KU_ASSERT(srcNodeOffsetToRelOffsets.contains(srcNodeOffset)); + remove(relOffset); + offsetToRowIdx.erase(relOffset); + auto& vec = srcNodeOffsetToRelOffsets.at(srcNodeOffset); + vec.erase(std::remove(vec.begin(), vec.end(), relOffset), vec.end()); + if (vec.empty()) { + srcNodeOffsetToRelOffsets.erase(srcNodeOffset); } - return childCollection; } -LocalNodeGroup::LocalNodeGroup( - offset_t nodeGroupStartOffset, std::vector dataTypes, MemoryManager* mm) - : nodeGroupStartOffset{nodeGroupStartOffset} { - chunks.resize(dataTypes.size()); - for (auto i = 0u; i < dataTypes.size(); ++i) { - // To avoid unnecessary memory consumption, we chunk local changes of each column in the - // node group into chunks of size DEFAULT_VECTOR_CAPACITY. - chunks[i] = std::make_unique(*dataTypes[i]->copy(), mm); +row_idx_t LocalDataChunkCollection::appendToDataChunkCollection(std::vector vectors) { + KU_ASSERT(vectors.size() == dataTypes.size()); + if (dataChunkCollection.getNumChunks() == 0 || + dataChunkCollection.getChunkUnsafe(dataChunkCollection.getNumChunks() - 1) + .state->selVector->selectedSize == DEFAULT_VECTOR_CAPACITY) { + dataChunkCollection.merge(createNewDataChunk()); + } + auto& lastDataChunk = + dataChunkCollection.getChunkUnsafe(dataChunkCollection.getNumChunks() - 1); + for (auto i = 0u; i < vectors.size(); i++) { + auto localVector = lastDataChunk.getValueVector(i); + KU_ASSERT(vectors[i]->state->selVector->selectedSize == 1); + auto pos = vectors[i]->state->selVector->selectedPositions[0]; + localVector->copyFromVectorData( + lastDataChunk.state->selVector->selectedSize, vectors[i], pos); + } + lastDataChunk.state->selVector->selectedSize++; + KU_ASSERT((dataChunkCollection.getNumChunks() - 1) * DEFAULT_VECTOR_CAPACITY + + lastDataChunk.state->selVector->selectedSize == + numRows + 1); + return numRows++; +} + +common::DataChunk LocalDataChunkCollection::createNewDataChunk() { + DataChunk newDataChunk(dataTypes.size()); + for (auto i = 0u; i < dataTypes.size(); i++) { + auto valueVector = std::make_unique(dataTypes[i], mm); + newDataChunk.insert(i, std::move(valueVector)); } + newDataChunk.state->selVector->resetSelectorToValuePosBuffer(); + return newDataChunk; +} + +bool LocalTableData::insert( + std::vector nodeIDVectors, std::vector propertyVectors) { + KU_ASSERT(nodeIDVectors.size() >= 1); + auto localNodeGroup = getOrCreateLocalNodeGroup(nodeIDVectors[0]); + return localNodeGroup->insert(nodeIDVectors, propertyVectors); +} + +bool LocalTableData::update( + std::vector nodeIDVectors, column_id_t columnID, ValueVector* propertyVector) { + KU_ASSERT(nodeIDVectors.size() >= 1); + auto localNodeGroup = getOrCreateLocalNodeGroup(nodeIDVectors[0]); + return localNodeGroup->update(nodeIDVectors, columnID, propertyVector); +} + +bool LocalTableData::delete_(ValueVector* nodeIDVector, ValueVector* extraVector) { + auto localNodeGroup = getOrCreateLocalNodeGroup(nodeIDVector); + return localNodeGroup->delete_(nodeIDVector, extraVector); } LocalTableData* LocalTable::getOrCreateLocalTableData( diff --git a/src/storage/stats/property_statistics.cpp b/src/storage/stats/property_statistics.cpp index 23c59ed0da3..fb808b30a16 100644 --- a/src/storage/stats/property_statistics.cpp +++ b/src/storage/stats/property_statistics.cpp @@ -27,7 +27,7 @@ std::unique_ptr PropertyStatistics::deserialize( bool RWPropertyStats::mayHaveNull(const transaction::Transaction& transaction) { // Columns internal to the storage, i.e., not mapping to a property in table schema, are not // tracked in statistics. For example, offset of var list column, csr offset column, etc. - // TODO(Guodong): INVALID_PROPERTY_ID is used here because we have a column, i.e., adjColumn, + // TODO(Guodong): INVALID_PROPERTY_ID is used here because we have a column, i.e., nbrIDColumn, // not exposed as property in table schema, but still have nullColumn. Should be fixed once we // properly align properties and chunks. if (propertyID == common::INVALID_PROPERTY_ID) { @@ -40,7 +40,7 @@ bool RWPropertyStats::mayHaveNull(const transaction::Transaction& transaction) { } void RWPropertyStats::setHasNull(const transaction::Transaction& transaction) { - // TODO(Guodong): INVALID_PROPERTY_ID is used here because we have a column, i.e., adjColumn, + // TODO(Guodong): INVALID_PROPERTY_ID is used here because we have a column, i.e., nbrIDColumn, // not exposed as property in table schema, but still have nullColumn. Should be fixed once we // properly align properties and chunks. if (propertyID != common::INVALID_PROPERTY_ID) { diff --git a/src/storage/stats/rel_table_statistics.cpp b/src/storage/stats/rel_table_statistics.cpp index bc85da64365..8bd6e054127 100644 --- a/src/storage/stats/rel_table_statistics.cpp +++ b/src/storage/stats/rel_table_statistics.cpp @@ -22,18 +22,17 @@ RelTableStats::RelTableStats(BMFileHandle* metadataFH, const catalog::TableCatal LogicalType{LogicalTypeID::INT64}, *metadataFH, bufferManager, wal); bwdCSRLengthMetadataDAHInfo = TablesStatistics::createMetadataDAHInfo( LogicalType{LogicalTypeID::INT64}, *metadataFH, bufferManager, wal); - fwdAdjMetadataDAHInfo = TablesStatistics::createMetadataDAHInfo( - LogicalType{LogicalTypeID::INTERNAL_ID}, *metadataFH, bufferManager, wal); - bwdAdjMetadataDAHInfo = TablesStatistics::createMetadataDAHInfo( - LogicalType{LogicalTypeID::INTERNAL_ID}, *metadataFH, bufferManager, wal); - fwdPropertyMetadataDAHInfos.clear(); - bwdPropertyMetadataDAHInfos.clear(); - fwdPropertyMetadataDAHInfos.reserve(tableEntry.getNumProperties()); - bwdPropertyMetadataDAHInfos.reserve(tableEntry.getNumProperties()); + KU_ASSERT(fwdMetadataDAHInfos.empty() && bwdMetadataDAHInfos.empty()); + fwdMetadataDAHInfos.reserve(tableEntry.getNumProperties() + 1); + bwdMetadataDAHInfos.reserve(tableEntry.getNumProperties() + 1); + fwdMetadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( + LogicalType{LogicalTypeID::INTERNAL_ID}, *metadataFH, bufferManager, wal)); + bwdMetadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( + LogicalType{LogicalTypeID::INTERNAL_ID}, *metadataFH, bufferManager, wal)); for (auto& property : tableEntry.getPropertiesRef()) { - fwdPropertyMetadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( + fwdMetadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( *property.getDataType(), *metadataFH, bufferManager, wal)); - bwdPropertyMetadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( + bwdMetadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( *property.getDataType(), *metadataFH, bufferManager, wal)); } } @@ -48,17 +47,15 @@ RelTableStats::RelTableStats(const RelTableStats& other) : TableStatistics{other bwdCSROffsetMetadataDAHInfo = other.bwdCSROffsetMetadataDAHInfo->copy(); bwdCSRLengthMetadataDAHInfo = other.bwdCSRLengthMetadataDAHInfo->copy(); } - fwdAdjMetadataDAHInfo = other.fwdAdjMetadataDAHInfo->copy(); - bwdAdjMetadataDAHInfo = other.bwdAdjMetadataDAHInfo->copy(); - fwdPropertyMetadataDAHInfos.clear(); - fwdPropertyMetadataDAHInfos.reserve(other.fwdPropertyMetadataDAHInfos.size()); - for (auto& metadataDAHInfo : other.fwdPropertyMetadataDAHInfos) { - fwdPropertyMetadataDAHInfos.push_back(metadataDAHInfo->copy()); + fwdMetadataDAHInfos.clear(); + fwdMetadataDAHInfos.reserve(other.fwdMetadataDAHInfos.size()); + for (auto& metadataDAHInfo : other.fwdMetadataDAHInfos) { + fwdMetadataDAHInfos.push_back(metadataDAHInfo->copy()); } - bwdPropertyMetadataDAHInfos.clear(); - bwdPropertyMetadataDAHInfos.reserve(other.bwdPropertyMetadataDAHInfos.size()); - for (auto& metadataDAHInfo : other.bwdPropertyMetadataDAHInfos) { - bwdPropertyMetadataDAHInfos.push_back(metadataDAHInfo->copy()); + bwdMetadataDAHInfos.clear(); + bwdMetadataDAHInfos.reserve(other.bwdMetadataDAHInfos.size()); + for (auto& metadataDAHInfo : other.bwdMetadataDAHInfos) { + bwdMetadataDAHInfos.push_back(metadataDAHInfo->copy()); } } @@ -68,10 +65,8 @@ void RelTableStats::serializeInternal(Serializer& serializer) { serializer.serializeOptionalValue(bwdCSROffsetMetadataDAHInfo); serializer.serializeOptionalValue(fwdCSRLengthMetadataDAHInfo); serializer.serializeOptionalValue(bwdCSRLengthMetadataDAHInfo); - fwdAdjMetadataDAHInfo->serialize(serializer); - bwdAdjMetadataDAHInfo->serialize(serializer); - serializer.serializeVectorOfPtrs(fwdPropertyMetadataDAHInfos); - serializer.serializeVectorOfPtrs(bwdPropertyMetadataDAHInfos); + serializer.serializeVectorOfPtrs(fwdMetadataDAHInfos); + serializer.serializeVectorOfPtrs(bwdMetadataDAHInfos); } std::unique_ptr RelTableStats::deserialize( @@ -84,8 +79,6 @@ std::unique_ptr RelTableStats::deserialize( deserializer.deserializeOptionalValue(bwdCSROffsetMetadataDAHInfo); deserializer.deserializeOptionalValue(fwdCSRLengthMetadataDAHInfo); deserializer.deserializeOptionalValue(bwdCSRLengthMetadataDAHInfo); - auto fwdNbrIDMetadataDAHInfo = MetadataDAHInfo::deserialize(deserializer); - auto bwdNbrIDMetadataDAHInfo = MetadataDAHInfo::deserialize(deserializer); std::vector> fwdPropertyMetadataDAHInfos; std::vector> bwdPropertyMetadataDAHInfos; deserializer.deserializeVectorOfPtrs(fwdPropertyMetadataDAHInfos); @@ -95,10 +88,8 @@ std::unique_ptr RelTableStats::deserialize( result->bwdCSROffsetMetadataDAHInfo = std::move(bwdCSROffsetMetadataDAHInfo); result->fwdCSRLengthMetadataDAHInfo = std::move(fwdCSRLengthMetadataDAHInfo); result->bwdCSRLengthMetadataDAHInfo = std::move(bwdCSRLengthMetadataDAHInfo); - result->fwdAdjMetadataDAHInfo = std::move(fwdNbrIDMetadataDAHInfo); - result->bwdAdjMetadataDAHInfo = std::move(bwdNbrIDMetadataDAHInfo); - result->fwdPropertyMetadataDAHInfos = std::move(fwdPropertyMetadataDAHInfos); - result->bwdPropertyMetadataDAHInfos = std::move(bwdPropertyMetadataDAHInfos); + result->fwdMetadataDAHInfos = std::move(fwdPropertyMetadataDAHInfos); + result->bwdMetadataDAHInfos = std::move(bwdPropertyMetadataDAHInfos); return result; } diff --git a/src/storage/stats/rels_store_statistics.cpp b/src/storage/stats/rels_store_statistics.cpp index 26d17385593..6f74d6ba857 100644 --- a/src/storage/stats/rels_store_statistics.cpp +++ b/src/storage/stats/rels_store_statistics.cpp @@ -34,6 +34,7 @@ void RelsStoreStats::updateNumRelsByValue(table_id_t relTableID, int64_t value) setToUpdated(); auto relStatistics = (RelTableStats*)readWriteVersion->tableStatisticPerTable[relTableID].get(); auto numRelsBeforeUpdate = relStatistics->getNumTuples(); + (void)numRelsBeforeUpdate; // Avoid unused variable warning. KU_ASSERT(!(numRelsBeforeUpdate == 0 && value < 0)); auto numRelsAfterUpdate = relStatistics->getNumTuples() + value; relStatistics->setNumTuples(numRelsAfterUpdate); @@ -93,22 +94,13 @@ MetadataDAHInfo* RelsStoreStats::getCSRLengthMetadataDAHInfo( return tableStats->getCSRLengthMetadataDAHInfo(direction); } -MetadataDAHInfo* RelsStoreStats::getAdjMetadataDAHInfo( - Transaction* transaction, table_id_t tableID, RelDataDirection direction) { - if (transaction->isWriteTransaction()) { - initTableStatisticsForWriteTrx(); - } - auto tableStats = getRelStatistics(tableID, transaction); - return tableStats->getAdjMetadataDAHInfo(direction); -} - -MetadataDAHInfo* RelsStoreStats::getPropertyMetadataDAHInfo(transaction::Transaction* transaction, - table_id_t tableID, column_id_t columnID, RelDataDirection direction) { +MetadataDAHInfo* RelsStoreStats::getColumnMetadataDAHInfo(transaction::Transaction* transaction, + common::table_id_t tableID, common::column_id_t columnID, common::RelDataDirection direction) { if (transaction->isWriteTransaction()) { initTableStatisticsForWriteTrx(); } auto relTableStats = getRelStatistics(tableID, transaction); - return relTableStats->getPropertyMetadataDAHInfo(columnID, direction); + return relTableStats->getColumnMetadataDAHInfo(columnID, direction); } } // namespace storage diff --git a/src/storage/storage_manager.cpp b/src/storage/storage_manager.cpp index 8cf5f99e047..f70ba829d79 100644 --- a/src/storage/storage_manager.cpp +++ b/src/storage/storage_manager.cpp @@ -37,8 +37,10 @@ static void setCommonTableIDToRdfRelTable( for (auto rdfEntry : rdfEntries) { if (rdfEntry->isParent(relTable->getTableID())) { std::vector columns; - columns.push_back(relTable->getDirectedTableData(RelDataDirection::FWD)->getColumn(1)); - columns.push_back(relTable->getDirectedTableData(RelDataDirection::BWD)->getColumn(1)); + // TODO(Guodong): This is a hack. We should not use constant 2 and should move the + // setting logic inside RelTableData. + columns.push_back(relTable->getDirectedTableData(RelDataDirection::FWD)->getColumn(2)); + columns.push_back(relTable->getDirectedTableData(RelDataDirection::BWD)->getColumn(2)); for (auto& column : columns) { ku_dynamic_cast(column) ->setCommonTableID(rdfEntry->getResourceTableID()); diff --git a/src/storage/storage_utils.cpp b/src/storage/storage_utils.cpp index b29197608ba..d346c0f54cf 100644 --- a/src/storage/storage_utils.cpp +++ b/src/storage/storage_utils.cpp @@ -37,9 +37,6 @@ std::string StorageUtils::getColumnName( case StorageUtils::ColumnType::CSR_LENGTH: { return stringFormat("{}_csr_length", prefix); } - case StorageUtils::ColumnType::ADJ: { - return stringFormat("{}_adj", prefix); - } case StorageUtils::ColumnType::STRUCT_CHILD: { return stringFormat("{}_{}_child", propertyName, prefix); } diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 90023563531..6a04b35dca0 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -122,9 +122,10 @@ class SerialColumn final : public Column { } } - bool canCommitInPlace(Transaction* /*transaction*/, node_group_idx_t /*nodeGroupIdx*/, - LocalVectorCollection* /*localChunk*/, const offset_to_row_idx_t& /*insertInfo*/, + bool canCommitInPlace(Transaction*, node_group_idx_t, const LocalVectorCollection&, + const offset_to_row_idx_t&, const LocalVectorCollection&, const offset_to_row_idx_t& updateInfo) override { + (void)updateInfo; // Avoid unused parameter warnings during release build. KU_ASSERT(updateInfo.empty()); return true; } @@ -139,8 +140,12 @@ class SerialColumn final : public Column { } void commitLocalChunkInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* /*localChunk*/, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override { + const LocalVectorCollection& /*localChunk*/, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection&, const offset_to_row_idx_t& updateInfo, + const offset_set_t& deleteInfo) override { + // Avoid unused parameter warnings during release build. + (void)updateInfo; + (void)deleteInfo; KU_ASSERT(updateInfo.empty() && deleteInfo.empty()); auto chunkMeta = metadataDA->get(nodeGroupIdx, transaction->getType()); auto numValues = chunkMeta.numValues; @@ -156,9 +161,13 @@ class SerialColumn final : public Column { } void commitLocalChunkOutOfPlace(Transaction* /*transaction*/, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* /*localChunk*/, bool isNewNodeGroup, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo, + bool isNewNodeGroup, const LocalVectorCollection&, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection&, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override { + // Avoid unused parameter warnings during release build. + (void)isNewNodeGroup; + (void)updateInfo; + (void)deleteInfo; KU_ASSERT(isNewNodeGroup && updateInfo.empty() && deleteInfo.empty()); // Only when a new node group is created, we need to commit out of place. auto numValues = 0u; @@ -200,7 +209,7 @@ InternalIDColumn::InternalIDColumn(std::string name, const MetadataDAHInfo& meta BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction, RWPropertyStats stats) : Column{name, *LogicalType::INTERNAL_ID(), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, - wal, transaction, stats, false /* enableCompression */}, + wal, transaction, stats, false /*enableCompression*/}, commonTableID{INVALID_TABLE_ID} {} void InternalIDColumn::populateCommonTableID(ValueVector* resultVector) const { @@ -573,41 +582,43 @@ Column::ReadState Column::getReadState( } void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localColumnChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const offset_set_t& deleteInfo) { auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; if (isNewNodeGroup) { // If this is a new node group, updateInfo should be empty. We should perform out-of-place // commit with a new column chunk. - commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, localColumnChunk, isNewNodeGroup, - insertInfo, updateInfo, deleteInfo); + commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunk, + insertInfo, localUpdateChunk, updateInfo, deleteInfo); } else { bool didInPlaceCommit = false; // If this is not a new node group, we should first check if we can perform in-place commit. - if (canCommitInPlace(transaction, nodeGroupIdx, localColumnChunk, insertInfo, updateInfo)) { - commitLocalChunkInPlace( - transaction, nodeGroupIdx, localColumnChunk, insertInfo, updateInfo, deleteInfo); + if (canCommitInPlace(transaction, nodeGroupIdx, localInsertChunk, insertInfo, + localUpdateChunk, updateInfo)) { + commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunk, insertInfo, + localUpdateChunk, updateInfo, deleteInfo); didInPlaceCommit = true; } else { - commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, localColumnChunk, isNewNodeGroup, - insertInfo, updateInfo, deleteInfo); + commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunk, + insertInfo, localUpdateChunk, updateInfo, deleteInfo); } // TODO(Guodong/Ben): The logic here on NullColumn is confusing as out-of-place commits and // in-place commits handle it differently. See if we can unify them. if (nullColumn) { // Uses functions written for the null chunk which only access the localColumnChunk's // null information - if (nullColumn->canCommitInPlace( - transaction, nodeGroupIdx, localColumnChunk, insertInfo, updateInfo)) { - nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, localColumnChunk, - insertInfo, updateInfo, deleteInfo); + if (nullColumn->canCommitInPlace(transaction, nodeGroupIdx, localInsertChunk, + insertInfo, localUpdateChunk, updateInfo)) { + nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunk, + insertInfo, localUpdateChunk, updateInfo, deleteInfo); } else if (didInPlaceCommit) { // Out-of-place commits also commit the null chunk out of place, // so we only need to do a separate out of place commit for the null chunk if the // main chunk did an in-place commit. - nullColumn->commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, localColumnChunk, - isNewNodeGroup, insertInfo, updateInfo, deleteInfo); + nullColumn->commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, + localInsertChunk, insertInfo, localUpdateChunk, updateInfo, deleteInfo); } } } @@ -667,24 +678,20 @@ bool Column::isMaxOffsetOutOfPagesCapacity( } bool Column::checkUpdateInPlace(const ColumnChunkMetadata& metadata, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo) { + const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo) { std::vector rowIdxesToRead; - for (auto& [_, rowIdx] : updateInfo) { - rowIdxesToRead.push_back(rowIdx); - } - for (auto& [_, rowIdx] : insertInfo) { + for (auto& [_, rowIdx] : writeInfo) { rowIdxesToRead.push_back(rowIdx); } std::sort(rowIdxesToRead.begin(), rowIdxesToRead.end()); for (auto rowIdx : rowIdxesToRead) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - if (localVector->getVector()->isNull(offsetInVector)) { + if (localVector->isNull(offsetInVector)) { continue; } if (!metadata.compMeta.canUpdateInPlace( - localVector->getVector()->getData(), offsetInVector, dataType.getPhysicalType())) { + localVector->getData(), offsetInVector, dataType.getPhysicalType())) { return false; } } @@ -692,8 +699,8 @@ bool Column::checkUpdateInPlace(const ColumnChunkMetadata& metadata, } bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo) { + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { auto metadata = getMetadata(nodeGroupIdx, transaction->getType()); if (isInsertionsOutOfPagesCapacity(metadata, insertInfo)) { return false; @@ -701,7 +708,8 @@ bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGro if (metadata.compMeta.canAlwaysUpdateInPlace()) { return true; } - return checkUpdateInPlace(metadata, localChunk, insertInfo, updateInfo); + return checkUpdateInPlace(metadata, localInsertChunk, insertInfo) && + checkUpdateInPlace(metadata, localUpdateChunk, updateInfo); } bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -725,10 +733,11 @@ bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGro } void Column::commitLocalChunkInPlace(Transaction* /*transaction*/, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo, const offset_set_t& /*deleteInfo*/) { - applyLocalChunkToColumn(nodeGroupIdx, localChunk, updateInfo); - applyLocalChunkToColumn(nodeGroupIdx, localChunk, insertInfo); + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const offset_set_t& /*deleteInfo*/) { + applyLocalChunkToColumn(nodeGroupIdx, localUpdateChunk, updateInfo); + applyLocalChunkToColumn(nodeGroupIdx, localInsertChunk, insertInfo); } std::unique_ptr Column::getEmptyChunkForCommit(uint64_t capacity) { @@ -736,20 +745,21 @@ std::unique_ptr Column::getEmptyChunkForCommit(uint64_t capacity) { } void Column::commitLocalChunkOutOfPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, bool isNewNodeGroup, const offset_to_row_idx_t& insertInfo, + bool isNewNodeGroup, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { auto columnChunk = getEmptyChunkForCommit(common::StorageConstants::NODE_GROUP_SIZE); if (isNewNodeGroup) { KU_ASSERT(updateInfo.empty() && deleteInfo.empty()); // Apply inserts from the local chunk. - applyLocalChunkToColumnChunk(localChunk, columnChunk.get(), insertInfo); + applyLocalChunkToColumnChunk(localInsertChunk, columnChunk.get(), insertInfo); } else { // First, scan the whole column chunk from persistent storage. scan(transaction, nodeGroupIdx, columnChunk.get()); // Then, apply updates from the local chunk. - applyLocalChunkToColumnChunk(localChunk, columnChunk.get(), updateInfo); + applyLocalChunkToColumnChunk(localUpdateChunk, columnChunk.get(), updateInfo); // Lastly, apply inserts from the local chunk. - applyLocalChunkToColumnChunk(localChunk, columnChunk.get(), insertInfo); + applyLocalChunkToColumnChunk(localInsertChunk, columnChunk.get(), insertInfo); if (columnChunk->getNullChunk()) { // Set nulls based on deleteInfo. for (auto offsetInChunk : deleteInfo) { @@ -788,23 +798,23 @@ void Column::commitColumnChunkOutOfPlace(Transaction* transaction, node_group_id } } -void Column::applyLocalChunkToColumnChunk(LocalVectorCollection* localChunk, - ColumnChunk* columnChunk, const std::map& updateInfo) { +void Column::applyLocalChunkToColumnChunk(const LocalVectorCollection& localChunk, + ColumnChunk* columnChunk, const offset_to_row_idx_t& updateInfo) { for (auto& [offsetInChunk, rowIdx] : updateInfo) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - localVector->getVector()->state->selVector->selectedPositions[0] = offsetInVector; - columnChunk->write(localVector->getVector(), offsetInVector, offsetInChunk); + localVector->state->selVector->selectedPositions[0] = offsetInVector; + columnChunk->write(localVector, offsetInVector, offsetInChunk); } } void Column::applyLocalChunkToColumn(node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& updateInfo) { + const LocalVectorCollection& localChunk, const offset_to_row_idx_t& updateInfo) { for (auto& [offsetInChunk, rowIdx] : updateInfo) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - if (!localVector->getVector()->isNull(offsetInVector)) { - write(nodeGroupIdx, offsetInChunk, localVector->getVector(), offsetInVector); + if (!localVector->isNull(offsetInVector)) { + write(nodeGroupIdx, offsetInChunk, localVector, offsetInVector); } } } diff --git a/src/storage/store/node_table_data.cpp b/src/storage/store/node_table_data.cpp index 041d6a5530b..f614ed834dc 100644 --- a/src/storage/store/node_table_data.cpp +++ b/src/storage/store/node_table_data.cpp @@ -45,9 +45,9 @@ void NodeTableData::scan(Transaction* transaction, TableReadState& readState, if (transaction->isWriteTransaction()) { auto localTableData = transaction->getLocalStorage()->getLocalTableData(tableID); if (localTableData) { - auto localRelTableData = + auto localNodeTableData = ku_dynamic_cast(localTableData); - localRelTableData->scan(nodeIDVector, readState.columnIDs, outputVectors); + localNodeTableData->scan(nodeIDVector, readState.columnIDs, outputVectors); } } } @@ -56,22 +56,22 @@ void NodeTableData::insert(Transaction* transaction, ValueVector* nodeIDVector, const std::vector& propertyVectors) { // We assume that offsets are given in the ascending order, thus lastOffset is the max one. KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); - auto localTableData = ku_dynamic_cast( - transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns)); - localTableData->insert(nodeIDVector, propertyVectors); + auto localTableData = + transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns); + localTableData->insert({nodeIDVector}, propertyVectors); } void NodeTableData::update(Transaction* transaction, column_id_t columnID, ValueVector* nodeIDVector, ValueVector* propertyVector) { KU_ASSERT(columnID < columns.size()); - auto localTableData = ku_dynamic_cast( - transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns)); - localTableData->update(nodeIDVector, columnID, propertyVector); + auto localTableData = + transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns); + localTableData->update({nodeIDVector}, columnID, propertyVector); } void NodeTableData::delete_(Transaction* transaction, ValueVector* nodeIDVector) { - auto localTableData = ku_dynamic_cast( - transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns)); + auto localTableData = + transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns); localTableData->delete_(nodeIDVector); } @@ -97,7 +97,7 @@ void NodeTableData::lookup(Transaction* transaction, TableReadState& readState, } } -void NodeTableData::append(kuzu::storage::NodeGroup* nodeGroup) { +void NodeTableData::append(NodeGroup* nodeGroup) { for (auto columnID = 0u; columnID < columns.size(); columnID++) { auto columnChunk = nodeGroup->getColumnChunkUnsafe(columnID); KU_ASSERT(columnID < columns.size()); @@ -107,17 +107,18 @@ void NodeTableData::append(kuzu::storage::NodeGroup* nodeGroup) { void NodeTableData::prepareLocalTableToCommit( Transaction* transaction, LocalTableData* localTable) { - for (auto& [nodeGroupIdx, nodeGroup] : localTable->nodeGroups) { + for (auto& [nodeGroupIdx, localNodeGroup] : localTable->nodeGroups) { for (auto columnID = 0u; columnID < columns.size(); columnID++) { auto column = columns[columnID].get(); - auto columnChunk = nodeGroup->getLocalColumnChunk(columnID); - if (columnChunk->getNumRows() == 0) { + auto localInsertChunk = localNodeGroup->getInsesrtChunks().getLocalChunk(columnID); + auto localUpdateChunk = localNodeGroup->getUpdateChunks(columnID).getLocalChunk(0); + if (localInsertChunk.isEmpty() && localUpdateChunk.isEmpty()) { continue; } - auto localNodeGroup = ku_dynamic_cast(nodeGroup.get()); - column->prepareCommitForChunk(transaction, nodeGroupIdx, columnChunk, - localNodeGroup->getInsertInfoRef(columnID), - localNodeGroup->getUpdateInfoRef(columnID), {} /* deleteInfo */); + auto localNodeNG = ku_dynamic_cast(localNodeGroup.get()); + column->prepareCommitForChunk(transaction, nodeGroupIdx, localInsertChunk, + localNodeNG->getInsertInfoRef(), localUpdateChunk, + localNodeNG->getUpdateInfoRef(columnID), {} /* deleteInfo */); } } } diff --git a/src/storage/store/null_column.cpp b/src/storage/store/null_column.cpp index 3dbd9761cc2..06e699d14dd 100644 --- a/src/storage/store/null_column.cpp +++ b/src/storage/store/null_column.cpp @@ -164,24 +164,27 @@ void NullColumn::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, } bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo) { + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { auto metadata = getMetadata(nodeGroupIdx, transaction->getType()); if (metadata.compMeta.canAlwaysUpdateInPlace()) { return true; } + return checkUpdateInPlace(metadata, localInsertChunk, insertInfo) && + checkUpdateInPlace(metadata, localUpdateChunk, updateInfo); +} + +bool NullColumn::checkUpdateInPlace(const ColumnChunkMetadata& metadata, + const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo) { std::vector rowIdxesToRead; - for (auto& [_, rowIdx] : updateInfo) { - rowIdxesToRead.push_back(rowIdx); - } - for (auto& [_, rowIdx] : insertInfo) { + for (auto& [_, rowIdx] : writeInfo) { rowIdxesToRead.push_back(rowIdx); } std::sort(rowIdxesToRead.begin(), rowIdxesToRead.end()); for (auto rowIdx : rowIdxesToRead) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - bool value = localVector->getVector()->isNull(offsetInVector); + bool value = localVector->isNull(offsetInVector); if (!metadata.compMeta.canUpdateInPlace( reinterpret_cast(&value), 0, dataType.getPhysicalType())) { return false; @@ -217,18 +220,18 @@ bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nod } void NullColumn::commitLocalChunkInPlace(Transaction* /*transaction*/, - node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo, - const offset_set_t& deleteInfo) { + node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { for (auto& [offsetInChunk, rowIdx] : updateInfo) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localUpdateChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - write(nodeGroupIdx, offsetInChunk, localVector->getVector(), offsetInVector); + write(nodeGroupIdx, offsetInChunk, localVector, offsetInVector); } for (auto& [offsetInChunk, rowIdx] : insertInfo) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localInsertChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - write(nodeGroupIdx, offsetInChunk, localVector->getVector(), offsetInVector); + write(nodeGroupIdx, offsetInChunk, localVector, offsetInVector); } // Set nulls based on deleteInfo. Note that this code path actually only gets executed when // the column is a regular format one. This is not a good design, should be unified with csr diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index def92c61c50..48c1be3023c 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -53,10 +53,8 @@ void RelTable::update(transaction::Transaction* transaction, column_id_t columnI void RelTable::delete_(Transaction* transaction, ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, ValueVector* relIDVector) { - auto fwdDeleted = - fwdRelTableData->delete_(transaction, srcNodeIDVector, dstNodeIDVector, relIDVector); - auto bwdDeleted = - bwdRelTableData->delete_(transaction, dstNodeIDVector, srcNodeIDVector, relIDVector); + auto fwdDeleted = fwdRelTableData->delete_(transaction, srcNodeIDVector, relIDVector); + auto bwdDeleted = bwdRelTableData->delete_(transaction, dstNodeIDVector, relIDVector); KU_ASSERT(fwdDeleted == bwdDeleted); if (fwdDeleted && bwdDeleted) { auto relsStats = ku_dynamic_cast(tablesStatistics); @@ -72,7 +70,8 @@ void RelTable::detachDelete(Transaction* transaction, RelDataDirection direction auto reverseTableData = direction == RelDataDirection::FWD ? bwdRelTableData.get() : fwdRelTableData.get(); auto relDataReadState = std::make_unique(); - initializeReadState(transaction, direction, {0}, srcNodeIDVector, relDataReadState.get()); + initializeReadState( + transaction, direction, {REL_ID_COLUMN_ID}, srcNodeIDVector, relDataReadState.get()); row_idx_t numRelsDeleted = detachDeleteForCSRRels(transaction, tableData, reverseTableData, srcNodeIDVector, relDataReadState.get(), deleteState); auto relsStats = ku_dynamic_cast(tablesStatistics); @@ -106,11 +105,10 @@ row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableDat tempState->selVector->resetSelectorToValuePosBufferWithSize(1); for (auto i = 0u; i < numRelsScanned; i++) { tempState->selVector->selectedPositions[0] = i; - auto deleted = tableData->delete_(transaction, srcNodeIDVector, - deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()); - auto reverseDeleted = - reverseTableData->delete_(transaction, deleteState->dstNodeIDVector.get(), - srcNodeIDVector, deleteState->relIDVector.get()); + auto deleted = + tableData->delete_(transaction, srcNodeIDVector, deleteState->relIDVector.get()); + auto reverseDeleted = reverseTableData->delete_( + transaction, deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()); KU_ASSERT(deleted == reverseDeleted); numRelsDeleted += (deleted && reverseDeleted); } @@ -133,14 +131,14 @@ void RelTable::addColumn( relsStats->addMetadataDAHInfo(tableID, *property.getDataType()); fwdRelTableData->addColumn(transaction, RelDataDirectionUtils::relDirectionToString(RelDataDirection::FWD), - fwdRelTableData->getAdjColumn()->getMetadataDA(), - *relsStats->getPropertyMetadataDAHInfo( + fwdRelTableData->getNbrIDColumn()->getMetadataDA(), + *relsStats->getColumnMetadataDAHInfo( transaction, tableID, fwdRelTableData->getNumColumns(), RelDataDirection::FWD), property, defaultValueVector, relsStats); bwdRelTableData->addColumn(transaction, RelDataDirectionUtils::relDirectionToString(RelDataDirection::BWD), - bwdRelTableData->getAdjColumn()->getMetadataDA(), - *relsStats->getPropertyMetadataDAHInfo( + bwdRelTableData->getNbrIDColumn()->getMetadataDA(), + *relsStats->getColumnMetadataDAHInfo( transaction, tableID, bwdRelTableData->getNumColumns(), RelDataDirection::BWD), property, defaultValueVector, relsStats); // TODO(Guodong): addColumn is not going through localStorage design for now. So it needs to add diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index a10ea4392b4..affd144620d 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -21,13 +21,13 @@ RelDataReadState::RelDataReadState() bool RelDataReadState::hasMoreToReadFromLocalStorage() const { KU_ASSERT(localNodeGroup); - return posInCurrentCSR < localNodeGroup->getRelNGInfo()->getNumInsertedTuples( - currentNodeOffset - startNodeOffset); + return posInCurrentCSR < + localNodeGroup->getNumInsertedRels(currentNodeOffset - startNodeOffset); } bool RelDataReadState::trySwitchToLocalStorage() { - if (localNodeGroup && localNodeGroup->getRelNGInfo()->getNumInsertedTuples( - currentNodeOffset - startNodeOffset) > 0) { + if (localNodeGroup && + localNodeGroup->getNumInsertedRels(currentNodeOffset - startNodeOffset) > 0) { readFromLocalStorage = true; posInCurrentCSR = 0; return true; @@ -139,21 +139,23 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, csrHeaderColumns.length = std::make_unique(csrLengthColumnName, *LogicalType::UINT64(), *csrLengthMetadataDAHInfo, dataFH, metadataFH, bufferManager, wal, &DUMMY_WRITE_TRANSACTION, RWPropertyStats::empty(), enableCompression, false /* requireNUllColumn */); - // Adj column. - auto adjMetadataDAHInfo = - relsStoreStats->getAdjMetadataDAHInfo(&DUMMY_WRITE_TRANSACTION, tableID, direction); - auto adjColName = StorageUtils::getColumnName( - "", StorageUtils::ColumnType::ADJ, RelDataDirectionUtils::relDirectionToString(direction)); - adjColumn = ColumnFactory::createColumn(adjColName, *LogicalType::INTERNAL_ID(), - *adjMetadataDAHInfo, dataFH, metadataFH, bufferManager, wal, &DUMMY_WRITE_TRANSACTION, + // Columns (nbrID + properties). + auto& properties = tableEntry->getPropertiesRef(); + columns.reserve(properties.size() + 1); + auto nbrIDMetadataDAHInfo = relsStoreStats->getColumnMetadataDAHInfo( + &DUMMY_WRITE_TRANSACTION, tableID, NBR_ID_COLUMN_ID, direction); + auto nbrIDColName = StorageUtils::getColumnName("NBR_ID", StorageUtils::ColumnType::DEFAULT, + RelDataDirectionUtils::relDirectionToString(direction)); + auto nbrIDColumn = ColumnFactory::createColumn(nbrIDColName, *LogicalType::INTERNAL_ID(), + *nbrIDMetadataDAHInfo, dataFH, metadataFH, bufferManager, wal, &DUMMY_WRITE_TRANSACTION, RWPropertyStats::empty(), enableCompression); + columns.push_back(std::move(nbrIDColumn)); // Property columns. - auto& properties = tableEntry->getPropertiesRef(); - columns.reserve(properties.size()); for (auto i = 0u; i < properties.size(); i++) { auto& property = properties[i]; - auto metadataDAHInfo = relsStoreStats->getPropertyMetadataDAHInfo( - &DUMMY_WRITE_TRANSACTION, tableID, i, direction); + auto columnID = tableEntry->getColumnID(property.getPropertyID()); + auto metadataDAHInfo = relsStoreStats->getColumnMetadataDAHInfo( + &DUMMY_WRITE_TRANSACTION, tableID, columnID, direction); auto colName = StorageUtils::getColumnName(property.getName(), StorageUtils::ColumnType::DEFAULT, RelDataDirectionUtils::relDirectionToString(direction)); @@ -161,18 +163,22 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, *metadataDAHInfo, dataFH, metadataFH, bufferManager, wal, &DUMMY_WRITE_TRANSACTION, RWPropertyStats(relsStoreStats, tableID, property.getPropertyID()), enableCompression)); } - // Set common tableID for adjColumn and relIDColumn. + // Set common tableID for nbrIDColumn and relIDColumn. auto nbrTableID = ku_dynamic_cast(tableEntry) ->getNbrTableID(direction); - dynamic_cast(adjColumn.get())->setCommonTableID(nbrTableID); - dynamic_cast(columns[REL_ID_COLUMN_ID].get())->setCommonTableID(tableID); + ku_dynamic_cast(columns[NBR_ID_COLUMN_ID].get()) + ->setCommonTableID(nbrTableID); + ku_dynamic_cast(columns[REL_ID_COLUMN_ID].get()) + ->setCommonTableID(tableID); packedCSRInfo = PackedCSRInfo(); } void RelTableData::initializeReadState(Transaction* transaction, std::vector columnIDs, ValueVector* inNodeIDVector, RelDataReadState* readState) { readState->direction = direction; - readState->columnIDs = std::move(columnIDs); + readState->columnIDs.clear(); + readState->columnIDs.push_back(NBR_ID_COLUMN_ID); + readState->columnIDs.insert(readState->columnIDs.end(), columnIDs.begin(), columnIDs.end()); // Reset to read from persistent storage. readState->readFromLocalStorage = false; auto nodeOffset = @@ -214,12 +220,10 @@ void RelTableData::scan(Transaction* transaction, TableReadState& readState, outputVectors[0]->state->selVector->resetSelectorToUnselectedWithSize(numRowsToRead); outputVectors[0]->state->setOriginalSize(numRowsToRead); auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(relReadState.currentNodeOffset); - adjColumn->scan(transaction, nodeGroupIdx, startOffset, endOffset, outputVectors[0], - 0 /* offsetInVector */); auto relIDVectorIdx = INVALID_VECTOR_IDX; for (auto i = 0u; i < relReadState.columnIDs.size(); i++) { auto columnID = relReadState.columnIDs[i]; - auto outputVectorId = i + 1; // Skip output from adj column. + auto outputVectorId = i; // Skip output from nbrID column. if (columnID == INVALID_COLUMN_ID) { outputVectors[outputVectorId]->setAllNull(); continue; @@ -227,7 +231,7 @@ void RelTableData::scan(Transaction* transaction, TableReadState& readState, if (columnID == REL_ID_COLUMN_ID) { relIDVectorIdx = outputVectorId; } - columns[relReadState.columnIDs[i]]->scan(transaction, nodeGroupIdx, startOffset, endOffset, + getColumn(columnID)->scan(transaction, nodeGroupIdx, startOffset, endOffset, outputVectors[outputVectorId], 0 /* offsetInVector */); } if (transaction->isWriteTransaction() && relReadState.localNodeGroup) { @@ -235,7 +239,7 @@ void RelTableData::scan(Transaction* transaction, TableReadState& readState, inNodeIDVector->readNodeOffset(inNodeIDVector->state->selVector->selectedPositions[0]); KU_ASSERT(relIDVectorIdx != INVALID_VECTOR_IDX); auto relIDVector = outputVectors[relIDVectorIdx]; - relReadState.localNodeGroup->applyLocalChangesForCSRColumns( + relReadState.localNodeGroup->applyLocalChangesToScannedVectors( nodeOffset - relReadState.startNodeOffset, relReadState.columnIDs, relIDVector, outputVectors); } @@ -248,11 +252,10 @@ void RelTableData::lookup(Transaction* /*transaction*/, TableReadState& /*readSt void RelTableData::insert(transaction::Transaction* transaction, ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { - auto localTableData = ku_dynamic_cast( - transaction->getLocalStorage()->getOrCreateLocalTableData( - tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity)); + auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( + tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); auto checkPersistent = - localTableData->insert(srcNodeIDVector, dstNodeIDVector, propertyVectors); + localTableData->insert({srcNodeIDVector, dstNodeIDVector}, propertyVectors); if (checkPersistent && multiplicity == common::RelMultiplicity::ONE) { checkRelMultiplicityConstraint(transaction, srcNodeIDVector); } @@ -261,18 +264,16 @@ void RelTableData::insert(transaction::Transaction* transaction, ValueVector* sr void RelTableData::update(transaction::Transaction* transaction, column_id_t columnID, ValueVector* srcNodeIDVector, ValueVector* relIDVector, ValueVector* propertyVector) { KU_ASSERT(columnID < columns.size() && columnID != REL_ID_COLUMN_ID); - auto localTableData = ku_dynamic_cast( - transaction->getLocalStorage()->getOrCreateLocalTableData( - tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity)); - localTableData->update(srcNodeIDVector, relIDVector, columnID, propertyVector); + auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( + tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); + localTableData->update({srcNodeIDVector, relIDVector}, columnID, propertyVector); } -bool RelTableData::delete_(Transaction* transaction, ValueVector* srcNodeIDVector, - ValueVector* dstNodeIDVector, ValueVector* relIDVector) { - auto localTableData = ku_dynamic_cast( - transaction->getLocalStorage()->getOrCreateLocalTableData( - tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity)); - return localTableData->delete_(srcNodeIDVector, dstNodeIDVector, relIDVector); +bool RelTableData::delete_( + Transaction* transaction, ValueVector* srcNodeIDVector, ValueVector* relIDVector) { + auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( + tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); + return localTableData->delete_(srcNodeIDVector, relIDVector); } void RelTableData::checkRelMultiplicityConstraint( @@ -304,10 +305,9 @@ bool RelTableData::checkIfNodeHasRels(Transaction* transaction, offset_t nodeOff void RelTableData::append(NodeGroup* nodeGroup) { auto csrNodeGroup = ku_dynamic_cast(nodeGroup); csrHeaderColumns.append(csrNodeGroup->getCSRHeader(), nodeGroup->getNodeGroupIdx()); - adjColumn->append(nodeGroup->getColumnChunkUnsafe(0), nodeGroup->getNodeGroupIdx()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { - columns[columnID]->append( - nodeGroup->getColumnChunkUnsafe(columnID + 1), nodeGroup->getNodeGroupIdx()); + getColumn(columnID)->append( + nodeGroup->getColumnChunkUnsafe(columnID), nodeGroup->getNodeGroupIdx()); } } @@ -385,66 +385,44 @@ double RelTableData::getHighDensity(uint64_t level) const { (packedCSRInfo.highDensityStep * (double)(packedCSRInfo.calibratorTreeHeight - level)); } -static vector_idx_t getSegmentIdx(offset_t offset) { - return offset >> StorageConstants::CSR_SEGMENT_SIZE_LOG2; -} - -void RelTableData::LocalState::initChangesPerSegment() { - auto numSegments = StorageConstants::NODE_GROUP_SIZE / StorageConstants::CSR_SEGMENT_SIZE; - sizeChangesPerSegment.resize(numSegments, 0 /*initValue*/); - hasChangesPerSegment.resize(numSegments, false /*initValue*/); - auto relNGInfo = localNG->getRelNGInfo(); - for (auto& [offset, insertions] : relNGInfo->adjInsertInfo) { - auto segmentIdx = getSegmentIdx(offset); - sizeChangesPerSegment[segmentIdx] += insertions.size(); - hasChangesPerSegment[segmentIdx] = true; - } - for (auto& [offset, deletions] : relNGInfo->deleteInfo) { - auto segmentIdx = getSegmentIdx(offset); - sizeChangesPerSegment[segmentIdx] -= deletions.size(); - hasChangesPerSegment[segmentIdx] = true; - } - for (auto& updateInfoPerColumn : relNGInfo->updateInfoPerChunk) { - for (auto& [offset, updates] : updateInfoPerColumn) { - auto segmentIdx = getSegmentIdx(offset); - hasChangesPerSegment[segmentIdx] = true; - } - } +RelTableData::LocalState::LocalState(LocalRelNG* localNG) : localNG{localNG} { + localNG->getChangesPerCSRSegment(sizeChangesPerSegment, hasChangesPerSegment); } void RelTableData::applyUpdatesToChunk(const PersistentState& persistentState, - const PackedCSRRegion& region, LocalVectorCollection* localChunk, - const update_insert_info_t& updateInfo, ColumnChunk* chunk) { - std::map csrOffsetInRegionToRowIdx; - auto [leftNodeBoundary, rightNodeBoundary] = region.getNodeOffsetBoundaries(); - for (auto& [nodeOffset, updates] : updateInfo) { + LocalState& localState, const LocalVectorCollection& localChunk, ColumnChunk* chunk, + column_id_t columnID) { + offset_to_row_idx_t csrOffsetInRegionToRowIdx; + auto [leftNodeBoundary, rightNodeBoundary] = localState.region.getNodeOffsetBoundaries(); + auto& updateChunk = localState.localNG->getUpdateChunks(columnID); + for (auto& [nodeOffset, updates] : updateChunk.getSrcNodeOffsetToRelOffsets()) { if (nodeOffset < leftNodeBoundary || nodeOffset > rightNodeBoundary) { continue; } - for (auto [relID, rowIdx] : updates) { - auto csrOffsetInRegion = findCSROffsetInRegion(persistentState, nodeOffset, relID); - csrOffsetInRegionToRowIdx[csrOffsetInRegion] = rowIdx; + for (auto relOffset : updates) { + auto csrOffsetInRegion = findCSROffsetInRegion(persistentState, nodeOffset, relOffset); + csrOffsetInRegionToRowIdx[csrOffsetInRegion] = + updateChunk.getRowIdxFromOffset(relOffset); } } Column::applyLocalChunkToColumnChunk(localChunk, chunk, csrOffsetInRegionToRowIdx); } void RelTableData::applyInsertionsToChunk(const PersistentState& persistentState, - const LocalState& localState, LocalVectorCollection* localChunk, - const update_insert_info_t& insertInfo, ColumnChunk* newChunk) { - std::map csrOffsetToRowIdx; + const LocalState& localState, const LocalVectorCollection& localChunk, ColumnChunk* newChunk) { + offset_to_row_idx_t csrOffsetToRowIdx; auto [leftNodeBoundary, rightNodeBoundary] = localState.region.getNodeOffsetBoundaries(); - for (auto& [nodeOffset, insertions] : insertInfo) { + auto& insertChunks = localState.localNG->insertChunks; + for (auto& [nodeOffset, insertions] : insertChunks.getSrcNodeOffsetToRelOffsets()) { if (nodeOffset < leftNodeBoundary || nodeOffset > rightNodeBoundary) { continue; } - // TODO: Separate this into a function. auto csrOffsetInRegion = localState.header.getStartCSROffset(nodeOffset) + persistentState.header.getCSRLength(nodeOffset) - localState.leftCSROffset; - for (auto& [_, rowIdx] : insertions) { + for (auto relOffset : insertions) { KU_ASSERT(csrOffsetInRegion != UINT64_MAX); - csrOffsetToRowIdx[csrOffsetInRegion++] = rowIdx; + csrOffsetToRowIdx[csrOffsetInRegion++] = insertChunks.getRowIdxFromOffset(relOffset); } } Column::applyLocalChunkToColumnChunk(localChunk, newChunk, csrOffsetToRowIdx); @@ -452,9 +430,10 @@ void RelTableData::applyInsertionsToChunk(const PersistentState& persistentState // TODO(Guodong): This should be refactored to share the same control logic with // `applyDeletionsToColumn`. -void RelTableData::applyDeletionsToChunk(const PersistentState& persistentState, - const LocalState& localState, const delete_info_t& deleteInfo, ColumnChunk* chunk) { - for (auto& [offset, deletions] : deleteInfo) { +void RelTableData::applyDeletionsToChunk( + const PersistentState& persistentState, const LocalState& localState, ColumnChunk* chunk) { + auto& deleteInfo = localState.localNG->deleteInfo; + for (auto& [offset, deletions] : deleteInfo.getSrcNodeOffsetToRelOffsetVec()) { if (localState.region.isOutOfBoundary(offset)) { continue; } @@ -488,9 +467,8 @@ void RelTableData::applyDeletionsToChunk(const PersistentState& persistentState, void RelTableData::distributeAndUpdateColumn(Transaction* transaction, node_group_idx_t nodeGroupIdx, column_id_t columnID, const PersistentState& persistentState, LocalState& localState) { - KU_ASSERT(columnID < columns.size() || columnID == INVALID_COLUMN_ID); + auto column = getColumn(columnID); auto [leftNodeBoundary, rightNodeBoundary] = localState.region.getNodeOffsetBoundaries(); - auto column = columnID == INVALID_COLUMN_ID ? adjColumn.get() : columns[columnID].get(); KU_ASSERT(localState.regionCapacity >= (localState.rightCSROffset - localState.leftCSROffset)); // First, scan the whole region to a temp chunk. auto oldSize = persistentState.rightCSROffset - persistentState.leftCSROffset + 1; @@ -498,11 +476,10 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, *column->getDataType().copy(), enableCompression, oldSize); column->scan(transaction, nodeGroupIdx, chunk.get(), persistentState.leftCSROffset, persistentState.rightCSROffset + 1); - auto relNGInfo = localState.localNG->getRelNGInfo(); - auto& updateInfo = relNGInfo->getUpdateInfo(columnID); - auto localChunk = getLocalChunk(localState, columnID); - applyUpdatesToChunk(persistentState, localState.region, localChunk, updateInfo, chunk.get()); - applyDeletionsToChunk(persistentState, localState, relNGInfo->deleteInfo, chunk.get()); + auto localUpdateChunk = + localState.localNG->getUpdateChunks(columnID).getLocalChunk(0 /*columnID*/); + applyUpdatesToChunk(persistentState, localState, localUpdateChunk, chunk.get(), columnID); + applyDeletionsToChunk(persistentState, localState, chunk.get()); // Second, create a new temp chunk for the region. auto newSize = localState.rightCSROffset - localState.leftCSROffset + 1; auto newChunk = ColumnChunkFactory::createColumnChunk( @@ -521,12 +498,11 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, } auto newCSROffsetInRegion = localState.header.getStartCSROffset(nodeOffset) - localState.leftCSROffset; - KU_ASSERT(!relNGInfo->deleteInfo.contains(nodeOffset)); KU_ASSERT(newCSROffsetInRegion >= newChunk->getNumValues()); newChunk->copy(chunk.get(), csrOffsetInRegion, newCSROffsetInRegion, length); } - auto& insertInfo = relNGInfo->getInsertInfo(columnID); - applyInsertionsToChunk(persistentState, localState, localChunk, insertInfo, newChunk.get()); + auto insertLocalChunk = localState.localNG->insertChunks.getLocalChunk(columnID); + applyInsertionsToChunk(persistentState, localState, insertLocalChunk, newChunk.get()); std::vector dstOffsets; dstOffsets.resize(newChunk->getNumValues()); fillSequence(dstOffsets, localState.leftCSROffset); @@ -567,26 +543,23 @@ std::vector RelTableData::findRegions( void RelTableData::updateRegion(Transaction* transaction, node_group_idx_t nodeGroupIdx, PersistentState& persistentState, LocalState& localState) { - auto localInfo = localState.localNG->getRelNGInfo(); // Scan RelID column chunk when there are updates or deletions. // TODO(Guodong): Should track for each region if it has updates or deletions. - if (localInfo->hasUpdates() || !localInfo->deleteInfo.empty()) { + if (localState.localNG->hasUpdatesOrDeletions()) { // NOTE: There is an implicit trick happening. Due to the mismatch of storage type and // in-memory representation of INTERNAL_ID, we only store offset as INT64 on disk. Here // we directly read relID's offset part from disk into an INT64 column chunk. persistentState.relIDChunk = ColumnChunkFactory::createColumnChunk( *LogicalType::INT64(), enableCompression, localState.regionCapacity); - columns[REL_ID_COLUMN_ID]->scan(transaction, nodeGroupIdx, persistentState.relIDChunk.get(), - persistentState.leftCSROffset, persistentState.rightCSROffset + 1); + getColumn(REL_ID_COLUMN_ID) + ->scan(transaction, nodeGroupIdx, persistentState.relIDChunk.get(), + persistentState.leftCSROffset, persistentState.rightCSROffset + 1); } if (localState.region.level == 0) { - updateColumn(transaction, nodeGroupIdx, INVALID_COLUMN_ID, persistentState, localState); for (auto columnID = 0u; columnID < columns.size(); columnID++) { updateColumn(transaction, nodeGroupIdx, columnID, persistentState, localState); } } else { - distributeAndUpdateColumn( - transaction, nodeGroupIdx, INVALID_COLUMN_ID, persistentState, localState); for (auto columnID = 0u; columnID < columns.size(); columnID++) { distributeAndUpdateColumn( transaction, nodeGroupIdx, columnID, persistentState, localState); @@ -702,16 +675,6 @@ void RelTableData::slideRightForInsertions(offset_t nodeOffset, offset_t rightBo } } -LocalVectorCollection* RelTableData::getLocalChunk( - const RelTableData::LocalState& localState, column_id_t columnID) { - return columnID == INVALID_COLUMN_ID ? localState.localNG->getAdjChunk() : - localState.localNG->getPropertyChunk(columnID); -} - -Column* RelTableData::getColumn(column_id_t columnID) { - return columnID == INVALID_COLUMN_ID ? adjColumn.get() : TableData::getColumn(columnID); -} - void RelTableData::updateColumn(Transaction* transaction, node_group_idx_t nodeGroupIdx, column_id_t columnID, const RelTableData::PersistentState& persistentState, LocalState& localState) { @@ -726,34 +689,32 @@ void RelTableData::updateColumn(Transaction* transaction, node_group_idx_t nodeG void RelTableData::applyUpdatesToColumn(Transaction* transaction, node_group_idx_t nodeGroupIdx, column_id_t columnID, const PersistentState& persistentState, LocalState& localState, Column* column) { - std::map writeInfo; - auto relNGInfo = localState.localNG->getRelNGInfo(); - auto& updateInfo = relNGInfo->getUpdateInfo(columnID); - for (auto& [offset, updatesPerNode] : updateInfo) { - if (localState.region.isOutOfBoundary(offset)) { + offset_to_row_idx_t writeInfo; + auto& updateChunk = localState.localNG->getUpdateChunks(columnID); + for (auto& [srcOffset, updatesPerNode] : updateChunk.getSrcNodeOffsetToRelOffsets()) { + if (localState.region.isOutOfBoundary(srcOffset)) { // TODO: Should also partition local storage into regions. So we can avoid this check. continue; } - for (auto& [relID, rowIdx] : updatesPerNode) { - auto csrOffsetInRegion = findCSROffsetInRegion(persistentState, offset, relID); - writeInfo[csrOffsetInRegion] = rowIdx; + for (auto relOffset : updatesPerNode) { + auto csrOffsetInRegion = findCSROffsetInRegion(persistentState, srcOffset, relOffset); + writeInfo[csrOffsetInRegion] = updateChunk.getRowIdxFromOffset(relOffset); } } if (!writeInfo.empty()) { - auto localChunk = getLocalChunk(localState, columnID); - column->prepareCommitForChunk( - transaction, nodeGroupIdx, localChunk, {} /*insertInfo*/, writeInfo, {} /*deleteInfo*/); + auto localChunk = updateChunk.getLocalChunk(0 /*columnID*/); + column->prepareCommitForChunk(transaction, nodeGroupIdx, LocalVectorCollection::empty(), + {} /*insertInfo*/, localChunk, writeInfo, {} /*deleteInfo*/); } } void RelTableData::applyInsertionsToColumn(Transaction* transaction, node_group_idx_t nodeGroupIdx, column_id_t columnID, LocalState& localState, const PersistentState& persistentState, Column* column) { - std::map writeInfo; - auto relNGInfo = localState.localNG->getRelNGInfo(); - auto& insertInfo = relNGInfo->getInsertInfo(columnID); - auto& deleteInfo = relNGInfo->getDeleteInfo(); - for (auto& [offset, insertions] : insertInfo) { + (void)persistentState; // Avoid unused variable warning. + offset_to_row_idx_t writeInfo; + auto& insertChunks = localState.localNG->insertChunks; + for (auto& [offset, insertions] : insertChunks.getSrcNodeOffsetToRelOffsets()) { if (localState.region.isOutOfBoundary(offset)) { continue; } @@ -761,22 +722,23 @@ void RelTableData::applyInsertionsToColumn(Transaction* transaction, node_group_ auto length = localState.header.getCSRLength(offset); KU_ASSERT(length >= insertions.size()); KU_ASSERT((startCSROffset + persistentState.header.getCSRLength(offset) - - (deleteInfo.contains(offset) ? deleteInfo.at(offset).size() : 0) + + localState.localNG->deleteInfo.getNumDeletedRelsFromSrcOffset(offset) + insertions.size()) <= localState.header.getEndCSROffset(offset)); auto idx = startCSROffset + length - insertions.size(); - for (auto& [relID, rowIdx] : insertions) { - writeInfo[idx++] = rowIdx; + for (auto relOffset : insertions) { + writeInfo[idx++] = insertChunks.getRowIdxFromOffset(relOffset); } } - auto localChunk = getLocalChunk(localState, columnID); - column->prepareCommitForChunk(transaction, nodeGroupIdx, localChunk, writeInfo, {}, {}); + auto localChunk = insertChunks.getLocalChunk(columnID); + column->prepareCommitForChunk( + transaction, nodeGroupIdx, localChunk, writeInfo, LocalVectorCollection::empty(), {}, {}); } std::vector> RelTableData::getSlidesForDeletions( - const PersistentState& persistentState, const LocalState& localState, - const delete_info_t& deleteInfo) { + const PersistentState& persistentState, const LocalState& localState) { std::vector> slides; - for (auto& [offset, deletions] : deleteInfo) { + for (auto& [offset, deletions] : + localState.localNG->deleteInfo.getSrcNodeOffsetToRelOffsetVec()) { if (localState.region.isOutOfBoundary(offset)) { continue; } @@ -818,9 +780,7 @@ std::vector> RelTableData::getSlidesForDeletions( // 3. `getSlidesForDeletions` can be done once for all columns. void RelTableData::applyDeletionsToColumn(Transaction* transaction, node_group_idx_t nodeGroupIdx, LocalState& localState, const PersistentState& persistentState, Column* column) { - auto relNGInfo = localState.localNG->getRelNGInfo(); - auto& deleteInfo = relNGInfo->getDeleteInfo(); - auto slides = getSlidesForDeletions(persistentState, localState, deleteInfo); + auto slides = getSlidesForDeletions(persistentState, localState); if (slides.empty()) { return; } @@ -880,11 +840,11 @@ void RelTableData::applySliding(Transaction* transaction, node_group_idx_t nodeG column->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, chunk.get(), 0); } -static offset_t getMaxNumNodesInRegion( - const CSRHeaderChunks& header, const PackedCSRRegion& region, const RelNGInfo* localInfo) { +offset_t RelTableData::getMaxNumNodesInRegion( + const CSRHeaderChunks& header, const PackedCSRRegion& region, const LocalRelNG* localNG) { auto numNodes = header.offset->getNumValues(); KU_ASSERT(numNodes == header.length->getNumValues()); - for (auto& [offset, _] : localInfo->adjInsertInfo) { + for (auto& [offset, _] : localNG->insertChunks.getSrcNodeOffsetToRelOffsets()) { if (!region.isOutOfBoundary(offset) && offset >= numNodes) { numNodes = offset + 1; } @@ -894,10 +854,10 @@ static offset_t getMaxNumNodesInRegion( void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t nodeGroupIdx, PersistentState& persistentState, LocalState& localState) { - auto localInfo = localState.localNG->getRelNGInfo(); auto [leftBoundary, rightBoundary] = localState.region.getNodeOffsetBoundaries(); auto& header = persistentState.header; - auto maxNumNodesInRegion = getMaxNumNodesInRegion(header, localState.region, localInfo); + auto maxNumNodesInRegion = + getMaxNumNodesInRegion(header, localState.region, localState.localNG); // Update the region boundary based on actual num nodes in the region. localState.region.leftBoundary = std::min(leftBoundary, header.offset->getNumValues()); localState.region.rightBoundary = std::min(rightBoundary, maxNumNodesInRegion - 1); @@ -907,13 +867,14 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no auto& newHeader = localState.header; newHeader.copyFrom(header); newHeader.fillDefaultValues(localState.region.rightBoundary + 1); - if (localInfo->adjInsertInfo.empty() && localInfo->deleteInfo.empty()) { + if (localState.localNG->insertChunks.isEmpty() && localState.localNG->deleteInfo.isEmpty()) { // No need to update the csr header. localState.leftCSROffset = persistentState.leftCSROffset; localState.rightCSROffset = persistentState.rightCSROffset; return; } - for (auto& [offset, deletions] : localInfo->deleteInfo) { + for (auto& [offset, deletions] : + localState.localNG->deleteInfo.getSrcNodeOffsetToRelOffsetVec()) { if (localState.region.isOutOfBoundary(offset)) { continue; } @@ -922,12 +883,12 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no KU_ASSERT(newLength >= 0); newHeader.length->setValue(newLength, offset); } - for (auto& [offset, _] : localInfo->adjInsertInfo) { + for (auto& [offset, _] : localState.localNG->insertChunks.getSrcNodeOffsetToRelOffsets()) { if (localState.region.isOutOfBoundary(offset)) { continue; } auto oldLength = newHeader.getCSRLength(offset); - auto numInsertions = localInfo->adjInsertInfo.at(offset).size(); + auto numInsertions = localState.localNG->getNumInsertedRels(offset); if (localState.region.level == 0) { findPositionsForInsertions(offset, numInsertions, localState); } @@ -1018,14 +979,12 @@ LocalRelNG* RelTableData::getLocalNodeGroup( void RelTableData::checkpointInMemory() { csrHeaderColumns.offset->checkpointInMemory(); csrHeaderColumns.length->checkpointInMemory(); - adjColumn->checkpointInMemory(); TableData::checkpointInMemory(); } void RelTableData::rollbackInMemory() { csrHeaderColumns.offset->rollbackInMemory(); csrHeaderColumns.length->rollbackInMemory(); - adjColumn->rollbackInMemory(); TableData::rollbackInMemory(); } diff --git a/src/storage/store/string_column.cpp b/src/storage/store/string_column.cpp index 42cb4f1ddbc..57aea542718 100644 --- a/src/storage/store/string_column.cpp +++ b/src/storage/store/string_column.cpp @@ -170,28 +170,27 @@ void StringColumn::lookupInternal( } bool StringColumn::canCommitInPlace(transaction::Transaction* transaction, - node_group_idx_t nodeGroupIdx, LocalVectorCollection* localChunk, - const offset_to_row_idx_t& insertInfo, const offset_to_row_idx_t& updateInfo) { - std::vector rowIdxesToRead; - for (auto& [offset, rowIdx] : updateInfo) { - rowIdxesToRead.push_back(rowIdx); + node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + const offset_to_row_idx_t& updateInfo) { + auto strLenToAdd = 0u; + for (auto& [_, rowIdx] : updateInfo) { + auto localVector = localUpdateChunk.getLocalVector(rowIdx); + auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); + auto kuStr = localVector->getValue(offsetInVector); + strLenToAdd += kuStr.len; } offset_t maxOffset = 0u; for (auto& [offset, rowIdx] : insertInfo) { - rowIdxesToRead.push_back(rowIdx); if (offset > maxOffset) { maxOffset = offset; } - } - std::sort(rowIdxesToRead.begin(), rowIdxesToRead.end()); - auto strLenToAdd = 0u; - for (auto rowIdx : rowIdxesToRead) { - auto localVector = localChunk->getLocalVector(rowIdx); + auto localVector = localInsertChunk.getLocalVector(rowIdx); auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - auto kuStr = localVector->getVector()->getValue(offsetInVector); + auto kuStr = localVector->getValue(offsetInVector); strLenToAdd += kuStr.len; } - auto numStrings = rowIdxesToRead.size(); + auto numStrings = insertInfo.size() + updateInfo.size(); if (!dictionary.canCommitInPlace(transaction, nodeGroupIdx, numStrings, strLenToAdd)) { return false; } diff --git a/src/storage/store/struct_column.cpp b/src/storage/store/struct_column.cpp index 70427e381d0..19c27e9e5e4 100644 --- a/src/storage/store/struct_column.cpp +++ b/src/storage/store/struct_column.cpp @@ -126,12 +126,12 @@ void StructColumn::rollbackInMemory() { } bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo) { + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { // STRUCT column doesn't have actual data stored in buffer. Only need to check the null column. // Children columns are committed separately. return nullColumn->canCommitInPlace( - transaction, nodeGroupIdx, localChunk, insertInfo, updateInfo); + transaction, nodeGroupIdx, localInsertChunk, insertInfo, localUpdateChunk, updateInfo); } bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -141,31 +141,33 @@ bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t n } void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, - LocalVectorCollection* localColumnChunk, const offset_to_row_idx_t& insertInfo, - const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { + const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const offset_set_t& deleteInfo) { auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; if (isNewNodeGroup) { // If this is a new node group, updateInfo should be empty. We should perform out-of-place // commit with a new column chunk. - commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, localColumnChunk, isNewNodeGroup, - insertInfo, updateInfo, deleteInfo); + commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunk, + insertInfo, localUpdateChunk, updateInfo, deleteInfo); } else { // STRUCT column doesn't have actual data stored in buffer. Only need to update the null // column. - if (canCommitInPlace(transaction, nodeGroupIdx, localColumnChunk, insertInfo, updateInfo)) { - nullColumn->commitLocalChunkInPlace( - transaction, nodeGroupIdx, localColumnChunk, insertInfo, updateInfo, deleteInfo); + if (canCommitInPlace(transaction, nodeGroupIdx, localInsertChunk, insertInfo, + localUpdateChunk, updateInfo)) { + nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunk, + insertInfo, localUpdateChunk, updateInfo, deleteInfo); } else { - nullColumn->commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, localColumnChunk, - isNewNodeGroup, insertInfo, updateInfo, deleteInfo); + nullColumn->commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, + localInsertChunk, insertInfo, localUpdateChunk, updateInfo, deleteInfo); } // Update each child column separately for (auto i = 0u; i < childColumns.size(); i++) { const auto& childColumn = childColumns[i]; - auto childLocalColumnChunk = localColumnChunk->getStructChildVectorCollection(i); childColumn->prepareCommitForChunk(transaction, nodeGroupIdx, - childLocalColumnChunk.get(), insertInfo, updateInfo, deleteInfo); + localInsertChunk.getStructChildVectorCollection(i), insertInfo, + localUpdateChunk.getStructChildVectorCollection(i), updateInfo, deleteInfo); } } } diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index a170cf21da5..740863dca76 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -94,7 +94,7 @@ void WALReplayer::replayWALRecord(WALRecord& walRecord) { } } -void WALReplayer::replayPageUpdateOrInsertRecord(const kuzu::storage::WALRecord& walRecord) { +void WALReplayer::replayPageUpdateOrInsertRecord(const WALRecord& walRecord) { // 1. As the first step we copy over the page on disk, regardless of if we are recovering // (and checkpointing) or checkpointing while during regular execution. auto dbFileID = walRecord.pageInsertOrUpdateRecord.dbFileID; @@ -119,7 +119,7 @@ void WALReplayer::replayPageUpdateOrInsertRecord(const kuzu::storage::WALRecord& } } -void WALReplayer::replayTableStatisticsRecord(const kuzu::storage::WALRecord& walRecord) { +void WALReplayer::replayTableStatisticsRecord(const WALRecord& walRecord) { if (isCheckpoint) { if (walRecord.tableStatisticsRecord.isNodeTable) { auto walFilePath = StorageUtils::getNodesStatisticsAndDeletedIDsFilePath( @@ -187,7 +187,7 @@ void WALReplayer::replayRdfGraphRecord(const WALRecord& walRecord) { replayCreateTableRecord(literalTripleTableWALRecord); } -void WALReplayer::replayCopyTableRecord(const kuzu::storage::WALRecord& walRecord) { +void WALReplayer::replayCopyTableRecord(const WALRecord& walRecord) { auto tableID = walRecord.copyTableRecord.tableID; if (isCheckpoint) { if (!isRecovering) { @@ -217,7 +217,7 @@ void WALReplayer::replayCopyTableRecord(const kuzu::storage::WALRecord& walRecor } } -void WALReplayer::replayDropTableRecord(const kuzu::storage::WALRecord& walRecord) { +void WALReplayer::replayDropTableRecord(const WALRecord& walRecord) { if (isCheckpoint) { auto tableID = walRecord.dropTableRecord.tableID; if (!isRecovering) { @@ -266,7 +266,7 @@ void WALReplayer::replayDropTableRecord(const kuzu::storage::WALRecord& walRecor } } -void WALReplayer::replayDropPropertyRecord(const kuzu::storage::WALRecord& walRecord) { +void WALReplayer::replayDropPropertyRecord(const WALRecord& walRecord) { if (isCheckpoint) { auto tableID = walRecord.dropPropertyRecord.tableID; auto propertyID = walRecord.dropPropertyRecord.propertyID; @@ -299,7 +299,7 @@ void WALReplayer::replayDropPropertyRecord(const kuzu::storage::WALRecord& walRe } } -void WALReplayer::replayAddPropertyRecord(const kuzu::storage::WALRecord& walRecord) { +void WALReplayer::replayAddPropertyRecord(const WALRecord& walRecord) { auto tableID = walRecord.addPropertyRecord.tableID; auto propertyID = walRecord.addPropertyRecord.propertyID; if (!isCheckpoint) { diff --git a/test/test_files/tinysnb/call/call.test b/test/test_files/tinysnb/call/call.test index f484e75a1c6..dc10b125467 100644 --- a/test/test_files/tinysnb/call/call.test +++ b/test/test_files/tinysnb/call/call.test @@ -198,7 +198,7 @@ Binder exception: Cannot evaluate a.fName as a literal. 37 -STATEMENT CALL storage_info('knows') RETURN COUNT(*) ---- 1 -82 +84 -STATEMENT CALL storage_info('workAt') RETURN COUNT(*) ---- 1 -22 +24 diff --git a/test/test_files/update_node/set_tinysnb.test b/test/test_files/update_node/set_tinysnb.test index f5cfac72c99..4a66f7286e8 100644 --- a/test/test_files/update_node/set_tinysnb.test +++ b/test/test_files/update_node/set_tinysnb.test @@ -3,86 +3,86 @@ -- -#-CASE SetNodeInt64PropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.age=20 + 50 -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age -#---- 1 -#70 -# -#-CASE SetNodeInt32PropTest -#-STATEMENT MATCH (a:movies) WHERE a.name='Roma' SET a.length=2.2 -#---- ok -#-STATEMENT MATCH (a:movies) WHERE a.name='Roma' RETURN a.length -#---- 1 -#2 -# -#-CASE SetNodeDoublePropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.eyeSight=1.0 -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.eyeSight -#---- 1 -#1.000000 -# -#-CASE SetNodeFloatPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.height=12 -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.height -#---- 1 -#12.000000 -# -#-CASE SetNodeBoolPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.isStudent=false -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.isStudent -#---- 1 -#False -# -#-CASE SetNodeDatePropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.birthdate=date('2200-10-10') -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.birthdate -#---- 1 -#2200-10-10 -# -#-CASE SetNodeTimestampPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.registerTime=timestamp('2200-10-10 12:01:01') -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.registerTime -#---- 1 -#2200-10-10 12:01:01 -# -#-CASE SetNodeEmptyStringPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName='' -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName -#---- 1 -# -## end of SetNodeEmptyStringPropTest -# -#-CASE SetNodeShortStringPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName=string(22) -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName -#---- 1 -#22 -# -#-CASE SetNodeLongStringPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName='abcdefghijklmnopqrstuvwxyz' -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName -#---- 1 -#abcdefghijklmnopqrstuvwxyz -# -#-CASE SetLongListTest -#-DEFINE STRING_EXCEEDS_PAGE ARANGE 0 5990 -#-STATEMENT BEGIN TRANSACTION -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName="${STRING_EXCEEDS_PAGE}" -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName; -#---- 1 -#${STRING_EXCEEDS_PAGE} +-CASE SetNodeInt64PropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.age=20 + 50 +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age +---- 1 +70 + +-CASE SetNodeInt32PropTest +-STATEMENT MATCH (a:movies) WHERE a.name='Roma' SET a.length=2.2 +---- ok +-STATEMENT MATCH (a:movies) WHERE a.name='Roma' RETURN a.length +---- 1 +2 + +-CASE SetNodeDoublePropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.eyeSight=1.0 +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.eyeSight +---- 1 +1.000000 + +-CASE SetNodeFloatPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.height=12 +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.height +---- 1 +12.000000 + +-CASE SetNodeBoolPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.isStudent=false +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.isStudent +---- 1 +False + +-CASE SetNodeDatePropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.birthdate=date('2200-10-10') +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.birthdate +---- 1 +2200-10-10 + +-CASE SetNodeTimestampPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.registerTime=timestamp('2200-10-10 12:01:01') +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.registerTime +---- 1 +2200-10-10 12:01:01 + +-CASE SetNodeEmptyStringPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName='' +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName +---- 1 + +# end of SetNodeEmptyStringPropTest + +-CASE SetNodeShortStringPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName=string(22) +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName +---- 1 +22 + +-CASE SetNodeLongStringPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName='abcdefghijklmnopqrstuvwxyz' +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName +---- 1 +abcdefghijklmnopqrstuvwxyz + +-CASE SetLongListTest +-DEFINE STRING_EXCEEDS_PAGE ARANGE 0 5990 +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName="${STRING_EXCEEDS_PAGE}" +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.fName; +---- 1 +${STRING_EXCEEDS_PAGE} -CASE SetVeryLongListErrorsTest -DEFINE STRING_EXCEEDS_MEMORY_MANAGER_LIMIT ARANGE 0 50000 @@ -95,245 +95,245 @@ ---- hash 1 1c6f2aee653d75dfc2361ff73d5807f7 -#-CASE SetNodeIntervalPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.lastJobDuration=interval('1 years 1 days') -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.lastJobDuration -#---- 1 -#1 year 1 day -# -#-CASE SetNodePropNullTest -#-STATEMENT MATCH (a:person) SET a.age=null -#---- ok -#-STATEMENT MATCH (a:person) RETURN a.age -#---- 8 -# -# -# -# -# -# -# -# -## end of SetNodePropNullTest. Empty lines represent the expected null values -# -#-CASE SetBothUnflatTest -#-STATEMENT MATCH (a:person) SET a.age=a.ID -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID < 4 RETURN a.ID, a.age -#---- 3 -#0|0 -#2|2 -#3|3 -# -#-CASE SetFlatUnFlatTest -#-STATEMENT MATCH (a:person)-[:knows]->(b:person) WHERE a.ID=0 SET a.age=b.age -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID < 4 RETURN a.ID, a.age -#---- 3 -#0|20 -#2|30 -#3|45 -# -#-CASE SetUnFlatFlatTest -#-STATEMENT MATCH (a:person)-[:knows]->(b:person) WHERE b.ID=2 AND a.ID = 0 SET b.age=a.age -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID < 4 RETURN a.ID, a.age -#---- 3 -#0|35 -#2|35 -#3|45 -# -#-CASE SetTwoHopTest -#-STATEMENT MATCH (a:person)-[:knows]->(b:person)-[:knows]->(c:person) WHERE b.ID=0 AND c.fName = 'Bob' SET a.age=c.age -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID < 6 RETURN a.ID, a.age -#---- 4 -#0|35 -#2|30 -#3|30 -#5|30 -# -#-CASE SetTwoHopNullTest -#-STATEMENT MATCH (a:person)-[:knows]->(b:person)-[:knows]->(c:person) SET a.age=null -#---- ok -#-STATEMENT MATCH (a:person) RETURN a.ID, a.age -#---- 8 -#0| -#10|83 -#2| -#3| -#5| -#7|20 -#8|25 -#9|40 -# -#-CASE SetIndexNestedLoopJoinTest -#-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = b.ID SET a.age=b.gender -#---- ok -#-STATEMENT MATCH (a:person) RETURN a.ID, a.age -#---- 8 -#0|1 -#10|2 -#2|2 -#3|1 -#5|2 -#7|1 -#8|2 -#9|2 -# -#-CASE SetRelInt16PropTest -#-STATEMENT MATCH (a:person)-[e:studyAt]->(b:organisation) WHERE a.ID = 0 SET e.length=99 -#---- ok -#-STATEMENT MATCH (a:person)-[e:studyAt]->(b:organisation) RETURN e.length -#---- 3 -#22 -#55 -#99 -# -#-CASE SetNodeListOfIntPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.workedHours=[10,20] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.workedHours -#---- 1 -#[10,20] -# -#-CASE SetNodeListOfShortStringPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.usedNames=['intel','microsoft'] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.usedNames -#---- 1 -#[intel,microsoft] -# -#-CASE SetNodeListOfLongStringPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.usedNames -#---- 1 -#[abcndwjbwesdsd,microsofthbbjuwgedsd] -# -#-CASE SetNodeListofListPropTest -#-STATEMENT MATCH (a:person) WHERE a.ID=8 SET a.courseScoresPerTerm=[[10,20],[0,0,0]] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=8 RETURN a.courseScoresPerTerm -#---- 1 -#[[10,20],[0,0,0]] -# -#-CASE SETMultiLabelNodePropTest -#-STATEMENT MATCH (a) WHERE a.ID < 2 SET a.age = 1; -#---- ok -#-STATEMENT MATCH (a) WHERE a.ID < 2 RETURN a.ID, a.age; -#---- 2 -#0|1 -#1| -#-STATEMENT CREATE NODE TABLE play(ID INT64, name STRING, PRIMARY KEY(ID)); -#---- ok -#-STATEMENT CREATE (a:play {ID: 0, name: 'AA'}); -#---- ok -#-STATEMENT MATCH (a:organisation:play) RETURN a.ID, a.name; -#---- 4 -#0|AA -#1|ABFsUni -#4|CsWork -#6|DEsWork -#-STATEMENT MATCH (a:organisation:play) WHERE a.ID < 2 SET a.name = string(a.ID * 10); -#---- ok -#-STATEMENT MATCH (a:organisation:play) WHERE a.ID < 2 RETURN a.ID, a.name; -#---- 2 -#0|0 -#1|10 -# -#-CASE SETMultiLabelWithPruning -#-STATEMENT MATCH (a:person)-[:knows]->(b) WHERE a.ID=0 SET b.name = "a", b.fName = "XX" RETURN b.name, b.fName; -#---- 3 -#|XX -#|XX -#|XX -#-STATEMENT MATCH (b) RETURN b.name, b.fName -#---- 14 -#ABFsUni| -#CsWork| -#DEsWork| -#Roma| -#Sóló cón tu párejâ| -#The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie| -#|Alice -#|Elizabeth -#|Farooq -#|Greg -#|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff -#|XX -#|XX -#|XX -#-STATEMENT MATCH (a:person)-[e:knows|:studyAt]->(b:person) WHERE a.ID=0 SET e.year = 2023, e.date = date("2023-11-11") RETURN e.year, e.date; -#---- 3 -#|2023-11-11 -#|2023-11-11 -#|2023-11-11 -#-STATEMENT MATCH (a:person)-[e:knows|:studyAt]->(b:person:organisation) WHERE a.ID=0 RETURN e.year, e.date; -#---- 4 -#2021| -#|2023-11-11 -#|2023-11-11 -#|2023-11-11 -# -#-CASE SetNonNullValueWithWriteTransaction -#-STATEMENT BEGIN TRANSACTION -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age -#---- 1 -#35 -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.age=70 -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age -#---- 1 -#70 -# -#-CASE SetNullValueWithWriteTransaction -#-STATEMENT BEGIN TRANSACTION -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age -#---- 1 -#35 -#-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.age=NULL -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age -#---- 1 -# -#-CASE MultipleSetListValue -#-STATEMENT BEGIN TRANSACTION -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=10 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=5 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=2 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=3 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] -#---- ok -#-STATEMENT COMMIT -#---- ok -#-STATEMENT MATCH (a:person) WHERE a.ID=10 RETURN a.usedNames -#---- 1 -#[abcndwjbwesdsd,microsofthbbjuwgedsd] -#-STATEMENT MATCH (a:person) WHERE a.ID=5 RETURN a.usedNames -#---- 1 -#[abcndwjbwesdsd,microsofthbbjuwgedsd] -# -# -#-CASE OptionalSET -#-STATEMENT OPTIONAL MATCH (a:person) WHERE a.ID > 100 SET a.fName = 'a' RETURN a.fName; -#---- 1 -# -#-STATEMENT MATCH (a:person) WHERE a.ID < 3 RETURN a.fName; -#---- 2 -#Alice -#Bob -#-STATEMENT OPTIONAL MATCH (a) WHERE a.ID > 100 SET a.name, a.fName; -#----1 -# -#-STATEMENT MATCH (a) WHERE a.ID < 3 RETURN a.name, a.fName; -#---- 3 -#ABFsUni| -#|Alice -#|Bob +-CASE SetNodeIntervalPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.lastJobDuration=interval('1 years 1 days') +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.lastJobDuration +---- 1 +1 year 1 day + +-CASE SetNodePropNullTest +-STATEMENT MATCH (a:person) SET a.age=null +---- ok +-STATEMENT MATCH (a:person) RETURN a.age +---- 8 + + + + + + + + +# end of SetNodePropNullTest. Empty lines represent the expected null values + +-CASE SetBothUnflatTest +-STATEMENT MATCH (a:person) SET a.age=a.ID +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID < 4 RETURN a.ID, a.age +---- 3 +0|0 +2|2 +3|3 + +-CASE SetFlatUnFlatTest +-STATEMENT MATCH (a:person)-[:knows]->(b:person) WHERE a.ID=0 SET a.age=b.age +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID < 4 RETURN a.ID, a.age +---- 3 +0|20 +2|30 +3|45 + +-CASE SetUnFlatFlatTest +-STATEMENT MATCH (a:person)-[:knows]->(b:person) WHERE b.ID=2 AND a.ID = 0 SET b.age=a.age +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID < 4 RETURN a.ID, a.age +---- 3 +0|35 +2|35 +3|45 + +-CASE SetTwoHopTest +-STATEMENT MATCH (a:person)-[:knows]->(b:person)-[:knows]->(c:person) WHERE b.ID=0 AND c.fName = 'Bob' SET a.age=c.age +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID < 6 RETURN a.ID, a.age +---- 4 +0|35 +2|30 +3|30 +5|30 + +-CASE SetTwoHopNullTest +-STATEMENT MATCH (a:person)-[:knows]->(b:person)-[:knows]->(c:person) SET a.age=null +---- ok +-STATEMENT MATCH (a:person) RETURN a.ID, a.age +---- 8 +0| +10|83 +2| +3| +5| +7|20 +8|25 +9|40 + +-CASE SetIndexNestedLoopJoinTest +-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = b.ID SET a.age=b.gender +---- ok +-STATEMENT MATCH (a:person) RETURN a.ID, a.age +---- 8 +0|1 +10|2 +2|2 +3|1 +5|2 +7|1 +8|2 +9|2 + +-CASE SetRelInt16PropTest +-STATEMENT MATCH (a:person)-[e:studyAt]->(b:organisation) WHERE a.ID = 0 SET e.length=99 +---- ok +-STATEMENT MATCH (a:person)-[e:studyAt]->(b:organisation) RETURN e.length +---- 3 +22 +55 +99 + +-CASE SetNodeListOfIntPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.workedHours=[10,20] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.workedHours +---- 1 +[10,20] + +-CASE SetNodeListOfShortStringPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.usedNames=['intel','microsoft'] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.usedNames +---- 1 +[intel,microsoft] + +-CASE SetNodeListOfLongStringPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.usedNames +---- 1 +[abcndwjbwesdsd,microsofthbbjuwgedsd] + +-CASE SetNodeListofListPropTest +-STATEMENT MATCH (a:person) WHERE a.ID=8 SET a.courseScoresPerTerm=[[10,20],[0,0,0]] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=8 RETURN a.courseScoresPerTerm +---- 1 +[[10,20],[0,0,0]] + +-CASE SETMultiLabelNodePropTest +-STATEMENT MATCH (a) WHERE a.ID < 2 SET a.age = 1; +---- ok +-STATEMENT MATCH (a) WHERE a.ID < 2 RETURN a.ID, a.age; +---- 2 +0|1 +1| +-STATEMENT CREATE NODE TABLE play(ID INT64, name STRING, PRIMARY KEY(ID)); +---- ok +-STATEMENT CREATE (a:play {ID: 0, name: 'AA'}); +---- ok +-STATEMENT MATCH (a:organisation:play) RETURN a.ID, a.name; +---- 4 +0|AA +1|ABFsUni +4|CsWork +6|DEsWork +-STATEMENT MATCH (a:organisation:play) WHERE a.ID < 2 SET a.name = string(a.ID * 10); +---- ok +-STATEMENT MATCH (a:organisation:play) WHERE a.ID < 2 RETURN a.ID, a.name; +---- 2 +0|0 +1|10 + +-CASE SETMultiLabelWithPruning +-STATEMENT MATCH (a:person)-[:knows]->(b) WHERE a.ID=0 SET b.name = "a", b.fName = "XX" RETURN b.name, b.fName; +---- 3 +|XX +|XX +|XX +-STATEMENT MATCH (b) RETURN b.name, b.fName +---- 14 +ABFsUni| +CsWork| +DEsWork| +Roma| +Sóló cón tu párejâ| +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie| +|Alice +|Elizabeth +|Farooq +|Greg +|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff +|XX +|XX +|XX +-STATEMENT MATCH (a:person)-[e:knows|:studyAt]->(b:person) WHERE a.ID=0 SET e.year = 2023, e.date = date("2023-11-11") RETURN e.year, e.date; +---- 3 +|2023-11-11 +|2023-11-11 +|2023-11-11 +-STATEMENT MATCH (a:person)-[e:knows|:studyAt]->(b:person:organisation) WHERE a.ID=0 RETURN e.year, e.date; +---- 4 +2021| +|2023-11-11 +|2023-11-11 +|2023-11-11 + +-CASE SetNonNullValueWithWriteTransaction +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age +---- 1 +35 +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.age=70 +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age +---- 1 +70 + +-CASE SetNullValueWithWriteTransaction +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age +---- 1 +35 +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.age=NULL +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age +---- 1 + +-CASE MultipleSetListValue +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=10 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=5 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=2 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=3 SET a.usedNames=['abcndwjbwesdsd','microsofthbbjuwgedsd'] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (a:person) WHERE a.ID=10 RETURN a.usedNames +---- 1 +[abcndwjbwesdsd,microsofthbbjuwgedsd] +-STATEMENT MATCH (a:person) WHERE a.ID=5 RETURN a.usedNames +---- 1 +[abcndwjbwesdsd,microsofthbbjuwgedsd] + + +-CASE OptionalSET +-STATEMENT OPTIONAL MATCH (a:person) WHERE a.ID > 100 SET a.fName = 'a' RETURN a.fName; +---- 1 + +-STATEMENT MATCH (a:person) WHERE a.ID < 3 RETURN a.fName; +---- 2 +Alice +Bob +-STATEMENT OPTIONAL MATCH (a) WHERE a.ID > 100 SET a.name, a.fName; +----1 + +-STATEMENT MATCH (a) WHERE a.ID < 3 RETURN a.name, a.fName; +---- 3 +ABFsUni| +|Alice +|Bob diff --git a/test/test_files/update_rel/create_empty.test b/test/test_files/update_rel/create_empty.test index 0703d6d67e2..b8f1f9d31a1 100644 --- a/test/test_files/update_rel/create_empty.test +++ b/test/test_files/update_rel/create_empty.test @@ -182,6 +182,9 @@ ---- ok -STATEMENT MATCH (n1:N1), (n2:N2) WHERE n1.ID=10 AND n2.ID=12 CREATE (n1)-[r:Rel1]->(n2) ---- ok +-STATEMENT MATCH (n1:N1)-[r:Rel1]->(n2:N2) WHERE n1.ID=10 AND n2.ID=12 RETURN r +---- 1 +(0:0)-{_LABEL: Rel1, _ID: 0:0}->(1:0) -STATEMENT MATCH (n1:N1)-[r:Rel1]->(n2:N2) WHERE n1.ID=10 AND n2.ID=12 DELETE r ---- ok -STATEMENT MATCH (n:N1)-[r:Rel1]->(m:N2) RETURN n.ID, m.ID From 4a7b109d0ed50ca50419ca4071e7ceb1ae7c22e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Thu, 14 Mar 2024 22:10:13 +0800 Subject: [PATCH 038/136] Update Debian version in build workflows (#3056) --- .github/workflows/build-extensions.yml | 2 +- .github/workflows/ci-workflow.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-extensions.yml b/.github/workflows/build-extensions.yml index f8be4ed3de2..d612fdcaafc 100644 --- a/.github/workflows/build-extensions.yml +++ b/.github/workflows/build-extensions.yml @@ -74,7 +74,7 @@ jobs: docker run -d --name kuzu-x86 \ -v $PWD:/kuzu -w /kuzu \ -e NUM_THREADS=2 -e GEN=ninja -e CC=gcc -e CXX=g++ \ - i386/debian:latest tail -f /dev/null + i386/debian:stable tail -f /dev/null - name: Install dependencies run: | diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 6c6a6fff337..0d5ff02938e 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -99,7 +99,7 @@ jobs: docker run -d --name kuzu-x86 \ -v $PWD:/kuzu -w /kuzu \ -e NUM_THREADS=2 -e GEN=ninja -e CC=gcc -e CXX=g++ \ - i386/debian:latest tail -f /dev/null + i386/debian:stable tail -f /dev/null - name: Install dependencies run: | From a9454b38843fdce2b7587ebec70fc467523afe1e Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Mon, 4 Mar 2024 10:53:18 -0500 Subject: [PATCH 039/136] Implement duckdb scanner extension --- Makefile | 12 +- extension/CMakeLists.txt | 18 + extension/duckdb_scanner/CMakeLists.txt | 60 + extension/duckdb_scanner/src/duckdb_scan.cpp | 251 + .../src/duckdb_scanner_extension.cpp | 28 + .../duckdb_scanner/src/duckdb_storage.cpp | 31 + .../src/duckdb_type_converter.cpp | 134 + .../duckdb_scanner/src/include/duckdb_scan.h | 41 + .../src/include/duckdb_scanner_extension.h | 15 + .../src/include/duckdb_storage.h | 17 + .../src/include/duckdb_type_converter.h | 18 + .../test/duckdb_database/other.db | Bin 0 -> 536576 bytes .../test/duckdb_database/tinysnb.db | Bin 0 -> 13119488 bytes .../test/test_files/duckdb_scanner.test | 68 + extension/httpfs/CMakeLists.txt | 1 + extension/httpfs/test/CMakeLists.txt | 11 - scripts/antlr4/Cypher.g4.copy | 16 +- src/antlr4/Cypher.g4 | 16 +- src/binder/bind/CMakeLists.txt | 2 + src/binder/bind/bind_attach_database.cpp | 15 + src/binder/bind/bind_detach_database.cpp | 15 + src/binder/bind/bind_reading_clause.cpp | 37 +- src/binder/binder.cpp | 6 + src/binder/bound_statement_visitor.cpp | 6 + src/catalog/catalog.cpp | 5 +- src/catalog/catalog_content.cpp | 6 - src/common/CMakeLists.txt | 1 + src/common/case_insensitive_map.cpp | 18 + src/include/binder/binder.h | 4 + src/include/binder/bound_attach_database.h | 23 + src/include/binder/bound_detach_database.h | 22 + src/include/binder/bound_statement_visitor.h | 2 + .../binder/copy/bound_export_database.h | 2 +- .../binder/copy/bound_import_database.h | 2 +- src/include/catalog/catalog.h | 1 + src/include/catalog/catalog_content.h | 2 - src/include/common/case_insensitive_map.h | 10 +- src/include/common/enums/statement_type.h | 2 + src/include/common/string_utils.h | 2 +- src/include/common/types/types.h | 2 +- src/include/common/vector/auxiliary_buffer.h | 14 +- src/include/common/vector/value_vector.h | 45 +- src/include/function/table_functions.h | 16 +- src/include/main/attached_database.h | 26 + src/include/main/database.h | 20 + src/include/main/database_manager.h | 19 + src/include/parser/attach_database.h | 21 + src/include/parser/detach_database.h | 22 + src/include/parser/parsed_data/attach_info.h | 13 + src/include/parser/parsed_statement_visitor.h | 2 + src/include/parser/transformer.h | 4 + .../operator/logical_attach_database.h | 31 + .../operator/logical_detach_database.h | 29 + .../planner/operator/logical_operator.h | 2 + src/include/planner/planner.h | 4 +- .../processor/operator/attach_database.h | 29 + src/include/processor/operator/ddl/ddl.h | 4 +- .../processor/operator/detach_database.h | 28 + .../processor/operator/install_extension.h | 6 +- .../processor/operator/physical_operator.h | 2 + src/include/processor/plan_mapper.h | 2 + src/include/storage/storage_extension.h | 28 + src/main/CMakeLists.txt | 1 + src/main/database.cpp | 18 + src/main/database_manager.cpp | 36 + src/parser/parsed_statement_visitor.cpp | 6 + src/parser/transform/CMakeLists.txt | 4 +- .../transform/transform_attach_database.cpp | 20 + .../transform/transform_detach_database.cpp | 14 + src/parser/transformer.cpp | 4 + src/planner/plan/append_comment_on.cpp | 0 src/planner/plan/append_simple.cpp | 21 + src/planner/planner.cpp | 6 + src/processor/map/CMakeLists.txt | 2 + src/processor/map/map_attach_database.cpp | 19 + src/processor/map/map_detach_database.cpp | 19 + src/processor/map/plan_mapper.cpp | 6 + src/processor/operator/CMakeLists.txt | 2 + src/processor/operator/attach_database.cpp | 24 + src/processor/operator/detach_database.cpp | 16 + src/processor/operator/physical_operator.cpp | 4 + third_party/antlr4_cypher/cypher_lexer.cpp | 1282 ++-- third_party/antlr4_cypher/cypher_parser.cpp | 5498 +++++++++-------- .../antlr4_cypher/include/cypher_lexer.h | 41 +- .../antlr4_cypher/include/cypher_parser.h | 171 +- tools/python_api/src_cpp/py_connection.cpp | 1 - tools/python_api/test/test_scan_pandas.py | 4 +- tools/shell/test/test_shell_basics.py | 4 +- 88 files changed, 5055 insertions(+), 3457 deletions(-) create mode 100644 extension/duckdb_scanner/CMakeLists.txt create mode 100644 extension/duckdb_scanner/src/duckdb_scan.cpp create mode 100644 extension/duckdb_scanner/src/duckdb_scanner_extension.cpp create mode 100644 extension/duckdb_scanner/src/duckdb_storage.cpp create mode 100644 extension/duckdb_scanner/src/duckdb_type_converter.cpp create mode 100644 extension/duckdb_scanner/src/include/duckdb_scan.h create mode 100644 extension/duckdb_scanner/src/include/duckdb_scanner_extension.h create mode 100644 extension/duckdb_scanner/src/include/duckdb_storage.h create mode 100644 extension/duckdb_scanner/src/include/duckdb_type_converter.h create mode 100644 extension/duckdb_scanner/test/duckdb_database/other.db create mode 100644 extension/duckdb_scanner/test/duckdb_database/tinysnb.db create mode 100644 extension/duckdb_scanner/test/test_files/duckdb_scanner.test create mode 100644 src/binder/bind/bind_attach_database.cpp create mode 100644 src/binder/bind/bind_detach_database.cpp create mode 100644 src/common/case_insensitive_map.cpp create mode 100644 src/include/binder/bound_attach_database.h create mode 100644 src/include/binder/bound_detach_database.h create mode 100644 src/include/main/attached_database.h create mode 100644 src/include/main/database_manager.h create mode 100644 src/include/parser/attach_database.h create mode 100644 src/include/parser/detach_database.h create mode 100644 src/include/parser/parsed_data/attach_info.h create mode 100644 src/include/planner/operator/logical_attach_database.h create mode 100644 src/include/planner/operator/logical_detach_database.h create mode 100644 src/include/processor/operator/attach_database.h create mode 100644 src/include/processor/operator/detach_database.h create mode 100644 src/include/storage/storage_extension.h create mode 100644 src/main/database_manager.cpp create mode 100644 src/parser/transform/transform_attach_database.cpp create mode 100644 src/parser/transform/transform_detach_database.cpp delete mode 100644 src/planner/plan/append_comment_on.cpp create mode 100644 src/processor/map/map_attach_database.cpp create mode 100644 src/processor/map/map_detach_database.cpp create mode 100644 src/processor/operator/attach_database.cpp create mode 100644 src/processor/operator/detach_database.cpp diff --git a/Makefile b/Makefile index 3b541b55845..e00fbcb71f8 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ allconfig: $(call config-cmake-release, \ -DBUILD_BENCHMARK=TRUE \ -DBUILD_EXAMPLES=TRUE \ - -DBUILD_EXTENSIONS=httpfs \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ -DBUILD_JAVA=TRUE \ -DBUILD_NODEJS=TRUE \ -DBUILD_PYTHON=TRUE \ @@ -79,7 +79,7 @@ alldebug: $(call run-cmake-debug, \ -DBUILD_BENCHMARK=TRUE \ -DBUILD_EXAMPLES=TRUE \ - -DBUILD_EXTENSIONS=httpfs \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ -DBUILD_JAVA=TRUE \ -DBUILD_NODEJS=TRUE \ -DBUILD_PYTHON=TRUE \ @@ -156,21 +156,21 @@ example: extension-test: $(call run-cmake-release, \ - -DBUILD_EXTENSIONS=httpfs \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ -DBUILD_EXTENSION_TESTS=TRUE \ ) - ctest --test-dir build/release/extension/httpfs/test --output-on-failure -j ${TEST_JOBS} + ctest --test-dir build/release/extension --output-on-failure -j ${TEST_JOBS} aws s3 rm s3://kuzu-dataset-us/${RUN_ID}/ --recursive extension-debug: $(call run-cmake-debug, \ - -DBUILD_EXTENSIONS=httpfs \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ -DBUILD_KUZU=FALSE \ ) extension-release: $(call run-cmake-release, \ - -DBUILD_EXTENSIONS=httpfs \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ -DBUILD_KUZU=FALSE \ ) diff --git a/extension/CMakeLists.txt b/extension/CMakeLists.txt index 162294bf26b..8f499422e22 100644 --- a/extension/CMakeLists.txt +++ b/extension/CMakeLists.txt @@ -1,3 +1,21 @@ if("httpfs" IN_LIST BUILD_EXTENSIONS) add_subdirectory(httpfs) endif() + +if ("duckdb_scanner" IN_LIST BUILD_EXTENSIONS) + add_subdirectory(duckdb_scanner) +endif() + +if (${BUILD_EXTENSION_TESTS}) + add_definitions(-DTEST_FILES_DIR="extension") + add_subdirectory(${CMAKE_SOURCE_DIR}/test/gtest ${CMAKE_CURRENT_BINARY_DIR}/test/gtest EXCLUDE_FROM_ALL) + # Make gtest available to subdirectories. + add_library(GTest::GTest INTERFACE IMPORTED) + target_link_libraries(GTest::GTest INTERFACE gtest_main) + target_link_libraries(GTest::GTest INTERFACE gmock_main) + enable_testing() + add_subdirectory(${CMAKE_SOURCE_DIR}/test/test_helper ${CMAKE_CURRENT_BINARY_DIR}/test/test_helper) + add_subdirectory(${CMAKE_SOURCE_DIR}/test/test_runner ${CMAKE_CURRENT_BINARY_DIR}/test/test_runner) + add_subdirectory(${CMAKE_SOURCE_DIR}/test/graph_test ${CMAKE_CURRENT_BINARY_DIR}/test/graph_test) + add_subdirectory(${CMAKE_SOURCE_DIR}/test/runner ${CMAKE_CURRENT_BINARY_DIR}/test/runner) +endif() diff --git a/extension/duckdb_scanner/CMakeLists.txt b/extension/duckdb_scanner/CMakeLists.txt new file mode 100644 index 00000000000..7f33580c469 --- /dev/null +++ b/extension/duckdb_scanner/CMakeLists.txt @@ -0,0 +1,60 @@ +find_package(DuckDB REQUIRED) + +include_directories( + ${PROJECT_SOURCE_DIR}/src/include + src/include + ${DuckDB_INCLUDE_DIRS}) + +add_library(duckdb_scanner + SHARED + src/duckdb_scanner_extension.cpp + src/duckdb_storage.cpp + src/duckdb_scan.cpp + src/duckdb_type_converter.cpp) + +set_target_properties(duckdb_scanner PROPERTIES + OUTPUT_NAME duckdb_scanner + PREFIX "lib" + SUFFIX ".kuzu_extension" +) + +set_target_properties(duckdb_scanner + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" +) + +target_link_libraries(duckdb_scanner + PRIVATE + ${DuckDB_LIBRARIES}) + +set_target_properties(duckdb_scanner PROPERTIES + OUTPUT_NAME duckdb_scanner + PREFIX "lib" + SUFFIX ".kuzu_extension" +) + +if (WIN32) + # On windows, there is no dynamic lookup available, so it's not + # possible to generically look for symbols on library load. There are + # two main alternatives to statically linking kuzu, neither of which is + # appealing: + # 1. Link against the shared library. This works well assuming + # the DLL is locatable, but this assumption isn't valid for users + # of kuzu_shell.exe. + # 2. Link against the executable (kuzu_shell.exe). This is + # strange but works well for kuzu_shell.exe. However, it forces + # users who are embedding kuzu in their application to recompile + # the extension _and_ export the symbols for the extension to + # locate on load. + # We choose the simplest option. Windows isn't known + # for its small libraries anyways... + # Future work could make it possible to embed extension into kuzu, + # which would help fix this problem. + target_link_libraries(duckdb_scanner PRIVATE kuzu) +endif() + +if (APPLE) + set_target_properties(duckdb_scanner PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +endif () diff --git a/extension/duckdb_scanner/src/duckdb_scan.cpp b/extension/duckdb_scanner/src/duckdb_scan.cpp new file mode 100644 index 00000000000..b2225972f9a --- /dev/null +++ b/extension/duckdb_scanner/src/duckdb_scan.cpp @@ -0,0 +1,251 @@ +#include "duckdb_scan.h" + +#include "common/exception/binder.h" +#include "common/types/types.h" +#include "duckdb_type_converter.h" +#include "function/table/bind_input.h" + +using namespace kuzu::function; +using namespace kuzu::common; + +namespace kuzu { +namespace duckdb_scanner { + +void getDuckDBVectorConversionFunc( + PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func); + +DuckDBScanBindData::DuckDBScanBindData(std::string query, std::string dbPath, + std::vector columnTypes, std::vector columnNames) + : TableFuncBindData{std::move(columnTypes), std::move(columnNames)}, query{std::move(query)}, + dbPath{std::move(dbPath)} { + conversionFunctions.resize(this->columnTypes.size()); + for (auto i = 0u; i < this->columnTypes.size(); i++) { + getDuckDBVectorConversionFunc( + this->columnTypes[i].getPhysicalType(), conversionFunctions[i]); + } +} + +std::unique_ptr DuckDBScanBindData::copy() const { + return std::make_unique(query, dbPath, columnTypes, columnNames); +} + +DuckDBScanSharedState::DuckDBScanSharedState(std::unique_ptr queryResult) + : TableFuncSharedState(), queryResult{std::move(queryResult)} {} + +struct DuckDBScanFunction { + static constexpr char DUCKDB_SCAN_FUNC_NAME[] = "duckdb_scan"; + + static common::offset_t tableFunc( + function::TableFuncInput& input, function::TableFuncOutput& output); + + static std::unique_ptr bindFunc( + std::string dbPath, main::ClientContext* /*context*/, function::TableFuncBindInput* input); + + static std::unique_ptr initSharedState( + function::TableFunctionInitInput& input); + + static std::unique_ptr initLocalState( + function::TableFunctionInitInput& input, function::TableFuncSharedState* state, + storage::MemoryManager* + /*mm*/); +}; + +std::unique_ptr DuckDBScanFunction::initSharedState( + function::TableFunctionInitInput& input) { + auto scanBindData = reinterpret_cast(input.bindData); + auto db = duckdb::DuckDB(scanBindData->dbPath); + auto conn = duckdb::Connection(db); + auto result = conn.SendQuery(scanBindData->query); + return std::make_unique(std::move(result)); +} + +std::unique_ptr DuckDBScanFunction::initLocalState( + function::TableFunctionInitInput& /*input*/, function::TableFuncSharedState* /*state*/, + storage::MemoryManager* /*mm*/) { + return std::make_unique(); +} + +template +void convertDuckDBVectorToVector( + duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { + auto duckDBData = (T*)duckDBVector.GetData(); + auto validityMasks = duckdb::FlatVector::Validity(duckDBVector); + memcpy(result.getData(), duckDBData, numValuesToCopy * result.getNumBytesPerValue()); + for (auto i = 0u; i < numValuesToCopy; i++) { + result.setNull(i, !validityMasks.RowIsValid(i)); + } +} + +template<> +void convertDuckDBVectorToVector( + duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy); +template<> +void convertDuckDBVectorToVector( + duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy); + +template<> +void convertDuckDBVectorToVector( + duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { + auto strs = reinterpret_cast(duckDBVector.GetData()); + auto validityMasks = duckdb::FlatVector::Validity(duckDBVector); + for (auto i = 0u; i < numValuesToCopy; i++) { + result.setNull(i, !validityMasks.RowIsValid(i)); + if (!result.isNull(i)) { + result.setValue(i, strs[i].GetString()); + } + } +} + +void getDuckDBVectorConversionFunc( + PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func) { + switch (physicalTypeID) { + case PhysicalTypeID::BOOL: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::INT128: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::INT64: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::INT32: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::INT16: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::INT8: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::UINT64: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::UINT32: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::UINT16: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::UINT8: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::DOUBLE: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::FLOAT: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::STRING: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::INTERVAL: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::VAR_LIST: { + conversion_func = convertDuckDBVectorToVector; + } break; + case PhysicalTypeID::STRUCT: { + conversion_func = convertDuckDBVectorToVector; + } break; + default: + KU_UNREACHABLE; + } +} + +template<> +void convertDuckDBVectorToVector( + duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { + memcpy( + result.getData(), duckDBVector.GetData(), numValuesToCopy * result.getNumBytesPerValue()); + auto numValuesInDataVec = 0; + auto listEntries = reinterpret_cast(duckDBVector.GetData()); + auto validityMasks = duckdb::FlatVector::Validity(duckDBVector); + for (auto i = 0u; i < numValuesToCopy; i++) { + result.setNull(i, !validityMasks.RowIsValid(i)); + if (!result.isNull(i)) { + numValuesInDataVec += listEntries[i].length; + } + } + ListVector::resizeDataVector(&result, numValuesInDataVec); + auto dataVec = ListVector::getDataVector(&result); + duckdb_conversion_func_t conversion_func; + getDuckDBVectorConversionFunc(dataVec->dataType.getPhysicalType(), conversion_func); + conversion_func(duckdb::ListVector::GetEntry(duckDBVector), *dataVec, numValuesInDataVec); +} + +template<> +void convertDuckDBVectorToVector( + duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { + auto& duckdbChildrenVectors = duckdb::StructVector::GetEntries(duckDBVector); + for (auto i = 0u; i < duckdbChildrenVectors.size(); i++) { + duckdb_conversion_func_t conversionFunc; + auto& duckdbChildVector = duckdbChildrenVectors[i]; + auto fieldVector = StructVector::getFieldVector(&result, i); + getDuckDBVectorConversionFunc(fieldVector->dataType.getPhysicalType(), conversionFunc); + conversionFunc(*duckdbChildVector, *fieldVector, numValuesToCopy); + } +} + +static void convertDuckDBResultToVector(duckdb::DataChunk& duckDBResult, DataChunk& result, + std::vector conversionFuncs) { + for (auto i = 0u; i < conversionFuncs.size(); i++) { + result.state->selVector->selectedSize = duckDBResult.size(); + assert(duckDBResult.data[i].GetVectorType() == duckdb::VectorType::FLAT_VECTOR); + conversionFuncs[i]( + duckDBResult.data[i], *result.getValueVector(i), result.state->selVector->selectedSize); + } +} + +common::offset_t DuckDBScanFunction::tableFunc( + function::TableFuncInput& input, function::TableFuncOutput& output) { + auto duckdbScanSharedState = reinterpret_cast(input.sharedState); + auto duckdbScanBindData = reinterpret_cast(input.bindData); + std::unique_ptr result; + try { + result = duckdbScanSharedState->queryResult->Fetch(); + } catch (std::exception& e) { return 0; } + if (result == nullptr) { + return 0; + } + convertDuckDBResultToVector(*result, output.dataChunk, duckdbScanBindData->conversionFunctions); + return output.dataChunk.state->selVector->selectedSize; +} + +std::unique_ptr DuckDBScanFunction::bindFunc(std::string dbPath, + main::ClientContext* /*clientContext*/, function::TableFuncBindInput* input) { + auto tableName = input->inputs[0].getValue(); + duckdb::DBConfig dbConfig{true /* read_only */}; + duckdb::DuckDB db(dbPath, &dbConfig); + duckdb::Connection conn(db); + auto result = conn.Query( + common::stringFormat("select data_type,column_name from information_schema.columns where " + "table_name = '{}' and table_schema='main';", + tableName)); + if (result->RowCount() == 0) { + throw common::BinderException( + common::stringFormat("No table named: {} in database.", tableName)); + } + std::vector columnTypes; + std::vector columnNames; + columnTypes.reserve(result->RowCount()); + columnNames.reserve(result->RowCount()); + for (auto i = 0u; i < result->RowCount(); i++) { + columnTypes.push_back( + DuckDBTypeConverter::convertDuckDBType(result->GetValue(0, i).GetValue())); + columnNames.push_back(result->GetValue(1, i).GetValue()); + } + auto query = common::stringFormat("SELECT * FROM {}", tableName); + return std::make_unique( + query, dbPath, std::move(columnTypes), std::move(columnNames)); +} + +TableFunction getScanFunction(std::string dbPath) { + return TableFunction(DuckDBScanFunction::DUCKDB_SCAN_FUNC_NAME, DuckDBScanFunction::tableFunc, + std::bind( + DuckDBScanFunction::bindFunc, dbPath, std::placeholders::_1, std::placeholders::_2), + DuckDBScanFunction::initSharedState, DuckDBScanFunction::initLocalState, + std::vector{LogicalTypeID::STRING}); +} + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/duckdb_scanner_extension.cpp b/extension/duckdb_scanner/src/duckdb_scanner_extension.cpp new file mode 100644 index 00000000000..a215592aae6 --- /dev/null +++ b/extension/duckdb_scanner/src/duckdb_scanner_extension.cpp @@ -0,0 +1,28 @@ +#include "duckdb_scanner_extension.h" + +#include "duckdb_scan.h" +#include "duckdb_storage.h" + +namespace kuzu { +namespace duckdb_scanner { + +void DuckDBScannerExtension::load(main::ClientContext* context) { + auto db = context->getDatabase(); + db->registerStorageExtension("duckdb", std::make_unique()); +} + +} // namespace duckdb_scanner +} // namespace kuzu + +extern "C" { +// Because we link against the static library on windows, we implicitly inherit KUZU_STATIC_DEFINE, +// which cancels out any exporting, so we can't use KUZU_API. +#if defined(_WIN32) +#define INIT_EXPORT __declspec(dllexport) +#else +#define INIT_EXPORT __attribute__((visibility("default"))) +#endif +INIT_EXPORT void init(kuzu::main::ClientContext* context) { + kuzu::duckdb_scanner::DuckDBScannerExtension::load(context); +} +} diff --git a/extension/duckdb_scanner/src/duckdb_storage.cpp b/extension/duckdb_scanner/src/duckdb_storage.cpp new file mode 100644 index 00000000000..b0f130d38a4 --- /dev/null +++ b/extension/duckdb_scanner/src/duckdb_storage.cpp @@ -0,0 +1,31 @@ +#include "duckdb_storage.h" + +#include "duckdb_scan.h" + +namespace kuzu { +namespace duckdb_scanner { + +std::unique_ptr attachDuckDB(std::string dbName, std::string dbPath) { + if (dbName == "") { + if (dbPath.find('.') != std::string::npos) { + auto fileNamePos = dbPath.find_last_of('/') + 1; + dbName = dbPath.substr(fileNamePos, dbPath.find_last_of('.') - fileNamePos); + } else { + dbName = dbPath; + } + } + return std::make_unique(dbName, getScanFunction(dbPath)); +} + +DuckDBStorageExtension::DuckDBStorageExtension() : StorageExtension{attachDuckDB} {} + +bool DuckDBStorageExtension::canHandleDB(std::string dbType) const { + common::StringUtils::toUpper(dbType); + if (dbType == "DUCKDB") { + return true; + } + return false; +} + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/duckdb_type_converter.cpp b/extension/duckdb_scanner/src/duckdb_type_converter.cpp new file mode 100644 index 00000000000..2eca69582b1 --- /dev/null +++ b/extension/duckdb_scanner/src/duckdb_type_converter.cpp @@ -0,0 +1,134 @@ +#include "duckdb_type_converter.h" + +#include "common/exception/binder.h" +#include "common/string_utils.h" + +namespace kuzu { +namespace duckdb_scanner { + +using namespace kuzu::common; + +common::LogicalType DuckDBTypeConverter::convertDuckDBType(std::string typeStr) { + typeStr = common::StringUtils::ltrim(typeStr); + typeStr = common::StringUtils::rtrim(typeStr); + if (typeStr == "BIGINT" || typeStr == "INT8" || typeStr == "LONG") { + return LogicalType{LogicalTypeID::INT64}; + } else if (typeStr == "BLOB" || typeStr == "BYTEA" || typeStr == "BINARY" || + typeStr == "VARBINARY") { + return LogicalType{LogicalTypeID::BLOB}; + } else if (typeStr == "BOOLEAN" || typeStr == "BOOL" || typeStr == "LOGICAL") { + return LogicalType{LogicalTypeID::BOOL}; + } else if (typeStr == "DATE") { + return LogicalType{LogicalTypeID::DATE}; + } else if (typeStr == "DOUBLE" || typeStr == "FLOAT8") { + return LogicalType{LogicalTypeID::DOUBLE}; + } else if (typeStr == "HUGEINT") { + return LogicalType{LogicalTypeID::INT128}; + } else if (typeStr == "INTEGER" || typeStr == "INT4" || typeStr == "INT" || + typeStr == "SIGNED") { + return LogicalType{LogicalTypeID::INT32}; + } else if (typeStr == "INTERVAL") { + return LogicalType{LogicalTypeID::INTERVAL}; + } else if (typeStr == "REAL" || typeStr == "FLOAT" || typeStr == "FLOAT4") { + return LogicalType{LogicalTypeID::FLOAT}; + } else if (typeStr == "SMALLINT" || typeStr == "INT2" || typeStr == "SHORT") { + return LogicalType{LogicalTypeID::INT16}; + } else if (typeStr == "TIMESTAMP" || typeStr == "DATETIME") { + return LogicalType{LogicalTypeID::TIMESTAMP}; + } else if (typeStr == "TIMESTAMP_NS") { + return LogicalType{LogicalTypeID::TIMESTAMP_NS}; + } else if (typeStr == "TIMESTAMP_MS") { + return LogicalType{LogicalTypeID::TIMESTAMP_MS}; + } else if (typeStr == "TIMESTAMP_S") { + return LogicalType{LogicalTypeID::TIMESTAMP_SEC}; + } else if (typeStr == "TIMESTAMP WITH TIME ZONE" || typeStr == "TIMESTAMPTZ") { + return LogicalType{LogicalTypeID::TIMESTAMP_TZ}; + } else if (typeStr == "TINYINT" || typeStr == "INT1") { + return LogicalType{LogicalTypeID::INT8}; + } else if (typeStr == "UBIGINT") { + return LogicalType{LogicalTypeID::UINT64}; + } else if (typeStr == "UINTEGER") { + return LogicalType{LogicalTypeID::UINT32}; + } else if (typeStr == "USMALLINT") { + return LogicalType{LogicalTypeID::UINT16}; + } else if (typeStr == "UTINYINT") { + return LogicalType{LogicalTypeID::UINT8}; + } else if (typeStr == "UUID") { + return LogicalType{LogicalTypeID::UUID}; + } else if (typeStr == "VARCHAR" || typeStr == "CHAR" || typeStr == "BPCHAR" || + typeStr == "TEXT" || typeStr == "STRING") { + return LogicalType{LogicalTypeID::STRING}; + } else if (typeStr.ends_with("[]")) { + auto innerType = convertDuckDBType(typeStr.substr(0, typeStr.size() - 2)); + return *LogicalType::VAR_LIST(innerType.copy()); + } else if (typeStr.starts_with("STRUCT")) { + return *LogicalType::STRUCT(parseStructTypeInfo(typeStr)); + } else if (typeStr.starts_with("UNION")) { + auto unionFields = parseStructTypeInfo(typeStr); + auto unionTagField = StructField( + UnionType::TAG_FIELD_NAME, std::make_unique(UnionType::TAG_FIELD_TYPE)); + unionFields.insert(unionFields.begin(), std::move(unionTagField)); + return *LogicalType::UNION(std::move(unionFields)); + } else if (typeStr.starts_with("MAP")) { + auto leftBracketPos = typeStr.find('('); + auto rightBracketPos = typeStr.find_last_of(')'); + auto mapTypeStr = typeStr.substr(leftBracketPos + 1, rightBracketPos - leftBracketPos - 1); + auto keyValueTypes = StringUtils::splitComma(mapTypeStr); + return *LogicalType::MAP( + convertDuckDBType(keyValueTypes[0]), convertDuckDBType(keyValueTypes[1])); + } + throw BinderException{stringFormat("Unsupported duckdb type: {}.", typeStr)}; +} + +std::vector DuckDBTypeConverter::parseStructFields(const std::string& structTypeStr) { + std::vector structFieldsStr; + auto startPos = 0u; + auto curPos = 0u; + auto numOpenBrackets = 0u; + while (curPos < structTypeStr.length()) { + switch (structTypeStr[curPos]) { + case '(': { + numOpenBrackets++; + } break; + case ')': { + numOpenBrackets--; + } break; + case ',': { + if (numOpenBrackets == 0) { + structFieldsStr.push_back( + StringUtils::ltrim(structTypeStr.substr(startPos, curPos - startPos))); + startPos = curPos + 1; + } + } break; + default: { + // Normal character, continue. + } + } + curPos++; + } + structFieldsStr.push_back( + StringUtils::ltrim(structTypeStr.substr(startPos, curPos - startPos))); + return structFieldsStr; +} + +std::vector DuckDBTypeConverter::parseStructTypeInfo( + const std::string& structTypeStr) { + auto leftBracketPos = structTypeStr.find('('); + auto rightBracketPos = structTypeStr.find_last_of(')'); + // Remove the leading and trailing brackets. + auto structFieldsStr = + structTypeStr.substr(leftBracketPos + 1, rightBracketPos - leftBracketPos - 1); + std::vector structFields; + auto structFieldStrs = parseStructFields(structFieldsStr); + for (auto& structFieldStr : structFieldStrs) { + auto pos = structFieldStr.find(' '); + auto fieldName = structFieldStr.substr(0, pos); + auto fieldTypeString = structFieldStr.substr(pos + 1); + structFields.emplace_back(fieldName, + std::make_unique(DuckDBTypeConverter::convertDuckDBType(fieldTypeString))); + } + return structFields; +} + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_scan.h b/extension/duckdb_scanner/src/include/duckdb_scan.h new file mode 100644 index 00000000000..94a3eed4374 --- /dev/null +++ b/extension/duckdb_scanner/src/include/duckdb_scan.h @@ -0,0 +1,41 @@ +#pragma once + +#include "common/vector/value_vector.h" +#include "function/scalar_function.h" +#include "function/table/bind_data.h" +#include "function/table_functions.h" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +// Supress warnings from duckdb.hpp +#undef ARROW_FLAG_DICTIONARY_ORDERED +#include "duckdb.hpp" +#pragma GCC diagnostic pop + +namespace kuzu { +namespace duckdb_scanner { + +using duckdb_conversion_func_t = std::function; + +struct DuckDBScanBindData : public function::TableFuncBindData { + explicit DuckDBScanBindData(std::string query, std::string dbPath, + std::vector columnTypes, std::vector columnNames); + + std::unique_ptr copy() const override; + + std::string query; + std::string dbPath; + std::vector conversionFunctions; +}; + +struct DuckDBScanSharedState : public function::TableFuncSharedState { + explicit DuckDBScanSharedState(std::unique_ptr queryResult); + + std::unique_ptr queryResult; +}; + +function::TableFunction getScanFunction(std::string dbPath); + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h b/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h new file mode 100644 index 00000000000..cd34256028e --- /dev/null +++ b/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h @@ -0,0 +1,15 @@ +#pragma once + +#include "extension/extension.h" +#include "main/database.h" + +namespace kuzu { +namespace duckdb_scanner { + +class DuckDBScannerExtension : public extension::Extension { +public: + static void load(main::ClientContext* context); +}; + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_storage.h b/extension/duckdb_scanner/src/include/duckdb_storage.h new file mode 100644 index 00000000000..1d19662beba --- /dev/null +++ b/extension/duckdb_scanner/src/include/duckdb_storage.h @@ -0,0 +1,17 @@ +#pragma once + +#include "common/string_utils.h" +#include "storage/storage_extension.h" + +namespace kuzu { +namespace duckdb_scanner { + +class DuckDBStorageExtension : public storage::StorageExtension { +public: + DuckDBStorageExtension(); + + bool canHandleDB(std::string dbType) const override; +}; + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_type_converter.h b/extension/duckdb_scanner/src/include/duckdb_type_converter.h new file mode 100644 index 00000000000..5c4de9e9925 --- /dev/null +++ b/extension/duckdb_scanner/src/include/duckdb_type_converter.h @@ -0,0 +1,18 @@ +#pragma once + +#include "common/types/types.h" + +namespace kuzu { +namespace duckdb_scanner { + +class DuckDBTypeConverter { +public: + static common::LogicalType convertDuckDBType(std::string typeStr); + +private: + static std::vector parseStructFields(const std::string& structTypeStr); + static std::vector parseStructTypeInfo(const std::string& structTypeStr); +}; + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/test/duckdb_database/other.db b/extension/duckdb_scanner/test/duckdb_database/other.db new file mode 100644 index 0000000000000000000000000000000000000000..7cbc6ecccf93cbe990dabc40fa73580af81f0ba3 GIT binary patch literal 536576 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAVA>% zXo2vU@NJ=Azx&d!!TMQ-Jukoio=1+axpZZpR z>O20a@A0R;&!74sf9gm7sZah>KkZNb+&}e8|J1MkQ@{C7{mwu22maI_{h#}3!9i(8 z2ht~yj)BAlQX`O3f#eS)Lm)o|1*Lfq$n`+Z1`=2@P2jX?mIg8{kkNtk38Z5nae>qb zq*NgJ1IZA`<1>E0{rB_!@tFR}N`)0Z&CkB={kTU=I^fd~NywG&>*|e7q z%_>!{&YeY7gNnS>zi0I<4Tpw&`sP<1Ba^Fybsyb3xl!xlCvtX)8qlWQ{NttaOxlor z#^mYeZ}k14?WnAA;Wyr^8h`jkv)KJDg8P@NH|gUl!}@RhWKj6=*wr(OUmx*n)|D5V zH@qGhwc=Ep)OxiCEPkutj(R7PdlhV5^iu2CtgW^bYxK+a+iQN^@P4VZ2cy@VPZLzU zUfpB6daQV+U4a?1d#=n-D7N6v4JV?Wf8#;+pL)b}x-@4`%A*m57r%C~a-CJ>)`frm zsM*bpt+$t-lJU70+7(OMzV}A4Mg_y_O>1&CWcJzp>-y|!QZ8&?y>5#e56d{JboNH+ zOV3N(JEQove0^r_SUlrgMBc{F^m{pc?x*z=YgT`MSMY#7nX4v$^5%pr-JS~me95mx z8~wHJ&~%?w>C>;yywHW?8qUfvxJH4<8gnn*{Ni+;wRO_8|8{St1t}RqB8CiKHluRr zw+t9o9GadhM+Jua-IgNv)zkREX@>dwQKWR!K!Rr7kW%)aAKbrKW5-R=oN9t$XYaE_ptG(>8zI6&)59{7%SI^IE1~G^N1idHufs zEb|K)}=%Dq-@<>a6{`5QkoVCc^;#b&Jj za_`HfFXyd!>S+HO2S-i%a`>L$F=toK3kpuGvnwQby|y>MjL2Oyx_`>Cy)8R#Ov(Oc ziR#@F#_ZiYrQ5sBs?KWA`Cyiy(YwCcTW!VFPacIF*|PA*G&^5@W6_P*i{451>b%}1 z);xGMXXCP|XCwA6J=T0p6*zRsGt#l$U}2L}JTecrPfXOwI| zuIt8x6?wYOpD<+ispNN$6|Q}%W4e6Bql$$Wn_K0>?w!LXKK;{<5)0}~NnP81Ncq@p zeM|J{wxP(ZswabgI68M{`HpHT~kWX8Y1s z`CHT7;irDtnBz*hnq68xx9`JJi-P|i9&>#A-BUNl?)WgFY4H4*dX@iCGEeE9_0wEG zm#Jd6r-z=;^VNjZ(n*yzOwO5_FQH7v(Mf+T**fp8X1hB-wKb*v^}8816sR&Kvc~w> z_qW~bRH99f)opThzqa(vE)}vj8aHou&kdKG+&@{f(9|J)2E7*i<pwsH+quT|~1_WecuQhq9)VOGTFW%`}pzBS_0re_Q9nK12oy}d(f z&L|c(U}0i%`7au7P5V^J?jJ zZ$}q=JGgj{A;tFZ*!vTB+H{>opg4s5WcB)-HX=&wc0nl=p{*mw4^H7h0zash7UN-5d*c zWNcOJ`xQYQZm0XUHbH>pieynKAfyOXvSDmN?R-K9h8&ffat;hB{}_q}y; z-L~kM2CcGP%#pZcS@F2YtR-`&?LK$S*_taCo!#?ZWToRPR`}2*pR;15tr3 z`D2e{e=R0WLdLf5?(dP(YT}H+yKC3|s>EBH7WTOxTdr&KODAd{AAP3f#SQNcZSvH) ztTVTa$vbWFoaQx4gx9FFsX)zxU0bGGpF7>M*&BAmRoT+%?-38mB^(>ou}0;_4;FPT zneW3%BbPR>p1oLud!3t%n$_jAg|V&rW*xFGX=tUi&qv)G6L;~ATj`Iszf*2X&sCEW z+r}O}ezwKBqc#8fmnXsql);ZcJGCbcO9#!seC=SsT=ER)syU zUE94h@U7aZckG$`KMW{Z_U-5nC+AmLKRhxfE}>H4EvLRLaC~N`inT{Zz1-wtqb|js zski88I5nWjhbQ7f63=da zHRiMMQ|(?Zn0NT$EeXqlqKB5tkm+cbe|!=GtKbYn=aPcEjXPiY2CmikBHz8%^;BEzOuYc`iodUoRE>Q&dquFiSz@V$whPu9!-@uBb*>1W-0`sSS( zv42T8IHFV1wb01jJ^EES9y|Eyf=N-e@0DLYdSJ=sIZxh>8{4F3!<4F#C(Go`)+zh) z95GpTv`r6rf>w_O`+?%c1XJtNYRPI{(m_;onZ&=xXZHMSwd=z# zG>`mCwGT@rubtoT#P-J3?u_f&X~EH`0;_k|tT4QF_HlEr#lAYRb-Ma9-raiPWIt*!M#|imP!V%g8iuy?No=!__*KYJBn7 zzcMaQKPT;v3yKt2I%WQp@7M0kxaq4N1*4xnk+;dy-Gt5ePPe230cy% z9s24|?F&!2a(~E%@~ejJiF+Z#;;rjz7AoDSZr3J7I_|kNxmtFDC4OMd*ea`Dk;pUd%dqgGF4DEsu@goHsk3U)f%cgU8o zdauU)+NR){I~#t8thRCW*V}(ityJXJ2VYj|m8JZ%@8rrmYHYdvy)r-gp!3n{@Adt$ zcJ6@%o0eKyE>D&-=iY7mWryW&RLE6rR?6xHrE1pie{6Q<4<^)am^Z#st~`ljBc`=` z5ZrZJhAM0F<^7~uxgrJAZ~n)vfz4YknP2_mQ6*xx4E-^DP}+u5cf>V%sc5SSxkl_s zY<}{>(019EN94L*HO=Vk*^5toD{=k!LraIG&-7Wps2yKaj+wZ)d(`&*!52FIW%iV| z*KXFW^Fi)eH+rTHtoCu97u!sTyjgPo>bSa1>-X(5CQHo&S-KRjvpAt!&&CV?@vu{$ zieIEGKHub(3hTGV6*^q(+L}!9%jO=-_EFi)+l#!>blZY7H;1k*8`LCwxs3HrO?u~_ zN6V#~fAQ+(qxW*x8B*@R(j1Fk&y~Alr}2wF2;P>r^29Si7n)W+xWC+$*IvuJ`Qp+| zg~A$TjGcJmddW|ADrGCmCbv)C(#;u|&bxL?x<@?!VUmK9Q*f%e| zlKHKxITi#J+p@7kWQ$hAv)tJfk)hV#Qa66R>${*8o7e6P`97>ejV+Vb)z7)_(C3?z zGS6I?z4Dlp7L`iuO<#WbvRV_vVjevGbNNxbl4Ez@iri9mS(C1b6Nc71JuNy}@dV!mLIor+m<=afN={>bHyB7xQz= zx({;~%yA+mcurj0%T25G>eOz_o1Mqq{q)MFFCyDd9-1}im%eKwicHv5cm1%XcRQqC z(_;5Wk>$I7x4+e)zWaKd+S+c);tMnKFR!)vR-YXA<2%RBP2TiUeBF#Unx~A*KJE65 z9=US12rn|>)Y100M}=+ttkv?&HB;^;_WSro%j&_Qqt1mknX@#hZ>g{vrQdI~Wc0Wu zO{RxVEqJ6*x8USVY&<{TH>sOyuBjN&rAF)P89E#bnGtrS|(1{5fg zZ$V7%43lD4M8#Ym8g@0u>qYNQZ(O5X^0e<_CcklZ)QZF@;X(QGjP2QcL*sT!bG^Jd zwd3Lmw;Lvuo*6RXrvaU2w2RL)vD@9fuMdganX72Fk8f4#-TcELyJwb+-!Nu*?!ph& z9GN{jxIpx@;%_&-nYGQlhzE1;q<@&<=*2hEZI7N5(xFk>+dmfF*|J&w=Ynq^Y~T6J zmgL~3QAPJ{+`g@Cqu~>$MZbA-*~WL$-dMY`c=U?T`$Qa_Qf_sDmt;UeVreF6CPuyFkNrkgX4Rb!fICK5jbq$t0n|@=-x;1lLDBt?b>egre z{CoKB(f+N{EeO7Rdg{$Sv$Ge?{Ge_K-R%b7tf zpKWsLpFz*8*}rOQt%!5uCg*BLXY~5@3 zCz(&q3?HTa}cY3rBwW#D0K>!xC%N&Oc>;=X)D7*3H_qK%WBndrbejY^4%Mn>WAu{D|Q88QSOl_2aPE9k)(h zxtMyk%f|V&K99{^xxmlsj()zi{rcUFb|&q(Tz*5XPTihuyzT23#~v6zd%>M|Pqhds zc6E5qvGE65g$4K7e02BZ8BL2{c(gJ1ik`j4Mpj(7;jM&%WuxLJ^~#lHbk+jzw0L@A z)Ar}@ejN73?3(j>Wox%Jet*tM)f&%k*MHuvgwENc&YbFBBTv%wUSX>qR$5%5YIxxd zmr`o3K6JBr{Q9jYt0wLb&Rt`3rlHdh&x%<2R%BxAm?;(GzixKq(1`IBcO*6a>{d|R zd)Yo|m~e3GjJp}{k66<>xY62OA0+4d{BFYok@M4Dcxw159clP-94AbW3 z>vpAQ)9*H9uedR4+KUrrytZj-*?rRwtZW+d?VG=DPZyfwPEfXnl@^USSEKlVG$Dy& zat=NIZoNU_vtkP0?N;UWVXIIvBD|rfs=8t``*xaaWo!egfwR7|2*@^eJ)~wQ_ z^lM>VmmPT{{FD1juZ85Fnmzxu7IS8#Kez70!6RqWd{QZX=>C@?IXaw7cQ8}R zwmZ!m#WntRSf-voEnQwQwCchgLG6==@B3%o=wr{%YM5@v@>Qj7U${LoA~LecrJ!Cx zX|^{l`a|=z)q1wCp60vJZ+H3j@`Q)&cJvKBnVLN%eCX2XkX$9EWl6lXW^1Wz-3Nv) zE7Gr6gZkAz&ssQr(dKz-4O}w+X8&P(Bg;fpp4c<<%Fc6VN4*#w9-J+yZ{8LS3T|$4 zIe6CT%6XfXzS4SF$x^$ATwPS-VEFs@mlXbV$gyvxj7ys`qi&%QRgPTS{K4)14eO<@ zD)8ZwyG`CW)UHw6*IOmU?3k4);Z(Z%&ARV9|5mm9IcB{*ck|0@XI^-_f4VU<-za)5 zGBt0ph>eMF{A|`Dr;jD=4_`5M zbk$6!lG{!$-?i=8$mAcM32ikf?8C4!T{ES7VeP*T#Xeu|{m+sP#}@c1q25aaQ?5J; zSyOA?iMgZF_APL(J!a_cIubO@<4ZrocvzPZ?^d*`#4TD+Nm?Zjh^M*Wh#amPv@r2IUx#*RGc zo8SGVQ06mRS}!c0a=h)_No$5JPI>;z&)?6pA#1aI4YDuJ|8(O%Jx@hkOFJd@lf^yf zW?cB`v|pEJ9CoW>gOQojz1-mL$u>m?N4=NryG4bc$-k#Sp41$f|N8gdi?7y5H>}mR ze0_KPFd$Ek%<+YLbt*YMspg8YWAklYeC1*1h1riaJ(H>CkoBG3zLGe1dh53zgb$r{ zF!-Yr#oM=E)ArMQU5?+|yLx(t>S2FBe!gS2g9}p6mdU#I)16&Ug!kz9ONM&YXMWKB z<2U=&%yYEf#IfC`mMXGsTl?z8TbvoN;o(ouyjAFn`yn|Bhon}n|F7JsTOWOwr*qB5 zM_NTx8MeFgvfLF49hr6P?RVqn)xFW@^!eid{HE@Xd*Nm8uPc1|UP|wL?=Ne#^ZEWi zZ8_WWM!`&dDwU}J{GFiB3O}_u;bz|s!$uYEGHG=3cYV&RUbw$)?jza%{CimcqwlJ& zKHst86{X)C+-x76i(7-$y z_k7#%?w~~-AJzXLIIeR4r>~8xoTlRThqd3|(O}NfN)ZF&wV$bU1XI~#}jua z58OK`zSEAX^QVNJdw+M!eV6X%?DHVUvTUbvPcHs(+PL+@2EVv4~=?nz?!aU=B}*Ns$G#h41fbYD25Ocp~j{KUJIZYT2-q zro}hcDm-vjMCeC{((lS}p>?|UulIbfZPiDai_V_-&7+HP>$iN|^WE5;ciL>*IQe!+ z$bgGIyR@m${M`#Nc{f#fr}3Tj^NLLOJKLQ-@=~#u2`Oz7(vCR1`t=iQ&c50? zXh_q~JFVHav~SLqX`ed1IlA=75^EQ}U3Ns&=lLh+t6V+qLDka>O5WHU+Zzc%ju=(}U%lWJzobD@32q43YMjrrGCWzyGA*t~hjOIuFgD^`4N?ugj? z-@G+`d*?SR-P+J5u5s2&Tl;tGa-#IvvFm!~FWv3A4J(pEXSI*NSE$DNY{!cJ^3sTI z73U18J~zXv;;Y)e`2C_I*B^ZLI5iVw21>6$!o+42QbZw1d-wIJi2 z(vL#^9{ELqq?6&b!-hAAPdEP9wQ^DWTI@fTT;W!;)UrE@-9MTzrPS@C! zG?hzlS-dnXsr3ifGahbHdDGhYhw~-%9k9B2!3CKoRNv4reZEy8pY_a;H~+#HBCo$1 zSFz=$q)Fw{h83MPa!>gsQ$NqO>*JJW38&KJtkAOQbH#(g#-~hrW@mhxI+>qtU8HUA zX{lwaFWj5`;>PjO>2h5jJMF18gBl)PKV|ENJTX19cNtOpFALJH3Qle~W%{L#9hyJ$ zanjVKL&s;oIy?8MbOUccA9u0bkb-&g4~fZLZ|3R>UrzjXZEDGkA3xouPLA2-V$U89 z+Fvu@<+QWnk}Ku!@p;j0jTWU|&9ornf+^FcjE$OEw8zQS@3rdQ;hmYyHguVulrA*+ z^&8`wl=>+1=I=XYD|+XX4pqWaZe=a`&6_RHWhxa`FJ)l1zs*_wW6sq*-_N#r&r3V< z78~|y9jS^2*nx_^1yqtNypnoe1~rDmBHX}_pkCT+1I-Ddpr#f@VdrtP>WXT_N1nGV(p z9p3ttw}WQ32wPKZ*Y~g2E3x8e@lU^*)icYI)T2$JW)=M4FF~KI?6ziGn)FHaYQ!CS z*kV!p`;}{DT~a@#`;IQyb&7HD+m>Z+l|)-G<>>t5lO7beyyIk8ss+)2m7lJ>^EdNscGgZqQt zh?v;ylR?{#wOaDtoo;`tP_V_*J6gWgSov4B zKYgIhs;qzMFkoHO$*z$@FOI%hDt5)&x$DI3e!lhBr@k*gu4RSK4-XHkJuzeMwd*U? zIX*FL*PaF|-dL0A-u(ilPh}eOk7`BoA1pJd=e%zV1r=>^scO|(x%v;wv8wrmY0KKL zJsdWFRi#ore!V>ZZqMg3_x+{$^Z{!V+b3Z<-MNcz%xfnmx`Ld@<_*v>6Rr;T=U@au`)wz7QPYp=CZ4AEdFZl?aAxA z?>Tp%(dstqyRLuwdX%l_ zHyhONzB26k!K&5THy9YbYD$ixgSQ^r^5y7?&$WBEP}SzAhip!o@WzpvVU2%UIp)>N zuWd-vX+;0vRq1XW{ruJ9_cJ#Sxp8*Mj=ZVGt2QVyw9l6tet723zlR4eob1;oC8}+X z*3W-4vUgbX*pk;;j*Yq*KWSA;ySS$LTWw98z9QeW=d<)ZRqkQ^QKu$ss5kHX8vlMN zvck;MB^O)|x!YuTYUf%Jxl-HwGiGx056d;lbvQ9!K$dambK{i>kd?{Ih&{ ztG0jf#Qc&|yZ$_O<+Sr%vUmMUzK~garVs4fY5wUiw(qT4FzVQ_u`vTLaQ zA1t%RNWVmYKWk%QL4YAKbLC zQDk^@yXW7m)Ti`}38B{`8>A^5^wz4S-;Y~cp=ytJE*)=JddJq8X}TQApXb6qdVM!+ zMd-GR{mUlRtNd#5KGPSc+{qPMI%8y9w-3&qiP;~TyW+tgGxT0jWNov?lTuE$s<>>( z&)s&vSE%ueM@F{I{wQaU>!a5#-_W$_&l6^b4Vrs=K=YXW&G+9u+q%NGjx&Dv*Ox=y z+19pH^9*%A%#&tx`8q>mH`fT8*kF3rSC^K%);|A-=j)}5=>0~wWpU{`?izAv@ww5z zbX+w*=T8TV=ZtKYr`X<%FK#}&^udf}S<2sd`1!SRZ|rS(W=+!QoIz0?gYVVJJE8E` zdpCtudumeJh4~I8B}~3>pks}ZiB)sQ7F?bDbm=1V@`XKDt3%SHyWfVlzH_18ik;KO zoe%4OduDKv^GSO`dVRA#BsJ~)-4&iHnW6H~BNNIeY_HHY=$|hK#aAhKETYboSMsgM zT&vZgK6CdUua|4;*-53xOlaC-V(8|~#ZsqkU%X}Rgdv9$dgM6Vu<&~s`<&Swl3L)+ zN8zbip4(Y=*s0E6)+&(WOyc>Nid~_9GMVvAgICU8?!rAZhNN6{??N}8hrOsw;_WMlzS~M zbasnlixy@&yk*+k&F<_ub@2GYrB`-02(GZSe^SPoV_v)5e^N}D4SP#WXgs&ZfQmV< zu3K_rONN*G`ZZr!t>wl16@zLGY*IAc%&KeZwORi5mC+Xp)t%CE`pg@J zGlYIMWb&30(VdQM|7A$ruB*8gmDmw6s79yf7CflaW8bl&Q5g%Q#5S8SH+A0ri&-?o4h}uK`Uh4GZiN%h-wP^H(rn7c;IhCPP-wH*`4JiG|*hje+L`OvL z=$jOj?PB^%Uv^)6YUh@d-Ln-q`szPpDz`YlbxYm?Y0e#acsX=?j=;Y!%k8T4VY^uw zTUP3PGi3RRX4f(-Y*cyRy8A7PjW1SeOuq$%ClxwTJT!HE%kxt&4U6nE@JPms88SAh ze05%$lBc6O1iiC=#kNx8UjArm{+q#1UAfmN{fH6g+Q-K(YTjw<(b+}AZx`Fp^K|6# zTKA5=Ic@IPu;PoF^*i(Y+VEM05>Jo1KEGL>OSz97oIE^T&WW#o)B0fd)Hx%sv>bRO zy2-uyHJ?gzbW86tW1gCpX7-xDEpC;1^4(75mxb==TzuTFexVcA#&_H`px*NBZys88 zEu!1!XWn}^^w2A}hi?Bhq~n`glU}$xcHznF59bXDs+Q~dY`NRUu1NdA#%bXddwv|< z>)61qLl+JV?NVj^=_(~IH_jEczt^HHFE(8tQ{mI3nX%&+)IM{!SliH2HGC3L}b#d>B^10 z9d7BIDMObBe(?C%#$Wu@xLDqU8*bdc|F02Uie;Mk;H6r@H#hETQfWfc%SF;P?K*lykt_Y% ze>@{?u}xE(W*Ic<{NRrlE@(Rcy*`&C*9QJ2awa5h$jF(wCT#xsVU6C!dJQ;oaBlZ3 zou>Z$=<4n{gM-?AcBD>@rolg!s@(g7N7t5?`&*-oz3;rfwL{LduiPJc>R`_2r}V9J zu1VcY*^56IkhNmY;L9VUUdvsl=YyhcvyWVVcEf^U!3A1g{`TY2(+XZb)%IYn0maL1 zp0Ow~YR{#0k*VvtE-N;G4bnLmN<-E(g?k)XcNWRd>B{8eF zA6hZ}bb(nr^KBn-Bs_DTZO>0l1qqu_!?FygD^Hb&Ob$hi5`fh!2pU%lGt7IHDztubC-ibcFyZVQ3 z75%Q=uW6sDFeX!%CN;??Yp(sAH}C$td468mYH8ZrgVtw>Tsyr>i(?Px zEDR;dC43WAX8q~@1NxjR(m8$p zpm#ew)$Z!t^#jJWd-QNvua|37O#1H7w_lxH5>vI;rPS8zpPJd_|Kj2;|C(UD|Nm{| zV8md+NJk7t3Zv5zqhs_)*%%!H0s^8J-Q6wS-74y6MoCHtN(+bzDAwim`To4~yYs$x z{($p%JYVOW*Xta0$Fw&3O#VwN>H?IpItI%n3TC2uJEBF;nfnPb?(H&T;sFc8%t)bu zUr-1QeeH8extgOk%u*h#?@5By9O{i0iLbW7W7~ZB6q2`KC)&k5W>rDd8<>LLI79s{ zQ)kks{;Ao-1Sy{8W;JWi6cxnMjbdbc`WsuH#Y6T~BKuw*GKtLCbkpn(9+k;G;x!0Q z-%XKOoRg)`Y&TB>kwS2swTuTcGcdYjw=tVvxEL;#^zM%uN<^ySzyv1aXJx>{oDP3d zyX=(W!axXDI{=!3fBL#$RvxL>grj69b(4eeaf)ccqa0>?&)!~{?(}t)?O1Onrv3Qh zXnuJEKi}9IfEPJ6#~)@_JF@ZRtakA4?ehCZTS#y!ip>DI&B`viu?c}Iz4dfEk*b92 z0q}d<9o;Fx`FlIZ&gPh`kFiUrTavwwhG~*IjA_C#KzoLm;A$#rfz4om_X|w44AXZy zV`qt$7D4=h|J3t%PiS>T^s~0Y=9=7oriqf4@p-!e{d9F60|VNiVyWPmOyR;CY>_k5 zfSXbd8J#|TrNS|8?ywgq&zFy#oT>;_7HGKq zR$rmOB94w^+;gif7Cw+Z>qYhWAiHjc^bR#&VTrqyVfxU3)zPWW#&v{qZ!0+ zxdu@%a_?HDQWuw(J;-Io45ei%s+vx(hw24Jk-b0G*ddOZN12=PrbGKrniavV`1gVI zZ7(LeX~zWbhxK}wCJ3GE`FJ#v15x*ld(y;o-j?HWoTI)MU`9E#x9LY*64 z24ZgOWch!dw=8>~r9@2Q7a0Vpqx2E)Js2tC{e3p{a(--%CV8>xa2KM`6(W+&8=NKN z7CxqfVv`|zIHwWK*RA+&eztFW-7ZJ>)?0QP>t2f+ySw1(L#iO^F#!toZ2o!WvTabU zmX16(eJ}yUNxL`nFD;dji8p5FX;D{~1mFcEWA&Y|bB*?-!K_C)++z~5zhXo7(P4Cp zkSpQ$?a@|jt(JZ)N}mP1gelq=0?HFxWi>J|=etGB@3suqsaIwwZiYH@;+mpNo^D_9 z3B=uM52qGl!ub8tw@%}EzBACZ$1-~vtKOUS`GNeDkuQwuBI}JXFD)a~IK+Z*@2Bj6 z6|w_t*+76yS2_Lpv;M4pN&H|dONj_3vj2Qm$FGXFx4ZZ%khFvXLM`X)p5qDQ-dI#2KJ#MuFg z0&n4wZs9ZQ$`gni9I+b=X~S0n|uZ@PgNU!3SqON!>Oxdn;Fh*7k7$e4nh zoER#JfqmkwzV=~gW|htWHr7$S8zL?qkn3eMb3t_EQHFEY06T<)AlrefG>_Wg?LMtK zfX?>$v06NSWDmwbV4%Rw8mJB)8j8X)y`0(2JZixl@^vpng}nn}*`_%QyUD&xICqv+ zOYu*Tvc`ReAS>1vDbB$oZXSgSEh|^0Qxe(p(k0Gzb{KEZ^;T*w_>>;tGj|}PVIvOr zB5hVT8`J-{!q=YhgvLrZbV5J=`ZW z1l^u~2G9q$3-!yy>+!pWnQ=mtz`v*dmxs&RH8zz(`Spc@+=K5}vomZMF?<#v%mZ>n zc*;9ZYZ2i~)C-+A;a>$6S5i{KuYCQnQ%O&^xLJYkhk0rO9Q&89((d4C!}z za}5+55qFzPmu(mxAhWQ^xqS|RJ6AdlY9gaD^zic~knnb*N;Ed+?f=+UDSePRgm3cy1!ZQ?_Nwx2hAj`!q=bFZIq8DSX%p&-up@;DyBH!tNLqoRqmF@T~O{R1WaNn~ZE% zdHf?SANwnNB=$Iz{@sPXtlI5uRf}tqFK#~Jrpl9b61~>cDKGU3nLhA$Y8;ae`eS3a z!(xr$wavA(2Nx=GFp~-gTjfI&_)>CaDuwu_*#u4FZ-lnyQKnfxt9cCy*~`SEh5{O6 zS{EC|Pp@m-v^klz$(%or1l;O}j0Eo2l16oqjZ)WII0qE(bf2YwW~Er6nq&vF zgTw%NC(iRdx5cJNi&8e*a+vcq8(Dw7_*lj4_LaG#8=`^6d*VR zUmhV~_+-ucl#*j1JpaMJS1IvIS|K24$oNT{`f{3tR(2?oaYQ6jhVJJT?JFostXhwd zE}CGhm;QecEdKMHTd(iP3Bdg{IH$$cNX*Eb9jy!S2w||QO3LW}?d?V4`~Yxl4!KPN zj~IFvO6lf$?#WIdw|*Y2Xdq+vj?k=(WkwDC!f>t_`hA)McG`)ds${EwZH04Qw{S=H`KIb2E2%B;p%u|ve z82U?12`%9_Ka(&jmKcoHD(hAy(c$1`9xu2{k0<5i#IF#;vUt4u*$%patQ$CNG-}T!RIb{aDW>uDnI%OTc3jH~%vzJp zSOVWOO$Gx#)H~{egL?f%&1i9RLBBdVlg@X`?3Mx5T_@6eOf8*@76el{6`Iu5f#VAE zP`YM6T~VKkcjX~I^nJqzmKJS(F13k3s>Bl4ZsB6&S{cVAu@>R8f70t{%Jf^lXTpTm z50%7|2ezIyF)9jOb;w=L4}4@(c}()QGNW$)WFu%=*SuZ(*T)UlIGPxUX)hUsYzdJX z%<+QC;tGi|08oJV;$_}J&wlt1NX0*-}RGoW@EzXnwTD@s;sd zP4$TFWY%jg`o6`gI$f%h!`K+^?Z$@rgg92*19CxU(#(@tK))6>`Zx<`>P_3^VHmT* znIhZpgWFQe@y@EPQT(DY3%5D!Xv`l&L;r7srLqxfpLe(&AzKlygP%z;7jFK&Gu+MF z7z}9}5Lw}7IQ7$va-8#IlutFTxUw4Mkh3WgJGZGr6|2Kbke$(K0$tZ8%mx_){%{V* zm#AI(>IcI!n4Qn2v1P`{+@c>~C!fHAQXeNFTizrlwi@6go83I)^kD{TIkufT>7WiH=?CpVK%*;c=c^i*aK9jP5>Mlwn)CyC%m;6lzAz z7ipMTc^o9}tAQpY%b&E0(o*}Frf9bi01P#f(99Z2-u*Ra7kZz>WmfKRRhd+Iq98ZR zC@!t{S~TTiPLEOd(XvVGd6>7&!o=yX7ye#GSM-SA!SOqBiHF-R%4I2XO{kz69jX9* zl_Z`FX>e(pQniuZhadYZpnYGC6&vFm>)^ytLt2|AAG(0d@Q-fgsmVPY4ja*G&v`N*o z8d^c-e+9uL_k`$ZP*(Vl7LE-;_U-8n$0?>Sgawu;$B$$(woPuNq_JEHVC^#3X1!0y z2mPqe?@_fdZU?@XbLt%-hh9w`a44nJ)YI zayO=urz3Jo7pCY3NAYy7fQ`;^euH`KiFxEEKcda z0X~mGH?4Lf^)+Y$?i$;O+?X4z_iS<}3Gord;Hnq(FP9SKb+y+q%{(5W|6hoK zB@oFhouK*d!9_)7*%POFjy|Fuxa6KTb@hIg^6QZ8Ff zQc!tmI0>U8Q6~~NQi3?LT)7XqXv(6zoq>CFA`uh~fDqC>D+okUK_t$)(Fnx-$`8?% zEInhVdGKf&(V#-(jB_pnK@Nx{fd-;%T)P@HZ&dwRY^_TEpwMI_CB4zB-V%vvDeyfP zp#v=oyn)dd%j_Q6iuL#kPy|)TACX}^9-rQt#l<^XUL0Fr$tdN`13K~8*&@g+m3EhK zj_{!wEG?fUDeopnK8JjnGC-fMf6?f(1q@|jJjegEf!q>L)3Hm5cJuIydEu1CP`Z<&Y|8@UY@7JogSFXV|a`vV#U0F60g zGU=pMvpP%h=my1R1JA{kI@fpa--T|X;<<3Ql(Q~aV zy{pfPyUa!QA8@M7ckUW9FoC1Vv^M@}iQyFbtO{?_mWoVD ze#~AHosMCNvrOQu-M6NUnGt3Gex0NhB4dKQU9Ogx@_Pkt>(ge`XH@9(y}$}8vy`=c zwmlSwH>*ZCF+IZHMCcymuidkPh9WyTQ161sTBmKX`Lr;SzkA)hdhGjm;kggtu1IkG z91&!uvmAif0x4V7GKy{gjmo@;9UY^;tJ%0N-Iow;N%#WvHX5$gUbBq%j=LZGHqL(% zz)|U*INIM5YNew)3)IAL8B^P*0iO?YefmukisbhOy|vX*Q7>&*T*1#I;S$=|BA%v+ z>z*18%8s9{4#dg!qLYc~ZAFDfgLu{=Lr9ciUG~5Y zkYMbN*3)=QQw>e=L1n<%vtH}_{q$XEGp-J1h<(!fQAt7z+w9jQ*AkL?tNZ6ZGB}Hu z(?Il5Obkh?wC7u(GI@8>5BktcnXcYmlY?r10)0`UR!diuXpp8Dq9aGBlU{J!(^J`5 z{!>&8Xjafd(H|Kr^z%8S+)WKwY8XJcUUWRy43VJ;$!$1*N2{C&`)e%HQZ1ISs)F6N z?_Gl9f1@bwc^ga!EqjjzIYDa{*`pGT0?l+-;^0BpCmSwGZX%8H*lTGH$6u+mng?<0 zHCIx}vtL`Jhoy)TO=AHP2~AlWLr-6(2+K~znPjNG>BP4DJuHcB+&g|#R z(4$9@3}>u}H+iP+yqy2GOElN#VoZl`dY2qdd2@Ohaub487+&O|8P){PL5$7aeKRxM zqJ$Q-ZsgO66fks;yC0Ol&USy*|0OnneBY{dY^CSyKv=4e7l;#iQ5Lv4Y0ce{G+8B_ zi)t8S6HP@wKb#=%91aAx$y$#aH}GhxM7@q?o!Th#rue8iX#k)7+VpjLa$xu zvrzV-Mul>&R-32WH=a2wIY#!wZsB?s9?9x^F|L^&OO!BywWEZn3}RhF$MF6|zwGKH z@%ur0(PVS`uRn5p_>MgxWfz{wzU;$=oH*DP^?H9%lKU?8$}<3Bd4%Vx z!MUAr-%0R2DL8tJ9MACR>Z5UoEdac$jQSUnA}UM29p--pGtU&#EloteX63*_X2awu+3(X95lpD@>bz?!^~~D zfj@iMHC$%$ar+B+Wh0kZl^nE??Whtg2!nc2-u#vO6K*vWbfxPn0@4n0~nmc@d89$aml-*iK8$6meWc zxC5WU3pr8H+{=gFp3wALoMcD-CKZ8wxlw<)Eg2O)AU@^!?GM_0yRy=6?s=>>(+iyW zDLfB$+vek@JT>d+uPtd3W~H*k&;%`c{3A{?X(gc&EDyVGnrLQ_Tk3g(f=$2iwkZyg zGB>M|lL*B?uDFhYGq+CMLXWsS@bH%%C=aJm$k#YuqX6t0{Mv= z6n7Gvmq^!>8YSjNR#Kysn;X%ZTs@%lo&J&Dk>T`8%?NYqtQRYYal`qXkVELHqrFmv z#yh;k$O`MYrV5?uU)HCA>44cfEjpI3c6Cz2%#-*SHYeFs2jj1p#zQserUF2%W1}h@ zI+AHHMp1olzzjyZNzhVw4v6k_jOjxG;{Uo|&?ixWw~(H64T4@{ddEamJq4e3%tqnP zpaON8rd>D0kPXP9t=pa2nI>|4BRq-OsUO2!q_t0^@P(zdRL8oabB;W8dB+dmE>$nm z__JlKg%^+(LLxX-xn9#>U0>p<_l(seCVD%4NyIvzG3RaBkJ_co6EHu6MN55*&6NHD zpQjoEEB~D=B*`x}w*YWU^P(H==?Hh#CEPC)^e>5*jnG`v%9}497rt_S!$#q>OEPMQ z97O%BmFis+Cz*<9OMO{aB=)y+e)26V{1fBE47F^9*1XI0>7(R84dDuM>LsSL+AMrW zB4J|YB6+&b<12R4`BbZz`jR0!^e)7>d-dAcR-RrmMhEbv*^s53%;;pl^2T7zmKw2F zGa;<|sPE7K;#+dS0NO|K{6;)iiLtG-3>6XQp8b&F@W2F>bc(Rl9Z&PB_Wt}>!ShpM z5F2>sRjQ$4jKh~s$*D06Y`Yq0K=ZD{bt&+W8l1z}2 zI8w*Mnt6eJcM?~UViot~SMj;1gmw`2hz$OaFo%?f%gHo8Z&~GxYu&gPKb|ei6N3w=ulu-iZ0K)E_w!}q!do) zSSTd0eVplfRXjV1J!lTi!_z?A_&^FW&kGuw`AS`!L+j6wCXlsoizR(ls+hyjo?%p4 zM)Y8COSU&9i$l+VrfO=~T5onFL2X8o#m)`u`y4hyV=fTLooR8g1kQ0P^FTv*0^swm-_aV|n@Sj@Dc-wMcTyL^y8g+kohNep|zr{HB;tZ4#jFye_F5iGX)WmbMG2GQ!EV#Yp~mRwhU~2X)7jaYj5c zSHht=;4J$8XuD29b}{YGI&>J@;odwAqzA_knnzWagUjIG&S=31B*CK(CWr$U#_3>p zC~K`hyNQim3cJ|D~Vava-##0iHe0+ZwWEhBR? z0X2@7!4+ydH0pH%w^)iSb$>~PHE#xoUztj3q5DaxJfSs9X5SaiyN%+74)^{@jfyl4 zBfqfrjzLo!sB6vZLN7~$JIk-;=`%Cv_w94X>k{H{fV!FzOlJJ4?B)?nS?z+%_>G8W zFZN;Bfeh4>eDxU^)!8`<-F^@H8%xi7_BcS_wur9=rxa`6y2ytjE9FZ*F9$GJ@7Ta) zMUtj=;lvn1keCz1^XD01&@APWyF3Dik-A*9OjRsTyd-u=`;&M!Lv52>CMcPdx|QBe8vBxovxURiMHla^$E*H5y!LAE*-c4;2;w!J z<0oI*^^b1H`(({r6~U_Ea&Wpluk*X%DbU&3Kn-c=Q+n5RE;G8bdc9 zPRsR_21U=|>6P)DRx;;uq?y#lA#Z=)lroil4_~!}uxwqsYgIBqWv{f&>T6&p3P|CM zlzZGGxylVG=p>iQ=GCiCanE4K#t`lDpXqc9p@u834gKCGNHG;cG(I-ezH^qzWmVM` z_h9?l0x`$P7NT=rSZP;<65qZ|K(<|%J>oErol1SW?Tmk#%Xm#sGs+}6Q+=3%T9A=$ zV$^ayK+cwrlOne2LRPkt?i<-CnE0g9R+-D3mG3t~jU>GuttGu>Rm4MA)8yH1ME+e1 zuRb}uAr7m#Lh}v5^4d1HPaQ`~*f^2h<5b2TFnb^uQMzP_C45yvq3YseJ zVJL)mPN#JyFhl@C3?`0TQz?5K@!Rx#e^(>L(mW1w+e#vie7+0jdLxf8IFUrXA=~yG z1!s<{`(#jKT!|&eb+dD$0q?_%&SgjYo=i5TN$jQ#@_CY!qc=h#6y?BdjdWx1$Fi={kq_l@+5ICxSR zoHzWU*#0Zqpr#(y;d>OfT)!UeXpi;(;;B$0G$kn##T4))$&{gvBzAE#m^ zq~X%6RXL6yNBjnHt!*mXM1=lrEH7wOV6rr`3ax2;6|Wp9SH;v`fT*T zUl``0-Vza82(#zGvb-`Xmx+?~ab;$-uV?vraDH*p6jc^|8!TVDOZwLc6LUR9JBfje-LN zZ(f8j>&m`i%Wg8ov7KVcA~vy!`K600f8Cls>ff4?5?^X*jD%(EJYp;K{HBjTpn`%q z_9-7jb@@#CgFrvVH#1VZA_o3TD;kG=?Tzw%sz9k}%*gA~5AY3F3(s|3SfFE5q)*(5 zjZL9%u4{gsMq^IV_yi7*hx|k3EsO;Hz#}oF?sdi6x1cfIVKORc1Vap?Mh2aAKqU1Y zANJgn(Q7m(uc$+i3VrK11Q~}+bC6hA;MgWSHoY{_uBoC;w=dG>B^C9xCesxl74H%= z_7qD4TcFuAG;))#bb~T1tfuNGUfnzlcjBPf{Uzhr9pko`n|Dx<@O0Tw(k-Vv^n`({6~ zG>*c1cs06%?;V#`?#q3-x@Ry)^9{Y%(10rS_t+~QHeO<49IL%eS4|YfCQfk!uPVAP z7*{n*hC4rbg%DWj6iW97>v9?jVr-rABErm1O+U;6UyM#$NrYpQo=J?_a{rS;h5w1D zhbyu%6Kz&i!mHNSYAJ?v@|#Vvjj7WPGF*b1pPf73Fq;w;WaV;NpXTjIWyxtL0&Q=* zU3EX;HBy_O0eFsaj@v%TRuAIo;q9K5ByvV^8d?{IipLj!gmOwgL(AFavyN3YZr|$T zto^@g7XP)v1s}SXsac{i{iZo@^d_BTZaZddRM#yf9hjSX^a-TKyKGE*bC8D}NpWHc*^=QjTFOLsc|5qW3afi*wgF}PSpWHL&W6sDy9U@;FtqJnGlrK#g@gt7y zD%{&YVr1Rl8a}KSOO^<5s_n4YHyI&PZ+aWWLJei=a&<@1&cG!l-Ww4mHp4<_JME0g z6~pAS$iKnilV4j2Y*{;n)gag8O{O$GO|q0BnB(AxE%2|T@`6VrSIt9cSu;e3B|gNb z>ZCN2A&l|w)DSeo`74#)@3Y)T&m5)Jn^}kQp#N;uTjbeB^h3R4>AD4J`DgW>|7Hqw zOxNRWP?&b0o?tiwKd5?Z`~$Dm-v~4KISiY)CBEM$#Y2FSQ{~p_o!xX}!g9{}(AtFc zmZ&GnOTqo6I_MnT0%VL5NSuu;(an3Bh#6jbiojbeY4gFj`k9#LA2eT@N^TIun`N2l z%(0X7mV#Od1*psQ$D|U-vrD0F{Uid7ewM|qj{nnoZK&!AqxD0da-DdX#JeI_Ty4>V zw4eG8=lzmKV7u)SKaDa#DnAvXl!o*9iIFHV#K5!^^AJw2M zc!?OGaTw(=NBJ-SzxFT}lC1+L`H#S3x+vO2*QciWFrY+0v7re#<#$!1hF_O`06%W+ zZDI&dZ!J4va;JUmKc@s}SL`$bGC0QV-u!x8@iK

v^k_sI%<9wzshPvEia)L^3x+C!xo>Sfu%Ll@5;^>X-k5xP8R`r$kt=5rpz4F z&a+fW34sp{kA;&26Fln}ZV&I;aEM=w33-M$to+tlG`G5pT%d3C7XF%Y7POx%X7Wd-QpfKTD{tJyD>!)^UOqfYP3`9l zYM%el%8BI`-S*$uGI50z0X;qpYzC!~Vk&kKk0*8L3M^k#DCy~OY5B&F@+g=F;zQv! zsp%qYhWz7;za(?5II^0!XygujrSVcboZ4&Ia>1ehRG)eL>mR0i$Ztit(o_L9rl>vhjC#-1zcC})qiL}R zs*eyz{N#QRUs?3-Ld0u(ZQ^ey#sMwMrCr42MdNto*_uOnbj-@LbWFz;9ywK~VU2s*irq0}04;|s=>U|C4jans(JQbRoB&H(E_LY9kg?g{^mdz}s!u%Z;NH@?lM!!OOy z9{m&nYtICF89{GTzED|ki$YQdH4l@Ustlmjpa{zM+RF=V=*DE>xQexgK@eYbOa6qy zo8J(P{KU0rgS|^8d`jFZC6EOOWgfFtI}KUd^wiCoan8F_w!O-cxuJJX8*b*r)r65W z*Ch)<`do~w?T}be_uPX2vSzZ{vN$Xi$z(D;PI~qkvnZ!?dr&IPN-mX-H*W%j+LI=^ zTN{qwC~GWZ9EIf^N0!@V)P)Jx;*`%1Z2IF`-sqjR#W;pFfwGGEq65`~Q+YQxpS>j9 zoLq({tF-0PvyKZ;Hc%7p&8Fo}qZ572v>nJIuDP|m;wQ^;kTr&F5iqYRlf3Q>2IJ~7 zyuLhNCzm&(o;!^zX?fgb+tv)7pAiJaPf8OAbn%HkDwUX5-T@nb9~Z@a`f1}P&bdJ| z`gJVHShp)q>CFkIu!gYmLPr>6MGtaJ!!pt^igsj#|K+Wc|J7qYNsj4@cY5pZ5-Nfk zx>F2MMg+F!GU-O#fAnS;;-Sq(H#%6?A)Sqdm(_Uf_+Tmv3HPL6PQZh~5&6knI)Hyi06)7qE zfoin!U6i#<&wHZofqG5sh8+ocj3SC+tOhyTvmMho(1oS9WYz^664o#9r(~}#$5-c;c8cc7KfquhFo5;AC&!SCc%)_ z@yiP3mC^OLt{l(&s4lNG)8o098YU&sJ&TLK^XZBG3=7{w7IAG~O!as;h__pC!P?Oi z`)+Y{iI54tlpuperu%4SbJK4eBcnQP5jd4$OftdkPeh_ndRQ$iGP0u9JCPS~haLE9 zDJO_`(n~wEA67353L4}K)RcF+cE z}#wxJ}oz=AMWE-CR}`8`F4d@j>U4k;557u3l-BO0;+p_1O6{wWIR5 z@f55wNwQ<=hDdtr9;+S@Tqa)`@|KZIa`%WIvB}NCZC|k>{-3O7(L~aERK5W)f%cbL zwLNZq`S&jg;BnqXJ0`TNOh_)i$Byb9+qFb)cD^5Cz>lWV)uDPV4_(exby%0_6Ki(c zD^1v4to7(?BBS)(!{7%FxqMLR@gGe;ktSAHQ*d)xkbvc(_8{{^&{8|SubVBK?Ct4` zr?ma+1LRcxzU)s8+O)EFm2r^z{nK{cRx`J4fKIjvGJG@5M=0Cq!5m6i?(ioNund_G z8V>s?FiM3;fGHSPO>-uc#|CRaJT=0?<=Va`Tc>mvD z`lUNe=RXxRT_;5HL}S>B7mDOhf8`QsCjqN?GHKb)z9>gJ$1S%dfx(*FxqxbHi=o|i zg07;O_~P)WPSq{7L4q^06(~%W&iJ0Uk^^vXRy1PlX|-Rl6?zv*#O=|JXKdD2ZYE8` zAL-3eCMA~~R4CiwM($A@cXSOCA*p$tIx-?mxJs!@^k|N2pnToEp@%k8pRpz}`c!3dpoLEF%v+ zE5zM$Gtx>ozu&tJ73av%soOM;UB3O5;gmFF?2mwqWLeh7arVz}TS$+AIRK_!Q>Ahb z6KJ0mk*&g-qaH8|lZ#ryCuwe@tFLk_wNJQ^%=hne{PiWYlY;O|_Q&l31`8_@d^_3} zPx$gz9PHGRZ6%C(4XJAyH=R`%nI7qW(ik`b7S*6 zRu^I~c;;Zm2%Q}RXUYFMTqY|RnZ>du7yd5~#if{Ygov@RqSJu%U9|i%J*{b+oCWKc z#4N;uWDYCfdsij+dhV=0uzVvvC>hOBR7lv=CvjJ;!a)(sC#+_9_k4k=C1k_CMiE3t z@@&q7KZ(P_IicvBM81(LVQ@HyGI0}^l%T;mM``*ASdPxx@5r;YWNAtLybnvslrRYr zqohc<*PedNH=Qgqqa^8#W{jnKvY|LNTz0G9(yKl&%AD&fi^Cah-QR`}>hxuL4)5k! zbZ{EZ*c!Q1F8m0N45y#-aEFLW*mfGOeE$hiBR8IKD{!mKRng5z_}FRrERP;_+EgJD z*x~!8&-u3~YJg703}N{{DrJr0BK0=k+MAxB@}FTcXar|JfPPZTEEKjhphUY9;6irv zY3Z~~wrAUh!mUEh?wc}VU%nhl@0Mzrd`4Uhw{IFJ-BMBHYHPaU|n3jYiBjoFfq#^UdS^yfk3 z5RpNE>M!E_*t_|hLAlf#8C{=iJk%%ov~8L_ovkGv3SMFs?(O6o7zRQqtxQCX!Jlarvo|%|u}9Gg1<(9K~Dmjs7L^zjYo-_7aJA zGN8B9UG}he2kt{f!U70Y<_QQ+P%3SBNA0K=hulk2#)cYe$?s;b+S<6%Ao5SO*+xi^ zUt7IZzJ`Ei13~H-;|jr{)7&Q7aUTv{h*s=jojf-4u}t$m;p8eU+ zPYEwua2}F@58wgKyvz`}ysK+Y)hOQAfT!G@Aw#@bkVBMKr}S-)3G28SJ8$MuHe%^J z*?rhdrWSt{qcMFBOa{S^`Bn;D*-8YF(=n6%j?z zR34?jK=BB8d#4y`KYi9-5DBY>bBxJAt);7#`iJQMF^=Hgk z4P)G)mp1|>kJ#pmeVnMPTSKSMEZ8)tqP84mgrPsFRo|S0K>t5bEx_!Q3jq!KbG#7A-h%DMz~w?*bUQI)_*3B7SdKBFaH zB^gh=5BGb)a3}#yKc{D}FMXp_kXk3Z?6w&ogUA5n)EX!B*4iD>`aFf;SjhDHq+nM% zFlKdIgI2@{g_h`mqPD(n#<|jFX7vdkKAtmU`oj>w2xus@{`k~$6aG~J!@+ODmfz=t zt`@ueY`ZiFN?fiTy#mM?8oMXl@Abq6G@~h-o-15{2<(A5@m>qJ^Mai~R%~~kkV0dw zzjdu_bDvR)TlC=Ls-Dk7fa3bO8X6ljvwGpf8+unM14bsR8aEyj*eBb=M50CMj<C3BaD6uSG#}wq)7;<}8l&qi3XSg#1P=;iT<)CT{gR_H)uOwE@Z-V8&QxYSHJy zDu*{cJenoEA`l08HNXma#xs8dh04vd9{&C>s{kqbh)|_MSc$%HTzd#?TX{>KW7PIT z*b#(ZibdT2*SDe~{_NBVwPn-y?hC>3D(WNyx(YQ#gu9~{_ce4>bZ4yFCW!F94J1YW zWn6(EaF=Q1>YAN#O?V6=54_fMAPRP7OcmS$uSP2nQvj=yy%Os;Ks^$V*wN@#Y|PT< zweZMT_JvkNZEtL4f{ZW2qEEn}VclQJZxQc9Nf8=>6i!W&e@3!%(Nhn!cT_{lv*mtb ztvhD3jQj+8N+dbFYF%JQ_Y7vvWd9L7LN)QFWEI*ZvBIMN8HNsC4-9;=8v#z9s2nrfSxJ%$50U%pXr_6Tp{ zPA6OyQ0t@Sl1b&4{_su3AL8b(MuEXM6ONqmHNp2ah5-c8+_XCX$K)2lshgkvN{}}c zRa>O^wVU5qVf9_ky0TA%hqt#dBCtM`At+3_$|qjSVyWo)L{v}nq^?!4WJWmj*K)YJ3*t1W|M zr7OND@_3mUOMb}nAm~ZFwkL~VhDy4>>Ikv<#<7LrS^Z6{-0xNY3I)oRevIJxR?%J< z{%dY4Dt|S*=06^j>Q2!iTaeH=)FkEE)2chjx!| zQZ;3g4Yp{qORMx`W7VdjI^}Tbwg+U+H_0M)zq90$zQiHv`PQcbYStl-g-aH&CVP&{ z{%-$5_?j8GS<=;VYm5wa0SE0NUo-v&0_x_zM?kk`3Z4Orrt^e$me1pEg3-mz;p z;w@2oX4d?jOery@j+uvI9#fg7CiBxw82fAAXx4Zq*JPyz4_oQDtp%;`$cTv9+nQ?K zS1ZOR6_l7;p7&iZ1Q%xKveUzTM60l@U?{=3v*2tjK7T|+1w-I1V+Nk?9 z%qAjlY=s%tsRmB7mZ@bMgejN)Un5^>`^49qUSVFeej`t#79ji~J!a7Gwp%zuj$29M z1iBs8H)&$VA%!1wLtMeWEg(d{V240kD$SV2rxc_UwUD^RW|H|6k9&H|aRPrO;i`vo zevvhY|Ekb~IUve$hGtMH@HkTFcVlDxA=2A{GHRGB0%~uECFA72y&LA73n*75yQ%A% z6~YE1s^8d&{!7ua;`tF<^XQ*B=eV=$BUWvJ)5BRN0SOt!gfg0EjcxW$7msfzBH_If zfpzSsLdcSV+C!E&9_gePs~mmzMV$T81570w&El=g z8&45%YF=bcoQbY_W71nZ(7`xCLF6(_ep8hqi1lg_Fv}_P;Teg(6!!u zkcGjDDW>A}d)xzVZmYHT&67Sf5rCZ#T~PunrnlMVCrq7cH<;lt4M(~*Y_T@e9-aN^ z@kr5X1bpw3K!{7ucMi~;;e!XW6i<> z+$%kI{I93vQgguJIuW)q?CVhjWv^QU3^ZwR4YVk+2D8VcB-y!9?ZhoVo%_6IlS3%g zOKeq6Z3nsNzh@YQ?PE*KH#Jg9v5xt3Tnvc#GOh! zLf@krTKL3ZOEq!)$cGDNc|4tiP++OL5>3xgU|q_18Y&Yw`F1qb1#+-^ih7WnB48T883Omsjso0%MKj=8l{)7s-tx89pigDR>QWZM%Ye??mX@n$dR$mnEWbl--4>wccHU=8A_C}OTRl;F2@-1}mk;!@c# zZu!73K`UL-jSrz4l7+Pyl%OV0&941;gm#ef5NmN1;w`&1zJEE922a=jgV^h)J3DK3 zc4&+*Q(pUzV}t~xIG|}Jw$BxVgM^~^O}`laqKag%SKa!v+oi?NxxJK|vL0sKw;AtkD)J+v4;+fj0lTpE-P=}~)CJ0IvN z%r#U|%9g6R*f}fy=IwyhKieb|QzP->#DuI8e8xR`aUX{M)WDMekE`?kW<&q~xRH<$ zLe_k8>F z=TCT__j$jb=e*v}=kpQVAS#-tP*2BlZSEP`678@l3K>8FWm@TehClms<+~E0GuyCp zPv1o)KmQ4|Hb`{~x=p`QLbp5Q6_Hincz?Q{&8Av`6{x**+BL(oH)^&xCe$=TQ>ZN)dymLEa*`K7FT9ba!d6%Zvu2SDP=pRJiADkjpCY)3PD zvd1i7`nsOE1n?{YKepirn5D@U=cxolp5qbKYmPP=4Ey_uMdc163{{?kjfOLHbBJHI z7}$ZP_4=B6fmD{AU^WEFr{Q+NbzDOp_B_H*S|CoaHpd*M8zQ{1zY{@{mcGR0wj;!g zwCkO6k^{+1uZgczK_0$Hq$8|Y4oce1HxcnwDOwMHkkiv!(mNq|w?yR+#f8EVu+FgM zfW)wEz^A~z9N0>8(EM;l^}CgGeiyBbxz?g z*RphD#ca8mQF$e7@@dzQa^agPCQ`#us*{6#rKua+qq(L2GD{l z8a?o50wz$9yA#%FT(od@3gFv-Y+-WZAUZB(yLW^PkEl}Q#uO){PTc@xQMbRj<`NTZ z1S9crWJ3Y67lXm?S=VxmM+7G06B-C&D;w|RkImv`BtGry?iIHK;v}Qo$C^)+*va++ zpj|=SFInnZWD)>&{l@6Wdp3sLO?=Y&4N=zKbpO_rYS8_P@z$i1q?_ijt5(ZzubW4i z%S;maY0eZ!%Z#gbiV=}r-VQbg+lNTiv`2NQUHRu)=U(PnCdg;`+tpyITopIpJbS{$ zA2PrNmM{*B@``HY)ZXOEboJS_EV!t=6RLz^c_9{hK2?~M4}ltfegB@-Eildgbl6Bx z^$n2upw?Q|_N8<_g5Qt!BPq3N$m5!BC8*%9Q>&?)5y**T+py_FU4JKT+l%^dxR#FLT3Hx&C#j+jhWi?CkeBI9#)Ji0C_4 zwIvuO9AJXg|5!Q_BvR?7=kjM(>M9HJ;xn<>oMIGz%%vn>vSkJ^74G+~Sw2OMD!M_Z zG0j2>kGy@1c4tQ-iGesD;GAMWZi?Kt!?tK!r&g&T@#}c`t7j5HHtRuNeto})Sn^_C zuC#dG4SZ%G0^d^6RAP{a3>xr4&Tb3tKCbrd#vc~MPmQ~97iV?1zmSA2MZpRKpxgC( z6^0)IS7f6`eA(Zur_D-q3sp8vrXMGld|tGnU6;rg)N`b|GAkAu)x~eFZFh~{0tZ_y zvO>p&61>Olz=~)_b77P|=4`uvC=57eQC6nv=fU{yzq7&NEf$KYldck%H|$;BJy0u% zwEbtz4Li49DBkjV=$$)WA5q~hE;&2^u>B&|o6k5%!~B;b;mq#rWFC=Binz{GfF7B9 zol1gCd!>nGC*xZ%qe~D~CgL)0O$~C8uen05>VQY$esTn7412p_*ngp8 z%sAD?*T%&$8z3ysNW_c*(d!w}XhF`!PsgHVo$el=de<;Ft&>2nr?R7YH~r3c)pEce zu0+JxVQY^b>46rhO3H$<{VSA9FLq;Km>)#EiKrI(9^z+aL6Pn17g$yGR<(j0>o z{)76d-%|c{1g)(GeC^sD!FC0(b6Y}|cJh#c zpfHcO_E=`-RFkND@ZTX{P()DILdteAIU`}FaDMkjw~V{o{9$uY+S$$cUoZ5H{}Ifr z(wrza+*27Gjv+n;jq8{g6J_Z(Zm{3J+2-%@4z8KKo{F&yZ|ggtpf%BpIa9pnO(nWo zFTDz>09qzY;}#S(t+n~JDDacfokrNxRuSLV z*o`PYrQc zMjY3x2EWpUU<%o^)9XZ^dx1wB4pEiDcQL8Zgb1IN_Q1C_`BL3)=1Ps|L=k}MU@Hy+ zo%hH>cqbvd-L5mN)vdH3Tm3wv0(;KaP5X3hI`ob5Dj`PqK3SR}Y2$;E$*YUjd-fxI9misim;R)RV!)W7j$Ijf&G=`)OPbo^83 z9%@+gx5ZS=`hSpD<;VF^&enXSiEoW&eQelz_xF)LqnEi7X_G_6fgOF#GwQ3{c(S*GPz>}C{k&y*Jxop=S*sQAETlPl z5ey>7J597oPL9zg9ddei9f4g^O+@|$E-PeGtU<9!bzSn7<=1wBw&|xIZ>0q^zQ~Q` zxr>8wloomUIzSd`7xBt`YP%h%ZpVx4Sh)$8_SO^90RoFX+LK~ z#}Bnor}*AvTp%@n#{WV{rB>k>1MZJ?!oFut{x>-(V7XTft~4#?Yt% z)f#iBeErr*%;eHZJ1$RtJir&9jS&-{$+c{#pdq^khQ^;_WXhs?n^SXT1XCiomPesr zHG|~DS%Y^qDc$M0l5APYzb+iee|&>2qZ^I91eX%7Z0mKwW7fF4GKSf4brxM@YN~** z?w$C<1lv9yICh>}zYO$jzl|{>4a-n9a zKJJoGG|2wNn!xNmpMPU_O+*a$&2*sn$+A<4M^#q`=U7Vh^PnlOQ16z1qaRfa#PDj! zx8EA0c>Vp<-G0aSRa~|F{2@p-W;z**UY~*rh&p1Vx;SSJ?Ok@aJf5Ve2fi>EqNRrT z3tSREHv`*f=|USe?UblLclcjD1Vk#9R12r=CVqdd5`3Ley|ypqey0s8b^Y@YNyXZ3 z|5z^5J3GGHI6nG}oo$}K$3=rYC*Ma>S(29^Jx%Wd2dr1z5>UzuLO+Hdsgd%Y2N{Z0 z%OwFimbZ2JCa)Z&5+g8Ojg#}Dsr5yw&vwWzF@?>i6PYM26FBPg(W7#1^EaG4p$oaf z-+$nUJ>47kXb>}|t9r$Lvd!PUV^KABqC*5J!Rs1!W-Yu2pBi=1wJy}38iCDreqCIo zaup$J5~Ux0kzC+hc*FhDiU@fjyP0bTh%b3SgDU1mz$&kockrQ{gH$M^mW-kLu;7BD zdmg3XqxKtD1KwsiD@?@dX{s<1GXr}BojdMs2Nt}b_AlGKHtw_t*VHHgpaiDitGfl~XFn)MX=Gx(et z=fKUxK|czG!1sk01u9zUpfXFU z4}(2@U$L+rae4CP*nptd_zHyBT$Y*o{8b|~+2`+PWHsb$SeQ3}2;!z%(e_r7eNuRY zWV6yyy8j0fZ8|7&PJ6JwIBNMd1F!?=-U0aG$hImQKFWVjgv7rqCyV&+ufX^(JkPLK zy9FMVlg@cj;!`!9b-bgpoc-4_pP@Q&z>HC&{6OXkUdOky7$Rr%8f(DtE*w)H8DR-E zSuB21S3#GQBkNws2TN3%|AA%Dy*L-gMZM&>38M;Jwg9L^a@LzaH_gTF)a6SdRLwf= z5(8)!R|%FhaRIe@hJH}M-Lowx1BFHL213T>u8jys@`EQ{=7B@?{+*sY*Q?Zj6oaIq zM(umu^zQOKeEIFH=`^wVlHrY?9ax9g(JSE;{vHLX<(njJMU~6GGuUhXI-0Ady7>}` z4aw-3a0q_hn(b55JngvoJBhV^H7({#?D)lt^-j$>_J-CMX!h633tbDw)ovvf3$*!~ zgR?=Fi?!}LUb2;36C#tJmq!y9lva#dbCs|8c-ha zv<;6Wn@1<5K(~yvaGGGPB9q9y-C1YwYrAF*j2E1`~P&ZNV$0z4$q491(T-I5&C){C*Xo zz*p)VXiItDSDHrngJ61WDlc3LC33-&10g^YJJP{urz!{cw{VC%^blrOo5ott#VNiG z+wf~`*6vgf=7~--%Wp`|--?&sP;jpg%FSrvQW$+n$QwP6`nN_{lM=#T6<^jeTQ}m1 z%qoh&B7_i<8OJRLynxzziL_0KSS=Z@$aFFVTIUHWz~G6hn?X00BO?mPtODo`^PJGO zW7+0lTDmpw&j64&P>lo69#SUr7-LwnE>*e7gJ00}4wgWqoK3F6omzAb^_iBo!OH{Y z9a6gDtA4U$bKn>Caj5DAhVJ1SUHgdeWF}2|0Q9G=AZ?`d=<2vA6o(;JSL8!vIwUkx z`mLmxGZC;qrY_?!qwfy`)%XM}T#LOK3WBU8px-sEtRtIEVVfj!vYq$(pl9kR(^0l( z;k|~!e+ywqn8y5#_ZKCn=Q@K$FX!D2%1($Q)})VF6e)Skm-p3iRp9Ax5i-_QwuGC$oltApD?MD>MH=Yqwl-|21kjc-W9#VJf}4L z>{xzN*9K=`MKx%yc6b5TptQSH0__`oRCyL%$R8d{shidf16zlgjO< z3eUuiIU%EeTzCHt#@CnFuxnBiBb?_E2m%z14C=^jDdF7FuyqF6fx_L5u3N=<3nn}HIdr3KHQ`n*m+ zS;ae5Pu`B7~lwO$MotiBK=<8={xTH~u#X zHdKK>Rtt)Qo+411X~Af1)%WTWcM;i`Nv>$P*ac98#s+r3@Y4X@wgFNieL@%T{KM~7 zf@as9Wr?{ITD+M!Ug_q_!Oa~Y^v9fueCm+Zzndp~uQZ|;+JoIv+_!=g9uIKCo&`JN zQ$_YAvLm?&_v{m`;T6K|D=L7&4wdN*`%f#Vha;mL3mN3~zxLI>Ch&wNsf-?egm}1d z<~q2Q#KuLIhfT5UhiPI=1BfJ2W*hb(qPs=#qtEssL93i8sq#u|miT04(${EjM3)RV z)z92H#4!ks((V&FKp#wnx)|#dOfvVqx}PmXqW-S=X0~BqMRwe4i`&|-q^Z%siLl~G zP|+uqYnN;fkX2XADpCMa5U3s}^z!6Re_(RuTRoSr%^e5!fS1ndF4l9p=zc@O)8QMV z6(O)l$FC#wzcKHW@y)syrmRop#cR|MZMCAqd{9m(Xgn5^tDg25l_}sZxHeg#CMqeV zJNv`}9ebsA`3En`9Ko=$u0-G3q)s)A%w74}6ME$oz9-*M|*&vY%Rn~KMCWxBny9t}1X zw0NIXy5h)LC>^%CB`_)L5xn5HsZpY6U+m#HvgD4Yad8nI2~ZWFxiz~pylx&6H6FHs zBdBYw3u$6JLB;-d`283rY(fU})?D>^Y0mMfn$+hg@wX53H9M`R!6NYEz`w^OFV~c; zyIvYQnRY^#Y)EVQB1P15dD~CWjxH5f&nFKZ@sT6|XE7pSC7yAn1R3DMldfN%HM3cu z55GRb`@v83XFbWvZa`~6+rId|o&0-xbbot|4qK8%q&&UALKyjf1}p|VHbC2N2A`Cb zfTNImp&bIBc6E286)6QJPvHg^a?EJ(!r{rborcE4i%9S+9L6^+FFBKW0kYO5jm zRkV-75eG^==<_XNpB%XiJidKqZ30%_25$II`I`9;JqTzO&U#&NeMHmV7$aY&;Huj< z`5Hq4Ic5gikBF_CdtNZ;8!*lTo+h51i%5E)GuNBptvze=b)=K;ejyh(L@D?2LWH(2 zC^R;&4l*W{_0Tz>V>!9>3YH~MBxF`9Xj{AAkoSjV!A@KZ)9SW7p!fmMZo|M_msZRiYQ{ zx2>b*iFsXK-a2hzJ8~VJy~q{_&-H5!XC)@oApcZ2)W0L!Zhr)&A>1Js)6`a~BKZ8m z@$^?wGE=;2QsOR8ohb(fr1%-7?_y?Tb-%PY2Cx$D``-6gkBO`~d zxz3*>PoGX0y%Kvu3U^a*&i(0`sYV}x4(pF`xl+gXiOBnR!dK9ri89F_>YTige@T|v zP1~Ov|6e^!l#OEKk&ThEj>*?;9Jst3@_q*8WQPmtDGUm5AWQDcA*`fw;Yxp!ByogX z?QMmtUi?#(L`F*SrJP#9G9QJ0jNgrNT0~J(j_(H2-ZD!twQ^cZ{MTF5>@8QeT@K@V zNjAxBpRH!cpmx?9 z9&(QtSz9bwutq%F@lB$?!NK2TLdqmcwF?6dvMjE1Umj8(Uvt=fO7MZ|5L+6!Rw+tX zhwnJ>x1jG;9p(9WeZ}?BuN8zS{7IKTPi_D_bW3U{G8#cW?*SU?z-}emt%wArv&~-9 z=JSx0u6xIDPvMF5S1SR?yo=dd`*Aby>u~m#GPN@7(X+Q;lR)TMSO{`1Tnc)Df3=bH zIFbFSNJVqpNC^Cf;8L_FYduBIMI>R?&oVKJMUr*N-UFzaR8=R{KyS>2)X-bT>5a3g z4;8QJY2$5-8?7OJmWa%F**auPGxld7uxkPG8F}7)!#_(>+^oGOqV|SZwy|ypP+lui z^A7gIbVF6wyi}TBJg94l)`j)#YTY@I91D&pm4Lt${$xn*pNpU|7e#UBp(tQ=iUb*T(!!H=kjixRbs> zh9T70-M3nrjTz#u?}c4UN}5uB63%SgDxVb?r;wDx&Y=`&KY;b7ABd&DqX4zfh$#3n;Cf7 z$6}g<0m#*R!b^U!`nD$gX{8%SLE`vK-FT3-R=o%@q=%wf)_x-gOR$vd(4!!!kJ9Ft z0~4(nkqF+9n^Jnm%B*Rv@^;#=aR8>1!~A@R>M5pQ7N-VlMd%|9Lnn7Sxjv-+SS0Bd zvZDT70w&mRuNtjKq!eaP4E7|*ag8B>4lC6*xsa{Z2?b`Z<>nm^ME8HWpOOdEf(^5^hvClWp z3tdA#J$JEBZq*71s>rvC%R34uppW|msx!FZ&kafklOo!3$+7NXfTu?%hT>f2S+#mm z;29;~KU)yySm$%gr%d!8ZuHjb1Pjd?Jh9$`#hMxK=RF+6IJo#b-}H9HSi9^6fUL|| z%J=SC*e5rKzJJ&iRQ&h4lf{w#ZEHWAbyB>I`Ucc1T6{8p+;BsmhXtof*d30bIZUPK zSuDrbriQ_7-iGcy?eh&O>p6MxUBmPd9e!v)YkewuHcE^8i^(0A@k7zEG5y(cxDDrTFTfR z@wJ_{?=Xn-Nq(i;_I$R*d4MynwtnL4lB@1@-5}{~=v+YazHlXyN704dbm7BS^|?MK z<3(l~9GY$>XPsIZGv3a70{uiUlVs~|icXKIgoXG2usNS37+a#R^rz5OV&PL3IQ_l2 zNq)m^be-N>O(MzHY6&oAZsjni5Wpj*&J9UK-L~nsa?As|Be>WND@9cl9LItGN4=Q^ z77ZT}#Wc&lG%xa&XApH3C16(=833s|Cg5sgj$r|KBk;Tumh~kNYcsZTZG`6AJ!OOv z{NA2Oqoz+GwH}BpkfTL2v|Yaw#D5nuy~D@eu|i*>BOb=Sx}wY}I1m(eUn_<0N7H+? z-YP^3k}P|CUq?-Q7i#-0{Xu^f=8f*Dc0ERV5o-LQH*j~U)A{U2fv$xJ#S^u^UWpI_ zzWin?HBF$M{AG#Is82@a$gv*kA%6{dvR0Ila+a^ zIe_O+H_ctb_Pz0@e?v-;&Lcvp)rG|qR*wi3;x8BbxZ>|jKL3uGc#q=x6B;~wg!1+j zR5dhh>II%)qBXT<&lp9dDvABC9y-Weeh{7tMT8b~1x2F73Duq}#A4c$r367r?{aR( zQG-l^uKBgWIi6U1*JUe~Krikt9Cp_*#)dKd%RlljV{iigO&_1VdmEnvpPVlITgn&t zJPndC<0TGFXdP9x=pZDoH^IQFsq+lJt=)w3?DvY6XtUV+8fcq?13b+g9EH%gpUJkp z@g{}#^1g1cjAEPD2++lmd*E-^KG$2zA(|R60i`#(Wh@wL&jTlmvJ`!rP-o}mU;44K zxT)l-CAX6^5f<8D0+pUoeeN!HTkedHFZxENf2sH+TC6Oal9)}IiyL|DnZ3pg@fu9h zKnUjXLKShFT^Z`nhvNU$jqjG=-~UMZs-`&;9XYh_;2pxQ`r;kECmK^4Eq77$X&a+f zN}0>HFaMS|pCj9rW@^W~%jlTd@b;0DP}`i@5%zZ?`d}g+_U)={68CHT8O@ziFxGul zarrsEDqOOqElT21$0!Zy9MAXqc< z2fxM}O}xlu_IFOj!9)8$e%wSQ?<{~fs&8ixV+UB`3=jUUQ65W|iQnL4bF`-X1>6v0 z+#N4CQK%0@U7bW%eu*jOh&PWd6k<3@5lfK{9{6oHXsK9(Xm;nt5Bb7_ed24&8~ZGb z&0NIe0_}vSVCCAKh&LLRq$%mKBMMe+ipR;!%szzUI%JX7D43^^nj6OJoNCztxGv(Q z6DqA==hn%wrd5<9=lZaYTjow=gIM_?iBc{Lw^CP|J`nA!$=yH`ZZrxY0C2dkyyI?j zP9R@|uN=n%$&Yj5_0vTj+V!IOEbM_UL1Kz+BTd@-Dy}#ApM@Io)nxPN6y4m@ggS$m zP$7b%f$wR&>_a)LOI8+HFhAEOxJzP5o~s%9;w0Gcrsk@eHF|RiVJ&K4_p-5J3c^=mWoP$Q(V||b5NP>v zKScAmol1|1?|4_yZ5abiuNudhXFlu^f4d$ui{MpUdO!|iLg`=N$&vQCuY+b4L;)h_ z=TexIG%*RrhHk8R*}=DZya&lHEKp64oibVYl_IcUr~#?+Ez8h!UJ$sK=h}AX>gVNH zj0zb5%9KVxY88kAiO5McQ7N4P{gG#@p#k4X-6W*QPKAxSqmLf;hm_DCSAE1JBzMp4 zUeN4!Qptt6)$IvWoBi+0oBnXc3V8(zME^;|=fln{H|lNx@E1Eps){Xbn&_14qMap} z)$Es4m#!dx^OB~3*!MX4BX`4pV|2R8+*_RGznWD+*ZOBg<0NOmq?X|@Mfaqhx%bRF z79YqYR+S8URay{Vb9M{9hq@;*C|L!H;z?*|*-r{NRMSr8KUM|bD$cvR>obq{43TVr z+V}Hk4Jm!xGb_7b?%dFCMl1XJLo_E?Dd_9BTaSh$gYx$h?0Tv2YZ;z9txm0J`bB{W zf-ePazl7VvTy@vUha;(1)I#2|AnW|~hwGw`?mI(TAg^0DwTeB#eh z*%nIBs-}%Nq=bR@YC39xf#+YkQ26QRmPs3rItO~7kwPvwS>rBj*wd`ts3}#Vj3D&yI~Tg=Xx==4_5{ErnA0v)$JVb# z2tFDzpNMQ6OAAd8C{#&myK?1=H#c;7glFHS!QbFi@o3wzSbGd28LxHgp}gCGsb-3X zUA{%R=7S3&Rm9P$8Y}P6A3Q^oy9-A!YvI(r>@WpGnNf9;%f9H7uoZ1*^fcyPuh$`rGyJBw)%imf8Bg^E>q;^ui!M0TmfVzkW@KZNWRWf z$ka+(0UFBO({?>y`Y}GUn&T56T%9jc#MAt*k2a(+;;4NReQ|MAklnm=My*P8jYRe$ z`4m%9I>nqf&S5$p$I-MDq&}1Q+U>2Xkz)ndws8xE%lWg>WMIkO{ak5h z+2Cb?ps3$AZi%ne2Wtk?@~O(N7q~>wMH;g?7KOW)12N1gkklKV!pKhI^VxT3^9JGS zk06Ws72=E}SkgO95^=y->@Z&Lp!vK#zu zLJg?xcGR3Vm=fRV)UgKtf=bGO;~$se`X;q4-aiU@_CB~!SKh#Fi#);FDp;%SwDcwd zhg&Vxp@*gxqJ>=z*#pzeorU892Pk^9OP&2#(+AF}AmyoMFDvc=Gjhgm=s; zJ*;g`1vWOpX~wp0HM59I6R%P%@G{lJA(5;FOnR)l6L_|^}SA&oPVHTf=RcZ&Vh*>3Az_`aO`rJ$E^TT@SbM5omHNLUk_1UlV*XER*?%D>r`C6+K zugwL|D`+-WEN^R$q$JK8@C5${0VQ3a3V_N}n%)a!^~Fq#Ye69(KLgc}L;O*$Jukcw zB|+FYiU0AF8|(@SPI0>8Qg|^r?8HFQCwX`Q;g#;*+Dk~0xo5X0LK_MSkVbUOOq%)p z_1?etNAQi5H(z5ay_00PRg9bkP}H#TKSAiRs(C{haor3SgP%I{++W`l?Gy@mJcR;X zQ|wPUCpKOQUA68O2S^p&>XjH_e;@SFRzVkL%`cD)JR5Q27kv$63N6N6ANMp9GHA%y z9oMVJDhE&xt1qX~8h_cIPIEx1dg~Y99+M93LgTHZkQ(^P%B0m;Csf5wx4U!macM+& zb`dJNSAZVq%k5(v;;V3a&SPDqy~wXpsb|OvKzBAkhT$&z$7bYB>=?BkMpVD6H~w3>ojfaGYazvA-qi|w9v(U^xc)Q0(n|mn;sbvM z9%*c0Uo$x-H3)gsm5X2Hwj^1Tcc(g9Vta5K6QI2uHt**5MP_+%+KFfoxS=YC8-L`j z692z?xa4G6WG*kj+rh8<2Y&Tj{Ouq99Yl?dL zmB^h|jsEp#o>mzTWRG2;DXvePPD7V}S<4lj z!OllEqlA@kEC%un8=+PZ6k+y{kB?(2ty(W~U+Ld-X0~^iMsTVm-6EHVEjmWiuTXZ(#Q+6cFHGaAsqJd0 zm!H#D*2$@$wH4_R_}?0eafzC4LjPD|9KUA$1yP#p7oO5Nj&KF2a|B;2871~B^m)B= z8ywV4vJX1nBuj%R>2?l!chVbt64&Cc*P`AW+KIPq`}Mu{?K0s{E$}~#cVJQvhE8J6 z`Mq8B(~whe86VEaJf-`2zD0={a1bDCK_tjTmbJ#?l@-Dfl_>hjlqeofZZ0aONT$V| zaOFjsj))BcenXW!SG$f-#p5}(eZPFets%LjmfwSA9-v+{)fQk03E-9xsc%gj8-^RG zouIc^)O+0aqpFGIg1uK`TPH0%S*j}@Ew_fNkw!RfS3kH+>{pAED}Q~Q>*l?1l{;O$ zK>*S=3jRKlp%q|+A&gw~=4>UsiORcwoH)IlmV zUKs7Mu)0?hc~oEr^~>4ns?ott?%j_UCyd=b3;i&FQXZ?|=?xeT^5D*Y`?0w%k#J%Z z_k&9Di3JzB3QuJVa?d;~pMh4OLIa)tbN zj^#DoF(|i^thQBqPM}e9z*pYqt(ftg5rCgpO$M+!0A=rT8i-xk%5Q|l37A;0Ci1TF zzAUm9;9^=HtA%VIUxRR6Xy$OuRozt~Wmk8&PrsCTc7R}JC0Q2nuupFGl~Tl-mgR*n zz926D0^FA zbd{IIfPrw3M_0=9+KvxF*wWS!6yJt@6ZECVo0-qW-Mg1{lIZ1h;8;`XMG-FFD zJ*?84JVo^j`CeR=NP>~DAIA*}?ODvt=+K0lt(Wq`L*J&{wp~(X8uz#=Uyyg(eOg}G z%INu=1@Ys>$HfD>yQ$nZzcr*DXVsW^f_u*8tW`^&Q*PU(d~Nyj{`ax!Z^Oc*@cU^e z*Kap4ERcl0n`+6D(lQnb(jvkUl_-_TmL{8RHA{;?CdR__v5K&jmrOluwGe-IJ%N6P zXL%+PhX>@duu^3Bhz2hoAuyxt>aa2e9AH`F8fa5HSmRRYxRAxVbA`Xb0upIh-AiR~ zIK#>!^HmfOm((;nwm@G$xxiGBmSNoRvF=6Ap9#3mKv}05xAUF+6nLDLVeq<2p+4VT zU;NiRMM*j;BS^Ej##uRGKOpzsIGD_nmj%t8F`+x>lua9{;~#tQ)xzAl-0qs4J{b06 z>Py-+8{nF2UNKgVkF}EP3q@70z#dUv2hf^VhNhM#w~F+0xE=02IPt~t<8`L{VIHv2 z^Vh^)jcFa{V)u-PURbJpr0U=9zM~ZB6EDy?dnzc9>V0462)7fQ*BIWnFqqm>uBx4! zQDaD6>r|34^4Ed}$^^sGAMWw8`t1N}x%pq$*pT8V?>z;-aYnUz@%B-+AfXm#D`VE3H&XB7VPUR0ikbZ0P0n8Tm(Nv;?=Gut5YjZV zct<`(7>5~0A`Dyglj%dMB~|F4rg?#xMV51s?STvVmi59Sk5MC0^-j}dFDy`t6_RJ= z=OwO*=vZ@%og!&Z(LMjH53F;^Z=LJaKZH+58Oq@OB=Ou01>G`=!xZ64_)`Rk$fjiWG+>t?qrr^AQ4 z{GROBJD^sY5798}?F{(mO84amzCgm*+l!X4^KO<_{@lvzQ9Zi@T3xS0`l zsTu~%?yfDk<4dQXb^9c~7ye&8)bum>iH?ezxa;@X(F4>se(bZN$}2pV(GXD|-<5Vp zBV6mT7B@6;%SS(lS@SI>C}M`YuwO{pt!f6=KYWO`x|hA>X~0UO$)wZL-zmFBDvAXqEJYi>Kxbzi3QyEN%&2u{D7Vlb9*L9PD80n%}bNLONV^ zidKf4DU@nFUDh#2DqR4~sxj5xp@ccN!zwJ4Pi`ID*yALFCoE{@4;}>ZE5;j zj%c#3z=|b65k3!ithy)(Tn`b2vTww6XI;+Ajoz{uz1?&5ezEE{~0!cG-c_D=>yAN@qkKMbL&hOW%8L5~bsF zCXUa{t0hgTWoNv!xS!Sei>5KMx!|(Goum5q6La(5ff8F0Fz7Bqqh>ZUwu+DdD!=2X zVPD^j6vPozN{aDYq6;1mRO~M3bE1lyUdD_!q!K9hh^ zBSh9JMLE&p5nLzij|y6~kWq}6XDUF6uC9AMP?)vv6X-}AY#kMRxR%8yQ~r%auX$YS zHXZpVN1ldy&tT>9;+2foy8nYeT<5$YYvpL2)~c}Sc6MF?f=NC;jAAU6FI>M1f`Y8_4F>r^8e@T3KzSIfMBnIHe*n87ZaD7 zTib8ODXuQi@x`4ItIk&Yqg54XL{o^nm&!z; zy>(`?xCPm(rT5=IJ=r2jo_U5GJ??#Td-tFYzc{qQUpIV{+J=jR>!m9uV;9~JNvdhv zdh-k~jvHQ!wxZ~_2>B6)ds*Ul2joQ6v zF{C(J?5lscLxu3He94Y}b_#JtVVogB7z0_lN2s++SFY%J{Da zR?egRE^e1sxHV{*Q)Ch((Cm4N%}Z6uO$J({$UuenO4ftV-+M}$`L^E53(QmQ@no8d zS#f&7>l;+ze~!OeOMeAAy#Fjwl51B!(*f~hs|UvCt^ zrSTT&~)lgHo6UR zXR4QhFObf5v%4MQz>KrJ6eeAONwu}(Tb3K91@FdI9H9TI_Ky_;_9#3LBFX-9n{OeX z>YU{<6A*CLP}dBRJyvMt9^L!2nNI-IpR>WzXrjU|!H*=+d0K*w!Ps=&&Z5jjO*Cf zUpJk(Qz}F&3FnM^-vgF^tj9og&L^CJU0g<<{o0pvl;Njgj^wJf;q8!>VQ&aJI^;|f7O{PnSn zz51fJIRaZLlIi~9qZtNg+H9__S!yZIpI^3!`ibvw8pr(@DlXi!-w>qR@a0ZU36KVm z(wQomsky}ZmM6hJ*LeAw3vfYh!~7HJU@;pH$-+8MSJ6S_NyT+sF#p`0VzDo#=lr|s zOc!oThUc2^>rb7{?s+g~#-q!=r_%ox?i)38x0~keNb7SOEr?JJ4bge5=73aZGh~z+ zyN(Qp;4t;GFvTuFZC`KNCju4F4k~-HQiwMOYz)DgAnw+&-E->uF@JO$WwY! zhB*I@ti0~j_xUA?RW+ojzvMrN#_zaC0)cVVCN8I?(YB(pZ1Li;JB(6~JBsOchU+Qv zs_6=+g5R(6e9&D-8*#ljZ13h44^Mr!oLcK*N!WdxF*eOdx_Y7S=NI(kTQ|~VK4p}nLJZ|KbN@eA-yKNx_y2E4M)rtg&+NS)_U7(; zjfjwBB_tK1NJE1%q9i0#C=r!XN>K@I3ZYOMG=$#Y*XNJlKR^GU*Y&#Roaghg&bc$Y z5AE%3*~Z0`>vS{glGxp1y215>8lUB6SkL}lq z{4*JnY^p_hFyFr`V@*Sq*e8MT+>k?whh(y?Po8*ocXch>SLSM^y%8sS&OO|gm{UOh z#*rX?J9MLMk*d>9d z<0@Q{f^DzF8lS)2y)|oAyKTK>k(>d4s(6g;!#)iy1NM`;7gmL`1;+Mxu@{V=xZ!0; z{sdd~;I+M1mrhvAahNt&g(b;8VTzFx3@%>2_S|nuw;(@bf47T*aMsUxvxSdVz7nQx&aPAV9>LBq9xp%4+C?+A6z0{ad- zRt~m0dMK;*InD4zRtEO7bv9;fY=88uvy9@YD$AuwkL)s8f7h>XS2!y=Ld?BCQShMZ zfPdO9?ME3Wr+#I$-}|}c@5HqVq5Iqesyw6YGZMnTZe7ypJ0S6~P4{Ei*fEL^k?Cy8 zxP@U^$5&_L?M(Sarp_hq?i0!yJecOdH^Sl6kjwV8D%2`w-SzwRUz9bz2&rf2R?m)za#%1+XF{X#!KNy&sG!Ryi#9z{(s`RNeNdT{wQ_HG#<(f<6~kMF zOSt$T*MX*hy&dMSK69$@L^Tc5If4=>exH+TmF62L9{rp6!piLjjT=^4tKJ{{b??T3 zvT?N+tWg8Udk0rEkKZ>xs#xn65XFBxm`flbyU|+c4kIlKsL2bK6mG%Uq2f&cktjT(9_eEh(op^d;<5UGraXo)uTim3ScT z;po+QaC*$3{lZG8{FROR2Qr4D#9tYv*l|be(b=_=h5fFn__KKXe9Z^N*Vc3Semu%0 za5Ask$WgwqTTrsKlf!2RTmA30tgzed61P9u%ePtF<8mAHxF?V+`nQK>@wD4xD)n<( zUh&ElufJ}@4VHUXItXV=a_{%_6F8f@=hfNh_zP^aBFTA*>=T{F+ydE;4|4E4i|qLS z`=MCzz0oBF-y_}kBf9^Y2OYV5+uwyfMEClqtCNY;w_)AO=-rg+;H%-=g4cJ%J-aq`eM6AB#!Y03g;M0 zP4`u*xody^6Uz6kN%XtUM$Tkmov*Bdx*hBp$D23ae!Xj-cZ~ldn@!d1-kAY1)oKUW zwNpY59GPZ|;*HK3tEj(l=m4sG>eT!X^NF47iqsal_ed?{5B-?&=|)PGw0bL|_qCU0 zSmhRdKh@`Qn||cJvXW6;*}9g8e&Q{U4^KEYMl;&IMtk(>-gK(=fa73t@$1B$-dwjd zwvM(S+0~0 zd;0Nns>y9f{ez?%8EdA5I9F*X3?9=R4OP$#Nx1wpG$FT<%>5wvD8P(xf{Za#jf0w`h%xM-&*>I@yz=swy_9bnj`~x93iY zR+O0EQtaLWj&6+|Eb(VKUWvlKq3g7hR*G8b?%!WLn6io`EUhk^yM;R=cVBIS_Z!tQ z_c5&s9+Gjp$VGqK&4u}4^A$!@MMJs6T20}F(w-{c*lw@=e+!?@ob5m2kI2z*r&O?U zN1kHiW)-k;yB%iZHqU0`)<|dLmQG>g=H1H1{bw^9_oq-c?pFb9+}$)b?pAL$?iv?1 z?jk!j?)~P(cmra*7BOC#7%xYRmmtOq5#v`7ghyLFQmF0Hkftf8S^Z?d&FZtyz*bi% z?lj~nEYU#vo3@~htG(dM;=f1ca{>qNvvc3cMtCYmubzJ3iLv~-h7>MW@EC+h-FeJ{ z{!Vu(_O&DgOYA&&Vq_h5za_mHI?cpIwF()|^>#?wP-O6M(HDUat@n^Y9SU8+#SB{i@g^02sDDE~+}4HFq=aVEdkVyEKU%gFa);>3+aFy^ z$=KN;czts*6Qt1Z59V0f*juy7IpHV3@p!$y!YV4pct@8*ACYl6`XX;>nKzu`p8t1C zYb`!JGYHi_>w^B4&!>;?b%09!!kB@S59*)EWEP$D!j$7tq0_N6FtS@N*(@{AHgs@j zT9h)Lmuu5SUF`99O6~f>BO0Ql&MUoY^To9v0qm412grTP=n`vj1vOhR@6?PbbU3d( z%yG2C_Gu=YMH3arXTDvzq3DUCJsUs2d1?>0u(JQA#$E72Lg&209THS@cc0UncYsD{ zhuO;#U)=Q;;?6t?{POD@xZS!MLcz%oOVo5AvVG5#&~6sS&8NQn)^Y`*B_B@?^FZpm ziH#{LOgs&rwQ(P?2LE2BW_}e9n(s<%=@MqbYfYDc-+Fs^dVSav^qYyJr;loe?xN#{ z)SGP^P5?B~OQlhnde|UeZ{&JG8j1UMXlsY)K~DLNr|()Dyt#QPpYtAI?fZ4D*|H68 zoEcACc4lJG^^CaJkT>r9U8Qzboeojv$c;$}2HMvb7~K)^MN!D$l@-G*JiRvAI=P;P zn>#smoO|f__Q5pqrzr*E4gpz>12hcRoYb2AB#o6Tm10e=QSoc*n-u$VG|WyZd$Dx9 zP`0h$*QZcvjCPzqwQ7lk>`)y`8wXLCiPrnyQSiW%E1s%X<26*wUACzZ&^h*x3!#BUU z?F*WYu$CH3(Z6Vl{Hu|EFZmsDG4#I`MjT{xL>$}5zR?=b6FDx|d$Ztr-uT^*&7L@S z>3Ph`N($KjT?rWsrXu~COI?E|363$l!r$_{<6^c6#kPoe-@5hR_U~YVzcRB+Q`Z~0 zB~LiGo-iRHc9yCq~owOSb%pjD?=ULoU(zOP8} z4i8uwDSY};>;qoe>e@txH~71SK700g;&0)(j^bWReBCyb*>KkoFViCu8rCuKBV%00 z^2u+zZ9)DM0Tu>`;vL?acUTF{Yfks^jI*#(K)F(Vvp1rQYBrYd1m>@r^}8N(#Z~$$ zy(jM|i21GMlg-UQ$8)Z#_Cny{w%neIT646n++j%?I)fJJv}*ZD@Fa!04s#4CJsW zi*!~o5l9g+x6PD*W=&E%DaZ-Tx`)>(D;VfU;gaIiTK%L31yYhwWp<+mGKmBZZPk zKznoOI#3SFW-=fg_I8;SWR8^K&vy50jBtOw)%9CRL_NEwA0_$L9IX1Xo{DBBEagg1 z=q!n$PfBT4teA>bch!Oh4;o;f)zk4*A!1+nz$d`k75)#mzOH#9gx?2Ca^tTu;qO$V zBsgG(cD{@48NyU(50&k`e%Jx}d80-hEhPN6Uyxl+orT`6whv9jeVdewF4B?-KsSup zq8hA@?EcpK|J|{Gtu0qE+k`l*BE@W6TTO9R_1f>DSzmDN5>F0ZLqm2}*;s{{8%|HH z3Y4%VV@>(vJ!SFUc=Y~pnR~S+>Q(G(?hYv7Mpu|lM~u89w-=VKuyOK)Z29#1^I@J-#T#}Uig z$MhFBy2DiA?(ZC9WjyVmeikP7XO#_8ps2$ela16B3O+Olg!_g+`A!8t`F6~O7tV-t z+Ehm6vPG6`LB^drb%@n5cBWUeP+nkiw6@6>yAN!haa|8|xaL~T&bncjXHC<-L?2vQ z{pjrxngb&E&mJ%)Zhw9DZSoOg-VBv$&}>-ji{r<#^VjHDjf3 zf(RxOhJK&@W{cc_|fYt0Z<#%sM*ctaUL~E55Izn4c zrErmyNSbU6E8NLy3Wyg(HLRkrW51_Uwl_dC{(#_g{nW>kFeb%>h1YR&8Ho} zb;Fq#%Y>`(Ir*^fAzdMCPj+gr>2}9dXHlfeEjn(V`1&;Vpc}eOt1nr*GV$d{z(ch# zVtsbKqnc2i@l;Ukw#Rt~c$b-u4ew!sxj*={={g78J;U1RDd+~}%8*wt?lN%p3`3TO zLc!@<+WilC8Sp7^x+O#ORhJh%!gD!pC_CL~5;n^~z`e-g!Z8*sj@-I<^Ak`$=SE+{ zq+_t0XP{7L+^)~ULs9Pn5LTLU{=BIV;`gL9?UbTGebd7ItECPYUKO6@zlH?s^qj_Y zX$JTne`}rJ=>~cEq}S{P`WV&B+qFDT#_x82jV&Au#J%Q?Xw4_VgLmE`i@}YZ%iK#d z@+lwX^VC&V_jEVd=sVYF-d1p6m4ydtMG8tU}1aPkO8 z#YS-)yAs|oy~PdX2`{&8t+m1YZkZP=mmJ~x#_M`~fGR5Yehuqu`egUR@Sl5NuRT`v zg&m2DqvG59(!BMVBs|VIz4?%gFPg__B01kI(YwHY?z*)D3dZ+u+{EULUb!E>+<6W# zx7Qne94enhmjHxa3hG&9dnoPSl zl(-_9U)ShES!9LrVO|2aa?8A)$)aN8c*xcbcf4@nUM?eOl#2K}5tZYbKG=}4#7^7h zfU91WXSYXFaWq3BjkQGwFSD<|7~C#_5YnTdgdj3V9EpPKhzo6uR01b1J*GqV@4Ah< z9(p2Zhe!*LA@O{&(4Q(k3h4b2(($jU;8GKi`$rwIi(}n?IjP4)^{AhWB0mXx-D_TC zDU%T6tfsW0jRqHOsZ{+U9{e~a9Vo7Agyrfhn@!hH5Ejqan`rC?-{oMA$H&PinJAXi z{zAjszN4Buy_})(qUZAXq64a(M`TtJIJ&2^*g;Q=37c*IoaLl#(KjQ-u5g@ztQ!X> zUI}_3%rwH{oQONN83gUVQb0zV(^}pU3oitj{&E&!_dxViYMl5L8h!*V@qGO5h?=!U z>kK}S!CT;wPyR7z_wVPAKeovx;0#Efu<7>2XoSxVEs_H!9Xfqw%9+?5HEY=TlY&jR zT-*LdTEStnP572ffH@!Ff6|$#tMub4CD%hTyGxQ2CZg0m+$XJUNGW9;;&F@BkSjl@v)mx+~7DOzu41 z<%!mu8$Rw73%rRRziY?&@TX|(N0g8op0ubQyP-`&37QX?`jLozmH8@o z-V{Tk7au;pax7rI2R8{8*t}M4j?9G+! zUHUY8$Kg?fNJtjlkc+CIOIyE>{kB==9IOlW0I`TUKI^r|JM$;RmP;o4J z^gh`NlN;)mLSFcwtlSy_uSsD0Z&v$XHxpMaFY>?t!opHeheZr09g-TEBbj^G!0F}1 zEsMHj2p|2immFvXNe5YPpEp#ja7wfzxqW@^@wM-^UZO{s)M<7`k=r!D%V*FZ{lES=t9W zMXIgyUzjKj@v2KH_Jp^0;^UP4bl5~MCI1;#0CC}@{6|MRu^#Vky(UhV58 zT(g;@)@x@BY?L^or*45oWAj_V(+-#kn5YvM^u&md&(SJpJ!G+w3UqW`QU1ZoMDLX+ z)`uvnOB~ihvS;d@OBXHRT3A@P0Bb7w^lMsHWjUbg`9+oLc0HI@pyDK=C>ujc){=u_lKW zo?ip%+sIS4zI4RIH1|IEYK2nTrSN2Fd%O`5vEmY7K|X|;o<3rSI~R@AE)qO0K0Cn2 znaddLR$MA$H(l}bu|PN%!B=(k+V822X` z#q})m3=mwyq2zzf0j>Vk_ZqSoh_U!-+ulWk#j*dyR&F%JGl{cw8>S*_a3Wo|IIi#pBIWVk-fiOtMl zp!ZEh+xJo?{+O2h{0tKI*k1qS%WDRG4qDBbZC*IA`R${do7{2Y?_Z&TbSB=4Ogvuc zKt|>F-D=wwY{BXaHGG-e_^R}E-#Z!7??ZVX%v4 zK50aS4ZT03=`3etZei>*`k$QHG~{~xyqqPBn9#h7pe%XsYMk5~$3DG4u#pA*3) znn5^;MTMtv;^r$95|pIZcgdY+p)X`$t)l=F`Xy5Aep`ut|0=jS^{^`TaoryGdO+as zgsf*a=dAGH{l$re4j-74?L{Yrbn#*|;GWcDQ&ue*8Dm5(?eWpWg#WlGVl}!9I=aKxQv|tywg0=07zCEsg{TuYY zl7v9%8-I^VI1=kTa3<@iAwrwZ^}c1gL*z%)?SBL=;ac2qQi;$x-a7nRy--HQ0_k-i zoxs(_R}(vYo|7;v#>coeZ-dZ&+P4mAXI$cn4k&>GastG^%M<&B%azNJ?V}0q1xN}C zv|6A#t5jgiCL0V*Kik35cEjAI@2eGZ`Oy;SwU9)7AFFsjhpDc0L+#_ar1^8wcycm4 z`YF*L1DzeWYZH1WD|q$$*(ZRV<33yUx9f0vi}ZTy%MKVjl3*`!mcVT-HtLg>G@PI7 zqeOgKu;WwSFChjSxK&CV`KLffR!7D_f3iKw_F8<9kuyVNL z{Ed=7nY$Y!b;|+MYio_s*MBbexdRCm7oN^tBlO|(>k9&(wURMsPBVWcO2##{b?P<) z`naQ-G{o{@plU+VyY?)xeiDWAIYI~>5Cc#!?l zb|18dUAXjjmm#FOOxmZ!Uf8W)FXQi<_{i=?xiHT@83qh(|IArinPb(3%J~~X6sYR! z*N%3%1gbpNZ{psULB@amNmJfSw%R=<( zA!_tNM`)TPPx>Z0f#-RqsHvnoQuHqEPrt~3Wa4@5^UVtI`100XX{9BOk$xE^Yx6*9 zpVN?bKLeT}Wl5^TCJ;K{uh@G+8DiwATk_|0VOka6yxeAwt$ic?5g%DlQUB$hb&-M} ze8H=``RS-+^7pOK^+oLcuIciZ+5I z4E&6)I_2Ym4R?Z-+{?vq;Cw+sb_5LvT;c{?bVv}`sN%t?_}PwG{IOE|ygl|Go_f6h zhZ`1!OLi%xn8Gf!fm?TvDN6s-%J1J{i3IuKo(@qGzJGJ#w%Sa>j~%QZtSvrB@Z-A4 zQACGT&xXBO%IfI#Gu5+SX91_bkF!SlEb!mIjSH+juBi3Tp7!40i(=E)(L;s~khn|x z@?M0P_n23F@9OEev|BO2<_iT!^2=?)v^_FEY7e9F*hD?qlyr2upR_zZ5Kiqpr3!(vQt>ma1^vF`J37*amgoCBXHx$jd67{|I_;^FO2_Ga zyX7p|6+y0#y5V0!Lha?STfF9tZ&IfIBJS=$3o%4N9)ZyY{mxs5Fsi@h$GAmiu3vvI&soV5Y(VZ%GPsG3) zCqqV$vKcs`-~oT>y-&`#d0qL!wH`8>Y(|a`UU!5q`*%_8P9|>uu4k~wgr87w_uX4R z24++i$a^Gc(2~pc_)x-+-#k)B^%jXbyjAk}^*3}hrb$b*miplKe_hw3`E-!7^>Ry_ zy(5}_`H1H1QXxF~%Qhz316D=8r$nNCQSs&DipK&}+~*2donlUd?p3)u z4x)aT7Om2poB5L*=5lZvYLJ8 zl_m&XX;CnGAG;m4gwI)x%{k-kLAm%JGxGROSFJ23`d6V;!^L)@PDDlQSb6#>2}hzM zZcc0<;jHYpKT-8S*Oj{ct7-{+a^=yV%iARI%W2zhzh+-#En59aDqtaaJGTsP1C{VW z*!TVPWTCZqD6__V&hB%9HBh0y!L zSGdjcgPm^7!bR~- z^L7pzm874iNjSdog&yye8wOT>s0o>NhK#Jv^XyGT{c5)A)Ga1KKXUrfu%R=OMppbG zZFa}^As@L{b9$&4<70dqrtb8NWStbiThs;V{Q$)AjempJ^g;YX7alLSfv~V1GaJiiEE>v?FFOJEE>8 zy_2=m9OCm&xq9-%aal;8XUh`?Jgx>g_N=4g@q5Js3qPH)B_aR0h${_))9oIPUmfv& z(PP9ghZ8pxPTu=?)e6D$duQKWS3#b`Dq)jm3&`%iW@vSS&|$Kc6!%0B{@~Gz5$~xK z1guS}uDGa&9Dy@Rdv=Ip@yol#zG*kCG)YMFed~pxk0&+qgtd`5e&uqeA({V0|6aimM|-dXL!4ON~xYp7VTkXUGlrQ#XY=STeBS@n4@) z0rCIm8~nDs>W1HWwuVxf0doW`(-_i^?q%9;i zlUANGLde(4hjMR`&}e$srk}uV+pUtT&-pVky6j)-C+vn1@ehtU4~g-|T)WjYec|BM zH*v{;3TB17+58(L{ODZbbiCkRMTXe#=7uPM_z7jYxxnR(N&`WZbE@nuw46)6YB9#7x zLFmFoH;!=Xg5%>{oBU^YVt+q-_)*RPbK2h&<*S`x&}BCBUyL;pyB=IC)+0l{PEMjW z%n&>8CRtM+6MjnAfaffmH&!yw8lC3uyTCVSXi{*KW?Ae8(@#!ii^=Eu~@%Xa{{QKH0~>&X5d? zGchhudM?srTx^85+JE=HzGr~CPvQ5|54geH;cL!{Oi!@#_H8oiv_Q@R+u$ZJkp8g2 zw#V2N>#~cFrx1QwjKgs~37RKJ;``3Bi+bRM&!w{>-#sueHkZ%+$OXGZr&qmd(kH&Z zE|VD!I-U%3A6C&Ld?CwCL1q4gKUhC~CV!X))vD&E=g~q4UKuMnHDQS1$lH$oTPP@4 z72^1JAHiSEm~Dej&N$-X_3u0}zrGybe$2~}&^b0fxVG8`4b>;Em~C{0N&NlB*Zh{) zwb}F8`D6+_gEp;;oTK58sj9!&R-!+CS5FHubivu*YnDO?9ZB+d)RNMuFNCh!@x8Ei z#;eP5+HEmzI7wUA!T-Y<4^=u=hI=s~;Ch30GKHv1=7R@bmAb>c^j<=nkTNc{?bW*P zYJ#$cBY8iU&GEF>pf2RTJ%PJZPkj^jfLNCDXHh~2&0iy*8u^BS4L+@`f^)vG3!6$$ zB&i{Lr}0$a0O9Yw>GbT$7DM}=Uc zwTX!k_n6d7A8ELm^xTR6;fn;vTCcz6EVy^n?@(9s!TZ-^2Tr^+fpK2i!pG)>&|KdNc>EMYQ2iOm}|6-tK`unYGzH8xm_Hq34JuLX~*Xe8UQ}DgB zRYu^PCw|cvRL$auy4pGzr{&eBcZ%pTMSyKsN}Nt-gq0^;fs?|I_d9L7=SqHrR7WL+xkbCLk({F zC>apBz@Om_Yww)33zvLgveom`Kv?ofMFw{nMkT}{WyO1Ece8kR8gzx8Sxfs@seQhQBR zm7#2!v3$Ip0?VAj`Mqi@aXZc>degDBFiN*!UM6t$;PajicLEn$X5Ww6wTp(88syb7 zFDYowF|Mfq5RsnGC^He36GhQ$3(zD++$lBOFdRIwHvJ|8g^gan zj{VX{LiP2ipchQM&i$(PdYp=#bmxhfYZUBKDdiiiB|~m~8^>ie8h8g;&VMDHa9a6h z*n4ktC_LXTDlYGdny6#%xBj$8+@|DN-Dw339`=#2y1|4{!}8~2&7zpN=pawec8Be> z)cf22?BJc>GJ7$Mj`Uaa{~et-MABIfS>Zk+e_@+A+f+<}?y-X>RoED~Afc^!dCChF z&i-3$j1)l|T^?Lq;|eSNb>`mkE^ugeSMd7x!%ob~cWgLgMCJ0UGkyV|Zszd1IVgJxx7w4HS>+oIgY4 zLO5Q2HfbR6AD3!XKAFfvbO!Hw?QAH8;)v59Mx7in;NGzIhbs$pG5hTNHj|-YTGO)Q zk|fgp^u%8emw{z~!2Hfd3F7-GQ}{^eih9eRlXmPOd@Lo;EQ@YUq#f)tz2RU3lb)>E zk@lI&?C6olWrQZ+G?{rR|A-^hPrr^kGvWkY(Sdixr5;fEV#S}W4K&5v zdbIPI4g|`QQhv#iu~MfzPiZxgA6WWqQ!h>f>y*a&IKnTwEAb?=ZiwIoyk(he5oS>I z+qG12lZI!FGXuZBTB3i$U0oF&AJ9t;*V?Etu(_&ZZJ#i~pA9ce^Io^b$jb`8=Jr)-%xK}*rm;I)m@de36cjybLCn+9igm`{ZBP}n$?u<(9en+BjNcG? z&m%qm6=xnRA$~?tsJPJ%Mw^~irrmJEm(}XU$q|Hq{xf95*+3U`JBNvVfA58UuC3qh zRZAhx_p;tO4hL+JF5h1=;fdq z=6atKB-l3}_{m9vduvnga6Jt|=S0d|_j`+Ix>w>)A>cwd{pHpES8i+bo9FYKN6 z>07Qf!FJ7q!QA$mCBBqg%@SpIhl&>O>>ZcScD1*zi1g~Spw_XOQgoSy zkA^IM(MB7bOYk;5%p5uY!k8x7-0?xQC zEO;QT&;Um-oBFPcawYVcH;soJT`|ll5w)!00EOltv&0}mj}KZ(aNzSm%+M*^qNrg} zt53}|kKi{7JvnoPU!)|*J5scd4?Nd#D*BWUezOnEGFZCUZ!G!cXR8wAbe}hDCv=ZY zp3Ad&8qP3IIbm_=E|F(=YbbU6hdj0h=#TO~r6HHINiU8V-llV zR0y1z@psZLm<*FwTXHAngb-P{{|a8Q2;L(&qtr{oACo&D9d?kgTZTvO-xC%D$v6L+ zI}$l7(Ugj@TNF6*S>}kOyAk<`u4^A@swj)h5PwAEUqLKv;Jt0Ck*51UIMGk;Pa187hR(O@j&C3 zorFHW^oV<}(|{owS)ws@{baCLSBd$ZHN=ao!u~VdreLc%>6&Os)EDZyn;rH<9j`3# zJv(j%4UK_KM+jd)@2J&jXHR?Z*~X9j-lGo}(XFR;{JPn2=C;rtMc_V## z?OzE+TZ{%hmQpgL;5GNodmZun6Hn{QMiz9dNhZSYXy|0wDrQ|*h0@{{BjZUU@Nlo;K0o6QEAoNFZA5)3 zewe0wB-IN0r;nLVIuOsb$txA20G&=Pwl;@IP_{ku^sT=Of;F}nn5$Bex;fnOWRX4m zxKpBqX+*wbQNSXf;)Sah-j9p65nl7__=q@8y+Bw5j*SiT?=2+&Tg}$s$+AShMsrdH#^;|h&(RB-{}jv*|W%G z;k|_>FQ*UTLnsGsTCYKYO?pmx?IHydly4);&cyym6A?Up(iJ1G^A`fC?g$n7@#)$l z213(hcCZVR5!NYn#byjUOs8WDqQqRWuSp{tU-1|7mj9AZ3Tc!+%yqLiB_AJV{ z8)`Hy9^RIg!NhIJPT?)mD2smU?`|mLEUTr`7WGWMff2s8vOPFKpK~dFOVqJ!BV+r5M6oDY)QNL>l8O}eq zC4EsPe7Yx}w-grHo#pXNL>TN(od4=WiI^X9X2O)RFIu=&*}0pIFflu@a=-IB zh_#&gnL*&X?&Di%sogI4d;aTF#}YcO1?7HGxkthWvg??}2P2%m5&gaKo;Muxf8J{K zVIq3Jy7`X7G#EW}b_%bz#Q9(EY4Sua%bW}>}uJ^zbeflx$rARz3quG%wM#dLq{+e6U+eg~-b|xMoWcb=)JnY)<|HK`Zb~zAl{;9blf1AAQZo*&rl|OU1@ev8R z?%Oyg2z~lna*Rjh0ZWAYpYVJm>;((O+7VN4GJJi$TqXY|@+t4S^!+9+@$Hz%+ps7n z#2x3mEqK=lm7G;(K7)jxwMpObCy}?`aO6|VK51DTs?-(rQFO$gT~1*~vl+Nk@cVOa z91DlFxVwZxnfUJT%{HIlpYAsHYQC3zF{G?;|852qzG+;#Mw3MTZ*Rvl8!vBcwU`WZ zA#@6xyH_ui1zCXm-C?dLgx@7S-}-(bf{uaRE7zphJ0bH>BFD97R?un<-KF}>8Vhlw z3!^MTFVL)Uvv|OQ()7!WEH*v3_~hL#)?=YVsCq`@zB3NY*oRgUbwqJGzWi4hk?;09 zewa`7m)-2p;U^z=GT^L63uS+$1E1#5nBr?bc$grv#^;JPzIJRCS|W064`9{Iy`AtM zMBYys)KlSu%fg!M^LC>L)v}Vks91Zr@n2wpCyq=V5dEB@h={2uHo-0uM*fY@d?;nW zg=fRkNh=TB{K3!8l%rsG-|qbRIXh4t1ikhju|$dfsm-25-YA5XP%`qv6<)~~d@~AZ zXln8vcF~o?z7LljHzyc_UsaLPmqCNW%^7XCYJ$&ilo6?Gpx~Pn^O62$FFf~eGgBe- zZ$YluJiT?62yEU{6n>S+@pgwdE*Se@UAfZRZ^Ze7=kJb09_(TvP|joUXAVK%uipJM zyu^ap2KS#eMBl$Sxuwl?zcYNVeV3iu&%oTT0|(s*-kUiX@@hGegg+YF4(M07hVANCYu=90AguaYkw=%< zS8=Y;BYZO-6`r6YhJ=6Enbajl=<(TNPkv>@`ye3NZYU+*3oCcV3fB|;;*P!Ixo;cQ zz+=>IoX6!2ZK1fUvOzTb++7}d!Nv!lb(*p@0!`t2G*6uSB@Gvuf9xF_2w&i3H=AgY zFUDOYFZ?ejb*bz{h!CMObzC++R@~`?g|)stmvxk|*OE=oh>!3`mIqw6OS%cy5Z*9LT%|jI!07?=a*h^LeiYAAxX;_B4<9x zOlDf(J4dXAdm9Uy?mrtJPg5Zn-bN0nbikjNq1I#RHc)x}L41PX9layDk6seFxr4t) zp6tI5@bq|I(di}X&xd`gu|rH$o+x%Nu~Edq?*|%QZxelMr92c*&8N$Dw68)s# z5{$onf!k9(P}ZY+Ri@t`^W`BYoQarB;x8r6SBO90=6vUk>iezU0SPwfTuzXxt|IiL=6xH|2)*z@ znR;gL8E@>^lp~lhr-_MaPpbfD0j&7gGWc&hvHz*Ngd5}C(P(X)=X!oE_N=%!Hxo|y zzwM&+kF|&#^xcpCI|#gO>B-;RN8}V$5AscFZ1TX}eM6x&-+j=~-#wwe!Vqu7uTDMO z;f@<3ouu+m0{5R0XO2heVT;atOVBAWj*d;P3nci%L9+UV`?k2@CwiXEc-pQ|yTg>* zkBrYLF2YIN)+nhIcAohrjXZAW9UoTPAn`S6!uP5y5)Vl`ltvThI;PIe-6C*m!HO0K ztD}U^VB#W3DR9N3a1rIgA^?YEPvLFT5q|BIaxA{O`v?8ToKLy=E zL**Op8zL}eL38=t54$TC4}?Wuli(D8Jm|5vE(YdO-~I30M%dvT<5z^wBe}!kXoSD9lgL|uI$CvnDG6ojr*&2~R9*8{ql*~u4fGw{-mAxu+LM)tz0hu$0L zIKJEVVri>AO8Z|_+#u?M;>ZetivvF3yxXz(=B*UWW%kO>6ZNp{OC$Z*yfdDtPOaEZ z_&!&hH@;{nR>6<8`gZ&iu5dSBVUqtsAMZCjlTlpl0dKY|)|cJ_B;|ZS?Hy$N%W)kF_kW52T@O=B&U;qHi;_+ZB%QpkSNo&!4{2bhKSQu)5pH6QZ~8 zTSXNU&q+O2ee01b7S(rLNIOpG&!cO<#cx=PL)A|wiM!`vzJ{tTvPk&5*11bJna1$2 z|KWB;i-aM~SDpA}gzwj$R1_W|aDnna5t=Ro2E9N3T`e_&-j$81JC3YFz3O^uhJ-Nq z{*&drqoD&2HrXdeHB^+ybr~%FB%^1q|7F(E3k)*P;bVbf-r?ntW>pruSQ5Sw8sw*23sU0I*kJBbSl4_FG_ zvt`5=8Xe(vBMEEp??dW^M_DvfcJP^%q_V*FW5DJmKOZW(7Pe;-{is?@OS=`l$G?xhPLBEm{m{xzx(ZAtay(5E&;|b|kB#%R70_>glEGTe z0un6xt1XnBKv+!Hcj>A+JgR1T-grR{IvEex4<;D^+s)yJI&}Cw4loMc!`y_+zgy2X zItfrDPcZjCM}XY0^MMhVJ4-3%Rk0OxfX0XMI`n?#pkDP=Xz+|ZNLtpsqwsMAkAm;7 zBhfdd`|!!q1I(?gsc+FAd*}pwv@yo_r>$X&Pt$ET!4Ynl?k6J~vx51fK8$lphVc2# zS5Cn}%m=m0=JVadd9%LCbRX3|*kxyWweKMj#CHqiAImzzk=F)4a`ET3{~Lw=S{*p4 zOjlYh&I9$_lV8blF&}kLVIf1&7CsB;loR(EfV`u#Na7~ywzKZ;BQZu0V_<$s2j^J^ zYHIWJ$%e30buZ&`yBKtI`BJj}!|(HGpQwKsGmJgaeEU+v0b~;?Sx<}*p`+yF-&Iuf ze4dGV^*&L9%h!$DC)+7ORXjlZew_fovzW)>MVK2~(tMMxDG!kYbnjmI*aKU%xakF3 zeGrcF5*9mV4sF?G{VC#RP`Xzir}T;e><0_PqVasbO?daWSce)o?U+Rw=?!3@JDa!X z1m=M)Lqk?5HNc1@b6V+}GE{C7-yI0hha0!Ub>`NIkP@CpNve(S?@hLM!Rt;i>Pqpw zJ5LWddS-s-wCcg%X>X7B{|SN^x%b!d{Z{azMK_f#(hBk;&hW%y->W>=UK)jS_}#|k zB&R_YSiMY1H1;=uOY2mbq91KRhqv0|IEgM0js&W9m^nh7n{1QkVLND<^v?Wp+Zc{G z`013G0`#PXTK&0f4LlEC=C82u!e>#{|HP+JM^|Fo|C!GYLQfy+zJFX5a_-V4jL#53 zYEXa2Vp0zn?zugAoofg}?^cT@x>cZ*&OC?S|DoR7ctz#9H6mPv4DJHl4{`<-FT zwQPMB7_BTefbhzm$ffgq5OhhTgypXT^aT*@n$g!`ohQ)S$!LvvH4bl14}16|D(+VC z%NY8S+dEtE`P0p>KA?ef-!vX&`e@9hrPAlUszN^#>z(WQ-t4mAt`Th`m?H}kpX1jx zXRM%}Z!hI5tspqQmgqMubA+7Pw`nz)ZzjFb9P&j|4hpF@V-MlH!o#z(VPaPta^0WV zTDoz9_PKJ|Y<(-}=3_5mz!;Qvt;-GGa5XqIkbkjU)(!-jf$v}o5hBZT72Hp&f}faG zraI1RpV#sbX7Ik33_khjKLS9C;EH?Z02eeoiTnH+^XEOk-jq%d9HAwt_Kv6#)^YLM zcFilcFk0*B6?xVM=eO);yH9K(TB**08}CPY$+nd99{NCU@;QvE-vsQsAGf~#jrnQs zSNGiN9pS~=laQu08~9`9d}&?X1|ED@De6UCdGPj`68;%SDDeu-GJK~C8z;piuPjP} zvdnqP&hO^H&iU=bXpk=4U|b0Kb$|hAAI`-GqdvX;j-sRDmJJ9u`kEyfU>$$|?lkun z0Nc7)SdpX=yjCHu)>2@O_}QI>p-bAZJsNn!sF4WrlA9%tE#?r_=R8OIhaEP5AF#1G zYYk@t>8DuzG2iaQIwGEL2)$nAhmR?n!Q^E#NzE16PSHh zanCtlAGZJ4zexXO4h6GEPnvDn0=>?Eu}me_@Ll%J3H{$%a4kyW{+)UJy!fNFUl-Z} zWAWL^vEhS|-jyP*!mbR{-jgS2Qyn`x z_lgK*YhG8Tugc(}8jrgQHAG0J7T!4?E)T6#zt}+=btUo(mpf2jJ(2e+B)`KPsMUQY zCA7prEmXaOesUkgjhFRGU_TNfy?bs9_dqv4E%Bnqye?1TbJx{8ymuV-1`G)D=m$I- zY&a?if6@lb9_yg~&@Zj5ENlX5gH*2)-eR9;_)S5p0CPd^6kcl&)FB*;EK4CLVE$B- z!xE?qa(R*oW+x26YbaZ|;G8r}CLFtSAzmD!K7OLx+#$l@%a^a5QPhL%VKNG@UI6!nJ%h}O~=$mTF(KKhrymO{(-(d=4AZ@3eb_r1fL;n%FeVWz~ zsyP-UFKd;LkKfx_B9^izLLl$d*F3oeC=H+z2afTgEYg!}Do0-vOW zWIE2vI6HjLklwZhzS|r(H_;D%_3{Guiw+AApXaLHNppfPO)32vIRC8IZ){5@9)e6g zmjDjaL4wYp%BsEw>7kF8;2!sQnG)QnvoA0DnLxH8+wajY77%~A%cV=$2_7ab1~v=Jf!NAd zF?vgL;9F*~@o={Qp^oeK__=IAG1ad1?`3`1jBxk;)PQp&?i0QO-?X6h4b6qv57H1= z$h+)=b;LCPzG&&UmO$hG%xXu-3Y_l$wz+@R98^WNB8k3uzScHb0?x-;-EH<3K5Bz* zXx&|bY*WzI>g`&)$Ou zwh`?d^g|zflH)V(r1C?ATGc-toU0aChw>;J8AE3B`QzD!N>FBYL7x1zB!tJ6-1^Wr zOL+gaFst=~CK!%01q@6Jpbv%SXWoVx2;5rzxP^WsyRycs?_CMtRznxS#AFXz)VFa+ zst2+E31_^}wFew4nfGd20>$AY8y!wgVBlC}5zJr!cehVJDfX~~`;5X=9Z~38HV*DS zm7)sQm-p+ZqCUyhlnaOTFozo%8mrQ54*fYVn0MQed%-rmKh%!~#0R2>r z_HygiFmuSXwC4aR zyUp?+(NFAG)cS5zQybcc7KAg==i>b_c!>~)e&!b26C#b;kn-IpBZJEbzyB=yyVgW# zZacxo_S_Is+!~Y_vu)r6yO;CCiUA~9?n?KdURtZ!CD|8F1e2qzE0(j?FjygalMz2( zdJ6fE>XVM}T--jQm%#$2*z-|iGKDCgPp!r0h_F~Qz3)$j9_T5O@4bG3zENU@yP+b! z?*py-H>S`xR4?H7|2kW`S|YZ?+8VeXu{*12qQ0+fG}GB>jrwVr&(b$pDBTqu zmR0(@3g{2bs#Cq{_gxVltY7d7yG9Kk&X)6^U~>X(gWuv>OV$wglrX-ftO*76InLbo zwITQYR^%&EOW^fCKynQ0uem2>Ydrnp@N?d5!^Of1+8M=kVrYp#PSqB`JoBM*G_n~?4U1`3!ZX#$${4SlS}bOozTadmdEps2shu`bG2s5qR*r% zqR|4+_Z5cF{NtuTv!O!u9DVjjcQQ(@@Cd_+)MJ!MZ_T0Ouh_AW0VlAa8hWaepaP9y zr6I>y4Z$fieW17t>j27k6!GEcPxN@?D;{nRPu(NxN07h5e0rnkyR#X*Qg~1lx)z2&UmCfntNy<*Kw`s^1~8AqLkr)^17_|MC`GUzyruW$ zJ#CUb+&Rjmf9awH(D2tiw`2xb@O6H*v#9_ih9#Q<#!hg-LNDKjnG1$Yk9CF~bAmzp z{PA1T_F!Y`K&k7Fxpu>bom0*>zW^-Z9udEucqS`ab~ix zo^++c+8*b?9(!Czyp4f3k}G^@SsQ-H^)b1Xivs039p^Ee1Ap2oIm6E-2Fm+mkI$%> zf&x_`_jrmBZ7)rF{h9;l2^%Z3EJ(uZE!!WO z=nwc2)|?qsDG%i;4irbJ#K9?SUjDuV>NV-gwacogR|T9TxYbyKK%*hs(+op!r}u8X zkb$|<0`_;*c)#sASZeTJM*qlU@42%x^2l9^y5@Y42udLY=7uBsup0KDFzp%v&S*JW z7~x!hdC1u~<;g*Kt$?cr&znHz6lcA-fIRqYiZcCw4*dMoHyu(h2hcd!yt!}57_9w| z>b?X^D;zPwx3&w`9Lp_lwdjL5g z(k3N!KNRtvnXcfYwFKMD5oZetCwP2eWoP(^I<%jE(aaHI2@M4GLywc`;J`xLWAEp- zuz2IN`?-ApU3S-p+Q#)Es*FtXgQo;Mj*vUK6zv4dxL$&amuoV)2 z)e8AKns)#3-SCoyf67G{pIkD4v?k8et2X$H{d>eDrGWgVOC}I^+5w6aSl7A@D8NA? zi=+*GeO-GS_y2QYfZ#>pUtd^ISN|UWy}JnOGVMll5_Tf6PGvKE^WuUokM3rUN>do3 z+xdGhUk089^|+Na@W39&x~F881K9SR)$#Q)ghZmwCnHyNm>DajqQ+cUP+;?s)i8cY zh>?Bfi2hi^ajUd$%sGbBiB_d+Nfs_h7#DpgGLNRmS>NsY8WVvBa$` zYj}6!USjNu0+?TVFVK3#5c@U~hgIZr9PyIvT~^cww$CZYQYDxmm$}>dQno#~G%C*; z;lvM9Z5<%B-944T7_`!Oe#zVFmD2N5htzdoI|G=b4vHLv>9b|6Wg z+~rcj4^3rzuL)P|VC1sWX7V`zS)6!g9J&>`>A^- za8#q!hC7P}yq`N_zM2T-dRG}jeI3BlKiwcg5I?WZl>7%8wvf+U9$OmY1bJo!BKkN_ z3Y+*+r(@^@j2aI9-J1X$hUB6q_l^MJrpu0atrJj?w(PCWs=-DbrKx)k`jTgVzY;H3 zf|^)Sk)ZPj;K=Xz=c)o$$gS}e=OIJAXW`v*b|D3LDCzo1%*71Ygz_c>`O)t`yq3pW zk3M3WYTrZIMlcl_WJ1lY4yGy-?k3v+%TKas{!SVJ&wbX3xNRqBeHEf(c|-$}^*_C& zRk4Od+mp8nF<0DEx;tb{AH!G$+1?+J|qJU1Dp zPrQwJy}ASetvA+CdcEiGy9RBjsg%=RtT2VIm+SR8UfV$mS*4D+ks8pc8~wh5`pWg2 zI@!K{wlGEdwqanu8RTasaL+bje`Z^ctD zSkT|JZ(1P(?-`MRTf&a4MBqC7aXSEcNz^CrdC&b3gL74#eC5ePn7_B75JP`Y?_9ua zkBu1YhENs=<8yoK-k9@+9utUou08qU5!O*|34d<#IslUgL&Bx2dLY*nG+NW82O-<@ zcM2~PVdlK-gx3u{&=CHc^nu0(zVm$CJVir<8+1oo822>b@S~~A+;|?GXBcO?P$>*s zRWd%W#sC!BPSZD~qOav}(X6(P5io89+cM2@ft{w*!e@O2%%iLdt!i0->nQ!Crl=g) zF4O-DT|vL7>BsSWDXT3e1NQcPQkfQ28?_*L%N5AfvaZVxn+eh zlrjAdq{_x~o+Gh=p>mTz<0mERydw^*AwM{kX{>OLwlzd|*A8M&^Q3;(b$}3_+Zn^N zI8U5BbFF?(1m<`TnLKH;h4M+VD$0^s!hNHO+R8aS=(|r=<)WnxXNn!J0{*;}-0S@( z$@Cy6e{k``c|G8I`0`0E=6T*)mIm=D>%&gM&As7t)UBd_&G%zoXZWGbq2KQ@_d9Vv z`rJJpC}zybPAIT|eM1zvxtRZ(o~dIvaY_RWMY}rw$m#-}nYK~(eO(9>Uv?G{kcCi( z|N5GOslct-OVQ}LI#|8-{ox@;1j&OdeHXEBa^vkXU8ghywHhPM^s5%&64Ot{WP%(u zP5VZwc}Mv8>f6MTSR**7X+5~}6hKFrEPl3_2p8`Q?f)xb3;T%18N_01Xt)yg>U$;5 z$%Rx`rcXM-=@L=jTd(yYw!2`CB1;cOUR0+Dm|KEY{7l3FPCF3TNF8-bX8{d&vAc}; zo)v!evN&lj3A+2ZWzKxS`Gn5D2WP_U;pGiAa%SxFL=zR+LTQlC6Hr1nA;kgz{5pS9 zW3Db&rHp6!ygj_LR1ER@Z38_Vf(nb=dhq7c%X@Qd7C_v16tb0J3kn0Z$2os#!{7>? zurk(DQ;h!z2hs25C+S|PjrDi;xxYSDI|g8X;3pLypFS`x69V;;@!a6gdw;B19PY7I zh76&9P?#Z$7<vC&rRWR%a7{nbR~1&9 z+ItR8n85u`n9s?hY50?yGNI!fcY!>`v-b!SQrLef4A9nGDwP$ELb zh=*$tvjWgii+PCOl!XF5c9De~eBT<*(z#)u@VWouUt@n`7&q-mQN%to_uA)#H~Era zbIxf=Tpa(dmf1^%t;kV$%FpC+&Hy5m8)Qo`57Hn1ak0XK0V)-_h{{xQz%=qHCUp+$ zE3v;e=A-s7XsJaaX@mXlo&Oe_)a_uRO@i>Y5IJOzWMj``JrOhQGE%XHd6%rDfyQ@^ zFkF4|)Q+ek%sKq@U%PJvLi1uQgiT%0D$1?O&EW=F&4KJ`)XQI45P$u}_g40MoIP)s z1@NoUo3|(6xlyfcHi7qGj@{Y&TBh32Fz)62uMwZS*FM3@$YJ=yvd2$-&^^Z z|B0rXzowV22E<>_srJPoPfaM-1Uk(?Kbbr`c%v~_>H19t9(D|m^y)amrM<^>T&M$-1fSF|evJ8c zjr}?^op#Xe*w#|kzD3X?elw9n{@Us>8!K)e18AP!zP0<(6wY*fmou0b0^u9YqzA*W z54c(8dlz}KehSJ#X~QO9p>;HSN-qVhb!g~FQI*VjNcGcM|)S#N=ZZh{SMa_ zD?=E~c@%!0*A~J#Q)J6V4+Cw9zlo=`E`(m}`PP$V55F9eWQ6r~z?^A2dMm;NZV6MF z6k)w_-R}C2Vw{^tbmdNoxLUx*>8poMtf<53cdV3cI53W(_w;~D9(LL1^NfCg$ThH>lGwVCu%EUsJ!XdQ)5!j?i)K2=CAM8%{B_?6LaGx(0=neEqoZAR2>tGQ z_OTS~sAtUBnwmd#wuG)0+VoFf9iZ0f$9`cB%mL@pGaf|WQ5z>;UG#H0h?4&9-DisV z(x~>57wyR92|Hz-;w}cHx%!-Ew=ie_OP(qi>;BRa@ps#Pn4^ppKM{rJUYX|eCj*_R z%Y2i#a)3$+&NFu%le;4YnbIS-_fU6{G_*Dk#yUHp?Y#0;w=IIEiCK>y=Il~`*+0+E zwuTc0m1pd<6d?PucJ|0a16ZgHlCnFfd`Rq?SvH4%R?p7IhdF^*f1=;gQAhZG zP}*hb6wVorowa`3qX2JTK5j{TsSHu}+*>0*k-tYv7bCQ@4;t!@+_0Fk0fw`b8624J zotRzpH9)m%om{Y3Dris;b3rHRiG?>wV} zIp&O_X6e;X*r>1nm|nyL6{;(F>vwE`|IzsrI?Ti9$^2xae5wGg4G&x&Cu4rauIp~> zfD+iB{vH|AiyWgHKkLi&9f4#d^<-O>5PWA8Taref#c}`KuMB5)jw=*k&Mo;J6=eo;1^W%Z zrmAhz!6IYqDlg{qV;?ie4y_x3{>IC6k&jwXwlL=KNNmGjZ6$7xh`~AeJUtsQX0(PlM7n}Y50xPYR|dcaK{s&pk6 z^IlCm)_SK6@pGh>eTcrDiseW>?!%@~7S9}ACxIN+Ke;7;(09cDriIY?jRc;*o%2ka zc7XJxmp{)0$in@tTjYdrOK>dFu$xOY0Yje&Ig@Q3kh(t7nElNWme(7LXK9dA8p*EU zjL$PYeI%_E_K`D3UoOii>w=vzJ6)VJ`fD#Ga=t^qQ^?V%qZOC~rM{Bu?TG%qm?Ni; z@{ev1HVrr9SCWWuP-)S$J00(z+d;=ELsj8uZ8-ZAe9o5Y3lv7CtiZS7;FFYoMZlAtBiLGVAADX$O~Q z+h4XNYQpmSEXK-@R-l?h&DVhX_&qJwfO0|1$87KX{$8R2nYF!qC-6KQ%K9+8f?Qhm ztoQ}4|5QO)x_ivl59e)(<$RAZKN>c8Cg=8FBe;1pc7(hTd2X4Owbgni@G^!rqKDob zmW^(Akz@Y<#JUn!LoxE)j#%kDdW`kZPv@!25BCVcjZ^6$ZUmuYzv?Ouib1&R4Tc}H zi-ae??$L?9$NAwxpRDf+ANCXMg?afzP`G6Iv);uH{)_Na`-J@F+(O};`X&t!7z@hb z$GKBnML_4_NiBGKEIfbVgAT+A3u(Ic&JpZMxv$-lR|I8)rj4!-`p~I<4d!3!fSaaw zmn!Xj&fdv9rl>USeh+jJ@nxPy%#&kl1I_N^0* zm$s{yt>L}oIa?Xz1uZ1V&;O;;huysl*EAr2#DHzfats#;KVe!WHC6^4^A$glu7hCm zsblCQ^4x~YYcn3D*#eczA6tn@9&lh=yZ$!U7@mGwBdl53Lu#kv@{LnA@K2gW(g$-a zUe~)zO0JkfA4SlA>UuJuYENK!DKJQw|2p&hswfdwD~{#$|6>Ffo;)u`)DwRgBs^kd zvW7*{R!*}tV{o2$!lr<_z9u9qX0Uv$qykpikt@(XO=WElB{LP5`Ph(ia>#v2{G$o5-CfLY3qd{kuYceh z5^0$CKCT%42z?+Wc^5s<$8|38s^4jYNkV}Mtsf_e4QQLx)!8Bcmv3O?%^)8SNSMp- zjzywxf(?FCbs^`sHioJc=XW(PI||I%rQz`E;gAEovcMUpph*4D7%HRd90Cv7!{MYX ztA+bikp1LCyI77s{HU8XZ1|uIlqX^mejvY_(}c?P;=(53+cN@NMi%mGUY>QQKIH_| z@~K$znfO8g&bq~PfY4AQv}T~?}uOFxG{IxX&tL^V=?8tSrxgA%YiT89EYsnMhD>ayD>zYsQvW9IH zM~xTmiohlp-WBX?2O5uL;y-@YfuQ;EpXdMTfx_0yo!(qiFmL^Rr~iN!h-@?oGx(dp zSg^;v$Y2VnET>ufX-5WbIp^uR&zghH<5!-=rsy-3e{jZ+-w4<|^*1s+@wu5L2EED0 zx~XuCJ#LB!N7rf9U;aW}xUBJv2KGY_M8{oJ@VWBj9gV-~?gS4meYASO^8fzk`Oq*A z0QVS;V$utFFx%q|Ifwl#>w5CRz?fM=xjj8DDzk zh&^okTo?Rw-4OP=3B~(m^u4o4KHDVBn9zxH!>mvR)@3Q! z7ZQEoeTN+E^cmCZB5#04uT?619dm15G5PyZ$6XdG;#=fUg)zp!gQ4jpaIM1BQqU9N zjP6Tn?(;ZryLX910CN(&N>_qn(T8E@%Ww2;*AcwlQQT=(X9bMp;rO3-=tuJQ=_4b7+T%qb#wL!jot1M)Ugc>0@d zYm!tSL@SHu+p%u-;})DPDMT)rR_>?om+e9B?az8uSKM!KGksaM*Az4}cm3Zmp?}1R zYtTqV2OPQ@uatA!z~_0R;Ad^-z~$h7%TeDD!iaIg9bg2XVw!kLCXnM?C6}~3p#~>K&%DtL zlttY$TE0?K4-C9L-LB&KRXxqhdd8d^y6HBUU%KIQv!#%+!EOtl9GZS5_l#kIUje}@ z`p|v;Q&!|(W#l9({Y*5n1ihaQm6lb0mjK)=$wjsrV# zR8EpkF;m;>K;~(#>&w6Op!uV%{?KVnFw&-QnMy>zA4g(ON~k%=akejskEwxH^_Bg% zWVKOi)C@RSgnA&~3LC@Wo|hu<;U z_X}M117pkKGSQppi?dWp<~~aR<3@^8#9c#pep0kTiyZaElN~y@QMV4THZ_o_B7)}r z@4_oM&#x2rM8o z^i{qcbymw2;d{Eb@OjfBfBSY)2egkk)vNwz3+o1qOfPnsV2i3KRj0uSa%I_E^}m^c z^pz`u`rF!&W^w#Yl&c01EMwJA6yn@5%vVl-bAeE4sM%+C&Iv5@!UF;W&4Bw2Lzv`u z8?doBIb)9bxo6qo(`C<0AydY?nY32|PV4g?m&LxthwsgH5u+*SkrqbCAn!oLMJq=e z>#c+u!cnIm_`cPA*r^}ag2?*Y=2Tf0kT#^DHvb&wtB*8(%bYIYB~CfRtdY03LFSJ$iZ15{a~eU1dddR|3V11pme+D zjw15DT%t?LXJ7Gvz0C;I-3SRtBJo}$<+KI!Gfrjur}x9R3S|X71ri9+%{tZp-x6V{ zux-feCL8Jt4SKA|<*Rg)yL$?KTZi;2{YuamJ$%0};{JjoXz0IK3qt;N+CHVjcKUMA zpsV~c=A9iVBAh=VT>xCy2g(H_Wx!XdJf)S^9)7Eji%f~4ZW$Z!;DWG7GYC&@4acS|tYvoTGmxD{a0-ogjnB15A4c#)SHZ1If#tvy^*CllHrb;ABj zENLfB5)?9c+P_cQg2W_UA{(m-yb1dvceT^-)cr?z(;}Q3mII zH}5`rg?SvQ$HHs-4

pl!b-Ut%3Itf4tjWoX<#3eYfUi2hGzZou`rOUO`TCK|{m@ z>ho)8TM2?-SQq17VxkAqrL@r!IJek|f89ui`R#dBQbd9TtuUn z8r<9>*Xpo21l+QuhR{)w2PR(QtS4< zSjUFG+g}DwiuW9$gC-#F_*oO=Z9Nsy{fWNBb8dt4OB?1CIrxTOsBFwzu2Jy_cs!3zMR#BQ)P>1FNooOE7Fu;6}`jI8;78^bY1As zCJHAaKZoV%lfL*+>=W|a1qy^we~iAUtoWLMdi}@JuM+}5y`2+P_{$3Rr9b7i8&QPu zcs-3yVc$Ns=Q&Igdu)Nkg7n7}^4w25JUKV~9`hoHRtKq{ zp&oI1e@DY@Lm;hrplI~c0+Jmp)rWAdevf)&M@Y#YZh8&gHveh?{~aIH+n%+9mB`V+ zNexS|-g!k@x

3FkANu^M*eHPSM;&K8U!Va7Wp7aY#KGWLkuLxPZ@|w?i>k>EK#> zcB~qCuNS4Nq%o(!+<5tj=aw|o3)6acMA-q~{D6HT>YXX;{SzTr_e~YWDO35YgEGI? z&8G}@u=sdsH6HWVa_TuhJvZ#Q45V@h|0D!OT(zlZq9N5tQWBnPNa-`c2IrbS}d=^{ffg|8e^&!lukZlF9j$nU!dz#W} zzLXa#!tPn57ui4%d10pHXS7em`Lx9!Qh}gfzKb{Jus#;!pe_C)3j34e#Tu~>KR0#o zh5T!7s1ekt{B_X@IV3moPA*wOwaVYU1y&ol>hXm%=pycA3is20X$Ua1*`3xHVFrea z99NiW6#*)(YO*7Z!GG>Y=&>Rvc*N|oCGRNYn^$S(>jTBQ*VE*45wSx!0}@FVH>{Jy~nwlKci1Zh&9V*MO__A zzLLTE+F$eC6;(u)`?uL6CShfXW2)Ulk6s|PS8wuur4#@ZCC<5{DC%Se) z6L>+{9oMf(#64wRJi6s}uw?l*X}m)U4xe&zxtwAHiN&{awYP17&i{|vx0~jehs-9K z!RP7y>0Vw_6&a9f&C~euRt3JfX`Ru#YyjhT!xL=KCmj3yCV{5S1l&IfFI1wRaCq#O zb}afiQpLKyO594|icA(u;7ATB-1;WJ-$;BJU6z3z(mQ{*(%C;m-pQ-Z+m<4+~-A!k;0Ag50QdCe{4RjJsA zce85lEoU1b|E$MD{URqYOP(1!KA;b8ZvFnqe;xN6G!f-<$8kTAfOFOczRwxW)stOH z7U1+_uUgk0^X4I~jS~epr^pc$H*PuzmTaXQ43_L*93o2fXTky;o?a}ygq%hPN}9cc zt;k)ldihdn5%a9?ezw(x{3Dpi%q#g_#kt+7qh&&@=#x-8^omAQPW8(c(Ww&wNK;d{G=znX?QtQv**K5e&!B@bo#eU4gSCCNIQ<7^9O;xk^?U)6-E zudDrR=8RC?>7?`Kr!CYDmKFTcv_{Ux&Xu}vPT-LkcCtwdIU?u7nttJah?`uVXJ$3+ zkq6qLE{^|y{Fk?N&~*zCc_-nxj{M?E^LRR$5p9U$KWjhr6?1A)WRZNGnh<)f?g}r3 zHQeR1%(L?m0H39gUc?w~mz~zIL7fR=E@pg}?I+}$?`tw#wge5m$$MPXMBqG7A@`3F=Ro7Z z1w-g3^Qk&gQn`n7w^#wMXHq{2X6HplMx%|PIzfxdxWxhtTD?PKlW@;ijy*X)l^LAd zQ&lu>6^A^Nz&FxI4ZxMmzROkG5&lMzZc9GXg<}G`+{}aKAh5(CvNEd+eJYgI(K~pb zd=?=HQQ`ip;7(`hbzL~XPVn@x(S?)&?R{yH$hm1r5jlsslHIra=MRq=K#$VuOz}lQ zxb1Y>hpZ5}_P&9YeV@>`cwJdMLCzR7*S?7VBOw5lgu!za%#%$<-)^!>QHRgj>G_^2 z=#w>@t^8JI2$k*1pPDI)};R$<~2)WTNf#-$p*(Z-K zWHW(A>Hh9Ic2K$9I3rJ*Z&Xb?Oy7ghjJx@pEn^a3P z%<(wElR{<1lTkb{uKAPYjodn+X-Q)?1M?J=+|D=M^PP3zlN*Xo=Ywoh#P=JKQ z^LXBl1{yKVGr>I_%2&^HFb^t2c}(}6Jxuy|Q$+TwqQ7sqe_O{21~T8ZT}9ofoJzDN z>zX8ViS9P%ui3%Bm!^>#bg-MLpc}gqkV`GwxeB zyZIM=+uSkVtQFD6pH8n`H8EuesnTM7TQ@Z!r1R(|-G(ew-xN{3^o0)UK06rv6&44d zxt;i2E_-kkee;j+x&o}b6$|xCn1kRG)K#0-=s6++^Aa>cRwv@_QWs78QOJ9A|=Y>Eh>UH*ApKCwF8) z-xm7nsdkLZkARAaV8z#9EqFD?*Le7@7F-X1AHj+KyfMKBURum6+SET=6~g_Et|wle zm&EzDlG+b<>Md0mDL(!(!d(`&2O_CAF;`rEskhZ2TO0QNm9`c->cZW(6^V(a!f;pI z@1|z08En>{9$OC91ZA@;%vXLhgZiXb96# zyvHaq59{P7;e9eKAFS}6m49dVSr_bWjfLJWnZdz#8vY+Jf5p%47?R7a58>x0D3e>Q zaldWh^$lyBi;cfvG&ZmT`}89}nX+(RW2X~zL(vh$@iC%(zzRkcNo-e<51SMBI*3M3 z6Fxe5G+bvxK2VGLhm;fAa8FL*+(YD71ys(y`q6{AIk?W@hWTT&m#n$@CI;|yv}zyw zH15}vG{}-yRRGR{ijsgSSy&iP+hRbSJ?~8E5YH{t%Vsr)sc?^jUboYz^dli?^qMuR zwnLvuzfbJ#xQ~R%9?^~a_po04IX=?&R0UM0(FGGngyjHwZoTiq&`I6ue++pjy4O@| zehxT*I=M4zQ?oT(Kl5+J1Notm)anLnn74^4{~7$$z!CC(c5&bb53_vpI&W}3s3u%} z_bTcp-gonww~=GL;vu7Di}P2#Rf#%u7!V8%59kvkl!ea;|4TyA9n4j#I45`^fPBN29=AGB*gR)HtsqO!42Sf=a z2XpibyoZ4w9?Bpwj!B z>ptWSd6t{yxXR&P$!na`g9^+bdTd`cd951ki|wXJ$2@Mzi;WKJx43V)`h*iX?jy1TpY(v=BWToF*%0WJXX*r8=M|N;{)? zNf(MPWD&QHSi$G#4?3s#kh6I@e?s*e@`vqp{CJ1A2~lr{M6((7aZk^6?qJ*(H4?JT z#Tbp;#Nt_jA6brYMSF$aoL&)5rEk5A88m^n*T{RGq0f4bmG#yR@?&m(HnuxR=>W@- z;u&M8f2?2loI}pX0t}wop7BpCL4ht@u^0VpAFfW}#&>{mNe@@+KvCq&y&aZ_vH<~s z^tT1qkmu|8DUf(a6)2VV0`oJtflFqY?@0*GMWc5QCmuj9{cjnf{=Qv8B593X5Be=1 z(-@HNDWb1OW<5W3*a%3hTz~l-<^_8-vbW!;l;pl9&ax>&`lZm4ad;W*2o>( zRPF$g3^Vqd=Wrgc5Hv{c&nGM8A)juG zL2r4`6yA`HlZply!BUakpyd-&ILL5S`dJimCpG@ITmG;D7FEYX+xNwRHqs{Lr3gT= z;Ob>Z9eDLEepL*))RW3S`AHuL z;MGh?Z)R=^$2#{bO_JKe{(=ML#cRg6KRd}mvRw<}Oy1;s!Y~}Ub@=K}%mG-Jml?P?K;`VFWx{n?OQquof7Z@ZZ={Kp*SAc8cq>dO#uf zuid;=5VGv(U7GvELAdmeMy8?$6!%gYnHytH$&)Ql7Wvyw^#e3?$ngokQakiOP6?W> z)~EVk(E{K*(@n>R`+a47>v#YRLL#oo#E3Ep;@FR9v#1H)! z^)$Ce-EdFjT<^IYdyGYJ*N3nW2dRL9VZv|!m<+U4C?6gs5MkcGX8PHfBc%QIetaQV z4BY&jdBUp9;40H&{)5^YP}rxuri{O@@?_wumK5%r>Urc4F=YwbQfc1GSJ1Z~LP=P8 zAOj;J<2{@R6v!KBDZY;HO?|w=4xJGb6ixoQbn6jv$yWojd2r z608po&DBe;8G=8XdTkzq5S*jiO}K>qdJR=KJ-K59U^g`*qYAMBQML@mgdS1gW?k!~ zDKiCD+Ep1XO($q}lVQ_#&<6GoC8b)(#o=WUecE?U1X#)*JC!1DYI<6CoZ_oEtnI$> z<=3_Y?(%|~rB+M0dxY$IPJc&^jx@pf5YF>mtp*NFTqb~6&!+Hh z1`zP*eaaZEV6pWC!+)9+aj_CSdn%}5 z=S={U$o#SDMgWq{fI+q{HV83kYVpNfWzn>_n>VKj?Ao5pGx|>oB4~MMWI9a1dSppS z!G{0^F?m6iCmi9aLg~~B`ms%XTL_=jOySQP=KBxvKCYCp>Wsj?;~wK*chR4Y5O+pA zjflLT_7~~qtT!d0(%8?b?x;O5oG|;bh<@DqpEIjw4ZDP$FQ%tIX`ntYE@mdKi#dc# zWmJwb#;|Or74ub01-6wk&m68opLpN*0;2=E(0zv6_gv`zC^`>EEZa7WQ(39(k-cT_ zJ)YCv`{6-Ei6Ug=Rgq++fvl97*`U%gvl5}mDl^$xMM6UQ&hIa1xZU@49piU60D+~W z+-JxLqL*)*`<#yc<%1@_ozOEyF{T) zBR@nj7g0b{>7ZAu0E(=&Yt4#+5S&ai|K5WDf8(<)QjyOP#lxDqeuNG-&N&x-N4{WH zp3wJi2Q8qAcGqotjR2lz8tP-8F+cQz;aZ@hFhp5g{G{ZJym_;?e^;^B5ICvLlz^Ox z14==%eEzmL6Y5XtYTW-W%P2z-b;_@W9o1kA9C;qtL!3w;XVG*zl?J!!ZJ`4 z_80>nfjGC}#>P#Suy6a^J z^>Q?pS9Fx2oitA$<%_;hZbN1uy9HcdZm&4zWDopQj4n@xiIBvpl-z^5&cgQC=+-U~ zT$e~+kM}4dPk=k~B<7J-FDI_)(L2H}jjU4i$35`byX0$rge~@xN|ZIO5uxu940w#`<()JJR?)08>!P@W%y4W+xej~pmPG`*1_$sYXLuIA zgn9aL@r5ev2Nr5idfK_ZN8umuStOB8Q~j`Sj~U=LDnb* zMIG)XQz!QUoz+Rohph)-=ljSD2ISS*t?{M=-nE2aYq9Y%+@+3NpLq8J??E3t)2PCo zl;FhCt7clU!r(Z^_Uf6I1nj@cJg|(uj9iOEnxGpAz6pDZwL9Z|?qKmpG3*1INQU1R zuap20xg@jyEcl=%nv3Ey`hA5|LJDH&HwK7nIEFjYf@(Oqg~%WW7_U>aIQ`aw1JSE} zvQhf57!}4gXM?+&8%D`L8MR^9@k78T1y;~2_+(;)Kc#)K|I(s`RKO|z{M~+0+_{sP z=)1yz{xm$B^Tz#S`ZK(bh{uIM*FBlNkBbppeddIQ+Eq~>&5CHbqlvs*kq>lI{e z-l&)D@&F|bE6cDd@(nI76qKS~TRxM|@pA-oc&qhRPHuM4c%8*=EZ7P@b{D+zF6RX+ zHezcw`YJH=->23D0OM!f5=WnCLHEv=9J(e8ut}fm{epTf-Mc=@kC^xNU$?#^#fy5{ znJ@XDWxf)w8w*=RQ1FAIw@G&paulro%Q?rVZV7%OlHuIvaR;|IeYrjq-@|6F9qk*4 z&=AQQ6@AhI%KrWG@W;KjrFO;hQ-IutHBE!u;(ZXV2ZEA*auD;dvU=;08n$y5 zD$tiGQ#>%Cl1cAgMxgSdU9zE!@$E+ZG0QV({O0myJ$7n_Ub! zCC4~6vr1=`kgsveD*xYy)VBrlSer%VC0zT*o&tQ za8Fj_p_`uwEM~_aUBh$H4Zk}zrn$&>BLv!Nk17Lcuk|tk`LD6*YY!3z<$&zar~B8Z zafj%#f)70f5ulxo$*INxd+Q9W2hU?~o9A7ev5qlZ*<<-f^^_Uto8C+CFt>+D$G>*^ zlV*^^`O|IJ>g~IAfr9zTZRcM6Ud@Mn{ab)LX?LaWwJeLmjxpD} z-cDHPqhV=J4>@=qT03;zE1;*unEEvlrR(C- z3>)G zVZi1|l_8!p-ke>~{e*g)e0_&YChjTya#{IZF^{`MQye^}@NH;ab~SpRx_zENBsl*zQq zSx_hNEi$2JL;XoKs+MK1ggLBbdyhgJ3oIWAkURu(~0^vEm^Oc+=|`OfTaAb+13Jwc>uW=7md7ze`}hYi?gQJLU-P z{H7mzsEPfzy3fT|+VmiDF@)K3%K@IczRZcAaR60;vQ54KU6^I7Ngf>q2zsCE5KxCb z$H`MwDyTPwk#@X)?ifP+e+RqSDsd-U{z}j*Ndpj$xsat#qX!>o*hV{F+d)Xt&|8~G zGa&q3W34byg2aA{5LN?4AhbvPXgq*@6Sl#{rPsP}YNt@QGtB{rl9UA^6_&91fb3}O zJ9-F-x+pr`fxAncF{zoDlQR5?l9(1^kNdT4@O$RrkxnI zs)9YNQU9W^97IFdcUmpQz#bTnle^~`<6em$W9d)yX@lH_Q=ar=e_L#(iym zLzicFQ)4 zMJ1Dred5<5auvp8-|D|m zf#?BZ+XXg!{G*dAmTA;MvLMxv0d-VUT3O03f8^oUTzAV+0d27R&K!1_UmI37iCpB= z$OR}|5GIn+du~C!g?vb|HjQP98f;00xuN# zYXxoadm`php)Q6w#BKTh=?vU2Hz(CjciBMo%xr9&KkCKGuXtuKzZ`U~w51()e@rui z`PR0?;r*aV+TdM1U!218YLc(0F`EI)1b6*-Yo z?FWN#Pka4ya^~X|TgaXXc;EaLcXL-&iC<8sqL6x5Gdv*zJtaNdZ0+ViT+p=G01cz_?f^aR7f_CLgeH(6 zw?RUZ;kX^#SD7=_c!Jzb^6XaHllcAjswU6U!po%W;{is!G z%a#K={-d`77;J%E@cW_rhRiT@LB^^R^V@pewN8Bp^nvH>Qmdkx19Yx&ruU#oZI->~AnV})(Cy@gX<6i&vKYQe|`{h?+FLhX^ z;e1fJI`RRnEV5m#!S3DGA8|2lDB))14?2fjpuUuJ%XD$rJD+Lr41IUP@{h2+hmltw z*JrpQs|?cjPFKF&YYYb4!%}ZPkRUXC_Oz)eFt|&XP>J6SIG;fOtxh5k&ALMQ>;iE z@Ar2)bwYLTI>2(yWlHM_GRR%r*Sq~(26IV#lI5?a2}x>QrdfDi4|#C>m#+m2>{5Jv zkv}Q}2C3@zPGe5!vyoP_yRiv;7S^^4U2uduy&0gTBL;*I!)bdA%gk-k^FcPXphv2yC@m~Z;*FBO&0Qyg0= zD$6+oQ#fx+9Z5rB0gt+>lpXLpD5Z8>=aUoxD4ev@Kcimp-7WCz)%(cLyz!l2f$wjx zIY+Mqc{3Ox3qKvLWd}}zdl&<~jiDuCb|T+L6>itJvi(u9g4n>IKSpzUP-Hv@0hpT+ za@Lw)i5G;`Ik980$x0CQLh9aB^ zXDgsKZtR_VrU35_MAFa;+rifN=9#h}d(cugWqibh-w|0$h2w_G;41r;?ld(C-+yTb z&i0{?b?n{oW=Rr^>y&QU^=pGc*JA58Hsq=p?G)d-i#zp`wxO~rW&o$Q)Me#o2^Z*o zc=Yq(_bP73nH|5w3^$W+UBts&!sQIbZ!X^wVDtlt1*9-_Rg}2if~<>O+`U ztc&P)^HB=!oq2uaE&4H$J__PmxSKeY8xj7v#U7GZc4L+M6oBGh!%tpTIuZTTn*NQ|fdJ>#5=ZijydoN8uVg32O95_2jijM9YfScx0h|5D3 z&{(`z>XVHB4^HM|A-N8~IGf+VS!4upcUq;;#__-0#{De0|{db=)&*9S?o{9CNKpc6Ji4O+fZa&wx>(5^zhMlJUhpLEUtT zz5RwA^iawfOUK~e?pvr?`D_8qu75%%aDO6FSzz;qx*1&W_#t}ES_wwCs=M;ExIuF9 zl}XfPgY+{~@;m?el6z)#i&&!A0QUr=Km9Gxp#J=9&Au{1yJYOkw>TEuh1-g;nKb3H2 zwt^{?CpAqHN^;#?87#$t{G>w0)hX0xo=C<<2HL@wE6wBwjB&4;+FkN&FYc&?ZBP52 zwgsoWM?Ecj^$^^o%0`+&zh3h8v(_o(Q_uts4f_(|b@o~^SsU(&`d)75SGI-R(b8{B zg?L_?o!x6|kNIt|^|`B|5A6*U?W5=qh%I{YG@yU2(a9pyV{t$8#W6tdC*>#df{`#I) zg&2UJ(Sj@;?fBf6F=g$;ebFs$|RC&rxfTT;Y3Et?LL^FHUvYT-Jj_B=c+bm={(3{NaN7 zDOoUS9Y0xxJ)(x>w2o#@0KbzRC$p+-fbE|aHT`?s-#y0J^Vvlk)>xIST;9q9bFdnL z9D4+}7WSDV;>9*z)ep4Zw##DR&m1tW2ot;oFY^~VgZq=sRaSQdUTwf5+hn!%KsPUWK}6eZ+e zJLzLS?fqRl?%w}!ug767<7XH4p!fvL$Wpfm#|*d5l5$j_uJ3X^7rpE`{ z*KXvUM_z`vnwq2==J#g4wrCtfeOdeh|p#+bgk0plx+he#?go3`UCCc6Fp7 z(dZS~N`WHC)U=?bwxO^uDI-$Dh)A-j63gE^`T_=K`8IyVPLF#LA<0T z2X-!WA4O`_AmT||>kH)Mo!Nd7=latD^w-UIXv=A#JpBDJ0`l??oYJY@{}y{@8@$D- zzZ^mRh4rUyW_jd!sa(~-T;0_3>!;5|IKs85<71rY^Lkh5b!w&Q!MU=YybR2B=^Wpt ziSwlZ%6MbqlSKol)_dB|<%-`sx{leW7i^ImLy+t}f_Vw|?%8K4j*uC>b4L;NvO*t|7m85ILuZe6920v{X4z%h!v?IQy?(idf;1Z1ZRnCy(bPGhA(+RX=jZr zph;5q*6k&Ec+;Q0b%~M)s)g50uAEVVAkooeTil7*AJh19{l5dqm9TTLw=#tbm3{If zlq86;^ENU2>WJLlsgJ+bB|v$||Idx^4T56WxnREsm=m@pFKJ2A0ncse@3*b7w~@Y< z*|w|;8cjx5t`8}K+$kzDfn7(;dDScMqi+zB=we`qx^WlBp~TH%2MF!Frv0KC_Xl!m zFEQI|N>I1c=2pl?ecSHA zy3MeZFesV_3nZHIqmDd~eFk$T>B4p;8HHxBN1B^;CFwe zj=p+XT6=6P5dyXcE8TwR!QoK3tq(;uP@BcM<=#z%cCYC#5iCmZBs=53Nor1rdrfke zQN!K3ctzNY&!2oA54)8U_7!Hh*NzXVg0uWs?sOXN(Kg!i%cKAQ?$A38TIBtNT}W`_ z`i=Wn3zztJjl;Zc0Klvrz_VwEzHW1|a+=LH%wlBV{ z7;luDz`oaPn|{`~i=9|%v}TCC0@8HrEb?5+>OSUVV*mE-ey@iui zksBTs$S3mmGcOPg(*tYM>a?csCUD$z@my4v z2n-4cmltAAq;@^?p7jz5sFj?gLc*BgWZbS(><5#`b1v%eF?sq?9&TDQ5M}n6L79uuU1?3^GASA-pKfx5pMoz>#o;+e`8-=; zc#J&|?`SVq;x0pRa3b*~-aD!=Bd=L0VE+}^0>G>=!vzL?Zf=QN`0hn$SFDSzU!vVbpxP`hb;chf++0y zXS;2fOM=1BY^jqbmar1~bSRci$WcpP9Vt}kv22KVOG@;yvI`Rb&NOrtm$gS5Z#k`YAIGVuj5 ztP#35zBfjp|1rC1_=7(MbD?d+)LTatAVZ0!I(Odj|9KwoY3vIq1YXF{K>e?5cCK=K z#~ReH8J`uz-tNJ3tVg|3_xS#}wNK-sDx3%nw#*@_z@3D;8wT6hi(Wc*;05krso&H$ z_n5T?m9_7e#_nORYN#WLk--Wi14dj$H|?N3CBt_bzZbgOALmkaWq_Y4M`bk!`AIXv z9ZvrgA!_~KvxZ3IpIMzVD0KY44|u&NHpv=-t*-2(WZ?NM@{T4HyhB_Y}_Kh-DB9vs=Z11Zu);5y4=C7IvY z_fWqQdQQa>q^84ZJ#Z&9)?vGCj9Ce~)bG5%)c%LS*wg)?2Yn&q589`D4wAt29Xq!< zo~KfZ(xmp|GU;SK{#rwmBA&p_1hdMBNTBJS*ea>{70VN$-d@iM}I%>cX`Va4QqYglwAnXH0 z!(P;H$M~my*qTFnhfT~QHVv3D>n|(K#Qa86d?!CO_EUNsQlIv!;7$*hOJO}TWb5a5 zA2C*iU$vIXIlUx^eD;^|XfAS%<$`IO@mvx~8>U%-deLz!`4Ac&DrjOgjBLQ(>g~zl z2Sv{n;quSY^jn!Gz%3m4kMD#D_FYbvezr4)m9cEWS}#Lj-Sqw&xrll1O3E45X$QFd z)UbBytq%C#d;h>f1>ke7t;2OZU&Sz#%d6F4j+e3immT(G_7UfGzGD8EGf3=2rY-uW z0jrVOofh!wh*--o?f~7hsjYn5Cj*=mdv&$Atf4lLA=>+p9K5?lRrr4{Z-zIkG?@tQ zJ8BC&nD{IJ69EMs@qo|O5^4J<`c2}ZyU!j}<9nWCU1*ft9J#2D_W6fIFpqf7s6@ve z?*5Ryk#n60+XIz?-uS#9S$LeKvc~~hq8WQRe}G4@Z2@-c3RtvZ0&fzyJFlMyHKTOs9;&QtW2SRn%p?Bod!+59>nQD}|I6 z^q*+TLxr#WGl%NKH^y4`;5qF5he>A4&3h4z4$RmfZ{;AJa08zM_>2~dMpf#-$wzGL zyzg~E@ySym$#K+mX(@#LbB!=Bccs1-`)nSL*^J%0x-hYPJN7#A!PBzphpv|~z+p;5 zpBKo5_1pJy_Yp1bBC`e$Cw6QTb|0%9r^Q^Mp0Vz^@6H%Is>fQBUhsJ^KqL{*-5`gg$Bqcr&i@%_)G%2 zqOW;9Rd#S*=tKF|TL-XU>u`79LjUDWS{H{A+6>48_n>1gU>J$OMS*!HGC z2kIz|jfD~kAYjx}(2P5<1@ip$&t9rPz_M%40K4%RIpXD&DaE=#?kJ+&FQ+Err<(6&oDMVLvWVLG8$Ag$6l+klcR$fyktoV zdyV&&luE9FlE;4uWg`KJ?sB>yGd!}_&K zy)A~Aclg#~q4xlvXTgWdwFhyp*qMttZPW-BHDfjFkLUrbShR=bG0cYsQS0iO8NpPB z!>`-8mvM$oOij?q97vz)Rujo_XG>h`R{xe76mPpfykKtxM@=MNCk0?mYM9m~2y^DQ zGjB5!1dv1bec<#tJqzHDA634E-}^hh()AgbQ>&yde13KlxpwshZmh}#NaAmiow3K< z!^zI-`*@$y%s4Rm=9(;AG(WVD{y76EEO37Pc8CwCOuyFL#$J%^PcfyOi~rx>Q7U=! z5O;*yQjeaMw*e*w2lJ0sYVdC?jpoxP_9-gPObg!6>T0`^s}7XpFTPtQ@e1^KU`|!Nd%EM+!}L^~lwG=bagIP#y+? z1S5lxQ>D(!_NR0l`88+LqkE7)vvT4p>+L!+I{mMg-W3qpV=Fx3?4&ZZxV^QdYzuP3Bgt3;F6o(w2nSgr=G>8fV>s(pX!vn zfj(?ajL5Tc1vMC<%wGvY9vbz7cCWW7$WPCdWQyp zipNokKp<7phF1p(M1F85zk6>9jBI^xjb${z$U5s&uYuQyYc3@ zG4wC~CfjiX5K)WpRA`rn7hK)Ro~lN0m09*H+h=W{Y7eSSIAjk`MJnij;;yLF>o;}x z@jOF$zeCXZiW>NKDv(r}(MS9w{-hD#8&4dFx5wwT;lNJ2OFZ`ZIxoLade)3wE9KMy z!1tzp+x%GZc{y&Of^&qqNeYFle)lnN;lcI&ocWR>!VGrtS_(AizJLo4b za&QrFcY}JT>n5gs;3I`zOydP(P`%WHWp616`+c{J#RPqtCCA165`u8m*YmpRHS8ng z>;FAWd`}R_qbqptuLASw#lrlfbL(HSBD(imtRf1w>VXhMD z{y&no=2b7Lft1n6;%7I^JB&XPY&5e5ZvU8P40ztUE_#Q2xy%8M3|yg)#y!yfa1Wzn zCse`r65FPA5-+&TAHB=)S%I(=~vlnJ&0av}P&x#8X@S0 z4)Yw(h(5gk4kO>9q@b8L&IH1yx5;bvtH5Y3-vKh@%~lIbr5SAzV35vFnQ)jNY(u#2 z+P>9?dN0d?HXS@C->3NaP}TzEb+}{;FlU;&sN&J8Nr1NdyPh9VuNIHYd{dr?I|0Ah z5_`pP2Q@|gpgEZ`h$z1dV@cwICu$0R)*pz#wxMC&g}>N4e?B#1?Pm+gxhL2s@#nHy z(fh@rUI%`XiMf5Xvw&H1W;#zk7TlR?K2G-?^QP;`3X*l zgW=*@?$@VP;W@bFYL8=HK2s-uqstH|+-0Y&6XdZcMRF)#vvB{wP5;HU4Tax=8A2_V=6Eo%J%!1&*u`%SxJ7n#UO+_aJJwq(8<_MgRX)lbl{@jx$mo_cZy-m8xC6x4*_eNp~SP2a`81n)P- ziL${upz);C-PJ-IY*Zb-JAWhr$3Lp+P0Z=+OxMIKmD|E#`)+O%_7}{l_T8laZUfhY zr|-N@*dhEUHA4}O9E~qdF{9+TW4Fh%>m1>m1FU_R=80am2ZqFBO^UCLpkCc)WT8q8 z?&(Yr0_P;)^rcaQy|?M1=G*sLzG4DcA8~j!Afg0C*SuA;(}ZEu%tzqQRs4O3RahB9 zU#}{wYW@lSK9G)vrq&eLLQ@gMt92K?r+OA97nB zoneQLGy6wK4F*8wqwuu|cN!X6`ih&vb-{p1eEp@YDEfujf0&*k$5$sPF6W3e1XQ(V zWnh0|IPQB?bh8b7scB|Xe`pVnZi)T9{T6e0MjO6AjAX$g=Vxy3jv^GUWw8Fg-)6Hs zbU=XH5Zi#kXa?iDH$Q&BJuBfd$MCNN0)$K&Kfh^f3!D3&-naS>^D`2(_sN}+R~&!czad`_ zTs42OuZSX_{@A0)2p)YfWk}XGOU0Zv_0rPQeB^q6YK*_(i91~hJ)3$7HgInKxoXph zGV-spwWFj}V3DtWMmh)g#|9cgoA(%kux6lFP8vV>{}=r_^9Y_7mvme#6BR-C+~J+$ zNy_l~Y^Z>Vr#<+boa&<+R)YIa`f=kGFJXals% zm15_|jp4OeqVtCp0(?A}H4|WozJz{RPRpDstoxk`uzH8N1A|-TL=8u98)N)7_)Pj4^W)D8Ta$yX|bAQ!H0h}_M{z1&^#17g!zR{;twXDXa{f#sg{}F z(1VD-6X1wG65~zg}cdm~d&k(XnC%vFGVuw0y(!-uL$>T8Sk1T78U9 zg9>#CqM~z=tu#nVi)nXRbHQ6l0~M_R%o+WdPu|{V4g1X_eI6zXgUQ#|cDZ=2zgs;` zQxR+mqRW{%E&o}AAYIIQC8Z6VwmE-#^duKtF8@SSq{H3Sln|lyWn0jmOb9U_Gy>%t z{uh@pU%*8h#7~`xySr@U?9wq-V8l}yMYV!CTmA_#s_%B-N#qWCOQ8sqibIY|88UFd zWGi5XLKGMs)3!X2lh^&k@B-tcCM0!yzRG`s4>^gaee)Se!2iL_To*Z8R*Uw31NY%R z@W1Il6eUC`AbRuPrqTr})$J7N8@g~JLgLD#sS@@wI5hkMm0@+MH!aUh2c%Rb?myag z1QM&4`+5L!>I1s&d)k=8`Tpmoc!2M8VKK{JxK`=dP?RIl@TL&Prq^-aFRM_~#fpfSGQpTyzQ%vW+rBj&kBol(JPc z`Ee__&}vm?;*NS#c3~}d5fSE8Zu*`6_?wWOYbJk9$pLJ-9==&$*9M1xUDZYWuAZ}q zd*81s0&BObb+@=|fV3rWF*lg8VeRZa@z3dwz{OJP_5pR6V;4M~%x*hC z>G!#hBFHJ^Y)uG4(F`2pG(Yv{sX%=sLove?_A<%XM+0#W?qZkz53m1(P={jr96RU; zvBwP}KFgZJj_P2AEc(P2-fq#u$P;96vrc`&>HswdH@SqUEFpjQKBq7Gua~8K5{)e| zucWXMA92bKK7SkINV_ZyeKxK}+IU|WwpfdJZmtB(pN3L@`T|g$;`NQ7#r)#@j6c7I zF#PoB3ZdKH?NI`#*ZIl)6&U8KGz=iuwYxau|Wryw{_k=!@Q-0!j(XQW#me; zR8?h?1CY;ZZ);*dw3hqv$>5Ux@afI8eAuo%l(mnhmR>i4Uq8)*dhvPsGbwWAN}1^5s9D4}ncT{LJ> zm-(EqeO$*54!4n?1u@*wdu|KEEWQ89aVu9CNK) z4RT)2Js)sDorXTjllve3-X{DQ={lkfbAGP+HrvQM=JKfQ#vP+zrBic`ea86zHKljk zk%%0aS`&|Mfa(|LqUoOCzOBP*kSFRXN~W~uG*Ey3L;LZ{(`;kdyrrV^E#3^oSnfD| zW23^|g?7_z2K%t}>b6{=PvohX$DS$6`?O2+HG|Xjb zidIb^N0+y1T;L%Q@=8q{-KVT!oBrb`B~MKlYh|v}$&>{ZC%>x^%kpr7lgY@B%m9AI z?+czDvw-5g{`SkGrZ9HG!+EJu6}-H;JSgb&q5poZ#yufjQ0Thz{7^sk(96WL-p|Uz z+2`~lrBASDl6(3bnT`USeej~~4(_)JS^3>`K`zU5|8;g2FI%|mo0FtcCJzz3r&H>G z>cDkAs*i0=LeQ7P_wdhibx=6)ChYb0Pr_Gsv|vl@A-m>ur097aD6<~@urZ;FJB?rN zPX59BTCw~k0o3&!6qbB>TQEnn_QSBL$r5wGY@aL9XUPn9N+IB`?84QYA=3(g*WTm& zYD?0KZloMqSg$dAETHTFhyFFL?iQH?Gyi^zv|&Z$JG<`tJ)i^D zJakosm_M(b58ra#F9Cl?p68aGV+SdUOY?@vz4#Usuhxz(L1^K&^2#Jt5rz z<|p&kc~vBU{?1Hi<|RYmxFB0}5%tvlUU$g%Uo!;GM*bBIPD99UWC^^By(-y#Urv3& z_ie#{WH&CzJHY9sYW;Q_u6 zuG~#L*E8?mmD{m|j&kwU^)q(xI?AoT{h}b;2z}O>F=h##O})>Xn#?ixXwb_qEDE_4 zFNgAx$7m36^gjchjrv@%(X3sons0 zuzZ%S>+j-s>AHvD$4)L7t-Q+9u_^$^Hm-_qPG@a)s95iLj-zrfviPzQWHmOl3*cfd2(llvs*ddKuzMz4IAh4;sNV=w$Rg6Nyc zV>4zB;M?jN*dq;aZC<}*4|4IWlr4Iukxvp+A@Y8ej}K-^mtciM2l^euv(=H8!+QH> z#3d(PFw5uDsKaxrR#{AKsGtqz-P3&^Q))qQO>V$rH3KMMtnV_6vV&(jkA{9?pJ+eT zTqiH)NxCH_NhjoxxAw(#eEYmOB#zxYO!xK(==RzlT6rP}Mpj6?e?@??nl~Xb)c``i zx;;^6jUn`AV(6&^wxN5wj#U!>~8-1klqObyO@FN7lxYhm{1QaU4qn1xH$k!&!> z!Ni<&kpy+mYfCNqkQZsyx;bnK_|H`pVXt}Q{sw1wn=t%n`0Y`egS~%S=g4MWeE)wPN!Qfk2M?Mp(_ZX7 z*Y~C-DY=s%HRIB&PcPBOXL0h@<3oNJo5}kw+}r$ToB7&P3;WLDul~i{)IW$VK}I-a0>SyJuj*~YTpzuGQbFz#Y}`l^4a8Ht;m)OSIz*_A~zWSlI;Q`EPl(VTarR8uqK$ z`65TkCCouYr_lidZq4P2(i+3{FLyehbt%Hnmm<==cg>(d#l*I13G=co0;W_12apug zzi5oP=OgJA3%qzf)6;C_rftFd+VE3hm6JNqEKlw*fIGXIveuh1Y9=7iD*WO0Uo&8* zc~)`t$YD5NVL|l5-v_Cj1IOvcao>oe{8IA^3ovv2c6^Om0=|WIvU5)N6LPiN4!`R# zg_xKN)7cHk=X`uWpsCaVJol?q-p2o*)D*I>MX0~4+Z;aOa!U-DOis9bOwog?E4^1f|#fMNY8pp1v#J-V4`|wo$xdw>#aw!K9mjb+o(m|>uOvx z-{(7mFuom-NP(Qj(R=xU^PI@tE%Z2A+ba%k@nr3)vIfxkj+*UM`X1Z)2m!rWJB` zi}h~WS6e{biL#?!u_myGVEf5xOAkorpO21G3gWIGMa0oJO7ND9_PBY0J#tj#7=!lM zAP3=*-@fy6g!ftN!f6$nP|ZKk`UZWUTMc14zj^@_uX%j9leial7VYbwVyvAA5V>3t*W(S`f`QvLb=hT>=Wa}8r3e9y*-U?yJdpxOidUr<-M4q@_e;|W=@D;w7 z+UU=^T^yX0n^l4TmS4u@zC<1ow_eW42gab6$fZ6Tr3?PthhF8<9tPgM-&4Kq@cVm0 zPi^t25pX9vsLo^mAVg66j_v>fw)cO|%(7PpRwJ*Ls1jBX<)xfX3YGwG8`l(D%pnWh z9gsUIW(|SmHPjD&kdOzU9-O`pcP|fGDif`c=Org(oWNoOk6g5x&1-Z(>?Q^IO%}XQ zg3fowB_e$5^xm@%?;(s4Dc1<7mrnj1^xcQNN=6e~hC+II*wG)kWT7bqXM=?OvZ+F^4Ec`YbYT<_ddsRsuu7qv3qO9Nw3JheqP3E&LBbD5S7 z6m|-%F-X|Mz0+&$4Y>EvH!)heIzz<0_N}n1d3K=wRMhL2lr@MO=zH5$X(8vU)!#T6 z?-?{?y^3E&AoJcXSk{t2_#W`> zPq`w@KWL*k#Hb5dN&c>$dWPUS%HlTjk_bm17apFK!yG7eF^4sBauyFM@5>F*1@Uih zMFR2tX_dsJ&X{fqs$>y-p)I!1sxl=on2ftv`sBf}c&`efH)jsSo_%${C|!>N5!7h? z|L`Lh;s)7~BsJuwy#I3fV6&_Oqzk&KO1I(8-M;l>tS#uf{pzgoayEkAvJ7SCO5~q> z-(zU#$_W+zX(=Z0n0p)64SD$lcccC>(Nd%CnzYx_D%DjI&QDmp_wUw+TKA0DXN&yM zPp9fghrESp@g#G$gSbO*?8CMCSplH>J4$QJJEaesR}B*S7{)!wn|;^qHi~YA_wlh?>7x}TIC0>=ld_LNa?}FIli#14hML{ zpdG$^MizGV{cE&5rUSWjML|Y$h9D|+F(6b-31UMI^UWjAe)Mrd8j;o?K~e3xVl}%AMH>Bq=#04)b9nPjjx%6Rz9?w6B)2!Y>yc*0j~;Kn^q zr{)sW^ZoV*Jj4BQx`RUzLD6=QD0J=@%eD|$Od+a^#wXV^SGAlANBD92rvK6IeZzYd18%m-m z6wxpXks0}&-@niEdObaH@ArGo=X^fzkHDc@x}d}x`^~>p6fzTKnC#N^p!K|l%Mhgm z$TIS%j^cA{*U|Rtx%oOE=9t&oa>5Q;(ykEBvDg6XY#qmG?C((f!ArIN#{uNtN!+~G zgL;jgPTJdYUAXyH?`u(s70^7%qR#l{1h3NLPJQ4uh0$7{N2A~6ptL$gw+OlXyH+9u z1!B$Nh^0V`<#Q5@hu&n1&~^qi-5-cYJ-NJ>Jyu$X0zQQ3k$o{Q%3ZvV!tI<8>R#-V zyD;C=_i)>`ng#W9-joPAM(o*ATA&NBr2_e%T>Dllu)nXL+UNB@LAV!ufSSVq=et6V z$MUEvChR07<~>DTduQ{qCh~TMbFS9B!aZ>Jsaj zBsv(7)41>T$NC6-FK13sRte*ux32y+p$vTsSAXQ$BPV-PcUbU=+&#|~;nxd$a`grAG(U(^Tzx!qB%)qjc{u-o1XhFSHSb(a)wnR^g|KxvTb{4)jxW zaIw1jcakLbw|x}I);o#(yT^C(R8`RDs#~`+`O*YVCL8$gzlk~pna%eQ-tXIK%WgdV zC;@&hdARK=0F(XX?L7Rv_1vacIN!<&xn&P&+|F$hXt<7Y=eP)g`p}YRMg#71JDbk) z+^V2oKVDk=O#sXV51AbO!i&AwMQz1)im=l?*W!!0sO>vSax*yhJa~ON=eizp-ezj) zzAm}KI>&2an=5+o+Ww!5Oegx39@Mtv>sv#4`e~ItU+@lA+Ww4y`HDTW<&4(IdEvRe zkSmUTnFjh{Y97Lluzs2*O8Jc**z*k!@IBOkeZr0|d!6hda#O(c>03#7Zr{heZw%kt zUBewl*%Xjld+FX)O*2>t7}~S+1K__@(cRoz7El2D@^&NtbwMcP>|nPn6zZ-#emHIl zH={CxSx)K!kKgZ$rk1X-|5d{k%{XVcLa8@%pIQ?}-xc$^MaaX;&?A;9CRQN%wAVTP zpe+oBytrDJjQwp-Ya+je>wwO#-o0<;kauMH!hH&L{Okxd-iJ%ta3jVwzuyIQ-h-=_ zA^VIVEau)?F8bCv(gly*-g1H_zI~}VblBg#Bz`AJNe@=?JoL-+P?xM6a}sGoK8<;@ zjq-EcOSlhR9ysg_fh&?#?<=fe{mJ8bVuT_3-cN^ZX}IX*D9V4z$tG6^G7Z@93YYR=Qn=5J|r-xsZW5;ydORTF8qPnqG8%6NCCU zpAg;1bL>w_FTJbDYYp6|II53QnSfwK0Ecma9bBX*2}$6ddCkY4E$27RHOb<426fR- z;bOD6L7FFU_WlVzRZB*nl1hg)7Xj=_7lU@i*~8bPgzJwCoWRYi|5y^veV0;JuG;ZB zLU!cDYCq2LtM3|^;;C@2+@w_C0l_?jj|`RsMYMf!yp1z4>~-yKEqIgX|(Fi}$YX-xIz&4j}zF zwbNbI02K{CW?2Xk(&&$#>k`QKARQn=?uT_ zmG;pk^1~GWo|QOeW%yMssBmnQ21btr6iF9hK3)HpAq{@sTP}qE*W|n(8Wz|?gVo58 z{w|)op@#r-Ih>DW(Qh2d5^et#IUs|9P8>71hyJ?qj=1};8I->w3c3oKfM|d_DVd-CzU7(RWt8UAKM0Da>Pc3wUwYjAEDv#v@wi2SS1JtQC0 z?;9@4p8dv$`IPgT>J>dka8J|Fv13~mdwb3Qx}l!`^Y3isGt{m2Seqv((b9nY!t)z* zsK<@dyIwJtL=HpxsfefJ_K;`DbY!X){g!cLhn`Nj1R#24=Y2fcEuIcc>(TBN`9 zdb}wFUOlEDLzV*Nd6$n~|C9haE2QZ8lz^S?7UUsksrVx89ex`k{9)P_AUHU}DL40K zh5|=mAD3d=exd?*GGy2GsOtei`S;TtSwhr3^jgB zy?+6FkJ?pM$1&$_HC%Kz3GcAfXG7%1&?iKbw`Q~L=YaW!j9yio_hZ`fB*lkNk2+`2 zVYz4tZ#J`suDKgSaL1jSBchxTac3862ag=~{Wxb8Ec3&e>2U|+bvZbDTFxs>3xDnb z>N-{gRXCj$C|Z|Hf{tnBw8eZQ;2rb|4_4X@qEoA#7O3wv9gDt};Ea9VEYCB}k&t6p zFj(gN1AAcqT-zK1EfA?FHlA8QKZ;WuFUwOG;9=9-VyqK^|3dZCSH6-U=&E6Wdkp%4 zIwLlIr(!5{pQz=pzt|@+`YGwuHRPZlT)MOmc|PCfGWL4QS-{UFs(11YE>M+1);+hE z1msKxMwUI|z(LU}EQI^99=(D(v(-8Q1_Z9ge#d#=@==noiy>SRZ}m!+G5~EAk8~B@ zGJ=8lpU}4NeE7U;4dlQcgsXO6HO-MHp%9VwRri+-xPP2IE0>RakLrTr<4^ZNb3;r2 zm>38Ai=?akkYEXNY5Pym3=-kq-qHO!$fFOY+=)5zUJ72gJcwM$)`zT5YcB-Rk1SW3 z6rtwt3YV*ovsb!e?_{rBKq~=12ZMj#<<%?0YD!VZr7;_r5kEm9Sm}YcB5TtIX%B3^ zeY$u1H|BD(=oLS4sDN2iy6q}2-j7QUElu`1Lz>4*O&yOEbg@3ZJ}jdI7N+}X>>j#8 zt>wU(+Da1$87=rd7NZU&C7R;9&Zz-QaH|;OZZY8cz`nOS$ps=G?>x?6;0LuwnKE|| zQX%KQD2o|&Pp^Qmp837Vn{jroOUAwP^!}Y{-dPfCbcZ_?YMR6T_B5ey$V*o!y^>5x z=KzC?l!EOEI7h^@x&Ov~hf)@16{$FWpc_lDN!ZYb&6MYEvBt<>+OKh06?HhJ!lK{< zN$5M#@&8DEBnm2~do0v#?BMYIpC8Kb4r%1z647060K+PRb+_J=K!wXoLjwCuH9HfX zm9B|{v>x+DbPOA~h9tY1*jWJU1JRdBRJ7ob7+&%hb0VT8EFI?S>To+gW>18d0mRHE z@0CTJJe&E|3md#At4?#jKY7>$ULQL8>SMembtgeaT9B#pp!>xg=D)`3CwC zSpPJ7ggZiN)49X$=(oK=C6Sjfw--e7Kd<#?=t0StszzM_59Sv>{h+c}gA`J%=c*d= z##-{_LdZl&xL>@-QI!IFbla@?CoEw0zxJxhoBW{3csK1I`VZbanNU?;;sd$aBid#U zEy297o6jT_@7BIAog{D{P4u^4EW55j84?`i=}OT; zz2*`7LijydYy zjy(>1;Tb1$p6P>hxd8jM5oUNDAFG;>;|xZM&N^=doIp)e)U~?Z6k?~_96t59!psrt z#b@=Z@SEM8{y5%4uKr?rp@Z|u*TR_8&zR@@J9WmV`HM0XbL9Q-MV;pRB=xZLBitAN z*ga#=LSL3~`RRMN>~Yxb&I&4YhJ_5%=y#9I-~m^`ZAQG$kwJ9wY_c@mj5ECIQ;5$; z+ed#s9 z*|CM_eKd#J@I7ok8Y!GasRtq#{<^BCn1a%ukTxb7R`j8^b}~w0KmD08PUYw5mlJEu z%3YNNI$tqmuPW@X1HM~nc+Zs{N{jx?hxhrkCu^iYD;T!wRYoKVZ0Fs%z<|2R*Jm-t z^}b|i)>fcc9=8Kurq|#5JZ=1#TvR!tpyCXqo)uyT@+&rX zUOTvLh(rB?*OK;sYVeF3LQ{9E!X8@&5w3dl`4bnMF5V!)6WSmr>JmqIPM`KL5qGtQ{{mCHK>0~z%xF3EkWgb!&GXnqZ`%zD%0Y0^9=gB-oKIkK}(Momn$5RLx@DC~j z4yYXO-DR<7*)zJm5qrD5Gu1h;M@ZFKT*#UW^~|$jY{SU6JLFuHgQ}9 zk_|5hKUKtD*>~40iv}&=O{4GKVeIi)s?VnU#-s=Gn?EjH%`^kf#MWjv1q-mf#uMa- zy-H5@ZeXXvjlb{NkNxQXl)u$9sPjf0?oE!or9qvXaJOP6h$srrc(IX-4mktq+ybxg z{u)zAIuP?g1-fMp?KaaP!tpTEp+G5faJsi)T(zu^xgjifT5$l$er{7Tk3HrJSi6~! zXYq>3Kx4T^4AOLC%$h%={=UWX&3aQ81ZO^&G{zV}q}0Iv2L@!|SPgIQL4T$HNhOc+Fm|GD7Tet97O+8t>D20d4Oy0O-}9Z<1icg3yYx(N z|J4Nb%(p*f98quh^5!+KmpJ@T5&Es(sRy~uq(#;p7jPx3$a#7KOa$&*T~#6gaSr;9 zJQo43dDgIDqs|R zdCOdFhj2bZ)#|kc-ud0vBu23Jn@QDSqW(7id}`c1coOX4Tl_QbS4PsnlS$=tPr8qw zb->;@;)gvvVhv8`%)@zJ?e$aL7!uUGA7g)Af<2fuO9PW!y}IuxIbDH?eo0Hc z4)5^I)vH62_&i^uIPSfy2Av5!hWA*|U*Y>H{S^8N7wz9xbKst$^vv=c$A%%8I-ZQs zZr6Yl*NnnPbQK{ZSevFn9XUilA5pr!2Qb%_I3C-e3{TScoXD4S0dva4gJaFucX~YV zV1}tK*#1jv@w$Z^xvlWz{h`kA^OnH}2Gpl+QNA4YIEuR7xephoT2$eT=NX2%YG3-fq-KTGcYVg*NU^YVV2%SKA~E_txyo#w3j(_=Q)Q1^B4 z(}hLca}HZR7|XQ)lD!<`CG7p>ufNuC@h|2d1CwvOD`NopvL6LZulPZ(!QV*m5B4$% zTe%2IlYyec_~}Up9*A{OC3jGf(a%X=an1|<0RpP>XEU+RDl~6O=b{wew`95%aL+;E z^UY-saV8D%3{w3wb0cEC-J}g+j)+o0{wiu{nO8~8M4AFr32ravK%48;Qc$! zU;02UqaHi}&JacL(dWKTf?d~%S*0S#4H2;@?0z5*^!$W?zYG%KU)+s(AZF4#eT;4quz%PqMlpR z<1}2N4N7aD9S37E_dDILn`dGPdrTgGDKQp?A^Ki_cl0-%7pE;vKpk;QT7h?=au@K} ztl6-kUqyU}kFkXhdk)qW2S-BCUoAx}(7CGwcDCJ{=W*{%yYEY057Py;?o(tJMdY2y zjh*QC10cpf6+VEy1hd`J_Sa~o;6~zDC&QWpm_9zTS&X0C!f&E9FYHX9*z}OCE&9`F z_FM#we&Nxtuo^FI@}XS>o7GnnXTj28HT9L)I}3qDts zAVT4)ABTvAj2JmeATTef`6A^f@+(a*gBrO)qF`Nznj%Fi4+l z1}4qH;?;$LP-`+=`fboN5UK`ew~}f1lJ8Ohmc2H!D5H!>#Ict;A|6(UrMrr=fa#SN05)#m5{Khw4@5suQ)oXstJ%0 z&L%E}xo&4)65A2f8_HuN>dyNiN9<6J-J*&F+@2QjnjUlpo9M1b8uDf^6dhYR;a~!s zS+D*b=XZdVXB2a?1HAC_Hebv7*S*+RV<6*!{*$w(d498}V=f`lEx)g$aHu#1a=1^^vE|z;h+u z6`aD;T0gGJ!`iH4d~BNqtZaSpW=TOza;`=rOn@Uz=KpjExN=79M_H*Mc^Iqj}fwv6EQDr zbk@WMIlV2Hyrrr$v>@o!OII2q5pF(Y4GIo-hK;{XauH+~xa?SM_XhX#`A5p3ZI~bR zVT`?(8K4PPF1qCw=#Tq2vUWfb^FNQKmz1iGV^31aF7YT?RycR1;pSBdGvMtY?%}II zUiLG;KfjR+Nw7M?VVmLz{NxW74mJ*`Q~Fg+vuJ>%uGaKlL+p<_K(JUwT}DwXwI&I< zd+a#_8c3VeH9tVx6U1Igv(@;yx!u#fl4f7k1XaOg9^v0Tpv{=(ErNa-?g*LCc%Ga?Aj+_x%IOQkef;UwIX>N(M>p+jV>Kd0}QY zS<}?*1P?3O9|Ugbft`nFymT7&O*5=Vm0y>K9F>Z^Gh`bWy_0dd_=O=z8Z6d4*R_VO zBTBuuXr!S#B_VSTpIaJ{yLL^kD>=qgf&PlygU`r)*na$lzgY}F z-*tQ%5^_8cDE;?d?i6x=CqkKqMR^x^7E87$$Q zDE8NYm2)rlrAk1fDE^%OIc}$v;=Wm8&3N#U`ChR9Z$>Rw*a(_sw%^YNn!zp2)4Egl zO(2D{W?t$%z8`+H^^!uQ;pz0$tvp9N5SupXxWHx(lP1Y}9>`7lq8sY82YL7rMad3s z;Y6T1HZ^IExu-L)i3h?woZc_?8Vb7*)#GlYT-5?IH)0LF9mv3Ya{1hvWSE;-`z7u{q2zJ3iUZ;s8r4 z|NRN16onJ=<*yc$MS<6Jm`DEr=DspM$^EiNU)$Jcj{*{qfg^q6$52ZS1L< zOCAjJ@-u|^tt^MRlTPS=jUdGs;`^xcOrMdMAzYS>ay;~u3?*XX4?9TQKw+8DEVCQG ztB0J`{;6RuI6gqr)=3q?l}J*S%=nvM31Uv#I1hiUTjsc}l6ah~#i73L-{bNN@iWS0iV*@(!INGk*ZXV_I> zAJNdhnxa$=D_}JIMC_PDE+LD&TyLff7_MIA&N*)a&-kRry=I&s=}qzlHg_^KYO-X< zsu@Aff0mqEE6z|%mO9|DV*zDdV(AbRlga(5X(|0NGT0o)herJTpEJ>>u?VP22EZp;m2 z94Ed(o=mFdIQbU8D(vgc@VVuLeRJ$XH!U&8G`%^^#{2>2r%JI)E67Q7qcfjz)z<*l z-!BJ#8<@wC`bzX2d&3QbyN^#E7SI4E+O?xc zuOPqe!Nwmk-0L?8v$x9^u;=;h7nX7So_!da{Cx!P@nwToW$W<0_uou}V2yzpM1BkN zK99Z~EzgQ(h7uES2%T|w=%)|4QXYejJ#26?L#dOKBmp0O1bE&qw}-3wX# zhDdv=gZ!s$rmKq9z_GdTri$4LtV^pu>2a9Ai`(2=+q^p9^WSlw14l`a<-z>i^_v;o z<)fxK`NtTpxy(M>jd!!6$e2s?n7^AAOr+K25(E|YY?Elrb#Q#$1d%1 zg=8J7gOb|jP?**5XdkaRn2XC8xuB1WkMmT-{W|Px_q9y^z>55uHd&Gj-f_>4HGhmM z)&;KZPIXT7-CPif3Hh7)gYe8+T4e%#5)@wammOnOV4l z*;VgVw8dhQw}nn7%W!tLjHmm9yw zK2h1ZzFPCF8}E4|tV zf{#Bk%YWev-C4|q+oI@`bfiiVV^9M1J|_01lU(4ewyeRb>I!b7D;zt&4B)|q5G{vr z%*R;wPfuemRL!6HdPw*k!i_ps&ME@~NH`GP6@~sCF;OY+mW#-V|LE2_gnRH&pR#@G z!pN(8>$)5opai7~X0ooB-)!JPXPlSV)edHV8nyb0*r-HrQzdQ3G?@@myhQ{SIV@|6!J5kkI3GZw_wzSr1tYGS0fx`z98B94d z-yQkl1T(L03LM9t@d7HwC(Pj{aI^a$%ZH1qaDx4_%ylhIcwhhfu`Ua8z_}{sh-#w1 zcTM7pTd6JV3ENCk9d(2^M(jz;O5!lDFLa6RfCc@w@uz>mIb$s5v3$}N% z?QsG*#lDl>o2V=4>?Vpla)!jQG9d%>%Y89!_}*QF{bVgsqd#|_w{;G7f#*!H-zTByU7#zlHdd|9O5202)Tj;-b;gjJ+fG5na&Sibz*U3Om@nIZ z@8^6x5p&pP504xnL$cPdmM`d6d%1W(fM<^~^m~sg52M~SdM0P}OoKe!i_E@Z9IXOO zAIwhO7f=SJf^%?aH}U`%@*gb~ih?QQ?{!jz1DvxO|B!|H$9Si_#t0AcYUYk!BlB5c zPhI-ZN6a}-q=z>pp&|53u3?pD6gOOW^~pA4)ESaeik)ZcwSf7*!mXAvkgZ!oJ zHV~v2^w!b~@8-1|aeYn};5UC;fv*sGaBMsZHjhbgK&Ejq!JGtAgX`l$@&piFY?35? zw*e8e*E{FzP2f^e``oQvnBQ{VdUF8ZUt~?@=L($|CO)p4)?nw5>4rG&kIueDJ`KeTz^m+)J*1ihk{36>ru9&ajip z<1{484QBBfcW334A#wD~J7MH8dAY7tmr(%N&CA&G*E@pnXO;uT=dj29*Xre>5#-hX zXl%Z}guLR+SU0uX*xzgX^~=nZ8R&&mq#6t3U4d$G)5gLD`BNqw@6mS?NE@V3i`;xjih;Ga*sI3ln?-)% z3Tm78tIz7#L515uR)-!D*cdhqXF@IE$e3IHOq~%#Z%o%-M_t+S+v-q-yE=&NUdulp zDgj|i>4Z?!vkh(9lRZ(doDVwl((8i|kY|fLcpr`vqHmmXJ#at`_H@lX3p^(d?-J^H zl$c%M3?)^kxD)pIntLp_?Ipt1+)uJG!pNBxXfL^Aiaz1&0-E6@OXHAuwt>l{)f#Oq=J=`?j1wlkN0!NQ8^NnIw2JBhRmwgwk8&%Z<&_WV!S8Fsh=kLdmn4YR zS7hH4jJfdWuVLOo$>38b^xW*ADfW1|60V^Sp{LuB^|-zR ze7PF+f^A0~J}B@X+2^?*%w`wthmjX}giT8A-!S$74nO%O`WSl-QU)GAw7@;!z>%{F z^T;dTIq*5?g#{?PbEYQVGAniF|-zieNHFlIW!e_5Mse=#=~W@OqDFX{@#X%xr#(Z_i3 zk*3B|2fRzn3~McOARn4eLL*(92(eirGAT4~2|E;<0|6#B@Q6|)ObYqOq4}fEzou+J zrG5Y8_6h83{K4|+n*r*I?GKIYKAM8%p6=xx^fU8WrOIE&_h;BQuId%cK`9Uqi`HB* zfuD>2P2M?%_nNms!o%NP;4A69uT7Q$+-aoa0rBKVu2l1|IJE>vC z+Jt;zI^E;Kg8+QvAr}+$gcJ;~+rg zl#~Y>_In*-Y*ma_(FLb{jv0Q^lyJ33?bTWs<~?e9cM5*61K;GXm5>@C@J}APnRo#? zECjyi9QZvGysktMZ>SG%?6dXyt2E$n_L^a`DfTbFH~zwo`Q@7eWcevx)&BPA@BAjGEbBpZahf`bjLwfH@MdUV3^7|y3q17jIm8U%l5EOg4|78;K!9*{s3a z>*(WXK6LbgdOlE$PA-nl1r~L0 zt$d@$_w;Q1#39tN%OyI3pW&Us;qgW8nKDB-%qVT{&AbmJPN)5I#Jp9tXH8PtI|BTi z8E|$DAOm$UO={H_8&In6Ha8uVg{U7!#xCsUn4eAm7>B$_Dk;&YT-2!VGsgDDa@qiM zpt1MCUoTj>j_> z7^5mzlB`sNf4-96E*YAFk3+ENq(AC`IRoZ%5!nAaEBE0r?!RQ!XxZug$Y<+lg$+I< z=-OoYlaAay83QI}LG)v28qa(f^uoK_Q1&aoF)}>J<*pC*#=KH%nqtss6XBAUkRQ>5 z55kgds8>EZL8eHxew>6QY~2-M(Rb8=$6dF&{6b71Ahr45wYSJ6Y^{@F!Q6{**S~?c z3;IAAf;crb6WDz2mU*!g@2<}%SpH#Oh2xr2@Ju`jG^l1prM_csQg`+-M z9sRq{rt5l~y0G_#+2Hdx0YNxwHKZO}rv*8Ehw>jwh=6fY(zo{%=6GMSVKtAZ1kMLs z`LVk=AxQeciZtd^`Vmk!pVt}q{|inj8C!DJAg?p_V=L4Y?CvTQFXQv%%_F1WR!3(z60kDCdQu0@ z6&C3w2-%}PAhzwF>HzmB#0^g{8ADfe_<(1u1vpF)9R;o-KR3UywJV$h-=AW;DKOVC zCTtqwds6~VHXLW-xx@i_qTwCKf8*!2@RG9^K3^6+w_Zj}kb(Kf+8Z`%Q`iyDw)u&E zhG4}neqDF1;kJHxm<{IOH^K+08}}PSOyAZ*fISJ$C-FU{Kz?Smz$@eXsLS8w4QhRb zeBP8yDc&znogn47$Kuq0B~)6;S)Ae}K)2=JrTbOLH>BB6oqgy8FFrkc%6A=m`7%$- z6|a)OC3Eta925HB_==9mBJZw|J>)*;BkT{-)wZ1oCV}jJCAA!GN8pZJcwxw)5A{vD zN};Z(izzuD_gfLdxsE#j#eP*dK%x?{YewBQ)a<|Q7cLM!*4zEJhy$q0?g$^zLp^@1 z=>(fJ4fbY>pZ$wH1QTvdqm;L-!SVRE8vi>-u#z#7c{_pr9_i0%Bq`+1&JgdsUXlfq zc~5ys?C&W}j6OZa?g&4Iubmx0PTb2j-J-L#=*x4mJRP&82W?C&gS7toz-A_z81T;t z8Wp8Ei%R5S_2-4g2dCM4mk^zTADZU zF7@w8X-$;07WgYGDg=q*9-C^^qTFl_yS?qb32t1#ZhS)ivX3#e^wCE9Rbro#g;{qU z?(5Wz8hdH0Un5whrU`TW%r$i5 zr5j!r8-%U?JN$%K_7JKtVbQ!t5hU+c4WE#*0MWxclr736@L4vZ_xU3W#e(NW=wfZa zwqalD(>Fx8eUWaEI~n!wj&mzp*jpEjB@N$S%Ro_6i9fl=5d0)|a&zw(0ZDGb`s1n^ zXjU{Qczi}5$Ei)39PBwG7JR!IWuOGN4SkkkQ2%-&yEmkuKpD;*Wb4oV>IBXu3|R%^ z3h-_ESDb_#_Gj2EKKD~6L+^Vg=+Bn{1Ap0H%=>hK;cI5T?J4Y4Dtz+bEq*V&61NhZ zRkYzlIYoHXh%*eyCGGTm#s21?)R&(Vl!0O<|B26cNyrn`x?O2!18og&87hnoL8AP{ zMDvCO=y2?g*uXuwtK36iK0ppsP30`2ImKboq30lJpCcUK@2$9^vr3RV4IRD>`1?*? z^KEgJ-6}ub8s=zxDR=)A8UVn zY;^^P_a`=wDcQnjHF7F@p&G<=3I_dWLWIKj9Z|swRj@QRvJuQcZnem>vM-NpA${?4 zcBFz1zQ=V07qO=x;J!jxYriIZ6sP$d#$^W{`q#^CTChj0`or_4_xf;R*|g;CZtRD0 zwtpIce8(%%jNfY#(4Ujd-_?E&dqKwoLyQ(NKU`>&o*ZZZsynI&_g9&M#E=C4V2L?= zS$vhjc7fOjw9IzMF`3OZY*8B*1;=Q{)5?EI z5J7cKs`$4Ii0|QF@hLFD`K!-ixl9&f8*cC7!<_Fv1q$=oZ|Ec6-)otWirj;YAkCdg zCr~#(OAArkrLZx}+^=F)SY z341Uz5zDr*#oWkKrdd61dr-ajw1~dM0501ohYidBCG_==+!{omaopafpa0>$Idg)} zCM68>`vxza%e}FO{94q?ShO8_<2?C_+OaAda0!%?C6Sq{1c@Cp0u*y7xHQHd@yn!8a_MSd29?)n>Po8jMd@t zi{Gw4e%S%r+1(Aox5$9A_8tbzvt-#d8<=fcftEAEpVrNKwc+whn*J98!Qu^Z6l` zUqVp+kMY3(=BIP|Et!v|nSj$-YoAYpX5jF#G$#RlcDwv~Opm=agg12;;-4po;C{N;4jFZ6sTQOszhUUAe zVXG*J6gw&gudgZ5tDxU7*l;tywM!rDggB}`XAz*M^+)Y@Ayc^juAfy=8{a$Y@_SOc z%>l+rEB#b#K>wxKw9-Q^pya;T(~Wx4pASHLdT0*$vF%`U6W@OY!GslHPu3A}wUXLPS<~rs(M{T0n{P=;n#AH3Q8+kSq zmLv15x}ZYmKUZES3zE#AKXvbQ1WjJk#z<31?BOf7_?wA+u`BdSzf|Gb!>Az#Y? zJ~VdGy_hP=0Q`?hcm<%(U_D~6#a)a5t}b>LQm&i8bpP3GS>#~dmad3@G=jZS5f z+PWj`ioEhA$PKx5GCLJz4tO6tqH{tC`G0K`#QKSQIDf_d`<#uwQGuNHeuI-%kP&UK zxh|*&1yOqx*&Y7>dGFG(D#kfqj{B4gKi&oBVRJJKeKES~=iN9>;KcpDsq;~4@H+S2 zc{=)3$w&>7C0 z=lW@T!4ckiMeS8{ML({(d+fZT0Q#;n znwb=9k@KspFY_=Z0sZH4y~+{w8jzMGYEp*t!R0|tIp&iD>`CAF+S!QuQo8G(b}AVd z;me>)5>kdQntJn(FsC)3wa{1nL>6RRezd64I6zFg%G^{D_U0|gtdsEmbw@64sW-|H z((7Aop3v#RsedoD-7wGTd6Q-ASq<{LqqUar<|AkHTFYJgi$)NXVZEl$pa%4kHbeg~ zw8Ff7q!ee%Q$wTd@U1mG?KGu6bY$E9P-}F6hkV?=F4O8D`BR@E8TArY*+!KL zQOsSI2T#6p#Cax9=D^w!fSE)-hR3zoU(`xf#eL8cMw*l?JdRjEq{TVwTPZHEU(~6} z4)5Nz$0)ozuNi@}kvQiB`W1LS9{Mo#O9ed3TWef$O@M0Y=xsyfq2`b8T28!5f-_EX zCA$Rd;mUW$jKo0fo3=Q7GT9OD_h;rh0`Shc+She3P<@dg%q(eab0M1y< zxrZYMNyBO3!09u#aCRjj!Ae37a&Dij;XwTfo`{48=5ru7iT0*)8W-I6K3MQTjtII_ z(&PYtUEt&oqbkSWCs(+P2nXgjf;+^9Tlz)7QE56rZ;=SJr`>CFYqX%ABVI8beLqJP z*n;u}?P1r&Y_@hYV+i0jD5 zDuFsrqpPpV?U|Bt5n+n_FCB|zHS{xf5vf1>+Vb<>}TShK9=MH z%YTbnZg$#(Oy7%*C$CAc?0TrF6?ugpX-IdCwor%jx95K}fxP<->zJdNBuG2$;d(R& zeZ0=Dp1^E|cY*A@MMg*Xc>VObF?_iVe^s!JqkmM*mS!p%;8?25xp4IHyJjXuUDdFL#?{8}vs|`N9vw1J_QeX`uzwX@ zyI~Lc1<_1|WlM0g_pJDb+@;qSo%$Pbe_vTF;cq)7mFH7yx-$^a%GkM>xm*(B>L99mF&-4fhTc;0_!2 zV)c3Ky|nhfTyVu4u1IG3-a_3yZsup;(Z_a>J8oj$E-!M-)6Z>f3N8SE4VDaOYXA>_WWJVzVkqh1e#=@bq(~B zPE>nFU#fNnb*1MF+Sg1VM$JuY=5P(+e!zXE`r9LG_pvqn`)~VonV&h1)oT#140abRIKM%BFH# zTr~$al@X=dn<&?%_I^Lvi9N4W>o?u)Z6IUom9hS^Hkc_m9u|CwJ%rX5T76`R5cOjA z@V%oBV03Bw6UBWa*xEenr;q;Gx(RC8{vu~s-?d1BUI`$P-3whAF#mDvY)MtB8YD

<~7wmTucAqzgB4e!}8L|;*1kf3}%wW%UMMHj^CEjV2yZ$??D-U^E#eJ`n zs3AZwLYA!z@0DY}(=>FDpT&H@N1NaR?Jc{S>?;gGj4op|5AO*xv*Iyl-f_U;(!JSZ zS!7VZGAbx1fj*4*3Y$I`7tvh&~;lkTpsdX**=dWlB>0Yx3e@*4p7X!#Md`D(i{D66hpARccPM}{9 zPx+0b_OQBA6B@#)1y^78zu{W829@h!{@yonPVo?!m}gc45xEw#>gRYbD=j0~CKBLW z-jOo`L|$k)_9Sdwg&P8D&-3M<*8uh8Tk@f(m-5^ayB(DziTfyT$}oPfB2QkI`Fu+W zvMJL#PTUrN$gdq!?Wj+ED(x>*Hp9I1jW>cPc(Es&Sk<)CYzhI4?R8g1OaXp%g(+9K zLV@Ozr6~H$J{XnguJ|}XLpbHMVvaKuC^$#!n7hKp4qJmH=9}Y;A{#a&72ttQ@c}sL z0#-UB2Z!X9;P~yz@z6Y0sCxdNchs~31XsWNl2W)txLn!&dA!mN9KISXyos{~+Sp;y zM~=#n{B^kN86Ec8cAvi)dq*4onmkWQal)PsZ^fcKyk84=Ul{K+z@9i2>Ec*AN$|JY z`gGR?{U8HXQw%tt(J+1u%toHw?Wcctt50gdo2^~5BY2-{zC;`Q74=0b=?qOB)R`mB z22)kcAYbCcKyNUg8FE%sZV~bGcHB&R;Lum>0UlOMc#1ix{&D%PvI#S&tDqAso#lZK zflPyL{`;Vm&~5S#=cCyP9y^D9ByhNU;O)9B7x0X}Y8m;3y7>2oPYw5s;0{C7ufzCr zJFMNuy(C}<>hE-mXVdU57c<()7m7KtcYfP#R1~mgYT`e|^nftk5%%xTWAyW=zxLQY zjX8o75oAAt6g;L4TdhSMp|O>RHm)1MqttLE_tkz_J~Ki#uEpQqIMH0-3kh?6!VXHa zn3G*jDr?0YD*OEr{`ojdn403IE2b7E?@FB4zAY7X zd?Z77|KHbKYRZuNL6fiKI1TLTjasU=#W_Ylh_~vJDWuHuYp!bwz+rDaI`T_3I5qzX zue!*?-_~2uzR3kg?eE1=(qg|1^J&>xc`FDD&ik`%YY7e^@x6QoitzemTvVvAJxmdZkLv4Q3a4=9P9dv{yP23PiiJhHK5{Yr>>NrJ)}1U_}pL6hWf!Hf9Sqh z!Abi!d(=}f_x}0yK5o2A_L`-Zgb7MOC2P&`|teC-#q%_H0DBTSC_RBF*nrs54MM&$y{050q+q(R+xTR_m3^6#qFv7Ms1>K~ZP0KEq`E zHI5sGF4Nwn6QG02i!mY>y732%)RoWjn1tDu`*o|rk@8U~c%Z`|Xf9rUQ z__dA<)q1ZDin?5&P`f0J8lOMMo8xl$OLQSn?W5uZJtr_7)81)I(Sj=s|F|Bh8N*Ne z1izreig2R+?O=ec5o|NQCLWu!g7%!x0x@`39_{gO5XF1bm1@aI>ceC(_+YMPqJVvl zd6MVo#LeJTasw~53F@i&`oG&Xu=i7SW6n^-5JqE#<=^`u{~MjQeSXL_DLixf6z*f# z^Q+hYR|t$~&AV?5@ZOmfPLTZ~J?56AA$+}))pLbj2b!XJ=7S~oL#AtFVq&cp zFm|*GsCHVy3yYFqQFkZoVcair(i-nT_2S(xJ6+-8X^LMj8DxP)j=eK8g#{8HG!KoX zVa`R1dQs^x`s3zKtiKU<1p0?r!yc=8z#HDJf2>dzPV~R0GOe+N?i2s0#js~ltJXe% z7ySm2SDN=#+_@tty$OtiY8YHEfeb86CV#OWc2>$V3VkRVPV2|oI zMyUdG@ClbXk;UswfJtLCz7%MGEKT&ypVU<>=Z2d_-8SOcH6mq+7mOBfg| zt3LAxdCZ)QX$uaD@UZ-|=TRFYsLS>$D3h>*kEvtc+-~;pH1UV`-|nNpOLz9g1m;*y zbWSyP;T$*Mv*JHIfO*8F9N!%YMkvZ{Ymh|WuGHW|I$KxtKk&p9>!*uCoA2*E57fgZ zIr$~t;~af{po2f@G0tTjuUi634IsWnyuqhX2L{f}TKC|6oJA%v@GupC2;-NC49o$f z_Hwq>*=Rvdq?h1$t0EL#7ffF`WDJYWAr{S!_V6|R?YqhjeemmA>f-+{4U2R<6PlZYk+)s&d&vQm@rRZp_uO{UKO{bN+u1eK_qAqZUvKW?yU5$9qKoH=&ny z1ZcH$>TK4RgFa2Udbu7&NPivRvy6M2qFK6en!DDZ{(Vr*^|3WXN4kt0F`bDQ}GTz)*1-_jNv92OSX)AUUA{PZpNk$W-X&GGKD7m^u?W5dVQ(lyTj^h5@^bGVLQ+RM%B3CV<&(Yfqb2XkSb&tBJB#=8lGqa3&#AR+Z*#+$5 zVe{`Eo_EE8AyH_m3_RJ=i!{_mz##jxn(v_olx&01PBi+VAWX*<^Zys-iO+tj zz<=M2^v1Pr75MhgWjnCj6gJ<_HkS-qfqtmLvgxWJ&`>jLo%tjQTn$(C3F@|R;k^Po zyRZYyd44kP8^u1{DS9&}4{Jaiy;=&XHi+$|3U9qa|2zZZS22wq!lUTSC0T7jV99LE zcW=b^Waf)U$BQ%}!?aT>FxLSbcdqmrP~v=->Zy7u(g>^{54nlS8zASgTsx5;eaPCP zX!#}}zpPX2ek=BXy$NF#I6{DEIW4tCCpuuc-KYEyeR5+mug!}n@qD|fdd}lCzP}6p zs-V0E&s`nW0t7T*VK;U~7SCVpfjRzsU*ru#vx*T44XyQ5Dk%}DM zbG#IZV*eguBljj*adzgSg|Z1PL-ZxYFRtRZgb~iXU&y zj~QA3_s6R)f$WOd3+wel0_TGY*7|bOkNR-L`tMnl1uKw#S97;4UkZ+2Zq&2RlK`{H z()g}wBXIRKRneESgtxx}S69v(0Z%bkPJR-;f6R#~!qFEnaHu%!s5ACc2SmiW&=R0U zZQ$_tP+{nQ5!9HBc}&95&){N(z4gJiRP=7h!Qyb%5&2s{v&uQ5Jej z`nZfeQF}IDJr-rantX@pc7-(#e54B*bT zryG7q2iCYlulGEV1GBAE!7}XeZeR0u7YlWO&WPDVap(uVC0{1xj(Hs5`!v@$C<7Ek z^6%$knV_zCy_6DjL_t<;vqjFxWqL_-KupaHs)zR2tZ&PMZ-`+qV-OeKvqXbO!;~RO zJU^cteF+Esg_Z^1P{8`r(y7|NxCi~kbLG@gY3OQ~{P5O!lu%!C@74uFDZKx$-90O+ z029g{VzVL^&^J&{D8Hr&qE-ttjA1zUa{ayZT2UKL`G$_RB9COd@K<*H9Qs)|owvQN zYQe)hE97RV%gNm1+EA&o!TqVxGdBz53?2EE#rDJoil2Wa`a~lPZ>Im;R~Es(ugd<$ zBFty&FGc^npMvkz*s3qIJ#x^}{mzZyfn!s|+rhfv5|5S+XGp;K8<0NG(1!g^*ElP0X`?v+N->`37U4{nUqH_Amy_4Sw6&l_H}!S?`gcOM)$OsC@O8pXH$&}n zEGvXD77mwA8f(y;6|eiTfIa7RPVWselz{BQ#FH~2*e`LaxHkFWA=DEo=Zs15Ih#MX z8#rYF7aeyM-LL4uze>BQBn=q|%z2sUeAfyL^I8v=|HZkf&a9=a7Q3YvXUZ-aAJrAn|6dEW5PGFw9wz+%bY7KI@ zB(AP!572>I!N)%VDjMK-c2u2yrj)ceAoo!6mM5Dj z46Aq@7`a6Z|EdITI1h-z%aL<87AR#wqG~`xH*=F9OZ>-aGRFjP0-|QA`M*!~chJ^r z8|-&AolC=n+Nr)`(H@*nc%_<>$B7+a*JP>FvcwRmhb`C%mt>)>ren&j6mvJ%k}ZiM z)gZdHmR1Q{BmX58VH%AhoVKb!SdEc z?b8?ap<1kzpngRL`u7A^*7kHkVRK}W5%=o8A_0t(Df$qs@#u?*wjJ2LD@!4=vH?D= z0r3~xG9YyBbHv7N9d0 zX{+*fnp7Gxi}@wTXU$n5I|nK8U%Y;jR0O$XhNg5KBIRe1LjGoOO8F z;reQcf+6bT!F&?!0uB1maMXXjdKu^KeHlOR1S5AOWqcOtiopf;0tM9+2AUkmWQPJ#yJ_)gkiWKEV0>ph2sqQ;q0H;j6 zemq64N=(|5VmsXPHwHU5d7xjxpQ5cY83c&r@a~diQ{QQY&2b%>Gq+m9| zR{o8;9(a{r4ZTn+2ELS!?xprSKw(}6%cFO^@Zp|Q#jUrRa8rDImn0qYeiLyGd#*|l zAxJ6Jdy@rXLj%3r(~(!BWJl$I{Ss-%&l2Bfgx@29}SrltSdfGUt7j=Z#GR*RMQ+ZvZCZg)3MLArbl5b10Z0-KUks*xvwN= z=gw#0zUsV4@A^G@xbOUU%`}k@qDCB;jj(T7ZG(M%DHMJE32J_F=qs6+hGTngY~iuX zRh$1Fh{3sYqI`ckFh3(YQ{p~{dE)QkB%dM-U?)0e-~b(RNPoea{VCi(Ms(fl3f6>A zMHW2{1B#GMX2rk1hq-VDbJr2vWAc3W9~Q;?xtTLhcPjeY8Lx_75<+fuQuaZ$SX~`3 z7!Kc9)w6-IrI*7eEcCE%LC5VVa_SpyYb*|D;d##L>(fGzhLt#`yOL*xK;YGyo5N|m zHwLEs)0*eQexi|mk4Qeau=mN%`n5TT?Qb(n2Wi0>AI+eC3riT{&EWb|A`B&_;tZVj z$Qk+?_*O6%dCYTDLC2n1fr)#8?*Ow5^nTImSJcCMEBgs@whkNEW$7#38?}ZPRLhGT zbJ%B_C*aeExxah#rz=n4^Qe4d(r-`I1o)pOKHyq6LS308vP8=kPDS`L`@fchyZcJZ zQdziXBRi#j(FJubN{h114tx(!ak%YwnF4c)r%?v#QNP%tqWI1ULKo%m15QIlW4gM>zbDBU7$Um!)nFTs|7y3Fj@qC5dJ94d%ji+&E|#T{Lk1mMp12-@&!q zDv6d0%5ddpN~cAsCb-$0RW!srfR%gQdWaWd6xK(u^{gLkPm-NX0 z?C)B=#mNE8mB%A3u|JZR`sW0_nif>%x#dk=l7h^_k8B^~bbxSk8H%6T!Aak&xVS*f z^RAFM+2K9OkfiN+sx~(izYQI~>tz7N-SqSX^b?)XZQYN<&yjO3rbU_!b8L55bhFW) z5HZa0I!n+Vm`_d8_7;-B5y=Wej~QifDb8SIS43S})J@6JOaV%CnB}sM+JKNK05_zuG5}VCqImQ2Du8bLf*IFdZDr zOb@bxwbJMOWi-4n_p6KA(UBM4TFXiO$d?02U7o*eAMGLh+Y{RBoCJU`adqyXJpy|Iy(=Ky>I>#0UKck$~_YJ{O4&OH5#`IVFa+-CMXk&J%q-`ec)dG~Qo zFMq83>=o<-of;mrIjRVEiZ;^fOprrayxnva@4p|v%gEmJ!ux{kVC5w4llf9c*%qS+ zxNjVuC+1NH*Sf%xgXOqiP9}YKwpSOKK6nHO*T0iE+_|pogo@k#msYg!e=4}zri^fn$?HptK6!n%8 zzmBF_IVk;5WpRXw7mn~q=^OmB1%%7{m%-xt9gomg*kI&4yNx#$rBWstKl8gV^4E=V14vCP?(}{>N%+;@+A(;F4~z*3q+z47z*8l$ z94lfAnWC=x_1Y_h%KjSbicmQa{4Dd|S9?RSBzd^ypN2k?-*-MREJ=e)u;u}2acPLm zG2wpVst>ORgBLbs)Zoj1Wq~K&3j(e6{or+d3-G+ayU84ZJyelh&x%RSATc#TKkc|F zXlu3Srr~@wb*=8r1p0NZ7KSD(DWi{tPSe;CeT)uA>wT+c(FgVW(gU&-DYzAC{+_xA z^%bGagu%e$p!T`H=)$}V9Df{k@_LC3==}9`f1|iUSZDF`HWf63)u8jyF$}e zn-|faeqi5W<*^?8>Azg|SzjI`bNrMTR*Zn?#g~WE|7k$^`)jY?8R^2~)FtYOHJpot zrb!pl?EuDA5-Z82VV~Jh{HC1+2pfJrGKoGLAWr?sRVV`o8>}M-tB^}nRI;(;ssLxU zQ)?j+x$4TEmE)L`KF!#FGah|v2Z@_{pIiaReSS}~3Ul1Gg@z*o_S#VHXMC&RfE|?n zDVR*cJa}}FvECzZ8Yur_RY$pV6o_U$?CvQU!B%|#YimC_^smm9>7FLQIY+Om)0p2- zFVU3^z&$D%$BUD{oJ`4NVx|?>NFvr316?M;DB+=eZ(PK{y2W zUlszsQ91v~g6!^t(9vWY;GGd>){wG?VQ+nY*+v_PG<|a;gwzs}k~D~eMvbs9B&a@b#X;j#^Klj)QWza@QO2WQ`ZG2G?HCi&E4w}Vc92!o3j zts5uQfxa+T;nYp+dpAAmC&+^N@XIA7o~ZNYCHz@vCfXo`FC^qT{C6CbkLn+IHHW@g z%G8BR#Wv7L_Tg%Sh8ozL>DJGpuk>_gmFc%tS+Gh?b9mdY2$DBqH;qI^;YEO69| zHrB33ilPq2Y@gF~c9FGxdAvVRQ$_wJebL>@BJ$m_=d&7!oY|f++(r)M+Z*|RsBzCMmCLq6 zp#{$uFIQx#qW_DD&i7X;>fB!lZHF*d(ZCd<%8dSqFpaCrqP0fgJRoLKmSX_Q@HDz%}+M4r@O}N1}7 zy%C(p4YX2b@&ZY?rtX(M{Dt2NqG?#k7)%8aCL{SbbwnQ~=F-LZnJi#VZ(zU{^QKQL z?@4~FML+CBduX}<=5OhYN%Ef@fLGaRdi&^?dv%N=L4FJO5Hy5W}x!i?b}@{oC^ch4^Wche<$`TZJRLa zoDy@g0@1wi`a*5bB|QJ%M(Fviocv4hFmo9bxQP9pqDBe#GLWlt|Je=6+jRuh#f4iJ zM>XN2lUDC_0TambFuwctBJ%$YN6V*Zv3D>%hV6);yKbyB@s2il(XZQEEO2kCP6l#G)E%`QVVQ@{Awe4{u9~1iBAt0qam;=2RqA?G{JzTy=N-)2bjz0!FkGhiHP)r#zwOZhTn+ znkLV-4Ke9}$#)rvfS<~6KKB8I)h5n6k}+)d&MI&q=iHt~Rx0qOzQ_1=8)C|842m4h5} zjCP=AdT_ll7rCWwdHosKYw*Qi{mpOe551YS+1`_A3q_Av2IKz%_9=Y)V~@Pnk7xGW zX;D8vU%dD_r%4|&Xdia*AJ&4~m)fY5JEY)MsuI6InK+E}a!#-Wo5AgGBdSkxq(Ir` zI+bR}>fxsI29)}$P>gz~Xhq~ij} z#iEzE@eX~@WiN6=7FnghQMSr*1og9!)msmq-q8iUDEo^1W+M2;`18P}76~xcO=K=Z zu3XgE!kH(2JTQ{xqDP1PG8&EJfjdl!z<$p9P8pdgh?Ma!&c0=UQsodr063SGb z_A~&O@W_?f9c{QWKbKbDgU?}@CDG0s2iUK?U1wTtjGWizf8)toAaY%oXfo3bNGp=r zDmO%7C&@CmydVF+oQ~+TBM07KM=fyATo0O(;yo+zKJtukRe5d71SpF$e>C!-f82M) zR1W>&O=Lk;G+8qco-=-+Q_ zl;1c?Pyw;C6Y`y6c z=&Bc9IEJ~Sp_hHhCD_{_Gqq&Z5Rcr0=HFEj?{t9viw%tnwKVYBHP}x5-`~vZ>Ud5@ z8*Z>NNJI`C1E0JYi-=59kXi0f{5@_4L}#X_h)sBa&-7mDxTq$ODJY*08Noc`OLrdv z>cF}G!g)U*FoK8~Zt8QFlpx_|qZ=aZ8itAmyx(c)*tj@;0*4;sRAx@n-SZ9YBct39+h zi{89@j~}KPV)AoYEr8+asmJjW`as?~^O@V64QTIG=d>tkfbgeCefmHR;7N?)AU-7x zEJa?HGctyt9=DXP_)ZsCZEAki9M~fG@W0Ldi~byI^NSVIs7vSjCn?d~MXsgO)kvyO z*i(`~VzNnL3+Z;_!EOXisAi0b<`CZ@eDW*`)sVIXhW~^w1tT9pM>uPC{xT1!)}5=i zk1_#)Gs4|YJIGsTd9m4x`+TBpW45EXM^W+2=!F%O>xA5A-g^&XC6zMY+$bB;>PY}LrNGM=D3(Ua~zb;=Lj|}V_x`4FB02X9>qShj51d3a6bGm}U`|OtzZBS}NnCiC?&fbCnJYKtEU6D-oGn30j~u z_3qC8B|f-&B_+Q&&IWR$>JE|_%Rz%C^IPR22Z%PA8#}ci4l~yn)bbor*R5z}9yowL zDHn^+A?PRcTz(7slzrS?1hWwZ_grL+-Knu$3fYx5ArIpJL z;_qK#^G3h!T>NJufwRajcu`T7a{>MLECqtEvlQTikEc`9JoZrR7Fl{<#a_u{c01oz zEMS7|7@4~@_E(>Lvh2HtJoz1qd*^Qhs8nZc>C`F0?7yx8dlC&eAkC%NL}vr)5r3J< zQN>o_tq-ciz6p8X!3@7*r-7HROrgG9K;yJ`Pz40mxYfv?8N&Cxd(CIG)S*{7=ftHp%)gn3 zte0dWhm1(`mshzJRALZP&jjzUPpVJsJyn71UlXL6-g4-(x*PNYom_Yc3~s+{0eW`?e(uxQDqW zbn&S$>PW{=^-g`fi9DsBPi*|s4Pa(~`n4n%@{2+sMiPwU9sfz5wuhr!Hr*x2xBDFznPSMVjQ-{$ItQnO zU|;;<5M8Ad_+I?c@eBD)MyZFuje)B36x_fGkl1{;`L*J_PB**zl*m8btBpRllnvb1^j8ZRZtB`e|j zeG2nRKK$Fks6Ws)U%t+I0DCIS#{~uGEMS*%AkDbpI9%Rw_vPfb1J|77YVJ~QeE#6( z<&R1*Cgx!&q`?C5UoJ$=B7f9BFs#n%g%Q~5f6R)(d*;sFfUzyq3zC-O0us=`qX=2O zW4TITeLH|r2lX8ueZQv-HMY<`DooRbzDjQ6XFg4&?+6sDWg>a%HXzXLNwb6evs}s< z+4mof;qz#E)3A>v?9j@i9Tt5L;U9|_`J{oX^R)KrdqZ$8*4i}2JPJkR1iymkad3)T znik7NAHAKJyI+7A&KX3POMjzJb8G#*?_*`q!8XuDv}@`#R%IJ8Xn^3je7rxtM|owF zxtUSdh^Dh1nd8ueWSSS|b7Rl5i?-)ipO(z~+{MQ5|xW z?zDMYt4g8%vMB%QfUg;NOLcwc?$7}<3%=)6@`mst{Tplfj0xHM-=!2S za}Z?Zyr-sN5AAFnKb%)pz=HXzv}Lpk1l@UC{}%VG4J`w9&vPt*K7Qc!$~(-Tzxnf+ zK@fA%lxG7kUz0;UcHr4^H16Nl9!dKWBd7Ho8D*88Bq$O5Kg-<3`+k=|v;q$e|9(>587#hI{1w3;$5J%ly_N zeaVLhjP&nQ52;zf>3O5PI?O5TKk=guEipz;5Z_zn&-$njb=nVDG!Qo1|1oHM(g4eA zd=zajP+xuUjPth&^1uDX460&C!I?R`PRCFT@?ZK_K3F&aSBb@PRy8a@#3y`X=a@3k zX=F}jYHC68e{Ct!H)P;NEqNk`yfXCO-FYjwi@gk?METzAqVToVb4m0U3&qg(p$x`*~A;qXxg{s`T#%GgozC=5*-hERi9!Kdtvu z9z=bcuG)A=P9B5{Q_qs0*(6Mmj`Oae&*fnD&%%CcO>jsJikziX5w+uc|<#)BdY_43rLgdhIC?8P`?*0O;~0k&?(1DG zE@$c3>4AsFEj!iQ){uXsen5r90t$%V6|$x2!LWYVerKx#P*Yc3I7o#1%jMf2-7JKm z{^LX|`HVf3oD-+0!24{1a+$Ls=B`pQ+QU2Xekk(o_Zw;KoqP9IK#zOO3RI&1n&+#a zFPrarKeeSUXcRHTTrI}_Zbr_!E!?YqluNRj)+9h|Pk}|Vp&68&O<#V6??Xz;z+=Lb z$S?Uj6LSmsDG#WA43tvq!OqEZZ+PahFXsh)uUEM$M4870nXpQOlIerO#_KGQu%kM0 z5V->xw=3Rs(-6bsFy^&TFBrwaJ^5;^}~vI6^kyLhcncCf%az+~KR1^Lp^`@ypWICwGgb0R)JCHu3I zVe1=&Y~_a}On8r5%zTkUP*(*HM;lA#B12#fs_ROe{swy(%=-F_`*7~g8$7p(+#jmS z`N!|etiY65Rh^$x2=prdlu)3~JT}c}-SS-4yxN8j>#1|xv`AUGx@dRb^N%vZhR5Ng|4db`?V-6yx_|#dwbdihvrrMVQ;Nq9U zByD_O+Jp?4+2>*2Wq^A>g&a9zKRk(@OHfbgcye>9Km|_eT#ND>M<2$G%f%}p(oj?P zUug}VQ}@MU+>|*@!6!vHxa9vFJac>hR~G>8-MakZFYcoa8fts|wTqA04aWyw0NyD`Bj=7qpO9$#a3xWsMW&t)f4C`=<{h`@_FDqsZbQG{^gD_bb1-=7_bqeZ`h}v9rG@# z{Tk#C25exn>*tf9x2B-ycbnCp*%aoF>~u(2=>qYkNp5;+2JkBl_wH`sht~Q>bLO9r zt3|D|FEETb=Iu`@2N(Gv?ZQy^wzEF4UO(Q}a!dGNZdw%GE^3Ru#cJO{q&sEKQ z_p1r?k+X}gvKzpc46mBnNK4?ZQ%k0jW`jbBn{$)1+E80DJk6|N3T*YHV~UuQ=vFa? zR`i8-RXtt3qo56Xt%4s+CwbvmhVsYXz35*LZxrJZ!#w-mSIg`o^ouT8DAQ9Rhox`6 zI-|xC{Rk^|-mgvIt7b&nH2RGAL@QcaTJ_*6;qv7z^ydoZkNDF)M2@4q%DeGjG(hA1 z(M$av_L%GkZxnjiV07v9F8zWYJl8zxE^yiyvKe!0wMj`KUd&AR13?Bj4%57^K5Pc> zdyLOoP z^i_)l(G?P5pQCrDPE+R|awR`m#R`9t1|9B^SK|aDI6wJFWc`#7q}tP&iG(YHi9fvx z2kHlIbAqE!t{|_5_P)$gvn;U1?S3hEfn5APCGTGB$Elji-H%mAU0dp?TF6B?NDkHD zaUwAU?tq?8o#-nk6r7dkOR+kfw{xearmZ{8!AID9 zqXg#@V5fY;e;D~>p&zLHUyg+*_#`9dm(8Ht_Og!clUwzl62uWqM{jFQv{^ z`lQ(y14m!;L7L8K!kz5<1Zu>jxn)g?y&K|%Gc(_}7&?(ZB0w$rHA5W|rPp<@okYHI zl2n((SwoOu_2gPFu!Te8lw~K;=kbNzxW5s72oASvqF18KuqTCKKH;|>+!i~KC$oqA zX+z?_;s=yLOE38Fn|GK4<=<|-8jD=7r-MsTlM--TxV!OVwh*B0KOI4TP6*CrH@*?hwt(izOoIf}_eQj;V;ZF8z)*Nl)5by$mXBDmpGA&3r?ZgF zdM67gZL@3oGEWk&|1rI}v)7Ee?nI!| zyC?%$xLLlus)qjl2X$93s`4SXe&*5{(PZpt5P6(aj_1Xt&bG>whn66``J{WC$OaPJ zCq$Ak-ym+Z8qVlyhkepN$D4$NGB1Fdq(V*!n?bK|<2HK9xU@O`xf9k7ouGM*`ugV*;D zh34&H&tU$21vy?TsEwQGlfaxuxqiOWwNdPAj61wa^oR=KVGyd0q2ld}aPNOyK_8>g7bhx@e6bweTU6qgvrFdWU@@L%J z)vYnG%y~<}@7!}`fuxuRJn~yXhyvfELNCPi=5fxAXsSQVsRsqd&&kbd?4k47tZY96 z`u*9u8@8)4*V}k@dlBE?zOC82LO9>$-1E2=@YeuzUWvLqsL_M~XIoaILn?6nuhEp= zL2Gzo|16=h%L4k%y3X448Nu1GKaVJpXHJ~(How{24l>R+HNHm_8I{ zDucOlWs@1@w)5EQJRIegfV?t`w-3c@leu7)*N;&@Kpf^-yg1$=htH;R`HH+e^7zeO zA8X68g?HZ%%7%Qwy_5eki8iGJe4h#RG)a<$VK)-jxC>Tr&+fl+aiGDrQ6td&%^vm|J>`K%(Ifmzse#m~2N-l;PiFvukZ(UjgTIbp$|aVZUSk zMSW54VZ!-GdCIGs$n{L1`Y+NReMsk>4z=Ju>;?PT+Ew()y+5sBrVwuf|MfDJGLGT? z)zVJj5ArbPQ#6B#W2C|8Y9+C0HQoy~{PDld`3mR4yDB8_FpnCj7iaaY+78-NN1d}; zRe|=*h3D5Mi9oTCw0*Ng9~ys?pQ#DPo-ct6l5dwVcOmgiP+8a#e&6MI^^H~r^W?0* z^N^RV!_iyJ$LIi$ZyK``&{rctBTCL*j=jt2b&8z#EI`9}fGHvbd%#kL`>e62NR&zI zqIHHY@o9n1!eW11w4c7*0 zcU^mNS}s z=kUSUq6jhMYG`!i4QWA(*vOY2R}OecDd!%iW(o94n|l&}h=6O#WOR!~8U8vohLt$l z!c$+~?i1H^L3#7F!AD|k7o`rpsi+3%X*KC)%tKdBFGE2nD) zIjw-+SM*S4t@R4nJ zD^Ok=q=#v7f#=-$gew}|f!5$P>&#hJf&68OU2+vi>BnBmLj)akNK`FqcQvz)>|Q)#{I5Np=-bGL1=iQ_>^}; z7w>P9dy<>jQ$QO;w1|Cno_7}#V<%CsCDq^VKu)@`Q|R(Ru!Cw=RaUpyiFq|M_Di<$GZN4l%%mfNdr-*(c&#Z#JBF{3As6`@E zK?nQTXg(Z6jxy=S_RW3t2ki$_m9{(U!I|OH2MSnefFKq$)K+Z`ftCdyEoqHF^1A-O z_5uM6pDAp8#yt4E(7P`$T6JOXjZ$CxFzSbGvTdbTjWMTxD6}8%!_VzWNB^i3gB9h& z);`QB$(A%l_2Rvk>56EZGN~!_t&{t$k%_@|`bKj*{CpZjv~=?w|F36TY=quW0&?$@ zE)w3DPrvr5Fs6kHyr+{J6#Z==EJAW^LIS|y(EP9TZ|LXYTRV_ueiT$BpIl=`-C{q8 zXx5)p6{I~sza-< zh&XDMy-=S%eBzKYa%YIXzSkJTeBQ0t-%*aH>M(0|>gT^w8#sKhfj&lw8`ca4E}x6A zgn(4X@thLWzvn9wH@$I>8rpJU4SVtIA5_`=ykh_t-*F2`{z3lpT6_UL`W8>zGCV{S zfH{G|FZCi8x=`UlVH1>y`z#VA(~FzvcgeOc$QMH{=6$~pxyW(bH+QZix@85qFH~7v zktcOEBgUy2^-Z5`uJ24FcCf{9@W>F}=iC%>5`<}a!Oeuxh3>u-^k%lNtxO7`zfmAY zNDiQ?BDc~Jxgb-fjGw=rGC_X;aX_cFGW??tk9WoWr^ge&hbOi$XGWJbU#$V4eMOfu z68EWB+A{louxY~@*JTFFP@H$fA2OWS*9C1(E}N4B`Vd%0q@5RI4reW?-CmOOLbmC3 z*IFHJV4I!)vXp8JRZ)y$_bwR1ub#+QnM(8t)`%D-hdaQ-rwiMg?Uumw$iLJA^#rY^ zPx41=j3D&>CR;?6IrQ$dkyi-I0%xO3Zz=XvACD-VIc>K~(3aMFqacqx0AA;dY){w# z{SLkFQX%@bYNO?rb5%g((?UO}ho`*>US2A)3 zFgSdYg#Di?D7vYSa%Whh|~y6R3Kgj4mLO23LCW&&I-hpdb(>+h?i|GIUHz9Nt#=b77|l*q2KDuyyDk z_Sw9aF^!{lL{5hNiqnX>Hk`eD0L(lLVCYwkq8;*%DVE|H&d4dE-e^o_<)87A#G`;wNl3r~_~z64ZGULOZ)T-#YikC`Z!)hs z4XjX1Wzb!Z?@wTiJS6c^27fQgy*o5IV9H}>u)M7dq@@|e_kO6rBG)q>8z1yN`PrOE ziRT9zlGSp*a}*#P^=;{A9r}ancsT*@)#($_YupcY;pR0JyO(VWF!K93MKtzP{%7_> zj}h}bK23S9B+J&2m3#SP>;oI9+NJV}K~8rJ%j}z3Nx z$FobTm`^zDQT+e;NkhCSw8EMdtj_YEswP(f}tl{f* z!!=SxD{#Hz%aMWK51|pp@v#f$FckGlc@y)Vo>hYJC-RW@dA&NDOxg~V4fyBdhJ_&P zrMMoIfgB9R`(~Y>FalwRoQsai24H76b-&@8HQW)>X7=L1$ z^^wMYJI<+|zbS5Mj+4WQ{LB-ctY$DJ5@I!?VhAEnA_7fq(Z_CXY0r%Q&`GxDsQ;+V zAomej|I<#)Kh69jH+Z50&$$*Og#T$mc-;IJhd=7=v_D;qu=kdkQ`RX8&r^H%@3|V+ z?4Y;VpWdqo;PkDNUT^V!_;1j!zgkcd42u@d)?>~=ODvDm7Ja*yhx!VRAP0oH`itgy zF)LWqj1HX1LcX~lk!bd&D*P#&6&4P|e0Bucok#PEplRTC^p&CmNEzRH+)5@&cAjPren{fC&>sAHKqG;V&!_Y!OP2f}%IG-C}P z`*2hfydSS}U;JPNuW5cxG9X_?J^OH;0| zC92^}K z0cn@M)sM=y)~$=fY>q7q_G*n9N%Por}AI`!wn!8tczD ztnmIaP3C3Xr3fFCZM}2xdDZY13w+l|4@YE*)2IeeZ&;VPC+a2%H-e<=<-h4dhcee- zuqOWhvDvVz)>^{jr?j*}QkYxOHe#_}vw`_e{_Ff120)&o_f#&{0lKfWHcQWH!n#Dg zdI{=k$wDUu&PHnCKcASi^s<8eig%LJC$(Vue5k}?4C+cEa&4vR%0TjM>#=<+et%<~ zzmA~~Zc6L6Q8?y4Ew6unX@SoH$ES*`(u2mpv^b`qhkE_MTJ}W?M{USGUL2UCrU}RF zIsXn}ex~r<7ReauqTf1?i4J03bu29Ph*>FM-%pH=Zd(JK z|9075AJ&JTwLq1SW}%aTdDe5sl5h6v180x+`=nYK7-TeS@j<;dLgV0?&U5UwlK$3l zA9=b>Q%c(bmgEprb}O2c+5)_rJ3=|p=Wv&0=;EnN0NIEeA&s~PrLH9@EXDizg_@@C zL73YA|_6 zJH}THwcwy8d1V~#gHF5EE*O-OM?^e*T1JkjrU1xFZp)osSZ;yV* z5uesZGZ*w*k2h=czOe^;#z)7Be;z83ONpO*1E|uwqPCd&iU^p zamWomS!}eZ1mgi-9SOll;WlHA;(7G>4cPdI1ZCMma5c%6DDpcii5_a+%0j*BugkUs zo_G0*4HN9g41mv!c{aNXb5qZ}k{zfNA?)bmXSU-6hz~bcX285Dh0V^hKh31@mg(%k zbb$FhMqzYs3lm|x539d4JPH6i#A;E<2{o4JSkG%1=@Z4c=q_A89ocoEX>Zai5%+0(tg9N%s4p0iFo%T<;5ifSvJ|9^TuSj*bvMwz;=GW;qD_W9 zLovH45ku;b8c|9YsVr7d9luyJdmJl@yUwFI_GNyN-8b^^()7axVkJ8eOk-8`BIklRn%n2% zw&h{?QOkel?FGTXo8Fo)V~J1{aw?$)f8M3c=AId;IgrVC`hQh4g>67$a|uA&(Vx(Ku?JP5p2&yvHZ#D*Pu3&Wg8tT=IlL z;d}H13pIXDQm48yhp|5^f5}D;bs29)9s&0abEtCv(;WO#AE^8tQ{TCo17(zkLY}z+ z&?%?xElJ_$X;h|`g}R`3@QaWAI6tYsW*&+hGsHf7r!wO+xc9~HyS%tI{C2i`9b%*d zPqT8CMVoYhbtWM>^@KLul0MnDv0(`nu}3`BuG&K94NA}59&1=W$?s3kC=CbyW*-#D z)B&L%-_Dn+8bPro;~CoP=u>Hztl0e@Mduxlb;E^mWTa%2J+k-S+kNc4@7pX%iDZQA ztkAF`Dp5k3BpH#+9wVVdB%_3~OJpUy=l%En^!5n%?|06*uIqc@o#U?bvoqv4U#jOm zx&bZQ=F9nFuyet_{MQTA`)I?fsa*_Uq;!sM;)^EGdtuO-N)4VL>d4~?l?5kh zgO^*n$oKx0r%hvuI)%El*l3L`&{ps*ME9pqi@|>0R~hk(=WW4( zyI`;VCG3gv9H-uMm>-(KJPv^?Bf`aUpji2#TJx=a)ffF6=C5_PD1~f6Br9*^az+Z!oy=pZ<}B116xg) zx+>m%3E_hWPGHXHX&uwAA|Dr zT`WpE?qdPf*$+aTF!$X=OZVy1erovI-m4z>9e+L{PmP|VpI2@;^Vc4BLpYQ2=8Ez$ zCpcY~FqY(vJ(FvCCpayw;er+`Pcv~OMb=6xLuFielP53lKnC8^l zc~WE!u7%`nW#~g6vRIYgX)uN%outBNoHh_3k-su3xDRBaF6VDxA4zcGcZRna=$B8P zE?FN0@cC10>1~SK_*KIo6-D%&2oHHW<{g5(!wG!%cZ{HAnL+O@qXckY9T7PE2K~d? z-&(fp4*&(rxeJ$2-`jTC9C`ZnApFe#HsR%>1sP}WZ7B-tL5ybj=G_mNJESp}8pXTt z3#yOT`;i-OKbxhQd(se28|T#A=|q3co!2KH;J*L*b=%_Memj_FZY+s4=Y#&5FhNr* z8&Koa9_&M|TBqbSueCz#sVooF$Ko}JpvZl9Ufu}){5vVX9_4qLcn~4HJ35d5I_}xrte49U>4PBSOFEPPEWzrwyTs*Z>Y!FR#jvi4_qG1L z+>VJ(U_bJehCAOBdU=yuO)J>Vpt+@XQ+Mf6ht4;8X##;CIZ|P<>l+$Gl6}u(R}?S$$B+{q4bBNCdMNn(^{E zd{8A#BR9Tn1J>;d3D>2qp;IK2&Cmj|b|DWxE; z>tOknD{RnIbdYzx6#dHM85{lUBH&hZ-a}4E2P{re*0IG~!Jtd)$o7yS9RJ-WXeo~U zbQUIV@#VI#eg^KkepG?b{-*qN2HG8emN@f$Ll#8Cp=?U5^kiz zK9Zxm0b9MOvjxkFe!p)5)a`s^5~#n?X2#}xm_WT|P?jxG5px2&2ZLkKKdd`PZY+Yl zl;X>s9*nxkrPiB2pPGYtDV~f1iEcx<(oOgoH%^6Irj60Hhjx(a9(ZsIv_RxGml|aP zaxf?vpAF*uEbEW%mf$GfdE9$>Z)gDWllr-=ggKysc8QERUKQ_Kaml>cn>Oj}9o3J| z&GH|lYk^z#;4rqO6u^2IT8zFOA&y(X#2cXry%_B0*(aj{3GdY>wD5zxgOhjP zZwKVKU6stkdnbeQ&@}hD1W>HhmrF$$KzNzRp*{HbclpL`3tHO4$|KR8Ke1}iDP`(J z8GyVk+1jdAM{@|I*lC$c!hWZt@~VP(f0(~OcKKf;_Ei;ckR_gB1**hG1 z>$!^hTuHi6ahwAPyuPAH%qD{Mr}xcDsB2Z-SU)Kj17JB4(j6c(uYMtL|omxiu59A0P3*mq0EaD8ma;$3z;J%h0zY+1dT|mJt|c zGFuKW>A^xs;_pLWQwVwwG)f+y;e(%kKgPIJ1wjL@jZFKJU}P=OL%Kj8%%}4n#;Bt| z-xJ7oy-85>@?}H0KKAo`34OFT6gjBz*}8Net>B3M6T+N~1wb~F+HTobLh*m6daIC| z_~mhhL(Ks_FyvMCd5b=px);>v2A5Db|7}wh{r_Bx9J6r4I1>o59Q)~}paVhPO-LYI9p{h}j~pb2{Hp?| zi14F6ay|8nC0y!SK**n^d5^2X_9J1A!zll2V4Jyx(@T?F;L8^4QE z7t-O^B@0!T+^WwgVt?Q4vt_rx=HRoJr(Zi3_a(`j z?)IVBcS*L#cQ8c;((2rexUdJfv(GOy=rjr9t+F51U_VpIofv650A4uv@CxF)QO%Yc2ozJe7JmyKb1B{*0ZeV-qv zCAArtdjPrBcRS_)w#S&1(SP1Xd0}r?}+Jr&jBS}xPOcC z{2%Dt{i-oiRebSUSOwIEwu*S1w)8QZNJBbq0#DZR``YO;aKb0s65= z?I^zxA^0nK#&`@rB%TcUz<@fna$-Xu!942HY0Y7cJL}{T*m*nJe>VX-2V>mpSKS&mcGk$1Zkhu@TD{r z(0XcZ9668q*_WJ(rP$+0b*`a`&kpCe$lJ0j=u>5O9g%UnX#mcZ-|s$&a)7qk?rAd_ z?2~-9=k;9*9e7;)xjy3v<{a|2pZ9!M1wT`z2S&)HDJ#8xuqn<4R->LU*(x|fL${u) zhocN^IvFUYd~<-QB8u5liS{7y?IpRXGxF@#_0^PL} zi65qH!0x(H>$e%~q1OsN`t+YMl&*<+i{;?g8z_0S9)0q`q(5AjatQEOg5$P}ksg?{ z2A-V8eV8%vFzYJ5-~TA>oYTX5@yWCG*YuN(AXQ4>NaQW#Aa|C=4&wVzS%JF6=a(sr z)f9I;es2LRUdM=OnIyQiGsSJ`fPJK^uO1DQpg)Dq;$jDp1$}jgjxUF*!=JAOzLIM) zK!2a86Te>>j`F%((@R0W(^JRvJvWU&j`!lAE&2%jIcs8RC-LW&=ymwtxGmf_IpFO7 z)(Rw41lg<}tAn&aPO%;Oe#-autj=IxQWOiJG~prcAK7PiFschY&I;DiyK?Xr-ZN~) z+CXTCx@q1^W%yuTP&ah}do1P7X{ALP0E;nuX>yV#Bt;yuPQ!gR#2{bwiI+Ky++=C9 zBxu3?>$g6N<8#R6jV+(k<^NHhFt{zxWewtwu6bG%a$)ijq_TZ|EM5RDsL_TLqSf&C{tOt0AkV={&0=zCV+X>pd;&D#q(lPS4NS5%;U zQFEsz8hb=PQT9z9v4fiww88<6>Trj{s$2?xE*0nKFD8x?A(Y?Mfs~1TCujeoGM_ev zWAvncvKbpt63LBd7{cDLGgbc7AI%_yYV?r_=CJ=Z7grFD%E4%Sf>$xE9gKaqf74&8 zhk1aT3oWUrhpp^Y%yX25wHq;U$Dgbd^iq7tKI`eg-sjnci9YCu_pCFSz#xsbC?i|i z4hck)Tt&A}+rrn_FV3pfy0H52^?}$>12Cgdc-zou2K@?!FAtVrKA~jL*;PXVz6D(* zMM=v-Xv}lZ zS&giEWT9E|4#jC>B21w?phE&i_T337F}t_S{~OC%sL$1<=< z4_T^w+JN8xU1x@$r>{5w*;B!VMbtUVr%R&Pkt_U-_1VkUjOK9h!P^V>@IK0a>He3x zP6g;a;5Fv`We;?FZ-4JTY+4B7fvjt{j}t zpWrTVa0InOY8P&)s=G2aB3DOP#{4e91nlb+`@g=?1ID&n!OyTa?0SRmtkXAaT3FsL;)L6&2R6>)HQ{R^qNZ=Ob6jbLTL35FoC0k zD(dCTfPJT4d2fGPgN@xltfQEbo2P^Da`iqo{658)T>h_B7IS9zSOfhG96(aHHYy?-Ikx03@~&U7 z_wyAe#rTFH@*wT}zFx(gH4R&icD6MLcYV@K@U?}0`?Gyo_+* z_~$y8Hq}^D9bvHRY+cC&&P%m|Gw&m8L6YZ*ksmwq)$KXVPoux#Ou^6j6;3<&D%qi# zdt3{eju&&LY{@}nkc+uEs};<*)rNE9J?O7}i=q2NEAWbrw=8~W51HNnG31C~PYt`m zu(pOBNMCvR?a&Fj_>+4f!u4!^&rxOu>C6K}2vKeT574N08+JG7-mreM4VY z(ATNMA5b5upD+*a8&ZK6EUi_;0-_K@XP01Bh@9{#tU$sQm)wH+9a>?|q7#;5YlCw8EXBs^CW8q5=mH z12QeT_7LH%X4DtTP0Z1k3Is9=C?l^tb@nTZ73AfLKRVK&0KflUs+GfDg~6oWdu8ed zaG=Zn-`!Ts^?kVG+fFSGqf4EYk+tds5g=Un*kvGM3yTpNw-s5m;oDzJ3S0w0&RO6%JJASwcl8&3 z;Jv<$^*Z$nCTsL5{EA{hf8vRx+AH9XJs&p&ulS+vd#P7lcHj+i+)tR_jqw9W`rJ!h zZgUtu3IEpKuR;akFAa#gLV~~~_LculojTZ`OZ30nk9?f)bkCh$Q((_}5G+w+3lD}x z|LyA7Lv4`*N8rE+;r^i~^)vYQ_I#sijV05BUAa&9GV$KZIJ))Ei4W)KNQTADILx#9 zTwLHBwuZO&>2j?wH+b;Lk9D&v_9)R7 z_D!_MJaaWd-wD;HyUzQ8jQe5b$=@WPqMUrSCg})<1ilfkPSmYD_tXEhvw}shG5_HA zsz9nas^F(@2YUBnlrA{g!~XOHj)n&Y(0rEF;QERINcbB4y49%&i5d}fTI2#KG>0;;h0RTeur??};3ZEX=kS znV&?TeVg|dc5xCRztHL&zpDydrJ8fzqp1R>pPS!z{6&8GiL4+?yu)Wt>VfL26;bn)4SXBUwL7NF0zofUKacOz1)n>TlcuQubRGM4+aCAJwZlBFbh<{U zJD#1U)ldg^{ViTLG(Z>dbZMv;Ab$8|YQw1RT6;oJOL^VNrcKQ89wN zQDIhx##4^)hV%-mldxYcDx9PIng&cHcu|KKqdqhlUpWhq{;%8BRp-4-u)c3K0 zC!hS{I4JC3{PY8ZcT7sKKk`W$oe9pFbn*(TKS)q$M_kqPw}o@2l=GKY=%DfF&xSxs zIoPeVkvWL{99nVxEVBko`}K1o9E;qzeb*878h>$tpW-BFBum)Cd`1vl%W7<< zBTSGZ5b*x?Gg-WUFc-gxbb_3x@9*_HapD}L6EWLk0s}p5muBbe;JN6`t%y+I_ z`>-@@1w(H<8mh$rdXEoG@3pXn?w9$L{O$)qxkqDG;hPdHjA)*{w$^s zS2n6w2JQgF%8y4y<6Y)MRr#&GxPOhRl=2$19fn!`0=8jOcTqTOF@al>sh#0QjEl5Yd8u>g|2j1J(0#-ez-PnQl`<`Q| z$OlbhaJ#HuhI#7qbZhq)qm6U!9gT|6BN`CDWpk_TqX9HNVr_mAr3ML4`I=3?V&7@&qM@UY0i1RC zLOFvz%n#1Rs;?qZr!1)ESwdfw!{P7=0X8Bm-^o@cb2S9&gu%U;gBru5>}2CgP(Z^ww}bQHiK&;%1r6x) zY6*SNe_tPfW;;yv#a{TxDEu*l+X6Tf`YhjT8iR|yifZ4S3aBYIY98lC-{=O?Fh>u= ziJKBzaZRdV`S{n`-WWT0>D=OT9N$YfuUmdD=(hof^ql3FWE8-%TT%B0xiB_XPicdImObxc@Eg{1t>v83>>2pZlPPIU6?L zT&=IxVAV)DTQp?}mbt;xCzeD(#-uougj|+X;@J8h^pAe;ZLzOq(E|B5_7-Bd2|z2y zTRHX@`RKjts*Dy|kWjg@U*wh&By%^H#g5s75Sw>r0{V*v_mjp|U8F$db%D=2)F)&u z>GYfa8A0B^rmGu_%n&LOa#R|7q-=@49kT-VP~vU<1$evu`WMQk2R|5nbL&?m z;p2kajjBH^P|&Koo+4okeZxDK3NQ~%QGfDCdaNR-e9sqK%))$5)i-Y!0X_KSb^MIN zkRJ54a&<7G-aYMkP0$#hn^Ns(n|xxe!C%s>soF&V9@C|Ht@P@`*)z6;jc(+V630Gi zw6ep6WTsE{`;CEji#=KueWr3>$Z8Y*L!NPCwW$|!57M*q)`Icw*{4+Xb$OW+GUpHe zQKQ6r!;!MiVwpZ{ee8}Lt~{qxbw5{kJW4fxlofe#cES3TI& zI`Oicg!iRRuIQWIs&Mk&hdymJRWSNtxLlrK2z+;oS*S!LVNxu2v4&L@BI|k{NYd%R z%*u{qW55A;<6k3f{L%>)Xi6&c+AvSqnPp*9stDrOdW(XPWAKzbsXhSjK*xk0GjH{% zf`q3wgErn{l2^cF^o2hs>g)Kjfn^rcCJpitz1yPmVZ;d{`IM}h8;hN@h-PmJ2xWl?vVD}sPn=c365WA}j z#Qx9DRhD>P&yMp+M82Jlotp5^D<)vhn{ksZkq3MV^Ge>_CqY?G!G}|rzgj&eo+?g2 z->_DFW8sq>LX^B$0}u@%rt+t$?|=Al=~u8-2`1ot_=@==-huM9OuWwM5#VRW)wTA& z*bDz6VE<3lS9`CLE^nZp$fAbZe_UM;28z6$WhvG1Zfs3?hujgo7mj4?^^gJuaZ7`z z1IQ!2yCURT4UnjmX}p+5gaA5Tw}(+g;Nn&t5aB~V)*lwda9=^(Hxd^$`$@3JsQ8)5 zh8_6vz2Llve}2!?7W-Y);T#MoDVe1dKwN3!sZ_Kz#QnZgvr}&lUzg^unoXKQ+LJm=kpPE_-bQ=RQT5)#oz7cA$I5GlPvy8C+~! z-_xfu!h8C^`FWE(@R?X~{Ca-0eYldcRVn=psQ}PK>I2Ki&lgWr8MkoW^86_5+Z(u2Yqw zzb}OFq!06XE&MH~;xPwcIwa2O;)S`dw3?@qeaHpv_j2djwu7W>5mP~G)b*^HmX2eN zDdqAf0}m$>h=teAt*zqMk^k>u%78JP%n}u5RUpD{=iQ5KjF_{zcBj<$%0W1#RNB;m zpW~4GQspd#HqhVV)K}T41-!ii#xjXkFrKR4n@}Q!d?A{iX#b~d8^3CKws zz9-a0#CusAUGcT=5#o^LF1#)^Dh8ubsiK~m=o4rhJV?{62svl|`2||)!z0GIQ*vz5 zAn|;acS2bcg1G#Qa~Y5?*KxX=+1>{7iis94Q$=7;CF8Q!Wfk;IFh|}t)B*|WyGfp} zEg_`*T#4;}%Aoo9&x`QS%J5KQz1I9Baxbdu<#j2r-#X@~Q|l*37)~i~P(^odU*@8TGLFADj@SOEUlD;ZH@|0Z*;FC8 zE_IcJ98;O^fjkFvL?E;6gQ*vO{lU>b-i^ow`1bA1tyq#R$VI%jx2!?E>3eu?Z<7X$ z3(S!X#sYNFs6-BT;GZA8U;VPx5O)4n(3I5b!)8&qU=-?ndIp|ml_Eyq?3>-F(ttU? zn#AC}(Q=@*xZtK#g}w*&bzL=lE|uTYbKishBp0TJB2IBp*u!0#)FfaIJBP(PDXft9 zm9!!CXrDDij+|tnbqf~TVQH}b>6zWc5-ad=Ssu%wX7i2SCw%+!yo=vU(xKf#K8 z&ChyZLKvly=R$_e3HSsdt7Ey6<}B2aVcvr^3~d2Jo$zCnAC}L)4xP0ptD9T zF82%>@+nRYogq#WsP_Qd5^`#aPab`0i*q4uMXL6>Bx`tm@|tJJZz~Yl8rhJ-o`$H{ z#9T%WQ&YLH$m+^wN|z7{#0EJ|L>W8B5RH)j4Z$5eVs3J*@|q>Er~Cf7XTK`(*xncGyou z{VQG)`E_j$#%E97McwQ0uGQ9@0I=Wqsz2tA{Q6l3_ZRv$Am48M;2zF3LIIPkHJgq= zqFA9WTR^TrcBFNI5fMTzydAhPq71s?RSMn{y3jkMeX^`l0i@WdT*8pA<<8W$MR8|} z(7H%ISh&7H*vdPb%hj(4kIOXGzBx$1iG_gwOkL-x zbI>Z@{mEPMK3_+FjO|#^wCoK|%&$!D1h87d_;@FE>$EMTiH)A)pGN+W==QM#Q-&ZD zbW5c8IQFN!x*D^eNdj(Hn3D=Ma2|VI^tAAo73k9Cb6>_gQvRuQT2b_^?hiSBxSv57 zBA*P99h@V=9gTMD61;n|#=A*NVcwL|)wgIL_7hh7J#_PkH-k*RQ%`b=kw0DHV`JM7 zka2y4RgKyh*$Vx@8R)bj5xm)) zaKRpq2*x>6{Y0PkPG7BRu_VxIubs@Nw}F&cOKJNsCs>#A%oj~Y{a1ARtMxhwK2qMe zxyt7NFVx=Nn~soz*UK)1+B_-nKjJH(tZoY(&;It9W6m)lyZ2)2raiduwLB*=tP>L3 z9mPI`D#N|SWfS3h4v^Xt)dvY?p#P9iE|2*-<$J-j-ZNUDbuKBgJ#d-u{l;DgE+uQI z7ptb2h*E~8H^K6%{p>J1GBVU#s{pnft?4^>-xxJ4Y<-&K1P+&v-hLl04Uvf#p3ClF zFTnotha7sCa}kc4`97ryg#&|gc`WAe*w5eUB|f)hOc;?@VFao>D@lc^=x0Bb5jCJ` z4YF3`GcuKukn-L9`+Te}FiYO|bVXmtB?ZboQS>UHLv3Q)OT=8{@A13<%n4NA`nk|% zi#fi7A5I;JM9wBlWZ&CcI&duf9JN-iJV@!3IIUURz4*+c3i7(BHra_0y3euZ!4r$|`9C`-*;Y>F`us&{W(Y!QSov0{_2xZhUi z?BOP9*}-SKnA2@6$Wgj{VUoqh5_ZRw;$vnVp_KRTkxUs!U`h0tOEuMp!4n^C2Pys$ zHkySRwS}-xu)(fhxK{~^juZ_W&~U@CGag;@D#&eM=FD}qwFi1l+oyh{Z9+rYl>Vzu z8<;mUO7U(~ z-{Aii{KyG*zW6AHZCgU(Oz!t@$i3kgND6O5{&c-e!(=}4!%yA3!}=Ka)TE2gE+u`# zTyL{@XC3A-v-&#iMPt!#`!>w&w5AE1tTwGv{4EPcfBE?BWzmn3S$OQoE9CZ@Mz){) zV~)It^rW#IE08M5U#II<2Rr*>4Rbo=(w6y(lJ*lIv*-Sgudl74<88x(HH)u=_E*-s zbW+F@JgzKxd(;U086O^>!TodJ!u;0Ce{4{8t^TQ=w=R%<$q*=_K(7C3Pd|!g?A`dZ zJNvNB6s~j>N&H?z-Guyh$$@3$OGV4nIhtz%|FtACrdISr`z#xud4vC+*P~~)t|+2! zGL*2-%Me%wH@|-wutT1h9@8wXFqkQY|MgE$hv%PFLrT<)p?-hN(ETbtNNI~4(F!sG z;mLr3aChvJ4sbnboFaz0%q_laVoH#g<@N0_a{g-QY?~gq=!4sS*05g8Q8p5lL{Fq* z|12l1r7{8eceAJDGdnl>52Cp^FYcYB5R<*^9aB7l~&t z@e0Dj9UjN3he~kIC2P78{fEA{3@PtbV9sEsWX<9O_J!^_u{eaik&S^jLSFK`A!NaY z>xby<;VS9PxL}SR=K8;dm|x(-{p{`*v#9fa%1C51w&jgt+q!(6PHN(&EwWuI_fp{gz?iuIJyk&>^8<}@6F@KgD zH5>T;Aoj%B9-|7cw}qc)ElelTuM=iMi2s!%3|BtM9*W<_zA`J_84lzU=pFozV{KR; z%s38|n3ZwDVO?3Sb~eT!87rxyyaH_qE^RjC4bXTz)6?w2g!n`L%i(iN5ZM=A3BT3_ZBKOqRWi=iH`I!rq&UF$42NB2VFx%!rWp{2?BU`Ys zWCtP?OTQ`-%)wcAdrzpO32>(z+q%~(2y9t)A;S-QSvFH zWEB#e~|2AUNsNPX}+|1tV~qi<5l$LK0S z>0y;4*RZ#}eGS^<4fR3$7wz~P)XyUbt=YbpbU~)eW71F`d03Ho^RiX8K-SGPM2}yW z8)bPNXP-IzjnRKqHN^@kOf)_<`LZCx{kwvXhX6+oO?B3^JHVbG=J3&9){u0@eQFuG zG`?BgH~csS;k8PP0RL~yf1AdPFlJjq6QS@*_(3~391`MMM4<()-i*mJyY?{IKS!s{ ziQKNRN*Aj@N%-%?ZCg_h17Id=ww6JE0e4TF!tg5g*`8ky3ziarvr}}^+B7=^`5*6I zD`^|R>8uy6Pw+nV=kmdzg+fPo^;^OCS{w4I_f<~wHrhc|*uI!opRD0fxA*JW3`-D} z94v{Jz#N@&ZfRPO1{@NWQwpA>hD-mHrJP>qfRe_O&cDsLkEGoCMO4Rsm(hcgGmNN{ zH-D2)uvUQu&Do3P4^3eIR@TJ3ALxs*5igY6v%(Iv8Eowf+4vA;^8#<3# zfZ2HYnP(!Hr+mv2`>A{>c53gZAa(Kvlrsx|7-qx zWI+X1v_5m<^XHeP4;_P_EPP1S zSHG*M2$7F2i^t!`zLw|9y8qBO`6R$8m@gL9^F+XXgy za7id;4Rc}#cZ-@Qx$jJY-1->Zd@K`ut(zC);FSh}DAgwt9@smnera@473UC#U)6Tz z{J=0M3#IiWP*1*Sdf_?|R3qhIv6ni6(=n;&yjk5dyx8U7dQ|m$j&iB!|&D0l>2jp%RH*Qu-0{v^1%imWefZ2oF zC2m3rrh;TduV0q{0_n&3utr@7$zZ+yF&}eZ#qhV?-g0qw^K-89@mDvn)4GjebUBMUexu7c%xVKXeSdF5it`~{H#m9X0 zSN6$3t;h^XgJzWwR=bfy6xV=FD<^H&EmMfPS(ir5EdZ%2+N4%-^i4N!a2H**0qP0k z;EtE*C*AlO&w!uHH($yBDrPIeM@{PdyQq_1hsyD%#kxm@{9f;Hw8UOyQw&8A&4m*?$M&hyyAeam|2G$m?+ezM5da8f@bgMqZP6c z|8v^==eiO2T=u@Yi~4HNwbKjR+`EK@t4Vg_BN)3j7Img4836-Z_R9TQ)D!O9Op}=~ zfzJH5Bl+ z%NqDok6q3w(t*wQ4=NxKeXiEzKb~cv9^6$@{z;q&+(9NsPU@k*A$2f8TAT$=ie`Oa zAYnh0o(T)F)fl*mMx$zjHem2w4W zPxT>_*ANo#{S5sSWQx9Nr%RODI-p~~MYrf;4usKWIh_O*kjdPTTR6`Mnllx$w~3A* z#k+C!l#d#0)R;*6R;q*2;WzfLZ3v)OT+i5j-Uhz=M=#bRFYND|gc$y)3_@3GPnyRNV~B_9%J2M}5D@(M;0>_qFO$A1f&>VVI+t56RlA3u-GQWq}mb(5b;>Q&IuHA zrk)DXpl_RH)UO3~XvShaNmD02h~!PXdgQh(?n6776q<)2tp97GH1b8hxV5LnqW#SlKr zV{Yg9nXD!BS7tK2Z@p>)zGFq1T5XuW-WG6D!+Y?C%f@lj_vp9ozxLv)G4gJ9f39f6 zW3Lgz>jUE{k`UgbySnw258ArEoL`+sUhhqI6MB44cQo6Nw9FWTXzS5uub!I0*vRt_ z*13*w^XiwCBNL_&_Wtat0&_Fi%pqKFPr-SXWTZEYdg|}HteZX6=%3X%%^0Ok2|*rp zu6E33(Adl6=W~M@U79t?4F$dT3Yoz+>_>Yp@&seL~aI7CN;ylL}cV z;fuJ6@4%Ken0q@r3NJf?{^LDXEa;>BuvXbT;79`+4_wF1(LZOb>dDM`T^|hnO4GjL z9J&Af-;&1%^})6KwC~6tJD@#QYkvjzzu&jp>v?z8p?Ln+BPqaJ2`{CU5KR9xd=tp!j-So)P{A zq&@dS4iLNBs((A)FSI{xR0iD<0gu2O1JN!;Smv6tGNQEs-gw%684L95H*t1vp)W%H zpbjzMq9}BI^Lid~7j+nMk5r!@%Y=O)seCuIkT=w*w?bsHgz$`!6^>ox3}$?CSuH05 zE0gp0tGGXr&+$aEyabqO>bbm(y#(jdRvjolVorAOeE3W`^7m)!=jdE)K|I%nLNALC z8r_av+qvun9%qfXZ`5JGczY)QFy?1w9h=EljY!ZJ+#xS;fCH*|bNoBKka42QSF^^ses%cr|ta;6#IpqkGLn->o__g9c zKh%Y0hB+kV}YWdJwBN)l^(hX}&^=9!E>BiH1!iM;8kGUSH} z{J8Rji0@l|6Eg)p$dTe@qO^B}Wrrt;ekU-$RyMZFbHwJhk-d5^jKM9@9=N3z- zvTVN^KB@*3QM&cSZsa*6xU!C|+CeEtrp;PC4+t}Ahh@@QK*dl*2V8rIs^MT{Ty@0zX-tjQr3ze$P;_>t0sy{+ZuM9xXR*g$sveu{H0`{9OMl#xp&4J zfINlew;<#pshBWB3G&OsO|r>S(TAlp9ozk~;Sg{PG@kyE?f{(BjCM^L=nK-;v0i7C zgxf*qqeosC!oZI$(jDX$y%YA)AIAQtLj|$idyr3Hm$1%Xi+)a*#vYR+6*xb>h`;ej z-vV6e6%#jI1fg|2wP$WG9n7#Ae)%9|23&)lffQpZ$g4_6XUJB_>O+lo)}7d*_GgGVE{i z(Wt7Cu?M3EmGdp=d*hz!cA~zDI@qQ@>7}0n>4hfQ1*DbJaQWUO#XN7h@mW0 z&(CBnrP+gX(>?4X(gdkvJl{A_N0=wk30=awXej-sF+Sv&IC3rSTAjySeOP3j#3$q~ z7*w>K`)iNAYFSD*dnF*#XKY$y0{usff@6<<+5wTK{Tvf3=4Yi;FC9Z&+U`Pm49~7D zBrz3-?N7qr>vMTMi*t^^=(hCw(GcE=RQ@IT(%HdUplf*yn=wT9B=@;WV;)erJZt-t z2y%%Ex5mm<;B`ay%Y&LE01oz+t~x8&xtHAdPDcZxL(Z(^;PW6pK}O?lzXh za?j0F4u458rvlw(Pfi5~JD52@_QP!s;p#8kfImz;Ky&|172Fp zI}m|;ke2j~Ry9qKSSis8GLeUcx6Th&ScM>De6-M{UJfKx&+ErZs6xY!^wYmb72#FG zwelN*$T#is>R%Yb9@xb%ASWsbjAutlpX!xB@SAU%A?ulW}Z@gWuiF{51Zr$R3Xk$bYJ1 z%Z%VR{A=(r@)Ng<{M`m)4Po!_yAz9;yYu0B%lPgo0C_rZa`_7_2>US1{4Cc9dqvfA z7pgG7<5$fyHh`Ry@}IfUA_nl(r{6>7KJu?S()X*~H^V#6y$wjVf!g7Q#vk}TDah^6 z%0s@mw}VFFt6(P}UK|f?TzHE|Wah32&GQIQf9Nz7t)#gP{0Q5{;u)p-o5^S}+ zzr4PP**ea&*{i~H|rQ&a->l0*od^T++fSO4XI^yqgXzAP@V%P>QZW#nb~%euhY zBdf{*`1AVXUMnks`6L>hZ*||zz#?kA<3Jt>tS?jL{(s-$3u9eKL?4y>@Gg(BkTH;Y zQr33SKNt4@O^+qsvB2F(0ISoslm&|Xx#{SSizBMmnWq6-`$zulxqC6TsuWno9 z+3&k@*d^8uMy}IVR$j4zslSUC=>?TA*S&{^ip>D~)C01nWd&fHA?xgO%*$z)2~tI7 znL`g{8MHOvzpG<*DULw}Mx+9W`K3m1N1}G?#RK%IJr94|wx|M;=YJ}MVGpK5ikYk5 zTUK}=^K7Y)MFOmDZkoq^(u9A1V}7$wio*XWI`4R_+cu0#LT0vPWbeJ_ecGGb9vPLA zvZEnVl#obeWJj4OcQ9 zyRW1&8^W;*%D0}_P=QmHa*Nj;OAz=S{{0VfKyU6hG*k}|0Fn0rG<-oiVEj8wV`-fS z`wdPXIQ&c)=0K8cLV1=U_E4$sV@OmH>yZ_uP8u-;1mATVB`XFi~FRSA)krKx9{@2A=sD? zw%q$a;QxmE@g?*HTph0-c;jRP>H)(EZan6&JrQtJAYBF6N0Pq({fhedpsvAj9wO8a zFjV}wi#=ELvK^1K%^_pwhk``4CHC(U-S%GUK{AVE8nNCUJ|By-Dk;L>b93vHqJ=iN zi10jJx_=1lEL&f{!F&#P-|)X7O*~hB^KA3~B!OE0&vN2v*h|7*H8w734p^zIVr&coK5RN?k=`49}$xN zU!g3dv9tGoeP#;pC1+n2iz7GL^?DTDEiKqG`_A4O$qONj6{ATT$cg57ezB#{0Kyc% zq<;K^{`RwfTrTJtfULGNbM05`xAF^dt9>8}^uGUzMr}F3PU|h6N+}```)#7DqL6E( zk?^_h7W!VE+=Ki3rGWW|dx@b4`jy>(|B~U7hy3cW*8#XEe{00&FEDHlN2U$aXz8@z zWbx-pGe&i2$O|#w*fWRU#s)Oj*bjE{%RsfGp*Wm5LFU}H-w<4Ewa>NPv4vW>NX4w% z=9n`~c~!Ka4ua!c0sAtLU$guBsDPgZ6i~{szmj1B+DMwMXw219NRMbPreojX#&%yM z4fbMRypwhM2Ik*x^){EwSi@^2+rcD1d(bfqDImo@uk)X442n23K*dbvgh2-W_-}5v zGDxez8Lj-X(QfQ3xLw*=rH0%}mZS+;^ymF?KI``WkUnS_2TansV?N$Ga#1JH9{&AT zBPzfw0<{BUyZb)l`;eGxxi5_uObxXH$(pReqqT&++?@o5ou_M@(ElpA@*>}M2lohL zM3TEXW|)g;-91vT4fKA_ecwm4AUM$GT6!*W`Qp~x?jygKRP6n_6zUQ;rKgru+mC{1 za`>n3`ncDlX&zwvhQEiP?C!fOw!mgze%kbb2Fwndj<#$lLTSm?kr~WOXqO66>E$}Y z&&H|)l#Qs1YFyGZj$R^Eo&ENY^Mxv8ukF3PjQV%1_LeYroF#-kI{RD``2=reJGYGS z^X9ygvuKEWk)8YB(n&sGPoK}EMIVa+y!oAOqBM>@xq17C;#6&5Eyjb+cgGA0hz8NL zYBDh87p55WN)et5ho~MyUfq#%`7&$k)ZkO=+?7dd0B445hVpTapA0mA7o>g&WD<2kKP3vdj- zOHwl>37;z+A2Qw70NtG$?~8J{R~$KZDZa!3{p}(dH;|_wai_{LOHdjPeR>+*iG59O zvG1B~_A4Qe;_gv@AA5*-E4Raod|&wmy$PFL1EBOUv>T7W-n_u*k}{i5gmm81(V1WH zIgzeqoD#*Hzgd&mX=Zwe-6bxbPBVvuw+X+OPvYJ+PE&M(!x&nu0&f3~QiI#+<2O0I zRtd7jdY{s+WACk{G)*b~_nr|ES#RRhfYoo($M^^Kay1@Y7f`}EHsqV_eI0p7|MGf$ zGi-x!faj6XKVO`idH+q+BX{QU$3m~p5=9`@XNjs##++lk&Lqzi@{DiYGUIWPM&6kA zqai74=sl-#vq2Db1gqHzUI#t+nC@9~o($g?k8WIJR{Bj?XZZ1$J9L!r#6a`SLHu`| zoedqxn*PrzdH%y4_l}aB+b7;Lp|4<0{oR>cXS&|M;xogGA|wLl5T7COa=M zh@tLgy1bcuPX~Gjxi2-@*+RISj^#BSewbf(V3b=^hNpoqcN^JBz)Udw(kVfFzV5w? z=tdp#k@s4fDc47W9{IJ_3w#O?)>pvZE-wP6g=c1uV{beAuM@eEoqRypx-vSA_vXxx zHrqS2nCBG{nTvU950lAC<{ba;FaASz?<6~Nw233JhdY(wnX>SF$ZcEbtYA7hk;f0U z*FOCnHZceKBU>VFCl3RU$$^lOGQ6*huaSP^B7%--?fN~;4Q~j)Zme21gA7@rtu5?9 zyZ_dOEGmN?su!(m?iUas_I&oOI^^JlmoFH+G{gP0@!KsvedKI4mgk<{w-3PPC{;_A zG4$_!8zs4G0)pld^;I_b`N8u%ZS+-4AI?puerX98^8#NDxXOa9Qm5-v^gX{_AG1zA zjJ<{vFL)~~M4`u$BCS)!8q}$ZGTU8DfrPHlM6u5lJmcU2S1%EKefFgKQP<^SR-C$J z&JRT051aZehk&7Jw0ZLX`)~G|r`B8y$j7zRvD{Pvj<2CbuVReB=}3{ZH@hxucn9*w z%FGbb&J|NqXX4(S^VNHGU(BrpWte5lngGRkyJW$xHS*-#3!|HCfVQinBXma?zU1^$ zvsUSXt=&R4wCjSWA^*qhI^^r{%x8NLQIEMpji@~W#2=aT4=z*!y&Hd(Q=%pacYfXT znDUSS@f@EEb#ls(>7zNmYGDpNM_Lo7-m(I}rSbWCR&6NdovR|vCc;tghw7h5R|qt> znjan0B*I_cOA~*-qweAT^G5-`-veB`9#W!@^G>78Vij`sBb?(CPdRA8!OSealjF!) zzi8C?DhqoYTmqdKxujwKNd_eW@9WM#-)4{Dz9TjDsh|t`ls>NP2A(LEfvwy$2lWG{ zz)qr+u7dN9;N+nRx#P$oo{y3bN4{3pt>onmN96AP)lO;ptp)o-eOqp!SJ1+`u!gL| z5*TF)y_Rtwa-F1RzI?+F$oY0TLN8!%h`b$B8v0nhe!6!a8o)lGkd^dm%%#57@yHJVl6P+P=X zbJWX=9n>`$aom+x9P#wT$0Fn+dr|;mNkxZMTEY#Z=Mt?>cx%jAoiCmh_K{ajIeEKnr<31f+ z^hph=lQ2^~OSz^!_n+YR?f zc>g(1R$Q8jAh5;jylt9B_|yLc=8?$p&s#d&TNH$iSi8<81vgda&EIpz5R{ z19@T(CM-$_;6+z=kf-G+9cj=Zgq+1kyb@Gn)hsO+JO)DN3Co+ zq5l6QRHW%q}<{ zZnrh3zo|PwrPNMQON=I{#IB5FB6ss)kw6ITq&@aL$B*7iG=Lw?MI|u}n9F#dMzt9% z4kMkf3*UyIPfyEV`0Q=$O|o@m-a&G`K4PpZMmZI-$mb$xKU{i#4v zNeT1vF5Ti`7BD8=z+|ng0ox;*G#Pv7uRM|BLziWRJwUw=$dI3wzBc*Berk^(EXpST zKG_ofl(%G9q0W;3pYyFwoG%ur7bR#sZNQ}Aoh&ErdAl^(>%DNlALPB6Z}h|(@@gF4 zO>9YndTu{&%^=Rl;Y$|bcB+t@$9$UOfeqv~j5ur^SAs?Z_N2uR#-Oy|LCMQ(2mU;z zxAV0GA^Rbzj9)S4)7Nbaz0gm2>7~Bf2Dug3-1+3Sse}2aXX5U1R60QZA#7%8zyL}W z=|dHfH$BOE_MSNUQH#w-+Md}Wha&mC_HXp(F}iJZQnlMc&Bq3}LcCX|=1aOXj;=sKCV`jKgzFrx6 z!4%Hid`O)bcnB)l^6p%6!(N{4FA)^pvheA=Gt&iEIZ!^}{;4AgdtGiOA6iyc05O&F zGh^0_;3&xAEPa+2dfoCFnHI&sX5OcgAM@aPkGp%HiK1_!WU!Ew1kahKcNJW!|nF+P`i-ro>b#5Av0-L(f( zT8F)g65O{Ji}O!XE5c{H8wm+Q3ea$)<)aC5xv%>x{AQy!fJFk8xEK0P?{u5{{$mw~ z#SiutFH5E1Z=CsNexxaUQrRneh~#b7Z#77 zu>y+2SwG`2*RV{#lyg#B6fP1z*$ZAbN1lnu#T?vg&Q`p8nviS{CATvV*851pYigm| zM21;{TIJ@AUS}eVJXz(EC|=)uVfy1BT|==UA?NzVNO^8&35vU)=f&~wvBk(r(xUZryGIP@!lnI=t>zzZUB zNIAk`R3B`OPw#hQLGFt_IV5?D0z-*)i0&HZ32ovp#2>_Sx>qbMorwKJ)1;Mq%T_=} z|8*ytoCw!GynHcU0l?0CHMth&@xa7gn0|$v{DvV1rem7~j>XYuUA)MZ91HMxPLFwq zgt6#z*CfFBCW{NFmNwkAIg?*N&1>mUOjQUbb?1jsPGCA z`w$jDr_Ns=gr2V4O&l?S;TXEuT0S*!`EcX&r)nd}p&jJ@>1zfX+U>lmig?dC^IDbR zycJx$GxbVC9eD?jxGJ;peNE1K>7~;p>=|dBnHni(1d;&435p3NFnme=#}so5=F$(D zxiH^I+{d$Q(u%w&Lj9M}1?=0X*cQq!!yGq({{|_wJ{;aA`pAEx3twMn9 zUd|hNQT6ovf4CR= zT&dW}gB&~3<{R%Psp0$G+x#LEdSLmf#c*0w3w;!ccBZH=#&-X%4?>@nzg%siW@W zezcOm$bnV@dOgYu9M0Q;!h>%O-S()vDh06aN1gTKQHA@b3oIbhgW}iAI!El|Wf*7s zDGXwE11Vq132=Pc()hlvF3`n>8NX%{1T)b!B>`_Em=5}PJOz6uHvY1Ik)D_$C=K@f zQ;$E$$A=9#Co7u&y4hB04%6vh zFPA+thuWD3*NaX|z{9k%+D9gq@JO-iBoDV5XtBt+oHum9-oDjNt3y0cQ6@<*a}#s8 z{Dr15J@PR3>p`CAlr50QG#xt~jXf*x+ss<2#2}_=Tx2qYfcN%% zjQL%E{=>cfQHPr{QEpAu%{3q3w*du5Z5=_3a6KYXTcoje2~kUd+5qZN1R)ozX^IJ4fmCXhqXM>5Bv9Fb~Wxj^@L4+J(|aU>$0?1 z65RLYKDT75LHV=yl*{Z@S#xOTn|8_$aR6;QgUU<3j<8g=@RiYn7d|WfIeyYc3&iyI zC|)?qK~I0+EDiQ%79@MD>k=^^VUaK?hR@-l=y!?hE}U?LnP=S59`~K!zUiDURf9_9 zXLg^rNZ|bB4@c@i?2{h3E?O0+3Xd{H>f4l1zl$>H=be#((sW4@8WYTKTH3}jqTW42 z{2WYj@c=k8Wg874ciqD2>YY3{CKxztwL+k@fVR;Yp9W_mbi|B(|N~Ou#oHm@A+M~_DoOI9gE3(SA3_x zgJAXONPjZ&!#;&PPi{O*4zU2= z;`^@q(}y)l+>$H1?9wOp=FoF(YSA z`sVvwE1-E*IhAq&b342mo?lgv-!0*${Fn}VkjDOw^kC0kqU(#}r}qGAC)W?RV&C5h z`UgDXe8^E4Po2AZ6S<7D9+$4*`6^^SyPpf^xI{yBcTw!A{zbPk*nUwPj)d_^yzoK2 z+4qfv3Z8FlPss&u784-v(sRpUY7HP`9?Q9vialt}{eE5Jvfx~|H6Qj^51zKpJUSyP zhxNOaJ+zpAij-qbNvpAe<;`}|B^y1^H*0>;ABKIYUlU~~ZWzNuk1R5cCVNQGI5eDq zK5)tZ?p&`?!1J;0;)Rn7jKKf7!xWelphscTy3H2-oetxN5`HLxq0KALsXrnx)LW#M zin;KPw0`rm%2qI!Ges|j93kg~mRots=!Xg6BQ`5HT++IpzD22Jc7hk)q+~_`*#g0qyJiFssh1>c@-@-d^HHOs*v z_IWMOJKphn9WcN zqmL2#>1VXx-*Pbk^HtNE#?B&O7nMq(Gr_qWA->=8poX8ohEupgK za9HGi)P0c^OysQI-gShfI!v zKIRNNz7qTIXaVnEJI6S@2UlIqIdQ|D7k)lg{zN^2{xpMoH+peyRj&~^D0M&%=skJM zUFR^@m(Os8^V~l0Ei)%+F1Lo*?73sX_lclu;cPC~Pl0{A#{#d!U@yJ%bpc7#ao@W9 zmH+wE1e#2ENdBU(T;w^WW@JDC``t@ON7e0+dq4hnni}(wl}!g*9@&F;)iqKX%;WIL z=`YlcYpYfFuX4sz~xEq?y2V4{3)(7I0oxGP1P@&v8ngypvdnFvD= zxw|MgYl6KL4TmHDFl#~1Sg_^fpbaF#e_M1^H1OcsVsbC~TFA(FP0fQ1fYmhb^d01~ zM%T8U&0HQOK)}ap*Gwfi7sz_AP5}AEt>Y1T@9=z57nv08w1hinl0O(c5CfHDHt#|U zGb5d(4;B`o(A9Jryc_Q(UP z3zBfv;f~=;c`FE85Ib-67kf`P83g2aEr7}XPop)77EBHGvBrNf1nrD3y^6>KO~(4HY^j%~(QuLBNXx#r80}+L>6D?Eo*R2H*YF!ahZh z%`Y_!JkXNp754a&9k_D$#~#6b;+LCm_ZTr(RkgqQpf>gp_jI35`VnOf-B&IbeUwLk zao~B0-Vie&*@`L5#q<5ujib6p34pm9lip5(DqJ+W!{s_iggd9X#ddtqchi>q;!hAe z*r8Zjm;i8xY%Yoa4iRi8|D*bd`n=#qfHE)kz>LNU+5diw{HA-xxf^Gsp|O)YOI#20 zq)y{E4`6<{B{M^4Lz)P$;BBQM`o0#M3>8?=9vwOKiY8?eWUXBlg&@ow4d^Dpo-y!U=C}3JVvw%GC8y!jbR~Z)zy!UO|W*Nr4!+R^I`{|aCx?pTvoEgcAJc83@Z-)Pqf&;F8 zg;dy!TwGz6zT{{P+v>9|fq38b%ZN{E$9t?vgJL}u<`g%Dj50d$bCUKBjWD>O0jE+$ zZzb%k5E5>79$CXuW`$pl=gU6u!WEMH`=jwWiEue~LKFKh6y!5mOgD6(sgnl!SaHtO zepgYAdO^#j9IwVOF*su4O`(5;36#VB`PDnA!yDSQxC+#F{FA-zrHlxn&-~uxm3N9@ z64b}4wQc~ZAt^y^*X-fFx~_~2@^nLK%6)g#k>{y!;}F#;dx+~QX&9Ba2b!g5Z+G+u z5A8F)@OT#U^31N(qMHC(&q}@DokhN?eOA8@=1%0ApCu#QDQA>en;eZ+-W8{uXn+x;=e94*N9Fm;7K-?l}6x`?rWi z^Vq}3Q_%h`&lvVUmHTm;+#JOE6NSFo7{T!Xi%0sU;&3PBio9G2>ZHn+nL(H*mlQe` zb|6X`Shw~*E(~ZuKo#%q+frlD{udSgIMV^|&z)1d$X_iYU*_L8OaKlhHbL?t5;%LC z?8;YWJ@77jx4#2*qhje**9Hj-xJvOel}%0&`<3pd*k8n+<{Mv>DSyd;;=80Ut!oZ& zO#7D4qfleeZ4CQQ!`A>g%HtF2PTH{jF4j7e(*Z6#dP`^`YQkZU67QF*=x?E`eDmZ8 z3v@cx6{ezZzJZ~vM~w{qWgGotGuV$Ysx!bvXJ-$7U+MEJO7wthOX37ahZOvNd{#*j z&y|@ij;UsFQ}mZD23Y5LkRcMqXDH=+jN-A&!Xg6 zH3!;Lh5!$xuq52YE|v;Eul<6t{6)w&Dzs;Zzv$Z$yK(fBt`0D9e)KKt{rO`^aH7>H*ygqp_PAtpDrBvHc!I!{VW&`6e8=`-lIAB;RzQ0pHslHJmGrY`0;2z*AJF8J*>w_oIJ(jJ z{W$8tZb_8h`)zH2vtxX6whMa)#}z!EI_klMS%E+&-d8BOE5liFUfK~h-fXGGbKslN zfGY069%}i{C#v#*=&J6ZzN-!PX&Nm}d~k#V+0AEeowWs(dm9`RxWB8E-0tOVlLc#Y z@?ocIhETuA68Zvr)5vcfxIK#JbLat4DzY9cc+yNuNp;8u{1f$}6t?AIM}D2D-_Qt1 z1wX|oqh3efIQGp2=aGw4m2q4xG9X{4#qXw%eMPSWsp;)dC(5c1esu`BM6TS5uOXvJL@)~|v+VOBf{^{aMPZyjylBQhj9731 zXK25(Ux@)c(j1czqu?wHX<%{#?T6^88Gzlsx8a%y`T;qt7_Pc^&$R zh&ekrrB!&z&l>r_6xU;{F&}d3zucRvmL-76;_0_J z_NMT#yKL0tvN6yMx4X!@q3_r(XFEDm9!#!ivX=$YK%+PZGk3Q+@MILf7HqKs0`2QS z_F{dwCp!1@iGu|Uu63s-+%^NM`g2l~8AdSfaXlpk_Y_5EekJM&m;$$zYsigcL+DDe zB83H0NJ(~+tKU%up4=k_6+5yJf1JQ#9p?c20k)^gPHIA2h1}9oANJFb>1yY08pDb( zbDJ^pY43(~{yVhK5u9jvy5F1=K|fva<<4zKNTnYAL}kqn@>6B~f2FOU@;*hkH!b?y zWu$96gE6lPXMSC7Lm#2nORLR;hH#=dle-dmR^2pf+^48@fd878&t#4r<}Mn>ON`N< zb?1-UC7jP|8lU}G!+AoPQc37r`6yvAcKPfyp4+w**}?8K_E1qm?^!geS;6n1b;--W^+4&AU4Hae z%puL==J*S+Kcm9Qmb+J7|uV%na3G>(XSvO@=u~^7kMxx7yH@% z=)tAnnHe2-rSs3{!=n zT9c>l5Q@+r5vKn!^z$&G!c4_&dBPe7!c`x>EJi=H!-%OX@;6&ev~JK~|A6_U!_^XN zD&SGi*`z{)enq-fN*&Y@|GQ^#HU{_oEY&6ft6O?NSGA93@18wm$wY@w9M^^Wa@VI{ zqi-)}U$ZJBneYpRv&M=oLEpVy_#vQwdf-qZg^z_-$c= z%uhuQ^LhXM{nHdFWDPHg#9Ys01z^=o9T-&91v4|lIG$?kTRg_dbpZEjk<+XJ>>7r! z)1&w30&=f2r&5whgD_9@zNEC9zzo%?uJJa{3GnHU7bPRUm((;GNdLwv0PpUV_(^n`NuF3{lfqhv-)`ds0v{v8@24Pp02>m70Ntuik{7 z2l|55HoB@XZ>aGoGw4}Q4PnG!%`zMLS9idb&!dbS4AU-eTJ_=FAKTf+ggo)9af9h@ zM&iJFt6HzBo``?or{4ct;D>&HmT#2Gb})O#P3msx&lD8o!TIb}D4FcF^-J#W9c)`-T+i z`lCXRzzer8k7=H(1A9nN<<(&U*gi2V*NQ(!TH^zi1}0l*>6()t_j81e0*Kp8JB~f4741IrAi)otjBPUPxA}fToWQFxICH-|aF1gVrS5m8Yx_k@NMVpoSK- zG2AZu7>jz4fHd{L40|xElUO#)5rTb%L%VyTx?n%%e^KEX_QA8U)qX_|iW|j2t&8}5 zDD21!x8n2lvm|Vrnu7yUr_N&eb6*^YQhduyriSPyg?pXo#5fm zDi*losn|V?^ZBOeZ!gRH*3k9!&5D?b4cx9^v-mEDIV#(&&vAEkA+tn1{Sof>-V8kU zh;7yf7xnj&gXsI)ubS4Fhx2V@`KWYjw=%H4YFEoe-~I>{g~!&M0JN^1=~w{_z2!1v%}>8TIq>Kfqn=Iy`8GVJY{ zVZOJ&O9H4W;^RNy?>G87ubI9I-_xZ3ypJEm_pYR7Mdl$h>`6M6V!`i-`>__+7b9jM zR83PJi~Wm>QYoGn@jVu66#Zw;!U%Jt(^q|2^+3Y0c!n9dI5TMdtsh&$?Lp8LhiV(h_XLoP%4F9GwL@BfLs7J*krbc4aSL~u^zqnoI+ z1{eKwp6Un!9Qk2UIfQirMq>&*3niUTvA^-|z*c-!CNC_}Xi@y6 zwg&cr#?Tr(-~Kz&ElDaZ13QGoN3&H9kZIRL^AO+j&0O;xjw9Bv_~oTsy@?K(M9%Pa z6gj|CqeRg0bASlFSOybm>;ZrCeJ=&~H`R9{HRmoFgTgfy&+C|DIdM?k&=+<1o5LLe z0p4h*6Hf2u4#7T)b1|a~WVT?|A@(yc0efmR-vqqJ`S*c)mANbSPb}xX5iMaig|NAF zvvbJNAEb2H&OjeyhFGklA?oq5+S}KDU_R_Yo5S01e;rt__X@VZ=?GbK3zYt29{o4BRXK%L!1rt_;^M9yHR$_wV1E70*2r zkPq+JLM9o-1YyNH3_Kd>XL>io`d!EvcHc01OnVrCqWH}s;s@;Un2aWDH=9BMRpaWR zJ_q>N`8sSzZXaB=E+}mtGlPb}+^T107EsIeC1>Lv>iOHeW>@GAg1pDxlh?@238w$W zZixJVC(btnyT$}SAtcI!_jLF zOTl6M$c4Nj>Mvsf&iig?UrDa;BiY<0%i!HG)S*xEWh2>PILuoCz763m&_c}=**dOX5mqPBVthMj51(?_c{b5Hw z0J(mS3q9(hAv<;7Ju5IzZ~KTn&)fk#`00av0+H*R8!Qow{25I@rz2^YGy0sXSbhQh zv8`dr+#OQFp!n-;RlOhTHnQ%$@52;;ekY0jey1@^Nz#0~gZ}>iG>?kN#i)V4+rA*T zeJXG>>hE(FFInKXetVYdsW|vZa`|1BRD~BY`=Mw(QG}hS`{ini@)O=5|qyEpj z#fpBolNLe&(J~4U&T4-k@2w5=FTH7uXXF8&pqsZPc4d)A5&6$E7W+N7YqrL4FB$yz z%4BW51o(5mKWws$y4v+>16?vB2rvsZW|`a|bXhozr%fBeHGxa-J6M%Kzfo6E*3jd(bk{D9ekn0{W^}rn@o7BOw3e+TKJ1aNpRrm$J(-{dk&nEx$!c#{Gn!e+&i1|Ci z&nZgHih5wg6U96frUzQH6@MxF%)v<{W-#oDCMf1Fjoz--3*YWD>@P+03T4dLEUV8bnKrq~YF4i?JWYseD%nI`dJVk7}HPV0B0|d;s&76Kup^BL>zG7$z(iblD!h zMt0c0$DDcA@g*&iyLw=-^w>Q2ClTD(|7OheN%-$ysE_Uj%&*UO;(Pvul*C9T z&b#0C1$7<99G&K=)y4bbQ2aqBQ7qgVYV}5Wi(X?M|J#O|&41=VxWMvlGu90GwJx;0 z&n-c{=NaKWo}+8!2dq0zszU4Wo2hK!*kkS0{%f@h^@I7xJ}MPQ;orT(Tbw4%H zOX2gMV%oNw-Hm${tGnMU2(s{Hzn~h8ts49-Xw?vWs0~}Xlj6n}y5O9}VL?7;0p7BX zKP|7Dz%7w8@{4xnupFVg*~h>OzDou5T&NqJy^wv{0{ypY+oIQHH!*KEBlGJr&edlc zj^5^LH-xyroW)C0$m!MjMUHYPobo@l`Gbgl1tWIvq7>v(PnJKt`xA4_zuLc0b7;cf zhi9ngvM|T?`+lEig8{IK7>L+mFF;IT^zLU%ZSeOgY5voUd%ErkPqKZw;J2#&(A*#M z{WC5hiEq)*=X1Sucn$r)F@J)tAa^O~=EmtfEhR{^d^(tDql|sb=LbJ=X~ELtPiO0t z^kAR%LOrRSBfRYVYCCig?-xDObbJjaaPG9A1WlzH+!RTq)fNJ%&LDCZkUGHPqH4&0 zm>()VabY#6+yYkb66J4T{&78V8VKljE<1kPHV%6`-jw8iwGTCdbH$$&lr_vT|K9Bv zmZu0!Bbviv`*6s=1j^g$v60=#k8j|RwJ5d$QC?yJ zyQv0{m(2ukHp;-)zM8cG+>ak^qttNH)BvNE-o~+7TM%*cVl(!}``60Z&HGNMyO=Gk z@NlTYweTjctLZ9G{#|i#5p#*}Uj1?0>OTZKyKU5Gi3X6VEk~OfYYVT_wvI48Wrx;X zCl^6|G3dHd)^c5+0EcVXMrS`zV*j#SuX>X{Tn~IptU!O@sdLWs941D%uNYOgV9|o; zjLhPGH97cDH(>e%{k(jh*&kl4VV`^Ek4#n%DhP5*m)CTqhEu=ztmN$kL64}PM&k)E zKt*ixi#La0N{J3m^ydo-jk}dz#63CBvTnZ65ny96yV#G<`A)QJ%_sC_F6*>5eY<7= zAC_z>#$t59iuzI=FF_IR$euGX9Fv1-H3_erXw<733F>NY#*i_n^T;j67QQr$Nga&C ze67wSDyt@b7zrB7iQv|TRw0YJeaC)*!&@f%HFcmYfHd?~ z0`5c7J30FPGlRvFi6fl1Z9pMe>B<->57gG5e|%lZ4DuH_$MY4C5BlR^lMecXrvob| zvp?Fw1DYb5)?z~t;CaDI{tkPk>5d(H{8|`37-e|TF%Ut#J!E>t6!%lJ43%djH6bWI z_Za1G^t0Kj=LBDL1m4pHM+ce!`;0!`>$X$}hhFtNtVu?|5Z$iLfxIr!01<~G5;-vU zzimB?e|ITmW{81s#2#5*(@(ncz$C+>7m4|l%L;?X4!{0Pcz3J+-zh$A>ssKh~dMU^FI(-zJLGi)_aqtA2sWKeIj5PUTxs}jsH1a3phnUP<1 zaHY8UI*Fhy?A}WgHbh=f;BpK*`x!;xzoJH&>4#izg01)OKNirwnpKsPL=Ai7#1aN) zO`vuBe0|u53JS?TbQz#;+T!C~j&;-vuUWDGP9Mg7c>eJCIuSYTHTUJWrtRVUkaEz~ ze}4$p^c_3FYl1NF@Q$`6?x&=!A1@6bH~<}L387#0t--bSkg-e+IjEF3eCI>1Mw0g{ z_WQ`KywJPABOR^-f5LTqey^%SvW9Gw%Tpp8i49vTPeR@2$+v`yv-)b+)J2ebCr`Au|vNFx1C5}EaoLuSyZ{a{B?n6);ca>RtM%i zV~bCq54NkD^ZvC3U66accafqCeHyIlqk5&b&_r3%q{>QwJFzNExwt=H(&|?B&QJy; z4G~3-ZuALm`6ieY3=%9UCdVs&Ag5Hb+Cr+-5xLoJ--3~&9;jw|tt&(jN(a`n_%q~z zSJpwD(G2?^cc{EY*Bn6V&c1sWJyd{-(lH~;!~t3@#Uj_)IY48et#psW5`>vsSD)7q zAnu3G@ZDdSf5>PMigUHYdu@0`$dVZDCp*gfEDS)bySb=G26JK`Os&5ohyRg?T2Z1r z=DHK4tY3G@0`uEXjbBkeoXIm~ckOb3z>vNvnNk(lbSzOa#Lss}?8K)yoWFYYYy9GH z&lh<>riAOf61EG=N^Bw-MuYS$}H?43z=PskyeGSRT*@2t2{4L*GQb3$*s8B}TWy!Z$K}OXUxySr(Do-+j zz`2%xZ+vxt?QVC*IRjf5vLvDPSRle`N+@mX6+`$(SNWvX9dj~UFRXhE7{P>@ zYWXRgDQb zMA7?NR(}}5SYA?pW&?7-dhfk?ggqZ^#E`}|EeFUg?Je#`o>aZ<$PnjYBRE|BEsJH( z8uU|}ZADP05a2BLkiqYLAIrzd876ZOHMU8MbHQ_BmO`&GObwpoFvpwCB6nBwTO7NW zI{5W<+!k%H2mRL;foEzo;rt8NtFM_1!SKv&$?!z%?o4@7 z9DrPx0*e|l1x+BYTD$!X?10pMv}KP;2C~d}%A#WJpq76ze%k}*loZL}o@4E0~N&f%5k#yn;P@*m~sK9Ac& zThc^Gy01Olj4_B~6BGm$x?_o4f{wskG|Aa<8hZxc{??z}hrV&LmiM7QFh@+4DB(%K z^S^mV!!-(f;U)a&){9Kwwf0B5QX4LCzg@W=+=P8Gx*O*g?wf#Ue$*BtALcz`Vl3|# zFv3HIj&H<$oN#HLsxuzBRR^9P^b{J_g*k1BoMSjI9OzcsyI(}aJ_6qW1w7wN=8yOI zglrRBxl1mqO<93DVgBouq7jHEhF^PXEC+7_uH8TINCW)n8jRhK%Ah}P#;zcb1H{5K z;BOa|@b-_sq<=gC+W8gU0AjA{E|uVUXgk? z{FAF9`k>OpzbBy|GxoT4Ue`lI*j%q5^DIVg_q3y1b)*hZTpbV}5aW|o*{TLjZZC3tmK*s-b24qBM_Sab02UM|$`jtV}{@?$1yV}Z6{#~|rq z|JwjW6WyNnqc6C>#G!3;RsvoQ^rr_<*~4)=72ZRqZ9)6yLq8StWshc-wH-ZU3xf*6 z!*rDZ_`+n8UkvZ~EGO^bIX1 zY86OK*@HXvfIv&K36RwCsFQHpz_Ga&%~mQK$QOQjslo>JC7sLS9iiIT|6yx4-)#mz zJll_5JgNiN7?MS|2V~$&_Ah!O_DDBQx|@{8VISBQ$!D@XCFGXu7%c97C+s=4FsWH! zuERUOTbbV&_7W@EuAxuUi*btOJNCq<4Q7RI`yGNmj4~Thi=9{)kN7;O*ar@J+bWujMd1ocbQQ&9EW>{sSORv4D96^_OPv@ZS4(W;RR` zIcFwUHJr58b>V^khhnNRfOf|B|Gs}gAF$=4^G6r0z`x+cqi2dTz(oD9;$WX8?s=&$ zwYiGHzgBOVVKMB%p|VsK!JhSqzkk{_updc&8O(e4N=mVNW3Ovoj<_;aQQ=bL_KX^mAe z%sa+DkL$RIyn(vHiJp9%D_`7Sy8M?J2Je1YEW!J^?9uc`gG4FlO321`NaRP`mtH)l zVh4+}N-6DE(C5X{_M;wsQ`c`*Qdzo*LLE`(vI_bp!i$5+eA4y6AtQj$v`-b(FvPWK%M)Ffg(uV@8zo5c+MJi=?1(-NRU?~M=5cnWY+2^By+`1@rE#v}~yAKf{ z5_75B4-+TuFB1L+>`$v`hNAD1uUCnx@Lxm!b|#oq7JJi%uU}a zR7kW2hD#sqcHME#(>wiEy%+V&!KlGe^s|ZfNx!*{b5s6sKP&%DHL!1P)nTHug#;PT z%Vo#K!Ko{BhyioxHE9pML%vAE7`K#Z8-)?_! zBbf75RN%!fbx_t9e&B6wJe|_HN>Hkcdfg@dm(U-;!=bZ|e?PwWOP%`_!M>Y#&ifiK z2%C&L$NjK|!p3Wy5!ho$^58R`{P?|!zw$2lfP8(sBvwh(56?|o`EFe_gfo3jh3e&w zP@d0Ir_!}XXbsW7ti{X4EsdD#=xq z19L?)iQgaK=ehgimWX?t2~3FH(<2~XWrg$mVkqWu$ah>he)}lHxee#MM)XmX2QQ4c z{56Nz0nf;cUydMtSi&dquMI48jx&BhUKQu!jZ>kR>lkz!exCh79fBfe6UQ(Q?d8Aw za+ctLy?(2;BmT&BB6G^Tasqwk#Z8Rz=~gi9@{#MmSVQ0scVFbeK2HhP&&`2Cw(ueU zW~&kUZv=mD+Ish?FA@U4y`M8pB2*LF#%7m~38UXQNw#S_n-g?{ z?GwAY1tAyAP6le)f=SxJiK!x-Q^g0PW!`9lu-nReZasSlul1$kUe*WZJ*p%*R(sh~>#?VGT5bL{`q`yWZ?9gg+;zHu{=Jrc5I@4a32 z-n+6QqB5hb$oxbIAsY6K?5t$Zl(P3GWJR+1-QVNa{~d?tdEW2)zQ%dJ&fB{S3ZRqb zE%@iX77VGZQoKO@xKqu8w_TUa;7W)@$nhg`c$3Y7?lDxS)NEk_nnU2@GtyyP>+QX zl1KKZ+R@(Yp0C(-A8aOYn~f-bfH-!>rq+hGwPf&%$7){nDax%~x@A>jF@JPmo2mjr_6;u92!&UZeh?n?%6_4FX5#UJw#> z$%9Y?;B>j%!uzQl1Y-pg9k);+o`qYD^ab+IsY$Ld z>Y(?y_D|_9(((9-1s@&WWP`Q(kuDCj-=eVQ3JJyGpeE`Oo+f&a(*zW<{*!{&CROIQU!wVyFUCLIetA#`sF`BNLL5xp zT$OPzbHv#coBGma0x6BW`T?#QQ01gOt$qjPr{xqBg;tmY-MZv@G~$Rq{|}Rnufq(a z1G+9KPxN7t6LA+!K3Ar^M?PU=e7!fP$al*2j+!6a7$SBoZmC{HzjOX?!A!)1 zShC-0UCI%KhgD*Yt*HRC_K(CKFR=DmX* z9|zFBG>ZAvGf_>DWsJ|9YDPH{IihzhIuS2?G%exfGZt{0bJ*YxGX$geWMrDO%0Opd zowhA02b*TYk++IaF32N(-&Rw^k)k?XR~}RVGeru+E;PToNWhz>77>G@;2ZOzqQ)To zyNUrxVBv^Np6Gd;K2$`RUudnV!If=}!}oE*(0H-D&q*N!O+{)SZ5xo!pYW0}ts*sO z_YpO{`>6;V4jHO>2Pn@&<@{FEh8`3vyXTWv8-h4b(;}ZH9-MTqUZf%(<1u__Q9Rax zI#s!Vy(#2x&CJ0kMdzq@ZJkKd1mdo#GjoT`quiSTTz;c9fGtiDrVbi2aF(4Ftp95S z2A*%iCQ#p*;qPFjF{lI##c8;u7s#idDE>5k7y0{KOK}*@3BZk3vaT4_ccQNI+lO+9 z5AUnj_$|s5)a7FbJ|G{@$npJbBk~IcX96~=!;ivnFY|GJ&5RoG`!va}qjU99aQS~& z_QoL6l#KaOQ5@V=o3-zBT!V%iyx_oQ0eUc>)YPdD_v#tiNq!2!#q)tXc%TYu&PFu! zh?kq^vCW&1gm~F2H7)b&D7SO+o>nP_ISdq#J=i=E1A*MBGA(o-3yNS<$ma_}j=)&* z**YgwoC)pLTS>wts(5X9ZwhUa#y4)S2toPHTQ)5QXgO879@RN1TCg&z?0-c>(k#y|1awCx*{@Jo{?qT43yK zMi_Am& zeCv5J_vh3>pFt_)BigT;iM3vl=|_5wp-K#@E>-Y9!Y2~HFaXYPMzorK$gigK&+c|K znv1#h&I+v}K5vALdkOLp(vL3mh{_?~ZY=Y`7fJzmlI*9Oc@yn9)rO@!j$|OpJLUcg zqZ$Cl>gK~=C?6AZYjrixP^Gg$^$lfO4 zoub@^FWF*G(4KbZJ5eQ>nLgw=rq9(8Asy=ykJauba>8Ly(rwZqzJmqL#j=_Og!o>+ zRf}{!^akrQy_d8=`*EPNW32)_REm;6nKc2z1QR`%aV>Dw@9>}gO$=;K^E(da*C0l> z{zOAp2Y95J+wKz?fSOqIg~W_J+^32zO#i0_A7Vcaer7O)tZ%e2z4-t#Cj}kE5vE`x zCt5~`c-Iou%;yPX%7~ZY_e2xvNKQ^d7>1%$fITZmm4E|r=NKgR3tH8{vpMj@2KmVi z1F7kgcTFK$=)3pn0@97y4Bbd7;eoWPypl1T#-P)avCtbU2pKoHpJR`pdRU5P!f00m zHg#RNX3!pveYZCD3ev4f=+}L9L3zP-<(~d8#k8RCjum~)RaK<-C7)#4F#sb;eE)sg zYp{H%`h^^wN8EzgbSFqpS}oY}m8&`G~YlA&&D#R(upd;ks0 zHcWKC)_1+R9d0fOn|ALaUQ}2>@((xRiFVX?&U(1ogd$xhNdPC2ryO)ORfNa7Bb|VK zQ{b7hA?mw*k51MQH)l0B{4bh^Yz+Tr){Ocv0SyAl6(tL}AB*vEs8$Xpu8iabTt|67 zJjwkv;%FZTqd18u$MQr|_E{E|2uS_DINltRhn1-rxeX1(Tb%P)9kr5xexL9ON~GH< zRVZk6;?V?*Vple-=f>c&)*p)7Yyl3Le|G+2T!!zq8SGN%{x$BcWoLD_0Fn+|V$BM1 zV6!E@eKp?zZhALP@zo-J_Oo}ro<#tKwbce`3dWGUv`zR6<)C7F7uZi5quiN7H%)71 z^(oUu?;s`NwPzj{DY=_4}G91Yge77(gZ65`&BDWv>%c@3?(U5g-ij(*>y6+IoWU? z-0$Fmk&}$jA~iuMN!<@OVd4aDaGIq75MwT zE|5ML=`UD~nJ$n{RZ!denrq>_LU3QXR}Psu5FIpizef9vyiFq2;0#0X7!D+H&6Wk{ z+nXWpC|N;Rf;e%{4RN-a(o#4CkxnVR@u@m4KTuVOq#7e#TGHe1&xJPxp_TAXNEPaL zIm|!Db|L*uMSG>T!5sxysjM#zMSP{w*C%nrRa!u`Xz=%vw;ZJ0RJwybh`3-{?fw~9 zW{~<@+Ior|<##L+Wch>|!vhm`ZTD}wU|z@=N$7>{uR!`AxTrqco+jbwEVTeru~wp; zWD}^`5o~M{5QVqh0$Y32mqBsVH$Os=6aE!SB(V*c!(-1jo%cra;9wZR^#si!`G0eb zVKS+Lc2E9WrEz)4R=Zl_D}r)ccnKZUeUxDQ;x@54x_6vwt^3B2uIm9AeHUiTG>5HskR30ed#k zc>Ox_I{^nA-;-raM*G3K`J0QUS^7Y$Sq>>8rwWc~vB#YEQT_Mp{91gAAq;KPwb?KO z7+^GwwT>CW3)=04XAd<2FFG|`YFin~z;&?&mkgd*QO#)h3Biq!nSb;T)q%TmR|5AO z`K3wE-5*7%!m{k8>0F#Zw^|Y5<;9sCXM_8c+V$M@u$!&ZPlfk!2N2vig)91Q$HtL82 zQ(4W7bYYG9t5S&!3LrhJc_k=F3a~0j^y^WsNpE>C^L#6+w>LkZutb=ELB*E|e3Zv4 zLoan$)ZSjD2odbAoZ|0~xGlj9vmSI5+Be1j%5^7RI zd9=1Rc+C9jfHxfdDNzF9Ro~8EWr;$2WxI#wR7h7K{3T>`^e)QDCDrpKnLzckd(|@8 zEpwnxxjqzcE(9FE-Ed{lTy=))k=H`55u|$rAL^j{*}rC%x$Ke#yi5`QMULuQ+GV@x z?jl2&aTt$(%d8E#Db?3j#u3LPzBEW34Q9Vm_Z4)ZIns+dhNUhHIS`hf^?2|^8i+8$ z(gV=m+#!o8ykwdk)b%hOUZOsl*2ti~3;R&P9IsR?GfxM$w?usQ)+C_kw*j{ep!3PM zbxhdvNZ|v09EC_dDbl$&Ohvs?2XpGb3xVp0r{{l`=RuD+EDzQ6*Ac%zA;+=lL%1xc zd%U#yi+mnmA~y?vrfY&!06p#_KS_w;?@GybGlGl|HjYh7ZrBstQ658cj`8~n?T1$s zLAAg^oy8pWkt~&T4dOFBkdH#ec805sO26td;-Y5+T4m32tEc!V6vP)?BT2 zh@a)&u+Nfj1oD3ZrwxSAUd8lzMllA`OLdK>*PuE&Yf&}6W=S+- zPxqP89@jm$;RJDnTyUN$JTKA#tk>U;R8T$qdCT9~x`_l*@ObriRxF@Lt7x=I2i@BQ zrmTNuv;jMQhj|C>PbV*y$=lHX%aFU!G@CMq`mkTzQ^@C`@2$PH=7W6Hx)_&mNKt;X zEK{Q71=71I&VQH>XNKjAO5+T~o$=qLTwZqxs)3f+S{hly>_!NHA8y(Z*NIZzWkZ@V^>L8 zHAoc8OR~Bo2}68W_lO^e07?I~+WTclKPXP)Mte&NG+s)({^3@I^sw`LVFG5bsJ=#W zVj>LNQeGXqb#f39-KP^6r3qyl4+A}sPN(;6!dE(^SH9=6wPYNp3C)KxLaX(nFsP=H z+YpQRIsrVKevgok@z$l}IaI$KRk2Ofzc&W#g3^Y&GXVFC%Ju%2Uo@oh6+T^igY+5i{2P9H8-rBG8^Ka6bgyzti#|D1M)?R^jH&yGOIoSrWsj)> zuQgwu#mw;m_Atic8k+Aikr%&w>5XzMzdRN=HRb|(!7||_XFYhL@2*e$4(Z*?hYC~> zPvgI4y?!AP)W`PpKf0QL_GU9~v3JotUQ!^Qp5_Sg`+S`QV`h25XwEsA5#?OtkK48> z73e@tP_{#AE%Kp`6o{E?@*rQn*M+ed`g`IstBMaKL5Vfaehc|0>1hh(-#-xtjrGs( zb8bk$$zGoKC**?`zUKM)-widWkEpo*WCQ7h1t-EE;7Oo8S2AZRw<6emzG-QN@*$Sy z!GkdpfJKPW$bp6y>Z5X`HlLV-f}b8)TQ=e@cXBxSAss4>8I3Xb2Q<+gTjsbc#SU+q zesAC%D8hwM*F!eccL~S7&x#)qgVsR`pDb)1aGVXIl8->T!~D3qzo$qCGMFm7RwxX^ zOU}go=pOl7vE6qI=@8TFGq&IROTxFxI-+nH19&#};>W=|HQ-RG`7n&`@s}pP?|-4e z#>RyigB7*`d~qDxke}0rKNQ8Osi=>;wN4*(3+Yh_`Ce`3UDg1qkTA1}Jbfsnp; zWdVb+az{PH^}MsAo;h<@AA)bM;fS%LTyBDYTuwiX;LgZo2Oi>q^lyLXi;kR9XnAOz zNnVe12}BoE8|d@dC93JPyfufk+R}guq}TU2&+>eRc=o;JOwf`i;;*I#No`T-TGb%UTMB4 zd+8$pBWXXmUG#LICeL})?-AOADrA3*zGe(%ohMhKip&ugzg$NdaTTZJO{?%$k&phx z+xH<{+@Kj>HG8*42$qy8`0&v=@s~Rl^NEl;3_bLVW81cX9oC31>A(44`KHhQ?;tjK zsU__8!b2JEUYx#}#uo)99D;$j`KmCVzkcES5$Phj!?X5Xkq*#4;*JZN|FNIkl5s(G z&5a#j#RQc1xRxPHKK4fzQjQ0(qxO&<#a%vce-U7ft>}LHEIK!ndA=>8Ia}l3$I1h* zRpFVi99J^Rvy9?sV8*>^jQHktGfsBqpei)lV(lUdf)ybF+>KhGVuqs`m5%r!bl+HR z)S|gTm0v?biYQ2M-fnfWM0pE%_Df7vDv+}**d~tn#mkOc+EuP>FxM5|{2g%yie5VD z_~dDTVSo|Ims5bD0UpDeA1LPzA3oLMS%8mW%G1wiZ%y1a&$7;cpwND)kZrXB&80j= z7%|aa^=uJ4Vg~WP)wrq+x{CogCH%_bkd8`l{INm-(vw|CEhVOrqa5=sg~vN#lE9?R zaHp`;2#kary{9jjfHa~aw)d?L{QGmXAc^K6-v%zlFcqOXRm6F+F--)7t4x(%8X~^^ z+13*MRrLL|ZL!@QC4v4iv-*u%CZ|2dU-n?JFf!;p4_}>W(?8>q}#>Srydb zRcn{B|2uTznXb`w!J2ElB}J^GZmM5jG_M^##f|5%gAZv^4~Q&GW!w zbl>fBKb2%gd9K{kea0k+(}pXddc=$L3dXNBDI(s=fRFg>NXvcXeuW@7AE(zujB=?(SXD-RI}GizE%M!!#({<5DFs~!}R4M|8xFrocu zsWg4M89cc=YrTi+JY2{4q-a|T*ebAKI`ub)tOoNa$9xs&Bgz$^wO0lY%Z>E_e-gmu zNxBp^jOGQBVG@1Za)7^4*5XYg0p@k7;=<=F&>fbIVJEH%>T6My!@~NY&#B3LigIk9 z+EYdIUGT!^&!n-w+3Y~A;ug@2=G3{E6zhM~jo|LJO^S_Q0Oi+c#YYd3Kfl|}5Ciq4 z-`O44uPCuV`yyqYv7jQX8YjJaabyIo-hu~jrO^KOd&zW~vK%}njK3V-Y6`DjW!2Q; zYr<}sbBPkVKif0@@cc|zQgFb-KN}&@fLOhNlOCk!V1F#!n%1BLk*@;RVcK`7NjM;adfYat7pM9+ow$QB>cof~L!X7MAP`gXtN;X9;r{N9bX{LTo~uQc5&l_nsBhkyGfBOl1WQjHtb(FPm= z&-A7%NNfUK4!di_atAn*GL zZ1rf*Lu&Y?2%b*I>nr--z;Go>2<4eYtcv?_> z=}U3{i6BJl*0V)llY#xuAFmZ7eAK_d+UKR|Mo`JSS?ZT53tziP7hj?KU*2m)?=|8B zlottW$K=z%(<8P05-&6__bD5E{=pnvOwJ^G3{gH={L=Pa4^80TTiemQg}7}DEHuuj z&+_|bOxc*u1(w@?@rhBN`JjhP>0D+_A!T+CM-g%3TJ>-bZ282&?ZsxZ`sq?}*uB@*# zsR}S?Wi$;Wnt?_cZ|;kBO`xk=c+nMzc=W?u8G$-V5Za4pNQiVI)UhPH-%fd;L&!?j zBv}g{gbuR|Bi)nC&*ONyK-9lB|0$tiF$K*X3{!<^;hm8y`}{;T&{g$BPs#$4yK!4Ip|?l$T_<6E|kY>}_S-sI&K8dG4ictmZ0_B3N@mGlKnhzCqHpKS8U z9MUyEC#v9@L)5Iy6dT&ZF)(suV;Rzc-Onu(HU%><_(P|7T@dwYnMx^#=B6kf)!gQB zBrc>aSSl2vJS*)d4;0GgkWc;w`QqhIDo|r(M8{fe3M`bOe^weWu`z60X)giZKYQFSunZwv^uJ368>aBShAi({wF#sp zO6|416@w=Qy0#%R^w7j9wTeNHd=^_N{GSx%A+f!!eIOP29(GTX`v+w}-7f08-7gEs z-h9-fmM#hJqL|E<7er8gVIKdd3Tlu{;O+T0gX*(GH3qCOJ)lXY^{L5F28yczL9A#l z>n}T={p6Afcnt<%QX)OeVd1hHzY5BUaWfB!JwkJ4;pRN@2;_$`JSm}mBn7ML%)4uH zNT=O6)cB;_0Mf68J1i%o&u?G%c3xQ)OrE};{q&O!rY!Y;l5~2=@fPE>zs3{fXIKYbkj`QhzA#(X49?$A4Py<3Z?tQiAdJGF#`aBX{f3649^EH#$ zZD{5sY6u`B%}5qMrSCUaP50{D4? zYS)L2fpK)%^d<@7>xq?<$ow^g6wbtZ3fX8M7z0$FN{H}BMi3qoO{(n+R(kAqg3W+1h$GY6koS3p>r@#$I9RY4{pacWFybK2fAf|>dkFu0f#u_4QTWK{8s$}P0n?@b z{1qc;;c(Y4f{;`eV*e$Xa{bbUuQAgNR!tHx+4}zGh`SJAC$b*;?JI-Avef3iC%SML zE$T3Ci1>vMa_bEc&*DL*)U}atcDPX>NAup+3{E;|R5+#&6ns)m7X*lqdaXUHV)Q z<<6Ep?#@L#mVs3BXVo-HFef&ACFrUNP+*NNpCE3?;D^U8t=v+;^}fKpp~MjW%yI<< z^AUhAN0;V>rvyk!+Z8&N6F|;2a-%a*#DOR}Iw3;uyJozlN;C=Lt+#H*8KZh;XTq+e z+Rzjl*T-^jaZ$fozM5Tv{_Z}H*miCiQ>Zu(VJ~*vQFxQ8oto!_xCry4GdGa_@DEr0 ze}N@@AZSXUhteliflbzQ3vmzPGG8F5hF zHx~>36oJ0YqA$*ulws>@8^*^bl)Kw#EB3a{9Ku#OTITQmRZwVud{&A4{|&8^Uvo_K z04G+lxB3d|&mUKOA&my8^=fzw@DKXbGajpe?3Jm) zL}36bj_xo=TI63BbpPu7(-f9I{aCGU(T1N|^;M!Q7?9OZUA zzXNps4ce{oD?T#;5w2;)D~_gMwkIwuzlU<44>%-AM@&HbXE$jzpEzpFwca|xdej{@{5b(Y3j%0pC;Xrx}DE<{QRn_WfyiW9DPj_$Z7i1j;CirA~d zegy|x!?XdE6O2f8qUSN+ari$;AvNHXRAf|4Q3rS4y6xXXhOqfvH9!{4pYMop@=hV0 z>n)3!ru!&wEbL__y*`@z@;_hN3r6o#c3ME*wK()X9{=8CCrA6Xj8~Elath#*Ea_9G zsR<*0XmhijG@<_e*OLyk=a;?^vk&#u2jy_eitHq5_$y6BYw{Z9Kiu-dDMfmX%kxc| zk#CgX<5&~f?Nn0`ORI9gK|JekadA~j3C8e4AbDTeO%tsB%6V)bsljW$%MVY`9!J-M z0&n@P9Q^&nOV;t=mjWh-RQlWq`rZB+oZ6z?fkF1GL0^!L>x_sGL&sPgx)dF2yS%nsvjA!Q(1p}r;v`(M7EIbE)U!n;NY{=LiZYFUR!Vv;${Yx;13KS z9kGFhO8P9ybH4O>{oZqC(0e=fQ%ghvJQ?pj!^GzS;jr7cS=KEeeLT3A(}opT;*5DR zC$Qi@t+wrj5IPu1^6~2&)`7(ThMTCyjbTk+jab1R#9abz!?5t8hm#haD0hu z!CZWBm&-N_tHuy0eH49}W6+*|$op5!Qv>jozaIA51aZlR5B~dj7wt(&>Q`sn^+0b3 zzr0GD0>ll&=5bV{f#Q9{#3yqz=(zU$5fRD@j-8|Y9bPX1nUrjVn&EOFp5r4!N3I0z zW$QI3QCeU{kQQy!Zwm6*T@S9yBmVr~W1+e~(%@bAGzg=H5Lg*yKHIjK!?+`^G$jVg zrC$2XTf%?=ON+semxE+rOnoK$L6aejy|`|dTP+2dUVOwa<4I0P9p+pywk6C{S*v^Bq(x{A!)qICMaK)fy!sNwk-pwLiM8 z7Kq-@SEOfDJIKE#amz55ToDih`5z&gZ+6WXbJC|asbp?l<}RImW*zgr#N ziD#j_M8@AdTfB&G8*;F*l%fdXJMT8Qf9rwez3~UtF?w*Nl(pmp&0UIbg|6@;-GpOI zcvue?nk)4-Wru!|gD*0bGesoq!vqs;eN7jXck z#(!9kkO;zg8YuW8zk0P#Q}-~^&FRWD%vzBuLzbK~-3LMw7%fp`>LSyF_f)#)J1-1j z_er;V_B(Z0e;7IIKZl<8RKGW^h=-ATNwOgF%oy=Ssb9vgE5Z|P&)6hGHRxH$GjDiq z4&q-ijdpy{dGIp$lX3y_7c$qD(^~O?T)KxL3xyfXb~bfSj4(k^X8BTAvN=?4Bt1>T zlz|x;j!k@&hijB|Nb+6``NGX^`%xnP%4K_3X>KK?m%X^p5ITsOOuXFAT*KLxWEDBgmwQnE!?VwxO$bbv#39iOh_ho(qnxl20+H_WozpM3 zx*v!aH;B_MzGeW`C1jL4TNohs=$feBgaL53xHDWDW`rqSPgMqy!UQ(t3;An2@fB3`#iC!u5b-9R3opkKLM237U zkF0pp&MQkuilMKE3_0Q9fGx zxMGcy2t4>Vd+9Hl=j~!piY%Z#tMcKSSWX7ykKG^Ac#mla-0sJjYPGWPZbc*h$Ws{_ z$*(?a%t3mfv+*5C#1F;1VxLvxCHp^pBuAg9plpXTX5$chwB}a)v{PEAkbmZUFh$7ti zhV-c&_oWOA4^-jtzTEvoLK!er8xlB2??vw7>yvrpKdSzoPR`$r{68}!ToPGGPeaH$ z$-ylF7JWADOek;NB8C2nUs!!7AFc`1lGB>}x_r=iyA|bsA^&QRWtiKd68QhR z;)aEINj-(D?vneWFz19VV^$!I_NMWRIz)6}J#*~-fk+ZKS7iEmuA}|3!C`-+j3GR) zO-rbcLAp%&leWqbao8NT@HSXwg(8!^7nifOA&~Beq2iz(>?Pm4oW!mV+;?aL-A*YW z_vujY1A!Z08xTCOVa5S6g`fQun@~UAj=%VL?N~u0QT*dP+IKUg#}EE#Qvtn&Ckm50 z$cL?vppEy}0-ofUJX7M8goo8vqs7A1!4UVkNxKuu73+S(#u;S+D&9JJs7wLgZ%JQG zy#XleZQJ~Z86ff}-H$Jk@-Wr0NGasFrf@kfXqLa35k90Eta)->hA&t-wpFxDkd^1z z8pO{8f2$%RZYd(3$jde1VU%A`M%_NLNQXc`W^F&pA_(iq zm1?tQ2z==YTT$p9oX9L?dinq7rYV2mD+t+ zp@7XP(o+9T0($v6bZ!Kp{TADb!@Y9_Af&CRxW}qarM9J zc-BnMQq?=nZ(GZ7T=CZ;(O(MV4``zbW>KV|Ie6q;@M#cJ;#G&&$Hmf#G*@yjafgPP zI2C<^#G9XD#B1?wj~B$Kg-4%VXeaLo$JC2sPSK{9JkzFryb|=%-3A1e9pAxDtYo^q~UeG=nEe2S&Q9{P3?n@Uw?;~S8B&uV>$Ot&h&%o3fewS^kR88)_NB3 z+SrQ3zsU>DQ6$p&*R1E#zn9S~{L`?Clx^k=GtjOZ1M`k*7v<+{+7ID!9~Up~h0}1^ zOJy7;i%&i4&*wE=nF_g2Ltg&cK!f1!DBmW}JoGe`}dT!%v0na2|eW zZ06u<9=lr}B5%Cui>v4R;4k%ZX^zdBZjW&Pyd;IF!)EX`0qXrg(rz|k--30VBY)=! zcOo%oy{j32^(>b7PZwTp*)8NpHu>tOM`EZbxOJt8-Db#0l2+SUWcfu|`eW;wCC_Er z%|7YtN58gh{QV<$BFFt*YuR$$o-)(Pu+AQ}Z463QNM*!fU=D;|@#rs@bHjdPCrFT$ z`C)J4&8(^UGW%rQsQT~qViao6uIxXZScqkI;WatuLNoD!ljiHm;&-DL0y2i|;eS4> zV5yFCUD?F`QSuL0XV@V!?$xTPGtuH(HyRe>l2weo7g20DZ@fG+{_M}HM_vQNxS93%qtP_m2694?#GH3Ui zj&@#@IM6fOCDEgQ(2-!J?Di*REv#lf@m^*w_i5ae6z}y}W$gXz=FC#j=@40kZ>*+R zJxh&ql&TF8Y|^YDn4&*Iypn(Fo>G{FWPimh_12cJ#t|aK^25MPdX1@AGE>czs3`ja z*PEkLagg?Bg+ci22gQJDk0`!6sVPkzd&gRnjyFLt;58{hmLHS-D=#60gEEa|%Nwtk z(fDSA|6PSdHILCSaM9Bi_9wK4<(g##9A@73U0_}J};L%3{tB#+S!QpEjuAQ z?dddjt*#9{A7-#l6zzLto-{kB#u}nFFKuBFCthgsjQEq>;-4>@#1V1MVMawxoSvbi zyUcG}OsI488hy{Dr4^*sE+-Xqr+Y>6Clk1mH*8%ni#)!Fr^di!x>m&2BvTXmgx}sK zgj=uqXOwcX`R=7Z7L$Yy9#?0X=htgbPn>0)ojyD>S}>04CNm&rC{G>f6pX#mANl+> zWvSGY5&k8^LfUK2pT?<^J#oo7S#c^_BlIUXyp#%B!@cK}X@ujoW-B}Yl;kcb6zlnq z%bXJw2sy?Zq$Ogxi6@-*C^3AzNuW*0B7J@R$awkL*;eSA7a8$bg-suXDhB3-$&^K` zcr~1Hs%S~|1_g{hbnstt7%|hjBs}OV9r81fk+Z5Gdcm&iRP-~CW69|F3yeFfsdZy# zoj#%8?TVh(;iZOs|HHodyfXWh7N^Za4Yeta>+AD!x1S^$*7q45Vqiw>cKX>!mVAA7 zE4q`j@bF$QSI%ljZyt^5E51UmBB4o&2HAInvj2TTD!+~SSBHIJbEXf}PS$>l1q`=M z$@HHMTyZPm%_r;?Hk^!%Z=$dCYv+vVndqr^l}x^O2z5+ zUqwWqA=ft1Kc+JLT5aPSQZ;N7r9)4e*>05u#xEsjUQ0d9p)2feb`He1-y5rb&WdUZjCxHz1`6Yp>@o{WfDNEWVp z_43bi;~!e*tt#GMpIuFlvF0D5nJ0A5(?}f|q|Weq)!* zt|h3|FEqs-2~ErWS9XPfP$K3!(KMNAiQ=By?}w_hyT08o9F;M+WBq>>wp!o$q}P|5 z^~NL);%c)}oTk6^fo7$*@Xi4^kZ6X)t$4p0HGSl1V-PN!RvDx+`3DaJlRbf)W;B+M zzR8*UMq7I4ak9{DO|RPr_q7+PzK6ckn{s_gg*|eS_O#yAoSg6D0o%d3((*iQr_&{D zt+2ML=WnG85`J=6zIA+{R9XyG5OmUKUm%wzl4gxrmv@OVu#mfLZgT2?J9$nTAqA z^_U7z!%lmMP=aAU^?XjhOYh^&h*Z``ny*E_vo-0=RPtf4PKYsduK4jM)99@oygoX| zcr2E>c<-|NbQ9rj-9S82zY3*|fRl8LRi-lkvx*^<_9bq$T-bS|s@a3ZQ9w zh$U*iBYoN-tSKlSr+ldAB9t-X;`00DeX(%96S|IvM5cup8JcsMw_QsbU8Ev3F4wv; z?Ed>@U~ZW-fxqJH)Ur_}(m0g2R>tXia!>5tr>>^~csDhdx(`3=#zm{=ZDcG> znnm{&wC9FMgvJSMYWJ_oh$>NB#c`rAHl{gll?l#SZevjJx{ke!cU%0Kz`%ULx9*m> zXO4aEgDHaxwMv^5j>3hHhP-z3De1xvA99jW^go-Klp?T+`FTD)Ewh}`#PzPPn*7$m zFBeoDU-6Xo2v2xUxDu$%VHEJuiiS^0;g{~wgM| z1M6rb%m=0=WLq)fTh#6<{z^YxcHmbjy;`UFnj0dE1q(Pz{$PAQ?G~XRv(e9uFJ9dK!9w|U**`H=gtqhzDEOFg68@s!Mgz>Z-J#SeEs&3|JiR%P1xRM20h=IMcnhqI1GHgm4(gMK5_DG}Wy z7?=f8QVt&5Aruja7vmIVBGhr0qJ=U*bi-N#SG~kDlq!=Z(Z#5n`* zm*clD945bCA87CO-!q|Lab3LA!cg1kFTmT3$L(8D;7)OHGt+`u%=-l=g*uh+?`968 zd-7Fs$pYL@Xle%AWV#K@rT3e~jm1p}wz8OCWj<*3(z^1GmMauPUh+BSBI(G$y?WB~ zpM_i>!bDxpqfEOqYlY(s*%=?kQD!t*zMqlENz|#Ye^kxtYF)$C*g3L%4z`*^cWu-H zD}xf;X9)*4c3f#nhWy`L%{c47tus_Iq|9UBUq4kGQ4zhJxNE>KIY#%MRAeC~@Mti3 z5Ce0}OZKH3dzj0LBcH_L?|VDliK$M_**5vTlBk(84errw;R7;=g2VV5|Nl&wFg;Z8h^n5m+&}3eBvN&{$znh z>trMNEYsK{$o=af$Aa4rfumKw$2$7==kj=@6#o7Q*5ze95wRxDpf7#+b-#rN-Cy4a z0_)F??=N>>n3jIAGA=YFEV^Rauq&V6h2QwVf}c>ix8P~5R8{Js2+|$ymG&1F5keIX=_qx!(6H}p1^2@)Nzvbu|C8y9;W`g^- zgl^#ajB3tDXnph7C|cAuG(;74i@<9O_uh^wswA5?42Jpz-QX>h179ZbJCnka1DU%jj&TsK<$ky%URr;Hsx#YxaweaFE^;RmY3$_w{g znctEO{^?W9qah?QYNYL;wZr`P=fXREtm5Zhf#FC2VT)6b5AUlsthRZL-qTF?3l@}F zIgoM{1Cu8#F*|si>WM*UkVm=@_Wl4hn}Cr2pj$0}WoAN_EX}R-dd9A@rY?7^m(^K~ zNAlS`lC04@-Ssq9nDAi(n*}%~JLWkY^K)|@`u>K83 z?WeYlDy;o%*&7aqzXI+KU7p1>OXZvVZ(Jq07F&VYC$|jy#Ws$-oLxMnihF*yGnQE&FV{)AR5Bg zS@GW5#$n1~S>sw`ququ+O7G3-Gb$nkE)Qhq+z({di+a(&C%t_o=+m8MTwdWAeB0Ff z_pH0@HE%qY_I4esnlR`ue&&oij?6cUnJ9Xo6rHl)@e3r80*v4i(PK4O?Cw(zm) zuRQc4HAv37ox|cB^fkg>;?puG^UuBlS6jVoy`4B_qCd4;|M)a6r5Z+erIPA*y}JF@ zGt8;vaDi(D*ezWCP41aKJuK!{yhPyhnQds+KL~ig7P;wSU++4O-c0)Okcn+>J(^j^ zV_!PWfpPUce$HQ|vrKn`=jr^EQ{NzXq@R*%3Yu z)h6M^wtDwE(EtO}v4m}F`$wpZ24%TY@5lc{`<=Dj2#Qqhh?DtZ6U|3du6>@CRQq^P zeVp|@_&*%4qFW)iXoXCO-jsYwNE%z=Nog#qP2ts7IVGWxy6QC4QZSvinFcR7$dHQ&H%E%RqId6XYjs=QJsBWE$gQ09{sO%a^uvcZ{#tl z&TrF_E$km=Ep@l2MU^{x^dCKAQ(s7uOSD{&!*FV}6D{4>tjoHY9j)P?sWC*!liz?Dg2+jwal)8uOX zzphFzRF01nj~cJ>7aM-|f7RTF_O1d+o^ZQpt(_9U;yh;-ng%e;SUL2_MK@ zdi(gD!=udJquNXs=DWJ3W%o<;No6%ILMJ)g!~3PlGqVD_UL0_e{&x3(AhgX5hIk)7Y~wb@0O> zE1?tn(ws6~dVG>#Y(T;d1OJakM~y^!pF=gm$?NFVcjQ(N+=ENZZr{2unRe@)yCrWd z8Lk5FXz?mbM|{n@<`X*%%&E`Ce#RW<^pW}#3nltvxetlQBE~;k+&U)p`JOS}Xa^~6 zE-OTTDtOwNQtHT`nl{hq>6vtL-^h!57~vr5JQatfltaw>)oN;&(dQ*;1IaMQsaflC zHCaN|`dPH(H(wuWj+YK3K9#S(MCfKb!n}(jl_!!#Gz1SMB)NYLMP2M;WZ#LHC)v3c z^|r;O(^g)#`s`cbQQiw{@k=T-z5+sG21Z(A+ui{=EmY&;p^>8pHYB6BQp`K)8$i90 zN2a%#PI4@Txb}56H)HNs=Pa)CJCkIzb=k#!tc`fe{S(D1u2&*YXzjBvXx+{PlHN39 z9$JTqy|TJGE%ym8zv!VV1}1axZpyRrXUh9s483{ZG(0)h-`{nT!lh;spk!~l?%ZgU%z>ElM1JBy&3Pr=N)x-vDA^9IE<6W*q!IhNn)?6rt2r(7u~=myrlTf?TrRcl3Jx>2&)&Fg0lAEX=YnIQ0pf$qp_hiYju$P&}2i~t$dlR;XGzQY_o6coP zYPA|XcLPd}X->Si?+KB7kYBPU6yuxQG$@{<`>DP!H!yGBYZA6vu`vAQot_|lNnG|< zNp16oa?NZN*oEYmGd+x@si9Zuw z%EsC(RQ&g~YUSuzQv?K1GigW>}@?K zrARyF+HJTpo?2YFH&i5_l_Qpmf%)dGit~8#nw7x9-x{G>7lFYTEiKzAIhjX2boS^fc@y^Ln$+iGkOa*J8rm(0fPUn6FJRh<3kub1Wi} zCviF4DZm|vd~n630`pR#*3HlZkNW$+hw+}Wh+F1fFWs(Wo$=2p!{ge1x#kq;>|$Rg zdei1CuZb#qy-GtUMn0nY^g}MU)8vicDGq1t|Hs_h2epy*2ZG&FOYRoJX|-fo0&df4 zT5{unBgrzxwaIQvv@|U&90|KB#&&Ha5Ds{O1?Q@E>vCBnAv7&4oR-iq!uBRIXc*?| zQehZ|VJ>$;2nGw=yNj`RpAXAl{qbw_KQcMjuJZRbf9oIp z^7rC+Phjcye&^GNxBf-qA5McU4X+Mpt^q&U&AA0`Bf6kvq#Q*N+nAg*|^;duR|4386^~?88_E`U@>DRwF{^U1@ zhX3-s&-};dzw$qipE)wT?eEI|wPAMRKm3D#W&h8AGjL0v9E_c- zUHu;pj{lSOe_N6H`oA=O)i?T2y8iut+HU#X(4P;#M*i6!?p*uzf4#C}{LLeYHQe|| zKO|=U?O*=8Kk(aC`~Llzzs)+n1;+k?^RjLJKm0{+`|tjZx@+|hey!=&KI~82mR~(g z|LuRcEc3d4Kw>Rru6MuF5_h+we{LVS=U;Ih)V{d~cLSCUB zC&Dj&?_VQV{%QNE)!W%)zr4`&MKt*b;PKx+)2(j&wDRAuj(_>!S1MosuK;-9xBvax zTpD_zaEQ`fM}LNCtN%sl+3jZErn*M^`NHup+WS{Jb^nLz*Q;JczxxeQt@)qM{QOsR zf3a`+=f5%7^x2h@eUtx7;J2NBdHD;+A65SK1=+9szkht{L7Eb!qx&9NMGb6tSVV+r{}!iG2I2EHAoxT@=24JM{NB6SPa#WuuR$<+nc$ zz2gaJIY^QBAB9AV^z!yQodWjiBf2cz&Fn+6kmvH-w?7Hfw(xrU_HT=$Ff8wKii|g9 zaY?#enhN8O!e7z+9ZSGozkU5tybr{?M8SASAhvfIrMa{nN|K>B+hzBAnZ2hhv|w8Z zU))xufI`oN78DtR-k%Gv5|n)w3N6E%UF3awxj>XW?fNKl{;E*bE-aUk?On$EEgafo zE(_Q$RW^S8E(2k=5Qx%FQZy;3zcVOXmJ=_E{+^-O#J?;He_AdeKM9`8k&1MISAgx} zxaafDP?3JST$=VO{An-kvY;>(+cG2|%fjn*q0fI8Y?qnK#rf4cwV#HHoZl#nLNorP zNEL>EC~T%5ODXJa6G5R2#U-%Yv;teex8DvGliAgIH}5+5zu&RmVZZyPRKvT>3x3~) zDr){%q_^K$37B9Y#CyM=zx9E9{;7uVzfm4EF@dD=$-}R%gElN9TDFZ<& za0GalUXk2g_S*vWq)hCVSx_kBLj_!bq2lnm%-$_-xxg*^FH~Hj-~P8EyD$h|%8rCQ z1lTn!;LC-f3`M2wU21PG8NGe`&q|!-()6Z0mrB|$F$?a71XL)qQ0Y&_Bz`P3`1SH` z4&_vr1$jZR>%Bl0V7WL7_CJ0sDGQ1kh3!?AZ|~|2y%n}^xxwXW*VnFTY2FhK33RzL zZ_D)*SnuGU7tn(L(*7}2Am9F0VGx29rt*FxV7plqxI=|u4}=Ks)XLmtVJ^Jhz9}cO zn?`}R3)|&byYz?ikHU5=1uc%R_d55X+B>R{#Je!B_7Yxxr&7k2w+qOgZdvpFH;xaB ze^b;S5^Q#1dl&h*8SnT7?DZa5YJ(7R`90>I^nIk5T(P0Q|316CTkUqC(4AfH%SFB2 zdJEiLyzJo3-Ucdkaj4AQRTJp4{$584Y3{*KMdDR?LzdaUu*C%zd%Qvl!rORpD(k-~ zWcxu{e_m?OtG9plwwTg#S@Wamy_|MiP|z597p-itE%1I6QrIrjfA_RpVt-IfAU8c$w z1y&*Kt0MbP%fh#B3jDv>E|G73DvJejH^q`^fd9w7DGn zjZp8;i(%ha-tG4Gd(4v3e|!705>Ie8RF)R~ZtuAlxZ8!;LWH8E6lqtvVDq!R-2SXU zegOY?kJ`6?&3PTx6 z1#a(>g?UK$67>=YMf~)Bs3Lc$EG(5H*ca<9_}La-g}KNm%tC5HJ!KDtJO# zF!o^R?ee>g_fy$Mu-tz8^F5uS^KyfVP78-HyTJsZAQ~!$6Y?&?kU+kJk1E+N=KD_k zF*daPc6-nH2f|_suXlH*Vm%-E7SxxA-m@umDl&@+?q&Jo zuF38!DF0Y$%-+sdF#FKoo1%6xMM3bMtcbo6J{y-`6^j(&3<=hMA1r?;82XSbP;Wl4 z-)+iI+rL*-ef9QL$z;1U?T)*81zI@dEI^^+?E>;12x{9UvfPid?%p1#6ck<+m0p)SUZl47>;z<4c>PJ4 zQINiV`_D@OO05^__`5;a?Uu`u;=xYgRJ?Fv`Q8>QETK|(L9wvq-@#CsSl(s5dh=$N zS7yB`RaNk}UEIgtzAB%K7D5%c??NpX8M^@r+CP<#iOamw>E5eC7rqyicQuPZ;$15J=m$qop(>uvKY*+9uNSRYg<@Hdh#N~GuA7O$*0e%$BhKktRk^`aSqR;IT z^S!YgKxl>lugdBL{N2_oP$d`=rgymsM1k@5z)+F@o|jUHBDWm$Jt&&m4_P0`KO{cRr07=|wm(!WQN>gW zWej~#O+om+pXCCh1chzATwEycZ;pcXP)VUM7TuP}g7f8KWxLfC_(O%E3;bE-rF~a3UmS9ZGq(?T^tH|y>nCI7e20vyyX(Tr}3(AVQ-K5 zesa5t#rgI2kT5Urx-EowKgN5xZ5JfV!cc%A0T*8H>%J+{1>P!9f4R)sORG>zG0(kZceCHs+?|(qk;435DL=g}CHrUZ z%imWJ_(Si@-n`x3-6Gp>xA!D_asTUktrny|y(u^=1l+YMm=r%V3P=G8MZEpnJqHD9 z7X-V~;o|m(_Pg@`AIx&$Zc72c(gcXh^Ddol?1FBZ;KiT~8j$N4osJKLTV0InF&|UX zeQVgIn$mrw!39ec|&2hM$#7|2lXd@+BsMkUg&;&O} zoO!l)$_%WiMI7ybz6|7G*IM2rI+Rd^2FPQBH;h+rGh?;E=wqnAb3zY(HW0|tvO_x5 z!nd#Et4-kKdT>Y7z0=h2h_pUXwOp7D-kW2T`d;um`(sVCMTI=n=wVAsGG)J>0r2ly zU(Pltk&ap|t!0FNGbfPo%9^^XFK0&XNbB%G*EvUrEKq+Tq*sEryS9cW;eqBnXvN~s zm|j($aq=caZP(cPG>l`*rk|W~AtPNXc5Hm1FBPaX|9^O1*5 z))y1H5bnOFmOc~pYHs=Ec->7Y>uI`lC1kDr0#thr*0R?Lr*{Hsj)#)-*-|hY9#r zx4RB@*M(J6S|Dd9@aGoA!zI^wGx{Lqg1&Chg&|)cdIh??lhcu_c&5pD#%vHvMr<0} zI1J`f1Hku+addx*?Q13ok&_(eOc%xO6 zaQWuLH+XpnyQEa`xDEBQ#%hMULPk@fL74$lH7mA&D9u#X#C=ho3lhw*0n6b8+9Y9kEIAALfsounh#OlxhRc&p z2zfjPEHF><(Ig5~Ia}REIgklgIi;EtT~A4{J>&AP#RF`32R2SY)O8zPeX#4%5|Ef< zR@WqC^Wf9@UU97sgiqP#y=@`SHOts(#zFqj(`M)caM1&)S~hQvFRU7$e+{h z>hu5>r{N|@RokZcM*o~1m8m;8Blwh!Y|_!2m@G_nZ{YE^w0tLrqqU=VX?c>Ck@o&k zv$Zqpnal-LaN9U7{98W2hxDjZBsz9P{54&@QMXDYI@Y}BB2nG3tKt=TElCb1gSr_s zsZLxIk*LAElaAFoWk7Po2Z^4i`|cRQ^Xom%rIFhKc!MGMg*c6mv;$*aPUjSL09M)c z#WC6Xp)7kHj|Y{(rIUU&i**xcgE6NVRWVzoaC2) zi^S!P_LEIkaJol!4A0{_&CRju?|gB{C#HX4UD%AJb@7bt;?(lBq_2YR2gST{rKgq# z&gPSqo-{kp6Owa~0bLlp zFd-oVB#%j;eFJf+`6+M;Tyvch86Jd8r?Y*v^oVwek^`gXQ{KGelppWw(8S=dE=G+` zE=d6Jln?i`r+u|w%ZX-%&Ncu}=}3FWb#>fl@NF58M=20pW8{S6EX(PL$oWMbe(H>vt6+wN|`L65gk+|yO4OI{mD~J=e_zW}d2&ZS+7V@%nv0-}Fg&y_ZR1YF^tzpMy z+UP$=bl8lj@*oe_4rbJsbRp&%;bOBr$anGT&$~9b*kc}w3nSRr5Eigl{JJBclhu* zW1y|6Ee&vqCLf=5-KB#GxUD5*OrRqeOCln!GJ3Ad35g#yZ?~IKRYX=5#l32+!A7V8$Gf*h+n?F6QfC!th@;! z)AMw8$!k@0*XT_z8s)l_6=J$jdqaqkKTY&8@W_fqH>EyR#r8MDUE;>@mMC)0fS%@C z?-@KFe_s3=TUr-cTAwl6rZR&s=P2!5Wj+ro8gVpey&FPn0+r_*9ms+13$)ukfopTV z7i+G&Z~{_>?=MO^nxeQWyh(H*QHjDHW5~g?fLV<6pIgwU9X-!*1Oe)a5Lsio+(v~) zSv{c|b8GrjkRy;{pc6(Y1NtZI*Z9GE3r==!3|V1qw!}-@*h#Z#3hvPzrD6d_ZfdCF zdSG%?d7`iSSfHXdT$PhN(D*z}eHzeOqxUGxHZa#9#xLto+NvIW8Hu_r{a4KHlT>}0 z=K~rHSn)hGqPYp+tffW%NuNI%zi0NV5Ul#RIW@)aH1#Pz@11Il-e~F#p{&Lf-I*{k z>F9mUZqO68LV^o zxmkCWqa{c}S8_qnbXB$n-XMCW)cs&YPpohoje}PxWEI1A(teopa+U$V!$syf;JCiR zLT}+{GSsaAb)5-+4V)02XnmOOOG^Duvt3mb0U@o3O2Q|5TqzEWA{Dy8l!)B4>|Y5% zXDswNoJ~S{FINA=d}(W8%$ej~suOXw1B_dhQYmS@n4pN;^dR5pal;Pb{e&dz;rU9& z*l|u32(pp@uN!ZQ?1a0>;rM;a7z%jLgxoUP37`pu#)#YsgGj&1=p;@=r!h2v1+V1m zqscnI!90Z?#zy>v7TsVe6< z64TV-7i9hIHLzA<;)I_$f?OQR;;PTm1m{5{kUFt?eyk;M# zN(EENk$b6LIqTe*hyq9PBw-K2l5;43P8v=)xE->kR@@)X%Gbys6oJm6^|x8_`kcFh zP52#tO-7f?4``hsj0#j~`@JX|;ut&|4`$dfFqR`D^pwPlLTyrlGqg=F#J5-=N7#UG z>k*4#mC|9~_f*%mK1&SREZuk1jw?+^P6J4abi`-$41T0@-q}9e;9Fp zMcAVheUt4%nmeXoM1BYrD-16TBKRBN#UguJ>LUT0NOc$k>(3iI$nPQeK&1j63#`$@ z6M!|PNAzLVMq+WwI#K6m_jfFI-=5{i17N1n_fpfpsXoFQkLVZ$B4yf*Js!T2JYY?y zpp_+VSR{EFmLS?owKIL-I118Z*l{8wXj=B4)G&9^{?pRFhf*q&fmR@AVxC#i7*`4O zq+!1bX0JP>a6EhuSG6oY|Jth@?y1t{Q_@jBUiGK`Ea26s4jRbWu_g-&A&y0O+X zmX7wRE`OS?RfuwHc24*mMc%rTqP+{fVp=L+(48}P!v?eXi>O@Nv9<2$OgQ~iD?6)G zkdYc9fq%`T3E*x-(F|Ws5U#4vqi!?avhG@;VqQjaQteS19l*Z6YJ{j+Z8%RsSv4e{ zHa%C%6(}_h^q!&PRx%{YAfWI&GKQ|`MD%`ur&E3R&E|&_ebom?<8VZ4(j&*?=hI$j z1@-4f=o|xLT)T)M+-@)bN*Oehm*4{*EmMUqqbpz;oLh@M~ zDEh&9ZVE{l_dl`l@hL_1=W#D&B#-H%woBsUQY1%tq>x+G7A8dTd1H){0@L`^QqLA3 zabdnK*ja7ytTx(F?9^yeYYpYNIa7Zj8(ZT5cDBBKrn^cbu`SizQFpzZ?IM!wc{CQZ z#XnvbntxGR7cAASaa>I|4O{~}*A11TW8`fBJI#Blnvkax#(U|pN!t2|HEl8|mo|bC zv{k24%sed@nr3sp#+Pa1n`SNIy@Vk!q@*R8R2 zyQof1B>i`#W6EUUeiMh)j)bYoQFWKoFj%3~yJ!qvr)n}Z8Ug{zlb@}>8z$vSZn$y8 z2@F1^q|Y)93A|MX4OHFoZD>fI>R8qERMFrQD%|c!s3fCFvrKd-_^b&Eh`i`Nz3$N1 zBp(z9y)v<*J=+C_U|iYzi1Q$mdQ>CNX53Y4c4gWv`XrQzv_8W}M+0>=5qZ?nw-QlQ zi@Qz-8rFb%?Og8#6)hsA#3Xwi)mvxA#0OfEGc<63Zo`n#8CPdcKgF~`%}5@Osqo9h zF;nfAv|q)n*(y&u5{hF%Yc4F}qpKMjoR)aZ9#(3#kt0vmJn(!pK0#_z!l&;Tn38)O z1GFJ_XRh1TSf9nnmz*yaLR_c}{*t*f-=IQztG|k(x=0*LY}$NYT6cDdN-Pa*Hig8j zD~L;Fwt5U~^QIbvgLZjB-)R^;&-Th{vAgS5HzNwDJ380>)dvkE1AyaXZpw2X)#Vzy z#GG4}?$aDI>9k#^MJCYREe{6*w4+6;=vZ&yH8D3aQuVo_YJ!7RZke%1r?jQkeRAcP z@SE}Q!3M29XmiALXe@*?p6tMN((!!B!{)lgh5@kIjAL>)WP(tWs;=X_3S=w|cSIL; zX}j(Rc$#X%$v$SPfmK1nxz^Jt5?lxJmROhqt9}>=Ggpc42R7JN9SXb6hLgCx0_Z?= zx_r9z3g(-h>+)*)+_Yzt(BrFpFBV!=z~#h}do9!Y*xc%+xa>Oek{TQb5GC%podd8n zYX^l@--4WU<&Cv2B`xKJiw3I0;fN&dFr1X4AFqqQ{{7Or;FmxGPRgN zC`sy$Vbm+KwNS=;O&ztiFnCM>{t&*`Sm%}cuft;gSI*)(#OkLwa}LeoHe>d^x1IP7c>P%>SwC_>$EjNM=BCF9(K zId8l4@D=m^4K_-AHTWpeN187JjllF2Cz`L{paDNMAio7Erg}-ZrFJTs!9ow`dx`H6 zrJ`3j3=#8^Di%rup+KYS^ja%8*Aq`ls)O>4l%yJr25A>GY=SthbIG$wg)gXD-C3q) zM31jIHQz+#cx5#sODq}h7(hrxp=)~WN~J>565|wdkr@-mWM2!vpxXgUFF#B>ZOOP+ zn@FPd!V1!S%SENK;S^Z|=)#Vc=ZzO1r4h(Iu+P5 z&@eE_Oi4y3#^ehz#jW^OwlyoIc@1)YCh%;*qg+5?TK{~}T@~e#+TM0e{mryjHiyXd zLLvnIT^RjV=Mt{nq(<5@0~eaYcZF+NDvaZ-^qO8V5p4?@x7O>iZyLBow0eX0gmg|@ zl+cX&XS?$YPVpC9je*gv>uk7QrO*Qet6CYOrFAIi(|+w29rE1c>^oDe_okF)Fx@&V`=u@Vdx~v=tuM(^+FR#YyZc~>%($M`T_&(OKrRoBs zBjSB}MU%7HfL1GUm$Cl^SNRCDJu@;VA=|l3fT#n8r5(^5cP2ywa{~$rw>k`(b>9v< z$j|wz7F%zmB{Grz{-RxRRA2L*H_+IF+FcMJ$B!S;+BxyjkWM8fJ~6jYY|Tpj-8`3u zM^3_AGNFGS3WhlVv+HY{E>IOVih9^)ZKu zC&w^Tyq4lVUKg_2@^RF<{Z3A<+VE$2MmR8lkA*67_)8e6CQbpEXN?}k4gr`#7Xy%U z>Jj%EEtZ^e+a$xb`Zl8-Xby?ZyvU))#&z%)RzTbHQq_Hd*FOg?qK8DyO^3-Z;OD%t zdM$t+jKPP-vJt%&p*t1_(s; z0Te<-JNfwJdiQ2dxWww@))kN~`n(A`V`RwV4RV6j9f(wcY)(BWUh27`38o{iMANAU z#E}Q8N>p>PdfyQ_60V+xPp`)_gzY&d!#}sG)&dV2>s@r9st(Tt{Js=-WyWWv+Wa$| z_H*lS&K^p50>W2WQ%7Wn>NPsL>e~?yM_ro&tc+-d9!P}r;x8qjqF;Gvq*`mg0I}z& zi;zN=buep9$b+VC(J@*oSny6Wa6J{WstXSy;?G;dc$XpwJq`>&KyNz zMlZHe2`^j^*&}IHXoE&n;>(ZbgZBt)&fr~`@S1@T;cUnHL+QSD&LfjJl563I3)B@12(dk}aDZn< zU`x+Ro~*LUVm9`ky7D<{f{Z>9VLZDS79Tn#KG+MZdgWgRYWCH$Q>1*MkDoF<$9xsI z2|1>F6gF|0u9XD6(nY&;;K&4ny34p6Q?-r@I7frx!{_D+)6#I71pECiTu!;;i98xe+&;3lYxNL zNf=DSICobheMFH8r=Ld$*me0zg3+BYV%Ez$Q!!cEf1cn%2|#g^=hnmbRA!`^_o|%F zq(<*VAFANx;HZwOoEEumNP)?vK3P0)VXk4A^LIwN0!^(lD{^fO8Mo1LlPL>P$UbC? z2f!~)t}JU~`dj9F4`Je=s;ec?Fpc(cv)!iytvA&1ns1 z@oJE+yQr}SbESb;HpwWabZ9L@>U)x`UXkiWv~_@@4k6KIF2oXhB~WC)B%qI8;UE^u`o*OW_q5^*gF%jRnXp3*n7v<#Q99ykO)U~sLp7iDB$&$akgv9`p)<@uQu0C=Vr+!$D>t&#K-Nic zrtJx1ZnpJZvEZF^L64aOIltEKevu5&C>ozP-L!yDXN>32wh$rB=e=V6sSLnRrCU1) zYc^3IV1h3~@ioI(%~$%GZ|F|4-cOFU+x+;^mMCqz=jcOOU50?U7Bw7F3;zOJmR1TdUXN04=|^FnF`cE42NLSud(3Z=*eM zlk4oPKF>iH)cYrwz>n9(&;G3Zd6Bj1zF-wiqr_(>g#^CGM*~UPgF1s#TfVyNi zagl>eab2S}QSB{{=F8UUHQ^Z2Gu;@=m}AdpDo3RVWDK1SMVs>j&(&Ov$8Y4gHEG`k z;Z*AzN!4)BOTef)kWur`LSAf@^g;t27Fj3beX=%yoA@1 z;2NW?eb$5}sVeYDW`b97F4aU&71+ADWS>$4nthj>AxEvraQ6vi&` zj1$|}`nZu)Il50KU8A%0iW5C_M&~kmoLQf?`LKAcRg8Uk}o_-~{tK?EL^w%{9lwINbn z+x0}$oiY)R{FOxi+I00WLtK(@_$Cq*4^NKc3fVKXbbrI%LIK zF%e)J<($E*%KEqR{vZ*=mI7_+D5e8Cjk+^N#bh!TH;1cEw19OyWbeH`A0M5suQGZEc}OO6Fd2A1o9{i{$fh8=Gi}eU>2BDFjkyM=T2?)8ZH6ul zYc3I=K|zvx6lu7d@@|I4_=KxjI&dvnuNvu*9q6t3r1b_ZuU&`}6ZDH&Z)nPtpu1OQ z!P_aGGkYdORwy1lIpMt7XwpTZ*BXQ4c+Z`6r`wQl6Brf=@ z;>$%gzvLUA<0^pe=XtwILCcOJoS{o;Kf;82bl>-AgPsoDGnJB`nX9V`4}QEZe(67# z)&;JtgTKXVW-6nQq-uJQbjTiyAY#Pd$%R#*^Cs>*2gh`vIoRa4Nkexi=~S9m?K3Jx zgYsFflYznJ)|#V%Q4RYH*T)iWop64Kqmw9#pn72yoJ0M*aPLgGf~wMo8Ng$J9;oCm zvc{Om$}uL}dJnEVm4+_GaPMuNtJv48)Afi$^&1H^qq$V24c8d;PO3}1@9I=m;hpaR zm~M?(ID-g3jsU7imr6P)R)uSMAlF!_u?246N3=oXPAc$Ftyp#JU(3rcK$Wn>gB^|C zXzH(-fpZ#OOS|OE5q~NeO9rEX$}98U%~|kzih9D+!aXc)WQ=3FIM{fWW6oI`YFJ~C zu_2Ba3lHQ1WGvv-n!DDhk>`9+CSo3%M@DDs#B1_ZBaxm`qz%%LWB(c9Hxe4_K|0a0 zGaI;}Iy^19 zjNkIfRD|qiP;2lx@jwcQcd$MJ_G%mL?vOpj9I5ye#y+v>#<>?pZiVL)HU_m|XdTqN zKnKHpt5Q)Akcr1hu@Dt@x+6ffsH>9~z5!u0JLP(bb+s9KffFGWC{L3SoL0aR(qqt{ z#Tu$riq%GVZ3%fg6*7ATljr)q`J=djOZi3sPt;;I?`ku=+*9P zMNh=xPY3TdcAQ^pAnbnSxV&AH&@|ctkgUz(%r~~FzC-YhfFfMyY#c;B5j|2hXsp}= zCUhnsxE*+i_pCM&8XADidU__17Ow3;J@?d??-_$Uk2~o)kD&oVoSPbx%vkvn)_2m* za5nzj;Gc#^u1jsmdJjS~TBCg&X#03w+}~H?pz&yPMmKD9)h0MXtw1duh{=W>>{7xV zlfs+x?8q~yW!S-ca3{ImE7E(k6jFQKcRLq27YY)9G(*Z`#+dR}-{_R}@j~6|ESSu? za^cD<;jUKBPt1oktA0!=jnjwks1@ytfJR+e5y#!fkxM8SS?)K?`SiO(KgR&1b#WkZRAbomZ&>R-Det)+_MmE$@+&lbcGIWNk^x7 z&l<3QoEuOc<0~fO*VQfsO&@Onr5O zg?DU_59_M9#pNyGvk{;siPYG}uoZs_a62d5=g0;zVK~>+rj;nxxV}-=puOd;2}^2b zTWb$8X%Th?LdC~|DzzQ>OuxG3lYQECK4X8-WIBgo*aFufTvW-SHD*vrwz!N}vvfl< z-mTGfX~D~PX2u>;QWZeEAs?=gX-y-Dh}%K~@XX+C#!+>Ysy)U%i$w1mB`-u*IjQZ* zlCBMJ!B+q}Vgx1ryA}!XRoJ;kX)KEK8aXEJwTc>)iq@&dp!O>!nT|a%5W*FtnsKCJ zPFFEv=R{`Vw+}R*hpTRdCue(AP7h#rUI%>5w43~%&QU=d4%cW1E>MTuH0GOlWYL3u zkGHYmO@;!4RB}d-pXiXUBF_zsW}NB(?6rnE`2^jLcAQl!ZZNi;TqPH9)~Km`sKH4% zWM5X+9FPm&g71QLDy2_}^?RT?I2m4}oE4-$lNm&vfzV8=it2!lc42Hiptljm!>I1^ zT8fiJA;en$h%)3T^UZbSOcDg_!mU6(_{nG$-CG-Qo?aN6#=vo0_JFZnCk!Olm6?}6 zViQ`tfW2xirlo!)TPt(Lyvhu-9C91Z9pTuK4n4XY- zye@wB%O#HRxDf>GPtg71TVOL64)Lwog#X^Wb37g0XcTg*XLG$Si*Q9HAZl#g5Md8^ zu@XiE#Mm2bi!*vJbH$sD(1{Y!V+!h|&FeSX%`m|+m#UdAu z533pnHBES4gHIcbR<(6J#o!c>oJIH?nPvAY1CR`2SRvCX_Y&)re z`Bb3B32o-%iXe{eGq%i*Y=z@z345(pCLamD#CYAIFi%o)jpD*WU#&&~1_#ap7oX)S zRfp=YQ1)w#^hqcpNVU{h%eu0Rk zj7Hep;&pViG+vFXdaRAi-K;m1k5xH(p0W*y$Oz&_an#$%b%|ynV$nLyh6BPG@rK=> zi$igH#uCej2F5dZMl%LDM!XL1T~zvP(cdx?J`0@M%)6tQ30&-f2_MdfH`ZOgFmPJU zL##qm=VjKyQxpDlPIuPQI=t=+s~t)TeUhOG3`A)CDs{N#yKtW9Q%cc}CP0&D4Y5oo zI?A(`h35>ka1_=Lyi6e}sQ0|B>wZXrE%x0M=^um}&`%uCaTJL+yx_+woH1Q+M2m*9 z6LpC5>K3-Y`U|Gw8{~A8QEAZ0=DI2xdsia^AFqq=j+Z#kBJhBSG8>ACFI&%@qr17`tl2_N$Ibk~R=cxbG0y8BI6ABmluTHmVgPr-7(k z+%FFrQI$8~phB45JLi>uDF+y)8S`pB>*c51ot9HP?cYi{6$xjBazvr)yS^S+m7+@0 zhJViURF`Tam=6J`q4)}(fTBPfZmL4$m^5-_LASzGj%K^=iA35%l~;hP8MNCwh6l)qt4pp#3Z_WKKn4%OkX1o?bqLxqzN{D``W z9&*XG?kc4pop)``^;RF>KW>rI=AM(pr6?7VjXRxE;X9-CWUV=yg&EHG5*w&i^iRQ+ zw=>gB8UvlcRt^E?n;y)6QRQ1EQN>zd)}lo6ww6gxQCGTZxtz^=>yBve_mKb~ zS9XNw@rPU=DSUMd=-gytnS5N+42d=nqyXAXm#GXMqj>=?B&s`$~oOjQTLTb8ksfTkHpg= zKR5}o7PCt#p0bW&+)3&9oxY@YEpHj1PLJ zq8niZ3;Rdm?u_WL)22sM)-WEtCh}D&De(`zA+k**K~N3y@w)h*e!IlceBZhQkR5CC zB-fP`83?WWd1D(k;f+c;(qN05rKC+tK#7g1U`wU}B|7qrUXgLsYH3j(AIzi!8@2!` zmJ=EelcO$Zgj?JG4r4#ZHcT2t4{&cP!N9WsQg?YZ5xkOgJ1sQn0Jl&EWAJfRd?%0J zF?-t56lxksYWh+R9l)@7w(^0nORC%tE#U_?K14-$BqI>@P- zqSZ~dX$RFoW7qN=wr}iCI<{pTja$OQfN6ygoz{#d9S&xS)n>bDb#BF{I(~+|Kc(2Q zC03dS86GG+@0~}_pa8**Jj>~Bs1m8PqUQMEog@ySQKi^)$2=fAz@B!5#6Jwk*9PzB zQ81&&5+)LlPjYqFllGIaN2xot5ilhjo+|3%S?8--8oO=esntjT8|IyC zmj?1|8Dmx{F`RNK_BqVo5{*2&7EF>eSs z=O|p>2!;A;?C=FOy@j=I&C4II-p zdL*2YLqI);_9)28WLAHT#ZEh{vZk(3Hol{QH}gFN?{QI=J5qA*VnAoIjyItI7Z!)? zJ5&Ss8MmgQts>V27;3>Ti6HsOKo^{J4bz7eZ0jU?8Nn`gpo34b%8D7zZzOLx6sSg$ zk07#JR*qyZ%#$o`NMZ7{(JZpU6=_hRcZGp?Sk!hFXGDl=I^+Tw|4E1z9T!3K0XJZ+^Wa}b@V(HIxp?gIXO?n1&K^5rH7e!-%xPBqJ-f{8+@uW-`bLG z*byF6vUb-rdDkYWvuQ~OdDyQRTf@3!Cxl1fg2M~&({x}h#mJ*wVky`$14D@D8Z)@z zaOotMs~5UCCj64@$2XWf--X>W25hEgw!=w{LZ7yFHlD(3dmqqVR2SXJbOq9txqSR4 zZBsQ9*gCyoLn>ySzCe9DK;{z&F44jE4#js-mKsEf7TE?6=DI5Eu9`4#r?I7Kp$kNW zCtIK!syf+M$Rr=AX2)I#k6R?_;{2d{p*5SaucD-r>`^2GEe;QKz7N1 zgv%X=(qJRyXRBvmaHwNBKC05;@^r`+Z;0JGm~h>6>xMYvCE2)L0|)DS68am^vY?}MG`Rp65q7P%&c7P zyg>z?gcWe2zSbZ?t@xTvLL6fii!seaY#3-s!oBy`4M9C+DCkn@AsM5TPf9!w+m^I?_Qi}MsQt>0k* zAKF{-oppT9cP9XjQlgeHdoOKea$HQ*%>nuqDPOVJ^GJ=W*}A;=k#Gm)@TC(-ZRt%S_Ms>@_-=oz@g&-IKD8bVlVq_ zmtNQaYowv(SjX0U@Hzn9CS}bWNr*b+RH&Bd=TK|KOxKepm!{4q|30=w`$i2{5#-b+ zWgQ3WK%4BF#41k9F=l0sq{?Fd2LR& zW$99E^w!$wr^4fKjlI=h!>|+F5dIlt-{o4`FTT~AnUb_==sONje(-QURKJyE(vAI! zaQ#D~!*3x~lT4Dns`#Yq%0%VaNcj1p6CCb=*$zzM#j%bmyRgvMJL~fMb5VD8geG|w zrWIU$#i2F^@Q>q8U8;w4j-5%P@U2SmzR`y^{mrGg78`qzw^q?Xv}MQTo5^Jlyr@jX~d>g;fW~<&?qDs z_DHA2Q#09&K7+vB}h8zgaKYSjlx)Yj+Zgv^GjWBmF&(O)M-35&Jc3R z$kbF6v7lRP07f~gMFSViB%cO$91T{rSw?nfR>^T(+Nr{yz!&cV40MatX+5V^{nZQp zO$Mx30>z4G!r>!R)MO%-Uk8b$!E+0`+FDT9e|&SoQ$1Ie37TA`VZ0ALG3eF=M4xn% zmhMT~C^l1|zK{HbMpAYT>b^~SfluM)fIf=#*HFelvi`i3zqW{g4^%9?tROpcNHW%cSv~a*`ib4+J*Km~92(_ZwZNrxlZ{VxZ6$PR$iN$JVG-3@kBE*^|OOR_X zjW8l5D3KI{@HA}=a%%#AQ_RziYnWJ`8m4$Y?3Rg{KKS%D2-OuV3_&nanW(5qtl_E%Nj|#O zVLE#vyvfLSQlwN2ne3xH59>|FJ|X8;aRp^m<#G~%Ku`B3sp;=eENdWZ6U>WEBE9hm z+s{@DQ<+W2NWJeJnc^IokQG_kMxIkuv&)B(S)-g^=e(&rD`!NP94(222pv)V3G+FzivKSYsR~On|Yl^kTWz&iV zICA7dA?23O5QU~*pQv3c9MyrT zppal#NZ5^KiF;_gE*`eVLMYGJU7VG}Rg0*Nn#8eW>bbfUW=^ezGK=6{4>wusxm9@z z7n7ALF)y0)iVDoN0au*?!?aLkwYZx#$^IQ`N|)%vG-4Z3j%1pAyG}4kRtZVX8!J_j zX)^CC_Q}Q~Pp9?uV1^1P#$!~k%1kS=iLx#?E-ekG*ljwDV;E)e)$8MeY*iIOS^p>y zAnE{@pyn8=ZXZ3`EEC$3nAuR6l8GUNfJ7%jhVsRM)ZBG$NDoxO>5?$y@fXwql<|Pt`nA5nX74A=dk`i^HEF3{`bBh92HV+BSc*)3LI6v z_B;im?-L}RQ(2>23neNx6}!5yBc0!xCv7IkTrLQ=CtywTJFGcUlVnU2a+cYU*u}0Q zka5I>GFFjJyBtP_#VpOjYhZJ2bCl3$J-Ahk}$*c9|qm}2Vs@Sa?C9U`^d zLRJk()=^YD!(I$iotxgT8LhX6p@)l9Z0E~5Q7N{D`2EP?6gl1WTxzLuZc}D)X0(!N zZcddkj>gh6!VnEtcT_2eb*{?Y#Zeg$f2a81+sSQ$9h;?tl3el7paR}R%=xO*230gUS^7jl}_!7 zkXpx07G)y)m5RslUdd4v!Syv4z9T{tq^}16IusF zjWXT@MJ{%gv?zi^izaIGZ(2v`P zA4E*j;$Dz3)m%z-0mjg}Ff7v)C@e+I)xFy0#lg+}Hho+ftG6dC*H#fLqlV)WdaPrJ4Hz$L-py7RDWKy@Becm@Pi!M5 zk-c(i;Q&)eW@H+6sNiL=nKTnMOrfq_UU(^?tVW@g=|wu8UM_EOke*>!SfK5Z@_*xn z*N^}G4%n~mx6U?_%f1b11pC}U6P!9Zwx%n+l9^jg%dM`9t}Ifkrljr85Oi=bm>R}z z$55j^!g7x3(c(msY5aX;(Y}O3Chc`tit5_T-sCirN2-iRffyH2fy)ff;A3p%DWwY9 zrE*kzmXgux{k~xr77pG55 zlsOhrLzW-qawZ57*jhCmSssfC!yOE!rlkipTDBgaTSL=cl&kHCG|%G*goG!g)%sR6 zLyTH=Ge3kZQnIGC7NvyKt-&O{2FoJZXDG7esrHuojfNpT)G%i5SY|YdX{FtUr(RMc zaLBrH*c=Q!q&be#Vf>iHQ9Gfw+k_TMPd93itH7zL)2uO+^h|1ok*2SLAw!K3Q;ngh zV@!7w6^FQ3Y_UpcD~m@+QMeR0MpQQ1he@raS7Nf%3c0fT`3IQEVPsq%K7R~vh8z~a z8Ot2R#Yt%@3Kz0)4XozDcEyOtxWN#v+ zAGr^Y1#V1mT9g!G!YJ!yx)f3x3KSg-v0BkGS}{V+tQ&q-W8+ zcz{(bQqXpc4b_(azxRbF0sH?BNRc^a$U`tXTEhsoWJMi8rTqFJZPuWsLNbQjVVfzN zinM=~4QXtnYBhcl`F?$bUM5YZ-EhcJ?sgAyfLEDMW~+5Yl-tG>H>&Wh6SNzAYB;GA zb-<-?br!K!+0$>?nvWG>dhsbT=VJ}A*#)WQtWt)46Wd5G3}+OltGyo65!*pa>9wXR z?k>dIrihCTNu>nhp12X~LID$>+lbT05l8H04BOI_cB>t2XCd)ch*HBR06PjHU9cr81(}qX3GQFA$`lzAO)T~zRY-Msj zaB-D5D-uK4p2`}K_tjG{6LHcyqkaw=;#UZpZQr6VKiiDLq#gfL=~&A^efxCweTQP?&sLn}}&HLPx95UP+#;_hn2OMkf*J($EPtZsTtAtGt%{LreH7PGOa~M z$l<$8{u7+Fti4O0Bl1En#`c^X9GNB_TML{(Bf#UQcBqHN1^|E||dQyb)c}2Kvp*@Rq zLQX-8?ZLt*X|j#1nC)fB$_z55y8s-sNKD=^QDuTGkF8T6DOd!z;Zg~CZQ90C`?L{T zV{c{#bH@^Jf()5 z?1-1G750%8+enFO$B}6b2F|2VpTiEO#ZFd+4KVY#@`a%kg5jPh*=BsWea3xj^Z$Ea zD8v8W7f_4$=7f?jTOkKM^ooTP<9q^3rPU-wSt~}}KAB}p2*zP4C5b$0!XOE5HAIXh zCzDC|;>rRUCRxc?rbZJtW~)YGhLKNjvl{V6mtwu@eejhGBS$uqX53$?EXHGpiuuR@ z#yHJ#RTGY4o1t5jSe;hTW1T|L;EXqOvo+(HSfWm~in2}GQC5Bkbv5ZC?gh(2O#zGu z$jn%*Zf%xYw=s4fPPfrYsnCZ>AZllrV_Aj;r0j59iYz`F&o&p~ygZ1)fg)O8SGt-< zXi$BE3@N+AS`q9C-c58FD`9&>!s9B_%8Ud>QtB9&ql_Vjq|sPZA*s@^pfWA3jvs_G zF`7rzGYmUG&CPDeRoaI?D!(chW6teJ15Ead)`(0Z>@J|cAjov2M#~ZesWs-hshHOP zVI@fhWiVVX436%J!D+KFI1B@Wd+mn7^*dv5%?=n`r7Z@RX@$WhSYmL}#TXpWFgThq z21lS^a6cAcaASHHT#q&eSFeG=l@T$xxvUmUao z$B$L-H}?wx_uM{?n#6^!viDsp)(hc*|D5MOJPT+x=8MM4#2~uK$a@gP1lK3W?N%o9 z;o35l^*s4NDEH&cT3#i=RS$P7e-;B~x17o(&$&Va;po7ly5H_~dp-_+{}l)co((DI zvIWrYqa#Ub=Ky}w^GC+F`M~OkstuzFV6ZpdMev&m)8vL*R^e$MlCOx14i zME-BX16VoxTvp1nHd# znrt9F>Xc9L-nHzgBN9lFje>gcT!6PpYRejBNIh9vG!E+;V}l#kHwzU&KASH z&m*^@O#Q)@8Ph1C_<;1Mi&|psfcp!2@NXs=`MupT&wCAcaOaMT`g9!|Oy3=I99Q&& zP=l$2>CbHVa)?#_WeF2n=~u6}?UjPf@l?M?YXL~ScdBwg0y!)FNh^+WAo_fu#iCMw zfSb9_e(hW+@hp+Zw@cvR18l>(=k9>m^G5@H>81y|E$?a7lGhkve`by{kr{>nHdjb#4Fnhwk2bGxfj`DqSA51A!?a6~ zVxp%LET3Vy`EM2il~C;KIN}38b}2TbM0vrg9H;t2L?4iOU~u{8y8zJXnbs0w{h>I{ z#Q%Ak2&Pq3JL}4MpyoDr;>$@foaOKguWS0lT@9VGvq}MAu9B;KD^v`ri|^c{I2k~s z_DwSw@`uw6NpViPA{c%b-jm+=%l-Sf>EDy;}~eS~S~&iGEZ}?K@kzxAo=n>$w70zI^Fe>X-;xPDP*P zBnCj5&vE(b5i*!A!1bv2dV%Y?zMRl|?r`Y}e@~f#9W1Ko^_@Lo1{LcgZPKfjg4Vt* z{foX0xzBtbjkxno1T0;D)5}pyLHXK{MQp7(X;$*ID(_PZ=-aG4LGg$s|Kr6;o`5U#o)OW`UD&dVuj{X{;$XeK$|XNv^hoGsm2 z=;scn#CL2ueZ)}SVl4PClLndIXS26aG=MYQ@KZU}2ZW{!%&>bPa1(pG6aI*yA;@oa zzaA0Z?}(^PK0=2+TlTik|A~R<=BKSv=K)_gl^a!ynUEn>WBt(9hr1iiM2=<>*iN+T zxx*Dh*~ETF`J^xIf&;(St$Q8--PevdWk4VV{oEp~KI9C=Ns;^Rw(?;~%FJ3rO)oH? zPpoK9XTV|J)@A)FUNESna&7dM|jb14sTm>7yi9y2+rzGnZ#az zGuw|5W-tO6Udreb4md(mQBt9LsUg_)IFC)f131v>?#+ECgnY^Jf*emjfShg1)VUtu zl(O!J;|dWxb?!7izn%dilGJOn4)Xq5)})R(ups}ZOV%Tb2yVaiXk`b9!F;LLi{K#( zc;2Re{QFlsm|Sb~swdh8Y;RoKJNlLmZ)Xyy1;%2iz4f+sjXHqn@O>HnZvi;GZ}1r} z@c=XP`&0Oa0Eph)_jLOsF~lUh#>UV*!2Hgp3~KKi_n{@azKj)t(DS;$`Fo28{JZa# zB6md!ZFe)O_FWc1^N;f+y-N%@Tj;d-3^@>fW?k=ia)b#}4o{mG2B?DLENxy--e>~vim8LiCA)df8^j{#5 z<3scz3A=Gu0F)haGdVcm0Y1$M0}?Y_rRTP#Zp*Ol&TMWVzuUz!ika+f;)N{->0D^az zVbj!2L05tu+_#Db$|I$ow&%TJLsPGP%Xu59{rKqUVGAi7uN*9GQ?!6xT{WQ|fg12A z_;juMCq7^foLeS#T?!&w<_Az zp3}N+|4RTy>o!WBozsBlE2pC#&nLr;v-H-cdM0e~z9IN?P!3X-j@acT3gP(n4Yu<< zq|jCWOYSPi0$k;~W1ADd5A z28cmoX>!n7eJM<>@>m(xPKDIl{xWs87Elf&-(o1LKq7vVb@cTDU7uF3$T!IK^Lh#I zt+y|@oeq$ahdm)>L1oUKL$0v7>&yyv)niRnqtAi7& z=Y3&l*uCsud>|~6j5R5TN};;M=zM>s5PHtu{Wd!+1;HGrKy8Z%-i_Ort}8W$F(V`E z_Dw@txFn*+T!uFy7 z78FiQD~4Oc{=`ta+Od8E$))uVsh4@$S2+C)h~MZ9H$UcMik&^Rm)83@;Pz>9Lcirtwaf4@VqZ#{$L_pthSn-`i0&a^HB&LUuys{>0 zk7c6}`qrPNoRkE>`OMAq-v;jRXqOeV3m6bZ@BFcY2p~Lq_Tc62#gK)o{F8iA3X3u} zc415ekg#3P@Wn|0!!?Tk_{j@-|GD`MpBXs}H&Vq1>ADRi8>BUCnB3XQBanx`iGL9y3v_0^4z zU=!!Y#mEYvYb8Cu_KY16+Pf*nLO!HA&3vDI%YuPdvw0*>36w5!e@D21yuMXEesk=x5mwf8quRHDw(JkATZ#m)vtE*aW z$o^Rhhm6`6X2*F$=tGeL<_#CdPee~MjQwH$C6!3)og9#PmKm8oC;;VL&a`|I6BHlZ zSTGqW0IjOWi*5UncxmW$=EEizXn%E7xTZk}`uV2Y<4c54th8!k^&t(=`QUY{ySL5=FaTl;I&-X6!~?L{cAD&j50WF^9ETrk~mKkRQy46<+dMR`govmi*!pI z>;>QMZit)6VL-6^zXLyXoq+k;_*`|41X8pWV^6zE;cocWnQQd~Abm<%)2)Vqi(1!u zd_p9U-5Rm|x=bKs^S;b*Tdd*Cy+6Vz4g++C&$!wrnSr+7{9&tuVz~K{FLZp*hnIOc z<0rK~VD&Z8^>+ME_ZyNkHWkSG+Nc?CQA>0Mt(m3?hP@Q>M{S;)6iJ}&mi^6dpABH+ zy6oRNR-Q1kl-`l?l@7G`vtvU@-u=LPA8v)R2Shir*Zn=_3r8|#jpJpcz|Bsuz4g%x zB0gQKj8O&-1GXygo6%QjU9iXC8&x>paWTMS1|Xw8s21rW)9wQVzl z2Lnkd;iXfius6NohDgMNw8QU1$rxRTS?7^$q#}fsS6I#5$NsRY(|`9}{%y%>an{rGp8-Er1=2I~`9K_(M{e@{9G0kod|u zlxBy-ot1I#7bqe9hK0c&2Gh<-fuh2D=}(rxLjJ&1@JnrYWjVK=w}A`le(x#o6Oewy zo;gZrYyjxuWNVz4lVJ82-MCIw0OO~{`!@dKz~t=FndhB>P;pfKask~H)->lyJK~(c z&aO4|cd8B4&y(eNgjgpZ=xT4*FMrB_ zh}HO^8`n+Y$6xctyjf>BxoQ2m>&WL#`IA__dzlEF7cW1cN$11DXwCQl?Lhbwf5>p; zs|WnGPU)X5Vn9j38S>nqKYYJe)KY&y3U5D+Rh4gE1o}3l#kNgI|3q!xuOCa?;7dxZ zzD}DE61-xEU!3*@+bevwvjGmyD4dTP9rK4R)|O{o6awJZj_2Lq*ZaXkqqE-%YZ=fK z=ebXipbjgK`5BAL1u*~4!OiO51;AA@Uu*B_0Bx?OdqlwkP%J+mGtzAh*WzUWavd4|8(Ma;(sU8vHSXPe z+NTNAy8C?QIeWsPl~MS~mx182=EL)^!BVI%Nmu+tk-`eEyKDtb9<1MTGhOLFChWdN z-`&wIh0T|~?>rPD1O;mst?T+`@JJ6YE86D?&cEm7RZJSdP{Zrb@4Y0T@=rrrmn(q> z*#3t#*BRhkV=mg&9SB!)@6PY=H2}R1?0^yY1IPNCA8v~({L6RdxLovvZv*IYE^?&{|&+C!E^>W|qR0PE__Ii5SXu;`(;+T^Z47@V*1yMMm`Qo!$7XOIA*Hrf0C zke9+Emsm5+BLRSaSJrV)%!T;Y-BW2c0CL4gJ&QA`&=qsgWThh+T1zc_zdfRZloU_u zN9vePtBCBsA;>zax1;dLEiZVxS=IbC&lTzogj%EPnBZ-xUCyyW^00?zox&%^-K`I7 z=}1r#Ld6PO$y6i~-xYW69nt_W9@eNUMDpIJ*KDJTkBLE+ZISbED}ZdT=)`|>NIwIU zn}Ep?!E*hD^49fQcF4~!8SQBK9b^L~&hjILKRiHK z7b*$(AObB{ZduY^8*qwDFTE`lf6g2U2sl&)F>j9x1yM)?B6j(M;B0>B&f zeft_p86c)?UywOp2n4%MEzL9z{CSKQ-t(}B?`4^GtvqkoRp0RH7~UCjI1V;S6TWb~ zhP5ooiw|9XG?7;@4Gx}v>%aCr4~$5ik99iv(94^&J+YJsMOzq0Q z;Zs$A+2W`Bh9sG;jQ;{5F)vo@y3Hck^WE+F?oH0nV{*hm^3el6op73xW3I`;@#P0YB~Met`u)a`JG4ZyjJVROiQQ4F*(E z@}6hTilJ@B^2)hhPcXC7WOpBtz%4ua=Uq4nlyHt}-L-dyq0}W!pA-e)R`7DyJvBCn zK0j+dYUc~XZ`VF#x3FRQ-x0_8^*qR#D!CV3FM-U^$~tC%GR#CA+gXm(ky}c`k>oD^A8@(8=g_!c#j8Lc}H~G()e)4>FT|a`&7`ju@D}U z^#ePd>zGcYpG@S;g`8S~^iQRkmF?>TVcXVDwU=Gi@Mf*S;$4X*uzTx&x@V|f;G`4I z@1nWF-(U=T)f+zS+19_TM3;rc|9-jDQ=V`!?W~eVfjgXSTOCVdh~Up_>F9Jm2`-$Q z{1S3c0JyI^Fn?!6@JzCT81z62;}L_u_w1BHhrGP6YOoPZA22&#G-n5#@1DcrBK>7H!bOu1@a|#qwEMS z^zp637Va5$FQVJJcVs(*7glMyd!+zO`E_`AISHIgIH6PJA`#ziR0uOse(kqx8Sa_qP>#v9aI(XxozdXLU=Z+8_Ijl2=1KnLy8DGULBs5<7$8CS|kpzQ@n3n zC9`4kyv$U_-6#bPTOq7nGyk9 z-dxyoccloZVT0T5`3Kq< za5Z?Lof=IDH~(SUe29J^o`1UT;%=m$wp-+Rb}JtwcVnKG2D z!GtRBbt1+4zHs)s^<$Uwc97KB_sV#b1BpALYWM_u7~PN|qbKozoXhOTRSllNGY&Cc z*S{G4?&e}7KNi9PAK_-Z!2tMB5j}Vv>8HCWIGcQV=mR@an?hukiy=`kiy1j7&cVgy4{i)5l#*+@PJNz8=e9jV}ZCm$Ua@Z4G zZja>@S8$;!a{JJo`;z6iP;T@KpaAOTjpz3fPc0Hn?Mme`*Xa5(kD zR1t~4&yMY%H{RXuo^U_0=n@h)?XP%0`q8EZEnk1y&4h43F33z{r?U%8vy)1+^2N}Y zY?%J~@0@$;f~Q}`zv%#`%VN{bypO`SHSsn4n(isBX!v~KpmV&GEC+n-* z>><3f*Ci$ysbilf;Wz9@>dG(I6Gi5}u&dL*{6X~-cQ`1rt!r|I-b?SFk8SdYO2<%^ z#mUsbK)6eh z0BfNH?#V%p!VDHVhGJF;iufR|R$P3&)EN%1SLs^$ArL~yiVW^iW>bcw9;Y{EWJN0jVfJyCiQ8+0CL)XI_H@73}2v^Z&()M$llZF3~~a&#EJwF zaQu$@T-ag<_D@@7R^9Z3%e$_xNctm%?KNv0zZSD#>DeDteXkMK-+`qe zJz`j|yV{zpOr#b9;^YXJ?I1P^9PJD3!$+!M38%=XqEP9 z_sfRvdBW8yW=CR$8+5Dgn9N4}yLZ=>SH81@36GObKTH@JLjExI#(rMBjC!4ykrJd7klA0!pCxsnnPOg`BTP40Wv*}*)2wL=8Kw=|_oc@mJ^TKn)WQvW1PuHV`)$cM|;YtOmG3E|eBa|`b^ z1j3W5lFrChBK*oA-Ywc|0b#zQTP(KtfbHdJud40NfLwyTYGqy^;4C}6D^Li^8|)+F zd;KB#j8f%1z7_m;{^{wD$iAiPjzff=7%eEGY)ba71eW(D zJEm4J;O>{FTMN4-KsmflazsNN5`4!!KOp-F@||zaEk^oqy{of=N%~e$)soP-0Le!( z`5t@Lo)mz~c<&{`4G~^sU+1BPjQ0kryed%He`)#9CvmW{a5ra9k*ntoKax>x` zwpfGv<|P-$RPCU3+l%nydpu#)^u85C4Ibd=#6O__2w({Ja*Tc79ja%-PQ7gPhP6)& z&(E(%>h7;e@npFrF!U~e*Y9o$$o8#Ybr`A3_Gxv?tn}c+m-{aduSfDM|BPP=&6SSu z>Jn?yK_ref9$#_dc)buVZ9bMO$P>ZiXbsy>b#~Aj^j_E3%LfwPg{%ubWB{i$>yL#a zd9&}AD-PG|8L)KYt)?C=3`~vJER1NQK*6FNOXhqyFjel$C(M^ZdBB$2;#VB#kli^u z;AaBm(Hgft$067G@uefXelQ@}{`V%gpFB8Dd6a0BA_e-xyT2l~IRj1b@aOg`Y|b#_OuLx02sCPB%7X1}K)z*pLnG2})f4p$(>=4ta{f;&tix9M=xQw`xV!N@(!q z*5%UU3YK7nU>Di?gYfeRHGcx}W8_B>zdOU1AM(>iR1rK6KV5w}ng!3d%d4Es@q+h% zzm6#X=LEjK8E+2r1EK22NN(RKQddO1*2N)pQ_cPr0rYMT^r-3Ve0GZi@d?R6M*9_j z6PdEpp^pX+68C<_T%>^JNb#)W1661h^<|w);J};E#S`5UKWM%D?0O%PFFAMY+L$$r zgQoqO?q@D*LSTcc@p8RIaPX;s7nSV*PcEM;Yu?~{P{*VP9WBy+VilIcbm^zJHUHC3>z-!2L<-^O{?P$T0QHFAPOL3*X#Z3j716zuk)kK;;G5#!WcE zpODg*iv-qSKJp z&d-HMo9-q5@)cm0a_ zfgt|SEh#)9fO!X}W9BwHLEa43H78#J`yBuM*fSjf_pf!IT!ZYJ>ECqe-6$6bWA}U# z+*bO)pV;SF$u4YAn$gXB9Iyn~f0`%W+6O}2+E*v)@4CRpyNgK6u*myA`BiP;t1L9V zOf;)TK9|oO$4oZc1VWd7?Agc!H!!Nm30;`x4^j2)PiwOLU@l3)(>IL@TP-gVKU-44 zd1n%4hY+ccKdrcwf1C*&Jr0o?s*8c}dx1^^GPjcJ)LCEH@!DOcAm<7pzzcNjw6iO6 znDG8e@#2C-OqlyumP+7>;FSNBA74(fLH~Dj`gJ6(alX%%Xl+AYf8=9~eW41p>di~4 z;CX?@sl@uSX92Kh>@hh|Lkr?D=V>MN{@|_qr)5CT71&>**~RCDAaM>_=Jr4g2Ug!4 zp83v!ZYy_kCfGzG$MVuqgmA8DPOR!li3~>uL5Ar^0cs#K!DYwJ1?93;p^@1 z+t^Qh;oTWGnb&e=(AK$q`#`KAB-mA)a6HNfo6gyTZdWXUn2`75Vhb1Uoyk2r;vt0Q z{K$nG$oxaOoZHypJKoSXciAO!FCD}=#qQHKV(9Ph`tk)?XCm!v3Bw!YVCWZn=iZ@*uY)%b;cRd9$2P0*`k9yssG9&=1@A-1+e=UFl3*=U)`oo`YdU(`1F1(ATUX*$1 z4@O6$o8Q|BAo^NxoMS5wZX3JC6F=#|&%Q-Ud97ZsZ%Sr)j>HUf!#i_`EPY^akJ_~w zneWlbyb%9vG!Pob7W-7$WuM`u{do@vbtFeM+jkf36TBPHS=gdmR9;<04{HI#uEP{>1^fz5by0 zX5n%n(y!c)Y5vju82LPG$H^JV3@}W~VPNJYFsbq1P0xRx$o|Ruq&!zUSjO2CbYM6D z^IUb+PH-c#kEgwQ4^%_VXv3z6R|ZYL{$xp_Dey@owA4a7So{2t;l{jb*RnU)dA*Qv_oPqdVuX| z)%&G*9}oq1IsN4Rc8|LEv%(0u-u|fh20BQoP=b9q@$HHqS+$XfCj=KV@%Ai4?59jB;E|kUmz=7B9|f zTL@T_E+2Hj50(`#*Q(B}eBp%kss z-4}q=l?GiWF1o|-58)P#^-}0LWww6Nf4&f~^hGAMzzHOIpNs7%NFC;=w`p{O3$)`I z6MwNB$R|`goCns_CM(Nli!&_a6rj;%(MsC z|0nnvUt$b**47*5YXV@O?XEBw@PzxNXZ+mX+Q39l^97u~7*63V^-HM!@J=T@wfh1a zE;Y?lsL>0AgA#+axph8p`RmZk;yNk(9jc-krdxyDyO%?!A4%cGvE>0vU7cX^d)Nu< z@&G7jtkBqitTS_~63$(G%mdLg)hUAt5BMdj5>9#hfX3%bQw8ZlP{BG zm(6{b{XuKXqq)_O7sHn4CnBnytl{dbT}Af;T%qitzy7KArLb-7&O5uk0>NYH%+*DP zKG6Efs+F}=2qAaYcV{8{Bg$^1!MQ^ku&^XXHulU?_;C7CAkjez3#=Oy4a~&gbZ1R% z+)fv832VJ~WQi->o_Vz{DN+ecFDYSFteJ5BZ1v@q$4qF^NW8;9_W2BpwMhGrd}!kB z_>#_Mf3W(?wU&LZ{1qRo|Qskawg^bT`~Ny zTKlvBnZsDbD10(lZ469x$>IWJp6AWiq0bj+$mb@m@G89K1tm)inu_HuK;E+6ecdo0 zY8U^;V>Wuj6XLdh+)*ObMs2e-XL`dS!?YhaRYh=meOKWnBJ%TBo8`W3l!C0?;Hu+c z0vPGBQkgi$0^72;32Q6@;n~K%&~{}%IOV$Yb;M5=qz5c}D1B%Ir5Ce??+GX_$WZ;xVpLm%a?+nd%=HqdB_|^ z0Me7V;R|(pl{|m{uz|KyimH@DmOyv>D!VKL>Dzncko=JSa!cus9LzrfToTvcZMf+K z^Av{X>Us@fm&Je%pAHZgy#D+77!Q~zxp02<5E&Ar_4CQkDKO}mYio?GBM+9h%nvdb z!)PVgy&v-hYV_4hzVH1Zq(t}d@@u|8ZV{ZUIb;jJf4Q1HFrfi?%XkSrl@B)-Jzea1 zR{$TD4R>A&v4VXCSgR{X0>RSg3$K3{6Lvl^J(-&51a!abm__qUzvm+`^qcHuMY|X3kQ=Wjqirk!^`*~VcmWGm)cw%hoF#%ie-5rnnhu0c zgWFt_APMBA@2Mf}QiY)_@<%XQU)=W>%QT-=4g`n6Enn7R_%KzlX_UW@265Ru?UI{z zkR10Bd-!S~P(C(0use};A<9xHca{a^g&Byfy-p`!@t3tlUqH&E~y$?JC|-CoD@2l74W za!2~kYYdourm@08Jss_)@0{Sc+~mp6z9Wh34*iCr<`~o$kQ+-8VwW+`|8OAK4e^ z7&8ayt}GIP@y8ujCRz+AzgfND>-qrb zO-p=wL?i%=^Xlon>%`!4ZoQl$GT&SJigvrMfeFelvTNPv#LyI#vo4h71B>C;c3TZO zs3;O$uRP!gxQ7)=R$0jW(Rlrn6l9Jp*&^~Tl_m!3;W?#!rJk@~^@-ElGi3M~t{m=p z8-T#Suy(P92s&!~u9i0&0VhE3k#n;zD!(`u4)FBzGCb-mXdgY@xtf3t9V zG-nMbc81@OCkr9{L*$}2dpO8E@53qbDFNhMKXqnq0@U6FptiP)`LYT#2a7q!#~*%vJEynXs`Ajs6K%=`KUx$ZUZlcw)l!2WLC zltcXz;7HOVejxLAT-L?S;#?{0OU$w`^Ny!_|Kqs5A|iY5z4ttCd#}Uc zC`nc_GD0*EB{axN_9_*Lgh*C56-h;u%t(kRN>cf~e}CP_z1@2q=bZ2N^M1cx&)4f4 zo38)e9acnMCnw;%wtH~;uX%+SSay3_TU|8=Lpqhizdx8lj9St=^~VMw8CrU}c55(yfX0PDg^b<(x&&@jEBmBWJP zgmueX=euGs5y&{}-=PKTj=qC8j*x*Y&{A95j~v_njVytC=&y1yc{EKK!sF&@_mE9% z(DNjZur`^1hgy7e5b}XFM&HzG*EHZ+%%gN!8a=queD<8xXD8_V(aq{CNe#i7(0*zK zIZxk%eveR>zU@r5R+Kh|TRT4oD&!?W=U|Ho2l8kab`)Pf@6`gD(T>22o|4cJ9jT=M ziwP9pU$u&VNC(7_S1)AGAU96a8SHq`9qQjEto^b#1ajAd8v(thP*7A7MJJ;J@hRD3 z;{#;a4!$f1Qhz4|V`^2Z!tC73RPkxJT2u-x>rA=tNi++<~H*?`6=aChXNt zpe0qx!dJPF;igjLJeK+n%-ER2tgiT2Nv<&*S#RLp8P|aD5 zWPGO7J4hDF9aNkbc**clHHy45DF>zdPk0_;kpcO=)T@W1c_Ad|>{{)#Exg-5Q{Ev; z1{uCoeTO$h$gjP5`v`{v{H3v|tfnS{$*dtoAZ^uqgDFsn>q^cyk+NcG-u8a0I{D_{N8*Hz)T zQCexlITfHg#G=qsh+Ol?%I@UfY(TgFh>77xcaZy5PA3zt4^Q_L`KHFYL7b+;^uW9o ze9w9Jljki78b6e>u@}36l(_?W7v49Ng*udOB^ctI|EK-mMK|!i7#;V+&JDKX$G%sf zuibUW%Hy4m1ynqe@?lp--_ElAh_<9TBp3Oxj~n+xN4oT9(*|ZjGIB)5(>sHU)E}ngK*;Q+Ujj0{5wX= zry7ahi+hS&W;kb*n9drfFQcCF^rXJNofdrm+B@3#7C9&XoN8?I$;Yg5gl4v2~Hre zYnf?m75NUjED-}~A_Nh>S?wyv^Y~C^&nyf2Z>q#smdJB`^xur#C8`Um$5M;VxB-*| z|K}j8rVHn7J+Em;tHTLtk!9g@Bl!CLb61fA8CG8OO_-f9hvttCVeNW)@U?d-K+DVt zOg=N^{=xjo^|2(Er#Sy5af`qmeGX86@xVOPj|?rs1?tOeEbvm3E#z)Ov(u9K7ZP^!&%RzhilGtdTE4&<> zJKrbA4+pwS@AcW)LCcVe!^krdoZib$P1kJ(Y_d&xY?udo^@_1xj@uEe%2g$2alRNg zGYk>Nx$IE9*y$!bf3vdgGA65YK>*)*ijNh@>z2A6XlNrqxbFLKnHy?wf`*3KD#H>& znIcDy5CLr0_OEsfx_y_$gko;~0=1bLU z!pIK<9bvh(i5z4~|I$JV4?i3k?0c@^?F8q}XE5nb0>mnR?mo|sxt>ZAAD6QjD32S<&zTt`TIit8Vk5L{C#ugk1su(3*=rel(Yv=76tfwvW_s6*F)XS6U8ziW!@Q6t=lx=92qhiPb5wDJD-L50F0R!}b|4~B=UYC) z4uJz24N90Na_Yzv3XVs;gXMWv*@6RPUiKMyKtx@Dd*t4c^DbZ#SR+|JWDZLfem#=E zE#bqg$oa?_R~Wb&C_R4K9%3r}T>j}HH*$VUa%$TgL_U1s{u*x$E9<)pR(Ua(mvr~k z7P~97ntIyRb=t#^mS;cpp2)+fCOK{d^G^0vTw`2~T9AL;q9WIi2t=cNwcA&TP`)ue zcN6nP)lI`J1?bP5{Vzixh1UgCP6l`Dth<6;ZaUq=llL@DYk{dj z^6w1~d#Jx#&v+>bbBTxLbeSB<5Y&F~en|=uD8wm0tkj`Dn#`si?1esn-IsN9%nq zN(!zVSyKV}lcQeQLmI%wR48knfPV8R`;#){dqOM>q*zX=ftdEQxB%oFt1qYKmqe4n z#&l37xrz+IhyQWdMUgdBa7fwMM;l;g3oW z8O-Rf`0+Ux+JnstGozh69*A*Klb+w}00$=a#&hHMNPbM^O7b~Pc)u}E#a`eF7ve)^ zG)k;t%fMAdQ-%#FTAy&O+|z#wznBkE_rX%8(M0@;yL9F zfkIn>6gq)(*~Kp#97im`pT9ZHm(v{5Keev@)zAQC%30Ir4~Wo^R65-{O$&nmTz6;_ z&0(Hvf8m6f9b9X6W~yi9fyVFp?;DaeVCu!ZPo0-EuqX#QOW}Q9{H9#aKY9Fq_p&9@ z=(|Bq(e>lU(2q;g8o${kzy>SZ)WQw>tiak#ezLXS5%?&@>8sFpv~B8t60~UoM4$Z( z0m5z|$b4WowWkd@rhRz2HRc9X?@70lxJa<~tm4`A9MtEYzx>pRdsqKyvS2@*D1@Cg z)l*`2h7!L37gY;psM)3{wDvQGqS|5`|4kd9sQ8o9n2YKU4nOKhQ2i25qm>zEb2P*OUB+EOsOQ}Kf&~0rl9$q7JDEa@kFej}Y85E` zm~f5L)E45!GEQA<(uHY04U@1nHi&p?`iBYc!wKIHe2?B^1We05SI#M0!ofwYUl}I> z9(P>u^c9l>h3%MH*HHXkc(fcoIcN;tk0v!Yl5JsA&vbeVeGauw%iyouDiC{QV0vdA ze?F@f&MqsCvV4{s4c>(i{AZo6C%8E9BU>py1?#3&#braS!3>| z{^FTpHCSKfc`-et2^G^5SH2?uGkcx2{vrW+@=MgG_nXQ?5hEAP+%;R|j^hW{+P4Xt zBgPMRh2nMmQ>*aVM^j+%HLI72Rs&N>hyP9^hcRs?VI{#ugk2R9?^|$hTr3L@sIZa; zD&cM|%UlzvO?^V1`=|(7>Pq34uiL`!FJDCYfDEF6%C8$gBX8b#=)`dVptq~>Fnf*q zdCk2H#WhXP(<)RidQZYVk@HQRiZfVK&gVJEn!)+?JyB0709cnBRp^j|+@3H9js9f` z0&mI~T|TKnL)P_O0mxlRtV$$y{5FOL%JL4M4icP*%%@&_>jqw9j}O>#{vzaW{i8N& zM}5$yr_OhT2EMkJp3Kc4z}M$ZHdRV4ka_d4(K|UCi11W*{o-N(m%=~XEz!mKc==;3 zWwjf$1-C|)+pvM}qD*q>FDDRd$x9^xACM^Nd76O7uL-nmrL6i=qt3R? zO<#0R6G+v!2ZF6tVLXnCJ?}aR6#1?c?Vip~`~GD8dbI=%P>4yEo+E^n=KT zL^nOiKJl7!z=#1_KR9;fr5b>{lnEQo36^7tmv+7Vn7AIz-dec(oT=)YE?F|bwK$)LmQY5&yk%=_=vf$N#a51$fV z$fKXua72Dgs^C>|3ch7f)r2Ca?LsAc_8aB^%@WV9nzC5H%83gTE1w-f&r)>9 zjMf(ZN!?{r-Y|fa8V^!ozCEn@&?)!W*?{OdO;)czL}0ECu8omIj-tLt<~s7&8_Pwi zqh~FlcXWDh2=*ZCvWhM~AZiS+?y|jyF%9f>aAdg}Cj-qg)|Y7hGXvF?vV~9Bi*aeH z>v5E|58uf0d6O`HH) z8nGW(P%nQR((&LiNfBle3esG&tl_`MJd6%}=wJKhSjPmrg1uXtTy?M>oVGMsvgmaN zZIj{-nr;G|FYzC-yGw$yBjxGcf8Fu-tnqj$c2W-GomO%$hhJ!G zL4ZcrS9@y>pecI1Z<0WUt3glRdwo#>E3W>bR6hYAO?UNs2$4E7n*Kq^N6|cws10!dNsG6U zjEgo9*{r+L(&GRlWp7lg?%IKYhbdd&Sv|PEH@SnE+7$#I8z(%O!MWpw?A-@!4A9>b zd%zF*$cBxMzmsLiOGkbB;f6g5fy!q>vj}=1H@EV~qDKWJ$9{XmxD%W(+rA#h?*NJC zCbJJ$ln@&43oi~9D?+j+Ba17C8a$BRJuGja0pssaz6V21@Cf%&+`C^5Y(FFpYlyo- z6lZd=vBNe&@lV?ab<_oC$H$Mo`(y@xBHp)%H&_CT*|VLnA9k?)*Ol=wayI23mTW`) z#%zyr=198cb=hrK7_)PiVC?9f=H?tme7o=m}jO7|LOC385oMDS; z*m4D{=YEx(%j~IWd(SXsr z-|rrs*TmeH$%WoOcz(n-ed|b;gmHs}yowx6Q1BU?ytIJ2ym)fz=09ghE>uDFh#73en?XIc$e!)P*9 ze<12V8P_aipjZ>0i#K&X%OpZ>taN;vzV~ZBO5^Kgc7F$oNaJ6*|D{KT>b`DeWP% zc%DA}s54x7?GiYmDFsgCkdp%FZzi}<^{x2ng8N#G zjCTX?IU}se8g}RO44Lp@9#~blPl*ZV)|Bt-UnnhM-yc4Bdj|V0!g^>~Q!4Un->_%=Gby%(+vz+?i00aI_89x7+ z!_axDLH12~^rJqcwNWA?|K|Ps|M&ZJOdbnQK!3n6tlIzJpfiY=(c6f)I>F7pyamDn zo_Aihk2$v_;LSsyXJcBXVC#{?`ie>)8gu2t6EUA57+c^W!DS2_Di32zUb=(bwp+-F z;W+|Z#X_wrJ@!4E+}v3{gZrM)1H+wB%<-g+MI0NqhxOg9Q(2f-DtMdpxIW*S5y1c9cPMTH{*Y34M@%&~tc2pA1wwf!Cg|lYv!4&%TBh@8jPX z`q=rHL3>)9RTg#L-o}$hNny@lYe|@PPq6^Dst>k>sAG3hcy6^c|Rc>5cy8i>h?5`S*%oZSVEcGl&Q~L4D`G?IFSAx?OovEKYFDgX*z>F!~O* z{?wU?X25#z(c6dG#^9M)X0<422G_q?-+VlVI$8co_4~E!~G8rRNR0=LqmMA-wL8y{JW30nt|4Tr88j@+8{wLX7mK z!_%Xf!)W#h`n(xt0l%KLN!V6@CRm%bw@LN6!_R$B)0h`E;ETZA3@@bxT>NQ%#xwv~ zk4EigJ1hT+rcxDuiY!ijfYfwR2meZPm>wBN7~aE+>V7%-amyoh%G`zm9{gi@t$5f zBxwSt9*+Fm$+ra6YHAuE9n^J2^ek52n?d8{TiSDJicqh|c)`L;6V@*u_c?f79&^_0 zQ8htKpxVVp&S|~zzu9IBFJd3vKY^Ub-hcmE^ujE))2TiJ;M-$<_MSSuMn=cSjfvXt;_a^Yv;6!uC*v0f%1 z=O8eVOPAcQ37rhF7cS{x{?1SJiWl~!+Ur(2fW_fBn}5(zVm>hB9)%IoeNh z>X>r~Iyoiao1qHvv5$&p+Kix=?`uieZUbPOxVt=ChMdtWUaJAr`MPYS0&ZdNN9_vL z=~vR|0}TZQMLz#Yc=6hi@P^hBGF7jCdZexcXYVtKrtH@M2Ce*48qbY^>9Ie@##ejb z6_nQX@I(E@!mGU+=T|-IKPScF3@|TdB2_J80V%6)$6{i(2>%U~*rZfSK*oCf@Z@Lg zHM*CrF@^r|1K;lT6bsaExujV||)5H&OAm=vv!MF1|a4}I=!C^M2{0=^|;>@30!-4_lyqMOYf-MSyKgy8~T?@^7tT;_CRtp_7nU# zd&O>boCvxZXSON*b)lBqz32RKP52b1{iHTi85nx?%W4$$VEN~wVMU@lIP54M&~d}O zYW3p%PR#S%_{HQEl7~GS6~VB2hZgFqJ!)pmoFVfOok0NdR*$p2p57aF1Lp@X4y&HG zg>~{F28v7-NJr?i>79j}=QFJPlJEo9-gz@;J zc}oc7d|)A3;R?O_^Ra@|Ca`D!lTXPtHc-tz+#lV;BVx& zaBuXNKF%q#80KSc(D$DEV23kQ-nhU2a+N-`C2+fQ%bJ4MIjx0N22J4bH!8jI1;96? zmEeZ`UP_;O_=$%0Ajdw1ihc(pT(EYfuusyc$LJgZaz`iXa%NnOd} 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

+}@Rgqd8;4}khY|0$2?OKZpj=q4I^kb`~o zZmLYnrnB5-8c$3g!^jLXHmQ9$zBnbl&LIoROD-{PRpdxVNpL|KN;a2<9IDv|07u zUPqt6!!6f~pN!!1T$=N+yg6JylcFg{G)t&fO`Cg#z9*+0bMY?ZmQ%EZGI1c_^{czG z&15(}KbkoY-%iJ#-0%Q)-7f6w%&n~6z})4^#Kca{h7uS$QEnf`eOWWn@Jo<^$*Z7U=Wcx@c{u z0(X`#SlmFri@T?z-rlRvgeK>=+j%K_gb=m`n^hZ2^fhEDDuiP1ut>+pSb`kHmXwG5 zpSM*!&G_&O<|E%!bdQP7>%uv|7lU43a9_jo+*(Nu{XJYs`l5a&;OSvoOUda7A3jY< zgM20=Q-CvX$oYICsx4?*!@uOH9h0};203Y3keI@A83Z@WKx49^cIjYu9&#GrMHn1$SlXQ#@b%TQ+yWStL1f@%J z#Yg=dq2)4ZVK@50{O)wIjyPkErzPn>qFbm(^-zo6i?smOqqAGa%R1onWWDLQ5%Q>c zIr*+%vH?PMqtL=n9T*u7_->tO1l7g*pMVK{m-z~>l#`J^bf4yI`?Mm6y}K62f_tJQ zHdkgx^nuW+dKmQ4?GnUA^3zl3kPDi3!Q{=d2K?SPPp;8L|JLiDHd^bbi<7!{SU#|T zV?XmZO~l0E$xXG*AEd~K-8juLXf6ktp}dnpM0T*z!)NYop5FwlPh01(7h_NGOLB{|(GGAxUP?E; zR2`IlKCN|I*97Nm_W>&G`=r*Ay5Mu267>DLz5lDzf+{CX)2HX~c{4dz%3^K-KdYAl z2XJ1Y_hrdlNI^f%nuA&4(h>Mn#YX;t5_!tYtU)FG2GG-2Rzv(v95ncDcX@rn`7n7; zzaH=39vZ2AO5_QL8(K9bqid@B<#1fvziRx;O$4ZS00MNg8j4-&skRJ z`c*W*vx+^!3&)G<8YG}i)%9H6s10a6J7+{TZ-f1IP2&pak5LqT%W^OYzn*%O$d#Ll zaQl3Ujz8)Kq`%bL%<;Z?upIgzMcfhEtaF*0pId{F&reE=R24Angs)`cCh#>*o-xSZ z1YYC|A2~lH3#@}nBz>6Am|yeYsN+HZjm<&Q9n^uI^HoQrEtvzW>6PT9Z5^2PbSIq0 z=d~gEnZ%!%Z&{l7=TU(Eo%*EwUJleZkL;}fqQH5ieCK`4`@=ez+kYS7?~ikpW4XsC zK_y5SxxA+BWer*~G~3s?WS~AGZo@tMJK;p^=g&6}83UvL^=gr1)*!yXZGhr1mc&%K#+Q{n~Tp4hlOm5l3{6hRF*2CZ-c)t zk;5mZJJFZL70xD1?g0Hw|1LJz>Vu~BNiC@;JpahD9@b-`2e#>lPX}U5Vc=7s_dg+9 z;By)6^!X3_;=A_xubk!u_V3!^=aN;xzAP?Mh6VR1c_pdge~F+?^2lbkoH9&3?jJwV zZvv;Izgm4WR)=dFTk#L_<-s`I**=WH1VrTNe(>ha656XZ-M1wF5}5n%k&U+@kE$)A zgg|2rW-ro}z9CQH_0_}kx+M7gTd4PmYqx-q+3=OgJj_>qJGhf`%os+>)T$v_*1xoISfD6%NxDe%s=W8bqD!)d45vcKMys1pU zyySa|oApa}z*ad_d6iTFo;_*YqZYA%BbF<=``BAV_OdK7Ax;I(>kZ72x0?Vvrw+|f zq75);ucX|-bMu4#2{l<08(>vrrL=uOfai(#uJK_$cQtkOaWoHdqvHM?@ou+)?+vT5 z-VNF?%0=?A0)1JX(#}k}Yj}5?#Bi4nO2N zrK4Wh!L!DLe^e)B!6dCQl*YmV_Ut2Lw^$BAhIzF^p$h>D9@@0{^H>5Gi`c8$L~Za~ zey5OXB8YmpwkyeJGiV!sMazwOBBAtg#;hl{z+vB?!c!v!4ny(>f9m3Mg&|%Iepwe8mB8Q9WaEDnDt+DDmri|+2R1>0V^naKoLKI?~Tu=1tmI; zTERuu#0yCu_?iF5OPj#-1Z5FIt&cRq*m$a40-u4R5bBn-jE=lbXNK zr-go)pm*K@cP`_cUd}6fo!SVT#O3S6h^-)kM<;shstWMeQqXo-TfrA&r-c^e?D!Qn zlgfTEhUW+GE`85F1Pld_YPN9S_Tqf|-Lt0^q5b4Wm`i46ghm~Im2VTv4>2e_^|td)-9%*(3y~%x>x|;d^=Xna_mErX?74dY8HwqEByvKKh{w_Qj@IQ^;dK zO8gxAxtIam&p#IodGHncH|{F$?Vq!R%a2X7?5Hilp!fPpYX|Pp9&B^)5g&oVituwq zUFP6^$6P7hZiC>N8@>9oMF~tAvzNE(vA3)7snNGO4hV)mI<b=&y`dSE(ycrp`zzZSfXO;kFj@cJFyZCPtYc>2Eh z&jXxK&ITSoCW3R&Z3+LU&Kmf9q`8nA`XBa`l3vSyJZA_;=LI&C@cT@8XFu;UK)*@= z?Kj_O+@mSF-C_S_1rq!|VGI=3Ft@U&^{`3|s9gWJ{GYRPaZha^H!yRRA)<;;w#rI-OzM~(Lghc?u>cC>$-u!YfGrzW1e zc#a<_P^mg71@zxsI2S`+5pKk$^a-+w!k(s&R11|VkVwwd3;7;GUrS4~7e0r?2B)ge z=cAt>^-A{Xe|VoKDIF_9e}bu;MM>BsJ8<+&9vGpOM4#oo#SaW-uvAF??8cln_6J|% z6Y^Xp{8)8->v#@(3w{&WE9GtAq*ksG8P53~?;R4nFHu5fAeTo|&>QN4n4FWn$z5&GEfiC{Q>F+*G*Op!gmqyA zT&ufqzEl%JrNja1r)LE&l7Nu zz$)!_pE(2Pg7Jd{`dsW6x_)zo8gtO+wqyW7Hc4ka>9ZNWA_vU4U}0}T2WuKUqh zfVkTf2U)QNyqT!_s-VOS?SHn|TA%BIrjtZuydV$kOXp;@BcJN&=lU>eJP+LTe0_K_ ziW8``t2h*?kHL=xOu=8q^O+A(f~=${gyeFXxxTl91MA)f)9B-3>mq%B3v-M^N6iDD zDI3A`JGLu*2he{T`gDCj?f?DLC-X{I6~L}Hv?fFyIZcH0T1PePld=y{Pg%1D3HHp= zDl+6>-)HuV_BRGc-?G)yTJ+c>d1f7tTR=QZ!X)OV4WaW>9l{^gV4=1o7m!m;>353f z-H-)Hlocz4V7@dcUVFI+eHkCV$5Yc(W3M24dXok}_P}tzyEuQ#0@&i>FMipSfR0n; zcKZ1Knhz2qozKyRl|xGl!R2~zm*sC&48uFZ=Pa$YC&su()%mvA^-&Q7a;mJ5JOESB zy%iFS=c6|^pC>*e?>AEG(2O%R{9<}@ndY?>sKg7ewt8#8*?(bk6Y{Pnhm#x(nb>%GR1715iVHm3}-dg0IG z6n6-3emMNR8IL)3mmj7XsfO@sjRAjo<{)$>oi+^hZ@+!`-MDE6VU;E@c0&^!=pT*; zMjM0I&3meeFR{0-W%=!$ua+Qm>T>C+5EDpY?sxzF(ira77s^bbpYd7u+ZTD!*sFd_ z;P7L<8G=Fkod?61lU}Iyam`?m1-t)d%=mF$iLHpp-eXuG*p>(su}>+1xuHYXi33KU z!QUxeL9l@*dzU=zP8h*nluZOVe#iqD#Td=;-C+tN$|T_mJx(M(Kyer%b zM%9eD(41>b7N|QE-ZgKVE>wmS&)Q}88%&@$aDnbEl{KtPRR#=K3Bu{`TeJx&w!ovC zaiZ|N2%Nb;eC<;kp2OyT-l=fcfTrPz?|cUOaHP>EBOLp;%eHc>WF}0ZSX4?@)k+zt zN{)M8LqCVRu}*6)=2_eHt1FIXs(_EtjHJ&|Q%IptIz=(>2uI!vs+&z~g7ohw{tj(< zSXm3Aal2y#;zI?~9vaAb$?f6(h#UonHDZ(czvu%Y7FiIju?6KTolgYmP~YKO=T-`{ zf}C!y{+uVsNsY^|+{HY-VT?Y%5MH;V9-I-XgSa32;-Sivt_8xak9xA0O~BS}{jn5AKQzp92&T|AnEc*99UAiD-E*_VctqZi0<_^rOLM;z&I|U;ZBqu#%J5QQ>+V~ygG~1PcU!2}f6rks zyJ~9yU00;9YR0L-n0RA(Nt`?^B#FG$-A4ZFzqSgi3RBp=HFOr?9B_)ZomdiL1PozO zDj-0D+@nYK=AiG2YObU(75#4-y4P$qT8+Unui5gqhB5f<{ypYF<^z_!GIOoj3Q+f2 zlP&%$8FG_&%q5gbaO~SRs>@%@z&}Iu8he>Fq)GoPir?S>Du#z;8iyo6fcD576Z)Qs z)~Xgv?@XYL;SJ69BlLeCU34I^5g_;0y`TT*&$%@lZA}^t;mTjzjUSj7wwL0RQGBTd zR0nn*5ihm`T2i&TXty?W9Vj`u%1DCVK!1(O3S}VK#(j6Y&Iy%8*1i4_hVX4_uSIY+ z>PMxT9ojL-#n_xn`W-F<3PHMT>0hv?*ep{$MNt&uCwe{o&u| zEdvB5A8Ae_aVWxnMm)O#ba!enNT%Ciu2Qv575VL5-#!WJl%pSms`*np>I|Wc!F^{I zO~9eqi~E*?Ce%zV?Ejg?3$2$bSH~3eA*}g!P6Zq8VMiwV4Oo?6&?=I`lSdN*EAIVe z!hJ8dK%v1wF&lXF_W4dD>?wdZX)kYwj1cyFaXw>^GK9ym-&1y_*+Q3w$@+4mq0f8L$>EDN>IQWi zM&_o{*l!mrZL^O3Bg-CN)os3tz@2#Jd-}5Y{t2!XiB>_*l^*OCAoqOb=$NN{026A!|Myt8sDI=#gCN$A@!vc!7uAbDOR)?COqQmbd zmI=4a#;6MNHGy*A_t-+55ZpU&cJRhcyf^-l-s9Vh{OYo3c`9Gb^EcC{sNy~Qa{I*S zLrw*FSQRxkkMr}<`Z9qfO5`h)Q&>wb*@8hL`34m=HE>t0XA5MsK>W8;A)Ln zon49*41Bu$$hJ!Xdk@*{k1{KO?DxM-uPC*knTO#;N3Jw@Qojm)YHk9~o1=k+{n`+x zD)sy!^7#_xS2Bpf{7~lQao}Ge=DdHpdObg24DB7pw<=M0-Euy{@_z0x%v1h)&nIXM zGkPPI?p2bYf7GG*jI=)7IHId8jqho%!))Jb)Fi-ZymB@fxo^C`rc2U~=mLc-rONn; zLr{96&%FP*4y1(?>W|=kN6Isf{tUqeB(EH~EAe_-+44?z=EM< z4-fhbx7@C(^jtunn+J1KWfJyqnpm}a;&X4Jda`vP&>FsQ{QJU-8|(Y$pJj zb5slR{OG$6*syB8q5>aMEL)RCm4T)5LgDX6c2H_PJ2CeNxi)vagUisT(q=R3{eSPw z%Nv_NFT0}u(m>J38acU4zXfv5>B(?-r|oFOi=zy|bh*&3wMqt*0w>1o!sKA=h1)L6 zOO}vX&{5l@V*!ny6;hSl?7-l$Yh!dZaw7`60*Qv2_&G%~+wG(wCapB-#RBq=+D)v) z@Sc~M{4ZAi3g)MdP&9t-!Jc%|sp4`sV-S3Q-I?A_5&1agRllZH;BuKcBel2=*gYYC zI8bH*dq0Lb9xC4fk4?gNZ1?KJ&`c+_xRoRfU3GS^!h5y;xZ-4VlObF?QO0r^_oxnh z3gzLnWO)C%`S%&jho$DO^!X!)+xna1sqHZi@Pejm9}miaxv9P82h>H9c;3m&2?Ows z`0GuVQGwYHz1oY7mas3idY2#S+l6x(p5y}>(0HuqddE=}7@p8gAhF=SdS;`2Vcrt(;B$Rb>S`uMAnv!W)C*GJ`<}yYOK=+V?2kK~WJLCv zL;d={<(Z?%c`Rt2NRh?;#&e?XJM5t${b;`bB}5+%SUsDY{3QdA=EiS5HNf}xvDb1L zXR!DDCjGO0`*F|EytA~sTo<0{QDsE0X+!_*>6Y0O$j7&GuyvA^2Df-OoupOd?5)aW zKYwTik5k1*4uxsMdXW@W)-h$sv2$UV+tdZ$p=ClO4|0~owSJBBsUSZzCpsDZJBf;~ zg@abKponVtnaY?BZ2R`=H(F!gqw~#L#uLV{a*>O2m1G7FZ;hMq&Z!}%|L5MwR?N%m z>#`hq064$iPB@RfJer^0%#Iwi0OFLlgrYL)lx*!Ha<~U7h?e}>YGMv4deM&eDv>Yw z#W$}T66hQp-|c+@`99in>k7&HVD{?Ax74RZK=yCEk>xw=zu;(V@cd^8 zd+xO5>_NX=vX8*P0Qxx|m*p$Yp>Oit@wNQ{56nU29~(_O>Wg3XrO8U@hrN@-<~>iN z4H50~CK>1>{;oUJbz{^5E~%VUOx{2pbH@wHW%TD?=<#V=ax{i}hn9G{Udn-+W%92Q zbzQh*^JKl4@-U1@vU2M38^TKB1&g7`0yDr7G=s|DJOLOlaJ+OE{ z8@=QyezJknq;yZ&)t&fSp#_k@CR~UUA=*^WSL-QExI|?s#YkX{v6l z%^}zyeNDMq`H37Db+;AMJu-yp$XyN@yu0DpG47VWQ1pFN=)Y4urv;Tm<&l%_+XO3~ zXVdB)*z+ST&zR^V48p9m4%7+Q2e&k1n6n`R2U6d7aH;NLAlPRBl?gX6JzB5M|)9^;$07w0j_t5k1w=iR+3(QnwyWk-wq=dOnrC!UimK_J}sndh(y?30XCpNm4y!u9zV<>i)8k`Wxf zvlH)ocNEW;l%NjmogL(Yd!YdKG9|s^$k&${i7z4ShFrxwyFX*dn=MzpKRzk~5slT} zLVtI_^9|wrBuxRJ3Uoa@Ny2@3bI!RAI@||MS0qm@%0pYCM}}B{CiZ}h&{Tw=FH){B zHy(WwjemS<=6~8j`8RqVzkA5BVbrBCZqtHi^%~33{xUG|ATIBezybUBO_TQMlddsY*awUy@DKnnY~AD1!}>^gwM|ziOB1`I_Pe9 z!5CB{IE8qzAJ6@>Yz`Cdm#ZR`PCGwdC#3GNbgH|7dqo+xiXT_>;iJ6?pAza<9RVT^ zxi^ep`R&or0(DD>#r0R@OKUJ*Qd^nfL0{e7AFN}H)}Ul|;$FPGF1)&E** zZR|blIm^;J)Foqpd=lFb4`WFqsF|hj<;}(%oaEsj`j3%U&bdFZX-X5Gv$I8o_8EeW zQu@X^33K`x%4xN!YM?+vnImID2U-_K3t+Fqoc(1(pU~P`o!XBRb*p652wuQ%+fAg0J+XJ!Uer2S{LEtNN8EXGv z50`tOwkAgnWJr~tKAtpzyEO@WhyfPx;n`3P!GeqGDA?So%$Cg z$N&_kd}ZgDNuZL#)|4SYhMXEJ27%Yu=QjPJ(Zq-ZA-8MxcB@N(ulD-+drbgsWYcG& z_e_uzUVHH8ZUQjHR38qULw$JURq^U&Wzg9DzJdbvTqa8MQ!V^lz%$lC!H9off#Tx# zs#@&3Po^v$BrCzyBjQO9k^fe3M^eZJb!)wSB%T#>JutQ}yzYSayPiv&hL@3J6Q<0m z(Q;;q5PjP4lPStGttXStRg`N%=Gr~2%QPf-&=y&KZ(RmLtFHM?c4Mz^&HUx(Nn#+D z!w}RKq!0Ql>-zWKYr=W`)B6_tE#P(ZL|vEx0jOR}RyYaBKpU9!E8{*ZL`uQwY&sb% z=xQu2=B&VSIn$kAk_^dLYC8B(xBZ$E{a8K;`Be{x3%b$gslqUGtZl&-@47k&FyEMx!8YQw@rJq3HiaEE(g8M zkV`nEbj}0y(XOq_Nm{L_XVZ;}>EL_Jd+_Mrt2-5-KDlEr5&J?zF9mwaVh)hlG|dt; z4)FRVZ|OngZrP6L_Z8=xLcI|GQ62OpxNWnxS( zxAA*=NBoEOgpDrbkglI*aYa8p>EGpN$QL*_9qlGrO@i8%XC-$Y$V1%V(L3+FmEqDq zrW-Ms|D~#~*!oI2N%uAf*V4`zROh`kDg0P`keZ&NsHM*R3?u zk%uKUL`cg&3>F`%K7R|*fVU}y-JOgI(7Y;6zwn3*ZmARb6TO;nSD61%n4d1VjAc#h z)?trVjG6Oi^n)+!Ft{e754r7jv8!CQEqIx7yw%gdd0{~6=B*Z4U^k+^JG6?um4?gS zEA>WjlB%ip(x2Z{GKQ=XfF@zyKP68$Cq-L%;2 zM3p3o=VFOOW1qQ%9k4i?*1x`_1wYi=>5jFC!=qJEO`WIA&@CeIG26@n+I0BjF2^WB zHM{=y$;bM@KCWg~xnvDR$H}ulmlYs!wk_(EiWu@=+ViDZxZuDFA>S;V42~&vy~a3Ubf{Q#^eVxXy)F*pG7NCX+dXB^UAzYgo1Yy0 zYz?E%3JXU@)!_~2?B81nR&Y-%t;rR+W;449zk9CX{OZ`x!fLJ$Dy~xyTms!HeMX@~=`12d{b7uNmiamHthpcW7aKV()$FfEApS}G|TaeML1ZM-^ z&^Mr;>4w|Z=-P38h+w|`-W&Y@7mq}&bpA#kWKdbpx08DCjXQJg=RrJo7w-oqVxKw5 zB{QDiK?qjZ&zJI2A$N*a``Q)?6GEDWO=C1hz{h@*zl8_+pL??T1*nYSKwntV9ZEe= zOiv50!t?27Q@Uf-Q)M_D{_eRCl`a@Jg>K7YKi;3(d7p=Qa?oPbcZ+e=45BIT+&zwZ zsoLukwY`VL;QEah9lTx^pnqs@?$l>1V44cdpq#XXTt~9q7WyMZCkHnbwXo06SLK?4 zmM->3_`ga1iSJK|ha*=H*#SfHrr9-dOJI_$4tVw)brIG#mmCP#uk6RGP_%*E&)QFt z`i0u?YbS%l#WGW1D_4x8l?S{xxUsL^u!r2~-YlIA?9m?7xari7KX<_@ib&*SWKo~h znWWeWo!@1iTN8BQ*W10Sfe$tbQOx5s#AEiLU@p;{ok)g|E`~{;Cd_edTB;rUjGWj+ zrh3L_*iR{XSyADhC8#a_@pcGh2H#$J_PAADsAn1fYbuO7SVS^dwAq5h8JkMYSj>NE za@WLuu!J3Nel~Nos)IkvQ9%#n1TCH{nYI78MsV%$@l$lb98}GWkRliM9@}%y?^Uyb zjV87+lL?&D8?^5))uYdLN68_FVJUD()IVwX6MJSHTVHyNBTtYkQ>6a|=C=mJC!_aq zfaq}TmLdfo{Qcv5yj9u`J_Oz8=>3TI=#4}M7UZfFyc75+GmL&@%c#6@L)0VRI4AFw zF@^4FpD%a65}{G(EY06NW{_%MPTI04%lp+!ndo31b^nfN1ebu_TSZoi`EHhU`hR9e?tTl==5zr8NlZ-VR6@W&I`!J z(z+3GAz1+4`EaOm*NVf1$ooS_MEPO;q;<*VpEeLq5z#8FB?3c&=Tf=c$spL^&MT*l z?*nxm%65Fe$f?OOSC;EQ-q`up!84}VV>Xt3^P(+`20i$B_kb=m785U*pbsiZ?55Je zd~JxgdeO^QX9cImB#v)#lA-sz0;v-7?VSaD{5_~gFlV`To&AHp#T$Aaxj4rjQ4`c^ zl%j?Svxe`=!`9Gxfce}NGh-0p(0#DRjy||$CjG%OIuM}IC8qAd{B4DAk=78tXZBh? zTfy@(C-^=4&7I~zZ)6)_@2fH*6)%?&-iC<)W^mQ^mq!=K zaG-pQvrNMld*SJ4C^2s}a>Icp$q9SUQm#e~Z|Om<$(?^v*(UI5kHy0>)WI!v8Rz41 zAK1dO#MH1T3-X)~4Q{2PFD%;an;P;xTIk35+NOCxqU8Nt)kA%Fey-(dEACAQw6rD( zg+qiH<-V|Z%x&!ZDrvZDAL=}RKShWT<-ou(K4k>+er#<1XCLU1K{P0wFBSbQ^kuEJ z5I%w`(Ap3IgQvG zA5sRiz^8Vimt)on(tba<$&CF*{I@da6JHZtmecIKg0v9;V~ccIm+jI zz=)JLk;;MnjxQJ!%hk+)Pk4^{v85{1K3OYsB#|Ig>4wL@AytTYWV!w{-3ST~#7kU3 zzZ>I3`a!)^JK&q&(W_aH{UhAE9ZYymIrKiccNEX#qg>igSdsg)+`UIf4SgF?Hf(-5 zn0Ilz|MKgMs3dF^xQk}lSi^#Vh#3`?ETr&hIJRlo{LkN;$~Q6xqgN{|rpRL*etSlF zU6ceLJHHnlx2A=qrnT->eswUszFYYEoFQELtw33_f<2s;!z@L(&wKy2(B;=(?0u8x z53wH-02ZI+QvF}p<5hm?*#XSu9y{>F(DAN1BvK`QjGYyM;q}5oW8^cxxMu&#vfUOG z`0nqxr)mdhhcyjrll4J){`C`XvJDXaUJ6n3t>>I_Ou5rnNRRf_TZf z=GEClpd{X!ZHcTlU`9VI9~P0MhX#|E;c z-2#LPbm75^$rHnWkPrTNPjK{J6;Lp9U7LL%13zvPZRrcKhxpj9W2;7Tp!%!AAe&hd z%r05`vxOSNY)KB^N7S`M$lub$D zU|MA7p|68>Ft7}4eIzZ&<(oP8_Z2tXiPB^Kd0PXzJ$A+%5?4iEgh#e6=H;|z?SGZd zqVFc_n}H>$&Y!s*vJzHAunD}r#mS%uY0bM_fGpNB`$_qW`@c%u-HzSjwK?C{(BF>*czv}oa?^H#6|1v7w zXgv2+6%x*Ud6Rf`H^fDJFq`|Ui~JAn{5rBO+{;VvkjgLtTOGX#yB-6(LEYKpP|qh*pj_E;F0@4z*08SvNcVERE5`dkulM68 z#@29v%29*WRtd&`*`2#&A`H&k^;;EM^guB4jJjK80_~)CllM&}AY>xrrP_cg>s?m=h2)2d&4eI~#kk?oB~Ep=i8ZCW}5)imzsz@<6cS?8zCxT=s+ZT`ps? z@NRJ-Mta>4*f!b58NmWP{*<5Bs^_AQUqFF>)!JK}(oH&f^s1P8)4^?nB)-a9H%VBlhB+%bQ~U zeOViFb*W_Xcn`ySHY?K(k{FEcJkRn8&qEcPw1;KgnjkZidwPfkb2-TU?&PshHczm*nyMGtk!Mu|B*h;-H?Amep#!9*j{QSIdYDcvdy!FT`SFy+QEe{I&hb(~9 za_U3IU?EZe&qa&0Z zxbpichPyD2)BXN^mXke9jeGTk@an+bB8M1@c=W~JyVsIsp#olaep&yB!~JXgc_+?y zYS0p?Y2=4~iu*(U+6hBy!2IfHImfmn*wfAO4*BbXEV{gZWZFaZon80-K0{7oX`e}rd1?h}mxuwX_+C1<(>u0l%nm+(uE=U_QU{8&*6PjC_Mn^M@j@$^2ruMb zNS}5-4E(xishdYOPIUm+L3ft66`$m59U80!sz{)TjVA50XWFj<9Z!3b2(PL z&tT7aT~VKrgB;Mg@|MvESixM(DBnXv%w^gsy`jBg2D*EG9}vqYU=c)Xr({htFRH*sHT%EB4dbyCX>tY7* z{d(%@_#X6U)4tCWqC>y(>cN#XEn5&~-h5kBtN>w^`O3la#xQ5TtosW4Ew8U{vK4h{ z0`UWpJB&sSB355NXFj9}N;AicOMhX`Ww2$BU77`y2bJcZ#J&9!cQd^K2Mb6S`S4BP zmjTE=WLg&=LLX_@TiYff%>5j()m22Fsq=x1mX^YYib?ZIX;_FU?HU04}VNf7O(f}J~S zvtN2rKrFY|^#z;*R0|?_&tDLS!531xw`VOOwfNrZ>v_!M%^#+|kN$acPW#(ueC;7l zZiO$jl^@36=u8`UD}li)M~UfqT@bI|Ow6g%fR9!iN`ZJEYnfyj-7`prdp+L=6wEE* z`K7_y+q2ft?*5f#tlSp7<4%Y72PuI>Q%{2oa+d5yb%`gkb>Zk|4vr>01$cbiTdrUi za?@=rPaNkqg%c|6HYv*{P%Gd2sv#5ea6El3Qwqkw^k{e?D9!+eri?AB8yVmqoe!V- zG$-V_vi3Q+V`sgG&83u8UU2JlWS;Z{m?OmQFhPC4c#Wd7IY1Gf7gBqw%2`0m!ni8I zSP$|R`yzQOeiQt)6yI7o>OyQ%(RP5TCKPMaL54vP<7ReQzH7pl|e6+&(A{G%KfLt5JXb@G$L1;UIFQ!*5tqY?#2ic8h;0 zjrMR*YI3d5mH@I-JM1g1k!zZfalvcC7@Rhhx+gHF@O@*MXiP(d^si2IUk}K_wy>{m z@(c8Bcb2`5EH;NHQTk;XX>#zUyE;|^{Ww&A&!1()_pqtg21WEAJ=nptIQ#CnJ*fWf zeHD%GFAdv7$yQrqh!XfXC^?PqTc_Cx6FKDm47bmOX6((be#HIw!f4CcasqP0 zZ+x1rv=#$;+LWtbGc>`1rH}3SrX8@+5l`Qcw}7Sv(OL)(P+uD%^ z*bhqEcI;Oj?xVDKOE*T@z?-1+?bU)hkYuOG@jC}|ci+PJMNwCxxoFclM1}v}w&wnn z6+AbV;fD*JpX+fg0d0!HaQie{6%ly{bf)xcEIz!DUi6lB8uzb3RXT6RZ<0XCJ@BOU zq#Zn2_qSEUKOf=~%48+B57@oe6J?G8=|pE8HhU{Dh!M^`}Re=B0@J$U?NR4 z`leD7pNMZFkJq7@X6H2-Fq19qOT9&cCvPZIZ%CTMj(3~O1Bd%hG&!p(uP@iw%XkUA$$P47Iq#kwD(Tws5*f69^W*WNWf2-bG6jNP;WH}RGoQxDak;#ytYLG;o6Y4svn|3RNnoZi}?f(G^v zv-nFCnL$_2*`|w1=zEMPeV9RydaD0`Mk}uzC>c$?aNA7=-`@g)7auMKG3&wgM<~l67hje_XUNAB{eHw z*5ArE&<#t#h0Bz5zO$$sisal$j8TB`qRUQ69ms>-*vdERB!armawAN*f3q1z zzi{lh%r|G;+vOa~mi?g!=@iGhjvclJ`yuUF%?>lD-GB7xh_@bCyA)n*Yu1M5;r3V+ zbIc!Db+&2cmL1vOojb)xV81$cNmBl@0z0hE& z1M)t3N+vyQBZ%0$%s3eL)*gOI4!q!NLS2hT@lmOREd+m++FOS666t1O^8?I{XdGI5 z!OnynxmDd-M`|J{Wd9pv(pH1P{Q>psuPTMXCBeGPsEm&XK zo6Us&&&|sj)+w0dbvi_OBU48JWMc(J_PLpX%J6%H2_8g$)O8zsa~lx8^@MIGa*E1M zUiNqMF@q}#elc>mUkhTtq&8%$4bP8Nb&+apP>0+ooi;auSB74dUXFsG>rtMYyM?@! zTeOWn+a%C9N=OKo#e8O{MHqyK4Hjx}6Le*5k(CGt_L&yypf&0x*_wEXGX zDT24)Ep+Vm9i*PrNpOcx-9%9~l-uu{ue){5e+MD@8@O~$`LU|PPjip?k zk3L{7bNuBGAzjo(UF78>g_+>kmg${#)USDuDHkioBOfU1#ov3_1JrnI`pt8aHf&^h zQ>+R~z^>)%w9%L&VGz!-QofCT*QhRQp>!75okG@AwcaAo$c{Ly`6z+yJ^TD&p3keFrPXpOVxmRK+1Qn>)Qt4lKJK3;&mf1U+|8^IV;&sfp2CR^==w%T~h^hV0=gauYc4IUe~4E<+^PEfA+->i)rBdd7sOy zvY9@J_{WEIpT&DucJ6B;8|wPGNx@o}w+tArX{8KCpN36hy!0^kwVgdB9`#5Fw3vxh zQipI~qE6rSg;yTJljkNJN057dir+c7#vYbNiQMNu>B1UoQRl{OEucB_VTj@`a*bu5 zKHy!#^Xu!d=H!AQ%&RTbc5_>UR9T(3gE4@|&6$^fvA5>PV|154qXO5`wU{auYmkW0 z*hANVeR)N0S6Yn4!FSZpsG?F8Mub?L+v>2VcXhqqhF}bOIU&z4n2ABihmbGlvu&Wp z%EYB1{5Ro|G_&kS@khZnCUDiQzXIF&Pb@@-}kmq*^$y7VrBx7X}tEMa#pZWQ+90}`CnG_XZDY@p4M^G6zf-QAm* zL2H9O;TI;?OmxBMUkk?-ePQ_Q)1p6x_t1`S9V?G=0lf6H&F(zK9(E$FyWgNXtkN1D zyo$NwX70aqw~-qV?IV6Ax6c^1a%mQrSCHSmV<7XL1NsX1)@hC%mIH-E!Kx)u>_Lzu zS63_j@5jnm&>2UcigvzdhOZtBvBE0p4C)KyDl^f9|M7iY39N^#fnrqbMiBaeLz|;A zT*H{)NrOPCy5k{eGmAQHg#LW7^?#2HJqa)(X!194H}-vaUik8^8lY6C03KabgG2n6 zuA~?1fQG-&FV=TNC|bQDsw0Q|OOO26xalQAJLq#he<3{R ztKvn!WB)Imbz{I34K!WkPJGZYN=Rw1bh?GSwyKmV=H*wb1jdjo75nRlAXs?cUhgU7 zIIlP^7!S!nZqq~auo5wtthu^*3g^E^?lYQ~aetS0=R42Co5=le72{73vVhID^Lx2* zFI>>H_$2E4>}{K>irF72U;#2kiFLAd?Ha9E|~ajADzOvRtZx=p{z7%HOyw)fghP~?&%@)z;S)0r*@1@|jPpJ>_)zNt zpIkqCTbLy%wMd=Z{lFS~psy)j#OE}wlndy^tROEqS9JZPG022_oe|VC1z|-I?(iNW z8mFYscC~PU)PRcacLCICOGMrpv>|8uQ=u_^ojvv%o{^)DvVxiR17TJ_bZ{?6Z!ac* zyndSLZh1a)XzsemE+0Vwi+=tOOp`SrHL6d#WWoYYRw%gdeaZ{A(H3g7naCTY3TJUV zcNqK=cWtJ>5&%vSlV5*vUgT3WyGe_=} zxQhI~MY_!k|Ideh{CSl+ACT*Jkybsn2z_Q_8!QQNBslr#X4Hclc5sAoejs-c`+S!7 zf2b5feo>nB@a{@0;CN8~>$IBh|t7dyGE%=gd@ypBJLS{ z$bHmuETNj#k;$g2tt{HArp9yz(p6)wju z;j3~~U*$&|JX@ERq|pEW^W=>pf!ryh78lco6W!DkAG`ZM)TBImoT{OffY z?75V=rapJ{Eg6{FQtSzlnBO$0Y}BmQgWFbh;Z@&k;ncV1vPsYMq1@6p@$fe@*wwF@ z&WgTII~M_#{(f5sla!${+-Zh<^tvh{y)2Nn*uq}oz5L`vEiZ8!J{;{xzf4!k%L&*1P^Ei7;74L&ymaBso7`7)lg7~W zQ!8_0O%rk!SR3u5%;COoMre#A_S3fyhEwgdg6__yczC0h@D z;G4(~ymrq3W-rX1AB?sFPWEo%?grHRO{J9Hm1x12n?_Gx;dxPI!)M4mXaO&)kKD1! zl!Nz*;tQk}7@wGMX2P&)@K^hcnLTQ+pp4 z-L`H8{X&)9=M`1Jc3wZ}TCpOeo!#+iXA9=HDW7D=VGhRuXrR0U_mG~u$4^Zi0QqFK ztGixsgL7o$8d1^;eE;p_aC#{ZzI!t2|31ck^DzG#PU0k3Y2~3hQ7#GozxyhGbs7N8 z{nkD?8xF~>Ll zC7|gsy%fYhW@+j~?(Ks^MfOVcCQ!qk(9b2R0%_a(8wxDcz`C1zIv|=8RJ}IV4;)v8 zX2HUd%5E9tBZdylo+d(_vY&WFH1_+=oW8^=X#&fQyW-OqFmL!$dZ1R?qa{hwP8o&@f?R0JlFS%s?FS#g=-$2 z9lk5N&gj60{+FK;Q?`Aokmky?efhIF9QBn{o2JKmO>N}?XUzZm z-%q|jcop~3oh9Z^b(Dek*-foIk1gOz)LsKWd=GE!BkGzMSi}3n=GXTXppVg^4}((J zb9g=PVkG)TZe+()nBty5D^r3vB_j_<;--4PgermjOzIoo1IpOBxPh>0D^8XbPc>wzchb)UPp`Z2=>ysI^ z9L%>5vi|(nWe)2N?6>`Ttidm)z4`Gq75L6bQ(K;h{!#6j&Y&FpzFWVUw~IoKFz;cl z8^+R5b9<*ilq_<)MUD{9c!)y1aN(U5fBak)mNOn}R`9vU&1m$GD4g}`5&f|H|NNWw zq9o3nLv(kicc4G@;~u~8BeYE5_U^J*22mW$YqFfZi;!>Ydhj@p`8Ptnt6ro64bE>b zvafYxE?oNRG0StPGxtB4>TW6~fM?TA6${+Q?dtw5=I|5yh4~XjtIbHDy?f(Eq!-S= zV%^E)QS|lcHV6l|W1lI#rz3|T^4$t=aJ0muzv}b1-7Mx>*q@`hzXZ9y36#N%R(tut zZ~yL7E5c-;-nmEmRVV8C_Lcj*H}ye}UR5_Eo(Qdc9i4f?=!=;XI_7yx7Wv|P(v+-) z;H-LW(M37zTeCNyS)(xrF_oL9vj@?CRIROCa?u(tvT8Bvs#-$0)ze|$MJwQSx-wcR zAOMO&B4_lJah@qAntM1}g8G>+j4?*?FjsJ?P_N4pE=Ig)pDz&s_2OqoZd#c@&l}#G z@@r%Wy5S|+v7iW#Gz0VZe8Blih^dN!-5lnh>d#B;I0&-AvJPx|M2M)UjBz_G3e9&o zQ$P5kFHvI1LkhniVHM<@AMV)Caf@@=GRzq6Pn$>vE9t;^Q=B;*;M;221ME(9LE zacLdV$ayM_FReLc4qK-T<%94%^KUSy^8Elp!0vfKx^>>Sru$MlX zYw>Lw_UuH&^G8|;0%3J`#*Zu+xHe&XW)*uWpYbR?lyfx)ox0-OYF{O&Z!V7dp|&5; zhTPJ|Ndo;RwDlh0hS1;oRo_h=dHDXX<#%#RV}aTw^5hv?P@bkxrRl(arVw$`fFT2{ zTuHBcR%i(loeMX*(APz=Xy259d!0WbT(!~%twAP>Q_;QYE8(iZTk5}w+7Ke?GWPtM z34FXJtDukloNM8QXWmQTbECnn<%9jJV->Ro4O!UtMY!da6hVTB3kDqXxVH?KJn-rH zUvtb2dqsb~gE=Zg-Hty#Bv8nSm(zM?2^0n4r~Pmr|D1YMoDF?C{eiqbW?XiFnTbnw z$Z=VhyQBJIQ3lQ@X7@(8=zu&Ijlxyr05i>1Jibk33yIcr;)0>pVA`!r%ENu+S)G`5 z%M5^+?Ke7r_x!$y;Z`#ZJ$S)X@Z=5Vbj|trzue9-g9qQW{`_&!03N0cT5RuMLMYCC*x?XfNl7&ND@A;)f)zU>*MSlquk6o?w(=e+NB+Sv+oFl=Q9 zPTj}8+lIW=B6BU|Yz&N)(-smSR7@kxANMFhl6&+|AJ&4@?Xw4H68JzZ$~=jo0QHxL zRFNVaIJe(t(P4NoPH1@}tJi(^AiOUyPdtYEkcPWNzORdzzd1}5dlmiXEywOEsUoV&3`TYI^Xw!@;2c{j%v@)HIy@`o*bg}nGabq5!oQD|!N(!n zP#@xtb#c`pzcrw!KX2u}F*sa)rR26H_J8kWRn)3FDDf1e2;*M$zMYst#R%>48hH4eWo+{llvUb)75~ zt|0X1ZJ9gM7z`UiEA!N`!x@-Icp+s^%dP_@1;ahfsJEP5A69vQ{GgN9THN1~tUx}Y z{$o3zGCUIZ_fbNAOliw6;u}>W+|!wLZ2xKrXL8h)UBXG=@@_yPrrQd3oGP}a&rk*B zipJY!^vDmrMRwacbqHSQ)0FH@wTB@dKEJ!h?3jl*ZjyUU3Q`1*xPDn8Kz`xdaz%bY zaHJPLEhudZoPw*#a^}XsPT{WkV9g%vOILa6J}Lm+yu{OdE#x3G_!YLJZ-6d(sJ#3e z4QPZ=XK%0RfC#bcr7x2h6zp1{WcZD~-HmFsyJYNhBYmFYj?l(@UP97*HS%P{ zdLV^1BxW%!c+05RTHhy$y)jpOQ_=6HqHws!7w6{fd>CUk*$G#UADfdT@PWv;Qh{aM zS12F-I?^}J1(~uto)#A1xn{i7^Aev+aRa_U)qm>HwvZL2j6E*5Eec3PAM}&o-8HF< zev2b20nXOvl|X4*Bk**&A_O0KoVC=(4ldua3xqb+K>p*8YA0(2P`{COb6ANTIH{#Q zGae~It6fE#do3C2Je-FI+6|$hoa$a3@=Fs5%zl5JjG(9KnVEkA_5wce5;L%{0E>@> zeVtd)k86BBR2%crAvE(d9b^O>Trtl%B~A<9`k%J%4#51gBGt!hg{<(BxonJRdH{s< z>R(q2k|4n;u4-jj8Kj8z2A=qwD6q3eQaNINGux)vSp<1e2Z+ULMBK~d{@L+0*$$Kh z`Peq|b>OF((kRDS?DPEl$D#;*<1}6#{BN)~Sfos)fKQnK%?IKi#R;f@Hm{hA3i6}{ zn0KpWsTx9pRP@JQZtO`sR?(Y^{=#wM$g$!|?1f)hm?Ui3fUaS?@zyd4#OkI;9<3t3 zXJ<&t^$9!|?QU;h!S|_4wu7r98}d@beC{_|DMMdy!H)HFGO&@(81!Y2GVIq(4`m!z z27(vCts4EC$80tjGlMK)N-nm2F~k&@D!-cEEinS}?AGI>AFzLf=GYNu+yiEnknl6XZ&%Cb~`~pm}NC#)^FJJF0Rlg~&Bss(AlV6X$8;{fX)K zr&&OPWTNKff_e{=-Tu9Acu9hb!bQbF$R#xRL)dt`y%!8)bM`t>3j$-s-y>RVm>V?6 zVwrqm2vz?a|D)(U9I<}eC{9*ZG9t3~-g`Zlz4t6iL>bv3l=#^rL?Nljt|%ELDI}7S z6+)63AyJ6Rd%gca@p!)X_qwlh&gY!xdyD<{L>aHw;1rZ$?)!AO0Y;z~6}p9``>^UC+~o-Kfv8o0n{%O+B3d9&+n~ z#lzUeasRfvv$r*XpF`lEmGTyOL*R5XNiz>azkWMK!EfXZN2;G!IwW8P6~|vV?)?U^ z{t}h6hxd+l)t4`VkVi2X_E_=tJt5GJsr};BZUSNv((IB)RDssM$))WK=8n1?#8hYP zf$0$VUUbti6{m?k)W_Qg*+e7PCFvKFS{}|5$D@fSjIqanLQ~bl z{r@^4P4jv|g$a*#X>xy)*0qo+M+qwkz9 zVv~O{^MwHL4tQ=gy|si*CyEOi$Z>CMRdi{owSqSbT&6a~$h8vHX374j4VuE=s1h)j z%jfddxAG-&{~o-d|3Zhk%@Y$RJl*vmQ@%Q>sT#R>XFoI~@k>H}97AEo4CZxu(pxhU z>_Kf>PgztLd)SUvM7`R?eMGkL-VpMgqa=2cCPVOEK;e8~t6dK$&puOrj_0@ExPlhd zYdv7C8QFGhGl7lE!~!4LHQ~W}M#BYl<2U1ADNZDhKkz7TT#ZLQu!vr6}82%ap+>{=QrmnI^=@QNA7GtATK&wvwne@>9vGcm#2dwDj^U4zkByRn5PBBUuMwxSY0wJPrN%@{1W6$SM4r zNBEX+&IGfBSP|Yld-!nUsPD&h)Z>%GyQ>uJU~zo=@QR`l3{~fSy|if!%c%iUc@pST zaV#-vX4xc|T&=lx)eFF7rs#-I4nGJoQ%@I`iej(#=5{1<>^wj8in=_~f~VEme-5Ay zeueHx@L;(D9B5y2QYFEh_N>A9BLn1-H*h%5Bj1F|-$V3t0Qwz7RhZZXG4K3J@w2Qn z0e)XJn*TFH1b-@s4t=HO0h3wE;zN(IXR+ka(7$y8s5;RFuVTMPz>%=@QGT4mx5H_6 zl93Y`|KdZk8}jB-Lj?W(jIi(2n*Ijq79q~==IOM=S%Of7vTkUHG1O!lKR3K<1zO)b z#D0f5qHeuk#+!is6Pgh-J@c5u99yiJMvmgxVF$_dW7x|ya#3L%zpqQiAFui;D&o8{ z-#{HmfN6!^+Eh7l@a?Z2`HcD}>u!wFIY(^}%9C3*tJk&6s0#OCR$WU)zU;9w3Lu&Dcd3@6(>^ zP8Sv)n!($<*?Dhj*+KL9pDXt!@%!2NS2@~H8L9?)n~vk>pL;Q#l2}p%4yb)m+OIH$ zzvA1=o^`hH^?c)?`dVy-CDf=Ny*dUXjQyb8RP0FYQ z`!WC$Z@!`!YvgG&a=sh9D+l|%F;7hH;U4Iw@WD!HBj}Qda9!}me)`7@oHO|OiMhn(ANH;f~Zshd%9z6$Hi>nStOw_KpaN$%6_RJp8^XoBBKuQZ$dCIu{AmC7VTf_@ zvzBwh{pbyT>WSy#@RG@%&yxw?Gp^+`k-QdQV9_oN=m_=vDZZXDmceeSdy*~)9Ar1?fE3$ zIT3i6#S>z$!2!9K2jm+kO@XKBC&eiyN1%Q;l3I332xcD1D3fFVFnT9uzj0ZC+)*H# zbvH+zdHYK3F79KLsWWGK0mQ!MYSUdt9fE97`_^egCxNVS2~k{^#g*P_mNpKUH(PYO60 z+QJ-rlz|~c>*@4a6G#X%OVi8JhMx1aEyUW|@QziN<^=k=o!(IR2I8LM?X7L!&MH1g z%Q#_Uam4~+6mvfG;W=1N)aiLVnit~L`b(qG_pvY#cZbE+943W#DPkyCfpEa@Kc`+R zn29dsb1F3gA(^47kLzMU@XN1ajMhY-N6F-Y>jI#pHe%iHj=i68_t$sysX>HU;#1N+ z%nzqNX8r8J1j7xk0h}dTFz(a3k;#KOxa7zE93JQco$Mn&Nka;i7qZL49dV!WZJXRU zSQWZ|+kAH9lZV#{MQkz80Y*rIzx!Yx#^mF}`6<5Ya5OBgHuSbFxVv83lmpxkN2ae& zBgf4q{=b*8gO;$Ica2Y#U<+#9{(h@dy6~Wl-+~?Qxg!P-Jrax5!C2#~U~LTYn@#L( zQs%I~)4%*cFLLopPfa)+XV-=13qP97aZmLrG>^Lf6y{COUnNy-v4ZowiIsDF=%ZO7 zJ6uZ+(0Hq=O;t%1$`5QW9!4MYtE%_g%2C{4QuKAyTEGTGL~I{zWn(|4ZuIuKYASfb zFmv};jtzY9AUm2*guON{-^CZQX9$*V^TZh1(K2Dzw#zzWIj z2Fx$r`B^N@Lku&Mkljonwr z$rm&SR@&*z>r%+=^3VBN+p7k2jdyG1FWQ2uxMs$;gLc54tPzooxtNTB`A-S!cyD_% z_0#yE85}Qnplw?)gJRv&%}&lH;8D}6{RMTQbLy4qhiC18fktb|4d*lGs+%G<$ctI* ztbh6ZgDqIkzr4sGZ3*IRdnsH^0DWEb+nHk74B#4 zDm}uCPel;7L1wAU_Iz@Tzd*YMRJA1g=fes&%5m|8LR?+UzpA$bt!;DtH2G$1pP{n1x{LwT~>lc(c6_p zM27HAk71HBP#t=iVy;u%#CuDtgZ{6BsJEybPl|m<51dDtUX`q)?%XaTJBa?n)Tpk3 z^#siMeZ1);k9mfdj?#Ag_ek`5QiL8#8(uo5RktS>sPm0sRJ(}dir%yPggOGth`W329}hk zk3MR!1bYH?P9~E+s4L#O|CwM9oNsgPFj3k={wE%FCFF6B6-cpCP8xygu^0Jcm!;q~ z)l5cumIL}}jxFX)Xo2m$@)x8#mT>Lyr>0eTC8#$fO8H%F42_R9k2i*(fBgj`#TiLU z@NCFASLSE~Q(A2TS@!rnqINNOU!Vm;R4ux_rAm-mT^JCF+;^T1J+_yXJ--{708)S$-QoM}LOAqdE#e`qi^`fdx6TNRjPE zo!ME*e18@j^XFA7xv73%S;2Vzx^I9-D(dpcV};N z-9jI`{+aZGYZ~zI=3>>kEIjAe56yre=1ETLo3}Q}VZKZh0IpM;>O&ZAh?mr{`7WbLuoF`?jo5Sr;rzvmr6U@ZlNVdiIY?TbD z|IJUxiMD#B^B;cyG91NH%LpTcwA_^!5Dj`@edV~OZX)im(3~iy#U0yx!jRO>a;Z109QiI5E2dJ{RE#Z^if6aoC zCNR&Jn|d4laqT}Z)E&35f~79))${mXQtjM+&#J)$)|uIPb<&tKJRU{OEMyIL_{+!H zO))>?m6%$QhI2<$Xul}cQTTVq;&>P8po`Z}b5|GW!cjM(LAM|_0IJ@Lce1__!iV%@ z%&|{I=M(3=ni=*9irc)Fi8O;a`^TDN1L&JJY96PnwF04{y$Rxn*i)2bpzn1S-!pn~ zH^}h3I2SESsK8z#^7Fa>{cJV_;#&qQye-=B#qPDu3hH-4k+Ny?Gm0RyV61AATe z9}8`6+5>MCF(d7U8K|b!xKPevZ*EK}6XmoYv|MC`n2=TL9aeX2n z7H%FbBcly5+-qbksCO>PNu>q^pw6KBFmc$x03<`3`4o;B!S2yUjjA@KXQYJL(1@$Z5{glo-JKWJ8P1ePPtwm_C(L7FmFQ_QY0X z2|pBdYo!h1K1D?2RrR}4188n_wjam701w^g3qFsHz;3JT$rf^{9w{4C{rhJQ6XFaz zVdyU^8_2Kst^Pr1I+NPVnrjLZ3kS&#sjd-N^hGRuj|sqNh`R?T-h*rwBQ7ltsDs48 z>2o%H4v@$^D{|7_0BWDk{CO*joLy+N?8AJDL=Sn&X?zat;>BL@;eDjwoo3&MDHG_s zKlFx%9Q_BAX9aEIb)X{f%w9f`Dl{GoRTa*2gtu2*yP}`#0a3F?^99TY5wos4>yp?& zo0CwjfuRE!W!o%o&>6zz-0@#z7*I)b8wYNxNJ z3@Cb8uS@MAe@V!nuw0C}{Ici2ccsmsq3On9l4pw0SgO(Fv5eo}DcfEeTz<&FsMWHiCa4&0OLq0UF10NKVYBMRB;MI_+%xx6~;BDdiMWKT^{lky_ zzCFZwg8yXPD=kytKQ!amWsm-l7TYIE z8=lqWh&{zjZz;&Dxj-f1rrLohZ6GSzXkNwNv&`G)6ySIj-sc?J@1hNXg=z%~V)`({ z-+lcpnGNz8K9CKD$U{Flh0q@b1K@e`fRUO7d!Ap^NGT_p19y%0oI9}z{I2g*aX)1T zR~MCs^3k91_psF*%LhZSP4JgW+21FWb=>{XjXo-6Ro3(I;%e|wmef?ap8$SRsT<75 z-}7{P8tcA=eluR-IniNj;N0(ilWb)H;lVqXRPWottd_9pNqml;g&ie6gub(|&!6qT z?Z`sdOMiy$OaM7~9sMy*{{F%NGMLBW*FQTVfcFlq z*?6uK7U*X=d98857B5Rajr{pLeQ%nd zyi~)vrl^hZ&j>Oe4vBDs#hb--e59B$xr(b6zyd0B*?a2$=iZu>kQ8w9IYiI-_wQM_K6`JrP zYq`icP6w(+H;;u`+5>5%>)9umJLjPr6u8Q10>uMk>fBs>;461;ES63O#1rK*7f_d> z+l-evbRN%p?~s+bP-UpOE8p%{W(PaTbL_-C*q3Q}?Zg`z^uhG5o>dc4g4zBSWoB11 z{64L{ClAGaOq~^(RInD5zC3Yi(-eJU+##t@avOIOzW5c*g0)JsBN-@#kFtdgRu@E$ZC778K3LZ1OKsp zowNu4`DRige9yY;CCpn2;GRe0#rHp)77)0{SH@Q_4WnPvmP5Rhp@Ae?CU#L2h@1;0 z&&A5XSa0@qPULf)pbCwiK)s&rwWizu=eHZpHfM@-FbB-b{@@qxZQfO!)Li)^3p-bJ zyd$+aKxTwdvNzraQZ&82W4^FKT8Jel;iwJRlRU1-`NRm!Yqcg8e#hW}xL&U_=Gb;J zzEAwW-_WtdUR~rrOJLkew;)3ffUNz(#dYME*q^=X@Ev*mi(v(Z2h#1~D8tO)Q&B7I zfza^1IiUbA4vq6Oq0j#P$vcMUko)3Idyp9AC2$nAqpu$Un5BAi$uHU(yxEr;8Fb8{ zzio7v#8?0VhF&%i1)>j)%5#dY44(&GX0w|SIv{BoVEhU1vqqmD3{K@A1b*3t#_x@S zkP+t|HzI}kmLOfyKp{uC%l|6h&+!<MnUhZy z@+du;{h09lIL#fFboG=4P@j1IkJ_U~E)v43sXvvN`{(h71tO+~oTCvZtXyOezpbDK7E zyfhW|@J6^U=9+{Z*zlY5JWF!`bpivef};xDw=r0Zh(wN)4cD?jiu7r27)P4C9+Lzz%YnrLuyM1dz@v2LqFSr;&adOtvYoOJ0kAEw1#~x z$9tzP$s@n)O3ACEHn!j#?S3W2(-zE0jl-Dvv9D6}qx#91O~Sw6?LoCm#e`MW;w4cE zoUcYtrBlrE!NixU=N=mTknMCuIY=CJ>RY6p!5@x*Rq2b^VNz4@JvG3akYfUt(`F27 zX4>#_VlY2S5$A93%LJ8Y*eiCUdeZg)?pY#&v_hB-!2MEDWIpYFC_qj*LxA2!0>`wj> zGTgJq{;mnyi{Ff3^v_wd(4&^{eDUNFwOmDbrTk5k=`tC_>7^|1ZplLJ6zEql-! zt5Q9|%mc$JnFZYMP(QQ0?Q+b_2Bxc65+-!8-z3QSi4^X!Q}wIc_`Vpz`LZG+BJ>Lu zNwg`)6)Qlrq>THsZ%VLM)WA1$$pAi4|5Cq!IZSO4+bLO1YfwKMS1^S7$P=$$LHRh( zI*q;|K4pn$cMfbk=n-7B{88DY9!oH(i01Pl zQwMvm$Aa`scz#Pb*WZ`_OQ7~&6xu&%2~?hO$8&E}!_9sn!mB=cSU$A78`2{OYd6Xt zKWy12I7@MD)HI_Hq>_LSZ(KjH;}*q{$vcQBvg_@Y=D^IaB+eE+^()_}b3#kd;OK}7`x z2MlQ};rla_Gz;X&?tT^2=uxwUCQtI&r5)S@wz$nF*4sjR6T^PNhz;;mHgvNVS%Qkq zl{@U{=h<4@IA(B0^8bFqM)MoY;Kyt;A=G0H_N)Ao0VZ0wk5r=Fj+6spe~QLXVO=O? zd=cZppbsH~^DX+Pl_7yVb6|`g{jWs-2+62(WmaE2xI@)XsNLTuQJ!@KwaMq)yo_2v zaaQW!>)K-=T7BR~dawkLeT?r&zvc+VL@dKj=~mE7a7s?Oi(ELuS$d^V^x;!79!suM z1Hb!3ZR$eUSKJ%?-RdLu?-Yk{THt%FBf?pD@F?n*e_Rdn@cYq0^}fUv?-g1VRCBEj zs7urxc^_h8iTQ<{Z$JN;!i&k;@VF0l*prxZ#b(VCZi?-f`ZDQ(+kgA+k}}BYDw3mO zMBZhXgn4^Yqz!0te6Z8Uy*N9USM~wSJvT)0ub4>KgC>)rD3ZqrX^wPGKarQre7fMw zgWH(9U}52ol~Dv!MXfZOemhWFWSgDGd2QRnhC&MYcIh!aey5DkSN3stL;jowocrCc zRU>5qf-%vYi@!1Ndm_Pf*${IgGj%L>%a~7hvzfhx{j*Qmi>W5HjG%VzUjv1U2F(88 zZSuzZ*+HK`-9hB6Ci|%p(@@z1$5JkVD_sP_5{^y=&RRj)odSlq9(LII+WnB47~i`t zr^jH=2>$E1B^6j}iM;=O7whn`8^B7uJ7*%}6c9vbX}%WWF?S%|)F(tAcm;mBvc9VgT1paP#s zX>_%UkY`Jt>pVd)f-_3WW4>YN^J3eA%d8r3Co{7q5cSIYBBD2cYTJXMAdlh(5pqdi zalT{0{f?r8r{|qg~ufJz1^)#&!)unkpnR|(eH&lfrZcFw-q(u#SfAGxF@XW z^XBZEGgpAz-V;aHS@HbdQV|tY#@<1XX5KeKxQE$$9uwhX1ZxFP#eWcE&!-t(552Dj z9J-yicI`Flm{08jUkRwf&3gv4qGrw}g!-|_uzk|GODZtfPcI!Ys|N?iKFv#g z)rV=TvS^CM6H`b!SwqqwtOu)O{P)K#gdx#?Z{tU<4op3onHDG427&i# zCT{;>|7-olA9Xi)Afhrz>?+PJosyS*J&=!~bX;rpJG&j|+9-*9(G-Jcu?xbD6nM|~ z3OV!){k?h4O&)g!WI>@b%Fo5$2uzZ?#=o(fqaQYZbf*fr(8`g4Awq&s-gHxH-rF2L z+_CVTeyWFl((gZn6&&FEL*s`f7abwre(Nab7XuJ>7&T0zog^fmY+LK3z~}jx3qR=_ z%t0}EY6L2wF1?;Xq;=gA6kOb&C|k(DdIW>0L;&_lXw7(3p`ZPYx#~Ip^ZHQgHpBG# z3;N8TUrjU#u!0D(VLnsjPnz#pZ)G93^t2rLE*Ci^9I#>!`h{H0JH&jRgR{!u<|d{8 zx(t1A=EKb$;+VI}^e;_Co$j(n#Id)d$Scx)ecu7^g&iyut|Pdgf4w(K*|bXmOw?@$ zXgshF$Xht-J^EGbH$I=OcebT7cCdS4 zbTxohAN*bO&IRD}Wp0yA=e}bPr=~9NH}@i6^GfW%A=F2in6hN9W?=8Z+SgBMnD5ec zC8^k3Vuetv?1>~g^z~g;Wu4!(hrjn|s@1>ad`Qb{XR;y#z7vMrBNTQpxN$mWj350p ziQ!S!*;ep`uzp-o{wUDh(^o?->xmoya3wvUjX z{KhNpzee;0tXLc!5XXB=t&pRBr<@jO|55pUAM?v5o5Qol*ZJYG2&t+e`V{^eO|#kK zTy7Bl)VG7#623+nu0+UV&xl`IqoJ!MRG$yAE6X7O%MVfu_hx;}uRH&G+h_|K78&(i z!+4*6bLI6bI^;ft1&efHUeWoV1!*?=sR;75M>q;GM`7PDY>d8{%i`TJ(zB-Ev+ZSG z$b`H{-Fty&?Cc<{&&9_abAyn6D=?5w8}zNaw@KS=L2A3)P)z{+Qaxtra|_rn)pWla z#yDYRJejtj$q|w|N)NJfBWJbyZENmfO~}qYE^2lgd9s&0?L*H|gXq;mb+X@tVM-@v zD&aIUh{rW~sh{G4&PV<;1z8p_e)6G;0P0*fMq}d53>3h*@1zr(s2rTJXr7nu$~%Tj+g!glj7w`CWO1ir?gvP>;;Ha%IRKtQo|NIjGG* z;sc%P_iab`PFkq)A79wlR@UYs6cnkeF8^^LT1)iwDHNpSnCDSyaisvgg zS+xvACTbnbJBj{lultsgajLNYUi{z{^tC!`33XBx^TXOid-rcTWtdVb?hs=(1y)lR z)7LF#u=P(woC|wWB;6#%7LEc~dVI}$ihRz7uD0Fb$70y0zM|g|DhVe^--UbQb24OC zXPZc72Ei{IpywndryKM(IhAG7!)u=<&T7=P&ZGG$ka6hrHtO$A>camVw0f_IY%?z93 zUNL;3I9E;qHviO}pIO8{G-cHflU=%y+h}txw^$BJn%xzHU&_J7d@4Z)7Yo>nVw{|P z#|N9TO?TL(b;0LmG*cr744}F6J>Q00Q z9XjFf`Qcl^z#R)FOUPw#sO0{MJe0w(vg`QV#ER-}-E}kpx!z*)xd;b1_?UmJ9l3>{ zXuIZpPBVbu*xO2Se1GsTKC^hqZUpB1rkC^b@Lr-jw#kG3)TP7alY)7;C&QLA2nxW>wrDvxz}>JKN4ZS);xTEyn-8=oUIsaQI|;Cr#sW0 zpa^b$?#txt%J5Wchia{#51b!3%W9s%{oljm?oB78K``rN(uLQOaJH^9+2)2WR5$h< zs#`UMe}h9^Yn(g~Z@k4*iSIuqk6nRyUrl(?fAQgE(nW%B-;=`Y7lfdtHO;y)!2sIc z*Dlg$nu6auQI!PrS?3xjOIm+Lj^Hsi0cr*8y*vJ+LP{CA(zS+{i9s6**YqwKGGN{{ z>IA)r3;Msy(+ZA+VQ;O%iR9}9IfxWcdc}0Y6vSzlGvEAifE45Gn+??Z;CtpC%Qp`P z`03KC`J$N{DrrQ|g-+Xp)OU-=byXrTNG{Ya6pH$+mf{MPfiXzrn;dEB)PX~{I$!Oh zf1i}{lnzgzB^+FKq?Rc}J`1_z#`axGxLvkPRw~a6?#B0PbCLg@v?^g-VTC?CoAC3$ zx3Q15ka{c|dqfzbf7uw@GlKOIZka*s+vU%-8mbS(J{04D-xiIIFl*j-!)^$BbMHMp z6p8cX{w~|s%j1r4L`3DQkGKU~>iDB6ylV#)>r;n+w^Me=|95i zubiclRu%Y`8z+4Ekr6ZwJ|(85SBDO|bBzbdOkvdbd|!?L_UhPOo*(y6gyzor%_T1d z%q1TTQb*t6QVp@I+MF`ztxykYV4v6R=}taPQPih0o-VJRri7dHo7=-oa^Sh$p;mx8 zWX;1i_CLsLwUk&5euVd!W3L8ZT_!aHs+;9AqeGg&eeKJAiubhOraCvTyo`C>vS{i9 znwIeN(TW~*Em$bu03?8`?>~n#J74jgC1P=aq0*;f%!dG`Z3meQy>VhM7Jp@LK2Jo zHDUA>d{{iqHMXb-g&}5Z$AYauqwzI~o}?Mvna>(}g?`9K%wL$g3-BI!jHhZnb-cXF^d=)=2fy2s;eK_x+DiNxonEkr)6Lz|B+hURXJ!+^)F-eRfdD7y8RaQkn5*@BG91B z80hpXj`>rV0k5kOdkprRFiYLc+3~P~?Mp{EyfBBHI2`%?%ykP8eAZp<)LY=|}D_64<8{^Euq*3ba z`9$2SDsKM#R*XGa@y`U8>yb;_Ra-TIb1oxeb$F+XEigPhq04pz`-l$iCTRV`9?P2}Q9IY|cYqJxk(Olr+|dE$`$QH6$ZJdI ziaakHE&#FA?lZP|x!@=Z$j6oHcln(=k$Fu7yw8j^@H=?3;GF<#0km7zF4~_^V;g zCi=xrT;`q@@cS-1P0LF_GRd#a-8Fmgc*H91eIE0@=fjWI?CV3xpP_|OI%)WC@D-`; zYxKLGW}h`<5`>PI9n$=94p3-xd3E#$?ny5mov0$g-b<3ZKkv4RLLJ}y?JL+1s1zC= zTVC!6^-udr*~9dq;^8IPo@SimCNj*kFc&^XrA9 z*@i|NsINNsvi>WRhZOGDIhlC*c(iMp^rW_frP@6){rlc$_I zF-OP3AbUhe8#IzQ5>!|mz$s%{@+k7`+cXOsd$#Q04?llJZihawiUi57GGqQP^o=V;hz zM(kiS^=xTNzX~+nIKq-SWCEqB+&}zP2vE->6_X`>1XeG!92)I1h2Yb*ktX$yFwYt= z7A}AV@eZw(7y9(!3lFOhBa<~ODRC{TZrI?t;_~u03Ffuky_~AtwZJ7UiSXOyGvS%+ zP?(Pf?!&CoTS8^cfp(iT$0i7Q=7FSZn-f+rOffY!g6CdPu#EJzZEG+$NQ@_Eb^uPv zV&=m|U4&FVwvTtiq~QHb=-KW_JD4!*6gd`){VEP$Dii;qFMu|y%e)!$3jWF?y1R0a zFmh>eIZ6l29LH|mNs&SS1DlZ2Brm*YKLUrh?Lj%E((9VZ2%+JWNYt+>23VlBim6}W zfWJys^2wN6TGx#2wnQDR@4;!y;(SB!%f93KoZKGVd*?WXP`5B>cMY}tX#@HWzINgZ z{Lt>NWoG-v45TAG+HHEsK=cs_&96z^!v@|`)8Dd!m;rIGcioszP7Wm0Bd?=7lOxrk zSRM1j?^~`+NkhwE%*ER)0^s9(bwUg0(Wr8{%@lGb_~}GHqnaiQQNNFWplRm^d6Hai zmIu0UO3#gB9rd7G)}h8RAsToR5ahp9rVb-f3%%yzHZbfxrBg$P{>_lUfcr5cmB6+D~z1_oY#iq)At;~XeHFkcftl1g^s8JW5zV?p(H4*ML#{TQ=`pgbINAli^ zV{Z5U+c~ABUk-5hQ=Tq~z7nu)xzF)nUNp<($Z`d%0JLu`_a(is1Jj^&W0fvV@D4i9 zHr#6m!JArFrjT3t=hf)3v-li2T%!@>Wkg>8A}?2X zHZY>lhx@oeo2&ZvxlV?jz`9>9nXg3s}v=D%N zT}C-06!QZwrtjZF9ySw8bz=bf#Nw|HtF+aaLe3GH?~rK+*2ZUR>Kl+tobiU#7=0iO zsr&fhYql^r=VQ}=`;wmCdja;=X5g1x=y~#j0Tc~4Ek8bi z_v5(7Z(EX7fI?$%n)JZtFwIBy1;Fn8DTrlqaQu?Q@%f*pzX&f+e z3OQg|K2yK$v{{2w_$T_U20pke>RI{O$N(;%VgFMdZ37myy=3nU%%RQH;F-muIjH&W zUVNe~2ZKV3%lb6(&@7SF$Zw9EC?T&K9WP8Ff2e_;Gk^rHUx|JCWq<>gh+bwo&mRLP zm9Fr1!iZRd=GWf@b7%3lmLP=#MHCTQdiZkBODNZ89+8Qf9)mCj=YbhfQsf zqkQl3y9-4)H`edO_s?#i9>96)8_AvsNbt#Xs{Oy;YrFajkq$4YJi2R`ja;bse=}pQ z$g4V4W$#irp$l93!?*rJ-&gykzdS_(rtq9izw0L@@@RWr9&2K@hN3W*$H6QHu)!yr z8&|>uy*%mRYdSbLxcd^*c%g5gj`iiaMm^BiPFFAKM?E=S>Pd+^-XCh2HSQo+>neq= zw7Zok81a*<-uA}4J{@^nmw+u?Wv)%MIIjcwQa-1brlepmoscE2BnO|;z^aMX5i*Y1 zkLtg$2dY@^K2mK_&@pFjy@UR(EcR6u?`!%HbA0PenJ(`4R3FT-;(n=#d_tlTdoe^P z=Xn`SOkn>2vkuRO8hm=M&_#r~joJ6ZFB9;5=k6>B%fd-Iz+64<*Zzg8y}jrob0 z@H6)S_sVmZ)7f5t75ax)w4I%B?*h~u1l%{>^L}nVrlf=Ze*S-2YK|~K`BAuQUJ356 z`FfFpC`4NncDrsGLcWBQInx0J*ed5PJXvTCql$l=>QpR|E1-1wG3sYJvu9p~@>oL; z8+mMYz7eR`-TqoMtpp>Z{hz0KltH+7Z{_%RO&I5CIx9b90UI};tTbXj%J&|2n#0Js z4$9b(4V6=YyuNFk;Ud^WeREMQr(XiXKfk)g!z>5PSakUDF#0Uq`ojyKDnO{9TX$p~ zH?XPONk#2pUpKD8XMZ3U>YOpVDf7a>0FKTnkAPn;!Nur4@bsDFtQstb)yM zVvmQl)5(RyYS8LOeo6uN$rUOK?e!ORfJ0wD(YhFYU=?o}955&UglKgm!QBc{&lP|4 z@->9Azgi#fGx5ViZu*wZ*LEN%@jd2Usu;9g5IwmCvT*C++UuPHS)jV7wqSyDlv0Ai zuRqy%UgsZKVa$*LkHV!1-y$8s$XI4BE#}Br;$7qSw{}T9r{JSiB%mNm=_2<=lB;n?XXWt1A z9Kfr3|M+v%x$MvMeiN%iKe$r#hgHmxvMWxfcz@J~KbhkZE~2={my@--vVwkDwzgkh zKe2x)*yCygoe(tDwfS6rtp@?R=^v>BaF6)?Th>;y9i075vv=3%Am)HC@$_iOz*U2` zh*3&oNIXBima8EFuZO%ybIf&t&81-6JWd_PiQN%R*=qxUEmItE`{P2i1+Y;UrxTp)+oi`mJTa>8optB_Q z4%WNxDxpu0qwvH3`Hlz6wVm>E)j+$?r6B1!J?xG~-28*ODOb_pwr4)>sh!V`@{3x7 zC$DpHVvsEu#tgJC#+iZSvv&iR8<5YQ?eyUqvp$@uE04_LkOd_U@R4kX^}SQ)v}JJ{KA}h)hXh`FAadzK)~%w znK{@$8n>~;@6EdDZ$Wa*-Ktj<6^$YPwj@7u$YRYJN{ruLA;bOX+WTXRd3Zk)Zw>HZ zPnstL@a?!v5(DIIB;_|AKn~hpzN=a!;^-sGYWhSA5aa*j=qH^2`+o$m%huq2@-ws7 znQY`3nfo<%&I4R|JScDu{Tme`r-wcD)j^eWygEyd7q+a+dknPf!BTUtoqQhsinMK| zW>$DE8olta%GQA8h=JM6aTE9(ZDDjs8vPOjjLzAX*mv(&{D!1h15(f4sx?GjkBsJW zRY|4@ygcEOq%p1y-J3shLmt_|bEk(s-hIjt`$>}c#Do|`(S|FUoRxuqO4g2x|Lqb^ zWi@Ab|8;<LP`zHjy$46F6xh$ce>y5yp$9hog!@5-^{{OkuSvPe`8FEW3TjxH> z!-c84^|G{jz;R2deHY*BtQ1Bbmez*g7_`@-*|ba8zjDmJ6S@EGW+K|0cu4V_Jou+h zUj@>bBaCD)2Py2P8Mf_)9OQ>aZ%>`mg)!p;Cw|0WzpW})`)-{)q><~j46rJK@#Vbb zl8eZv((4^e?M0sK74zqPR;qAXEk1%HUKjITF1MzN9ih31*Q)Iia(4dcUfE3BB(S|O zm^&AMdqo+A(BHF$a8Nj7w4+7|Qap5aoAEsox!;*jhg^)Eo84if!j52-F@EQYoE1oQ zrqPT4(1IPYPaHRubzu79t&rD}xc|TGMDy1TF*2 zJzO_5XxhAN2|SNX-D=TaDoo)i^XsWJkf`4^IGv&o6U>UX_uCBNo94fJu8wAqcyImF zJJkJdDb<~I!#P}0-G;9<*$&>7Q>SF%`(&E=G?Vz61$0D{n~Q1UoPBgX?zh15c%I(~6ZzhBP9HoB)fyIMFsDSj;V_u^n^1f& zc5?Ei5NP}~lCzP(?|)wU#0~6U;mMtuEM2w++X^K}&rkrKe4-Ou|Dn%$=+!?e10rbp z&0BX7^?Szon%`8qI8Pp~ye*IS{om0;Q2804zV+2o0nUpGzpS4z-4ca;-I=>+@`OpM zFRtD;M#$31 zind7~kT4(yT{?k`3FK4h^0Oz&)o4TdK+VI6O%qU(AdtIfSORBXbDN!s0T@}kacY0Z z|L<-27b_MaST_HoGpT6{aZQuVVz`HSa)#rK&kPSF_W0Du=Gy~<_5ERKeG_Pp@^z@e z``NMB++_ZFd0=>&)cQx38y;{3Ggl`e2l%k)^hPr&NNvjHOs4^~?vXqaJRt?%?{bcg zuC5an_kV6)9W0aU$3leD66{2IC%PlF$cQ_-^B#72Fw+vCu6OfpFFyaupvZ?D<#~ z>UXt*17sGCHZDvsr`;%$PK&ve`=y7pktb}oGj6aK=Z8-mo>Pxnbl^8{|MF^z6I3OO z>1~`6glOCKHwGgVP+%%~+Tr#gnEbIdZiGG0C%!(hiTm3@_)a6W$3R8`(zxCSpYX7R ztKBaiI4s)3p(0sE&t>ePX=5(CI%EsK9e>};mdCsrOIgzY`H>D|Hubev@Lpfe?{s7r z{iCMYrdKzup}KxpETj>6o+Pb>!0*V3r&MT=#r>Gvy~5)iOvv4`Y2R65;Q^g8(aX#H zwvgT%c6uB2C^?mnFCX92gBwoqRkGTclgjTJbv|W+y2-C2o$rm{_z|%YSE3q_pZDzi z<}VEjrHkJPo0#9RRmx99eJ%?6YkGZE;XYMrP|FP>OpJG$EZ{y*K7r=$^cQN#*gwqg z`c)afe}iJ8nu_4iG_3v{dHZ$&Ke^VQp}%N;iQ3_T9eht8>E7N)gsAa-{|b;pW1hI` zQu9j?M$QE4+l9))#D=z{;ha6JzvH$T#`lSw{v(Y9?g!Nwn}_U*alcWqcCyl#1gDDj z51-2u0QPuDGriyheRPX8i|e=_$$isek9&u9s|ev{5#&CfO8WOC*#UUc1}|yi9+M_= z@xj;-`jP#Zo6LJu;6=h@3rC9a*+dY0s8Fhg{F~u*IoFEo>z_jwR1LR*m9^bjg z7Lw|A?2nd{pz5x1ja{!59MXB|HGV=3QohJKXEbntzlS|Z{;?xy-?Dx^MqvSJMH2ox zfr5be)JUd8^keKUoji&6mXy;1MsE`wp}8%wc%I)JinKrMFw}DZgHL%-_A_JnkW7lQ z=@p0hjl&+?`;iB1)m`_8RtJtryuJ9K-T}faFIf2-p?=iO&9V000TR|YN3A!sz{)(R zE+6-y8L=OvlHZ`ev{bdpNmLl3t`)3N_!@&`dQxJ&FY?!4=Nn$eyt=sHLG`ag*6^w! znye+s7RH)2z6Lvr!Ij+0-_O!uUXHJa**KI9>{;&Du@0I*#H%;Q%S?H})wAMV6uzgk z-=$wEVqWP}XNp9rt|}z|JagsK+5zb4^>I(a=fIjLl0^^mL#|~~uT__v;ifCsCu!V& zL-u2>7ixH(>v^+9px*VPcSrH><3lh_>v=oh+yO=({m9`;H--yBOcKwu?O`$Ch=L*R zKcch0XfR4Uqu=ve#{hEY?k8!rY?M2~ua`aPW?=^YrGLg>4XS1on#Lk=57*XZ|MH8!|2 zV$rx1BnnjV4V(8llps4&=7nwp=D}&DCi+YSAklPB@Zm%%u>Qe2ByD928<%s7OFj{y zsVA{7XP-H|NIT^eULuA)?sPRH=M-V`)nw>iJkQ=UP*?n`MSX`duP`$J_i5Zgbc(My z!G`|e((P<|NQ-#GL-Tsds_?_v z%mwJD@=J`kg}slfyHVo45-{_sN#zm29<={`4L1C01B_$gWXJ9~L&6cZ*c1Ur@YkH9 zs9Hfzoo}LVf*Iy}Sj@yHXNV9iOMfz!&k3k1XsVKq;$Go+i+vF4^9+e}jXHw_Xqx%K zlkaZ={{Qt)vG9%)O2ILTd2Ub@^^nmMwHu z74JDirVg#%DI^)3E6?txvc@09T+I2;?i6M(bQW?zZczMsgL?oC7s1(VA>>MZj9JRW=l0DS)lGh! z+c~2R$CW->!%^1P`}`_wf$vq!mtoXjyVeF5B9W8FP^Cz<(I5ny{)ujaI@t3t;FzzW zWClWMFU?Q%W1iD=-Xd+p9`>s2P8!Lezc|Z^-mTOWzJ2<_*3=;gt#_W+uNtGS-8k|` z&`|`A@uhPn5G)|8s7{`Q{K<{W_bchJ&xW1V|B06NA)uQ|`83dnbFOy(7ec%ZBn0k! z{_Q3SH0Z%G6J>_`)a>2bh4_8@nfS7b*$&PPRvbSPf!sakuQdnS=Ls(y&iOrM#DC|t z9@dpdgw31hm2=A!pnF8VUaY_w3h4e`wSA!iCw5CMH#i;Ocbkwn1n-}P~{#-ErsRHL6 zx8C)xVE>57WNzDK^cPuP@Ao@t1qn0bS~bP?@Nn9~_6_D#xuObWSa9x}I6;KcgY}=A_7E^{;czZi10D`jC#CYp08>1JLQ6XX5_VvtZDg3!Y7ZK*wf9V z1f}(pX9f9`AY>~h$`6{^S&;(3h&yv!v z=)&*B?x<9JmffDa{TJ;<3$>dO*#ZoPV0hzG%!dYLFmw|n8rfl=*df_IEw!6@C+_S)M=|csClgJ=s}{Q@Oo*xJ^XsD zb6WQ;6a4p{>>nle5=*>Yv^GaB?H=xrjZEK-!B3l6^mqhv0ZnCvi;)}r#x-{5h5`03 z2unS9jq|Ogw5QD>^;cW+(t)$}9{-Lk;rlgKn zl_(^{9KX=8t>2Z$SEVzap91cCQyN%V05H@#j=1U(l7r}tySE<`hk zW%zW!l;m(N1ZhWS+0rWy)I z*qfMdGuNpHGM8-l`mx_sIx{M@U{e@44CLMZsM^3+7P7_mHXY=aP{y`hHAa81*e$Yr z9X$W*zu0*a;fmWd)sHP_m~bcR-q}_Mz7R|GRx?F-f0l1ru+JIdBc~bJ?#n`^y}Y`G zG3uJ;)>oOZ=gs+M#SS;-FmGQC6!;Ni3k@Nslo}Wvq0LM4Vnmk`bW=S1@d9~tXGMnP z$}ZU;zexHx69)j_#Dd}!>O~(|gN!4|M1i&MSk>gFB3w+_SyG=ghlLjet({mSxas&{ zukbk;usYHi*w$hVk?)fCaSNlq!?&`!yloF>LteuRZz4?1eO*6u(F$%{NRVjU&kWU# z(d-YW^`PVX@--~0g`n=BqSbIUILLjrPD|4n&xH-@rEc^O1fNuXIUoaTvG2DVaPIcV zI=oK?^ZseKh#suC&$i)G+~kf$E+pHKP0=4moZnZ@scz$U;K-$p3_daB#ShmNS>Sv7 z=-kDK7UUcVpBTF4hUf9=`f*)R1@JoKn)J>Z{jL*QS7TQ7z;bVITF_bap^`kz9r3?^ zV8Ycuyv`2EruP_$G-y^+)?!6l!tLVV963a%T*G zj}Ly=lfZy;JJf8_x70aK)Wh||IS9Alt!0rF+0&aMkG&lrL8L_c$HJ`Xtj6#liA z-~he(8fqVkP2iuWy4;z^L|{3iw2$|?F}RT8*5gmx!7NqIm#ee3P<_dHvriiJ9#tb+ z`?Dr6ej@nGP!IN)m$PIqV7_W^+Q#*hUC1NpCTOyGB6l(W_*^>vo}-xGROEW@61vFF z&`f{P2URB9m|S^FnEG(&=%rZP?Hnk-%tb!Kbr9QFQ)KaD5+_-0q<9Lxk80)aX;>UIf8Q^?w13?ggF^O}+ zux+9z>_)`7)cZO;gQgVxZFujTR^SMIQ3ZF$g^ZC``X~(|u&>BMRN{4wE=<2XOKQKV z0b7r|uNcpm;P<4DS_BVilZ&=^&YeQIQ=S59$u~0<-O9vo|_In?c;w9pt5Z~ zmdBigeWfP|=OU2n_r%RivD6$6Q43j(q7S^Q?|FTyHu4;WI6X>O@wqlFj58nH55I$t zw`uf};QENcuqPEhFY^x=&2jHcFC6EbY_AJ9OD-HedY=TL*L{0O{n2mKEb2Loe2q!} z5gfJD;dDQ*J2@>sDCAyB<@kyBHLZmw!&3Nn5LuA^I*Hs|7rP&CABbbWa(Y=Y3;L$( z(fDZM4DVFEs&nFyvuPV`8ODbF?kqEzs-=$bHvH$)DNFQ~`E?4NeTclR(?hfO!m+Pn z{K~H)2UAd!bETW5P=~RiqL`mGL{R8psR}#1PS_0`5$P(yo`>d|vik#0;M9Lhx+Yo= zbmOjkv3qL-borM37B`r{((H4?wzCbM58YWVC6-V^-+krP9Y^T&wsGah-nkoBJvr4e}t&P0^GdocxIVuaPjh2LY&?vX(#WtURs<>FNg^p8r73*(!18VjjMS;@29i z^+}N9n$qmEj{C~%FM8TID4;ubL2-nn3r}j9OlHQ^VV9yUc97Q$96K)6+&_c)mlmjYaC0-ITO(AYE)o)S>^I{A! z13Ww?u%)y!x6y?9te{UxMi2IaSpTxM4In`O+N5xWpcOPMCLC0yafbHA$3nciyM%vl zyfXORRggCsBAa|l10JMsxhIDrFZt9hoW3?5p`Fbi;Un9FK6I*mwx}v%d-IYi!q|v z0#3mHnMpw=3BP~TsYha-qAy6zt6x)F8uog+6>}uv-#xjn_KLa|_G#1JJjZ1Qv(1%W zE^lR_hHHOomoxreXQpUv`$T}<#rRF7svf+J7{Anw`xTqocJud{sOvTJ^7V{LgGb)P zM&VQ!VSy|oV;=8+^4SmbPlYqXU;+2|Wqt+t{o1I}qXBz+3QJu_V)bBGWA#=*js{3C z)sG$hVh($6t>-?*e7ALX!kctfM@YF-aPB?wmHS_u5xLog`Q3M$jN4|?ARzM9W#APz zkh{O3iS}j(YbTjP12*IYQK&=@L^yze&!90mqb%%y(xN$?YyzJsZ(Ipdz`Ufw++RHl zDv;hcFYJiE+GF2xI16WOV9cR$Ik1QXAueETAF3~5sN$9YU!4!yA;|x`VIXI_ zUSkhkp@Jtw%C+EpNa`gT^nW@9{o|1p#ruA+1S3#tZZFnb40%6X+3Dfcwy+Z)cRQtLVWmSEepffe}nqoSrp#I!@RKeJU*T9CKWp zruOMkBnW%&acia73K}oJu-uEjwYy5QBT4sdK}fNq(RoY--0M!YNlgnt%(ufCe#nP^ zPWd@6tX~-(c$>txDHwy#twot8lpqDxsQ{>I&k8g(VW^bW|$APU3^xg4(h^{ zmz6Y;ui31*&nLzaq?5#QI@56Pe(mf7-y${075mmhC}x2h$$gs2WO{IDKUv}t23wGY z8NUcMM<{L{K|GZK)H1Q_6;%UhxbE9XYazf>f78i`4t!4%DC9CwuedBPFgX^2+`LQM z6mqz~>zbfyIH;inHI3}icZSJ;c<273PJaTJM*Wj=#rev(k>{>yiv`RaSZAW$ON2l_ zO*6A+$d7xhdV+4s23!rcS+$UB`^HNvUmN={or$GkxtZKhoIv(=d%r9=|95^f8g&Da zQx53|sYsCay+_Fz`yzz0FTZy zoqoK2-Vvxz71J%9lduQYgX?c5D=omyuFSqG1pNpCzv<6BB*LOuMO9k7EqwToYRX;Q z5-c+$_FnmC0z-*6zt3NkhFpf7dr0ao0)ID?A_f@z(djlUf<1)iPrEXNVlU;y zzh6fr9ifLz>AT1+GpLOc@O4EFEKTk4k>fv{fkLfa@aR<&NR+=|`z;K)xh_}2qj#;L zVpwwU9X`)8fk&RWbzz=p`j(%iq6xhEa-JxD)){_e+`RKkS|2_sU(YTT7Gj-|cuPm!K4vDii#P7-Swtf`)J*n@udm)GUVUnoMS3!A5&-|EX-oph3 zqVGcMku&pBX8oio-Y;q18#TIZiNI>4^_zR*daz<5>TiYqnkjMK=DXvVHOZiG@H#Kxd9Ewy(`YZ}Zc}_@47rpRxr_Bo zFuuse$3O!hZ#Tdc{@w;I@N)k9f3DEPKC9_-F~08`dOvC%kpCpP7Wl2g4m74cWK=Xz z_xo|_GrzDByqNaWKlqmq4pLEsTHi5&TZ=;L8%)M{4)}RF;2!JvTh_M`uos@XFSp+d zGy#s)X8K@Z?0pP8qfG@jFWBaor6rb7mgYL5th#mGa4;(N7)%U#& z`&k?yEoiDp0r{L}CpozU`^_O}+eFp8n*m0wcJ6+b)q;_i+dIv_tw2($GT|lmbJ%k! z|6Y86KA0CrUqsDf{|LKG;{|+yWbf0nln3Gb7sNKzl4=8c>8LsGqp#Qb zb|%+t>;Zch^o8dd=1T9B)Ri{pnZP6CLch5YBhce~*{QZ^3Ev&qN>q)+VXN@XLrHt= z-5xr-#(%{Ql2voxhL6%hXygm+=aJaokVJW}<`gYF8r5t}`fUMoiD~wC+HhR?s>H7| zk9)zN8{G#yCE(gqqWdp;69|^_a@rntfbSJ;D|#H}5MTP^YRVQs@cRzeY0^)^t@Khx z(;6qBIKNhQnaT(#ucnAdWN#8e(q&r4JBcv2P%w~2rUYe_?TZikv5)HAA;?%mT{M5% zf6QG2b~3AtdVJJjX(xw2YMKP2cdz6bP20k&0J7t?=$B@#qe@k(*8-crot%<0w%|X_ zR(IVF?|1f$#m<|^^VDy<V4^bt%49qJ>ei}5-vj@3G z)5gFG4X~Ya{1}EDu(`ON3_0{|?-A(AbE9U4I`zJRwfoM{nD&VCtsFitqx5@!m)d}> zOuu5{mI)m9YRfuQs0Vv5-1ogWs{&kqwpljuIWPa1RrMS9D-K>`M*2#3hgA^tDQEm`05=E zt~1)8uuPqt=3o!LHZfG3)R-qT(um%=X9v%tgTVrOgv=hDajQ>r1l5lxL|2YDgAPw} zwS18jkXk*qHJ6A$KJ|7&0R52*TC{dQ-qC~12cb~i4I;d|CuSd_j>1y--x$Vi5(xI~ zQUs-8Z`XA;%jG&PA%|7o_FxD>ul){XkVoUnKs! zQ3m!8x99BOUG`}N_lYT@E60t05}Y9HxhKKh>3XRk^0^#-|SKTAU0 z*mzJeCW9Bs{+%lgNEOANE#ZxOcz^C&)^{6o#9YRy*Qu}SG(b~kCA`Gf7OLE194kU_ zZx*N2v4!)`b*py=L(ymahx^=T`9AdFIb|iiLcOE&iXLBYuo3c}^zToxI6(~I#a@N4 z$X)LL_po4_2BZev4CZluub|1f?o#Ol{X5SNOO0DXLCdw$=m0jj`sc9Y7ILR_87NKO zAeZG+p-So8e}a(3WUX0zRSG=2qlrXLXK*{wG^F?e=Ni6e&I4vP(8CvCWV?%d6Xnp- zI%;WC?e(2|3Y*QPfHzL`OF+efaoIdup&$ctm;M;+!7b56%G^yj?l`0J-_44)iq zByZbN;G8_!YT={|^@(T8GJRRGmnG~fv`N74!UENJaom^aTC>YNRt93fuwFO%JfbUn z_E#mD!q#4D>QO!ekoe)rSiHgq@t5*M!#`rK%5>xOfQbeeJAUys#5pfF$V?zcodm;S zg(ci4&{x24G;c2@@_;->M}IPMVSirW^PXWP)QfDAD3GsMd@!|886Snybwe_WG?xREgNa zmvbx|505zkN8-#=R~6i&7#}N|#2l0;`Kd73dJ~x6aVyM>I|#SvWLqtUZK0)L$dJ87 z9`Z$MNf$obfwk>A`V5`mo=CZez%^qKv1;*LxQF?rv<5HP0DGt;5v~}9DgdXH8>PV) zJz#L_x<#7Ce7Sy!q!#uXKLGEU>yktW`sR4PM$rsHrS2NIQ5nM?LiP{p1B`I*6;<^k z5j$Yadpq@)-U5g^hYjS?M4>;2y83H13;0nt@yzB*LWpARN(jLLj@HrK_C1L{VHYDx z1#w#lTIHi}kFx~l1KzDCO!0dZfA`6I^ii+xn2Nm_G{yPV@%s0p)V+RQp>u-po@Jy@v(gdh1%gISQ)|FG^S%|~XeS8izNMbOZ35IPPs8bVEMcLS6x)RT z3{l3kL~jub7#e1XdW$-lz;20W|FQ*ej{H(3@LGdpYWU|8$Yt-Z13#G|ZI7MIwv#1Q%vl46E@Gwl<8T{yXSH$tXK3U}* zM)undXk%+@KH>a2#CDC)hWp&Z3)MUjVFSV+1FlEn{&7s%Z0!>6`346mx&n}=&`#-7 zIE=dTKF(VENFL-w%XhJ_GC0HQP!;Z&hvvZUdZ{N_A9EQ$9_2bJYrwh7L$R7RA|Na6 zb|p+5@5gZm>oU;qOSLemt-Wgx!4tD~)F*7=s~62)e?dn$$*;nu#?23;sG-Kz5gT|} zZ{~el5jljUbpA$1jOf#0J7q1v%7@lf0^}we+E}eeOF~EcQUt zC@tT|`}u@cUYo>C>_@AQaaO^e*1orYCRR!SCTbj674H#|v&QUG-k}8h$98Yt3&6a{ zNkiY`dyqr);j@SQpe1}^6(7oqG=hzmIr>c8hkwqot223ke*Pndm!i_p_daSIq9{v( zW4k@SPO>5Yk-O65kHKF;%+EA_fAlAIbR-mtyrW5Bnds()xlh?=y*$Gydd6>{O%sQYg3o*&1*t45_7 zy_5wAi#)t|H^UBAS3hSi{=$24OygzeVe|nlSFr}Rn?aQnd!0Y(Nh){wyq|w0Kg0{J{ z&E|$tDrG*nNv2gj|A8I8HPsBxg=s?4wQUmuK8N?ouY|?bV}F*&O_P{9J$UU9EijFH z21=jR%og++`LN0f(yn6v=6~7-Ez~wp;^}JPjrVSiW^zYnZZQa)TE4kCi}#yR^>nG5hp~}R zDrc}fdjAo5C=v7$>kHcloxua9$I39b|LQ?S|7X-&+rD%8xIYnxQZ|n4;W8886xQnq zpf!ZNxB0pM?~gF+>uV72cYuTUQeCX+54fIhw8h5=(00&EouOZ>sQ*&C& zd=mGZezFHwxQuM!BE#UfLwQa>*^&4r&B+|98l~+ruzx&ovZkMdI-6>|Uw4|WIh>pjS7^X}QO5V`jjIMG+M{U=XB6n)?IK`f-lgN7hZnHG_Rdp~8r7Jg^!LH))a>$xh4 zxeE`+$NwS!|HPr32S>)#;5)ywL25ttq9|}oeyBHx@AZ$5^I;B%womxdD*A68-Pq|j zArOFP=$okjumH@qDLswl#9RgOs-0P{1E`p_FG3LBmz)i6?#^?-)zd4&S0_2KKPtrh z>jZLev?GHfB(YyB*yZmZ-1BOU$4L(0x#chZ<_SIeKc3A!>mTmK=h{C0pFk(}L$GnF zL?F+P`uc_6KP;SJSla$k%r_et7%%wwJRWmiv$>=vAvSR0I#pSz3i^W>E}Mn#(SR9k zP6BnjF*MM!oBA*z$MMc|Yz^kvMA^(4^3aEP?}ASw7nLKtpnq0Jwh9od`p}Ac5BAYr z;xrP{#<}@D-=*RG!azf~T0?i<5FYvN>-R}@g8g?6EAiYS0V%g!td-dgco$Uv^IIhW zyZNYMC2~KWx0fZ#2;l#BazUc$Dm%C&ja+M=nUtV0_djbtl`q>s8`vsyr9;*n>B&=_3#L>j7s!>(VCQL23E*|f@NI@ z!>Tnnil=f?Dzn1!4)f=HK_YN|HCPl`!gFo)JzeM|4V+XI&R!eWgy25%-ou&X*b89( zapZt4{QVV>_T{Z1e0enC1E_1sx9}YQPfHzaMiS0@1Pj7{hh)x(d6|IFLfvpv68;?% z0z6hLw+N~4U+EkZLLIo?%2Vk7y41pL(RJJtt$m`>czVJZI_&oSj^MEbMkPj~jPV}$ z>DxAT40{LT>B?rfkiXlg-b(Dxm`evQa^}nrxdqE8L0DqdRi;to zho6C!a?*H|ycfPH#!SuJd>_M-{hUO9a}r(P9;k{OM!van)5HMO)$ha&_s|5m6* ze;|1}E9pFPN=LOkZKIOafGE?du=bh`j&D62Q{=P-%_H^plqPmiS+L~h7bO7I&%FYT zyHFofrA(Gq5eC%gWJ*bCmexred*bobRw7~yM;Ss9)xHHVffn2)L}{du328ycbxyPg-eg-7|{Y|f)jZq&u4>K0%GDpq+(9=EMQ+D+g_yqGH7 z(Ozu&gL4$qS$i6}O#vuWdMr9Li++!Zi1*?;PO!Mu5eiHA9H|LOd}k%0U*lc+J9X^W zwU#ve_=^C{9RfoI1Sh!G>3ZvtC;{53+xF0rTLWExq1lH$=oc>+7dIp#AHqFAO+IOj0w-WL=9>K=jXZ6}h0z1ob>Qr@amQio zb;!EdOn1>j5n9O(w?3#f0_rNY)2etc93?$gc&LH*_vE4eu~b8l3znl-%~k}7(FtGU zr;5n6DNML^{3n65d~C$mPXgyUfuzb);&3HMXu-vNFWercxGunB1HET^B|mtx0lSvU znOOAk?z5YC6o&Uxc5PP6y34H4P?BJGhtD2(^*@u*AGCsPUy9I5wJQn0+{jZ=w3!Wocf$eoQ19s{Ci3`qLPPxH<{3|7+w-|3oW#Ry#Xi>pK$GqkcDeS z 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%0D0lRqfjr2Rf_W8 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 <0sCiwI5T+!-@Z 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 z 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

#K1?&!b?`m?7PyhJeL33I-Po&F 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 !b<9OUqLh;h)(Jgjna48L#EY5#Vl+t;*{k^ zphhQY-SXm4n%C`!wD)Kw#Oqe;Tg|rky@J~Tp}a^j5ljcCp~|!2xp*Pe(TIT6mA)f} z+zFZp)$?WM&tF{B1@JD9mBXc&)#eq}cOFHaSn}p=+)^LsEPj0!m58CW?mbR)?-fG^ zCY$!)2t^CleXf6%u3bhFteu{L+t9Y0`n+ z9GOXkI%Vd7vbcqjB2s-W9O=fn$Ff+Ce19%iFsOaE)P>a*gzD)jlgz4-0|tKX3Wq@c zdcXBkKc9hAOhWv;+4ptuDe>I1o)=9PBF~z+no^Mn<=b^d{?}DunZf0##4*fr5WPhj z`JKF3qvq86G>cF1Sg?(`x%W^`1^BT3A&f(kKM_TRn4QQBaeF8>jw9FvjJnd4m)3Xs zFc3yzr@*@rbLd~Hh|1gI`xa1dF|tm*4V%PK{m)aWzn_d^F84kcj$Lm~)vjmm2;WDB zh-bts&kW=Dy80WF-&$}~*$^;;_B5vhD}3v1f3KJOyrMex>vEefMxY zN``5lsqkMNN6ZH@wrBt>@>`F4|CQ;Dcc1-iy(?o|q7v4!GlosclEfTTcxZp@@`_UT z%^yjEW5m}l-p)6sfnOGP;h>E*-d_OFfBnSUZ%YE_R_~VDx??TR8lLF3FLU|%(y&t# zRQ1hF9TTzA-aR43yPUC?QJ;zV+GN={9eJ+7WF%;u-zsGM?3M}A@R}=h(XL#@lb*?G zzWbv$U40_Hnipk>yum<6wM{1px4i20#&i*#v+h9f`Td%r5ov1pu79rN^U0jOvkR0*lq1|{ECP92}f+b%1gN4 z+>?m1JT1m#X~C*EooKfEBd9c}4CH38w3$-4Y8m@eit$vA6f6ARi{|yt@?Vpd#1iKz zv(S));yEobS@Kom{jg16kJyyFvKdmHg!%=PKS>OK46}z1N)xmA0yYv_2&b>BLH9@- zQ0(p#nHr=HGy>hUJi8b_;jpiD?-vo=hvsMYTGgLaVC6@1hh8Si-?S<(+4?(4$8z1j zrdczN!n#>&(;kq6^4rt+;+-BE~ryS)3s93bURHx1_{_=s}Jeo_~2z>9o$0HG_m zlbBf>Uxa5S#GzL$QuI;2hhMWPm-9Ka+|7~GXwE;4dlo70(Nk-Ulm9#;mDw z@-=x@i9u>0k;W>F*{PXJMI8{5akt@e0D>MVUHN@MeCo?VK7a4PFGbFN0I)x= zlq_pTL7Ve3*Z&trut#`)dzB+5N^w@AV>Tc(lB2r0=L^AT&cECP}u z3)S<^yeRVbc5ofAw8A3>Vx2N$ee1VAtq0y^uKZ~Ug{RX^KH9{c%u77i<-&(2W1(bt zukkjWM}O)v)3;y46D3_h3Y4JY$iMi;>_zK$EuN1`&K(4$eP()3RWhouyW=fK4qR+^ zddweaSnZbI<>pQjnJ65}|(aQtBB@g)g{#9b$rj~)VzVkI!!S+%+rReI4 za|C*b*v~CoTQ_X^Z{VERVotDQ-27`Uf=7A?%=eD>7bMGWYM?NZROuahN#+$tLqW?S6GBD*+Hvkzgo>dZ z+HicHzYJZl$1ZfI=gmRC;Ip45ks6NGcKm8cu0Z}I8#uDWRTxjm@WQO4zS=z=K1mK7 zL>LSGYeds-qVc=E&!L1O`Pnxqd08pyDJ*}8kRw_lW>9!p$GEg%CyFHA|0%Wkx+moE z{gzr9(77J&@fRy&7ls8 z?s{~Kb<8c^pG)V`4irCvm1)0WashxuY)nk8ep3irmf;ZyXPcMaa2%nH8|gXMC4m*; z`(Ey-`qp$7qhY)#g{k)=jrw;fcZ-I?uYyU^-Meok|3dRIWI3c@-w6HP_6EC>5}z-G zm46QSM$?zZadFi~Ayg&B`KWoc$NSxD-?beGs)ovFy~*0b9+3$>dZqisRM7WWX+c+4$G|#ALm;#rmfrXmrCIEH|=@=ZnM1& z_I~@A2Y_D?&i_<3=O8d?pTu>~U%@g3-RY_aIN<{xENPZJZ?na%_iF0DOz>8Bp0eN4!_u~(6?@W}Wu z)s>b?(Af#tk#-_XB@2Tq$oJ~&KZ5CbP(mrN7P<{lm$kMlF)oa>VVI$)M6R@RU1Krv zuDisx=?vq>I)0wuK$B{S_Pv`Hc4yhwmkI6lC*f2uP=VDiY$a3mjWBU1z5ogmDEU{r zJ*AaeotiA%IxH#XOWESv6hxz&gH44XTP0G=wu)5Q8apjkSJMWi=dhfJWq zG5{X#t-iu0w^b(SeEdCA9w}@KKO9TJmS*=Xfod8C7r}4=n>1Z1Cw%<2XYu~p-(@?A``Pom=?L>J@cyG-8Q=zZgwz9 zUf>{cz+1!w?~?@;P~-YF{srfN$m^|>xq?H#>_gD?PypO#b2%=h=d{+diT#sOC3as@ zjy`OZmnS(a&)X}w-&Vhwpptr&;;m$&mg9j@Jjq@+-1)xs9_FK5U)}WC&dQThXE!$I z&neD!@C}0XeWu+aIo9#_9p7xPd+34epH;LSv9o^GXi&I~Ms<{w?MOq?AtCXdzQKH) zF{T#IpvLv_ZEaweLIiIIsoB3T)^6_aE*LHjxg`FuNF)~wr1hi9Wm`@gtrN_Y-8#Su z&bR@pow&@Dhhe9f-b)fEbg5%+G5%um{P;G}l4-^5g=m~svpo55nL|^t$m2dga45?D zw8>R4q8rrkGa5czR}R=?+iD7iDOA7u?&w@(%tk0*G40H7Dnj_R{10N5tc81RG=#QU zm-_iky&7HL!-;fHtjX=mi&Tx~m7#E&Yx*vRDP>0KS?ZBiGG_V$YA_!Qh5sc3gS-7K zW{%B0w!+IJs4`6#$VNvXa$W8MTUnuaPHJ8STX+X@<8SMmHx$be8Y?6Og#2M5XaLl= z63v^+*QOokWukKXlt2hfT!2LN#oXzG}$MzC*qqSx}%bh8P=QDlE2AI6I+oR zsxrO^lxDVe6X%k)_4l{ke_x8@LNZxM&0Y)Ulj!*W&*A~jQ#tBS=m|V)h{htLOvu~AVwOsU3T!FG|OFu4%};`H2J2hG?}$Po@9E@ zP)uI#6^(i1oO+c!CA$agzc-p(`6rz9w)rM94f#hq;mw$TZG`dTmg!FBXJb4#){(C^3lB@T93`zPBt1NO!<}`YN+8*`KJ@+oH8`}FTM8PLDW-R%+@LqssJ;0za z+57%Z*Z-`+042JOZi;8jP<8_8^o5DI&~{p?F(s$wx^Mu*Jyq@@;DH6eo-E$P_ALo(>b!bsGx` z_29_!KyY7nMaM$dd%HtWgQHqLuo9s*!%_Bpws%xp_g{N6bO;2nZ|~mcD#bWksZ?Qz zXyC?b0U}Vh9J+j_Wg%+g2Ve{AMDVMrSmFY_wf=te#K?oUbBE!ch@DT7{QI2uXn@?+ z9GB6i^r245e1bhL%3bYKt@jsJ7{P|A;QG|*c8Ae!FU*u>1^G-vk>wHIe(18ve4V#~ z?Ox6S@jHNV@AY17jKjJqJR;RME6?vYdaJ&s8m0I|-KF~%jRxy(&VziDkgAly)-2PH z9t1oV?9M6kT7^0^s17@!;UvVaeZHQl%)(Nk8^{*jse-+w!z8@c*;k>(gF%v{9E%A> z^@w5qUtgsPiPsGbB4XF|nY95gSFZJ;;*hh~a|my&Udbx9R)L7*gv9zB+tH0FSQk|y zi0wmthY?TbRR!{sK_@(Wt zAa1S+#I2YtYW?G@ee%Zh5LHdOI2eK_8OBEy&AofxiMi6V3VCFG;)Z6_Yh9)24SM@vJsjWTd~SUn4~a)x9FQ{C73pQ()PeA{xJXJuQ1hVp zoQP<-UxdPMH(8C}2J3+O(D}GY%yPy*Xam#3D0wF;)k!A(Dax#!e4rdT8f5SK$vP35 z=F+4_lOMUZ#o#^mEV_p_@r(>Mik7weGR%8iLC7PHGo93~BMTsr&@4gltBtXLV-i4P zagwB;qDtLU0ZdU-Aj&+eU(e*3H*x^YjZLuc0Eqo?hs%+d1?j8{pZ0QL_QTnx^Z5#?03{WkTX2M4kB{L`~Vah5e2*P$Nt=udA((p z^f=%;tNJU+VcEp{Edp^oaQBFJQAu9;dT;@nUF`vCkbKLn1=5L!FvXwAENs-^ucjyKY5K#`RAO)ThxnDZcK4XTA=)~ z(W_eXWz|p#itrxffdRxS=(KPAb%*MM9Mh~HPOmv#dS4w92cxHK3|sG&mH97g06#|v zGSExFac_0%b?n@lkgU3V-0lr$Bi?H7A$4%p)%>Yx;k78)#p8BOpJU|gI}2pxoNlK& z^5?u5I!9zZpW{V+5tmu-^6?xx9f!mnwNfA6#dOQEhOS|P@W38Z+*Hs^B8cHZdPA(7 zhn&BcC}Nqtw6rB8w8{c9QBMCqxNpvj3cxQLipjv=Lg6@UFTVdVM(ZNglY3({RatAo zxpvjZcGYEjVLQ<)Hya)hDk-rbQZA5f)Zd%xeC@(e(=K3j6Y~t>k@ke;+P!Xm^uxAF zrLHmf#|oF^T2}wUOc5*oXk=*lvkt?eec8=b=LAQ~K1(RUhx#a+>*vY6$R}o+9ib&z zErn6ZEaD!*S<5ufekboBwp*{@Q@+kGW;a-PGpbsmzEtEgBOeb+YuJ4~C9?d+eb-)j z$Rs$q^@kD_km^X?SmDcrCT1s%y2*o?0+q8jKVh3M8dNe>%0-o&hI@g2r0&(EF=* zl7v5`#n{F`^c!Rk{4kbyYvq=AMgye=hPP2X-K#7uP2?V9o?yp>@j+J>gKnKu?#R3X zThd*)tbAIfH+7q`7$dpuT!Mos8W_Zf@j5$pzgw?3lI`54ky4vDk*ceDi$W))25_|j zWWkZ<1a7}Q!HV)BDOE}8XYd-?_>`TvXXM4g6^QP)N0dIFAibKU^*m}Wzfp#^OrkXT zE#J2BCi2SO^8`kIf7;^Ds}Rv<6-tZxh=N_2pdQR$E=I-eS2OZqC3PDQO?<|fT1i1L zR;4bw--|4>`B2)*x5EW!w#m%CQi2gUa{xMsh^28{U+Azn+w8zHtY2A>i>zP1j73!; zM*bXzNbgQr>`wSVBS}sUeSIBgPVPR`uK(={&y`OwA$dqCq|PmqLgi-m~{*Zd>bJG7&W+Y!9J%?-02M8p`tH;b)_}09;~P?9HpLdR;-A-htuIZ z!=KzriU=lsgApw^)7q_d(5~T<2J~%U0)sU27M$R{VvbiCBucLT?!N!0q_kyU)zBED zN5j}M2Rsf7(59v)RP82=D1ainU)+k#ic$BCz@GVfXv!5!sZKmuL4$})j% z5WLPg&yy7^Wt}}Mi@d*kQ*OPv_%i)cThSD0Bh5fR{5Pzf)qq!|=BS?!LgC&O^DqvmhNk>NM9fhh< zbsOdP7m{|y?NXklh<3m;V=x_fzU|iGBi$vx@YM71JsE`tZK6NB_@Tbt&d|#Rh&%dJ z9r8<+ec!&My1#ON9_NR}iBajEObhFy|F;D;l^yGgxP3a5lfk(`LC*OkTW6b*%-_CF zd*?sMvfI_2m7AX>Z|et1(Pa1y+C295Jp)6WWu9T8dcciI6HICIo4VURTOz*AWb_;L zd+UE+KuMzS-z{z6+~@WDZ6a~UR#-dV=M&HSVr$JWw~E5d$VHG4oCVjTVkTGrGL{EI2g1Ru3^`Rm)pE(3P8-L}azZK=T z*ebKz-?Oio$>m1hYxdus(faAOy=X2ML?CUv@Pj8eLJ!DW#71ip=8i8%wy0E;D+@oU+u zKF9d73q4drZMwE7eFB>xGxt(A54r%C8vXt5-ewzB52saFA^L}_NiM+_)h`;@6W$PP z?^us++&?w>bqDnjsNVK7o_a6cD@F74}GwUS)R_sA^qd0~I1 z7j(RLZM3?iEjjn-tcO+Xy(u)ym_L>_D4Ptr-Og=uC++tcvzTj%BJ5-5vq_hnA|7f@ z_e)q$-GRc+gu?is8YHJ=a!A-4s?DITI={Bj_yd7!LYsKuEBN}?EHdPd>@&Z~0|wCS zDcsou8Fc<@=^<<4&xJn6R-yStG0$s48{YML@fWewN-b37E*v{jIWAI|nr;J{D;3Vc z&*Kj`$9E{tlt-iniztj>Q)us1R=5MCZ(}Kgd7qCL`B0u{LStu)HlrT)lq^5x&pjaN zqP(ABIJj@~@l?N-CG}6PG!eWFcbCQ?P^=6s9Ps?8B#tCc_%76ytfq;QcdqYu;J(M> zS-*fzgGwLdM0xin^_wl_kAjLd6%I|eTV={GN?ovRp^^Y#u9dr|K5jQ_ubu7#=kmUo zLrDjdL~fD6WEZ~OhmcU`qT;j5$Wkt|xR+$I_On*r@RH|`xX_rCY~%#5Eu`PmJ`n}~ z0Y@S$Zyon`Y~sFm%2EOPj%8K!AK&EtE>8c-d~xWvvR)bOMsu@$&39ML5kPA!Mlz#| zdRr&w`LZs5gPL3PH10%?loHO6Xh}(J3)Y1xdVPbRW4s3zz&?R(v}LNOcz2j+SmdMn zF)n^(5G;)zQ~%qO5AmR-o98q=9^wvFA~a*qEEX-9*}KxCz3vN9%=0=_t5fygw6>o% z{H)EYXb;o6H8LwA0LrI(E@mmyk-8p?_{;1;|1qU`_m05%>grwb|1kGAS%bLA-NwPW z3CGf3M#;E!qEQMDEzMf>Z1(`*wffEE-y`x8B;%9(7Bq7o>)X&YkJG*`P#HhhmfC~{ z!qZ+HV_tIUpdHmuq-i>zd-8qwcyA9DA?P$4Ku+uZiuJLNbnYu+<#}pmV&XULM*=Et zHd!iR2r}iKyVMVhQek|Vo5dxfn#uo26wl!#JmR>$!cOYI>12CvWk2r)Q2YUz*=d*i z?_(k@y_KL%I*$BxkzDIW%W3C#JWc>Fm!I$fLjsC)`#?iTg0f=3qp#7ix#JJ;3h@v& z9K7S_ld`u3E6$|6sFy#x|8;yEKSIBPq#Ez{0$4yUU7*{>{@Jp}Qd`V=p97Tmwo}!{ z2M|9S*-V61FD&YUjQxq}#}Vp~a;mmDqp=P$qiEMnb06l*hRe)<2l(rmz&Xy$1i^A1 zNzqU4;(1;w^z;%!g1!c}FOl2v@9Kw`edFk<_Sa)#myZOZ;QHZG^E+cZ;I+yT@oHy# z#)iSRPTck}HEkpTFDl!1OR2gpcf;p8HXkzPYwG5dPP2!hFF@3@+HmS?+wZTw^f`)Y zW6m4PUkJYR8Qj2AW{wmxK`((1+^k=fo!jrJ&mbqXMfr$Cntz(NUQiqh%?jqD2*@VB~ELDOz?$IR@K=Y;Z2)14eO zcv18oJuF`3+V+gV9>M@=k+6Q&<+vyv1N6I(ojO1{sRUhmANf1y1qs%EeLkB7Bu>Q$ zZS2P1csI`Osfry(`MvHWfeOyIEz(cyeYMxojX21JhyFr7`21PT5@~o1ALiRtzrq0h zmwJ_5wmn^e(g4L!h8GFv&&9|dApZIbW2bwK1|QMD&icnfWbQuyZg4_02Mqs<1s>(y zXQPWKDtjUZOKQ4<#S5L)iE+F?Z^JC>$$o_4L-Tn9+@TJg^PnqOj96=A-LLD8R-fP0 zQyRc2PB31l<4x&>Ge-LEW_2A`a?Vt`KYl(I9|@j!xRz(O32Az}(Z_E~S&g1`i;;}) zcEtzQC=BPdrz9uN5*bLa&b6}CPsuSsdmHG*EEJWom_Y--Ex%x;2sNSp?qkhGp2$J+ zwa`Hfxl`pHVlA>RebEOGKloM=&PC z_O0vT1MK%ASl9?(EJLa67@dIx41}||+#kLXIB!e)EtNP(_bX|XbZrD~_sej8>3U)+ z3!m>R?dm+OjnBj{pdbpuMXmg}&wgyU&)w~JmZizGwVtMjC}}LtX^;CG$m`_ly6rMp z6!%*(@Ks~G`lS>46Mk5qUW<-!pc3BDC`GybOy6!B?smXeS83s1a-me71CJf4aJ%>= zx~*@=pm|GnRt3Zxl?y=^+CT2xat0{9LWOuQg8Lm$3g=0{1<3$6OO1G~8|SQAeX1ccH@#i;dn~jkM3_C&#SJ?Tu`g9B*1cn5a~yOpC?n*T2#*kmezfRBs2WL+;$hO z?E~x)5*1ZS%XGJirjVXT+?sgBc-t0X!r^nBa+r0lhz}UZj2FJfCi$5CD>k4y-nV#; zzWI};r(8aKODhGbM%Qq~(j`4S#3uM`qr=v{kzIk>Rns@|nTd5ohZf%u@lL#wKaG4Q z`C9g}*L4pl-RIK4z%OsAB^KuZ+wGZ*qF>fA7(SeT?eiIO)uYdb1=)xC2BEmczbruMlr z`fyz)aZiJ0leli?WR%r&EBc+NMn1DG5Bg)XVb~PB44{q92iLY2oY3A#^e^+q^_Kes z&(8+Afv!A6mDqwD7<9M-Wn?Kuz44RpW~)BC@9z3IR3+5V+;^ef-)`5r7;g|8L8H`G zTfT4Iid*p=vX)9-k9?7Zhx}6Ar@ck2O)#*U(7R7<{oefpKldKJMno#U|L|BZfNE#f zq=89&Eptb2dwRaMpXPQBd{n<~Z~rJdvn^G%EDC-bN~83B_XZ+}^wRV789D0lR@FTx zQ(^D5=8PyyWqA0^*}ClOrb+s4{JU&^xN#-#hi^-`c@!NG+w)FUPNw9(zKN3E8F1-w zyf9(q&UsO(2+US6lbBmagX7b@OsqsCPtwl4*VAb%>hP@1n9u}!Pp&<&|IXmgsHDeT zx2L<+G-?8iQU7^1)5NWBP_z5pX|Xhwl;{hNkD(x6tlD0vnN$4{_+mWLlSoZ&Ox(7u zXYW>)_}xB0ybI^pE8Bv|hGrp!TLbF;6#S|Zhw||`4wV4l%`%zCfQ8-}!yJAF(yDbc z`N6kMD&<5{J`uIr$#{xTgLIX$yqFzr#dbsi`UL=t_gs*yj z&m*K9mHExhuu0rx!9A*!u0^iqLKSc`FWre_xLWa>LA=^3zIo${E4kNpFJ-cA>g1MUcBRm;`=vwPYNu5+A~lF3F;E)&`(8_Up) zQ^EZ*B=bY6{`M)Q?$i1dHmD00?~A^A(pvlqKhYD>pAElbSe#(7?*aVE?6gYKXRDMZ zV+U?hJF%&L`4oWzB9>#jl6+GHSzspJ`StYiV-ODK=jakwjFsP`D_#@S$q_svqb2AH zosj~1n}M5!%J$OxP;jjnW%kPxCNaB}4cfDa86beaJ9QaN%s(hKulcI{E=+yidZH!9 z6xg9Gz8wl&eIixb{dfMJ(!;&okxqH!SkpzF_*uJZ7r+DC_A4}~eJbV*TcHzMgG7(R z7)0(7Y%g#_^4NT~=7?vZnKVm3%!u^6mroxp$=^njo8 z(C&46Bs4*Fa1^nz5d@*j^spzQAhCf~t+4pB!*YA$%uc_OKKQawqiu z^9EnN$Yyo)H8(BELY~7b%UP;!sFEL%Z66gIG%`3Er+^OwQjeERAGkl2Wf29kgN835hDIbR~-yoMqo17g4odd-i$lM(I7eNkN zQNsmC4$g?dPB~uO+-aUTEVkR`nCX8Rn!@8)hfQh}m#CcEtqzqN*>Ghk3@9&W3A)n# zN?lQEapK+Y(x!^7$o;@+asA*`@HjO(UGgG2G<--P`!DeYi$DmA+L=4T8veMfHzXfo zWbme;_v0M-C$5UqIsI1IxBAIcj*3ZQ9K>?wkQ?uq_y7EySJyjZi9Aiu)?`Pz*`_Oe z;b`V}2)L}fe9ek3U!;%6$|5?@{MUB}!KNk)Db^>2qg_H4VOKu9Rl%81{ zL{9cH5PnDXleoT3z%| zbI-ro@6~k9!SRaVzPAqkd2X3xr-~#uVi=a11NwSQ@Xor=-^Hala&HMB2*yI0Qp0oi zL!RXN&4@n>?&m|T*2nx>HIYbq4vAjhDBC5W6iTZ5eiL?%@+Ca&lT-7{?Fp%MBH37< ziJQec)Fmx?YjZdE%u|FH$)gJ*%_qmFqpy$>{{6O0sSf#>?Brj!qfnA>yOLwYe_rl!J3-9&8K~`*Kg@u)ugxZb)}WBTV@rauZ@XxxGqU)GsY`Se(GlZ30WY zl;LSxpXP#kPcJU)w`O2cMxpO4V-nFU!}i-!E-1Ge0K(U+Vu3T=nt^j7?L+HVYW`H- zci7aS3n9F>1`Pt{8bzp}LKt+*Tdj>WaH9d4SL9cfzgfrCj)p2tJb7ydSbO z)CD|U>5*7P)F#_oY@0+&M%X)V=V%}a*&d)*cYiKc{dug!>)6!1U^GVf)&2FAk?c5f zX=RO&_@rNc$HCRkR7@V|kFRsDq&{dM5*VVZbYW7>X7K0?u6ldmZTgE_V|-ex);?9y zU&i=V3d+0_P~jxv#Wd@#-oTH*rtT4=fK{RP-X;C2KlIecr+RW^FvEZ;`_HQ&h+WoF zGl;v4FRE7Rm7x1Te;W;5ph>v6#8X#4vp|K_c9)gPl($dxrUlt9H_@02282?&&=7oT z0Efe+T27KenJcZ+cvPq?Z-xK^BkKhosP-#24s|n^&Q3d?nun&Cqap_9_*OT$6y`J^ zoZH=psk9OesPWG8a9SZ$Sn8;T5M18ef;yA*{>Kc)LYPK%e|{yC)QbO2&}_i^Z0^& zH~GhNl)uw4-kzcGwHo0R;1b*F=R*eT(o92cq%?MeR=OMebh6|#g1eaGK|1Gem=*|0 zG3C}p+Um3@TXdxfh6?0E!NmYztZbl0Rc3_nn)r7O&U&et#dp9h7IEmBR>U zcRs6kP4Y;rBl^|EeUygudLUyV3REGXK5hmdP>Z2bE|6R0Iu~~}x{CEmQ&)V4eRTTv z?|B)<0wSP^G6$mcaH5Rf@-x-A=*$6*i#1qR#yOF zPfU3&^UJ%|6zlJygdp4Ct~~>o7sz8UwGhQ%`iCA|2!6))o=*PjDeYGyuVmvmX4{4R zcfQao47TvjwsdX!u1?iZu3iY7Rl$2t|B_11KhAYe5}ZztWsz{0w}7nq^p>3s8nUW} znb&9}&F7<$AUu zMkcmI;sty@Sh97WGO;teXm!nlZOwxkzuP;nkgV01&#<1eQIDvb z$3{R1Jh52@IgYu(;3K1TX8B|m(`uz;@S&u=#Lxb4lhEcZ06*?*wY(1MSAPb({|`4E zH7)3y_WiR*n=!iWjn7nLaRD_^#pT>kI9%Y$v3*nWQCAD_s#pK^>Lhzu5-7Yzjv9kR0ms14V2Ik|%?M^?|>IJ()+rFPO4m42~=mX~pJMPb9;E5>p zcha!bTE6>i=AotN{7}?Qy65^ZWR^DTI4pspZ7)iSA7 zT*Z@MlWZkD%EWq6q(Y35F4O1!(2Dl;=eya#$tVoCi#2#o>)sF*}>_pL2wU+P2a2XBDBXJoap4W# zPI)~ubLB*RGc)t&m-kN20{e$`9=N2!*k$XP^w8yWjC%0FfV_Z0tGuuDbS$SNUcF$j zx!nYvQbZQLuJdb?M!uV!`T zCBN7k%JC<2Osv}?VK4Ep7%0*t7@lLlXTvFoQI>DEBgQm=%u(9Bf2@7v=ge=uu<*f+*@a0A3pfPLun-ki%D7&{eoHGcYsTE?=9fb7#f$r-CKcIvYwM5b+e`q z;Sa^w1yZB6U*Jq(pZ;gbCc^v-lamxypRENw^v6m;iu38jr$=POOPYT=MJU%$CRcc3we$V3<^5Ic=>?qg%?&%2cf@3(PaBM=^2&x^Fhal4cK;^p1@3S;l@ z6!Q5}`l+E#U)Jg4B9s9tqU#!7c8z&wx@sLjIb?oWq8S<_wHPWwEx}mST-+&;$3oU( zKIJ`b_zi`4Lz9_P)=*wM{R899sME)DFdNsl0u+y@=Kdq{vo5@HL&OV{X5# zZOkP8Og;M05e)cE>EB1;snStaH+P4+GOVb=tlv`3o4!x6Qy>&0o#s1~_dnH>@8QsgoL0V}X^?hlRb3_X z25l|;mHlaXLSfHT~AI`C4A5Cf+%I3D(Bk`w*QN z-lH#uU}4vgpFiZZxTr0@H^-AzvN@M;bI!sH@R7(#MdH&*Z(dya)=|N_((E@Tt(>hs zhi)~J($Jf(T{JS8ueh1$;Y{>f5#rA?#+;W7*gFbOjx?~z;?1oktPvc|=kF;e-5f1! z^3)hCshJ*B|GXMT>ARvZ4aJ$@vhH(kO~3u&_;QZ4_#Yiym#-wsVurpf;DsXXO;av_>M{Qe z9^tENMp0Iuw;1Nd*T!Ld-o@p^KFHU!0nd^Ro!~QvGMVp7jGDwJ5Xj5Hu-M7j9>gy z!r36vmw#>HVYvQ(Lj={8Z|}s|gO!Q#Y^zt=6Fiv+hcut(g1CzJ@y|R|ICX_>Wmt)9 z@+8o0clpN%?Pp5rZ$xesbca_UH-Lb63isTbw0TJ=ctfeXaL(adC4@!{{Bl6!8$!3M zKa+GxVSTf22u?1rYeB1D!8j--58|=uT9h27-|&s~DuhRMUj**wyQd1QfOO{$ybtEnwO8K5c_6_T{B?-z+Z2+0}iuPfIqr@b&5WRg6BzF7h%-jVn@pJ0cO~QRR3B zkfBAC8R|PAr{e&yOhek1XMy{hC*84wWypNns6{LV&vE+-XpJy_@X-3@5QHFCf>t8 zpRD^p<#oxzvL(HZ`q5M_h&tc4oCtPGizIK5WR9yOU?dy$%MV{S6aN(B^jl57Yw?zj ziWX>u>G8$i`_`uR@l9}t;rUVi-Tq4n1*VQ zc*Hk}Upo4RmDxXL7|Z^)Y@j7?HPW;VnBvtz2-qBMj-X+hk%&W`tJCrA z6i6|h0@{l8S45^}lPPbN>j0_{i%$V(l zguz*^E5!&%?cuoOmNRP^+@XZW7S29x>cbc0_<6oP6W{UQ`q$`}>E%1elJCRK4@1F2 zddaazO%0-kF(lL>U}IDgh2k;4T+-rg(Y+T$4$;;pzaPVC>Xppz?<}3+8;9>wkUm%> z&LmY;Ku=gt@%a%#$!$`|3=F8JEW917?@6)wsLEI1J(72nsS7$~Nq!U$2_C+CMoM1P z@%tRPTvP;%{T18K@EBm(e+%LKkub~Sr+VD`F}df233l7%JTQOPZ0Lu{%fx&TGGu9z zpVxdw6d`|9;YJ@pz;~8C&WH5=9RG%N)HF34m^YQuxXphlKXx}}P#=(@`dp)lh{-De zt~bghe}3$ZekYBerC;3ip(SdK0OPX}=BdMff`I>vwY8V(_`wq(PMU9YM%Q)*_LGop z5uQ|gsHh8yt{=w9$7bV2*_yCTd68v^EDA02GX~hWsSoj9>VCd<)c0FUCe9fz$`Rk2 z=>vZOgosd9|H?Bx|3r{vyD|*T*Cnli(X9{xG;xrBVeJ(G2IAe4EAs1x& zZSzFb)Z^EZd+$Z`B`+l)~6eJhBkXf_7arrHzZY$)4M2XJ8c!pLs(}VAyz%N zkmGlWiM#lWM2sAux^1LZgz&mspa15T%g;Mb!sNEFh2Jd4CY5#eq67wZza>&Uh{M#? zdi49$%_Jks^rEsS=Eb;xxO6s$;Mkc!@Gi{pd{&DoNfM7itIJ!TCx7G_vFtq`TD~^6 zH%DQ5bAOS7A+lKl#Hy4};Caf6?w#s~ozUFMEQIr{(u-VVx8{I+^x{nh)4I|Zo z=U~7jtt!;&U3|BDbsO&XoIA0W0uhkYB&<~i%ktb7Dy8l32~V<*(Ln&6(q?k{nKk_< zgKBWwk}t5W=8sm1lG2p6C~LJSZ(4e&?XUh&d}e-Dbwe>Hw8)qRjw4?S)3i2hf8YI~ z-yK16!eUUaN^ZlceIam)HBtXQW=OGcuPnt^`%&fe0Oq32_~ zrATOwh~_v-F#S!cn7Ro)=;{ABVJMvP3jlv#bvT}pqkEk2&Isud&D1a&Iw8)cr-?@$b9cnMU4<~jAuUkDdwAgln6n#&f!#B#K79%Es7+_?BLP?YPFB3vf#HgjafWh zQz>jSMcDaN&acZ+r8_C*FzvWxxmQ%4gpJr8cKNmRj@umjHol|D8-F^t@c7xAnUL{J zGa;z2HO$`8zRg(|O{%_22#j~hY>@m%K0PlgXAHsuiXU6+!yEhw7-N)=L{_~l3I z!A4?l-ew^_w?e+s%e?~>Us&;$g$|cOqHD>0TshoIU|I%KDx_% z-d`(=M*wExLka>b)VL;#S9Qt0EdPFl_g{(}zz-SE?{R%^*AVXB##1j1P|Lz+g8twq z0S`BU&TsI@-L$G?hw)i}-0Wpv2=OY-=(+5Khi$DYELc04%-Q!|{iR9^gTZms#{zKb zji6s4iU3MK-$i{n35?m+xj5rf1OxbzX`=iV=azGg2J853EY}2gik`#r?3oS&Mp{Be zeoSvFb0Nr>;dU(@y#5z|cd{sLL)K)|-b)id@6c)J6tJxek8A%nNhL^rwN-f(1*6zx zwO0m(RE1$q;*bdSum9xjN6T^?I?u4_nAWzh`wh9EbUngh`skw%`=D{!OsPbJ#|i;+ z0ypW<-(RJX#U;J-R`1Ux+5~LfH%^JgSKO?Nl&?DxL(2|v-QRkemN$V7cnbx)^#PG+ zx9oJ{`%6R(TD@4qFo|eNo-7R0OYyx;7`O<+{G|H{(^L7DU8X+bw^0sWkf#c~sRnYG z^aKp(^duEzpA-kn_Nf# zRMJq@-p=DDS#P0cf-vGbM}YH2nQ8S?KnkQlfkEy{#M(L!$Ku(PVh2G_{MCzFM~R>y z$#vWNVd`bxx$4=2_h#tTn1Y?`>sOjKx9B2_`=k=dbADJTbK288;mgl`gnKkP-n&cm zVI19c=|`n)io4Un=rCysZIhB$P`3Dka2+|Xh2fF%LI?C3$qXxEX$v>00e#x*Qb8i! zjfd+s+|@Z%g)s}zP>zLU=qW)jR?Qr7$lI<5&A)IJv46AIa=@we7U=-sntPwzWUwHE z&4L-(i`X3Pu`A#k0rsArmdV$IJ=s5p?#N9y0H+Or?Hb?Co&vM@*Y@gu&rEqAQ z^wU>g%m-H6-xMuyANG;dnp+2fWBuzUfson>^s}I%F(Rp}zCE6WdV|oxC7B^O2a?_b z&GiB+*8ZQCa^XE&I*jlF);DImWai8#6G}6xftng1O!E~!udb9NkV*QPKex=@p__@$ ziOYEF^@vSui~uN6hFC4|tja$>jp&+YF4|pxp?E2lGBgd-`^8VX^7aZCy`eam6BJCE zSX069Sn;x1|M|$11h~>=w6y3j6|K5>w~CmfLa0LD(^dC}2ly~w^Btqfg8Vl@jU_q% z`6w3oJXC-mMMJ)v3&5K$^?$hcMr)TLWOB#()-=ED)3vW+brwQU5X7mZ3~D(W?4fHG z%F4|6WrruDoA<8^p3t#6R|5k$vB9K9N?lDA?P`CD&1`6?TvWQBwev1$RY=5)>jtLW zZB?)C96QE(hH>%lj=~Wu<3d#T4ROvM$%w6XG#FhMyZ#$rfFQW~f}EOZPT`*hg!O37 zj50}&E9B!^_v!tfF3ycgsBU13nTJRRd^zASGN z^&^SQP6F2q?aZG`_<-!qGJktY<2&~A<)nE1_|nVxM)D(l|FndRI+S#YoFzmQ>j=~`#}`J zZ?n_&6ghAji4!h={$+_e|}hPEi4g~JciL^HN8A;qSg?*Z_fJ*+T}wy z>QlU^t@e8rs8BFmw~g-~p{+^HX6=uN=F-M?gzggz=R95$~p9sfXUj8r-d?Ms}UXc2(RzjHvU4T$jnX5}<}9sJ>|;ncvnJ}mzF z2dpdw`hglfut>E2`^ZAqe=yw%iNdD^i9uE4jvHCm=Q&j~Nfsupop4zg;o9$V<59HA zTzK7Jh=|d>-$LqqNT_6Dw8MC?1G}0zNYp2uzy$VEMCty=Zk~r0f8L4#cStk8eXnhRo8`GCA#?6_ZvdM_G_nkZJWcanacCJ7uGEO?7oPDp^;EWLNl$dpTCu; z62I9;o3Ht&TR-=$njaoYKb`>_uKL1~Ws**GNF?E0|8wI0ORJ-zWg%5b1!|k=KbUN5 zJK$%ML$_8vUDg{zWKNaToH3^sNR`DX8zv~Tz{J8DK<>Kh(@U9X%%7)3eu0UtPsWYU zggIXw*10;pXVv_20D0$b@KE{zP&VgSxFE=3Ariwo-urv^n;j{vH}`Wr^?O`PNr7W( zcL&{6D>c~SX=nGaUAYnl1aR57hpqBKR%|>@{aMT}5A@Qb43J;enOsK7)T`D_5cTy2 z%h)2vn2dg%fLU=?`>Xvf7};TW7l_7m&*1iH-5qBH+rKRHo+MJkE~eCd+fn1TGSZyi zfO}_aG^bnHA}e2B2#u#cwYp5>maFMii3u2#GY0$vda1e*_X{MM6O`sZ3hk~otP-c9 zuH>jr&+_$FpKXxJMtH^>?c1m({Jd9!Y<`P7NkT?;{cIJGe;oYWn{Yn_aEQtc)I|&)so35?NTi#4^)b2Z>*u zBl3}LUub-sd!ktaOyn58EhYpfy0kCw*q%=r+V(46mR2gGH=vJ?vn5NJ>>)xzZ|}O5 z_sM^R1{(8OWnbM)>&ITlZrpb%L2=pLJ|<)?-!)Ds5SbEvLX{d@s2EML35NPfDlwwr zE`8o&w%Z&srkeIVib_mu%8VZgSJq3hmBQ^ZpSa?4hJX%v^&=zp`}O!v-ecbOcI($} zzSuuqpRp4qOg+Rr!a3}$_p+++)JmM*&zrT{S=~Nvdgm&q&VZeprf!&{_+)PoNE6!| zvAh|-@3W_3l>P7L7LC*z7o32=p=YXzA@mPfG2?y(9r@Y5RS5!b`AUQ}U#eJ|U`(a{ z_QBw7;ulvSbjRq zbR2`Mdxg7*@~;(rQ1E>Ibp`k1B?R)M=xci{92U*j+!5PVV(*0O}%Oqd4Mf&EWzZAowjh@WeU2xG*0R};5!sh+^qq1 z3W>P%q{NoEw18am5(Q0Dykh9_a-~^(mK}6(e!D+ zmDCo}ltz4(_VNVBM19R5SaLkVc7%wrq@%Z*Y zR+isvGs$U=N;k; zt4W8gjuwbQCMq)L{2|(RFgE=@AJI1K@ne5P+Uc!E}LbrcU#=#8iMtPl2 zp8^B`&FBCvxH~pbzwY`q+LQ5t3x=kqv$^i}*eq6QCZYL(zu*sAKBg-<*Vj{;-7N>+ z|GpQ!tv?0bsW{F*5+egq0;pgsv|L9tsR(WIZqc0tng2;eMMdGgYTBokhg?5FK>uD3 zPmw2uD0~#I?n;cLzuw}qCz^MB1EFc8C)(rbc?J1Z&p-bw3y({1GYd&U=Hp4-XHN^q z;Us}6XPobL$d87ftpCBi576LTFWo>TFzKp@I4vjRcHk_>=NILABU<#y++L==n;#?= z`pl1iyY$VN(fG`T)RKo$)I%;4lJ`KkVt640>URg9TO41_r$lTM?7o!KO zQeHo(N%Pkp5nF?;hq@y2_arFeQ2)$Ze)3nopx*^D_Jcv+47Gg0?;VrdAUiumO@zR8 zzKD)3f3GBgNvv`&K`ts7!`DxL`rO~dItf>k_rx#XI4L9T)WQPwvvHbpL}~c>zd9ly z#Ln^~cfGv2LS$>#SL0#;;U=cb4Uie4A!At8{?aLw9x8(!}$LHnAdw{^Pd{S5xed$nP=|GGYrSNl}u zZ!oUi255-*g!EX`qprL!H|SAx9AbT($izrV*2gkuv|uo*Tb*&drh{fn zbY!3OcaXv+aixuRkq;4BuonR;n#?uL2TaU%m;}`1UE0XLF|Bc7st!BJjD7-4Pw?Wl zv7iKcIVaM-hlV~`C}G}9x%H;$wT6s#a1hs^Nbk}k%AQ|B?2YZOpPs8dKAAIkOxvZm zZ{0vxss{gw3FMm4B;xSI`1}OZr;cGUnq{Nz3P)yaFo-E!Prv;VnT>N&LU3G~>K56e z@$#1e7$!);a7WI?LgU=)hTw{GW)5hlK|(t0m<5U)JUt^ z>5EKP!NahyeQ*x@pvU6SOl+vJpL9;2AznYHVMy<9vLQyVTV}EAuKi$pTk2r7k|mW% zd`~JPx@9RHgOuGW@!+-_owlQU__#bww-yJP$PY4GlFMtzwPC3cG_Ak=ULyt3-fY&> zKE=;g!OgD35Chj3l;uy_S70Fab;HqTbAt}eHb^gBit>d&Gr;Vb zK^C_FqR8Ostc5c0dpE@(Z`905iBtlT9=OOGoD{G0uSKygjgnnEZV!%^O!Qa7Vg6Wv zKP|i4(|~JKnN=pCnGa9PE!~LDWrNN4&Hphmc!mD+rplUf-jy)#9%`I6)8Zdb(IvU` z3&*P09*@)x_-LITxNNc90K{Qz!#44fQm|~4;?xMZ{kJTy{7bsz=DbdqR7ZT&iR{#a zyliYDn#Xfvy|nMhE;R1irW78j{KV{7v@>IY``Q#ZF=F|3oZ4-?1ED@|;L9+O`t{N6 zO9@9Cd_kvea1q{Lv1oYt%~@HOlJbN5_d{^vhRp~9+18CK1xmlg^-xbm_?U-Rlc$DR z*5KIfoE3&I4svsUm)v__m3vEqV7^zt_#Y&@?@ zw9%LIlCm5WZ*c!+uTQJRujMp1!HvWoin!<{K)9??`-Et#G&VRhFe!tR`}f%{l7GzR z%SXn}*rEi20oEWnpqh zo;95{{rr0`21z^)+(z}XzH;dnkKAYPC~$L}sJPl6X^$RmO7Z`sdb-eou+vfE!&Z_Z z9lru3Qk9J2$v=O&J13jKBnZy{-Q9Xsz}t-?iy1NhMP<$zzR_ zv?^WRb1|}^vO>>&$<(Pvar)hz{hiWhS>8Xm|Lc_)&rc@IwH$b&aBng!5j*Te-hfi) z8k`V&g?ToL^x}oojoOlIqA+1(`39#{&;CeARUE)rJiw<5`)qhGm-5a#k>%U*yK~$} zvCP<;4*jzX{+9zu0TABLg5~X&?=Qz@kXx4EJtq}&+N;jirA0v?40{03I3~q5bf5kF zk(wTUq2Ar|!jA{}>udLrM;~-g%^f9exM*SD^hZ_ul#+$&YZiF(eo`3l*8Sup)*K%W zpBTQ)_~7ZUNq%p04PuZ_UC~jit3S$8{5bS6d4R@s-rB?bK4%XK5o3ywQFzEkPx%PC z)+Hk2hj(su3WAbtGG+G2?X1Kv>SouI=KZ^hyZf1+aZ-8JeK=df5}PAT@=M62B^Kt) zvXd%d>N@)KHEGIQU<118TKf1kc^&oL+*IoH0l~5-hRhY6NcwbCw<|%$_})TlshnH$ z!E&=MEdAgmAWQs)ZRq}{+MmFsNjcVr%2SZ}#cuOf$JhACaqghw^u8@Iy)h zA#bm_f~SUY)#Jm(LwtVDkhpt_X>SmTt?}@06S%W8(7wn74XVvRE!^dUGz;x!`^+rg z`E3@1jQZ(k_ot8dqubMlLi*SGC|t=I(LR`xe50wP+MvBDN;k^u^ES0oI(Kb$z3j2M z=FQ3iDJ{`O^~2=9?>ZG-6DtJWO?@%z5j$5&ZG);fDxP>424zfNgw z^~^1l6_tWzubxQ_6Rg+vQ)>O@7>Ri!qF|AkFG3EYVDHjuvQ~_?uM@@?KKqufb-g1udKMW5BteG zhxeqAZm+Wu1xC)ALJ^ z;(zJ8hHVA3IsG8{nKZY7{S?VOjjnRKYkqkh@7uwymAp9~!Y%je`N&29oZDb%@OAAn^^3tD(5OerX)#@3b1E?0#TSR3ONDb{;L-zDwh; zU<$h*pK@8$<*rPHxQ<=hnZDGARrC^1WkAeL&Qy}b#(2r2wqos@aQn$+AHb9A9slJ5 z)jprX_sP1<*iEc2#gX~CW@AO2%zHYJ z_FZq1uWq#*DKWlg!luE@0A4skzZ4vEewoiVzsg7Ovh5;l{Z0Ey(EVj>oh0O)m!6;! zeo&cLy3?`lcQUSReOdo9X55li99)q7gQ0szGpW%0gU-4mH;nbJhnbB^=1BOVbO7fI z$9n3GeMX!t4@0ma%ttvQg3pNA76PTRg;fi)N6M5X_T|ozcTa*S;r*!AZ%T(vALVc<3k4M z3S8?M`0dR&(o}R`CC~PyR9-fq@%Lc2?e}sy2VjN}FVs7~^`vb|ih2?tj5n^?(_`%( z{bf!=p>h!^$B_vx>NA|cKhZ}bc+v1~bN4kRj&j10-k-&vJuead)OaJ$dk0E`(ukmV`l7`JL z@MBzV=2r2^;prk@?y)bMqCWh(RfEz{d_=R)x$qgnJ-5$iPKt!SnruE{^fqtc`PT!6 z@m*lw&1{+oQgH8PUKXgV@96_SxlUlP>&k_(T0+fFMc15BA?Orc!%nR>LGA7}1{vs= zK(ujE%h`*e3YcF{n-cHpUjB;o{*~v(;lZo(p+@`iH3v296v${;xnrU-5;4G0voF(Un(LWaS zQcL!+;xqTtDsT1;VfZ1UO!spAUDuTF-lUGRe%y`sW+FVirLkb#K5`&s1^%Pw3;P2V zp9JbSyFhy>khM*Zo;U!}p>8eiE(^*>;M#MQ1pk#^7f+MVsoFgCD#2GLXJlNzxA6(k z{ihdMlC<%aq<0K|3JYPD@%_@o=Ha)TGPfXQbp% z``DwN8U&`~GGs56Zo(F-6XH)5%IEi7Au`kDhL;F+oeyIAv7aj7RgJ(vaFvFzG!q}j zRw$;dF)S1CxKWMW0i{7Y=&f#A;OGnG;Dy>C_$-SK?6#*J*V^Uer}R4ho1l|l5BU`6G9#P&=MG0z>nuj*+=XOCcXFi7&>`(Pz63An27V zTuA{VFNY<5y9H0q$Kp3==&XC=Y7kfc&tx?7*_hhA?)nOS(R1wNxNB_sc3)XK>T8Z{ zzand6Tjf)Fht2V@sK_kFK;+fdztuH7MLRm~%AwtCl5vAC%p00xtwiJ{znPepO*8tL zQKVkiO$#CuACtHZPAH4luQj!6dj9r`;#Gg>?TGBI{~;a{D7Sa+!0&yUOHrfb#Cp?N zsG@*fSV>-DrA5~#;Xb!3UE$8m!iwGdn_A?vZXEuXZwak~>Ad3mX+`nq;ox`@)5!cN z?A*jGs#mxt`D4Bo={f(zT-J2|9^9WS88bC2X%#T%RPbzEBoY# zKZ-5khkoN^nEl)l3v%EtZ;|0j$=WfWX`f`20b>$JS1Ln$HC6BL8 zQKI2Jaw<9haMO*YnqbuR2}sUG!^*!vG~bdg+;@4uw}FGN68GJ7X6uUOf^gJ3f4EkQ z2g1~Tg*=Ska_HGgwEpx;vfzv_Bl3s!NIt~314Hi{n^^WSaUU9@gtrhn{@tD|S@NoR_T(8RpwIMg@i9_c2zur}LptY(t`YbAw0lQ&$v$V$6UNug|!zH@~(5&$u>C*Kh5n{#I zrCZh-`Hc};-n3v$Ggbx;6P32MOye3AqAi6&g z(_PO2NOIoXF~HmS8%0QATI0Y!K4?Qcc+I?)U8PQJAR5OA?-UmAgtGbX1F$-wig};X zuCgTE0OD_9mG|2Dq4N|y1E<~M44A6+_OroT%<5(9%vJp{|Hfyh_M*a&E4`DEd|1Uj zR3^DNx&^5e(?a5nwCe5_DO*o(o*35PcwP^KN_U9PDUsMG-EQ5}wA(`^n4Y{G`}Y&m z2ulW}7B;2{DPzLs{C+&81Pcth}K$!C0-$#b|+}@#gV);`C)@FJAT&S zXmD}}xjh*4*BzKDF;k`2a=pf+xxblJO&39?z5S%i^jr94D82#t(7DFXgWlcPW$jL- zeTlidZ&AvsQ2Tj);+jgE=gL<-4x}zxkJ{i)Bm_^(ZNCw85FHchQzx{`5@P}+w$1%q1l}7 z1}q*3t#0EddvT{C&R<8L)-cb2r=)0+i#(=xJREDC(~@5^^Pic&HSh?%082`ne9C*Q z3@EY-Z|B>a%G8wHXnY?K?$Mb?Qdl-ulm{VBEw5N`QwquYTA$;m!kys# z%+e}UBYRlbcMCAlu+S(fv+8j~msMuDzw)f#0eXJa*tf|FywqxJs=~F4r`jxpLQJpf zjihqfVqBB@U77KkcQWo3iOLTl)>L=`Hc;Fm1N)lS!1c>DNG%M!g^qs zs^DZwBZDE@5o}bP2&z>%)JJuBp%*oldO(PfUNNP7)+tN-JZzo;*5j2a-qxMUMIA;l z0c3rIj5A~}hlgI3YW(u0v6tZx}F(45F;yfi%_ysLa}v1`APgMsw> zPk6>g8`_R~Z4{LBQrfxpWJ@d;5ibM^o6{>ZE)FL=_Wg{tEsbth)VH=9S!=mdsyPk}Re#?;h( z-q{Uf6Y+qL}=FC|EI-z1+7DzYLbu{m`)g?An27}P*-z=jTY_i(b_`}&J<9p6LlvI=ld?-G@l zWHq~w%Fprc=3s>T2UZn81Q)T*i!9->{89Agy3(ubdfl>>D)44N%~)G|fuE)@0`6vhZO8e;0Iapk z-u>}512tls5h-&gd9Ola0PlRNP~-{JyVRknXMIY0$x`7Rur_3m7Fs4)4m~SkG>QZ> zntEmZDFqHho3?p&Yd=e+1C*s}b#&GE z$5cWDr!d{QIBTkNSY=AC$pcWpb~U8pMw9s@Rjy!I(Z%PauW9r+>sa$aH*h;1KiU4{ zj-4XRo7BhM7YpIdvaPu2YIyw8N!TV^-(2UWcnpLoZPW9z{H74k;!xSh%0JH`(`^1RaV2S#6IK5#@P^h~} z6r}aH21Rw2boEiVPwfj6J82xZC3=6>oeM*Md53oSx*N0dWerwFS0YmBjP6=?w|m?* z2LSWVA@u|>g?&YJruNcbk%Y4DvBMru#}xE!Kt zM;T>Jo4~lKSv-h_4w8`a;s3{`Z-#$JK-n^h@R!Fb4EtP-AoY3sP+aha%)8siCXfJi z+M`>X6i4~}rxF7kN#QJ+@<#F-pV>he5nvigVb?PcX20*NnWGrHi&SYM4_ef;XHG%HPo708(L zh1c|MtX+R)uTE&ju-P!z=akFpvf%$n@n;mTPqmW#NP+|#F#xug?4mw~(B?lTZQNdv z5MMwPFv4=7H;tyQe&o#F7s{|UOev*SxJK?I+J0Adzs>hAHQ=$@yxdpHOdozGHey=9|ue(5~b4mCXK(pak8q zzEC6rb{!9hzt`uin?LKtfQi?DT5_*1x8}Cx)~V{h6*D*)q6@a%k~kPVDA;GW=9Rdo zY*Ctwz;am4UL1PTv4Hg?p4#JSeC`t_4FDV;FNCRiQd>$X47U zg^?in0apy+xp~n4OhHP+V_piLC+0;v; zhpmQJshH~Y{;&7T97hdW8KFGyx^A@+>p#6s8Hqky^d=cCKZvK*CBN8wtv@b?TeyEd z#OMvjas*v?>8E8BUPb1y+v=zZLkqE&tbyoCe&wLayhQX4UG$Xz!wMTWMys30-od}> zfe&59+q=E>itwIxeYM9Hv>yhf?)ucq{Q^hZ@0$a%##I2`*li6|?4@nq&QXRjraOkR z`90)tJ?(_iP%+!DK_OE?a^>AtL41jeL4^rf_YF`3YKiislp$2d_>AfdTJ5%G)>HgbQOK24B`(;HwrglJc_fuqlim)r!!q~B|r}{O0 zjT%6@7o;pG^K0=h;jOLaG#Fm;G_V#Ms_u-rOJN#7mwuB||I|giHgDVEb%K%|!6}1m(1Mmji5Q14C^m zToZ?^8lT_oqz-1O$$9VNi<;dhv#Z*9Pvc#U#oHv`A47Tu$%)Cq;LvAzs`5wK2*HwO0J_%7R6^ZPu;I#2{K645mbGp z-V;(Lrh!TeuV%%ggZ<=p*gxq2;+x9*hg?z)9%!jub7bHg89{XJ&)}CZ1|xXszo9*> z*h3>jOOcjvkwD}mFyX{!x0)F|pXyKv_STCYQB2v-)t!^!1>CBN7%EC4HwfZlsy(F6 zgW>=IZsI6qY&I7I&{mW4k2YI9Bdye1`qYP?3g=2bJ2nvd4l)of;~vNHIo*4ms)IRv z#zZYRYJtwsHixI0QK6hsPVs>n+mG4~S6%E~1l%XiE^rJ2C&m#ex&0{cb4y*)lG3X!HdP#_FS2N|BMe8$}#j_2FdI~ zl2a<&I)ifG4IeK0?E;aPvrJt%HKx5oN;x)8j4wm~eZPB8xzC!uSiYAnz*FcO_}{=B z^Hy%&?-Uw!VxIx4?jL_MzzN~R3*+6R&b3xX5-dt0PczR+_f8+It zFG&AQpH%xW)>Dew_Ij`Yd2+^^8qCwS3wGG~><0YI^SXWFJL{filo)o8L~xL=jc+nQ zDUPD*kFk*Nj^?7105QoO5oGCl|D4xd{C&%?%jyt5^`{0xK)-12dded=N;8lY`8h{4 zy6x{9mPbH8H5UkpZ+RDx1qaVJ?Zad z;w=`?BMPIde4Iuz79ai2&ZbZ?HPIBJp$%;rJ&f}j-{3}*6TG`)H$J2K&eb2`+upg~ z%g3E=>k=wy;dFj%1f=dInD_etqu#RivV8|Jv+=Te%i8f4(YKCTmx!?RUpKhzsxUaJ zZ{FU>NPY}o-y{44L`p#q+7i{r=zB%ypsU?b<`dXb|zR>Qr`o{t>OKpZ&XP^{+egzH>=-k5Dk9AVMvC&a4iJzz zTj+1De@f?&l*;{~KUXpTEm`pW(`cJHf9?hN9gEa`=Tz7f#!!ry3xuMNZaVE-40?#+ zEl0b3C~NQvQ15rb{12*lGUCDD(fi?kODr80smoJB~k5l(e*wh>thI|v=DaJTg`FXn9|pUBJ5#FPPp{SL#n5^6>4p$k;E00 z{a60SKZ*4CxHSFC*E}4bNQ;w-eZGgpOwRDJ83w)PLu7(MGC$6x;g)PDA=Odz;0qSc z<}}ItDb|2heTX^DIr&?>1p5wba9)?w^N${t0u%b}U9EW6NJBDqI3O|_ehRQfDLG+=M;!4h$PtK~Sszq!*V z1vGnu6s(}SqdtS_+|i>JJG1AwC8hYc&p7UU-?#gNqB)mCU?L2&%$xkFjCR;YE1tVQ zY5l$2aB zU^8d@d+-C_?f1gpjrKt~iTMX3k?%e^ca9)zYo^~l*hl`e^t5PhpXMop^QyztXR*-N z_H4cHM-p1|bpNwz<==xe+Q7-Bf{lE3QA)$l@sx=J8uJI5?`iG-$_%CNS5cBdB~{~R z#YB zj%;FPnJ5)p#97X(O$eCzuQcS#1$GCTb~&9$PIRmjqL&kouC)p@JAYRCK8`%;?##^% zD47Gz*4zHu>Sw1OT#KHSXQ07*&^W^{*#d$GlV$43Znv%aXCS(Le`(IX)~qejC_Ywl z4Fk#5BV%03n3}3cHN9Qi_%3Yuh<%p9+%BIxsJ2%UA=Wj->{Z0U)5?3Vb(FUi6u@&P z-mxBjq*VdhZqa^_uDzV;mjR!GQjxMe#HovLc2~PK@{dPxCcmlu7%HzY3a8hGzV%Le zv+H+^d-)Q)s9WR({O2Hrc8|B(Ews;ZYlU`KL+SqVyX{b4<3r=%SFQ4NqsVV{qwy;* z2*frK5XXmZ*6rahg#KFBQ7l@>Jnm#>!t2j{w*f*jA?lwbmcY5quOmJCBwF6zc#lh( zln^)*>TJB%Jo|oAHYS<1)1_S*D|cOTHEybv_fZ}N(%M%Pb!Z7Aj$fb7y$yrlIN$w2 z4TR+N9Q8bOxErp;@%jMGcwb$IMMZdoIjMxs85grRCF<26EQ3z2&nMT}ZeB3r3GQCT zV96I`Q67u$f(UY05=sf`!+A*VTbC0FEtpg7_)|V^FHgil5fOCTPj`0+oAR-|M6vuZ zqY5Pa$#P-!--{W+)DcMwHX)|9{BV{}JTC)?vQwO@274gri;G2r%RfKZGaA3I+M8bf zEhEQTO*%+zej{-VH)RYQ)$=91X= zGdjL2Azxua{4RpWyYvgF;VX<`vr)QwwxfqAw$QK3c<=YNv<7-zji67-5y|SSXrK8g z^M1NHmO0j}?FcF8YjgE+Wky}#7QXWJX~2-0rrzfdepdohw>IO)+gDiqHXHyjL=W~A zFfMNbQ;hRI&`=|MQ2a(+*s|`Q1XGW zAGu{3w}N>|Vacml_*pwVI|!cae2vb(^fDf;QP<(mHq!U8z?F0J(Gu=zYYlE7q447` zl&T2-rZkY^C_Dl%q}XYz!(p*AzJvLNocP`lY3`19{9(MrSpQsZ>sWnHV*UrD*%Hx5L_PBBO&XPZ|`s z=oxNL;OP8BDs?@7#o(F(h4POpy!`&tuile`9oo>wdD))FBF6Xt8ZXyI1pl@)Xd;iB zsL$$>qZ>Lv!g`Dv#CneP+q4;!aJFATTci~et24v#_$d4R#8JS6ep!RTQ@jNaBlCXw zaZmP?pEnKlv!|f{N4=-yGYvb%Bn5u#b6~oZkhVxalA1&{0hQ>=yK(MC!hH`mUVrnF z+@Hp^s_y)S`a%MZC8rX+)ss|8go)Bo>hvw=zrx;(wwg-=T)Ur*H?9XVp!5Q&Hmn+JkaudjU<|DLjCDS^BV^;8m?Rs*Tn;m@#p}3ZnoFj_V;5cUaO#$_!Rn6 zV%_rYPVaqb*80m;Wb)DyO%L48rl_RDGaTP?8?KQpUAhjr3aN@K{yEdXTxc}GK8JGo zyk--D$(|D^v8%)6~U!0<(EjJaXm3%7aBs8q4v_C70QyjAfx z5m8SV7qM^LUo<}ToJ_#S zA0Sq5wTvKbnR|kjyNdT#2`*=I>Yn}Yfn2be;p#06J5ENUYGT2CxP9_xzHo03 zX?aVwVGMS0x_e>LCHPtX{#4`f629`Ehbu8kzES$A#q+6Sno_bvJ3_+A!W=>0ft$hj zc{yK2V*F56(`9bPcriOY+hu;tF6BqrlGe=Tao}?5Plt{`_Y^XOE^t%h5B04>`{mw4 z=N*gG1uEF~B)m$v4<>6R0U->JhM|%C1p?jlE-`=sr)BMj=+q@R>WlJN+ z?hM$-=?hXjJT{=jU;-bN1vIFeg|h{@2o%sBe|5A9^Ob)J#R^o&c!-1aFdlY2zA3lk zrv!(%a~u#UJbb05uxM@L!79$@gZl{r+9;EB!h9^XZ4vxk-b)YaiLUiPR`iYHe12ea` zPsSuZcDq6yCBMfz4WrrnwpR2j9n;`3@j5V;>{7z0L5lThj)Sj~u&&?e-DU)Al_9p( z`rcm=Lo<=MYFM^kafhyPCIu(%VOGOs0jG04piUqJVVQKk4sPDj5L0vc<{#@N1{NWK z`!6-zpLOzo&T}p< z-19pb@_$p(;b!FD!mUl$0>!-R00JtEZOSVwO1a6wWKhQW-o{P<(}*f;8=s-54GH56 zZT7_**1vNpw~n(Iz5Q)Y*a|Ov)4vH!S0f*xB|Pk}5Ird_vRg9x0z?|>)^jW%(f%O* zvOk5p;~PKhJtE1vj+bA$&SUbC)~0Y|hbn&r!b3i$?d}^xGcckG^dowRPgC|>pBh`A z%JK5L-?yVDtpY-pDRmcoBI6Bkr%@ZO%0|(JM@Xy4j5h!h~ zO5W~e=I+XV?c}owAD)ILAz>Tgm1~)og4M81-o*uJ&HfZ zgIGY<>U^;aFbvY8QjNw2^UrS1FN{vzy;J?g2WOh|)nD!e2B+UOAbN4AB8~jjI)W_Y z5{!_)BYkC)Tvd}gQ|HR+poVH?!@9Z3SS1-qQ5 z0{H+}VDr2~w2CU7=0mZYLCEPJ1TASEAz`VZ?q6~`H{uc8PN$#b z+=E-0%~=~1Z6M~_`HtMxucKcB8z-ow1$3oM8){+d(vXYCobYB-Pl(j9j#NDTP&#~I4dqUk z1F35Fi@Yt@_PslEcwg)MDy5W~Mzf3D%@ns>*cbX(D8BjOESzV1Czc18*a1)5U&k2} zhIIKRi}|Vbdy;h)C(gIA&ulHYX9!(fvViQK^cbl2(IOae3yyTjgtKk~<7<`pgnthPZprs+1e>WZ1=g8i~PSjxzki`xJAmrQrYD zN2dD{qSwaxJ#Lpd#9BpoAX$ij{fs@9wD@bnMA?ih$BHq&mh3h*piSEP^7QA?VF{Rr z7y6B~G2Ah^9o*!NzieVP1N(Vg+oY)<^_I1?PxRV*gBd4=9z^T!_GO0{kW={zokG;% zquFOR&0pe|M+8yr=V?->6$;O?&iApqP&7bg34r4p#c(!AMm#0)5oK z)%v&b5c`?0>N6MV6vKSWo5xpmpGeW7^c4O`-^zP_7qIrx|etT}79PwT_mY(A0Zh4GHa3}IiY|r1H=(uigRw9D>g%; z=&gPrF}K-wg)h9mmN1wcl}*0wKm*j0?@QFsW1G{OywX?)%_o^Kf1nV3*vJxa1w>qd z-gbXILOLrn#OvknFGj`WXSV*M$1ko~)Z`8?cs|$ER4#Sk7Di-IgD3_)#KfDTK%n6w z_Ph_-F=gGV3rYQs_wcYqSx%{c#}g0)U=7z?Evxlpc`R$uxa6DQ~5qj)3`J6@P5JT6(&}Ue&@nQIWbBN=0tz0QI{BBaSnWmpvOME zZf3wSGR#-N{Z4ZLb`Zjm>cnag%(>liV*m>4HE|Awn<N71{h>$YF7*rt;K3#!8Xl_ZQWwR%4_xu=rBFiXO6s9+c4U6C(k zm8R0$#m^cX+v8c!H#2+1ie&0AKzzS#lp-2d_4)3Rkk}ZGGk5tKuLA(KG{Kyx&Qq!( z$%LkTART&goZ12lZO~7BDejIYReYG>PEwq}w{AcE5U<7Sc_ht4ia0}C>Jv zgR@Nq8kcT##sY`#XT9}=@Xka3GByzJYNVpBS+a|10jb5Q?gU-03@f*ra3ckfCe7Z3 zUN9Lj1L4)oF}#12E!8vXR%wA(qaGG@m_8t3_EUhSBxP}$&-V0xh0kLHw$3T$urcq& zA6`k}EJjnA-XLo#Jty`qd1m;I|@#d&-PZj|=j)r}WtAf#&Mp=K2Z^>Ep;nqM_;| z?O*|{w`*zSclqpFX5d)@2u3|xqKp!}n* z)O5{Fo}sXLkJ#>e4)3x|tFP={k1V^DhyL7->ZZm*$pPArGc;?$&=ldgxEoIKx07?9 zvuvrBp!0_64~G%k-j~-QQaI5)GC@7P-E=Cj{0Fb7?M{gDP}x$3Fe%4OiM^dQ8=x0! z^OHhS%bH4X3`^jvphK=(Irz$!bx-K?e%t5{GGz;48O%dJg{+B8y2|uc#3A|o{PC=| z@(XJc_1_vUw_$9$N^PNX%+vOXPmM$q8O?fYzOkuY!IQ7mP!%2ofp>%v8#>_8S10iMTUT(~E`WYcJ^jVY*RZlQlKCnJ_b`45zq<<9MP3GlK$uiLIIiof-J zpdpH^$=C$KrDBKB;A>|fWd_E8RoIL=@8}895g@=hgYR=JwygD`%ANuprTY>jSxMH0 z0Zg=>p;<awh0?JQ9r{H+w_!>U@`2dHQKF&W^A$gC1EueegRSLI3u?kns_@X^f zHw#a%sbKBnf*Vm!DC3v$Dninfp02zRxcR6b`*HiK*hvYPQI8!Vpmu$i*&vME4<=^}=$DhF@a_Y1Szo78*XoSWe(18314@QGO=ktnJ4SM_iS9Wq? ze0hFP>9?e!Aah0>o1|hY71j^#jz5}u49fd9+vLyH1igoS9xneI%p90$RuSkb?h>t# zLFmR1b;Gc08qQZ{MfZ;ZWgRD>4)}pz_aXeq^KS0L?Y8&o+qqFHTtVN}yZ&9H`~F!^ z;r8vLF1&W9&yQeUX7aZvn2W)fkiwkRUqo#Mnwq24T%zV{_O4br3?9;kVCY<(o$2vc zy3r9pHvT&pL_8)|-qlh6vXg%dSHz8$=5ed^XLuvkI-`gdBNDg=9%@P@Jg)zGJ`d4F zJC4FG3I|#0VXH5$g1iRK;IlNzsH-G9GOEG_AGsT%NyszJ3&%>Rx z;zfDaXkF)i9a3?>c<()%P066zh!YblH-!73?dn!8P)r%IYWjjozJ}eQJigrt*-X*1pZj z`cVVWM8Py)2aQH)99b}(kDK{zlTkITooe)JHOQYZ5UtGdmmO}+S|Hm``DjFH)owJp zPBOa24H@zmkgd2A8_u2dwGVz#ZX2cujO^c~zBsa!AB{x^^xUxd^6TKba=QmfA9xSb zmmfr{z1L@)CY%nGJ0#zcTwmA!{D$@!iI(;vE0K_hM=83vq;J6YF-bS z`@!p5RI+YA>kS1~_>M9kPKTnGUGy=B5fNJVy_nsHY*$wGj(9cMg|uR{9DU;r<;H=6 zy5lVoOT76sWejIt)`Eslt*a8f=6~vzc5xq$pLSVyWx79epgJ#py7Mbbp^i4e7=o09 z&G07pUsouPGQ9{r-(X2om3gA)-VAN*$Htea3LOA-TMcZ|8wXNx_#$G`jMy(ZbgL?& zEVw}Yxkq7Nj$>oyJMF^Oqk~~enEYgTF+)h>al7#q)%VMhOIIK&oW6DG&Q#6`E_;Bb z{XQQ_CTI7~+(<3RpPzmA9-1_B$=<`)W5~KHeMoSS{L|>-F1^>tPdfz_oLa*&b=|Rr zU9x|-^w*9>^758tB4t&-c=~hooXb)}Z)jm7?_EiA6apDNz>tfJx?s_x z8+(&9*{a_v3$5Py{REu0-$2DBEk6$k(g>fwU+jXH=Co@VJYS(aC5_azr@2i$DDBC5 zJy{iJpLzOSDCd@9_&(o}ZDRkUN&8upP+T`z)(kUBcf}{2xzs|#H^3|d4n^}mv7C;Y zE9%X_-TixY+7(1pQ+m<^Bd+16L;UR_4TH*6Lk#m-r`KcPR}bYZh%r!eZf|k=^&$La z$wvn1Ne$iIM!FDC>u8vvem6Y)Uo$Po3p@G-fh^At#UFNuUgSHbpb8TblovbsjyNPO>=lI`z`aX38(7zd&&Yw$l;0WPv zF=QgS#(a$^!8g> zU-Fmdu025|WUi(mO^Ryk>!j6P?wDg@0R5W@2?1*gFG~_M9PyI954~Y@WwO-GerHS( z2Yk4>$rig)ZVemefHYWs$Ga{^|8ERqD#bS3IGVoL@szwrjq-gPoZC;+OYbSUEe2=Y zMsjpQ6&02JZLco8^fP>Z5wqXyAAV5+{fo^l8AvBoD%Dl}$>|M-!&oHe$4`FRbaEw0 z&_A39LK~4g3D`2Wu+6rQTXDoakff}6c^RebTP|pK>$`uAE?c@q=;425$(8FB1tnW3 ze_(JJ%Rpefx5J=M`uzEZ`L{b5>${C|y|)MSj^Vop5>m)E}&5^nG2~FGNLkjV76^zC>9c!M35)o?xtZ?qW8bat;kw%WfU?2S^0keP7zM zZnIbz+UZAIHM-?*#&zmanV&r^p@UjdOegs{D z`(EVSl5;CP1WO8$C-pl7tv5Dl^2p`RIQ_m{lPX>FxB7K+y;D@V4P;+P54nd%tC%yQ zfuS@T33Sv;jX%^FkauI0TdtIf++z%wH<{mo(*CA#Bj0nC;+;%xKzK?~xGP`!OMd|P z+Nz+v_;rW9Rfr;rqDTm@?5Q($k)JIO2Obv>=U^35sf8HYh!`HRR|F<5E+<@S&dT%H;c!z-1{{*1qdGp}~E#MgKKXyyKY*+#fy2|tdBw(dmjA{;FWJMxu#L6b-3)K=k|&Yw@!9aYyAOBp zAZ?~ykFM+;8y$WumD}<;j@!ozp zRQ@4jLYs&36jF~Oy-m_6g5=?huh?4<(-}AQw$7LD8l~slkt2nB8J0Wfrfo^iGmszE z`+T*8bw2!u@7E;TrEz=k2Us^v*%_8Tm!0biEjF5w+f;)aIeuKQee3P=D86GgLBmdL z*$b3;T>M|3p#^ozFjj^(x;4w)XgUY1VYHGev>!+uu+qK3^;jHf2@P?vv!jB^R-O;@ zyhi=u7TuIT-?UMzhBZzxDXGX2WHQ4txn;VRiVR2}d;S0_eazqW??5NMAQ!!>syxm^ zgpN^amhd(}ld`~@5|lbJGt9>^}B7??g|oG_a}hF93WM+UqMz1TN5CMIy> z!D4N{3o0HYvGJDc;SvA zkgPx7*J8JB65HQ4P=f4<{1o?x@Rgp^&3^GqC6Dz@7%J!D zc7T!^9p?MQ4y3;-z-7fjya{rpba$x;{X*fhqjywRfGnJ6#XB>s0uaDgB%+X{RPkR07eO1Lj zyHF({>1yUv{-S3vkMm_$#rYa{rM(WZ{$WVifn;tzHNmC(2$&G!W6NvF!~v@@>vg2# zUIby{+4}=pYt+QosiX;^g{1y~U&~rEn3ZkBtzgs&=hjH9_+J7C^VikyzViD!z&}`l zcMp51cTM7~Si*nN^HC;g8+LR`y7o_?rAuCR!*s#oNdBdtml#tDh8TVW#E)#2pQ0(F zmj)1hm#(}+H`mxhTFRpXE&H$?)BZooEo?8l1(cz`D}z+ za1I)(pziny?mdPLzXI-O&h6|{rvMkfvD_{mn*Z+0;XO(5{Q5B}c=&i9v=SI8ViSo7 z(+f6pj+ohMf5I;G0R)u7@XO9OF*CunA$a!m9BBC7!9Yuc~SMkeuC_q(dhv?!x zbv>aGKjEAxdj5*BP@B&4+6e!iJPk-CJ#))&ZEWF!zY!@6@{%l)K%VCq?y@F-^Pgr| z7G{Yy-cMjRy9?#Sb$aI%6|joUm!9ujWI!J~SP7g7e4jHkE2r3_3Hb4BrqKFs3z}wN z4d6OZHJ4~ghCwwe_ipcr`bK_BnE8xF&59gT-f9+uO_?!={tu|ip=veem z`*_^KiuL+H4z#e8QY8>#r+)oy<#_Y6J4y6;WQ?S@!at}tV~HU z!dxkb&rLPJ)-Ci;vP17w3`D!4CmInFWQShX3sA{}{_#p%VYEehWWwV{>8J*zE__nR z-*2%DUOIzkQj{O%2&eS*c=i~1ex$-n?knmAvZ^fLZLcs4hOa0zy*&hf7nd)bo9 z$~?5H@*?0Fn^&T~HLBD`pf^Q!!>(0BJX()?-QO3gj0X@kRy4o?Z}>XZo4P^gV4yY# z>~as`tId7LhI-8ehX?-;D`t8yvHRW(Ip5cJRta5GVyy-%+kQqRQ&ev(ox)ASl~Df2 zxE0&vzcZDY}x{PUk^<@;Dx*oAEbdD-o<(q&|Ge6Q_*6c14pC3Q^ zXvw{ZyPaJ==6B2i?0DATa3A9)e%IQuo`pQn4yId)reuFIG*aGaSRj(Qs;c&nXTbXm zhBo!&rZU8a+aFu9yHzV}NSD>%`f%;fjl<;R({%Ct?E4M?0%DSH9)8b7Eg+8eMlmd8 z(ST<5hGtEfb>aDOS$ZWX6^dH23%A_9+ih}GT3#~Rup zEzbR+s>sVY(K99E1gJdxkPRA`OGdsKQMqJ z<V~yBv7!)XhFtD+S-4;wrR0%WN}VToh3C%&Xa}M}L(k+1L`edUQ*cWej2Cor>Yr_d8OkkDkd&eBH}9 zoP;Jkky%PZF|!Mr6pH+ymCqMh-zjWDKR%l8-|>Tv4J(SZ?GIy+xca??m%)vNyD$=7 zePDCa9i-albMyB%4+Hsr`Vp~z#B}fXU#!&)to6CyYk2+jCsd!67@Gn!ow z(yi*A%di>!p(w_%7B-Z1X1ar1l{KV1yr~Z(d zejI|l2)Pvw-J^T3Wj3~2*~{V%rnvS+L5(lJP#fQ+8RCqpgEl>EzO1cu|hw(NL}8Qr0!!5K5L@tNO`MM5ycbf;R%2q9doWA?_jk0 z0rzolSK4K>ZT||1gYf%N9ts9j9c0-nHeT1SG3hn8Z^wQbp<$D9E$-!8Y3CARc=D2+ z{wIxKAm@`+AsO(C-(|EP#S_)a_9JFt+UAmP#XGgPGxIW9a&F&!<3l_~yb4ky=fXKg z6xIw%MlKVTO6%a%BNb6UclG@_A-T>)VZX7<_RF%K*Ae95Q#xwfWgbeZX<<>;3h5se(nuuAM8< zcjlPj@NVV97)@+U8bHwOqe z?mnAp=EL;J>r#w#v!gJ8+nI2G*AKZzBm32Gjl=-9WR)2l%OKr^WS*S}#n=-w=fV>xRnl=x=CS}1tCuiAq$==C9oGIg{s{W!t5BU?T)l#YErZrmE{_Cx5E;9_nz=FK+GqoO`i(FQ?gv#X8oF!ka}l(1cg zFa3HdT=Cr^k@zM;k@xMpco98J8}todqbX10>2y)_qS-King`#00s+Hviq=mh0#!O0 z^vWVh4Q16orj#%Eus4 zp}Ji)$diX2!Z}U|1(kf;UeSH~&a`ms`ARL)SA#g8`j z+j?3+-=y{J(XS|ntKYrTet0qm_H&>((=&7#0w+UmTS0g}H@NO*^hSgkypKT7A2EQH zGJ_y`<4rjgW)8S~M*gAo*Jp)UWi%7AYUnjxIFOse0I^MSX<}n%(9ul`*wwP%-};ju zI36vF9Lt5T*!)(iSXw>HRLGz?ex9-0D-!Kek1Gqk)8Znxu!(!+&WP5P0qfw}? z6`@2@s|N|jtA_MI5m*>V4cOYw@N`aMbNEU9j?|*n?mmC{{Us9g_C)Yo?=oSJlzT{+a84Aq~)VmnyQw*GjunC z#00=Uh{3~95e)5bZHC^t)a4P?&S|%vPqs{~?GgOY6Mt#4?u6b+Z$@Rhcg64!cY_=n zRuxu=>-UD{a{!4QyQe*RY$_(LUZZS$QNXWXaeJZiyG46V%3ruXnP$b`a$T|=NaeeS zwF$(aP`;D#xM@=9OW%v~TKZY8zzlI*eXY;=xu*Nq2p7&tpvrsS()dX5hEvpz7^%+t2T3NsAlDX&ZPik0Okv?F%MtJth#7c#N z$K|&uVIZiB)w-EFi@O6vSVcc8hztZN!Qv9W_t1fr=9+bI~Atpc`oeemyTE3%Z4^Jl$o4F*I zs#imN)w?Clk5)Lb6k1oRDaE;ezsFO%oa1RRCi>04V|rG@luR1HB;sHZ!t99iS+2F% zns~dU=LUOey9zQbzcG@IYcuhG9j|srq^2CSgFBh@ z-{hw8*WEuMXGXhvCxRHvl27L0#G(G=#s8auZHde`F>Rbcn60e(QsT6-h!5%*Q?%AwP| zqz%A1Nq)VUgm`E~07^k;E0p0%iDnPsK`y*YB1Vg zSY8#RhMYm!=T>l?5{`}e5nUWeB9Ol(<@3P0CJ)bf&z{bs>{Rf;SD0QM%$JXmogRwi zj9>xmh$rmTzQ1J%*bfza`Z}{ntNuXyT7lbqro zK%(;ME#oyqc5;51lM*@P1-9XvzE-xrQqHLK{f^6P_3rYj9<^6r3<4hadWbE$Y;0?r z$Fp4X!=oAYh%^{OAnAYdGLxOXq;)!VSN1ulUw~>0kif7cqmlOn?1AL5Q%M7LOVJGl z$|8LgdgzpN)RbOt6IvX!FV*qmhZ=C$j}9~rw=pRq{JQ$2PCtl_-mde!J)`&Un3KzS z&uKf}8HYy{tQef&snM?kZ4L!*!8m^Fx$7>f3%!&{3a8!cxFKw!U^us^ig z`YXEJN?aeSwk?KU=eVPveHQlx|G@1YS3IrF_g;VONs$)_S=+ow;>{(AE6Ct`)m!4F zBBk#g4K(h#aiEKsfH*hZDLqEzP<{jLFF>B#I7qB8yyiYF86c^rCRKIqm_TR%&*DZj zLY0iss)S@u54gJ%#5&VPo2Ps|=HUbrfB9uy5wFsu$g{scS#D3ai^c`P9l%qB1HM`) zJztWwf3?wB#Y1{2qvyz+v|F`;2Z#=3?0hlQUP%^Yfdf>Yj$*s=3Y?~vXD4zZYbmO_zI$bNC^ zWrPfr)M;;=aHa%8oFexLO{}yPy_6?B=PAgRXGx1dgJvc2Yi=ex)@f<~gEY_-quDz1 znEBY<;>J)eKjRt`W~E~=nCKkyX7M0>4F9$nA>P+_m+b; zR&`~bYjZ^t2CEJ#$2`p~{W0NmgFEFB^{a=M8@?O{4bA*pI>Dl$E5F+01JHVF+irNC z+fy)p@FK=jVXo!1=I>TX-5? zhL&!D2s7*UN_Vcf&3lu($}Zmx*xiBDEltF>mjX;4aOVWOP!?OV>?~?iYwHE}Uf(hr z2>@Pq+p^^VOyh69LEj#UB5qGsh8^RO$T#c1+MhqR&P)FK##%Iij~~RU48a#W`U+Av zSg6xe^-TQZ=%xyd)M$3oJBogpC{J$wcvG}Ip40S=gnI1`?v+}oi=w~0t0Ei4c#)}( z<0mOB_ZBZ5%~;ErvRB@`pI|@f;ykCa)|=X-Ra1!G`B#G>;*0lcly#7o1+CZnX}c}C z1j0e_l4SW{@sFN)NcN8gBRyArmERw>rM46Ue znx@o`7U8)+rs#d|$OoWJCYs3^CRv?w5BoSv$>)AX^;UIbQhve*$~WmVYR14$?)fv`gE!LFtQVI80$TPMKd(|{AjVAkYv2bi0|s|% z&aE%4j!8hk@ofQ0zHk2P3m*9i%i7TGmw4YDe#?SqE**|CXQZKJ=~X=+Y=u|OZ_~aj zIB9mMK@8q4Li8a#sG@!s7x#MAJ)|XI3hxFh_lPHirbGPx_HQs^Vk8P0r0Go?*6ktp z&^WH|-X6bbBZGpz5{^|5?$A} zM0H0ck=g{w)W^PDwH_-r+|?Kviu4vu;4dyol$j!cAn<)n>GgV-@Ziq}cH{0kU7+xY zu+srq;NxBOqQCzFqEBWgsDyKvA|n&T?NJ1$ZZR!;*d1h~okcoW5&5R$e6f4WXby+xFmZ?aGmQ{v$M^FW{HinNrNJ zzyYe4``}_~D(%DKDse}JsRc#yw_WJ{;P+i03`*Xs*#&p&Y1;|lu`TuB@D}l}m}pRX z&1$z38_uXyS$^y=!=&VfT(jtm`575(18m=E+|IhLb@=!BKmPas&-~x#|M1WM|3Ci2 zKmYR2KmYt^J^`PIPs8Wp^RImVozMTx=l|jJzx^-&{PTbC`A>WTKL3T!|HMoyvixI46FK_uW zS|E^=Oys95Rq4e{PVknv(F1|c$wnnQGL01+;0DimL(&-XM_D>BnpvFY8Zlx90-x~> ze^QX@*1*HpYiPD26wqfoY>xrOk|@L9a+F) zR1a=ohX<1==&6wcI6;BoO$G zQdFQC4VlO$ZjtayYeycc1oaXpu!cK?eWlmLrVM>q!6mK`EqNf2lJsPxAWa#~2JZ8L&%X%- z67v`NXhsJnu!pz&m_ok!hlUJhBilJl$hT^Sr2N3o)QK~btv zgWgPF5myLFsdq_DMrt#J>8xT0_ehw^tm9w0F^w6_;~2O2{Cn5oH_Fk9L9F8-PkBqC z)bdUNYSNkR3}PWG*vezR_`$PMkf!uw0vkBV)1X8@x_@fZi{+dm!cX=a%F~}=jAcBN zSi^bl21WeYn(`CHX~$4DaEzCHmquSuG^o7ToaroOH7A4ai68kTt$9pSCNrC(9OoPt zi1drKr3@YD#tfEnj=Ov!@vrhn5$XlC6?@T#m8|A0pNRjPoRfqf_?;Xyr7QE;$QB;( zh%bIOb0|YyMlhB=9O4}b(|Im3P?@d_W*SF%NQ^)13#6q0mFU52PVs`+e+B|sDMmB? zr42pk$s7)FkcT`cd3x6*Hzlb^f5O?zL2eQ?gYAUW{7QBj(wix)<{EcMn9+49N;MkN zgW2riDpCGY=VTx|MJYyYhOvlsoa6yd2+L#*$VGX2vYf3P=Op*|$oHA84>f4TWVUdG zr$qeQte`N>8NnE~aEDJs&SIVUi_Da#7R~8EM@BJ~?VRHUA4r%r5Xeh&CUb~~e4WjF zq5}13NPmVii_P5R39m_#-Rr4AEjlunrR?E35py`Zk(A7orw(0N!ZqIVbxu7;8q$%G z8jN5R6WPF3?h`YY8ALIf)1S2*=OQn7PlA5}ft*yK8`C+-B_0tqx4t1Oxu{4BdNGip ztY<$Lxk~&z)`t?*qX)xS#ueTZKd*BO)#%B%piSa2E)X%Fb10>0&s1h{l551s@2pC0 z3eb_>3}rG)Sj#P<6i^G4pfSxE!)~7NiJuDUBkC}i6>Q}YZ;4q*{>elG8ZnVW9ODLW ziB#BYNlT%i)?ynbv6p*1BT^B25An!EJ-XAM@oeETuZUeV5cr!yv|u3PnZXHO5n9ak z_>nSnVF~AnQd~{)6NPBQOiu8Q6eY}4+R~0L^kyE%xX0%u<$x;mVi>d7&t0OGGGoX= zHM-G<*(_!&w|POb(q;_>X~+jvSy zIoBWsf08|@q*$N93}HSC+0IoS@Rr!+^#Bn6R70}~`eMUOU(}$HD;R7kET2D$+HmHi&k`Bz}05ABqn&+Z4wHe9=j_{5jt2@h3hR%#; z6X$q9q#EvnS`23vrwG(EBPmEpIy0BEgw^uCLB+)SbfE|1Sj2h4YMW>LKn{vip9TzJ zBfEG+^g8Z?3>2ds;Y?;XcX`AolGJr(B_Bm;OcR>Yok^_Y0=J1#&zXTDw4*bF7|kLs z5w*VFpa?bS%WxL3i#G%sSZn^F2sP-(Bo1vW=sp3 zC9dTt4|qqiWINo)PI^vzG*XLpI7&n|kzS4C9!? zVP5l93;Pa@=tDSrxyDo85ol=^@;kZsmmv&eDu;PaidJ$!8nV%d9xP`IR|vFrCMP3x z8Ou~=vWYu<(Z>5wkit}802?^YCla?c52(j5wsC{7cGig^)Sx~MX~sy#u${BqAWD1Z zNlMd;RUGFkPkBwO4suFrvQwHSL2bo(?Bh8xI;sImP?Dw$W(DUs&r81RB&R`n#OgF+ z6kEAWgwAqKB?hsI{k$S^7rnq=CrU$A1 z|1|M+M;5Z2JzV2Gf$nOTZ~2W})S@k8na4^tafaI@=pmQFk zFZ@M5s?me#tYQb(c|*!xu19lPFqXxvSk<8*C4|q%HIJx0#zNai*naC!#a+?o9QODcwNk?(IGn~1s<|>gVs3r1|Kd7nL zm4)o#0bfkCM^KE?G^ZznS;{8P5H`sSBLyYs%tThQi+$|p7{@usW4@m3+`&Ioq5=I` z#1eM$I4ER_KBpYj>BdMFbCoBAOm!c8O-lZu0v#C3L^g1n*ZeTeno^D0v}FR*S;t{c zaEbdwo30K>%Wvc&4@IfX5W-o&e$H}**faDAxoJih7IK+aM4f4E$xjRVF_^h5VL4kl z%Uz<)k_#%*n6Zpw8Ou4uE#4Djwi!+~>N1QioG1DmXP}_^;xNKl#VMYVY_4afB#mfJ zUxu@UWgO%T&j_6-KV%{^xv4}WIx~b>EMYy@c}M*D>YOCx;9vSMlKCuQBNuo{%mwO= z%;cdejTp!bHgb)ygVwsow>Xfs%A1oDCf399N0E%p4&jMW{s+ zrZAg1%x67!2wAQ#$iY9_D$|&D%wi{Zc}3h+ ze%C__MzM$;Tp?t&8X+@zC`UhLv64fa=M`VAku$0>hy|P^!dg8@KAO^v$$61Vw6r>fiIKU|$@R48kI;&8W+BBgXli0{59um4w zjqx*SC`?(JGn}>T^b~KIr_7biv$jvLwrFB{-G%&nagpm@tlZ9%r-KTmD)5TocSE#63_YS zsNSFi)o96d4s(S&ye0IQ^9+BIiOgi72HogEe-^NW6FegJaraGTvQnA)v}PEq*vcX9 z@`7(q$QKo8OjkxTf%!q3#k)j3slQ1<0V+|M?(||hGuh8EP7v{w=jLa!Qka&6Go3YT z<}p!EyEesX&k)wLpUZr9Mz52Y^yHx!4H>{nE^~{BXZ0GHC`T=tF)V0?xR7&%oHLim zOJVBLgo#XM3kSGOtn`VMi8nRNF7C|k=K}=%-`*=izi)J1< zsX%*XvW|0H<^@SE`MgGM3eko+%ws(_dBazi)dJb6OF!mvHt4OG>Wc4Eh6W5{8oM~l zMIQ2mWLMP-zmSeXv}Yh|xlinCKAZ9*rRYR|rZSUxEMx;0xXDwZT-VG56f;_Zk4)Zv}Gm_o3pOA-qRH79ln8ij8a-1t%CF(8ni8v%B zJtb(y6lSu4%^c$?U)+`h@>7IHgtLKd9OMQu@2DxVQJktYXF5kY#z*4abv?3Bi;=8l z6L$%_=bRH1Q%p%33Q&#K^k+uU7V$1g?#nsZC{AO>u#lCkVLJ!7NxTPoiW=0TKMOd? zQ$BlWu9A;3G@~m67|gK$XR@ysvYxH%;~tS8xhFF5cTgj-8xvW;QLYpDv0Rg#9F(OJ z{Ta`4R&tXlPs~)xP?(J2=fHUXtjUGcn)u3)v|_ z8@jQ8jX}r6_k1AobMMD5`E{CF@vp~p7WX?UYoxZrZ^R;OkLX3 zn_0|b2lsi+I}*K-fAUb15p3lo5#OqF(o&eFOl2-h*}!?CzH=S&Q<`o}2wEwwVG|dL z_})2y8nj>>>$t&tB7IOhBqATR=+8v9ahx;U;0cjF+P}#}bq2DQ(?t5@I;5c#b?CEjNq6y=f!WOo3ffpnT^;*(XlL1U(F_*YWAS@*C zIq4`#Xa}>)6Rz!XktOVi1ep$U|v5Fq{c2;531VA%QPRPfjY)foU8jG*U?5 z8`4pfGSp`zb6L!K_HdF%ghmbtB;^MR(~+KxU?WGlOynpbfw+80T5?j3j?85hr?}21 zeu)|q$VUk()0_D$WjALDjplvHO;wuEfqP7xME9{GZw zDL_+tGlzv-YZG2yIYH%EC+>{#xHY~-RYLz%!% z4sn{uv8@RuC`AvZF`c8_B0`*yz-OeRGOd`#TsCo*E4(I3+>pT6q@@DAnZrR|lOkS7 zAS*feht>>cGE>;cX`b_0{E$E#;**gw)S^CP8P5)0@`|rNw`OFZ4kK907S3{kYuq71 z0yRxGic*(wcCwduL{1nI_>OEeqz{YO!~>oaCs9Zs9tlWHO7aFZ6Nj^q^=#!nu@hTc z(vdl+fLMyQOlBh|xx)+I^MPbv$RA~BNmm9lmZ@yu7PooFd%jH)68M{3l%q1W=*>LV zbDSH*`Z6StioYpIXJ&Ai%S8SvB#@e%6s0=N>BMlt*~|KKkcOfZry}(j%?5UGgjsfz)OpS*SuoTG5@M ztYQtfdCw0&ganGvl=ci~0eiT`3qpRhcM+YRC`1`*(3W9LWf8mB!zmt+@Fzb*T7IE4 zt>_XoMx4WPcJi7eKbs9?r#j6U&Sds+owr0wBX8uOKE0XGa#nDNr@Y|Hv~orc%F~h= zEaD7zi1~{eA|n;)MlV)yfLp})RV`A8MoeNo7kEd4-`qEaDNB9Y)1PoAGMP1O<|>hX zSC^zFD|skOW%{v>t32c_iPD7xe&i2IP?1IqWdiHj$6LPm!+a(!1?fnC=CYI9B>Gc+ zNKXZtGl=m_V>|me$ThALExmQ(7m84eW^|-G16j=$&heU*8N8kXG@t`>S;=ZHbBlMx z&S*}PpC+_oEW3Hea}xh$22q$IRAn$@g4T!!c}|2(_8b!NH3ca{b!yRszRV3eDW2vX z$uoxpGVwQ6s7hmcFohND3c4#kAkyDvSI|FVF^bcG;Y?*ahk3~tSwaHI_@2DfWi$&o z&I7*6Dt}}kBZa9>XJ#^&9h@dww*P!1mY_ZJ*vBivvdag_$V?-KvY3@zCp3ri9R(;u zO9ru-UF_vF7YWO$9{Gn-)MEe(Il?7k=hA;vpf+6?&180SlLY^m;WVco(^G*# z%w{9o*~t@L@|KWN)|sElLQa}7km>B?8ZSv&+Uz7NmFUJeCa{bBoF{4-*CQ`QXh{cp zFpd@M;TR`)!Ix#N6F*Xz`gCMy&?<2ayE)GrJ}+lYsZD2wF^Ub`Bwl&f<4;OanE}jX zIqSGf^a@@_Axcw$inM1aE4aY}9+Ir$f6|GiX-qE`v4-P>Rx+FTl?>#kB-LoiEY`7| zOS~siWjW?&a#EAlgfopb?BFHItJn`nLs@Fko{7w3WzbDAepPz|Uy_21WTzyx7|3`Q zvXe(duV%heg=U1ah%?+IMs@k+J2Fy$stjNr+c?8jZt#SNHQX;1>Bs=aGnXCg;U*7B zSX168K~-wdkiHBioEhxo3Rk&9Xf68!*(gmz8q=ErEaXB^ptf@WMX5+vrg4ayM5$vv z$VxeSGKhI>;s_Uc#ABk>wf|Chl^k>Ba&M@q}2-JR=q9$9%SMlUU95 z2sx=pB?bk}5dUWrPl)!f`X>W9_?M|HW*-N+!F}SjaL;6=5T%3ai7gq#U>0(WkECkp zGanUbOV^-9;tKY1gvZ2gr4RXr0u-eL4QR`7rm&0aL~gAPNKbKU(TqWavyS7uqJqSF@RBQ=LD~a z*Vn#FC2BI9HJs%ciTe4RK~ZW@GpL?8nt2@H3ipWL-+PjqBGjQV9T~%JZtd;t^p3%|gE8SJG3Ajx1y+r+G`fLHe0Y6rvfe=*(c|vp#6A_>Po=)gWEy##END zpG(9Vq7JD;XBM%H3p^p-Q0q!QYSM|}tl~0vct-MJ`igSYp%>#=!#WP~mN>)BeTvbV z?#$#^P{a{>pETs6Vo)n_G7H(wRqhder2C^XwS&UNg&gA+p`+{{iQ5;|IK zP?A~OujO}&P@ML3WfYs(!vRhZX{`M52eoL- zNM>?~SA>jn)+Rmms818dFpFL6ls1fHDTg@9bpjL2WHM2Up3LMhXNfpb zU6PqR>txk|`%&&J>6rw|<(9<)~6#ywsVeTMl- zGE(s~naM&u+B1Wd?BqBP_N(Dt8E*<@w1<6ME8zQG_#-4O}GVY`G*A z#p%cZW^;njIj%=M{-6LA>C7;};6kf(a~P6Nd=Q^Bnv{P6|?s#`Izg z6IsX+PI8KCgv@t+;*gPls73pr$>L7#5p{vRgw*^_2`W*A{tOG6DemPNkrui(IcUN- zR&s_&i_|AS2Bi}#(VDI--~#uFyZArfi>djG(v+hi{Ta=2Hgbq#yx=VsYWXXvYeybC(&MgOL0omp5bg@J1>c`Pd^f$ zANh^Hf(nWi=+0C&aF)pX{T$zrogy@$Gb5P90#5Rd7zflTnJGml`ZIuVRahiL? zJnBA3Kz4G{l*t_8BF~6+%)0Rp<>|yMc5#b`e0|(LNHN+mlZ8P$#Jfa0;dSJo9Ia`? z5N5KN%S1ovcY$Q57+8qaK|Y!X{1<>9o(TWT63#8Ny7~ag-Ot zIHPw-!5?I&PEZH&e>yRaogCm5Z;5+WuTq@S)MNzVL36~DTq5M$e|{8m(~zNTU^|z% zM*Q<;JO5CWax|tN<5|uQ&hn5X7xV)^QJfCUVkMVb=dbUq*pHR#S9c5{Zvm#h&j)OOjkw zdt{?Ny&1{4pylF00@w5e$tXxG`m&I%+~YA{UpEUVM_(3knJ72x*Hol6{aDFKqTG}d zex)2831VSk~ATyQe!9Zqlnm0ta?fFSY2C|cbg4AOa<5|bPplf329s3w5 z`JIwfpc^CD${|kioUprQH@PTBPZqJ0Lpo5R#$FdNy~u0gNV`b!_DL5&A@blbQn5qY<6y&Hxs%nB`pO1BssM1O6f>RjAGo=5dS*JS6@z z_s`$tr5K$Uz&ef*`rNuug4*OG^Z;wSioV5NR&$k)LEpc!cTkpQbPbv&uHyUa*#mO(7?C+Lp27oob!AlZM0B-KT>`uOiTJPo`oFd z3J>{6{OF;9G~}lURcX&iHgcN##ElUe_?w#aU8$4fABhpm`jLsMG-e=+IKo4olQ{N&GKocKNxz`M;tEdjp0GHf zfgi|BWBRg=qg>)+P?Wf#fn?;RHKSO@W-jrT52TJK=j5j}jR|K4D>z3WzPjgc%2JW~ z^k6m%Sji!7lJIl6p)^hC#u)bSf-e)eH-6_23Q&={v}GPExxjP2N$7bgN@sd9n^oK- zMxxNbcVwn~P#^Js`Z0&Y+$C1xQ2&jjHKrq5Vos2c zI`m~QGug%kUXt=l_e3pPGl7-t;405~L*OelMON}rg{m~5DHGYuNnQ~tsr4Wg-}4Wx z8Ol1gaFtkJ%Q4kyPH)z5nv1;Uhh%DwF7#mnQ<=jVA|^LCh))v!pc=jC&n#B4kw--M z#{ChKR1~2k4H?N=wsW7?BuQaC$Uz;tF^Mhg*;Ce;u6m4dXRE5n$<7VdDDM|>c{k9vn9 zRHO-=7{+Gq^N7!Xa<9~6Fl)F$q@S%jNy$tZs?eEnjOPGPc}Ltdp@9TJ--*9ck%6q^ z5|Pr%4Mph4M3%FLlSKK&&yknX)T9%m*}_Gx6ZWe)LPm;Hg+`2IA=}u+ex4EUH?>P8 z8Zd%UOkxg4xk}vM^&tgl!F0B9kNdnNES=nvobM?@IqK7ZPIO~v&{}al=Lq~^|06f$ z>BU?&agB(7s!ht!i_y&E2*-I%s`UR!FBYOAbr{B2#<8E5#Ll4J`Hqz2pcwUN!bnE3 zg_}gq==G!^9TjL#clxuCEu7#2k9b3hzd{4QP?kQd<}9I^{Btr=ou&*ToXy-MO6JhO zkL08jy_mrgE)nN%H9<^n!WqW`HgklJB+ubKsX%20vXp}y0m{*k2^`=7iF28K)S?dqn8sXo@t9=)*u%+33r4bnHJm0|Zu5mgRHhZ( z8Ngija*>#MR$EaaXkPY1fuo5if=HcyFB*lYQTadpu1sVh%Q;Jg5}tuP)MqSv zc|!b>-h;dprWJ!3$9nd2omWII6&grSZ94ovU3@)_4cz1@??_%+&5@gCjAk7NdBQhk ze2;Q;V-$-y$}6Ill>-XWlo5<%6l>YTIii+Rw86%m^;f~}n68Zjz*J~9W@6^AjLHSFOIFGy6$nUAtGq#5mlMvLn>!5PkT zofkx?Y>ttY;#8nJgM-$IN4QShD(*X|uvneG^k+3UxkYGIvw+l;rz-Ur$##x#o!5LM zVl_QQT1rrhw)A8yyLd^Uy4gnx(vqI6WFrT)XuVL3Q>$E^k*EKIKxZg)|MX%(u&b62s$X zE7;9dqSsXeGz@Ahj%5O?xfm3=p8c7MRHkK6UvVhw*u`d2&3=kgj_TB)GyNIF zWR|j#o5XJLpX_1*D$|l4gtLmv#BOMhrwn!J$1IkzncbY_9x)pEyhC#S;4ku0imvoz z05e&`VIB~tu{lmIiqnPhOl3WHiPXedfxoFlV z&3WDt(#&~}4Ah_%6PeCBHnE#y+#yDD=T0(Ff(}e#E=yU@9!~R~6#uF_nlOodoF~x2 z-pzO9r4}9NNjTGkj)<>_*V6Nmm|rPM2f|s%ilEiv|E%XCF9odz_d6TJy%4hK0(SX({IAC#sOGg!wK9`T$&JH1OLvQd>` z3}-$2c+D5>^*<$P%)p>o;sI{)n6ElGw^N@6v}Qb;xXer9cJw+5(V7m7VlqoP#7QD_ zQcIMfE`ylDF|KfzXM}V%FZq%mNk>U)(3QDtV;8r0M*J?;l7!@?34<8QB6hHs^E~D` zABfP^{>s<Z0AVOTk(hP@=qgr zvy3h5=Q3|d*2CF=E{tIbhdIkfV)axHq^BBfnZyRRu#eXSdU-bTQh=JYp)1|#$wcO} zo!#8v8A*D353-Vv!qj63W7rV1QQXe~j&qW`#OmW&`GpeHq&cHm#Sw1smRNoDBEM6E z{w(Au*LcEPlJ+y(C`bj`(1pQFqHyi^%SHUEf~s3 zma&twydug#wMHt^@ds7u#zIbTmH2~Pld`m+7rmLyd^WI$!yMrm?}$CvK0!fR(UGo9 zUX~R%f zv5Bi(BXqd4Ht8uq1)9^2d7LH22;Zk7-I>4^?htjPnM?*s(UShGFF8C!&nDU-38DDMuSdv7D=1=P}X3^)s3Io5pkqnkgRTGS7)UMjca*x(sJ5yLiU8 zV_k<@{7X+pF`L7DBHB3hLbaeqVp}G&feSq5ISI%A=PU7Nex)*v>BcBFbC3%JCde=G z$VqYP(ur;?U@J$tK&*-8HrZ)Rdj>L?2ctOI+<^ydR&3rEM zif^ablPOIXMzNU9Y~umZrphmINJCYPO5^0v4k%97bU>wUhz-gZHj6}0tk4%)L z6qV^rSEjIlZ5-z+4~REMzR62N8qu5CtminFh&tDN;Wx4b*SYWRH7^MSRHg(e86Mg@RnHX<&~5arX0N) z$a?m2gU>cNJCmLg)S)45>B~44v6@|6=N)l3T33GNck)n_DnT8@1zhAhw|GW`P5OZ} zl%yp+n8yOvaEH6Z+w3y|WoXZ24sx52E%wKt6k3}GT$c}nu_>YTikq$iVE9duQUutQ&wnB-(3JGp7Vcy@D=mqguZ&hsZF zs7FT@vY#`Y;}&stxfXTl$ZYmr}P!q8`vslSy_Hclgd?awh*@k?yrY8eg$VKk(l!QmE2ftCCYP6vXbJ)NhUXtLL zyi%Ldtl$z4h;-Z@M^64_C|lUZelGBg_$TbQe8=x({C{frx*k2~$9nd0g_tMhkU})3 z3qzR7YBsTji^Mo(?op3$*0Pz0gq(IQQu7Cug8GPyIZc!^u0c{#Qi6KaXE5tHN0hVX z5Z_RUO4MTz%UKz;O5DSFZu6G+L2=LdTu3Gg)08gE<`}2AM$GeG$4{iEWKbiq9n+c1 zdaiJj&o5XHnlhdR9OXFYiF8p9P=w}mW*pPm#UAbu@sj z4ar45O4Ec6Oke{CxXdfUuDfUQP@W!)Vi$Y3LBbo>iu}~0Gc#DodUo)D2sh<~gd`&c z-;tZb{L6G^ag<}6BEl_s2aekUV2C{J^G zvXX7w;0+1x>KXD-lF~G05HmT=2U6YheHze@ajf7Jq4%vlnQ0W%P8`o}UJ&{~Pf>;r z^q@Dh*~&2<2PJ!G51=fq7|(W2@RkUVe4olRVgxHW%xNBx@Ui(y&Y&7%ABHiV9h~Gb z&q(-04e$@u8Nh085dEnfQHy$vWer<-&L@&T3k_tWC>`m^R1R>4$j|jKe^Z2JG^Z7l zSinW1zA(SZMSVuFoO4{|8qayb2flgfzR5#5TGErDtYk~jY4HsAc*D1^%r2_Zf!Q47 z6Q93!4-}>oBEFGh3Q>nv^kq1+*~bf_y>(4;(~427=N>WN`FzC>6r>S- zS?&4M$`!2lgyN$Dg#)`8V+-T zrvxH~1(K73G^8gd^=VF9#<7_bJmDo_k^CILk%7{5WieNH&sUMd0=cP5dnU7nJzU~C zH%SyF%>TpN`%;cx^kFVb*w53T(5PX7w3MSG-I&8l_Vb!|q>L68C`o0SGl-=esS7KlZXpfqAe{-PSy>CZa0vWKgDAbHHNKry;8 zlYKlO{%2uP(HB*qgljpuJMLQiLEth$VC&{(v|+q;UKU1{tGoh z0~#@!&0OLoagu}u(oveWbYT`JxlHsg%>@47PfF8=h zi5tA<$E0C_iu}tI7IB{FU#lBRQ=f6{;uc}a^h8h|u@ViKztFUwczq{)Km0I!82)egonM5t3qBvd z6gYSdydK^HZ-bwKe+r-aU%ujn{|LSmz6xe|BYYctH~c9468t+~j5Pps_&WFo_%8TS z_-XiM_yl~$pTZsr7Q|2jfxiad1@DJX!YjW7>lsL(!wP>H-T~hS{{a3G{1$w{pT>U& z3%nKH3EvI>6Z|6ldtZvV1786wyc!003;bR95%@Xy82s*6;rqg8g9tNR@CNuk_&Ipt z%P_aVhaBDnZ-eiL_rV9?6YyDo24ezPc=gM^7OyYD+u?tPe+uu1{}=w7|_9o7zX%D@SX4;_!anV`1G&DoP}4xmq7wOd?WlV_;L6@ z;Y08V_)otI;}j@Z;m^bO!TaF1;S0YS;{jd`54;F}1AYj86g~pKk3uX21$;C7DEu<~ z4*C`Ne|TdJhp&ad0B?ZrfbWGLhY!F9;a|h&Gk8B>pnwW zV21w&z8=08{vLb~ehog4!*>G?I{3@*_uwbsL-0}fTpnWuz7k|0@J4tCd;oq0K1IM> z2MT)lEASmJ`}=tPAbf_1-wD13c6c3p54;=R3m=15O888`gY>csudj#qz=z;t@NxKb z8DkT^3_5r-d=GpO{(S|X8(5g(?eIPDz3{{E)9?xSed;S-5MY55-U{!4AAw(okHcqb zn9IOJ1Qomvz6HJqeh@wkABW$B-=*Vo!JmQ{a`^AzUGR_K=i!s^IR@5h(7=GNfd&3N zydJ(CegZxSABX?M#NUK3g&e*C-U07}PqnZ=01GLU@K@nI@T>4CHs%xjVfbV4D&Qdj z0w=r$eiA+k{}MjU!90OK2m(Zq!hZ*Eg?Gb`z;1lrsUF_N5z-!@+@E!2K!cW34 z!bjoLJnU8QC*jXP3Eu#J8~y?O0(=<$1^hqo2YifY_%d)Igl~j*z&qjR;aB0)gIB!p zM?e4z2>c~@BfJg18-4-)FZfOP>=0)U(4d4r3*QRwgm=OF;FsZdMVM3YCGa)yCirIf zLHK9zoA7&MJR^7&d^x-pDj48J_%8T|@B#P@_<~pCd4dN!yb1meybFF7ehdCJeAa6) zR^XNJM}Yzv7I+cf0zU;Gg%|!S{9X8BU_gi00D%@>gue#wf`0-ZfsezdeGSGrd=c32 zb?}YwPWUPK2z<`hz5@M}cyEZ|&%xW^@51}xQ(uc`3Lc#BH{pli{V)3jUOy|r?+AY! zcrahK;Pox=ZSZ~YzrnA<3n|7f{BHO{_-b%rg15fxy?Fh3`0&eqPlnF{Uj$zbH2BcM zo8a5ve}R7qpPysAf)5**0Ih{qVoT z{{g=azrVq=hd&Lkg&p1iKLEc1AA#S7-$5|<;42}56}}a|9o`KegimSl-tf8b6%fM% ze-XYNegZxUuk0{~!GQtZ0RJugF#I_DEc^=mo*wfTWH{lk!w?eU0%1Y8M|jJ!rC7vU8fIwJ11q^VZ>~+7dq2vR)MMz+cPAs zJ1VQxQ%P59ZfJG7(`=siPuu2{(=OX4W`#}V)o^2s(mtd~PnnTxEX~`bUGwGOusF_T z^n2RGc?ff}$h>axNUX5UX?Nuw`CGxOsv{e{O|wQH?ru$+wP}ST(f2f^?3^0SzBy?= zTfK|2R)Mz$pLC;8vW=PeOgpmiU>G&UI!js{8sq2rPRXrOh2|6$K3|Pa+`Ec$PFEWF zEN{7wXeTGDrRGWtrC}Xs&W!ElTxOih3(czi$>-D&FG{6PZ5~^ud1dRW*E*9g*Esko zS9)&cZnEsPE!U4`$W=<7m%ciimBdbZyK&sEjzhs+%OiK$$tSfpCTnBbOSARNVy$`X zQN3hPj=U9jVz;NkI;YkiQKdO6*L8s@v|>H)y)Y*AD)e+F2K69&ddLJ>fBBUg$7v`k zxgU)I8(pT}*$)|QJ_)Nd%44eHSR>P>##q;039?5MTYl)Ragce|Y_32!^0CgsXIYyx zqz$V&4iZI69MPIb(#??fB8o}x9ou;*k64RTs9SAg6k$Or);2Q+@ij|+O71p`x-LB0 z6JX{BNIO5qB(%8`myst4ZEhRUAvfRnsuDD6~T4OIxdLuy@rr|qP)8X}OV zkqyP0V!k}|#8MZT$`-vhGhXd9ezMo7DsNZEz#-Y9=>)CbF%(C0p|3ZZGL;!BR>^LaP# z#ZBjD9;003*J%vLG7DsP9$J1j;&pe+Jy`qbB7VYG$8brjye?tp3yQIeQW9=TtY|AH zAM5#7B`4m!P|m?~=hTz9avs_DS}7QWp{=W9*@Yy)BbP4DZmFG^yu9FPX&XLBP>MZ0 zh(xUSMH$wnqOV9(6GN8Qt8m+yqfHM@F}vUefh~vb+-g~S zNhW>ijK$L-6GzUG)O#4Y^tzAb7Va?yuRCXfa~X5W>qM8=$S{1B!a7kUvzRnO>OOs% z$#QO}$C~Tcn769B1)elfext~-p?6-yH8%U`oXF+|>3t#wk|;$6k-}zRkJd5rjK>Vy zq}U${Ijw}7wb{z*4JVQ5Zqh8}J|e=}0?*FgF!a6nsD+tdrM`x=NGQKgQf+4MCS|u% zid*Bh42f`w@5;GGXJ?xCPYH4=j!9-SZ3ff9L+ID<8a^BA_m ztu$1VtHag1rNQ(^EQhTnQ5qi!_<6wJ5jJ?sqn8kC9r9*sJ-q^(3 zs3l*?=4;?2ebP0q8~PM0N@b=?PA75;en&)L%qO&dK#>x_J$uxGsl7yqAH|BWKJ4|w?lzW~r zWIodUv{b}hpGAMWl*n3YwF||%-u<2nsHV`iO}|o?_e78BSBf7`DkoX$_0i^uoZZQ} zrI|+B+UoHb=GjH5=F(-qIZnKY_0YRka#?)ElR<8_g4_Aca&9_nt4?n++b*X@b8gn_ zm#8n))ysCQ$nxVPWZ`+&z35KW^8PB6h21)J+$OPYyU7Y}qs*?{jkW94;^#Qa@wnDh zI(nw5S#_PcZO+{%INY8yyI!SOC8mdSUmG#pMQlm8ttGip@KGl#;v&=1#?jXz z-l5^CRC_D67+dk^TKZ(v&Lda}yKiL7q~ToX`7o{LJhO=*)L>XDCFcT{I)P$zm#|ey zWEXtwi*n<8wiTvzd5Hfe&WeGX_`1E%S2ZG zxdY7(FWR$MS+^xME$vw&lb`07H>YLmjcLzVlpk9|6wUoE~_Souy zI@+LWy!n#HmZ73HVCQl8JUcqm8HIKFS0xGX>vrhGALTfS>y{ zD7vsQI$s-CW|qt9p+`wWGSQFW7+E96ud{j535YV-9C5HLa>_`C|RJey$|5@;l;E zPPVtaGlIw$YYmfMGU9P}bmcztOTzgk< zb?-U$HWOO(DR<=fk*hd5>dZED97CO%a^qA#%gXaSUHa}8cIdf$-O8Jun9aNRgmR{e z@#3^Cx?xE5Cs!AKsWhtdc4|Jw!oJ$ew^gQH)gw0oYE6mdcn3nln`E=hXZkD$J)L-s zYcFb^au=n?Pb_4GcC}lNB15SdA|!bFy0R{zki;cyS~bE5cB#R7_8S|pc++h= zDty7nGhr*P%2%KDT&h$G#70XrvzT?um_+(8@1dnJ-q7xaoCmW(#lcBSt5emj<;QH? zGtYC`NyOpF$h6$5IX5c8RS&*p1@=Z)mXLN{Ty>ehG;A{)M(AcIMP2-Qstrv&jCy9J zC+(ghD)fHcD`G3N)mwZv1PJtyReohFJ8Yz*<@v28&(|?3XW4Mh9Eik zWgSY?qQS4L$=jK$8TPas4cNc2Z65Fc9s@c6P;q!DGHQb%IjdHiI2XVtyx(Ze}{kZV6(o#*y%}3uI zv}3dbs@+q!kHb4rTTd6y$jTZr5^-$0b=+Iy3@+AO_MlOA5_U=<30hjJjdYidY^!?5 zUGi21wLFHN%M@v+FxL_?)D=-@uT6)u91uI&|OiTVUBr4u%@d5y0OdA!XI@rF4lUiK7os-FT&tE4i{ED3@oJ&Y!H zgTUB0@?>Jq=bbc%B)*er+Ts~;+pHJP+)B^> zp&LOy@3rWfMh%oFa{F4caQt)ZB#^P~1zgkVT-UIJc&SNRuXCR~zBPK>HrByr8+(;f zfvPFQOOLYDPrG2k*(H)iN%dY^+1W^rSndbgt{xkm``i>_5%~E$;`CE>30KD!?^eX+ zX!?%Y;WjpUESHV(I=vc88^W z44iwfg)A=HsY?6wRmo7M=r(03*=yS$(-m-IzCZqGX-1#kW3b;#bqjvki8H<1{JP$1 zz~qi66xZo-^WYXsfgl25z_zZj9`bbRHHv4-`|5=JotBtHW=?C8sbWc}^d)X?$+;R% z%oP7hqNO0GK8NXEOyx7Fxpm0Iy(?~!v=D-fOa^BHq1u2L>B!*IC)WXf#D4d#N zog8Jmnp;?$O*{^fMN0VV32n!(jbp6vRk$TkgjI?PexcJOr5|^!c?So~;l!4o$Ahj_ z=@p(5f3ZB-o{jY-g>QUEaF{yDQdiNOifI_Zxhg``DNAUH>XOYDE}97O!JHvwjb%Zq z+&IZnWVBAKb*gB#WZ0N)EY&HDJft?Z@1<)#Eo;k6duumdI}bj-_=`*9t5~}usN_*P zsDfxzKFizYDGX<|M&J`gwre)Gg1z08+hE+H7h)~biokvxit_feYPaN`E7h93C-X14 zKc#byqqeLV#$`k29;HUhD0yP8y) z=9?s+48mbMKDleXTE5VQnX0#@(w|v~ds*t7yqZ~h4{)qp+tn2^d*`}~73Z?tq~)NR zDqEi*6NH=tT^2GE$YO zxs0Ff<~ggeuUCr@_(>ByT(KT>)kszA=956{)ylht-^Uc4N*R-cv1eZFpvh@+YDF`h z%R&ZwM{dcAZdrG?GrH|ik@!Y#WWAQ-Br7f@HYd@1s%Ev_(DqY7%saMCF_H9o^XYTA z>oNlN|D|q-(`lK@T(Lws(N)IQ)V#{mfh(ov9%DGGZ<@KyNJa}2f;-% zik`BusOPhkD=IGy%Ytm!qpHd(s!YtSeoZOS7W4+Ei?rsg8tqMzYX>cJ@z%(eAd0<>RepGRd)eTfHcou!r6Dv#+Q(D_36H z86=bBzRW7wzhgCYP8n+$*SnW&m5x_vIonkVTb@(8+8e_hSZErrv%{?v)5k1`G`UZ5 z5CKu+J~_(hVBE%{bT*4~`&39NU3qG%ve-a8 z%Os?HzfD{=-s9Zs%d+8W-jZ^E9Omn#nCGI85G zVJEd$E|133pNaBJN~7IjN&41^WBE>V9t-uvE9>CuH#p97dxzm7Qn9XeLR+Z9*mJ%eIO|c!;yp8ERPa9J7 zI3akoGqyXn%WA_BtK#y=jY*RYyR==Y92VU{R3cBbNXvtgI+g2?;!MN%mR;Ex_4@HR zEClOZCR(U1B(TJ+uT+*_Yd*5oHSwi8E|%rMO33(KJ(tXB6E0j4{$Oun+-4NWexH|* zrFK1J=gKQ*-vU)yR%7)0OJ?qCFQX!@!;2cXGEW&KSUuHbjp#HQmzz3HY|hrRXvLc! zOU`v)5^QA*?6PJz;TD%!qqZ?k%89-yS&8$Sc?vg9wR_K&r5}<^-kvPDsM&WI*W>5$ z@fjm?d{rti)Dk-O=x2#2dB_;jCr5i>e`9JVq9|tJRguhUH&K`Gu2r5E5A9O-5f&s$ z)3{EZL+#}(+t#J?68SI$Mqq4uzSnDJiKJwh((Y*wwm_+b;&mrAHyJ^ckp!l{mRD-( z$f{;kij=0%8ns&(Y%7%!Z<~H0+f1I=AuT4Z)9MG^`_SlDVJt)BHDFuI_ow; zwk6&O#F4!Xzq3^0xa?!+0-1N$Q>eP9A2F<@(b^1c8(4#OW+4<2x(#7DtC7-F7T1~N zVp*3R0*SBm$_>W0zSBK$TZF{Ss4H^a?p|W`y1G6Sk>Y0ZjJovblJ1fH5BsUKk$E*^ zDO2mXtqr}t_FFgRhb_jrGBv}zLL`A~ThpV}xuwTulG*qK%P--uBFHt; z_4<(oZAI+4!AuCS#*VydKMUvY3u;V(gmtAUa*Cg)?w~rI^b#_*L%Q3v;0_Wc>Z>su zw|`&b*k}IngnA|A?M;l9C|88VWKJ6jY3izBxS|jE=W6oO%Y%yumaTfT;VwO8Wmy)a zsUu|Lxh}URCifmvB29CVmq?7gGP${;jM2z}v~c=WTYS(CqLJBKXsY_v3$JL|Xa*lW+0gYC`vgb`hM?qaj!RoIc> zR;HcNl$A_XXYXv-@8=<8_<{lwQA8GZ6qwTdhzG3}@#T4ie^7Mm5B4~1lskDS^1ohIs>=DZKlE~rcg@vXay-B4Vzo+yuevsq9coG&*NnGcTj5P!5gQ0hC?Lg3Xen2mburUo0K7>DqpaNnQqq|we`Zv+zsszrc|?&gJvW*rR(D+np(PZp-5Qq z5Cp16swGl8a@<3f@+jx9RJRAqDpD&hD{GqCb#c4r-k6!A@T5gBZNj3vYG77$)5u4M zQD^a2$2zHNX*;2jwxjddjD?*QA_Ts!wGEUV8>4w{tz~H0@CZs1*hUw1#NQAGsd2!h z37uGWw8&c|?JHICr_UzVyxsmGqp~Y&>Ad!>8H=UE`W+QL(Wc~WD=?lTt*R;TK4tq^ z?**JTocJXO&ZP3|krK6z>%Z6O2$~>~DO}Y8wXUys;K#vyVchUc9J~ zaSoH|l8J04I^Eq9$gO!&@r+iTXMHPDyiM|TN2uFIwoOqbEwFKL`N7l#3!}RpO^ZAZ z`K2o49Sva<6#wX^ugXkDtWEKO7>E^eID z>KUcvDqV>u?Ha{(5X-u2dY5ncvGao48;VuU6gGH5Sz7ibx4m+5f|n{OdKvW^PED8L z25PyVO4m2-MYwW9YM!oxDCaDf=(-kQrrLAo7@a~*sxIp-#ZEit zt4s}t6&s{+eWOyIbKRGt>~|8=-L>BFnDbl{Z(Ba1UJzls4?SI{L=)-ZAe9T+P1~!^ zcss5%#pwetw(Uc#kF%G?SuoXmEDk!yvb`eaz){{uKg+(fm|g2}h(jUTd9&!7xkWVs z_-F6Z$I$G`)YFV3Q^?(NZ(R>E4{62YlWfzkK ztv*v~%`mAQ+Z0VlMyT4yq*RO=1%i4$W>AFZ-5ZlM3m%f;L{^SEUHq6iE7lTZGz0kv z&xpF(&!Doa@d&hy;@;dMJz*H>WQpgI9|qE^n=nSH7e}&&4b8+Pkw-YsRu1RxvxX{t^QdGpNEOtcserkx=A!=A)}= z+U8T)=yEbpPSXdpGnJQSKgy6r;>yp&5=2zwrBa%U06j4I*la?#Hzg(J$ypT|Iu6kK z)$&Yl@w>U4nucGbL<nQNjY7ic3?Yt(eSJ#F4B?*O^CzK91<@ zeI$0N$Q2CzM7mSzYpNUsrqBk-M#0Oni_cC|}c6>Yw$IDigI{IAp zNU^oq{vb0Yt;=YK=2cv-&hInr>u4XcRnh2~_EJ+nJW44_^!`a~ZRz^#+$MQhM02Qy zDs@YDG&&Zg9^R4hFU-LW?$Jn&$WKF zjM}Hug&bY%@09eU>*ACf+t%ucsth|g^K66&0GCBUYTJklqQ=M!^ov2G!ap1u9>yN< zBN>yvJbGf2FgP`{tfqxh&(1W>sH8=$IwN@xG8Xxp{7i&QE~O{P?R^<1j(MWhcPE6e z{bj`*JtFca_iECmGL@;0|9}=xMU-zY^poBkufR(mhVpmat5DhPr<2+FDCnqQm1GBN zuE*hYm2@Z42g&NYogVT_ON_tUP^+40=HN^v?X~)s6?DTvQ>T*qL0QRqpL+hbJT}FiGAevE?sRlRyDc>*T|YV?0#2?+2aRc7tjk$kG{{l zCQ6xi+@eJ%*@7w-Mf{fTQW}rauxx260h$Mx^hlB03dvuTLTp2m%Y5`$tBo6qG#f`!7`=Whyr`Q z120Rdvo5rt(q=~8#3N$DTraaiTC-w}o4(AK-s{JH;n&DLO|k1as@2gF=%91bxSz7> zaA<7O$EB0(E;)(|o5?nwlrODT$f$VY3L594$5N7W9_!qgsg>A!-mVWztRYyCEA=OK zqKeI~Xpa|kfAfpcahB~NMWVWGf!?Q@?Q(AwuN4`tvr-3p-S8|B30C6l3ni09mcAdV zTzc=2E?e8#bw<%Pf96IrH_3GhZ*HcWqA3=AbBEOpi&|IN zG8A=ZdpP7~S?=`yvZKcIY?9Y*h2$v&u`B1fQFNN5Z3LVY<)`rES*f-N<0|Nkb-snN zkd*SVMR(p#Z5UC*@Z8lxk@uLKYUxQ@#sxppyen}^=@j;3U}u(@Hk@t7R1e;-1mWOX zO|+0&OX^FhuS+NB9Ni5biP7_DmBq0s_z z!!K1!zS*JVr2}WMJ$k%LM`21`B%@+oy+V3cMC(&<3PjEp&TEXroJ=7=Az^H=Y$J6U z=~eEWcfbc(=nkWh^iyT3F0vL1dX%%gn;!KPkfjWoJzi#8MSET7Q=^bgj>UHLC0=CA6)K>rFM_@VKbuEFU~Ic`Pj=Oa(ZRwj<(}PKka8uL=_-zRveqO zB271m-|w(nJ8QNY?R=1cRMr0=S68h|EJBna4sOn41qY_#8P@$Aomo&Ba4>nDd+orR}+0dJC3l5ug ztlhS9$)g2C=!-OW33B#kF<(}yUZz^{i=Im_Ju$g8jzFaC=j=y|v(T8^GOcSpysPpK z<7jKY;o}I^u0|?$QC~s>8daKzg42r05#V{NGaW-h(FVUEN~H>P2?-VD=!wCa=$XeS zMJ90Y0$MA#>1mMMkJPQ-4#Qm$*`vQff28J+MO80Ut@o$?4*d{4zTBY(=*3p;8E5>~ z?U;_uOB{!&N;-wS8mPfUt4@&-TPs!l7Q#(rtguIWG1HuP-AX>o7P_QV+w`zP->yZxS4(+92?kB??N}KUzll+++sW+V=W6iHkpf?GnB?-Jvz{Bqu=-j&*-R~U^gx^nx{vqK zT*P5;eM+YyIz#4mk@kQx?!p}>)|RV`cdjgP3x#53b!Nl+F~XBwFVkO6UzYC19JAD( zxm@6>)f%uQAX*;-tl%-c{|OiuLpN^sK_y|o64kEkF4EmzLETtubg%D20+5`G^{CCNltt`vV7c@M|TGa$0D1nWqdPqf#^pyfz{ zk+mx#k>j5*baLrLrl*uved`=gN!U#HbxXrHJ7bJueRtOe%_2g)w0q+e^wC7Y>TaAz zu{gBkP9aWLt&q9oSK1`1QdNX?R(2jb6fFlV#73mYnMti{YZrtsj?o#>j4s!~+Qv3| z&N_}_*|zL>q!Nb1pI6>g#?hf8j|ppZxaQs+9yR0lrnD!FdKox#dFINfu@P~{j26V) zxmAl$r%)~CUJ1j)RY>f{EqW@&BO^kJjzIHXvjJ6#BT&&XU7ej)g?8_7Tqv})M{NdL z7@y5FWB(!|3TFFG*KThoF=eMpPo^8yV>`y^M!LgBi}GsWh& zNENFw|LkZGLXcFLbDhbOOwgI!$@o2~>98YqKhT~KVmFhv*$F4XaI@%=aR&pLe6jJO zI#epYrqw{bHQH*!lpoV7*j!9#eWm6D&6|ug4wqMNl}*`GPb)R5>{hG{{XhK5fLzp2tr~ci=-Cau0v-BHu5=qJCuyr z8Op=#xW&;AwX%kfW1d<{l3YIS$Ir2L(<~o5tVFG@_{hv*_Ke3G;{CYn+1q6lu4o`v z0@UfJHVk5w-MeGG{eBFyekARdM^-*tH`(%COxk)M=7g18u3jJiP_?!+{kUfbWL=Su zXY$}qDJPINOZF#58x0h?jnj)NlM9uny|bZFQrz?Lw5@8HEX+C_@A@#*+@aT>`&eSK zVwVf=h@eVwYmuXMjDoH`Ee+cG8bgMT*kC%>+`7Hm42fA55xu#ADqtjjW)XuC?3a-YmvzA9G?sO1Ilo^uJs)2h^Tf$ItTSawDSd<-jqcf7Nw0AlWyF^% zA25X)rP!?e;n`7WZ}|*OSff)Q{c02yGJ2kIF9kXosnN|`9LgQmlsvkbanNP7rFcSi z!8HumqNQfZw`W8SGr_7+b9IV5h+WkK#~0g*2d-E1lPw6ofb zM;YYE_yqk(s#YXscBFzNdoL|?xMQVk5U>bw-<_JQ`~D8uUu-z9RWwgRnHZWlE@zqkT9v=SA#LO2Mm7A~qXsEcGxocq*S zd8eaS94g0)kCckIc8gXl%*YRIxn^st>gllDOqVpcfi$pvcH2?dnP;0>Xk+z7>%M!o zHgZ12S&T6Zn^9PfDi~X8P8$~#OjW`(-eh|b4 zX|>JZ&XhgusV5rsU8-PgJqnTJS}#+-MKY*dk5s6Vu9cG?FkFb>XU zi8L?AqM$!a%7zFRvz$ITT_&J%F)eb>LoR_<1@vNys!HVpqZVaCmC-~AXDo9KopoNl zL}&$SJ5j5tRvla2zpY1<`2=loDQ;=bVmWUry5D@Jt`oLO4e8ovbadgHQC93K#ZB}l z!0*G0_INZXIr(ekOmoCcI;~il*OlWajfW8x5DX?(DIHR(}Fxm_iZ`LRP|nQ z?U)^z#ztCQt?T5TkvfK{HLCSOiR!VbrGZZNHQ_I+4KH046~svMdXTb)5@6pl89xboppeot`!x`TW>UYaNdPOW6N0F4E&2zkE z3YeNd!iBx$hm~-3D#d<#A5AXFf&b8mFD+b9!eP2+kgj!*Yj2)e#PmosKENd_T{=UY z8LMhhA7z}COM7C7n?>WMoE<8`M$&iO$~3H8 z)&zrSQuxpYMr5yVW@jeUraCx+yTY!govVH4>(B&7G zx(_ydT!+Y%nzzcHm6lgphrvX|kX5eA_N-V|3S+pqX$$-_Pm7cJrsw#pO|x3^dx5CY zdq~3iLeg%A6EWCby$Y!YWW)DNHW#s)D*J%r=WhVun%sMhGQE~GN6r)!S0Q1^sctE@ z(PEs9n7`y?ZWn7SPl|ni;j=UNO}4h>V^7wCr0g4^_F|=CwT;KJ`v_?C)Svk|Cl{X% zZvWNAC8F%h&p<8(cR)m~BV@D+n z(c=q}0TaNn+<3JlbCQ%~hryk%f4ltOHPZ?5mWj2o;M955QkknU^wiO9)1xt)RI*|M zmqmOCr@+gjxn;LJPFfmTrRK#7hnrRvyINu5yEQQgsX`E6ngb8by>QeZU0-gpsWyDwdcDl#;jTsE56-4U5ZhCRor{ktC`Xmd#X$l%53JhfKaEr zYTjbvM#Oh!!?lyjdB*LC;HX73v`e5KnbhA~`AfYo_3zp9Yo=d*e(qwL zRj5Je^7mtUI-81Bg#%flsqx)Pax@Ul8UboRfwBg_D z?Qy)7l5F?;n}Td{$3dgTR`>`ySD;Ru^-j4<)_hmFZ>w+=_Mj#-^cD14OA9mCLs@!9 zaoVK-JEJ--V8Kvg<33UYQ&fVH>47)v^X+q}5!8*FxM<;gLa1bqk@N`PXfCJVJ9ImK z6Ka^)lg-oW8p{$B(tTl+PLce)%E&2vWhKkTviPK}{k4}3J~mD~^tVQ6wgwQ3dwTmuUtH}8jdSa~ zP&zi;%)>3R;P=%nj=frqA5V=Vz3{)zg!Vbc-V{~8%6I0&Q^7>ow{_Uy`Pyl7#tj|P z$F65~*_doxT)T~@a=>&bsk85&f-jhv-Y}6;zzVDwi!^_QDZIYDmu?ETk;|%kT3Ze2 zX$&37+SS8M6y4V@U^V3Sg_Zs+5tm5QuDqvvRJ$Hdp)oTx<9>tKMl?g`lzqC;0kB(PWNsnuoHs zWlqafL%zkyfuGtGu_J9V^S1k9aNAl)${voI_4iO-z%?J$b*=q;rqRjh@upDPG^rhSamaPN+)Z~fFy@dtnH1(?lIfCW2{iaa+P$3pE-iNL z6%HJS9=SnLVLBiMr#vB;;)}Bt29s~(=5Sq$MAB=M!~FM(;}AN|TAv}6gs_&=9KS*# z`3X97>8WC7Rt~HAO}|(aJ#{*3!7@bLI*;$9?mbwB8_ZJvfh*Aq2)bWiD(b}#66316 zNHJz(edy^mZ1NzDErkUViNF#{WEDwP3mXLuFX^a{FRI3iM_H;MOuF}I4@Q|yAEY@Sx*UcyG8e*ngRQ;d(etkZVvWeSr zrPAVu10|m#u2dEbFqvPL=85%Im>~Y2!|+gSYoUJlZfJ$4hCRGRi5-yLHMaEa3e#8D zla9DhI=3EmE$_n5E^jP+V&gLvGSehK&-)IaCdQXUvr`riV|Ld8N&y zdc{3FSi?Ex>c6R-stc08s~th-9;nbh&wTC3EiJG7R@T6FNgb7k?^gR$NkDDfED8gEG{d)z>QcaR zWMJJr`MX|E?pfPYf|!Fm{Vj*Fbm%<=qNDPw)o8Ux;azivq+NLDT5FMa-`cz#j;@KN za?Dt~bIF-_1PDiZ z?y?Y_Ux^dMhYVS`#)LU-hZW>mckODd>Mrl=-qy8jVWfUeN=M~jS57427_F*J- zyF?$q!Ue2Qv{CF$RR{+7n_%IQen_X`xkD6)VG+a%xiM2BSK;AjWr#6fX z`877(p}J?WUBKiO54bQK?vimQxpW9V_beBd6y8O2e}f=kZ{nOC4yUu?zh62lZvM@| zXVm@aC~Af@A%;P|;Z1yttkX^>oA*^ys^O9$>a@_l8cmvJW4e zK<0sWv9uvU2{&PG#jo|Xvo%AXRdqR>Mzz{)DEMNjL%lkpX>WoWz74IM53#YrAvOnJ|7YQ=nPSip=M_N>hkjYdH_bB^g!)7B^2EN2+ zd&GrOr-J&$^w(>iE79!7UhF%Q$G+C=WDh;{8bKC;sC_nC5?pfehUmLeHJTS!yn+JT zTbla`9)4!n(Yazd4cG~?^udUp1f%9um7MLLYzM*BL!L=zfGFmi7Ejtjj|$j)EAAXW z7W2m4->guO5bgN02EEfP?t@^&WO=nfY}kV@#rPC)9aqMCsX%fN0Gx;*6{gvR3D(Zv z?3cOX{SxCrn$Ju=uGQ(^n}On#!X~`Ufy((k9?lvgQV@SUK|VN3L`+BX6s^yTek2|o z8C&4N<5hD`@4TcAiP-i`Z%Q`VCj4i*-=fh0`LFw>Pmum#(&&#f?RngH z&m+DVMr44eFgARhu3(AoJ8=H5d1g^0_!*MnOX4nIbxq28Vr;LF7kj7*%_QS$wvAg8 zl^A#1gxFuOJLP2sRtpS8Z-qye!7dJfkSUtRRtwu_xNhr>8qAeW>mI4X6?!SEp!s1X zKG7rc8~LGHI>S(b^{hzf*u?UXmzgoh$hvrE5oh;uxwz;0P_H?hHJnDUJB^1V%q+K3 z5`4KUD@gfN&faZqH@Jie)P=q0`=BGkF%)R9 zrg@u@Hde=}BmHD56);A^Pe_Rfdy9$_#H0>yS1C}G#~r)+Q+%#Wm-$q>Y4aH1nE-ng zZrIVUABW!RLlf5aQ)GUPZHgLA%k>Xxgw~4QdzIGax90an;(KzaAsi}kB{&g)B7v=xl>jmQ8rx*d`sne)?ue`^Ot+G-BGJ%^ z(AD(BfqmZ|6jI!QxRveeO~RavrhheiqG^qJM+hI(_LdqKxoeZV#f52a@P4&@MIZne zxHrqX3k(?Fo;WzXa0i9WgE1dD`F$_5*j2(`7=`^)#?~t04s;WR1zz8NNW~;sVA~U} z0x(YXA;-E8yDgsyuJU^qJ#b+fs)bMUlONr1Zk1-1Kf5JD0EB`G(?g8#aAfL>Cw*{i z6->9pd!<)se7BfgY4ZBvsuzxPcbrQKf9$2h8qS2^LK1s&6=~()6N zNudzNX`>~v;-+V7KbAdaAldb6{^MEw(_&A)UvGG&X~fZZw+F{2WZ2q2KX7D~1CyI_ z6lteoF67Ued`sGfW&}Eln8-~NWkqXI3bks9;D^crEY)L^yf#FDpJNHJI_m`n3mBQr z^6oOTim;i@Uk&q-I!C<dfsbi((drrE+KQ2so zxtHzipI8Cp%G@7a3sdv35gb`HcyRHq!_tttx_o%sbYh!uBHyRpp^K-fFKX`s_5$fJ0;k0VqUtE()mYWA3UH2^j#l zujSIUk*iTm`Z!L5Xd2K77$lDm&bK@HpT5a-NAv|!UDSB zrE~7YntSul#2Qr~Z1l9vGJmT?gJX7b-~}4|%W)zEOx`B7f&7F;^%>*Qrb+K_FHfZH z6@YJPjP4}X;Kr5k1d}%Y1dlFk;Fk&2ztwFq3IlPS_>L5OV`rt<6q&^)P4ANlrkFF| z&f@EOf@mJkktvR1uV;~k6T*J=Dg5N~In*5Pn8iR8I0b!<380zNs;VDda-7r9+!u{UV2-eD9 zx(kUmVfl$yNV!2Z%HCR759S1`B71oxi^sEyhatSWCj;i^JbyXbY!HBN@}VCptwOvwd>A?h3@?b41Sg?)G+4~oiG+#xCTAU zTx_L$J5c3h*&5mFtcr%8sfjjFx+vFvNcD5p1z$QuysgF3THwG+2lEBlK@oE4^E~I- z@+-sJ>m@4qdg?x#^>B(!%;5J7Yh{FK|5yL)sylFlTESr)`Z%mJLg@ZJ;%{lbS_k}Q zzm~=tCZaw_nr#V!H%Si%F~}hv77dd#BBYNcfd97G7F}3f5`q<~5iqCRE=qMgD*17TSkL9R+zhJEk*jD>9@ z5~TpE4iPD++OXI~K9l3&4#lT;<;)>!WUr0r$qkp^h+law0WnjT2!1e_^vm0Lx%0-I zSx4Yb0O!~uSp!<44QDo1Y17e6U(+SfI0cBTOd#OQ@J5dCH8|IL6lSpL5_nVtyx&RP zc3%QwSoR$J9d^lI^!7K6>vX>U%ZfghHUZ{r*Bg=Wa*xK)(-1QitQe*sEgcYhfF|vO z8d5-Ii#Q+GFqUn-LCAr>Iz|~+HR;mo`FHfcPy!86z8U~u?|Dq0pJNs?b&A!`~%HP@e6jI{>hWnWR$wRld66@!Vn zw5nI1=I~A0=O5U?AOBnC;U#M;1}o>IBKy&((}h`KdbhHw?2vwp^xsU4WNK4m)1Z6 zDm|RLgT)8c1m*KOo4ZZVsi>Tyz;b)r9bdy;EUX+*Ou;GkM5XCwuMvkLdbD1%!@ErO z71X_w_kD8?Mcf%WEomgP-O6Cne^2!kx4zA9e$2m$bXRcGHW8<*h22{D5M>-#9%w)I zvvF+UXT|jAH|JZ`vXzcIOqF%&(Y-LShwXFqLOjR2%&f7b9Lc5MfT&#E4C4>P6gbYE z$(dreXbvUudVDHB1o%B;ANbl8Nz&dCk(CTMEyaEB3rRxyP3@O-peEgUz7Yfl$pJpPyR(uA&w-frC&Ij&W+7{HN(jgOGnN0IP{)AkYQ4>(({fX z|81-wAnB1!%Px|41td<_nX7UM)dW`X5`322JcucT*qe~E?&T!?g~vkeMG=iE^R*#D z+&)QGLB%Q$hcjMSUa~T+-&9|cBXT;3m6YZiimmAjMz95v@#CL1zKChfmKxaWftA=1 zjQ~O*ffW}}kHgs#fwq&EJD|HGruz(8N$pfzDuQ>oPOKhq3q>dq>hdMvY7jzdAd7_; zq@7h!ro0c|CdX`b(_gys$r>ZSjeRYZ(6~y{iXV*j#50`*Xu9A=3{LB5aBdEwk)8C+ zWfzF7Ir1FKZ6F}%wL)y^Qu!sassq6Dj1Ll(02K}`F3Jd-%l;G$cR9wVq-XaJD=d%- zCdgCcFsVJk5HTTeTEQo#)a$&|4{`~GR7@pY+Y=HJJ}$znktf;ke%-Tde8+nncBsq= z0U=}wcGaS^!#+ zzi8?(U|8SE$4{i~jQJUl-R>O|z<00@BV|^kj-M}YNRgomK{Wj^y4-M&#MZFSd`sC1 z%R0RSON=ZvniUYy`UnFTcA}|(DY-NCNi>V+^eqR-u^e`^&irg$A0k-9q95QeiS6!A zFWg0{GrP>7QW;foept3Q@jT&DYSC+}4VS@)q1jB&ydSb{SfA7|6?+kvQaa^Q4X*|0 zd!V6s?IWBCpy|LX8SZsn+g1#Vfyi(Q=0fpaowml+PdDSCi|iX13p^n|zXJx<%c=6h z%k)_fU=wkg0WY;3lB*qHW8pWtwI70lfw(Q3&^~ zAp({*r?Sh(BXb_Z%Zqz4V^J3D1gSR)j0@(s=XCU-0{t7~eBM3v-8s4DaUZMxIGw;% z^?t~*aDXNC$i(jpUi)7dg3%3tpxz<0!ogn!5oavm%mzFCEgxMCE_JiAEP0Lf#P$5y zB@O7V*Uw3Zh;yP5B-Hb|dsvhcO!=>nq#wjq#j12z628wb!O4_dC}qlHK=Atg?+@4}7HVCxKWNvZjN3AGT&x3fPA z6FR!!3fN1kdJchf70MoGERZ-ATcU}e- z%~m}gA;S12wxjtWu!ZAXv@!#Osg+CQ_a-0h=6s!iU%m*O=2TXPqHVS<6~Ibr!Vj5S z`T;lq6&c5pfrpk?1%AUu3E5w^Hpnx{7z;O%i@A=UOT-pkFhDB}lt&(1FK?65q}yi! zSYJx{42H$^rg9lI*un%hc3_v~i+l_d|1GWt0l5rbk`}V)kj1G8(||Z~)6Gn{f*zPY zJgH6&E6>(UcoPkgLUZg9$5j9*-+C|!rrHnf#C=>+Eq`mZ6`?QHzRuRcw)4tlk4;J? zDZ-V?XB(d%kRInHYC&x5;wcnH4UgI;rIB-!w3-fn{%bRLQ3A^Ipqh-MpC6J%d|bCvAiHCn!v}^WD0!I9&W^%@t(q4+h3_TxkeKSqMgHuTWP~j4Ozc||CP=_Mb9IDc zIz+2RP`A3UXPYlhGfXpj?yc~8;pnxM$mlSwq#M%b18#hSBr~y?I}f>o*LI>nf?PN} z7X#VpOi#JE_7sM28)o6gDvC&1nVj?v+)bX5R&pLV{#Z~*7S_-gH7GpD2O+@ZF>SCk zAG%}qAmOubY3TsDi;cAO?jMO7c;(D~; zP_1=1{N_H5!Fi37)kPJDC#+->AAei+t)6vOdn5RD7Z>{F_QPXTtfB`2x{13bJ)Q*M z-uxpbE(A6%uZ_mvV+%0pft7_-+Byr7rGL6{RjE@&agCvTJBKL!8-V7hxTrmW5ubYq z-IU1F*dcwkWn!&YASNzGNza5D*Z|@DBxMn>Nn7{suvM{h+BVbMI6y(h00WRyzpy0l zny5yKv>EF`CYCfKIy6?G^Xqe6s*4?w`SbAWK409pR~T=Q3%DNRhgB-nTdXRGsbDt! zUgBAl!y*n~C1jMK5%lBomkbz{XED68k{d{>N~z$&fL9=9I6eS^NwNSbPeg$V1EJ}u z-Qf$>P=><6t+X+?E@o8!jv`9ozUYCKXA*#~;TmDe$kHUfz!q*AI9Zdu2fQT)q8z|s z8F}SpKlKXP6Cj|+5U>;2c4pcyX|#l0{=B-mz?d#zk0XZ(7O;S2AW39%*)}fN4W#O< zo&Y1~DmNBvF9E9%3`f;P3OlOoDYeJQ&sXLIx3ItvtE>uRKn_}m_-V6#iRxElCx-J{ zY-RoJZ;z~g?Wyxk;kM2X)DYYkKE!x5f+w}zF=jF~Mi;hdb1sCQzP|vaEm^5FT1I)b zYIxzsz%s*t=9R;71rBCS7YN=5G?YGe))rG1^uj+m*{jOOoB>@#{2VT~MiDn~0Vtsh zSc^V0B0YL<@aBrYKT7C-*n2(G7=^+)g=yWLc2!C(DA-H_w*lcO4TUVo)LXhe?h%6C z-vDlfC#R1R(yTL@v`&zss*yl}3RTKZs$SM27M^`X^_;0y1@Qi~TNIh!$#-ofuKkIx zgG8L_qgH~gf1%1p37b7!hrFXTuSPjLFSH!3NL2HQmn_>U)*Fs8Eg>Iw@O*bKy` zHaVIA-3Zp;?xOx1B41%4K^SAbQ^*glmqQZ$ogUtqiBSOEQyxlufKY^6K0)}xw$MpNrWuvXbX;)b^m0fM1i(!xM&ly}C;Pl`FBTE zeZPihoH{}SkqR8FkCPOaR)=a|d7>G_(}54J$pgI_;ImRmGg-hbQP+y#^}-A&UX*ME z*o_5M{RS&Hx@gLLBT$#ldEo-qx$x#N!QRm7OwVJjl&H9Bo@FYWN(%eGWFOA`K}a)N zH+^-x61rxZCPISB;ZA`U>|DPy5ZV3!SZ@Q6w>qN^Lg>#MppX8Pg_|9NJHBm+-kJ*| zVSHOvR28FCeYJ2FUhss#o>f(YMhrPy&Nb&QAYpZ|Z9!lz7 znVyBuC_Y8(0&vm8S_l?q!`1-aCT9@MtdD^GGkm20i>}XWph=Av=g8M!v-HtG#5$r% znZM&B8&egN%k!cMV_)!fQ$jcmmHNC#F&vOS9-47er+iI4!(5g(?GaiS0KrA+O*}S@ z=l*KPB(l6ejV^ ztszTu#bqggtke|_T=R|tkA0)u-JR^{t=NrAZnnd22BOfcSsXh4c{=Y%mVOe1s+Aeu zAu}Mwn+jc5k?55}S7|rh=p`LMUu;K_q5=x&J-QA@?`kp=o*Dt@u~CRaCEGAzZ~J3KYwy)*~l6RZmWiQQ?FTV zTctrgh43UyRL@WxwLfabsMOudzhy#@9JDs*&e+F#W^Y{WW=0V*pax>vuvi0a2-nmZ z-Q2eppX@dwsGp?A+aD75(&Pj8OKZC8TlS%mgnV1-cv<-!sGuu4wR(6)p(dsOm?dHy ztWfh@7K>8>)#FG&69N76iT1W`4xg1*AU@jd@eKHHqzet~ z#pI|WBR)8hQSZfac3TiZia4-=`aDeP!H$;zMBBp#!X_Q=Q)o0u34)FlugMDj;8mfg z1vbv8)>{Jw2J^L9Rb_eIV0VHj5gqVCw@a9xO^%Dkv>R|dQm=;Qb4e_ZoDR^MDS}(L z;d{^@fxOo}v`oQT-w#DbVN9Aji(+q>Yaop~{gEyP2e||ew`5FAM+6AHyHZnyXjzrD zJHJ0zvCi|o2Ifw{^P2bc{ne{s%Iln2X7uU+n9`3yHRiR&_VgU16eK|~EX;VfJv)mj zxcW%6nUA0bN|(VB?Jx~~3ivttDoI5}1yo|3;B#>ubBlk=X#}PiAy8#`(o(mi7u?gX zVQGg@RU{X7sJ;=OAn=~@5El5-7McMM!`mq`E#xRWRX@Oce^Z)#q42S8@`=q{U}2-J zvY(Iq{8!e<0}Uw0`1a?h-pqqCTZG$O=nn@63*9+BC=Y@Ix@^h^-n?Fdpj79Q1zf$T z5w5RHyMxxxVnKY#BAU+N8$=sW1!ORqzurC5k{_0Htkk^{zDpeNa0q@DKMie#ugJi# zQdiQEZZPPkIq-fySuR*Iz&#YCeeBS+0cy2?>l#3v-p}IglAfS#z!8s_>1pke%bfm> zq4ze11RKP6dJHjhf>NolwOz@?6E}LYy(ziiHU95P+?FuedWu~V~5IO{55Rh zT9xH#kBpgvtm=q_3roJchCPmla51`WX;*ue$UR{Ap6)yGDVNHxFF^ zN}J^zLaxN`AAS~0S=f3j^j1WhhL=bZ(v^Z}&52aTvisaZ$I-~uf3gcLSWP5cTY?u$ zaiF8Y7XlzXuI6hZbHQMN!5p~R*ppYnJ=an(lrm?wx2ibsEhZzE5j&YKefj*=_lwRT z2Jaa|p+*-~VBfYAENe&8S#N=GwkQ|w?}S0Ms0I^P9n<3AH*xiHw$g7jhX~=3bZhz0#J!G1MM0$87LaG z>&Bi9Wh_gC0nq0Oqa$c@sq=+bdG*{g&)4?Q_OeXf!*Q>?T*r( z(itz5tiXe%XNy_A25Rf(cDUMDvT?g;1tS_nw&M4?MLy?Qtsw_f{OZ^gSG1$U_yr*bDaJA`ydPJXXf)c()3%ps$S+3#X4fG zx(8y;U9|f#@=oU4OLI^4C>5mzS~Qy2gik3-5vsjU!mKd)&LM-^Ns=%-m0EAQRZJnKmfZ3BbN>4VA)dAS#_&PUpE0 z_#_6qMhT>Y5>o%whS3uB0}E6uD4(U!igsC+|G==dkSW4FS7ZnUK>3WS z8}VJ`!SClptI9LQq81iDPXrE8Zu}#+zjae@&rB%UmJkfN)jB~-8s*@Jn${oD@wS?O zAud$0M|3m7UFB0R_Y-SN0hX~Fb~MuVV@{cJbixbYBuVZ&YDpQi<}ycUvKM>Stqs)*}4D=xTCt>e!TQwlV<`RB%6+DZm2z+cYn)}MS# zWw8WGrK62!Jl@C}`(brdIt$W2?nNAs-R9m%(s^QEbKHvt=&%=U#yj8RK7Uq-{qXuZ z$6X z1%XLM!PBBv!M#pDf58a-1I%LCk4hM+up3fZ zwW!ih~`w12^bbGS~lp|xOX+ta&AK>>8kE9gjdpn~y?@8fm% z2Zu{b12qROd*IJ!<>Qsjk=m9>@7$oBm=W#_KX>R1RUckubqMxi!Rqa$vze$1&Qs^m z_Nx?~ee@wj(zYES`0G|*N&64(&>MR{Y- z!YObe-e)JyjuxwI#~Bw@ek&hUYn+GCcOt*EHGfcav$m zzezBX{eT4*FAZqYh6UjQ0DG5+!Y_Qd?}fAksSJ(Z z#-b23Ussz6>=@aB>zZP3O)w0w*~phJpV@f%ON-6nnm3nS_YsCiKxDW^%~o3rLO(7UuA-UPIDob zBkiuS%&~!fui3f&>P?H4c#$F?XLS+W*Z^CF+gY)7ZpxWByup7(mGrt! zn6x;E|4c;fsCuCF$;bF%z;RXgA6Cr$z7rkQs@5GYO0LyK`*rt+5vsTpG;-)ei;i)) zJVqzJAH)h)<8*pi01=NmafD@ORUHi?XJ0<)y6dygRzdj5-E?%^FO>J}^`Gg}LT|%6 z=RTAdzYC05y{xaOxS-$z!-6FD=<0<82}YNFaACAio^v5c(bVIdERxzh_=6%*Lo1tR zz}XylNip^?&-!zpIi3<1xPv}@DPm+Qc{G`LZ1H(7s*_CqM!FC;-8uo&hRmJnNQ zgJ3AC_wd0?6DB9hS1m#XLy%x9{(cuK!3R{@N)9s~Ud4~gVZk;svBtOhp<4f;74;R$ z8zg3_kp1g8rs}78ui3`R;jeU9km9Mh>8~vc1-kw~Ckd_sfo0*b)PU!_rY}QH;)5MZtd>0FY9Q*bu?P36j1?5jmtyL}(-wq>o#; zuvqBG;HiUc2~5W=cU!y~rWO4)7|3F_k_6sR!%cqUCT`;*Bhj3L{&SZWaxT@dz8XaJ z*$BmMLaVLh8lJ!0i*@neh3Q&a`wFP(7-0edwN$oF?-KDKTt~Yy;@<`t0Tt+2kgO-YjGdfO5U` z4ugE(K5Bg1wMmLN{M)J(#BP9{l3#!)tpMhBAF+W_hrPzOLvgzdyxBh$sw`H`qYMti z+VeFSIir(I6La06xDh`Za&1Q#RYmp zWhs7Wboq(!(iLTrqgm3Wo-Mc7cLJU1@av#Ji&G(qp{l%hc><{4^{LXt6DU8RH*!GM zK2r}7c#-f;mq8WR%p7Dgu;LHm8{Y;%TGlila=h*a`hg!LGqOjZJ0M^Pw3Xamka=5& zA2%N1d_{g7tJE-b2x`{QIJn;tjOQNK3wKxfLpT)#FbESpN2fobpk-yt3+Vm`p8vFl{ehfM zd6JX`Ccrp;g}S)Ni{+mSukdh23D}i@Ss=jTr`fMVxzm?uSG~i2 z8fc&KTzl6U>HexX7IqiWg2fGAf5ER=21;6qluV)EW0cu1F zaq>WU&1k1N5hKNU|zup~oDzOn_b=+$qR5qRl>SrarGKDue z8-qFT>t?pg88&|NOwV#`6r>uO7oUa}RwfF49sWR=N!0l05+{HA^plb)Yha~O!@F{? zE-5uMhae_}!m-59S_kIDFF~r2;nWGRE=;rppULSibi&uU#HF>L-M!R)MVNpPcKzJ4 z#Te>psFW-r*5jFOL41)1c)_6J7CSKYQT(~sudACGr%~Z3QpxEpI8Ij=R`jTeh@bPU z(iB(~yTBaZ&UMXEyCU}oVtmRB%(4h}IAR?mUKBq6QRHZs9HiFBl72zHwtgK)HbzoZ zWP#ot%Aa^aE^3IV=B8x{Xx_{(O%N(xM2m`cz!*}PsDCgaZ<@lvv{-2VZJ<4LOCLQd1!1fOy@2gz?KaD1n*J~#@KDU=uz^tsQq+bMFStPb zodA8l6EeK<1H5lZY;@z^$K%7x1P$lg-ktsukZs;{2?4B|Y{1L9yGh@4>TwHsGpqEu zJRh6AKEIr+6;>#cgpQgv_5cA6tDuYlSWKB`|}cNefHEI|m>j(0O3tj1zs z1tz|rJX4E*1)%NPK6TPuCfS`V?_lAY z3wc^BPY}ZuuPYpF7kz{Z%8I-v9w7`4Ba+^LX@i3GL$KeA+QG7HX4g@vO1`vHUkz{3u~2|9dl0&l5Wjg6{`G~e%kaVMr|JAh zPHNMw;;r1|U?05qFhPx*P!8Gd2eW{Ko3k8kRXBY$f)~eCl`4B}b^9w8dQo<)%2x?Y z?OWEEdJlQPIj{&I*JL`XDOQHsv|$$@9GOSW8>2s}~eYt@e%N#)KFzuy|+^mSIId z9qCM{259U~B=fhRaBt301&EbX5f5kf5DD@2y^SB;UftdVxI*6=){y+DT?GpVn zt|n&cZ&}kHZW={UrB!<^dHcWtB=kM%a&YO?G&LFNb<3G*kH_zh>KrX$NCbuI9b3_l zTYuh}4nUWBv4HbFSMQD9ZtdX@!o37=90kg3;CeNYF%fF_a6cn%ejW!`AF8qwz;a!p zd0o%lS_@F>n1fg&9Dub3vyTQjIw2L4%VrRtj$b421t}Y$M=UC*2d320hh%m4b-_+u^?8G;1hT)e!ZTDEIp2MWd(Xlc zR9VFRK!1Q=u`FB=wDFv9(g$?ib#}Lne*_~jFZpHH^tv*nTTf7wy}`h63BBnP4Na;{=pk&=#|?jo4@1H}QJPbG=Yly}K8|d< zpZi9ICiB*LQZ?I?aavgn#|%7uh&S5YtfqmTqj2782-9@|&ph)wP#xhB>PqaBG4Pr3 zO%dl9X1u5a9i5mO(i;X5ku@bD6;eQEi-`5ua`d@8YOw}$ps}d|XpiPN&=-9zP;5|R zcQ$G2qUt4(2%Ln24{-Ab18wY_p6rQTgOPp`CxApiRcyuxHX)&$-uni(E)W4kaYjT} zQsuYmt1bQwR2BwN%+uD0ou?JAPwzYC?3GRKso=AOz-_&r_;V9b6wh#X6%59~VM=90 z$?IA>j8OPIJ-Z#+H&mx`l+SIA+CjzyBT(Ci>Wu+m+Fw=1Ox08vLO+sjaXmw?+?_?9Jb zEUx`y!D_q%aaTUKM@C;liH*`<9WbxQFHo z_}l;rJQw~0frY1SU_SdH%j02n_F|D*u1B;iBez`zDoXOWzwS-kZ9+lyH6Tcy>9b!; zO`W)hxSZmIo{uVzF88o|w!6VkzaKC-)lNvYqJ7eGjQtMB(3p=G=P z@15+Mt#RK}+_)Tg_8ouC@UMT-J-p2qg8TtSs6+i1UabX)bD@L}+B2}UB2S*$qa=+3 zCS7r-^WdDZ^F#4@*)-@PEn2VnqjeH5dD6#0C)1Zer!jSu1-Uk8Ao`qL1S7MmTN{kW z_wL#$iUTa!nNG;=z4kF|n*7t{dxa?&kJ8i$4ho=AZ?s1o)q&rho{f%QIL*Db4MoVa z>NML(mnZ?~`9Q@CKdk)C9;PsIVjJLW32!DU}QS%Vhm~;4YQa`odoE4Brdrb)U*Sw+f;RJUsV6f{{avSZeFWnlc zZ3MxBXBmDt1o;?kEQ{2JA`UQNbvL55GGdj%ilx}-q2o*fw~&OmtpDEIEhNJHK3!yA zdf+xRq~%$bb6c{~%iy17W)AzP10cil!nY^%tv(@j>=*?A-*O&yv-2DGL(B9>yG1@g zlbT*E7I*0v&B##5ACE#1F`fircL6=VxnzF^sOZxGKTqddD2^LZ``SFdrPQQ51|#a4 z0zJ#$g{|q5qkRa0XTT=i#HMIO1EP^T$jd(f|M~6?yAOw#L~FqhC{hDVCv=$q4CW1i zh4Dig-b#7^9l~zmK;qg6LX_~3MmTeDcm)Y>B^3&|=&0DBIKF3pKjGKU=)JV=iJ&Bd z=>XvN6h!?)QFM6bjbq5p=r4C7tKm4f?;>t|!RGOa)(7|;)N#VgE?d#A%Wi<*fQ~p4 z(unrOHOOAe=o^j8TSDO=DnD<(duI5L@qZINJ} z+bxAaDx1b>Sxr^qL@5xWG;?UYk&sCySrg$|aK2F>Ydrl?UeU8uS42g|768^dnLl`9 z39ZB!&7YEvFd%;_Vs47_Q?uk|G`o<(l`%Uj`+`;Nb@nAZkr<|cXG8g&$ zgJM1-S`ThZo0Xu%2YsbJJUo)6i-Az{Zw)ckFeycwmBFK*E@JRdK_6UeEClcnU-}f3 zcQ4^j!ba%;M(;tz2~@j;wYq zR=9=rZG;lu3?&jP;6R#|;B^=~x$RZQmoRl4||g;Go%-D6eE2IiIluE-lh(TG?_(s3?(gFSslgr}KlG+#S@;&ysl-CqR^{T?pEm7V(@*Q zZBOZ7k%V!`+=_%+f|JVmYgQ7s790~E3SSQ8e#}ebg8&tO`xtpk!Bo_wnmAF{-FN*b z%~-gMOS$6&hgf(+H!1<>57E;AJwYisn8^V#e)w5h{$QzJe~QN5zFu%_ukP4gZG8d* zuj0$4HkF|d6T)OZHBF)!{;WPvhHoLHljPPzGzznwPPYzn=3*+#Ye`q-3}p(wkGG;AYiFA`kezsf*ge{vhf$ZE9W7sw-u z$3cR)$xdt57GMq0ea|(qU$0;CZI|IviN#o@jP6Hz`~Ce>z3*(n5i@}H_ZfCy)wI3E z*m9n@d7#(ija?j$@Ge&Qxkk00k^lSY=%5hOfAexBnu3a_iAW_)OWpGn{cw+=Lnxn* za(=$EEegYjB1_eAx`LQ~DZ}RF&u9T;{%UcM5uL?i++SgRquu?RVroU*m-(hAkwz)# z?M+T^=N0%cEBHnzQnSbY=ZcmB52Xw8Qa+z>;(YnUj+1*KuKC(jloBmDLx@q)@6OpNcBpXk#Q0n!@cdE?-+Kecde5R zn%dT$)p3Jwx@u3^dGd5~2{lsOn8H)!8$;QFx|$YGv?*19~r0I(}M#AimH3PVfrI_!1EkgjTci8`V_q+vJvN&0NIgiIQs)Hu>8 zD`C#H>+$Hm*s~v9z7@N=nH9H}Wqrwpz8qv#MYjYs`}841L0Ol-=F@1lWjXG7kq?j; zHqB1Db_R`$w1>dHixOFqo)-=RCgp;WMXOEV|Aiu+)Kw0;c9_uxKhE7e*5)Q9qoTBa z-MGpWl#eOU9SD0+H$Ga%Ls$(gW2m_2GGO7 z;Kj+vdvAOb2vEbUe*Ns>#5FZ|1ryHOJ78of;GSNni;|r&$!&1XFb)2lcUpR=y}TAQ z(C_ZcsBy-&j`5t!kd25@iYkQ=T>z=7Wn-$nmy8Bt-8E#;$SZrf8f?O$hyi=2E18F)ZH|)C=i26`+o*z#T>qKovupkJYj6#jD!=^xs=cta`|4 z#&S@lharl&gU}rAM*9xkbwrI^GZrj`dEveJ+-#WXf0@vy8TtJ@tebh9D?_4}G$fgu zeDAms(seQ7FZ=(gX-Dg6&+5kpSQZZVqb*t|j1^;c80;dG8m#w~vw$y)F}l$0<}v!U zEUu)_3cwWx9ZmK&AP0AmfN3+6^j(r=bP}thhlCZ}4dW>;r@sIpKx_G>g@y-&K>ejMy3i!Hu zmSvu*``lg0I{48|PKx?Fit+TJKn!u87_U9fK+vmT^IhwC`xfq4Lc8?bVcvsg@xu+5 zL_Vv}C7z23?dg%+25)=aEa#-ykpzq`*}nv{j03_zIXnYJaoH~V%g;sqKh94 zb%m_d!YZZKId#5hN1a#P$oUEUwIYuNXalr<3EZ)f4@VP;JOhDURXr|Vzb-kkx;LnRV2wz5c z#b@c)59CTGewd=d%eGao^wFX->*FhP!n;*g%uT{ce0867AYvFrDy6g}9-?P}d})7e zjW;{(D?7@Fap7P=d-88&5qA0V)?NHXCp~=l-(mcSf>shNPf+hLd6vN_)F2QfHZ}Yq zE-moU`8tJnbNAd+leL0}9up2dUBWya_~j;JYx2Ndz5a&#YxV8

1%JSNt}g=>94J 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

-Z0$$2#=-;_q^z3xhrG`J+=f5+#a67n@#mGDgNX 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�$i!!hwo1KFyrOn^o8~5@tQV`3>vAg4 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

F0bxN`MOvp_K8XTj%{S#C2nSv zzl47C)5$S~n?IFbOVGfuNokOng&FqT7Yqt}wWPo8gHQN)WtkSGx4hXN>gPpsNZq~l zB~80SU~wZ0xtotbi}?9@&u6_Iw&*I4P{>VdeDO%GnUT-D9MxaDbM5obM^32@Fh*3=K# z;8l5A)_Tpl*=TV`DWJOfjp6W3-kU(rOC~Am6lz*n z`pFFxQl1zOO*r&%UX%7nS-ILptq-SFi63pgGH(~IW_Za5yNfz^$Zb7dUzQbUM^)!l z*xy-&9{*7-$o65YsK92uDpdQ$@ZuQ;W`)a# zgzn5t{8@dlIl@~+RH;K5O zFZ79_h9O8G_r6`4P~J>nBA%1%7n-=>D9pPvJOaGq_DxvvLK;Jp0?YMtUGeNlq%@cg zll!XsX@9Sr9lxbO=9Ith{_7teljrn}<4CU$2+=QH$%DVuK4~$>KlFqDrp_*rR)Xg; z?q+@QJsRCsMz1x@2$>nZsdX$k1p`7(5~2FCpge0w3t#CgSYm{d_Uu3WXAQ*#x*)4l z?OfhfG>p%A%6u=%ZH{+l2t-`UYO6<#b9HzwfAwn{a$?@sd8@0(&nYBdokJSJwTxUaU1XB);F!ZH(;iVv*S&o#1a3gok~38k2Q+76n-&G+dH$C zcb9u&k$C0V)I;Kh;ZBdf5gds7W@A$=I0CW^u|Fg#{X;MHJNs6JJh|p?;a%G%NQL>X zl37n97~W^? z%`bOpA>AtJtrZz&C^_!+$WS!uEHSZF&I06_6@^8%crP+E*vT=KuW%9S$dA84n6YFB z!C0C+kJMjD$8$7?8bbth1HEbJ*_lGIw~FHqB$P)7d>U8LleF!NZI1oHO4Im;43Tk< zy?6rBcCQ(7Z9gTerhLpTCnA*W<;$Ia*2>M9jH?{H;u9J7TYSR?D?+HEYZKt^|9(rA+GbXu40Y>~Ve#!byb+2iJ>pT_pIt(KN2p zM=(SBg}IRu3UiCKufmolX2m2vyHFFY$yb87E0&gPH~eMEI*Z?0p}R8jEkA$#{L6rQ z6hFJUDsI=XpPSktLK*B~{k;*8PoBxUB?Dz`U%Iz9DLj0wxbT(*_UD-)n|_n3^Ecyp zl_Q+7vxASh0Hn}H;;P;{k~{qSyj`TFAOe+RfO~6vc!1&Gvvt$#ok{^id4u6+EtQtZ zVC$ZlB?5pXO>WSjl{Nz^|9V`|I&eb)H(aK+7B=3b2clHkUqvH$<>%3TUZ|b6Z#^q_ z3c}bgZiYSek^Xt&AVTR>+&_IRC~>zfCexZq3FbIAf12|oRzHV?gYU-iGegYD(8f}t zOLt)V%Ov!#cCzC;OFd*0C7R<#A0nKB=cLwSpH_Jgt5KRux#gj;d?(T0BWZBZfb9Y5 zvDd@Ab@#Nh-D7$q1JznP9;rd1gn6Gn2;~PH0kZ+|-jdXYxl+OFQ^lvuKqU9MJtB?Z z0Q>0Ggu@eo88x~zyZ<%6k!Z+}TL4Xz#%(0Ys>fULZc;k-@39gfl-%oOe_8i79MrNN z_6pkMyOs{Ke*^7`i*1Mk;V#A$?8=7AZ!3XH`ek#qABQpo51G-%*fD;59l=fWWqBd6 z7B_d}2JZ@pldzMHZ9Awz>jDg8ZOBe2m#8i{obFC&(Ikp)O+VGwPkvqblfO&4O~w6P zFL$7ChV_^!4Jy$Slno;BahjF}j-#ba`fCQL<}A-rG?g_^V7>tt@4kJ?Z{=|H7r-oB z4%@fWJ=j&xu@oFA6|+eM<<>4czo|VFEu%p2G9t)op_$u@Y?BE5dogBAUA7{BSz|h7eay z`?J0CL~P-K=?6s?dwxoMvp_xEv*JpgrvxvJCE)o6?&!Q@UmR`Wrj?^oy~veH{Tb?U zxff|;`8C);9L0%$NdR`uK%6QJ7#5MSfo)55a}F8C9#^s~A^4nMUids8pUzQ_+m{kv zXQjjUk&YWhv>K+FRR!7#pYHxXz4+Zs=V0Cu9I@-R=4~M9FaR`knhyf?6I zj4qE5vA$aC*Y{lG%22E zJB94N#*n`nTk{|N-rb)B_1QW=UJ?#iL)0V2wU<+Pcg-yv$Sx5rco>)4FnI9-dn%pe z`5T-`eAKT0yvvK~Zlt(x%OdeQY4wplS(A9#u)IgxeipUzXL~u~);KE;X-Ta+a%+aw zgoKvQO`npfQJ4Fv!8AtlIX`MXm^KCOay2n0i{*Ht#HBxzDS>d*p=sei=>t2XL(}^)Vw-;EJcdz?1fsd{61H`J2nmHF92O#;Kz6hh>wTPbY%!o&17m6Yo zR8POBWj)y0W7odX{g%hEzJFnr^tmB3yscm;_s`{mySPxT+o%1b%8uSK465nfeeS0T z^Xv%?GRJq=3&{o7ONgICRlRv>qBcA?G9OnxL1`Y9OKbWz6M0m5FQ@YEm!h#-TZntD z$~o7eDq78n3`;#|KV^2g)>I$YEZ^_=ZM?_E1feT1Ci3l_U=J6uF;{wP54j>4eSXOMsgFBZ`)$1oZ4`9`SBapC{uTZd z*pMlHj)1JfGpq=umrgoT8k0QUejhTVL<#H87=2=zE-fWVUB{l*=9o#1yNl1 z{ZG4W2#5^G&-V6BwL`fxXJ_yZCZOpW>9ly%v>;})X-p>*p>KE*4I+L=w_q+A_n5?` zUKH>zV=%0x2;Y-=WDi_w2l-;d&0G(}+ne*^Uyc}b%t1M=k2lP5mK3LVOM;>Th@Rl>jSgC=k1lx%HCJdI&33ZDI{ z?xox~->kl!{zn|t5UVb0A)gS;evQ1q)kreYRFR{7P-~R2g{jMfBknK!OZ_LG8-N<= zU3Ht_7|!~IJ}Y$8jGHr89V`GMj?Schzd01T(}FK|uYR9IGb6v^^`_q?V!!LJJfJ@; z&u+ZhGbR99-otLQjJIw)H^QnwL$Qx|O(&7=@j@@n2MU$Z*}YuQ%v-(Aod2wYv)rzm zvk+qO{5k}g0cm{ExIC>9oHxp!us_jgGzme>AP5GcY!pghSCyZx4eF_oG&%fWP;0zf zC{@aLeq4%|&+5ZH9`R?oE9dL=1?9t#yqq8J>i5(k_(uoFc zC$sqkm96WKiVzGEsXFrP|I(}UCYuM%E<2k0``yApCUc0jms zLGNh|SD83}1y-*LMBg{R2Q&V5H@$SdPUwR zH(G zH*5WJP%S`siiy18Be~%=aE|$0FUF~Bk=)E!ucCu`Ts;M?cpH*>lZSnbQcgW3?FcYz zXxu^b)4DDi(ETIdhQ~vQ?%#;>T>;_fMx#u{PORVAa{x%B{kJi8{QSOwZ^7>p%;1nT zkvJd_0yZ=p6#8rPF<)50uO)sgknslif6zzr{$2J-Fl*d zb-=uWE{T3WoVztOo9)YKhO750U>pnOwjT^+&yf#=Ew^WAWV&yW=&**#R8Zw9W|@cO zUd#03<=NB~WI~K&5KL=$MQP;FIB^W=Co%{VFoS0H<7XnP$C5!T+8m2*0_fNUQ{!R= zzCYi}IW1HvDa0p;yycNbWuG0_G0H~dk$_IoSlQAkaG+(Y-d@^AIk!mLz^J9JYun`( zVq`eN<6~RI%Zjsp+_mrT0Sk4k$^6}a{;^;&&dH}6zVJ{B_h{31jkZ=yeEOhf^R8BV z{S|LL{j}dvPn^!h3YQzh0d?oNr-Knpj*}0{GR?omh8i|grpSfG%y6gyq~Lr;TAwgo zVhC;Ukxx}jRVyE0s*-g21sRF>f@J%6QBSbg`D_nx{tkE?AJLG z^rS6x!DW|jTT$^Qh+~a(wVTG)dd4C;uIr+@%0Yj;Vvl4ol9sRF3&Sd7-lm!8!(@A` z?zar|vXX}6HG0lS%ign|_uOoSQm3hDJbxFv?j+)Wl#LB2DssAIbk@j+ySIB1rf+w| zkl~7v@xI#P(3T(Nt;=8gG)(Q8P#oxiT#B)eSssgma(vQ!A{&<72Y;Nm>| zYuI@3eR0i;A30`7A&xD3sU$4rHWreEtJG&Z{V?XK zBdwwd>OqhWE6BWVY74%`1IHaDofg`Lw3<1nmPFMR+vQcyxtFJ7_q@V~%5J22MnGl1 z4Xs&7@2bZFUs1Dc4eO(?&Aj;jO>}=eW_eczY<=(Po;Y}ElOg=%U{cf<>30wi_EEj; zPvvAvG<2^)`pj?%`-)s-@sTL}%+1PJ3V)a!Ji6ha^+hMCi&L^naoM>yEmg<<{!+JX zaV@I$ABhf69bBN5Y$MY7bRKmsBwjC$&wD5&-{+iY>x?Y67Usqd9 z9~4vE5++jRtg)&57fbRR!y+UXjU2KILWFIbh8p`y9tvDys5@WTeIOlCyu_I_y=m_= zL>`;6l_4A*mKm2mzmN@qQKwvcb0rDzrqkZP@s?qmG0=X4U_AcXB1mOtU_eTc^2jq8 zZ;>a{N`Tbnh+f{tJo5Oscc+50zTS&tTRqDHgp%|q|cv%_^?*#n1 zt7Jd57R6cr6?Xr*W;3NT2Cu#E2^j<}Nn6%xBBD|;DLG{Q<2`HdxQ01>mI8eP z8WVdFM5cM&o~&=_J7>4lqAsRIzj=6EB*AOv<3#0qYp+8~Vdwc7f9U)bjl%;JZF(1wdYAlZS^6K6NK=(ooazgw5 zz}r3+!WCR*wDkUbcl7O^2NUr@mF@I#R{WMmqgo5si`x&7V%Z9+;QF9`FTY~+(L!%H zYhkS1k0*At=I@P@Jgg?*qPLA>a_k|gf*OS7<9&|jL1M&LZTKXcDoMWdhY*pP0J#Ts z++Pv6ch)QGcVGOy)bljcg@LFhRO$@h4u!-x%J{&9C>Q$NA%p9nuwx`}L}S=@9<`xm zO%%S$F_?|6NbMlMqkr;m8~hX>H~pIpkzZ6Ot(oJxUtS?YC6`Z6ouBvj#%1z{`!g56 z$yt_VD_l4RV+(l1a>&;DO~+i^@whasPW$iA_lY||DT;cn`g74g-tJT7zW<}Co>wtp z#`wD_uiwW4Q&6{xbrQGko&Z%lIdsIgFHD2E>f>2QJ4;{tw|FUcAeaQtxkq532uZNn zVdBLa&6=K{^(&^b;jMdwNbe(L`~r3Ry-bp`t9f(d6lm_+Gu-CrDIVxu6GP@kK6JSue9xt6CUwF^GS zsv12D;4`P}YgGQS_j90#__DNzP1mF2UYPw#fR zcPgtJ4A13`2f%Y+9>B1PseJUl@=kZ?G{@RQ^uUG!(z_ad^zg4t76vOTK>+SE_DxvT3PS>=#Iwu(mqTCu$4(nmL|)#@U1g~h-EPsj zm)a;J``UCJ@&}=+I~gElSEzR+lbCS7{e)n}T>s`F^P-%{ZFliHOM4=Ns>kPTe7?|% zSsz~peW*Ph%G{|9Urgu-cwQ}unR;VG_fp$_1aIUJD4U{G_}mg-svIe)t!jx#antgw? zDR?As?$w*zY7Bw*76_^v0qSgn>=p(fBA$m^@efW(6x)YUD46=pH`vz_K`xrT=SSn! zZ4#a^6aNqgT@UewB-3YtT;m(}ROeW{KRN|}UfB>+`l_}y?1bIITRdfnuKC%|6>|oP zetU{V;jZCpQMLH%J)XA>@ZxETONx{rupVO5JR$lXlL!e%`0&DFFY}3nuvE4FK;JuZ z91rz5dasfg@7J#+wIDrDHFUwn#N!kW#-(F)<}=8vBml5_IM>ii9Hay$x|eTfqKQV%&eGKxWR(cs z7YNS$ZX$O~y<-dNvx7!$bBH>M0o4ys_wptZialLj@fEAERFLRx1KC_F%$JggWn~pU z1T3cxgwMt(;eiNC`OU?uBK@MqUPPpS%&!kgMi}n<5LW4BTeewjs4DtqjOpwI+9dz# z0R9_RdF(n73SimQk5jof&)edlIhr*Dbg2!qv%cil!jvGFU1j+`EiwYaA-w-?>KF%) z$g(8$ISv_#fFFEBnd`oLcWvYLHXNw~kbq%beu&Z-pZIr;%bp(eqaMF}e~@`BdPQV? z^oz9d7Wg8=Z4p7FDK+!De~1%1e)blL)`qc_g{l4X^5?o9CKeB|y9$pOxUxC61_jBl z?{M^A;dFS7ei6sq%8O}d`U(R#xlI#)`cOKLUu%p;xgiA|5rd$$dar6-Xh17-VZueq9ZJ9-RByq~w{+JR0;Eax(o;`@DT`^>;wN@`yq4sdnZAyuyxK^le7X-KSP`lw{LTYUof;4JQ@F1|N3IR z-utB+5l{S7*tP(fT*=g+VH_Y8Dis)1MWEr6Z#0GAtgMSLzHF7e6vK$0Nz#O-wwCK( z`ux*!oPWncA-F|F)<^}N@=Hj-_7XSGlIYnT#`Ig62&28lT<+n*a;$twzhVZ~MEMYG z$z?ia-_J-rv*l|n`7kt@$--Ugg&=e!I*s>Nsy%sefh-F1Uv-7jcM^Xo_~NYdhp+qO zeGg{oR>i*1gl5}fB+p@9NzvYwCrQ+Qal(4}gbr?ww@!Yy|8tYI-S-Nw`XJdx+zL z-+80XDJ5grC12bqAT8@F_vWSiJ>0=lIAk9WP4QR4z01LdR@wFs{YBKjLBt{LUWWJ4 zS|qDAuDZKoky6_4i}j!tY)pT>Du5ij6OgrTcz=S6JyrS*@Z{jVa{IkPi**SldQ{d! zz0qn8>qR|$lrg`CwP>gQ_DV;}M4f>L0^B zE8g+;nZMhgc%VstmL&T*--&zFkZHL|aLvr2!86)x4oLm1yzTJL*X}Pv1d04vCOj_o z%vwoCGEGbC<~_!o`s1X6vx^t~R)1%&HvUwx1XJfA0cF|!*+AsUg$>;@} z&D}ce7$H`;LZA}@K0>`)u;1^S+pq6d%z%^wKye?Y15S%eF=Z#;1eIl@-~65Pm=u3d zr-LvAYETK5dkhpj4y8}NyiYD^wBd3s)=}|Ae__C~&34Aabg)d_BPPZxPRqn04z?Em z!xWuOtlIZrz=hx+vwKb=3B@u|g}(+IQG_{INJN%X@Iukb7+Y!12FpwMHnHAN*%ubt zStKH4aEZ|JICX_16(3)m_LU^pw7nnhcmSV@;nc1my&*@I5u%|nz3m*{3WI}65)W?8 z63=<|FU~1P|?|BN&13>e|S6N@ACUE43!C%B`6BK5zH+Rw)he!m`|_`A=WN_jLvYt8#v zOkT0g-f5M1q7|(ve2Y(8co7XeRZ_E^9TZYVI6Wddy0USOCZ$ly@I*zuaiV;|;_$*uwa|$W(cv!rtjwiFh z$;ch#wL1qJV!x|lI}Bn9k!&C0qlYBps|dW=TJof~C(r;vUbc@TMARI`2QcfKqA`M=VA zks(&ExYNz2nV`9?*O56QsTn`)mwXaR6UB_p;@hV?vZ5}0#i4@@fGhq*9b!-5?3N4> z7(aP-emZv0NAkk{Cpuc&b18h~E&tC?GrB%0?QFVfdG&$Du9J>^$s;Rj#FGf@btV^| z@0VFziJdG!22-{rzY+8-=@x0za{+Z{PhD*V`4)i z?soa@5rN)3GFSe}t13>0b=e16&Tw!dpPmlkQ~UC0x?5w7+9G{jutkhIn*2YrzK5*ijr$X`*mKjQr&xC|GmM zZBPqLr>{5}Rmb}~nA4n#e##{NZjei#OL{TS?YcWFcQ^h}nevOswPJDJTzS6MEc6QG z=I>9$Z9;vtJ%cHvj#TdSyGJ;Tx%qv|`>uaO^diZp{ja1??8ODQYTm1M~EbgpulcUb~OrxZq7p#_<%+_!mlzDFa zV8oB@N!7q=ux$q^6%FzE$b_Z>6p2Zmw*TXe^@hD^UwPyuP`8CcH zO&v%{N2;OMp@frYDy5R?Rg$M-sAh}%p(DBl4W`n~rpq_jPIyIY>F+H#9E@NnDla#e zI!sA@E{H>gSXlP*;|XpPop_SpYWMqmzBdfHHYmNK65kPvbOmg3RZrE(!R*%hp~;{^pJ#$!G}zYMWdZZr-pt_{E;?ojnts`BG(QxB#RZRu z=<7K{(D>y|1q?50Zf@{vLP8zTIs6~;^sxc<@MTc~n9ct!Q=#QX(H7RGIg>&VoT2$2 zJKR0cKq+t_66}`bj?-q#X1RyXHTl2jQ_a*#XEn0%Gu=;quh$E^FivQ;K2>&N z$L3B74YM&TRm~5a4|KJ&^M|YI=`MeJG%QeTY>e#JJ78tzSZtlR%oDeLf7bn^s=tpLdWrI#WM>EQ2yYXE(a!}CI8LU_!)aN7zl`ION+yon1>oN z@G7xuKgXvPFrPdy-Skl#XK0)@7;UdkdQH3WF1M2e&Ke-`PJ>2%q1R$T@6IZ)66B7= zdVX}5dZ4v4|68P}((#R_1K?j-pKy*g&YdilZe$^DA?e;~>f+xjPdr4c-HyUI8KDQb zSF9uP{ZOL9tHCP#QwYih)4%lH`hJ1&HE!FOLthT5awiI^4^{}$ZmCU$`ZDOslh-&q z8439)?@ z3vOSpJN4fLgtcRT)n+#6zu_=NP^6puIyxBzv{~^Qi)U-^vSu{0L|}IF-f23{_89X% z81Gq+80Koez$k90$}m=m0Gv!inqDV&9j`&+YG_1Gt$8&ws%xm}efO6lGS6gl^ z(c=_6aAjt&n{NuuW}2xW7~|i4eP=WvWi{nZZ^9F#}v3@nrrlfvePawGYKwM&0pZ-e1J`% z-h1m)GWPD;m{=XgKjJ=P^%U!-zw^Irz(NHn-P^a{Hs5w^TN+#6eKy}yF91(^y|~1U zReK0gY%OVeHws#>+0(t1K??vE5!&}*nTo-HZkvvr8hUqloIAoDMMRHth*`r)6re^Q zaCo4$Qf0mUN-pbd!lxrBNq1T_X3BJOohHTB7$kloz-FLjW<5oP1GDP+o8G&X!k~PvyIc*S3D#cTW@;&Fk&{iTN5K7C6Uz|C$~!iBGY6-}(=o zO~N<~8~oJKc>Ba-t0~a`y#}?F$vjDwM!n`v@ko>VUi=iQN`5W64LZt&E*dniAf_DVs!}Uy$xAl0$k1E3gIiP?ePG9@g zU4KcN=@*Yb=H?ZE9O~Gm{`4ofe?XFn(M)=pKfmSuRrp))j(t^_$O#}ztou8cV#K+s z90`_WZh4ST#srWS?!plp-usgM`0+RH)Nl5Ib4X>~hK;NjTTH28ON+B7w-HUZTS-?- zbROQG0wo22>X-UU*i|ho{7=4@JO@qvN!Z5|c^X72F`!I5qy4zG%3TBXGjoGxYT3u2 z&_sJ?6<4BQ4a#KMi)@~SCn)H_@tUOh(WV4 z+X;w90dE<~ldRWz_+= zSwZN9aiRAsFOOzV(Yv>c^~~z-`%^!*Nf@D&(CIrIY4Qqfj2V6f)6EnvIuC0 z)xpo!%9!JxN*%qXdmJV8JTiNECh8}4#MLGO@emaPhz#=p^Mt~)SW(+OdvkQZmtuMD zC~R5AbO! zciLwpgP}u{sMSo43B+?UzDs%e(po5lU0hGgZdaX`(vQB?oqCAv(|vr*@?{1$x$d;< z(ZK-rSOHHGYu#HPEyxN+>h`2OSZaO}7BHgW+6nBz1{X>;xq?iCt1@lHQWG38)y}TQ zRB17PHZ7+Y&q?Ya=Cy?kW$a7Htl+xQ086Qoe7h}0q(V0knR_h6PK-jZA^Lv^wfDR` z_E`L!pWNS`Lmy*(lC={=7*5gb=^ep&1Yn>^KR_aBL?V_^6<8R?-9eg_K@+T5d^MG$ZKBs2*v9qzIj2!NW}bZgBP4N9qJ5d)arGC% zvO3V}>x=p{>CN84auNha1o6Cn)mwU3_%DtGQ_Kf`yJsNQs-XU>zDj6WaAjM)_9wh z#+H4O`@%48^V5qB>1Dre0cbn$RGjxil<(!eywdaB$ zuqWkVCnC=E2v7 z=JEp|&B(>hr18g%9%N0AoJf&B+dG;CRjNeV1j*Nsv%UT9;c{DQt1%`)zHMIQ`kE&n z#TqX2XV1Si1@B4D$qW4GzuilPJ1r*Nd<`Qri|>{7&ddl>#M0#b4U(3&$NTtQegaLL zByxUqQrE}fD!})0O(3Ua0G|2L$bz7BSRe z&h0?Q2K)Z@Z51~yH06Z6Vwoy6d(~3msRHM&m+O2)Z!@sMWruDLV((}CVUoz+6YqOe zBfV86L(|6bwy`Qm!t=UQW0|J;B;?(cIw#Q&5ONS1puoK8%3#>P)8oRi-pvp z`#Nr6#Q3UfWZcAyNlWb0T6?^m<u45PcKB{)9PSN?sSX44#_SM;`bA_gE3g#0-0S;AGuhp4{Wz`r{X0&6 z!w)%CE&)p)|CW%@6_mf~3_gi4@DTZd{{Yg+khZ4_T)8kKDE1 z{5$LzoBKve)>(9T$#(UJ|6ZKm*b^oc{EJ(J=L4jO1|yHJS?u!SjuIF?hCjcCDAicU zy+-A8$z`Luss__vzeJl0c+LaUsOA{0bG`V?OlAjoOdz+{rHSTqMYFf*)o+R?9OwOH zyaRwo(x|P~#8)a;E%Ew1g8R81a=2eF%{FT4=3PKD@>JJ#nbFRIZvFasV5ctcAdx{0eu-#A5-$jc&c(bZz6N8o*!Ua2>G!#p z&#Rl(u4sC6a{ z{e?if?!@DgFf446zocF=9G_ehc82#N%QhhyCFrW5K1|Me3!vwHvr{j3;fo1kx_$1b zoAwhctDVNx=E$$*I7 zP#5ZxC4u(4YZ{7L9e@?i#6Mm2#8E zO+sZ#V?zKC4{&OYe|2HMw36%wT)tSPt+$u^+x-qA|8S=AvN=!>0 zdav_uHQ@eD)!|HW`494DZQeV9(jtJUnQ>~jh|k=E-*$TwfhmE4{`=|>oV`}aY?5>+ z%mQjRF+1`0I$Pw)YVff07jrvk-F@iiNx%dM)_L+3l{o%*)$V2yDW;IwJx+tdju0^T z?j=1!Mf`sDns#{ptG|wg{bgvC2coBvVi-_&Pxdn>G$B~Dj+{7>-)Y~S3qpUt)n3;J zXTQG`4dKD0xT_Tbw4|tpf5Qw)4F~IKyvTGBL`wpp|M6Z5T}xLe!1`4(<)HW@wW%UUz*0~Ma(o^TPvBCN+0%B zeH8vAu79Cs8gZAh=!|wMLlZ`zWtaT(q-)fv)i0?r8Eqf)%$zCmXhCr*Z{LB*TU(PK z`4#v|;;F^2M|Y-G@BWL0Zfn?_GsE>DP8(O_S=V_*%s+-5@kgWk_WhTh<7i5CMuzRj z%j9<}d)+bJ)I+1QNHR@$5PSnBw{F+9G}W4{@@uQLp(;x4V9Pt&PE zGuI7+-{F8Di*EU*<-dR;nG26V1{75sdSX0d=6d96+YYMF?aq(wq6<}OeOVy1-7?}m zn^q0tXs`?tOtXE@F`n`HzF2j&b;?7~CL0cZbo!$GvVb1(`Fy()Ydb7iwWiQ7lYFmE z6$Ui^<=uq354+PHweHgp4P7?p1_AQ97d(ufwH3bBVoobRj-RQc?ZbQU3ree_ee^k?f3W z{q=}Sxs0#!kEg%;-P=2~SUxvc73%3iAVm#NhZ{&7^P|mqtq|-x-fSDfn)d+U5Nuyi zY3uLp|9L2M>DK5?>B{r|+!~{ml>mE4AEHgKsMT?bFrV{rzuifO-X3+uWisX;&%e_aSl7->oATch6Q{}r z3L^aruN6hcw7-AXx9IuaZ%US1A<24>K1)S(DArT?)b0f?0-CAVvvY}l;=GrUS9c{! zvtaH{#HgC|J}e8<-Flq6Y|27a*OX?CyJfD@Wl^&4_TASe?Yf@d>}@GffcmOIMgF{N z*ZpgRqEa|y;CZ<8H*yLF!`gw1N*Aa~wZt)Qs(Be-h;{0Wn)-8$CPfPH%?K_R)%d9H zDZ01Ndie8gdsC*I?=y3&bn@46PWi`q-gtM+4a(sGM2JYQMdvL5@{0dkt!q?x_;HFR zuT<~N6dT`Mjyeyk2VG`{N~CCcVSu#!bTO40vVL&z#4Aq8Yn!3diKdf9?k9KD-%I*_ zM;V{%J; zyJxw-3h9K^5=ZEqK7T4HU0U+YcQU4ka`<xv7o_R)JYx%gw zMTX_GGG#fE(VveeP<{@ydq7J~?XZi|MY#a}85t%^JNyGk$IEVsv)2l}4h<8oo!!;f zXt;k2_r|$hSy3mVsfz~pPIgS&aXF9N>LX8K_izh~!Sbu5{koEtH+E=2N7XkJ(KCxb zRv8lRD7mA%XjD$L`i|LT@Xe*7{VNd!5J6RlEg<^OYY${BGrCIv#!Y_TPkE zJ}aFi`-P!=&EI=-X7t9tRH;5&zowAroT&4Yu=`E;#J8W*Zb9JOza27y%QFK11*At6 zCcj?`$o$-!b8IH7Fw~rpy2CCKn}TQ99i#rdKLX(GlXX{yOX0cUslq*g1|wX#h9SG5 z@N?;2OYkpy(?MV2+aBCytb|{6)nV{`mEZRCga&rrE`MG1(X$azq1*8{?RU{Cgrm;~ z**xj}``@m-q)Vkm<|&qSHs*oxz&tLoaG94_yLW2}O3VpW-~5}Kbl+WPv;2k`XaD5f zn=Q`yc*{yyu!tvrqD8A5e?S(EV-rQi^YtC~=yM5k#Vfaw>N*g=xqGUHl5UOsHy(I8 zr7KOwaCan7oB`o)`&eQK#Zan1LNKxDOA?D3nAzFOh zuy9NO3VzSORvR_WAb6Swt1nOMOj#ccI)s zA_@SUpDmpqKAtetL_SiHL)lj=iSc!#9uB zG-0ZmPz-3L(j6l4CR*n(`=(dw^k1eO+B(sSAb8yk4)s9odsL(DXgHpBAMrG^U!Wj< ze>OCtTfOG4))b+Pc2w5r$Be}>w5W$TB|$32Px%q5tDE&Zaj`JfW^j}SUwK?OFb3Xl zyeG{QGzDW0M7M9;O|JjF8J~_NZ{8KjvnU3!BT@UBdOkq-kMh-mwteFUA>>J{y>go_ zyYzGWP6_gAIFXybMlyG>{4oZ8!JL>ala>fJ=I05?@od8N5lZUI@DpRd)AT+1a#&M} ziBGa5@5UQ*gJbyTvpT;kWp}#~P`OR5ZxNe1t&@fcqvIyAg+_1p<}Vqp^-WLx;dpO5~cNajkYk@a5ynz_xI>Al-9uC7)Njv>i7hf7glGl&T3NVhV z8u7Vi`>3qOpWq&k`0ctL`Ob~VxB!)~8f1GMJFZPhgyq7gfUk82Mg?odv-B|P06=xp z!5sNA(q9`gxeDZN2QXoaG_REKO-g(;Zu0MWOIBxl$i1|jfo!*5&PlIJOS3kPvrV3d zKGP1sHu8m_?-*yRu*&ED_&&R>bOJv3Omt`pihXmi0?dz7O*nG+Ka@ zh?Y%2o!~bh6wMo3I!T5-l2;eYf$bad@>>ua`;zw!T`GdNdM@ZTeTl5vq=4bZReUbV zXlKfyI*UNiOR+tJ zT9p-m+7c;MseN@x{@wgV$GYsD0l792K3YHx@QE=Y>&_r6lJ7}=+oBx=J2)u4HoF`t z-QvP*pPuPi}{+KHo{)uzVCRfvQ*yhLFbYW$m0a|5z%YZTqkkLkEoit|RmQ5>qJ2 zl`BTk?~k%4Dg836&+tY7=CRAgqy}&Cemi4g)W4ghF!YZ;rKhE|1=Am&wYD{Ah`do^ zjM>I7xb#wn0%SFCLNMWFi_dLODi+&5-tCsFmyW4nIz6*fkQO(}@ayw;;Qx}f2b1VQ z5Rnzpe7j_lU+>R2YAiZhm0OZflx|~40eOG$+|FMn;Ct>=z5m+hJiTZtm2!oko5{>} z77tC2&q?@QBSaMU#pM4XzoKAdc!wr@eAP{E=AKHbD;_X=1oi8fu`Crv1F@}g@^9=oXuSf~~lEcoD zo-}Wq$M3ijyABsGHsWE;cMlAQ;r)KsqS~OLOzl?tUe|Tch$IUT%e31EfQ+oD%Ujgb;ae@iEmE1L{-!44WwSZ?k-O zR}**)L%rm!f5~r}1KV&WUAhBwG!q`e`)-og8=5`fm4)7Ot9JP z9jqKBjqs23`84a&e|G-hurb$#Or9-#fph%x3-w5QLFoMZVmddWT!$H{%~gZ!`Z)^? zhtu`MPoY4o5UKvSSu!Eao!~uE2>6ISeQX zghq}i^(65ER%o{7gJvN_IP8A7VW9PiU6-ZUmmb60fYc-{OoECYJg-j-kU0YKh(=!Qj;Q2 z6aS(c!wcY5zYKjij@rSohbPma;2TP+OVZW{!X%GHiZ^b0s&V^52+Wt}%v%r)wP`J! z6@yQ5s8=cEcK$YcEr?3zPha{0X};7+qd*WYvyX7uLFqcr=j}GrbE2GJM1JMBwWJGIvw*6MK z@|Q$gi+41O;pcfk_=~wf`D$k{=%qcdkkEK%>kC;ftF|BeuW$GxtvNcy8auWbL8UNH z^%$Ex*v%s-)M=1{=O4?HE@Vi_vl{N^)HPi_5mw|$|A;=;<5C{)UUI_rUWX)c_^99s zT>X{|=oVwz+maWRZMXRz226~85Z3c#+86~ugt~a12uaj6@2KTF$2l`4ZTaToBcu-h z*Ylf&LLBXvTD@%=9t>L1?-`Upq>;gw#THV#)RdU4P>!W*!qe} z$Ovm{?PBsJXfgzGpMRV^{@x$_Mpyi3VCqJwzJCxF>m|9V(Wt6;jiAj8Br{RuE@FRN zbB4Y;*Rz?yisv#%kwxaNfoqD@1QAnXZu|T!i_Y$QmeszQ^-NQpUX*-1&=yY|7+!MC3NS z#Tgf{9BJWK-oM}l6Ti@ zx&D1_)$ya-G;{i$(Iu2fVrZ;O9K9gN{e(STSu(qk0@aHu_oo$7jZ&wQpWT2 zuOki#{Pn)REQ{Gm0(QQzcD>B>dJ#(>mv(0V{CppK;!I$vVo|yg>X?oW*5{O0YQRq@ zD(AaWx6NZ`99*@u1-)6k=hiwd&nmuj@Qm#Frwxo3xiZoSns0vD7agJMrn^V|mgf^g zfj`wvHe)M@a$&vvZeoU#y%?%ia{ASb;&q>FfD`-%R!d|?z46CO2#-hXO@3|QVn3yL z-Gu|wXwz2r$vQxEO%FKMpXV03;|0HBt`ukN3qVi5N%;xOClj@@zT~XQg6^rpBHsOY z5F7NW>uy<`V$GpU5Mc4_L6Wx)83m~PyDz7bd+r@P-Hq>hXKd?XN22q!-?#0yrPlAy zUg{NG8HaTsPYIXJO@BwdwG3^>EECl>`FOXf3}4A2Pg$$ik#2g3quoRqcbCG_H4V#D zP{Z^Mw|p9?!NpDn|AI~AEf&Qy6viX=?i`HvFW+;jC48j{>m5`*M~*o8;pNiBRXY}8 zG9SIy8WwRT*s-5#v$BTh+bciAkf2bx4=k)@3kmt{p;Xxw<>zzImll9qDm*%`y@sQ3 z3wr>qe2=zmPx~lUNaoX;(gQa-wTI;vFjn$rlE1zT9z357NBmS-uKK?~Bz;rb0nF$i zeP(}uGQ;EUz+!7@zDT4^3!M8C#vn5a^Mxw|`9K?NQRG_d(*veN;7%+sB^IoUlMiDI z;mCr$outx71gy16XoNraNnxEpF?Z#}Y{qLb&Us~$OCB&3-sp~8(e!e&8dC#hER8Q$tke?#uOBP-Gif{Nrb z6T;KjGbB_{w`kW@A1&CrlT^iD}w+{+MUtTlx9)=TW|WgRn>gF zkUgmu>t}#K3_SV^%ygP2lxq*VPrm-702{<5a+9?AGJAT7IZ10I&IH$;lf>a#Dma!<`D>F zuWw8`Sp=LrVIrX(tN(}!XnapjW-s=+N!P|l*cPupXoYuX5fuGpMxwch)|cxYLz&P-9-Ce=WW za?TXpBH&%#TZW2H;=z#U$6C#42$tt(s)mmFZ1Qn49axT#%j&&;@i_S@FRP}S;%fbG zS4m|Xl(vG;!1eS)r`9u%(|-@vSRA4~!yN|%MyJLm{`4di{E zR;GUyT+r{@R$Qj3@SL{)!et-ox+i%#!fb)Upzggzrt3bonI2VRM0J)IO9)%B?zQn( z47|9Tf#Ld(vMh$O`}0-RG(@RpCORQTzpu(5d;c-2#Z>+7p@#~Zu@s{v*x%mIy_Z*4 z9&!E5_xRnIi>ta-@d1PXrSqof>W_{Rm=uc~?e10cx%DBWpQD(@`P8K#oR;P=5f5M= z1mf$63NMrIqj8eW|9vZ+fnHRa&mV5qOQg+k)D2=DwkOvfE0j9=7k7%P`<;fw+V`8K zEk@6xIraGI{ot5-#sg6F+>Ms~E^|HA-z*Fm00DK`9uLuI-*>OX1PMNI<=%W)#NvS4pOwLTE`fEMCL2; zoP{mD&f#`{49K9RIjn+YVqj;z(9%AHoR}C!W6f4SJg6|%E->_QbDhAat*P-%R`w?D z>{rBTeJY%c)Ub#~w0)}B%XlLdK#?~Z@!AWa2*SpL+vVdXu0TX@ul;l@{)gW{)xZVO z*9*reoxNK{VZU90rN*8XxQ%~3x4(jh>3zz*B`izXd0VsrZPGZbvQzh_BdNoO;>-G#iij&%8ryuWE-#Hso#$j(MP{p*CgI85;|uwejC@4tVLs;+zr`P zR%Tnjl*m+Sn^&K*Z*mDs_Orx6WjD=6%V-Pa&>p#qyy$Fd!JH5A>FEMAaZS2c6jGV- zCnFKpSMl_r#M$UF^7}6X=-5l<>u~M>AWxGVuXB@ayUtCcxql}5p0n9RlLU=~d2!WY zZ3p4qqDhkKAhv@_vL}Or5-9PkI<|D>drNuUQq`TuFQBF*qu=`Z5xgXok=IaC)T5f@ zq6zBMTyG4Rn>qY!8GJRiKV=|1u5mg zj&YB^{sw|2;SnKn6 z(Pf3@!71u_RyoO54z%x$(rCDJbFPaUTqdjzmYbvjLuUF^8UmZwDA#s`(-WtVl)oEQ{$Aq9iY@-FQi)E_+!khCM! zK8ex>H`M0sJ&et4R=gM2X8tFf)y41o`6wG=@a}D{R7JjQQ@@i$%W3CdQ$4I^KHl?8 zZ#Rs2M=U|JUlWfdaS*+#LLu#F%R+VT<>;HxXwC#iLGetD3fR?;XKQJvkG%<|!OVW} zom872(yKjHbH&>pzt&h(v=yN4B~CpR^v@H?^P#kApoxs37FVZ%^NO!O4Cwdybx2u= zg(s(FFW>y6`P;xxyk)USvmEhh4%VC56Mk^!s5%`B_1z=pNWJt_Fh)u+=4<^_hCzrW z-fZFRTGRIuCMN|QEC`C6E@K^uzanO@gghQ~&ndhV%s01f9uyg*BNp>G#QH0;FWBm9 zMq@ZUC-3&>DLP|K9m=-j9nuQ&cgoGk_(HS?DE#>AcVwO?kQ=?%na%!;X7=tKYa?(w z5=K|slITTJrd(B%>A~w&+;o7oSDBrV#`hacS(t@TXA~_|kDPap_$Ys|yRtz{G|dx@ z5WQWnh}r`R>kGmf!Z1W^pN{sW+r#{1?MI!!$P}(OXQ+zO6qNUlddp^$8TLRi8Muj4o0O=45J_SS2WV3~=9oYu*R5%cnE61iW-6OF-LkPqq{-JLJ@jqX zJAVzv#QYgCaHAk^XQF}Y zpuK_-4Eg+!V=-*LLI3n;rV4<09lj_oRd*3>PQ1Los`yLsfBx!%A7^9R^#N$e->2q8FecWjh_lWK6no&$LKZHG9xCqQXzfTZ<;x+uzezxpSXt{Rw8pucD z`m|5zi3XlJ*cR0H-xT`4e=E%jB9*q(i))l<{aE?N!P6AOUmC4O^o)t__OS%zx4ges z_{*dFeKxQ4p+8r@e)whDIdAh@F7vZXLqaP<9Z!;MeRR3~CSvKCtdW?A=Yc#6PiOV2Sr?i65%QcvyxvDUU=S#Z{c@2qRzrAPYZO4kHoO^cA zT;$}FJ>bG@;QXJ{w;RN}>FgGKZ`6&=W3RUBc(<71A3g^yH=gN`4b^-{$edN`A|NAu zhKEODUC(<(DO&C+Uxe46-pJK0dM_Bd#sSTtCWL^4eFy*OBWYQ*JW~n)Cim1@4L4QU zGl~%y9 zGT9I+@T2X>b8hLJ-^|sk+`~6ze%p%s`8V9!?+;dTu*lQBD<44T1keJ*Eb39ozB)H_q4(;scS{}-a!Ve#z(KRm7`--=TDKmM!`YRWGO6UNFnF|rz zr_gfs^|EA#{un>F%^gSHC4hp1ZsUkw$9gLqBuH!P;~9-3Fa2{B+RBQELg#~0wCkv5 zp@bVLS$@0!Yn`VtDpt}elwe}_r!>bV+VC+ z@@My;;Nx`p^hn9CK3O*|Tp)1pZcDH{ElWILOC#d&ekv2Q(Gk-MO#30zNmj53C+U8V zg7Y-5!hAl<{49$7T(>j_Wj8!TspY9o{3QvZJ$r*Pus>{H-!8tkR7HgBXj{&m_Xz6; zp48M=C3{v(3v;yGOIq%|SC3?mA}r;KKFa|m`OJEEv#j0mEm7qcPqypPx-w>xGgpY5 z0lb27{Cl|dVBL37c#c0$8{XeTI2jCz!%&;q*^;;UZGvZ*61#Fu0jGg*W13-WOP?^J z9!QR?C_>rEca1|8w^Q7c5oi=czjwC!41(|eg(NTv_i{smIYEo`IQEqZj@w$h;vl@OnE!PUmib7Rs7Kb_lzWckvdAX1eO;$ zjH%3T5ZCYXl@jJ*pBkqovy{BN?HcQF54vJm(X8K?DOo`lzv8TzfaTniUF3C_i@oa_ z(T(8F?PWIt{w_l4t|xh)a3QE1slNyKlJ6Gr|NKS3*x_)&RQ}A*m3I6*+VL>{Rs@H& zk{h3Qu+CH@GBGmXgB~}keC{!1Q%Qi(yoE-OT+4QZ;x1o)JD9K6Aq$sgHeJ(`vEULg zVmd35Omu4|v@fJk6umx|Y4O;edl-|ok&nKclNWwL1`YEcutY*ou_C_D_e=Q%(2uGx zv|f*UB5qTy4nI6fk5ki?huBU(5c{(CZc?_l+y$f#1ypBtpTZvPnm0`FzLJVW~Hj-l{y1wE(s z(VwDiesl{3AtQKMbC*6DzRsV}|Nc&!HLthb9z_bwzIe!)#o-jrQ$Kh#r7B19E@SU` zTs+eUPt0$we@jB&XMu=(ocPlEW+hFKi0*|*h;j-Cj+u%a8bwQQW<+~$W`qf zYQ1%Jc&+=3O4uz7!%VyLtdE7v3gXxH!BKbDtxXX7C6E$Wv+v|I=4LpPj>^|Nh=LkC zxt89avh{0`uzPg-46!NKK+n(lOIflFJAsx6&zWB{#$6l%Pu|_H#di~sOso3m%Y(5) zo9k`!OuthAUXo6kqf9V`s3a+_<`cj2?=F0;rY6Ql9vkkMrbZWC(knEVPDF~tJ@Qe8 zy?3Wd^VZuU(9_k-c*|;!uK|ogxP=J*oCmOTFMa+5K!5O>922=l2VdMPfIQm7xdL&4 z2;Aoj?Uq=mgU@bgx~m^aijE@5Gi{O&&}_yN=*`yD=uz?SZHe^oM2Tt1;%6`kNUKRH z35&V!5R1UzHG3tPa&{N5&uj-H!g@q)Q%WS%xfLDv-z0NaR3rGaU2b*rD~@Gbl-1%e zH9F#t=mDIp<^fNnEs9mUWR+%jKF5H9sOZ(3CFqFQ(BY#9w*ug`s?4uvI8ktU;io;!>e8CS#&T5F$B+1d;r9$Qf>Qqz2MzWt6NW39{go(VO0pnQ^$m8G{m_> zvX%_`bdX+qE(TY8E>Fn;3tRp6V4~K&Y>1Zmb|`TdRUpy!eKC^KmZX_reKwvx(zgIG zEmJ;x!jzrT&*yw}@PA_2I>$_Ae||eK6n1XOuT=&)XH1W;N9;lNO{vfwpuM-U3|?xa z4U&GLCSsOC1j5bbHS#q-yxCjSXyh=W5ObJ4_}#@~yFD`=3`&;8#X?RPo}cAa3~z)_ z1?7(ban@KqYOcFu4u8F`^`k$>Tg4p`oB?Nl^ZM{TkpY6RIS{_B54B_jlKHn4L&^4b zM}yeC#P5adt@82`!y|hopr=1W-3Foz6fGd=_331^$_WtymNjcj1#w#$J#<^9g2iCH zd62H~PkZ94VpdIaj;)iF>En-3#>!-Q>$bz45@wJyo& zl~H~$1al^#m+u4N<*VQfl*?Th#AhH!05bw6g7MveBYf-tq#~_}V#NoG^)NHy__td^ zGmitV{EeV!0~OpIVY~3uS4w8cQ<~p3z4c75}6RrJ1>FKVvx9TsSGJu18-~8e11AcqgwBjL{=x;3RH8gxO=GXS9s~4 z^gts90w*PA%7s-WA8YJ&Mv(44@JXM@f-P^Y;aU|wkzY<(<}z)D)0!z4i#Qzu z=+yG3eeqSsb6xxSYji?WpN z@ILl0;iyo1q|d#QuqB2%6nbd(?tU{wYS}l3la$zbjt7msK1*kr%&rAxxPjat64R!# z(XDc|v5O3zf^_I)U22kV&+tm!yb$&9cmni~^Pt()D>@_p&Fbh^)@XXuSvX{$mU=PO z(e#;agskoqa8!Xz&ig&ScmtgeUzQa4M#7p~ksKJ3Tyw|fhIrC+G)X4Vf~_EvyGp(r zzqgF>vUVBmp}jfWX4Ywrtakvl4c0|QHS?1b%It1AC`7=lR{uScs5*=rY ztvnHNtDkpla6V`MOxv>PRRC|mx!H|Z{L+G_(!|jEyo^V{S?15O>in5&(T!xVel6hD z0(0!0mrMEk%5^)zPwm!SV5ubY0oTBaSgqyW*Ru9%_P#*Yfu-ISO?JQM5TMoNcJ@WM z3-mT$Sr_vE!I_@&o+7YD$ig(`soo*k%lAZ3zHPFqlVXIRyy0aa;uYoG7}H77>W;hj z!_%KziqgxDFrx(NUW&gYe!lxIdAud{O{p;wr;Zfed=lm4o3zF@m0Ef#h`dw~{IHhZ z*K+z!7X+L&bl>_Z5ATNGxoh?|*NV3+NZ8v6T>S+g&j}IE&$E?$l)-5(Vf85jOoxxh z)l2Z11S)z>o5mXI#PD5dYhAg9d?*ozo+!^58Dk#y6+MEpEkoCS2-U4~x#t+gcHXyl z*l76^igd%>KzDr2vZv2Np|U$fO6Fd659DXjFB#W>%yJszSMAwW>7S>PM}o5F<}Qy- zLC&J^-$LVkZWwXy+V4`YBsUr$Idv6T)^qI$hFU2uXX|oEKVPcey~4v$LrNP7rDSJz z+eR3k5>YH%o`SwFAb^cTP=9X;r5(26YY)#xF#@DgZCQ)dzof-XuZJ=80Eh^jjF z!|_ZaDj2i%<|lRy;ThPh5K0nJt6Vw=%YOF5^CT*l>WY4BD2nw3zyZfgIwMAEg7*B| zndf3->7N5L^#+%;=dWqMf+f(~8v<$no_y+^eo`@cUFbyZgIUA$ur=fxBqcakX?qz7 z63^2!f~=H#jh#>pg!3ykVQzr){462yFxI+w$j(Cdud`98A$&D-l5?m{n%*hGCz4zH z2eT-os>9cu3Qg|IP@Dr0?92m2A9^h*3ToNf%U|Q$`34% zI=VPhn#@*Rn<>mDBosy8{YMH1Xl}PqEbWPO^ZxVRw3%@>R&;WLE7%LZA+Bj_`_XH5 zY)t1Hyci#AJvZA2CUfxwXB~HU^&U-!Fr*yMb$h{ye2Zk3DnESO5LZYS1YvNd;ch5} zuPHYGW`4631b3<3+XRv>GI!!#%0P28azZ$^zw-}>>>>*HB86jgk^vsW9dE26>0j$! z2`}lc(4Z-H-6M!zG;|SaTlZqvwZ?$ByB}udb^??T(ic2@A20_Fl{)_~KxgDHB>p_?_!V;`#8Q_`o+O<%Yg> zq*s1pfnrr*y^Km&=@PHKhwNW}x9}=<( z4^SH2yP@{?RfC^zN&AS+Au6;qBplJ*aT{5GA^$}F#_!buZAJop%{D`7xMdqj<4aOX z0Qy}Pod)gz-urtZ_bpZC=r zk$4@zE8*q~;AC4|vT_m#;m!bp1|yB)Bn#_OBTSqyzR1^Ac|GCx`7Yzw(faVn1d-{L zPHxBF%@H4ycz(QUtE^yv-v|GmaC2Gy)xD+@o1T)K_j_i1h3uA`KQ21fc}SFH-i=^- zZ%wL(NAqEj)IWYSu^DC#^YaV&u?ZyE7_yri>6;5U{C4X+Vv~0Wfn`Sg@o>H}m(oAt2|3ZA}#} zww&r(+}}A%y5+n^pDg2upT8g0_j<(POnJdrVzDI=Br>|ul6yHHB+=(kxF~wHoyDG1jJ6)D%rn*0QiCnbWhu>WG z_IyDXJ$h14Tllv{SVl|xz>KQafIYyutg!WluF-0y27&kbVR%68BksRBtv^?M?<`M$ zTf$m-4#)sUf_OP-9I`}W2hLY#dP?M0d=0n*)*hTxT5*{C-QmJUsRqm{Nsf8|qI`M@ot+^BJ@g9#mQ3 zVs`e2uVkrVb9kjIa7)rTRpEb*@?jqvXYth2Kjupm@>gdokF@%=R}DMcBrF7KF|_tc zA7$jLv2YYz!BSQ;-YDNU-5LrmZ0Uhy+sBY$!Sg-R$lZj6vjfrYb=>S8%bM97@Aq58 zT5$amc_w?GbbvA}dHUF1y!3L_&N8kmTbI;syx+f866%K?&e&U`gUU_9IO9jO8Ggj7 zDm~6NVJj#TAO$~OPt~1i0*HOiSI4HtpCcu{Q>bPJ!(zv;)Fc!9wg2n-Ky}vyM zE>UA**{AVsSF!btalVNo{45j?p9F+-yG`1kY?kIbzuCe^58L$QAe3JMMM-lj@q!z7 z3gI02r_$QzqFQ2;1!GO$gOU=?}_s3mhYL!WAf0AwoZb#%QTzN z)0!wqXw~BZdWV9{V_p#o73=1!$_@^yFc57>;nKhetsbQF9!{tot2}+bC`=Ex%<9b# zkDq%vkH}Ujlmtgx=dwEz^ox|fvp&=Pew(BQ9mG+*MbQ?Pyn8fK2N&%1GNv&K-pa^R z55(KX)R|0OVouA8g?5bm!U544DT%Z#c(j8?#D77+u6)+BEGJL4VRS$r!_=;4P7+?*2rqKZX09X}>&M@e?95mc$IkwStCL;PNmXPYW?e=T!m zGeF?%u{k=UrA20tP+s5dV^{U{oW$aLSZ?O>Q#_uTb578)=0I2JfOB07M9SAy5pASz zuC*qIJ0JB-1R`|vcbWwbd)wgerQQoP49o0E4C|xmv+1Ao>Ec3C5~CO8#2(B*L7C!! zJ;PlMN62C>x=OoGh(N3qp@MAosPUIY_U=ktX|<8JFV|1#hwZRSvdEnd##zo7rfj@mMzShreev6i1qpBI+6Um1z_6AA5OAdtezK>Kv%tGByk&#xOVpLd%q`f(30QD_Hv zR-9b<36#G1{zmq5-5oD5Vh0m4shKBsIL#v=k#1kw%k+YH5DZJ@a|aSI&vwS8)H0Da{ZZ)E)ALTFl;iu9y-0G%L-{+8wgb zN%6N3`Zf#41dmNPm3icYl%Sh2h~+dp9kL3NLZ?7WOYD>5i%E0ehv!&97d5RwK3Frz z5VGCYS)SzNIcJdul#Y#+OEzrG9HX&6`{Ajj?Lc`{#GuCeFw5%q zrblV=CrKLpX>G?V8!?rnF!C-QtCs!9T)7S3AcZJJIbI+JyK$@hTU~Oe9DjF=EmPr7 z<5kb$Gt7s4DlWvhy~mJ6csuNrTlmaleA4!a6ctsL&h0br#XWyMgjyGWxkP^Z3)oiP z<+Ou0J&@>O+rHETC8JJ-5qy z9L+~@2KH*)e&{9QY48|mkgj;>w_TUU;Z$xt5<>?NNPi2)^DairLbr-j#>$OT;WHcl zb;Ewo60A|;Rp*=NF-v$XIa=RC(5gIkvv|D-Xbz@?^$EjYRSR$Ms3uB`_7(Yn*ikVp zHp42EM}s$95F8!xwPc?-e@|S0$LkAr@KZ#yd)Im9s*l|d-@jE#9>y0>wXJ#DbYq+Q zi{T$B$m4&Yub{uY$O0)z$LME|=krxU<&PR4wFu#e@`r+oO~RAX)_zYI6ND~kP4n($ zOM9RHzLe3iAFyklmgZ`qFBP`2CED}ByDs8asD2G<`>oPyN7CQBz5T3Va=DsVMWk8U z_}PfDyL*VlHVw=1cENZTmn8i4cV{=~e2Py<^qvSa)UckP!(Bpm3D(>%n(vllNyxvQ z!Ee5^7+WOSse5gi)Hailpo{rv;42}r<<=fbtnnZ&x?L%=k*V!XkI}%rdw!kfj#5Ofj}CH>jxcYK-)K)>sd195(ZV!I>CTvqM6n(b8Hh(R!paGbfOd zSX#8a>+GiXyM%mcXJ2?AuK>OAhow_?^0U{CVNQmCx3J%LTb+;)%=x1)>gw1p!v2Ot zL)bLJ$I;j$E2A62!s&tTCK@V62N~%L!08GpZs8^BH@N+dt?4b;iMk*ouPo0Tg9rf( z%XsD8!r+k8jtJNGrS70u1ef_&@e-b9SiYY1yU&M*j*x!5XJeWIS{{p5W*6b7Zn^K0 zAflosWIt7(@H{rQv|AgY9wYR|NePC`XY<^)4QcKvfmAEdkq?!OVm=ITwm->}A11^; zpgu-K*;)QQwR#qONerC70S=XU98c{!e(c|3^Wxw&v$IpGE3ig+A{gx z9;TkZwuz?hwAwZp0ac4to$sr5Kl**7x69Nw@D|JQ=TmTparr$z@apV1U9?wb>)LN6 zQ(@o{nY^p@X(7J8K4mCM%Ju_#e;*tEJwq){!zs}RrOpM-+oWKN2}k`ro;n`Y!-L3< zOA9^D>{S=pjxuIGTx;jp)4{vfZ0>TDjethX(fTs!Zk@SY1Z z^GUtHpLUey`}othL2TIzRlcbc^6qz$-{uR*=dguZIj4OaH;KiK?iUtams?jre_Z4_ceGJWScyLGg z#a=qK;NI@*P1L5bQQR_pPOk^KK~yP0z7=JG-9)+6Iie!$n5{$!(&WxIT-%G1;)_eT z%ck?|(R1bZ@>n-knoBDPaR3C2bdIb3O?9 zZT)50=im>0T8j!`vcK>!-?pRoKVwxGSBt1wjvGBSXQpL-es!Yo)0?}C$Zl%kZAjR4 zgPJkpPb{p-=@wVQNHW*?pI{637EYw2hLNYFk)*6ekqUdx1Lld zzkTNdbmv!7ep#66BxDG$!aNG)M}bvnVUDM zscyelO%205^E+%W8(`d2qIb7xz(Kxxo!g`Gy4N#Nq<+Y+0YZec-?kcGY0H!5uV(bQ zV=h^}DuLG6^>-a_+qOLP7{Sd)X&84CMW{!jlT~<3SIktywJ;3){k}S zkGyNp1JrzLH;|x-=scuL_jQ(Dcx4)@YkE4Kh=g5T-90Jc7Fet&CD>h|x-Ul?B9|pwu}1;pltny?T0P3PI|zCZm;`1oY zLy7+gwt3qxt`z`K6)df^)S|mamz>Gfr5uz{wcWH-CVyrgi^_N!{8NESP|70y!XsCs zTa-EFl0K~Daq5-1KZBmoMKTy_Z7~waj(+Yk%E%8as4m-)FcZ@|^_IDur7klh+8PVN zK0{9PMvGC|T@QO4gAerfOo|Sb#{B!DT#ijDe4l;Pk+5=MkOdk@V=~gi;Xa1OsGKwH zphLn(X9ILW;@m3XJHPwI=#}DbQ--v;I$Y15*Oo6Y`jYAsLgvP&)>VN0`l8rM0mz=P(GyY%?s&h0WW%u2Ro98-9}M z)bDTMDc_b`^b=~@H4C|?^+CDh?^k0dyXJOcEdAC`>j+jUd=>%Z`$}b04PMtO@H{w^ zZT~76!FVP8u39{@SD%;27ToFl;`4GQiwpiy86Cau7~%%f^0cIv1#k+ z7c*F?%RJ$9LL?RQJW!L1i%cO{>*ackEM`t&S;ytA-xU^(iNDL**D4wsT9O;nOw!cU zUe=q}%p75Cf*cds#&?QBom18Tzn`JF-_nq6ENEwi{<&`}vY5Pfn|8UXW@~f)v^9XywNhRaq{8s&s zj^a%(ACbF+*%H>Y{h7b1m~TjbpXe`5VvTgxK8HvT52LpfI9bLzp%vmER^MWT3=#{A8tyC{Cp54 zPc_4}X+G|n0^;o`Gtj`kHd|ia`@X3{CllzjhI>kwPV_nEYT2}2Ee(z{I~#95n5}-V zdI75wX!ce;KPxPNto zbi1-p=;1WF@!D0+d>?sb&|A2`C*kW*B?vgxm*G1XqZbr2SHSo&f1KB7RD1*T=I;l( zD*xKD@>>Fy7|Cb>(^b}#MozYp39eqT9!^QZxd5fiY8;%yJTR?gzbhF&$)s-T_VM@` z-XuRuynZ-4FN##z9g} zg5jK+3hNv+XQ)t9&iFmc;v!h#&s#4CzF(>_f^VZi`~7Z@>PVt-A-rsUm&Xkll=16+ zc76iGtnL&^M5ili4m&6gkVL4JSUJ)&WgNokfVB$JQ<^G2Yh%cptB)0VNBWt--F`BZ zg}ZchG=3JB{oTtPZdBxU?442|hW-Aq;h^ct3`ZiCtcrw$+UtANgu$$jkcPyl)gaJ6 zHb|ELP*gkkyLg|dx1Ag{|oiIQvbX~<=O1CD?)@3h! zSN9*$SKgkFG?zyuedz)ypee6q;nOz^i0E_bOLl6*rL!m`PHS=ZupSUk(#-$*O+6=& zFbh;}X$gdz+rk;LqtyQbW<&R@5Qq$VFpB;;MW1N3_8%{H+r}4g15p`$lXGDUguC{> zaL7Go5g7O1Vace!G~U?EEdIH^y?jJgg$k$bwX55G!pQggLhAXGuA@VNL+t+u#&>5BBk(v9{sP1hj zcb4tf=-J(oQznY0^95n|F1_|@8cru?-*yO|&L%%h#+yu8qEIW`vD;a12( z?6Gc$o?5NeeGN4sn<-{BP9Qq!?^doI(yfxzO^(FE46K69| zz&CT40+JOdi5eM1411Y}lgb@{-tTsha<&@F+g1_^kK-B_EovK;T_u6yecdwYe%6-9anQK@xx0P~^DZL%O7J%X^ROK3APSJRZM0@2ZW^MRIvk zpw{ZH%qC_A*L-JqzP0}DJ>cl9T9zWJP(Sae6x+=%!-w>Wt7~Kr7h1C#betc$F)XSk zkzO{+RIrfQ-QJBLcik7ZQLk3&(+%hn(M$0k3SbOOitc=-`L6^QeH&`%=HZ$c1bW<1 zu@{cm3;uvQW&9xf>n&joX{_=D$y3b)ih%WN5`O+~z#%qH^2X7Oe9DVpeS8&qNj4P0;|UHyDr67wWa!Tdt`Nw3~bsz;l-sG zk>lI-ikI*IoakPEAJg%J2Rpuw@XnuPV0bcq%%qZ1@3oFh^;dOsVPN4>1hN4#i2mcy{9Qidt zUo*RgU|Y!Uon-5qGDuIz%=rkZ%ld}oOpOSrAF!G;7xd8CLMOu@7t8n}zE|>$}H>AN6loZY@JOrx%07l!ZZS}@a?SKr?B}u$A^H9j6^{C~z%_6oGuLd6}#!vLG~J z!Ya^fe185){Byac)vRbZe476n$wuwRw{?7N_j%*gW)5vzLYLM6%>o@7gbX#$t5W@R z8fKRrjei%9n>c7@X$836xW1lrTW2;3Jm(*lbkl_EA(yi_m349`0A`-|{N+B+B3`|x zp^8Ls?Dlh>?@ud(Hu%w{&sNp*PmqGZTv#8^*N;N@yXnihUN?Du$Fbrp@{`%A>WC7V zd1ZcXmen`k;FsR%z8)ySdj|&d_8&8`=JiDc4D+Py=%f0+Sl3C{{Y#_=0*>WBuH)vCRZJ0bn1s*HA^;dXhWU0NcFl)GA)CU?D86TXkZJ$_c1mIs7~ z^TSO86Lk73*S!mbW3qkH4LK9`%6kE|VYw0GNvrVNTsMBlAf`a4442t6#O#s$rvE#0 z)v?m$J8_NuP3yTb3yZFw7DDxXYI}$qB)XOTQmc!fKCXxQ9iYdNOXvjrNAe-uMxDZI zzQhM5&enM0UrT{Yl_^ZU^ATKW2Dg?^%fBB+a|3n?#@oZ`K*#!ckxEu=HBgM($E$Cu z^z&P7a6!;Zjr8T_q1C3&KXUe%jGU)vr|%+OGd4v z;v=UOG>QrBLw{!PXt>KLh8%5&8)iD|G#KDTX`$eO1eE-7i@#Gyjb5b~%TSJR!s&@McqLO&&MQt%Cj9YC~|JHdSl;_*87R zeW&!k=|)^2s;@`0AibTz@^2#0=CLSh#)lr@f$g>FQXaq0&$aJV$?Nvx$BJUN@3z{k zCjC6sFuFTzQ2^nWoG1-liFnQ?Tyhv7LkWGa%2DnEg(+CDyjpkmU}PYDV=m|f_%Oj` z90YhwRy%8$m5=Rv<9zty0J@|y1fuS&t;+Yh5yH*QUH(wZZ!%qz$r+&Q5QisjNLAQn!<(#+Kd3sA)weN& z(TjEFqh3eK(f2c|rutrNuY5zO zA~dUeEnihnjP15wTMROdz)(B;=JM55<8FG$nQydO-$Jg7DJwT)eTCnihH-_=g58!Z zNgl8re;R(zCsItoVK5{=LB=AQLUWJVaKt@*7!c8MZV9+!f|I6T~7Q;dVI6*=h5dy+%1Z+_3%u4B@5f%d(%I< zU4*C92xF*;+*e^r`!_aZ(oY(%ZysF4we~&#tcPNpbaRa)ax!90la|T++mBmdB|xv( z9#~#rfG^panA`CgYJ+6>^v2c8O8IExTI$)B3fRr&v`MJ}k6kl^q%&`>(u=JLY*AcZ zel12wSbgiF zU%X+X*mK)V#j5t3jS-JQcvFr{TIYTKA5PiWNaxR*@iAEK=^uD{s41SkyOssA@TCgb zmBM{~O;uln@@n*VQ+<#p7AJYGECa6z$`_n@CTfpmt((oa;w$=|iE-H<&1lCID=5%z zX}v;P1?hELn;YN+0JB0M-Cnxo7@tO=U+pr8k8a&*1pbu*6qmvhcW=;rQ_3LwfdZ0FE zJUIJSN`VHL&8Jor_4JI@v&!BDQ9Lpd^RcTPVc4YzA=KcY>?!?ssmYp0c>Z2eC)scD z00*a$c62`q57@_z2&=~QCxA?j@~Pa%#>wOgoDX7;sGD1-%4al#7)E*ga7Wk(mY0!x z;LWpBzmR?QDX71{?ZP8^vb6L)DK1%S0G+*dQLQk*b(K)&`Y;&P8O0ix0K2BRj3RPI zfDyx;{83diuInpzujQ1a>b};%Nj|fT^ZMvlX}hJ+Chz?RzB8xFlh%a`#UC`;Z8Cai zSc9+mhAlcKg@_E= z-YhVpx{XsDxU_Rv|3HPQ&4$_aLK0VSQ+-Q}MduUGC$6MEQT z9HgvtwfJy*F9v(yP3306b4CWIPd?#UA7uUH=i(q2d3-CUUPjr#8u$wrZIqw?2`S+l zwb6pe!ClH%^f{M7W<74@1%T$~fE$n(U&F+%RJ$CFAQ+LK@Ppcdi=m{X+9IZDURQ58 z_b4$f%Kxdgkf2cFqTKX4l%1!TJ1+vH+NGp3E-Kj|92=TQY=-m%k#KxFV+K zZ+~HE*z&mH!AN-701PZ^){xl~=V*Lurb~I=Z*Wx+? zFS_e^Je9jZ#wMyRU%p4TPZ8*;C)TuX6UA_}px0$fyWp-pDNI0QvFHyufdmLRPmlaW zgGsmp=EXN%uC+5vZDw^Mm=Ra36TuYdSx<{_bb0OL9j_u_q^Aj94zykddtPImB^ITsfwkPkD-dWHE}`v7tz~wzS_SRTVxKTR)+E zgt=6^Pd713D4s;4Jdub*YmFi!$vcDMDe0_*OcRe^|6 zK&TaskjrnH^*L(g_`DRs#W6wV{n8WxCvnLW&H%uW=FbfXBfaPc_H~g3+cUwog#a`W z@ko@0`teI45o<$x&@@}xEY4e}eJ0-_a-&b0MgrIz(qPT-H6IzbitH2KjVa&N@p$d? zZM|8*2!7*ISrFkXu^afb9C=hCcVe*ED6Y{~G*L_317s2O$Nht{Se!Q`x9par-HlTM zbhdLJ+uAIVt96e%`cd&kx64Wx%p=YL{`~#5VZK@BbD@crS|2$I`q|?O3xds_I<+nI zPZTXwoB~EKnznl=H&9PKSeK*j9or&V+}fxt(}14+&LU7`y_+Oo5CNWPji9s;zS$1$Ne z`&yJ_es(Ea9(TbI%EgV01ZaTxP5r&jpELW`qdR}`M>{pOwm}*jFdby9vMuW`5C^dNo76VK|QBc zuq^NA8FkvuyBweF@hsyoJMzo%?iy9MJGKUTpj8vLoOpIqt|l43Kqw6 z6kifW_q=dmw66Buuoitz-oGS|q0k=f>9>*;lTKWUk`T~uSsDranMjvk_}JRoc=H9p z=k5HMLoK+*wTpPxH+*03T7N#jSscgXC%#PonpW;Y7L}p<8|R@}J5{GiHnzCjZJ(Cy zB&`SzSpfe5asf1k`gjlbC!Sp4X{(^=izE_+6E~ew1c)*E^~_{#-esBaCG#3PJp*yB z7u;N1P(`1q_ldKkkZAnk-=!2#lZT}=8x!uq9yWw|0a2bPcI$n zT$LG_Zlc=lGph@smH&g5z5PX-_N8^a&?hO7VdK9 zQ$;*hMT3v_J*d{vX zi~J=s@>_p*``svbS;JNdp7{+pU?V&*oyn|Q3+n7TV{Y%}8wf^c4aQ3D*nap!RT_P= z$D(Fe*csNqcq_FOCT65;zC=i(-kGjp_m?q#mugSg-10rx)evhVm@~J%GF`o>I>em5 z*JAE6&&3TS8U@?xv4BXs0pZ@^hkT{Iq$+g2yWADw=s1L(F&mV>f$+TLz9;@D*JT@d zL-WfCs95f=sDO4^sx^T?0D;ZY-n9;oN89kFR_>ohu%lM4&)G|K8k`hV6I!N1p?(x3 z_WWbBsk%$@LsRYdPyt0f38M>jrX=vWAOA7j2u_b#-=0%As=LA=QF~l{n{0(Q_6QU6g$8=cw4f>C8!AIHcj~#@xD|3;~w&O*x6v?kAOOD0XSz_ zus_@+0^Yw+RhO?DLsUI;ONXhRgH?G?^z#Xf^lZBq3G2bohw8-!#0J#_$4~?QSD#G} z&Csy)NsGl!i{}X<?;(8!HjY)Eh!W=`H|=jbAeYP$A`-_@`^2rWEXdM6_bw+{Xs_X{j0u5 z&B#?4qERfZ;qRPC@`zP!94nZ*=YTt>dlabPfN9W-rF}DMbxg>o-lUV3Q3T`m1s|O> zK8QyT8!HVYF)rMEDf0fxQiYF@kXgrG(UNJpo> zlk}9iLs!3g<02F?e6mpl-nNhPG9H`%{mFOv3GZoow$3PUf;&YOX%B8|l`|n4StnbIaF!R8eM2lrZ5tTNNl? z4`SlttH~1KN65ia4&a0#)^U@N0S-27gz;`ZIsUlE{o%`H)(PQGiBJAMOCO+c={5y2 z85&n*UiV<{@!<~0Sm!=`IYC;daK+{?^ah1J3U9fYpsHNgm z{J5burV`%ZztdJ3=s|X6hV1SAKRyifh!(kO-d7Y>aqhXHlwC*8uFT5F$jAI+s##&| zFjXzrWh`vx?;`5XN6kzY>qAlH^Rl#>gW24^thz2Hxt4VwLMBh6hw!Z0On-ovm3eg*S8o>`5kc`hsw0iBwTXU!N z#?P6IAW2I}Ng7PvvZ~(0Rr=1}9@fXbe+s4cmQNvsV2b8pGl)l59oV9YJw_XecMe$c z7Cqnud6yX^dP%L@Iatwjs>r|GDH;)+S%~s)(CI#h0lBgsR<{-I;F~yci}^0ymmc8`%NF;%*J&3&Z8QKzgq>)Qa5l;#-2I`v+`9wM0GAAE+hiula?&4v_9mJ zoU(pTc%wuftk^dNfs1HPmCEDKB(5B`_h)fesU?|PaNxcbS!}ScYYDvfbYf} zJ@c9t3QH?en%%cweosK9io9L+9VP3Gs52eg5QDMJQ@}#iI?^C)Jik?gBwN~OXBACn zC|(^*lGZJQqbGPwSF2kaj*~K^MsVzU$sGS`MeAM>h*8t4FSX_7q(w1qZ{9-?JzZ%C zY>nbE>T%rerLU~#$xZgD6;0d*DpS+fxk5I9+0wiI`W+qL_8pi!w6REo2DHBv%?g~d z;A|p2HL;#T^r!!Zg0$QcuGuaxFi0mjwOUT+2qBa!{LBI}ERu)>OTzkn1X;oNR?^e$ z^~q(G-v9Z-Y}d~cjVas4Z?L3Q^MBo|)^(BQOC#$;T=@5CFrQ$Pu7~LHi0%1u!5%$Q zg+6jF`%HD8H|3sd&d?k0jEO3Q^t%*%6SHn+$Q`o`8vIa$N>VS)nh)7S+4$(<# zmjC*W%q%GcLz|^1Q9j^{8q>#P7KRx96s#5x8z4kDuEB~TZwM^rBmFM2<^A!Yc300_ zr(%DuPP8q`S55EpU9sQpy`Ia{XwGcTPf$?_nes0*fwjPWe1OEv^3NqdL@z3Xt^zP;Y`xIP$9*)+JDvX&>?{lIBQ2kLq$x;FmrDk>O~KH&V- zni1-2ApMj{T@~GmN5ghfywT&ol&IA5N9k`5{kzXn8LcRbmx#lNI#q*J>U;#mQm^Kh zBlV0Q8bK7u0`FNg_#!*t5G!PpE#F60)Mz|k^8KHSSX+Fm4!7nj>xvX(@3q>1UyXWF z9EG`cwyJN!@lt&e3*765LE!O8Zr7`Y8Dm3T-4oT8EB}+U6G%8a*!k;H@@O)9XVhnL(a4@q?mR3(p6E>ARI!nrWVxGk=FvD7qGL=KD;R-1u6H zaiso(om0YQ_$RpW<}MC^4?V96_56l?TL`Samgg-E*=JyaBTcovlrAlQ^H>JqJh$2)8?NZDPi43@G=eSXdH+h}!tTPRaxsT! zxWr}tvA&NFO1>x%PxDzKZ?IPL`rUB3#s$ky$Bf$;%t0~yQiX4OIxNu|`~eG(wun6+?hvOAcCO8%7zFaEjd;d}Vn_wyY` z>BjB4c+Rh|kDc!w#MO~T)lH_A;-uQYRS!6`AgR56)^=SbE;W*gE#o+Xi{jV&*|%b_Eo%XE7Pg2 zK4^oJlO26>J3OSHDhoIN`@F3<7pRfFO#?L!PB#Cs=FifaZ^q~ zr-mO>vr*g0T$!eOn~bq(>Au?3q-@?3A6)yBy}t1&Y7%$ygcu(glQ+NoEHI@i(ebD8 zx+!P%Ih?|~g<9gTzYWC`X&0j(X+bLRTxr!=KUEyFT49(v7`B) z$6@n*1l=zR6~u)-6Z9_r&H7vOFx{X?xJeU1eoA8pNn(09#$_!dW~NybQ887`GVI=} zX@Vk*d<))i=Gz`%HYkh%*+JUloVwR{%V~pReGMB+Bn-jER(%4GFupkPDDGiHJ<7Jp zNBw!6`J(>!mUyo76ggI;#L79J!t!?2tFLe*vHYX1xb!OrzRbKh(-5^??b3Gj`B{8e zMQZ{zoJWJfFPeOte36&dVUeX6JJ7BD(!*!f_3h=#TkQ8Sd5b1U8C1>sXj$GWo^1BF zVVPv(Cj`ulf|l5Z)Jio3(p;r5dE?y7Q>vs3II<@PX`rS^>dcFeH zZi+?&P1lsWr^fxI;P}vTfldK5+TD~5?SqnR%$V5?sCH#Be_bjS?E+bgqPd~Hj}`kZti z65ES5ytr7T>95fqyZM`)_;a%=H+VCOJr|Kwa#|t>5^fPdEc#pjgQ@Dakie=2$PFR1KiSaUX6d{GlEdwU)Cd8<0lca{Iiu@vfjDW8Ikqr zz1!<*T({l8tz7o&BOX&*LX`W$Wk{`dRtLU+t$FYtn@W6qCOrG>!GZ8gtV@?%Aa)`3-BN z_9em7*^-^*70jA&_Kw%$n|?Fl8L%j^f9Yq5IlO~(xQF-gwF2Xd9;9DXhQk2Kf754N zcRZY*t^tdC{{=n#3LwB{qTD+>aUzTdS9nay%MdL6L($FcKR5FdQ>p>WX<2e$_C)c6 zH4zm8z7*9{*Ht1VpV5WqLHHbukm$&b-Bs(q!ZJ;K?I)j}*kOoL*#!I7m(NZr8upR& z^}YMQr?h38uU-?$jDAdi5?tQ>=Ur_JlZ;@_DhvJfd(ny-4gn3ue zYm8rDP>fcDO!&1v4=6Lutx^7w=672`Axc8b%?_q2(SPK5l;7ez*mdFCr=Ogs05AIK zRY}s-migomwd|+G;88N?9Ly6#|8-1lq$7d_Wi`_IrDKqaQkuWw{{2fkMz%lW{;npD ze);UI>ia~gRtL;=ALCq`)rYR{@QymtCeQc0BhPzP{lSIk&E*d*j4_>(E1yZbbS;iG z=QK&`B-4H-PWOF9yBu$ke_iRCEhRq5cZlWn9?7>h`)ty?m3NCI&`6B-O;rvm5Vd@<774Ku9rgtCkZCLT#gxAD>GHm6r%G zrpVon;ubq86tkNt8hf>o6oq5q`xz>bWuc$it0XZrv{BKmtCB2A85lb09fsf2WPi|W zks#LPDVISjCQLvF_Mos=5l%}7wW(XhHJ503ph#M6KgU4-=_7f{3nV{;cbAloP;9>a z5HJD zxr-wISFd#7N?$KJi-luNIph7SrZYCPG>ah?dPGOVZ}@~_UaH0TG z#%F0w1IHe^Pm|#?ca~ObEFD!cV>LGZg-P)#ysD5emFO9J{&fw1HFNEU_Zp(Y{j)*< z%$7}goB5Z=E+4LpRt3(rT^r3C?X&HtA!_i9?-6#TVIWqnn=ER?+b6D#$k~#&`B7sp z#rWZ~o_r;rV3C@E@%AVc*Va%WG%|_sG0U)rAzw>-)TqJB-^=AUH7(;1vG@I**}qo# zt)Fkd-n^d&)^?5}jdWgXOy#`4)gjM+`N(+XJ4$bt!{-_MjS`v|}e=ZUl& zgcg~mzk>dKmpu2(^zf9o{`cTY*6v*-Z#)egRMIym(sF6=@3-J8--`phz21B&%ASbZ zrRm}@pf#MTzwV7@X<;JrnZ+Uo2LDxdhO@R@l3r_<2cRd zXFr?wnu>tY$XNX>=xn#Qn}O{xSt9|ncmYK_31PgIt>3jrJrJjH!~4S(rAKB;!`rCG zc7`z4OAuW?Sd$dWuSk8KqraH9t^U;1oUdYy%=s1Q;D4whuz% zoqlli-%KOvIR%es^ER_RM(+iH=xf6NkYx)mU3zy)wK1&B6wi4MtRVWmk8Dn8-ims{ z&FOQOKI0`G2LT z1E5yk0hH6#f9gNki2&E)Zh&harB704ve}%+xi~=D@~ia$*s^NA*9#CpY@mJYvMWTi zWTu%?{=zYDJvt|m^gdm#qvF8}No3?rC0NtL&-ILL%Drin2F4Q#H}MU$!hT4E}eGdVY5r<=TVzMS4&w8fN&nNB4T}tKx=qA7A=Z2c^ zlmAx-p9A!mYUDwv%0-f`cVnSOK2ob`)Jb#3VIlsn5qBVzBcD>x~0=S{rH z2Rohq7vYdHM0O^LyW6i;%733pD=%^ViBaM4vsya|FhD6^`^x%7ExMT%fF#{l-OUVofVKKB)6b%Y}MA}a`Lftt+)*f z1A@NBfW!{37wEO;B(0>spOqb{{rB4Sj$P?}S(f;^hm(%%P0qWnRm1lEQv8pMI{6cj z9DAg7r7+ZOzctCrpP)wyQcl1CU$amOe3b80Z9lGi-wR*6y`EDbG&(os=D%d?gpLUk zKC+|QlUJsjAI%)s_aIGTmzUIEugm;Dym;4i6L604P-9>~y_ErSF75gKc`LH@JADJQ z$cje@f&4A1L5cJLwm_BvWsjSNZ>mh&;F*TmxZLlLRIMvJ?n3PIgIjc#&NI%ND8CUw z7S9g$TK8PRxP9ZQ1CHHeAy|i^rI@6AXztd52kNDpw*BBbX^&@vn3!oNz+f4oX8-^7 z=HfU$&Kij8m|Jl)SOwxmUQ6fnZb(^UD&}e;#{8pr5c*?)v1(6$U$+UEF>9=cz8{mJ z%8>T!?M8;$&OdSWA{g~@d%%wD8DnPHs3^h+h^F`tW8Z>J_J@|1Gj)hpgGD?({CppZTmC~WNS?DQxdE+{X99@}2N{(K?aGUz;YQd{t=GMnyp5@P>p8F5 zaND`Y)AhWBdwfGz4AMfD^Q~krc4&?awam*am?tGDf2q4fEj*5;?*|A)V0+o+yS;T^ zW3*eVHtBOeCEU)QiG^k6U1ZkN+G6FhZeFRt8?!nHha2rv=Xi#7pN?2Oo#ISjx2$4j zz!O!ZSf;ESyt(dtBj*-C(x2ae{}Ba^ENi7&39vEnvDmKA*y*wHi76*y3HLOU*d>TF z#lkO<+84{}m%KIW{ER+bv>)uG4~7KFqiKbZUfxxo?ZhddDvYoKD1Xqo{BX7`FCTp~7T0x&%F0mA zWI2@H`++p`<6d=d9qdZ{;qc%)VsCguiHLwTkLa!L`wEiNN6`k8 zC)$C~C|rzhwKrAna-E;TaKoT^=6*pM(n=6@w07nO4;Tw?_d?Q`%!!n+a~`|64`tqS z1%<-b8+~=Z86f{&p*ZJ?Yic7PqI0{HqOfCu_Lt}Mu*yGgw`!D77`8*wUF~ayN1#zc^5bdhhFf)oaqq)>4cG-%~Ra9YCIi@!x!>UuS~b|9S)yTX#IsCt@3p4I1& z+K*;x!Kz;$Tr`lxP!Q`WJ!e8UNayOe_~G1IXrs*{m+|Us%C&gHzk9_yoOXq)&E6gt zb4ZHXPe32n#m@Ekent*P$gARzZ93BrikM<-1Kz`v!~L4H`64I0KL>9dMGvO3GnA7S{xcpHs;ua?p+S!7?{q}(JsbcxI%FP-lD~SDZe<0zW+p?tl>Ws1RKGMVJItV{SU$Q*G z3_xk&_TK(6Pi#Z~eN5(R)}qCohWK$uKgBiXb?Wn1?@2lI5bmO9QXKtI432oT)9 z8VjT2aw<^?lkCxryrsT1O#f{rU`=9wunvZY2}w1iv3ol>&rQPCMY zF8=JUYi#129%55HD!$Gd%%_~w)9jqumvR~mpU*vK$J=Y~SX860@Yn{Q@~@k^`_oJX zKbt%{Ds*iSki+cDg-mjr8 zmYgNkH6lmNvyE)k?9?GxubSv`l2zLtnQ!Gq^Z6HLIn9%|45RzaP69r0`IL3ET>-h+P3D8ocxJJPUdx?ZAW<T zG7B{!{7;km`AED**_HSn!eB~C9zs1P_&3)RDAr5bpHtN{%>X!gg1jif^K*|!YmA+Kpoft zBqng}t^dALtq2oyWY^k>DoDg`{uk_9iQoiks^yah8yQ6M)>?a1txM0 zMr)-_jH&w?6LU^a%Pn=}Q2O47h2rINrs4QZ_1-$Kxfl8s$GhegLntlGkpa)%@3QA& z+8jH};_>-Hxk&1~(_FO-Rog6%&!NCxY?fQP=akAUcX$8e2zfbGXg0BcmZLjEE(#54 z@Wef7B@%Y%gx}Aa$i-yR5cqnH^7vW86kq3U({I~9ofz3tqW(UL+d|t@Td(@jT=`^0 z8?9v+S*y!yAnUde3KSAw^ac;?xg062nGZ*tS}>NLj`NOAA*sYM{K(HX*&kxHvR2*Z zO}T5LZO!L4&>-hA^Bkmo8t#@ntX2SIYe-=i0}QH;I$J0WJlGCH*_FP#lS33P;d zt9|VyCV4GyVzAs+tjFE*{njVeFjhQmA8KdijuZmY;di~SrZEyft(gWYdPR+9aPM&? zT}chO=_Y+P)LysJD_d;*l8e)C%FSsFiNBW*%wl-KIk#f_=ZKFdM9v zUAz$ADeAU23M|}>bJljW6^FDv_#BIRiun1p6x3F?-&DW(45$5p>wE}9b>oozs$Zbv z=c1e#*|<`(S0Kc~6u)M8tD;N2KlUUS$x@+#oac~JQQJ0?$^RHAKfF~ReG9C4-dH?? z1sKR~-b~>0S+hbNpz>rFEhkj>Hl5T(8JZZ#d;%y1zf=i~p!3^HUB2WZ6+$GX0J17W6exEuyv0^Dvt@!2fm7Kv|>d2Gy zP$AAcZgNEfonFA_`wX8vSe)Na@vG`-aavnIiw<9sPN=fw*Bae~$fDnUSf21(i|i%y z+;It|esp|g!Wug!7GIaYX8C$}9eU_2vZjYJ6pg2|?A}q_$^$FKgvr17|CBqHOL0Vf z$$L11_*S}au^X?hEycK{F>=18gLHIvuB4Hw(X!{7U$*;-ywQJT&&Q6TglSb!+fIx56#{@fPR2cx~* z_3!fwrwGl3)@)J5!ms2kv$VGu88+YoZ+=dkVY-x9j4Y|8$(9T91>xs!M*S6}CWcW6%C zr+Ra-41%=-$BqEevMY$Gfzf%9kzX8Ksw$A*I_DH&qxsH9G-bv_gK#6-RS=6} z4gCWmpuzoyGgD7Wc*Lq& z+r^rwGP8+}Luw`8+%!4l#*5)q9B%eeoWfbdYeJFbH&i>PExJcTCCMEtp3L&Y5iy^O zH2OF+BHSxFmL>&Jm#owm`U(pukfulu=LWP4n=N}Vae;*~x4*En^}%!Blz?vSGPiA5 zNqXP+mhQAADSUpy7{NvcvKV?5fne`%+aKwWIOAZtW$LYG(jCpMgHiRZzgx>pop347 zx?eSlypQ`^&K>+hkNtl)DMlHJU1L1dy7{>cxDpZ;!j1gmgvoU@Dh=J5gJivbSWy-v z+yUMK6DWg4dGDYryR?VIEnzYXz5h&9KtA$bFSp7%B`VoopB&r)K4qGl%fo2*@o9cDX>_dd%{>zhU&O1ma&OWIflJ()G zXY4BUA5yYiSk{xd$w1Q=%X?{oBv|0I9}Lu=qYB?_Eww z$()@6UNeUy*b_ln=Dt_0XwYBjs?pG_c?b4bj_wC}&i&FeRtTYyj)?4=Rh3xjLg28FE?frS^3NyQ# zUU!R60N49GUQefA8Yh2PRy`o1W=oNOGB*5=E(EmidU^gVH)8n$q* zDOHhbi&kTxxT=%%9zJ^)?upM=<1w+@I6l(aN=>mI6au(OHPPvwjg?sKgA@At(&1eq zNATJZ*n=CEXj64QnyC9 zza~|LM3hL+Tt5%Dnc^x&DQkawb8zF_Z2k|~YnwzCvik^ApsufO7fD0c^qi_wg_O&} zw)d`jCHt@$8}z)SK6`CFIBt`}_p>>9>#j-Uk_jaJ((@K#5T(#cTO}g26NeDAAo0g{ zKDm(IJb(0KqDi$IoFB@rXMNKj?elF&Q8btC!5dviosHKA)68u>IEUq8R)@RZ^9W7t zABdEZK*;{ms&}HLU<|wfBK;C=BKWH00k5a*9Lb-F)jDghAHUa(#oEo1=j)s>pFiA= z!2b{i;ctNWTEG4wkm;us`j_w4)}*9@Gk4kWCA1WU{quuAR*;>yHQ@W0K9~0ioMpZ3 z|7ARMu1ezawtso?rJmvb#u?)F(aqbK;n&M!;Z<@O8PUe@GJH?=o*(6&q(<6p*d-_v z)q*pH4Zd5369sS$>3Xe~y5Ayin7-|1dAX&X8RcCtf%;{2Ee}`tGu)bJL0k#~ffzYDkMv6982lwyS-h!riGRRO8+}4fyZfoOV5}YgPm!dm& z$r2}G({q!i5!P?pmk>AzD1IIXuXls%zSw7pUahWgKi)hZi`kOj^0#<^Vai6`h>1^~ z_I68PggzHCiCwB_tr5}3yL5eC)Vmh~CkU%SPVXc?k~WJa(>n8q3QX3r>)88GT0E*R zee;_lqzWJ?zpqKLS=;SCR6L9C+mH70|NlI78?JP}`+A`*;E@aQp-2%@@3NeUX8=QF ziw`6g>~S4CfaESb71Io$elDj8L+x4y?cpW-R!?5{Oh2HUYEtF~Fm+cu02j}PI^$>D z!tlO5zKBG$4ifr3P42qcrtqw=K2zj(D>X82_}T^Ro|XIll=uBv_s12TE#oD1YTi^k zD#?lU;cyKz)|C8wo7<8hVTh!Bw&rM#dxZdodrR+v-KiFjXIMGg(8>28Rbk?Teh6Ec z`sz@Ax))dtl{N3r4gJQMUwjz?jleowuWuNntm~JudgkT38iB5h!kFFc-gq$cBjWK^ zOR-O32MyD6x3vQ2*P!wbd4HwnCETRPo($64C5~$(*^7A0EqsV28d~iv1JJLTQLn`_ zdjEWS@~=fWI}ASHQ=b+c_RC4F-z8rZ=?YR;j{-SR`9D^!qp>o>7+w@q?o2ThC5{Rx ztn>6alqzfJm|c&7i&c?73brMCex#n_-^`31`!21~GHtB8Wpq5kay$>qhXtnZHeUea z^!%Nt@XgIM3r$5_!#;>Jw5b^>56o-t+S^AE(A}K)-OSZMH z^l&^CB#Zr_s+b)O1DL=p_XN!-87Ysx+W%~Es(9J(x(^YdW$#1fMAiG*eH%Zq;&F0T zRW!<#zvNNRIW!f3Y?#jre1Efd}v%>RUo)In6g z10IoQ{1Y>+bl=hGz1ATSH`I*J$%zZN5WD&+ots%HIuM^DWO_UorKi51w`@Sot&nO> zk6m{k7=whl?Vj)zXZAgv`_H#7%Db_fsn4f#60x?$jpEyRzNJlB>F4P~ue+C!d@X?L zT>YA_5Pi?r?KU%!&5!S0?(BR|Y6cI^vSKIz4z%N?e;>UqQ?@C%;KEKQVv780XMLXl5mVQ)4F^|98qqSMHM;3J?dIElHudn`vD#KK2 zNT60t`uQ$TUB-}T7VN`dLLA*+g#~RqNcA4ZumtmZW*qarNh80EwkVhu%cTNIXoN}f z@ON5_?-3l5LB}!usqIHnZ!tl(NNsjs(t3a_Knx&uDu^opUe}g(R9^2!mlIbk2|F6@l{N*{6hl6jvc=(B(-~C2itS^5~@c3eCNA(?K~gohCwB& zgFB1uqZ0HwkQ3V{g+`ZtxQ-ozLO5^9sp57!%}yqUPYKvgY>QivQx==l-G~By@dH zY%(;6wv`KehWExDDNfZ`#BmdRwRQx;&bQ-kGlO+dIHeO*N#_$}gQWSgdkc*7nJCz5 z=^*7(tBazNRE0*PV!%w!9(~N@HPkZy-hh~u#_uWlaYd|6yTWP4u)=@@?UCnSFR=AK z^^+zk&o))>OMbITNnmLULZ`o9j&T3|5FvCC_AWK@79*Cs*?Ym5rHG8w`|*0zn#T56 zqf?#M*DHGjA%zcH@|}<{;?NEsz_l(MR{c>sEU0gf;B4;t5vx|)WLmNp;k-rPnvJq+ zpsvz>lkQO{RQWn2$NG9WMt@BGhjVb$1p}KT%0XkYss1u5w-w6o@si+5^racRr}o4L zAK%z~;lLYx%GMgd=iwT6HO4Q zCk+H-QK9kgu`gQ)dtRbM>C5R_Kw{=mg<$nvTP+oyXpI{_m}wv&9eAY_{?~azvpGsfT4cI>;N`+=c6j;&yqgK zKVLj+Zu?NeTD%Ws^?H1Mf#=hD z;i1FqjogD_HHUUL-QD!%FBjnF7|MrhMK9sTRzg2M^D`L6h9|Ul(U4fWg?HB7tk22Z zd=!jNH3GNPJBq)Sxx;H{A;!-2VI`FHwe&d7gv!R-53SSsM!=)EK4v2VOLOncen7uT;Zp7tIF z$Nv1;xYFd{Wj?dAePy{Q#9wJb1^@FOFMe@^D^?S)TPsOT;s_dOG{@UQ%DagdXc=k8 zQnenSi;`@H_jXRUX}qFRDsM(Basj{Hq_dWM@SJzyOGH9s`ZUV34h=Q#VzZvRzL3IY zs*>RMA-1)@<$ACiWoaLWU(%+noGB7tmclblvUt;C)zqu+{CQ^cxrad4b?@hzgJ+{% zGlR9LBdYe80KX7EWu&|9=F5^evKK^29b6fzF{?bDSru=`_qV9Ew5e7^>ngiGKFQeM zrd|o%JncKe&G_=G`{6J9r7ptsh8nDzE!;9I%9Tc5i+=Cti;yO9{%{$Rvf6*w3RBtT zCy>)|1EH$p=;6%^ro8PVf4?Uzh{aQNv9-8DO=D0Z5s3TmK#82@WTV*I+_~GS=1IkF z_EyP=S zVZ~=P{SLls(4Ulr@)J&y?UG+-m<^>@<6_HRxiSrs=>T=4AONT!UvGs$V-?Sxb%)*Kw~M6>tPJkrg>K@2e)skGCP$AbUO!$ueT; zX|fkjlo<5w4UC=L#FlD)3B7)0vYdm^2C8=XyzmRs%5`v+gw6tQSc&>GhrIHeHs^uP z*yx_p=2f0+9ewBcloQiU{mH~+(u(JYAFr_BD{&?vd~)KGQMPp?k>WVNV=sS0@0x?) z(@9MKq>z9G=(JXEG=7l6e}Z3yS-dg0oWhr6pL`IRa=-@rUx|r!woi+cWQVU40e#m` zjNga?+oCi|=B-q!tprmM(o$=L%Q0+18AniL^v9FCR%PXu%<}!6w_{`o_#_K$EsrCQY|G?r`AJcArMA1-2QuKk0fXF;9 zCNp486;DI5M-zFkUSh>U`|WeNDMOS4u=mzq2Va*6}!}cL3{oCJ?~1EA^$D+LJ`g2`M;G(TT zEgWsG36$*Oz#TB#0H;_cN|85^W;J^dgIsz9Wl7#!QsGnb#lc!v4!-%S_f&qPUkEbs z*4)d;lHpW*^b;pLPu!B>7b7e{l!-?fefgfmSM1MI7Lpi3=5$uKG2SXKN~h ze)WZ0he70C{ZNmcBZQA5G*dNPLI{Ci3|j*#iv zK5m^snaVOyL-j2>u<^zyZ1|Ei^@7N#T%An^7UlIy0hww#IAFZxGFM(U!#x&dpTT+7 zQ!U)0Rv{M==zeC0Dq>YlT$We(d8Ln8Qjmx(12kiTq`&dJs`Co4zhCQihY3XBwFBGu z``(0iBv_wOp?}vU_`fPf^@0-o$HkRjc>jJroYkPeD@!Ul+1*LL_q03dE114OEGp%1 zyCBFs2RGjV-2>#N4#J5pkWeQ-Da|SMK@-1a-v$6rKp}v?P}O`Y;UOyZ5k3!+T`I=) z-kSH+G@R$Vc$oP|%rcb;yI<4j9~^N|%*ETNUzs;JGsmWNfFb&aBw}ak?yolhQTa&f z?i@m2mA3ya?!b!LtvGM;;Ps$H-LEwC-pwcWBFJnYfm8j|s;RY~? zlF*6Y#}|N*7(iL)vx7Y|L)JRVnlega4k*S}OwxEE3HHOlMpjR9$ZT8HdwV#1 zlsWHVow>cwz85I0gEBMDA3V{++3{bs604=GLF?xg#%!8VN_ z>P8W3`SQrHh1(>TL8(x^Mf=IPaf@!M?2nc0ynqKkE9l=QU21odX6&uQ3vP@+E)pLgS(?S&3Bu^(3;V=`_qTQ zc+_HUwLTIP6$RJC$Q?hv7p8tg%sN99;|?BIOOv!Eq4;CyXNK^Re?0QX{69zuuhVe! zrJc8G*Bix24ZnHNL_hzL?LmyDa+K5qKFmxdH6nl3N3LoOdpmClAyqoR3q}po(xgDdusnf zrgG3q=@D~@L|1r>Bpl3HZyxXGPv4H+`StcvJr(yWm^@84Y3pum{#|{zmuJVjr z&Wp`So^n5UqCFz}Grd*OjBa>(*|*Vkzp<9(<7V0A1c;y4dD!DM}b2R|d0Y*~R$ z#XqwjIw@=^bNz-kOXN1c8jp{b8SO@xCSVb8MTXoBRD~>A>i$k(HYAy8heLen>R%nLa@^cgA{) zR4*MA3amsqANkQ&26%`&hZIz@u><_}8?BUB?YO2)lpNfK1imdUi_Lp=x0jR`{G5{6 zAvX8WJ}W7c_UUo7M&9(j$d=_A9oyjs5axFKA--al_jPu8&e6ecy!DHFiEcnWz0V{E zk18NyiSkQ%y51)Z)&648s?qTyG61Lb<%ElGNk=R?-OtRZL>01J&E7OPt6Yq~sQv%m z7I#{+Kzf}Qq$&u7g?B{=NHur<+3V|+i(+e7icWcZaxap30&eklN)54+WN-Tgxu^~J7lMU(M%_MCp&?Nz0> zX;lD$X)pTRh2z_>6H0vZ%!P_{{a&~2m76TvC^z7~g;j0x^RtikHwqtnnuv&9pX7B; zPHO4_p)7!FI|xL{QC|jGxa$Dn6?LQ;2PoqGp5r~wg;L@)QjJYdVss!hVH4Og`~P7} zCtd|=ae&)u_?@EQi^Bq>iZJR=Mz*B{fg;p>wiVhh*I3Yd*wtRkBXk^?!+0gyWciAr z*~RQzV0-k$l2{*eXh5o`;#1zHxdpvdJP<1`{1s3CSIZH?8$`0#3@*3oBL^ko!E>&V z?0-#UOZvZWzu!k&5%m>kD~8CE+nQc=TEvujYkL)tSMBLhjlDGu`VTlovACoVyC1@g zK@dE{L^eW8Vh=Y@=v>=-tYn5d(i(ij^I10#eDa&zzvupgi$7fi);_^t)wbBGgt_>z zw}Y71oG%8w0B7b&x3hbq9emj!4ARQ0zE!c9!>ryFyYf?hx-czb)~BDjyc|`PXMtYX zcTVK`&O}Q#mHzEMK)zk_T3EfYf~|{Xga3(V`h!`5O2rL zrae$9|D4=+#Qbp>Q`}EC!hUM~h~Ic2)@M%N@<#d(LWgaaJs;$bMh2Ry=UoBv5@c57 zw^H%!=kThoegiz~?D5bP>yqxJ@m^1Q|B9o4A^--=;xJ2quX%T%g3XnJ)S4Hro9m?u z8&P0OK24jV-Q2ztLrp$20$aw-zw0Xs$|oFbzQ;Dxk#mU4u6)V8s%<3V3&=f;PK_0& zjYsH4+(Ugww4@2xVs9_LN{J7pMNrED+{Q9wATy%d7*9L1tq<#u+&6K^Q~DR<6__gQ zywZ7poLGB^&@{OAUzi{LBH%eRsN6IjCn|s%S#>u@QPz##cZsKiIM6odmAu{o!lFu~ z6?JWjZf1E>eikPvByCcd7&xlE$D1hksf`;VdBGIjVb$;@f4s=mqhqXTK8^EnHphd) zKh?E4r}3opT+x5pS|z_vwEN@OY|sAd-sJlw?A!?3R4N>j(V>3I7mKd`S+dpPDL8?| zlXLC&`E`QFe7()B>DsQnxKJLg-gaOJ z@UJr>I)u}?vup8D{oZQtSMwTX3moB}R$@?)=gNDJcB-%^CszchEQQEOx!tqI+G&{J zFlPAd!|cR;Yl?d&- zu4`cbXj5G`t+*s;g-E#3 zq)9(q$udi=GTfPnj>66OytLu}Xnw_zPcl-_89CMbB|p!m8Rz%qp4O_-Bn>v1*%}^! zJ+A#oL)XSCFAF-fvS-=WmA>Zw!~OLnF^#fV8m6JBTa_Y#Gl^l=h;Co$1@u?1|oP$wKu{t z`3Iz9{L~F*o%(ZJ!{`{!_6-8mJs4LzUH<)^_S1X5hK3pX?e!*t?n`!fYEa9wZb&T7Dq3J{3`$I`qf`4N>aINAC{aL?+Rg%H#$qxc9g*cHA zEbAe!`p?%yW9<4S(g$q9cpIC!1f3!z$wz-CRe;M%Lvr>NlKAm)|LL}9i~EO&chIn- zggA2PCRcC!&plFtDix6y?C=YI94eWD#LEijnFz}>BfnpT1oEelv%K#ug(AVA zNTca~69;t|wNpN2%N*GTdQY6br#o&qTre3i+0TzT0uMsz1} z-1gLL%zYcDA^@6m55=Ed$Yn&Zt>4X~J+KJiG`caMWD)XJpT&6B+`$1a)K*e3ftr$Z z{i7WeI_+DM*ZuFBU(weKUN0qkE-XYr=U8TWU(cFmHK&dkPinMr1q9A9zF40RCKTQu zP%Ii|V@Y3@+5Nj|Ug7vTir=?U4cJ=&Wq{wgcYgSVCkymA6h1>Zis_^Mr2p>0)G^=B zJG?-|pPgH`tDsB-{p6du{G@evpIS3pLc}R+HP(k!XS)8cVxWJ z5dSgO)f}_E8?6r7@QwUh_#I5lJiGE3p4HpN23D-kLf(nSyGaAPZ?&@}!t@9v*=Jyp2RX3@zf-bB+fn4oD5MC<&0>|fkD z?`mU>D+FpR=xqwr*louoiPQGhoMx=7LHJVBVX>Kje*-?SL{#4D7!XI*652_T>-|22K&+JX-zPq2TuIA7K^Yv{ z;x^GhCc_YSH4{85cKA_m6)L4}R5W&V3T|hutm`hKXyJ|@7@TjZG;abh!ZiLCWujVZ zUJ-kJw(om1ZVdWI(O;So81b7TG3c^&*r|Dvyu*r7V)TM{uFAKQbhka_>cV~LhVbb6 zX0feT^eOYY)X9d8cZ*A~M+NbKgE>V;{UxpG=Xc$Kr<>Z+TpYh&Ic)r{?&<%qRaL@h z9L2AaoJ?4XP>WpG`1RVFUx>7G;Xp|`71Pb%AIWTH>+XNP){UiY9y((z?Nc7J02SYp zUAQsARN)hkFCSJj448^vqIW|ucqX&h9q@*Kv35q{&*Zm%O)gM8@~;rvdQh9Ubl6Sq z&f4`98R&7tuAADGgQnYoBupD7-0B{oEIPXk1XU_+8(T>TYp+~;;{W`dep?c|dj+-b zlMKIvQCY`hg=uH{DMvU!8)ftpt0&GIXu+Hg+R#@TksYls2FCusA1?j*qtl7E2uuGidhIL4#c-xoxF+_kxLJ}l?);fQ-e%KhyqdIo z;pL$oJsA+T=%_)ed>Xnh!LBvx=l*afvwG@{K#{(J~O4;hw(TI$e{VG;Md84QA^^(_kGztUGPodwt6C&^;LpW?+ zO72Q+tS-fAF-nf+yZyc)B2YRXCeiFbi`zKm^a)W8S@j?}|EZQrKi4EO51HiySz)YC(wLkkk$R{ z5DG84!yBf%d&k|bmxQy!fY&3wD{bKaV36V`cr(R%*s4v1){ti<662D-u`-!Y`bL;v5*c%TRBCNB#-*1gp0c$ zW=C)vpKMaT!hmU*yX<}NhLI_VW%nV*>qa}EA_4bTR{GVN0xaeau^FwM!!%5L_~m=rV)ueUA#0uH29|9s;zJ9M_wk}<+2LB;!F z52(0wFZCttqRnet%6KEkod0A()3?fq*H|bI>VFX`fa!vyQ-HWvDs})(m40N>5x}Tf zEgai%r@x*{uTLxbNkWV|*)3GZMB@7-x_g?LN=cN<;cbLR>q>-kY z8i+sHJG1)wJ}we9nC`Fi%OSrzeY@y$DAXyBk6SA|do??l5`R+_v0k^$J6ege(rEF- zZREjp-T8Qq&Uj5^L1s%Ypdc`Ve(a*(XeKc1>HV2KJR2V zIn+eF7{tlw9hg7n83LLM?^(s(`KJhoAds z52Doy$;!rFzn|26E&k^{?Xue^)CI7LT<_10?T|E23o^L>jyx8Q%z-iqmgRGrLjTcz z-_$A4)(ecM+vYJ7Ke^kwbUB~@Zdav(P?`}rbRA*)`uj>4($B5RpwZ7YHc9_)7`~wO zJnYDP;V)mQ(987U#__hbijGMp(VJG?R(yz zyyDGXMw9cjX9SzChn;@GqID;#7YD+l`d)VXpmWdo4?ZO~c-?wWM7e$UVP&zahV*op zCpT*}JT!Z<^4pvvat#v}x^5G6-Fp<+5R1?E7_tDA*}!xx`KQiG_ek*=S38_6U%Nm* z9zsJ0rH|V^2scSsb#n|(|IGP(C<;KT78A+!c8i(|Qy&o$OFx@zFd2Qu8Du@_c_gwc zEUj1=f$trcSHwPdNK2~ZT?3e6i<*@&bmB@t<-&XQ;+Z{={yA#T%F=3>BOp7db#-Aa zs${OH?xSQ*Px=1fT-r5N@Ud?n5S zl;#Ias67zhc)x6g(V=rU+uFHo^Nn~*2FW)ldFeC_0u{~ElgVpRQ!(u8C2Bs@`Ymum z$;Wq)M__2?01Jo4cFDWd6yM?}lY;%t_A7e4mv-uv_4X2DM)#tyL~-69kTk`{@M$#H z7tF}oADo~#O(1(#Pa$F$Z?EK!hm(P=>NzVbQLRkEMh50x{REPK5*-*dg!lOynQcAq zw=ex!$aN+@#hHb6R^tr1-w*Wx#fqR#@`Fh0oU;Tl2bwU2J~&)#F5Rl%%Q@_G_I!hh zVTX_l-M0GI5FOb&C(L39+wBD8DUByXc5qU)9g~rz{0;~ize!!_W=E5`5wX*X>GV3= zgWRxE4qSOQ3uDV%Or>^2ty~JN5<>`K;+qK_Vm3Ygos0wPF~n~;eT?4%!WAXccON-` z^M5s*pmJBmm-9G_o>KB0gkgU?o%npd9fm)9V64KcRkZuLbI=d3Hn~nF&e^6#qb7>K zd(6jo9-khR5$J`PJuzoY6k)JF`3Ww*zTR)$=#T`k`OnjmogmK@dQF%gi)4!j*OQ(- zB<$}UpluZ?RIfIxsMXXf$uQM0x`wjozVGe%gHrnlb>n`55$)pke8=Tf(He+eN_$4-q z>}({>u2(TFuLVaVtu|d6HAD>3cRw4oqHs62m8|opm{OCbZ z1zK}orlTg)!_m7S@R&qqun{pZvVs{G*^{u4Nv^bErQi^I*AX!Ag!{*}B;elD$P0W?7rgV+KP=L-fFaIKO^9>i4V8bh^(U@Z0> z-|*l!ei=9w;R;m}pyFsT#lwHc+OafFGpucKkY)Ia^{W&Sw*)w19Vd&#R9Ib=#o45<=tgx2p^no~X;P!GNZRnMyi!z%yC7_S~+AC~#g^Y^ho{U`h6w|gd* zZzNA7RRPMxh0lgwU*8VQ7j<_g^BSdO!?rbxxA}9rH5K3UC1#yt!ou9kq0hsxW_yNucb}W<=xe$o}{DkmiWQ$4AY~~NBauv%~E&q%kaCm zb@*Z19hmv7S>IQiBU!1|$fKmHOCLING)H%ATWt1rYB;t=UHFv8-v5pZuu?^)mmR-saMXgRQaQef1`{*O@@58m1(fq$D0H9k|*&GsL<}bRz%DKzg)wOkJFnw&#PX z(qLE`Z@}ZI__U%o^Su8-9Z_uhspd^lzSj~%&v)|4yZX?X#u^ zKrwiaPImh6+x<4Ci(a;F54IQkw3dPG!+RQByO_u36R8%LG}!M!40IomCm?4(529wI z!q+TQ2;UP>zKhMlzcGo$Rx~9?ZSPsjM<6Olh(?=wKvDfD<8J+a3H7XP-#pzY?v9Us z+bOl`vr|O65BprOlk4(6UQ;Hz%-e^9r>9v~@LrjI;}_Bsqo=OFeCMKn%i-F-IMgD za{Uzjn6U%eV_HVfFMK#!lN4`PQ%#|E$@&U3X zZL0vY>F4viU=vR9(75?jrI%lS(qQ%eH}%olUL3PF78W@d`g>ILjnaX{hb@VGu>~PV zFsifP?azNIIa`Ix&Ge|a4#BEhe*h^EDqhMHd6+Iy)RLPle*Gl^Z|`ZXb;-}xpwEu) zmqD+6l5DWQ_j{F&gVB&zSEG@?H$JFBGK@@2q0Sgfl&~{yX8GH>6cFzb#kve^^?f7y@F}3$?SXEW?Z9Du>#O&x z+yy`(hN^ywW_wSnAMCLUsgbj%iypj{^0yVTVsX1WKXA+F@8awGlp8uW2FU$0gUki8 zQDM4986jXqk-XV?xjS*4G{5PTFIs4a-(a`X!-U~=@*#fJQ>xa3S_iOAC-?nSxgUrV z;SDENt61&czqzHLSpIuXdWL;u``o##y7g9Xi3>GbT!CAPI#X;2@aFGcEw#wJBth)e zYu>%ZOZ5JcAsflS{VMQ&4vXa?iqTB{SW)*W6sz+7Sg8i#qbN@b3Ji(6m)Mja3q_Kx zq;gInJ#}es{tTPpn3bI4*I8cdxW6V*6Y694J45k+LO6@Pf57wXIStU~I8N`*)om=U_qf@Gg`DTxyW6sIC_UQz}(yu4QY% zU{aQ!9`CCCRM*#A$8)XTovRM)i*pPapq@{`&g4_XnRkazGNfL6q<_t3;2qviCI zXZoJQCoqdQrNb#dC*kv`;sv8~t3xz>j^ovGRx?o_%F9QmA}kXZ&i${SlZ2i>@5=hj z!u3p&TLS}Ew(6p=zLO^dF}`-G= z=3!p@_lZPLC5Q@mZ}R`)SUJjDirJltst z$?o#`ttwmU<-K=gYi;VI!BxYJr){^pO}<@(YK7zYh^3oAGy26}G0)`!sOOFv+Spvy zTHaIFjf^~|=%nYCfmWyL(_#w6WG{^O%~6C-Ms7>@hh_gh|F(Dj;`liOc(L&bKS+ay z$BRY~)XxtD@zcBIext`x)7-H(8`LCgUGI^|Yqi}Us*C_V)}GJiMS#m)1GoGK$(S?K z2D530DJg`lQ{R0!-mZyr{(G|emf`7JXti7N7&xrohr%jV=!9!B6LouJ){i~YTQod1 zv1l9jREND)Jv{%|f)7Y7_nSdJ*;s&`EWc6xWvNrYx0d%K`4}uW<*E^W2MN*6L!Rb- zn#Kd8*+>6ql+68qn0% zsl6Y3!-k)XlFdbKQ=iaxwfH3OM{VUPbb4cbKi=p;i}4r(PQnoD=z8sRi-e6BfLrw2 zZ~lKK8riS>?A^EJjN+E!^C={p?dSSMxXl$)qC;}*lD1iOfr;@L8VRQD>^Ng#*>}Jz zx@0)79F5NOxK-5d-1n5;cj(&TY$vaW@Q~k5y$KUHsR#T1(j9JsUHuEw%&|Nv@cX|9 zNS|ve3~78Ay7y$)FIVaAr{phBa%1nry*o#G%MW(fj(PgV)E@OdD#~v{rz2A9xv8aj zXR|EFbbQl{5J;&D=+I)RWPabXttOSXOV#GE1syMoeW%{u2*ZQYyL=}T-_}u$k-P1` zcZ??)o#*F+tnjry1$9JT+Xc@+AYUx<&oXX$6xAxOGx0bG3NP8pj7#exj!TK$2n2mP z$>jdNU7K@t&f}f-pJ|Yub8PnUZ^Z8&iL|eF0`IW3|ATij^&S!&v)XU*w6Zq5!8wr( z-s$_VRTEi%K$ZAKR&iI?K9&)RT>o4<86CK@jTo}4+T9}|GE!a{1h+)>nkE?9_uRgbm^(tWEp_%$?N2Sq`B!t4l{0Xnci67DZ%d7Vz?|vt$nyudk9{@N@1oO)SR&Kq4 z9fV?^L42Dq|26|rWWa3N_X}`reejx|iE%y6GQiOO$VJEO-PLpqBH*JYbC$?lG@1Ej zBOZOdN)9PzC@J4PT>$Ss#bc7ye!WK^mO&~*_4cCR1+V_pC@ZC{HFv&8@%v}o_M=2= zf*ZmJt}T`Vr{6?x_RPTV(gm~94}+Z8e?Uk+5gAeVdm|Ol>qq^*Ug~Wt`ltu2%Kyo{ z;z1MAyDoiiHS&j1lr3>QgJMyKuq3~}j8--VMJ{T)!kG9z53?1VhJ`kYu;s<7`)ouGJ{?|!;TXUbV$PnpAtk}F;9&`vVhIG+ zA&ap-ckeVEqh18HLF!dT^p|p0n5TIg?*fK%Ic>Bw-APc`Vm2;6V>>Wi1%~lU)~ZpT zow`~E^f<4zqc`}&{+T_UvZIV_SIEC zkGBp|x3e#KsJ~@*W}|{z>Cx{Zm6Bb*Du}y|nQ6D4E0*z&-_}?6XUjK`l%Me1ypKkD zbt<3FoPCt}{nYEw3AtUe0v7wLgv587>o07FwjH(p+&wfc3ZyzUYfE88mokcB^eV3T zcDFcf@``;n0%_p=_3MUJVi>W0*Fi#m{DpSp58^GC;42K@+aTRb+n^e1DSiHVC5GiM zRYX2L@hiunpu>NoBK^h6jQPmxCw0c+LsT!iW7(aR5Kxp7NjH%!rT>B~lGaRzerus4aq+@9%J03wMaBe3MqBb-_%fjN4dFW($C-$Eln@S3l7PprMhEuEd##H6 zrM^Ly!E>RN2)WnTxD7w<(;49Q^A^QROB4glA!@2mfVYsNUA_K0y5{DV6GzvhvZuIm z@tNU7U~>(M-&d)$vMFq^5P!{BRp|o3OT1$X0a0Go%wY{-JZObo7GV@psFQhu7h}uB z|7|T59E;of_Y{;->doJGzE@|OoN^Y==XZYAzmhx)_$sLzym<_bJj>0i?RzxXaZYKYrV+&(TS~;xU{-axC~pf z_f9oSo?}u)k9Bb{=ZPodCd~pd^_xA?g1#WP2hL@|eQw{dH(oEHOt#ngtd=jPXHq_^ z8?SmSK9IqFZQiwX^bM4V^ZR*GpSX9q^lwwlg4crR;Pq+ZG}u|EO}inX(=uSddx84o zN0G#l+|Mu+`XdJ#lZW&>6|01)Zx*d4PHeM~V4btJ?QB$Qy^(=E%Q<}*lOq4Z=ixmM zU-*7QzGyWFMtfEov}A>s;pP1~9O5Dvhe9TH@M+;4FJ~vYAOGRyn+QG9&BIz%Yk~CI zUASW7w+*dOXquqv3GOvT=>R1k$^KxG5DTssY3curXD-&^Q+(ww>7$#}h9rAFsMj5y zg0oGn|Ijy8*(5WyOo(oq42ez1_{WYS|AyqTbKD}5qr8M>? zKd5SuA!ue2s62e3Fzmbpgejl|izi4qd~{jSel7!HW$E{%G+9+QL_NQUJMWd9GUsil zhnQ%JT&zwp1qgLnBs#_2eZ5Vu&263?HAHy+E0+TR6R5(it&f}OX{m130|6ZuHLR|4 zp*sOaces!G#;U(`3KGypMpAQ!)pGQJpo{O3TG@SlxdZrivR4WUC0|d;@tA0THRwy4uW^t2$JIm!_+0RI9pyCF1EAT4O#O+1oHi}7;`-5;*+^w>b5W7DLK%%qeR365+*=jz*;Pn+ z3$W1)Qs|n^fDFa)uRh*LmF}~SNBv$du%?*7Jv`xc+2cOMaFamcp-#Fcw z6r8FaiRNWFN6hO%6kEP>89!o1=z%8Pd5KPVp^Iy{{l9q!ta~*5lm`I!o`$QY^qRmd zt+e1SO6Hkv?G!1R{kx-!(IR=soHF}Fvizc`AKT;2X)y+5tfv%ve}kehgGxK$OOF-Y zPr=brse!Z#^p`g!<|!Y!IX;Uq9U7R$tH zY2hy}Mn$fvh8+<=fg7ERu@`tR?kF?F-1B!L6rcZ;dt=j*mo33#_x_H6ihO|X;ki>UjXpFZP! zZ$a&st(?H@orgu>Hro*NBroKja$?GKY9znxYFqy+4cJ7SC0FJ8qxW3QU z6Yvi69R4}CP1|l$A6(Cusq(LN=Gbm*nStdi)^2x44~vWwq@@iB;GkFD>USxcc=trv z!*`k^&DWV%;zytGI!(NtrFy=Z9AoEXE`>^6pFg=S%u;Q<`!mU3g9mRxyx6qm&s??` z@;4d_+$kE!@YEe4oCmj+h*v)bj}{2RtsNb1JySvm%HJ?XhmwHw^O@CReLIFs4keu? zNTdC-`13)F3G{8yyTSnS`%`Zj$M!SgVu1T*REu1h9VZ{428pE!UuvL7d*I@Y_{`?- zNuQo{_*fSJFmK~YQrp7FW?k#IPYG3Xe`AdwSMgwMzYSNzy3X@vhq%or2n8Q%zC|Pl zpSiZN*S(ij#n_-7&acILC)!^kNdur_Xo}FqIS1Gkev|zy-;aJ<(=`s7A+ZfrRF1 z!Qp8K;V5YJo@S>f)u0b843zk5AiA~vnG?+AiC|m=DdY-yUYs}1X70@kT81K@fX>+bxp1Zi7eGWu zVWIJH(jn0B?|zunmHXJFdUo8!N}0aU;6HizoD6fcTYu~yxDmz3+W5rmS3V`FsC(L^d=N6XTl-MaDvt5t})XE;{CtoxfLHcX68(yhB!sQ3uG;wiL} z3!^754s>3c|10xXYuaq>{{f6dob&Cjey|#T{4VZCafQ!+U1uKP)G8phOqI?!&gp~C zlUSI^QxluQa6udT?O$De#Zvb5jqIj=c3Jd>pCw^-TU=A!J1}B4Y13qW+}K?2X}=%{ zwjKi?H{KqdJ5k{(-h!e^z{}~g5227bE}NeD>j^~%nKV!$OKZLqkZ|M2`LM)3I))3!H%q%y-mWNzRNUt=5;ApJFh?=RhOzoOU5Kn= zdw=~;0&rP6R`ys-)X?8~dnRbf29u9BSS25gwQ{FxuCo!;-A~1Ueb@Xb$%il4%}XWv z(>94rmmy6#wz5Tvy$g{*uDNe8#Y0*Wa0|*{6t3c}Z@2l?hMH>M7in(AFXqsR7E(Ie z0$uBuVTJ$gTs}klN9b%lw{2V5ELP1eQ0(KGG4QWkW!qw@t-Ii`I|rJEg$a?NjOD^J zwz@G4o<)bhr|}eHA35x=!d7Vh_pj&#WaaBZidXsPp1laiooEr5|2nG=vJl2bdhl?4 z<`jJN+x2bVuO|g8#KggmBH(RLJ=}e+X0t>m{8jIn_#8q5?BL4B2mDHABH?!!Wpl1*E*&c%=0sL5hSpZ5P^m%g$2O zS#z*gIRtdHE-&$0;VQ}cvwyCyI^JNL-kl=;G6Km7HD?ozatI|{Ees+4814uQZ_J(+ zNUF606?j=(Ma+o4{){lo%j_eg96zt?i*Lcwf7ML3q-(aDWF6iibZWp=|K=xH03*-o z7ijlfN83!{^(iF3u`M45}5zc1-@A;;bfU2Av5Y`bqY$O+yS2nt!n|1q?`}UAgD9syxG`I6piRHA17$62ha_yhd-&BI#&TQdapmffk_rr=#Lsc z5rWRbt2`k!E%Q%iZ)a(yrHnmgu3vbk75jPlZuNa?B&H%DWXg1?MrE^NuuLsCfcYwj zgw>UP>1#xJpA5Xf`4TfzP3Z4d$;}_e@N`8v@=tVn? zP%BVY$jm~9u#RBQ1bQ_!Y*@{^-juqJ2Vchb%jsK66gvkAMb6}ha1OER>(XbhoDjob zJi5A(yu@(H^W-lH`$#_c*HqE<`9@H@W#_ppn&xKH9Ndb4V8Zj^3{SlxY7Wet*Zrau zrRonR+QIE(L7q_p&QiXpnAk@Fh?yTUX51aPN_``8&)9GiJ9vt(-}qp5l~V)OlYE-0 zNsIz^gkGiG-3G7O+LeEN3w_PuF|}l?hpZx9j8WOZ?#}Jy6Kb-_MS4|f(jrvXp!$A<^6*|lU;oncWDRw=_ESFL4(fnAO;|Y4XvfEQ z*PGt#S?6G8f2S{=-Sw&yDY`~xwJxpNS5pVi$e+O=LfxP1q0ioVENbp*er&c=kF3!m zYxlWw-t$~ZZGhzujvf_~VEX!HW$f}}nDz4|C%@-UPvh=m$nQYX#7|O98<^bY#d>e_ z5%w-;M1MGzEQl{7i^KD0e4?*h1YzX*dH7 zRUpL^8F#d$045{Jm=Ov-*WV{~BF|QWUs2#PdKgjxsLJ}Lkr!^>;)Ef*a`B!Y@dJ(= z+C)YT-Pl%$Vaf{*Qbc_Aj#~MgGwau!V-+kDP7d)mPLY_W!>j!r*+j8>Ij1c#)3io9 zdAm6)TRfSw&Rf1om2-1of(#h@R%&D$+_&fZbdpgPYk9b5 zE#OVr&*Q|D`7S-I`;YgF6F^E8h4;-*d6GLv-{JV3y{3&S&B+40&~rsl3!{gPy2|Dt ziG`?VHW{d$qT5Sxf3CP_vR}3F#NZCY_3Te~=4fhGbj~k;`Y31)oN$3zvM67WP}^$v z^)yeVF1-{!4Q>^_uhM3jA?jA{{C!Sfv^VWT`7xA!@s$nWra$OItd3@;Kxx0MsN6U$ z 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 z zdY=!oLHDJ#^kEf-8=3-!2@Q;Ur`yr_E1)HXV80I#AV>C8BDXr_SURUs>+TF0>|29G z2{H=?o$Bka^|7?R&sG^~ZpAXT`{}(}%&XhkL zf)Z|LvX7EP4i-s__XiXk3+kTNNj2KF#UsDHe_Or}Wa)~kIf55r1B|xiWIdzrD(h65 zh1(7Wec!1ba!Hjol(EpxofttGvKnT_1Qh2(&7g5d-@0XduJ7ri zo5jp_K9j%800e0p);oe1riIM5PZkZ{G)ZYMW2+pY&lUG^Z%=%|nwPgPWIGQS{2%F( zNWIGA_i$eDe?nV~wMP~&0wZ`&A{14GiS)HKHin>!)advrXPcp9KaQT{ohhMupokrz zYXUU`JWL`wYu>D9UAMwTIEr3*J7sjg6TC(FUNyJ_Af;r{uy{GuBo9qDC8z4{V~73RqumkCkhTPpMPw;7r;k>)84R9^Z|bg>>;lSk?#?1+cF`Puy8=2WJ;*9HLjRTI`XoF$W^sx8es=A(D2q;Ak$ z_xISOK^lGhq|J#www-@S;uq>UKMA5@MN6P7R3g3Hi(WnOp)jrQ&T+7`;8&3Y^fsqm zumC{qjH~%95box!YGLx=I0v)ivG+m#$d|bM$l@Z}sg#%Y<73{++jYb+-%}9Wf(CFg zxQ(6hmh7!_{N|SSEW8cM2>U{eE673OUXSKNod;$R>WB3z(#zg)zLQ!MJhb#j!kXwq zU4-wEE~W0)&AxhYdQJaQNMbyPa%OuT-UD(CM=0Dht&Z-__i0A}OMb1~JOqx2wM6Vl zo`975I?IQjm{t^)JRhHm6+D%=iRVLkvJ|DBNy6p_f6x{4vuDOk2CfTkFy!savZUWS z_j1s4l$%vhd&f7O;v9#tR8cCAwl*X+)Af@=gwR_kh3WK#s2>smOdW>#sTbU`QtQt# zeBUYunVG`eja}z zf7X~QN)(($y`)R>s|}axwojeYPI8d+ZZd`@;0e%4RK}RMy&ii+ifN}qd4FgD5{f2h zUvFN|%uH_X_=bMpwS67)8|7rK&0z(ee!*x-d`Mu4y{EaiGCSp zH+=CY-@Y$2F&S1eNf3_-J{myK;boP!#knm+uJE$dOZxOx;c*w*mm_!0_{6JK6|Rwq@R7(u9GiH;A4*QTfS`=R2w6Rzsg^sFEv>sNY>oxKUdvS^>(KD zvCT*LmZ3y@&mU(iG-ixle;QG8V3F-#AD5UY6CIRLU+ErPhg7#YjP{i*CiU11ed^lC z6V55&Z4K5qA{vE<72bOuf!_}E=(E>Xg_IJJG}Txq`jwyIcT3`EX}^WB!>4y_Hv{l3e79&-^^YmOyQi(`;_;53+ff|4sxp+JuuYsvnH-z;v`Ec* zVhMD6Kk}%7t@kVR7@iRol`d~Tncsf$fKlDSQYx9&?eV@?^riV%)pV#;_Z7-Uy8dR< z`;^hlE>MaOJLsayF4`Zs8bfekR8oQTUUouZkC);IaCanX-I6QXO}VhRkyJF74VM--nFz^76m0Aofv^CdEyfeMEcE3`p7DOwDvj{tWi1vQIQf-skhsP`9 zDZ#5vo*S~wBl$iBWyh=3%7t|e4`3Lbi#u&$j|{o02@;G<4@)p8W`PL{l_elyuPCK`+AMM6EAE3J!5H{fV$wKQzi z5Su@n<9cH%v!`g{HW_WTIGU%e9K?jU@~7JG)7t-PWYSx_j8ID?%>Y>(P=k3V8og-_ zBMfOvXFrBw!T3Re<uK6>y7LCt53uViQOAQ!gD(FPHNX!x*zcsiw6e7(+#uog!xoR<5<@|lI3mnrk zJhlp87xYZ346w2tAyd6Peo|L|G5V%F$g>Sk`1ZNvIB@g zl_>nFEM}vx<&XZ#aLThu1q<^1^C{8}sICo3Qluu~2@V-Xae_Q}J?cvUUUpRwxw^E{`F-aO{=B{5S{LR9rU=dCY}hpO$xCO(P)J zKap63#^A4-?qD-&$>qQLXvhYemSR z`FJf#4AHAgsGEH2M}s(Lp14YUW8edhW+dGdn4j+twK8*g4~g(&;E$@$BU_?k;6y-X z*W(&m`w;y&ECy(03TM}XkR($pG#@4Bz1#f~XV^Z(8PT~2wYkso_j(n2h13_pJ3&rb-+WRB815 zSrVkJAX*wb>X7;brM>`$Sh6t}U9RinM8e4Arm1UL&3or?HZ*6ou}9j|vly=b5jV6e z`YFABqx%4F<9AlPP<$Kj`|)}U71s81Km7ecQ^TYbF^uU)kA%;??>S!vkrh(z-?$1% zy*;Gvq?{Z&JNp6pu!-_dG|0S0VxE;&ou_#w8MaX;U%tJ>U0?C9X1z3j0%0f!Ve5V$=C6Mw^7q@spJj=LD=}p?zUO?O zsjk_8Or+{1cu`^FH;QfmyV9R0aGL&l!ozwAm~n+E(x1B(7v`ecXQV!V>7qwbk~aNg z@ITBGWnQ~#kt|={aUaG=#!uJ8o9ty_c|2m+dGquk%6z}5%zk2wEPNDe5oNJN@ag@@ zy~yiG7u$piyS7bFX|oMNvO)5P`gnpsM7X294~wAm z(Ish*mft!BU9?&(?>HcPP!pdBn20~it+;)KnN;8ufP;rIV z9RU4zW~lKJ^XP3@uM4T!S6PW7Or0b0L7X#gH^azZ@A%rpxubM^@LsJ_`1OyN%qS*vPEcIX;z_FK}!7+4}Y=8g#2hC8+8lN5kmcL;D^*%I=iu zLM(St3L9Em%hl5R%I^2&w=GI8YF#^X3Ds{M9rd&~jKEE3i+3$I!T5(`xKUn^>1k&L zcMv1DLWveF!!>Q&iHl=fm^QOeVRk%cs0XVK2EV{lsC!Vt z-6U|<`&ZuyFaPp}S^p}I&`Pvcc-$L1x1aibN)(psRU5yv^IWW|KBpUYNKBBRkuMqN zOCd@>jJgANn%!fP)v-;qW1R@h?O`zn>*D#M_;wPah< z*x8ko$?u}hJV_T;nieU?1wBpgvGrW1DtK0CFBAv!wPKaY@p?8zbu+x%0q};?eu|Jz4zTw|DDJV>+CmC+X&lHf}>k0P{MtGN=|&WAxHZ zTVgYoRViLa!;}A@lQ36hCtaS4o)N+0b0$}GWnS0X|EyQe;P7+kmTFyTqX`CbcIka8_xVPMCut(-J(S@2+A|5tPS?8P`WnI< zuiCYK6r3Q7%%uW*)2Uo?aoSqZyocfL5yE0FIzOHK&FjbvIB^oiaaGB-OIVE)bC>@0 zGM=gGCgDCEB2KTTMkG;IZ}IC#iL_`IRj&~V&k?Zxg|`QT#H!iN@919ep3y&6Rh3$u z1R_8m;OG_N$1 zDYg7+=1IQ&q1d@^4{v?x2 z(pEb0h2yK~NT@Y0r%z>&A@m}t@7^y`!S9kTz6chYv(0GQCr8=AH9Z4bq2)t+D4h*$ z_?%_8Z~cQsvJ7E4Sm>VLCT9T+U+p2T%a4%E?+e3WHd-v_j z28sPnmykgpuJfh75jK-^QL<4Zrge(nff^K>c->WF+P_~>>Rf4<(; zjnoGn569>ehM@69G-Wf}f;(Znd1wW)ax9f#iFKBrZnUqK2bWH91?3r~ojm*baR`GBCvn{wWaWbO@gkDM!lR}|X*ys-Ki+30lSwg;q1mqd z7MxXyQ-tG{et&MKSMHu|s)3KC($KPqg_pgagITsv_Y}eW3Am{`q4737GdRE|GsuvE zgp8cRy%p1uGz<9}9wQ2DbGujWI$X2$8jM@AezW$r(FBF2V($1XD@|jb;ky?;?G&O8 z%OBLEg0EL=~CS}h<*q#`&_}kyEboM_`9+Ui2*sPJ>4#nc)P4uxR z>M_K3?0fCCgpRk8>I#?JA(|-3wsnqOTc6)4naM07@Yn;35s~K!*>jmjMzln|$*vvC z?Q*V_Z>11t^I(UoOk4zr!GK33*h(90vzMm?RFjV&ca~Ma;8}O7$zdrfMEpU-BbzF{-xdyIxtg7FD-?H$rq@f07j> zSvQU0DjCZc&ptx104Cw;7EKY~+;7hmQ;Cf7Z9cP!Oq5aCvG_PDUu!BWS(rS&L8ZaS zE?VjSY5tn&=wP3&cZ+tYmXv&Y-czNV8Nb2L2Yy|5E@@0taHQ}2~m zl;+1&$ta*r2D#2cdY|3rSF@Cy_}#71C=*DrG(52`!(?D>9hOx3!9}@;VIR(diyjdq zyIOrrq8k`kCc^7zb5TnJeym+WYQGU=TBH4(XX{JlZdE2I9RRoxwO<~pv4!-NmGqIW zBnX#syO+z*B{Xse4Hef=9$;gAdE z8qBneX+GRchS%leE^zO7ERlfk;Zu403mHpI);pPPN=F9H ztiel0l7S+QOv=wzgyDXo$;%lsMr{J za1Ck$IRDd~yJ9udR=`$HKX9NJTo2wI87d%qD-e1XAl2Tz!{9XHkEUt#-dN4I;Ciz6 zZ*{wXy{lK+j-?2YB3#+N+vuf9Ra@uLMM#6f`myiy_NVh%dK3>@J+)p$sF?D5So#!> zrgBOR3@Cz1g>WxtccZ;$8{?ip?_l)xE8;IApIh~n30B7xtj*EtpY#sKbV+izRGbmU zUw6~wz<9pF*=@JZ%#5}p(&JTf`A@-SRUQI7241YkR zW8?V;Y?8ZNo?WwhQ=_;)h$Wv{*SY%rYQFAoerAV(3iTz-CnMOy%je~Nz0{^FvM~~Y zb4Z`BgXXDRJ*fq7=$#4Qk4L72^Dz($Gd1IheBwJSef;aKCsq-0mx$&B}t_J`uGNkvu;$I^vZ1R(F^zz&d1{~ zsZH?x$smDV{EA0bzxcn!&Jzv$bwYN*`3Mu2mm<$0mqJD z`|{U8=WZm|0E1|cwWxU==AR_7NRKR^@4D&Qd3?TJl&OM?|3;UEWO)5vScmBjCXP$s z^1TM0xL>z=m{7#N>^c=bF8;%))L(U1P?!7=`hE6b6@_CuRAeW;sv^P>bknAi$jEE{dEVaBj2dSo>1-P? z?088Az7jD90%mU@(30Kftt1jC-1rEue7k0>Xj9@E} z9h@>R#;qm{dI(&Q0U?@`d)W7$UkR51H=0%1$VAR^UA%bWG9F(!E~ylh^Ivgf<%_%Z z{_-IAzHd!97R2t~S7pV6dzqtG2EypjgC!e2zx;P4{P^{B@;VIHVKIiKJMC}*YojsPM6&={6hC*%lGS?4NXb7{titYD7=6r=_mP! zc5Z|;d4x$HplF`tTxpJtMw4Fa;M&B+UyD$)ECU{#=VEqmx&P*~N|c3p%w?W!T8UG> zO|*Q$J=x?7j9ob>W~NboyYPp?c=DeXO>(#Cqz^fft#EAOhj0;3O|)VUa`<}Zj29a2 z{wma^G4g_8m)10;8-!wKFY?o={PG|HuXNqens^cx+$r`)i*u!p?=w%P>{fT*C{5kG z$luM1PR7dGzsSVbK0xLTo>~k_HV*R^=D65~S1dGiJsZ#G{`jrq*B6!%by@&n(=EqA ziwx$BUzN-nG?i6cE(`{9brbKmZ6oL3ePnW8???P_7V$2v^Z5pcx(oMtiSD9Yk}*?m zJ2(JFh3=P%j)=}(u4^K8A9C24es&|^C^37Yyhhe*Y^kt)vk9EovAvS(GE}@8p~Fs8D~VO^ zPJ#no5Uy8zlg`Ad&+Vq|1&%v_x#_bs&GY%l<@1k@{AI?Qa9J-GsXFWt{tiFOujeE} z2hfpC9?4%O2qSo(<#BWEY%+!VO&G~|Er}QoeMhO`Q+3ZL2uxV|6!qWy*n;8Bdz}l9 z@QaJ@ZzjI2zoLRm>?a=;LA&2LR7mYd=qp-aZzIMjpAVYY$`EFOK|sUz8n`@y!jpyr zB4d^PhUevBw5^#*T^7H;?hdrys*cy;c$rcPME!vei+M*{{Z5_u_bSTN|Kp=SW-j7@ zwDZJvx~1|3e;xEsL zw~fAu0#!I_i6U(8RgB>)!-2{HClRuD574A!fhv&4SVh6Z@-8gWIEJ*Um?aWWkGqse8p0!eUpz4|+qnx((s| z&4dD^S(uD??CwBz6do8>uYZBymS_6{MU{fmk%1*NfSjrK+9lgEx14bmc}duw*<=4P zZjWVtAn#pM$guD6tE=b}-q2wC3znH}L=m<=j=}F;j|5X;N2^~?{&pFaY@XX2{O{ui zwKYeX@%`~ALSaADe9@fUeIcB~1T_|N5o}j~6zw_%$o&>mqJlY{ud-S?ucZU#Q6CLw zC&1`hcyZ>v5;a(idKaa!7X_QHt=L&n`qrM=cdieWuGuFH4KB>14@2y-M#h{a59oct zmf5sQwi+nKb_OMh|j4+I9Q>&i|Ei7QDo`MQ!HN5-d;{ZKi_G}x4 zTc^lkW5a;~*OPG~qo)-B8PedJzuCUCzK(A1D7jzWWXVq(sll?{Dlszq+XtdKo7hNN zBsY31N%8h+@h5GKf=eIWah3;e7|jdPd-6@Z-ooa0gAJ0rE0&f3e{R3?`(2u!|1i;2 zRE7Gm5HL;2wS5@q6Bped_<@cqyjz)l51At7IxrZZUa!#~U@?GYs}brnhpQ!pgOFO;m@Y)ZPDnl?}$$c6H^n%I3_1-#^#C)6jBT{2ip0Yjj&cdvV! zH?h2W9{n?Iop+Ue_J{D&nYUE*WR*!L@LpU4p076C`u8b3w%uhGTT>7C;@x0|{rxJf z#LEq5%yMslpVaQc3m_ubTG4OviJO(7+j7GMs4wl_!a(Ko-ZV$QS&X1Yi@MyqrDSA0 zWpu_%aPMU!zR6F2_J2D!R`KJ{-)8uJoDQLkC>V%CUyU?*4N@4r!7Uq;Qd^^TN?FUa zQf{2M@Pau>eLp?IPJI&&*Z4Yy(&n`~+~yLddI&Pr6}e}4C}>l9B-TpEc+0g)2(gP- zy^mFI40z`sER>3Db58AVJ3LG>D)QXP_2_yAXF8wjC~WIZHJNtl@3d_Fb&u+#qDSKA zO4N9ofKKE~yGD!m50em^^h ztEZIV>8OVN{g=PlZXGfwbOq(I_}n=C*FKsrYw103s+)cZ$M8Wg_f^d{MMQ#>dbI>| zt$vxVK%ZZVND1!FK#FwN;EDF~edi{aCFke4E}*HlZ`V9KlBf^Z5Ktb|excMt|I&@N zkdti38mnI-_xzoSpmRpeu-8zd0uh9{2eRPi+7Zn-`Ae&TX&sxW!Ah!lY+2-b5}7|6 zOw&6LCfd0Z7cIBZj$5%;gKpOv5h(c7QjN-^XT6&it=Mm-?vKio_T4c@;^qOgoj{^K zBy`a;Gr^VsT8_pP*#C5GMN_`AB(0~eH4=UX%AwT{aGc#9G07A^pliklq>H-`7Bckl zAc^(uvOYp;;|RG$mwIybi?Nh8l2b3lyVHlB}X|tr}}{H1ZZMc z+^&j&5w+**w%bD)j5-p)lNi+a(C+V#1LZs%)upuW21m<1SQz60`h$Yqo(KHJHQ2p& zNfAtc*XhOvc#YO~oiuAx81kEuR)jnH_8UujxXafPoyi1xHr2SK^cJGv3n9bf!=JAl zDG%eMJi7YNx1rfX3`y$@M@gtS^>ov=X<iyko9Qg7e`Q0S<>Unl<8yu*Y3ea(>V&57pYOu|%aL{oaobCEQmK(?J zo{G07mDiy#6Wa6a4Rr2peIC9%T-7I8Zz0|cLH#IS0AGRli1p-AN_vrc>&L-#^%FV| z>8T(${i?8gKHNlqsErkV+UUAyHayA=!ssUwDj2-@O(0^2y(1P<&(G+yn2>L8;|;X4 zkEN^o`tO_Cw{?@_NRXd*LPC$Z1R$wTwazrOY~16a-1}JtJu3O}1iY^}=QUPhhYN$8 zs~^z33`4S~jiUH)xZg8`KE_F}|7 zbpZlC1ak?cp5Pt=3D{l8)H!|oVQL2HPj!CZ@31pL?QDfOPF#a=Vdzt*w;@U6I#EAr zY7V#O)1EYv`SknRpH42!Q5fhvlc4v6(WS1VTNfxLjvq<}s|Ccs#c( zSj*+-gtPulcO6QpoB;81o zN*?@L_8H%6^vqJi`86L^v-u$sWUclPth1Y6oph~wqf0(@%M!t+^@)-Vl*m(I7qS1I zO_6xljT@BfH!mg%x!dY@r`%sMg_~kB11-J{Pht%xy&LK?SzyF7?xX<91aXGuV?6Gf zaE=GXcH%rBd$L+Bl8$UryJ+qO=lGjHj-OU*=$?pCht{O3l z<$vE4Ic2?U*j{Kpe|w;(A50$HQ)*nNb_0A{pC)mk_Lz8H2PQIMIL+6l)U zfW~X5y0Mv21CeWaW{6g@Tk9qkcZb_<*w0(!D}GYsH=gtLhSn?Cts!_Zm4Kzo<)_^^ ztyIJdF#NpyCT4+ncbAvC^~X#iB@19GaB1nYoFTh3XNvZDwK>O}?co1CvCVKKSa#CN zAaN6ZnY}e~-~|u4$-@8^@3ZCmR-C8Vqevbv{U}Gm?V!tLxgTX#m4sXk$LkBUn2asU zH2I}rf^p&{_?=#X6Jf?s`uibAjexv*PAbC{Pcf;pR(ix>c^+Wf+m7c1x zUp=@;qqRt0B^Ys2F)bDG1Q4XyPZ#9s*3&n0|D3|A{zT4pnYsqs=aC%yuL`Re4=(JJ znW6CuSnbE}QfRUgx7@;4=6CYiwPE-Wf$4Nl7%~)@Ih{z=j%!|w&NnjWgaa2rcI%!q zNIZ9Oxk2KOpFuj#_b(x*7hJ4&48ihHJIsg0g3aa&l;nnJc#G~sqi>_iF4W59n3Pez zJ|L}i>UL@ZC<+4uJVSA>e^hJLd_3iD>gNrXZTq}vx#2B*IbKV;skn-6Sl>V1$OfH( zz&(5PGsrYUd-1cp+Ii0+Gx3aPbZ<6`4sQ?!-7jLzL9IDtJRXQnSAtd(I7@){KJKI< zn$|mJZCXfC!fze_5`69|y6^mLx099h+e^1^#x4}8J!;B5emlb{B(Gkv=56P&xD1i^ z5q`8yI9(H*UEQOt{m{8SpiwyTe!>m{Yxy%p^*kI&4~dpha@ZK+$XhhzquooeHk!;{M_ z`5~adHaQp7zqc3Fs+<%$ytVGQV$^SeowS=BLPHd9&|JhTGwN2p_eA2xJfOPK+teRd zvX56h#AL2BTe_#tdcE+2$kD@CtMpHKJ^MHUNdD&9$t3wLc7$mdZ!gAb zMo!pWCzzrfg9HNf9kt{6yx~<&Y1_qb;|&CX*E8B#$BP=e`FxEB9*Dtv7y_lt zUi2J2A{nJ1_xLKzUOOLasUO33tbH<;xL{vUL&n$E}ihVoStyL>S!%N^6+%x@i ziN1PIKY$1^y9k&7`7!Xg8-Name<|PqY;W&}(JhwfaGcmR0ChWk0?E0e8dmS)udhCu z-z?x;6vU9^DctE-Qh|B({M|*opFo z04pA!P1s8*ke}9Dr#SLVj;Gn(wlJDxAqy$I$;;b&wGS(Srhjk$(3uW@(+4o1jCaM) z8!V103smcbmMYnI0hL@F>~mO{{yR~wr$33aUy=>scs^U)Hk$doB4Da{qn1H;XaBV} z>q%r}@GjRb!N`}fVOGTdVcR$UN4>cNw+LTqu6BvF%$O^a&a;iM(A=2_?<3} zja)sWwh8i@B;Bw}&tl6M>>5>gYT?DaQu6pd-+x1)YbiygU%$5R&qIG)Nk)kxRqtYA ze51Tgb$xA2YmkJ@o{Xw9`%d?ZTA$p=y`6qK%hnxPcA4J*fV5TNbE%5?T6Co|l23_m zx7Vt4V>@lfJ?5Ls369C%QoF;EvgUZd`a8-<_cz*Hf*$osu}2YU2UmTO@f^*QGX1Eg zZ`Sg=1-D5pwS$t+8?Z9aZ{POt3<{Q)&p-)u%qRnFb??~M_NjXrPc%-NYFKDQLH33< z7onB6P$?7Z>p2tcJr@?g{}xcJ zT5Q=& zI84UjL4@mZ$gd#x^-N*=qbM{_qPQE%j;${A*S!KyN zynd6X@M|iRFKl!;0;U{|2>k7-?YEN`NFfpC*Auon3Sb(t2j~$X)o*K8KD1vR)0d=s z^EYfP-^Vu@O}Kp{TrfSdnm}|s*IuB^IL}!H<1lX^Bb4uU6?|NegWN_Bobz>n^n&`V zMAumhr&!>z%6lq$6`7|_D9M~WzVR4MdF3}bqA#Ss25V*RYlG~j^?J?zs@Sbc$M6Cqw;9Jw;*>K^XH)?_lF{%GkU*FvF((rVOW=%1#4LFd@3TEhTbwQwdOPTO<&O6 z^jR%Fe;WM0{^$e^)X{cpxI0!|mw^s5Gk3zsV+CpY(W;e4D?AW_P*>ju-FG@pd1{2% zZBMWHd_p?xiKWH@Z?w};T!_0rI63nTlHM}2Y>K}ba1i}G-`K_fKshnsyve)s-a(mL zEp@Sl_tv=N&TWv+AR8IV=n=p9aNs+-z1oD~79`il&{|`4*8m7n;EpWtlMc;Ar?{U8P5&-{<4(>1WBvJ=StNTRJ4#5AV%F%aJa|Sq zXBy}{RJ6g968u=JDZa-IFB^88a?3bKl0xLHm@AM%ZK?DeaDlM>IGfp0^{~KfJ*CaR z$H;Yny&=eGK;@-ogf7I`P$PlCXlJu!v+p|MQjfi{kvRfJ^>{tFMG30M?6IEKq{-{& zl@T-l$uIMY+!4&d;i-sV?Z0aN@v(=IM;LsTXV6~a!i;})vzjOr$H8^JWb9x}rf%b4 z>>1-J5=jWGdqg?f_BOt3N-X6$)o%s}lw=#ktaw_F%zVsrOy?=FNE0m%%ZkC_*J;n? zllb(^HRabtulp$GiNXQbKX%xRfc1#uVlEVtf$&2~Jf1Y~P_gkjd6SG)J?pC7y6n(WTxRgzCWbn$>DsZh+f;0%i**DaB8L%PU+&i z+cUtVX{`UiuSTy^u4zB-AC_#_^C!CcE#k{5vdXXX^Cps-OHEhBUe8%+pI@c?{rI#0 zp>q%w{q@Br42haUt&!-e6dvdDB;o^?6DJ?+=fVVoRZmK+xYIMzvkT_$N6g-u{ngI$ zCRx+LcQ)`4AdE~qkCXuzL!FPutrAkf2gUI+at^Qt%Y=5eEcuYHMz!26eemXBqBwgQ zCTp0V)iG7!tZ4X8b2HL{Ny_7ACl9FIyQ$jqHcw?3{@nrXJ9E7Br3Mgx3iJFOYOnk0 zkVC~UW=cJXF3h*^IHvPg#{)dO(x^GwLpXa3G7Nt#xDr#OX}hlN=yPfR_+(7vpmgXk zOZdwB`PtPILHtx3b3@0BepXB$Zpt_bzCOP)@R@n2CC}my!?nnw{%bF1lI>|VqDv$F zj^OL7J>QC^@HHd2Ha+x{56ETxg~CL#ZZ{2aeTfu|IuSd<5>8jmrv^JFsTJy*iNx@0 z%=#~72N8Hq7>m*ARm~zjtnf7_M-b1H*u+r{8ge7dkv&Z9W$-$OwZY!!W}zEPmC$`C z78ReT5EAl8zLb*$$suSL5uPDTt|`8K4_q;H@Leu@Cm?;s`bB1ncW2G)<|wd7 z49OJHa-J6G^0zo=@^4TSd2@36!sU@^ocDmS31|Y;*V!5U+tSRZ6nfD_cVKu9_28?-XMW zAkozm0`t+Te+o9y-=d!$=< zt>d6*el;p<>e3Nik6YAC(ai(Kf&FgYCLQJZl-k)`1_CMoUtAZ10suRu;9;A-AP~RQ zb&0v)EctY-$9}tYUV42brTLudS(T;5ZCnY$2-t&V@8Y*T7vWw6-}EoB$mus|%W_lB zfs)tNns)b)X{KyyaFjSK$Imf;gV$xwb^h}WSv-wE_Y3_=tmjGgfK~8Q;Dphgd4-w& zBnc%~d$-Z_QIFDgWlwE%2T&byf0{rl8{>|ieY)On2JwHK}T;U)x$}(~&kwyo+ zy?rR^fLAeoaCZMTJ@Kf*`+`^fJtKQo?zDflwa+fPJdJR!9kaU0ePpX%cMdb8hE$2g zL)d8pgDGv(I!W+uiNw*eOr@t*r`SF-8$3VDx}SCbHPA)B6(9!7ChO*P2VTP$pYySr zngz=8;@-|kL*0g+C{m;Vz9X%FM>+g1-(Mfi$Xj0U9mDB!`1Q~9VXXmD! zel5(#TS#$}AJW#2biN*T3-0gtPPlBN`1JhH)}IMsjQH#&RSe~M8@Ivh$Cs!Nr*?NW2mmhSY_y(mr=Ns>PSCP!@EgifBV6WUvgQ0)=&gnf1 zXnx_pr_#Pl4lXcEre6reDn$$yMZLL=71;FQH+X9iC)Jmr`vwqcn%0;$bOGn8JPq%1 z+U)YeiNS0l<>??V%!8k~;{DD-@KURRxm{q}-M;r+u<=gK9CgJ*B)YfFBIaP5^}gtMBQqUJ@Zf#BZNrh8Km+UJY1|oz9F6dFFuSo`6!)KJZR*Ei z#aVb$m7(qK@TeJ4iWM|^eScS%8TFjq-gfyjhJ)^EXf-){bp?Yald6L3tFs3>WQWc* zR`Zhfa|c98v?&w!OqHpwqiy?T1MIZeA}gAOIs@E%vky29mslm)H_$+f4i04}*X86a zsPQOE=Ey#+@;Bk?J~zBb(K1(Jo7r#02Q^_@^gym8 zB;feH-UH*E5852rDYvifcPJ!_Km_SS*zekI3ps12>vLb3bV#sWFvxda78;q&<)upB zZ{e;*TK~*4qcUU0R zhVD)k9!!D*9BHp%@iWQ)+z~W1h?nEtT2>S(uSeGvNmspYn}75_{ILdvN$NDKS5)1NbZE#xc!@EVyk~RKo zweHoSBK~ux8+I$3QVOZkZ@n)x&x4Dj=f-9y$k|*_sq9I z-d|_gnVEjmy7b3%vO5F4%hPWhO?@RZ`A|HBj0TC9?ClMsFRHxenQnPnzR16D%U*gf zHDn%s-lwVPc8@GUP4MhD_Zxx=P!dZOd#3a(*Ht3>RA}5D>w&EEpRlJXPeSQOureyUi*T=NlPZj`V23GzUH=;_WbO$#e61s=K zUhz9%?R3fNbHILA6@I6&F!*q}rWvhImsC+Q6iKmyue`r7ku=BT$|KFL&fXy z1@hyo9ujFL8NHt3Uw_y?oF)KvG$RFcRD|b2`BYzQItp3e*h7s8q_DO^#FV8(*3Yry0?T9mhWsIQSS+QWZEBY zB%MmPZsHOk{C+Cop-%wDT>MI$_T@Pdg*`d${Ek-`$Dr?Zf16{%BbTpU0aONrjli*gXWL-Vu-Ve}sKbTi~YrtV~s*$fq^}?IQcxY!*wT*8Z&f)E5o7uFW@hwT|DQx^$}Q zc&{q6kRa6W$4W!z_iHEXw6QYl!O->3XZ`hS{K+?3%AWFKoiKcs#^RD7Dl9p=^KoY8 zPp0Tv$Xgc{qW2lTmLp1VH5QEFyrKMfsq7cf&*FG{&hvW-d3!3gQ9PdxSG}+3@?kF+ z<58lbOTJJnC_gW;7B-^1muTIvxH-KM@DjQ5a@+_QGe$SoJrDHyu=aY%B8dB8og z9LCk%b#L&AkvD$Fr!SB1!u;Ov5~gGaLYUuu1HU|1B0N?@>Qgn!BSP*BlaH6p@0q!{ zKVcR}&Jwy|T-HNR60xE}FO9TWcoDhD3Z7wD%k@gSbWk``5B>DhTPKy!&Y~A?egv&t zgWuI$mQY^Hk)g;fHwnS<;5;XNBS=&p zB7X+D>I>J`kbiuhA4Oxa4<@j~jvqwwTIEjwG(}f=TZ*U#b3K>jyh+kCr<)^husZVd zxR`#ByLYA9>1nEWi~qhwDhtsB{Ov+dS^*@gE@T{3^6vSRyS}dt(ep;l&%!sVXVmz zc7NWO$6u}9BETE0LeD)S3TcLSCs%CI?7LVhM92r7>yt$eOi5SQW>3~?tQ|J-I$KCR zHV8sZ5}u>*v%Uxp(GArxmrvGIwW6+Ezw_i_@K_JchY$~*Ipvfu8)`|zfh+D$CSjy? zBegnT$)I$HG1l)<*K2C3p`YS@!s#KQN=J zc3_fD?M}a$)cf!E8s%AGB&yvuLqF>yZ}v*yIAbT>@N#y2mIH9<5Zzfy#NqhxojQjh z#ZAw3rAEiCKL2#=IiKTU2B5wjI*vTIl+=!)sZmti$X>mJFBohFD__4A#v;=VGcf%Qg_NWyWGpN zprJi6v!jI>22zWf{B{am=*NWD-m26V(GyuOX%9xS)#Q(ZccAon4R_vZt1aTb^${NT zFJlp*#p)QPT|XBPANKE)0BR{$_9d4+*Bq zWgf5BO1((W@Ky z8RbXEi>WGKhf5f9D06!$SMAP?ekk{Gbk{qGO^-gehYMo;MB-!rDzRWZC^vl=OG^@> z%4NnYH)>#MJQK4P4UcD9&r zTJ^G)Oj}XA-t1(?b3wb-k?5Mfr}r0wZ?dKUL2g&zc4QiRt&Gxm5~5>FYjpl-bJt2LT<2JtM;hX`qzK-iL*sS|9fwoWiPwCEPzHOpmkkK$aNW$aep_; z*Q_XK+)-#30S({Yco?}Cy3?J8J0_5uu`hxV+*&C#Cu5z#gmh~th|=-;rS&b!x;SGa zc9b94Z_ldnheMj5xs~H3{xaHYruV+@nR}D8-)Wr)x%Q`(eIH}=0i>D*{(XPfqmJV; zF|Z<}^k(27{=D@D=%B1+*TYn!_d84Xxc$_*=EwtjOpOi3qZ~f8T=vt>Kj?aw?D2z7 z;F-;qEL)t#ozJ1{s2Rr7(vHXaV8U)tGq&oO-~`GpqImKL%V4f&2jZd~5gz5?SPxc^h47 zM-eQI3@feF3N48^d%w_J$+b(5ulp_gPbe^*gzOq9A-JCH)$WOZt=3}z!X?ekEG(Em zTKzdAC`B#dRRG-s;{-`0Z!FNC4KBJK#x1+04&_Hdh{p|T&Jm$FP%f41H=TEO49Da69l&y-=mf57bFR~?GbZ+ z4#bY~47PeEj-*DyL)}>GyfADDMm&n5z~N{6?Vx4_gKmWBokeoPE0+ha@$naq095@7 z%AZM$$2tK)MN;8j8w(a4H0D(_!9&W6HD$LaTIwVt_QHW$9E;YD2Z@ga%!xFv{`P!$ za*{lLVZ!RykmEB|+VAs&)fwkS5xV2rIJM>_*R>sh>&Q{rUxU9Vv6 zauI9z`f7(?@Kk4oDvx%Z)@8Fe&5R_ppyaK8)Uz592 zopO$QuWCtzTz=k)Cs%#lzqkHX?f2qyD@@CF76NGeGEvpsPnyQhnlBvBQu}AN9&L%4%wIm0;{L;_Y5Fk>)GUb7Laolk$6Wpo-rP*o0~<1vO|j z`LzPS(pBW`e*W1PyjMh&9#|#s^kE%=#(7^zX7?`lQ7-;WS>{c6f5BJgX{{lYvH{|! zFUQ3b!iG;Yg!7#@=WBlRrmgr_^^ALd-%86iw|sU&z||?o7@z{FQFz$*j*th*`Iycc z{=?7klh?D8?O!t0S-LE&!~JfoXux|MH5edGFSbV8CfDo$P5uZub)i(a-)!^be457g zSHk5&O5Mmq&=8!F%pXqZ*ZZW3`&}QH=s$4KC0qca|W z?dGvk^|oe|lV{W%uZOSS_!%}bHB%@hjANenLtya=l1w^++$hbPHh31W5)zPe1@ zJrN^x!IJrjUDf61>BBPKu#HxG_{ez38h2y)WoM%faZ;BPVFlOVJV&fLSl=>zj#>-5 z%@~RCt9#%)A+(`UkYv`zVbc>VdqzV@jX--%2JBse-bm0tnn`&lqnveUK?2D`l`fN> z`GhHqKRLgCiy<;qz-0y6oKTEZG`1d&+=JrQZH9J{&EcA z#-1dWlf1#SYJ0G>?>TdPWudC(BC6wJjL&iNhV^Zd5%E0!E7azZh}=Yn=P!QU&3Y@q zdY!l6rkdT_M%N9b)Lp#XaNU)0>`GkbV~LaT;U8m%Jj?w?KPwOVce;t`XX2`~U*z=$ ztC;Wh?lf=4DO%WPiznRdxLo6swF{qKsKlvFQT^wx{BtOx1@~lPtxs3)C0~r{%|YYy z*{;M*)v}MK>jsNS><;^WFc>!<``Z!ur&G>Ft2zqJJgwH3|M|9M#b|(aU%9b0v@@)o z-}s>~(Rw|^*X8#m+{`JQjYT3Dr7aGycF(WWSPyDPRLAP_tEEfFon#GMxmN`NB@T?c zIqfmiHisHz38q^tOl~ExC;MO{IcFj*y^UtBzxV!20aZdJCd2BrXqz9;-*jlu~ zdS~3fa1@xFkCxm}0e!jDE$WYB^~XLx2U$T!)M>Q`TCp8A`=r@p>j zh!M39bdVjEip|j^Vd>w-CBKg9&6dpC8)XvS?<8RbtW`X(bsB6F%|v~#VQT93^#OuL z2}91Zua@3V;j@D$;=)oNt!NDynFR6cWJ0AwQBEQ$P;#g&$Z=^)cVo*bS!;UzX85xxnsz#??l@8;tn$E8B!kIg~7u z&U+l^HbQq8w#^cY?>rgj`)6(+lb{=xon9vY2Ti#STx%~=)bwM#3fhLdmO(Jh_9_$&|N-Qo&gCw zxA#M2iaP|mH}0Qz7X@Hw(tT8z`7gVu2zX;VdbJ{ojFdu6N_73vXB7jZ9al4n2|rNH zO6`2_`7vxR!=KR1PFdF8w*+@v{`d}+E>JCx_PGB7YY}*bF`ga zc*iQR)*}to(6pc5;ZcK2Znt|~-9OVUzQc`6%km2rOaC2q^)xRunTdti!sUKk1-&RO zpB{w!`CJmrp(7c>%UMrK!qNwW)EzH;xQpATqn|kRP}uL`0~O)=zRRnc^McoGC`(27 z0@*PBW=|8jtcqsv!4)lj`XFP$pi9AyXTo{)-Dlp1<}6+xX${Ji`IGPr)7(MYR!f+k z730UB%C6KVapns{ye7bwOL40*O_tvns!VeulbC;hATX)d{e-0F0GR3X@^Oe>vf*fu zp{?JnshYw>)OKgK?!(Bd%q?{tNS%)YIQEk_A94hvY#Y{TW!Bx_@B1fo4c;_@+Mz7a zhN386#A)WV3D|^Bobge{psRkuLDPk?fv_NmXSUw*-qQ? z{JrY|W?B$c^Z-tZJov8G(ys5zJ$z1@qiGz#Yq-#zjf@ywkoFj;UA`U51!EjqawbN7=EIkn{@$@Vz?T zzgd@6Z#XnxH!2hdtHR#NcVk^=xaX5bxRugCZ6{l zfzC~MEVvJC4Js>)cNK0gJ#9GY5Q2Oh!rfVql^GmeD)$}my5YaO}c6L)SNMWK;bo8Gryc8lLkVt7jcTJKI$ zuWBc|ysG$L05e_Uu^sqQ8deo zm(+1RJUh^}WRAt(Hj%+jro<3W5KQacOyDiNuCgS!d2rTSKj>;%;n7?3IpO`4IN=cN25%4joc>`R}wHMctaz&|QM8^hhG!kEKtE*jcV=@5Q^; z5(%7!ASEdk>Gb!T$g6wa3?SApX_wIhXH60a41A|@dicFsYEjZ}B4`X62*MFpFDb(P zSU!i3aAAnFvr%x6^XXA4R?7^S?$?ee(p0Gt$^uY~EsajqD?xC5uHGZCum9#feHS{i zNzZss7a*b?)VJ}wJ7&VdrR({r)0BdI1~qV(XxtIk;k+-3oS~%Po>v8Ek$U;vAm^33 zaUhSpJ96Vs#mf)eBy2d^1c>)6yS9{E0;`fJ+UJ%0{LrYnlH=8~ze2;5B{E? z`AyG;X)~*GEVN>Ly?U_&!uZEDKlA%269@&8@4L@++<;x;oIip zx{c$~oO2~L#`T*rDfsHJBz!Xb_PrzkQwF`-*;;%)#+M@O%u@G{a72TkGg%58I%Wx@VBP(opdVWi!Vksm@3-(YlDZXq zw36Sj-ObpL#<1c(geXlU)r8lVwId;=-^(2mN+Zu9x<_zZV0)*I4D^ai>C5h0G$)*Y z27hwSAI_({rvV_#xb*xkW!cWH&x}X{ojA^_6IC7hyVP94KTrZ>ixki>9_%`@uzsR7 zQs4L`|0L(#ol@h`QehI69B4i;cxY%7nIiW?)FN&k&5yiZBfN!cr}kkG_fnzlzKB7o zQC3108#sgH!V+IXcH{Ra2=X2nJ+}+0bfICqtW7j33g*&IFJoeeWL_BC@ovN_DAEmkF_Q&x7#oB8VP>txT^mUInM|$<7YZ@4 zR)ogZDBmPbBz=acJV&dENl~eP(~nO>=G$>pDD|*39bFYdp%Nt<{j;sw`5Af0RhM?^ z*A%F)hf`957kqSy$>RAV492;dqdM%B6fSYHhP9 zq{sf-`qu9YZwV57PAm%PWY(fMBzM{rJ%?~rmY-zHYu+)BYD=$i_RReSm9oSMGB)Bt zX7L#+H>nNxdjedzcfIoYjoBR5!Sl+4Pv2^NuX|U{l1r!u`p$Igx=UJbj_@8$?FGcP zCoF#UkyA*6@J-2D5!0}`AKa0B9X{!MwJP9sqttfxj5m&R&BoStQ~o4RaNSQg0OC=- zkpO?bn+nA_lE6&Kedgtk9o+6qPM%xs%x3Sj!#G$J5eXDz7`p+{PI%5bVIFJuxUd() zSGq~$S>s_D)a`tT(>r96DfTFrZhvSnv6h~0@v)?py`vx?jj1ZTVQd!vw6sXcHV@f6 zPbc*0h2qM*Jx-KQ{vizEr4^Ex5#XSQ%nqW$CE~`fH2N!%jW0`&4m)t)hC>QGBqI5( z^#;Nz(j-e{^WAV|RzosI4}yCg_4A>4cYT8>^Yh5>PDm6}E3!}i($Fc~{BUkACu_t) zOy;NK_Ef#!T%}p?za9&EmGxII3K&Rl$`(qul{cu5_ib}LdlS7gZ*R4I3l(ko*>SCW zVLM}X%0CD;-Ic?788b-GCr$m`VwK1gL}ZqN*G+obhX_^1e9L|wx^L@f^aZU0mYW&o zmyH*>$>JnJak-SoC|WSoj>JO36Tc871=GSoE=dZ{CX*;WUlA|ep(nYTUWxZ}T{dxcH#ODDc>WgO@ub;wKIPQ8VQ?`Y7gE@+N=w%n zCkKE|;WLuD6L;pzfCMrW&WpD^pCpnDR~=KPjK4VLyY?CHjcEq4rZ9m}M?);YYaWb^ zpBI~s<7tq7rz}Wph@ye);7m^(UECiJ%7jn;8wbZlA_703-4U32QA&?}U4f9s5c*>N5&?~@v zOKB1E7*~~+B(_C-Cvb6(o$_8vAJh2@m^;Som8trwtY5~GDGokZ;+}fU4cZJN$NDL; zt!!v!l-GCF*Xp&HkeR)#{hG1_bP*&Q0eRmUH_eQjFFh*ru`&fq)}HZ6SF z%EAT(Mda%S=Hu6-P-?$#ZFi2tE*5|BYO)1$8npV&v$bDNwKY1C5=!xx_K(fz>3P;< z$BbU#RGw=%kM+wYC;FU|FJvrXUTGVDpTU*OhC(@2XBVo&FW!6nob;)v7`$;6=4>72 z+p|2>8&j>!>GeoDKl$>z#NqXBEzW_YHy1kmcEa<=T`Bcds%r=P^s}wbVz=-;CGM;) zLCb}HcKZvE-CBB*Zs55avt_f2jAHs^@9@raQh7tON}QkO9%z?M*Bt$?Je3l;M+pfW zhw6sr+^*Ngf9DmO+X&54IWnA zghbO(XWZv^w%-xIe=nylmU9woSSQg&arJmuv?aIHjMId#z??@@LBDTL4s*xh@!Gs|9{fH@+{25ppUOLqL z9-Y$fQMOlnW)t9+$zfj(sfVolWkgL$Ztf;Fo3HK-&vvz_qwP@|<5nI8`nH}N3Zrv2 zf+`f~|K|QJ$`DfuKEr?CFj^aDWB~m6%M>F-XQ7bQUE^7^E>8qqwWpH}oPl}Pn^aFf z0Ow-SR_{5z#jgG>yW_UsRhjo<@hp(oZ|7>-H|K#P&3O)eq}%>Em^r?3LD)N|Z%M^<3ZB3FBNI%&TQ;{4Ir7ndP^HYe{g3-%ZiX#ay1ub{`*UfY$KjX?}wo zX3=X@IgMCr+ze%q`7b1{{!sfQi@sBkf%7gK2{WYPTO(B@U9PO>wCS(D(2uR|>l*3t z#0}$q|1v^)5O-;AkJ~Zp!-d52h5TF*6}c1iT};Hf`B{FSxIy*yr3g^{>BUM^u*aJU z(qfMBE011S^qn86mXw)z@u4awnHbF+zxXPA^!Aj7byz`bt1Wdfn&2jtOg*%r|2F2m zK<`#qt}1&Xce0pEETI>50eAo6?Bx{aYeARfaw8|~HHmKIq_mi~LMfPcz9Bc1uy{YFgd^8>ti&w_xsOtH9iT03D zK=i=l@!htcV;R@N~B~;(XfDhLAFgy%~oDsu}ad#~;b?zQn$nltR zKh>cTa+e-fgZh=~@s4$DAX1yh^ATyB8=2X)os?GZN@DeiR&Uu7CkW415Qy#khEDTM zRM;h7Oi~bI+E%5GCr2bFH+&n>-H_&GvP>IB<3XaX>w6J4X-Ue(pkgPR|sUX-@o;lSnaFj!z_FPf5<3{-Wv0gXF!j`up7TT4sF~6m8Xx-9k}(37*2rc zbEi^keCl>V2`)$h5x8v3cd&8xQ9-Dr1XKod92u!v+6* z8k?N0d6&31vs#BsF@x6QraTbq4_W`}CF#g9Y|4V%PbCC`xX@4cqa%@nv--%zcwfH_ zo!#Ht2A4D~+1t3aGF`pK5k+AnbyBF=4YC4 z$9R6{$Zm!kjfMlxrX`8rcQP-kdJA9Em*A7Kr=mt!3lk}uvf%TdqR{dX^p?K_#a4rq z^M5@39WD2>cM=#`ZItM{4`p>^1QaAMTD3p!=Tp&EqZ=Alg0>mlz1LP>I!7c_w^Q*k zI41{Uzw%bRe-`2iocCv5q>J2I6tY=Y#YRGGxz|s#>@x~#7L_=d>XM8o?uloE)vS28 z6c~I-snQ)d)GA{4U8&zAzTUB)?@C-`F%K_`2FS~OM0FS^!=cTiJj}?cj3J3m)Tn44 z9(aUHIoUtGWww40H$9dGv&;wQ#**b8OGEy#9+o0%dn1QT;FgdXq<=nA%YR}V$Pvxu zS#;a&)QYAbdhN1%wfKl~y4+mOI)$o()4Q@R=s5$a_04@zS^|b0T&MgkEjFX@<<~>0 z-NdP_ZgQ93>)UpJe!4*hK-ptUhR?ipk~#80CY~0b4x$e<(WtiA{zL+3c&x5l{}ma*!Qy@2gy6johKNal z_p6Vps`&3m`TOdoeS7_K3_2~QBJ-HuCOjJ=@#jKKeX##h@~`>!$%UAyU!|_jG=q_p zlHv$LPF{k3zP=%#rAN9#Y1S=I4hlzm-lIs$ui>H*Uy~pr)d@w;6ene7Lxcgmqc){c zywxA-R4FNh;8@;l@9`{dlM%BG>_Zq4DNRh>cgfsqdqF{WCHjw^b8B`VUV<|T89aZE zC;I%0L2qohFoL;5!3QmvhQ%z{bU&W?cStl6 zzwL|bdXMXMy=u002;wsHsdi8jZ}bZge5glp-MM8WZ9ayl8{PZ*3f0GO8H?OEaH`ip zfGz@P=+Bn6y&a8L&!2503r}~pUk&>U(MMVmXk}o(%$K}>al{dQlLU*bgCNAyTRg^% zt(3j~%`KWBum75n@;KdVMZdMF!0#alO(rzIYa_6W4X0LnqwnpN`(XHRl)qK?Q&FnU zP+PapPpaczUwGd0S~)94x+z`kc(;z%GKk>Egi=Zk$4Cp(dyOouuS_ifW(1?z?@j%E zyWsoHO;Mw+0UH{;R;7Hs(3G3TYrq%`DQOn#V6i7yptj$!XmS72bot zB6jxIID+LMD%m3A;@yAc$cC=oMmDNk#x5s6x(*ou03y#CaMosaHxOrc3k+}n``q#$ zcF7NE3~10v^sC>}{WNdhD@%Mi3wr?YYPm4q1YMQauQ@u6Q173Gz}wYTqVfmsefU5q zrw7VE^M*+Mo%|imYv8NuX|ejC%=IsPzG&TV}}FDQrY_-3r%*LXR@ z#}u|6gq`N0`6nIL{_|O0_W{}~Tc(?d3*DT$(tk2?dvi~S>K4kS6~jKixsCG$86@5( zD7?-tAJ((dCC;qNr;cVd{gNyF__M>A&cv$X7ei@VQB`Ed;VqqxE0ock8mM_=@x=q9F*c-$NMhe~&S z{n12`NB*w2kO^}5h&!u*%^9T?F3|-R&WjxvgKGI?YDADKewf#h#M!v|xu}Vto{R(X zdYx|8UENjt2EHkMgHxd0iQ9cIc}u;r7L>*9Pehf51f{wzK+BDt3YHQc80SgAO3}qvu>1iE;0!hS#%{_ z;`j6jv?{4%w{sM$3{gg>jr%0dJqg}tGmoYb9^b~DlrO5lNQqXEOP6VvHy@n$?>&4_ zC<%oal7B^^mOSKId|r!C*nd?)!iOZrj*)f` z*u}1;p58UI!#b?=n?-meal?mL4O%wuZz2>++S2_eDuqEbH{eSlC~uPC2j#+t!}W$} z;4MD9`h@8}Nlfqwgr?7HAw`$8XU@zn_@z|$tX}=>vNxdDZJ|8(jNQ-qlyTa#f#lh! z2#@tjOA&U?hV|JWFAu?6T>`;B9G&FX(i&p(S{hUajcvp(47PZy8>lrhB{Z1=H5{dr z!BriGo-Esq<^8LG^3WDWRlqX|hT!w?SW%5h%^ zFK}+T6mWo!hZa*-Njn0#uGkj$N=)tkY#te*ZF^sgw7Si~(J8L#-8@d4aeF65-twQqnP zS(xnJuyaw^n{8nxdwG9;6_e6{urpA3`$WC+)JhK)Nl}tD!W0Np_$UUWomdN_jhER= zUD;+0b0S7)KeEHNo0H)TbkdEv>B;s|uD(_YE&SM7p zQ5kuwryld6h*JMPE;L{!wvv17(^b^od2!CqSp$9LRENvgSH7w8gbAhKplk0v*#Zav z8A##`@v_c6;4wE0O7H9`n-~8NM12FN@JXhJ0bT<@2YdiKyf88GK5x^$d=X5{hB4Lc z)lb~#=Yq?|V%JylZIbc#C+>7rlBq9aVI4=_(Es~pV3pj#N zLo(ORW0uYR@coEff!eh)UeWaUlTg4DhXo9j&zrch2Ec%&`{rQ?S%!a3B1WiA5BA zkYY6Ss?d#H&8eEQSbggR@a{9VhYTT!6+d5u1S1|Zy~oJl^=?AB+WAnzmXC@%Y1#Jv zAQf@n(;(IJU)NEDLDyHZYC(3lJ#qA297A?_4@x_a#B-gZQogu)@X6TyGbWR3MAVFN zB4JTyMRQe!@HR9sGlBx3+yE4ytQ^Myt7(cQ>0>jP!=R0Ccpn~GL@Wq@3YRhmO{~3m z2js=gOFxo{#oqgE#&e)dBxXeZs*Z5^|7{%w+GW(@54g-O*ZJE z@xK0*A%KP?db(AgbE3@BUu$l2U#-8!7|KuiGGtG%nvObCd4G@7X~N+^mV&%;CBGL5 zaSEqLI*1pTd;mf3&Kvo$aAHnb-ka#O@Mz?6J2f?3i+?QLXLMB6+5q55u;Ep)_ujqs zel1r_pCpssqataONoGE)-3crNx`Miiih{ zUa5tX)uYX5kp(k1FRQmHqdQ;C!%Arx)FKXd%VS&WQZMK%PA;)er(Rvx63HCJFQsQz z=e0-)+Llz-QQnxG7Ocoi@*2~Op{CcoB2B<@rft3@qL1p*GMlUrdX$W%+B*`@_L{jk zEj=%}TP?6Q?}z%*>w4Q7q%7!auJT^9y)|rFA?1!F#i_wqv@Vtv7TwU@oaeI#i_QD$ zRef$2t`tiO$GSqL;YhHop}wZEK#Wn10ub2}xHqMSTV&FxR%)-i!q%?tzP$A6jMm!X z#`MP8(ufaGV%ug)N?~?5Qc#Y7N)PAM~*b0vsU@1x9Oe<-&yTLygFA#BRbE67yI zQ~H>y@@}Zk5DTQ@3G4DtNO>RY#jT;z{u)SuEB%r=1ls`QonS1~IY9eINDGAb)OWM%27_0F)y zTR72o<)QrUuF~YL=lVDQzYKV zl3Q00cZSMh*%{sO`gnS;O#88*B)$zT6=C_Tz1B%q63OFYrO?>Cc4>j~BGQzmx2NPw z$r&uns;CeO6Uvfi%&RIh=+@lY^t|Sh!j!6pV7)@}ZH=wHsio0Y0Rrk#Rkv8JY;H8; zuPQ67h)IlFTGyHq%8j*q3sfpHp}^WoRFr&au{2ScbrtE=l_jaA)!}GuMv`2K(e_f0 zkEOO}L@m76H>FfmxcrOTqkSa>9l5!!J(Xpuz}9rDg)|M0s#)WyP3{k7NNOz7z=%L<7N50xe;b5+}kiH<01 z=_*g@Xm9K4wxKg57QUstF+I00Kh+LE3rj62Ub*D-xOY?qE9(1_B+3rQN>yS{P3_Dr z&#ANrtFl1e?rz( zes5}<;#L_J7gI~RE0a6}7Pl2v_ld`?&y?M)QKmrg$W76v+~&%P; zx306Hz0BfRSxs|WPB1y#R~#%YDON|KBa+wJ(ARAbusceZnm$G0NK0XDdMF-KST?&g zuR0d32`Vn%U0K{`;UzDpJhi;1*3){e9WF7Mi82d{i+W=Au37V{vp2h>rZw3X?&ii6 zdx(+>QOpg!2zoFzl5H1ip`p^!4IQER$A>6ZJ7OY<|E($s>_Z%MX`G+b7p{(5Ga z*ONB;mGyNC7B6co_I{+SSbeuhadmfDMssOZO?!UbEV^nN8hEwOwu5P0h6_QW+F?W_Hv{>7UY3mS&5*7ZbgO5`JYi zcSXXbUFnTUl^vnfve%t&5}&z2RgEi15NxJmYX zV@O(lZ@jRx!zR+E&Xm-&tdPLkBC&+M=0FOPdtwo5Cec^B73WB9Ubbj66)oF@-Sn08 zD%~52L>nz2#lpd&v^x84dt9KctyS_=G?wJ&wIl`A8S1F9%eBf3GNUuAva&I+tT9?p zTU6NC(NS3*jRaG2lz(mN7MtHt9_&+#MCs@DpeL(fPqd^yqarmb*_9mXu&=v4 zJEhachc*H6_UwvHP}iuTN1}$JuAbt)zKqVs=H%?IP*$j~IZ_u5R)jN>+H#wlQ^m6jWoIO%C|F>r@m*fUt&Wv6?*G^NI?xm-alo%!t@!Ca3KWf`%$EVtfZN46c~x!v{Q(pXPY zXGvCaOLII)f|<68R;hd3rf5B4t9SLAe6HOF%z8O?Q_y|P|c$3$r6b>u|iq8Lj&=y=@}?M%w4 ztnBl3a&mi;D=LdRl&o#&sa2f1t~5EXvaCACTcHk{35&xmJsG9`TewGnZgXdMvL%XM z)k_M(ovoP#&Fu}DDS5S7sWG9nw!~+~bGz!|wY}{PavPVl)>+1h)z#!AJwn)e;}y0=1cUx}ZBDv;ZAo?=QdrPpO<$Pg(q5tPs^IV&Z{#@X(y{PgsscxFeDg`U!Qm3nbD zVaC$z?^9c%B(1qV91@vlmqR!;FPv6YnA=dC++HdeuR5058V@#Q2b-e>r4=2$wee7L zwWRk6$|WMuzSywIX_RdRkP$*$>+lFr;V=^V>i>yuS%FGv@yT$?H6Ja*!Bkmo%gQSI8shC9 z3UdlFDjU)}713zPsSrRGZ-|B)O3UloEgi}VmmX_P3zc-Wxz!d{DLR+emt!+tj~Y#$ zanrLaQ|#odk^x6>W>ar&SbvP?M#CMEdP!?kaq6oJm$fGqWt2uLYI~*9iYxlwm?8kQ zE-7YuUQ#N9wKSTYCCvrNg~>7`WE8gvxe_{(Dobihuts9*wwP7^>K6CSE)_L{d0k~* zhShp&66@+J>dNUTG+)oNs#sCxV#pDV)6}Hwc}H1X3Z>4X%FNC-i83on?1!%mMn&*< z$6|f$=^5#1?b&@9;T*9!+3BM4B*o7!YRr(JxFxx^zNNXVIXy|Cn3B2%KOF2-`z%G; zH_03e>g{Nh2(3P)CA%cKC7#zkUmZFX+7qEmof zTT^u;r8BF#Al6f+B5)o(h3VCGN`kivqv*`{ZaTLht+}Y6y;d%v zr=zcsp0Gzft_xy!I)Hz zMyjl2?>{Y07G}1~>LZ0{eO8Y&x!JjyrIq;&QAKr>v*>6@QgKn@n$*T(uM(4`M~Ib1 z^YgoMo2q(q>e|W+N;0L(%_>xqt17N;PN93f4goLg2Db2NNhqR^Iirt%~VrWm; z3&^5ab9!D?*b`A>Q+ui)qROnyaDHKrEtREN70Kz{1@$&BH?|ZAjf|E^pb$*2ZI;z9 z%PzF;jKYj^1#NmlEiFY^wK=I78RZI?^c5L|I)#6zxf&}>?vN>5YWDofNOw>@yRtI+a#K6A`a(6ap5~_Zw$dEAq08zD zy{{=s?`|rua76@rI=hPVBy#YwJtWR6t6IvGoUT&a1Z;_F$jVGrNxQHu(i_RPX(1RX zE0ATaQ4)R`yUVINJ8H}8bDFz*dwSa=DM?L@;g0;ETE`hFbvf1Pok?<+)^}%>v{m+2 zw8aV{g(TN@=;DWwzYGaZeMHTf$3g9${gz~hxUK`8nhCCW^!s@ zXK$pns5077-cm30yh$EkF?EGK<&BL=ZH+~xcH=9t+Sbrl-V-V7NU>KmQ($epOFj2i zbi>lMYW+$(V2hP}Z;V=#G9n#q_HGuX*;Lmd&q9;z z+^U4t6j*~SlsPy#DA`tNQ)OdKc4k&`)Q$m3#ob>^+N-R<$PSPd>TM6TW!UIg)KZ<> zC1#+zO|gSES)6)u`YIbDT`kEiDdEhTwC=RpjCe3Vn$_(!s=_PT9VLe2yo!<(BXw(G zX-6o%s5I0NF05{o6BP|Pv$j8 zt5Rfw3HQX(N>gI;2H6c5t*FiUClO~wT0?S9xTY&#Ua9IxUY0ltOD3gFZNc_XPHMEH zQWn9SV7#|nCX~#ktg^IdesM!pkr!c|DlU{{b=o%(%E)V~NXv+HcGd-})ltdMj+WJw z#8X;IJb8-2_C(Q;-yUtT;F8)@Tb@x_F2d7luG?{LMSgKKnr?f3Qd^(IPwLk<+56Wb zmOrnjwK$TVlvbRYB5d65mE5iZv4n+fS;26$A(Y;e6$|y4PuX{y66)^s3OTF6&=Isr zI3_`CyrjqXYDtpMR>J@M%(i%CYGIkYHWj7e-lmB7X~`XmD$-@ZP_MBdJzJh{um5u! zdLnVVo>J1vGsAgi^`#B9(u-Ag^raQb#wcK{qc1tVC^;v!DZj10r8JV>7?qNvAlBL4 z+uG0?^u{#bnp#S0dc3KkE<2++t*X1FrnIN2Q3hi#7t7>-l+LU>)|!`JpQK)VN9R9# z4f7l8QBiq3R^Jo)CxK8y zS!H!rPj^F~l1M?*ywYGnLzOhw6=|itvKjYu2EEh%C(1uv){Lsum<52QB0H4I>T+ai z?pBVpqAM8BZc~P$p*}scPhN%kGz(fq(ZYU1o?z&LC{-0gTMTJ@U zir=M4qu*@BKPj`Jy|T8rthu9B8X$qKDLqLko#BS6!f2yilPUw$byf+NDmUdQsVOMV zR`V=UAljx%mRn2K>JAmBroSJ>K`Tv}V2TH)cKC!CW~uUt#FXxgj>ndzHK%e{+B zZt81`d1n!iq)Rc9+L9}-F{P(7Qs0>ql)TE+J-s2GlU$Tl(Hjm~QL0Q%N-by$N77ma z{&o9@$?bV*O0{>DHZ>MD#NwGL;aEqVP5!x|w6wxtcBw~9g+a~y`zlo@kbSnYw>CAS zDc;?aR~w5o=QZV|#Ttt8yL(z>b#GA&rOqbBwgTH%Q$wmo8pIl#tAbrE4Jsas`b_RE z>n&=GSJrgp#TrBg<@Oe~7v?r*HT0^r+S(dU?Q4?y)nh?v+#8D~OHrL&@n}uB)3Z@w zZ)IaJqcSCy)zD&kP}C|%ORpWj%{2w7Qbe{ig(7vzXQoL2+MV87988WU+kI6RjJ2l~ zR7bn=LV1OymEk52hiUa*@7ng7Ruc}^lvjF6C@f6R&2F+KuUC=BvT#v2Qz%tOSx&U6 zsl~31+9ZizY|w9O>&>#curWnt%Wy|UZhl!(eO_NrQBAXA6V>s&HN$SmGvIe+u79Rh)q8B7CrGL!lI%>FwD z0;f{SP)0GCXIaFz4A?0UIG2kULL)Jn=;cn{WFd?Aly&UCb0BaG=?vj^?&Ve9XDyr9 zXBXd{GyA1#~)A^#u;45V3PX9v|SA6AztJyR`VBsbNHc-H)UMGXvXj`V|k2Oyv1+*HfoPLA`nQXoG_!9zy~a4B?FHP1WqEEN+MjtBTQ!{ zzp(33#xxG(Y%ZXj>v@PtOy?DTWWdqRJ(tr)2lp|J*I341?0!rjFo?Z4h@%-yHGMq9 z6rN-*>-d8~$2teJa0f5)CF|MYINym(vWPO8$$Y>f7PFmQj@MWE4c0buGgDZ?S^_8d zE|gNnFvc^L1^hz7i9QoYQovO_%6t69PA55cTucgiT*ae&%-5TcCWMjqyQK4c~9*v!eNJ8oRZ9X!nYEMveK#t1H;hU;{myn?$flTT>baiV8Os!wu#B(Sz#klbj(ZYC#2Cjy zzTg-3KQ|Ca;|gx&E@rTRrEKGX^Ym#->E>phU=p9OiGk-kPaMvP6jR47+`|hjVdww& zE}Typ-Q3Duyu>?v%_;_6U>u>Ao4J$mEMf&)*yTd^M{2l%$C<`kd`!Yc<_P4{NGow} zXExvRE4y9nJd#Q~cQcJwSVQ7}^&bx73{t44nLBx&FBy1=|4*o2pLP>>`mCfuk z*mX$}BY2YOEa4XtE_H9`BC^P1C^0&?ji-2-&)DAYq$KxtYUtrA9%3%vv5_sDkgShV zM3i1ea~sd_72gs_`G5OqPvcC^VlYw0Fq60Wng6jzs_T*~057)mwqevfNkWG?UV1?xF9+uVRcYH8#l#xaZ4Y~)W) z3>km8m~w`3BQG$WdHufEuII2E*9#fcGm_i6mw7DaH@32Wu6q?}v@=Q%;95J@(24A>W7?9DHV)l43GAk zqg}vSHnLBV`5Y&cM=jSfj;YMyV-kwpBRG>h`nZi(_>Q0Y9aLg&PccnA$}6m3V5#51 z{#-&TdE_&M8@QFRjAt@0vV`9`sLYr^Ciyh+F!R{J77i%)eJG`hINjXB%gp9mR7tJ&c)eTPEA+{gi`z&P@zp!()doLMW$<0jXOa5e!8uv2J z<_fBaGM0OImKRvca#r_CtaZLQkTizU#tl5r>%7CqB-H75oXnYA#`QeFV?4(KzF}b4 z=Ou}DMl*{!e8onNuXmrLgl?YTRlehQj*S?H8O|L%#apaqV1whx$(+Vngs5c<_wpj| z@jXA2(C8d;G-;GjO^jAJ14a`-lX>{(T3^c9^U2; z_GB+C4j6ubf8`P29~qzUF&=C$Y=Dmoum!&M-#vG;i}A zdv$wWBcC{r@g6_0caLj>gUF(q4zA;Ip5}GFW)0iev)8}jAdNJWxhA!?=ObjO9t*;};UH^7%NEiz(n* zZsaze=LP2TAxrs_y+@cwaXuA{WE9UcpP$+3YU2?9p^7N&+{2^1#xgc>$Vk^Bmrza% zkMcb4vxIHzdX0WTAtl7Pg9n+xXZ*<)PQKQ-L6 zwMXA*OzD@bO`((?hVeKPn8JswW*euB_Pc4Mi5r-~7yQlfHyK-r(8N7F#x!2!TQ;%d z&AuNOP(vqoGMOiNifPQ?OIEPc7~?USlrWr!d7l;Ra*N}|z8uX(Tue0)dYH(Q%;HUc z=crr#EDc=EL>BQQzjNem=Cfongf4Dm7N4@2?fmO@pN|}Rn8JL1W&b-IV~)vxk_?72f>F%iHQwhdws8Dd*9|FL#z@99pAY$r zFWADKcY7wFicTJ2CLi)SJKW>`Nj_Ke2ygH<@AX@*4czPJIE_rI>EK}=plr%kK;vr+;z@m(t2up5Qf> zv5H+EG2U}2LulkCCNrDY`GK|k&1MdJ)Ul?OtGR`VEM^P4jCcR%Jc{V$E~c=ArTqpz zrq7T{6A$njYx$M+?De?c)2~K5mV0=FMf}QN{LO(A+_PxoPVQkQ^Z1aJ{LD5^p6HyA z%Lwjb0xz?Kzc}Fu$FJX&+B=!dyL?Ark~s?*G&7Dz`G_qXI$0m#xPF&t8)#(|ckvW& zuz_vtFva|d(2eTRKGi8DBp|588~4>6aI*vPR@JC1bnAQSn7b?pC)-$5lea~pT^AW!lEOIgRD zXB{(+Cz(c?xQ^?&muakE9s4||FLDYwbZ|2h`G`;Wf*qcB4#?$dCi4zU+0Ne6^nXHh z@F>%HjZgT4ZS47i<479$R8mbhck=`@_<~)h8_zkJLayUprZAoF*un`fTGyeCYk7ec z44UECaXcZa7{+5PW&_8(WL<*`C?v{gCNYPV40zdjA z&f`4864tZJEa#F!8n}j=c$Uvu#&-63#W+SSF&Asmj$fpw@n*(%NW4%oX)v~=wkwN zd4pB#_O|{)GARtDkCEKKBxbRKm8@kw`@Ca3A;Mie&UAiY9UB<*u46|U1+;Pv*D-@n z_>EoX>$@Do>72>g4B;m3Vlq>CowfYMF$;`a1Zig+3;Bq(?ERkeK{1tdb34znyx#`x zfcIU4WKl#Dy*$P9EMyg%*v3&GI9|jU$=%H14Sr$3hx#CA@?Yw>feF0FGJawsTiMPT z3yoh4pCO0K7(xfbc$5$Mh5df?*+{303C!ay7V#VVuhM79rG-bC$}7Cd`z&G^-?Qs# z=Zr%+jH5V~i>Tl_X7DQCvyFY$xCihbiWteGOy_fU`AHw-P);C=I1lp{3;8Fo>O?N$ z3T|W)(|MWKSj~Div%}B&KFKt3ALIFeKRI-rzrz*W&Xc^)_iQ5Z7h?&>a2i+A$+g_f zOct|-y?=FGatRIG$VBGw4XgNxJ=eSEavoXq_PbI0GVid2l??dJx#27>rA_v(e`vNIiEm zo_G0xKiK&X$EshFHjj9}+qDn#9veCCPse}~Mlp`b%wQQ`u#w&VGLBHdP_E@R?&AgC zV>P>P(hs?q2+dsG?+)$r%;#%%`rBvaXpZGlTDYA%d4+Env{`>7jT~yYi3v>Q4c7A) zTN$v$_aa0tL%4?97|%Qwu$e=)x-Pkr9`54}Hn96P<1jp`km>@B3=Ruz4Wxi!I1NQPAIiCm*GM$h4l<(MWZ{Lrz z$)$$dd4}hBm4&Qhhkcw|f>bh`$t>hg68B9A9Lt3y6XgLO;&GngWqx3%{SpFuavEol zMH$t!(!l%vWczidO$*85T}#H<^8VLKF%Bb$_@uQ zf1JgoBopTWCh-}+uxUC!kahBAt=yvS>O!A=MJn_NTzb=<^*Ol1Ziv6Z6_F}Bda zolM|)zG4Fh9I8K1N)_$&aWmtX!D12)bNo4-(tfSlTey{{nay(6vzz_I^M5VzJ*6xScQbZ`gbn8QkTJT)P3CK=Rn9b=isEI#Hh2At;F<2X*_B+j6e zW^Um{X7CAH+2?e9mZ1#iF5X}T`<~(Wl1C-IJjQH3Wew{YaHcVv!4z^CH}f>}`Gieu z;qbE@Uot2l!VNscyKH3VvyC(Smu4PhK7TUk9G{E-(!zZ_z(dU7bADrobB%4B&tP)6 znwz+bS-j0^_C3$%;ylWzqLXpF#xMNA(dQcvIG1XAn8b&C!+HY$am+ZLQYwk_AkXnK zZ}Jv@aQp=cfs+|bGuQJHpYk^e7n%#P8%J^?*<8*Lu3`!wvV{XKGES0C9!=cJgS^g% zEaQuQYqf`5?01qwH+S+9AG40_?DJo91d3?nJ|1B%^H{=947|kk$Q6v{b|x^JulnsY z*fFGvkxXSaZ?KNTFV%PXH<#1LW4y_C?3Uzvaw&ye$sIh&i@e4<_DD_${D&)vFp??E zW-%*R&%r6KXa372TuGE+T*Ww^<26>WnXMd?YFwj{F79R$PxCq7u%1oql4fp5HWhSn z1CKJ5IsC%!Y-3Qm>zE4(F@!7W=5c26DZg`AMnWKkINe;wGknQTLE|3BFql?G@I2p< zm}w480a5N^Dl_{n)^29EEI&sc5n{A5j;HyA0onQqr%*|lkvz$pe8?t_4Eao)Lzp(k zFrGzx!E!cmNRGZtm=@wpU>fuInZ0xU9NE;<%MHwAIe)T^BlBEqoW>OlrGXauc!&vn z$~I2TcU&3DHQdD<-sFEARge(4fO0Np6wmVtU$L3v3e87oVg%Q69pib1W&FXeMXqyp z<0A5jGn|p!&Fjo#J}cSIk;Tplmvb$Xc$Z(Gymk(+@h+Ph`&5CeAqC zl<&FxHKA&c3uSO4Nb4kMXb#xRSe{LEGk>2vNmnG_=2&FlQYKEr%x(#fQV zCVCmo6kcK$U-1{m5BKa&0ax(|@9`TOIQA<4k860G7kH7Ge8J8moM&>WK#zMYf4I9|R-<&W~|0Ko;Zsk#?vxsH<$Zza=je7>CQ$Q`PjOQ)p z^9KX3)u%b0i})|qv~U;Gc!wWZ&0eEiON5B=P`}r-U-Av#vYmwMoCD4#NTgqjwwXQP;0Q+eQ~-xtB+Imo;o)69?XGoa73w zp4Q+bz9 zSiyF7xXrzUOSz02nanKS;9XXcaJy@jqdAUK$ft@{M)NRp`GV~nc}GGZm14?hU>IYV z&Ky=U@J{0em(aldOy+IYbLd^hVlJbDyO_#X{K&wu#!`Z`FqY}e=UaZ|;Jf{Q`WVFw z7V#xJ-($^%{YdE-)3!5#d3?loB;Kpfa0WwYqJ_~+VlHp7n3e2(pMFdld9-jpud7*kSMdbzu$XWA?KsZ);w;Xmm{z(N z&J(=G5B%#9$C`W!Y2*fO<#t}+RX*Z(4t>-(KqiGWaX)Xfknh>XA>;jhs%T{l6M311 z{KY|!xi%O~A+?O=DL!B!%h<@SkDD)YE=63%tvtXu7V;@S@E3nAj z+PQ%ld_&-kgus#H)5|qH%?uXuIqNv^P1ge#Q$Y>&+{9R(V+lLFWnAGbE~T357|RR1 z&N5ar=xz5!vgl?QPcWNx?EQ|Pe}a4 zeV9|orhv9^ggZ;%fp+{2c}pVmNm*lXv)?y+1d$kw%>H%w!>}S<5;COU=*7qmR3p$CrG| zF3a>qa%tjjo@F_|Gw2I_o^$%0t1YI5;atl!7V;are(CQ~NJqaXv`_OjYxs%ZIQlC; zOOSj@i7WV=r;8Ch&oZ{K(<r)^&`b|k zGm2@v!N+{TS~fD^XV(TNkwgv6^zjIb_>{zT#!<59;a+C*0blS9+d1YJpOb8^ppFKv zW(uFMg5NmuSI3AU3}+mVFoT8s$`(#p@7kiB+nCETcKOYD<|N99aVO)M#w&cxD)!r8 z?#NM`MJ8R`%tW5ybN=Mu-+fQQ+{qL^VlBV3i6j2!chJB+JkDYgH@dDln{&8;2)&G9 z4omowUH)(#l0`2!Fq8LK&Nfc@Qy-#++nB>@eq$p?{ACQKk}*tR1~2n9EBJ{G9I?rL zkY;XX5}&i0ga7u7Mm;z29B=Ro8`;iDoAp12GK{;J!Ythe7lyU>3 z8N-vz=5xMeGbaTS1BJA38)6H#yEtZC#!yD{5U((scUZzo z_8jOlkVA~ynaO)>?04L*iGfo3xRHC9$x3$mS7P8422(%@J&fZcHnEKZc1sK#!r>fC z5iN{o3iJ7qf9;+aIEqVY=UQ%KCZDl}{Upgek6bE=a6OOmDyv8s?E?3K`n3MSCY>nZ?_@%R>HQzXKd=QYqmYZs#%Pu!?~PCI$}W zh*R1!mZrSqfBQ$pYkia9hMk4hiclHz=v$%n8W>T z3TdH(u}otQpRt((kI=VBrkXxR^8(+o(~jjyXOta4JPy&2_xMi!9(hR&me?iGhn~AjVjpU>aZZ1FP7=z!P2nRMW*2 zUf><(vx$9Aa;(XrnI3NE9v)y4Gx(05+2h}dfr|+;grT(aAg{23wXElWlO22F^l~3> zvYfq6Neo=TWkl%YTE_7*3)#Yvr}`aab2)WH>FIZi_90&73ldLrKjcC#rH#?t$(ww_ zc8)&XxXphV!f>Xti2rfa8Hs@txriD@a6OZl#(X|z6UUyZA8|S%dbpJbdAHwJ+8xgF zb6iR_9ZcYDKHzIsv6}T9e0E|WjUwt9#&GWA5uRZQ-|!Q=pW~R4PBmdhFqX%8uipmk z0q6Q0geanq5!}yHe8@_+bIN(f7b+RXWM;F7rTum|-*Mm~a_M3?Q}~QE{Kg^wF<+pR z4#x5p^ZAj#IOYPMjVoxNg~yo6YrM~5R`EAmIP5~7kyO&DV>Aykg++YEm+W|vc@PJ4 z3|Ulh9gi@RAK2$&*FEPklv}uq`*?+=tY^pn>ZfFpPn2sJ&r`h4Py8QKcOL&bRVV)c z!WDJI4aM~gaczaTyuWG)=l@X_KaH1R+V+EKQpO1!Nh1FTV5n&P=buT za3D^@wYUcl;hFCz{^Rw~VZcFw193Qx#@BHJp2UkjK%BuC2jeJQfM4StJc`HgPXh51 zB~0-Nd>&WhTHJ>1r5(4uam(9i-;XBt#t4VuTeuQ8;66N#=Znm3yaunsd$0#g?2j{W zH6FzicuScvizZe$5|`s@{0V=-izPk>E<7BJb8sGR#M6IJ_#5y}d=OI{k1yZ?{0z6@ z5&TPq=ZQ9a9EdYkj%+rQzx*d6=8!~QrM zSK|@9y3Ti_ivw^RK99@s8~hFb+#t>&#DO>(m*R5VyyXen-J0|VOaxfrG<*%$;&JS( z(8n8;3JUdk3VU4fiQv3QQj>PwHKX$X} zN9c&Q987x}F2SGhH@xtJ z?1KYw2Cl`=@vIMV?f4h$j`yLuWkkClzJzP>7~Z%y@f#8n9El6?Gu(%#@VtF?-1cU? z1@A-`V|*IN;BH__hd6@)_QzN89o&p(y37N-5;gR25I%_$a4vq1hw(;_ zYs8+|3o8^j0_Wm;_%-gr{dnns>qHF(Tm<+y4##)!W88};@!TQ52mg#NK8iDNDIUOI z@PZNf2}INpAj7^m3@71KT!H)Xsxd!@H9m>s@fCarf7tSj34MjP;2jX4!N(!^8g9Y8 zcoN&E+!tE-Fg}MUWJ6}T0T z;5jj41n$JbXli2OU zj0fcS2u{W2xC!^;Dg594SZi<;PQ?##HEzLEc-j73FRCzcAkN1R@i4Z1gt3l)g@I^G zL3;o`hC^^ZF2Y@S#sT#4mc40bNN^<1#<{oaX3!K_4ot+hF2fN+7255<~S6e$Hn*|{)`tNOq{{qI0`4?ES!h)aU*_<2k^{K z^0{~~Bs8(X$+!yl;z_*n5S}+|I5-q1;VfK&AL9-@=TPnkZ^!$fVv56Y3Vw`V;}3WM zFZ~qr74L$Jqj5Rz#J$*l7;_b`#O@d%!$J5I&cbDQ5P!jIKTY32*<#av5?{i3xE>GS zwTF|>LPLa4<5c_-_hHu~_#8Mm9LM7GI0rw&-MAMoIg&AhIzEguaRF|@gZL}{j^`f5 zGlq%+AHzxb3NFDP@hEos4C4lG#`|ESz@a!EXW$#S40qt~*!gH;40gxfI0|3J4R{1^ zI)*Wg0rth$@MGMJZJ%X*#oN)s2A{>}@ooG7*W#~u9IyBsp9c{xKE34>+OOj$_zj+Q zET4(Jus;sLi8vp(;dl5WUU3}p4rO=<@Hw20uj41U9}nUg$CLY^1Rwk2V>lBR;8*xN zp80vc8zM4%7N_AR{29BPKwQJ?@gI=UhKHkZ39iNCc=;E|+0ekASm3ib3m4%RxEXig zalHIQ?gcf>k>YqSB5Zh0t@6pEy$Kp5~kMH1e{0{eE=Pz>o zXd=O(I0ZN23B2_bat-7-1=rwl?D8e%GO92U;Xr&EXW@GM1drlHUnZ8|LzrWKd=aPP zd-w%z!rk~IUj7wgBoyq2LvSX3fxqE-r?T##g}rbnzKV-*J08LdPNQ$I2L=dn3{Jv1 z_#tk?3%<&}8YS$5HBQGZxO2;sv@iY|*8~N9OtBw6j}vhT?#A;@=Xt`#2A{?GxE0Sn zgU`SRFvUmk37mv8a5Emk4rem<@g9tD2+qL;_%1HP9k?H_IE%P}6;8)Da1DNihqgRM z`xM^%b;chud>P-y#kdvEKAZkT2`N5}Z{z#;H6Fw3zrh$si~<{+jLUEp?!$}Dp>JTI zizz;Vui#u@7&$yVlfZb7sje~F^uEP^})Atw~nB#DK6X)Xw+=^#h!oA@Qct1>xaX7w>@8NR% z6c1qM?=wd59;k?MG_J&5xF3(lXooQqrVd%Wxl<_%OtNO3s6fy?j! zp2QAUGFR~*co$^sg#&O3zK=iQNxbd9=`-Xw7GJ<$ZiV_)ot zQ*i~Z!H;k)evEBDWNhFyc;lA;q^%&uS8x>`!r$@itJ&irz-Mp*PQwMb5EtQ(*!3Eo z83atQ*m3~vnYay)Vy7Q5m+&sUcguwKU>u4ga3+3;8}V2C58iMs`vi#S!N(VH6>i1z zu44}Y1N-A>d-DrIK7M~J-STbP ztMM3i{W13rA1C0eI1jhrKD_ED#7(>l)h#{ReQ_WT+HyGU*Ks{=$76U3&$^NM3<(2_ zaU?Fr-FVJVSrhR-jJB+3KZYZ5GETuy@gQFHGoB|T)RE(BxDJov6+b6-!+?vUa5T=v z#kdF0{snUcugBZ)E;#rEPRBX;Z`^`M@Zw*xCqjf1aRzR}pRnsqd?zFU2> z!b!Lik6`ED@r+PG3j-XDi}6d`f$hI%&f|3uFu*5q3{Jqc_$?mWveVtHw_9A=eeqSC zgY$4FUi=5vBYY5hVU7eJ$H6!P-@_&N1)ljw`UvmG07u{ioQt2}e!S`)eg^Nu9&qs~ zoP$en8Ges@@%(#P+o8b30r(^i!Fjj|zrr8!%KKPDkl}cI2iM{kcnZ(`6Z0DymN*v2 z;Ut`e^YH^*iT}oR_z51uPWLnZ(A=^&t%LpW349Gd$L-kR&x{F}@UX;b_yzui2e9)4 ztT(74-jdTEj_>1l*zrN;C=^U_5YEK4xEH(ph0nm7(Sd`H;#hnM=ivrCv}L!47#r9f z5k9l!7}}F@!7Zh4aS)lbkr@bGb*giCNKeuzKdB~Nml*b7JCbligH{ttN?-T?vo z;7FW}U*k7;7_Wbd=MNow;SijNGjI`pfk*M8ZBPH*&D*!B7~)8rhbwRm?#AEnB%Zy) z_HF+Gd&^$5IS#||xBz$IA9m#D@NO9B<0Ci&SL1d(jMr@6zD>at$Kp%)7Oup-*yS1j z>%VA4w6Qlnf>ZHb+z$Sb#ci*J0s|RN!_RRi?!n*if1bI0TL~R}3@71R_$_vM*7j}x zgbE6rj&pDkuEa0#C+zaZ{M~n-hnE7d=@9+3j7}T;R(F*x%>>)I2Av|?bzXY z+qdlo5nX%;J`TZQI0k3n+xP`;!vlEX^SASNH*-HIBgg(Y0^h~2a1UPk0{Q}P#k;Tv z_QU}=XUi?LkK&at+`jEU@qP^PS$qZOZMlf{a$Jd9aW`JP%l2(=!#-Fd#~O#@RGfwD za3dbZ^Ix=m+e`3f?2Z~HSm1Lw57*&V+=X3VOus_H3LnPj@I(9zJM79l!0YfXbP(V~ zoP%HBG3@k`?c3gjE)KzQI1$(5#w}0LzUZafxBVM-hm8R~jpK1LZoos>^<_L${1=q} zAD4eW0+-=8c;U;pZ+j2^6MN$0_yo?x_4p0`;T6nz)S$!1G58k#fQRwwSMm&CVNV>2 zBk)z6f&a$uvFrcgXYm^RD_XEo;A8j@cLJ8-}V8x_%u$&4{#^`jvZdJecR4>4Rpl#C{Dl` zI2TvpUOa;5{Nwg*|AO};#0DqfYq$VE#VvRWuX-)li3W@wE3I5-*?;4b_XJHCPW ziQVx*B*<_uzJ~AMQrw59@Xv4LIbnzphvFjKgq!hlbE9EP*-OWcGf@TPyIuhGXGN8%jZj_q&T zzU>VV(8ivaBE^Zg2-o0mc=g-2Z_|+DSbPiD;8r|^xBOq?IT|SNWt@#G@mDiLTfR(tId0wZ%-wlT_!qR%L%!uBv`;$&-@t$4SGW()`Y-wwV@z?- zmLq6ChqG`Y{;=hR?_*uX`!K*kI1(4)Qv4D(`wxo;hBLx1)zWF~tG+EWU_K z@O%8j`x)1GJK8t^r{PEVDIUSAKERrb1}t=uV}nz018&0Oc&@-_p#~oZ;X>TLovo7jQC8$62@v_u*0OA`*{aBgBFD1P;Yf_#Q69pRr?^d&iqlfr*1~IxfWBc!k6~ zfQ%M$?2kk7C0vOg;wQKhFO;`$`$zl}-hnP`9EuBZDQ>_mxCbw-kW+2x(|!j7SZ_d`VoE&?2nui_kBh+FX#o?YX6FvO?uIeZZp;6~hpZFQ~(Z`ks0 zv=u~{V}pJ1d3*ua;%+>KH#V57XyGIH6uyS*a070{9e5mXZ4xta08YaVco^Fi`U3C3 zUdV7NuEn45Aa+yv9;jI1BwUDF@Jx+d3MPEaa3DU3Gw?%PgGcdNo$tY(I1K0Er+5;t zXffU}z`po0PRGT#15aSbHusG8L)@a#n%ECt$JO{7b~CtMtWn@2I1(q|N?eB@V@H$x z1#iY4*b5^ZgR^l7F2zr98+Pt+4XC1qA&$XixB>sO<*gQdkN2XC6sO`WT#hSnHSWNJ zcx9Iy8}C6EK90q=a0~9lGkeS(?2Zu%oPclQIy`{g`dk+}*dL$5Q8*npV+WgOjo0F> zP_e;LI1kt0FI)cMgXA`NIZ9Bm#__lWKg3PA8_(R6&qEb4PR7-^8_(H`bpm^!g8>f0 z2{;j7!}Yiozs0r>v9@3j_}CA};am7I?!XK7=9%HG*aLfEghO!x&c&s;8!y_2wH|MW ziWJA-Yg@igdpRD!^Bv+S{&CAYX?1k5C-%kyYkUl+;H$U^f5ZcLXv_0l`V=2TieqsC zF2eP=8Nb2vJ@#1m0LJ(z4#ijTbKH$T;qQ1H&lqq&cq9G;E)K#WxB%bBZFmaL8j{E0 zZP1Zz`4sI*I0rw+eb_#tuka4^@gZc`A4lTL_&UCgOK>F~!fVFltauOFH~`1sTwI5z z@VW{6DD?1g9E-E@eO!eH@Ce>G-Ok?|&GW)n@N+zhXZZ9Z-i-G^#TqB#OE?d=;n#RU zz?{Zgp&`X*aWO8(^|%#x;zc2I1`=jC3YXvxY>#+ucqdGJ6bIvMoR2%P(~NsZ7cq{& zdAJ;R;qTZXrjPMblpw>$emEFM;cQ%w`|vmHJSTR*LLVy}fJ525Lp;U2tje(&Db=y&Ty5ZNVfs|L~ZLcwHB>nPy z*qAPqi5kx)8?WkwT{&Nlwb8QME|pr2JWH!>ahA#Qx|j5pLst&k{%SsV{m826(ah*K zJ8osQsCQcvFQ`tmsXuS8I!3V$qExeEZLF_4p=(6bXf+Dvt!8tzwzFzC7{=@M%3kJL z-An4})LgBmd9zV5yNi6Z)U?Sm?f9K#X}M6x#dvPoYPBur_0q}^oyBr3mu-EbPuC5* zt<+asQe(6p3En2iCM_jT9Leb_j=5ZU%e=9&l1)j7(?z8o3R-VG?rOfIrkx}^-Z}^YpqEr?scz-H zs;2h`%UZB$npSCQ51Phg<%Pp?9(nWjuwT)~?WDe`2EEB*5Uq@2I%ZB%MSbDV`* zCvrCVXzo}_V3)$QrpY2*(yxyC+IW}_2d>jK7X4zXg>}1}SLa?+pBLJyKaibNSxeD8 z>$a6#ZTpLcTj{liwM1VFi>N&*CFV#AEA`n_Y?Okfv{W*4Bi7pMQZ+6WCA~4IPE>np zhm~?#ndFk#ZuOO(noEPc9Ta|3EEH)yOv|~~E>G=h+-wAn7`cmfHd9keN}AQk>xj~z z74)l~p~?e&n2pv-O_=2RGMuO4axq)?3PmrpMR_?DhW$Zc>QUF6Ssi2T1}(1;6xHno z;b!0qGkaX=SWCG*Z8Vi$$8FXt+M*XXo6TIROQm?RREBYC4d#W}X|;s0=&Wk(wAm`n z%WhGdkJ{_7-;IsNrsvpMJnl?a@oZ}3rkyRFg}1KTBTr4DZh0DR+_oqVvsSg#^&7gr zSe1;HTnzQ*B)6qf-;E0^uPmHRRo2ZxQ7H}OMdU;yYg}7&n_=Fn7~RrnQZfBxwGLY2 zb!1Lway%a{%B{?^w6JN=r}bXDTTupeud%R8a?x6bve#LJ6Wf(W%hII2DYqo46O|mh zZgiKWP9_b!MHr2gX-~)(s?xHIL9ae83zCxJr8%2rew>Dj`V^Z(n6PIJ9k z6+M4r$eZ@e2`BUBQm#fLP4f*+i-+!d7%ta+bty8`wB=Np2Vr(b?DUA(Lz`ovD)cX#c6N0T>>5HjnKj!JY1CwB%KTEfm#wesnZu_!?bj*D-WBN zpmzth)bQ6Ew`mk3b2e-bBh8*v(NdoC|udyENT$(WynjTyLm_DwoD}U6ofx*XyqqQP7gdcFi`c?dl+t zVtqAh&qXmNP7kJ=`FI`I@}XL{nvqmtC`yFx?r0Hg+*Vpwq*hSLjmoO;m_;}o&&%b) z4Qqq>aN{?ySOeP>gbM8CPr6hV|TaaNj&&0%dBw8GZFZu{19P?yH?vP*2* zjHPbBCNy0`vHV67T4gP(%W5Z#TAr@YrJy|XBu$LdhSple-XKoX(LC-Cm6Be>QdF)l zTO)I&JJm?j21Qj{m^0Cu#IsVpJy~{_qlnL2A;OsZznX}W1sDGVX?1y2xzRm&7+y{_F^=kr{yO*AR( zw93P!TX)RFHM+%Sxbg;CYf%|3!s#j;>odJFA2tW3>s02gdcSNNi=kFph!e9s%cerM z5(l$v(U*$YbNbbRGMw7Yy6y$eN*s;SMxa_+97h#fZVPrVt23a5MZB&lQYn3U@;9rY zR5a!zRS)cn+^d>ds0Pg>ENSvOx7U&+EWJz^Mf1);%Z$SH)3q0^WZQ2kem9PWvNiS= zk>0GNYA6@_tXa_ouQAA?TBBNY?4}W|*LAC6sEL*}HbbE<+1hZGm6CGNRj1Qz-LTq? z`Jg|SmMvnr>4;{#EEH8Ga$B8>yJ~esvE5lZLscrmvfq?T;d&+4JFP$|%Zd}0rMckt zhVt6cRJon?de`8Q)XOx z-6}h6Z`N6~x^;2UpNu=%Y?gNWY8u&_S*@duTk(2qw#O@TQ+0)WV>PDbj&B93+{--Q z%#vc{UqULE?Q8Q}8V3V4ajWw*B zBS~*IYMLtchVh^^sOO2*i=>GYb!(-iXpIB4R&fUFwN{lY!;ZLc*KS{RmDzBrj3;iT zR12hj$*ZhaLZ{MhjWny31f6P?6=S%VI?Hk4RYQI{C|ao&rW3EebcLufNk#pyUw&uvW%!Rg!5YU=c)@}Sk{1GF^j8nsHM2Zj2HD~5sl5>P+Z7`(J1>y zW2}X9L-N=D#OZb#Rn>Pp(#Tfko8e$GvZc(@oGM+Rmh)N>IZ3h{kHsV_H)8U5FEs(lB`X(}^;x8|!L$p(LTC^U#vA7wC@N_olYUzzFk6Mb+fS zFj)0B3uDx*FC2Yh)#_HOkV{R!n}w@RTuo-KHy3Bq`YLe}%h$uvOmzddk?Q?T+~|jr zpbygOVmKSM>a$v;R{QmIT^ZCidOVIMp}f#r)xNpvclx60>+ZB+WOgs=mq(;#hThEc zN#0C{L!V%`s5R@oxED0-)>urFBF{Wkn|AVbtvXDN%DAzpH-fT1l5C}-l&p!atIH(l zRy%%8+w`odG0KBHCCvGa!p-DjHO#GgJmL{nwX$3F+OwIyV(E=r&2C_a#$=Qi!m>Q< z&&5_FuQf8KX$=TCje3@QgHmNC8JakCv`|dD^<-@(cD5?JQLDCg7Cn0{nzOO(C9V+8 z2Zkuw-AqV%>@1(7V6ceoan3ki)~r%BN|MnyGuE=Zsfs~kyiSJwele;Jr($ceR#wJx zwHl5|rpwYq(<0HVCFC5N%AhQZac?q+rHVsR;7Y30tC&K6l#NzuX;BQj^Qja_&7n-1 z?JtU=R3p*scDzARs55I~4oZutrmiasEt<6&sbzTOiPg|H18dx$D_K{okM(M&qczQW zTv2O7X(lI<*KN-`j=1SA=H1ykX$y)ysU=$I*=e(8kM(dEXw6Bo7M=dc$qc54?YXPX za$_s%s2R03W?geCmQb5DyRx|G_6QnJkKNWNUx=GYdo0QRygFR#)q!Ewt9h1dtBRLa zhgMZBH`;TxwMeJ4=4#v*R&fwC6l;*i<%wUl+PYh>wi?};B-hE$oqm#R1btqz^Cfw8 z5&5NRXJ#$enPYerK`;Aitgo}puoD$(-(N}XFs;_vt43C3ZHZyuGO~WQ5v8OEG|B4a zWlylIK{T&-YOz`@*W<{{Dy2=>j2g;DuCQVjf?uta`m&=q<#dtM7RyRtd4pvZ);zD1 zc(buLOFCw!TJO)(FsQ1dvN~>-dxhC{1kqh6Jw?|2SRNFr=ondU`?I7{mkdjf^xilv zXKQKbjh%IOVYZ6p((JWnVqRGh@#dNu51Xny*^INEZhEa1seQCE2i1CO8f@mHZl+jm zN6Z$<+^8xWVOBPhdF0Frwc99HH&&%s#ly|Is71?FCGHfeVyTlb41SNK19T81<&Qq^&EGT2CguD3GJ&ILXxV zIJK;NAWyoLb}fsnd8Zvri_8`it)|pBwT{&p`}MrMTn#&&y8tH?$oW^VsGH-77yg_KTg^e!Bz2PkK+XKN()8=@sE&AeU zFr8UyU0wEbxxG}hKv;LWjUbFesjWS|D=w+3y9&*LRnJ2`^rro;HdmSpQOMn~$2?1g zsa{lj?p)HE-lCxzNvWr#!KFH*5E+y5K zB8iq2)y=%?#UrsMvyK(LdadHm`=MuUX2WsUFR6oiQgcI{AT=-+^-2lIo zXTw-v1-MwRWj6jdL9~)I%}-luG|SH?YNxUUO+al}Dn zJBuisxPDJ;$5pFlEcgdiqjasLQnF}D@=#)@VGdT^o;GQ15~atwYs!7OJ7|<9l|jF| zo<*^gPKrT0mZzDS&oZqfcS3Vv%-;mHe03HKrPI1EXsqqS`!1IQxx5` zUCmmPVY=K*D(+kfhs{+>$d#&W$dhufrnQ%zm^3tXAh(j1yD9a`WvyAM*ei1-g`zL_ z-Bs$BO~q5vj4WH5nL=$P6>P=bOsSCtR^$GlWBYbT801AW)wPb6TjWeKd#Z|4WHYP3 z5DLFP9gCW!cT4T&W}Od{)xer9%<)98`-Ac*smoTV4>z(u4oc#19frexRjgH-OFf;} z!)0k$SnjgCj`MU?8imB;WR+<_J06vEeJW4WsNP)|<7ts*WhLzBwpOu{fmj%RWZJCb z-G1UvNU8|Lz1*8cHFHsPwN15>NMd=^Fv8xl*YyH}FfeOM&6N~nQZ`(SgUN6@v1`?A zmh{tkC0L1KpLn;}OiEdoJ$ExEt!!6BFR4ZwcUhujAr<9KgRx#MdbwYt-ZHNwQP!iH ztZee6yH+ccx!5b^wieEMt++9)yQ@Zjxe+Ig&2nhzVNn_TjnJq%a%!^Zh^g1h^F*&` z{mdG;^J+;d>WP!~oyl0wvg%@!YjL@(Sd(ce4vg3-Cq|Yu8*0*Bd9E{aN=Z-Y7yZR5 zqNlsn*-WU(MTgO@sbRMu6^2@Gf2m-0os7%GFV+EG@j z(OfNNGda?&cDpkf%ynP0LRS(SgPBN`A)HqoJ&k5z(phcfXjRkFC6`v(=p~~wUk7U1 z(ydw~d!vmP4ou{m?SH|R@b4L?}Mt9IN%x2#A5}$Nmuw9pdTeW)9I1^i@JXKn))pBh#Cxi8B z)M#`khCVUZ!D^gTWm}V!jkK7wtFjdLs(D~kO6|O!>B+!o+Vya#>ry8!ITS^!&9NiRgMQe=(`WvUq6*q`e4u_-kcW2asUt3fyr>rTmcTT@3WD|1UImrPSE zS@EbWifWw=QD;;YtJDL{%~F*X)lD!8S4q0+Thch0F~z3ZhJfOW&CycXg!G-=>+73x zfubu^}$G74O&vE-HN4uRo~=>KP=6BXQ`Pp-Ey^NG)(jENcL-HFmFd< z&Fg9{$!MxIwN#(XhJ{?Nwbg-HAJ_YNvsyB!5kyTxm?VwR?RLr=c|L6gA+;Ey%pe=} z$3kY0H*+a*Z8x+Ba$@?6?x zytX#`nmBXxt{Zgw(QpyOMzigx?%0YFtJp+YrB3Qts|zzRaI%RPCP`%=*P_}gmHLt6 z1cPOgRBfAFv>MfBe$a?wOKUP)SO$i3eQm9sr)$_l-775BpsHwhnzoj&T{X2UOD|Z9 z%dy?@hM|xK*(REH2UfFhwY%;zQsYj!?IDr-v2AErLzkSQOK)urj@ZT4cLj z^7|EL`li-s*h@LG3e!*9rAl+oLT`2hf={ii40JbClVvO?&9x(s>!i8UK=W(e>Ckk9 zwOnawlXOrS^~oxQur}%!s-Cr)lZB!ORo`tWM!P(cO=Ikv{gSRkvRR!^Lc23fvSi4a zkX-7Pd+k;yiNs7;NKMhLEG0EEtSDP3?ns*nOFtae+@P;4oC-B@tFJd_3uBQ@dagF} zTY}Z6j55+E?!@V=yg>A4jn=r)5$nsGku+=e%dRL4)rqe-x@mN(q<>Z>30hM!rE0xd z*rwRahIykkvp2?gAt}PJDp09wPCHWS#=V4OzLqw;W<2Wmmd$b`_>IYCxDevb*ljf2 zO)?xBT4}Og<{eVz%Ct6FSo7huH696aophnqXnBL?T+O?knK>Fpu_Nlqw6m0ZzBFvD zR|CVLvf1NFr;7wOXvrxl(cyr>5&IwJ8eGBre8koU@B< zSGE6F+!0DtUL|Fz%2U0fRC;wsZ7~Mhqm50;iu6Bh_mgZ;D@Igz#@@i{YGG~lG$n^>bmC+{lTamn1w5~YmzpdPAt1yOXHP0R1|qF z47y3v6;mN|2UMscXXwq>?agRP9flP(ic`Z2Lc1j9vsGEBcDqr!wCyDEydWDg!Hjex zxS<;)tch!*uBL&}@|WVeV~@kUEy#=MvM&yclBfr9OLisM?YCvcT=(bMih_yUXpc)R zEi8{+r|fB?(5mHPxnyt*Ws({Dc~g&*%COZDJGG<}jEYIy6#Mf^#|)&Z8C4o9VKka{ z2Dxld`f0A^MVdr5tHCHJ2cod(mIo7eIUA4lN>nnu$-3UsGL0i2uVmP2sUa1G&pfx} zc70GTca%~^tefp+r@i!(a@p&Ki$F1Z^FGH$J!z#G6>m1-sHfS_sVl73jS3Z$X&9N2 z*6M5=C26h(>#>;Gqv=9ztXJz^KI;xh0s?0e8f|ak3FBUGRbmGiMC)P84w9%fY-v4t z=#6?&$SKKY5%`f5wClQ6;UFhwi#cWxWky9FwX&wjS#@v0p(v|HTMi}3v7^ao^Zzo` zD0Me&QCjw#il>Gf>NRRkeR?)tq^?M*NE&sua*}3h+!qXCop=3CZYZ)uzT<6@a9ad$%gwenK0q$t8zBHOaFY10=siK@t6$xgMwx|((; z$#7$P!;;yU#hq4t(ipK~_7kh7vYclPYBJ)gFRt|JycU%bd$5diqZUq^3$s`|vsiq( z*1jH9Wk*s+^{(GFM}zj1laQuWU*i zdpSu(mFzR+6lpLhcU)Bps)La%=}u+6$-^QpvQn1ST5W!DriPXoI!o$l$;k6L(V6&} z*BH)TMK{fX~Q@zE0KNyK>txk`s)RNbIsb6VM z)OKTLczsh!M!DQ+YFa3G&bm_?6n;>$Bh&26X1(DkbT*+{H)6BCFbBzStxy}1rfWU7 z1G#0+<`bRuy=ixa$!a}WOesZ{>WS06+F{{upo7D1YEtxN6qcYSK$rlS6SLAS)thr^(^Qfo652g&ILgxsyCZw;w5qPw z9)~TfD-8Tr)+w!r+IX~SOfA=UMWtg6^hrArs_DGQgH@+BsIU>0*PV86;KXXv*>DJ0 zXXSM}S;c7>sqIh7Vdm5aYb&l&A!Ip{%$3m({C?_JrY&tgpH#$DoUNvtWj9QslD)Aa ztvxqJ-g?}rWML(4rHyFpWTG*h7rjAm?$)D4zsEU%;Vp7+BX@MUEGM0fIZdLuwJIlttMd-xAd{d4Kb!v`?ON!9V+>UO_X4I_+s@F>5wPWc`d9yZJYD2b@ZdqTAl~FH= zjJUS3dWt0|RX0%QZYjs5D38Mxj2WJ|Lk}z8aZBexxE%2x1b=7GM7{z)k z&W5v^;4k{}#M$&!*;>~d&Zcad1Hoz9Ga(xonrr9$mUywLth}f$sd{f&IL1&X1&f>rpn`C>Vpn)S_UK3-80n>C8M5Oup!P45gDKCv|AHKKY; zkq41yi}T2(SjLHyZ>iJOY}y&kQY#9Bj@xZb>(Y!=t1s2PmeMh6!*LRk1Ba?hp@q$E z)va_E{YrH@nk9l9_G=1d_-ev_V0(&@e^HY>8?x)k>x{DOcJNJ2GD3sxFlIvNV(2_E@##R^}`= z%V}FFFK3=x@)xz0s;gF~qc`jA=DL>GjJ%f$99%>lhN|G#Q+bsv%WW?!MUk(>ZX=)N z6wQNt*{IBzO%pjAh?S_;9I2TR&m&&(Ds*F%(ZgYsPDC*$m2ZATO4^5r-%7W;#_@x>|FMVPMXC+0r+YpdwWQ zWvolmyp*UjH_}5PbO$|W(Xy?IU+yX^Cu7wvwX<+x7@8NBOC(bqR}4e5q!mId)68Cd zRjY2gp0x}nT{F%rMrWi;UCsvmM&GE4<+7xV$VDn;S`hhET*c>=-X0k zd9^XaiLNZ|(Q?!4RqBbmnAeu=ZbOSBN}qvJos>Hn8?E*%n3UGzR=ryFl0fz5=^__f z{<>CP+jT9U4tWn}z+_&E3K>XKh)eb$Gs&g1mOl&D8>6d9^L}jhW{Do8n|UqhG46wI zL}4vct5vh5h!L+qsaB*H(L$Z_*t%9_SsT^rvjxdRYdPwz8@X)7VWZh@*_vu8?WbP_ zYIeeb7l-q3yeS0HTaEbN&bpp#2Ah>lnM@6MaiV4UMX?r)(CJ5`An2vOROmHaKBrq;OP2$}dQa!&X_)yp3pi9W`>(5^pq0%4%+isx*qm7H^$Q^Y*kd z%BQL{Z^%g{Ty$#+uN@|`#%X;lw|oAiR979nTyV_O${O>w#4#v^v_)D9%r$9TyPmuD zWK+spy=rf!sbM&_^`Ih{Wl39=)XeOtS}j=hd{Hnf<7I_2+3KjRX(dMR?t4xZkewypPJd4~)<}Kc z!NsCCmMx{PHj`ho64g|fd1MXV><8o&d3Zl|We=-_cLLvA4T(aAh zEAM@~O6z^~-n?FYg8mmJp?!Fx4wbL^6sj72G>C0{+)1jv^*g)0#JjBXuW0YdtcPOr zvQuM~yB-2A_)pq;w!SqvoKG=r$GSYjk1Kv$Ce3U|?YD%#J;?kku~+^Mk$Bq8F+WN8 z=ForAwK`1V`jh^SuI5VO)z`hpxA$OhtQhS(%hugy&c_qt#PtTlUH1-NQ}Hd^nUnZ|1(h)>)nF+Bf=5G+;GG_n_*1_8O@$(-1>vBS(n8mgne`M;#2`qs?;2 zb|+oXW*^;4W2zf;%eUln60`hu_jG1c>ow!W+o+?OYpnIu`BiUsCXQ;pB)Y1}bySz0 zg2A;pw?h%EaW%h$9oFFU>cXwH<#k6i4Ugc=?s|29GH+Yz_FYYSc~ytd3{<=x#8)=| zZe4Fegs`*6GsEzFCiC-bp9eQ{`;5>OE7ksaYHNiQS-lbQz)`u&d3EABhk|;~wLcA^ zqL=2V1&|Sj>6KV5A@g)1Z5G`ITQD2Ly>*(SG>|ez(5)T@(H3aqkX*dq?-cK97Vh?w zh->K5Wt63(wX81O>T^?gZ+Xk#NNstGqWt|3RF}Yt=Agg0}W@RYthi6zM&B zxTz<`gEM))+OIRXVW~zA3j@+jA-KFNJO%NHeOHa_n^dmo5IT_WyMifQN#Gru?%C<} zP1YMEdTP5|ih@MGGL7qa8uoc?nWq)9uE^Oo-MA*c@*eBjPs;Fr z{i$kR(dr^UFyPq~uT0O{@mJpS+U@UF z9ajh+cM!(gJjE5U#h+dzEEbV@^51Cbt&Ax0IZDKtN1}gj`?3eBaqu2iycj|_XDhdn z5L9Q|`Q+1Yo@Xe+(EKULAt$i~-R*UWmhG*Jk)yD4EnKX+bpD$Dxu%dCWYQsT1_c&}cN>+3BG-iCL!i~aFf_V8`-zY9W7n`LOR{+cPl6R^^W0BTz}gNHX4FgW zF9_lJT=URwU9R*ni94$r4rQxYR~aXrXqT0$`eer%p4EO`&)5z6Wd7oO3Vus~v~4}v zwQg6w{Yv|9>0iR{@S;ltu+ zol&2Qg=&0@&20K@U+Jo3v_|VI!%8dY^jN|X+M(8|nZ~Q5@>{!b02Imo6m&o8#KW_JQHA5rrRD2j@k@vC7HSv)*-H>Rw zxxT|c446Rpsv`kFgS~X}TenKLhY4`ZvBj77X}m!v5ec4SOC`1SzxuZqx_{#i?}Uq= zKYkh}g?hzZ3^&;=e;$SI=m-N-4li&KP43{wU}6^wXqtr>7Gdr6_l3+G@A5mH^ys9wbrPA$j&9=h_S?h6f*VeVCin0UlcL6#Sky0?fT7{-f(>k!5vLi zmelb?P}inAZYJ>QXFO29SZjwMaqzHy24qC1>W9&-wj#MbOsQ66k8e=gm8dDrzq?sy zlF!@CxFVz>!}UvkO+me>xhw5~1XPuo*-g0qKbsd`js*{)yZM`tH6g@NWBjz~wmnU% z9p=9JJD(3Ja!p>}a6Oqpwc_$}Wh62$wVYdPd$7VNz3+hLiZ^<;gf=o%QE^q*dTu-G zyYjKruOcd52S+o;`@M7-LCaDT?`w`W*hn(Go;+)FQOIw|4~nPvIg?aj=KEuw>_{u` z8YbB5kq6aiN7{G_`~d$Y*M(yh@SY2MIy?l5GX#SuUov|u73hWU|FI{8jWHnd_1iL} zfKa<3{;;UfVRJzra$gTIZ@v>m&Ic|IKNZ+q`6npq7bA5I65+T5M__Vi2QVCt&L7|$m=uP`flu}U> z85@)*Q2P&mgql2)x-)Z0SgV8v8|~Bj?ScstZc6T2ls&Uew(fMg$86yD<-Hc=Z4SlQ zci82St_{{Fna$nb*E&3cvZrH#|6eNnM6FyFNz;ekh}~ex_))aDN*Xj}-qx)yLME`M z>vV9cr+;_HSDMtp-Ks;#uRo1qcQ>)pTN((oB<1<*(<5E7!bWWCTQ9no(=Mbp5e+?v z?P4I$f*HANtWzXb(C*rxV(2SR*a$mkT-HDtnw@cV3HVc83_IOgT7w+_J!5AY@v-?LEP$LhdOHrHc zJf*z-A&`!2nkHg$sGsOTp>2f99>o47@0O?eZje_n&Ja@F3SoWdnI7f$x_cK{PxH`3 zG8$nqkU#aQqc!polcp+FKf^ zl0K*9TR)nxUWQ8LWRJ98f|gtDTOZzJKbh3`j$H`$R={N=hBG|xicC;FB-;#Elx!w>6Z7YDQ9kjiWy~|}jGw!W#4)k2x!by6%t+N;i8$$H zh-~jtZnG^qFxl)IeSvdN^^`+o+4*_h89F=Jby=t+rSTO1oZ6j^X4eZv`+OM^oLShX zTR?934!&y5_)}yRTD+B7{YyeEBUh%>Xkp~*pw4mJjmxrcqWx|%hx8tWGWF#(wdX$F zT(PAw73GEuMYE#sG3WYSipP!1(bmcYLcy&MqIwDbD1O-sNk}gHJSV;H8CHIAe15f` zs+UcV{HnSna|a=m6=x-1O}gBjSTF=9?xBs6HE~8!zTzL0cWq~6%%xhM|2Q3hGQU==D7J`+NSu4WtHK*Wz-3C z+7z|sJ(PDoT)37x6M{?Rt?o~DT;we4TK9H#TRz8OuLhVtl$q6bO*^4w$QjD(aklr| z+0s6=d0iRP{$1iWDEuhXTlChFxb z`rY~Re&fvr7G)=0HU`(=|MJ++I#=AvZU+LzZ}3rJ3oorb%V>!bH(t{9 z@CB{)5MOq)&CqdqLJh;_)-WL6@EgDA93nxSR7RwPI)Y@4PszK+K_s}Q#E4dXNE_y? z?{EH)Zkoe;XW7R#74H%(l;IIJ5=zJ%eu?7r;*p--Pt$s~|GFjnki9-lrfRB3vxwZz zP7?G1Zd@=%!_NwJKt?sLLI_NOh(_9A-QKk!1*Rga(wkqa!H6@%IwKjP{uET!QN#cp&hPWME`)ub-amedtLP+K<+I-N#O;)O@S;BM zZ%0QI0vc;Ku1bi1`wJ^U$GydW8C4xKt*4nmX4k9(Q&%(A)f65xB2yVo_TR1?XyiC{ z><&ZfXV)zIPlE2OJbF%0VKB3%WYvAAbB?9S1?V}RXXMXW6+i2v>FBP=_3Nn5MHzMX zRKVM=tiMdQZ`+)LnoRb+R_4$e!MlUlq$YE6rzi8P;bxO{s zQ{2As63s=%Q$^$DRo7872&TNILI~@q=B^le_)dtS7X@pV!XYo=ztcE)5|3M{g`#Om zXozGIN}#o!B*A>Eof%eBtlI1SgOp%LXF^)xS^INGETs+%b%)mN@M@Nuwry0&;~_f5 zxKDNJVW!kC1ND=uEYNt;?2T&vu4<;(gm3u1O)2)j0@my= z_O4rjZkTP$Hv7e$Xlw4+mny|;Fbz(s^RZd{lE0^kq5K*TbIj&Fq8isEW&^tvYG|4P6 z+V8#zN4YzU`-`FF2~!Mh+w7S0s-=x;=S2t0+;HjDT1iHAO&?A8^qM)|vr}WzkNa{H zy7sxhGl+Zyw+1B;5gfOi?OTg6_Ep6Ae!Me;ao;dlWi*J}$czGnEEHQs0M%J?ST@I9 z!R2cm31vra7|NlMqLW~?NxM53p&Bmpo1p@TSo+d8A#L)Yl zqrnwgV;eQoUauShLcchg#T^urnNMb9b(FXkOq}?*d`W?wlEuO3-iU&xuJWU%a)_m< zHqd}LA~J~Xe*_}2ivrZ|D~g<>)Pl0FYP8O-Y2*AE6v9vN8wcUeQfChvg=Z_R@oO3|5-Gx z)P~*Yq)2DhXqNH1zus-W?wdvh-raguvuI)cuQjCt9b&&_`RBoy8({}6LNMOt4ZGh9 z2H4&gnL`Fy_U2cMCt`3b?aMSvJL<*`Cs&(fF-C#i5)3g%&2QR!%-6pH*7$oO!F(s^ zS+=Rzdj7FL2a0t1ET0u#8$5kdd_U6@=CLoFl3fkVIFFm?a=p2Z+3X{P(0O@TNz4ZE zUHbL2mGrxFDGR!R^eOe7f2A(H_!i8_9+G4z7<#gnyxZIqMp;1aD}E8`SsmMA&={~Zhm5$CG_-f=H90{VkBIsB4LRD^DjES`(rPcYHP_0RAwRBRmQV4#c z2f0bAhM(H^{qPIDr-ckImmi*0bcQJJ<9Es$)E-|?^BUIET(eEMV~>IW+?8n|U54p= zO{87EbSDKP?E2XW8?|*WuR2bU73Ik#<<*sj;fmM-adGxUjk?N@)S)Z3r#Y%pp|FYV zx|&NN-ddEhx8TNs8dNPdXA7G&84Ih|Sb%)~2E4!=_p`{jX7@?0W`J`vb8@LEeyhj%!GPM7ycw=_B=dXOizO_LbC|dsE!sfP!*=1;L zvEB}@-2fNWGvyhjOp4NQ>ZY~YbLD!|ZhT+aEi0%`Gx!h#hMw3+ zO9iQLst-ol$Ex+?Nxklp2cm`DT_|}w{al#WI$01BA&$F9Pm_GBwXPbW-WgdTTm?#U zOB?)3r$>wt`L_UNp!?nHru1{8moQO;Nc+KKc>DZ8kNc%A$^PRgyhF-W^2o&|@9HX? zXSI{2h;%f8tf|uE6mR(KV-}2_w>P4ymc}wViu8oRaeT3OQCn*oWOtGg?_vJaW9@=} zAlCqSSQi@7h2Klkd_lU4i+viruFp#*zD{@6_DqerC?87tA?u+s+rH;!4-HAmklEt* z9eksk1AyY2?6H*D8{5(dZ%0{GRhym>_X=b~Y!?S3^PRjvMhopTeZwcEC2x0oiur2K zDsm%zjR}4+KIjOe4Qwvx;TS$Du$5Wh2n7Q7W>$`N8dq417 zoMC7nL#aRRPJg;NN4KReg=%wV*xh)4Xa@QMY~wTmH^f$UbPLnzQ?o$0rdS;2h0g9z zjG7a<6^Sv_n_BlpHPA_O)Nl6ata|f|(gR(F;no`o8V0J?t8;%o`Y9N79Qm8wgX(Cd zx4db}IP0pYFD_A)4Vu_L7dc_Io#E%y23w8xT%F#rkn@5Q%su2Q`RD7l3Etk zlU(@ObD?os{Ju~Y{BZc~awdz*OH_3Ieczgvz_!LsXQlO3l;B?cGO%0@=9rpdeXqLN z0mu;2wHN7?MMBaTyQ;)Omi6+BT!2PEx|yH3ZxXRlSv_c|eD`0CVopD5wNSq+symO@ z#ERls?dX1UjDg=>9J$diN54mgYB?@0oq_viQ%I}daz4Au+xXj^3?_2ljs8%S2!NKD zdRfJ6Yfs zq@Pr6Mx64B{baOcHF;t7h6KmN_r)(-Gc!5O`Ob?0Z^>?)8gWBCiI{=`8_@+uR0K~{ z8-py}o&+-OH~*HtK)1Tc>l{7H%7L1W$zxl?%G)#%qZ-DFBrm%t-L9DbmR#Jf^eED5 zeBL8NIDYWZG7O>!Ml3`6B#=j^TBZXa6?-3TDSvPWjG=Dq2gJNbEPmI_A=UAEbbWOe zrNG!MZ`dS+Rom_tNekaBr|CWSbDiJ{YKf%3;6pcV8_U8jJI8%GvrA^J+b6raHi-&% z(4auNUBm25QFzT-!SJcZ?Jc{XFiQ6; z^M#IQvu9_acZ$ztqDmK+#&1ho^bO8KY;ht)YQ5p@hA4P7BSYK)w(Qd{zao&M+Q$$w zS7_|7-5UEHmBgZpL{|Q+#i|QcK2o@5GqqAws!TH8iv*9lWpaop(O3%vK@%!RuKf(p zhF@uXlS}oSs0GvI9)v=)WM%Q%Uy~`;+fD(x3l6N)+68fhRf*K%uJp)*r!*g*fA6fH zt}+ZGl`A-Ssb#!WrAq_v(IC|t_{pCTHBQNrB1Pu)iGf(#t-xa473oz&y;WN+2NDM#sV&#vkaPt@D6zB9_;C%z znx%D#oD;UHI*wR7T@8@lQRm^n%HwuzC6Qp-?x^9QY!D zM=>B1`2c{@;&$@`P0hrtG@+P`)`qJ6G7p@I0agzT=Pwxz@7|}ZLy{wut(2bthYfhF zc3Dl`xRo-MqBL$e6PQ&KZ1N*6P{(trHKqZWN&Vva@WkCQ!GEASC{T{ue0GuQVxcnWcy)^A-4Rwo|; z7=@>+=;H%h2_qK)b@N4>R~?Eb#wUJi0*)& zZ2Q}wTFoU7!!4aNN;3{vUbNKulnM1*o$O++OpFZQj0!vg->8zXO**604oOps#BmBK zSMlLRQ3HSQ$?9rhSS$&gw_cPr{YlCa-wpd&t z>kk-{%>hS0y9x?8PQv*Pa`h}T3B)&anFwG+0P>3;16+&VN@@&m~ zpv=+=z(Tk!^riiJ^Xsige~mN9_S!(xhv93uTW-&;$o7XRWm)T?| zXAPdvR<=E*O1sJp@LdcF#dg4eAmv)o>i8yv}t5c_fe@~xy25k?;mgeL| zd~C@dfW zfy;*c0<09K&se8REnc{s8&2b+*etPEKvG|MEq|(=@Uw2~m1;heXje?B`9sZTVnI`9 z@59HhN4%JrlFAKt>>&mT$dRgVN=t{<_pdtWucGQ@SRSoeVhFlyh)PepaPW6gNwx#H zw0p6uu}|Gf*DM>ofe?_Yd~C#J+f4CI&Tw;Ms-8eTgAQWx$z=-?Q zC8(Q7@=||P8A~H$f{3-^XNt@Hp)s+Fn06Hd7~oz0|;rMW*Qz90bRVDV45z$kq`3uQZJU)7>HuNH~rcVhVj0nUBa{ zD4Xvej##0m{w!2Z@=uWm7UY{8np%HWM(#+p+(ZUC zF(pwCsi@_x{i&Du^I#@hptgB%k9+f1+~9vqpc!V83N!+_&lxx>x}I@`AiCWK0dFYv z9=CVa;b($)p}=Yu>Tpcd#1sll;?*AASCN7jUo0e$<7KE+=Z~960Fw3{`hml zKz{RaWj5XWa5Q(Hz^!}>6!bsS3wV-`EcQ7Flz`OehWhLxP?&?KD=qHiU^$$njXd{* zzr}D4Lx!ju`Vd)P71o!3FrmMnZ1N7te48kCoagN_KRvbhcfk#WE*N;I7yokDgL#(I zHUl;bDabi%TXUl9p!aRiy|%^*E_Q;nT5{1BAJmY>7BC8wyc+?4Vnb~^P|5t-Dp~@8 zm@Zy=8aiU0v*0Twj)4lJx_(|YV%R}Hw@ZvTepJf3*4DY_Pg^76L%TUmdwXo8qUERG ziCSVPh?aVWUO{7}@eb62vS=y`|H%RW`7Ke2;6e%gvy3k-`L6zE%BE?Z1|hv_hB01V z%yuI{462h>uTiflbtALMc?G&89{>fJn$6YLyMHf0Iw0ikCcZu1x%X*VQvG*am|;0o|<^ z4X$K8c#6mGzlKaQvP4i1Ftk~H6=WI%<6vQff)6RShA&3QOe7tFsDs*W3XP&YRtYTo_tlstc0txaQ*K2j88vWe0M5K z{bc25KYo9;#wOSD_X3&t`MCCuC)f`!7*z+&lNKPQ#D%BjJr`Vp{5JkUDHG5$ntec2 z5|M3m)r_03msluA7vY4L_e(3;HCGukJ=L5pzPRw&;q6!L2_D616HRa#v;iSGB&g0@ z_7ERvNtGQ!yS48vavd$C@C5xK*?kSTT|d*}foS-;se2JcvTzagz~7f zj3qj(_yBbFcMhTkS&-#0KE$s?izW1=G*aBzTuw3Nx|9Uc6g&AIC)&05hDQ?+6sKe3weiLbId3wfUclU$=K5L;UF$z8yZhho-rZ%_kkwQKih0 zG)AXS*T%-3d{=MYi&unZ_E3~B20o=z_s_r?A86eWhVT-R&AZ{$xaD zLr-ZTS}^rup9M?~Y{{SIw=B)h7btt85xJNer`ySL>!$90gMys zm6IdBK(wSwq3ruCVBt52uMi*ch{(2liNF|OKAi5W_(GawFdaU$PQ(`@-dm z5aNWS0VGe8T=|`M87r5IqH~XX$aK5x!Nb`DXTujKk-Bd-?Al!-gotN^16!oe#x+QC zsi85j0I`p{+!eCVA0ppsqA%(yuWy`$G-exvA{_D$@`N}&Q`{|eBYfo4#(0AfkebZE z!7V=MgO`YDj_{9}eo}y~r9k)V%df&-9L`Y890XS`y{J0V1&+yae=BakO)u8rxduy^ zxH2vZJRIMM1r*~hq=a2GStzsqks2?IDNK+Aqf7L(HybWF=Ptexz5+L_1z+!6@@W>T zItN;`ZOW)v4#=g;$ERvWWw^UgFUI4ZZ{h-`wDHpf7Wi_cXfz^%tBd9IJ=y3!uT&{# z>^O+Sfv>m5rupUWZI#wBBJChcBmWuWc~7$xTPv^{)!{DcxyVB-fIMiO1`IavpCSSM zf+-Qr>6d(9sZHetf4>7Z<~WGod>gyUL2hIt(i3*8`I6w{U)S9M@QDC`m}J|A`ffl7 zP&9Byueb1$v-CjnOwpVBRu6R$-&903qoSc!RNDQp}iw2Gf9ZNd30h_{RjVti2t_iu`?i_rs^Y4>^Fjl+UU< zbL40C%_>{M5UQfQCU0R~A7Y`oIr@%<{HAkju+{M7?;5xR38Gi3U4N^)(E2?*cw_W1 zgYB58XHjq08Ge-b{Y^r(^wBW}dZBi4XPP1S0=WghFV%uk)P7JQ%je98OSb_V7kYf3 z;O%`^yIf#*QcJPxWPMY2RJB6R2s!uTI@d1`TV9poD$^~7kzAR zq|AEsv^B8^)C(8~um@iPYWaL*;fHot%>?>oq>wXL9Juk>|B!D0()yaR7%ba=j;aHU zuz<*8E%oRb7GkvuGH%QImIJ5&bp?R&2me{CEMkBN-P;^DpT z&DFWg+9vDn()j4eEH$a^BmCMS6S4g^dpDK3iyVAn#7>)K*KJ-HMPewnd&PgM32(~Q zeH;>{TcAU0222O1p2?W8Q#%J6lbo#y+`5)9o<-?foz8pyYgK6ZNCy6PghOW-5g_>& zoY03^KTW8_3tIKTtN=6|DRt@|pl<_6>O9{ywf1lrS%96suUGt|@g8(frPy=4Nxd(y z%SyKez%rdNuf=YOsp_$>UH)~f25pV z!o>M6xYVtXGVd9>1MJ~+^71Pcig;2JD2BiF$Y9Y#!cl8;>zXr{O}oJ#`3;0{r~N{N zY16KnwlLr{y9RH-nyN}TK|u25*L3P2?IE1?rRJ>liclTk6WCb*L2Yt??wMOO`${sR z7*+nr$$C$hKR|KisqxftsFD7VvTaTM6uPmyo&S}tM}GxnmqdoB*(j)uVjz9vK;zs@ z%m@HZzonrp>%fVK?)IiJ+AEoOqdgU$8W%Htz+5Ld^Sxl`VRMcB= zgS@`#2oZKenuQD)@6L(2${$S;s)(TcxO?;btt}XYsp+SnKdA0+d6l`1pxeCQ)q>OpYX&_r3iO&K&F!x30>CLRc^0DuG-c3KR9 zW;ELUL7GvTKEEk~L@1M!VDwpy8#(a*4uoAOOI<4!SfQ z6LHN%F`UlpSZ?7;;>n)F{c7@|A^1G@MWCn%6COPfxWF9U^ZTBN>5E`xlCVz9+O_!F zsduU>3eGyn)*#t5sf{0@jHq(zMs0K2TvKMMr$rFT(3 z7)-K2rOp!(Zx|@o1DGR<{^Tf}6Avv4+l-H|Qo>gtuqtE2LoMy>M3NN0(p)yMh|{^k zObc+`nq)$oBLF7VU3Vl3Ji8wS)MtL9&{rpPc@cL^#JS90pwJTXKx!|o_?CZptsaLT zKki#)og8V44(6 z>0!h?OZ9F5Q*TbEt^Coda6;i{5^+j+q}5tfNU<~kYJz15+Ash{ z7S*T78bS3bcNz%A@lY)|+54n-PE*gxdpKvNoMY)+c@XI;244%89wk6GhGX}L zUS!#QIw>l(F5J349pZI6#n8Dd9d}i=r|u_wY7^s$y-%t9Rqt^tYt*B+1@ySk^yI2s z1FD8!)(ESVTalrI&nD!x`D&jwlCHz-)$pXMF2WS|G57V`BS%(q@gJ0E0GnQb26EFI zT-ZmqM%tqjyPjis`D=i)wi4892Ve@teze_|WA5cX1Mb!Uv*_j0t6M-S%nwXxD8*nr zGIP&O>#dF0d5HHCr^sCW>q|8fL$`pI+6_qym7J?De>M|a8l8UOo#;F= z5#Cdi3K_SE!k^L59c_Xic9cK}_q%P~pD3Yl@OB}usyoAWhN=cfuH1D23S!@&T7rmY zq-LYJHi?8NhcU&?us1a@mwTAq7MeiLemwYqoFB_X0W~0$=D|cgnSKXBeU0ife_v*K zbprKFmBfQHtAXVrG%#5=CaiQ&Aa$chJYtTqt9f~DC*#_v^j8G@ zAp2dkWA098gz`@mz&I>+sv_v0hha^4i-pcTF; z8ZMdP$V)3AtMIALQr8$-UDMH_J{5+KP~Q4AqyVD&$R1W}R=W&{A1h9G1Myht0ieU~ zXlZru=(Vx{5grp6qB|f!U@eVsdb-}l#~WcA&~|M%6ffXHw;;=`NHD^}Zf~tyaM?G7 zJ$@6wV>=dAborqr7x5LBm{Cv4^}gG80;+jPkQa$eUrL_dW`I(W0ExkVKe~17xf}>* zAfHg=A^nI*Ph3By8yq;b5%EndG>YK>M%urfUIHe+f*!oCAg`I??~q0y#938;AkHSY zFwVL2E(%1b9|LD84{1;{h!~ly7lmsf#I-2}G8V0TLGPphL6sIfKkag+E?mdzQ0$$c z^w}GeB#nSdt!Lft*0IG9enQ7rx&dFHV~{L$>5MZ~S>nX7_S?P?VAgdOUhK zs3%&7z|t+zci+%#hj>x!itqX$ z^eL9`!=E&M@EXOvTf1G4|m{{!@(II?>3 zHkdlrE~VJ1GQ7VHX^|MtliD5MdcuQ8e+z$mZ|DP4;Qlg1YTPPHc3|xPuo+5kdtdRd z5gBHj3y9ocA;VQ`0CjvL5J5!+yv7nMYf|Nhxqe~3^@@BfW~m{;%Ex$`v26f5Zyrcd z+6`d!hGQKe2wjW$l zYZ%Bv(S>p*16m(;Uq=_+pudiD`bfO#g z4Jn9fC_6`rxY{VrO+bYWixNY0pFcXv8yp2x^t4!b%f??A6lX@tjiCzPIlWmL1FWJH zt$f)6*DM4JIW!f|#L5F~A%cG4*uiR&&|JzsMcd!jF%6{&0Mt##;j5 zB$bMlhk0EaPqyLkapeyu*M~l1bV~82={;iAvrVmmv`Oz?b{rHGK0_EgcMe?`JvC&F zyns?TsTk=bB`XTxjDP=;7l3)s(L@NY2x5|`*(4%hfVDx-&aAe!Vfde7Gw#P>MD-Ny z=eri+!&J;kxNM$zVZNNrga*I)$nVNBoC^sx*hgbhqAl1S!if=LkyD-kG-*yCt_|*7 zUaAbErE1`(%Mx8Y?L*g}&wShA<)c{HI794Z`~{TZ0bCA9_0ziRA2xT*hJ>F|PXrIa zO2C$VIN}j++2Zj{_gI5~< zGj(kTe#mf%WhIz)@denRb}5)h)ZOGLuHo`=_Gu2Bl)Gbl+!pw|o&Y1YGi(tl86wKs zZ)!7jma6^R2SdPa3IIQhC9Q7#+z(-f8C(ks-@V@`t}WKc(dBM*EBNYGrD=)I^;kq$ z!2}rggUXu~KbWTq2Y?y*HWkBd6L8NL}B6{5g9s4 zKl&ElYm*^CbfZ$vGhmNn#sB7O9t<9{Q8vDlR6@5G~!*7^_5@ua2)!=^YW!fT@%><+7yn<|haa{R<+ z`!np>!B8TLJ;F`w;w5V49IRkC$)og-)EKBy7f9?0q`(@Z$?P)OFXtX)?JM>Uk!{VO zE@DgepBTJrb{v+aSPwR*NJbr9zvb~x^%nvr$UqbC^ztrR&~T;AHvOx5<_Np+907l_ zm$fKwfG2~_t;S~$hZI(Dbuby5kYM;Gbz~;9lN!SaOY^P{DI3w~FEzc^B@;O3k%0mj zcXtA-)ilx7OYnIe52D6ek`~FCoIn|&jWM9$prPLXKPCTYb#2*LAHl^91oDHGJ9**fcAQckBXTrh}sb zBFI*VtI~nTPmqy~L^-;7zHSKlg#D`Jg&<}Kl829HZU9jjnD52};D&A5v$Ay!pKmux z!2u_U*hw)X!Df;eMKsOnc~7%la!sXcozm5-4m^(&9j8MiPzB5=;Z)A;SnmEKYA061 zgeIFOA4us$U@ z&b`|@D}GBju;>w%glMCE0u#{XTOXC-fqucQ`VnwBr09N0= z199)cL|^ynyT=>eM;Yz0rwWor5b*V4T9A!DGyL*JvBGq~I;HbLfC+bOWsI@Iip?cD zUkL4_@*6p0A!)gW$Qd467g}9Q;O&IT3kK!YbxDMtl$T-gR#`RY9O~CJAVZa70Zr8G z3N-9Z%xsBz;O<1m1&n$vrKrvCprW8Loyv&ta!Czkv!!zd?YzsGoVu=z<{ZuUB%hl@ zz;--cKmwnpU@DT7h+>XicK(cCL%+S4Sx(KrOi;F$62voFc5@y%t%mIgW_IG*Phmgk z5}qbzfu$Vc*1Omtma%zWgY}CAesMn0&3I72mVhSZ!lnjrW3?9C1ov{-*;j>1kFdy5 zqhfTF0;GM8xn@#OP;H6R0e4TqCNyU}nJJFtJ9Jo@cW}whg&jeK0`q1D?TTS-;d^%k$_lvMyBV27U z8lEt=+8=O=P_WB=)h-3gJR#<6;{tKosWD;#36NoHq!wRy``9Ge&-{@SN8tg3H%$;L ziPxrO^U+I$;wJ}umS#dZfgCBu$@)1J0Q72)H55SRQUEST+v2*307x@f*uq8g0Bsc+ zsYnb{8MM4{+yex_EOTOK(?cKG(jiTaTr!*5LYfyB-vK5R!d5s#`gbKP1IFO-r$hz{ zE5_0Vt=64o648vv>(^3WNOb=63rO+EvnYa&TSm&~lx1;YUlZ&y%ceF59n(2btw8Z7 zCW3@s4RF2(k`ZvbhEN;K#fjwP7b$5Cavx|V`!5E+LYMG`CBT?-DV(8IjRrlb6XP?7 zi@1#qpMueStAfN=3Lw*`Pl-WEhA_g4OKO$a<%NSBWBu1{EH&B zx<2rikq9H)^2nY~w*8v8$9(>sKiG_1X%V&!uO9veqM$}tfeE;?ooUfqw70E&b(UX% zoBYTIiQXT*Um@=4nbuo@n-juitBCS|dAzZPPVg%BNflJ8@J)T4+gOe}rdX7Oy_D$F z&U1~RC>8Qj*b56tZ=tv;fTAffz3cM{PNCjN0I43rXF`#hW3snUn^W|!^d*FY15Sg* zZBs=E8m81&mlZ|>*{*#v68hBfJZz!GBAf|ON^B2n8ZZrLXZxb8fAwjHb(JPN4i351 zm=d9^@hZSJH4C;%ArgtzXib2E@9Ud#fNYh+Ike2r_RMsMeiF=2Km$x;{}yW;KdH)o zfd`c*p1#F)vX0GXX}Rn4({xSsOMu=8nNWn`M;JJ! ze%|Nw^Y$2&vLGk8F9?plm9KNOC}6wq{-GFma4*!9IhmGDLxz)gT?>$@_v0sWN1A84 z8TZD4DhT`K9)|+xga5~Z%HD1|U}d&{B21h8QFLBgjzUWo{5FIUMp$74Z#dz-B+S=W z)YHsbckXm|l?3Nx?j6xW&3kOnWZtUzb00Pxc0Q&hx6Dt#kqmaZYfF3q*!GkTr7;nn`7uKT;4lx}CpK_q2>u_M~;CW-~ zK3WO*@E7Rn=SLRQuKgW1h;CtSC-0^3(}7Wv(9X<^dfmPyvG7gRAL^~ycwYhp2nZxM z%30Jc?R%>LieIs75)bdT%A7TnJYR9YVlTbyg3nx~Tuzy_JI7JZvTEgqsE)YY0|$M* zR(3(M?39APnCSR+4yb^HKOuI1JQ4#K(1M=0880!~K31NMx(_ zv~GtDwBJ}>QOlF*zB$k0N?C`~hQHYa%hP4PnhWU0_ikv%-N{q!vr})`ffN3s(mYE+ zfh%qmb{?3?3Km7e&bUOO|J?`y{?q4YFMaQ2DT(V{4a!^Ys7pV_L@bKm&<~v<2tb;J z>+6S_^1|SqtjQZrHgJ%{jWSb1d|UjJ{=Qr@l=2i~fKX)P{$*It(`*w~s4maE8|Ppq zZ7X5{yraylTN}mQR;yN*#zH=2G^+={FKXljic=JKKUU9m{)cuPz4Km0adRJBHW+kL z;*0LloT@p0v9mIbzE8Zzmj0_eF(CKa@@2g;yoa1@!CMDAW~FaL4KgoRXaXzPXQYPu}+V`dN4J4ubh1 zde`pohDexG7tMC|j~5gFitnW%-0yccu6eFi64DUnVCO=;O@_~kE5f^4vwf(R<|yCV zj){+!EXze6{o6;o%wbF3NTj3hJ&99EN*R9L)$gq)7SuPARmjO@XV(sSj>vDcCBfkB z9*b)J5_d(`YrE?O=40rYEh&9^RcMQpCcY}7C+nsOUPrWWS=;LInN!E;|5HF|3qC09 z1pfmOOzX^cuW^gy$Jne@?AB@?THabc(4xf*l$&wLg4#}xYMmkjTa4WGzvP>{kC=rn z9v+gDdPocBPJC&R50MQobj)Ru^eVMJNuv}MQFp=c46Q3~n5|A&&_~5$=oapm?J6IR z{5WcoAb4sDe=wj@KmmAidwwsgc=!vnhL=+ueSf`S8^g{ecqx zsLj>|g@Ns~F@6!Bk0{PG-!}k#Tu>uFq+ooEfR&rQqSG5|JYq{VzGi^3{sKe&5!|=9 z{S7cTS+4O^0b_Av-I3p9*+Ao+Hicu%+de%F&qa&QxXauQCdbJ z_Tgp&!Nj6N@ZOTAr@xmSogB`~nF4jBDjNvgk$HnmUAgpaa9b}q{q=$|RTC}V^R;{A z-}au6<852rvrpj*L&2`DNPB!9|ISf?yW%rAJ|Zxs?ZIA)=p{VCLlfh1ckM&q&QvvR zoLr_f!EjF50-ea)exKHR(bF|(H%YJHw$;keG_O$lf7z7NLsLH3%734H%o{13Y3uFY zO*9mfXMOm)y?UynOG37JZqjSh7xk_Io}lU~!6vBhzf0-<{S-jWhj;<=*{((WzyFtz z3XA$Le7V(BN7?yn&UZA>73|)ek zgVLm&CHKOHku5e(e~{l+U?R7l#h>vM;#@2~w{>)s=d5@$P{DH^xsF)$#7K^OzPZ%Ar34#V!p>z1@W8 zF?ma#G|mH~u{u4)lvI|vEr#It_I#T~zj$BPp4)FD57>Iuu_-f|mW&)LZNeq9jT*?_ zp2UOK)IaELP-`S*=KJRw`8Dy8&SV0WkJ}}^qKEdbeepYN_mJ&QI!m8Hc*Xo;WZJQk ztlc~R({%YOc?AT@aORk+#&M7X-7f}BcYE7#F4Q4Z$ z;Y>k_4S#nA}Mo^eB)BSQj)K=H7FVDfp4&Vv+p_*89?*>Pnu5DjJlT`uD_?<{sUzAW#Hy+ zA6Sa`HmIAOQ^iV7qYJddP{!y9{Q`pF%V2ZfQXUul_H^>6%PY#fN!bdJd9Kud4DEyL zSO-%0d%LvP{hw}-2z&)Xkk zoaD`+{4~`&!_(Y{Q1m6A&tnIpTP4a4F4Nn}eLZrYO2IS^%c-26CcVk+%Pbr02$kKb zy{dRCnC5e-ta*TW>t(gct0-zQH9a5|Z*ltBWcYWh7bC3?W-p#J@=dSx%`RPLxPNVd zdD*&en5xFi5KzQw&$LO#yOP588M+&|q38D%nXe_1E_W>0&Sy}=BGsmnvUfli}R2Y)AdrsOb1!F08qPV+W71AX&5lDQgi z;b{@#?A%sAmG0kD`cKdOMw@WHT1+~|Lr>d%yn;J91)FL|+Xvs~(mF%=nuy?jw$Xjp z{F4+y`;N-H^ZmK{RsbsQEOMvs&@Zlz3G9s6vr$74{D*ZE2P(~ z?~F?J4FgUth5gz7x~eZA;66Yn2B_jYjg$1YG?Ti>;53URv(>S)_HXG{m8XSACXX!H zyyO4x`#ZQW%n?8&cW?LhEB8})!UBkC>P-9TahkaYfT5!^IMY2YT#N1C@zx9`4)Ss< zV`F}u(lfoes%vRAi9tZ<``2Cd8X*z{{`eI@jHz9!@d&;|lw!I4uV`{)@x1(6x2}d~JR_8HEgvcMP9GuxO4Zn{&^6Cw5+?J+G4~TsOxM}T0p4BQ;#~QCh*@o= zQ*%D1>U7V$mk5Q{IX}7g1(3NCy8ldds0A_q&Ee$bi^zd1QmPhU3B~EbAOJY=7PZ{m zOr`HM`Riel^j*gR{|-%goVoEt)5l4C=G4_!jfuwmlN1X_aV%NkE^|vVExy@M6CVQ9n_|C#wA!v3oNd$ z_G+-E1c3e4qGQgjN_Zt!&<<%f{u>0t!`7_D|5{vR4yR9Vp_8na_&14~}?0t%k=$PCj06|1(0LS;3KV0F#qyK*X&B{N^bGCkg7?4 zQdw++rMqR1z26=_$jB+lh|Hllh(fuXh5@^yw{$5-YmYi6#I9Es{605p^ei4NkDntm zpevG%gOz9)a{F&(;oJ=ib`i9#yoXx+Zr_v(Sp50cKzw?7wTstx&n5#X$!1mERNsfk zL^Cis_~o*u`xx%C!asK#79Ut-1u5gz?Nh^kB@~4_#Aj)IMD*~4+}_&!G&66X?d|6M z`z5BT#7^9Pwc7XJ0_qBo6F`icn>j~!9&YVIuYqHbyy{oKk%`kjYR_quqrE1`KWl+C zbf?hcVYR1-rF1rC#rcHDVb+SsL1s{WQR&A|stW4!otWYpE?c07-mM6;q97fmZ@Q0G z(bNr+_4Gk*eP96Itc0=6q;*!t9taX%%itj(pB#qSOXyv zR-G!#kJnwPlv+RpSGJUCIBQCo$< zIC9Q4qhp^S%}cfE47xgSs@eKGyGLH^w|V_a1g?V7Nl8pdM%lEXRKNt9xsv$B@)03T zF_8Hg%DH^9$L)iei#<$JTYG9u&20X^?;$iW;vYE_-CZ;FH^-c>%*=}C$BH`g%kF6& zui!AGoVd>h6xwKOyF@u5n0ogvvE?ePdv{O{2yvRi;7DED#;V+GkyDlPzGd{o)AM#+ zz>vpEP0KImqkEc0)mR+<&kz3_oHXWt2Vr5cT1{5rMTTBg!<^+G0@X(%Xy$DCdR>5q z@xJO8p2RgQ=2LaIbb*=+D}XR71vR*&8nZ=m9m0Z;XKWhX@$)K^0vS?|ND7>!r1>&G zq2ruMF1^dZ-6R+~)7ch6l|J|3fN1ye1j8`1Mvk}^b``8fVQfSw5{VHPh_xIh;03?% z*J&kLDTcr2^093O4Q7-FUvJj>&<$jASN|=r0Ikw;LeXxqd(Ol5NB^-vAb;~*vTn(#eHSF! z_4WPPX@OEsenJR++ggRoR@Eo!pN2^^m2DFuB7@^#|9mSUj1oZ*?hgS?*zxTKDI4B# z{<|!zIoxI&nQcGy?{gV2+48IIRnR2lv-#tKq_E|p2(GA6pCVCTY)El3SPR4&Z3-?U z#ElNec{{aZ?x5zDM}6Q@QueUkAogW?g%)V}U-T6t)t+&;El|*^WOa5u>3+0`qItBu zTD(o&ER&8Gw#%uc#youC@pv+P-cA|F8ngONh=dAO9~wa5nFrh!=C zEmu0>v8*q5{te$`KJU_1jc2-9FeHRe{gomE<92=-wrG)rP* zc#2fnS)Coc<(AjwJdB)y)%5h-b$&i)^Kvy0iq5qxs;W^l6)WKrr*lz0V~?U(E2}-v zudx|~g%3>uo(a>V^Y*@TH8!Z@*cp*9IK-EpClP@*?{-P9Gw!pceR*w*N`b%mv%0y&Q z6Y1KkuD|@^+<2`QO^V-Jw{2`M8`&OtK*6;Tvz=2DNrS#O>Z_~71DKM)ugA>Ack$y) z?46cRfqT%4KzOclMUi*}T&Xq`cN*xL`MucIt*1_Xc?~a|DfHpL1(r zf0nc9B1DDCc1&nl?^ei-SSZD{>)mQ;uZyscPiUJdX6RnmnlxSJ<0UT!vSL#2pYii_ zZZ)IOvLxm`n4Qe*atJxm7>8yTO6~arjn;qhmh!MRZwbJ{y$_sG`jyCBxAHy zYv-Q)HtTv*9L2gVVK*9`>olDhqI~cc5czQILG2xC#=~%E(Bc7+c?73$2qtmVdg^sQ z96Xc*mo&rJxncJTs;y2}g~^Ii5Ob%n4aS4pL@|N*t%W}MaUL<%+gGGsBQ%-;KZ@5T zqxGw2J{Z#xHHAKZ)w(}#phyi2Xv)1~;h))+!OZf3ol!cp8BqN#kurM4H%>QJ;Mf(0 zbyI)G(e1Y7i_oaiW);?Fh&Zz|&}3io`F6k%kj?m9GcE1MOV`6s0Imd= z3O!!z{7bF+(P6B|Bj{W|IT7sgENuIsIsis_mv*-2u)skHU>oV9d7c&^yx*9~^Yt_> z@ez=gHxk8jKNFgR(R-PXfhs;}0M~!mUz`pVHs84Zj?<G!mu!EY%SW3p(h*F$w`}cKh799hFiD# zdAH*j%~s|9{o5$E;eY>-kmK6 z0Z+Ou-RreP-`Rg%M2FWsO67GPANtVqL46M7$Rw`mxKQG|8(H4O3Yo z7JO^$Rqj|_gkcm`?2UQJ(R4)qlQW<6fb;VfwDXc4xAfCg8v>WoLcx|ipBagO&)9E) zIKAHinNnl*vUz3Vh=td3mN5X7l(nEV0earNt__uPKB3%GdWoFy?41yD!3%>OuNTL9 z0N-)DbcI{%HPL;(Z(7H@j=?af_;3CAew;35T*UI@f|L}p1%P1+6f?#K?>mabhm%aRq{R=cE#hLpqXlc)q=%k#86T_e$=%o*b zELgdL0$rv+Ukg42&*ILCMg6#Nx(^E;_(WhGesm0lR z|MWk6DY4AI_4NO-DE+I!tGSXHhERJE`H*Rg4USO1%3noWh2X37s0{YBPg5UMEO~d$ z?_Xqs3>n|YF_@OzFTT_%!&e#h+gAmf#av?23N@a;+n0xP34cPYbJDwh7Ajy}Bjxpc z5`vwr7vU74FZFO)ONkCYrIz%nZV%!d2DsgXi{N@}U%k~ceV)_yarM5dy)~zYec((q z$0*iu1AHy!lz#SD&ECzuu6%FUm)CZ!h6^ZEWoqjT4wQ&|-OHi^QB6|U9bVrd$`s#7 z)vP#$Spz@F$&Lubf0vgbBJv63clxpY7Scmetkxe;R+OiSTUl&6k#66l3#k}3qPb5j z$^c}be_KD!Z=O;E6<{mrE^3n{H-@Sn%IHOR{C(aYH+PI`g@%LK@-5YtMxSpAwb$cp zxQ0HynS{WCz!-X>H@T{PW@>St?cHyeqs*)QyY5EL9^&o(==NccOm28)Q$%C{#;uCf zdOf-Gu9VEQbKNVaS>wn>j8a^^bKd zjcli3Y{q+L`Z95ZHZyDI$=%uZ`;Qx1pfeu+eg|Iym7Nzh+wcshBa!`r$3WX>#@;C( zj++(?3c=Gg!CbEX^ZUFWU;EMY?b-{#sXp{(4_6MD9yWowaS-2Rc!iOr#>H@Dqz?^3 zt`#^9{@w~#E6J;kYU%sTfk}OvjMk&F_!eYa%)fCVYzzn^W>h4?lqV;PyH0*f3wY@N zym7S^hLw0Szpk#+Z6)__JUXk4J09(ZxA-n1R^lCEcJ2jn7QXMMJVW6@Mm=^caSQ1w zuK=Z=vv!8BLS7aw8~-W1{(9YVr7u$q&V=^NFoV?XL>MbzcP>6>s;6}u!B%(0voo5y z{A#!K9Jlsnz5(<3$Ae8GBW-oaNnqU=SUf_~6VGUKK9lko93>6k<&wUvryIO$JxCKT z+^uEL6Crc?A48){yQ|39J(YN3PsKT(s&YZK@7&CMJYFgZ8lUgSu=Dv@)x}|eB`Ob$ zPM-PJ$5(NdTUgMVqs8|Wx>Q+9KyCMzuF2D*^Hx2n9)dRT-LDmCz|ZRA;%O#44!34v z-!p`3yi7y-b%<+RgAnB|^&v!F-MjGd`m0k9S0Q7ATF56bU z9|GTdXjl9z3nBI&1jDZv*t1@|jFD*XWIrd|Iu~$asSbFraDNE-2{37P%fsqaY60(KI_$@u2dzMaOJ(f)yChX;ZAn_y z=>5MkHg=EuPg5vo6inm)4+iF0VuL5SOtG)ht-XJZ=fh+YVD5=Q(O^l9BC~Fm*+t?| zAD`B^-^p_tcBA=$_MKnCw+Sqrx`6Jy>==6o8r-;T=jFPox?#D4eu_frya@^_&meKj z`%j|b%XPv`hhNZ;sN?ak17!YX+Kym3Y-C@Pfq@mD=l55y^F(oSAA{VR*tlxnDp)rj zM7^h)Qtr`-dcHp0;CNy5;b!&3%E0%uvC%cz4!qXkI=h`$b|w^0e!*kB?mzJ<3$*Y2 zx9i@O`&DO-K)PvwO87*I4hEK^=meMdmjfR3VG%u^=GcjBl^h7?H*+$s(M_bqv-0Gk ze_t)DwCMhj_4mnPw4i2DwSGVRr5@|4(qP=w@f&b~BEpOB&dq34LN2IseKh!E+hY$r=%Io!I zdw|&u+U1V=YsM<`EtBO%9L{j@Dw-&iDim3DLs1gx>Zq-Kg~a^&rZHY~%&&^>gU#{^ z1sO;;2QGqG>2BZGb@R}w#eg&M)5A7yE48H;WT)S+#|D_f_xvyua=0)VY*cjb?TP*E zREoQ#z~fcl2nFfYy=G0xR_VEY)MYQOj*L={JS4v98F_c#zh)CpN1y z7_*q4_q3|q&-et$#UV_&E)@~`@;`V{PYe;7m{T>Z+QS3G6w-{vk10uae7V0k`Xznq zhIcX;gC;z_vDGoj;U8a?<{!f5%H~7I*;jxSHq+?y+?PXTRFoJrO1O`8X3#VP01iTgPy&D3co39+mP=4iB4#@ql&mdV zUc+MvYy)e}OPGUX3B*w$JPY{+v%u$uchK+j^H|? zo_FDY3M1IIq9_Zm)?AHGH{)ynINR__qR;@UeDA{mG9X-pZjzLjy{g@yG>2lRWNwI_ z(OrUNh~pbl+KxnKaC&(yxx}gVLsv&-QR5pp1FFTOk))#6Ss_=C<5JkMJ*9AQl=Tdk zEHccC6xW#sA~$*S$(*k7ryskLJlyq1e4(KzW3J>*c5(muNvRkFd&Ez!+xlIq{8N2G22;y>YE^`83mm*3Te_lj;KLQzn6 z4aqa~2u&kSLo*SM7J+Q1JL zkhT}2=lD62OJ*oi=*C%t;0Y%^f8S4!!E_k=zcXelWeD#eA>(!|_wGi9?f=oI#kwvD zLDXs177xi_^YYo{5 z4ST79e670b6L6+RVzu@mYYx=&{3hImWD1Kcnes9pBik!R>;~xk>bkzy5pmzRR4&he< z&T$CY+x?2V$(zXNq8G?C!n3;llv25w8i0TW1#eGp;T8yQQ=5a9WlLR{_oiyM-Y#|Q zB%y7Y3+6Y0fqy{zczI^b^WOB+Bfj?GQ}SJW33^1f%2+yI?5X!So{AH}JLB9$bCZf@Y5BrTkqkxrk|3x@!s5*2oUw>@&G8e1G!VBcb%J1 zl_fxg_hJ928o90>P0R>77?IO$D1fGQi3J03V$O5Buw@x5|HiC4%z+f>+x~Hy#d;`% zPhbeIJ+3#iySYMQ#`930x`*^0XBey)unc*!y?ezxfqXjuz&p&Pjjffg>Iy*!l@rcP ziDww9YQm1bFH)&QTN&e0nx_bYyU~9ik1c|VXK&9Jw!Q3u(RUr<*gfytvAlzquu2Z% zI^xWQmZXnFh*(!Jt(iM_KpC6*&L@IMsszlP3DWxq&I%H^p(mZoUdLU;|W zW!>)!y{TrpEh2K;C-edx+wei7M^xOui2-82FB@SWwpR=9 z#FD)ggFy@J95S#seT;!SCq|m*=OFl@Eiy2-n;n0SVtLr*T8fTx($NR6Ql;rp>Z=Yn zRJqrS@}jjH@_`JboBCD;UYgk{>gFm_2$AG{J}Qw@FLDw{Ou+1)cHb1{Tg6&kW-1W^@?-ky-yH4q zjTdKKE+V^55t8Q8M4QmmrZHThT8oDXZ?)bJvHU!c`{m)a)xvhYDD_u}7VVSxINXu5 zK;ktW4FrHV!On%?`MWe}kmt$cBm3v_jzdP`)$`Gnt!YcdY$aO+G{IQl#Uc4?b+?H8HmOM#-HZ3ARp$>=n-rs)qCJ{)_AYQ>NV^Dhj zjCU)gL9*nNEHZ_aPy<0$zE0<5<+>=mNj8@S#zk1g~77_@{`;x2TL>T>ZmP&N>GDhrOvZ`Gz2ZyeT& zL_Iek!SgetYN(Lv63%Ou<~9A) zO6zp-IAiJV+e#yi7EORHI_)>Ey>C>Np2M}EGVBo&v{xu5>|r9Rq@%(g;BTp8NuzW` zmnBhF2IPzVEkcg_e{}ey zo#mws26mByMa?=&ObYypaQfhAHzSmX15R+V0LOi0vLfOsje_8NGdt-4{@VziFt_y3_rvQ<3fi#WAK_uqvGu!dEAQyO2UDtW>R>h< zM|;|NV)y8S@Ez1&X60+n)Q%IMr6p`)O{l0!JGeqyg8G;1v8i7N_Tu;$$30q_JxD$O zvsb`rpUYRp48*j2)qKIA*u@SH-4$Y0 z!GsfTq{YzbbtC_kZx+SQ+=7I$I3+FecRZf-;ZvU>E5UE9_xU)r6`@T#Bs)3$S|bg^ zV*V1~8T3S{G|7U#VXKfTyv(p4^6#gnW+=~QE>u9Ix~AGcztqq_Xb^UL2mloQ(EYvc z^W$fR%U!Ye*4kLQV7>H%C-m#|_)#5=TD-0e1-;+8i9Vs>gr>AK@ ziQKcM<~hOm2*-nY;kfODVqA7hFHr|i(|BdSpZ+Y|o1!0r*SNsuGHsyv;8)35;li3O zuz=v)Hjn#)tZrLtzPUN6Z1km=?kX~&gpJjG?7BLL#_nHgFly=%@{DIt*^-NAGsQ0L ze}#zeZpD!izCX0-rsZYaw)exMKG9}@-f3+P{)=;r@nVq7cD6f~kM&Z?(@C$5N-zUK zb`z5b$b=>YV70VN?$Yu(|#kA7GkIW zF-eZTQv7Wm8E!-2CkWTvuH|F*%`Kt|>4|Jt&)NbF2gK;8#PHcj0@t8kIo6>(e-0vU zQUY6$ump>QN6ytD{51F(#Coc7_8Rvy=Uzn_yMIYrf152w3JJG31n(1mjd@ICjOnO8 z>}K$B$DN|ws&@+b*V|I&U1L@B%Mfd@bi0`dforl0+{hY_jTETrnkeP)Ac74>b{-_f zb{1n%e3CEoLW28!wpAYWzpQXS&wNUo`qa$j=-gOQv_UY4_75TCfWV}Kh&aY&p(%a246WQwmUxiY^Q55F1JlFfm(-XqvIvO0p;dc6`iW}vc>s) z%<&fKJms{F4n@7yZk{pyC0sFLtwDCAU??E4UtQ_N<5;I4s*9?`P{wt zO(~v0Ctd`G;&rxZc%%X?3S{f)usWD^pnw+`j&; z>kq=({dg{I`y#66n@4%qVg1%$BY*<bboasi+|_xQ z-}l>%8pNEv@z=AB?SvnQxt|wA`r(=?ZDMv~CBn3f1FfpKStS+xv0V!PI$b~U@V^@d zg+OXBziQemBe21bfCWBzUK-n}IzOLKJWEb9wspVG$^-EuMa7bYk^2sd>fWW2(d4tF zffgXiSm;pLP=X_4%K*RpxT&_;(me0hr`Fx!`2@YLXx?w(ktzk{kHP>LZk_Ary1H65 z=<_F=Sn3U!1rKivI4z6t64yvm}D9&DO8DP*Ra2q?Dey2Bv|D)t(rVRv#Yad*1=QW%&ohZt zRY~}9Y`%Pt)?HE$l2P~|&N0~dIg zGA`@WlJxPB{1a2`0RVTD;g;$d)EI4 z*lg!x!V_vWed-Ns>q(I%oJp2^oV!Kb1#>K3CVv_r8)=pu+Zg)z-v1(>p`sOc^5w+? zeL>@L+?e1H${8*Z?P@>7s``*W52@eV;nRC3{&K`Mgqs^VYB}(}b_}#?IP_w7??{SC zH!(2ZKSuhEsQerhP@Q7c3{mgpYgQV~F)W5sJ>Sr^_$Ezcp zamM1v!t>cr@e8DAzI2WLoA?;i-}fT;l{~j^(!h(Xei-}gT}QXVkK{wmDN6@MCb_#` z9gFSXR;M@45tQ&7_rz+AatN8o8x=cW)szZhwbM~=D+s~PIdzs&f>Oxe7Vaalzr7`N zMvD2q?a@2XKHfSG{BkY9rz`L@q%OXsQe1X1CEEscs;dfcna0)s`uDz~QaW#9j{H*2 z6;*!$RsHE@HjHQebU)I+%4#@qDgYs5*k-4rnKy80_$Q#FC39kw`yKi~Q; zR3g6geaR7s+YWtp+?Vi68SyrzqJL_Fgfm{fSNqOh^j6P^4 zTPJch#+d2mix>;*B>lFjg$ay#;jcd65mjpo@(>~K?T}Fj^WvzY12WgS-b9y`=p4r6 z==N9NOC7Qj?Gac>v7|$ODIqY;pIg5n08URhGF;-m)AByW)A3#0A7@gq$kJF@WI_dm24MS`r_e#YVJp_8!!|^ zH*7O*f$x2Imna3yPvQMW%`&p7zL=gpxA(G!YbNAh`0s{JW=QlmoBKZ$d}?YJE;A{s z%j?b&>d_f=Ui4g(8uIWVy+Qdlz2(^rjQjcFqdszaIeC5s0#V29tS`E_?f!6y=NG22 ztSps74CxPo3J5&&;fS=5(MCvSVZTke@vD4IJwq-30s?$g)ZPDgBR}faK)>%fo(&&Q z>t}E6D9XBD^!Q$+rGB4Z7`+A#CX!cBwb_k-Cg0%Fn!@H|KiHjj>F1HJ$4_Uac#my7 zwis8Q?aa)fz|pvW*8H&(KYE@pxW2Oo1@^}vi7+6YBgMX9oF(rie5G!9Ctt_r*HZsZ zXU{T>1c(QB`?Kp)(%znT7@*a4>AWwgV5WkP_Mx1F&~>tNn1YNPun--F*dSrFT#M7` z^$XR(dXO#vk-sa*HaAPs^7gw{v#E|nO-3rHe~$F3oM%1xI}Er^i=hg+(-iLSBOF$u z7yr;F+Mx3;-MuP;WJKVo%iG6%W9yH#k+;HJjNYcKpiF>(9QP!2zoBuf(;u}Zi!K?hYO8@!8x-1(6lll|?Kkp@*~WC8dLBfkqlK4xq?fQin~%u@zuepelKhnS-S?9C$=e#9CFaBX zEQG~R+R4;JqwfVk(=6Nlgooo(f%xGXTF+wmJjnCPOPLad|0fiIlp2JG;S6OA259xO zU+RI~i9(UaYyQcXQARBixGJOmIDDc|#z({A_fbDbV9(2Eg`x~V1bHoU>#6)?EU>Px zq7aJ)PVCo`@y%!0&hcHHlH;|ItG(Hg7OTSbln1+1e(At7vfE7pF7K{+SvPDB{aL3U z1?)tWJ!0{g_Y((C7+&>{?<=_c>rB_UrK(t-B|4a>Pjgl;ECk3Do3E4P_u0??XS$W6 zmiWPLXNI1%8StUB7buEX&_C8Ya=jGpw)-^<>$884a3nHQTwS9EU+YJD+bz$SIDVW& zT`irPy}LR+{?$)OMC8P?%N9m!=(JrZhRWF1A9@Y}v6F{3fC3LW;m|GmX{18ma`$-z z+$%n^^CU+hv0uZzo#BU@4yvNU^ZN}DPjkAorYX(EdaA-l{OlXh&shN$*GSb`hI^67Ic)0e>$KM|9@{2}nQsW0Y{F_Mlh zA!xyV=|j_1Bob);`G#~Sg>*;wQoj$AN;$HpuU$Ki^97dz0>ZJ|Noq(?{cCSY8Yc1U zs`%jDH1KM+YjTzT*j{~K!`G!%v`^aaai`&0z7w?Eln@5l+;!vA6WUG`>2I7s@@=?5$vi`Zi} zf<<5hw?x^(-S6*zlmiqstrki#~@>XSmq8ho+Vf<)Rl%wM1_Y zFh+y}0Mjq~S*Bja@WW3Xu(!YH41oPfF%03U{AR}{8s9F<1e(kyU>U9dO3W0yyOS2a z;EaY9Kg;fC$=~!dC@R4M2mp7p`w3w-en}LE{zLjS?m`Q_iLY;f=Z~!+E{?f+vMarC zWCon{E$O+MCon73lLFAf*AYn-%ysJ{_2u;gZ8D`^OW=}ve4}Cl6Vn9L|NKHSe}AR# zCH$~6WHVT-im>0Gvo!XfW;@P2YA}{}#G(h!I=g5a&8>;tDzdUelINNX5>UxU%DOT;^>y=Bw{9*W(wDhl@LnX0_RG+5q_O-vO z^D$#Dulua4>~|C_xgD_Krx$=Dyu$WGlJWZZ0tt@g2XPCE?m|f*#>yFWVi(eM{YBz-hAsK_3?>8s>i}msAV_TNrYtuR95aA<6GT`s=o`lZtyaupsFi&x-Hx`~p_J?5Yq zC!hJr(@%`_^k8j{+(O$s?XvIcTlJCuBo3)T-w;+Q70C9>K00&QEbixVgHQy7sbO*b z5p3dqA7}KL_<(>p3R8RbJm%d&Z=dJ%OlvF*#3sqi0fJk+CIUKg0d z?_s7j(&4h~)_KMJ+WN3??r)crBd+mTb}i$;japA zG{Z%P1QBj+I3Ingj8d8HHB7k)HtxU6(+~R zo3wAs{8N48Vt5u+o^(yiQZ%uEZN{v~?k_uiXHih(gx9aYc}=q_`OFN<@0^@!^R6*7 z$W6_o3-jDVlpdy?AB!i^?Fmc-mAEgaL@N^J&+hHi1rN4#&po*m z44Tz2xJ>5Ka&p`aqec3M8!)X6`~yyKddNm^)b&q^%h%vN zB%~Xpc96p^EhcAr6P_UiSV4l&bj%K`Pp) zB%E1cw(xY0fLz-x-!;yC)Xp(((hqmKoeET$!)Xi5|Xc|3psg7MwtK&yPX^{ob;KnBN7PJl~J| zdqJF9TUcAyflI~mm`Ij;|IgH+#*Ukf&$o{LiDC~QQbNkY_l)diho;Auu-dqup%pR5F<>y)Ec&O$e4MvhWak6TR&$s;J z=)9I3)v_q~ZNdvDK*C6GAmP0?U*B0B^Dq$;Gd+DvDmZ8FwKA2l{+xRFQL9D)G!;>? z51gb|7=Tnb)!&zaTh!xC78kveRuG5Xl()vHWJ{<5(ns)4A4B#ffg0CG3VxJf>_=RaT2 zb+?4Unf&>Al@b$`czySNj}uP!^#&z%q`tg<@Jw(uzVpQtfRqfUAGknz{ky1*_hYi; zud{yl>$mboa9o1H`G-%^pI!xdILHgr{jtrEiEp0$P#EU-s#05jsmF>0=coluXgIg( z9jU2WeI_%Rq~p;(URSwYIredzfwe`z^iGCY(*vTopJyZ|w$9qADkf2W1FA0aU#yE4 z9Z$M#^=EfKX2owBP;&GpUo-MR308;R8@+0=29qcAW`&PZ5u*<$FD2Tllj_E%J#g7yCDwL$2D#D27BMw>eA~WwElJM@izexQGN0*Y+J7^ zYyNQfIqh{nPpTg{7SDZ0NLy0PRW zxA!T(L^(1e)A3Hi<&N;NcA1PQV@AEnuJ|S1mO4cu&ke(61`90yW;#(2{(FAuVj^@;b9#|f-PuX=ztax+ z5z4nL{DF$fhg%2a3I%-|STU7>hx%AnsqvIM?>O-wji{oNb7Mcg)Bh&E;?u9=Zg@fb*hl)d+2mOw0s?NqsQFC z)8>X|a-JFSlV=0%AZ}SjxhWw$TBxIWL{!bQPBqo)>24`$KkmVF&Kwflw>|9Xsa;QM zs7Ita($v}?Nz`|Iq0l2rcNpVYc$s(uV+kJbd-DCRH5-0+3-7$8XI_;JzXUh;mUB5n z>azOY@G(7!f|m;vE}Ym&>%=O+Lyl7-m=XDVCxZ^#0Wl<7cwea!_S>`_9|NM{+m7m* zs)D0g4+bR)pszE%Q*h{Xt|JsDXq%Ai_y!&^pGPXWwBMFp*hHfW%A||wCVGWs(=^Ti zsj5^`BE8O3q6pZ@vAOV*az#E3^OSfu5Pa%9zqXGN_h+{9bs47Q5I zoNax#R{sK~l@Y0+A%DHVrcILdb0jmmL+k(0dwhN2#oFf}?^UK#VKyHC+PPduwj_2+ zo{tYA$Pz8%f)FPK?IM4sYWqB&_3fw4`)ldD$I%(zu1NV+li$~K@@scD9k7Y(3`L5l z#PR&xZK6yNmUF~D0And=^|Dcd_zjp1MrAxiNN*{hjc6BlNN_TFGkuZ~w7e1JOvV$& z9gL0Dp(ZDKt?d7X1Y|K3KN+E4?Knx`aht|eq&#bMBU&@=_?ED~^OeX+qw_kq^r6Vk zD-f}t?5~^VAx*xy3+xX>PM!3Eu5B-xx(G~ zpS_mZPQlNy3n9E(-r8{L9vgZHSzkB*s`m>nSca?*?z4BrBE{+DYe$`wm0B2rb8*D!Hl$? zpvZCEDLF~JU%H&(eep=lCjj4>ly@J8I`ExvmJChgu1C9ReVq3tx|{EhEqbyIkyAe! zCfeVOHuO3r_cbD@G*n8_^QMy2U>#=SZ236D_rG;q7qt6UF5^@*ile{X8j1+1eL;H` zF@99*OinNq@A9Np`-<0>*a~GL?)(ZCDNMVxULW2LY{#pnz(95%p2~NpuY8oj`}4#$ z!~`%`M~6YpshB*F8vP3X?vX-7pM1R_s%pGQ&0^fOkzwa}81_F5;sgk!8H?<4HI9O{G~!LEvf}G<+|(MK(q%*ZGbzA{ zfIeJjtlsQZx$||YsS5t3!(!C5?U`6rU;E^c0XBNIRr812zvHg(qWYu^EOs43d3);t zay{~ASS(H0kpi7Fe|R8hEX{uFEOzC}L;d7*vRWF+u_dZ6R@SY~T*elz`6TierGW## z_o3=Xg_}%V^AaD5Kk;JwO&OvcCzh%*iHu>fobpM)KL(0uzZ3&~ZjU$Z=Mo;s>`0tbNEUdYU!JyPowZ?JMaK#Q>V zFu-?fpvzk@De4oLEyEdKA1vE}jv)QG7Bl*z-+ZT8KBhQ`_1jO5ziOButa_N`S5In z8IA>ESFccihVkcmjJu6+%Qs>^Vt1a`20rN)csH_#C6dow-08NP6HKQe@R z#gzmLqkI0~Kj)uayM0qXcWrfi!JM|eqR^7qRVoGa{tsvzk`2s6a{I}2;Y{G4wPvo_ zCt&%S7Mt&d(TzZ4MQ|#W+5L7Pz99?Wb$L>dc#i=uIB>r~P_5)aNgpwnb*7zd;&*ZKn+Ps#aACCh#(} z^m93^aQ2d1@^JI0U-pCk!Sk|Rb@18=*%E{QDq2_#y!}Q;yaF-Cc|j*e2rS$omL3BR z7cjfy3znTsDj)yuJ*5T0&*P30XxdLw%J*YSvwM)WPw6M@qxuxf zW)R!K>D|u_SL$1gj{zny_}SGt!pfLhE(W*V*r1STo*W#2W?8K3-xu)3Ku|A~-2gJZ z-oedgZ-(VVqsgVZP_y#5BmkA0`rXORgUQ^*Fjl_zCGaj#!ZY*%DfKbdF&I|gn@u@3 zEff79&}s7}I8netyNy#b@k(T^bID6q&SS@hq-ms z2uW%6l?lqzfJ?EB%TrMob)QPUfbTW@)_b#@3BI zt;o+hPfww*=I$-tzt)wbKjHxDwZB-l@^rotbDU`W2imuSf(v!4t9$vUEqB*&b8H=3 ziTDnK+H++%m8_^~Vy4#gtNiNP7{HpAkAm6_?m!;B*{Q1=Me7UP+k>uhGx*#Xu0h`A?jOq{C6dop4 zsd8tNa8d)p0CdZ4*OT3)Vmg33lxOR)Q2<*7Qt6 zJrXA$&q>|-{coUDlm?NlmV;DV3?5@1&L4!v_e^Bqqzt&Ien&a_k$WigFBqScS>D$H zokrSS4-ikET3weo%r@qFHP{hk2#sAR)Ggm_Hui^-*Df%1Fe{3`qE>^^Z@ND**wv=l z5vU88V@*E}3umBz_Y%I4o!|!R&-v4-_G^{6TvKUOq~SD@lmJi`HHjbt-FFSAtJ^+| zb>{V`v9+asvjE2yk!R(7RPRJ0<_l+*$O$$$o_O!wHGyJ1mMT4X%Ry+D3rowFmks4t zoj$wf_U%FkXLv$c=;Q@%H1xOj2A*!f++0J&8g}Se1I1$bL9QSwJ9u<6da_+S`ws)r zj*5VEK5+DX5To>avgP#yNOQt8xPMkTME{=o*Q?-Pkka^u@7r-124d&va?MW^J-#hZ zO}KbX+4j`*(t4Ll`i!ktLrsg9`F&$0Kr!>0kAYP)d#tu}m%WKqeSIzN`obz5oqsUb zcGjllc!`cPxI&QLB8+QUe6~S*@*Vk$tThZrX;v_GFuurTHSpExAW-P_l}=GXCp{P& zZwoWB*od!RqO+lRVx&wop>Y z-jVx@A>P#kY`%xCh`Oz=o^8L$+)%ZtdX#k-3~vphTbTSb(Qim8 zK%wNVr_jC){KXN4`4zd*H7+q4zl1JEW7@~NIS76eq@OZvF&81@0vuS zOjC0u-&@9TFXMKZj^{??-MRh*Z;0H?O^omxy(EJb%9Ov%Ha__+jL&;1NL)Xf$GvDSS>+}$O{YKzS(tV5Eg@q~X?Kd} zFmp|V?C5yloDJSz>OIoXRh_~JvJIYeYW<33U*h(>nDetNnd?0JsrRsX7R=>w71A}l zbcNxo)lb5Ec% z`%U<)Y5_1W?AwQYU2>GoRhr*O>ovdq@mcv5__@k6m@f21#{LzSolfhs4gvh$vR~ro z^7C&ZndWsQ{1l#@Pw9;6q=ylkYKElTk}7?yvP1M0o_Yf|c@U)2aVo;cr$5sLgk57g z)Ci?-Vxqul{K%PcqA^w7CFt$DkQR(t=mTM)FO=f=KI!(e(0|G_zRFO zRWsm*uU~UI`pjKT95x@u?acf*Znit(yU%xc4EYTEp?Poseh0wI zr|j#ZgnaRIcg3^b4)ha-+#kR6k(+KGG%967h)n8PKg-W7=~6YB-n@jm2@jl|sD`FY z^CPZ5ZNA4GT3!-k%=UUo+(p*kK)-Vd#@vTZeM+-t^p~L`>YMBvUm5GcTTZ&m_S`7H zlAhL5i|_N0U$@){SJpEnrfS};OUGP{JN zJ&m78xlL6m)LqOXkVZpluBx*_t$989DgZ3-hhbH6kBWCY8`@rdwgL78cyHy~xNLwx z)O})5ypXR4jVSH1|HA5Nc_JhhJe1{BfD3-h-6l{-xrhuv+wUa#kBq0kC!t#}1+pL+ zqBYO2(adUh!&Iz6Rccd$1?HK5T=!O27ABG?A1^+j@V(M<{g{t!%6D&EKN?a+`)D7i zL=z9HWNh)7+yMcltDcY1_FWuAs1acqR~a+3M6Y4cyUVIVaw~mt@JI?R(?#wDq4Dd3 zHV*NJUt=pifKUYsFZLq3!Fw4eKU!{57aFRRIT1ksbY}F?Zq^T7jqUJt{;dM<^s#@u zh=5)Oy9mk4)7rA=s-}>AP+AtIy&Yd)6m8`w^?L%t<0hjFuj)pa>cdoccU>u1I~gHr z*M?ZRmqg_Lvu#m?>~GMUg5GXv+?^@@ek)$_Ykq++A5F^sQFE&7`ePVUi>TU}y?jmC%)}-!ZU9S^^{Z)9Z!+BnN@Q_( zu10huh@RmVev}VQaYFa%Y{IZ4!v2E4IRI`k@;RTAUfWViLtlyxgkcOAwMDb6x%4T{ ze&v{8IMa)cJku1|Gz1CoE4o(n3GCrlgWuedIRI7_kGkKxdsw7~VoP)i?1Xo5B>%Wq z+)QYW8IJ@m^GI?r^^Q=FVT+%G-X!y@2iD{r>{>xxGM^zhAjw#v*L=Zsd$P0xVuN{_03-eDBwW^{0I+WYhNV58&Zx&%EBf)Xm!iO1482nh$X z2y3oH8n%_sE4~yY6hD(uX%NeX%Q))bO?>9#>PSD*g!K4%66G^D=hw@E@#yk+y*T3u z)z>qC610=(g8KwZq(+_sEwfa8R#+$eIq|GK?Nrpg!#e!w&Rr$X70t9&U((?84wOK`)Lzd}B<0Xm!?J7^U>QUTT` z93Fo1tS@UzUlV1OenX!&?`iO$a|NaI8}w7&--|%#(ns z_IOReYlflxvw+Pz`BI^D@`tCJiF-?}X6?jBo9%J@aqk~iGxpq?$yUpxiJ7Q(=N08y z{}HB<_}iEV#yfu*r`pHU2zg2|FOs|?)0h6=y%yX{a zZzA|pBMk3bR8K9q<<`!J&(8LFo*$v5Mm!iFYy@8Qm3%BwIY>qsn*Qu)C{^>U~U-1lmq&W9?OfM7SC31&DFU+{3l^v7+5J;cgW* zqx=>r^#j|Lbt{^4%6|a;dIx)k_^7b#%J~~JJPZBD?HjuoK*^PDEn;*-dqZ0-3r1+y zVYr)P+F|OIy_y0_<>s$1c}cETv?(A_HgaAQU{y{naZ})zx97^1GlxvHAK4jhba=CN8pD=yiXabGx(WCgx4_jEx&b2U*X zQE4Km$)y#^P|ag~3o3C*%OD(oeWWpcrJ?*`iK-^4{EgJ}bvGn#&`M;AB!AE7B@6zO zI_n-st3^J0PmXp`uUi~^>rgCrKm24oL}8O z9ykSsO?R0v|Io4p3X>^x8s`rze3jnx)-EbK?U(x???oU}zAA0?y!$TVvKM-D1aH>d zV~+fYs9%yD+k_7b=^-qbZ(F8rb-G1=v3Ryb(JH;ohn1O#4gco+T%t`z%?$}ShcHmh;F22!w|#xC@p}1Q*Mjd@7uBx>_6mU{|Ma(>}Z1OP3kBetL>M_<6YUQTxf=D z8`Z_-TGHL%YD$QFI1qCu-@LYaU_VC<2$_syi$eZ z%4G+_iMv*Ig%o!){q%~aT?qW*{^IcbyG^lPct~SLMLE7e+>ya~Csra|fk_N#Zhbz3 zJ+Idn?oh*>9{bm9>+`!B(tXf5aeT*nFf{Ne%IZ?s7=K_-u#iKR9SawoT&cPCGikT$ zCCkeV=VKciEU-laS}kHqTdaNkwjK;g@HoKI*+2pNWC6aSqy&%_=Ty|9OI@fB^5_*z zPrk9U!*8Y8pN~1fy!-s*a51^0#|EO(pkNihFK?jLhY)sNsGu1SG4pU?_o1S^jcN$@ zugo1@j2k3+prTcXLVtsvn{<9cIvI~74wkTAxn=r*af^=+^&j5&n0d-pFS>3z`rew) zuDS+D1NrwwwJ5!Pz#&g38N%SsiD;@2cYh4vp!i&FT_uu^kSg=_49%+kq8ptje|68l zLddTKh=|@hAOzHYl+%lbSE3Gr0IUz8&| zGaWRByVNB@&QQhG1RSb%!O#sY58Dasd~R zTKBDWy+Aa>{Kq?SQ*bb}-E=hjONu|M=(OZ(L`Nq<$VwNPOTE`*x!f-!4PBHhfNF+a zPgz|vgU&V?)Ue~?N$j_m-c{R|8ZG#I*ncQ@twh&>W4d^E^I{zW`7P-;ZD$m*FS}b$pD@{kXH_`$CuXo z=FE?GVke94^ePK@(s_dY5r!ONw^>pfkz=Rd->^!58}_CV0q`t(?{sq;M@U8MQ@lzj z6X=ni`F?*4pXsggb@b<;AqsX7I?J@-+I#))SMd5Em$Gq2*cC0S|=Ri_8M#>AIgWm_q9y+6Qi{Pxorhv7y5{fK($B#+KaeX zDEjopFnGi4*(5YmE9?lgd6&l`pz!oO;6cR5-v&fN)oT2MOetYW>yy;_jhtbc@ zuEp44;jBJ>iC3J%4Z3qnKS}ms?sRdfJUmV=lD(RZTAM?;?+0Vt7Nq8TL`L1SkGYQz zNzElQ(ajlpL@&qgRmGnu;CzuCt`kngB0nbm)#Dy5(%$z;`Vv^v+^kQDIpm(byL(gM z=y((fTEwN+JL4(Z6uiIHPMp%T^Il%33i>qWDYtihvWLN(j1BF~9BJpp} zf}o$Iuj_)$&(nxCsaO~J`}UA$z<6_B0b)FxyRbbE0_C`!-PlLPKay$2VvpqCRmp z0dz8zVk2K~0A-$4>!zY;H-9u{*+HyVI!hv_EVqT#xc*J)^acq=K!ApHf; zdys?2+z0U&%D57@~s7 zz6X0}|FH))^X_&e^+j?D>Bo)R`FC2?Bj(%aAll)w!{tYQ)*H-6#fZ2mRT|XMkJ?R^qbCsWkk>ro2diSOFiJkkvY}O1VJI-;J7fmw#^mJzgKgA5IB%q&lpcY`QFJ(VdSzR>Qsp~# z2;EI;NCid~2z!?M!f`3>H0_@-jW%ygQ-9&E2GE>Cr%Jzn=*$4XTq z&Ch2`I`2ka7bzj23CDgx&6J8xJ@&-CJMfw9!)UkI?D#)@Z)}jlar66;95Gf|q-#ep zy*3ENym6MNu?T${YSr4r?`pqPp0A9UH2?-Y0l%~JfNXg{yB5vLO%?b+7(h8TRVRmc z*T2n=>%`ikXUj_|+6!i8_84BeMojEW{*X1`_9Rtjt1mfb*s)rUZT$gXBZAES{%~Ba@amA;G{S!^d_PjD1carqRksTCDOJpHeYs7M2Us`A*Tt3VeZD z5(3IxRA}8ww?u|Gt_u)diHd@)=WFg#w_8YOlkKZS-uKRv@6(GM#+96q!b_G=CKp#< ztT9xmgYSgk=~&NCub&0?N2{_KA-wSY@H?>TA|M&C5wD?=mRnzeAk6y){mT*=+q+f- z+reD^Ml3s>Bk4Z96P%L`M5KBn2 zZ$#1)G^5fSZ?p@7pIQEyVvE0g$t04POr(5Gio9uVzwn)63euSmXb*NR#HR|FL4V6m zY$Dv>GIb*Z4^qtlv4|w=dm&;8@F*`c`_*i$jOcuVU4s*cAmW` z<&t7WTnql-=sgqfcwQBvk85~>@u z{?nS1cLa1WoQtpdwSoAC{95@gi`|@_hpyg5h^B92y#ef)2N?A$X*@!FyHghr$DI0EaUXovFYr}0on?8Xx;eU{`kb|U3O#|v zeBJXbic4w&eb>!?YrufwfKxrSL)2=^_WeS)r+cR`xYuB(ce{KYDi7sU^hUEVhZ(DH zmfb_;b_nlj^%*Q`sa|Opao$0ojHEF@Sx=#TMb&Sw-c2CJMl2RTUik&fHMNUCwSg7b zaTp6G?SbOK+$MWn?%=z+^w!X^3k2blx!DX~czWz9?RcY<(TM{gg>Ghrq9?uATM#Wcv z!gk}e=Dq-0i~cWk-e=SYarA^Q)0*%32#KPuP*`1A(NZKh9a1foIm-KmN3%ows z-mFQ8M}Fw@J=@IE;=C!N(L1+?_Uu=Nl+pUy#QoLu3Lv!uG(uZ-{+m0$TZeG{wC(od z74CjcApAF?Zu4@_pE!4?GrW<~Iayx37u!87Jftz^r7xsM8{Yo+VO8T0ATS)z3-T+Z z57m|eX@=`#>eWLGe#rQ0v4>)D)lK7Z`%sv>l}?zSWdwz(-enYEUfW zMWlcyTVDq+W2g{q)m)7Qj2WDS^r5V362}s2^;xqX zuTK2AXNmnOn87@jxTMl{ie3`Q#Ujb~1k#KehWq^vZv}H~vf=ORQ9-cr!r~Vi!;f!U zhdXA8JJm!3;QU?$M8o0N&uFi&n<(Q!`PKfEHaP;ddIf)5EgJ-AQj(}teQIC zk~-w1)jJlSFHIEAR(X=fp2O$Z2;y!w}^^$b4!T-`>OGksfK^W7gGa=LSx`C24?=ID2}*<5fg~T<^4U^Q+6ss6$MG3cyg0 z9^q~qjQFVwQ{ldo!}N4N@8fN8vDSyW{C&k-0xcEQRM`;weT!6E`!}6Tkc69|lv8N8 znjP3Q1>^7Y8*fLSu6=!c+64ZZ6fbgmH&i+`m_28IJWp3_s>ast)^Gj;=rOjB`bMyK zh{bUEr;t9{D+n@X$Ss2yh4vk&%|itlMskJGmiw zd9PZ6RdlyIxWgsr)jDh1K&i82yUTQhZXUCIYL;Jf6SCcfW&6c)_L^Rw>Qbu~no?rA zx5$!t%r@XGOg`=S9!i2F(NkBUz;V`6K#IF|n5m1igJ+pM%`~2Td|ouV@-~^R8#ANl|`e zeNK6=;x$eYb3JGQySliZ=xDdQXj`%~{+=M=1}7f~Bina3P7m4r3LjHHZOTEYBGiZx zWb}ppflU}v#0O+VnSImbIVrBHdQ|{0PTHLAxvXwFM3FdjOwcCfck?LDhr!1AlOnE| z2J7#BCh-nq)v#|{1^sznGe>+iO_!a_*y?N5#}Z~cu*8>v`C~n4x4&LbZ6dpT1S>(b zJ$sBtM*kqj&nL0ful}O0ec|ViGK=I)s&x6LkyXh^R&OM#;d?E?B^W;Dj&a3{{mDas zYT644MGreavfDg7=j6DB!PFU+3zC`_i0cfLM}Q-}u#B*tOOSBmd=+jlfOp3^yg$mY zAg_9;edFH&7Dx~R?+}g4TYOWyRDWe8aRK=TpON`Bl(i$7KeeJF>B!V4J4p>67vi1E zY6MAn0xVt9i!u0w!b}npkwc+z&2#t20RK6mSfH-S2#QPjNPIysn(s>5i>*C*KFgic z{V>kmb=mm62B0R!A|ZTG3t5vxz4X3gaQ!7LtSD~n#L6q%l^BZMUR{Gr_AcdAR4m~b zwAWdr$KniJ&ih$e0-m5N5FNUs8oAMSJV?QhOZKC+Ao#+UjB@V_0zG-MhWdK(c6`_0B2VI#Y?>ZMYW9)SvG+D)IW0+P9rN5>~jm zjy>EpP3QUVTk+6zpMI==6ye>aYAVjUg_c}0$B<}bm=E z$0!SbN%7wJ?W$kDI}Dx$n+$Pzrw|=DKR-n4JsO#ck;m(P)PfmGYuVVUFN?dJ`0}*k zLKZ#={WDw-##Z_KE^x{QEaObue6}9AH+ydeR58y#l&#=M`5*Rb&eC_2UvDC*MJHd% zNPr)T5F$qM*EcEfBG6=KY@{4cM|YUc9a4CA%ghvA<2QK}RfC+*D%qVKR{2sspCn_N zyL=9Nll%rg6nYx&S_5;Qcf-;s2nDdh;n=5dno`c^VX}}_gR!{ZGIyvy8rKzHF4t$E z>%Tz46xCG_E3~W7^~3`2H3n~Akz(8`Ug?)p8Va$CLL|JjpjB%7QpYiZh&1x7 zzT0px4HlQw3d=00HT_jrbr!r-zSpIeCgQU!?-AG1Q`?=Vu_Z!AJLP60XG#ND!TR-n zay0QtuP0jYK7$V+lJYl-i$YR*-)=}jU1A`Q(@{Q^HMudBeeC+JMdA8g)_OS!E(#g0IH4%U)d$Nw@c_s@ zjG_Kp(!SBNpWhQLe8HQZtX#;6jfrMD2*_7FOqk!#7kFJ#N=WG&Tzkc1hz&RgdGfJ+ zqTkyJkzJBm{JXauhl(V~F|-g$`^&C%jEvvr?0Ne6cakhgPZ#Pv738%wdE?R^D?bcag{f*T{V@;j#t@b{Bg@wmhEx>w1!k9EZKfl6~!>$P@je;B&!I zY#_f41j+=*?PbN>fldJG=U5kdOu}aril9M7ms}W3Y@RnX|4p?Nh~Us#eakCDj2hmX z^VDAcOz`gJ3owlC%;M$yg}hF=H4m?3-W9lN=4XUsy&dwI@h>7;cU+ z&L6K-cOAWfcO}pVcLX8g#3)sCO^C`OhO`%hB}f)xX|X`3DR1m!1S9 zv`p*dJ^I;5qxfWICbt0C210pUW-y|en%Pkb1gM-Bg1B5HJ}sb{_P712?}PD=w&*;0 ziq|IpN4gXLyFGs^#@;LfSCTS(c7;nfNRq*frCFUN-OKP zlEuF{re?H#bMe^xjO`m9A)mc=U&2c;Uc1>}=EjtkF6HurOZQ?u=6ZivbEfLy@2nQVqZ+>IUs z)VLlrFbOEKe&V3Lq00i@k;Ny2Jw17xi3(&DVdV1x1hHz+58VquS>Usu;(5HMI?~Sb zhrLU`e>V0xWl&M;9oi;TxybfVtEJBwar;|?@1e2(7L=p7`?7D0{khYK>a%Tf-{Bb1 zh}#h_-B3%rhTyK&?}e9}xngw(bSTANwY_z>=V0wpb1&KdsKE@|?8qQp_qR7!vUt4b zrn)_LZ}~utec8f?C-oa+%Lk{Yd2443Db%oiss+r~!U zQSC)yB&zqWQD!futFneeU)&Uf8i9m(We!+I$pJ2ji8) z+G@gqa|hjVg;n6N9V<4AvUf%QT~1Zhc373^byywL47` z47!>S-{@|w6|l1S-8xtax9N$<_m3GuSDS9(>M?cX&|3VeQu%WDydZa0E5wcO@^NS7 zO1t8^FI1Olkx$(lh4$Dr!zKH?t7H9jRL@|209E?IOBKL(^Z;{y$)uN!u6ak3`u3EQ zxPJJ4sEN#w)+puHH<{bFLL#@wrXFHrt0>+YSI|BM;;(h^ z3Rw~-bEm&ws{n?9&n<)cNbSOS$YF-<%QW=*`$_BZjXCFlKU*AFFNLQf_fjR0Fr>K8 zG~oNLgmc^;{5kZk%lq817cO4<(yZ}oB&ayE(6USlXh%Ur*CK%ol76wEY`xc+D zTvOS}$NbJM!&sxw_DhwizWC^`X`U$y~0VE~69Zv!iwdJR!rL1c@e(2g^a zTZWEBd;>cuc}`SS)dS}_#&JL5BF1p2j(W0^oio+~ORZnScu&i@`*LC)n%FM{~Lmpp5! zxnSn_fDu07ZUudcl6{F_w*m<}*@4$y%w zeTncxi2L}#S?U2lk41AYwCq}wAqcdR8BzQ!6@_?j(xz0&R{Qg(FQ-J}NIKz`{yrPi zg8DB$e(Aj}RigRh>(DJu%(H#jh8BU0U7lf-RKNDGu4Hr5nCdg52R0rm=50_e#P zYl!(;tgMOFs(y8jFw5R|6E$z+{!=jb-5zAV`k%z023}-(JkA{pZL$w1ku>F(e_*aH zzxVaJ)##4);B~`tSfKjDEAs1#+Se;{cE5> zwjf-7-{;8zkZyo?SI{Ic=(p2vjJ2VO^tLquce`LbdErY|ZdG~nc=0^K=cSJA5`1Ml z)>Ds(nJQT?l=cNz9p;ab9GjAm2liz<-af*@$Ueh(Z*cHr(S<`fIH%w{m0M2L-Yr>5 zC8#h|xDvXLhF3rq!Z9s=7zc-7KB4q2@hrPZ>xf1EWnAgRk8sgw(`q_a#NNQV_~54N zv}LSGH@mwlP0#2UQS?|9tz&W9HOP~#pg{s$&p2&*L={uxqtJUr%m#vAg#>+8A9j{z zU+W3FMZ(aT(IAP9Qng|fw6(ofn~6a9JAAf?Z$+B=Dk9788iO7O2JVx?q83f5JIjk2 zkt-6N<<)YR4dkCbCK!|4@Dcep>D}A@d3cLgZCf5 zTR#`wH3A{&cpN#3#23uub+N9izMI1u6*qS0@LDw zl!1cu{Pk}d+jn33v4OIlmE*=)JH@{IHc6ZMud42Y58^s`y;~^1ufbyf48%9BB4Nij zvvUdFdIdKn>b#7)EK%o46k5*Z-QiouMsT`b_l`C}j##&A3PpXiU7qF&A;Tjte3{kQ z_qj2Ib~5WrXM=7lcO9-VxFS9&%9l0vlX1d#@MSuxtDkOsE$@e-1*+<@<~^Mik#@1s z^ObJ!st8H*&5lPU{+v@B@bBI!R>o02meU_yG81$RU;TQ z4#623PY+DY^{MczJihP20}^Bu_s^t%t}d*@yY8#>Mp@e%BIdt}bafGS^zuFdLOc%_ zdQ~NY$6;l_E&j)yP$aeFgmBX#)yR*;Kcrj8gZshMaV(Bw>PRIA6W+dUzwY5m2w_|D zTCzZn9gj#%*J8>7lP>v^S3j^JO9l75PHsKZ+p{(Jk>| zU((fI?a!zxy9+{!cKtCm`iF4YZj*RO)@hg;bYbDaQ`R-#UY31F1 zW==v8qbNE8c;1#&W|9t|xaLoBM5P-l}u6`}d zYisetBe(&R__%cDwIngg9`*pQH_0br%GwHg0HI} zG!{h<8PPn$v+-F5iWCVN-T;eK%<38yFi`bhMk zXb4n<*4qnYbG^lSoA7YmirecJLnM_;3oPT3F$p84qjD@hY51iSHqPIUa|(VXmv(U> z_->pE3a_`Y&^wNe-tw`$#n3k}3B3l#nyU7P2*=L(-GM_NJnp2X1+#SDr1ke5opGag z@K5&@_$(4tx`2LGAYWu?b2&-N({{{){3hD3k@fJ}3;6jIMoQbCVO9*;@Q!cW)*nBz zMFJ8p`&9-`uQlnNZim%xvAqvt^^C%SB-`}eANP}?wzB@?=)9I3g|;mCZFnQRhc^i! zi~xZEVZOezdLHIROw4UlEx|c^ua)_l2qc?G@BXYaM*s^YvQC4{KVf)9UcS!!D>drp z49vMO=Ppj}&HN4z0&AsHew$z370vqRUh=6BmB{Oocie>e8gQ9U;)d?f!{KzDA?em} zZ$SdReR*G$KR~s_d7+dJWYtX)h;GE2=Qjip&3>;BvB7atKI_gwzbdLF-CmqwNZQi! zMLrOueLm7ksTW^2?phSyN5woWyt`^kXq0^E)xQdB?mO@@X)3h|_o9=cEahnqKkL~J-TM{WB%Oa;{Dm0 z-!pcjr3oJu1rqbPJ>GLPUE|pNI)avsg32hR0K_-RdyMXsXi?{SYjOuS8+{z)7B~LO zJIe*y>!2}sgS_x-KMO?**VC?a{>+T_m2PPn3lrpGsWIV-vYG3v?JIn^%E(~cfTVxq zG#0H}=)Ba6eA(nh291&q*D(geL_%19#nZ!04`cfvCCay#PhjAD5ixSw*6X7Un?34X zEnXc17su@*RLD3|rmXV(o*VX>4WDl$?YP-C%Ms?x z{I11&1w`&Sg}DV?1+5x>%L)s{n5&8F;YB|$>lMHfg?1Hi*w`c*92e>zi+RQ|@~xRAH>Qt#x1 zu^))hD#W4Bqf{DWgPp~mB=ckhKlc7n!dnC?%3*Ktxv~5pyR*jY}qL<&LlW zXDd7Y$7s4A&rCA3mktG?o%AfsBT`bW8v1`&;et#5>b$zw0S-N44f#V~+k_jI&4>O# zT-vt?pbO#sJbp;Zq-dXB!cEzA^4$F+KTX%nV|Oris>sk#fgPZ>F$ z_)lhVHE^Q2u;PBl?}vCsVBM}4Q~v#7&-gl>fD3A_%WjPuK|*Hp^nUmh>tpS7t2?0R zuyU$yi-s(<{rDjTFTc7y`S3*UaILF*u_PZ`b9G$z70fola`GS9vYi(AyXoSGzFG?; zl8_+sJ$(AY#O6pS{HT6aIFhX7@#%w)v~%Qj@9C2OfSrT+X+GCb{Y1gN%v=S?8Bvj( zyEdqAnp)oBd%cA2tE@YOMeF=!{Pp?p4!tGbK5G7+j#s0;kv;4tftm`Wtr*maJ!kPg};k?eGN`4ge*Efr0cizlGY4afc)H9U&HG|HY466^p|6ZYyP*?M^Zm}Kkd65x~ zUh(?-4Wcyx65z!z0ZN?|ltNp%x6sa0o=Kl4qRj2SG1OE4u>ls6}H}^B8^`~@&I*ZTk z+ZaET)#UHF!v(auq`@Kv(UnGGtIMl+$YXSQg&)g4sVF%-=(sUb`TV6d%2r-oylGm!=xUm>W`t?j?JNd+nk{SX5jz=Trkgx{E;ig)6!`|Y zr7E}Jo_ww;Ap#rJRYNaK%yjNkogpJM8asUR-vTuC$CvfjdKd0i@uuGSc9;jb;?4Xt z2=+dk`^}ukvaJt@4+yfiUVPKH38{ic@F{Jd2QR=eR%>JfD0 zEM%gk*LW+QQ0aAqjh1j%7?Blgl+>H&-RyN{^!}(20jxaWnB2ho;iA5c`~5U#u+%fU zn}ajKc9&sJ^QtDT?P5(1SjicCeQ2Z%GSvtPQ}%#QT03r|5i?G2MGxHuUInd5=C_>e z-mm@74tNnM#TF3$KguA9r&aRTZiIXv+dl}>-_CjClz9!YNmK<&`{$|BBWI)_XddU1 zx}T=CW%!m?W=eSZ{gIx|_rY^DfYQx1m$+$9Fg;KBgQ~x;$;car!Hd_S8RCVDZc46C z&U>ZW{G$J_4*U~{&)Ee8HWha5M3vsd#)Z4we4bl2N)uwk@sQq8M1A~q|Dl&N=O52t z?KC4hnTen^Aa$sDdK2jM`97|cL(1$P{T?Th-R8aew;e320qx`*y!-AL7s9sJ@35Gn zP4ZbY5;))4e4WKFH)EfdK4j@(L7EGjE?b@$Q+)7T>isSk>e%R$p||f?ci}^Ny?us( zr@Bp06W@IR*f91+Ds)4Se*ssjIs7g$x>jGLt5q$55+%KoNp+=d=kI%L!?s_+^x{%Q z?Et*`%FkGL=I?U)@yG1-o6lf-^5Rh+R%N7m@tu#PW!>N2rN}r>`(>76XBhE3WFl-> z>b(>euLUF4DC#Pidp`@4aBIc#(JTb7nm_=4z=sWb?8;6; zQ>;2y9wU&w;v{Y(hA$I?&iAI`f-#&$R(h_c_I7z@m9~Ol$-KO7dS~@7+(;SN&b_H$ z9(8+oI|vh7e!^4qXYrZ=RLI%bzqLS_jjF z1}@&XczRMos8FKuGVVs*FNZI?EYdBv!z-1X-DtKrnmG)alNlEl&LZz1=K_U@g2_%%)!Q;YqeAXYx*!dAQ2a7aVJ z9?NN887*N}l5nzsL^-F6!`Y_Uk!-1qR;y$kILLrqH9qYZVeECv(X;IEWzvx=gkEfL zAZ8B_SkFVwB-Sw?(50Bg=5M(b$B4<;m11DJc4$6LwuIn>?+0<(&qY=`sS9U=6J*lU ziYnDalxDz$$J8?EaV1|D;N)MNhEZxkY z?Prc0Sij%>t;&9t+LW4^WHNBD*9E2^$d|VC&(QnzUQxrRSqAlCKb2K6;&vI7yZQ=k z`QY*v7YQeJgr9#YzHj=h{2z;c)~K9MV7wgwd$;wgjaCp$Pmegilz(BpYv^nx5;$%UrX+7a7vF>>25a#(J@St+XWZXW_wC@3?9@E<^hYb5|Z(A}}B%!-FtgP0=QWzk zJ5o;zCpm9x+i$N|^=TqtHQk=ruo=5SJDWAS_rSR04!?!&^-%L;wAj^o) zI+awpdDPuujjNbZ4aF!3LcnPCsj_RNiO1u8A?>+Yg?&8fZ)L4=dZTRlTU%SBjh1KM zpD-R;nDON|*nWMH&dNu+&45wsOZ0yHq|GCM)ttq72K*7_G%kw!e_UlKI2XS>@VlZZjxr#-(dQ|ymVaFQk2R3E}(jD$Tg=7FjF`lizp z_J}53Lies7w8%&0_uQw{bh6nCEM=gRz*~QT`QW*}|I_YT`rXi_c-bLGOSINXdb@?( zhaa1je@WHtrlbabq*M%vw)Exxu}r~*28W;)bnjmeW`EWla`4jPcgId&-|x*m;ukoJ4$bT%TK>ne;<2i`tmxbNCEl}YmwvzvXk5rU;-UHV+wyP< z$Q8J#>A$Eaa3H~)j1>pC0#nkOId3=?BLCn8jWCaV@|yVt{j^c7nloE_>vkK05Gj%V z-Br%TXoGm8Gt(N7JZf@-5D4)&iZ4yW z3heyef6Y|3vtj88`pEq2E!^wh=-v@_;7r{Kuuf|lXaIxac8z=Itas*xvhZQG^NVVh z0q1dZ!8~D5G%%el2rtMM9xN|Ud>-Sz2#VdCey0%*NU_;X$MrB?jee{!oCq150uF-s zS(C3G<7*CHley@Ca!E~PMU=-sz3G44{R5Kz90o1Cl}?~q4BMblHG z5Av!0&_;K(Fh1=EF3D1Jcp8UAvdS8x4AeH?^$<00^GPmYPc%=%o-DU(qSP17qKb=to-i~ zxm`St(Kwy>WJo;b_VaG7t#uay?KCpXzI$#~zg#qFvJPMP2qw>#YEG%LNntl$kQ?|m zJe2%=CC<0mi7BYl@nMp1_K)m&Yi>l1uTUycf0*`-%s0=x{imb7S3Z+>_6YK0isYE69L2lz6F;9TJWDn;^K zH=3;it)@Mt^`rOs_m*O!qaCQTXi}#t%qAyIZ3lZN0M@(v(ms1%95EY1EydqCvPAUX z_jEGtf|6w+_*yC~Ie@<7PcWS_8TV78Sq)$ZuN>nR`G09@%b{LD6s-D7Xl3$u>?cUIdR8dDiS6L zTQ{Y9-m9~(1Q1t}5CwfV$7SFFt~uqin?y7GkzUPP#%Dksrj{7F9JKvom$W9~J;mOL4givrZYLr?j@+CIZHykk5pMfFLjF z=-)F=x8GlETX*|AW0ByZ!vpN}(^q)J`-yxoIbxN`m#2*Q&Tqr}cwryVSwadi3$s=O zKYJ6kwm*u}JtG-IXXBg3c}K3rCLGT!=cP`&Zl?8AwryEicizBL3$}6l4T#GnTrh%x z2R0qMT*O66l+O*m2J!Xi;T_4YUb6jWmFv}1)9sd_ z(X$C%w@4GvrpPXMHu1~pMm&jdj`{WL=>YgQKZD0_nR z3KEm^SzQt~XdAt$163Y0t-e*9-!_iJg7xhJYI#qth*W4xFxZ|#u$O#S1ln88Wqwqd z{D@A|JNNSy+0S1qdu!ysAChGke845c==nMNul9H6ZYCfE*+J%>2-kCW9`-E@%PRAq z;e`&+-r-L6!rIG?W8*klx@9mL%p|1hR-<695#`O|UqGLm@|_qTIQmAUIA+J6=4xIa zyQ}NtXJ4KmmYlyeO_|vQ4WF0+Bh;iuhUI;aUoeJ(9;~|QQV+QkL$@N!H$MxFt&VU} ztvLD5Ua+JX?7%;jojGqYQh&JWzQ3N?W6oRfBQXi1lef$hYRAM#6%V=fNwSP=;&c>8 zCjnh?15wR`;^1qNJ^N%;)Z}9nFY33iH%IjGdOzlSS*ds95pjoaMsOE|&G|dB%}p^! zP;fc69K_n`Jll(XaCJmeVL4RditkGzK`yt?xb zkNXI8S=lFEt7Sqk$A0&8@4jtr4^q0bK|A^$OGiG;k}=2Q0+~zJJn=r#MX;Xu*Djw* zc_g)dm6+UVLH1j)a*Ag-++d_og1^Kf+YkR1-YH!H9UUjL>ZY&tgK{>{L(4^dfdgJa z#)exNxf&VcgXZ1_%$3|jIXAB=qvl#L&dppDppLj`f}s7P?zXI(q~N@43`3Rd`6nEI zL#@XJcqwkjK>%EmqEV(slBmt0Ys*GdBe%HC%c4rbM{N3Ws}P<8pP>n9pjHU7RH zFDNAHbV~0s(itAk*EGkCEFurvL0)Q7As@z1tF^Id2*AX@L7M|n3j*6(gY^@j1^Rs! zjbTT*4sW+jL+4MCBs|X7@N2Ca>?CK^apG-Yex3DP-`ncatRe5i%j&To#13yFUa`r` z%-}A4HnEE>OJqKo?~a^4W)drRG-6l&SaNDI!E@_AR3`met6D4kWBfgcJ2Wh4i_uoA zOKNtvy@G9zpYXDlmzkITk1+D23l(V%6aQK!Uzp*0&@4&>6E)l<2?!~&%SBdI19lBO zo9-lbF`B_QAIHO#@;krS+Eh%iqSyQU_FrcjatQf6Ezh6gzzl`iATUOAXtwYG0iKe* zdZ@lM8hrzhV?cODm6Gf-{w6G5^aQZE>ZSkaUgao>7t?rz(Qs0s;@$7orQsVTy6;4$ zD2nV)c*Gqjm%6owqSnx|ltf@(cslCsu6-AClTtd8=Epq6;tiEbymBw^zF)L>O^oa! zbc2vtI*1oObg@zmQw-xjzZCDfHp&By7|Y+tn9_vxW3LAD6}K{~o4XNcwGldzRIA<9 z9blmg%UoRE#6Q!-5H2B1@nifmiNt=yiGW?JfY~}!1(gER>3A4Id=(Ggqw~e zMm1`wd!Z><@oeKs3gyw-3b36Dq~&WvF?ZwiSgZ1{a@4o{0OjOQjqKoudQw{?EY`fG z3mUa0Cd%YJpKe`dgY0d7-Dsq_?xXpGo!Up77@3BY{a(tT$_NTgBVo87!6<*pRlh2*xlne>R6iw-Nb~ z&WVz=C+~y8Hn@4XHLkZ)yZ^!q&b)aq~14 z`rP=c(;LvcL(KNfKQ92Z(v?$4A?B!Eh-1PhZTDkKR8cWjc`K(h9FskQFCq2D8Gez2 zD`|VqpIKnK4Wads3Wq-lF_8?Od10KS!?eY$^X4)%$B89;xEcxC%Hp8%`hM?-k zLO1>T#HIJuKFMw$!J@mn63*H|8LcYHjtDA+Xvk6G{SE3!H&EJ+D4Nzm1BF8(o8G@`I2QOq;yHX z?@E}9@T@&balbG>9034<28Kw;9rHG8W>qA6An|^!#RD;^-Zho>0pIp|>$gF~hm*#y zd(DAl`sOb6hyl{>D)C+wmoX4t(!Gw8;Ne|-dUR!WQvq!GLEP7p9{aW3+Pvrt73mRc z_ghDchxz6A3on7nw0u+U4MTY|GCdCOYG14z^R8PX`|VvLqCubDT$spcjnsXVYFrNy zbGUBzvEaS=5v-}X84Pqg7uaq`C|m?`2;9EYo`=y7dxW6CJb?*majrCW+f7K zsKISxG(g8&%3)Jrx=t}`~_HxRznmp9gEVb7ul002Y&t-zVjIlxoRq#^|wnRDAhm!Kn zP4yAEPMUv^a&!QlQHm z_FZ*;9BRx>y-$7pCuz*IO#^C?@%zL9+9?vdp2!JKJ2o}=1lCbL7~mPAZN138@RA%K z?StFJ_MjeqMNW(tpx3x!K3TIR4C6np_GOo6|6zM6!YR_{S-E0orS0smAA;EzS0)Uuq<(M3)HZD)T+q zJVch)$c6&~1@t~HP-{SK=|ed9z8A1zd%uIiRM~$}nYFESc3gNgso#%!A-wAK?L|V% z7M{)CbwqEV%Am|(jMz1=r+6*D24dI)fK*J;PbCz6KKogNucEz3+w)5bSSLRj~%4&gW?{&bWOE z(r^%YY|4@JOL^fm`27j$?f3_3{Hed*gK*D*d?t28OLS4LewD*^Q~h)jZr9%m%+C;l z*FqpB!5!k|71#49u~LmkzC|kcQj=tMwS`IUq)4+_s|m?iM3LkT9Ms;wU`GHDwr2aOcGA9KBhwk}oz)k> zgI2*TNbj5WrU?$(K&3tI7gBtOXN&?B9fss=P~_};SV#e2k&shfMWYbzpu#TDwazHn z#wy3*rO?W{o$Qc}-z{qQE;B)kZL03@Xe>5(@u#`3#VN@=LE7aWcKw2f;-zc*ESL3j z%)bLJ$eVnwjDs)n2uEoE$5~YJede7=Tx_h~KW@rW^~3lnkP$o{F7~EabUp+l6h}85 zY?x4G%oelX<14Y(?N{a=>Y#ity9l&zg;gjR(!tq(9I7?jEihZlqs#O^vl;^qZf3H{U(#9>w*wZPL2#W44a!J2GP)s(+F~zEkQj<D{Kw|6HX(l8#xEbxZBk2E&+oS8>2&DD$WH&}x7 zm19&}ZZQsRa$nz*4q&u^idA3YBIc+u+PjLuP*5g{ICe0yhW5C7d+xEmni-0)!V?@H zkC@EM{(VdFcuQY#^g9ZR|KJFbw-f;;IAseR(v*IudO~dN@4;|08*C*wAO8lu;h~o` zb>wQNyX|)!IN*^Avc&HU)&FiD33I1A?Ngv*LR;{Cz`8LpiEsP;@KRReCw_RJG50jNlt+@2RzR`l0&;q9h;JX-43B5#Os@8{!FU&| zXJpYrOytuN4>99_b`x3Kt{STA$1HRPFiTwR*nZK%YFj&QpI6pmOAg=KPrmg^DVqpF~2c#j1cL$-aQ`b^4xPKrmt{1(T<&J==J zUhF#B)p+aK;pdt}h>I4oGeu?L_su?c#FLr{J?C*Z13CT7IrDb7pqDDwam82sCe-cc zTMTnW;A`3646ZZTU?yrJ;&fHxBR4k;hf@6cyr3#;R`VO9@HNFfPc5fiVS;^U@=anG z&Q{0Xv703s6co4&;nlwB_{@w`#-vDs{wCfJ8Rq?&0M1#h^7~Ff63MhNf=PlCKy`Dd zxbfw-CzZxA&STM=6bpNrF7q>!#Is!Fo%?-~l7SFh`E~8@Ibel_g zBBC1Wiz+)_-z4!qE`zO!)?xE7lP_qO=Zxql`K-_F^R*IXZNK`FjBE6l)P5gJ#W;Kn zZd0&2;#!`%tQA(D^>1|C8E66yyF;t)U6MM&-;d=(;;CgNkt?pQ zzOCCb(yf&OQc!H)xvAe!QuY9|fa1rG_bUQV@wH5uhPu*nH)x$3H06-ZzxT2GY?U_S zd7}gL?PM8aDG9LH7uWP=A1K{@HLRZ7@i6_T)pXzK&w?<&ld;ee&y$CMOaS>59mus4 zYW0EaVW6aW4qCLYii%}qVv%|YTwRm@hM;=8&*lqQg_mt*R=`B3l5I~wx#(EfO zVfC^;I#kG8p%Z~nI5l>~C?DS|RafCUzb#}bLImX^=hL$_IB`qcWG`B7eI@g%o)ml} zLg2)U%HIc!)P=StpY}mvH1EDig6K<`T=`J^R&WWQ%hBVn9Yfc8Frp>CppHwllaKhD zMN`00)Tg27kDss8nlu~B`WA&_8m43>BW{7FYr`Gg)5~o^k!7ex1r$XpG5u%^bQ@)@-vR?UhlwlqvWfXH_9uB zm~Z`1$y)jZW08M}O)KmHKbF2{yen-d8U4yU0T)W8O_8P0BSX{ynErT-ALO>j<ZKnFZuqDE1_knZSs&W1S;$9AV zRrn0qjVGqr#f7$QGk`P;9$$Ya8@^LuUW3}utqag5$?JJ2TvvmYgs0+{NCD1I`GLro z@JGK0?CCPonZ^6>dnRWCpG?RFLK;?_*tS4-sxA+&KXF-xcV($RB7HjIKs|$rm)PX` zt^PIr*bBEMzYy|GaQg!4SOPhpEVq~!uLdKh6g=dxPxy*aQ{{UFWCbbW=lkDAFgfj$mOi3 z3Jk)gz`4zx@$7q;Mv?Y8o(s4~W?P#1iarsQ;;W>bN0`wYB!RL8ChY_G-c8&lPdtqI zY3?9d?9`omL`-G}v*3hwC$+LjR9J&*@-v$sH-kH6Uf;Vm0?3{J`l79^W1v?{*ZCaX zUtjJK3@N4qkc73xqKsu$jJpssEv(y|%^JRrvt=b)Z)Udn*`Hlu4_SR~z|qV%`T*7V zNrVV zvp~lVO~vTgYrn9C(S!AZHTr$mss3eEjU%*igpITtV(1M$l6d}*&Tq9;kBsu-mjJKq zS*ZOjeU#6%?Yqq_@QRM^!0Y%$dh*$bY1cK%>9n|%?#uqV{qE>bAM4(Yxkrbg)iv?a zU5Z_maL&k~swqV4`{t`#KjF5VS&`A8Ija=H^i2ZEWbS*&`q!s@O0D)c+lOE}?@8?= z!JS;-%hleSq~SY35AI?Qae0AQI(?Er4NfUJvfX^A_}%9C_xvYLfOF2J{3!Zir?sA7Phn{Y!n1(n7lOO##TZuD=Ov z(7d3FQ}aFraOm(_S>pb9YfFmaBNMFg=~Q3ogXYx?;&^<}3>>6PG^f!OCbXK_rN>QI z%wNrEtqQ%F*ENslvG4fzeEBz6U!_TSB)@NbbsDR@a|b!)H5VWLRi10`;gE@T+8R=N z;ciU$>xGgR(1IfuzbydfP5%XS?7Cvwn*`rmB>S!4bikf-Vi}&+~8mH)k zNATH<5;G%HH`~l^bLwl4jjIpa6pd^H2Ql-~PiU}-x&yum)}<7Ws9@aTk>#$(z4R;g zM2lHf!5+^b!9Bi)*E$?VkF@s2$`T=FISS8m67<}+2yK~JIO{4XN}MdDCiaOC{p%*~ zw9@x{jxFW39a5f1?D%%x<(NP$J6K-bB^C1}4jF_h@$-#Mn8`x(QijEHXvDF=j za$8saj<(z~Ha>5+DjH4BDG!w2hvsKUtB$~SzS}{7Y&Q42Ou8~j2R#9NxHaMGeLdwn zsoAS-Ci5?I%cJRM!X7|pVUt4@RjRxKv=C&KnQ>6v?if3lgQ?5D{gt<|9xN+@;nvmH zuxQ;AF(4ce@RhBpP0R8m?h#q&UoaSg1-x4WJ&NIvO=?3YlNo`(u|}Q^{k^fsfELg1 z*ZKa@arqgrSmyl;)%Ztv?Pgc}rjOYDy^T6yu~az3R@&G1ePfn-UyRER4nlVW(#BV7 zk0y$Nk3Hfr$T1sr^O2@efd=XcM=8%19^)$1hhq);U*89{bbUwW2y+1tX=$#Z8P_pJ z4yAHfIg#j;tNsL1^=NogIcUzr(B zPyt9E{ItC^*a?Z9B@sy)IDdYUC+0)ibgjMQ2} z*Tr)B|0&4T=vS`Cn>+vo{;l=+u3!)hAG#3@_eg$kT1tT3j&G`z6IEk?vk3JOLK3MQ z%P7*G@&vgioYBjp*S^>7s~5q(EV5+W^F?UGs=I6zCzZrg6ZSoS`8>7;b-canK}8lho)I%dpLd8!M_;^)9IPp>LZ*1uoa);mXL|S=yAim&+boV z9_^H$RoewV?Oy!VHpTnX(ouD*)0mQc=7Fb&g`+RPXO#K&}lKf zIE2_oaY5=^jc?9U3-Pq0%O|76@j>_R$-3e-NiO94hg4@$rYGAk-jrJ|lvy!BkJGSF zvUUS0E+J+fIH|2Ylel}NPkBzh-hxJ3RgP3nC8$@AlNDBMbyct} z<^d*+g`7v*MtocX&1s&?j*jVja?9td-y&a~=5#WcZHYNRSDm@TBNt?UE$>+^n+l3c8ICGr?+-KmGwL}bBVhi$MM7Quzfy=PbcevZcV zB9EB$!pGn=y9K`06~f+#V$!fU63mbEp4xm2r`qQgugMdwy5?%d=X+w&UFP=Q5}-B+ zB1c=bl8c^|AbH3|sdmvYbc-*xqVc`F?3?%yJ6}rueK@DZV&o4lB?+2QxZQgxqvPk1 zLQ*vK-N&N9e9*t#5u(r^w?v8mI&ZF68>kSF*F)~@O%z7Mt(a%gw02*YoJ^%_tu;QD zvC}OgkofP0%&1YGB+OMr1Y7 zU6zgI%Qc|NOZidip#Q8V0JpfPUNUn$@x7CNsJJP!R<*AZQm5$`O{Sixd}c@>gT$+Uv+}uo0n<&W zf7aVn0<*}Pj8!kY2Zms9cx@02VcGgY&Qp3sFLqu}TC%*+uN#h~4l!+1eV=xgXLbFD zL~6fCZtN#N`Ccm1F!tl&T=-v?_{>=6-F^TYC$?(9a2wy#)=%Pw4ZH8z)j!eoY;WOu z+-NLxtPxzNtnP#v(>irEbvz|+3Nl|U-BbydqJ)NSUGK$ft5wo@koa?kjA#zJs4UFr zJkdRZav*d4EAksqER$r{t?mIA$AlV{lwCy{Kivl{oQHSXdwG5UBz>e!G9HqdK0`{S z9^4j?pYr-4S)t_R!ZWe#ACYomyvZo7>exux! zeeFkYRcj@^DMZ)#5=rALy$Gif#LCcw-*03?k^Q7E2hjSmN)JT{;V3^kW0P`|{k(2+ zL6dtV_c`=_9?xkulQxB>KI}c|DdgBc!+?uQI6`%d_;?Fl0Zs9d!txKlVS#@bNUD^- zK$743S)$td>`%{AVM2@_$=j_ie~Zg8zMDM1V&OhM*UX!|UJ_M52gNUDv8{TwryTCB zOl`Y9I48@#xWmQKIbl7#p#*T%En^~c9@=nbW^uxzr~EvR!hTIE37&lLazXsEUj`_GUB^NORi8wOk8a`y%V%ReT}! z2}GUwmd>|76CcFwHFFHv(=zj(7E{IA#ZEY!-DSAnG}9z0O)k0E3z~zM`57mrI7prk3lhZM)5|IUN*5CsEH9s)C~5ltJCkpP#?DNCb)! zkQ!dxUGZuQS8Po)jfN>7_HJbZ{$gFWj9cVNJ4mu_|F|{wKd4l?!n`Z@uh6WkfpzNc zN`og-AGa5@Gfwvy2}Ydw>JnIZX|s_RZXNHG{o6#epXc}ulRU}D zd0Q3KKDE^|hEP8}jvnIu?V|Gg8dzb&n~}bY5uib^A|IGrVlap}RRzkc2 z^a5I)FXd0_BT+sEO`uLzy4^;A-(No!YJc;Hych5D_+3!du5cre`g@I1hgacyq$dF6 zpOwwgHHadg=Je4XR_hqq72><6BfUIC7;(M#v-$0Y=}sv!U4C~jD#$Rljcx5Ij#H-Q z_l*V0;c=mnsnn*ylxp1Vx`f@j^?ZHqJhfx1ITg5lA7Lwjx<=}Et9`f17rK#b@LpH% z%J*9@XwSc$=Ujgr?MG~nW5;jMty#aFVWr*Q4>1|o@NoU%undAIm7Is4fPB1Gubg$K zM+7MkA|f8fk`k^@3AlEhZmwokrvRD3PMgK`>zefLYDHoDZ7%Dh#P}}b4G1t(0Xq}7 zsKY6`iju8>qW$Z{g#!@dq<+7jCjVO5WlQ3X1n4B@UK)z`tKY@f9f}?DAu!Vqa`sfn z-&G^puFzrUJ4ExNJgX>Xh>U92e^Kb}{X?$5;oekfuuh@ur{0T}21-b!$bLYb_Jh{n zJ(#(*DVeskud|svI+=H6f^S|KG);p{t)9;sOG$&mZ-!OAkwc%_LZ#hbjBj`2slmi< znKJW*T>b*=wG&JU2EQb&0H+&Pzs8IGK~||yC9A%#4HD$_5rc@99Njjj2gfw-9YFvj zzxvXM=~CnML;<#2R&8vP)Hb!SGZX9RvN)a$di15o#;`p)VODl~CvuJ!fZ9ThD8&eo z5Xjz^Nv|j=oLg&o>`Z(A8N<(<(Sn(~)Ld4{~eYYEh z&*yFAwG66QB4c)Yy~l9`Lkh7}a-bt9JSvc2J-&CVb{;Z6w-U<5dpQk=`kJ%+@$JF39~II+ zig~x(`vYwhkNL5gNzS1*S8Dv#R&rXt2<6s8-_J(IiGGnj`%{5*l)Ap-eWyOd z@H>h*4Z~q|x{N-j|Hc>wF2A?p)d0NIYcV13~07_-X*^Dn_hRr>=>f5LjGl>9DEoX%RCZU+iKIAe7}TD zGc}cyH}{+2a9(dmy*0bnvOF8!wD~+%Fr>E2%&w!H3aZ69u$EjE^=9^6`k;69cr;B7 zWZAvRS7)Y+d!C-%Vqu9&#rkYpd z0!xO5@Q|dBb~hk^j~Nt_aqL#Ww@PAnd2E(d&pz<^27;DZrG_|n%f&cVV-W0`i&lr; z{^7tHq!p&-W3Hd^En5TBR~r%H%3C zlrg|v?<@oKDVF+#c(eAl9@L~Du_l%0v~;i}FXdSF$-csOyKYbwx2;$3s+$y?kM}Qk z$(DtfjA7KUZW!%Agym%Jfyw=qr^?L6>$TR5*Aw#t7RlhjGu1Opwxn$y59KGJYZ8Qy z^Qg9&h7Z{c&wc)&rN6cPEg-JaeF5*~_8}^^t z4!Rs};cJiR_H9wU0iWcNYVrxZ7BQ`_1X70$PC*cyt8X|I{X&eYgv$ayb&^)c(nVoU6}@{7Z>EH7N+lWZK#u(i-nCQnLq6a&PPjwpSjASm}Xt@Q;Ptb<5hQ^ z=$a0eCzqWbg{7d6?;fAg?E5jr>?Xfgbbmj_mnl!Tz;Cc)eIpNbU zWhVnPH<>=4^szX;XQzdZzg0@MH=z{yo>nlM%Q1&xpodDOlya>J>qPZX5EJMXkKKTr z_SzO)#RluDBZ$oKHWg(o#?=1EKR)X8B@SUC-f*4Ozf2$1n1H}5g&sS9pZe7Ws`)Bq zzjCj}!0(~=>z!5J!Mgs{xn^42Vhs}}lBbeSTDTm%bGEy*-<=lIHsc-N16p4{naWF7vp-#DQYXThCsWX8{glq+=Q1@@!L zwEr63s-r(z5)eRH#a|9o*(fZI*`Kxn{TN(>5{F{(h~GiuM*;4_%;FO~u8{ljaf=_1 zzHfdT9JHk0kftpGDv6Ho3s0WnANR>CQr3HGH4lvOVu~m%x~~@SyhFY7sNrFJKN(F6 z3Q3;0wp*^f9!=X9-2x9EhIm{59P=G->tNzUKN{zfMDThE;U^9m7S7ThwN&6Vj?U_D zc9uyG1z6e3?sh7t;6gWtMSqJaB^p2fUZxz=ljk0Yjc?)DnAeEn4uLyw`8lDOz9ZJt z4pXH(ef3bDjP`C*oK4@iuzl>aeF2qkqc?>W;oPS}>-O<21|lPdX~d5<$RG%%Uqm$* z2M&8%7g^OJ$xqwr%6%{!-9sx(3u%t=Fg>gOSq-Zz#PI`a=Id?CyuTtRl}kUC8td3H zm0B_V{<Uqfv^b&vY{0Qn^T{cuftof!^RdGh^p!6J z0%;6F)O8ryi02e7IZ#0<=jo$X`k4nCvOW0*F77)4>DRho3wjjtOzkbc5l;4$r}4HC zNo2YMg6rYR58(~9Wyr%+?};RQ@ItVOCW~x|M9Hj!7uSG?*EQ)@c zWXT9fcmpL!PD=Rt8mC^nZ}+V_M`7=^<{YCo{;Zb5JEbe`RD5H1+Q9Ob-jr5`Ymz&` zB2Jf!82TYsyUZ~smW@VXZ`rO+#t$}Dpsa`WT_N*gk_wKxhZICNYV1G|Z(Cb9>wX7n z8vAZmy{b->RdV2DYv|Uoz|x_Bn5fhWW@wLd|Ncaw+|6^5mv(vw>B&YL@v}vPfu6@0 z*7|#WTCbh>#qc3jTaWSrz+Pdv8W(d%A%~0V#7Ya;WyD14$v!lNb5#PwFs}uOpJFcc z@YL*$uMZT_EkfcIqN*7SF5f#Io#9;(lw=}FWELf;$WBMFa8;kd-u0+NrRE(|y4vGI z_}1U++mS@MLVv5Ts1VW6=}^^X_UYrwTVpL=^)fvNS9HhNhzYmojtvHuC{jXhwlM$ ze8QCBFX77m0J&kuNuvh9me#<+QM~Nx5qu#|_(W!WT7<_vKL#?gUjann$>fb%T%XV3 z7JjE|x<}nesKmP&Kv5-syHRBR_|>WApYcJDJ?k;gyvRi}Y+Mz96A#Z{Og#enhQ)i6yCW z>q+6~OZ&>MaAbX235V~zAiE>yY)|n^0p#B<0#3hTlGKOua$%ISXb=1YrPTHj3ooNt z|Dry+R$>X_a)Ro$%tq9F+1=)`gT&)mKO^G?4CrY*S^(sYZ)^Z@4_7Ss!LQ;2=btY8 zw_LqQ;yh>y%7Dk(?gh~Ia*PIMeB8X40(+T(Ztch}?xR$Gjy=;2@p&EEr~4@B&^M`@ zz8=%@EUVEn*SirYmz#)IHZC#6-T>J<2Ey&JQc0k%W!URiyne4Sb$DH@?lCpO!0}>4r}Oea?5&Z zy<%iLJGwQS`m~@p)%^rr?Uv!f!7ROG`7+IN5v%VkzM`z!x$n$c5P!d?0zQ zt3n)}aWF}rgfHPuas=I`D`#+NiP*Bf1!CpVv;d$d4|q9ytdNn(Y<>DVUuVqg6aOxy zN-!aJC~7vaqG*gcVl>CF6vU8%_cjgkP~W0AQ?K!d!Smo`QZupsh9sH}1BciMGj0Q% zG)|Am#JpkA%Qg&XuW9q?&}yCH{Wu=}I6t0Bc}rIwg^z0>;$+KnBG6d-9?H@>v?s?@I_U;oHGKFT#b&Nz*{hhTavgMtIst!#Z|(>2*j(7+$$O0c$TBR6); zq_^SDsB*e>)5zRha>-59PKZ_TOjV7DMx4NP(sTU|4am&A(S8IkF&&6d(Nz;z|B+koGP!3ORsE8T(z_Va2f^<{xfemUHT}=kYpd$4XSq86w)8+GZ$mL@FI^M5m%j#QMNt7rm z;cwnOsC|8+it&RW+vncup|zStl-}le-%U3uXW6+20)U9xeP!0|ICWy%ZK``0SQL3| z?L~Rjhb^tLPNvflKXC|W&G`)?vPe1(W30}GuBF|j$<|HXi*^e1+w{l2U8nBh{j|1N zP6XBpIHEgTONAkphphKEMYe&lk(K`^)^o5A_r~760B&ATx%J2($^N`{@8*>8YCsbK z;4qRP66U)s$ewudsBBsHSJQ*Jf40l2{Izbn0uVD^mqGL;oVv5A;R#Pfaq>XRonB$h zsWS^^A`PlM*x=~H+l_3g-D%)Xg5<8u-4Y4T-IA!M0(-gr2qk`W5n?Ij#ze4KxwFYn zv=$Ql!ZC_HP;)=lw7{>3fB1hw+ zN1$Qk>aL{Wcrmac3GbEVN*v=VDfHCIF_T-XIWLP~2BOPTbRc;;Mh5#=^8{?%P|AnP zG8z<-aZ#$09Ica=-sDa$h?~5|;0tdq^f>V;ZY^#>!qc+=rzVr*%ZvB#5n1T3@=El$ zAET8v{g8Hm^%H!u#GlDuGmfEN{kjbxpxwCg%(oC0+$qaf-Mabq^_s3)pF;HgqO=`t z>-TITpj_LY3A!RXsGisIYe4>c>%sG&fw0;9Ra9dPukT06<9j!>zD^%j=-D2o2h-<* z*d{_WQaj&ow#<45!*lBSlm?Dg>owF3cum@$6M2D+E7bcMPhYz;Tmg%Xf)bl3hQ#OL zAp@gb3ylZZw{C9hGw+SD_{1GYG%)H9u=uieO_W(fXPOH=w$;)Ri?P3bz@QNaYL|JS znY2NyvyE>+HZXYAx5r{_hB3ykF+ShgBkVm>m>8$N9*@wy?;$kuN9}0mPZA1hadt!&i*)1+NB>bD5lv`0Iu%%f-zii&`(rIp8{pHh` zJ$8oGhBYj1f=Dk_Td9*mFhuzaWb0kW>ezW^jDE9Koj|zNvLpT~s9lvOntV~9t7uPU zZc4WX!NA%sPP6%J%(*Jntq7~w3q1bo*s|gb1{DvY1oF%d1MFFs2@y3B5(S;-XVx@ zr8H==U}LY#*7|pDTJ9wi-INls?2~`{FA_jU=eEQYkok~&b;027W#epy*waR@8?Y(vvi2s5-PG|L?~9DXRGoa06uCW-Mv8#zh{ zJBzNk;z!g!2S%Gj|4gIr?y>RQk|)4hV?T7nC@+ey0P8fPg+)l$lwHSI4H|dU%c#C> zYQdQ_SBud;4tnSA7lg;^#`c5LljZmJ&LJkJ)txn)?$E86)AmTz`}b$eZ?31)clWl8 zgm+{sudg}6FtIo5v7IcAEzOo&!G`|pnQS}UAwt)VQzp z+3z*KMf}iLg7DKx*H`h3=k>-#A>8t&i7G3#4|!@HV}Cu*xExR+f9}fGKc8hRU}D`( zp3cF?45r_$+{_1xzPJr^DZ*>#V1-LhfIX3z5OR8$zQA)zPf2F|O&2vJx1~!c&cbJs zzF)*Q%l@L)9P2t7u{7C3Eoy)w6ayjh0nmKLf_SS8_F7}Ce^949Meh8AI;Mmqvp7dY z1tG3bsEeO(5g7i}3JXCTwHL4ovQk6UR^VWkrF2> z49by|prg96HghD{ZYLeGP}aN*AIt{m;+6d}WuwtO_-*>AN26DepXgi|4nj4MLonD9 zLVW~p_=wZp^H>a*b01o>U1OZ8l(uCuAYa13YUF+!=e)n{mw#_R?V;Ex$I|{`+?zO7 z-+QKsMdtOHk8tR==P*94B>OD#I(^@_k9&nB?0Pj1MH{bI_`Oyw24q=LAFW~MR_h4` zI{Cs07{Gsu;cFR;SN#@54rs61@8`KQV^_G4u5QWKrykNjK300c@OnI6WYnT6Ro-z5 zFc1Z#tW|qIQJZ@Pg7V|HIKiGy=Z#^)eK+qEJ zix2Bw(|cvAL8HC&#?JPy>K>oV^~;h%6xA$>oN}K*P^6;hHh|gQeo5J#M?$N+AD)Tk zCl#X8KNL}I+{g@x$)6Eu4gfz|DLgiFf%lDn{|n)5^XE5H3+>_LiT^kmGRdzC3& z*{8@AxVB}0=NJUDH(utnwJpcLz`()PXTf;mV?*;%_Lt=6p zEK2!j5bx%ssY9%FE zm`o5S-jKh?Ke4^9(|qiWic8pc@00uqpN%p+z0I_EPWGG$Dl_^}3Z(zZ@jvUmOefr@ z#p#UzJ`?O>vcoNCXF=m535yPci5!f6U*Cyw2wpDI!lpBGw3)Xy!)|rKbH9zZz#W_7 zE6q{?+yt~Gjq47y8$@T|0 zLz@sugiJM~z7n5@ijc}3+~&3)r^3*S%m{VT;`dvyx@q7N3gu*{D##>{a&vN8>cw61YlaewZ&n5_{j`Xr4`^y=VJw_9-V3jYsJi58qqHz z`_z>-dMxYrUcCv-g(pN;Tj-SHP+^Q&r2lNMh4UA5k-mZ(PAh~$TWGIavDf43ra4e7J2EF$!a zpY}Tkija2ZnizArN>z1N(lh4!zhc=de=-i->z>Q~B9ycVoYL@U;AyoC864V=mmg z&N&9NR(fTZM7(i});qKEVigJQVh*MqN+%>{<~cPmtK8;LY}!N0XQ zy0Wn|rg!*kyOh-0`CLWQrYyA`9oELxxz9+b1;4S}*J78yLHlDhIhLG?Lf(5nVmL>` z@%PDnpfKozhXif>^8uBlvbdNu-=Bn_v-bKX8r!E6{Ozh#fz?I$4O8tFMb8%{s~Pm+ zE0{OjtHDPWhEz1@|6fOA!I*YlpHGK!-4tjsoB2xa?J7GlabAH;IK^9T@N*$i)3$ym zB`Jo(c^Y*ZHk`>L8z^!a)-!-zvwg zx9fkVc$qi+*2ZtS^U)K+zp!->fVR3mcHdHxFb?FjT8+n-3UKO%seeqO)z~0v*hbvz{Qc{vCFKTm4AISe`;gyZyK3KVTE@;3Z50yZF6n}as z)Dy2qq_>cO$REOLV*+kXzsIw2%EO`jTW9Gj39EC?a2mN)RJ<3)^(32K;E8JiSx~U> zEB~1G<7`?{H*p4raTW&8VN_phG^wl(c}q^taCZcs7G>~3D1PV~sqX`ZfA$K3b})A_ z?n9GhRenfKp1ASjk^HVIS9I?7Z~2VA)#d~x@m&+_$GjD4cePW~Z0;|ls7xMD-@aGk zb&RaSq2s-`F>tA&g=F=2j2!#NwDITmu7gSj`P%240H!xb(CQuN@4qPR2dLL*{?Uegc$`}X27^;j$Om3*tTFtkB0 zp@ceL)-umtZVOFFfxTMEJHO!B@{QGYZI!S@hc%*z1_ZC4yj)zw@~d%fw(7K^r&KgI?OLxM?%ohkOO z=eQRye|S58A|YvTe#ttF@9e;=Rwkh7bl+iZts5WC4^oAhXHf4m4@hKhSU&SQb0gED zU?j_#_#V^mqp$K_YG#r!y81bV;l7uf9b3RHpJVDZJf-CXP2RWt^k2Rm-(>zgnlKlb zP-l~dky_}?7hsR+g>gu0Z(#ITo%gn22%Imf!POrhs$Sw)q+u`IzV$#3mO8++n^v{n z?2{E?E%zTVQ;6fQI1+ZcrH#WQb8^`p#A?^RDQ!6Ey;rV$ov6vbsSAD*4n@e~lSjia zgY&|X|DxZ+4-@ZvdV5>H9>U!{5=p`K9^}cLUB#`hK0?PtL|=r1_Tys>U*YY`D`n%4 zkhsKdn-9o~jG;iAv^S~*mcw9RviK3-V0~HP44j8~^B2H70};F#%4aZisZCM{1#8S@ z+Q|}+rP36&hk2XXTD@ncxBjXn0HZsdoW0jS?^b`g-*t78P3KOpo@`cS|JNW3nkhAo zv#hxgH=Ja>Xxl%*^DW(aF)1cwfob{(fhnpXQz};`( zHc}0g#}Vl~=eOTJo1b_I*n>VZNrAKPTlZ>s=A0Mex~SE&rzBSHmtYFLp;Me+ZmHhd z_3a23X04`q<=5)ffVddjDy_0~YG3`pm^2$ck8=gx=CD+^Yt&b1H0*m zTXO*MRpp&D#E0%?_h*%qcPs23%W1`A+I~gndi;AcLMjzu&y&Py^Wx_8?Ym(LzY zHRjnnpBU;W8^gwGCQ&E@in9oM3aTEdl1YlII`Yy~zptj|TgqHlhE%qpoY=XMny%V@ z)}*7P{dvvm5WP(&-bH59X)%^UX=O)!D!}0JH}$){9*Dl@Y~=a;3)6RzE!HbVmm>8^ z_`O{kX!&yHSl2PF!S_q#8U9hd+0F@o&-(xxxqUmsXj2%+%7^OHvo6E@d?9CvZbLkk z^GM;BYlMitO}^jn;`UGiU-zFANMd%r@$a5D{p4p%Z&$-D8t^!k8rFeCnkU=|dkztZ z`eRPENw2N0uJ2EiK*TqGk>YcK+!xeNeF~H)hd2O5KY*J$K=k$TA*sk%1OmnDUA==z z?fbvt=CJ~yh3nsd7YGEtd?=_y??`}lG05Ha6ZKMN0BF&23Mn*>ah zBu59WM987yM#-n_>0&d6IFpiktjU)$e%kyhT4_3_MdO@TyekHmyYz#o@;t;ciq3R7 z!@Y5!v%LCqR`wcYhNQuox_ zC)eX58!1gq?5@7al|5d!IyMM8-hB~RZY*ex@%=>AGgomD^=iwiLob0RWYY`V-4RXT z#X_E4ZEE;3!>~PSKhU>7?QPX`s|{>tUMdvS#cd6xS$-RDU4Z&gPVb~?k8+Z4%%zLJ>zE07pF{CodJYd^%Li|9MvkrvLMBil zN(O;7-xO}Fw(D(P)DdFVKZErFU5FlMru~%Myie1q(I0_x!U&>6|gs zQ77;M(|tXk&Nm_MFWy|x+-k@eOJtMRe<#il&nf)$qrFzYcdXs>(&-Kmqu?FKmko@&OX6+f zf?b>&kNn*>&INcdyt4Hcez!z zy-%)Xx^2&JiC^Crg*7mvZ|6-^e9HId-|lFzwx{mDm#n;haJj9~>v)mN^WvmIIu(=_ zN*Y^g2$I@B&hD@MXVj-gm*hUJDNTdz`OZ=a5nv+!*6WCjqP*|WiB^9Z5riwx!YnX) zc{&;e&l{oi0Tq)fffO1`Ox-N5d=U)iWyFB1KA+9nqnqa3x@~OOhgRRG6 z8wZmcMd{!xb@PHktt!^tsQ=P;2#|wfWq)*L8;ZhN_xgx_pnRBY`$FTWDQq! zKH;+;Cg=9>1M!|3^I&LWTJb*RFzHEXR(jRREs0|w$l<5V_P!~%DAm97GBH>U+Z{@O zv=^ln!k(3Dee8qRb}NrGfxPZw$bNG6dxfoI5|vrf_|*f=7E5DgD_fO^jNOEc+4UZC zgN>t|P@lzP*4nr$Z`;FLSQ?j4{7v+Rs3wiF<5%Zb*I7K>Z<;vSjjUI{*QsFhO(P$C z+pPrl2@g`_!&HT;Qxu<<)^L9!5XB7A# z%i~)3c)*(e=ie4ASO*0|=`2t7IayBnyjvCWY zIZrXk^0EvogG|3a)%!>i!Sy5|RFh)2HvyxmU;cgTRDzlLn>~|} z7uK$LPR5D(6r7ZcxNTzuoY6KRKeXbC>pk1ga_m<|Dq)(Xu0Z7s?DRYuZgV!|%Y2PH zT8x{*5LY>J0~=iD{zr7G#fxbMI1Loj(2VlGkDBYdJW<3C6L+qgDesi?BM<5CWY-2@ zzQ}J$W2$%glJ+ngVCbOaR)EW~k1h2qwADA$ILlMym;E98`J>M5@waht4QT0<0;Dt! zD0AO0w-fX5{c0CpZ)ba!XjlW;i~P*LKj_!UiiWAmyU0vllnM()7NO8(rOc4B>7?LH zPx}V1$owmO3LATE+n-A)DhnK1Pr0r6n=C0Y@Iq`|rQF18Z7&h!4Bb4|kt zB$ho%=$lR!ozOoF&<~iASX%3|rouUs-R}4e-L+nF8J*I@e?6s-O!1v9$2y=Px70zg zQ8=DmNuaf=Fl66vo-Pwb)e~2e?Q9QYU0$bRTo1-Ub0@kCxtl;4?!ykyAK?7 z#8U|q0YmC6R8xYim3w;1Cf^~#>ToW~+$r&C=RO19#WDLA%||J?j?3~1gKhg<86spb zfHH1j7p=#(1F`Ev-MKkaAGgT%1dO`%c32g&-dB~j? z&@n;i0XeRVCPj+khMpIj%-*`zz})J?onN+-1}%38a*+ZC-a_yIZes(z@^E-#;CpG0 zQbvDLhY9<#Frq%WfYNsD1{4%7nfY-gp}iTFC@QlGH#q?xE~yp|+L!P>v-fXBlX{;Aw6QvY4*Fp%r zjQLvEOI+x-TuK_$iIppXiQL4Jolsv6l9$*+Iz#|#WibOZ|2D$Q{ml_)*g<>V{AH{2 zI_jdKj$PK`iK3yQo`AQRTDB#6`W1zzExCvyM@MZR?fk(@@++JvL?CLnP)Ngn#Q_y#QGs}!MfR1ucV`1a&5kT&NgtZ~>a&88OV zXqbQuVI=)*1@eOqjyy74$e46CY=0dNXrfW5#_9O!wnQ>_YwUtGTWtbECP*-QEqj$8C*NrWK=YcyUwwQIC$UQAu$MS1Yi9-xqN@Y0zL#1s7hELFx))ihmVHUrF554|o6k`#O4>=kVoM zMs4am7pEcpO5{8|73u~&sbhzQ!Y9)a7Bz(Sso&53Ftwk_FU7gB6ADF{f>fYA-(Ozi z2UE6^cvN(~)f-G@W>`<{ckXXmLB07h;bF?1>N<&OIWp;bxuWVN%UC8B_?#Kaqt_x) zT>gZ5MyS8Q{WGLO(pcS8;2>9wv0_v45n-=8)^k!7TY9H;# z>Bd*AJQpXrPt)o7<$IjhKBX@yk@^a;HQvMgB7YmncSTc23vaCVCO_aVg=|WVirsHN zS*5ej|rcmvWXUc5SeY$sS9)#w5 z-ztuh_(n^^ZuDUiUoSZy0lP347#MP2J}f*H`>UALEO>t5%3UG+)MN8AqEp84x2ptw z?^iXO-&y~y_g_F7@2QPQBFCWv{XtB@HazjU&vDFK8*xQyB1$okf*kAkY?r@}88gAj zyh(L<`hoIA39jYlwuHmO-ZsjWM?#7^M`|Wjytj(Pe|U83lXx;-YYK(e&2x9jD+bQF z2+IL5zz03%2Lq%hw6oi$>x5k%6l=iyb)%Z?S z^J64N7wy_LcDswy;ruF9<8HS?abKto(RcM77k^8F7O{u!e)g8k;+-~fk^p+*=L!DR zADySz$;$M4;APi-k6XgggZMIoQoEHZkfWl`2|o%P^VZzT@Y(_q-5sia*OmQH@Q+)7o* zRgX978kFgqI7d}Z$k%BkPTJwCae)*&yAgZ!z=$KMAKudm-(1gC6O{lJ__s;dYRS}N zflW<=iZ8xlL^Qbj>t17|AM#(C#4mo`rqps&KIK+!J64j}cKU6M-e2rGiGf_76+ zUjVxKDp!ClVJWIFL=TDvjCV%dqf1DQoa2Lp;b&u96! z>~58~^R2EvUaCKC+yG`7gX@@SGDoh^;4l)5%7e%LsE4Wzc*VF6?S$6$zK{P`&rqKcAlg}y<&}J z>Sbvp+oucpVj!szg1X+NGUhK2BPJ}izWJPnTG7M>SyKst>((e)L9u1!PcR9ie|lLe z2kL~sDnc@AsP@~A>ZKSJ+(Xd`ec64)6#=jZN5mh~69aBlB2&8PRxgp+PdZtnfB#@t z!ou)5)-D|{pV$0~ill$FR*e=QLSdO1U_a)dwFigsD4MDk)2?=NpR`|nr~8P7Kj&Y29B3zOtB+kJ42u?@7}OO zc50Iq6q`;E_yiv}w}D(9H3_}uq!UQ{IV|=(G*m{*t?r;GVk>-#YU zBJB`ac8rh^!LcjhJ`oFAa!aWClb_5WwuvnbV(FX0XQnZ=)rRudmwr9>kibZWAz6c$ zv9{Vv^V1T8ucc}F_Dla_jQM!i^&nr1SZL+|#N9C~3nTlK^JEdaY0^9$6S}}-t`-R; z*XyTUy$SR~wY65w?M8?NG(0FQ}z`%#^Kb+PKC9(`1lH&|-E2E*(a zP~-_LG;y!3Ng84j;@LdPmA!e(9S8wf;;4%M$79*6oqKxQ z6zjY?g@D&hZTrjTA$$g#`i_~CBt1$HoPWCj2CNc7q5DfQ`f9xWE}#TcBNBb z35FYfdPp3_Srnu8hn5Hg`S6n^&wqe*a<4C)gh^UW|J@qX994LQ$`VA3K@bt$1B|z6S`%l%OYjTuavWmwqeW}CZ zf$fcCqa}~E#c89{`4c|%ix;i)Fm48v&f+Lx(xuZH*|RQqO~Nog^gE}!i@fAW^wbcz zq4GsUEhYxiLT=L5rRiEaH{S-9tWVZ9{|u2 zBUN3PFJ_Bq@0Ft90=%8HHgv+spJ%KVGDn`?Soq|)omV;FTjJl zKE2D${RsBd$pp>y1>pAga2|A=H2?WNa2}N#d6nb+=u=){*~R+Z9qux*&y!S?o+8S6 zK28#~&sKL_;Tg=m9FKSOJUnTA|BK=ZN zZ)(4evm_7a$Vbf7?xPy4b^*i((UBW=YE;L4Izkq|wkyzGvoEgW?7k>ZuQL|TRK2-jpLLT*4Vf^rR~5Lzyn}>>&52h0 z_6&KG0|Zme%UR!=gB1uF0zF|w#egWM{QH>jJ2#1_Jg7$S6)rUtdg@0rMwA$etIetF z-W;p+l7cZDr15aH$e)F#PZ7E;pzPW0%n0sn}u4hHYS|P}~@ij|0k*^^L=Y zo%mBkt!tq*yG&|Y?>KLnW)+@JAe=jQ;p(!G*&uxh8F3Q4Oeh6qd;@4+%BOu7;qvXW2d_6gb5;d<`tlr$)tc-8X`-!~JV!4x^ImNi+-B;V%>P_iM z&V!r$Q7*e=Ftel8QsC`H&Sq|LA$Ka$&djds3T4&K8#Dut?$wkx-+rl}V#jzZocdtViC+Fjj&^Ar zNg0olwtZJ-$#2;vjgWkkVrbC2K}Zz?b%+Mm$A=>{CJod9c1`bJ{jJE%3taCM@dqW= z4Cn{s`-2|$!;Fs`9ksloU%px^n%*qstj#0lLi9EI&9WOnvSa4whbjr3pYfAx7}631 zL0>){r1Iu-YO4gA`cua~cl#Lzv47Gj8&BE}dxvgV$Zg$eq_udKYo^`P*-KJ&AiD<(8)nmpqtZ zZCszBo4oP4N)MmA?ULVfyUZr3Sw50jyp^zI%1DqkXe)6xtuB4Og2HtZ7C)wM|3P0v z9OB@2%TQV+`6Kwd6M8yp2x|bB#S3V8NO!G{1J|iB+I>(HXPg(ji(f=ojjv{ZrRU(Z z?)pX?rcvRe`qXOMru6X#<@l$;v{GQTveT;E6jKiRns>r43F5iS*+*&hvS2+GvZc60>_^VxO*LFhTAWr%cNpdUwsIWQjP*huZ`Lr{-|u!Z>?TR;#cm zC^uKxLS7SNdzOWoNPb4*U1lP#-}WE9Y(_E&M-P4_ex~Lp0l_Y>54b_5d>m%1;V9^x zDPf`+WoNzm>eHjVkE|+6u3Sl;`miy+db9zMm69(;n-dO|Gh;G}p5~HDZ|o&D=1-z| z{D5H+e-zj1p0Fowvbkb5IN%Pt-NKwVk+ma?=BtN$!g#I;S&apeDx7Vo;ypv320z_i z)+YB5r`7zh347*5&pBptWH}#h#!Je!k0jk5QHYeL2O~f^MeI`i0&<1a-4kpUB$H}o z@8}r7xf?GzQ@T+{1f@+Ptb!*FgiBz&#xpmm!bBt051^;kcuw7aLacCC{1$C%`MuSe zdMAM^@?3r8-KUeY5$r%jKw)02lkj<-#yaIev02)zI>n~1~-q-JsLV|M>53tw)pky= z!rQIK(Z{nAOB`#R{d_cuAv8}PdMZc{4lvD01~^p9(Nc=_>Ev0TEwDHg&LW7tJP5Tg zS8kbtTzs0ud)fL%dn#h)M?EGZPdaJb`gip-TixFrck1j?J4$kBsOTi=w=U6Ljpo=M z?7!OEV^HW6y!dl*TDrBEaxanmD1NN{arhUx2F13nA|p z-z8~eu*sS9F>aLo?Xq9gxLMpM8k#<`+IK@j3RQ9T&(Hnm^?lx5s07pjBPX; zk+mSbegCZ}P`R6XO@%?c?&^41{$;G7%UKk&o2rugJVvG*?rqD*k+tcDWMYETCuFt9 z$5p)(-^_;G^k@}&Zw{Wp1WkmNG}sK0(ijsutfY5_u*cW`?7x0~J?G}9l4(1Xn<#=ts$av=4AG87H(M?4c+wbeQvxs#rm; zNOJtdI4;N(eo8ziN{tXjOp}{=TZu&rGFKy1@9paWMLm;|&29dB<>0G@=xYu3Ur1Y7;&?op_?=*{@`ZnV@fNa6Y6`I5o|vuyFJ zZ0~eBsAtx`&P&(AkG$GP`L!AOh-}(~aX3&WisP|89SV8%GrN1wo>}OCcS@2_?Jh#( z*R{@t`{lf}4MN7tMOcm2B|^ABVOG&T;+%w$TSspC&8^%NZ=DE_3)Xdcsd8pFFdC*3$>)$Fqxl?LN5vR2 z2&I>9pPAdb;^*^Z`n9%pQRVTP^0@+>Ax?uf3o9eN;-e zc%*&TkE{dJ7sQ;y3)4#|kS=($t#V@R-{3}Ng(>(xD%m2!*iYM^7ZbYD?+1LdA%MFF z44Us=-*>rX+^hNfRZga;x503+WJhhLm@Z}_|0N&G7BU8#!=M$1O#L*wRo7qi^rdOM z`y(SJ@_2|3ue{oAa@Ms@F`AagXT^CEu@(ot7D*|13NQU`_8_R= zcI{hVIPWxrH*`GC1mF5*ToC%o45(wzB9@p)j9)Xp7-P_nP?%fuvu!1N zy>9iC^0+lad+dKzYw{u}>~Q>W@ehvM{Vh@PwNP7&BxluSsQnKth;8=P4!DA7^x;!_ zKgjUbDwH7iBjzw6E&>PE4=NO0I#zmrvUH(2fXc_-im{Qe?Gu+9fCGjS%i>3IfwzOp zIbB=eO!xOh)081Lkw1bA@Ay#s9T1Am_^-~i*Qm^gdaS?j9s@}OGA4^MDRKE2Jk~wAFg~WnGUQ?< z#qy4W5u>pth_uH@Q~L^kyR}gDWoe47@!Qq>_}=Y$o8P3CH5oCy_jX48HD|$KI;L_f zAL6mg;rFyu*Esy;Y?KZENmj#xZ{>}kj#4{&#*May7+F_g zId2Sgm!H~S!~j2fJSKEpk^)j^r~&Tkd;}vI4~}-2iQKez)!c#LCvrF|oY2R=*c5tgbPw(?c7nuQhKH_+wcGx;KZB=qMc$& zU8Nv|!jt@E*Bq?$>9%mm*9tWAbPT#h`V>ImcY4v{vbg`Z-?Kf~U9Gfrem>!ZuNm<0 zr+6%iiBfuNaf{`%c&23WntS2CV;R_CqcyW`Ii3kCpF;*gu-5i@Qk-<^I-M`U0|o6Yb`by>Bf6}6VzX*zSrY%J`#l5 znK`7h0?F-wuM($bpG~+1{+t?j>E!4l!2>@qFK{Hke_%uEu>YvrPczz!@uykrs zET3bf5oo?$-G~ZFiKDO;m9Q(%RdK!8NeG0huXnO2vyJpPc8O`Oj32i_b}a-#W^Yh-j6tOa|jMSqhHJ(abd(t=**8-o0Z{@=A8etFxl? zSPv?nhkAprWi;U%*yPVlKeSd^LO=5ntk9iEkvH9pm-fQA+|4C{HckMgnY@GvlkP4P z*H%ZCXFH}XCMpr^ne0Uln#7&)N273X?S1>VmnuQ|aCgzdPaF=`dB_pVoAib&<0j2n z-rMCjb(e&P-|y_sgiUAYk0gZfh*}_Mc4XS~ICGOu-L7-VJLN-Gd8_%Fl}6Q9NeY4t zqmRH}WI~tf=le+6A4OT96Y4j8>3MNDzc{x-<_Pi9WZDieQ7g6wP~JtnM`=TVdYMb6 z0oNZ`Ivibb2Kt?TDq=n8>lfEHe7+Hy{QFrpxH0YuB9uke2k&*QBXtA{m0RnZ8xeVQSjRk zvzTYlo0x z#j*UmQu|hY*cZRPVk{+-W*XUtWRJZ-d*n*+6| zdc^6y&y#b`h?i{AkZ{BnfEeZmxxAFOMyZ#71Wg;IwN>{d?=0bb~G`As*M8HkHcvAx^FO)wz0$L3>dzU4fsSsZ~jD)^d5upY6D5 zCJ3RxiJ+X4*dQN7@vj3fR_S72*p1YyD7F zEs+=Y&*Y^&>}U8YPm{M^neP5!Td;mK0%<`kp|V7%$bxW4#KZ zFJYp5nVy{*b1FZkAmimv47sbZJyW=i}yt38cqttMM)%m!L+z=Y2tQ~Eyf2a*X+g`FjI9mu$g+C;@?8?G`?6=>CxF^D<4gZG98rqpqt@m*5DmCJs2n@aW9ao#xu}DDvgfqOUrz{E zMU4j)Hfi&&%4&~4A8`zZ;1_naq3`_Ke!)2*EhK6MYCo=4qq1wE2;Z-i62%W~`iF_u z&F~u6T)F7o??ER8SzlPO-Iv+`!5TsL&n?rc88+vLKD-}zug0&!O6?Bq5s=mfd__tB zsC!61SpQPr$fT4EUJ$Xi_w)C2cdo3j-C^4oCwt5dffqh1?_Z*R%Hfm*?b9kpTmH#s{Mk4b_2;-}wIwBPp>$%TU*=x|7cri% z_w{b!j>6ZyQzlp19-TvcaO&v@@W$QC;DFS>Spg%=a)K#FbOG^k7d_Jp2V4inw7a9Z z@V^?t3U*<4b8tW{(@=Mg+1mvhp)aCvZODE$B!Y#lhatJ zR?BdcC*qo{7;`>b1AzQ7Ot`4!wdU|UKYfo3buYuRnt8$&AfEkh@5HOaNU#UBpb1$+ zI{Ae8%8#;JI9>zY%AhP7LG3-G^|T=KH%1l8IlhKAZ}UgA4*8@jI}R~8 zYiNiKdwjw&5|%;wM854N%0NtDHn-Es0>JqR^6l&OsoeB^t2thp9(vWNE(EB!)xDDC zIR4GcB>om!6RmQaHxWGfVof;azY#|CRDNj&L=M|KDG|Q zorhb@=hYRjqN9;|B#JX3?=zCJkY^inA~K(-P*drVpB6bCTG&p@F8c^zy>S+5{ka7` z@yfjRZzT(6PWFq*+x>A+i}~^V z9^UnPE`+Y-7kVAhjFCB8Wm%Wc7q}HrMvtTWQZbVVDN`MyUI_}1}^&AZ-D6J$)Z#%Lm!NPslR9>^|g5#LV}4hW04e z_A%sTnD~cO1ow2j1eVvWyjV`lV!a=UB;LM8=sWu~24$6fh!B2Es~IFy7u=xy-Vf)t zRelBmt&+E>J$@|sKfc{kLD5MF=^s)Z^DDrUpw#GsoHkE?BIe#)gGmcJTh>{MmY6-@ z+P;75y81@S#W!EO=OZRcSp4+Y2IzQ@duu;s=R<71XlHHLy$_%5$@Gy86n^R08flTM znTxqp8dt*VbnR~~tfO7iq>u4rOMpU7D=`~iN^K6!kB4&p3az(#vyiaA=&O`b&!IDl zrt;*)sk{m9Wi!m~?$$yKFOswqt+@)@&mVq;GjA{a+yI>PXcwQ$#Khz&d4q01Gt5+y z=}f25o9G#36wk;TL~)1rSYCgt`JFwY|4})D{RqWAkFKXm$c`f(!1e8q$37+d-G03x z&jJf}nRupNtG4t?b%3Yf^O_=B4uD9+`fytwYes@%mV>~i05}PcmF~V<-x)9pOR}ZO zp=4yfJokm}$&iLV!hdLJrJBJNm1~Ch^XH!4pODN(-$ylZ7Wzz1;IUn9H@xcSog^qa zR$x`T5cn!$;cXjy^US6Q&ihb?Dbk)+HJ4EYR1B6`qNT>0CHrM_kTdTwKxq#`%a4 zu~Vf3_Cn@@^dni-Q4TM@nEuR`x@Qv zDO)4t@1KR-*l(ORtK0GMTr3V2XOHEtP@vHI?@*pkTN1X0m^~f-&VB2SpADn8>7hk? zfB0>UKzQqzWlu9*>g7MqQ``jeTr2T#X?1D}_q!38cl8Og@2F?kSP%`RfNwT{JmuTg zmU4RGBk1q%CfJLNNdKOM=Wx8)Wr#;^sI^DR z&BT%jh~09ftjQr;(8@3s-RKsLDce(T3>d|?0Xu7l5HDK4?&}pwP`g6^d(rRr02?hJ z^T)nqjP+78@>!!27+6?mo>k6GR&Tfnc_^F?5ejULkK=j9N5-rGqWu4O-S}k)A$|Hq z_9=RrI#$wDX#fdfQlwb5@9gfxE~L9n7x;mDgthS9hI8jc5waE#=dM6)_zNZZ4pLJy zp~^FLz@Te-Pns!0Hc`5)9>$&TN7_=Kx!t2$L*Q(xFHwL^(#FxLd~Qsxk|3J{3BZ@U zan3L1Z1Mv3o|S>8!UuNYWeYucc}r!)MvN(?_l3CFXt*8_H{rE5F4)+Dq#QciQSShe zA?O2HztwojFn76!Qu5NI0Q-7$S{HFljJ~4S-JWp%`a#|=Ri}_H{NdS0>T)tSlFQO} z=!#YF*tJt}O~dcyCp|G~`qY2BrS_QZ1YbJ4k8#$36K==j1|YMJr_P@G({3C&H{21W zTK=@f-2Uo{SN&Lxe}klRmvnwo`C)&5(*QFiftN>z^Pw>KL*&OuQ@gG}Ap^xOf&&Z5 zEZIt_GQO<)ZxZO}rb1Q{dSmaEZd;W^fR1_A+^t{s*q85P=}73kf7f+e0jf@q$d1%l zUhdQLCYcza)bVG0kA8++C1)64(ouJ;Yx*vC@7GIRz&wm6ZZH&yC;65DD>D-F@%xU= z98kqwca+-t1)q+MN?G`Hbkakl{)KYo_UrrO)K=pyE8QTR(+Bj~JA&ZeKoWtXxB(jI zs5oH43gNDM`R&&shz!2Rhminz(^9|SUP{fqGyPw8a27W5Q-PMJrw$?ff}IND(b{B= z04vuJ_uRxxejQx=SEc**j`e7?f}Jx>qkWeu!#s_oHRYV?`WTI*2#P+O7(%MFXK(-+<#3 zcqrO;<$mM$?{DUNuXMc>TEj-5MzR{P+EN+BI?x%_rCgR!^B)I-)-`$W>%<1jcsz;= z7Vm`Tku{jr_tFVx7IQ=(ex!GCo_W}hA3}0Ui{d15JzhMdU0c8ExzzRGhYkst==oq} z9<3e)-l}f4{wJM~brjJH1QeF#O80QTZv=Xe(e3#9YmdXqD*Zh;i=TogD%(o79l?8Z z*_lb{^Mgw~UV)WJG>Rs}|67>fO~%rr@whD`Df{k_zh7Isxjzfg9>n65{0n>l?Ng_o zd_+O+!$izY< z80jA^+@{yh4?hJxP%VsJTG3br!4~%=;%~1M5fs*s$XOwzA0H#N3C?n61@So%yt}#8 zUvIz+6T$WQWp#b@8>R|6Ny>V^`~09NIBS=h4)63Job`t`Y5rVtzH)^gIFYVBe~R74 z!Zl3JR5`e|V4$e>ZY=y;=wc0d{zLw-|2PTO-nKnJ9aD295&l|V75ch+wwN*$@}&t< z=S)k_Hp^1Zij`0&>YSS^BZy0)ja6fO&{!oQ_J!}>;v2gIvoP%r6rnhY#?*`WWm?mU zUwO%sYpahldo_(8cn0^OI8N5@sw8p1&y*P+NxOuW#qK7WpvCxPb0X;X@0CB61+;zp z1b+n#q+Td&*|CJi9twSsp1ZkdpU|t->w)+DEQh))y=3V%(LVyZu6vHod`3h^B7uxp za|;e%3>e*}^fxpjI6~lbm<)O#?uMD|)R=~soeXeSq@DJ{XAI2Yc1eh*ZVLb^?iY^arh$MWeKM$^6nw*6wdrBc?* zpQY0!2Ij1TiCb*zM4Jy8vKa+Mf&fdBdO&XYp%0{7)+ZZ(E24vq#reG38=w1U@>|MJ zm$ke-iUN-4>pA?WD!1m${G6bx<}QPq+?Fg$@746WD}A=#OWI_nzLl48eyg=jcZ;-x zZOnqW1iUHEr0iI+Ag+LOc>BZu-A+SUv!&!bH)4OcCn@Rs=HH-y_nFPZ2 zW6rD2BVqkg#*205=>Y zE9C72llG*&J_p#Oo_81#?{E2b_VyN*+80+dKg~Y5mfMODaLqpUH@0JLBsWsF{`G(t z9UZz=D`FGdIp%orE@nX_b9;I{=jYviy3UIA+H*=u;#1jsCpjwNclYn}o$o_3{FYlp zU?7YUJB|o)+p{bUq zqS(vs#D^K&x7;>f96#Rn0}`_+Jb72R!7L`n{p;aVY_#9|hEy4Ro%$lb89ovK9VPt! zz{xcIc^u8%fo1o^;ca(9e*MfKTg7`R!Wz{}>Wc-i%j>SseoSFPs%p8s@M;Y#)r`WL zo566@`ok(sm>w6!LXjej2m|~6D$R;P$gtGs7(_R*Z=AQ6HAc14&I0QKwQR|?HD;*4 zbtnA*#(v!RUSo63_Z&g?CwZC>FDbFOlEDn!dax5&lM~rr9#uc*^Jzc_wr{{ganm!A zO8Eqvj{9mt`^i#i;FNC~p2T9s#Amjix93lD-|VUyE*JrPtCF+_3rMy$di~~bngAcL zo*X$N+4t;EW6K=5T8zr@t`F@bx+3+TvSy(HVx%fX@@Bj8y3E*Bo@K3uvOa-z6D=s9 z+%^Mj9Tqw}e@DXcx}=VqNX!+(S-G>3 zH%Pna@nWcVYxCmxiZ4L-?*5{vDEYze}zSGSR)PsADE z`It3IVl(Gf9p`8Gc?)04V|R5@<(a6v=h?qqVLUa^f|1Gyz+>gu#T!RiiySy!<^L=smkX{L&!#m5i zsyh2{-@Y;Ez_z%aQ(t5%#ecAKXFBV}G8D2%)u}yW^$Ef|`Ob!MM9djTlDeQhs*(5Cws7dND>0ftYY2Os-jqKK88OmOzr+fj7YLFs{tvzpu5j!3k!Xx;b zYzCu_DC%Wx+Bts?e$+y9W;hj_2mCXy_B_k4=7pU>aPk*6x7O#eS-+p96-@i{lmh|N z0~x6DGo9!8tm5||P;7?({N_kr_7X+>ul?ryE~>_9o8 zltUYY5UO;a^U^?aQ4W)$?b$CHpG@2;kjbU+dFBzagpiA))Jsbm|c5uD=gFhl7F7 z)7_(1twK5`rf^*@n2ETqep7tf#C~?`-76v#V00ZU4g0FPaP-n(f=EOl!!5FhgY!#& z^L+=EMorhpoNB=Ne7Ty%Oh zG(fC;;d8uE_@EFx?*97CRN*^Fbsh?@1PC;#EEFXq?aR1n5BT^tEbk zqmRyHe-;KSqx#-aOu$nwpLnJWdXsNd7DQ(6 z;Jr$6GXpC4)OReT1`Z7?{J^Y1BW2k?wSq?YAf=QW_j7-7WQV&?~N?wjvy&aNp83C>#m9|!4&zMwgp&9=Fu1ATskJ?VPD2G!P9>wEp!(6 zWSj6UUx_&k4|Bb4+%C&z&dM^Y&Q)*a8yolt?Q0+@-kWbCT)N%H#SAC$=1y60>Dyyd zHTK&HOO*|-MNmAbrXJ}B$gp*;HQvqO-lZgsTWV@%9r=#gSv}SUJ7B4wO1W zGk%o!xhxb?cD{}d?t(FX|HU9lSN9{TDeS6Ju*cZ;2CsNgiF-q1h6&I$zwe5n13i*4 z=C5uPU1BivW)f;Me@57*CnKrESPEoFMY9(-Ydl~vh!vtdLaQ7qJZDI~ zoSuVkFdv;mkE=szRq6ZdPvN zc_RgaiIkG6AwAvV@;??a=iTj>ShUy^y~oh_GD3O4clbQWRep{OAC;XYz^8vvNTBHb zfztY%Y%D%n{X8#4KSh8R=CLn1Ou8^Z-E@#xBCdAM$sm`O=E==z1-WfY+~;YSK$Q>= z77g%=U7V`dBe-jwBv{6h_s5pknfHdyWD3?+f5UwuqwH#e=h!HW>F2uSdY0+&%MH^L z-UT+p3NC%^UDkN&#`1k4ANW$8ze1j<@|Ty#%YJJs7#T6EN42APvuT)la$i9bC7UY! zNEa&I?&Ge|7r4D`GLx?Rz0!TADF^w<_aeqs#b) zMg!Bl6_*qh`uoLK=H9zF3(7@)eqi(?)SGy!#niTZVeFSB)Gr}>Ts5=%Ey%}AVRolo z>Ok(n{~C{xk2{UV;YDrt?@4f{GVq50X#o8hrtEivL+V1-S(&5Nl@2#KZT><#<*upL zy6L?6_tSQmQSoaIkk#;pC0=RlPk8Eo^LLyFES+3t90~30!>RFK{d{LcdAP%RvNYvB z?Z7cmx-=-VL|s%PyuEJ@%h@20dKr_sxFLJ#dhU%cRIDztCYDQLp2y+*c%#D5Ng`L$ z!-{{Se|`0b$jXcQ!aIB8A+vY&`nVhKHHHV~$Ft<;{tH>F+V81y>owLrLb`3<7`MsoSX=G`uG-hFiFMj8yEVdLUrHYLT?5~C_Jfxh3hMO ztgC8eZVb0;!HTuMlI0C~BmGuow>{k#U-a)2y)dZ|;Mn_ja}$1yw{KS+mYe&|-#TmB zIrFMhS8rc4v*`$YBKQFbg&U3dn_DPaGbXDbQdVW@U2j1#wKQoM$~I2A%#T#WPxqtq z1^m+(f8S}N_nz?{{1|#E@1&uXBVE(g{zBD$Q@P-~BF$kiIQ6)74W8=&$3NiKDsxpGTy#r(ix&Nh+HGX7UoTu{hRz--3ZTt*3 z_tPnnB3KXFj@7g0)1tRj!yuU?;Gq6I!gOaoiQ6JZiCy$<}3t! z32wT(c4Zy_tQA<=pWA1G@A_s18cRi$i0oC==X2{yNiOe+<@)l|szjT?`RWdPBUcrD z13V&+d-lrZg^xbb)aLP1=T02Ov>0!n>^y2jnNGD$n6Zn7Wgi{!#BSXr|iZFK7&UTZudEnOuEVe?((@CI_M-d{({lIIrR&$vCy)Dtnlx);g@*w zMZfEW2R%*>pu&@`igbI`l$}3muiRJYkbr5f1+EOPpO}VdaL#btDmxSz)c1e1i4XK! zOfTkLJ7h$9)z%-V=(-;*<&?lFgG!^$=HKdUz1h8SEQ5!lz(D$8tD?JE+%CL^*2M1`&IMT@YwG*TFq^_C-;leYF z)Z=&zJ|=+MjU*3?asT;(X}-MXA@DU!V?<|9;yFPaz3jvkSI{-gAC)p!KlBk^aeS^` zNfebFcYpq{&)ge?4GA_=cuV2 zi*=rS18Fp2sK%UD2D&MU!(&XjO_sl!mFE~9XhjNScnqzuxT3h@BWA>Q1__O@Qa+j%NqWFN~X<9c8>)Mwq%Y4ONo z1}_w(PalMX3xtV_^6o?RXj^W(eSfBvGS;)ts}?zlEual4;6Ku56e~Y&W->GSt;5OE zWcU5|`{j&Ns}~@s%hXqS6<@bwGP2X(6BjBF&O&3Q45jyPvOi-L(`h5rkDhd+)byv7 zX1AgcHRU1sO^;G-?YywJ--%YaZbY|^YhGcOfM4{dKiC;z#q|1m0xG`?wJDf|SQ)*; z%Jo}xwPb1uYyCUi?dLvvK3eb_t@K_Rt=>7FwJqU4W@Ei0NV@LgP^MpMEI4e)m<%u( z?z@f~yN%bHQHFM%*(bHY!*opKDpQZ(W0G|@qXl~{UBZW+23JF@f?d9+TxE~ zG)|5nh$A)W=06L-85JoQyV&&b(Q;)zn zA1k;s;W$0)W`4)A(lqY%j)pYPq<9pe_hzAKo79LD$Cm4(s*I*C_og+y<Y0PbWiN@w~qmexNzf@TA`U z{E4GDXJ-1jZkm?{>9v_)-GQ;%twc;|dd2&7gMsC-(|IRKlyfPc0bi@p{7edQ;`C`0sHO_7!NTV5sMwGm2PV1NXM z3raQ!qHtC?6{LzcRC!iZ*YGm#ipy{S$6TU3bIR+i7lYaIKkPDt3i(`0NO%581vinE zYOo3x#pRHoM2Yb2#;>#Fsi1AR1(=7xa$ORFd6moz>{w8M)2gh(zU9?Zo% zGO))`dD{Zk-PwwdaeMap<4<&T^vih)@#$0ejxaP#evwJ~4Sw9WHBx$~R+pv)Q)#vo z012Cy80vT(*6?N8P31n)`xm{B{#>NzJA{By_mDN8M8&(DEHK-NOUP z>T&Zgv%`P1e#5ao367R}aQQ9Db1Ce@9P-Dx&6UW2K9^ScAdxn`ABgFrgTQ&N|J1~1 zF|(SIC_vllEN<|C)X?AxROC(I4|()_(1hIZ1s5Ms6C)P^(ohT?SYwSpR%Tx+Ox!~_ z&Ac7h+$%=i9^+(5tN&

9z}Z*D%lSZ!8nE4{s5X#;N}1E{0aGcblA>F+vZBZNPPC+s~aNep9kfPc%ys0O_wc zq>kin?Ho!)o602vWA9_8%3_QRpWt}cfUY>Vn=|S%42r9Q(`ck`1fG+)W9Et-(pORZ zq2Hm$V2fjNx*YL;PW^k|V{=2*ctRYnK#f*dY(nr6Yxd)|Z6n7H>gk^RKDjvlO7f<- zcrhZ{u0iq3EbmG(ZI*7Cb`EYf6pi2TgWDR%t2m3cPYoHE-r-DASn`_R=X?RV=eOSU zQ=+TR0a`$WM=*7JU!GP6UPcbtx~P=YL0W>AOG4lT8)e+_GPXN#c%N13g=^lI2#z-k zUB0_WC&c$ZzV{xqZu;2 z+LBd};23lD3?g-%9&oDWfPZ?Ducn4VZ_3HsywgK7vFylID7dO11D5Lz6y8l`#N~zN z?>?QO{=I|75$U%BB2Vh$^Jg&@PhMAZTNQ2;y(;(=Zc4RlCDj#EcyNS-^pZ7C z=TNWe_KZ#r>fUF(^@ArG@3>PJVAOd$r0zvW)B)Heht2zxBAUz1$1Z6J3MS3j=f-PJ zB`65fV@mI5KR;9;uJQDv)rmx7qU#uKc-E#!I=d-qsG`y(>WCCiv8z5v0;J`*m7Uzs z8sr#V8yFUAby5y0_!On=U*{{W_3~NeJBg%PW~go@rt`a^EOt5k66Tjq(qv?QBW{}c zx324-3EY=wOb7rag-udX@3=E;GcZ8U`v+=Y$nix?oaAOZzhMUA5w;tLz1e>XNl7Mk z0bt>snc3b56L{XctmFyiKqT?aL=n+vkjY|`Uw7!9%m|)c=+m?`vtFC{1QP9n3Wnp= zM7*?*PKfctd?TevA6>-kIpPBxuB{Hu@9A656g9qqY zoIFi86?S=Hcq<_iNtdHl)FjcVW>2&~KO}&&T9FxV92a(vZBQ3U)s;{C!h|8=YL@&2 z-g~`zrE0rF+I(16_IKI|zId+#gffJex@AZtEK9w`<<ajW#R(Vn3{x(^baQ5w@c&>|a{PNSNJB7?Jou{hTa zHz8JLs8~Ea-S{b|`eT%y^9z3<{#4AIPZqzGgB(&Uh3E@@pR{WKcGFE@_aLe6-eM4` z`G6^x#*u}=dwDJV7)s}{B5;1am6%ti_Qzfl)p<*ZK&4&h6-^|*vMa(EVr#Zij2SY6 z>mz6Cf_&e z@*ezqHQqnxApX zN7XCgQwaIqa1sVj0EqN9Un`rp@Z2coMYFwom9EM!a(B)`V3~vPDLnc}90FY-nV*HGxl2 zXxGSLfRyi*Ac$6;T-&!vRA7z!`CBl$eo^J|TxBHjWvUd54`m2q6L(RGW!oE`iDNyv z6YsMnT&wKjP1Ryk6)v$j1>oQ!^RfY~29bL_T5NLNtUWGcH_gBpm%eZb&9tBs-OmE8+kaEcj zhv)ER8GM!KQ0|zETmh_h0(m4wf`H762pfZZ=YdH>y6VR!!nL772IlzY(i0Yp`%nTe zOSYhog%upL3Mr{g%uzL5D#)Qh!ao*_hF8<=rqezkU=aKs0P{o zdj9S&IQz==Li+VRqv)Wf-vK<$H$`OwXIXk#nl8q+hy)ANamC0p+N>dwQSsbLxizyK z=~5ZQ1qiE$!nEK~=bY0OuUF=e);Rsv$Y4CgVJzFrRQ&I)t@E`Zo&O|7^Mb#$3*&|P-lbjw_P z7xMRM8d26d7}Z5qrVFSbR%>j)73ky4?KV1oVf={z=Vt@UbN(RBkrF9w-V~7i^#eEE zLtJhe*Op*QZY^;*HP%$xRCN^(NQ<|SPK>Q@vq%g7a*t?lC8a>{iLE=F_I^?dtFwIn z@oGlC!d84ZqPk3Th$-Bx_?`{H{wjNdlDYw8G!rDxM#16z-k}${ssRzxV=^Q?h$8+m z3UzvljbWQU7d}WW%MKkytr%*YkOE`DuL|?hlJsII!!@&pKUwih8$<*gZuWw$FZC^Y zci&-o7cVvqQppqI6k`~0I2O-*I{me&qI%@NM)w8PH&%eOzcazMNK7g9e?cuQ!a2B< zq%x<5+tsYU76W*9>$bVi8MCI?nV(EsfoB?+ou9#MSP%DRKEf2p!eX~khCAyTD5B#Sk-cfxuafjcA*jRZl6N{U1z*?ijsaV zRmpep9wD839mDtIu@RSveFl97T~?PcLJH+2&RCF2J5ux1bAkp4@N_~rzP!bG(p5tL{SGCL*z!#R0-!CJ_Te(W^ zXq)adP$nJKS9RaYVK2A%VT7^SERsG=8~8DLvB|_?%g5-@eO7wr?-!H?wN6j~mF17| zOb!5K5^mQsdYy9_=(IinJVK)D#a$HpgQ)zA5a%--t9^W2-ua>cKF|p)E|=)^r>3G! zO-H_g<}grL#fMSCE`rt0fmBI~pnqU|d((#6oJm!$vQzH`JGz+39_fGc$mO686dr(H z{G!wvSN3Bd63SXX<9XL^FF8*Tt)Pjb+`#YkU8j<-u>#`m(wMMz#sguU`?Gr2kn-K$-{C0e++qle&@Y0(Ef$#<<=@y z3EmX)m#| z@3&pIy60EbPQ&BVa=uO#LU0o;zvZJDiR)77`H9%>4!OF0M`FKHCOZC)D@PA;2{k>o zuzXmIB8Ud+k+dvH=iNYCajHSm48Vi^`WZypH*5()N;e*dj^wSBhR)I11v$;ESK4%I z5j+PDfqa=R9PdM%sZ}zhS_Suj^b$)qtqxVtlMIy8A{g5k#x)S>w|OH_Oz%uBEf?e5 z3%Y=O^WU}1j8H4r?qx;rK06`%qOQHoj_qp&GHNh5p1dZ{Pv)IpE2SX+2U*ilk$i8D zoA_1s@I$pPA)9t1Hu5^(XC7qlkynZYI((XeR!tPV2~dJH^s@ev%y(V0LjgQGE^62B zTR65nrqc+fRoY$ZD?M?mwbKTXTwovh~nkcYC`&%xtaV@aFexiT-9;D zj|UC-`by`HZ=(JclXJav3TMAF3{J{ln0mh!dZs41+lNHPl)F+={Ng@zyfA!pPlO6r zGK7H_&?(SDCBu$<@4wDn0RLbG!^gAURw#7igPdlC6v2rCs&6X76RSUT38$%tOLOjv7OcS& zn>m*cUe%rxcfRkxCVQXx{ZJvMsLJ{)Gaoe5ZP7<2dvVn36X>AkVl1FqqxTeIWvX~) zi?6bEl{tA<>J8l_nyuZ2HNu8c7rhD%LPu+Z+G3&hNp8>5T?)~PSq^jav(Tk6-r=Mwb9@!CxuT8OT%hT1kGL0N-m_A4BLNQ$U zf>qwItKXNpsCMN|kf>b=Bs>;^8Lw-c(diN%WR*Tn5m)Qht?SpgJCPlzm)LoyU0nhNXSK%(m#Q4gg+*! z6FfAK6KADb3Ig0H0(al#*Y38s&|tK4(vZvteV+8o0{e$I=A1I~802~T`~(gQOPQU` zo*$$6 zd}K@q9cC_0FS(}@B$=eB-SlA;|GT<-FO0P%MHsPBbDC?vaH(jn=$)Ve8%X@CuuAJJ zn@Nn0!K8iB83VIac=C#GrOH8$=4OnOqW=`_0p|5#L{;(!yuaB4q$97u8U#0C^Tg8c zGyOO}H)vSaQY==LJ$dEx+hm6g(N`uoShHyX`XumDU641# z%4@J;v$a~;+)YI6)0GM>SMq!f_N&px%F=wltNm1eB(o%j-D$~dZynNeSf`JUh4Lm-$ZcYOdkL{lp(!cuA-21lTTBRUu&vV_tCwbjH8?QtE3E*aU9r=6-l`s zw;P=CO1mGM)(xbhoEwc4oiwQ2e6Vw}&XdWlor%9bW1URFEK(16dCLbM<%A67I)<0q zXFdf0k_yfvcJA6qcqooP)+C<0@XU6y4q4=%+`^2{2e)%f=b)fI1ka3|&X&D>cWgdr zpWqnQJW=z&ubgOtJ~%#86C>bD+S@rFfqn^D)} zQ`+TWh@xig^K1STlXh%C=S7|SOX=-mKW4rwvG!o7AwQ4#N+uP;`pc1}`*dtXt|3(3 zPNiK;s{VcTmbdmDy-I2%SqWxCk+5Ri@Gl8izs)d%2eO7?_~%#)u=f(~{T7dF-th$v zd)KaX?{73l!vKg?L#{*F);+wNS6FSte)XOX5Di0p9gC2q=HtUXO?l<}t3ey|5RO#v$ za%8ENG*3&@4|iEc2Mewv9M{g`wLq=x&~(m@1j3(6^3zqz|ApAlNV+j$d#i=HspmN% zcu?sLyuhcOLnx}DCpKgcGpZM5VrcWu!x%-@8CEorkb78(YRyYDb!I>6N3R&iI#c}} zl1+-ZQ$%E%<9eEfVg4#_qHF9;T=EXWG2ed4AhlUj`N{Gc2Ci7d)2!pCde3UT+Mker zenFWK@=sp{lx63=jG;cqb03a>Y4T71ea)zLZ*lZ^S?WXF%-+@kkptR1C97SFsth zGBq_9UDuiGxKwGSVk0wte%}J(zBy)?@C@Q^F8l?uGFtNvF`rlGQb+;v3P%d<@!1D=LvvK z!G`sf^z)G*EIu(Vnzy9S;z|ED+Y}(n;14$<-8d)U${2US>K|7P>dvO!F1@$i@JJE_ zlCZ?X(&51ByDEz;KUb$P7v8ca^V_x{F-H2en8ZAD1Cxb8SE@Y53v%|fY6SKu#O zBgEcux6{Xd(tm0~kEBSA2D*3%4fNIm?9k)N&={qS|7L~M)c}P=qT-BPJdsCbFE_SV zlEwZ0jfU;w`@2n_XTKPwD@d^MqBs0ki(%*WrJK)aei`}0W~%~0`zU&+aBHGSXv(#Y zW{EM!E%r+C}-t~$Qiuu^~2uCDtp*6_j}UfaDy zaC1DS`YzhEZObp#+LxI-h>$~xfNhc1OvO113)Zb23FUo)P@`8Y1*{G>f{3DRjrsPA z)!_R2n&(2nG0Z^rRcaqFHZE|%o7uLb`3dy5HUc_lJVkweQE|aXx0n11>!N<`o8EVC z)iGCVM0&HRnx&!=vlwS9Ol0)kFp? zY`w;^>!GInB~Yk;o&?7(u%o?-VP4N@p(+aVIk_%vj12QyL_bZKkQ+#kurFU|O&Z8l<5`7Qbh%s)G0d^mc z;q@#B|CDOxjrnnVhpL(ydx72a+(3V>T5r9`?gTKPLNu^gA0cFqFTQ^d&iu>~>qbi;hu_S|-2(<5KIFhCJ4>Wipt ztxvr_n888o{w**`qaC|6ad16&K119YEh+%qjW}nAc;>@7h`Sme6%L>03LPAm(`{@> z-6vtMokaU?@CjG)53m4q9zI=325Gso8Z)xg&3I<^z1%s+atn+zMB%R3N|VUG{p0$m zte~oTh`&}CozaK)#n}VB!9+B=C&3v$?h-q=v31CmWsj%&y+0nN2M#zYnqeNC`_kG( z%^WzCKeraPZ}A+P`Pi>G@gDI*`Fsm`^l#pw)^Su8IBB5WO9WI%vi1$Zg<_Um7G-Pe z-q$&6ZOQ-sY}rE>QN=toe+TFg7*;6n4_n<0SVzZIRA%kmo9qn?K`uo;p); zj!6ZB^o82O@|sUb^)8ALB@aJS_yDifYw0tXz*|f|C5~%cA2lqb0Z42b4sP3NW%a3$ zs--WlLlsRffzsCAGHkwI{kl8bn<&sJf(WwT+}Gnb*>{=p!cPJV8H=vWubRDn!h2Xe zCv0B1NEvdes@4b`RS|z>bVnTay6@(Wkub=Q9|KzVJ)di9rvV#?%R-0pt;}ox^)ZlP zJ)aIaOhK=oc);5b_&{^Yfj_=GP|&r*GS4`Y9*67F=^^vJJ^7t zn#&=2+Z(|AEX~uQMd{lbwtqe4mm_Wj_6kqXKtj#DsZH@$tR#c@E9LI%_syv>n!k<$ z_%FNN&4vsKBNVVo{g5^3%?=92;jz0I;_H2t%ZAX3U^mK4|I{2(t9*T!7(Hoi;JTLIuhx-ofpcxohF^Y&N+NAN6@iXSGqwVB&3E*36{_Y9kJEawgTf31FwlDJy zks3E2FL90SuAMs2`sP5$hjMoB@lbyvhOR^DvuJ`(!{63av;ZAnf9HnzK=V1x)ANaJfkL@vOUOOa=Tx15rS+UV| z;It+N8$3=2KttBYyO7G`^I4kpY^m>Lu$lZ#exRGB^XdAHp~l^RXxJMP5K3(~Yi8L; zfz<3J#+CfsUh}<`7UA_YW83+@!$= zIifksd#A(}(%7cE4;Gep+Gjvd33u4(;o`PD2{=5aQ!ECh^hLLasBB$@`uvRrEh^=i z^KC8%-X)XkbK2<3WvHW#i~Eoi^t+Ot{IFb666~}a(asG!)?PmeU*2m4e{Qn9QwBTE z(ksOTur`kdTU2_L^2)aTo!6dlHMPEQ-zh@1W3-|!OUZE7_hbf%7k*!pW06pb3C07Y z;MbA5uQO*&=!>3FI|64DgO=CHE`VW)@xFAC`R z*@|ci(=E!m5@_60&+%-A$LR-4sHdXHRf+~I!q$__+1U=X<)&29-Jh9Wv6tVvX;r%= zSNWuWJxk=g0Q)ISl35Fxhwi8{@aarfs6Ip*dV=xLiSr}=6NmJ9F6ylT;a&nt*vg*sNGSB9M|cti^em#XZv}~ zHO7{y2f`%tG2h+vgdCNt`X1BWMY_n8#78`M%$@DGC+YT2d}jIfRqgVV&y|p>p`o5F zy!wywd$CQ_%DQ=t^FZOJPHs=@N);z}d5cz4ejr18o#C`^)|Ti&X^P;tZHY@b)n6ds z&G`k=8Uiztv@ktu>(Ji6?)UdCZ+>7jmB)GN+zxKbQ`B9pt|uP#k>p0b3V2GpCibPV zw?K*I;@BJ4>Zew~)={8v$bX_c3MKf$d)K`Fd7chJL;L;fMf<9(J}KKqkMy=&AMiekYT#S{g-YHtJWhVE>`v94V?TYpC)eFL zZ(%6d_8er}CALD3MYpre>}UJ0qxgL8W^YVa3@Ik$dd1qCV8Z7LxBUD0I?DxoFwiKN zf1A5=4v1qoPCqq2E2nqofpTru!;fm!%udGmiO*(v7HzC7WfNWphy{ft&B$^}Qr+w@X zt|8$n@9HfYalT&F&>g`4;_|7_u$5O69L)43FeVa7?$cW~YixhgrzkfXs3-lgZSI%E)!rv)X1m$wO1-un>y3gl|@_z8^{+0iY{9A8Zm+#EB zJuWnbR`RI}kJm^0fEgVy3_+LU-d!x>b9bBJd7IC-rZJ%-t7S82okUPHhFLNHXAc4( zi?gy^NhDPR@iixg{fXM>8Q8v-RyQmz1WpI!3epwn0N(ZcFUPzSQkJrBu>9Sx9}7~y zet#;bK=vDL7!;rLaRk%jn;pq*VYvM}+yaT7*VtBySp_Il*BE&#@+#g&*2vRko~No! z{D;N$^CJNe7eUmKPM?N$kAZD8F})I1#L|<3EFR&ocEWk#x**XkIZLw+?)Hem^{`er z+m3LnF)eY{@+#|H{#xkYe8`>l_mH2r3|YXtOO|Jec{9VoI}1(d`RFf-et|lGxWkIx zpGS!bMq0m$#W(o8fOs0v?CV#vXRr1s-lp?ICzz}e>PKH+DTWo^W}%C*0Q!MwwhstD zPwy$wWF0x%yn?cs#+xa4o0)y8Xkps*PI!mh-AdWsEI)M@_V`(NBiC7}t~h1NzJY>5 z|AmhN_`l|5KQipXqfvFeHjcYSnvB`+Ig=|Q zxBB}Ew(KtSK@wT@Uj4WGK2f~9X_uWPf3Urcf^}qzrhY)bm*5E^@N@m!*MpNEH~qu( ze0EK+m)CxmLjEk@K8)<^uI(|`dWiQqLq@h0x8rA;TuJugipZp^H+wOtc$NlHwbg5} zFeFS&^3y~RU0c;3Y5G{}K?yr}Fqa8I$4;UVSGuX*5E6H3=~?M-UqsV7^3KFy(f_@Z zUV~2F(GTFBmd{V8@W=E4z}WSWi?{}u&Gyo8WQmjLKKK&O(Hw)naQ`0OIZg1#vjXt# zV~OsY+BR_Hu3$2uE|KDTsJvThVGPo45%-7k^^WBTiL0W*oCPN)|!|R*mlKdd&MP^H|e>CQClx~!EUc@Z{6tbe-@Zy)f8?ct9qP2 zl)b4viQQ6;XLg*`XKn(nfED4{?Q1BUBZK zn&r+;Ekif6n`+jhwU_OaUc(clq;#3#aL-iHQ8y!#T;p5Cco)yLxTS{lJi<^e#J579 zyC-VHzTabyfihN!@4t6b!L?@_KO>uvg+MEw#X86pVb-rUrw@2B7pa-v?l)~}@BEYJ zYuLydx*cSgfGoz?+%WYN$!^xS?}va#qH_H9?y2SRa}roM3pf zt&L^^nm8!V2@F~8KGWo*e4eR_Pex>I7ohMup2P{h^LT9#HZag6_j-zv&x&-1TY*e; zf?-mXDW&#rUQ?o2oM0ilg^(q@Npi0s6hdSZ=2U6BFj-`Qc9Zn(y&!CMc6R`2bJIBM zewiYU++jZXU*QRvdlNy6Z1=@T$?RZa$HP~CpV-5k$MQ?ZaC;*JPSYc=!!oB)+%J>f zUgo2J88R$?XZ@(>QzmVH#7tX&{vBk}B?;?71m#cJ#y8W17&dxq6x9PkBNo&?w915q zGNJLAXh)dAU5~l@hw*8>aRLc$qdnpM->acXW$`EUN-L%x4rP^Xg+P9;+i!;g6u!i{ zQ2K#+7GvaKj|^ec85H)zbItItJU$aL3ZH>Y-H?gjz#cje6?1W_XBL#k8zuV|?gKU| zT9EK0&v*WD_5MOWnsNV9x^GjFpt;W2e%On0^qAeHUvB{*vemvUZsB|JU!iKNILYLO zIrCyRcdy9;=|c!7{`@$Zo^nevL(mU4OUH3G#y59(7yIgM7Cd4Y@Z51eybbe|GsE;v z;Ug3+BXaJ84eKONMoE(~DnWMV_!(Ue_VDk&39jvjpU-U2w{)EL7Q89ZTz%ixy`pq_ zn3lV(fRaed3Yj2itXl1aLI1jzU+FMGb|@KkS;DtZ>+pl%5E$1fliS#8KG(u=JWksm zBtzTl-KQnNLG~qlHNBm~`!L0sTw8v&K`IU$S#pUiP*f`9nAX8FCI<_4%ALkxjRnl4 zp=JtUBR{JSfonT4Bc(t;X($BFtdib|p6GJ5eje#&xr@Snb+B0n(*Jq7JtbC^Df=H~ zJ#^taCG%3qB}e(Qb(*P=-el4qBRGWAfDuTgj^$CuLgET1$2)TLuZyesY8R$}Za(@8 znmm$|-c0Vhp*F={=%Cb^KL0=`rd#$YF^(74Fs;@8T*4=0&Z*u|5Pgj%>d7D7vvlMj z^L!NhhhNQ33^P2OZ_qySw@v@ymm~EkGKd}V0Y0XGI&OTgKHAgEPHTSc@@*>sZ$%}a*+1Q@XCy-j+KFi=)UT~i zoym6f#P_is&vGxE#uOjinI^!@G;un+oGF>h^|!^>T!=cuzQ^1!pNo?cnjvS$8#QQ- zlKNFga_IQT9@sQDhwsa0=}amX_w2c^-G+>=2WH1*Lt}=;p@p1TGm+-#jD4|OCM#=L27((Xl$7l0C z^I&6C-!MFb=g@+ZjmnZqbBFsw+K#tv<>vLHTWm5Di0gm?KjO96;g`*w zQ!S3dFYoonYyeYu`sCGgMO3DLuftE@>1J%B_pY;y^QOyQ>?-BrG>|R!#7geeMExbWChwsVCDf$0-&{xI91QNB%gsOe;TX zLA-Q1%2LZ7YvE@ixl@D}cTf$X;UJNop`7N28e z+A$c9m+Fha_mHUXFB#~zL>U#zQ1kiWU0BVKAj<^oU1{N&SvtV%vwSlt{iS9wa;pYP z{F9o#L};1NJm0<2laj>SP%P)D?sthHH}33>W)fz3VI2GRyDuvw4Gym3JIT5E+!Xvv z$>)4$Oi(@$+TU{K_igma`k!B{h7qS(D>J&mH+WsD29p4Pu0BcRFSW;HR)kdkka>5x zycb*bQo8}@vroRu(P0|!1PTeKzwQ;L=^^oaO~bPO!sKLuQ0Kf^x!I%|zb(?f3z9>! z@haY|&IcpFP*k_#p{NbU5`!es+ez-91`$A@4|9?bzg0&#XnX&P;Kv?pKw&F4-&q5j z(e^pXg172tvU-i9AuV;ZKkp9Q|3Nk;XVBfx18C9Cq(M?rm=%8J`G%@p;tq=R8eF(H z6Uesf7Johr1CPgRktwT%y2CBzX5d9gb7vfM>(Y3HB-4=8Fc1~h+YABZ4-x`((kBx=^urKZ95g&Y$}_}Iy{D& zBR^88OZ~9&TfCY1cxxRAg;OSA#2r=dM$5PS6ENa79$VvrKMFr9a7(LXoLS2O zlHW1-%ltj>3CYXe#1Vb&UlCH0qUF0lq*)0ExNy8%Zal(XL&@2A;hvT{VcxG}3M1*^ z529;dM4PT}bY#VROT<3z5YG#1g{tr`6v?MQ1&!nSRV$jsZfE^=yUdu-ez|)TJ9a-_ z4U!}+fYz@VA8#7#wcbitX#}Ll-a^#nz}tQqOK{EK{nmb=1v9`;p^v;PPVC$^o~5&; z)xF^L)a!9Bqs^SW@Cl-CD9hhsAuvo$?fs;0Bk=IE@nh*AQU}OjR<)$*je>Hz%N%}usl^%G46lySX~FqiAdd=gB_ajYnID$ z@PWDaF1?J+l$!HtpZS;K)z{^u9*WM_u{C0SlY3~R{`<`L@|znM8-$G&E4jO<)~JQTbdseGTlGJt`3Pv3|2 zy}S_rX0KE|pCbJ$XE&LLaK!f?SWes?ey(9c3(9IJT_!;-lq<=gYnq2l6`@c+w zJcuZ#KU3{1lK}dlq&mO1)J-ed&Z*?+JT{MkE={qCx*>%~9`l#L*gI5;Lu%v+6>zFa z=NHTCZ(sc*PNPSywbTXTgHKyF5?Hfnf(`~;bpTSONLXemhnpUav?1LZ)XbxuKiBWK z%b%hWzvf@WjxF@#hvBc&HDfP-fTfx5j6a8c=qC{xtu{%xHk%&a%AEg$M0|AsXAe_ODMX*Wjbz3AC63iky{|$ z&GC5L=Ena1c=K%ciO*db(e>A<`EpE5AU>zJ^=G)62_`eS?6#tXY1f@0YRdXJOD`>s zIUMONGonKa!uKxA9=r}lpgnfbJjb^@-~7%x*VAGG^7lNV-*9(-cVdO7u`ogODcU=t zc*+pG zcJ&yOZZD=aEIgpaLoE^YX1Yyu`h?Yo$3H@b7!-&qp#vPA1b#kxgu!&e-{VT>(DHU` zjLui=_8*x8@$kmiaRrcw-1Gfa%==Kg9HzJI2%f3veOJHr{avU`iU*F4?3S*=_%0mxsl&spy@={iNSDw$s6=$-I(9wa>}pLcrzO&&GCa6LS*NwW;geD zz|@>qwNIF7s-rMR==k0+*NB)RMt%#=LVV6jH2ItS5*`_C%OaOXeb9^a(+bE7Z*Zl6 z#f6@Ly~N+*U0G3_Hd#V~Mey#(U|>b$yL4q+DcQvJ4byy0LQ73eQI%Lx!4cei3w|iA zg%heg47M2}S5Y7Qa0lWxXv8j=itpFMNO~AVcFXosUu|8!@-A^d{-BSi($g76dbXiv zzMD|ajm$B!PF4-HiABHIvBu*e2gHFx2evHKQH ziKAUBMb%;O{E;AE?tm_zc9VbjulQk_+El0aoVrhepTlrEIxw82maATJTS=I?Hdg%9 zDANLzSbxjv)gXr=B+6+JPDc>{BMJ%WT2z|MQ5f4Jo zZ+MhW!b^UB)5q|`yKcCLzM8zeKb=ik2+}qrJ;`dcPIQU~oUm>v4<=JeYQvp=S+3>2 zzUAwFdHvtviyodjowBc3TMkGx+;vr)N2jzkZ*)+1^Q2MTvbIt#MKBW5oNl5y1HiD| zs3PUnq>_u4Cyzp{SjV8D=g{3A%dLlg|N5vpgg#?ws%SII3WD%6nER$*=RhBOudJ*V zNU`8=XAL~K7p7X%{#FEF{4>%J90kr%YWzL+?(xH23OeZ=c*he7a3()#pyyH2x+hxB zRErFC8A4=l?y-mgAHhK-pl_H)vH=v%!LqwPj(u04`h zukO?}7foaasHyokrgdO-A0TA)qv`M*CgVHhBPSI2ee1in&K1_YF1POF=WO_={tW$J zXpZEw-Q`Gu0J9_m@n@XJ zG~plL*mjIu|NK)*{x@GfmuiV>`EVxhC}txVkPL0G_$rHD#w*dh28-V(sCBVTj1Gj- zBr{h;2py%-&3W2fD1;-%!0eT?zzlbrPiVY|lX-_n?Fm|cy&C~aKXOb43%1|U4%Kah z(e(b51RrzoH5>yVf@-=`q-7gds2w}U_cz*RWc7#Fn{QQ&XqsA;{JW75OEc5d<1AQN zIi~(q2=G#&VfYXSZy-bncYJW)y#8lyf02=Hf8_aG#NASGbF3qLGwbW{3XU{HyqaS$ zd|XI9#}B3}p@ac;a90Ih z&GPf&^-VTkiK3y!#)O#WsA1wjZP}GkY^FXFSeeq}>6D9v{jW1n;*(g_;lA3WUn{w|V)n?0L;kgIfU8ma%S+wZw z_RaWrFLom#tatWA($5vJHJ$zGk8%{iB0{CQVQaO)I~~tUBWTjyb4sUZYa`9^5gd%M z&CUVmnW%8uR#;Fg&qRM4{H7s?vY{ZOu2t`^^HRm=_V@#SNA^7h7*f%}&T<81j^6DH zit3nWM_8RUYqq{pLj6twYSH+4c~e#6%xN$NN-2L$UO+#cvD5VS zjCt_y?LyBHTyfp8Gi;EPaj>w6AS19ADFH4wmvfHr6*Pu7(;vR{))d0rCm-5g%NEu~ zuinzOR9GJfI2)V5#PBnEmQm(;swh$3>gMn6{|@a-JsBU(J#xP_U#$D$&1yf&JedV# zd_nBKulb(Ur0J-s%bFk(*TMOQ0`wid7vdMr@O#t`@&xX(Wqnn4!prPt@rGaM_uAfs z#F;{v13GX6de1t$_5DU`-iDm1)Vs4OVS1aB4!RD>=6QVqj<S^Wxp;18 zVfOQd?crPDXJ0n;J^u}|+n3rmQDdd3nLdhNxx#uoyUFb0A=~ey%ZSDF%A?YEF6%mp zHHEWBEf&j0ws&e7Woabv4cjOY4 zD@jqm9M~i1KRbKf_57ST93i+FLrqFtWinX)F-Ehb?3?r+L0K<^3tlfTwJvRuIf600 zi}&OctgL}F16PWj48qcvP(X3r;bk)Ei5%wNRn#A3DsOd*=R$dY<=$aXZtWq3(@2_e zB|{7nyIl?{oOWL4-l>oR&flrLZpuN6gB9MTbujPG_YXXmrKTdf2Eaus572qOpNx~1 zd33*s-5zsC%HA-H=K~GztK5zu(~br+sC&HL3$|!BFrkFZ>JE_Nn2yC`*)iVUpQr~7 z(ih(9F3T-T2cAJRa}4p@-o~aU$PbDQ5%M1_qPfzRkjy#S+C;S zS8qedQ+XUK^E%uZ-^QZ(FOO`4+xa@lC=J7f5=^z_sJWOhu5q-cl%s^B3dno zIsgb$jVVMeG3I<-emTI}i6PeQL7#+CR(j9n%gFkxHP1!jYe!Kx@_tkDyXztvSZ!0TDdb??Dc=hCk%MR&d=}>YSHmWGFQzWKOraDO(5sW_!+JWQsBS!FhJHc#H zCr|R;d-JqPHrXIP65bCntC)70=z0!N8Q%l24GtO32s{XiXq_;p-- z{@&T4NjD=$7#E)??~?e(6kCgOowl{1Rm87aZX<_Lc}?_FR43c$y~%fv&3l%d)M`=+ zvLN=>hVEx%uahH5(QYz_`HZ)5^p+Sn!6V~@jt1iUx%2nQ zC_O*T@uIDvbv)-$6*f62(kyzdgikl>R@ z4O3O!?GLb^xDZT$#gGG(xME+olkke$R%jnbM1N>~ps0op%cPt<}_1{V1qE00_DIAh}4l!`{X4N!C!wUUDDB2mVF^g5OO0ZSqr&T@(2`loIoyv3qVd*sp=-57Lw=GI#S!>2NCB zM3gJ&cJx5@T|Hmv`cddTeeVMEG3i?ZxPQJLDwt3bP6;nhLA-&8;hGf6mZYZEckAZs zX+56w5n{nQt{9%z1s+TWc&Wn?DqvD(8E#=x-ip_D@AY@1X<@}5@)zElNDk~K5y!|D z)91SfMb?bz^|<(aJZ}6m9$5Rx4fBADln3*$jiLGvyQ{T4N!-`7?5}Ru_3wazB9^u* z&~@#Z{5C0+yk8|s8NE=%bd@_;zIRk`PpHb4(cGs;$&vkBOPqj zxf9;MLgW1uqx)U1(X~Cj?yoP@PuA<=-3;UlgYEF%&Os~9_K0|H2<0uTX-&1|JIp#; zV4+7FWEhmCl9TDs(yuiWRdvoo74qWH_ihW7-BJ8#{$_W!#(!qrLU@BTk`1Kc+l|Wn zO< zZpp9og3M2+>opiPA<(}=sOSdkmXLHw*bT19YIwONG)V~)LOmQ~{3WA;6gZZjwZM>z zC9(ANePz0jcXgm;y=sHdFb0FV<*%Pr^Q`Q)l@(y%0}5>LB*8 ztsMT9RKif0#Y29-gU4f(wZ8vUiUZ+LOKB%c?@v>XDr^05ry2 zzA7)ev@GLqPQSC+_WeznTl}si^4TbUi$aEHK!eTcg^nFh2vTIH0tQa(-AWE?bRLjK z5Wn0mp?&h+xV|5Mzti&GU_oYVlMat*&QDq5HKs|14ts%FF9(AXThCb|p`t+T=)A*d zFM~a6`-Wc{HHjE%5O~sPe&+Hg{+@&U#^JepP49hZcc^pmCCJ@vWcX2DG-BHq&8tj( z3fb!f!CfJ=NP^@F$Et9Gz7#EeBK7dsdC%KGi61dHEBMB&(o9=NQ zCHE(xuVhpTdNCE?=(~$Kx^k!0gnT`Kk@nC#__jpy3~{KfMSN{o#mcnPBRBoR*O@*900Pkz;bpa6 z9smV{TrK;bn+KF&J0G^z=#^A)pUlj8e_tAW(sGk*4}Db%<5bKOf#d^V$hR=hL)A64 zU1t7^aiZceG)DUnBx5GO=K;r0cDZjJa=V|_$Vy;%f7kQ+f$D}ODLTtTQOZG=9wL>n zpFizizFC&whHU+h7@28Qt=}UT-F>G9Dk>Uve4|5O;Qo}1(8U~oWqPJ}zkS~GN0k4fSNZ<9#H#bF6t%JqC1~7i zEl^#1FILpCpJdFZ>)U;0>}hOLGABe>oHNTzY0HTv^=0b*a{cWjyUsnyAU^hEU0pT% z@Bq^?7mnTRX#_Ye0}V9$1TJe3i$gr#oLc{?zy+HXf3Qnglb_DrpS=^=w^Lf7N(|GL z=!#8mj-X-l1yZnHTAl8=hY0=-uK;RZnHR~@JQK~4&Ic03`}WE!vn|em70Vegf(;?Pm1=W}Y5?Ti)Y0T5<(aMNj^0 z&V(D)8m>`>-F>Z}^BcF}=diWY@Ctt$Q(MZlmcF<;Q!%?3h*bzm1KoaqvvLtxM6-C0 zAHUK5CR!aLTfG@?m?qSmrq_2>enxtWiFt@Z*C~xPq=q|O@81_Qf-757>=R8#v#$I5 zyOIs(0VFtiJukNs)0p&S3ZjZC<)XYDvxoB~UfW4NT}Hhi?Z+>lqubXaf9u5ENB9Y9 zr(bO#DaEc1=k_GJy)BRDw|AR(nxYGnp!c{h|7)chITTwhy2}0${F)~s?61ulJx{T3DXsz-wXZv$EK5}}gACO4eOZ}Qlk{EtSW7IQetF&m7wZ=aC@z1qj3{Pll$P9k`A0+Xm%F?|-A2K_FW z&!tnBWEX}ZwB1WRrPm(k+V-+{gw#hMJiEY>xd_90lBdV#N_bk=q5#hbGh>z@^*Y3r z1c|xVzguVDZT(N*Xp22F7nv8k-vb9Q)0tLkR8ULNd>2@3`bU^;xSG9`e0z)40T8sB zC%FhlaKA!9JTvS}54=%6TinRDikwHW*KbuGIk8voJAbxHHQ3V95`ktpJe6tAta@JS z9Q!YRJ#WS=+JM`89-!T0qVqUMtJh6Ann1OnQ;t<6JtuCFKZp2_kK-Vezu~Bj)|f7Q zle0K5cJ{e_Mqo7ee81^}_2;H6v=1UXLJGJ8k-6Kd8;hWn6d>!3H@Fn(a|=6ZaVXvU zJU?aeFcQap&*w0PLiMRC%6wG>j>EVRFvD4Hl4z2G>HS)#drZTh#t&cVo0JSfDZQMQ z+9VrtWE22~h4!<95tX^VzsxQ9H2G6q*2@Ib18*UVl>qj5>mM{xA2-=}S(_r{xA+De zIpi$Q-sZjD#-J8{&$>kFZsopIC#RD>ViVCI0meqXD^o2uT5Fse8?E6Eyb=7Grpgk^ z@}FWH_L`9+?O;JV1js|dg@^J?udumsy!Q@KA<*Zrh3?zX=v%qn2Waa7|9^H_$m9}oMgVS3gO0MHB;~3_`7DI2e=5S`ISYIi zyvoK9KD!T#n$7WikA&GeRf2{lG6(B9R*y%2lbdy)OeJ4^BV3afp7ng zmxdjKuf(~u&JxbM8+}C^sut*Wl(1GQ2)5<%J$R=6J)X>hp5+DQJqgd$r@&j3CIdA{~BN2cw^PoN)KQ z3}Myj={)osTzPIRF4Ew;Q?6Dx`>!j;H3~bqfyNi*-W5S7f6n&bu1!OHVvGB@v{CgY!OA*9T2sjyX|%P>3|*9oj^Dz{c;elA zxw%suJae`?|7DDbzTTwJD#(k_;&S3=(XTm#Zo_=nR^BB;o@2zidj9*ncFBP^B_6s+ zNdG^ZfVPagA)22?ygWvGn3MPRdoQ1Jfy+Fd{o(Jm*^kZIuVKg>yg!D(NzW1w%J(@= zy9U|*$H%KCLi_XXpLjCrLN{NhZoI83qOz$zX!%ZOdaiGaP*JJrb&p3f;v1%+rfOS- ze^Mk6Y-Kk0RgdDYC1)JPH@o6ue=c5e(;ZClFHu`}g+u6khcb8Y6>LB6TsFf|VfMQU z&(E}3XE-y$Z0n$|Pgm}ZMO)j#Y;9Zmgy*|5ri;`Y? z$_;OOrcGSAjA+<=q{bH%)64ETdm2P3z_hC3*!la3Ggk{#Iah*0_vB-VP?{}%YD=C? z1v}kasw@2ApPCpHt98g#4J5(V;aoCtO2x1f?(DH1t-hes!Nuw<%W1kAK)OF7Un}`0 zOCq6x*%E!E_)q<`Nb!z4Zkw4O)PpB18_Rat1ADZ)L0}RBxDVgHj?EDBx|Xmq4<0#n z8d6FV=0l$>N*`YLYR=d0h1s-yx+BCi1T#}SIfPhmKWIGbRlf0LyiP#6fP(PMPWoAUnYvcIVm|SEbcNA2G;e!(oa6CS z|AvPfxh2U0Mp+A57YfuOWe3e(u0)(%o*MC})5erh7Xi8l3Vr5Qg$wvwIgl!e-W+js z4G^$CDeksEP)><>8mec}d6}jcT^v+%7W`Fn&5RW5#@@Gn?87tU%fB7;0aC|$_#%qu*IV<{ zc)a^Nhu*47Zqvb`Gi6EHcfYtg?uZKz7|)1F-8&hLcyolct$xgQ)Tw_gR4{TuE}zz? zcnxds*OH3>N&=nYb`nC49N)JY(yUKDDC*ZI}APnN&fw0!yG zX=Tt7!croGio5VA`ns@u+5_mgWJN|3jy}LyBh`7mZDO8>WZF~*E#>;Sj%yn(Q&P`tn)!&s6i%#F3 zF{N+Yzu!)3oX7*oJQ@QgsMSKnGNN%OV*Zwt7~_g$c-)Qt;v?E|$4OtM)sF^`Bh6#z zjK5>Ch+|zFX2ictx;(21LY3E{gcv2Jx*Bd>$S;GINRl`O6~RPz5pV- z9cN$jBDurF)E^7={=2FKB#H3@5TbPD`-1W5raA$ZEP>^Gm|(FX2uIp&yi4?}iV5m` z#OrCX6e#-7Y_SFp(DWsj+XlY(#KMZN~xT6!RSC{}HYf7iQ@J8hvcJ(aS$Tf5##TH9Blhg(GJ; zc$uW-jG) zk*Cl(=V(}m^%by}p=p#Vh37XjP)sjdhvk{S9sksJl~)?tjv{B)gV-M~kJD~Gf{2C0 zlOW{&oFSuMdgcD`d~8WdMRqcUR)!!6ypYG{V3}I?mCid~T>&He&?B8q!pWXo(#TiS zN73?q#dX)N(7lU{U+^Y}Prfv8qvGOx{pb*>ZUY2Vd8NzyHF@s^QssUPr?~`i73|xv zsH%hFk5%qWDScqKgn+|=_g@KFE+lpMVj}QW>hher+p{0gfB(d7Wi51C5(9*kPSgT0 zgQ|62QyyM##fuV$v!zM%DPh=@8V4dYhctZ90Y#JWqFVo(eF=~ywv#OB$76J)qiC}VF$yI5u| z6tH2JjHP;Po^N{UEUG$6$6^O73;^vgh2)D}pqZ}UeYP}1SZz4M`1f*$83 zW(59n%%5@&fvREKHK2l$TgMWmM;8d~+{F}b(U@P}p#ky6f%9nrR+t>E$3_1Kb0!ny zZr@uzt~dA5(a-vA+4SWHJ*56E?$4riXseBJV^yzSPlZ*Z_wp8vR+(tP!fm7jVxfrX z{O_Yd6Qn+$G<)x95zLChDSwFvLl=r$bl#;8lCsCjXI3U6SQs2HcSo=PYMh$WSZ`%{ zR$54nEq%@W&0mOUMmFH!=(Yg6D zA12ivviik@r{#~TvsJ0w>dq!v?eAm#a#}(=4W^LV35s(ohr0$7Dl=RrkVo7@cDuFZzmT@9(A2iOCn#f zhv=4);thXRJyHk!K&y&hmNGj(j~mxIiPKMPEO=JP=k<>aFM-CC>pzFKxeb(n;(CkC zA&>5iG2mM|J(bU-O$CQMM(3%+Yq8I|Bswg!hBlJ9D8B7&9T^4ao>Xb|oW#{oWYO|l zM}0}ZUrLa#vjw*s#;q8mcR+j*#{`;x5wYMyU+yxk0S_uI=b-OHn3klH2B^Na6H+mA zALH?Jx+){#FMRC+miZ?$gZ|_EI8@7fTI3aZCRtPb#|pl-SKf*&@R1JQgiyEoN(e;2 zoDO}4Y;(OOkIf$aby&_0ndi-%#B^FqgAGmYKdr956+HzkwU@vWbOM z>VeYMmU`i@y+k%5TuWO~xWYKDLbf(VsGuoI`10LWJOaTf_ZPLSoo&)xpsx5Ll3#%a-t3A87e@hd_p9Mlv!y zsCD0ShFeF_s> zCyxn>^a!R;%vJJ&pUydbWFXr+wQAT|RIc|>+lgGviY98k*JkW(i3}~n9X8wNsrwa2 zq*i2g6zqZ%zrg$SD+uSRbORyDhi!TY|LGLyno&8tPQ)VurjEb;5Bx^S{IpL*5h!tF z86WFqK4(#QDURgW(;w@k_$XuNJ_wF!E#nd*V2?EiU7nE;b?^cDqW~ZWD8*B`(ZKjt zq|lCsAXO?SC!r)e<(swL0XDLN#!FOkDk7C^E%>=Vf5->VNoRyI&RtB0t2t3#mJKfr&_q5mOD$$&k!PdvCi`^909CPw~@ciK=$NOMkT?@#y?^ z{YYcKD$0~$W_~^%9%s4&l<18L7?<|-m*Zh z4>4~ib6aJXOLWR^TP*Nn2D_t(f@d~GJkdTvNp208m zve(hWixLn#@6nlqhIKS7T+|9laB|@Yb zH!|QKWWlr~5cq8pD37t%BoEHA(T#DW!?@$Y7r7^aMS;@=UxPMt-c(12s8B5waCCuJd4UJ zpMs{Ou@&N3zpOd^a=PrQ&#nCU&K46tDV}Vs$6sbB#YhCP$Q(Psf~|HBoHo-*tHlbn z)v8+ctDM0GY2j(w~z$w391MP0wV z9V!zn75jj6&wRif2Wf29yB_wCcRjkE*O!&r_LS(Rtn#-AvNo?RB?zR_CgOSX2Q}n& z(7GBhQYG|tb*t=`%%i+`+OY|r`Z6P2zC6mv7e&uv#c+>bY8FwEi~2X!%yOnJHQ zw`Hn-u)sI?Hp){lyQHc3U;P(&0s~@8&k66z_ zxgtICi?cPbj6g{1uR_D+^-I^aDYN|9;=!XC`{EaZO$kGI$U4XXiwx&oVt4G}*1W3> z_(CX_gwOtQbY5GIV%rw{HjIQYLRewmZ~}x!_^+?X8u#grak{%IQ-ZzMnloa62XoyM ztR0f``4VA90<#1?@V~h)>fb>-dRgDuOS!EQpL>+--~45wE~F>&V~#SEaB@=XZp80o zmkwwY!dG58*_Y$_u0WQYR;)04@Gi#bZaz(Eo3C?zdOU+=HVRj7e0$hrRVp~q*Fiu1 zooLe!29uJfZdGxq6#I9JM3JEVJ16utzL;pYkG&F|WC8^-TRFF%{J7tJrEtm?W!7hq z%WeuRCF-AzBY$2cBGWv#?W(yM(tutHBi&Zof}Y9;C&b+B#Hvr`X{xD1V5!Y@4g-NP zyqEHga#)@C8VByXJKwK#Vxe15U&3$b4iWp?*ZAA@Z|{Ffx4W&6=*%5>19bRw}Z zG~A>l7^^&Ku)iwF&o?||g@t4+3(UeoO?>E~)AT=RoS-a`-%uGx5L+mu!qY|7qI)Z% z#b#svFg_$uxj1!v|6g%uci6$RMJFCCT1372$K`QSZZL#3I{%TvGOJk7jL`k@h*HYt zq_~$Z^-RBm(_fRCF{~6$fodHYjOn2(1EWD2Qiz}Zn?t4cJDYj!ZFt@#mWh-7vZjHL zXDH*|^)%fy|8_xU4~s!SD|63G#_8;etsKY6jYbVNu{5Eg`Dkxc6CcSp|J%()t+7_^0XI;;(zX~rKMLNdgu{JhZ@HH9K=!Y`ruRVleqn~>=D8e^-zOjY3oVdYamTJXir&BAfjFFY zd|wR@kFGU4`NlDwEf{6?528a=={wpQOy6!A!sf2+``zzjJ(%O`d{fhJBV@)eQuM>Xz~;N6pPcu^inqn5Le+_HvQ+hYJBUh;ZxlS!e!85NVZ?VIB=T$Y#4A#+fsz_ZY3+5FD-Iu9NuFLa*Xmd8!^F~ zvzf&Gjof-xfQ*IY?OCu3TFb-9K9=_d=AK~q(HsBkD)v}+2v#qy>PqT@_Cg5{5UP}& zLlf1Bxw6e$kGl#zAoaiRt9=xNto&?Zw& zDPPU>XTeby9DIee>5sIB5unOFLoJ`?+$uwJQL%&uT^vcnJa#FR7?SwoX^mt0Y@f1V zr{w#;*UW{?dTy~sFk(TC!ZE-Xx$yu*F8Bs4c_E-atC-jYVPgxZ@5+4L%i zyN#u1W@Rur7d2>Mv|5sv1fL@C`OK8>_+337pp?)xQ>fyyO5E!8K7hbPG=0-4mj zzo|(@9A2YFX9~$c1kBu|RQtf~c}P^KdVh@prOS2UiIBPTShKAUVpzF5+vl^Gc5fDx zLit5v;ybD(aG@0wi$=1zk(@fCuMwIhH@y4HTKDuFlFT!Hr5emGSrx=g^V5Du_h)Yi zQzo%bdM+l4CWFLbH9043@ad(ZjHsM|J^caH8+iQB$=zR~;5E5U9Q5_;6I6CjCP&0I zVt4gM-0Z{`_<#$nbkvC3oBR|e^#nYn&NY%~7|8$^@VLExRqt#!It4$79MknRU-@^YtP4dk!+V zgF;swsU^QPi6I@$n^yS{K#Z4koeAVk!$b@E+e_YWO%SRT9SE;_<;smWH_9i)e zT8yJw>rs;Y%DgD9iQk8u7?^*YH?KB5ua$Hi+n*pOK)&k8apTVk2t?&mwwSThWL9#` z&LxP=S4m!?+>QtC9#6qTxs(6o$(u;7_w8)EoDbYC4NlG*j`Q=Cb$?NguP4R%Dbx0? zB=6ooGh;Pa49@gfM$T*+C4*m|zMn8iX|_oj^}eu5iygf&#I0v{^P(!vYu~weFBIo3 zBM$tf|9z)#-Abu-X&K7Jxu+`*c?@a9XrNGiQG_XZ4o=WhKYA3r8QDcqy6{PN`R@di z_f(RxnI=2yXQ+w+u(ueVpA}Jxqii<7pK=Bo$&)_Z&havS>YQp<>FuY=7@o6Us8!x~ zUMBusQYDg^``oXx+prXdLOi(M$zs1xc=LhqRDQb{r4)8*T9~R zG-%DY0%70jnzXA#+O#Qaw`3~`r2n>nP`933(7yQ8)SqX_wc8NzD&B*hr~VTPe}Ioi zwa-Nd)_RH2^Or2Fs+73C075DAVbXC1V*6a3g!yu`EaTIwkNoif8~g$WI8*bZ5Zyd* zE@mS6kH7!$`jirvW+S$8@+fY4Gvr`z!|==TNojU@h=u)^6KNA-U*d!_e-Y*d1DQPN zVtBPg)H9G4ycbsG=qx7#u&Ws&mlI?@Go zzV9%5OIkdL-ljeJE6}v^bk`Vf<=Y&X>vlmtlp&i@picwJlfYBEK}-1qkmuvGU@r_P z)n})q+Y6||98~Z3>ZY6UV-1f=cJA9mxtKG{&ouuuA8NosywdIpf6=l%;P{idrcclB zdX;5%^l$sh(#00DSS5`fw|5cLwPs%z*$<52^oh z7lqnuvkCNN$S3dY9-yNy6-^cz1(|Owjo=1e&18vXEt?YN3B3N ziR>VD3meEcE-(4*f^_>zw+}Wox^Keuv7gMYkZTS85uK2_gtgJ$pQN_^m-``=Lhnc7 z@pD_WgZ#=9Mym}tnx{MFvV0uehL4$(VWR8TE7*R{FKSwV={~1-S8>ig}u zuf5hO4=b8rZ>B6n;co$C5FAI*ulDdAEc6;gJ9L%qw;Bb~`d+ia#4%_e@=K%yB=$?; zZrNJXqe_Zbsq8;Jzs_C0DM8$-ZFU%cIbAQaUDX^y;AHho!TSuMm8<<1Xx1nI?D!UB zj}9W{MQY^BwH*~Y*gI9eJ!!jPiw41{=i~Xepp5RdbR)_5q#XSVeM6_87Eg4H16MTD zFkYAaI%>&F2A=3lUx#eSAA4re9(5{+NbmExX8JIyCw#*{o@)Yqw0+!3IxN)r#51;Z z_;A9Yjl*wH0E}MOYk@I6r5Fzsslb~==?rQQX{~@#@&heb$^VJ zyd=$5-RQyv+V}H)K-05sT8s&(C+BWsI2C=aivVw@X!zceAR(F)dq@+%y#F}iTxpf* zQ%Oa0S~e-r&akWia>s;rSniyajZ=Wv$qP4i+wny}Obes62zd%jwjac%P-G9Tk z+U|=bB$+1Be0!7uyelfZogX$i9<4#WOh>+DrkELAr2E&iL&q>_I#3645$n4uKaEG+ zdf0`$`=MV8%LO>~hY36I_)RVPfh$h}19l=VU}KEAp-nOJ5sa z>Cq^R#aK*T^oQC$b@h)!LQp!p>KzKVm8;CyfakmT2EKoq<=@$Tsp&6$x|uoaZ6g-n zzC}bPyP-VjxfhI!bf_@ zD(I(cm2yc%!I*A+)y0abYjvef>@HO2k)#~u()EHq_iiXkDgf$=Mi?KyThFyGtL6Bc zJyFb1ZA_29JnseozYC1Q0MU0mi=S`J(ZJ%*d2s1pH28U4As+YYFE6|Qgg<2);M3SQ zQ8ImA{=qLB97QRFtgRYVv7tgdkFe<{>G+G{;k!;q}*Cc_lJC?#{6F^39vLSDKd*nj5x~YbrFFZ%j{SD&9Q4Q8 zp~OA9rm^S;RS9mW2BEUee)ds+6M!f%x2nA8dh7df{r$t@_nic<*Ux0Z1v%x~Bin(d z{#I>MU0p+E?0I(aB0&u+UmG`>@vkr=c{f|gziPzpRsK=_caE8Tz^cY6KzU{i%Ck#) z4$X4$QY-l}Qs*ol3vNT*zkV-e`dcKhuz^cA128z#T*7%N-Z{SoL-a!U2ZXek?}k(~ zS0av}xc|=4-nxDwqR3RbMO%&Br!-xqeFVuol1`NDxVsJ82O0usIqCFx0vOMZa3)M( z@AeaOn&>cW*kQLs=L9Y{rD&gAgVjRiLq^)_Z=5c8#^;9=>>bZZBtqYz`}K1dsg;b6==^x=fIde9s zFzIXiz)7wM)?|;yy)8q`vzZ*Iz`Ejk^R4fwwl!e^s>Tyj`j3b*uHO(Ccw)h-HpEJ^ zeMGN{CdX8ceh2Q@J8IVp%Ol(Ag`MaAEXd@34VJS(lO|1emYOH^05mq^6xU9WEe2{Y zso{uj)r!#XRYe=EP4kOlgvFd}hoi8!75t$raJ})#+~!?*Y9&l&a9WCUR2%g(JPE}cdx`Htufrn9+H?R6It|>K9>*JK@^PT;_7B%Jt9zz5{4xf!2U06J zTdUrT_m2c1S`lhz>t4wFw0?~Ipdv{SYPulS{X^V=5~TS#_u?&f~Ic=4g}in0u| z&dbNgR&D6G)5L0QOJBEdP;Ori_if;Z!SZ>GPVm#`QrNP-b>Y(3gm>;Jk{G_D82u28 zilR+aMMEbfnHG!z<$bhgTMzC;643|D-Y#oQT;e}W%T6E5^;*MCLdE(J^F{1_bX#z3 zkVb-Dnr=G(p3<6pyP;~<}O z^h8fL7TG=4ic!I&6w+gSD+$#46MDHN3a@utK7dzHPIe-%ZWCzpns$8eyFNo%Vk$;~ zOi67crE&~{X_0&0>8xIkHggFN66=pka&6J5#NlLQqMCtZKAzlWZwv6x`k{(>r4AkS zpmTY&oTwxyfjh>Io(?^LX0a;r^tF`gHf09PCKkWNpS0ddWxHy)k|?)N31y zWoa@Cac9P^z@GAPGaaA*VdG?|F#F6eL;uzEqK@?jyIXu#w6h+S&ny`2bY2sS_ivI= zXdGF(*xP#Jn3$Fv-&8m~tGQAOU0uTdpyZsSp zv<3u75Z8MieBwUnx0>D6^fzQ7H{*m|FTGzbCWK*N|3)Dh zb`I5;&=Y}Jly7X_;^Ap8!514%to$44qg6M?@$qqcr?Sq*=DLEJi}fDqLI{#EqNk-n z!adT7`5HWg(lwahIJ~*5${Q0|Iw;=?r0$c)N9OxkAJx;czj2sRd8$t4y$%!KmoIF} zfOmI3)91FV1t~Zak6v_~Qu_OhYNfVP=-=ddP<2vJ#RF(`)gGtkg{~0Vxq%ar)Gr@U zHerUa_iw$5^N~s?P|C~_^ow2lOSA)%IT5`|!~N0MUGk%Ld-}rE!lj)pX5ZEn-b3?K zT=!@zRG(4e{4yUC|97r&^R1%X9KV<4zdXZ1hMi@(Al`5L2{2K4^$e-}6yTGMry3$x z(IkE%^_fb!aVt~pvnB}Jjo2}%EP|0b$K&(?quy(QBZVOiUTK;k>(4M9jEcrV0Gwg8CyTZ*Ey3`FqL1qn1bmy*Ca(*5VUcovHYK7Dm<4SZt-L25 z!F!ao1TcY__p>TyBp!FIIOcY0Rr1J*Jp7)CSASkK?rDeK30^S9L7o1t5`$2{Z0PdpHldLHucbA z>#6I33;M{G#JG~aMN@jF6i!k9zKB&?r#wX{CPJAk*_ws1srzU3^z?&$MQ~YwxREbS zXE=F1Fu+kYFpWP|v@-DvOyLfGt$)7=n)N4~4D;He4@64o!ii-F{v$gfE`u&;ylGL1 zhUQYWzHT@AgF>sMDz)ls4KkCO;);yb(mhqLCRdlU^c#+|O_(?$CNM{pXe9QiCqFSD zWtHylj}B!kNB(I^U#<3+16|pCqA89#v_$IyO(cZESdtl(0$m zJvv|Si~%zKVJ|vcvX;a8x;pT% z2M<2TaK9O!==5qmf@;g><6cW?38ChP=SP?-Cel!tSrTH9e}c`IPvF-QW?F>LJFdrEKR%@lXkqLf zMFe&24$e3Kc4yP~Oo92t%d^}Tj^0(YN%w6YJl_j&3kI5WF9JQ?LZ$Z3KMvF4ixpmcshEDeYo*9>)ULrYJ`!gq1L z$Zno~-4n>xM>gF4X1_=>x#?HE`=gpZ+Lxv|%K}6GtT~VW1nXCk`9Biayl&-XD2rT)P6m^r=d$Y9}OtjxlBlUX$PhtM3k16^j-$QIG2^Io%(`t5j#|Va37jh;UF8J3nWB5lHA9o3JZf<_-mRuktZtwl`q!1VBwm9kdWkKYU`tv+| zhA;>no|Q!w@(^fcF$$li3HrJ2uln%p zMhEp31y+>kVEu!uc4dA(18rX_!eU!uVwuwAGU@ zO72+H7NHV*9qq+Me3wq=-!dA6a&9WO)cJ{E&u0{}dyTy@-)RuXESU17dwrh^6DJ^= z%y(vy*u9cy%kD2Jvd?bxiI+#qkF0N08f#lci&gdW82(x^AKOxh%AuBvwvw?_N~utH z8&25vbo&0f`S<#u?e`5{a_B*y19~gJ@3I!JZ@8krw1X}tjb98ZcV3zpjy`olfa$3O z<6PIqEsQ%Cpq_J&!*K_5r>-j-RI4{$w|BfurNl<-_ht*tuV0*mWdu&;&9`gUhs<(& zWU@?24C=|F`6#<`&##xB7YIK$qk`@XBIjCuO8g1bv;P6%0hVAvL84u&%KtP?Zn_f^qq1WJVU z_k;_Wao9~4WNdx;l6`X+1W%+0>NzXZN|o>9CMV5Y=MAU+o!*4f2>y7q)D+jwlZ}Za zyKo%@K=ttsPX6I}pYG>}Be+i_4@CyBmT}?ZC)uL|kr1qb0cH@h%V#xc7i%8K@wMx~ z;0#$MSJWbTIvT(o13I+e5uI1ZlVJb>4IMjmfNVVObBZW=W)y=LNo2JwpxUNW;?77- zs8|oyOIGY43PI=b>U*n#G(=>`ethAl=IR~GnXv`jLp=6Qy!eGO_5LIL?Zg=mI$!g8 zS$`~gSs2!U*rPXvY>AjgUVisu<+X%BVd(-05R@k*amZ#6+x5a;NcoY!4HQT*b_C9# z!BleaC2s;eW-{|I-7*NYMhBRN%Q{hX`Lle{oD0@iP3UlIMV{_(3_>)>S#X&T#}F#c z&(-NlV(T2w=e_p}2Q*^ee=4S+oXS+W==@+gYLyxzu-+IMZ;*wT`oUPiU04}jR)B;k z2?|%agjwI!O_k|DS>LQcp4z4$1Drvo2xdXX{MyO3>=p|)6t`0pCLtVUG8}Vx_l3GP zML{MnyZ_+bE9WPVahR}e7qtFu*RS5_!Hr+_iGEO?jNSXm^6SEYo4vniQv;zGUhcz* zRO)tjp;?NX*?rKLuka0+hJD8VO9$rU&X3-)E-BHzzDxwX4#4cQd?=(jztUcC0Thtm z1(-L*l-bf3WIOC4nlHik6Yw_1Jxw^&Le&sMiJf?Pd5|__@6FSn&$vK;D$Cwh@hn)n z8DU?EXGKW+2fg$6r7C2-X6t?|is&>fKUx*8lw8$;B6qqV8S6%0Ds6_^Jj)cg^=Ei| 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≷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

-^NuI-^`6nMdMDX^Hi|)xyYAnR=`)fxiyJC{ZK+ zgvxmPcl4gWyHho7GbcN`)+d_?z&&@tC>!~uGc6$-#w|-W!){%@DKE&}6M?ce z0R`>y%>&0M>M&=GMpp0u=y{Xh6CXF~NYWC{1du1|ZfEpX3ChuC8da+0=tHh)5VMq! zU`JLL9m=#?xU=$dgdTa&6W*ff7&!A^D{PKelLb^>@wCEdEJDv=Vy%P z6qN)Fyo(g&^Rup7W~Zo>anDQVP&yKs6QWute-o%R ztePsuiupVrk)2*Yl=CU3$GYv!G&ocoVg;P{r@CozABl}mVZ5JY7v6$se2fOQ^P-BH+O{FX{ z7cCq~&kjKb_O@^^|E@nH$FnztW6CuT*W%NCJNC*vSM-9oI93b1-p-}~Nu0Y$>j^{( zLGiCkrS0#eGKTMJJgn#qzU|NyVb*Dq>_IQ~pVFlda}8Oq^0dZcF~;l&Ta!kZCMAL2 zehB#2sELQbnYq%KME*qi<%laFsd~%{=yEo8Dy~)S?9^}x-avSo<#PY#&e#BO^T(@= zu{YLct6i7;Umi{oIT!=I$iw^5>M_x6vsQjqCl+PmmZS2Avc>Uo`i|-IC2n=Yp9teg zdhKGRsdN2%ho}7cNr5AB0UcwaqkSA!qWN?LxfR69%0A>dp}ck~`*%M7`SdvmMB%JC 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

&@^Js@t0U5^M!K2#>OfRu0<kFTf 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%0D(xEB-)En# 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%0AXe&lk9w4F@;I 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

-4g@AU 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

_q`Z-vr0*1xBW?dCSv_ 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

b$t#@oI80v$!tLpa{ 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 z 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
KOwH5%c1XlwZBde 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%0A~-hz);ySdQ2zEs-l-l`r-cZd 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�A;!h40?Z_zek(+r6|myOa0@nU0<~5S~|_ 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�avE)OW)B=1_%z&X;Dm7q(s%oWY6cG4q>5>W73u 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

HeYC`~|M1 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®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 z%0D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

Oh;vua>uCIlg?7B@J`wn$NG8D(y5^-ja9!!M% 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�HA0Z8@T7zmmD?N^g+1 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]iHr7OZAN6$33P^?ywpRvfF>MN!)WZgG@6e{G{N7$e#Q zMjPpnSJ{vDR{js2otPzkQu^{kO7F(tlWg_j0sWbHS3zkRY%yBVk)e28wK$GmlIWVJ zsu<1N^#618wpQfg*0K8xEh^@`MDw(0lU0N}qJC|Ok`!{7^d#(|=^`xidT9n7FnxnC zOO(}`^=Fr5J2u1OS{KTGlmOm zMe|*s`J$k0pl*rCkqC>{b@eO4OeZ{t9|LMNE< zXJSOf&y5vV>W#)(J1P>EM{6?vDHF>+2C<3Mx8?$QDZ!)WsuEv%kv_`)lhEex_7Bbq z?{TXxdyznskb?Hknc?Z0nSPim4g^Mg@j+I?lhX}(_BkjOio6-RAG`t3sxdY zXDG$D9KXhD`Z#ul)=G-zPJb@vk;$DXIxDOged+=6+K(Z$SS=`M_ggDz>d(@3FSfNwD7h?=<(Co5un5n@YR5`?LP|vF-rQRa83r6CL7jX-U`{(uu8&`q} zPCN6qgA{*}-5@SNI2(@V3Qfhssd+T+>Mh?)Wq44 z6sBahrp(kL?HDL;n8%AJF3)R#rD`D~v=fMCk}n-EDH-R@BLNR*+@<^AlJnkWAJshc zFWc<%lEtaC;M*;hcx8n&#UW;6K%}PRV^XdjX6ls^*-K_>#&nH`T$0h)EBu!s|{G*AHM+x>CbTU3{l)u>EuR;6#sUWyf zZ}du-aodLEF#QnzW)2oz}oll_s@NZnKR@ilFPnl~jXZ8<>!hBL?b@ z)%oAEdiD4B^8+eM1NIuez9}@r*T#cI>bRXz4U*$j7yr4%<)l^d5`k?833UN-|LpZNYfG0we$IZAGi|<><@`b)-rDETC!=?Vx(cI$s1h-w^WV0H zT>*To@<;#lA)lAkl5+2eaQxl6Ja>z-EySS#)nWAW0bz$AJk%=YLPZNR3*jn^xqzjP zr3_&29yR?5+Y%YiVzi0=wSATPTB>2(-V|Z>7@w#fOj&6M6>1<^T&I>q6Yk1Q@;|&L zH#*txiXPeQouCdfC+`xvkPf){>3H+SwJ6Ir$;<+m69L*a0@D%D5L=DD@8lb+sIVM` zNwXhpgKZC93tPqijeMo%^FLp-5`a>{0|q)+vSLNFy#~@V>}E zAn*OG*kCDsogW}c_{8aM2_pN>5F8OR66Bh+p?#GG11*$XYF7TKXXSt%<<{(yVW5%g zdRcU;SmooU^JCvKV;Ou5ai*0s+?gI-o;Y4#=8rK^(t7!aog~>*8ca&u&jd*3z0K}n-k&VrIl0U<_)f74!e>!j$8mSCPwsvrHcex<=uQ(%AO zxfo`{X&&wHkP6;5n zqd-0&>7Rmsj}-U$WU-@qQKM3hdO*Hl*_gP<7U$(&lF_r! zaBLnc$^|#hZJ%d12~|H!+;D*Qm+EACYd=C9jlJ5LubK#SRRF!yNt&#gUWaysT}i{p z(m;WPpnNvy*T!KKYg)!vS33H0>2PtmdP`i7iNl=+wCA98M@pb$8CErtFrn+W`G>B0 zjGt41yz9!{(gr7OzJ*|w?aX_Bso;>Y%T)p77`nME*WDV2C&y#H0qw1L@*kv^67o-K zcsO@9xmyue?#dtzqzcOyPmVZax7lXeoBJHoNPHe@B%vxZ>?bJx=W^?O`MD-n3ML`1 zP!pTPFv`f1IjVVJz(nKKuy)@d@ZFb{APsj9>4^VY4I!s`#Y#otmmyYDlVNm5oOM>; z)IkktH%o|nsNWFC$nH7B?#D=$O!oQzzRWdz9m745Tzf`r)BRE}N-WMMheRiqJn>d~ zpD5}iI+%L?pw%D#u0Q?AUJwPPk>h=|2qPxPVSD%wWBUL7w3;OR)u8L>H70~vZoI*q zK|p@iZ8<$RO5Z{COolH3n-t!qHR=y)6sVqqryzfZpMiB8e6#TXLM2|^1+4wIo;fmJ zj>#?-D{b{TS6Mh;$`!?t}Z+PY#7sp6Bb;gG$aKAYziJ}YgbMT&z zA0-?qSBu&@bVg46t{ytjr!l7iaZ-ta?K9{jUi9mL^0(o`m`J&>I?H+XJ{C~GnONItGr(1+2TiSwa+_myp@% z{pk4GoQyd(6Yk$%`YgAE;o`O&%R&TeSGEy{;Pe~k{>En^EMi5^4#aYdtT+X)Wb$FU9~_bsK>X)XI}V??q6Yd z0@3o7vvmR-)oAtvt~n`weBR7Z8^7#^2Z6PS0Sahh z%~5So!MS~6$}xwCAAsWqH^4JbHN(at>Pb#YB26sy(x>}C#e zIx0sI#q}f^LjMG`>yLN>EH_rzozR132*janw~}a>30wo1y-?zOVy+up!49n{npIuW zJ=$?iBjzbKVcHZ~BZ{BcmyMNZjExz44e*qG6OM!2q=NVv--uzqM?!x>LxhdqsDSP4 z0@Ln4S-nAehcpsi)2}oH!EVC06QsffCCD?BkaZ*XBl({)IxKUksw&A1SRzQvJxrzy zuF~k%f!Bf%A?dPw< zVV}J2Vo(!J^>gbbxkdZi?G~==F-iM+PoEUP3WZ<>)zteu6vfaqmpRAeqr8^j@fO-^ z>+57!H4q(=J;x+6i;hnPymxD#3rutPilL|J z>!0LxPT-^uJfq9e9n~e}U-`@eS2uVjmqG&+f+PuQV9+Obp?9P4e64P^#AINHOHK*Q zJ}+WIXb8EneR6_fdW;(NHLT3DeuW)vx`Q#uJY*h@=GI zeXq|Z{CUD1O$&RBq33Dhimc)J=DiH^2&AIubWY=n4-q;k(hjWMYrhvg*p!{wI$dws z;=qPnwEiAD9ZJYDAE-?X6l!Nu&^rA>Q>%hpc=9cTA=5cZj-JA)_;GrmuaJ7N`^%5a zWCyD0(Xl8cFh?|{nS$X0b$9Q+ln?wzzn-Q?{Nr~f7diJqba1Evurf75P|ygGIV*26 zL)G|l)G(AI!1J&NBO$QEX8b+q7q(T-xfN)1B5NGrtCA=_mQXY%FdgR=l7z$3jme22 zx;=6qlycDT{I2Tu$A$M^d>BS5E!PE!ly*>`K@o z_8mUhyS3FvJmcR}>;jA6F~RiP%7ZI5IATuS5q$d3gt8BzDt8o4o#-AvB!NTY0~30@ zb0kNv;nWpi5BU(;M|6o(;PR5OjBcM?-bhnI;+U2<#Y?Y7^tR z93I**UMc$%D;z`f<}6V01cp#B?Dp7r7w~V(qJD2)`nM^6GtL7K>UhaRvp1`)^9njaUayopZRb(!l~AmWV34cfq! zj;)PF72xNftcn4l|9kVqx;}({^nYNN{+Sh??36*JCk9L2Y*aS#@0?T7NvJSSlyz@O z2E`$jyl)OEjPEr%%cM8|(j_%)sy#5ZhowIJdt#{COgfH{A8w4vbNGXfa#hsA-yyya zLzXxYIOte~xxU^**$od>n&vk&A8ri)?r|DhtLgHkRLx@i8g65XTy+rit!OvA1N_p} zO5g38hG}uI<*DWj`W_`q+0AD-VL`BDK$JB?`Fvj&_tU$Mb-I263^)~-saWL^<iwm?H@a#796AfVtw*Sjs#K)^ z`qZmG3{lrFZmOmKlU*XZa~Y{=mhnAa5&(IZBG$X16Z$OpwQC6_RT9iED#`Hht!&Sc zhCyqk9Z-^v-KQ7)CVF?mBkLHZX*kuG6)Y@mhz4TMBouf0y7#EPozj^>TC19=S`w1v zk2uGu19!jbj_B%EqLB5fBXCDee(Bh;^o~=Fr34A7B=e-Fk}YZiXZ0 zmsv^=tG4)7I=VcOR)czuZ37CC5{qkbJ-i|>2Mdo!KOUn0lDleRzXho=mktyi_vG1U zey53@Gr|#LY4^m}ihYCW|0QIO$&ChHXpRZ>(p-B&zmTHf`a8ad~to4$Pp?#^Lz+FM$VlRHa>p3Jtr9A?>f ze@n^ETyD!SBfI&%j!PC+HTInGbXU;-%|jS3Y{qV`LbgBePFcQF>mnKd-&7TAhbFQ> z53Si7ZoT9@{!RYLF0)5>+Kyyy(f%{)b1mM^MA@^q|D{UJ2}@BOHxjk*$VAUL%_aKI zwPFQXdvmg!=y`=&5e$xEq8Vfp%-c=MY}>UGCo9bxAQ(0;Anxe-r0I9TfsR2>Sokx znx{QP_IX+@V6D)-RzL+N=1RH;E2JHQom@Z9PKIjJGV#y!9^TH$E5?OXFD{~kpa4meELd-Ry#~;7 z_vr>oCa>f;lxGfHrmE)vO!oYKG={xW-!Hs3a_lK(Ru+E>p1g%hUWXHTDO(8^6F!d| zuKIC4XikB-@tDgVdiMIFn#e8fW)l)p?E&$XAF>(R_P#Cjc+c(nZ1-TgzjbPF1D)h) zNW?^6<%k=L`+px@TWeM_^ukE9n#sW-kiluWA@wTafT*WvP_DVwYM3{6H z_pf70K36VVJqmXyC8^v~eP2oh<=YxiMVrbqxqzqV5Z5#aP2L@o@6To5%U!&|cZx=Mor)Lpx z*<~cXrBK_8(aP_GBuaql<#K)hx@}7j!Lqtl=c-PvPpX%uV2$wRRR4h@owUfjdRb37 z$8r)Tw<2@gusD*zv@~l`k}^>}f?H2whgaiyvxXlMNwj5gv4QiUx&Ctp)x-UmqoWo=8D* znMyhZXxxom*6HQD7s#mE`gI4jPOlrJB%AO*0VCe|06X}1+2!IyuU(QG#?=L(W02~f zVZrpF>M}--2ffaJQJwPliH99#A0*r0^ECf~>^loKWI6f7z>Y7$S+bRQ$eZ2UpemU1 zhvw<}-07N>TAS#;SG1Q9vnfRR#5PmX0!vf~Y!A22VWzWYYv2Oszzwvi|s@oH*`K4*6>qkhHpQK?FheDH&? zd~{L{M))YnD4;DVt}C~-bW=ht6y5YR9Oe^l=@B2RB`E(gZ-$ZCTXfw495ZUr|%VJ|Y%^Z+_J`*7u zcq{pHEmG<(Wi!#gPKreI@pH0iFxHUHLru*+#@#7ZWg*=+$>NU~EdD)K{!>KEfs#lC zq+NB2%o5CamtoI3WrFUJ!8XDg9>@mf@T_)>uJ|QUEAo9OxVYU&VPVXC=!8K7AlSM5 za8J9GrIDwB!$|=52XHmd1tp0weB9N{F(A%w>h31fmlWcEGA?x{8%=42+W9@SOdnz> zGR~Nti*8@^?RHby+xSr>$x=3b+M8yBi?cVemi#x145PxK#a90OCj62D|Tz&L0 ztlpVx&5be3+6sGSguKZNDuuaJo+z0`Q7H!RY){I(A!$xF6O40zkha;o2Ixnj3w!$- zp8Sz#R=T)OI<6!_M^ZLoW^0NRX=T6+3xwmS8qVbFx?BL&WYho@QI_C?MuazO83#TR z2eMpSqFl4rx4rXWGNyD_ST*|vr2QPo)G|oPv(Xx_h0W!l6DJzavW)dGeQ->p++r={ zlaK6b0kobFNmhuPcM(j-s_O0}dP`qcUG-qKBkBbh%#r!@LC3mmU44X&z4qYiC#PiN zXe5gCbGBtw82u4e!$T%(ylZYNfhGe0tF!!K?w*Jux*Oo&6c_1s)}U=(;O?q-6v)zB2)K=QkP$TCj?#s+v{t`0i*CJ%T{~uFl|sjA_C7mr7F_D!|ww2 z#0M6f(%Wc%q62@y`VG&qX-m}P-p~D~J;-G36I4@0S;^`{5>wdkU;bh`c&>nbpB}bv zYW&te+^%>tzQduPuccRf@fmzROYB1m)qwFnPlrl&N|ud8hOFEg9dtLh@W;T;id6hQ zT%!vKG9C){F{;-#j#wptjO0^Ue$a2IXPaq!rwP{!_-!v4O=}C8^pj zb;}wjSPrabw!+f!qCWivZEefNR;s=VYUIyRiatfn>E^t53v)?*#ERUS2-Myjfy8NC zTVQucQbm4zgz;O(-6>)zc#)q_MW!g{97o#OZkZ>@s-VTR_j7fqVJdXM$MOsZHK->vRlxr&IQgi!;#O> zaXD@GYWXK)g9l%=#jyR%LSQ-GzZcz*8Lex`!I;XY{x>o={H3;vJ z?#{JN8CObM^?%{1e4og5g_|J^tu3^tpWxJwyZAY-V=`meu!-fSzF=qBne`Z0wn1sP za`ax=53_B&g6&~I4GgrS{KV+EUAsv&A32;XKayU%{jyKlwd_B~e>Uj*|lUqMW5{p(+aAy_Mo+j{HGLf=C({)rE)46H6%T$tbC-tCwAm6n^rrnp-i{#o#=!{YWUDP^MMSWMMudC#!}BJsM(sVdQNpA|-%sTVdo92hA~ zF&`frI<*G~THo6$;sMj|JmIjzJnB@Ni0~v*U1me#D=gfgW&c{Ds&&QwtACykPu~7S z`p6!0R3-R_Wx6Y!=|eXAYO$RgiPo@z+9T-JL$Pq%(ti7tNvml;WXhk*cS;dzX7!VR=cD0NPTeD-(`%jZ^QeE94ozX5 zohpBdtF#ZI6^;Na&ISDdVarW6-7i~w-|H1G{0(&>vFCjGhYWQ zOEUoXPg0m_5A4Uzwbb4}eacSsAyy>c|8%kw@(QABHI zTv>h-*uPYd0fjW<*y5aeONwJu`p(Sfi7YrgT5qB}Y|ffsuUf(X)-mIBQ39&e&?Dtu zc~*zKy|oh+=&Xr@Zt5!;!8)zXyGpvci5$bwFu%Tp9v$98C#NF&l&?@n@`--lzi20| zfSybDv}1SqYnn%LpuK5ycGRoV%x}o3*k0FVhd55g8Jph8KLjVMV|l*kPkT1xJq`$E z-a{kVvTLX;fw#U(htc<~7CGcSblj>cqyXBNKEot;K_z zyPMI(CTks#3QHncG={AM?P4GCOU4wu6on2`mzloeL}G5KCWypXM++p9$)T_^2h9lQ zC}ql2U@tlRh*@uE?XKx6LE^MD2)m>JVT~y%n|``A3BS%iu`h(oF9mwnQndqhe>qIb zj^Q9L3tJneT=J7eoXP5yVLvkD3Qxm5noQ8QavO^qIdv1&Co|Ce{4?=+WuL}+;OzJ! z)mIP-O@fmx?!s)tKD?L^{oN>Xby8-OPbh5sp-!a_H9_?7SFh&5|D8z;_q5MFh!;g3 z&N3PmcyH;d@qLDn%AA)A-fwzxn9_*3J&m*~`iG$-&+U%ilkWuDsXBmYO6ijnW8^1e z`%j{kdf~Z)X(7ifMyt%Cn*>T7u=WxIomW1#pe7OUphP)7)lGaBYeRY-RT9_4e#5pW z1`UBFq7jH7+^e91nS<(??mmdiz9UW*4yP!6#tcrxmmOdegIX@yXy%vs^|9dn}L8G81+?d5mi{~>1p4j)f8TwF#mYalmN zTbw|6>!1D3)xDO)B))!liC1ZU8a7cb#?6Zo@hjk+aJnGZ9=t6vAJ}&m17lJnHaUzt zIi^QX@;fl1Nk@t!NI&tOd1fE^&|iU%z(XIaZT#ZT`vY^r$uyIyVuX*N2YA}wfMbnK4C;bq0oN|z~l}yU= z_CD<<3;(Bgr5WCb_yP?{DL)8#RGQl=OzQbsl-(db~3W?$;LFH@W{@8Up z9|!u)m;I+(wlwZpvKnPiY3t9no^zPP8uRALZ$j<@&Q;1j84*uCDTe;i?o>B*e9dcADfi@>X0`q2H!eBirK=?VlmcIr^ajcqUe6uS z916EKlC)xhbt&8thZC-skc#mUoS4M0>gM~Xk>9z{btNYFInmtGqUM`@+(^;sXc`6{gUq zQCz8Xx4f9sf}*3j7cuU(9gUI_gm`T|?Qoql;Jgb!e_?0$#{%8ol*7DQ%~_G&w*s%YdLqRd<2^~b zqurQ|m(*N^);;ODsIke1Xs1}Ho7O~bsSF|D1s+1n>QIBvOMjpYF1G@6CW0;~406qi z$aY$9GCz+wghF@&u2b<6aFixIA~SLXMc%J_^p&i92&vLb-+c2nlngX1jY!#Zdr%N~ zBskd`*d@@{q{V{TS)-LP&->0^X#7?Klde3F)$?gnc)u0gg*d{|ljjpgo;k%;Ff=6Z zE*VfI5GQs9rRDP!@2s4wVHqqpfOIUJrgQLBAlWSepgB^<(}s_dfQd>y`n9y3LKmn>kDJLic2S|yMuej^u{(wPkJDEvxDO+PnaGlAnKgRX5c^T^o}IZHB`gf8tQk;8 zGZnp4^!}+D2`bSM87KD(jNFG@JPujycG=2tNy9`{{RdC&gR}xo8L|}=J>qGJc6B|g zXD*h4>?46jJ!0ni>JaIOo^oen_bquI@-Ragkc85@jV#Oy`lo#GiYc;6&;cil#aB;7 z?d!`x4Q_}Fu|>aJtxDeYU5K)bxPbZ);&_%Y*c=k$H3p8?j7Q2@?H8#$MbV9ur(&-b z$?vJ-070uOhl62ctn09ZpJpUn#|Aum7Vny-eRnmSqit_utdygr5{hvtzr4fcq3ed_ zMzmW}CLVtj`#-&m6jFBSb^Hd;Nftz3fzGQ*kSOxrU^HHp_T`;e`YE@A!b*Ji^b6wy zUW(3KpWD*4i1x>XWdDM0G$)3&oP%1#WX^ods!@bp)~)A7tTxA_VQXW%cPNA-`u`Ky zECPsB(D>(Q4kr$veL#C0=78R8$iwwj07U)JSw(Bzq^p@?7hjaOliM-l*5Q*G51Z_X029G+52ciAn6U! zaM0v_bDcomL=9~7XJ2`w+QSk^)430IrQCYY-`G2}dW4ed5qHcBLrH4uMe3q?GmR z{roj>q5KTYFd_aLo#;p#Gfw`o39A!32FrO1Qz81MqPc9z=z{hY?SxS_b5(-u8{-^o z#J4ADA!skcTb0}iNsj{mRC)?YL3KH3Z+yTVI8}3dN(h49F=iz^ZNTaIUa`VE?#zoI z9?jm6rz?H^FDbHqq`Jh7)iJO8K}pZvj5T^>J(4@l_vUkR{BzI8&QInq!rpd7n{=7E zEIRrt9%_^TsoG1wtkP?4Pmi8L^-AQHNCfXfJ7hRTsaqxKJKnMik&_8A7(U0TS?&xW z;B(WG_x@%5Q%w5sggx6s)Z3UJy5igw@rr8VvzLeLhj+`2jIT<$WB)E zUjmbN7eYR(@JOvBVs& zbqR*9pOmLsrg9F%+`lSHrMxHy2?bd-5}L}t=a?YZGjS3crA+l1@&;t>twHd8f&1eR ztM<*&W(j6}v>Su}4_D{@&jkDb@g12tZ8PUX+YED_W6sSOn^Pl%RC5eTh*GJ08-_W} z%rR*w$Pa6PWa>v~_W_w(79o4IcEEf_RrUQX2ogtY8jqKP$s8nD#18~p5DoKUV7T9k@BG>H~0uOkky!wPpBF^ zM?O}sBIfe6%Pn4|CYzm)!J7PAHwRcB$g(9ROdwK6YGx0dUvW^&9f(rbJ2o897}W-G zH|6|J%@#2h{YDN#N_hROx{}=UPj(q0FX4HVi#kS6loRlBt{$~@eW94^QU{2E3-KiW z=?O7O2RdD;r^BmD1&Y${a2>xkKr@WmxDA{vmW;GRz(e0%zsA>;GUgZ*dV&m`kw3o2 z#D54@z)f+h&MWA?Qe*zRNnk~YWuP-v{`3_(E~P6a>-ndg*>p;~n^1$kfbAe+@5HSU zdRK;uAJG)={!{Ad2yaUBEP%Cxu~}S;lN>FQm2(TKbqyOt z_B<5SX(7padKi@*9VS>b&T*o2|Z=lIN3s-YB=$=g^br3w~Q;=9Nc583=(Si;*aMBrJUw|y;8sc z>e6p@;7OYB8tVdY4?Wwn(tGO*YdA`h|3;xhqN*?BNP5d~9mK!`7{bC+_gh_IdRwJG zsdPM!iP}Oe>ylk1pjBHa@kCewL-DUw@Cy=4Ee>4*yYepYZ6D1c8y}6UT z+qb$mEmt*2jNm`6^?`Y^G?0sR?scv7Ca2>Z2{_T|xW?&E6Ft_%wSNkdoJ0-Fvq zWVosa(J{pZ{oTc}pWmvc80B&l{PX>YEB(j75&N4T%q^|$8}|L{s>FrjG@uUm&kvf@ zcWAjaDUu^p4TysmdpJj>!d;@3RdG7$gXBe{=XM3nb{gJ8??P*BlkMI-3-{Sb)eUi_eGaqJJ_)r|zDTnRc_V1=VS-$dr-~NC zRb5`x>r8FOh@2G_I)QAlt?>dr>e2zNRKM}V;?aMb2ldn#IVq&bEoA$?6!XX0H|NIxc$@Ad zBd64vp+}U#%1Bt;ksm^ znT9ZJEk+`Bj-q{EZc5EL4#S%Fot;$swM7!z>mFEWB!s!RxgKv~E3N*wR@jwQoC3T- z_6{3x*Z#1zt6++-kXN!^ry<@dXp6u7(;ZYp8ycYM{8t8paD-yiN`uH8-Re7yzHT z&ShhCV|hqH;uAhpl1ZA;6PS*utAaFUVr~QQnvnQkb6Da#7nqyuq4b5(k6^=GNuggK z1-W;FJ3;)?Q^@|>7MR*uOeeLk$M01K4C4C+X9Hvx#VjhFZ-K{pTWY1veG3b(( z5Xf6AZ<%Y(%9`u}3+=;uPq?LiEKHwYq7=|@GhIzqFYv*I2+!9Q`}4o;vZq}p+*Bkg zhIY@HO30((xZP1vr1T>nt&)CZn=p991+A9qvrUBAv*eWFH!>oJ%K?@(NsH5@On~A; z*oCD-VlUuEtCsXy%furjevYq{e&DjKzAZmU*I+A78L!rsn=}>fcD2%6wcfAY)tTO! z@D@(i)D1~=wp*S|P0G4ss#acebCW`=j_%;jRdT3NJ*5>oG#`g;9ewgcy^xFjNm?J%i7NuZV`?pfMsSOhw zUwhNfC-Q3%t0hw(UAfv>w3W7UJFTo0mgMNh8##fvckYbLr=^v45|TJTHEvjTcx*y<9n=yU3xO!}w#Mv1ym!&Q3a74-5SP4c z2Dg@9UyodOnb8-9OWaIICcB}>PB96=AJF+qnp71co>lTIAp4*|D6c+W2KqV<$=t7S zxDVu8P^DP>6{lg{N1ucyku9B96bqhfa~_f~HQ~;S*W_Z{9+3LMRlp*qNdAK&M7~PD zIEfK^+e-;#h?bqFb-Hryn^5@mWP*f-R78Kia_CNzgkijiroOIn z+MU*7b9F{~eRj=WQ5swMOKO+O@THl-(EOrOVvY%)jNqfnH*y^E|9>9RUzn-s_JOhG zj*s^RCiP8PyKs~i+ulPewVnBJSZ~0iVUFHIU#j)t+O*+(FgMb5$OjBAJ;K+|wwi(KfvRNsE&49@N1cDn?Fo z)$X0Uai@54Zau4mn6m2$-d!r~B5F4yc-y11lp=w@UBy{?9W4C<)qh|z-cgct$M=)j z%M-%;mw)~-HOf8E$UKYlyABFpylbE#BJ0ZcBH>n|E69=fEkI6OyBeDL_-$aL(L!xZg zqLJ;z8q?a+X7i6;uOHo(5*FoQ{9w&&*8#k%t`14Y6P0z<5B@8zqFP{mbo{%5oAB}wd)5>E&mP;fSb4t z-L5Jv-*Kk`lF61Pciu)*VdBig< z$?~+r2sUjp-r37u9D26<=L}X^QKn@l)#hzA0(Rjl8#(XycwQ8(_+i&=&BO)j5#cP# zuGb%zI(}<00`x2mtuCRZfmnLK1-+Tr=xJ>MC&Z8Ebq82$dnl@$1(P5wf72D4+j?H-#f11>(#k) zeVpb@`w{Jt>77<>%IsKF$}AYybPQdn0Cr92s}-k|PoJl8$UtkE`)+iDqG%_u%Vx6#wSVPBy;3ti zwONZ<37|H4Pp3btL;r?Ax|NIYp-xae^`=Li4$%3^bxBQg9w}IW@$#MIR&lzm8zPr5k?*HS6+(_bA_c7oLYxJf>@ zQE(tMV$#06@Z&R(;mNpYryV9*4Jd|Quzl$i*eqLitgIasfsjl+%T=lfO{)?Hytji@ zMBI9kb6{PKZ{YlIpOwnPVS6E?W(Gys`LIh4z3$l{R}G7Z4=V`%n~7~vJ_Cazvd$^a zDwjX&lXZ2<$RebIsEVWF|0ETM+UU8;MXE!>C+Rf z!(dV zYw9Na+&y17M5%1bYmT+25n@o+}LD{0-l; z+QKv8m~jIReRXutGACSl04R>T+LsxrEp@Ts!@NlQw}To1A1#x4`E|E|);+~RGBu_q zZZx`&;*!zV?di8^AW())Dy!}pDG$ZR{rq0ohpl-nBEFkW(<^gol_F_@%~dyLfyTs+!Dcu)@r!oDA|@9< zY@!Bt!1=LCZs(!bFRdeixnwzD*lHI32^!!#h$W35WAfQxYFT?<&^d3CKDaUIZD#_ zIxkH^z{w{b+ohPaeTdfXkhw^%`!!UHi*K)4)V`WX3z7-myUmT8R7pB^k+eG01M#-m zrDsZqO3Fnqq_dVhXUsH^#NbE$Q7_xh|HD-KvCCDb6=JIbXth(GR++?-02`O=+OBZr zF+XN~45ov96xc1Z0tH{(b>OS7Kot?va4 zF6z=_pJRhkL=~+`_OPbr`V1#UYiBow73ZucqS(5*^+i)>$DY&AO--8aZfIm;w&VLM zhF5`ogu8=SlkY4|ouI_sDB_YkMORb4#!6yf%oiLohv&}VBVVIP|342^jz$M;ZTLy= zl`Aj-@8PacEk8?^06QL@rp;^18gCqZx?iC9JL)5OWch|N%71PE$t{yndE~`L`hQF# zg7u25UVbr7le8VLo4n}luIWhjHu6^$8=JC=Rh95F_v6lwV?WbL7oyTCTY?V4$K06P zv&dk!(dv=g+Yqu<(*(ZIcl0o`*xP*h$7(%OS^e2J0AQPx%@6$NL&PW{zaS0vci%#_ z_$aVX@}mud8^840&gxs}s;$ZAG$So>@YcX&eeJb?)f##b38j=}{q#AZ2$m6`U8H1; z%QhM?K@Al66IzVlfdxeq$_@N{-sqFA?PB=F2DpLU$eWjZju$ zwh&HB8xaOWukO*PKD`+Am)S!8a$;c}&DB12k~Uoq_8^_w@Q1W=UK_?y^|VHrWwlb_l5sv*@&=#(HK|LCBs}v21qc;6m`ldUjot>n?8L!pO-( zHi=pv1xe3L$lV4fyM@fVKprh5ZAKtGG%|>f4s=sv?-0VQkR;!raLxd@0&~>a$eSt2 zyN;W_a1(Q=)yG@L(Sa+ZQI80;ILlljw7`SZg$a5x7xItjZ_-Pjo4k z01V?47_z%U4;z#`bWchhQtkgYujwzcKmGgNC8|_nfrf%)REIkb`agv+Q?Vh)aH4+j z&X=8fFW|{aZJ0HWgEKYlAe=|;L>`6P{*NEsi^#9M?=_3!tvoZBw)9f3nQ4y-DVO3RUvINe5cmU^w5d>`hR(AMgg zevr)vUIE9rc7nk@(tNfEv;Pdd9+~bKnPK%;@}$R+GGi^rgO9ArF1oHx=+k~o&g_bA zyiu{bkc-uIZC;W){(?WWR(%@MVWeO8ORu!Qx<{I686EKKdR?!f;}7d>PE>XY8~3tj zx1<0`NsgFk2>~r@*e9kl)z4@{S1_>8Z`#}WBd-)K?u6QJqGV9O&_n1hWW>OzBL1|> zoAG#pk~T+k;;lZ0T%!ly$2#u>@S;%;-1(5_B;P>iLX{b#H}FsDq)~}3O4cIe+;ua+ zO~d9sh96&h;utWjRtKDypnhOYbC`1&K&vGEs;>1A@1R^HC@@8`1N+0|+UpDbwq>pd z%un}q!*C+a;El2wlv(tvCbE>QQq-PI3cmY5UfZ{x8+vIt5aMii9fZko8 z3|JfkJw3R67ey&kX?wEsK^t7wc}l~?8(wrnMcnAUC3@wH`#!!F*x}AavlSZpV2o(+ zJLiU)!GT}P-g1Z$jFIgddMdNNU_$HcsV6;pI3R_&f1+#?rno5w&93&ZmUw;xC2;_h zzoRL5tJZbkTisH7*Q)56`I31>MZ#L`0nUYKL~TN$w_LRJRjK$(D^^#nEsez@g>(gq&jE_qPnWYxII)-S&fo{L<$9T;{D z*8f=Tw`DK12;_bhm-#jh&Jj zw!~EIegu1!7_(+tJ;oJkIDe98hcq z^{@;mJ=R!Jf3@MQ%V z*i%JLj*hja{hS91wVUn+HxpOopoSzx6idPPtO}zJ{$9AF_;&Gzb2#60JvHA9XvI zy}Y`&dkC|VsDX)^G>1HkFMFbIS_>qOf#lv;iBUoApmF7O#@tUb-{o&+OmC{UwXNEZGcg5sw2HVjm)Fcf{o|hLP7}SCyz2CnAIEIfT!*_@Ke_}Sd#RY8B zs+dsen%vB5$IM%x?sKG~%t?e}7tOCOP31c>#pJ{jV1CJPdhfX{d2`^dZ~oSv1-%tP zu$cHz+CEs|B67Ch@|NP>M{g6Hw=%*fTumgHQ2kN+HPg#T^4*hPiDhDSW}y`+=}D}&b*Kp81rN-f z=;g+wn|6x>^7Q}>LMzM}(guedIC)5vR6Wx#us&(@Asf!{(yBP{|MO7hw0sLj1~RVc zy^YxXa*|#I3j@WI6^8rDoSq4lIumHv+QWas>4Ez-C3`&;|F_kY@Nvod$lT;n=P`p- zGo92prtn*2ooZ+wIaqSwQ919-x(`?78{TsyUOBGMW;S=OVSiI>fLs4by4}T1?T5;K zeNMTC9vibxq2VM_+90Y}lHLa+364Lfq+UO$Dz?{ySm3(C!C3Q|W3O3r%@Y-f1KO32 zQ}C(VheAJGvcd3qUEDXpO_Y>-wj>kLQ6zrrilRDl56LnMPI~~i zG@1@OA5o&1K^->`+^(*YHwx$`HduwF9vrcDKj=~-BipT4tO z{@yv$kt2$46y6Y=BATcS!C5q&3`^Y$9_ zti)&CBH!r(Ip2U^*<~-LvPKb5@x*Wp9`;Bs#O}MK68o(i<)IkR)^r0sB&pUFuxoxx zawuC_%>hYeXnm=yRkvO zH?UU60y}xNs}m?Fcz`d_fonRP6?YLQGnLRhVt(ozO5pA6SeEMq`JZQtWn>U6;^e08 zKw3JMlfLKcS}B4=SQO9{;s&?Va;f{=YO0dndz9i6?xIr$!HXWZRiYN4@gq7ud}`~P z@6W!DfCtbYF7Qk?o#dtCL6Uctx<_0`Ip(c|v5`i=fE()N)a_Ck>L5$%nq3Yfxu>gtX5+2m5M zgj$E!4V)M&=3L^IH1&wwc~zP%N%Aqb+ug7tbw1?w=+aXln;<|14A>XH0x~NKzeIO zBcD|nY}9RDsmXeM^CCVT!fRW0qoVCFe8;V&7ou2YJ<5l7*PSF?CLpxY+tAv9OntpS zhz7kE7>I|*mWpyUy36FbM^jFn7Q>$C|E@SHqh0x0f`St&rsH#!h&0^UvX&rOWpzY- zecj2MU3XiO7;wscH|MZ(P@hcb%c6|e;Qe21o=j29@QI`aG(+_G|3 zT$MwYw{|;Xzs+?8e6BdoU4@<-+<6h;vq-Vm(%6U>asz=Zt&lY{q2y5@Wv}`kCl)6<@-im__+b)~&4mX+DllYB z?R}o#^WuI?p_l!sA%|1U6E|OI@B7@ax_AP*&)L5>sqxu=Pnkqn0M6M|$Q&JKJN_}8 zKs?EE)N1xpLr_nL=$rpadVt-W!V``fb+5-DTGJ7p-#rT5P=E@BxGzyA_buX-(~d{A z@(>{(MsI6Cnm&a^LHmkf2FDXB0-zx`Dd{B<^N1M61I12)!v+2jRL{2j!ypR^r4^Hh ze<+1@NCs;}!^gwFti*>D$NrsK?iA(He_Kfp7z+oban-E;e%_>O-A{wLey01e4pE2U z&gUxQgI!(nq>K+v4o*6agsX*De8z%D32C|K@t}tOZ+O?gwSG_?QtLhyIGl$-;Sk{I zVnDjJ)g%qXna@3Qs;2PABKH-g%@zPodu7 zGxl2+Stf7in@5(TEKf&){n?N{vnYWxkd7>0b3ugOMXVcnE?a&og|Ms)@bmI6;l}$C zsKI*}Jvki^d_ilveJx0gW#{q%hBBxhb~|UpUoU-v0;_o@UD|mc&4uN`79{#fniG9t zzIvbIT@o}gmzo<4auNnynnPs_#6GM<LjC4QjYRmC>^^dy41ft7FP3qRl!qN(u5h0lb|YC!v5TlTP|qG(&;JI zEQ$_vI2|{gH0bXsk*(?eCRKUANht7a7lf1$=Dq|J)4^N-C5dwHx<1OPMh?V{HUhlP zMpWoz?#qEV`McyS3xz`$3aG>FXJJgq0{7rp@;dVo9+fpgk13Ag^7C3M)ESAN26NBK zh5v@LB<9PA28#&0{sQE^e&beq$9@l71l`ZAVp%T&;m7hEF!uVvgIL znkGN1(iB!%-n-G9V8rhnc04!*UcuOFXI@IU5>U zFuY}iev|WTh1-4&`Jiu4*@`$_TWQrVMjG4%S)Q(nxoi;Pd~VyNQ5{FGE8_j2&*Liy z5Spu9^0h*ojB!kT>)Ry7*nXl2$x@J@%MoQ1({7+AF+JH=Di!~K9s-9G6IUQ08^kFx zetv7*U(Sn?TFqP%xm&0Lc0DJOXh-_tE!R`+6y6$la=$T4zN1!U<)l-P${g zh{kwRVL(&$&7+Q-H*nAx>#ZQqi2Nirszh(oAoHMUJz3I5W5vF6jQ_W#yV$x z%}`VJ(s!L)KCvqIsIc+dZ>6NgpwZ-CqN8o{!t(Kh2?X82q&_dv$##cErNJSI7B*lr zer^d&>MRU?T+IVd!l%Fov1!qudiYG%0QDzGZyAu7b;d@k-hnLc3Xjcv5C38GuoD=%EEJd5KxhS0~ zO9_oXEM#fDvN9F>jA7LdEve8X!l_OJTj)E6By?Mv>!aMUybcC8L6eH@_ z;#BF-DOnB{efM*AH&)o#CYAQC$R71-H~T}|#3B?Xd-8YI@E*VthWpbNQv;**M|FIo zu5PXH5gIxQMBlzTiW%VLS{n*1wpfs?cK2qDXhpnClBdxxnQ`-dJVUj11b+ z^cq}jtbk1=KfLc9_WpTGbQd}SVCmdvp7vkk#+SN0I?K@pGljF_yN(J{7Cm}+3=}@X zOfCOqdM0I*r1+(b>jF_gxH)KeJBuW!!`UuA6u4PzW!_nIz}Du<=D405#Hf6IfB1N1 z4mlO7T<7l9rRLGdY{%yu!633QFPTH*$`0mq9~mU(V{WU*Cji#>(0fhTxjBrryW^(B z75wh~z9#b)nQ|ZQc6_Jk<_gPw#x$8_3VK`ZP~?)B8zIWeR+IF$-;hr~Xp#q!5d!?% z9uKJ)Oci#w#d~)^#0|-V*FVABtrbS98o!2$Nd!T-?KiqRo|{LjsYIVyE|4YUGao{Z zXgBku=;a$MNdX3ha*;aG_=Qd`OY>k{u&6cZgXBj2+q)+D>@laz%2_}p?e9}A$P>4s z1`on;caQ&Q-U=0$EY?9~Mbbiw5gKig7yiI>ztsWy!S18x6Cqq4lH*?)tY5e+0aM)I z5w;XZL$7`~14;*($cHRmJ zZ`5EqpQo1+GF?(0s_eF}MB*CK8NcdR+Sm)i7);gcL%yxWW!5<^24LnpChWK*+k3ol z`D&;B?_UNNg<^EDprod6dfG9p$n+^nEmnKAHv57fpRVV!egz~GY*aV1WmxMJMi5Uo zEgY8|N>-fQP@*|$syT&EmQO7%a$PhJJl6_RnsCPhq|>47S;%aj)*Ezrf=)=dtUEH* z5%<;&!d5@G+Wj#^`h{B2b&sqow;$15FU9y)S)Fq`bd4%Cd7pM}-E|-5Tw88p{JTX5 zNFUySMqPGq7dzcxg^Z+vwbWJrt~U2BsG?l(IUB7~bI={Y`rPMR^xrry<9s}orT0F; z)3xM6*7xrgECJ?Nu0zdu|B3N>_UU-(kI=_U+=86|h?y>+4u4+cyHky6eQbC#2p64r zm#zfO*+56^@J~)aVh4!;k`hGmmgVg5Z1ww<;68J(-W}V{K9zjAEvqdi$55EXg`bq* zPQUkT@j#N2$soXjhKZl$>sN@J{&H9Maqo8Xk=Zg;6M~0mB-g+H#A4P<@K@opHr$DC zCP1fEM@-%;->MWrTR4`~^YB4GGG9xaU>lT?-SrmKdw}t0Ov%aE@$c}ff6jZ4Y)|K& zdk}1OQElzqIWHENy`lqsK#+-S)#p9Y~Ts+-9tyc<~j-Bq)3}_FB?|0sc zh&wu3Ftu#hUK4R#9i|-{p8lV#^Po~^4JPgDR?falM;P>9t0A;0@it&WC$E{?xaDzg|vOla^}N-?i?q5v%Kt6d#R06lvs zCC3rCAJUf_Jt?I(qdv?z6n> zeA~jqm#g39dFFHGw$*ndnxEtF zCIn`ich;lwoVznKMZm`+BgCi;W?A88i9BOhMd60?O+i8KyZOa|tsJC;V4j~R8lDQS ziUcy&=1M0=G`T7kfnY$++e#U^toSe`&lTH?C8?}Iys?+9tgV6%oR4$KI9fnxfY-AN zCC*A|3U*Ae^K8p+VjPKcSqxS6RNwf(!1MyDIx_%~MXe1{Lc@#kKO8e*DhSaZgsH+! zXH}DbH-c3TO?pAx!76V^>EJ8<=K0Gn!;%dZ3@L)SHnhvs5mMIw&qGGf#|DZ|K3|u z>dP)&XdJ{_u^xCd3ukM>tE10v8?Zt3g)F-&fJ6rsw5p-=x0p=GJDfB)m@C#1QX}c+ zp#Gl<^+;pOT=#K_SJ6E>5z;)dE#Vxp%_xT{w+b1u8Esa87Ex27Ef}znCzB5WSYx!E zh(1eF{U7<)L7>0nyazwDO@$0N)=M>SZ#tIN73zdUZI@mbe^7Ae{w8uy6<`9mGB45Z z^MTn(*|_8BUL=W^QWCuhu}X|n5tCAKX$8=ML2eoIiAj!yk9bN6IeULk*PoPit7}Vt zcqTSPHA08rE%10~ZY?*OCoGR-@WvHDt92jo!WtPln~FJ`fI%?R&n)rx$u!MtR~cA# zMiBqH0Oo%6jo&~AGJr+Xk@OZ8QQ$6~#~eDBUx*it9mnOAZ=OBzw#pWk(86$u>$guB zYJ*-3+g_xCsvMGQ&i(75RLJF6SH1|FCX26YY{U288dE>|+o~9ejjPZ${Fh$XnaR%E z9~|{zz-$$#t5C!+nK2cCs+FUK}2c9&AmlGVPhnxyjG)xjRxf*;*YK9$s1FvWM zdLtFYpdGwda79V$j9ioQV3NWDA*bZ6qp39k5hPKb2I$G!&y2s<)xX?sld-s4l<6$U zJc0>ydOhNWgi?LJfaSykW%5i?losb*618pKsrH1RAvEn(!n%;+ zVQ+|~L_N}}$)$pZT`jm7c%Ma&M?F>pc#$$&g~ zW7IW3P@z;oNsu?Cp>KCf332(d|@=O<`Fle?N5n)&TvPq9C zFj&Y9eX)n?V~3hNfy_Yj%bQM&h-TE`VM4rbJiPl995St`ISRYSqpjsyVcspZ02}5n z2}X=u$tUjVU)5><%M(?H$&wP|V0l#EdoI~JA_<7SMb#u{815mSIz##pLsjdFO62N`>)VmhP* zs~lp*z;*O%QtX+W*nmYR1!?%-fps=X@%`fj-4`HZ4Tc4$Te^S_Vj6-lYAJ zyt6h3GllRc$TSE1Z{e{`WcBz11D(&me{>@zcxh~v-`jAFF%lAlsX^c|Q=0A*# z5S{xdr21q}AC;qVgx4aS7+ciYXeXRCJ1P%i+D;RgU59PfxDqlH4~I}O2Hzqz@FyJq zXvsNV4>F8rOlrYbtB>kt@%*1~!B9C!7BqS8<4OaC>yxZhQSSdPA9z5;etgV{vwR~{ zv#Bw7o1J|pv$Z$&qwBVZ9BW-BP7~B81ww&6%&D$E{h25G-FACRrjE3!+QBYw*0?=# zb4ZR^>s@S|&rtZ)U2Lj_a#GnR224(fHyUhYpULkmdv3U_lFkVTUfRwJ#cKV{TqnkX;KB!&Ic=?w%F;CqUkA?iV*ryM}Gx)+8ytf``x_-L;*273X*x3vqsN@b-kLil1CVCZp(s$)wX zccu(7A4=?IfA(lXmI%9@mN6mZs8+X!wh1PTv3(NNo~vQ8T!JJ>({M`^`o#6f=(hY; z_aN0gt7r#nzKT&YIlQi-!oJ(_e8~HARyNIX+jT%sdMtrZnl0I-7EWlxBmr|r+*<3l z7;Mw|DuiK2BW(}&)Sh-a_LmdTjge;*4Z@>qo!BsJI*xB{va)EDq?VRK3wR3W*|sWO zz1JQeq$l+Rm2gBf1ipbPl%WtE+e(z;)Qbex3TaQQOXTM5cjU**$^ap67GNek-rsq0 z{G~+-7)uB`W0a9Qix1K^5Wn_X&uLm*sAyCoP2I|Te!#ksYF#5QyJVxHwdB~rtAAR4 zfenaDPehT}(#jUeKT8kR8?&=PWDGHE%pphyYvUer6IXHaME=XU!!ot$!1~rv;>?=s z=tWLUvTD*Nk1kp5lPL>y!(-~Hn&tiFzK?v$$bJtE-DncQYWcXGpOW zIh|f%VNeo~CcjxDID#S^1$T|k6vmGQu@-8?3MoN|((>)ap~Fh(9YC90xR&e#4}+M+ z+Gmt&!$%JSlz}s=|F|YBRW@4p%Ph-ZfDs2DZE76@`~3erl-!$OdXD;xXpeV~Xd4Xk zb;-Kjmykoq^rqxAj?<8e?`86G<`}u$9a+q8UAoO3kY^g*mM8!aO8S%Jp-B>oe z=9#&6zk%<-h{v0>vldAfA$PTMovfa~tWJK@gR#Y~>bZG;@yP3RtBmq+)?ORpCm!5U zuf8*q-R3K*AnN?&#+1Qb}L2MGi5N);<7x zQgrOl{8CEC317Rk02r-R>@9bv8q?E^fz7IeCxS9J}Uc$c-;WmvGT=SlVEVzU8c^EmcIj0d9<}H;L zR%3yvlL$jcQ#}lk1g94cjG6odDe`uiruOTHK(y|LmuALjP5(vh51dYN!{FF>`YJ<% z`%@}qed`@QO;*t^%BJZFC=b!Dvb}zI1FR0eB}9f+*Sfl%bZgnYH>)SO9dPlEb1X#% zc4hxmUx*Jl&X-U6N{H)J5Pz#G-msa4$Sk1U@jlT)$@X*0lFU4yVWl_N9$?1Y1DTn2 zXGGK(#dpwqXFcCa;N+j>2~Pm?tj-I!TWq_u$6Kvn@9yK~bQpq*Eu8d2Crrv)70#&) zA3+p`;ER9Mp#xzgUN7L?g;9*|sl(>F_;M|Q6E=T5E{rGLvYg;57iqMZdr^EU)RJ}Y z&sY%QlT^ipt%n;V6i_`9U z*;gRn5Sr@cm^jy5)_nBjK`9@(6>9Q^L*X zSIycHM{_l%O@%qG3H@kI?Fj%H4CZu8%Dnt~Xc)MUxj zKBd3A0LFkhIk!iHf377kZ0*gw$_`oMBTO~@$WKDB`A>Q7Hh)<9vm9WpmcpsnHE$$E z3ub_%usc?unK>A9qiQo3jJT76Z||I3W_Gjj{#NTiPNrgi93tDq3q3L@OyE#13H%4aG=_aHe`Nz8tc zV){xy#o)E>qym(LCSH;8u7l|d0ez8-sG1)Im+2Ivw>W7A-Pn>=v2BgoC zdP67_-F$qHaK1L@C^BS=Q;*wgBD%qT2falU??KmW=8w_clhcrnE)mn`88rPqTnYTw zrFDz7DLB`MpI(?yy-$?j5WK}y7+I{N9%opK=-W^KhWbH1;6#yhpe|f897l@pGYnsz zgMHu6onW7C>wB4_b<6eI@fIVK8(34NeGE!R*Jl60Wr26|bVAuw975dq2!ZJh0{9Oo zJoHitpc>UkXGx=tW;O>8X-WWO3ni`cFjf{939Qc0IO%rVBDF-Tl(-j4(q8HPyM&t* zvo-g1(mu9r0bPdu3<-kyl%$%$63xdC$ejDk`*XZi4WYx=r5>;o^hT-oc z%k%Nfx;@Y+H?vV(fAgl^+pGmCN@&~ni#08UF8hsbQp`9eAa|(x>Ez&Vi!&{Ug)Sv( zeb^GW7$GdxWM!>X&4@PFQtkv3&x~DxClt-Tf6-rP>`~8@*MFQVn1U;}$rFk};*XeB z2_b8)4vJnX7b<5z{~uT99hUU^{&AKHt^gM*Dku(|xOX9l3GqA%)Phz;$&zDho($?Ham4@B@#ow;}qKB zI2X-|oxSz9nlmA@y)e?zFu5vQ_f7`Z06XibxCIa5Hh4 zk9uVXU^5cLWr_LWuV~`2?tQ;k(D9oD=F#9k>*p zyB+X4CfNhvtf54L^iJLG!+`Osf;BaG&NX?pNWZg9y-qrqAxl(ka*vpd5>Ol#!5#oe zaM)zZ5t}D8gTuI@}GgbrKPXz|syu8RSydF+oa&UO7_rS0;I{4K; zLhby^o*x4qf?>PBozK#4lN?id zDtGg9BiG)yf}ZwSc4P?iQ8t5IQ2;6lmzU3WR@h@;{l~jA&t5Dp)k9~f|IWx{i&e<4 z-i%J(H_2yW`BFVRC=#tw|-Yu%u`5B}c#9Q#tr^e6h?{l4bKiU@UsMIvx@ z9TdArDkIVpj(4rO-*1wPmH|g`^j|sIb{y{o0|DcZ~ol;3)^~z9@Ui$ zm|Z78zojs7pJh4rs?wpgFPd6sL2UbtCFYrMkRkO=T3h%J@DcKXp(J2o_s-!7e$e7Z zT>4reL|M&W#b-f>Zg|?mUvs@Fred6`okAfsKbW^S`cK?1PGWklNA4|TZ;`h1dcZ=j zdRS}0AZYN|hooJ>7vqUWlHy**43U3)rgWnp+X*`I*fz<@GX|Nz^G5Q>wTbz{T&kRr zHl)?!k^IK`U9Mel|CG`!PzzY3lj6KkINA=HasM~y2J5v6iSoQj%T&Mwq+X|6Ny5#7 z`-8;rs}ZNeW%AWvaSHQ_GmW(d5)BC*VSpKo%YVGv=aB0Z1Ev3d76r3svxjX*ElQl) zK22($aa?&BDl+xMkv}GG%B4$=iDz{GTD>!mQ#y3+D=G{#UUFr^fxLm1BeeUd+Uzpn zV|ty>G?BrEJ%cy+*`@lS$ar#Iaj~keX$ikz6?R$23a}GeyZcGAH9T^g>!EA^-n`gFYC}x|o0aa$M zGP9n*(8J-k*rJw0c#`D@-G;S4&)tZsf|+|&;VsKO;q8s0=feaU8g{ooG{n|vAI-ay zF4<^Yi1hHO_3lL@j;1yOC`|2zwg7-?=Ci2}Xa!YN*6?0mbUF5nP2YLZTk+yH^Ciid zsV&2R>k-=Ly)_r};X*@-aM!z;hP{^+CvG<;91C#7#{c@b{&y7Rs)U_GdAD2_<05=k zF$yt>J5iO&)foD1XVOTlmUKRQ%7hhoaV*!Uy_8<+LC3FDx=;rco*ck=7I#{06 z_Z>%{?{jXtDeY^U)!R&<$seGt-3&ckS!v)6%g?DRs0}vIi6^L^OgR|Lt}K)=t&ak!n7AK;IuaSt{-o-K6M=mNoJw0WItfxC8Rm+p= zeVkOTozGTuJ=Ze1Zt7N~sGZ#^%XRsKLJ8b=F$7MWbN#8@<5U2^T+mUM>BhVj;0_AA zhn|;XF2k(hKD`+Y?XJK?NfkA87?Un@`r;rX-25~0p1LxE$y)+7@{T+a&*&JE2*N3( za$*)}C(&A(l<x0>)Z@ax1H|0{eP6 z?5$h*=h~(S@6)3UmFHG#^3D@1Rjye{Lq(yV{H({(CKt z09#fYDPQ?DbK%IF=|jei-YbkTk)}cUo-eBpH(GsUxo<;+V#t;rXK^fJCd8+%pL4TI zx!y#OMDnp_zgC@LzE|z^@Li~Sa3d3F>uMXm>YiOdHZ*EhCGHSKaBUScz}kc7tivTb zppo>$FhKgZ9h~4y=rGRU0^oLy+0^2taIn}K^w=jiwSe{#8*iONrX{l({k{E*%dR=eVD>;KiLQebNk%3oAZg*PlOn9-O z2MWZMyE#XO^uZ9~St;%jH&~*c%-z|B1<_|e#BY~<^(p*^4O#rkpwcI@kM1MO{V%0vTy>N1qK6z5+4{Ahq z*ocZi69osh^cKl_-K$64x!5M_=5%m?)6pz(pYL4<-Hc5ep6iVU%IV~kPljus`(eoK zNRAAYx_}~Or7Y1dH+hB3KfBG3RuR%q!HXZIZM$6--tm=W9Bp8Aol(b_vQt0R6(mW$ zbxD1E75-=V|MCzlaw@`g0ia~?cEbjvoIPo()4}$}$R#rx3=`RXTGM0fiWBzY1@t^b z$z(W0BEW+RQ!TMMrdT_$(NYbL<|Bs8bD} zxp+T`^w5o=W>9W@TZ|o6d?0@ArRc_j9+b`A%s)CawTB{tK{Q zw|{E3r#L^Sso|*}@@B3pAS5QI6{MYWEahdd_#SLL{xTr1emxQ-l`Ay^TZI@G7^f<& zCVbZZ9ATc{4cZ;m{e9-Boyx8X_>+&DmgS+g>1y#~lJUenUezJCd< z-5}Op?hM3}RW~c$TW61(Xf;6u$&mLfO~=Ffx%;Y3FV%Q4b2`e9oTf=y6VdDz7X z5!$99)WWoa#c$N%?r!(=0RuH$hS%5_ehZRldQv6+s11yGw=6I!X^bRYD#wzj;dc|Y zKniCxvC3foZ2z*L`asS?a(zyRjUL@GMl74trZgwn`!k&ct*}jn95?G9ADzLfc2Nn9 zxPYl6Pt{R)v1o6Bgxs5?{`{gw6BPAqrGsyFy-aZ2JUNx&BO?~-(yDj6(k$EY)LAt2 z9o(!$<&2gCArsW~{G!R^;@9C6iUi+pJS*Og``cO)#}Q@DrBUXTQg31eBRDt`BHY5E zle;_o3(jQQZG|ccY8@2jQp8^LAj6bQbdS&$_olTJRlX%6USe_|c7uViT<@hL^-~2H z)hRuRw{x{R!?>*}OL3L1^S%SNC_vZ*$>M3j3e9S((K@aUPVTX4@~JfJGL-Z|PL;Nt zxN2;HzQHc3GEgNfu*CC$*Su;jkIgRhJnOc5V1wTO?pAD?7gG_S+~b11Aymlh#%o~( zO2MC0D*31DCCB1F{P(UO2lHxIAxT4FZsdy+Ifn^9Z!5Ld-l4@m|G__FM5#Xg{q?T0 zgh;tAbyXg0sx8dxiQ{!$(lK4Q^Ts93-67fA_*nV>0+?*~u^c!o z8LN~WsLH(Ko2egK;v(zxW*>9*@0AAqs8dT*D)hEzA~vv~Eh!oE$ievpd^+X(R>U<) zJ*y{2+lt<}mzr3qk8SE{!WEV=>Y%zro_r!C^ebics)nQdT*c5bX_#sXiSzOfzKE&3 z6uIAPRJN%%=XU(fb~cT-zRro4EUJB1-*jx!O^adr{CYjlT}NwoHEiR+NSP4hDmemf zJAo+Pk){W6G_{pdO;wy4{qWN+X7cQB{g7eRX|p3f3Jl$-%V5mGA;3%2I-|%|_uS{% zC>V`j>Q$tyBJ#MbEvO-$#)d^s$V;Yvs{NeqB_oI^_=P|ywR>p0$Jlj;?Yb8#@nrgl(`d>30#wMrG&>fW_FDY)HSWJ=a5#~|LQx=wj_1-3WS=oLw z#`sL+%HcuFQPMF`>T`^D^GtASc9euG>H&T5pY-wa0wr5UXC2S* zgHo@z4Cipgm)ophw*!3p8KGJQXc-$hof*%bV@3PPK3_H^gy&@3cU0)6l1|YB%=G7) zn>lt8r_}9`k+jWbwT~cF10-LhW;x?p;)|JZy-L6WZm&EpxK9Pyk~7}7&Iew>>aX;F zFl~L9pS@MELp?2UzQM4z$qy;AJ#c&M1P@I|>E$HZ4H8PT61#WM|h zv&WR492P2w8w?=63Z>lTiBGf8RA+*J-#Plv5F6XLv1`(cfF8AUw&c0f! zm7rsG+_52^yT%`{V~v)>u3gS!>bNC2O=_L!vTY{>wiDS;355_v&r$6LnYJVs0gq9B z(yc=~Y8O{TXo0ehZHQ=?QRb0yeEl3=9&5@gQ94I6gx!kpBADuobDgboon4%>Y15A? zqssCuI^>nt(?v%~OqEE-Y*ykTwlGlT_Ac0&=2q-TutZG$Mej(my}<1J){T~nvv0TE zU!6nG()FKe1HmUld;R4F_jmoGL%=GZFL>)k9S#{gO3#5~*Tqi!>0R=?pVYc=*)<*j za#`#h9=lCpiVyn8J9+Bx%RgD(CSpQrNY#x5O~gv!y<>Nd12b}RBLM0D{1**^{FMVs zczT&#HKi%RH&AoH?)z<5JHnSd1A-ZEY2$EH#iSI@5t)OwvJQjwSohK^%!jdP^KG%i zGr+fA3PPeMh>*9FM6EtubU-<`eM~g_c14O{4pzO9>AG-5OcOIwJ|pagOa~1xhV@wq zN+R}E@qWDWOmOEp_eQK_DqBTXS?S}_x&*KOsux%(OGJ-%!P!^>e6};-Q{&hH_vRY8 zZF*&9Fqwqp9Z|d@RrTH>KCjtD3h8IF;Oqh(z8HG^Ccth%iU`T2_Eu*1#X|_G578xi zd%9Dth`u5x{;Km)gL7AqbM>Tf1tYb0qV3u5ZTzB;BxA7v09GWhD);=s*`2(Cbj|V| z#$?1?qF`r<$k_4^4^;}cC-w!_urk+En?ukaUvnaB$(I7-;V#&4+^N3_jx0j2z|oKI z;BO;8anU%;gRu)nT^p(e$g29C6U@>|1qpM(W;q27gjhLb5goRTKvC6~JliRU6JXl6V}zvdQtS8cR+jwfp~H_ob`z@l6+Xd=eKS*zcZ|0OEltoiaXAwVd_&Ee=RE; z{Vxwash~2Uo@+CQ6i%+9p6$w*m~KkaHgspHpfU(;XNcXdatk>-(X`)kxTyJXbY48O zT+829LbCDWhw^5i3HDqL%#J3$dELLLJ|Jdt@o{M&QlPw?v=dB43gmIN69o%xitp54 zZjZ&tqbs8O5oO)XN!M=Pr=`Q#VeElBY{Xcxd9tjZaj<#)=IlPJ)=tiD z&yfasn1Ab}XCKdwJ~NE4#uLIe@~-AjF~V$ux5sIIrg$7p7_1Y`Z9RL_*N=iK3DZxw z)Qo{}aR`eGK|*>*T1kk4zH^4f+9GSxBsNmrRh28_szbZyD;lLmd$k?Uu{fVH0z%Cw zBJL4ve?$%6(a%TD0JhuT0Al_oFWIEzl8ep7z8psU-E{<-?=iz!a%vu)D1F^*Sm$!J z*hvBTWe_Ci%~g{a4@~>fN1PP9u=RW>P?H%}CgWc))V{HRV4Zh-kTxXuULMKh3&fIb zwvkkpI zuAB0w!`59V+R8sD+;yHXu3zXjq+j=@L7oMT3z3Z9ah3WX%>sgj@fS!M3(SM4?S$DzHrT1))a;DWQ|y!y@b9pm;)aZU{U6zd{cajJ6OnYEEoowr#x^>_{io%f4e;!65b<4gQf_D z>@&ZjEV<4s`J&`6-|q&oho!jwG~|Zn0#{3%`$5Rvug4FA89b%12#M&Cm98k0;T0Obm%q-=ROC*btnJeefRqwu>$)9l4(#bNd zrZgx6$U$BU+h21YlsV{M|9IAFhhpSxZ5+G!H;{V`h@v{ewOYscz2x_CEpB#!6glZU!Gdi-8aD_Hp_qPDE}$mNXdvMTZ70{*z~6|>VU=)8-5b|n1f^X_YO z7d$sO2DQ}bZ$khbZ>8*?d^~yjfWr7}_O^8YYwmHrYb+-11gv9QgRj@$C4o#XpQrEX2PcKRY ztDF&i9TE#8>SX-+Pi+sX%1;A{Y_CyY|aFrIGR5)Ihrr}T=`_xIcT!-u6&Y0SK zJ`nNv>aP1ZHxH7rves6qm*{+ntq9HPTR~hIM&IVl>F4#L2bEw57lB#P(`tjY_A#KY z?mW~FJUP4qJo4HSI+4>uXpVZ^;UwOaOJz+g${xOpY@PW&;txs1otegJBNed(3sAAt z*tXbEdYVr&fhmp52lx6r)tedD=t*D5?2ldZRj1W-p{x?(>NO>HFc|zC3aT77?_K zR@PICp$^9rQh5EKX_YCYqjW$vq7B1NpVw^t3>4qEQmiO*x^+=kaM$^@W_+KwWN<~A z!$2kyZh*9bE(EK+vsj%pqF&LFe7VoNOyO$=m_|gI1(+FPBN_OOP_2PP6%>kjeeM3x zsZal8rvzcSI66$ zTaH`8FTHd$DE~{m)K&mGn6`p?9CC1(iL3CVE3 zJ**&bm2n6IY&>6u1|W=6nRRmV4=za->iKmp>l$9&R{}caE zBJvk*;2V`uQ7$9-b$w`oh))hgYWvW6ssO)QFP|j(bUDbX8np_h7dl-+`bvrsoC~S0 zZmZEvh#Q1iJa-@Sd4F+Jh~st!5=c1@n3Ax44!u2MZ={KwgVO)GuRmi*EYU&t(h>^` zlmFQvKRY>!bkoh6K%5nUmHIrdAy-%~5c%0cta7E9KVHx$EBpDC%C?w%d-^Niz0Z}V zPYc7XZvKl(HD#)TqdMo|fR;dTjz(d+FAL)n7tgcnITW2J%UZw;HDd~cV14OK|n z&2hg9RXG^SU!S7i(>2fwTc?9otO?$p`(+Wyxh}R30uiJ2F%|uM+4ECADPBc4Obd?h zd@ysqY;_Wf_pjpMOWk$x$-9N#e1TgMM|N}hk@!VU#^Jq}D%TrC_S&MnV1r{^6auKo zy-~I~Z6@ z0j?stj+V(-agY3T8O9yL`Asm8{};yS$GO~gw>)S!xQ-2Pqsu6Nb?+m*c8~a99+IoA zQa*NI*~z<2y=wvUNfME*`p=Rc$824NdCBfIG>tUhkatUmWI-f>1(`;^c^!R2(+hHj1e6B z-Hd>Yt%zm*k;z~3`d@pbE8*Z5Lh$}!|1xFs;QNKkm?JilIOFCV-?p&dv!UI?Q>Q1! zoTRlS6-3sqY8n^1(tPnWgJN4-#tJP zYA8TP>fp4KIY{nmO6`Ab@9RjsHh60%6N+^nZ9tV6-b?xNmy+5so2jDE$F1Tw^j{z3 z)b>P*Zf4Z{C+(}iJ6@kTjeD=9)vZu>^7V1Y+jW{VQpfGLVw`U51SO6ezvk{F{ zcDENXgwQT`ic_$ifekhK$f8@v6lNahhW)936O{m!i=&H!Ui(h)HLs2FysrRa8nTDV zY6GRV3CWW@En;*fE*PIAAe$>l0Bdbcjos87wHm})b&AOzk7FE z>7ez}*K9Cnx_VF?KNh-VNj=^kd}u0H3bw%m^Sbr8bi zryP!mFf;Ye)iY;s|L5@2dh!jG+O|ZO)S6}VD65>6Kk7XH{GxE%vv#HzPzJMxVZ!5C zhK)lJE&9($pNoA_`u`lPoax;R?~?Z#B+pQ~;InvwEo$cQ9FXUDT|FUskah-p9F`=x_0fKzzeZb_cU3m3s#L+9s zfWw2!k)MRB)P#vKpA;Q!eaEWBU|$wz0hhIha;d+b&1{YRA&b?|n}BPaki!z}pYTaF zPDy4J%a5)qmk=vAzAE=Lxeu$fpyX}zavy-b^}MOcTJcDC4--xK>)DiI3yGYymuoHn znVvE{Dsix{YpkWv>w@8(V?DDsqZ{tEzPmoNR)K^-qqWNFr^{qbqZd>_tL1o~O5_Ny z_0zJf*v6wBuw0Y(Nh4vsr~$35n|PM17)ysP11_rag*=lEx@UZTUx6Ue2zDm_ z{E;D^*O>~gN!xCTel+P4ahf-(V>)N5E>*uOb*5q5T~Wq%^9$31MU2;U{S|7a_oynt zeNEeT8^F92m}2~&y&GfdilY9xX&=)tH0Y?#u3E<1BCMUj=)DsoCtg?qM3y)1j=2x@ zSo8b?tLrAl4P^uL+n0x16ljmYK1&%xZ=hi+v%#&yL?vf0MP1<%- z6ctuifhjwa)14ybna_@=E#eG@HtKP4pAXvYx*0Dw@ig~y2TAQNLl`C9G~{B_JSVlC z`Odk1qpTx$34R$rrPpvdH2G#%%}o}Js`fNzHDEsXfi}(64j<~`;d5CsDSTxL1-w`X zhlQ3$gE@8f@Kj;I>S9ufHA(Ue{i{}8>L;S*Ndmo-h)WXoFcfwnzs>r!S_EW3#inML#fXXQyL_y?nbQblGjJJ zxDHv6o~cY9#%oK2a!gX=4Jmio=m_LT$;C#_l(Jj_kKZt~Qe&fPIsY@i@SzyX6!cwg zcT3b94bkjN&VD!9AN!(+7(TTbb{o7{UF7kI^QQUiz7FWi!WLgA&F}#uNpR{?f%{Vu zwumnN8f-+Y$aGTp-J~qr)|YX&FnH#wy?c{4lUv8RBB3L03`v%z3CYqHsLEEYrE9U5 zgkxp!23l{9bt-Qyw}CVl$Ggv?>+!0hN!J1iaC>I~Wurhl zJa&mYa&oT#oNQ;OeRNdP$abRQ$?_)%v0UP?x3>LjQC9iYv;6967S$AX)rvsJ$Ye56liL{Md=$0TwnHII} zKZ45grRhaWv@;2B0EIC)e6~fw;+29KvxI(7sn1l<`{s=oOA*eFW#FLxNAT%2d_K3A zQka^=g6niczS&yF&?lAt58!*&%E$E*?7UYR%q6@59rb_JN$}=X*E{T-z2riiX^B1V zHWodDod## zluofRtJkDQ)HD~IzR>aL2K>!-;OO7dN?is7c=A;F8lcj`w0j9NT<0O3_4m#z_r^T1 zW=ZeHdDV$koYt|Q8FYL9nTBEwL_4|0Dh}ON2DJ2{PmNv~4c)mcog`@WE6LBjAnx zHG=X0I<456qw*X!7KsqqSYC5?kgDt)8Z*VKVE!rJD3dq?{rgo)okZcSJU6-%`q`(P zJ6Ri66W(|O@v@K)7c7Xw?-$X+o1NoJyI)fx1^>c1Ai33{hWLjpEVfLZJYos)|--2}U2{z^B z0PCtuU*uOB{kcSZgN{XPR;zHc<4I4XTG?H^GvJs_`3=RT){{BncWkqIdC$Nz;Vsz0 z=lu3>-5ZU5l2054p0-JjT+pd!Z|CnFcRiWW`{OL%Eo{Kez7ty`{>hmiLCTAKwgObw zfc=0-M{o@h!nDTs+p#NnKU1#mLuK-pYZ6K+OQK3H-(c1}|E@az3#6HSH;sr|_<4rr zRgu|YBOQmBkg^cyIC8@C#;=fc@4)%!$i!7ci{7k3uJZ!0i(2{`MH??+X<8i_K`hZc zM&(m(dfm@ifXbRAN}}0id7Dlpczqe4JLOwT+Q*7KeY6zDM0O$1pUhL?0x{!s6Om}y z#TizKU@BgQ$d96bZ;u)pzq9%wtUpX5-c&BzHOLJXFoK0;%v@K?h zwjm>w+dfq$O?9k;OPuvwQLa$a=w2nU%Ju8$g%RSiiPfdq-IV+r{1d zv~W-R2w{!bdx~!yJ5uS_mz+4yWL0a5eKl|LZ_fG?>iQ2PANXf!ilMe3ob21+1R1$> zHYHYkz);Czd)fv2=C|Gh>i>c^rCP%M<<3uSny&_j3O5J>YaGn&jIbBaxJ`YbFMi`! z+JH{|%ZV_Y@!hh*6dHohm`LkXxhbD_?sw<~s_(pY;hnelJ0-wHB+e<%Uh1 zHg+9*Vwzjbkg8s=6ErH9$eBF1McZ@&3SGoIwv*p_l(;2lIE34SfRa777oxnOz)xea z;2pi6Ka`w_?%`@vnW*SGZxuY?KDE7H_W>Yqi_l4_SPzG1E~hB4`nndC%2h|w^%@$2 zHHwwWJHxF*WhG@bn=ZZg*InT%WDyn~@nsqe?1%GEnyl%IGU5+}90P^-YbD}r|92e= zAD$POMrU|S5hbVH!~xcqf~@KlJJ0C1h-E{XpGc7qW%5PeS|o$p;xTP6D&}27qy&JuNn(_?<46~B5AdOB+mlT;N8VMdh*W2PBRQOszM1J3OrJCsw z*{VQik3Y-Ci^dmsa|JVguriDJrct(1rle<7&f}O;Oo8ktZiY{1omJ#K-JyS1y5s;( z-hUYko*}t8>y`@Tw69gcq> zNuh5*H5Vt)o~x74GxgLz8H;W(4};r;im@vVWMA2+d;IM*GR$K2PwnazqsD)8b=Bu_ z?Sj1X5_-)$Ymyt&`kg8B*DD#dnvA~#ZxHijOSFzd7>8|AJ;Q2aUc+zht^NKkAflIb zqmLt3wOwJ)hPE4dJT=_(@BC=PVgxi0GMSZ?YgD1CU61>@m+l3UPc4*8(u8Ky0dl>v zd+n5WGJ?Q9i$r(RJVt)jDLoh^CtKPbaR26ZW!b!kh4eK~g<7!>rB_bGLlV2;p7&XB zO}*Xd{0{-S`W>Fo;FWnrhzg>>fpt1pyxJ#qNg*0D)=;TsAhY!>EZ_g?k)-PTDXnX2 zEQgH(*r=dWT?_pMO>W(s43x07Ze;#!1U-ew8WQBgPj?{%p@F_#c5(udE(H3 z0HT~(s0qXji4TBmznDnjc-d(E$P-Okzw{J(D2R(}f$!vlHzH&LZj;^6{paS{a+HJI zt8lG!pLre6q4(+Av{OO4S=VS2$=Rn?9B~8k?4C3kpGFQX7@YDzpyO{IquX86D6l2)w>ML^eE=oqt#Pirvq-4QO8{?{vG^1v>Py%~nR6;Ohd zU6JpVzIDn%Gb?9dX0gdS0p)s~Ge2yf_6@RY(;T;`g>a8w-R_fq^e4gQ&Dm} z`Z$NVHX@CUrA#pEFK!$w4ALzB@tl@a)5X$tr*veD9IXt@N|aG%%@j_+e^%RmA-Rs^ zvrQK}gFl1OLo&%EVG=X1uJrT^I1E0TFEh-C{4rGU#T9kO7mU1Z^H_gbS?s4(SKY~c z1q}rYQsst!vAnpLhUHXpy3~kP#Uah%c}6#{->U&BPhW#QltW@bYI68Q=fa@nAxDw0 zkbhm8h<-qF`dBWIN;Os+vnb$0&tJbu3(79yP}rG^MiDG{fQ{O*;D9ng9&g~(0seW> zS893lA4MuZhw5MvdB+P#51`S7b#`Vh$h#hp*<49b*w9xGy&Ni2@Mthp3wcUHAe4HP z+ldPG0~2@hx}-#$P~|Ar&zHBy@Hv_udE%ieWy5vq!TNX0izE(+4p98XbE_)fzZ!(z zf%g-vBrB0eK*f&(zb39bD;gRF4-ZdOT5F!u{}IY_nWVU6VJOo0Q1)G?2OL;obiz_Y z0MNVjGvWYz1k|FKn6`fkeEEpvfrM0EZ!PpNCLlI$5ixo#`^wk&?eF@VVr41Di3`mw zPTDLv>7E}5vHK>r$^ltnZ6BX&`(gfO?s4}$_9$V_L&KM4 zji2VUrR}|4=fr6<$HEw%BMMgB4G4Q-c>1=vQb~H)g6Bvv^}Xyt{i=3`z)z5)Fk0p@ zT!b&R`FhT81&lC@PrNT;hr743CK$_M-?C?|V*6eXzH?a_zN8Su%#6^IRUsw0qv0sG zQ@**vps$?kJ!HkYqH0&)P?p;p7WaAl4t=C2zvaA!S9*#VW)^zTu03mqz9rkGqF0(- z>9<~k&NsMUnTm84jgOS!ba`ISV<2YE%WwSaT&nOC# zzsM%=y)^V)&i&U(gz1O6nU}_9{?Kuza4oN%=93?>ANGeNH14j!X(a|RAwP4Wk^F}; zj%&TdZW<&+q+=z0+TsSBg)9yA|EhvCfX~A2V-glf#42DZ>bN(J>*U;2YXEUZ2J9-PeDK1Hn~iZ%d0Z9eiMiyNoIJ69N%U*-cJhJZoTxCk=h1Z+ zq&hm|f&7P*`k{{VYR5>3?&Mi#^Dups+(g`n)X8W4F3fRiQ5Wadh2qh%_qm=r3atp-9g$L_|Qi~rZ#A_<&(9@uPKF9wOcu8xnh zSx-yhaeeGCS+)I!&;e@URZP&6xQ0JD?@l)^q1-QW)9;!6^DmB&|KJ(f3rwea z08thfqBjf{dw}5Ilkw}uF1!MZpO;p%OOFVSSXF-Rm@ooeFKEJLhL>>#hb}m;LF6ei zG*FHrsr@sju9oTjYVYf`8|)!BKnf{7+w^X^#!AZ-ai=MIq89V9qK;!Fc*6(RXHD-X ziRcK}v(~%s_Dvd^PeHGj3#{A^+)yG5>wLWp1(g?6|48gJB@@M3X2j@q}4&ma8>kkHb%1&ZY)~h${ zePe#^iTzzoMSw3RgB))p4?Ou;hCTAjh?uWk2rXV>Y`n9?JfCoM3fH5i4`%}jDCb`& zL38O)h#FbhOc;0MIw8|=&-oc*)0AFB?=)>b*>Kk*ReyJAUi-<7QY;zMVRkq`fz-kr z%4U?vb@{sL1u(<%$c<26uaz>Cr@Dl`Y8SuyQM=aVW2*GAb6d>c*T2w*IV%@`SjxQ> zl*iuCDQO@v)VHoHJuI^aE7N#1qN zmM80rlJ|A0TkVV>B>O$nwF;$+@J(dQ;tLCdD)xf2X|~4=d8e$$)H=}{*_e^W@+6zK znjxnV9MPcSgLfUFmre-^HHC9iCDP8D{`StaBLep;XTC|VUIT>>DD-P`nN1;v)}Cmq zf+`KTMNu(tb6yk9UC0ZNPxcyaA-$I0x0l=Xb3ZTP5=~7BBZ~Wt40hcCtS9eEM8r_r1tSrbo?TzXa!k^tV;hI{P+|TOZ=T><$Zl$dR z8uIjPZH*`XnMHgOf9Ph(1L*0vZ0Ndp)`Hz_-WSHKGz3>6bA5B;n7-t_l%;o5m^ZSe zwz7CFF7q<7+*}m@!4xr9;cbD6+UYhZb`6q0MbU@isbk@1?5r5xjYq`{{+EY#P>-c_ z61}Yto&;hAWvyddg4m&xk)|kG@*>aif=f+Za&BM zXh9}U*rFAfhtF&fzZ>`vEuoE<$lg(;3XQrI>)kfE@+Rv*`CXh*OaVdxg2~4Z)jAfX0I)2 z^K$-*z@4qDOq;WAf1<6(Z%qilP90%lpqndBEV6r7n`u=)Z)$`59>y*5^rGEXs;^6D7hrC<-q55(qhd$%wu;HS5b>{Aa;}(O|u9K zP~z4fe5ToBR9JHoXO|M{{dQ%P98EMV=-ni&R-wEn%VfXhW%7dA*$UfBFtA|rm#%%uFf`$zG9 zyWWn993rqEFgR4KFr8)+{n&=QQZM9X?p}I18BQz=v0{qa`#OGaS@+m@88jlJrta(b zKv=ur#Rg?60Up?gN0p8s{|%oePOM*cI4y6CK6^86QYp_sId4oUar&C4HX{LC4wh<= z7K=#_Og*sD&bwrn-XRt_&vH0z_gZUFKQi~EjS6+NtnO*sDWw;=uqkjL^*|GIuv#xl z?9M4jQqud1lTg)ap?*|4NxTpeyi)f2{fxt>)6_Jdh}K74?iE}Bk&-9b3VGh(ahOW<^pc6f z^}c^sTM23wo@VNa(M}vHtVHfb|2dz@V-`g16=~tkoP|!M^PmFO>b0e*B$uq)x1Eb+ z3bB*%Lp2*t>%8NCNTYZ9xj~8wi>ICLOc+Q_0&;Z*3Z@!(O2;mcYgdQCO?N{gG)X-W zNxy3Wjk1sBT67;?Go>XVrr7SwX!(m7S>5dS8ZA2OxTfiJBkfxkx*Ln-o)Yuw^r>H! zJEQqNM#Zst#XGC@dFGm0KA%8}RDZKH3&X%hhKX7={lKxhIqa@~g*VgZylroSx3+A` zlV>^D#fg00>S;iRFrre9?gYq5$?oy7P9A6v&I)Hn=%|>B!m<^M{Y?GnYm_AG9?q~n z&bXrLv{{I1EQO7t-IAWP*4QKuy=cWrsj@RFm-JHG7v-WfYJ}*r4mD=nr-P0ib=bUNNBG~vrm0vl4>96y6F@A7 zhl6hwl+QvN-S2q$xMndRM&k#WAP@JI@Q-B$rz-wyd$zJ6>wMM>*NvIaDK96I_adbc zMY$DGH2sfZZ95QCGxf|m+b<^YLs0mag%`IPhA*FR_cEgRkE_+?h3LiO7NTBov8vt$ zgL@2lfOxa#n$uFkYODV%8%vd;+($^_%)vKU#_Puy-+@fUAkfXv8pFJVfyZ`8G z)cIQH`6<<;cxGnzLS1N=(ht&eK>kLajDj!?S?{hm$b<01SJK{!e*I*cAcRy(f7S9*raqPIsmLLwWkeqT(QH z=M|f1;-V$Wrz@n#wRt|?{WM&|Uh>7vOBL-0GTIfV6mPy;+8mxpxUfT>*4BJL)e88| zgUfMhNhJ}1ODYW@!KK1KqLsJbO0oo2i8#DPdS^5|06bBo-dToph#oA@l8R|#~$ z*}V6@dLLjg!Ncc#lkl%C_(aIi>Lnl5%g}M&5!^u3JDgC)Im#(62+#_;B<6_ate;Tn zY&1|>$2-r;_l)O%dhb3xP_Y5BtH7-=M57=BP5dV>?A0Z8kskVbb}nB*Q*OU$wzct< zvu66`^FB?XSaCOT*2iIIX%+H`kY&@t&>a8E6!}J+llW*}L7vz=3id3owlR zswM5wc1ViqAJh-Mh{l{%cc07KUSdI+8#bcwl;BZ?lc3kJPj-1|Ho}UB;UXWy^$q{t z&-_jj(^S0cdbl;67ET6sLe+-Hc9k`R+UWSH8)CU-XY)9hzzgJJeEB)A<?!cGxVx? zn3Q&XnbJ6_4ZizS$ItYhj1(N8Xl?kf{?f7&sKEg66uHkQe_+|_lcnuuZ%jKKDEnU? zQUh?xI6KHzjowd(`I`yg2E$cOcjJ7Fb5lUM#ntYwMs-&&7(!`=7&jGXzZom`&aIyR zC+plFneHF=zuC+-r)^HdXq%Zi&oN3GHa4W0(;TW{oT+8u_yTIJx#CGl~f0q4|scRMP)w_kY|-GzB5Bg zrgzihBSL~`84m);Eg3rXBwn^_cUG;L$Vll$Qu0RQ&B_Cbs*kok9rQS+xn>gjL%l2- zCghf7?2Kx=;v-WqHqAWj_N*-Exc%1=N=|wzng0;y8aCeZ!237ip4oJYjD!??6l~HN&v?LzY9|rM__<+c1(VgDu8E0 z&}|F#7?h55X>Z+8GS1bB-VA6;xiaknh*)DbTacqvtB<@+9LM(b&4J@)JO+!TQfaMV z`4y=C-qTX7sq5rcPRf`dBW7Rlk`0spuAQ$Q-9mK)SqnChNl3*y+S ziVB5@5YD?d8KFlT=MjZRk4e1r=#X@a=p?mX(jR3M-*biV`#L@!gfM-A$ znIrou)$BiRC$QMHqruT>E421J30$=@2_zKN=eHvL+4)rm6Hd< z$xfc0p0>x{A&jYuTQ3cLK?>8zh}ft7=+{Kug~o#H99_d3$Idt{Ib7cl_9X7M=TDds z2tAZBexAap8?i)-aF=@=LvJzncVrt9I8(0T}PiD3%Wc{ zc>`h8grE3jQ&G5sRL`LKkbjqv3S&pS7i$QDf_jGWX+y-srp&yDw6(YGw*Q9gWjg1> ztkV_EsWEqo?};qy3ddiBJ!I|vo&@cO803lTk%k(EkJOWc}F2?nM9B$YspA+TKTJ5Q%P%;@K&JZCx=6Rt)Rj#2882jGTug=85{(eR6aBY70K@H;Otc({r z34aRBJImxN9Yyz~T{x4oRIa@5ua@k!?EEL;e^GMs!tg0E@~ zP!=daH(5@M(kPh)RQbvAu9Z4%d*V(id->iD{9t;fvgM-?eD2L4*V+0rG$VJYSF|ti zpw)`9AWA_do1Zk<2PizzYy+UgmySlCrcA>4283F_l0A-_{^&~t{8WJCxo@4Or6YRa ztY%i;E9Zk6N98OMW3D%2&wLAVQ!n@v7=Aw-*n>J*ZR|d2`M%J6N_bl5jWFl zW6~yHH;>J5nkD5Vy3s)NaLsgHBRwRSJ0&$=W-Ask-b{>nVYqY&T< z+J>5h?fWB+JTISG5QqNv5I#k|hn#;sobZt)?`CE0`*7PPt~rEHQc2Fc*qD#MX>v`$ z5v@P&{D;aOfv3~2IH)X|Pu~OBkbSfjhCan^KFH3m64~@FIQ^YQ`(=;+5I5rx^{fU( z+SNjzSqAU3>F|ESDhsPnhzkQ~kxOM3(@fEgtBb|&A=JPhmh8&?*`6fkRne5bOPjJW zb@eB@g6Wh#psb8_UAPO=GEP$-!LU2=$I{JcSm?h4E#p^^p6tmv@bVz(=CH$Jx!bFBq5RR?ppeR?93#iGS1*P)!%QJ;t+YR|nPiOUcss}if3eHYczK_fHSfkl~Qr0M0KTLwJVstovG2f8=m{@ zS+8{U9pOVtJ_&Z=MIz>P4H?v=x&VPKVXws~sg0E&>=>PG>!^*f zG%8+GOM-+s?7w7pQ5ow`k!?FOk-uO&{CRP|QyErhcHgO2B0aTihFEH)@v_lYXY0ZZ z!%EcPj73e7T)LG#wbjQGb~B|>{x1A``@2a;nhcwiw^sY?Ekor$N7QEKGjWN&0Fwsl ztvi;&y7R3o%Xe_DGRNLBY}fntTYc33%|mJQhc<0-96Kl2V2rnqlX6#qdq~-(YFKr8 zkO6N6JHJ?>tz7T>U*Xr4r+r2ng~zhkrU)=x>84K+MYn{QiQl(XQDzt@75M5$Nt&A)!Y3gW}zwvpqF(}2yEbj4>;k%tY%%l8202qU|8jq`||3OIC zCZrv`de#&?+FTarSe@w&$3^l|)N@oiCOhzG7p|=;pgyifEvo_}t^E!V@>~}?O2Nz; zPfmXjI=PIP9GRSs2v*haK=zFS#*RVYo9 zy}5vVPL~SBl=3u07tq+CVRx_ZFH+9CUNb$c2dGJPn9#6GHzoJ*>OaAO2GDNh=hETB zSDAU8%=1XT>urkx4f%zk$QJ{l;R#iX)|6fu*?NikM_}4wpJ|YDvs^ia@1(AH1NWmX z)+xgN1n08Tpi$DD3gf!UOVtuE& zh%TG1ofW#a%<*rh`k^|!p*pO(dc9p{5xe>vLTscF9?I(|pEB7MJLj5QEuEQ*!Vyv9BMd z_vVfsmf1Pv+)FN!yCT}EuBy*&1l*t+ui~yQg+%4#9fOu?U!N0qReWp8U<0dD2Ad}mJ2$A`r2U|01 zHK&0_o}28_O##8_Y77Oz+gsfRxt!`QRqqKkbdgH{WlI z3FPjILALbZg&#;^6wuIl<@lQC-4A0|(!E%%vdcF@4(F(RNgmxREVyq7zcUc<+_Sjq zFrn3_$S)X8Q;>FbC8@bEU`bf87IS)ekQEH}%G~3Odc8lblMK zON-KLaA@)?nzxlby;G0wXZin;_QY9mSG<7-VN9Pi3DV&&_oZ~&XO(R;kKZ!OPPIAs z!ilX#G~`8wqCT@wo}pOr)C1bmq4Y3(L;s`{^C1~s8zJ)_6E;7w_(oc2Wb9ghDo9j7lGu`sq+r9&Wj;sC!^?cxg{ahIu1ANe;jC&f63s! z{APvSK3!RYy3=`UX}84({7VOc09i$I>KH+}yKQ@?xyqSu+JEgRA02eOh28yccs!D4naIZ0BUEc!2)p;jQ90 zxRY$2wzYNh8hOqg7;3YLEJ zvS$lqRjK87-xb`!p;~ksHj^oZv)H-%hf!SPR77hqm2f&fZegq%p_1;?kqp!rIC>qH z@KH3W@3-TTrj0TKG&N?Z0n?Nm8P!O5UQT-ZuD+auk(g%tskajca~B!vb!e!b>G$Yu z%NO&+Bk$<@o_Jz5ZNx=K3r*clfob~4gi!~>xAw!H>a-$>A!HwMQf4Q#Hrc+FG)Hqz z5rp5fU$p&ZSlAEC(N2GTe`6S6$53qyfYmJ3$#!wNIVZ!MBtm81TPae;+5H4Amo!=I zh`D8d_9rxuXLQ8E0sAP~- zfO{o;NihuT_G1U-R<3g{1X6n8Z_xVq@?gX#4|Z%BZyp5G@cmgrJq}?#)q)$ z${L*yS^dzC`$4KZ#yh0ZZ!C2tqE>hgd~oeTqS1J&!|87IgUIE&x`<2OCF(;xxs0Tx z%gQVDzxp8>*lZ4L{{#$I094g#@Uj~cjz|*_Z>=cl@z0gq3t^;4m4oga=5#Fhi_O^tlbu`4fy4c&1 z*>Ug+M&v5etGW_c>anA7FJrMfc_w$OktUU4$GH;Kb@knby0B=j*KVuSQAd#aHXDYj z1r7`wtS96$;>n7)lEu`7m@6PQEmFg96WdOL8w+&EzmXV<${=0s<9i=pIJi9Ugt${B zObCl-%4;wBu^WiP&)vZgTbY0@hljxSTTlA~Ps}0H;Z*bB}BKjSne4bvJ{y|85)uLWPE{}&j zn41V3Qj%b1^KGjEAu7&}BlZ*7sS{o_*1Yy{cjtl}K2flV zIK}%MAOacsyf#-~AT=q0PD(<_eECpVp;-*V?zrj+p5eN_dRnmPa@`|A!%+D_@uGf8 z`=Hl@%!l?k)@&q8+S^vndLxCS)|2yYIt=$N!tX)uwDzIG=dn-a@=d_EIwGWX8#H7+ zO0%|@S%)+=oQXCa&N{{k@7YbgCqW)CavGueplbG0DeRAaExSZ~v18QN!N!|=DMFA& zGvNZSR)J}$ax}_v(T`X=OcImulcs<_a+ox-as z@vyP}!guIXB6cfRk4Q0O3t*sfTd$WCUT?r}bUPL^@(Swo_2E_Xy8w;hb5pN)q%S=+ zxzS!4kqb^{gr>l!u4-Dwq}O2f<1_@dVMo4=-`Yizuf8RjDj-Z>d(8*Z&{ z4HPP=B^nKQmZf9&r2(ChEqz zrof(85yD3wOOf*M*_A0m~f(`#24QRznk)22xm$!FJ<7 z&7JK^#6=50;?>gO(ptcU&Rzeze+6d{6Z^|LLf&P=e0>|Z2q2;8z^np|sNNALcZ^zjTJKiL6m*-9rIlC#s=i-@k` zoqGwfLiy!Q-t)9wXxx-+mm_>SXVlqOZUx=pw$|)!3yd9$_y0`5&fhx?MKQA_Vyu^f zwv_4tK=uW~`|?Z|g8*uA+vhpaLG79KwxlANMo@|4L`8#hkVN4ox`GrcA7GVyl+^k$ zf+omNIdC7W@vh}h8N7mD6@k27c+cR&AXg-lGI1C6Ns9W~dun)p@MTogUPeD{#LaUT zTdrdg;*{zJNO&HuGuw1p)Y@vM{+SB1ui2u){a|mE&*g66=vP=U1s(BZ*YKo*nv3G$ zpOK`Mb)I4#PEt0HEPMt(o5ymv32pA_jkRt}e6C#EtLj#@Np+g98HF>Rk(A?g6kV%w zf|$TS7Yfqi==V|ExGUjoJr!DzZiwpi%NsfxL!w?n7~!5rfbR~6rwA?&`N(dxL5^z4 z5pIcaOiNSELIc%&pR0H*vU8uIU&E{Zkg9`<|EV520E%AB#S4-N8rD+d{CMD(HN(F@ zX6T(WJbYZT*E8`;>;?#nOdYz?U=cvAP!ESWndVwlkaRp_=Ij#SW`JT})6sOiF=s}z zpNqaxbmZ-Y_ODrWoz~Q#wWY0(>|E`~-hU;ur7^EX$hhw2)S9NH2bo&aIUQ--4CjK@ zHc3)VF9M|d8`r&Dq30oPe{UFhGWMlQs<_3{LGS1bth|hG`70?oTD!BC<*lpRCRkmP zlVn9R9yp%@=!gE69MFC&zw_5VCjvTH;Y+_KeAUh^mg1Yu`r1$Y7Dx zWy|B6wph=aq9k3L6^%&8m4ZMxxB5(v=d<3^Lxt!NeV244Q<;y1vb~t>Kitk66dCd| z!ZOc418Y;73>VW??u8%QzE>|JxEcJ{+{O$GGEt);U2C<2+`zZ7 zbnA>|DC)f>Aq8cwa}9N!$H?4$23E<_`6kZRgAwE?-j3v}Tki*;+#P!sp6kl)w^gqm z0jWZ+{Q(DKk}QCmBA}nLSF$7`^J#Zl=ionpa>eU8zpoMp5L88ndwS>hMxveW9N(v~ z&{%oKGiCAWp}H0(rO2g9(`UYvq46%Jzt~V7{UD>b7^|MhNYLBXu7m#HJhY*3eqqayJK*zdx9#D{Np)F}xFZIcD6_9R zEYS=-Z7%8&Gy!_!s24Ns~1?} zz7_Lag2F?#7 zm0_w8P(#8NWeSse2!U~CKk}-tr7;H$-u5WBSHg+pQ@5ma4f?boUiWQp5)HH@$zKvC zN%{j+C>2BtmJ&G*_T*35;MDhW-c)CXh^lgvCXwB$hL79IRPUt9CW_XeKg!l$_VblK z$nT-U_X`^<# zb)b#-S;s;xFn=OtjsPn#e6up(po<-AiXR~UH_94Ms}Fud=5V0E@q4L;SH=P1*;D#4 z`}PU5GKvo?3P#KWQTs{Y?gTr*uXeXMt*>Icdz@~I{`tNrja5@DN3wqS5QGBxyqK~Z?u?=CZHRk??wGe1`x${74f z`Zw_gCsVC+a4xj5zQ*VdC=vjvuMzPV^CeR26E zfmoajArCp2#k|Lqn>)@AotgwU*r~)Hbv)|!DrjY}_N9vr(qhBhEUmmhZurR&sFMe` zTJb<#SEM7u;SkM;xs_8&53?@Z2)E<*29H@=&0m4?*Kuo6KPxVmFzO=Iu?%WBgBb)-%JKQ_!h*h0uamT+tMaW*-hiWjh%#(*;YM}aH zXWpEYoD`P074JD+;LqtOqWDdU%5xR|S=oM}4+oz*T@!gmS7BsOOFtTOj`yF(p;r{+&9if0^NO(X1m!|wbU_{F}>IB(*_y(Qm*@a z(^uooPXKy zZNoP%x-VdAXixEvO}r|Bvbdci9i;i@v(FvJv>s;yk!E$7s25dwGl>{NhCH*uU!zE+ zRfe0jpJSL&C1*A&9y)jdFFmSCJPy3jO{)0Uudzmy&~TZ9UcZCG7VDZv#Ou|}Dp(I@ zhIM^8l{Ivbmd8Ih3fzh2g|+-MDiKY@d?guO?`zwH+PjfdV1 zSq{gDpwAGuGP>e&yFC#ntT^U#E15$L3lFtN3L{tzD~^K(574Mdz3?M2Xg+F!+;_5< zs-Lv5cJNzsC4j^71;0MY3pI%DQX#x%6fK5LFOyCWuhT-OAcuI>fdt{&ocF;Ewqn7(r~qjTB6IJefj{jo$UFGY@h| zNB}^Mr0K#};rt`Hms_p5vUMo#!PKkEW`~h}T2r#F}>3>urTbi8u>b4{+xp{Hf(Keu-=HwFH_l+kEjemOk066mv&T4?K zA7r3U`~{7Uq~R{21cg9i3gGvbJ1dL*p1jAQ!0#nN|8T1+fxl5-QHH{@L4e3Y<&;%- zgl5E-HH6zx8h?1-->xDr9&5rx>PQEVFkhe5V%>rEbqlS#T9xsZ=!;KVeQp#|?%RGz z_b|I^h$ag*HPUO|ZTl7e$QB*2zGnt$q^tTkC z?>EIj>(xy|o0AsB+hg#Xde&^4f1zgOb}^5#85GqGjRHW7Y6Ar=X5Y4oz4mofNEsCe zbEe0?kRprj$jQ`Vn)r3%Z2SM4hx#zFmn>pEgs!8 zE@EbcH`H6Qwdgohc`Ec5X&>RLP|YGOi*%e%%WF`aZ#Yl9tZ>$(<6XwlUH6WyIRuzRObNLQ8c z&TXIm#Z$ zPof-YPT&*KCY8QcjR1?ovpgPe)Yf?4On<{tW?XT|D%~GOMvm()9c2UzZrZ^~pr`d1 zzZJ{xDMKrF846m&xhw56X{zRH^9GjBLR-V6Nh3K#j-Mz}R-PzX-sm;GL?*d&EyBmO zLR^&fbI-?eDo-NDNzKr7fpf~ex!=ZC#Ym-igT7<7mYMT?$%X)B!QW5mfRq=`$%Z8b zUfmI3*#Vt(5IQ57?JRBz$uA@@w->6G$h9IV)@b{t6lEwq1s3Xy416HW!%}*z_a5!& zjKL0#+kbtB%UA~xMeJDRN1OBT`W~N`ptW$I`s|N z&#PrUde;GqiqO=oxw|Yl^2CXCyNWtE5aJ|*JGLeZ+2IuZ{)ly}n$#xkcI5DmaZ4KL z`h%#`_ajHsKm9p)NJHxwKv|~#R{lMJ{+Yzv#}1!02{^WsDM@AMp%lywTJ;r)R zvDcd78y)ov7gHjw%tLHXcxTJGJ{Z7bFTOaHg{P+T>UGZ$i#*$1Sjxw{01DZnB@e~o zhDOd@Z(XLo1*mZcgY{@Lb_z_&>Mbjp3LEA$ zE6$k68GSIs9S&%@{f{u+%%S+A8B>%9kelbjj$zBxr+O7p7L6X|DN7&KrA?LGs4y?V z^Zf@OW&gKzHXiD#xC_SdGuBH5)X2HQ+LO&3{ZJ~Vw`=!w{T0jOKM6bzoU0m#_#^gU z*DsT1{1I*Twha8KbVLD_xiedx(E!j2sr8o@2l(S%vO zB^$fbtyI<(qH~=<;L#)}Zt(^oui}|8U^m7Mrqc>%OFCt#6c~r^_`d7rmF?!-k@d)& zl$k~VT~`^c+hz_c0p4WBe}PLHqgT4+4>TM(R$wP1E$X8{Y6dYxJtEU-yU1eSH<5AR z5@qO0_&+u+&-G9;0`0@7_%H7q{Po>b%9hShvKCNkuYC3AwvTBLHrWT1oOr~bMoM>Kdvg&u82e5Pg%IFvlz*1r{ObCzK8a1at?V7q<7%pO zNx@$!gBkcB0U3mCN)virr@hGy&iU3Te^B^PLGn-I5q8N5p)&R0eU|Gj805ZjAbZh6 z0*6tX_;=*#t~5}Kfw093~7EiGkE^t<=Jk6{?JBot*WnkPqpK%qoo1}OSi|N zhGl$FUH9!y?Mc4KbIH39-*B`T;5z+wq=-K`@Q5S#*YG@gGtY_slN@Zc^jSJZ;RU*t zYSlNGbx6&>>S67tYs0Z%9;fW@jFo;=woNyRRnsdzmG+7efNGGYTOS^cnKGvZ(&4%N zNX!G|IO(LzldS%X)x}YNBe?^QcB8!iC{fXl*}5UAy5+Nn4eMF~0bSAQv(idZa@v+8 z9wyOpAjeCZ@uRyTE-|`Hu;7v>{!mQWO{9EXVW?#9 ziPK`f-mW>|C0%Pt9&YS&y{Nsq{sgFR>H#id&+GH^-v}7Gmq zj`c-vKj^D_&OO|TtRZN<3~pcXw%N;1)sMJ+x9vO~+tr{lMH?#LtBDR-X8YDFVWAKv z>4NH;^2mYQc^r|TGVUeAL#F5$hAE?O+|i*I|E&Ao0GH8?eJf)>)JGa(OF-?Z~lNDfsEi7P(2|7tSfp z%~jh8?d~ODXt6Hm#pvtn1gU4|Bk+YDT|t=`)d=uMPwiNh^_dYbaWLcbLIZ%J=Ke~W zd<_%+#fmZBYfto@|EJnyr5AJ>I$=RN3K#OH2!&qvGiDo-QC;f@qVCJLehNo&76=n(1aMiWSeemmX&^`)y44U(p8JrvpogTHiu}PNj04K_9;HLoO z(&$u1#y-7VE-?pa{=0z1(CIn)ToMzPV2Ll{q?N|+wc=(b^&QQUGtoU#s9128{D}58 z?ztP2Kn1ROt|KywN&9?v@0EQ^cXIk|m3v<7Rfo?v482HdW`lJ~p(W#F#y15=oKEL* zJSmK-2~UzUceQAg!7ConP8!z9YVB7}yvpwU}92ta#$ztk3>}7mVQUrF{PxJ73dVz>R+1$|Eea%F}DG{qgYJrNc|!Z z5TV^Je(0>TY)@WLkeUL9U3*N>@p#xcIDMi(hxo_Z*o~f*T&oNHTTAJ;dDRrPAMrVz z1M@=#tp1YCY29Ilv%XJbTl%K6VW7=rbP)mu5gBSnaXcwNt>GdN1sc^KEy=bT_Q?K7 zqW8nk>l>Sk&XLt_;9smv<<#7&V#G9J0^DQ(S1^(L?txK^^@)D|@(!Q^K^%Q-hY?aj zAvwO)IX?xAoD}^f7)gZA=OY9Iq=e@h)Bb!@$-QjvN*Y%w56sKGBU-w&M{_xd`2@C) zug%bI&fEekw+|iFp!%A1Y+~;MGgEX)4kj=s{gC_TTEPVUR)LDR2rQnckr*!z`UM{M zHtRxq-U(^2e}lHg<8weldz6OAV6;xj%CQzd$R4VoBge}et5_E9Ndyd<^ zm)Au0y;e#l4V!s7rYl&7Tz4)_Nn=6f-Q?9fIWYN=!NXfElz$V<CSH-Rrf;wK0{8 zy~~#94!2@u_=aWp`Kc5}p|1R^+>iY*Ml13ODcNauJIfq>7T#Hw`fH5g3`XJ2mZ~un zYH8TGjcAYdK9#nJr!AP9?^9TH@)HM29(I83LY`LrfkOCXo5zo-51c!SwuB~t zHR{aULRMdgZqn>fwh9Llx3;c706ICUT6#N;QKd>KuvR8M8-&U%* zARMkG6qYu3)n-Md;x|Q$-{5KMQiFoqKcGC-x?|l(UfCpKiFGTqIGNTu=JWR_%wz`+ zymx)k19XnuPVi~g&3ZQo+Ly=_pIt3*k$O+r(dSRRDMU-%^Ix7-@Hu>1y>_$7s$iwi zK|>Gnd=EKNV68@oQ%5Zmw9Tq#mvsJ)q>?=rs3GwUvMQr$nhOGNtJ~be3gfO3bIbg` z?wCgC?oJw(-L4Ccd((_`I3ZFH+EGX$hAwvW*<7ETU^6c@_FV%U%ukxzdl?yquw#YN zl({2#|L#m3DuZ9n?&_45Q=-az3a_%T`isYRsaP9UhnPY0inTQo5#OXCkB-c0M{ynA z_aIziRjWYM7HPU%W$$k&bG~Z5jRF9G{1*F6XxN$L&xJ5n1~l#M(?=l#Wvv1Ki|}+$ z^mL;bs=5%DLSx`K*Acm6jqgtf3`KvbTa%@JticD{Hc}1M+spzPXo2Jy=}@2dj`hjiwC(y)9up! zcYGQ?Ar6pss0DI0U;~N@dD7IHcnXY&cLzhY>8S9s@Yqb*FnUzsr4l%!i`mbD?aYG9 zWkXbb0sN3#BRS_)A@T__838$982A7>i!||z6Z=_?>)irTy zn01Ota~tkmdLLE!|K=eMIppArS|3@C5T4yE-dfN=T(C=c_YEs|M>w*x)fUm?!&gN7 zZ@}DqMa>>|?`Kgz>GNxV&(owvL|fd``r`b$#@$B8{QSc1UrpMiU~E^hpJkh&m2l7u zwYA)0=rde5d^u?0udxAq*x_Fz*=ZemjwAB$*QZ)q&fq0&CvX~(TC$iXJpq0mX7uM)k& zq5)WzaY$ri8_;*dvt5R$|H0;F>U$njJq)BnVV%y->mK7*9;<9=U0m~_!kUG?D>A6V zS^vz=@JZ7`+-JZEXzU4%g0`(5b%@l{8vntXy6^2WiuM^YCB`|=-FgpZE*SvlR>F!4 zglY@hk(~{7b!O7y7i-&Lv)2VomZi5(w6Fz&)6BhOBjDyZzci@(Wgb&0=kK?ke76nz zGd-unlHyt$u7Sx(9o2s{jZoAm+O9Znl-@FyLs;0LSU#xF5~vbysNmb|@4)biu+&sRnIYULE}OXLDcCHvY8yn3Qe-DkmivJ7d&Zqoyv zp4Y!C@Bq1KIEC0?DZo-Q9EjtkntC0DK1!c&F3XgDjFU&K>YUroQ%<=h<}r^0);)eaW5ozhnqv{lNSb#nwi^4b>G zM%z7M3x`IQEC4SNQk-446{X*<8GIk+#Ce-qHbdAUorSsdDBWCr{lx4*zTjuYicsLL zWA3)KJPhnIkg3pN7q*RhXS?JbE%EOlD*B~IDY0~+f094c zHm-(;qeghrb%Rwhz0ggKzl}re+1Kqgyy9Ym|2TIBiZ8woctw|0u#Byka-DmmRy}C8 zm6<22dGu^%7vSD_bxpXO%0H8Q!zBdM3&*`G3Ros$K|C!`Q)v?DIx5$|Ser!oS%VpUgLWY%UZhBT| zU8mMZDs9eJr^Fv%Z=MYkAbl7SDeR`t<4R$-8gCtZx9&TbE${Y|y)?A_ zA6d~ped;al`Ai7hjW0h<-L5`KcZjY}->Tso`t_w}%>wmlrW~T`I~FaJ`MK}O(L!M` zh!{3zr!-Q;>a@vPavg4jp;#blhakl&97{k7Qns-UTcHK|Mm&yn^+G z2vC7FqKVm#t~Q&-ATCU;8c*TEP?-J1vXwIQ7tPnnx)vyK;9Vr{%f$~ zAMjdnP@sEsMhYH+|P%AJKSr=JLAR&sh}~OOZVj$UwWE`55YnVKCx)}+D*xx zY?~D)p_5F|e{oic+`1Gy#ghQ4EyE>a_?Yp}u0G^xuo3-;hf29s`1L>1+kCmgS_QfV zAGgyIFe#Y1%{;nB51Cx+P4xFMq#$0I7#F8PL*C0oOASi20zMVY_gAllvT$ea<>s}DZZN9UOghDu>;WLuzdY8^FJ@Kb|Ydp?X79Lglv(5bZ2TcF3jS&(2*Jl$h3dYy>GC^S= z)yo@?kuZRUtZQE5Ud3c9Sjob$du1skj^cVyi_qxC@?>^p_yz&H39WMq-cKvOj!H3# z?m-k$w`LHN$8`U{{h`WChSHLU!gW#(X3fxZgR1wtrrRnab?_NqTKW_0M|zg7f?m5M zD|>e%)cALdYtbc9AzPHu_-cLU%8E3RqvS=M-z{QkT5Y%gr}RK4hrjPWYa=t2MHtZf z^IA#`{d2#?>4|UsHAG3U`Y~1Qzi!fVrKzV~FCW4~7Ap?mf0q(oGK1F8sd~?ilz4)x zl_=xx735IZoQ~VLU6TLgsR@Ro(gF0P5XL0_m~z$GOXRHQG@N8O_9nz=)Df$@T*8Fu zKt!hj(Ljt$PPHuUuE!~S_?=LLQkeEymzA-1hSdf!Y?(WvN+DgasUJ(s2q|MG&9DuM z`$Tw+k|fDe0|zAx_X6BDq>j@cs3`wrdlrse8w4pzlTlms8g2VZ)}%Li11s4PkUO!; z;ZE%O+{wZ=sjzTW<#Rd%dk+^s_JG2!Pw$NkE&Zv%_Zc9poGacI6+S z05TK9PFQ(y)j&%11`OGjKPySE(=vZmA^Ukv{xCvd;aV3I6~8+YB4S zHm8}>#xRVSLkMkinmIIcXhfJfONf$A+l-u>^SR6^r-USxx|p*NqUdxXit4&9NnPsd zy53(uf4=|3>-D@np3leqK2OyNzc{CMrzKvwO;-QxM40@0e?eTS3HBXWc1YO+^}o`^ ziMeakc+JD#tqy;|ppJ<3zd502R4sP-9Aw&Iu2mTuRB7cX@9LUMq@6i%j4bnh*E)ZP zj$akmXWmeCQ9=fcM8h7QJOYbjic7f^Du{1l4kW1lBt5v4V_xD_c7cgsvaPG~q2-?V z2QegvdQ3s@rSkY>{~s>CL%OFsv-%s!OZPM6ABCzs6Av{{(Dwxml=nDF$H$}mCj5H5 zZ=D>?^8)Bekz3U3r{K(Nmz8mzQ?p||A_`v1W7NSCGNK1@Ht*LR(XBOEuYSiNt&Br}api}9dL1kXhObhPzEXJ6UkpMB8}O|N zHQ_pyUlbMejChKC&*U}rt@X{UG8jNbx9mytg0E2`Ufd$4=uo|_JISilHpOsg>T9E z5FehA#?^`!;G9mF31hWtB|LmA$2Hpnc|P=fMdR3Qb<0H{FIBS0mfjinS!!28!zyb4pE#M} zaKpM(dNwPu&SSYs9(e>>rI;ur%fD-xsR*Y^86>4Fgb*u2L(}baXV=I+3yys(Rg1cZ z*jv^1jQ>s4ne2o%Qn5{RFcj~0Y&^!7V;;7(J)Z$1D1#UWt-m_C@5}R_KoLNMDrW=y z*+@{(uVkT^2omWH$&GWC z-`&tmQ!tCmS$-Df`10rdYyU{6t}6LCtwGsJ}R2l>At=GGRMiF!YR&cB?m#tUDxmPuw6Nv1pjg zQ_%o5sN=RHvWvuQXkoG#1wo$^{!3G*(_Y{#kJ^j2#ry}S4zm*ddRh0^L4*RA$1aS-~h0* zl65(5vm+N{!dP$8Wk|=a4y0OhX!Gs%>VL1)QS^LsjphiCe&SmJa5;s1yGbDnW|cHu z<73z|>WfVBM%fv*#yC=SwkyK59MdVCfrKmBw7onu31wSh#{tJx+|bo^B87$FaEH<~ zM^qBe?4X;x%FVwZd_K}TF-JXHo~*~`WdyIn{P@0jafhf?TIueGd>I$SsT!(v&uNDi z@*y9Cnq8MXh%HoCB8okcZbVa)HSvP$(IwL-YI^5f(lunQ3=Wm9CdGPL6+)QJTl9%s z2e)9Gy(GcvTSNMdh*K@A`T<7Z>wnt*RCe*MRQL-IM9ItEu#bDysIHydG1yuZdN{8s75=N}M!$3RmKg%sr zO>JHy^ir$YPkyx7)(A1^XXa1_9GDj2XAHgb*K$Sh>n*wE;CzRr{Em* z&yQV`6wPDVCUo%d;Im4Wzqv3_<;!HAwd6xQv7sgVYO?X!ofyZ>YGTe-L0zROt5_*F zf5Jo!MV&YIRD$e*oDG)rxqs`1ik!uigsQv|q40go+p5DSXH(j>MrF;8ho|n)?l*Z| zvrD#m!vK9;8rOscMPJA;QprbXgu=WQhr*Cnp(n*vw7)n}6qR0^m}B50PRFLRe8M(Z zDp$$Kc5C6Ht`VTjCF_)&={d}pYr(fNn!T_;gL`(6%b zE2+ni6l>@c&Sl_{B3I+H6OL57jS+92BozloMuk zUERwI-hof1Xt*xls|O!BHDUt36Y+sv1f7%e1rWQO#Hd5=Jn6$T0+}<)PN^p_e~rQw z9DKaG=`K>$8B+@9e@0Fn1L?hf9_3R)F0e9|co0|ba4MUh`c_nd61pmycx2`boiT}j zrzjsRF+@!4dFODv2Bs!#IS?c#n=KDcB)Ep^7ccTi41|ZHhR5`5#nUV`7RDv=qQ6|L^|Mj+AMBZ_c_>Z&7{}x@n$&w>Myb71Xi8{pc3nz zcyq+oNztBoQTO!mIu*^iD6jG%ez{*yi16zNC*YJ`&RP1)Zy#r~j*Sqd0^yPMJ*>*- zxSaRGL3Mk}s^pjFVv#V@l(tny_mk^oj%c$7KfZl9J`~`udohf~bs9glM+jHJh&`>4 zffE~3mq+--VDXQYKYSM6O&Gh|mPmcw$~RQCcJ?b2#3~zu7fV(-;=3e?YhBIXRFiH> z8=TV_{cN?f7Bntl0qVIBdZ+?=Hn;bDoW(Ify~h8{1ElM6g%HoTev4<0FJ#}ldQYtv zyZUj4f3j>@y@MJ7J9N~)=>7@OHTQ>65mt(8^+|J9nHpb1S4JmZS6gt4R7`J1hH20* zv}EsCgopLX)a?q8bfWKJnId+@eWaLzg8tuGp)h~b8r?EEgl=3zr=PQ5GvL>qiqlh- zVy^&?dYH{Tc+r*rq74^~urTJPxZBoVyx?I zlv%q6%*8q|cwIEZ)F_9hQT9MQ;`!XCh>ybuBlONiX^AKlP5EZgrJ}lQwuB3ssz&-P7X6$-gB-mnEM_t5`F1tEM?|BV+lU4Kg{bvbPA2~Y2Pc_cv&GhIRKHrmKl#| zHv9AOx5Bd`xT1JoTWZZ%BF9i6r}xyt5D-(~_7h&v5wUXuWYIHyP{ie69P5O#X(p6O(mU8O2uw+5zCSBLOkN$Ug9%FwU6fQ2mQ43c z#OIF&LSS!-|0FF8Z@CD8rMKxzLy5ALXYgah_G^``A)oNWVr! zWB&yC$W^sxHOQo^2jHmJHu}k9ok&#a(`BZ+Q~a7$Y4>xh*2vHan`{&?59=N6Nn!hE z>bz=7pKdU+q1K^(z)Bs?{hgN|x-Ownk|-&kV_3&qM7jT#SBX$+&bbl2w0r&z*zkmA zUJ#&DRc$P(`tqSHJEFth%3y=|f?S}kBL!33a$P^wIS(r3%qzI*`)ZJ2 zyNw%1vI9giCOtbF#>((yHMSCkftPG#LK+j}3ahMVUM9LJgq&8FCPSE#EBP(kp~Te3SErOK)bOW>~tLpXoG)giUFLwt`QdK z&UYFOa*k!aJq4D${YooHq97VhMBH#WthSn+oe0A|wjWh`{mF!?sZ$)0MMDiZLP0f?n%qo*J%s(h;lFr^vmct^J@2v;?&us6APUDWqy2E*G6 zz^9cR!LQCtsC6lhZiJpF!#9dZ7G-hr8+EHXa9_-J8*93uLL#+spd}gUZ(v6dgaRj` zo|!_;0kU7~JE4bE|Ak;vCGs>hbk8NZ_cqP(DqSUXYhLz!tk%=Zh-qBQEO>>&y`?)Q znMAuZN1RzE=$9P=+9C)^rm$S>x%RJ`GdhVsVdK? zcC--zKMp;P8F+c=$@?AQFpJT#X{ML8VNbajFioS5zEqE|NCqIwxZ~DV%W6RVNja|e z(fZ4K+dhzrhVrwr0_1e&Q_K<$)*j(jKf1!q6XDgj-Ey8ZLK zA)up#kn(Sj*AMUL^3J3m%Qe8Fg;1({;GTv5Gj|@hSmdq|BLW81D&jA~&Gftcg%NPQ zN9|s~Dwt%-pJd0inf$)Ai>T2`?(O*+iHSvWn-5gEggs0_EjJr7G|XP>_IQ_VQuIT2 zBK859VokalI)1(iVIQMNSBmN5Pa@H22vqnkmkLK+;_s%_?5&|jfOA`dC&2Xubrjx&Uxu5;K zg1ACP}P#a4{_WaMC0rJ z%7 z^)dcDW1S{)?~qXIB?3#@(4tH>{47nmwnBMq;$niIdubJG!D-KXm*On^EwlH~Id|Ow2xo2rtj*@$HREied z;N&d>dg362Wsyz5x^zWZ`>#tWiSTnwVQaJUbJ(w@S8PJ6e)|M_rBqP%W$Rp&tud&%n8P#&$kQkh| zZZ_LK?*03bhS3?WE7Z?K0(vjKB2#;`-y%lT72s&f(Cuni)UOt)ZkT5W_7&ms?VmH4 z*h#=@q3-X5s3O7SvF6iO%`&Zbyb#SL_`YpJAlwm)?Lu25@(|DS#kGyuArkMOS9+=* z+O}EFLh(HC*cj~h&E@=vzhFx?{$3eHNA(YrLt0tEt|ZpynPsu0aPu=utE)NRNRE$@ zGdmRx`(hYGL1@Ay^wI|zXo{lCe03c(hj040t*L|Jyl}|uB9gCfvi0Pyo~XGaF7nB1 zJBF0``yPwIp)xDznYo|e_2ye`OUo|SXipu~)=@YzFsvybmK_JN^>X;@Bo13@xwPBZ zv7pSheLbBJMT0iVinsYBI(Rr9@&0CC!e+|7Mw||b6K7c*a+V81YvL{xf6S0}gZ-Kj z^2g_Hy2x2KmH6)R3knO=c84R=eGs0tspel^Xmbmr;?T|QT|3u>2PVQH%ouzl*ULZ2 zc2(G_q%&PkkNw*qdrb51OkjZX$LFesv;6J3@U;oWxZ3*AGvnN+_6&EaK6GYo4(VdrPF{4F zBh6kN`Cy*J$ju(sxv$~7d@j17TJc?4g4=ybl#;f}U8nn9F3wJoZz8snI6@yO87|>6 zYU|Uof@y?7Njk=825)EKXk9t#oS7kQq|5%YM{reSwK}hn&gV-IE{AAA*SKEd9U#VZ zjo?|s@9CDWc;>(s*-2f28EVC#pY9^Kltxj^;z3@69R9jI^rOphddyK@8U8GUJ>4R0 z1`awwYzh!VKcv86<{nNe`P1kz6+J^wSuGUXf}wNh_Z)K%Ug?6VG{(`LqgH6+KTfT; z3mn<`sx5S`j;na2`GKklyu0OPCBY4tah;L%3j<$k92%xUGFon&B7hxppNqE9HHM$68%KW?eR`y9%W$FSyXB0cab5!SAvI* zczp+3-ghR_DTdAhi`H(QK$=S1RV$yi7|Ses1KG7(ad3{N+|x ztfJ(SMpO5;03xb{@{j zqPn#-1dh!+{_WF?CUC^Z?VzT*m4&)Y$tvKmb8$7XZEp^p7Q=Uw81a0Yb z7NMa#C|Ffb_M&`hizQ}fG%194=#9O7B63I0P2UrV*fAet-Lj;lo$}triP%AtwiJ?dFWz)wRfTvnvdW9W9myA;BHFhPO|*@FeIL4sr&I0KkkKDM3#wG zQgL>`i{DjbBVv^3Fgn2{e* z>RU(OzflSP*Y>=a(0!s3b_vdPdoc@jcHF~drZcu`hc4s$mMZQ@3Mr>yQYGw6nZVpr zc)!A3%FvD0NZ-rAWWM`zE^*%6;|HVeg@V_m9H`a4i?|jjN@OIc8^V>QCeXXs{cFC)WZtMhs^SIA7P3aw}LoE)XH2=YH(=7f!YQ-o1 zYz9{C{odA&cP_e9%2QUOeaoqg;)m0G@A^FopcVYRika5jR6-;xd5Al()@COt!|1uX zt3@xRB#kNgpS3)HH#&M5JhSahgLECOF{wGh^O!b2T!BA17^YoSr22pFhX#qBQ;Os0 zTk(hBYm{^$_^JxW_)m{l- zH4&PsQFR1Fkyb7Y?Vi^Ri5|^(S}ddOyFpKinshuJZ_E<<0+7vE?DkyPW{$Lo{JU0Y za(U;lOzP)Z;ir))X;esHkq07G%Q@X=LgEeC0b5uYRi(zd5GhoXR{d%aveFVdpB*3q zMbJKE$=q>}HuF&%UlXZHhLcvXlbe8?40)aG7$+JMgKAcrg7=A}j4v3PZ-#{xRRWHT zx|0%`j4_&#Z(!h`>^y%9@1ng+^Xb@fn`@kq`^Y{MNU@Vhf?%SAIj)RV5)@+YrI+Bd zFIhp?8#=3$5-f}60?LK_Dcc$?6NZ*{&Ncg8c8C1#ST@|8W{mdM6|LRn4Nth*3V31g ztBSs;5-K+AN+0T6tmMGNX8BBrLHf}}HaA-|mpX_R@;Pv5XqlO6P(b6Hd8CWkiP zKS64xwTaUS*#1Fxx@L~XaW(4wQz{xM*e|8`pB)+=!pf+=frQfrjLXb>`8 z?fTr{fn@xqMU9eUQmUZ15i^>QwVDjhyPtC#a9$dI8leck6f!zAN`e&yeT`5^r?VOc zi?vTr*YANvjT9=+IuK(prt5>o>SQIgVzS**iBQxYe}2mJ94PSOkiN6wVYIFj$IPiz z5Dx-4RgYkRw<9OqlZo7H&&uL`iJ~v;5VB5|a`gTYEB%r?cK$DIV-`XNy9pYU&|GGC zy#`yERWtqWV9Q<{phUrmxo`#!ubPw%DjQ1G(3pd(AvGc2k%F5y1e8F@6~QS z8LX>nm3~ko*bfm7jp-hvcB?8jfbW_XQd&@)b6#MBuch=Ju3 zTSRBvr{K!;=aX8^yNC*udT`)+Gg$CjNX)KJ$9Ix8-`FQ%OSL%h2{w!H&|14L=Z2Z! z99n2XmQ;mv{z;aJ5l)31HLzf9oS7fybJ#6%28Q@C)Fg<3}&plcv+xIs>aMtXi-?2HRzcs>7X4NsTTwxU;%bdHAJ4 zqys3=b~CX!$BzurK*Q4pk3lKqt2GF<`i(VEX8BZ?RUPE1tY=!hMH**X{x^r(HY-rp zhDOt+KX(pTl(A17vVG?s#a2X#J9%g=a2fM*85l8BKvBAw&W-DuGAd}wO+$(iF@==O zbKuK>d}ijH+^L)w2zSPREe{qXhD^>JBxW%mTw$>D#1aqE@tnm&4!#k2^Al3#z(YHK zPEM7NvencpKTe}uye8{C-x^mYXcON&unZ)%y=x$>_t~O!&I08N6b`dvWKBZu^e}TJ zzV7=}6s_ly^j44xj>5=%Za%m%swMq&wIZ6ox23vUx1bN8n2YZh@e0QBV|zjc^?&3( zG>J<6yajn8Y|S*_ni%|T=y^Zm;yM|0H*++d!W^(Q0d@W^b^fF6NiZnu*~kescXwvU z*0?U~pTO)_;qktZREz%xRYTZ;b;ef#Rv>FxP_z3>N1Vdy#01&UetQ2wJ$t=Ze;$3x z9WJrb?}x41Cwse;-N9;->$LjTUfuy%os8??LEfs1rx8oF{SIm0b3@Mu9$CntLIWkN zoY3oGqNBw*srx;VU)C!iPb%IR{>YZS5d=HCq}>G?srO#b!c{JHmpr=m5C_aH`x7a5 ziSR?G2qQOR79bz4s5Z_eVKV>y$)~mw_(#D|-lEponT#5L3*Ha?M)*jBtsz*nQt!mc zvoumTMNnvAswfyg?%I|7%+sT1wVnFf#gHi1C#JoAg>0F0Ex>(`8eGJ#(Et-T=lybC zu%7gTsQW#I9-yk@d2jW3tMS8F->qe#ZU3eg2&epC!u-aVVt0Z8GX4wB;jJJV>fh0z zD1Oost$3p3&K}F>!Kq^RQ2F7^6AQG5+*009Dh3-*km%hsOfRhbEb*#6Rp@c!`uq^u# zQN(fhW5zmsF0W&*en!-R2hx5)&L0cN=aNVPAbF$UHoT|@C?8=se+UnAfFkdOjJYOv zb?H=Uw=vr@o6AOGzsxumU(uTQJQc>($S5t@SP`Jac(vz0Q#@I?LU?Cz6t4+e+0Ni! zkv(nxOQ@?fD)!ee^TH;cPfnbhJ3V%PrlMFnpSl-@L7*EljCRGDxR7UqSO04ZMSgXC zD&ksKnZFJt4ax;XKlYfPPb^kR^^@r0H?EE3UO8za@p*kN6C!!r(%ca{wMMZ1-%H>7 zE}~cM9_X8`?ckYU*W*;u`6K5tCCWWj`XDu9pFOW;-fpf)O$MN`woiIsAK&pLvvZC9 z6CYTQenDbgD>IkcGOU34V{q)iEPWSl0_eN@1U>7yO3*#a&q73`qP|v}@qNQFSI`p; z+%XV%F4ASF1c@Fzvh+#(2++i`v@1-?Unb<6@vK(mfpO1Pyu~BH(k&cJ$8L}=UcK!E zkpr5phMqAJ_NRY0cusT?DcG10hTnL1|K(O|Y_wt6%Y{aX#<} z@R!EF&h&e|%Dtj}agPR;KH0ALCm|rJDcZF-QMrA4MRBO8np0e&((yO_*;s62M+-q$ zZ#XYjem;(9!d-6nZ0+She6*f-yBWHue`0nW%RgfPM4PZjE1C;s^6hwK^T^3?4V`f3XRN@C3yG=%81;b>ix0qbWb{PN?jSiA`elj=!2+quE zJ?<<}DqD!F-CgCmP{H71Z>6I?KGi#H(mdJFf6R?@1sQ3oT1pRiNKp(iQgD3YEeP|s zMJ^zbB~n3M3@gf3x7_0x!NwrEbjS^krQ%!JcS3TrOxpI&(-Uzgv2m9rR(SmhPYz@9 z@ogKpW*>sl=E!9FekgzBL?r0n^ANcTpsz3O+YSIZr!S{D3OVwgm*1iHssh{#2n+7? zR))B43t4L;G`kHCq)FWIjx4$wL+yp2NEYHyQd_v@sG{P^JNwOn_XJcPEX-87Uk}K2 zMV~kDTI|;@>Z4Rqn2S-vzxNgCS(I7neI!e%Tx@|-Tr)GFA%Jm6p|`)N!rMpb_;~ z&c7%X5!AATXPni3)F#Cs|F8HB7LZ<36ejHvN+`Wq(E?VJA1c~+1>q@`AgSR+9V*pj zHVN7)06UbT?Dpx_u2b&Hs&=B}9~s#sU^-R`(5MUw&hp+wEf)XX!n$WG*RWbN_*7)= zV{j#p+wIQJF7(!Q!rr8@Z4b*S6~;AE0%{=8dt|jb{Rwq7sH_}qG zu!d+P9C6jDP&WZgpV7xXEh)(G$B=lspTg9jZVC%u9R}weV(5XJO!?Jg9riwe?gZs) zYXVoU4e#?e;T$(R*HWdhf3%>Q4hJf_nkVKBE9n;lE7r8iN6&`OsZ1Q0Vtc&WBdjNT z=ehPJcj#}cMz1}yz>uOI**rI`68SOT>sUL(3WRZ)A-}xgtz#vQ)f--}AJ(fJ0!;Wg*1>&MAkvY;)zPC9?Wj zrs>KkZNBNM)5LaL{cMKKnSb0{nDnc~E$P5-x2z>M(XJYyC3T!}1GhtX-0}TrfMeie z$t(21=%TohLfw0hcaZ*4WLVBg8uY#;Hq0cUjd7Q^lvg;W^$W=#VdVsC1Wa!=b-?NM zaJsV419KHnt3og0uO=~bv=Ns7ynOu-^zN;4YB2KsyTc;D)s!s~&4Hf@tWH~cTydV$ zy{1##_KQsJhABE^c^H4z+TpCiWi)%NQhnI<+T6KS{s{)c3ufKdx0kSRQ=`WnoRaJ_ zcnogiaE^a>e`ym^#ectC$^B0EbM`t!T*?K8eYsr)tv z^>?Y&b<#CZ`T30&PR0Ba1)k=~ivn)rRT1$;pFVlfZI16pax@3c=V?*NJIEoi=yXJu zDdJEee=97<(rbV=8?%N}JfZc8kfDf)RLEpPffUx-A?FAEJ(UEc?LSVfBJtT% zJ`a%m`SH;WHJ|(eMfUrKTCR;o&M()xP6cHgS^+u2>{gXvbU7F7p4lo<*GA~Sbz39V zR=WN^ji1IYAhGxl=r2FbBXViFa&p9xbM6fEk(T~bNI%1CG~n~;&<514QM1Eh?vTc> z>B?2%c77fr`b5r1d{?S%oRGliNZ~KfnS3aG+na`c2Yq4%!P%>`+Wx)2+6H$@nn87s zaHDG*B!S`P=E_?uGBlU|HE(AzmAhCibU=NH=^P>UGwPfFR~f48IT;(Lp~i*DvMYJ^ zXLqoK*)cuHsjR$nu>n$-weCzl5QE96XJBtt^!9_&Z;F4r?jhy$u0TIs#H>S9NcQ7P2HpE! zy*P4F=Kl&hQcZ|{3igA~nW1&WXE}+^bx^u>JROdJqcyU>PNRM+KB3mvLieOSkj?*| zcz%C`uZ(txsr$uh028f$nX5_d#Q+;5{$`mv0QlGKwLrhXwqd82s!w|E*$TDmN%j)< z6k!iUvfdy8yqX+P{NXyn3uF4jlr^NP571Om#FpOj2gEGM-i_r` zq8x~vQ2ga-S>`kP_hoY^KiA?!i%M$-W$HJ{gpDAo$)?M-_*a=NL#eQ;hdPY0UoG>6 z?{s+O8{4Lt6U7SBmJvdFB>x@8OUoGjN&)m5%2*!ssVQ^z8BmNJQ%BqZJk!xM-TEcg zcN6FAuaEPHb{^Rf(^$3XwLxT$nG%1C3d%xCy}XUhM*oC<9WAg7a@qlwfacKBUPoc2 zYk!BqrLuf~xg-A0rq-Q={f=ngASszbQ|XNK)EQ4Rlm9ypl{yCz;jqz)1U8ubGi39I zV$AJ*VNar7wkdwH%5L!{#r-BJ*C{mU=tTRkPXsv?Sb7>-{@FUB3}aH73eb za#nNVqOc2|4!%7r@|M;4hGBqLvlzdmTDJG78bc{*S)pGed(?^*+#8pfeDR#al(edj zhfZJA+RY6WGPEhW*D{LK&6*#cy~ZDkyQW*%v-;)-XRvNbR}wBP+uCDNKupc3s{VfoAY~8AdIyWF0w78Vebrr)kf<3E!xR=*RWXg-rngBLl zpo(;EL)(~tG)^XTLzp@Eo%M(5Ry$xbue{?x7mbJDuXo?gOVKV7_w@S^fB`q7`rhm^ z{&m<%`L}mtzOLrnIobRm&h&1JH`;xf#0D=&ZVaW4k1?$&;3tn0B>HOtqdH}KGuKM2 zM(hzPZ-W*trBImQ$D*|2pXzvB;WsPaB&eG!p~W?bOU>|Z&?@^ zY-yFcYNwx$Hn#noIJkT_;J$r_Yf8IdD6^Gl4Te5d>P%%wu-e77SzYGZag{%H6Dc@{ z%WT(&$e~JL!AB&GH`KgJ(3ck(JxMKM9zGt+yU4~&%D2IqQCjt7o>`QV3%hIGJBAw% zLqp5dxDZLOa=;G-?47|3Z4(JSUS)d{%dyDL#dtj+VHkom?yLe-4)*XJVn2iC_tyaq zKsm=g)Z)2Muo7E!1lPpR!3%33SqH5^v;B74SjIDK#;ym+PIm-yaUh*H(k@Y z%95mhCox?SZuxLMZx-2ov{P^=eWngkpUw#BIwDEpuqfD}QRASkQd6-)r@TlFe2u{e z52}Ks9H^VIbnE0q)Ez(Eh2&FyWtwAJZ*#-LDyj@4(J6+}u?w)w;Qdesid%XvOfp-1 zzd>?vfW6@pNJ@#kfuW3pu&;@K0@V;*UxS#8X5G;|;E~6;^Sk1RM(fi4 zx=+*(@P`sAv5MQphiWI)VMF;73z^KpIPrf=@DbWRBaU8DG;gL<@KwQ35B0=7j9N9` z!r5!3S#PNhDSO?BdCxd^B)OwL@Ez!&1Q8cWy7;Qp%NyU{PEL5y zcIJPMN#^IcW!C3q;ZYAvxj9tJ4~>_^K%cI+P{)*#QmO7TBT6wg0UJq>jVwi_lno>s zvVnqT%r_Gna63!U$F92-(F3oB7q zVMv9E8+AG{bx(x#1VQ9s9gT4=*urwZH-L_dyM;8U)LUZS*P{6RZa{R4 zyJ6vaZ7nelQ_n`}k<4P7(M1rdUSp@lBV$^R-TNP*JgoV#20V3WEb~^4MvZ_;&KZO7k>!(nms^KA><- zLn#w(7q?1wQZyjuuw|qw`I8j-tDoPV=t4E~&y8$_f8Eb6Q@dP0kf@-vDrp3lKW3>? zmRKcHBJbjseYYhbsI3w1gp;9H4)Yij=B@je)BV#YY#f)1BHa~PDf@Rr>ps%-+@bvL z71Al%9&T$#gA*0v~KRQp|f_D9d;4 zu*!9Mf>5?y8aNdSnVIXLPe?tYlo!os#SC=Dk(WPLpf&qt&7%~f$2yqTr@PUmPZ37B z{R_QWXK61?phyjT*EbUpn&rRPw8GEI07}p(mi0;i$2wIb%l@g7=p}OTW0L7H$Por*rv(7V@c#T$;b99cC&=7P{K6VM#-&hh}1UP29 zoN^mw#;tPNA~{SG_uHs4`Wn8Z)~3Z?CpV>SdiWFy)#RXPA`8Ek4A^j6H3+ZOsOVFZ zb`IBW7XY)G0K0LyHh7u7nSCW$7lOf|Rcq7_3gb580CW=7*jkZy{PsxrmKRt<4v4Sp zzk}ZjYc)wm{r6K0TV0v^8NFgEGN{Bzk0(ImgOVoW=7;=wb#twO%SUd zBK{WwRiNg{9I7<@hQR}K?z&YJtLWpnW5dZTK?71 zg(H`r_?!&z!lKSW+zCp)s$PNS4&){RqE45aaxq%s4*W2>`EVv|w75dv=* z)Qn(~9G#DKOxK#W6+YKxEHv|| zvQDn!hShh@{~_885Z_Ydo*jFQafC-xa)E6{f_6}5(@lw!ptFD^UfyrH;ow1(u&cy` zh9JfZGI3-i_VeS6mv{JBxPg7kt!T@*Ir~#%#^9Jj;|e|EH}GQB=)9AR+SwdO40{%6 zkPullWBP+03@=FmJPNTGgt#45EBDzi%zD#tl)o2rLVp%8%60`SsEm%j8Y2Ye>8y+! zOJsQ5u1CErBlwB)^3llw;>b))Sx3KJiC(li;s5h>%x1x(?@W!~2kzo_=yUNC8qDqf zJoK9TQyeR&;0<%cV{w$#k_6^iWyn~c#v36XI`2?)j<$QwV7%RnI&2BgvrSk@&r1EB zmuIR3;V*7qxts^&6zP>^X2^P_4LWQDb|TG^{Hs!D#?#OG{#vY?kJ%WHk@53}nBJrof<#?nA~+*ZykXA#LoZ=ax+LlOj$7s^zvP-4E{9cP4>(P$EGGRSf>`eb2pxPTgC}eO#Y=@|vy(t~nGZrW z$pFS?&Zc1niM#Upiw|TPQcYk=P1x%a2S5mhUpLG|j)BdfGez+L|{H-(>vPJ%y z!7F!>d-jHtFnyg^>=(GxzlfK)YB2oYFD=tQUiU)ekFE45&6Kwh-+^t`BmNMHh%Jmw ztQAGOfNt7_NR@y=8wsrd-b+gdc4P5t%gp|k2KH@3$IN6?78Wc`c!grB9;O!$C+}m_ zk>6%!x>Z(sNQ?!-%#iP;fG;P6naAZ!nXA$J7Im2|{%RMdivZ!3Duqf{_F|KAC-W|D zPHn`@%RavaIE!>$Ai})zlZQ&ay}LK-o^eH6oNog!8h#Xzs}Rr~adq&~6=+p>K;^`> zbS3HPkdlo?e!ZK4n$g^QYUwo(s_dn#UD+4K68#)FAti4(PeVaY&CwhJbTGnYsWI=4 zVqLh^Nf_qU?oo4>JFBU6V+-X5Q3M7-%URl2Cj)+BkT<4NTuYP5>~%o$Tsjo;#`J}j z%~Luu`XL*bZ+uJ+PJR#mTDL9G(p%o0$pkPUhjLutxF3lI3i#8~aC@p=OXj5E;g}@~ z@6e5-QP_jygK+i>j!M4Crh#wlJ6c&PD_5b_U%IRYKUcg;8O~DLcIUbzb2yFnyYk#t`bS8l_>OF+=d%KpidM zOK|&#V-l8r3ps?4J;C!v%wlqH^xSPPgF{}wEOsL0Br(RYWn3(yQBxPc_dfemSTw07 z_5AfW4Hl=0iN&U@srG15o0M;1 zU4;ja8+dhnxOKhAM+d?6u^yp`W$XNeKgqZzYig;-j8a+HQ8LWNWSXB~PJ8D2)6EyY z-ppp`5+3)CJh=CcDFMHV9wa^+^1rJKV*%T+>pU|+k5mT5Pf{eCr3l*M0h0LSGmzhx z1AahoNR3^#PIk{!eX;esF-68;=c0>8VAr;FuhT{e_X*`CE?Q>#P@R7~&+A_@r zP){+Omu+Y}RuEXU8RKy%CK6Nc-||P+u+hh}m)siug3EHl0-4=CU9?8ue;%-ho=;>y zxY8b=cwv~%>}Q&I%H+I*RupM|vBD)i$G_{>^nR~?-`oM2PVZ!Le*s*Aty63RTiO76 z$NO}ox+amjtT$50KX)O?eoZc!rk`|80@pJGhFOJ0dEF+5W_vQ#5?m*cPu=@v)eR~f ze|Q~($1#7wC>C`=hF1zHD_y9l8w2uETXdMj zPi*jxEY>AD4=e_h7u=A+jjdL0EabbCYm^w5#_q>9=%=BIwg9_Y`B|qF5dqU@3cSUO zA=k;!25pEzj${>13aU-Z3l__~FT{m85p5sY{F~r~&>kUwno!GKTwT{be#2(L@Hsok z9m z?%+MneRso6+q!nq$EmuQt2SnmP6{InO}aF8j{E?6*%oO3Nln{1^cITJ!iJ)Mw0S;2 zuUJn100R)xpxfUCEO`cFAmNklLc`v$SOLVfE#*m*cxbC-n9Z20i9m?K+Gg&riV{4X zFT6If+}TQ`g9iU1%G#B=mQkNGhBH6+?J$)vu zakM65yX&6pOSGazK zvZw-F=bR6nTv&yJi+VPoL)i*X+`TrUe%7tya`ogSYD&BcNTa9AIYamRjt!})@4UpP z2{JjxzKjZX^xhmj+tul<;%i(kzr-}7t-pU0hmw$XMOpH6illJ)#{#yA?>;jgv7nes zt{W^?nYknB53MkQV$bn^jMufXg-dM^<;b-;rPWnM_d?vJd8yqaH*UE;*TjziUe<=(^PD!>xWDPjR#9ew zLWX@49Yk)QU~w0H+}~6iCtaS;rWR7lQy${)h6;@)kxDO~r_7n^%d0Zx0i1=RZkZ-K z`G<248#tS|U>_>>0(^=`bd4e|Rzx((kzCc$D|L;I?vp&__AW6!oU6Q;vYXQbF+E># z9kiE<87?Et5xAjNs(rVSTWCJJaK3+yre=2{d!i$;ziD{TU3I-?0ORFT>`*tGj9+md zJscuo6yQatE)|0(`xafX0HVZ4@Mo^@^f19%j4CrUk@RYm`5Obx zJnU7=3DLNDD$Ku#GHh%s+p9meUgad)L$fpUdOuu!`ZfIWk@v2(_IlSerqK(3DiY2E zhM*&ONl~>;@Z})19~5bRVhk0+Ijn!u+Q!z_PaEmZm9kf>A2c}+39XUZ{m-47*qkNs z_`TP?&LTC?tkL6a2GCj+U|2=|DC8(7I4E{TqD^k^O;#)Hjb| z=XK*3Mp(fTTL#grELo(sFRQ0TLI;VQUtO+jivE9Oz4u=d>i_?b2nvb{h>AEuKt)`* zM`nnq-~?A{X1GUIu1w21fD89Fcj8`^tJ2nSZ_Qb0{Q}srz=r*vm<0ueAnRsLZJ;+x4-Q}ZXT^R1ky1Y z)@@mk7>3~mRN35^4MFB73-x8L5{Go2D)&N?L1xLX>J&e01x%J-B*+mtpB)B4D#~TS z2{EI&)rnSGDHYT^75dui@%dYuLmE{VobW{w2Z%1WfiH z+Xt-lEitIh%iCUc0ik1s3B@D5r}aZufm%Ux+5Pj9*$>VSDAuX~!w_|$590m}7zT?- zUb^FXFTq%kL3MYp5@6+pAtoYb#Z^G`tgxOgm`d(Ja#L>~FTlXF-4Q94se$}e!9srK zeO1t_5`qo2QII9k1;*Xjm$+?SX6Y(!jC zv@S{KxVrWjhgX=yO6zp=g*r6w@+_C%K@Np6BiBDgweAbI42pSUk}ba2{wa-Ti6y|e z-~AQu=qr{YdQ!xLApX(?y$_iB6dA{VH=`MSlS|si^gl;MK$7_#x}iY{hXW8k;xZFQ zF0|ofJ@D2uD4&N2>tB%o9T{1cM_O%E?O zEybViTw15YGWBgb!t1TWIXyg)%L4OKvgerAouArzJi$UK>Jz54g8CFf%lxmZR|N-y z(Uc8q_&k7a3R;LyNq8g^b!?iS6@@t92MwoRThy^9*)-Ny<6j?XZ0`)BWN9e&U6p1~ zwX|8pSjyEKfv+ufvu+z+=@H@zJM-LAUB|ngHS!^bhablLh3{~~ZLu-K4GfqE%XN@J zo}WCH0w3PKIvxT&cIDV_XM!{)Ca5OjKhNvQNK|VPto*!%_=9|P8*8kP7@!bXop~Jj z;BdFY`y};ORt!x&oI_-J+OvkR;u$KJ?tcCE_^);(d$X@RY@6K&yRz26xmdD1bM2$>_(|A7inkqWXIO1l+||y_RH+TkIYpjY`NKz^&iaZ-lO>sLlG5=+v>5q0ylZA$b+W%{?`xJrR+t52xn|9}u z6VyY}il-@g0a6c~=alDXkp%r}Z{7TY`ayd*R-j|sXYhl%xmNsyRf4h}%&!NGk3y>^zT1tO+9Hg;=m_)tZvUq;2 zMDZ>2TIXW6P;QvjSH{bG8(Fun#Y@uux$%D1HiGgf3V#sjGYWkU>|2=F3ebUt_+^MS z%udtELY=htQLvJu{PQQYkAK!Tejkba@RH`q%fxS-zkR2#TUu3@=9`M#&Qbx`grEw2OA zdRxdOp;x`40xML;74#LBMFHrALT_YXJ=mZH&kVMmue|sbXo+}U9u)9>S;I#Esfydx zI@&uAN1QbD_M>2o24Gqp^m~ocm$01YU1s^lMn}Twr>6o>0IuQsCCVR*gFDb8^!9Nh z*S%+kiPA31hWdZLqD?jjZx0gte+DTwek{my{1pLqyZ=_vQtRRYCx*5-V)t9-KTrQI6($T)10! zkg9A@C;Ec#&SYMND3VaXRr^%m5rj{0dUs=_K_~GoDd9bq`bIdzB`zaHWQd~^n(!k$ z;H@=l=vdd{YJd@&3JZ8D(%`ktkb9CI{e4fvFf64((%4ej-$*pL0Q8(1^ABXCKwL>^ z)4hzA`J%&DI!hk@9k^WTp6cB9ZsRTQ4!~JH{B`M@FdmXb_V`n~{TaKI8e z(;%67XvOm8L7zn-fF^-2Yp!&mJYU#|4;Kc&tV8w%6BN~?efO_rG8?nG*Xm+4iuJOe zis<>xgdf&^nl{K#YDIU>-zq9Pm4PkHzuRUDFbz(+rniZ(eq<}w{c4luIy7;?x9s)R zdjxOQ6Say>S%`7RrVKTKQ3J9OOqbsInsXFuZ$EIZ;XQ$u8U*c-R?xh~wX(ViKDmTj z$hf!2kUDKeVGx0c7saX5vS{hIPmjsk9l?wnzJ@vI$Md{09(*Iqbcb~@S)75)>~^IE z5iV|F5ICHh3bUxauPdeFpzgJb`9-S2!UpK0vCCO`;t@jWeZmQpG$FfwF%V?^B2A98 z1ZS&EvQ#Ex-+%q-;~z8A%tWQ%dW0t|ji*gx>mJm1$@gTP4~l#+!2~A%hP3QrQx1?w zQ}J))pK_xT^1>9{d44dQKU!4ASE`p@SZdb2J);?kAK2Q8LOu%`&qa`xTXm;hg1mV%=P`Xoe*vHqPexO*@FaPKCh$p%eov+86 zg%*@2C7P7<9T9ZOG!KB<)R41DHkTEz+GhjAu&~P?uub&0ghFGkO7w(zm)0tw037e$ zvz<390tOliSp_tf8524DzyFag1f(hnlIWnGf}QlND|--D5&Nux4lH=bZDH0WB~iAy zx_GM@)u)#~FJlM*k7+?=SG3l;wAWBFzVSI5y^baFImd)MPH*m|8J+wzlGNH4SgNBe zWvxSxqd&dpt}eJVV$_{(%{o?JYpCu_%Yn!*dKc8%&DcfCE7v*j!nadx{ zy6KwbjPjAe8>UQ@Q(Z6s`7-Ees*94tkHj!CCe>G}*ds-MUm#@$w07>Glj@6#`ukw9 z@Q4XJ#SbMm4AER2dyRJnStd|&IYwcSaa35UFu8zN# zFfap6O=Z=_=Tw+5rQpJsr&iiz+y8i^J-(cTHCdRHi9cTfrtbzwj`M$p{LBj0$oyT~ z=)Y9~o#NJK(*$!iNd82l;1dDc)+Uq3Y?CF&L4R|3$_joj2{Yl8{gM>Ii5k_uvdyPW zn$~rDbvuXdGQ7D$?PV62j@C1&d9Bf`yN*nVZOh0y2$U4D)MD!eEwN7B@iF3oP+eom z3X-dfLX2@3phsV}-|+qBq>y_4KSvwW9_!^9QP(m{KD%m5ldX;w$S)TlmvoLHPJBOI z<{WHuyd4&n)w^HU$yhKJBHtb4W?1~I2xP0O*c6*_fkqQ0%x%Ca_z5BtfhzG<`L`d@Q{iJ|A69;IXM8nK2OeLF7c zjDe2#wJo(7v@g%>$(hS|d{Kf)~~cu4X-Cdp68#TU;YwYE*=VCJxF5 zZy4#6Ill?pbgHMybcxAa-G1t;NVn7qOa2-vu9Z6%58L<9o2g6zv<^}TP+_a|^*sx{ z@3mAbCGk#JP*mql;xUYpV?oHTK{y`#60qK&eo9k0RjZ8pj=x?W(veNXc;?`F7SG=E zU)4JSuz_NVG0>h5b;`+&^DEO0?0|r@Ul0LWHkDBV|o6k8ZVq;v1F{p?0nfbXhd1^uKF{kr6!E%rxFE5lSj9X_} zV4*SCwYLI1uNu&RUfE|pyyB31YdCmzfRp9?xwlLev|~zm*tx>_%E@XC${M+b+XL++ zd(Ns&MzKEJsMOi6`p9l+OwBXSbuF_-@62|)2#4ouP^^T_!QUMVAEsw+Wq4t%02!zW zq!`z)cl(O*tzkRo_6vNL2bo*vHj(Df zcMe~X)xT`9y72BzMrcq|s}@Ro5uI91=tP)kWswv9*Wi0-m6PAX{>R;kaoKK4DwY$O zZQ5kR7|~Rb#(J0Vrz)(%;6YdK9 zY%jfpKlPPhX7nC#`$A~AOTZ_uAuCg(Rs41zt1J^6XTu-~I(Nv!K|v9CH$K%{C}md1 z@mU9vIyj#EQ0g&h@Az(%Kk4F`|JKD+n-)?nLJ4V{=h|<85t=z2OVRXc3nPjDO_F3c z+=yAx*_SjMqN*Xz(!z!XUVBP?uD2A)f&&=F26uB#@H1dUN&I^M9PxBv^r;8(7r!68 z8|lg|BmGcwqL}25Jva{k2qIG2)NwPN^QWeg zMHD5)*2(<6Esod)(1X3w^k;OLYOj!UChscw36Eof+(LwvM**f-@WbtpGwH@?10P5M z*weuGQfK*yEdA9~O6f#Dbj!)5S@((Tn{`9nnyMe5WuNqwJ6V?D?P|<390u4Fm+A-> zzHvPB&Xd-bHx~VCQe3K&lh3M7Z`aM7;ZCD)^Xe0c^Z#xLqJA2F-akf zmJRC0l((UuhX2v9r_d`CEfC(U=*!`&+*9I5s5Q4?7k=*2;=lh$tIiap4AQ>0EP>D3 z8N;4vsXR;dRVz#~lyOt>r*sSTJ@R!UbS?JA*tnNCeu>N}GHV33bdOMXEHlpi{Fp${ z*=`4b{#sxy9u^Md)+Z%euyGs-wn=V_!}efypP9*2?L>&0L?7VsnoT|nj}ZyBtm96T z5#AP@oa<2^MCNi;?X{7Pee;vU*(L|XGcarxSTl1mideLMuvC5hM;~1Stl^G6cFVIX zN>#(L1QS1k(3Cx|QX_(InQSj|Cg>|}8{g_5QymrM9bGR$)JIwkr=0s*_K1TQYt_tq z6uCtdEjZz*CE!fmpLnB)>|0iS->6S%G}qRjoziPW>0pp+kG&TMgdRGc0A5)d!A_WG z=2|wLTQ88Qk@aaCoDb-%uyaXWhJ9%0TDI{+{Pt1)ohq~QTKp4seNg&b4ti-m>TvM3 z)xA6y67~Cw(HXUi$CDV4Ff9*Tt*adjcIZ1XI=lE;qSgo&2NgR(9U3$x-PAg{Ve7T7 z4psd{pC;e^$8_FaMgcV-!>P{(4qx+(xYVigbcG~z(cG!%-l$bW7P=Ucd{~?R7*|f? z3wdeP)+hOf(8-L81-wFq%cB*La~oy}#4M&k{rg!%lHzS{hP4_5DE_H7#UdsZt6B6r zDLjx5BY?1Qg$vTyx^d$`1IR5wa1SMsx7m?5e0hZLL6(ZRnPXrP(D+)WsJAS8ZJKsb@t~36#EW zOtR|7X9@o_YC06_p7kPY3fdg+>HMXGYfT4?>6J)rdIYL-)_QGw3Hxn4((^R$5~kj- zv}nHMwN~WOIZsNay*y=Vl?l0Xie@Yh2$*6a6}jo*HP;+kgcg*Yu8`M+4TjUP=+oPW zd;A%QjRD)%7?baxFJQ*2ecV#D0X+h{nQ9E03a?~4@dpwXi>ZNm$aJ8xb=dp5v5RNi z?``G@o>(KZo2FTAmL{Y?_Bn!dn#M^BVP(LPet-Oh&d2?cv4z6yI_65v{YCRlfqjR zWn5=XX<1$73z4jB_s;h&3^9{QAE(MesWaI6>n44dR@DirIVC+>dk?MIL5BJNe1BmT zm}W0HHhb`RsWg;3nJw9=$n3IPz_>0k2`uS=8w2*zr$pHJac`}&;BoE2^zCW}smHVP z$F4RS2vI1x28bSGLC?54R(Ml23&*|g+mfsi4QxosA2nSxk=s`4C^>+@Cx3P{MeNOw z^Xo^GTjX%n8myQaNa2b1#I|8MWPXxnf4R;5L#eYD;Di}TLpZ8F=Y-?k2s2IQ+tpv> zY`9@uKAUluQzK8Dvk1^8{va^gz2p0}Mi=7X1hpTldin54mBRP^q1 zNU~d6F@56W8$z0^EoZ)N07tk0{?S=^z;^4flzV7X@Yg12#P^4OL=-aY4e3g9HwCfN z?$&ImBBWC(6TKiVb?jY30wEcabsft2=%)8MuaDg@cZ+95#}ELRzznQg?zE<~)<6FS z7)0Mh+9RAq@>ik=ch9_wIM34y%TqIXNYf&1w;!v@!g)z_8A@OP=Ya!W-0g^o?9|`h zJT|w2HyB@&z~h!*bTTSYie>qN5cPU04@%Jp#BQ+UE_76+tnR$8hsG`%|D8N^%Qg2D zbZ78@B{J3{C)TkNCCZ=R1%{D~9D{_tK-#CX_cx6LSHTyaTekTGIWRi?2C;23!Y#8x zj@ThCbaLJHPHxN#!_BcFRD-#48Eu9)Oc91z(F4%US%D{uDu|P7Uw{%>*-~Ldvgi8| zYdZR15I%3eX=IiYWBiT|iruii?(zW`fn|dm;I}&vXG+8p`ueXa_>c3-& zOd(Z*wFXSLCGI=ZgX4t_0uO5ouG@Te}bs8*Ir`cx7S9<&%*w!oj2j`?fCI0T{`UW_O6^ZO^r zn!U5q(#MBAff)ymvx>#52j0Fz2SFxLi$^L;VWP{t^d)NQOVj9^^(Rr9psk@_;rHTi zbJf{Mm|d3h)ZR}_?^u1aR7=$vZ_&b>?oc*xZ1HFvT1$>5_a|Z_r5^z`x&?$-$Q0&^ zbnc}gik^sBkwz`w{maXIO^Q0JURzx zY>K2|8J}-YA$*HsI0lVQr__*(hOP<=<0?b?$0e;Qz6Hqgt87DPuJL{a21=^u7)JB}IbvdzX zT>quHTF~68#utrO1=q|SufJ<7czO4l>x33XpW|!H@$o#9w9v5HoC%IfLG&QX<()|6 z7A7YnH^XcvU{VDT~0W*Y9W5M+dO zi`Ujxu)@e$NU{9xR1}J!kiuj{s7PqGY zBs0v+G(uhs73_8EO_WhxNmwO6mWG>-xQ!3iYt{7G`8x>#&*t)xu4vLJh?0X{fqDl3HG#RK`-Rc zu{l%f)D)0ItGKNotxfbc$~`Sjt?ZCjxSQ?+l;XjCs9!#CTfN)$8wA1J+}ivx-VtY{ z4s7n*!8Y>p(1W&Txb((-DWYzP8@|b0j|gzEu~s`cve_7!%{5>fJHu$@dy|dFmnsh1 z)q^2AmYXO*hiI3pEdPUKqXJuFv&EtkYq3G@8ia=Zxe4}1jnM~l9_up_h3y2#8DW+* z>p0-f-Sn>n<}h_&!U(Wa+shxBueK4D-H$w^laLPpgFcCmqA&Q2oKp5~@`@jPU7HqT z`g$GE=Gg{*J5zSf1i{kK@ylhsj2BfU`?apSlhp%JHu6tuowyD9@N9JjVD%Tz4#A1w zD{5Bo30Hi*Nucdw)}=@ql$dB)uy30+rbyLzI>U{%^5Paj$e_Nl!DGE)Y9`KN_gdz= z{qAs5EixuyAThc=z-MpMPPf8?lo8Ks@5bBS+_aihc4fs* z&gJ-sgi!kQQeZ-wpFde`Sj|l0bd&xY5NgzRY%uhlYQ&^CL;3-XV#OicQ#!+6_{~py zQ_u)R*_i|09Oa+xzAi_24VB)L#hMP0dJ{!vZ7IQXivF1g5y{8HrIh?E%xGl;WaIx3 z!>JLRitzpry%;i$nJ*_%yZt%v1JhPRnAP$S9tCNn^C$t)b(969*$_Lpct!8E20Ue- zP*AeHs;FJEpE%_eAy*&20&J|^YZotaLZ3LlSX(I9d%;ql|DiGP)h+9*I&J=RwIE2) zx9ewyu^$-qC*CO6^co^x-uEMT5Y2_9N(+%{yup@bm_Ii{V^&qmpECku(x_kH&| zs*u(|Onw&5Rk1p5KNeVcu~94dRaG3nI~?~|wW5kCeq(Zx0*xXSdhyq1MR>Bqj4f+I zR+aTB&)n6^Ik^QTmnlxg(uERJXJkQ~2eRikv}2E#jbtqg5cWd<8qxv_!Uv>9=ZGaQ zm#H^};jJ*$fC6n#yGVb1()4^gTTen34r__AcGI&LKA3Im?MO!}-LQ;YOzoNhYvLmA zdiOgEQG$?x^J|{1cvZRc^FNDh?+~P6_qSik8_d_sp@_0d+hcGS-K^6D8xB{u?ylYC zO};N%#0^lGb|H+iEP9h`R2$M^2yU|{`5)V+8M=!F;InLfXIMZh<`c5CTU1eFz-pEX zAZt{J#lcPc)KR4W1Rt=iP8+1{>;2RX#hJ{^BYkJQ(q@pb`+6|zvg z3QkI*7^Ch~P+(GwT;$u>Rw$gfgWJ>iTPzbE`8xmK(*btFRcXxw9zc~p9q_83i5jio zJil9Ue`9*BnTN_J0?+^k;RXe-!fy3r9rYk74b)2sVZc>}!n9Y~*Ya2TdatUDFT-g+ z{~DdWfu7I(*F3qs9;J-*18?*JMy(mgPF^<)h44pMggUcz|5?rm5wD+X-XF7~mRVL; z>&~S)*BhSh4({3eltL9%HsK5!?LbpQVcC0#OElo)n2pc!_AA=8CH}`{FSrgu#E%E1 zTGmb6>w0M^`ai=RFVUj;{ zkfyukFV(Xg?_86;8ntZ{1#71qd1_z{HQB1N>UymN!R?y6x}?kvC?IWmAZRFLJCLp# zs2%&98E!8Pd||J18Q81WU@gOlZzOgv)zYwahANpv=6$VPb4%-IHbAbVgc_dsJ+1DV=2am?-tsb$iu^_iopTdt+24 zK6e4V%W{5@MdS%{rP7p>I?Ku2dE`kE{qF_1@5$N5BoVzgfd^bW1w_!0?{*dvZO z{=a(2BFN*BTAI|5BDn~3p=L!lvrW#PJQEu*U zZwD2F@a4{xX->4gp^9Gv5!MAea-+(-PXuI7D*{nfb?Z{#xaLfuO7L=jtHJHutdKVV z+vEOSc2#jUlG_FM!_rOt!fTEGmiq((#{Wi&z~7@|(d;p_XOTffu|i@;pZ}K>2?Uh= zqr)pqJr7aM5#mHatj?v8Q|k!+rf3}r-4cWgIq6dPi+-}(`wl3%O{xL+1`sK|)L!0{ zMHLCzKiaY>bS{#NUwpxOt}S=BCT!iq1!+PG>?k9r<(1sZx-~Emy}^0KFz(hLQ7LPA zenNP0`!5CpaN}f#2|Lva8~L=%T3mh)4gtDQ3VWEn38foVw_qX;D;sZBZ^B*H?qzhM zb;KrIgOHul&kyi7jkrTrWyO1?RuRG^u^D71v?BQe#(zEag7kxk5AJh&{_P&a-v2(K zADA`=80(N@E(JAyQc^K{?|Ta|Ip|qw^lg2giT^YY3Jgu+!$#hZh^M`IbAlf>$CD8^ zCY$@>yF^Zar)S*tGtv}#%>T)J#4w7=I*FU=bobsAcNr6IM_oz@-G=ZLl3Z`2ndgep znpVVH@Uofgx{EDys*eBx_MI{xh)hWTCKi||Wn_+4*LW(WnI~yF_08!t$2frJ%N@%W z$^_THZxqu@ot0PX;RIQ4!prc99)6JW`QRX&N~^bH+8$ z=~-%w7-?00d{ZXJFc#V7$jy3o^JMaJc!KbIG#9oP4?hGuytWG#Hh(2f9EF!Cvw7e; z5o`9z$R%9C7G-?~pyjq5UO6K5I!EN6w4bhTw>;^%`<@~bs^RV^K*$Zt74OKBl69z~8F%jPYhznFZ^p|nk7Sl_9 zPN&zi(8fFRD&%SjaVurDu;Tn=IsHJt?H=OA*R7W=Qb( z8r?C`yE}_ys%ebP!!l>dO1&kqzrxgXOC+T1JRxFV+Fw1+eMyL#?jBu!ko@-%q*B&q zXj1kX-CaI3Y>9L2`O&Qwx3|FD5=YBR>u=AC@}*2s;EwP1UbeAC*UMn0IX5+NWXKCI z*-wLlFrssuX3WSyDFnFd`}tYsoV+VEX^$1EF@sGOPEahXOIbpTo6`DXnzO6P;(A{h z0e0d~9|@5hWqCOL(z_}i^b79-vVbB=#ELH2Bk=zT4hljDt-rD$CvL6Yl|h?^6fdPu;FU5;jgp!d8b;hYfu!{tB&(Z5 zvFzUAfUQj>BH@PWBsQ-K8aFLQbCYj{Wu6XgxE2AYK2xK=f6qqti_ss;zB?!&On8$tgggk650Eu{=_-e+B|A@k+UQuk-z_E%lNl(`~L)cJ2 z<;9t~oaB=5GiFjj-<2v2wgL?t|E9Di+q_Nd&KK&lNr;<&rt9T_tRs<;B3RB9+5Hcf zKOfUQ_Tfo2``(|>8r0I-D{P#aozihAXC}&6YKhN;5~AyeT37S(ve`n^;pP>p;@^@5 zR=lvhhtgY~uiA(VHrLT@{WWPaFRNKssGK&f*J2Mo{$Cus_Dd5@nYq$}5H^HXm{A4J zaO)f4b12*K_bN1|y0e-~tnF@B^KEpQlz1bFYU$oiV2-{f-7x(puYa_wK)WLQP7PK zXWj}_>h^jdJUmn4H&obL{#O>v%6^7vv}rYeHaUYqxKd!UUj_-}e1CM#E?^wNdG_NK zH-7X@KYDH;aY#D#?2wks2^pA8&{?XQ26Dyzfc{(;{37MNW0;gnrI!%rQR4VasY2w{ z-4R!L+c$NDevzpMhMLUGNM0M0J+Z~jgvU8Pj?tg1Ec1W9yR)|AqJ)!p0J^2M;8>bx zOX|N%E|+wjt1>mP?Gsz=5_dtv&b zvc^1TR+s+avy9++wgAR;5}`>*6@kcvtrS#R_W`<3HA}Mn3_;$CWehrd624La`O&;h zO;xCl@$Qi$-)yHdwRYe}p-v^|_Me$K{@Ml&r}Y3a`!~9WXx4x4ksrAV&vq8-dOpBy z2QSo{P0bv>lg+Ql!O?5@-tnC;3=MC8Cr%co=T0R3Ye^UhiOw1MiA2aA>kD zv#15iogm9(CQddTq(7D$`xKY&1ql+E*;II(-Xy%T0vs#)h~v%OY>Mo2T&@`WnAz#o zPyZ~>$|4{WE)FRfcG9pT=Z;?hnQcSiCwQ8#8-*AnRd~hY7OxGS^T#Q;ue=g0YqOyD zn&P(?i(B|Q8@A{ft$e!kl4#C7iq}YR>$8lM9T9F%z<|AQim@_#W4M+Hle8UR8@xL# z%ur%n0Db?9>}i^%R^mGx*UqmjR!BYb2oHQU`3o2u$%_q?GYz+GMWFJM4UesG1E)u>yke>ppx-*T zrP~`0O}T=cMHw|Qmq2Ep2D!i0ykUJnz+Fah@4LaZo&NbZMU?+|>@S@0>&SA#-G-RG zgQH=h)iW`N8LETK$0#5-_f7qfRW9*k;3%G zwmOvO+u(j!*NqWQI?L!Ses|TWHT=a2M&s@uASD7&{z=PeZ)W|GZymkj3 zC+^(Ysx|0TJk_L-ZmELIm<#~q-1Ob|l4iZRmFgKrY+tNZ#K;Np6^Fux_%)Ww zNwtYzGQk;P7M3;gqurwB zZSTM+b1P*?aL&?8Hl|*?K-X4=Q5qEeCti?nZH=o}O16i|%jN|0Ztzm@K93gR?LALV zjnGrm5{g0zflY<)|ND7-g91=LX$>+K$Rab283r^_Vg)wP1{JYzqWj2a03!R1{emgC z9hCE%=2gXTxlL&kp34xsyC@HvmY~?cMH`Z#W>?c-fT6N%CwgRC9ZF@w39D$WyC3ZH zO(ieaRmte@1QnI76E-QPk0#aXj@A2qZgHZ^WtNTD{Wk>YPx-|N^gq}6%U+`^ehgo_ zUp~d#eUXtRTmHITtxifk9tA+2mfK~U>zX~&b1TGJ*IKnBRi-b8C~Hbt>XaUU)}>Pr zKJHJ-8$S+YhAS6o+YhIT0zF6p;76+O-P3cbFtsc&Og0Z+tT+h3Lva>N#j~%L;C8q+ zMTetD*z}DzC!(cxIGM(Kg(XER#%zNg^}subO?ZG=_otGZnq|m696E1RQT@LI3pxOw zEvpY5iqh*IaIDAB*K>x9B9tjilhR^VkTas%W$K>Uy9700xwH7~{(m@RB?A0tbGu0T z(;AGhyY@F_zG160>l-sbb1x(ta9YBStvD72qYvF@o7D&iJQGwc zX2+36VphaRG9RO4 zMK6`SnH5vkFhW`n_ZJNrG&LK6sN!I`)QN2OXBn04VewV{UxM#!`g+;%#GWD0c5%G&9ARAH!=?;0*4R7MRh~QD#sqwVjaQ8E&hV zqy0T{5|LeOZ=+`DPRS3+l9X7=wKWd4u_}%-kI-0z(oKD|?z%rrfe%ieIa_E&PirWrITpT;8cdkWX<|JO zIeJHacSGK~U#-?mCBJy+YD8~?@7KMJLN^Sq^z?o9QwW>+;y`~QKycTbO^HqnW7}o{ zyyLLU0bvhOA^Zu`NqoRa2?`y6eK9{J-WE8>E)Qe+JC7Mv1f(>?q~sNrcpdfgCPe*< zi+=^FD&y>^gPI+^EoO^3!BAX)sqt1Lo>OH!VN0~8wbZl%RBIva-*U=0hQ^=3!;}sR z#>o_uv6(W`@W@mhK&Rf%a;~@vQk{TkTx6sXi7(52dAEnFbSC&mJ}KRSU4FAb?P6x0 zqVZMlPtgasXt!UjX;WZdJu$gXBZ$#@8>f9SK)&0ikqm0Bdo79qy`%7=)cu zBduXe%~CY@`CGNPTq8f<)jg@2Udjf&gOvdExmCCqw~p}tb7rJO7G1tzLvj}+2#Kv8 z1W~8#0%Y*3F9fZH09t&e#Rsbxg3>k4dZX1Zilrt?do2jEw}nB`801$f1M2m;=<_o# zAfxOId?{)JWuSh0^`wu~Llv#J^L~=bWK$u4yQbtr&mR{yD5kfRq@+k^3BDYzORkX9 zo|mJ^OaRs)a=#TzWM$hJ(i3uAA)6xUd`DXm_se+xAXiYeS33$jChi{FM*hN92Z%!Y zZ704Ts4uEGGN`Gaxyhm;?9K_!-@+?Ung^dE{js zWL$B8*C`4UnwxQ6_XR7gs2G-$@nCI-ZyhjK;;-1^RLtD0RhCn3Ncd9hz^*g;9|bAj z{n@2SiW$_|Z$q>05nYXF(ZmfxRo#)@1%oRtehTO9Q1f~#4EKKPSCRDA%WPnM%xl|B zi_bZ~W?Zn(z#!kz6CbB?Uoi4*ieL_EqY|sWUMRVf>pTPQ@2f?m8(5TjeU2_b9lvb0 zD?fl86?B_+`Mq1eU$@?8|IdClVR6?VmV#4@PQK?qV-Vma(rp0cjliV;#i4yCg=KJ1 zC#+1Y?48pLc_BvxXWK=N&RX`h8Q^ulE}&&}qhA$?zjPHnZC2eUBmNDiCj zoKQskKpY55YS807c|S%rH}isLae*a@)fVAyPaSlP;YY!z^;=VQe>)>~(BAohIVjm?`Z4xPx(kT? zfA!D`sBAAJ4FzJ}A?RH>98bGz06Ott`VbN-2T%$7v{mZ<>I&1xWJC@TUQf8* zuP&g7p8aw~KI;n$ARdXx^=&v+ce=q~14LM$orjUY@7R!V%2QM|bYmXScZrIxay!Bl zppvZ}41$k%)mjM+9tPG2`bp%zWb0g|9(Dmbc1qURR4=mJ;hj26o-PmESTt&2$P_&E zJmRoFd*|lcwKxVM&evG+ci9sY!nfgKxi?{}ZiU-9)ymC5*YJ8{FQ+0>+gg~15PK9n z=*k()3o2X5hVsY-&o_*Y~Ma@vDk48#WgbF` z=}XULWs6n*Y%o`Aem0y0wkCf^=1!YyV)nF;r#mdkN>M5-&>RULxVn;OcfkbCQ8glL zeb8WN7&Jk+#6kL#_q_fG+AENa%E;y3?_&W6=b&~F zMo^;Tgxy^C)ps=%bgK1$+~p<3$%2wlMK0lJ;x9Km;H()DVe`6&r+J!NkfvC@4a&k= zCEfaDm5tCH==L0}3iCeo!Dc}1mkUzNdvYVy19SFlPhtm=%8gR&tasSBQ_7f^;V|j#k7{ItKzn^PE&Nh75c4 zh6hB)#DpErD8zxW4cT>o_U!4fvpbdFhmo87lC3_VrH9gAjm5 zL=pz08NutDpqH-gXHC_xt?zg%x1bq$FEOj);~MUW^IAWW$OhSg7Fj2WDFAYyhZz2i zNR0H|U%yC78>kjYkd&3^h}DnW2H9qlE`^(tOzHL_TE%u>1r7xiB~sMIp;iTVY!C=9&U5lH zthZ5s$|=ZfeTiW40ngq~MoCKu8`-L=c*NO8D`4aZ@>3+0D4G~o_$L!M`4-TjF}K_3 zBNCY+O}gereiAY&@2%(*P;nbjX-;VsISl9>JrH@p~% z{sx~J_D{T(%vs;1rTluY32h|$x15)rv|5iCv?tC#wX>@t665|_$7EVt1GX7~A5znD zO*Vxz3uJSa3M=l{6r?*r3=!*LtR|e6@xkGu>hJ1skx{dCFHnwHJz5%=>EqM z)}Fn(VvSHmFRGBp6;yGw+bXF#S>+>Ch!Kjg0a~nE&*;5@kC^1DN1ShUEBQf)DFaDeo`neT3AMn82%y{rA&Xgq%#~ulDvi z=zT@+pGx(}52DBIZhGkf>eVZ=&a@LWR0K@-QHZx?Tyga5IyoWXGc9||QAzoP#HNyv z`yTcrFyYZFZ`o$XFaGuJ-^UL?qhpDdTGwZqdCMkZ7vc{px}nvLavQaS()|uk&5b2T z4!3wifwk~E2iLgIo3MAXzm6Q~!3PEnN@SiLAVlqa?~~fz(-|3UW0Sl$xS@Ap4&&xm zlbj7rzwJ62=pyjd>@lueW@Ph~g*DG}vL-^yx07Z7O|wLPtA!G``P~bPtH$(_ZG)g+ z84z9e>u`J!+7$2&@D;gmOGGB(lB{0m2wT1mD`JXFIe;jbNIJn}^y}f0jh?z!B>K`L zuy;=^)6BLHW-Br>=RqM4;%J0nJBDozXNZq}O#M%*bILPx{899IotfbyRzA&0%1(@F zE37OlJ17R|!m^*%qnmKP!@D7GDlR6V!wN@l%bT$8>df%Tsx>B>P4?cxDS^P6!6r1~$P8&QDv z${W)YuGh0w6H*zdGHVF+Rlr9PqtT-0S)Hc@5w!uMv<(>7V*iyw5!A0RzlknMITi7` z$>y&)4H)ru1?acAq{b`Hbjk+!OyczxZo3Qe?6y`bu`vbIYoZi2(o&3nO_h806+#!a zUPCxD*bLLZlRfoxLu^6w20IE5i&A9;Zh&8((!xCtw1!P2r}R~GK%1tJ3zc>76^lJ@ z>3r{MJRW?e%?$?CQVosLz~bJXR=FsW*I#(=K*3DdUW{=l<5Uk0NUqbycaO3xL4N}? zP9woDrA}QiezJy&l)dBAWKYI*+A>Mz&H4=w?nz`8Tk4~ZCiAVA%;K;FSr+!sv*`by ze@NZX6GgwRXu~pgPVu&}4FWMl2VVGpN#@yvuVi*Yn&}0@Q94yWO|3eLiLqe+Spi>v z?2$XjSdtmW9#F}p&{^*cvD^0|ZJ#+M(8D*%gRQ;N&K+=RnPv~|QzO0wS0e%?#Opq8XMEV9m7)>FmOh+-XwQtye+Xh#+*w<^ zP4U<0$sU`+sUQUp&IGG@vr|s-uUb%7(^jFYTq^1~j^%g@_@lE#o_wL`iFZoUGCW^C3MOnKB7TxyXF_o>0x#)Vy{-Tw(xZxKFw@HEs%Q>(Z zjDls}T1)(~{9&{xWP2N)($!H~cHuQ>zudiUKG*T1t;m$Rws(v7m;LC1?Rl%An4lk{ z17)}0ND14JQC%r*r*Df_(d478lcy^~Joglrx-U%RoSm5Bi;d<8Yq=DmzB21c%M;pi zQ{~C`+C549--?yYR~;*mGBZD!Yj|yU?segTuE>Kw{ml~fvjrP^e>zcR3r(4jI6|$& zF@nn{1C?9;W1?YC`s-AZ@wZZccSg|DbC*mZAh|PLJ>7wK3{V|lg-dU1?uLpXBDUjk zskZirl^}-PJ7~MNB$BJommU|#i`A|47xX2 zpZ`aL%D!aM)BwF$aIUIB<8LD*S0iM)uJ-D}Q*8egfK)GD`qmlAs{lYLvNc7Zk{?`U zG?^c~(H{3TVCTb^CZ8;mgbub9Hk@UV4Zn_3H1Q7>ctUornR1<_>`%3Otxq*gzUZ=% z(18ln0&Gu0Fn8xQMZz(S_F&aU1@B#crTho_B6LiXW+%f~++k?6FelSLBU_IOxf8|q z0Nd7eZgdsJ7TR2Lbu+lCPj8KoF*GXWcAwm4mPb{bPU9q|k+Ce*k3V_R=V16-C{K9br_v-eB0qyb`6 zRvt6ILtYmOBC2HNEL-BJOW`baU(oeb;$gc_XC_OhKgyb&qvR4Q>pG7J+scKr4I#8I zV4f8Ow}og6B$bP6H9(B0hB{6saZv=AT} zC!g@^p3-tKKUfER%;Q9&>j;RDJK)Yx)_=bLA6Mu7mxTJie?UM`R6tbRfT%cg?+g?b zT%n@5GF+u*re>vPg}87AIMN*99$C36wQ=0ysMM^qtmDqgI%?xsr*q!lzQ2C{i2HG0 zkLz_^*YovnhdSE_F1J#?Fe=H-uSsf27t4mxz11Lv7iQ{~8sW#1*G-B$oGIy7%bh+h z^N+R#PZfk>x~GrWn*Pts>Bju52gRh4maw~Wf>KS;FHKL$#78z6Hk$S2iEZHW)zI$> zXTn{;{TExpmKAf4uMUAQ997@1e&TQDK5(~Psm^Py z1i4ts8n-q0rn@mgM$Ohs+4YNB$6Vbi6U_^BdKdERadMZ63K<&i%92Zsi{OCB((%x=vij9JU>#^ z83xqB?n4@CMAx!!~+h%tUJXuduS-+VR&~YN51tB>CwR%iu@SVuW_FbV)#a5Up-UzZb1V^DH^0n?C=1mu1fN_04gW5?FIXkqneerT zKBGw$oZS>dk*jz{z;k0NLd(uf(w0Tx%R#8x6%6s7QJ&3d4L(*v%M(!TyW||>1)I0R|kec9v#(ecJ*xu8@RP{jwOY2vTS@p3yrOr z41JPyx+ak%vEPm?-#XHh2S;2RxYOy2JeH?#$ZcGEN#P~Ul$TTDr!cYn2h&r%F;XPo z33+COSA^T$kiM=Ty$z1aZ7@*CDd7958Syf3qglZ5{Cr(Ao<#)bY`rJhUD?oYPIx<1 zVa5{bTQeR(v+~#D!QaL zi)Nvm;oi_=i7PX*_5gJW#7@-@A!DRj4}7=k?XAW17ABlTqC3a#=z=6RW5h6pA^w3q zLk&dffFERlU1pA;;_`j>hi+L~N`~ZR2mwh1@gyd@EqB9Cj?jOkySSqg)42gDDl`4%mQ& zQ@n6~m|4>dg;tHkUj;szs26Nwi--c#gj!@C{r~zyE@)q7twzz!;O>Q9knrYUA@J++ zV{V->CtXv+a+Pxj;UGBgUrxt^qh6wNFO}~r>wv&)>^HRp8=jZ{h`bsv8TrL?Ne6V% zA+z&ad$yEs|NOiyK`;GIAcExU2Kb}|&(eHO9|r2kSnEDq=eJ=E!mSF0>)@aiO12b4 zin#4qQ6QmI45I1lC%`0lVeb+bV@g)s9E&fWv*O93U&`dG>UJ*ShWQR5QgOKfeI_N~ zT;YGU%7o=L6(#ChgJR#j3Na<^wo)AWvFO$z&bik1gceWsZ_Dg0e0A2b(OBLz*_voF zN-l1myE(yb9pLG_FX5IXh`kxod?>>H^ZRG)wrLRzOq_)**r(b8wv_n>a#B2*S$gYw zTnL{r;s6cszVdtGOjS97`L&r<;v$*NAJJ}axOHBY3JVy@*Q}4$Qbx^LdQR${uhk6> z{vNtPPD zcME!X!{eSNOl{pLBuCt}Fxe7}?Ptu?k?j4Be{y{Wx>|4W*dexfcAZ#d`gZPUyro8i zq}GpA_yT*Q+|KlWyv)G_O5>zvJfS~N%gO7?84m^#xy&u?fS)%CC}DLdtGoT{yhPqV zv983#q526Ur%N66TV5FVJjdva~&p;FtCMTQl3B)uXeFjsRcKt%cxeCPS2fNB@UspMkX1t zFhp%}-tQhCIwIY%{L26AE>^Tq{A@4Gl$W5GtXH;nSbqtz{o}>vD5e$RD=ivGKJM^q zW#!CV6&EGhm)vI2ly?`9O<1TsQd^I4G+uTZAdg05DxSzjP23ZK$~FJaj3=6(F1a2H z5W9r3j8c_OKkXeI0BCZgLl$tc+mUTz(#$idBKk(oY=IskFd?WeLgv9apF}%5BNw$^ z_p?fVcEhue&Cj1|uPwNW{Id(z@=9goWwvaKExH=$9$|bv8#n0==IyOrq1Y>psgSX2 z$I4-Z9}L?gE5$d(14I=urO?JI`%j|kgv>cb^}=`k@k5&Y2q!}w4ZN+q8v}jxZA0k@ znfn&NX^GiIC$u1n^%9}D2Cp$!p|j&gp4~IB?|8E%bw=}YSYJMnHV8Fi$|=oc(#m5UU9^hsObY{bY@TIXc%Bn zcTg_IGvZD}&VF4y`>8aX^P;dT`8d?fF+M8A3h6XO$1M}h6pz;{4WPd(UF;WbI{`Hx z*YOoCPah_phq^iRWp4!|n8s#u{4o4*f$cjQDVT8UIwB?l=cF;wd{xm1d0{|LQ@noA zEG*W{E@`=Z(Bql+^YC8u)7xHeO@7DwhXK}>P$M?(-BYK509YfHVBN&gPyL%VyKJ^O z*sb-V<5Rg4B%>Gm=jzfkp5qfU^AkN>PzkVK)7ou-u>hqKLLKHu{zqBgOmbUHe`g z7>;J+Sx3NQ9Q0t+u5S5_+()P9?jBA4o-2iolYfb_8mU_u_vo8%*|PAU_MQD>8(in? zSavhs2vHJ|?jS9#qS;lrJs7uUb>(So} zX7qj9{S_Hjvcgj@hF~>BVHmd--*rIKa8j?X?wVb&vnVa;!~u4{<-{#fcUTh#$4V&} z#6za0>@3b?BcCl#Q*%O{hIW0N<6n10yr4?G#z@gYzKZ{&C5L`qzOA3_2T%f^%qu7D zoy%f+okYPfOOs{~G6q9P+Jq*#jCH`cDF)|b?Kn}l1UgFcco3eLx5UFGkn3I_8AjbE zs9wF9JQpovRg8OE6}ozys40#!l_>t&$+nk1?RRS1`ID#vqoCOe^6DsX&iUC;TX%N% zSaH!WVeZeBk)=O0PWPKnj?wb3>i+3>trwCoGHO0SG;-gXq!?u=XhzhLpSr6bM*h2! zy6@ywX8^<0>g0$QjM?A9?l2;CRgZ@1Gb(ZQYgYN&iyPySx zs_TpS#xNYyk5x(DhjjqOcN8j}cCfrx_r#>Sj=lNH{k6$n$|~|9)wK1F3=*)9ymwP9 zYPoO^WvQQGjLp{q)99G}`(JlM4%xhG37B~C*UJIrBC3?>z6QB0*2pSBGz`BgXQ862 zlh4T*rTZ5>IcOY@8XdEK`}uu+c!q$@tMZ;C<(`fxM)}(V*8I4ox9#kp$a3xDG70f zZ5-EdhSq#tBj@8}se9s14%{zpId`PziPtFQe|FgWzOF!wahF}`&R+BMpPVe@pIg2(1!FDV(4G&V>Ap{D zRZ#jpGikA(cs#!+t#Z|!R8E&L0>WeyU|^{QM+sR)DP|+#>Akd{ggnIxU}dL*y;{Rb z)TU7K#92EtE78d-c7X#$g=dlI|NRAKbba-CuSO{JiM80ekFV)7%7SVg}fUg3-YvlV+{!V13$MDSg<`GZ)3uy+ydywl7f6t}LJn zl>Nj8sC`K7^%rT4g9(Oa3FHKhpY{Ru{^<$1M&?!5AVC^RtJ!rV{Cq?56mR`#p^hv% z34Z)TkRxmGm(iJG(X-ofztNJeSEsWj3QuB_YjOX_84M*fd^2QeC+LnZyLNy4J>Us^CI#M_4n-zR$V-u1DK3shFAP5onvaAU zlpPv*4C^YYAtj2vCLX6#hfsY_O2S$6SIkqRFc9nZZbxsbg|!`g;FT`am|bp zv?;_#KTY|8imA9qxfvaCiIyubY^d~tUrLUepB*H{sg6Cg8k8!e3UCDaG7m``l5#{C z0Xj0~t|66PFwMFlNTPS&JYafnIN#nZ(MTl`G^wl{1|Sa`ET?$YuIhzh-+$s%AA!-|YIWX6=iiKO@>r3%%=k z&RtQl=ECb{zAK6Ja$&Q8Z`Q{y2cEl0EfM$S4&0cFKTPz}x|qI2{jkvHa{}r<{32#p z8Gl7yvvn5EYqO09B^FSMBoyUkNRI#&xIsm!tfkDf?`;4_A6X5`N7Sl={jp_iDx(L+ zkaYlGYT1dGp0_+7FiHJqcN>t!l*QO5HjI{c<$c}J>3-obfABClZ$J54?Xf=Re|Zs= zXPs)fu4_-87gNIyqw}B#f2?BHr$&EgaxWq=jF%18afm*flvOD-sLtKLevUiPqsrI! z8b%K-nRwKRh|Ab;4~6t+TB%?68t3YjwUxgqd$q&GX@)iCeWK1F)uW5Y8_z^!D99k6 zBm6(k47(2N_V)Yc(T)e*IOi$?ti@-^-A_Y4V*bDj=hQPVGg=VZ!ikoQZui2K_$ySi zlgbM!HjQCf+QIYx73!PM)LeJ=iQ68^sb8}}9AaFWGajb)66J=FnBA$YdoCkHXI3vE z`*(}1Zo;1j6qY5fJz&~2CE$7wg}TSjcJAP%xo2l?zHUNg3uGl#dTDY`WpA3GkJTk_u}SQu58KdczkF=#uZAvJRB^M5x1V_6aTR+op^I;7dhdfNXzNmB_MRfnFx zE`6sZN%*IFY+wym-<+nzb=Fmf%yvF@YSei*PwLfjeLLpdyd?@ZBd*mm(yt}y`PSo1 zJ=;rK6Zf7l72w5WiA6652?>*N*gpB5WMjbrIr-Im4KPsWSgsm%EqpIWgguT(oF;wn zv&MsxNWcyrwftKxxH$B?E3Lj4Xhbhegf$|oo!l}2^Fs)eyv=uokoPU-~hD7_bzo=?rqlF z{+ZJ0q#EqM1dRrGCMhUvCmfzpaG%@W_WNiHsLD>ZRkBaTH@`lVcK-ug1u6YlPzu?i zaLuI$g>l~U=ov7`%kHwRkz#yAy{mb!i}OaMQO4NyOE8`Ct+TpP91q(}zNmIsxu{rX zU;o4K6u#E}rXAnL7+7Zq_1!Z2)g@6S7AVP6O%F#)v?~x7Gr)jmv z^B1PACnO%%Nx*eJy<>l=aFZIn!~yJke(&EVJvvEFb#XDy~CMUkRNa?xS|+R zutKvRsM_~W>^gE#=a#opj9C77m46frP1F!)S)TvF#%$+6TvQ@ndH&M*J4YfTqerl@ z0(28~xdpy*fA1s$xD;8qMszbIMl>RHZLqmRdTbl_>P*pnzu(&eSyc3glP{YwIj4LU zz8blZDl1P9l6T9&%?=niEw-bW$Ck)R|IK1mC}{ykdC(PP-JT*_x`u+_a)!}<5JhdnyBB1lNp7PUPtHpPEPl3Q* z2YDoa%|V~|`aghe0%c|}fU_0s{=IQYpNr~wTp3yDDglR78R_~(Uopf0PAKZWoOzA~ zX8&SP6bqeQ!ZGS;nZ9HJFL_l|zP8SqumNAme)H$oW;$JQ@zt96}z7_pFAm!LXoX>XYIwS4%QHT@0a zVMaJX)i_gpl&Xt(=!s|_-Qe;54hLeyKEgf6dH_HAgZw-vzv1&TKNle^!^5+8n$lmqA zpiiKpZ7oAKyEI@)%1cYn!@_siIV=b>QEYdrXg#)_dt>U3(SulSL0D*rQz*Lj7k{Kq z&N4D8ma@*C3^vz$UJ})_vMgVn67UK};IIa&;sJ82I~%9R@?y15!}BQ!O(iFE>%SrluOJ&ho(1D;fVouTO=q4e0q{JyN~=H=#Okb^U@}m{_)q zujy~%{5ejoe(3^qyS$E-*INAHr&ri6_XteA%k$qgNRE=2rCbQA0$uR@y8c_;cv_3w z8nxuMN>lF|hgq1d=YLaWA6H}^j;DT}(Cl2&NlyBlP+6N(BolUOUIZ9EN$yf04#K_0 zyx%-5*dFjrO_!;78GT-5ZcRs5GZ2jYzp6dhciU$83xp=M%5z`R7LJ~}k#&3`ll_Q;1 zvGldLfJ`4C!!3i)2x4 zRv&dm=@94|B6IVdcy=T-#2{$bD6;X$El%)~_gM8G=4bV(848_~xU9!rX|DuxB|>S5 zW2YpeBCc5bvDzCdou^gRGQ7W5zlL=xf+W8EmmJ`o?LjQ)3a=MGug z)CDB7v`kse7urd!w!i-dRRWw7t7E(uk9i@E$jlB{K_N5lmHxvM)=@whqfkU`l^KQ( zwpQ)>pud>FlPDv8gQdI*YxnFs{75$){nbO^c1{5q#~tmnTEsOR$Po-EjoxIL}m>YXRS_alOaY|vyK zH{d!>k8R%p`#m2iFF z9kj!xrRP{)bl?P-ANS!89Tfe_p8}Y*`ROY+w2BO|-bU!r-pgw( z59wdI9JQm$S_rp0TI4?taieg+;`qgXSVR`fIQB67glQD0o>KrMy}$p?T=57ybxQ$8+nD}VQ z37LhSoZztZK-fS5$`YWQEPMVV$eK?#;w|MU0_3`^O-5?5*}G zj{KwCyyM}|_vWE$>*{;wXwuOo2Tq+wSn1kOmuS6uA6-+e2q z8(*@IAWJRnBPv+~s?u?B@u%V`ZUm$}R|Au&IDD)@{wdDb2} zq}M7vyejNK$!_`(v4kMG{7P<}>Rt2TxbOB&CZsFuYLWS`L7S*LZ_a79jjtKhaHHPZ zQmLf4E|hpH-M=8YZiqfFOi^FF>ft0-p{M46_aNRD|prCJ{R0@078uMcp2g(t3 z3uxG+zFMP#26?%=gJ;60VN&J^i@($*0UP*6@q$BJ=@F;g+o)08>RKm zT+6wjEkiCypYpai}w%Hi4N$- zrThkm!{Y#n(5(fF4M!ZLTp#)RE>h_ZjNxqeaYR>1A|d}*>%5;HCF97O4?XdM_j9tk zjzu(`^BQ!K&kl+6pm_QkUmf>%udTQ)vIiXbIg*+fl|K>!`k3G_bVCDq^rwBBUW8-> zRL8)zG;oG}coNzC_EXSu-H1i%u_A+Kf+qmBZ;E#v$%*zxE%m(7ZfKnWQ4fV-TzZBk zFX)8KJbF09YrocGI!<<2ch(GUE+Az;2*??p)G+&Zn9J4WE$pf*IZ`BT&s+k%`N?oq?ej5n=)gDrb#*}YRTm_*&N&k&ZFtFP3K)Ggm;fkVE?O>8-05S zE_$1WpK~Tw%HaI5=_>=nrW$1`n_WilU*jVGhK}V6Tp4%cPzT0zN}>zPj{m!vpt~9B zt?3?X4d*cl)~PN`_u3wtd*6r+w@quh!RuMDjquc$NBMBxk|Flr3%rql0!jTqhqde zY4-am{8KeDir_%~F3)a+j9)SCOfGg6%njT1Fn=ua67ETeMOHNTDQGgjY2@(lk~6MQI7XHy|kDkc18 zuxGpRG;NCp&w&^Nv;22;pKZxJj8<29qET^kyg6nRv5`^omqVuX_BOk!6z`dNOgbyg z^_|8`iwJRuSp$A=!Jex)esBT?$fD>1<@Ak-hmqX{fX#BC$dy|!jSpZ}?%tfr=Qk|_ zB(K8X*d8?MYMpyV9O}jW-1eQgm+1QtE?%a;w1j`;2f6LN>Tq2s|z&*_}P$PMcuW*Cn-mTTZ?3Pkg6`_Tln9PzWY(~3!UuC*?>q@i+E&arTe+#HK-u(7!2CX0 z=6a0c-;^L;C=>*LS#vb^&I;~O;JOJ4AwIDrjz`!0BB$%*S{}qzc)YftJ7{^*LadF^ z4zt>@J`0JtmRf`W06J}b13MaEj~m_Zuw|0Q9@2V~)831oYFL0(g}4N;jD%gxJo90E zl0m~wY4?KIcG*w0d2;DCti)$=%MNJ-s}Sn9x(q9|qj&A5_D8OEgLBnt77|WR^3?}- zeksn?)g6p#-Yaytn&;3R=FhaaftH4MX7?nKOK5exf)XvE5RR!28K5dzJ7c?vk~cB0 z%L?kxaYG^6YM&wi<3<2d;zrv7PcBy31>M!I(_;ektwx7+(o zMiAEHZL0JmM0^w{^+y=8SbGc^`jkDP}y5j(iO4*CrN>+?`94E?7V#=VvH zuYLt;$5YYS2a%huc)ne1E^w}fJZx$}XX!60+LwT0OpcEp2FJoE@2}Nw)5(DLWU}MC?6I=*&Q_;tqtHHb zlp@#ES))jFeQ2hib=Umb5ltyX@dnz@1l}YTfy+jO6HA2W`q|_qr-<3U_}iJ>1=t56 zBp?nZSZv;T3pqYoG~KN*gCQKHbG=Nz9{>)d{xq9Q*WPg@Sj%)T2R3OQRtajn7D^fY zJX>^>@EGyB`F052IBY~yf<}JB4#LzKcQd2w4*((@=DD(fH{%K_6686ZpU^9zKitF3&k>4`1Ekl27g@xhOMiUFH=5^GvY zG~Q8XE01KiC;p8XYH@xQZx+6Fy6T2ib91}PyloqNp1!&kqE?HJscxZ^-Hkz1C4t?i1$Nmr~pm-5Of2QLl@CJ-hJjKtPW4U*92C zq1(f{g0I*R-63~O_UWy;lBDvss)8e$eji?UiM>1||8l^{iqugEw&Xi^sqh3VPDpX1 z`Bc!X&plU?ZBg!>nUa1_)4NHTn$s9-`e7x*3-!5kPHFJyfVyo1ST<6!P7LkPsT2ADOA3l%VX@7^dt& zFKSll7c&eGYoT;K0@J-2a=I7&C#!q*hcRxj*{|-dkq80LRW`*a(eiYK%7F)fx;$TR z;$8Bufqzpow0uk{r=k4|onwfi;~}DkHjBS9j4A#d!d5Se!nk*787{2pgi;CGypAyi zfgylaLjdHSpX(|VsFkm3``n916FW2QC6+A7CP+1_{A;t`5?> zAdBB{N=0B_p|unkf0{E8nV-kNSw-voLmIJc;@20t?ySRm5f>j! z=3*!s#?n!Hf~;AcR8y$D(DlK+dM{qpfu#0RR zN&)mIZ}4D+zx@HmgG7;%>Uu%d-Nym?r4z3Fg;`jL0*`m?O}GLS>tF{n_pB%J0<>Mc zL}nW7nX6n41gzC4-XjpDLb|0nAC~t7&d@?si;Wm$Wgmg3|5_l2;yUxhe(fwb!+Cb0 zRRjM5{BD!8B}Ep_{|sha%e^4846M9YHzDy`|CBDDDSCS)fm8H22;cNt*7d;5j@2?a z#IbCQ9N#kxD>p-JI&<9o+FrIXFKo9fFGSHmsyLu@9ZqUiCk%L11n}F%Q;rfOFOH0L z)zZzka3V45o&3V!QnO7*y2*>{nDR7$5#{C^7-zCP_8(tuIshS|)?*c#Igm%y)^XLr zCDfy!ZT_3dLf|6JNLt^nZgg`xvatqa%~qWZ&)DrUaXO+O2#J97QW5Tq`$6Z4OVtA(B+uY`mU^^iHe@regC8AsPt#~z>*J&RahZI#IM7o z>1M@efet^{-6AzYVK*))rR=}<8<(c4IE7RZ_6O=+t>%kLM6&rB;+L+;Yjrn;hJblN zcI|Ad*wusRZ+lf;EuSP%%36x8jQvlm60rZPhXP;`sk`tjLMHgC%DmCe{OxpwAMHbc zRu!wrHHoU7+4mA^=Ql_TBpA;bXQJ)LKS>Mo&vG)}(Oeqe&NC>1G4W=1$h>NS$mC*G zg1&oJ%J?hTNwjLH0Vb_L{g>iYmi#0pk83)1mnNH}V4hDK+FfCrI zCbKKMurtkP=_p1t#Vo_azBO=MBmh?hK1*`+K9{Ej7UQn*d%gu6XYGGBk^Z8+oB{uz z=o&`f@hUiV9Qkb_xyU7#u(R3NRn`a<2I~TGpw)z@*OGpc4g$k}14oLrwXyM9yJO9q zX(JCCt43Glutc-Y2pp%bg%0R{sNp~BcMqG@#n*Q(Si7%rj$8=RzEV~crv0Ct9?o;3 z5VKCMZt&wCRzHXji2Vhki%ExmcinzPA_;QBYBOv1#`DQ4XF>D(lrjjS)Zo+1;6GiN zLmDPO-4!uRqbvO~qTAIu9wa_Lo{hC?I504m^#nJE@Mr17k}SmO`S zXjP4RDAitxJUrzpVa0qh>-}j3tzX-Q=*L8RbO)W^8yxT>EoOanFA+Ybut-fv1eR=Z8s0HDOlYS#yldY=I zxTW)QR6QT48zYx8w}UG2{^k%7ypqS3(@%CS?Pc?h+4_|g1^qR=p5m91~oeEnq!8*dsviy~zPR*^y_I=+9vv3tf$c(4 zlp+u--RBNIuYu+sdb?1~pFgblC}R<%xVzPHjIY99_yH3?sd$t066;GXUgjF8BWui( zd>yZXEtHbWf8^*ui29%6!6{pLk8Lw&=H*U`Wd~fBpCEdJ-~~%0ZepAN;yMEiEPCEB zD@%#U&I$SzL%}JWDA&xDe!Yt~De#a;fx3Hn*Rm>|5!u|RdX3=*tMq-79`xcZslF>V zYKFvh2>+Jx;e`j$Gj&o00m{LTZ9+SJOC2l9oTz3{|L$C&U{J#0DYi4e?5^)F=0xa0 z-LbS?e_=M=i3ePE%3QcrS$P=Snb|*==hLV4%fVyGiw(vYRs0vcT`wjM`fZqIwo(fT z@&^X=1$(8E>~vpeT|e0}TFycDwFOwo3!+0$fE0@RUUovV|%f~^bM<55USKm0X~Fj#whbWCx{ z6auUdZuB2B#VFAtl&PN)b;#2m3kPc-qB8=>(R$_VJVR zOL?qLW-+^xw1lk{67C*WZ-DR<<8pP)&YL94M$x%7G%dKWXT+V}aSC#~P-0+KP?xQ> zYd2gf7;{0we+ze99RrN+f!aa`4Jwja2)PhM zQBfxB`(k;~K%=x+-#Vvk@NjAN^b5O~{6Uoy<#!D-WmSHftVCtNVjC#i2jw#9AdNGZkx2v zB}_F~!;CHH|BT-n8gX0e4~CuVWaJ+3nZqep;FZuJ&CKXkOMIcecJEw@euY>Lhc1z3 zFqj=bnc;C1Hp6g9pdO-bEE{*ojZU`HxAN#V0R+BL_D%MDFJTs;iPr~~^N8>QC^?L4 zcLAfp=sxK5>P@Y%=}0LHqrPt}bXUJ8GsNVB{p$Jk>C8HuBr(F9=Cz4zA|`NF@YIfM zyND!1g(Ak8CQn|_x)fJff=x_sXf;)0N$axnWiFmuGpV5$W_PaUBZ zsO8Mbb#4}d`#tu;)@`#^e~&h8TypA6M=gv);W^}dg*}Ki^L93DYx(z`ouOsIV#=EE zzXQ0vF4T-Oyy!u=O2#*r<-HYy43?msi)8?PnB7wOPbHc*bI z?(65S8KI5<4wo+!PFPI@-O>8LdgyI-tx^ODTYRuYVjm#y$x%6oZTK}a^O@CW-k4@? z-K7x>2((0|pfFC)@yAE3yr;zfl5{p7eLLMfESY7JSFD!XzjCWy%V+?{D=%x35IO;I zyI;88*RiH|(ct@A&U|Q4x}bw#x#eMg5%6Rq(SJ|_k;bhVv090FVkzDc`g*!uNVqc z>W?KyjMhGpIs_PPHJzI}+)z{}?SY*brCbYMPHiDY4;&az%(G^V+_F%|!sJP&dk(Rq4C2?T9!!&^k6?3A}C z!s~YlU=_IffQde{#8PaS?RJY@^;ag2v(i(9RDxGy)wN}U4Omhp@c*|MhUepPc(vQ7iJ+E(jYgX)EH zal!$wZ%Q2aC_C7Qd4#7=8KohS`+d|9ln1+( zDKnBIwQ9f1#1sv!AS3GHR&q4(MsdX{#Phx{u)i{NOx=-~%CoT<(&8zv8rEMz)5q{& zIf)M>2~d%)!e!)4({fm;jr@U2X25a(ezkTpmTjU?F*-)U|Y_Bop!h1}t(r~pG?b6QWqdRHzF#ZM4{ht;xsoeAL!qq6KUtad_7wxm~Y zYNXw--=6jaLX4CAi!gRti5E7+gqCDThIinVAwO;9U0u>K7aS(a8{KERyo>!dJC;xW z#(+zu$n9+MBQf66K*gQp=#6e02&5p2%#DEL5ij={9p{Yn`}k==K=4~3y7{gC7O_$7 zuNtM@ROBAW!}A}W0K5VCr0j%%)9-wsDhp>D3Nim-aIeg`Q2LSMO4#_Xf5{nZ#`Uhh z8n1Wm7WmC8h7PzAMtMJ|z@hG~(t1)j0svo|na0>aw|R1V~^ha^IDlcqIB#UcaaK{TV1c3th51&W;HBIFpNu|uUaqI5tK z!G1Wi+5A*l61|x;*}2BmIT=@ii;=6%sB{4ZV4^H{)}fxSd!H+P$r76L&uotD&*P?@ zbtvZ^_HW#vL8I=#cr#7|K_cd?^R412$MrU(PDHMxV`io$=bXerML(lg2FcJnTh=R7 z0__Z#xm}#_{?!B2JKF!_>b@V@-oHP9XCY!G5j#jCh*4t4Y!XBgD`rtudsP)xrRx$x z5JZexb&XJ~ZH%@$uf5x%^lGcU_SJdOrQ_bu*U#TS;r-k5eO~80AH}QLiGJmp6|XM{ zX>1mgVV!ooY-(52tZ23DkCim)5 zwCca{6RtG-*gX`0N_(Q^5;GEM?W-X2ZW25*DmdyBI+F*&R4)zj-!#>P_?bq!x+DfG zR@@xQ=PHIRh?o3H=DGTh`8zo$%3899uNHvJ)m80m$*y5Cb_(p!go+}So`jeIlhkzM zx%>PMS}sVT17Uz*|92U9KYLx91^Z>w-$@o-y1opeki zb#M}%DHj%5TQxu5cJXy&=I$9!%mnjfQ}9zVHoK8z&eh{`lLgSgGY*1?(bz@8`A1s> z^xW8=3IV{89cy91BWT)v|IG-qQh71Y>Rb8jm6**zRk**KmzI7}bygiQp6(l3bve;t zX2Ujg({;k+S%L58s-z)cm^9B17!eiH;?kG!UG?c~JyTan$|{bUj?fC= zoGWjQs{@(h?ZU}CYv=$ARxKe5j$hB_JRd)dFvEQ^T?1QTUfC$?pPg;gjRbn2djSVL zGDBh3uwyt+c(^dBuOZV})>GHddZ(pVt0Y)WAh)m}31P!;TjU9~mx)5f%mnO&%7Xk% zMWg*hd}`Z5cx`r^y~ceJ$c63Tdhzk-w0OJBJ@>>)^I<3P(bn?@*UdqSV#_Eh2WGK6 zBr7ki-aFNDVZ2yNQRVT-FM2ON`%q;Zs1!cdqN$EO`|SN>)Tz353n=i%P*!r*ZD+0D zKfqHsOU&GN6X>I#@nu|9t*a9$bK>y(uFNI?`V4isJ^XobH=n>A(V<`qhEm4+WaP4I4>nkd%pv#?o{ z1v_@-QwvRe+;|-=EGLl#9i;BJz!hcFT)z6Fr3_NmfLxo&Ujf}F-ka=)SkO*aIc}Jl z2{2UFh_&1e9CtD@Vn|wS&w~UvvlWsih zXYb6EW;5HHZsK|=&hWJBX;lCQIB3X4OdD?sq}EM>I%jvkv!1vPAU6^Q3fG1q#t8-v zb7q0=`L+pW8z^62x2Q^^bWuw@@H)39NeBIfKwz%Jz5hA)JoB{I%H6O%8{e9qtJOCV zf!@m5IUSCQ$kWoMD(#tw8;3UP^)jIGfa}G2U3G>0)^K8K30Cl| zZ7E=lw4bP4gzJ#&Q~!78mB^)seVhJ`zB9!+#5KTQbf7kb7I?OSF`I;xp*%4f8TkXd zGXA8o%Q=qS7Vrk1IdT-Jq65Dj#nCc`9WP(rX#~Mt%4Q(jWLbXS*|vsq73{_`^vw3m zu3l=-w5^RnLR9PkWsuEuQ`AWg*AegXf4Mz(-tm;8q|qZZFMljsTPB70-}8voRliQj z2B+3)q)h$Y!)pYV)|XMoAv_bc>Ghe7tqAFR7!?qBgVP`3(nmpio4RP@mI}%R5*;O@ zUIsrc>ck zB+60pZP*3*9F>RW?fwI{r6!79{CZ+X(hx}Yu(FO7p7J%3de?lIMh5@Xu{r9WcSSYT{_udL+ zNidJsE}yvneYl%@xl!qN!xo#*TlM1+$L(@zhv89js1{ywLc7ql^7&&$txn_tWyIhd_d+^skX3ukc8a*ITsh2A}xRug`;Itb)Il~U29UC~1B z0EHsS7dZgE{XRtz9%HT1$9$(7v!)P6Lm&K+9-NofnPr^3`KFur+oZe1I-ffAUSCxC?^l%RR&hzFubiZF$nCyt2 z^E)nQSK#6;u7Bjp$*_gD<7IR%{wH!?-%9GG)g&$S$uDkc(Q>l*!TCh!|pvUItD%c;OMQ5fDy6ilqfAfNo2JfpyPRS zFK*Kssqhp11F5Cl;%?%QRfTDq=efyAkn0rM%dcc@a|iaDA_3QZoY3YY71z9P=P21- zr++6jyA)1#R3M012<$19Yki1jx=MYha+3;=FfnC>2ORgc%Wgelj0l1t-&e}bL5^y; ztdQn)kV;40_c!BX<0X+tFZosmu0%IkovzCvB@LOl>H4)CV?_U+8C< z`tKGARE4Eua{ zzg@n`O;PWjEX}b@*Hs36+i-My4*GJul)UkMf1(3LyXZ?77mN@4+&L-ysuEd_ts|qg zqX*^`M?yz!n%*x=KP_xH>|0q0EM&dQt+$an4Sy%jYgUtxn~e%2bq2B7P&A4q)&(pJ z|KAUjs%%HW4U$ZEQTy&laBuP#Xsmn`%e{$;a|~Ir&~fVG{1;5vhFq<-$jPtEXDjFm zyUVvN$@%_k?f`HMn>V$B8}5v_DlSHdVNRJiaU4co_#axgl)`-OFIXB4&;T4(+&qoj zcK)4Wa5e*|5+!U6K(0}KG|fosMz}C{)w1HA*($vfUYTjSrmQPad)y|}6?pX+e|J() z^~>?O?na_RYe}I4%$)qnx#3d8@e%(csy8ti%!S+3#-`MooMLIS)Bk1Sf0iHM9s(Y7 z z=j(T4Crhi7yG>6{_j^!`{D0z}4+-Bi8MAn>MM=UGX3|UA?z>ugftUT6jjC#Fll$~= zSd^Psg4KIJIR~ll)ps^l_-L~<&=6E&tkRS(@3!{+_U7YyzMN*0;Ucc-j^ZKwZgs5g zYm`!MgNdPlmUrC-PT>C%%?4)a*4CK2Zi)S=5|x>v-RuVf-u3txvQkzi<3We}7;VOn zM@LA>emr+4Wjv|gC`*6CqCiK6-V^Rh6%2k$0OhkjLl&81UN4>V75UF2#GT1izB{O( zMnZc|rBtr(u?uV4f8NUG7_H>{ZdU4`XDV;b`gBgK0Aau(Td_CtmKC|TMsYM6q{;ex zcofO(jhoUD3S6-!m*(~`ST^Khoo?({fuyE5n~*dlj$=knZEq(f{VsO)XVRlL1Y_Cz zen06MGrk7QTK|KP{F4|lsU41@5F2N;oh?qpzTlj{jpI{d|9>8G-tiidpXD`PP*Zlw z5}!cJMXXZ=IpX=V50j^fydZ&FO?R%bFmnnn4j!I`O?6X|(JeUM`L`y`=JOTwt6oIxfhqVg}o3PAp66;#HGE}_C$Gt4`f>ksoyLI-m21Q9~%>W9M?^Fp2pLq&* zFF2g3Zn`7@_B=fl5!40wiRwgH09Ca~Yo$4o2R(q6`#{OTdFH8_0%fPg@ilAI8S}&@ zN1{_N%kUI0z*pp0#DaQP;V^G9dr$Q82Ls!O=gm;)V3XanNR}G&)og0J7=L4!3zm#` z49f@RxbQ+Akadt7W3uxNB3y-287`*#I;0)!64mQE!dyGLi}P+Vk)M-EYL-ID9G3i~ zH#GF#b<#JkDVYzE(;WBwBS4#U^_0}@kZWv6O1UIO|6CF#V96zX01B=NP`49-pPBwP z1|gYRQCxbw-jQL%d_u@=49($~9F0MbI~&RACqgO_ptQS>vQk z$eT0r{&7)cucoAhz5VM!RdN?ZSIXP2T_)y&ZG%^DZWZ$}_r9Vol$tj60f9%AS>*Ss zhGh~6$@bRnVdpG7tN4Xa$&1QJhwG1sw0wb_r~BAvZ-qmzJ0R}Qe!cAPnyYm9ec~do z*V|j)60;tRq#AA*Y07_@J!b)BH8|g6O9xss903=5>s$O{&C{`nfavOSh#LY%+zX|6 z_hN$xrN8`th;)(bEoel5%wDd`q81R^OZo9sTg_7ZCp@JZ@P>*s{T>}$*FB^%$W%SG zsP%0VqiB@BH{#9Fo2-o9PQQ33=fhJ2u_M6~QswXKMG#3;7+Sn#puyB)jP!;?o3%7j z+B{Rx?^4uSXmCXj!_txMwnZritEB2J*PBe^aFG%+G-2Ahxz6*Z2|5WZrV(D1M;~#r z8bwMo!nfV&7es6lA*N?p1t<4F>@;z@aq!|WTE^R7EL+Q(hs8N7v)AF9GVhO^t{TCCVkK5#d@P`dhKD7_4&RxJxfDuSp)&1@`?v3Jd^_3jobnxG< z)dW3{RW{8e_qJjv^q1L01h6@IX(uD0Ro@?E5_UnMy5g!|lbanzpP3UKawVz{#j*YJ zfimbh8wvmM`D#JgIU?o@-%=n~s?s1UdPi<7oCyD{*wxkoRp&dLW&uEyw_I`#G=tZx zAbbVRMQH8QFAL}SS&xkHEPSMfPQ}Z|T~){Syn@R^D}*y2W3` zf@i5mUy{|ZnVo-)Z3fTjjI*CcB}m4B(A9JBWupJCy}LpY`Ol}($}0t{cJ$%j2HhZ(loFZ zV9p&WWtd%ZiOmA9v0UITm9)8SVw)xrkLy=i-4CB&E0@`95SquBdS?w^arU2TXIDlU z+}oZsd)$DvJ-3vzeHoAqD1Lp8fWJz~tAWK(i$IN~wFvPmO#bkaHZsr0{V@v<%q_o} z_JfN$O7ea_gwY29OUDi=Nk9opd5c z$eNTBlw?^*M?VL>*~ni(e>%DfA#FqX)f?S`7NOh@Y5K-cL%o5j^$=LB*_%#@OdxuN zPgmVB1lz*(?C~v@J?8Murd|*;KOWv*GODb6yc8aTdI6c%Wum zb^ezv#_##{{RqNY8Cc;(W9CXH@cm;%cGCN~y_{TCS8Ol9yf0Mea(!}D{ie-jmrzln zzT2u-*bqgQF6X%uJ1+h5aEd2B^lmrbSu<$9zG`w6;nQJ$6kTra#hn=}3a(da_AP22 zig!!LChI;~1^LWhU&Ro1in^ti`kZlldPn3^!)cOT6%ZA=bDC4w>eG?G8uShSt`6H8 z5?JS4Mb0#}KB4Jkzq-2%KRr|>&Lz~MXV0`VZz=^R@D_yEoia7S_LOa)E`>x0wwa>$ z8_PTpfA8>p*CbBjR{Z)Yb8ghi!a zm@V~u^@l!@Y|q=w4dC#;5v94Uqw*4-DE|ez*MKKQIpI1UY|=I4R5@CVy0;_u>}HCC ztWGc#Q^xQ&4BfuR_h9O1sG6Lt%FbW4$eS19*K+gGEpE+jcSKQ#JPX05sqR(fFc&G7 znJ zTb#O?Vldfa084OWc1$FWQuZQ6<^spc(zomZjyp<h@1zq?IK8xMRa?UnS9wJH$6pJD9;=3k!&Xv~BWC;O_gff{5 z-ENK(em=+ueXlKxl{u5IWHv^I+9?}k>+xJ;7bgPV4&0Z(Gr6U@JEJPeu#N$>9s#Dn zEILH;Ia#ZoDS4_dbpC5zFchVwzAK1$ln=b15S4+r_0hFPGe75fZ$JaxM)h*!p$iqB zFKmm9l%>sS$U-e~aMm@`SRM6it~H8xh;#|Qx_I1$HZ-*-JMVO7rs%Ft+eRJ|QN2H# zDP*fFdhmCj{+Tc@p{qI2*tILwe9$%uk^cO&rR;$Tm%SYRrMXNkkrTk(xeNmtaLZo! z{>mzjke6wwL*yXyLX`0fJNsb^YhES_{Kv{Lm6XjwkLrLT)tN%-$G|-=aDV-}V40r<}mW0rd__ zlpw7=yqrDoh?0xeJrOt6^{L!%_@GcqxVSPyv0SJOZYj*HB_mya*!m|IN@$J4-%Klb zW~mnbhm7Aw0O8Jw)~eDk2`+!ynLne6soiQ-ekf+a?(SSd1XweF;}O9GT`#oQpD#?j zMQ^pP;vo3^I&fz7kmF3MOjzFD%N&$q`Nj$aETd@|TPGHvFazV9r|=Px{ob2+e^CSE z^ss1+pz)2|T9B7DiQ+%sF9a(`jjHIR%^Y^x(IdUJAY+l$s~@JDLr@j1hy@} zMBL8yslk-oZ%0})q~uGc2jLEiitj!%#6%}Y`w~JMxx7J5IrVwTy@uyHIrl?(FSysn z?>K(Vy-T6T=E}eCAp(`2<4g5xOCN+(yj}>H#_H_Ak!HS|8Gz} zMq9urZrID*8U2WC(+E$9gxo&iM&oVU>1Sx?7w56#W1ou)C*Y22aJ_5IIe7k#MK50?WIoEUX_>qOWsbqv+S+M0-J^lCS)v(bxRIh^S^>$MUMhY-O=7>z=yf;VsFjCdndb@>ORp5UT=2iS>&xPjlV7tZe>f(> zF8g4t7KaZMyu%(RTjM5AkG&*7tbgT1lx+sfh8av&)SWKKB)L9fE-b;Rxa=UM&3#r9 zmm`u_%MJ{k9aM12mNt%p48tUaeb*;z5e$* zcsjS#|F3!u&)HqJ)d#BYZxhx&3s96l-=OLe$^w#Y{`;4%;38KgFZ<045Qk8gvpV_K zcfPfmEl9Nv!FMkuX*9dg6b&19w&h!VPqw~iRTY*r0Ry28?a>&gDp%z)_X5fr75r}) zxHD)y?{}3n)W0Y%A7^Q8vXscJ+hXLomh_3(WTKCxP>x%-5_tDA<*y=p@IU$c8`p4} zu7A7L^!45t;urtnmdamZs$&&&C9>pC3+Cl4zCBDe+l2YtqiY^W+wbcblxf-QbJeCWgrc9qa-D%*XuX`G^$#?$Cp{;1)OL6e__l#karh9}F$_eo1b{jKn``i8UC=sB4HpJG0ck zsjTL8qU3V^sf_DX0IMRc{(R^jdp7#0ZG?3+QJCuHkFS8_MM-*XlNqSiwmx!_T=*Xv zPhux2elso=@iEfzbI24LmNEXH-S%kM(VXnxsI#!74Pmb!c;gsxo8@i9QuA+$TY-ql z#@cV$sgb8wEN#94RF8I_2zeOqM|{+T70Q8*VCLdx*M+Mz_u?kfJK|JGfqP9~zWI8Q zv+NOI>V<5@cg}qwA%v|ZjvLJ`#F!0j0F0}1(f>aWU4>M2QuM1w?V>Z2?7TTEWf#(C z?V#JCIFaK6e_;(&7HqDKN7R=May<_z4!)n=A0r~JLep!i8S@2evZ=B!AK02pkJ;jI z@llZ@WUT=cvvcL7Svj$4hj1i;u6Od$q?&GE1_ELtZxxD)DJ8dWsoV}XOEI5pmT?_Z zx&&{SM1}L%+6JDD-htG}d;afbgQw0o=a`s-X-(+cg|)?Hoi8BZui_L;xT4BpuZ5Gc zsntrc`trE`5xa~gXp|a|IzJr$lvyvdijZOWozu~X49guT@eXO=CCwLmi%F&ggi5Y- zKZWIv5rWK2wu;NaqwyJSWHBHq18dk}8v{UBYuRt?&Tp*xSR|_w<{BxOagx?==E{!c zd&Szu{khiiNGOV&3h?x=wQ3b8o%37}2K0@I4LQqRfs^FfPmy5!#{II>TKVkcWlPy% zg!@x;_Br0h04FOL4P?#l#IvvQogF046b+{oLVL>kI zj7r0Zi;b?FwV%|tEiN6bcPp!B(-mnS@*&aBn;r=jkMZ_pZo`wFmS+{~n3RE?jw_iR zE*_~)7UbSMf4c88Ac?CokzZJ+P`Z06tK;+uOG>JsVTtcG{L#X|CsMw}Q0y19fD6-r zo6QRD;6}FG$*EUqg3lX;#|#cOOGe{3A2{Pj=aST4CdWJ*Q+x&S6Xasx3aR3(zHMix zqMY0?^NIpQ^ul$?aE)`)2-hhwGu0ah&!9X^v2AZdTimnQd>s497+*-f=JD{{au3A> zI0^1@JqZh3pijI~J>sSlHhptG@EU{6eAe$xVb`1Qh+BN7pDfhKm6wNuGeKImSTfP1th*c75o#*YajcT5-dLsWD}epeQ@Z=Nd-WkU z;C6dwS;=FOLY*(sByyUnQ`S_aMUfWR5<9R%!=Hyjwok<`s7Ed*ULRo_j{#7>PAR67?C+mSHQ7%HUy;uiF=QM`f`h`96s);ak)06t{Zxr9 zOUC2QTHZgdG-{2*{Jl>H(7j@8O`v2Z?uv71rK~!#;qNj0IgR|ANlo60wF$EEqxw;L z3b{FhLHP(Lz3j|f5#cVFpwHB{0L`~d%zuE5m3Px0JzqmSnTi(=4&L_yHuhT9&WfNF ztF#J3)TF56%r#1_f@8`=Z_FI8CH)KF%v!f=G0gfDt8&ofdf_1{2lEiGq}Ah)fS|8V z)?+Yz}69OykMTi=v=s?`rbKS9$4 z)*QHR^9e0l`sZ;#7$s-2f;E!X7|PdWI2lBcHhz8?=j8IpT=IlzfdbTSRfo&AWW30W zc}q|}`jjAMg=iIIu zF!GFnd#jeMHJOmi??Mrvh!K5PY|Fd?=ifhr~fd8o_?;k;-WzYZNU}; zePf4S|>aNRORvhba zx4AthF9%U>9R)-+uis%mUL)Zllk+YHr)OlC8MKA&eDPP+D8eXQOkpK}g}B2k=fb;? zM%CYhr50LjoFQ<{wW#b6*UkEZ_!BSD#mS|GdnpDo)Wb!&3@lLYh=AdFUF^KDMQoCv z@q#nZ?08W7nIhiWRT;La0}TDx*yZgVaZ~eFs5|d-6M8JPX<{K@R0pn-fc~^JOZr>w zrnesJ3`*jL=1`%@e78*AakW_eXu$UlbyO9#32wjt2bbo@=s z8vGE(b1vRFYSctC5GOuu#zk4!-oiADL`MRr&*BCzTK5{@iacK@V%_@WrYa?j?ov{8 z^}YJfXxrmipT>&~NvEsq2|$KN&82kmxq~*7xgu^VQ}6RWCc?;SmC(Mf9iAm^jy%+u z(OjYmlwJJ+l_$=PfsXxeOGwWYTPnh4DH1lgV_?IK1*T4z_6L6(jJ|GpSUKxRiT9gj zWoGh8SQBWm$s`}laFTbLS&|vx7#EefM}MyR+0&Av>^ZQd*D>CF{Icd1B%QPqnb#8W z$0g~)QT8C|$il4((QTIiun*UAgkX8?S-$>dvZ`8uxT8%auYshzDcO9}KMF-dQ-;}{ zQb1mJ>5}Y5y|3KvgA?5|qqmYgV}XY9S95hu9|%X|k?mqv03R`N@yRYgIgl;=?Q=qY zh=eo3VmBkxGX$fnvESA^lt8s4@1;Qu+BfGMi3;CK^;%CUOXky{A3$rA2pem4ikF_t zKT9}2Z~fgBKguGkU`!`Yg}VyWv($~ZUOn2>-6}*!~Zt;^@NgQhC$8& zN@CRu&qKdE{Td8slKYFK^fK=z&jph54%776VD4n6 z*JJS&@XjM{OA(*-a39}t6r_FxR3AqO%{TS9_iHnJ<*h#>old(rv@yX_k9V}`bG_9* zuSI?l-uGtPHCWRge^gi#Sumh#EpzH7J#esoM0u!bK`ZRKqH&set8(P!ms zoeGpT4!U8Sb%p5sKEniTQfqSr?EfQvXSU7>4&!HakH(k%ZXB@^)fn{w))ipmw(th< zPZdmxv7^0PA+;h@xR3xT)1^6z4lM*QMjT57(m7)eui(nmaGu;H2P51HQMtKPB+J9e zcS4N39thGCEIem&&!@-o%TqfGq>81Lkn(|9FgXc~UA=I~aSrP>(h+s{%Qbv!-e>eB z+_rv5U)X=Ic?k<*&zShXqEn~(S?>KPr?ppbxKQ1>DAGnRd0Pb253qYkmkNl$R#bRH zd7r;EEfwZnH^+4Y_Hr#*Zmksjm{uXK$V_!$)^a7cR0>)b8mzqQS)B6JBjnfL2$*%w zZw}^W$l}%N@Kn{rlui~Zv=T9iNU>i)ftj-RiMLbsu46v@oC2OKwq9eN*q8l3n#S`~2U@I-z z-ncLgSaROfF@XLfZhwDosat2RO7VA-PYp{(5?@(HFg<|Gb*q0YX&VErlfR$#piTu~ zM;oeD0`69aQr?!sxh||*HAuwK2SyfM_xD>S{f!wnV6lum_eK*H+~FY8=Id_qa?jeV zpAws@oupQSO37nIm1HR)&G}bkckVrv$4Qu8tsCn(PVYl9ao8bO3%PM|Q~W9H+4!6hXsec)LP^L-Q)Pr^eX_|K@xA;cO!};QYI@&@$5ggm(VD%9sjM(B z*`ScVGEyo%8l{KpIbAx-Z7<7>RyeH`k(bLeyI&;Kc|&KKy!rvJX&GeHxhXXORZ~qX z$ehN#0Al0FY-NOk%o_&bD!P&XWR?{!F$G0u=$gzCvM2$!4yGz6Q`4hSs>nGSDSuZ| zFy@M0UsUOl37j}ni5dx#_sCU=(oJ+?oB>VhQGh0Wwp(vNe+b0%6&lhf7R@uI{p%td z4P=B+DgXFXat!twCGk>)pf3l41z)-wthT?gsB|&^MFrh&9A@pqL=UVjIaj)XjlvcB zwSd{TBW|HR3c2+BY`_%bTeCF`8SS}?1&6ntO~V4gTYmF6-l22jmP zilM(HXp_o#)NX|^|9(XBd-Y14E0K|JTgJzwU9JwHB_*2H8c9RYh0C<@)muDm$eu22RCgUi6={odG9Hj>|%CLtV(vQh|bv6Bx`J}7xksPzM z8Toys>6&I!!V4DbZGh`Do>e{@lCx-B*`=WoddTZe_83JT6PRk-jvRg%DDV}=;fvPc z7p4E#KDkO^(-b!ya6x(FG&mAAZR|NC zJ7-K*`iUmkW zQ5)WOi8bV))*oEgFHgiMi62@j33O#y5^*>wV*RG_e{OG~qeeB( z6vGo6$WJaMEt(DZZF-L^OQ zDUpHRUAp~t?wYC&j}au``tZ302mIJx;nGy>g3b4RHW-cy$A9{AZ}sC}2q^w5uV>$- z>d+AnS<+jJ7Uv0rK6L2}HE~tykg@8qLgy$Ixx`aOLHB$R5n4yo?gVHt5}FHt>%(;i z-^?H41qTe+XUxf>8+HHXCaXZC!ilkKOOwx)Vjm;JYKIO4?%ljrgWxsBy?N%57H!2x z&b!I1Dst-4oJk<1p{fgLMMM6m%&%1nC>|lK?rt+GEdGUEti?Ch7bzgVL%lPy3dHdG zT+Ezs*wN;^JDlltL@VNcaaNFTjiV_()6$8t_}A( zM`fxb17hVn&gf_^oVzX2Fqr!P^UyD+nocctlqEVIGXnF0Irfz(HR5fCC#rteN~aSW zH*m;DJ%U|lGD0lMQkbW?uq_%#U&$_x`V>L>2+pv5zHW@aF zSLj*!`&s<~(7G@Ml#=AD=o|xhu}mYUSWpT3m!G18?Q_oC#Gem+Gux%}&kv#gEcTHm z)7&oYr#wUX^64H}8+kC^pB@&l#948gs+Z7jPPD$u5`&^Dca&8LJL4Wz;Uj4Le%`o? zx|(eN{xAzsf$}uq=a;tRXPcyUy2)g*cV8AAJ7<(I2&IfG`hu2rx3RlU6(CzG4VEs+ zGtk8TUgcYTedXZk!hEPuG2HELnAWF29E;&95%)xSEj$LAdF!k}%c36b!=#pqdRQFRX@d&V^-Wwh0xTRfG>iX9W54^?6quE=_Tr5DuOj z6TzywlVfZm`dH~wyG>=EhbeQ?3Cr(0kaLXgay8beBjAT zX9*95^{%cC6jRdbsv@W!C2WaC4rL+<+N{A9$+#&OUlz|$%PZQr$sE#5T-#xASF;#H z&Y#o%9o}LqwS$`Ll=+oju2_1Ahx^aWCNDcxgcU_A?G(@1vT-G!pul@(5%P2A7tZ4C zQ%gVBDhsS6v+-e~0n12bXLJOh1I*{G>9Q6FtfGt-R#A-uSnP&j_fPRCl-Nb#-bsVo zrtZ?3k02ERbH>~(85d~ON|t_24&XgO!x6G2qkwv&Lpn#w9PDNO_PS0I9~;8=QB}X9 zwiAKnCL7;+Go>?AQF($%kGkNKAcW*FmPdz?QjS2W)gBA$uTvAHNi#|I>7h9hBZtWz z@6~Q5OZ0(;n)t4z5D%(fgb4cX&sHxB35cnwd4*to%5RzNn>7}HeAq;NDYMg26zZV< z&Zcc25&EZm%oh>#7Aly0*ys zthLdbtP(UlGf$$LW7Y*LxGT{m!89M*Ms?4w59es?oI_i;wZ0rYtt94aqD5w2!Gwr5 zW|zcZMYv(rZc_BAmv_Te|0Ol&O1jivJl3T0GLPIMoeS-(3oe%yx57mJ=Y(pSo~E9> zp5BfMFGSdZ1^nf7V3O2;NjwAsLLx60_+p_BZDZ4ThjS}zpaE+7IKukQvq#uGb~s8h zJTrOl$d-CP5cOMsmX~W?u3?j%><;EhajDBcyeQPH*sE3_yLmT$j^`rSsGo)e=ybT& z#s|eeSc)QZb(!txhVQeR+=)mvRF4e??oPR&(Ds>yn&GiCUSOo%DllTL;uIfKymOkp2=5IZr3dv*SU>_4G!j-E3mz#21 zJE~4z?cihy3YnJPAhpOvca^>Q_*czp;LmQ3ol2vA8g?hk3W383wu`TcimO@vI?5;t{QW~ z{l|s-rWj6*U?M#Z;WetB#Yu7+qToz%*YLUzRBDyL&Y5Yp|0#RPZ&9QSA0{TlK68Y5 zY`k(x?3PZbtxUcfUE0}Wy`k8H%b~O&9}}G-+R}-1n!9yE8Ir!+H=(F5#lyqoS-G6c zz`Nn02PY7+%JHcvVZ;}1;K9vz)$*?RtfNHAN?NcAL#kmYV9;%h>MlAQMs-<7B93gE2o(t(KGxYe+c%!~pY4E}J6J`A^H9{=c^0a-5v`=XEb>1P&rH-!EMDgOb<`Rflg#dxv))3aCj z5+KVlTt;_I`}t*GU-l3K#It)#{ZFl;8+;?x+Vb=MW$409l7)H2&sA>mn1@bW!bo51 z!ib~>us`CUB7TDTk6#4V+|>EUjLUvpdB|BmH4;F8v6=_oKpEw4Xl zH(b+Pv@hR1}|iuNw~`qYzM2Ve?0(8g_;L zmUYG}8)BVB*xWuNT0v+ZzNM|^r$0>%GWi;ps`Ix8nBO%d4IC6JDRoN?x8M!RX$o`` zLon#4h4e{%iCgUro0IiaU@p?%6~lFbAI}Q6H^iAhIl)}PG3d8{d=D6zg~g^lCvlGI z%OTVnrR_*2_Wal7_1H(j_YzC*b3V;dUzX)T2RN}$CD?h)bRCPZ%O5@D3K)r^AKPOp znI|jvzTDMe7Pp;wOpioWIN&+e;UQ9ag6h!+vu94lN5o|6VYn>>

YL_xH#%?%OsoES%S^JXWo69r6$bCSxreFKa$M#|@Y^-3ea zmIXcG>~wZOVT!Wx+FAOI^H{N_ne^QkI#HSqqyY!``zi`=!biWGGcA@^B0RFyGeD-r z$jauD-**Qjk2xN`;6!fC;Jz#EIs&J5_|AJCZI_c*%mPV{HJ2b{7#E)_?Bzpj(~_Kc z-O0_0Bt$iKTAPJah~h@Wt+%jM3?JVr=W>7K^Bd&%GhNKBTxEF>ZWBtDj2wL!zFG5N z>M|8FN%#?fzne38g%R7i_Pu9C=tT6pBRex&8J-W5anndWPm0&#A1$Gc$%7~(6XjAK zQB(b;W0%9L${Vo_+AIRF;zwvaas!9XKV~F`uTEZQ^#|$9i;{(}8CIR2qs#!;JrpVt zTh=GC7)NrIZw8Dx3f2aMI`_^0^B(HTpEP)*vm&yfu5u1*M3ypkZ#Yl7zxN;=EWqau zpD1IW*;$Kr(GFMOEWVA&THy=c!xySb1;y>LITI9OZwK$8_4_@qRG?_%nrkFr=T5d) zWN$XzJ4N;E?syI4UQMZlpXBuW%@!M@#IP) z=IO-KhU5ZSr2c?YuE5~zR@I5zLzDN-5ljwQD_Y)KT2IRS)1S$jQ|GPjA9~Rs<9^jg z-YDxF!mz|i`tX0DvfSZ|c1h6UO%!=JY2WuM zbX4?0tT3rHmm8*D2<nDuyJam#aMdwGpj~8W<2vz# zM#RP7Ppx>6BW-1g1rHYr(lCvE-(&Nh6Wo2w3(VkplSEuT?s0e)SzVN0^Me=*T?-{* zWHGY+XC7r$tMzWg_6dy(x-UEmA!UG9UjQM0QG;q)Tp5Q?PnVl_`RzPWrrqV%Neu}7 zXulQgWB_O|uEJ4L=;BfSHb*DlemfsxsxkqJ~l*c&!f4;**qWfv$gpi z3`oMt){@vz8C7$ZE3~bo&YL^Z<`!|#ZIhCa${tilo{tU+pd5_E^-mbrNE39tD)i)i z%h7kA#=ayZ$tmc4-x?_!W}WO0?%W(Kls;ZMVBc?kN<-5w%J4PeOEc{{pJ#LnW4Y!% zsQU+-+xNHOxbg|Xv+cRRqY6dVjPh4YpJ$~WVsAV?lT;~Q%2TZanWIJ~94FN7%x65~}ehX^w!mXUaY~*Qjkzla~ z2!#o){w+JDiq&{M@38k~LcaB^ewd~_q$Ai26TL=f$)(TPM77L})Bg<$1XPXAmWLCn zpr=z$BD+HN#ho+zGYdz~oZ?kM?-U6E#>s$+!6h);Fz-g<0a3s0KB?r&3oXTu{V5eW zLzt?ai+ECDr-nbbojN&R7LvIa>7C}Buj0+^Q&>{~Oh}%+{o_#ZYT;sLf;rg@sYq08 zaX`J}Pp|6LaOEvQ*I|g3$=~w{mj)SmQ1tJJMN`>rD}cHMZG~ulpqL4@wB@D^MUI8Y zyPRx#Thf>=q%a}q;7=<)HS|ggM;WiNi5a5MCzDXqe#cQ`v#DB+c50|c-&Y`W znkb9EFAeIA$8g4g&-#B&?TM}ooqVhF>$}!e3H6AT6Pz9(`fDKccmc2H|F}Buha}L) zkF!KjRK$fi0>pt6aE}ZS60q%`^n>#ftH8riSaL-E3I`taPQqSwm zth27W@7JF{f5r2Dp6C63y{!LC!JoIT;-{+K_7j)LS{I`KJ-aj><|vrtQL%NpWOLZu z{#w-A%%qcw&%0Yx{bcpuRXJmr>0CTV>pkbV1jwG!dL25CvKm@P#G`xBke5xooYaF) z;Saxp9kZRDuPWN9LC;lP7ubzqQa7YVOC;{SvXTpYhY1v>Wxk{Y`Y4*{0=hbb>?I5p z&3a++eJ==;Y7&4p8u7v`I{fqYcLh(|R8886zpXD>&%e&ISA0?8HR&XT5EtEZKbXAT zK+bQ0#hcEB&MHu}ecDGL$Qj} z9r#CZDbhAHVb@xG(e9GWBs;60pH&bqFOr5z-E+{$Q1(lLl0qFhS=@=h|MudvF<8SO#w&(KsDp%D)|tgYJb{{u%pQn_c-?;zq7a6jSp_i{E3C8`;uagd%T#x8gD{l_j<3bX{HR6R^{&vgx0IbNbCP+7+jRk zR*j0g`z#IwwQKP2>wP8y(|%^_DV#fWKfW;6Fvd(#?fY*c6{E&ZXK{ZxZzw?=qK^=_ zSAi8pr8hs+AAtn^lXHg@pjv#?G&sF1l ziUS^fykEiP;HgG`zGejnN_f`~W|zSyKW^JT_A8hTXtSBNwXmY{;52ZG(0%1kjOfRq zy6_=c;aUe@ln$Qi!Bln2K$b_ zN6|oYTr-6pd`nCUk^MrpHaG;gESq{p&0~X|xh29-?D)K#8Ca%uRy9FqIgOVFlU)PE zi*7nv>)M@rBGhbrPsq@hjeT9Ie%=|OZ_JD~aoxn-3iz}FZwlopDoTcRtZjryplq|{ zLQGbMZjIcs`~c%suBvZk>GdMC=lV67hWsJ71)zW7G({7mHh1;G$J4h8uF1ylEJlj< zJN)S4zzou5o0Afs`zLv|(r?EcQmMX)>o(QW@7DMAFE!t6Vo7v!QB6)6+Nm}@eK`hG zLx?k__<9iM`IX>)Z@@0paEXKU1lS3J~9xEwZ&;7j| zyQO09-MBxeALd?>{fXpGrsiTG5s)qGVEDF-h&}1)|y0;c(K_Rk_9c09&?fLV)5m`_% zv<(z52gs(k30=Ll3G8wcUfw^yzQX{(nwuA!7Fxyy&X%Oo5pL#sF-0FUKy?iP%$O}x zlQ()&hrqnQ19O}CJ8v1r?G`rOkTzT~1kxNr>e{61+fp>9?QC?*+pj)jh$-3<@uo4err#Ffy+}>D)NrCuX=@0)g{o6B# zN<;*N-Xh6VN1%hA$UtBmG}w?T(}$h9GVe4UWr$Q1HTaZTp9VF^%;Ai^e#(}pE~R zt41dNBY1qwQdXgEd-c=wn8{tIOuZN~b?N)9%_+UCy(ebJkAEMywU;F4IeHZMG^Ldb&efF---a&9DST7mB!Y}TKNZv)7MHboh`JhAul&d|f3HC*fHdD$u`2hsv zw3E5!cj?0^MxdVp%k#(-HzBzMcg&57H6f1S9$DPaByD@CC>Mx2Fh8T?=W{eljZL;! z?}tteWb7-`{@Iw%I+1BQr!B(RQLZNlEKdexq?}VgEBg>hla$pgUP0?>9CP8^7+6jH zb60v+t`b2OnYR}d{7%8(BBAo(!qhqCbFlwb{jY2mRfXLVABG=de>d{iAmJUXwryHL z@BfoW*sNBn+rHq4&A0(YtYpLuKi^g*4>dbzD0CrXA!kKwWdkbrUDg2v_!zdrEmLJ| z%<;@hJlX}Iw1L@_7i%YCKujM*0~4inc*hAzl1K zyC1f?D=H^;6$#DGoF&ZYYXv*}uCc}g1k?t;sV@64e%uIn@ZEk%Y+_KwE3-k-T1QDk zHURsHJQw&TO@{CGpGr`~#$({A^r+x&$2yZ=Bqh=-+geom^FDS6P#-lUgk#fd7%q)} z;&YH#9liJj+5L;YT z#9tyi6&8|0RY9RqUOazqS@!365hTjzE&A$SMYI^GMDp*hUddr!6|%h4r$3ByUJ;OX zq_kq;4l7-TiE_ZITmf21QS0|b9%*wqKdz`gxHqkFszmwUUJV4_PDvJ_H1X9$Hqbk> z@JFX3E=fh`v7N-JL+5_b3hRvGwK>uLIV%oyXDd{>p)w$;xX z^#jFyN6ucqeefy}X+>*mB+N_la;)|c^so+B1+K&<@~Y>ga34g5wncS~tw<$kFL)Df zQOD((hCk$sy+pk|J7t}Ntel&_SJ~_Tv1VtRt^FE@4;!d_l=kU25F_%e zkW|d1Rl0c|RSiA03M*6{T%Ef;*NkBrD2Yd=N(JT(fP(G3 zslH?!cRk93H>DKjG?z?Wwoh+~PkA2VhQ3|f!t6MzA8Bm>*2IaYv~f8p$H&U^_~d}$ zwLIFD;MI91l#No;-UayTuU_O(G$&-QH>3}<6(um@9hD(GG^nKelVc7v4lG}?f0WQI zJO2jn)bRLDSF?6gs=t`6AKOYj7@DeV9xtU*Naee!#b;%Ce6W#4FIGhP(m0G!?%mf) zyX+}$U24JjXKq+`ih`_;rp$cVsxFtRYU~nsZ`OAKf@KRByz>` z&pdP=DZY?np8I4xYLJS{XUUC3N^Ym4Qq$bAj?DVl366xPh3wg$SYnFJxgSy9urD!k zPt|V4!_bmJbv%j~P5DbmZoamS)@&5@bz@DT_RTm$3MJh)Lri*DXp(wQF+0?_Bc@Xr zxu|NGzM8Om2_e)(GidbI^tOMWr60cH959Ar%AXliYYrssr}y~YHZTAIXz7wD24Wms z`ME*Y*~o}YEySIxghxu>SRKO`j}SXz$d}fec(tdcZ6Vd=>$#9-T@?E+96R-7JG4SQY`7O-v|Jy8;~um)}#cKOMkD~3LIuk*j8 z_LUvFm4Zjrn`!sV56xx7hGTk)TCAt!L9g&d0hyU189?U`dBJ}>c;Dr3C@(m})!vso zf>{*^2%`n6t935Qe^lJ`Lu&&g8 zsSHBxC72yeI0*WGCY;bXuNHT)9zkMwhOnkhZI4M0v}dR&S_UBAR`~2)hlitE{!qEz z&_sa7LEE;WRoXrI;EovW3c<}WbtEhym`<9rJCpY=b@0|-fv|Wpo&+Cq!xLK$x1N!;T%*6oDODX zHhnwTDWuCzmSbtpPI zEXx;Zj#%WcS)LAjeIc;B=^ZW&oD`K}2=E_FfjrOEhCu1r5EfLHeB~C(hK!}Orassm zn?6_KXy0dQJAJ4@IC#6hs{48 zs1-NxKhvvjtEuEm6#2Ynw9~0vj<*=QQLCHV&<&`=_$lJ;B|%p$P=5EXWVt>OK2v`j zS{<#`;*@=yH}^k}OQx!v!?GmvgSb(^zbe6ijv7hBO0~Y?`A=dfs4M1t6|4=D8!*QZ~INGFUq;`p#|#XD!@u;)Yx`bcG}gyZ82Tq zpLoeLr2;={wClr@D4wwGQ|LmOA?`AuCTYB~BV*REF19BFFHaI}=BzRZVO2@Zg0Z4g`HzRahIwm4)3&U$suan* zG7MFQ{%=y>=;X-t`Wu^OuY%IbJTrW+TdhNXFH@F?C&_=Fkj(dsyPU-^_7^r6JK2BK zG5qYzNjP|UvwkURZ8|N;q6Wwdh4fu}bvb-=$)5j6Sh-XNLtStykjV<4AO5^1r{Ta` zUHe{MP-`rykBKJLXO#VVs%!QuGECrL7yXRAGP578B$3hGNY-x>0;*X4WkXjXZu2L2 z`-dk%DzuP#jjY_sDl*8rDBF(>QXsG5f!RtJ#He$&=g_qy-CyZt&F~CWAz9_7k2)d^ z$r`73+bRk(F$flC{yQvPYuXU;eF7wP#UH8`ObWB>R;(&&XRB_* z(+k!Gq%U1$p*+k-@rQPCYJmlp#c6k4zcOWexTuC0Ca5qARZ5yZ9C6K+Ef1LGkcSF6 zYw5w+b%@E;=9kS;VmFx-;f$7yGau;{JmV1wQdWQ6qF2{*k?f!a|L++1zL1UX9iMvb zF6X>)h-_7jRmk&MY;Gz(`)6-^^&PEW-Av?PermKk*Ksu_tEJm(3Kf<9^LJ}_VLx@h zb-*-~TUi7D=co5Hl>~mQR5UuNFlh&VXen(ge`JzEAH@y%w;7=Rk`a~6XcO#EpO=%b zo_PK03p+;2E@;fb7hA!R(ZTA2QfuVc)C^g%AEhET4YMUU$v?O`tGObSQ+sixBgk}g zIoUgz1m4KPK;xv&Hyr&97qm(aIymB4>a07`!~!g2)P_!Ddt1C~+ahhW;!UBQ*v1sm zD(e)*3;uG)xKIF1H!r2}{LQwr^x4foqZinMFjQPDf*c_QmY8t!@()I+a>6$=lf55A zJiDV-63BWZd`qO{Y6zZl5Yyb)!y(F$e*bW5xYO#XMoYl0&u8kmYI}Vv>lf|sW-286 znPyUzAF|>tYGyn(ICoD;*?0bKm?6OGe+l-(OvQNRT~>FTnzIQ9q=hO61~fl#X6yJi z3CME|6yFCX|1eM+uDgq!>8k@VJ_+``Cqg^}m;e`TRjl`fBqoh&^%df%`!F1!NM}~I z7h+gzU&y*l4CCH7W3=Eif&ITX)(*kCuM2Pr>%N=Yk^t6KOQ`mv^ymT=x#I0iG`MxM zHRA4Gm-a!Rs)DFlXLn5L^XfDT##OAU^&%gT7Wd=lH9;uWO3a0`lQSQMq-A#7Ogr<> zi}jnCW8FnV{9oMDphfkJQ}6!Mj=B#X#hR(R&K27<&clTAo;P%=d^(!~NCaRAx8gRMQ66V2cgkn1 zK#&zAZFdN@kahNMy5FO%ux2~vi=zDl{>T|4TGA*Wk_^d2fP$z?8o<2(j;HEB#OiHM zIXLvaYyz5~a!!y;Nk$OHi7(SiSVr{*6&K4+#rzgNmL1Hy!lx-6os-zE3Eg~X^ORW8@ADT^L96Od^ug; z^v!C+f$pZIW&h0H6dNDu-cBIX|{({KuC&yjFMzKr$rCi zEpCKPs`UKJ4y}fCs`+dsiEI{KnD#~$YroIVg+0lmS5kxuZ~W(g-xjc7irP*nBqa%M z(?Wk|;}GMr{aP_iXmQoK%*9Q^6A(7L1P(*<@f@pxN@o64#kiQ#7siPl_CX_U$G=%(;Y?$b^nogY1^z{2hg zVUza8rHW6Rv~>5_1r3X(vPTOqWzouTq(F4wM2@4GbphR*o8XE1UF4dLAYeAC zjM>l2&}G(8b~UcYH~QP$x1C;icJ*)3+EH7%la0Y?sX*fp`M|d?ZT3z~A{ArW!sq{N zPNCnd@Y5I8tf$9`?`v;k^Be9Y*;ou$q|!%C@HUJ8nvwnz7-2O3HCe==^5t|Bdc33V zb7!orFZ~zb!qt<;iSAl7?v(w(MR*p~z53!0EU+?uGri}Nv{uFCzGGuV_%jQZ@u5+* zzXJ=_Zia}SBwX6I-fD`5oUUD9ekkUjmXfhdLQclK`Xgn>ABPye+A#Qv=!P+O)*bB{!+D;( za2w`faryZa{g|$Jm!bxTb~w%KCYkH&9k*bl#H>eq!~E`9!*$+(7aD79wZzQh*3&|o zyNqNu0RNO(BZlIhDCcq-q9-RD!!o@Ojd=FDVlb$#beMx%W3+6W!8*OU)G}R2-EEUqZ^Met+%79&AX_W^(C^`P1tuPncQN-w6F~TETMQB#Q+P*s_x*3Fd>2dT+|?$ z2(RE}u|JGbdo^rWBE*l#NC063iiGw~!9S>S_>w9%PRq!Qw^VYo3uxqnMis!t^vUK+ zl)bt8xPVz$;M*Db_l zXrML&!k@Z6KFm5=$aAHyBu*0SQe^2sXh`-G_bbJ_JAEpKi$Y1Y0y zR7mlNcoZOqD2(XozTXhV6HZ3`d#D1#irm+q2wskpIUi^!U-~?D#OlTA?lbKM7U9sy z{Koh;jllhq%z#InAg7f`DLyZs^xJ>1^}q9TkTO_{MX&Lk5xmIS4Pu0l^J`H|W8iT? zrQMn2tQ_%gVeHlm40O(Nu&P*v(3`TLTQPKuu|a2DF-bG~HksBL8P&f$L!MjC*Lw8^ zFv)h=Z1*%bp#CTvD{R+5{un*F9O#{e6E!*MuR8Qj1?{W6iVL(Z=wmvKa)67USySih zzBx{l@PV}{CS|@Zsu>Fsmmc`G9b94tU;~%l2slkTV|4%bkC|1j>r5-g2I*w+fJmJ* zdy2F~>r+XqKV|*8g85yg>Asgos#_ArX_g3O)TP2d<~Hw`V32+PD8{RXSs?CFzPI)oUSo%H`Hvk06A()o4NwnyOC=$ChUye%3d@?ZjzGqvJ zbyGHawvesd1@dHnHGdgkHIVkQM0(j-g<}*g3=65yI6#US4gdT~Pjzk*L#Q)Lo2jG< zWhWO3p^0tNV3jW})}FZ)IFGimGs9L=iJqgV3={AN#Wft08Y%CCel0BvH zA!O_J4Wo+S!5IH)Qi^eXDbNID4Z>g7mT79h@u6J%7Cj`!9zb z)RanSH&r{u%})3Cu1{2`Afq4jh)|Sj1E)CDrfMQQ-(hLEO;hpMN{9!N`=Z7eLjNuZ z>H`8f6xyB1M24rJ+A`?R8vmW%yED~Mr=tcgwKUlxi~E^rxm8k~S zOh^QI=%>W__hl&urn#Yd+;4%KI0@}7B&Mj$`2p%`(ZzG6*Y6!0abWyq+GW(W%AMgJ&iYzaS;uXT4N8$#@!|f^O;F_PME;Y!Nr3l@vp%{n0(le`wZzqP( zWFLk1q31;bv4N+uRIiIQBQ?>3AR!iXb3^#$gLC7vCR`8hf{@y?5AO2wtJD@*?IEJu zW&0pPyz<}jib3k~Qfj+ShutHn;rzrCRnKCbdq%7-2jCBmwjCCG0GO=?{)m z_JD$5>U}vNjd{2#)R^%Y=PNy_FaHT6egdfKpRsjKek9e{TQ{^ zs`AjSZrcsc7{vZt6|(dyYwTX6F|5xkAe}*UhZXxansjFJ+13ogqXmCj4E474beY9QWs-x+E%LeNG7KKoC~=F{lN zL2{HrGwc`6?0n$JI{w@*f;J3Mi$CS7EXK;7JfDd$qyOxTx?DJZUt83co7@X}+2>cN zjJ=(Z}K1SEZ0h*oN+~TL_)ORy`Q*FJn%zoi@ z((qfw)oJsc+GlQABL$b0-&z3pF*8)fca_3%egS8;o$M6Owp=#%43AA)P8c+gBaW$4iAk0aX!)f68W> z_W4Aa6f^Q#C4_pIgz%K~PRk2>j`Sc1M_#I<^E#04@*bu;Lic*K2IJ%GWj?YUoIgve z1{wCBJTQhU;w^ei8eCDcuDzT9*wUHhTc>%&H5>=l&~$#5crW5%+;2@&w_^ncv9}4k zK|F2Ilj6YbbT?YyP>rg?K!?;+#!c~k(L(6DX4?Dseevy z^lGY0og2latO$~t@)#abMOZR)5Zw7C=6TI|;nQdGs;Lu64aBN$18%H?!Nk_=4^ro1o zv{J)V+!41_n~HmSy-A9zm>o`w2L=pk&viHqP$yNkvY`)IHK{C3QV6z33$WWvV@=sG z^OX!#=ZiV-$EAq98Dnt#)q->P!!KZ*yT&r!Q8Tmd5_`Mv z&I~b29$r{$YuPMKx?MA7PoEQ3$5q(;Hz?T7$i=*^>osM?D#P_Qlr?!*&X=5o6sM9K z$~fpcZhhdt-jjAUNOVjxLMk@@c^zDHm$1+epO?63KK*?zakHX9vZG>W#g(99o>81U z2$ThHW$Ub-eYIxHd)b~?*qcD~*kYGtd|s(A3m*ZD`M+X&ohJtj-*JoZc~Q0+sX115dnN`T8E zvWucv6o_q+#jkrvU*PeA#Fi4M)WdU`xuf&HdFV_9+N3DwDlP+!Qu&(YA$UtHaiQ!cGA4?j}-w-QAYASFA&e zy-I-i<`lg=i=RtfBh}`3UDWv8@ zf8$j?3PRAV(auY~%vD}+pLn%$_ZmmjQCykAD48^950;6$A$`qXu*p;J_|FMISah7R?ETRSK*lg0f-))na>wMMhVU-fm%F|e&M5SoEVKNjHp zL}k|m$0ZN{@n7Ym)0_7v8WrS4V9uH|YHC$gX&FvWB)27=4@3~vx0!LHRQ+&qKvA2= zD9~8dUKW3Vy~t9DL3p4PHmChghLHxon+q2rh}S9@bKQrzR0}0@e_*$5h)qj$(Bs1| z^;)^Nfkft?%M{10$#Cdwvr5QqWeN8UZLI#`ZL4lCOCQ61S8;oW76H84)E^+|QdZj# z>*4E!RPm%vvA=JJ2;a=O=>dR1*MqZNO46TI6rxnSiX`-Iz_VJB=7q-5@hgejS%$2% z{{|wCHvBcQm@atFfHO|rPspt5{(_2^js|w-6<(0$QJtZcT+$WWim>2Io#pe6bgN0f zG(F6km$Z`TNYKgUf@}*!^rV&1WRes%AHmvGjK_F_q3X8a6D7OHLT|22US=-k8*ARC zEC#<^4`yXlyQ{+L8?ltEPBm+bIUu+JK{@mLUH4AZ0z?T4oM!nh1XX}7h4nSLykSo! zg0DS5<1m{`<X{f5M)rcw=UmQ=xqIcY#-&fQ&QGw?CL8uFtsw{Fw$~ zTA4E(ArnoL+#)iIN-d6s{Tn-;op0+VE_b1#5gW*nzkXw^NG?kt=hkSD&MkKEf8aGt zhP%=jJ0t2*k&`*=*gAup0^(+QUo>h$n<=b8T2a5VEG@q)V z)VtU4h>8pD7Fr$FST3UkKE42Ys(Rk$uXSmzHzYx1GiqT9B9}?>wnA2v0>3A>ZCu$u zcOvFe>IJQ$&FrV12F+jND5L@-HsOt7@}!8>Nc{ksV+1~dVa^SBVb}PDkph#1wVC4()tZbUzk+sRvzS< z2QB)sXJ$nn*045Ym!45kMGCp*{0CWV&N}nJv{m4Htvm&O#}TTp83)p1QTfxG-?d(Y z)8&JM3C-)Wf1-PwfOyNGIiR(?o`h>#@(4);j!iaNq)1+^DGogT{>*ASk*AZ4RG zP(fB`bqov7gK#6#A4`36SkvNbyPB#Jjoy+IKv{!%3My12pD=%)4`9Ie;#>VHtwPg< zij1uww-lhg(pg1AV^aKP3%8%V^=G!0X-KE$Esddx1mHy9;71{$GMxUYx?NVX)IdrbT>^0HQ&-SPbQWegJc>+ zZlRw~{&qSygSh1q)z0a&>p~x$hL+&VT{Q(nbwO6nap0jwu)vj8y9d`=G#7 z(IPh0zpXdzv`lg*L+tZ>^RbLpTuaAyBM|shcHclJ8GSc{VlQND5+BS+Yj@WN1$MsK^?uH#rvPBZTXDgdjk6QR%el%>sej{!dVa(?4pi4lH!()lAo-a4#CaR?`l$wqgk zKPG*LjN+-io3V=?yqbZ6h}@Ggs)e2dit=S#z_8v3hRLiz_6|?JmAAk+WXt18Jgevc zgGMw2E{D}q%slGarg4ifasL@cu4iJhb!l$8JrfL^F<1yn|BT}zp5|bMydy@teEW2w zhrQ-g^B5;fL)KwkYCK?WV(W+1ZonVQBuzE>8bGscMR6qFsPF#hw&IAEoq#cSE6lc0 z3^Xq(PQ5{P} zROcei$R=cnXJdx5nb=a}sK1EbNgD@w_Rwx&Hsizv zc^0RDsgZt~GJF8LSECtLogKo_A6ixmc-5uo`asuO-hF5FyJ(PbfP$gjUB}<&*<%)H zjCPrM>!?s6W@X9u;B`HyU;Kab5FThEP@}E=ichk;FzrcnWtf>2VSneMMjn_uhBtTI zzvwRSDQ~~262IAKM?5x^A%HGt?mIm7Smzjsz8v6D4IZ;V(8eOmeP7y4hTZ$JV#S@U z-H}kIalP`+UwimAR#UktZyHn*|NJcrq^PE|Vh}hCkOep*iA0GJy;!(-C}OK?;-+rD z_SG}t0xBS~4}Uc%u|s;qk?_gd&N~I!o1?f~Peisf4jWFz;}q0$1m^I23$IYan|>5m z89!eL$T2rF^dB2aPY>J)5!d3Cw_ZY2AV#0gmH#5mo<^%Jw3R--#gbK*CmrHHH!b2fkx20yt^4gk9)FA*UgAOLuW}Y3!a0pT&Y3XDTtk_wAdlZi zd1H(lRdw@i2~C9jBnULv)qSS|1h_AF3^3O90AjO$G?=Pomh0H?6z74(ow-!~CTYqJ zM<7a8p;r+)q&IVW&Tn@a65Dn_O?ZpAfUbntih@9MMOo3+sCO25JKBXbZlhm?m}DW2 zES(A_JI-;YR-nxVOdqo!^~*1bjfz}`|AnObj8`JD@yrrX++AK??zE=n?)bejv^#Dq zFA|WOYAx#EG>mGOs6iy3a1r}KM-6LG_q-C#55lYZbU5Ri&LuM_!^=029|oPtWnHFP zzaRoL)SYsy0+#-S!8cL*5(;`N#|{U8E~uTvPkH?!p9=*d9E+~l5Dc}qUJu0x4KG4Z zT=$Yc=*xCBzM*7EG*}K7&W}!3W)<76I(G5oE_8a^Mx8E8ZjgTRvVxNKP;A8^*}k~_ zx2`KQmJAE;OadHykFGr;y9qWLnZ2PCpegRn+aIT!i0q!C(IAvbna@cCsV*$GU*>`wbKax!=P2Kc1EU(bCaURgH-c` z)78QSxA{sqq3%)}IiQAhLng=XZa`D#h53qX_dARl@gI*;wb(el6KSI^GPfXiE^2=x zHPROr415m!ft{aqr8)p7JRb^FUij36{mQ$p2+06VOG_Cy;*XJ-Hil@f!N3(Y`TKyY zB6SvUN~#g}#W%P4;g)k)fONk_nLpac>W3`AABzdem@tRWzsili5`N)o z##pe86xFFs>hr~kdX}ujjs`{WPF>B%fPX0=2;Oac<{Q_!b=RMWQ8$|OS4*X;Nq^Kd zJz#Gm^!ZxE%Aqy2E$#4pHH>y_J7Socg5+Ln%okNF#*n7G zo>zXIgp%{WJ&EyZ4!5#0iac!DyWcpgkEe7H=rVXGO~>cbMbOD57SfCgx7KCZ_BX?1C> z@~NH8(we-gvx;Kuf-Z7EBZ3b%`~xjA+N83fl?Z^;b{Gd0=%08)GCNSGxfRokw7VNO zLh`3`Gk5!ng`%zM)FoJ)nKJsP(%8bWp4s>H9?~KId*8w#myGTWSGm4r3Nxq z1T9b@qW+3Wtip>r3EMXMHsI03D>N}ecl`|b zz{K)Fq(ZZ7>ypoZm9>Uxmkb6iod#4~kU0ZQS!nZPp=Vaid{eL08ifY?$|Jx^bVYyxZ68;(%v5ypuKG`|A^2BfLQqG} z{uTB@Mh8iYtD_Xi4bl+ZSQC)yPTlJ~x}QcUHJOXoFddVCWyYxpmjr(Xj3Hwy*k?&g zr^`FZ36V$#0T3{G<~i!Fw@S~u>>G6Y`1V{F7902KkWfz%T{MYKWb)zM5oO#(2&N{d zc}9*ysv9lkdSx%k<1R)46x6hQ`02M~8|ur2rlk-d1HU2HiFs+~iF{Ro=e(q>TB9ZY zAKFMor(`0;S$`0wL>6o6bU$)AEuG@mTsDjR8ugZ%p0uAeI?}lY)eT7g`f%=(Qh_7s zY70G}?LAJZzK8fyZnH)QKMdL$F1fg_N+`j@xcUW+mODk4ZpHPrQUd{w7-}XWzmMSXruRv zG`Vu^m6hFUBclPaF%6J3;=2Nzt=&PxD7fxHNv`F0g+Z64Q#YKwOoFeB*EPj<38sdF zRa?yLWq$N=NH~ciP=IbnD#4}6DsXANowGIeE(al45X%~vWETH|;#ayMiB5;k3NZ0!EFuqq1q{1=4CqKoSFYavDL=EJDWF7=rA_7E zmid%2?WZE@KLFJQH{|_q9=iNVEC>kkl|3~!>cDh&sJ!oY$)j7!w8Ie|$Ub}Wp;RcX z<2+g@?||*N2{M)TFN~=8pxACCxU#qrF$a>$sE?yFV+2x1l4$AjOYk|Lg};K`f`W;nYbTS#ciyC#;b^t+DfVfdY(N0+2T_p3jqqIA97wYMn? z5y~?b4SNAvJ>6&>aZNFuDBJdNFlpcEyE7FEHqTaa%6y4RUwiP2ch}pZ3GhOBPWjpH zltgI#v|k(FAhPsBjv~UVcW%a=2(O169*pgfK|`PnktPz-mfe(U^>)L6SQ<)MT7Z_n{xQ zz^o0=zU#7&5iafuyJ^{d#`>-T(LzXJ96xo(Mg5XTW65fFqrl988T#1uN=6AVKIpEa zSq7|9>^jz`Hn=U$tCL>cR^Ov>Y$kTYMfK@pJKp7cHJojr*W178^n3ogHX@_IcFH}H z?QT!D-n>(=QnPqm;w}TIqFCr^wM}XdalrCV(aWvXdAK)>`R@TJ-ml`RSA|prYH4~- z_}hx6-}KgQiND@Uv@<&Y8~pO0(o?wM&s4j(nGao7&Ry9#F=(XbB~toQo@V0aTlv@z zviCD27LypJczU&yf3df+a9?daXKv=F|gUt-MuK9!*!xe@7suABrvXq1LL|lV=M@8HS&_Z z&r?amhs>I85M4y_U$!0XZ;lefE3hbd(~}H1ak>v#Z`b&I+>T~Uh}rCUhAz|>b*E3w zWz#uwNPQ=Pe^5=;O;n6{zQ0H%%by`#2;w_8oHKF~n;ktHQfYt|XsJfTp)p#RpElTaSs{JT2R6`iraq=2DACD(EZyEDO%}P&(n^d&FtY zcWaH58*hH;fpd~Dm`nbQgAGl~YoWsw7e_MAX(|2^$3RcDtxP)iyL99r3tFTzwS@&% zVfj<7<^T%(#}Gb{wTaS0zjkU{5OfEaw zOcl1|@Km0)`DrJlzpTgS9+CdJB!ELtAu^Jv;7w*alfT)y7pGoaVshrw;e9s;(Wk*> z$(&#whgad%b@eCF)M2^+sXY4GKlT=sQJm_Nn3*ATuGklYQ6jr9ESo`CfI&c#a8(&d zt=gMuoby7A^XuxM)&im#fa~YN`H+zT;RD)XAhi!gc&VSLgoEgyR44ZER+SZD!`ao7-HP`z5q7 zv$@VSq?);eC?p|uwzKIT#in5OS4aRH@%X_ zI-v0%b6e@P%1=mQO%~wya)V!>0jM=DL9-7-k^OIX*X_Odyk2mzgN**mUiSayp)iNu zI?32dg{;<=EDlVNgQwnpXPwLy`LtY6{T`ltIy#hs=09oS&VQD_mF4ZVWLVZ5^w3Rn ze>bO6`CzvwpJUbR>WM4(4;Lt+Z&wH z@;6>j0OhS3S7Xs&?3W;ruA)K%CXc)Jp%Ry4?EHN$r$fyoN`E;{bFaNv>{lmUhv7$- zip9}g-Fubb$Mz4SgP`tPp}7gPTxG z1pVDSU62c@OM*LDHhGS!LHMG_JlLhT+@{WRkMfp3Us2qSZdE*t#J7KcQ*m)9y|~sTK_LWeKq{Jx?{&L?E-vILvF_ z7O8vpZg)U#%6)v}c&cR`UFA}y+vN*cDixFN&qD)hV4vBU1nWMr=Ix4?*j~p<28GXD0wE#eMz&gx`z3F zk-(5;jc}9OV^vPH%yhc~zn;1S3Axb6FH^QXdZI#7tT){Yn0DoWjJI=rpI;g&&sx2W zwV+-oVn%Um3!;@JR>a@aK1l=GfxYmP%QJ>_MNR5ykjx1|exdi25s_Lo)ZjhB2VbKm zidCBx9dgV9>lM=VbDUJsDe$f}>{a8!KM5zsb6kS3)=rJo z@flHxMGp0+)P;rs!^mTX+YAsZYOy~r5znwPxWK-Bqd8#S=Wm&&g zGuxPF9=I>*zx2jLcpTWAqsYe%4`R*CRo?;q$a|Hx_iPKbf+47KuO81qnqbMn6=SN<6D z$#Q6DRKl+!d0--ff<87*2FE$F@1fcRRvN1&?;4UGxx4O9`ir&|;lsM&q`25gflx;j zt?`67EjuHHd)}rtu`A{ULj_)KdnB9)I^XH5qle~1MN4r9pYueHDip=b?q^6tL(*oc zrsy_Po#@{Jx@Wlaj!N3~#_6P@udDPP6gTNZLM_6ByjDwW9^*+XUJDEx75Y^|6iR3V@q6flp;gYm#bJ48gvB^6dJ{aw@Mcm<|p5`*9l zNVJ?UXi`nte6y#D*qT+~D zWpuF+|5w!YFWXUid~@Z13_osDzCJYWfk{G|#cOpm^8UHlVcA+pWXY3ovZ{EwqN0iZ z{19Ut-EQKrG^D}XhiVl*XR0prJaVxWZ1i;Ddz22gWhL*mZGVY-ZFN>_@0=Hj&MC`s z?-Z@d4b7_A+po4;$sE^cFVU|Hg;sjKb}?`Z9N1Ybe5Y|7-rPMpVgBeq!d{P&Z2zZ2 zRG$L^^#G{8-+rVXa-%19ok6+K*4dVkGx|geT9#BPl`Jbr3LBQPzL&R@bja?KoVc{e zT4XftxMTYBHgvgiV_*xxWwptY&X@R|>Oo@0%mT-}97pF|SO%#cJuP0LvE@yjN8OWULDUQ0hOu_!hHS>YuU^~wB8nL49H)2Jc4;_2aRL^8aU zJen;Pkz05B=I~_DIwz}SB8~Byyy1a~Z1RJ?qQQo)zdZWx>t&Es@gQRCT zBYWae`5I(M=|S&Uh@qPfP#xD4WPD6ExZ0hSmpU4>>xwJ=15?)#rTEe+109+cHv6=^ z%1FoR$xbhH&JKEu-n9nU9aGEiEOy#-*B4%jSC%$=QP+YlB9vdS!-PA}Rbi`;%3_3v zT2;P{^M4Jwpet8(Pwn!$uTIOho(W)d5Zs3^Wjk$!IKtj1AqA)lu#(w`!lsLbZ?JJ} z)txCl51k+_u6n^?p?~n^5-QL@^-(H4MO#5N=MgYMBefVkwoy3>IZ@R>X^a&gP`K%p zA#5_$=An=3crn>e13PSlg-Juz9#s!{&7i4UwtCMmoPRjzMv67|0qdoFmcRopEH^U_ zTb%b)M`p7;VmhHjI=uvNrWdz5)L$6-;6&75grB85+~hDN#9RIOlQ2UAN2>n1n|@R- zU(al3x~omnec-mUNmS62Uo8zxZY4Y#TOO-8sG+_Rm*kDU;c8Ac?^+kFX&$FbtwJ+c zvaR%;P4rgN;}@gWIBh8?>4Tsn3lZY9_T}2pbmBv}PMrV8Y`)E(VROunW;G7!zmZ-p zRLddED===T*>Usd1d7+p_PkXb^`>DPBlp$9q@NaP{%-VAuYZ#`p*)OVlhh-YiuUsy zueEM_UvRw`2!hAOMd3|-r|;wS#Hz)4!+@ZI&EI9)k0G~25qzMpcJNWjC7GA5p4H|a zpR&G1cBnDZNcd9fhh|?<2!WYv&IBmQ!*=LelJ56jJe@m^THzIO7{lWK%|oFbNuOL> zXn503vv*T=MMHu#M{=`t)eF>R_vsZ|WDysG=`1h zidK3Ij7$>iw{cO12XR-r+9fhi-1zTcZ^=-yDvtZ!a8FFym@z4}nFzgz(1Uf9gBcEX zDz5KD=yXQdy+xNAXVUxr_Qmtqg@aTWS?O~blg=uhl~rt8&w;gL0e z2>Y4dl7|WI^){8DSK-S4zwhV>8(~vtsHX2fhlJ4z_xRZ}j{aY!=c)tO#KrYF#e%zN zlONwgC!+<{If^dGX~2Y*6!e-AwM1yRpepBC5u$->AGgE*hMq5LP0W6f*4$r`E%19j zW!4^;6CXKUd%*pSY~lP05}cb%2(ok$UxydN_R>^+%WD zW7o!wQMz_kr&?tv8cQp*?!WGv$KAUinSOtdGFfE9#eO~K1)fHA97aO)V@HlR=^mn3 zWdbr7qCtCyE|KK`N1>OJM%sZcH~dNiyrP`nQjI3$W!(d@q#FzrJ@E2ZzpZ20(i(Oi zrl)Cr%B=vV6Yg~jw>*6__+$NSHcjqGKG1mUw2WN@sU=cT;h$@IOa$5HkfX4PIPQAj zsQQD$NY(8pQ;E6;&0nJw{0J@~N?yCozljhk-W^!GkuF!8igfy>#>*9D47)7vWoASE z6?}r4Qg|=$LWQK_+{m|YWf9T0{EUbgRB(qSGdZOASOP;i1=} z#vU<1jhOo@Xmb^L$lyeji))UKiWqafxaVt$ssajqfY+PkCY1G2BYmy|pd2uq}~61}~k=zHCL`8GL@})Y8&kWv?3(`Xeoy|vLvdr#nP2-H+}68+!ws{ zc`Q%4?P{np13#BNKG`^L!nk4hhO^-!Q9c$${nMXV5SoYMK$DK|h~%b^ zC9j@SX-#|5uXy6xr<#7ztr2h_RQzFOk?U(wx+SyBZddh4uM0Y-#x|4Yml+khNvrF^Tl1`jvNp$d=BbV4s{KP* zZUS>*$Uv4V+|2_?%C&ay$TDer@wnuo+2!4!)%*l`ga$q}3p;RCW|FbuFV8(b-3Jrqbw-z3fcWNx8YUub+rqp0RKkMq&?PYiBSB_+;w{` zwCq?udHmi|^MaiBAMr@ZpIt?cZ1wA$#(5dx2(rgFMG>L;e*$3(Q| zPYkd|;WwV$N4K4b!4iObL*4Q|ykV@b9m3F#aOvjJ*(ctwhF68O$hgHpjl41-o!@w( zQoXE{))#_P{@rr7? zG54tPU%zivCzT@k2-w{b3+YI$e$aO;v`cwvzg%B4MYf9vz6FM?4B)n1UR7lqkzewL z$j>SqPyWzOwcT7O37Ca;?qLmGN-mUzd!34;Jgst44@!uzB`fPBk_t%2p`@p3Vq7oF z!a9klnrT%Jmu$OuLr7OP!evw9KuD!_s@wQ5!u?y`M&~GYF^2#ms1ONP|hBSZ8 zK<>u59b(eVu$@lUx!Ks0;WtkC`wu6pNyAD4$@rn=TQc=bo<>7ZC|~}{bY@F@?ZBzx zCnG`RU-~GP31fvZz$BBxvdCN|uV;1{Lw=;og=Qh3(xsFqZ!aUl8EDx!TqQpdL`hIF z>>j^XAl-D5xA62PlzgiTlph7SO%Z2SX^zhu^G5k7|1$eO6&CEG4rz3LuNuv@%yakY zYZ_CUG*UhPmm3sBA=2Y^;82(TM?hmYee{WT#J1e!O2zaFO|V~ZX^5As+dq>oYY^YZ zq!jcQuU{V&{r-9B;v%nFmkhR9mmnGLELkAS3c#5@+*~}{2uK&>fFQGXA^&XeT~{ec z43-qTG^|4b@_%&JpY2O{A-6kbUpDd!O59RpJuJc^YG+~{yW&qr-%DgW$D|4q4Ub6nQK>JMae*u#QGj$Wz0@20&(uc8Ob3w)bRSe^%KQtQ%dA%sw;;|jO_9O)}mxs0tHn99s}-Y@`1d1~tDNxtd#%2`^#9F6Ai3y8 zIv?vq`Q7674h5*IYhXfz{~KfaD_DOe(=HXntcQ?~I|o~`9s%3Tu5S&~VvliTQo_jT z3xD$-8KpV@Xg<~WRMj(bRQQ;0E972RX?{}4X&%8zbfAhfK_&Z8HPJ)q?kuL^GT6or z^112x$NE91WRu#)N%6r0c%wf~Ck48q4lqvq5EV9gzLE7L4US9tBIYbge)K1BtN(b6 zw^I<9gj$v1amFXRngK7S)+mP_&bHJA=O4CBl#70gm=sGatN?piw`9kMm=+U0pLQm@ zA|;tg8cHd+N!_6^nZ4_wgBOMJnA&+~n^N3^S zqHc^gpJU{!K9i3~0%Gj(vpVKNtJo$L$FD=_b=js=qxg$x%%dp6+krE%(>Tq!#Aoi| zt}#IiyB}EY2KhfK@qM`hz2vWiS6d%&)xsqILhrNO=yyYh;I^v9F~j1@G!4D>J&7?$ z^QXHJ8EAQ780Y18+o?!Rf3=FK{H~7^NrVVI&n87Rnm0dt$Wr#+%YN^HrddrAF8do6 zWy>Q+ipM3yt0ZZ-+ERaP*U-xwiJucpI7>Sqb4 zKzZI4e3Et9<6{7Lr))n-+dq~XxvNkaV>p{p(FO{XNv`|u-8L^GjwJ7|`s$Ci;9%Jb zqz#}yXzm=nbUi# zFqmc&26r2smjzSo(b69Z!B%YD4xJBTY|h-12sn3S1n6A&=d> zMrLXKN`CVZU6`?1a%|h>mD<1JWsP+j}Xrn@I z9AqnBat)ugz_zD01VT!RF__G>>rMUp_V>OIpp^LvOl6GEjhZh@>+PKXO4O7{r&ZNS zK~&EIK=}QL|Dzmff_B#qY5X-JOt!_pM(O3edpSL_`k3VxT-+A29C7Hb>M4hyy^-sF z#3XeYioz+s^+r}M&cdVFtf1S$;mF6W+*n-{Q@rZPD#MLI<53GrcwG z52!x%o|2ZX*ILN8zw1x^Z4!}7H3y>3%V3XtTn&F2n_j58Q>E(iP|WlvZNFib|2zsM z^BdxdvZ>vVp+BoEN~X4hM+UI~Q)6ZuKQz1W;qu)81GRG&u|th;?b{yCWbq^d4>8%~ z)ozM#B~huL&A0VRJ-T?r(m4+XL*DfKubFQ$SJq{K&Y|@!DGS#QQN;V+&1Fa)SI~I} zC(iZKP{HIg;s>FgQRdkdzDA3=9@V@;C(|mOPe6l69U*{Q3WSBmAALXz98{k|Afj2P z)E2?Da}(3OF-O_WqTAV{;9my5T1$h#mq$E|y&U&K0A=8qf_Y`w!O{bt z3OoYBH*&+lFojO}eAu6`nh5l@0#eXF95?2I@VL9-#v?mCcG~k_=V!6&K6MsJTGRaq z>k04s`%Hz|p(|eLi-2L$q?Z2I zPs4vgS1z21Orvyk&uZU`(F%Iclo@}glFZikN_io4AxG!4i)$<22VPT83P~Mon9EO_mnrA3yorEnKZ3 z_@R4%Qsr*iCZo~WbE2i#RUy#&w9+4y;c5|(IzQyK;;>l{v2M6+DH7{`!?o4Nq{I(s zN8(&_`OVQhqt{i-yyW3`r?ExeoJF8w>}G>4y`kH<5u!iqXB1Rwx`iOQw7R;M5S5&U z)ptDL9ZvCgKaHGbE7RQ!HS|GZIi-4)%8}n=$Jzx-g(S7g3has6QPvSb)SLCz(UOEm zU5SVl0jl#XZ$0Bpn+f(|sN%YMZ(a{cgQ%(}xn-SSf5%|br%yy^XFnhx*l2jfhCpn6 zvmw^6abm?m+`AO3kBgr*98A?z>#$S55l{rZ;L}to0b6~*0F%=jk>q*Z=})Dycw+OL zoc-Fj&%Khapd1*(8hz3^&-E@{={lGs-_~%zq<_%59Z3wfE$p%wQAp;aa>3K*4;O#A zI#C#p*8a~TrwP+e2{5BZR#Ho(5td2Rj$0+{gn0<~#gl0)OdH)zf_Jo|+awLzs znd%;lw8V5D{>BICSyt>Ziid=&3)!xJP;2Xg_Ib-$%Q;2Q9&^nx^t2?*zTBB!2BP-3 zhq)1vpf*3!1VC%bK&=&uo^^s_o@j{5D?^^$%RWA$=4*V2qCnZzQ45=zrVF2Q!=;ti zz6*C-{SF#Kk*X0%<2Unbj1#nupce~0rt$yM)x&RjGwW0h?Zcx$u2WaRJ2*T1D2s}M zw8IROQHT)bV23)^Z~5GExX;v$?L#p!t{ujt&D7?VWCAex)vD<{`(v4!-v8#IhwGJL zle=70G}bz1;Qdc|A8VCit-)^zR1NW^)bYERwWB9`yw2ZC+tPs=v@iaw%5z3-Ol2Cu zJ#GpL+QpIUB@*QLx@DE_Tsu&0JjX~|rC~cnt&?7#l3wNKpBs-gk44&RfW(AZH!z{Z zzGuY6v)<0N`E-NavI03%UAfVaKJBAs%=stlR<1ClICT7LYV(uRkVK~aK5m0eagj@g$hQq-4$#~Yb|U(HSsyH zgKv|<*}}3zj#SvcUd56KIL7!9W}Zch4KRBp{h87(c+pZ#=BWAd7X3+q z?%|q63H{r~k^>xK3?C7NLaLQk6EgaFt%rM*-cqzIBZ2Sl=3b%0J>yIll@k=^*jhb5 z9qe$c8=aZm{=jaEHch*&0yl=2B~`2^uXjbd+C5B>^%4OVM@1OF0*7yHQZdH_9Eu<` zm5ZVkEW#8h6BBehCt-;u9UiG(sQIt;E4c)y$>g{Zp(&^rUWH&ip>~zF zHaZ{}>Vr+`b#UeYo9b>Ev>5t_80Dh|V%~e1!t6TN#>>R;S^K}YvsE*#n^hwM=K@Ly zR~!*HIbaCSxe_Q$wJx`}Q(z>@Chinuj&tW@x)$`b6erPenw*i<>@EW=N9i(z;>+vE*i}R>f6eprVsTmWWq_`uTSE!@sy$ z#g}o(#M?0e@TKHPp-6SV8NEW$ZNKtqS&LedI1J&h*3$n^19Bn%MCVuU^!}a+=1GL% ziIs!db*1)yDb*KPY*$_I)f!-5%lQDra+F4>CS6?NDC~~Ub%(0)iz8~EKbvH{nBY~} zTHj3!!*HMXD0hY9zUn2Ylw^$3fn$~P+#UrmU_C&lG)!RQ1`wQLdOa~s8q9Mu7mjlA zdF&ZdXfD~9_(R|pu04siG@L#W7APBOjLTvSo0sNf|@QuBMRtB~1t7;oR& z1a-B&{rlb3)fpYeb5f-xB?z>r7);&q+K0ARG`=Y z(|26n3O8T>y}v;Z(UKTdzwIYCO2njUIkodGMn{`a2U6%N491d4nt!lMsCvX)e_rdS z#Oao6zWKgtwpD9Q{GkG(N?p{Fs$}%82;iMIz!abz0>)-4cd3l91FBbRn$L10qUkpO zEwvRV?=TxqlJCcjpm2|P<@Jb}xw%o)P5ZF4bA}el>ec~vTtu&bu^1S9J%yuw8c`sE z9V8eE(G$up+2pWqd)APe%XS||-v7%;dSRK>yPb20q_=EklZZ7mdFdl+NISV69iB3l zEkJ=h%q#8)3h`=uY(34A^f+7{tu5_?%k zryaPD3q>5DHRq`T; z4@mYKr8oLrK06V!7-C3k?l-r)+&u{1dX(?7hp6n94mH?&Y3ejX4RY8b#=?(!tv$Wa zLG9BT02xRtwKf{yTQPmQxY-fB;$H$M(FT{3|+Ks3nBar39O7etyN&NFwtogSMSG>46eFehI}Q8{+*o*V!&tV~8PanSFF>VqdSe#pR_y1p!90coV^Dr+BjAuGMM z3tjkmB>X@GqdEXl>s;x0}C}1^H6*?O2_ONm) zChOkczPgIh=7g|vY==~l5tv^ps~E6+^!Bp+u^N-JDI(3w zCuTiEg>7d)yIx5_(WG^K>83S?e8n@05KjhM6tz_Dc6VRgH|f` zxd@Y#ub8HCKfl8prKNCs*A${2s+ay{C%mIq#bj}`oRjw&Id`?}0V9#E6BxP?&Q?CM zl`b83G$INcM~5nIW-$X@IBg6G$i`%_vx5GfgDX=yDUt6+l+qRcth#jZ!{?xjahNc4 zx@-Ib6>xhwLf{rr`H~b|GmD{pzp-eDaqzL)uTI?lZ_hYiUcye ziJAR<01`BXDs;Nr2p_}hH))nt&f2I4KHFHjmi`NU z9C~Marl!a=yz@9R^3sH?(u+P#^RBn0f(ONl;@L;|an>_bFkpM?9gKMG1W7R5>~jx% zkN~S+<7OLk15md!+z`)3Q+tV;^>d(pgJ!D~4N8a_4>RM4QLeQz6$Q;C`u@=6yQmH;W3KCMTa4H@h0 zVWYWc(LI(e(F<47t~?*&$ibU5C>Xn~{WdbV))RwNA4``!t{Gp+?y*1r*ep(V#%>6= z8}r^K)`rcZf+m1W8g?|=5;#H7W_K-m|MR}-S9=CYXD4%l3Phe?stJn3Q+!-c1E4+{ zsN&@Zj?bSYfLc!eEatxM-4}mIROcNp?vNkDxhhZS{f%i*uM{y_{Z;Q!lgFtzcV5ba z-m;Yftt#=maFIlfU3E#gO<1uUUwN%A*S+}F=z|Qj-Ax}P89fa3`yh zjp#q|DSfWtakX!*7Dk1~ub&8nvv%h&Ye2NxImdRCZOU>#N8#!Hh2_K-_E9RS$O!Dm zx@kSK#fDLoMCpLp=itXp2b-2@)N3Irc0kzSD)s+nOt$-X-iRP$E^nFy3a`|{iu^k@ zf_mnPAu`91GmWvn3Zn96Sw81D%cM|5X`K&&D_Rqc%ilMqjjUYMNz5xtZpcGj<0Et1 zd2#}EJ3znvXpbX@gQ!4gQPhD`44bT%*H@hGd4xv03&LPLZsONcW znfWkh#EUKKLXWPb$|X|jvjtIYCCY_^XYb4}G^@U4YeSQi3%k|SF7Cu_E6YOy$bF_E z<9>%qNH04$5>8~TT7(B%wZ`42sSbMDc?2O6`Sj35OIheYlOi;J=Ed=IOAK#Q;Av>CcBs+he7q{!;Y=$U(v z+u~}UlV;0t{*KM7v9vKw^KY0T;SgoI$9^TYZMJ1Tq5x;4hSAJWTGMhv&qdQ4W)5p| z(B24adf`l+sZUSsNTkwHRzgo_$vW2;2J_GU>R066>RL?Bg4bn_&_FIaA<*ZV!J{fg zcIEZW(qUOqUwIV4e|3KBT^CYmC|wlcQz;=240f*>Lc)8M6zZV!hz50!lbh)k7v*Hd z%DHn@NJ{_s5sU~yb^6!3i_}_~@mJF8%AucMSQbluc1F{sz`P@|30Z=IdcS$w%8GlB^uk732K%t|J_U54$nBw7 zBS+dSbR+f@U?}%9+Vo%0Q1UtTTsUV`GY0Q%4+ zYtVZlH{UPK~yijrVMMP#Q3tu zYcPI)Wu6YFH%>ACB&LEKgQvId7 z6S%S*(-USCb2TnJH~#PDW+bPTait(j3o<;?a0CoP7p+iR^{e&rSDA$!=(0&AeLEBN ztR_XSACqcS#5~FE*A0_*sU|U4%zb7k-k#iCarLsK=L5Yo=m9%GpNIL-Zom%HHK^JRqwg3>mAc z_IW;+3AM9h2Q-nWz$}cMr;`FXz(nKJF_^L4kGqDSDtw>*bX$Dt0xtM9PssE+I0vZz zUU)lz{ID~@r6pgwKa7!E2SVwh%%PdfgwTyi8V~X^h|}G^Ri;2U40 zeushua+ig@cZ243nPHPm;+Y)|!Vp|zT^bL6BsnR+&+{JO{Pa?BqxPB3l$}$N+SwUc}^Z+yLhn3HM4?@ZuFU?Oi)F2+y|}IDYYReabTX z2)-=vbBJr#iSXKkvgeW1yv{Y1lG9O-4~3XY4Gq1QhdC<9cjZ|&vq@M;3Zfr~Km75V z;V9j$ay22xJcl52FZE2b2|(TtNGSVQMmjYC(CI$&zj?@hi~X^Z1MZ5sY4tv1WMj13 zXtrMHmAmu0JLfa*zkAV&%Uu9jyJrD_mB)9?YC@9zS`Z>N0`QF?Y|LGztZeL+$&|Tp zQdw^F#>%(Yr0fZY4Tq9lSI8_OJ)pP`x7zkvm``@S6r~bf+kzHwOOX5-{CH&VbHtm2 zvBU#MZFdL5Sg3|8`};mi`Cqt;+FAQ#d#Dh7kTO>7Cm2EE69#co`M;=?O$tl>EM+}; zC5H5Lzv9*)A9(tjzey?UHf{OuxQm5}f1?QHe3^^A=ZE}HW$`hnwoNY7>d8*paVU8 z;RP{K7uwg3@bZQ48zPM}%fYMl0Xj2^4Pclq0y$D>C`l-1_y#C1i)0X6wfM|_ zda;oAOP*UMRIqFv*v|qK59uLyLsel^c1^?6PQ0j_m2wp+KiCbs#7-ySB)yfJ-_gsXZvh3;DdhV&q=1i~?ReL!W&sg{;?{pmrfj7Hz1?O9O#EL1TtO z?x&kUdv<%0IL4;H2W^Eh$A3jczS0PaXjxwF<;Rl=aI33ox6ba`xP1g3zgTP=hN!J^ zJwBJW|NiZ%q(Egh-*=duM!roB?OpnV*vX4C+z z;1&`~sw&7H6Ss>NqC+2~b?lAV{Z-TZ1SNf9 z?+00NfS)wYf*>FCCT3E_9DPvhyv9ymm5aq4tJzah<5d-lTkEt#x7xItxQ&eimKI|e zU3vL*#EKS4Oe2VufH@7m_kE}8qUJdl)e!N$1 z_}1n46`b?;?j#jw(_5H+m&y-1QeC+IILe3|Ie_?-^|e;)ss;FoFh=m7jg>R~nx;7x zfPJdjh#oCb?c&WE1S&3^xubS$66I0u{Nt86LR^rd3NO>hms8juQBU~@Q{Q#b*PorJ z0qM{1K>KV-vr?!me&kf+%-b)Pdc5KT8LeZR4ILO#R9k0K#YCf6Rl_gSiM#SSLJmuP zmH3*LSJekN`I)7WdcE3B(ZeT&c?yWBmS3p&y5tW#a^Q&EO}id7FQq=*F#2#gHmb(b z%{R)vhet%VxOr_kTCK(pDKZMh1%owWeu=s>yKiZdvC!xhURcrHJ?kca@Y<12g`^?g zUC}?N4MOzD;cFD{B>-YLLA#NCpkHdf3scB;JJUZd70l)kqv62Q1EWo~3ZX#vw;bD5 zMIzI*V#wYfG+&!(y~R59>_mQHI?^xwp78qo1J{5;V4;7Rf3dc~+&NH`2b6hqsQBd) z7y|6mQnz!NZp?2eEHNEPGFk4z-NWBZC|hl~9$}f{p&>M9DM7|Zi3%yQS7RjoE8n`ReBmh)$|TGX3@>GdbCZ`_1a!kYa6pB~6B3YFl`aF<8K=8S0{ z@2Ok6p0~{ZIL{iD^L=zH=wAnK1tEl(bF`2BgUibw+g}m30pNlebCwo&g}pVwGV_Iw zAx!-hRb`!VpWiV@_`I&7noPL0&)Iz1Db_zY~6jKs$4A;LFO@3R9XB2CU-Pq?uyenQ(vOWT>$4ZK*Fj`Z0MrRg7?K0D{^ zKSz;O2c5iccYb&__Ym#W%uo%YIXZXT_+AV>J_RMk9)8TIx8IDP&0!7b#Gt;E){TLl z;xH@vzS5gqkoklMGoOB6W(!phr9O(n=-iLu1wj3{#Xns*Z4Qv~eamcU-`$&@|F>%?vx?)s*zauDT!_V!Kz=W}qL>O|r z?Bim$1kfo)!QMQ8P0OoqW!uMG+(T4U$)E6#>dX%y zkk1cUexP;Pz6WiH4(?2QWJtfJrr7d*>lLnV(10KD*t=BO7dwV?bf02n{&vo6^eECk z3#l_D_@KWyCL|m{^FxTP1%QW)>k&)Eheu`8Ue)YST~@DS(FrY`UpF~)7wcENM}quf z6VDOZWd#6&+3tJ3IgWzome(6Hzc!fkJ_;l+t>^MBDd=EMs5X=+;;( zsmNi@ct8RA!{riLk4$xT1!1g#UBk$j`@nfrd7iiA$9{iunRLi7`0%!X{-)Bw$jCc( zGWl?eqSh5B;GY+CO%JJ5TR*}HU&zKhVZVG0n(|h)Ip|Yg0~H@Nh{jy{eJF*Ct&d5D zXZA3rXaw{v>AL)^>6j?{c=)+)yFUa96yP#A>^Tw8qqJlgu@o!U*yr(WHvO_8t#or;Psg{dL5U&fyr>9-F*GeH9-SyNe9c zIHYJ6y&0pZdHH}P1)ut7td4i89l#FrCry4tZ~ozATg zdV@`tGFaA}dg0Ir4@?ZkWl&xi~S^twVEOr0r8U$KX9#Kotz#m|Sie`6Oxa6pJD&*&)~6Ye9q=8PN*4kZQy-U} zd$|hsp?JJC10n{BkyifqQRESRMAZSZeq`rL$jO}EfD1isg%-Y*NDO;1bQa^vL*Qu= ztw*VyHKOP-8~?B9;YKVIyP{Q$9SYH5!BPKZARGM#_Y33i*NWhWQ9f_X;?OmZ^A&hf zCd_m1#OOp&8-oF0`&QJOXxsZi7ba&li)8u2UHzO_7**JGeUz&b19b{|%(T~yb_5ge z`G9g4@Uck(`E(-{DtVNL%;;T0xa@-7-=^KpdB2;x;(jszv(mE~S8~g!r+~vxm`iTH zrzkHp4PiB2BI)l0M${doHz~-OHR`q`) znlIV3Rs|^x90TKRX$Xy?zkgSN=luTMF8<8Z`I`nk6N*~Ft97~|_Eu${paQQ8pIsR%MLiA_uxJOd}n6<-T9z5Wq~C=c5$6Jvp3DpE^tAJoi2JcsPp@=5|4SDwB@FH22o&S$7OpU5JsBTtoR&}E1~Dm%lYx=aYu zjmAZQMT&Oh%!r7H&!g7hvWmH`b^I(GdfsOc=h`}D;p$80wO4Gs!5v&4vV!4HC=%(U zZPf&k>fT(pnRrw$I8KT<9Z z3`|i31}KJ?mb`rMX^1v@r6`u_=&^;q;Abu?f2b=5C_*F8d!4W8ogcn%)4OKlF?(^f zu}l$jowH8Ss}~yWtycg>jH8Qu|4mzTrQz{pW6fUgqAm-poYQXF&dx%Ysu1)mNXs%L z2|tmMIoNIazUbXuXZ;O!Tc3Zinmrf>yaB+Y;pG6blX}lMGst&wMkiAZ<%0as!{SRlCRH8NgA|o>Ign{ z!e++tzb*8H0FTYEJNICez9v!kc^z-jg zm^U$WAP$5>`6bQC@uXJMGT96jLQ)?u8c(zUOY(P=gww0J$`8349v0gw9V^3l6ZVl+ z7Xf!7f6^+!vG*FUQ|n<^1y`lnMZ?`75^wVC!`nf3?Z4(C^ob3sb_b_BJNa=nw1cf7 zf3{D;#&6`D!7@}3*Q@%?-=DCOcM<#YRaCPpcesgC_c&uT<{t8bcJw37Qx0M>PO>POekZHXp?G&5@U$e0*>%ENKCphBc{ z<-(1c*}}DgHw~2k^WV6Yuk>o#TLDPT%5Pl0n^b6n{3jKzfOXj5q-L~mTu(cJ1=ht9r|24iJEqdM5$q zgRB5D8eh3epw8=&qyvPc`8g_+O31hU-#o-0N-i4l(6Wc(IJr#M8z71ET?9}R2&zCU zoHQI+$uDTMDVY{ne_?Kx$;AOG;lryEkSHUwxgLaqM3*AbFr&y@IXLEigNmAv2t+;O z!b5h1aWt}yNd-g>RnD~6J-r+w>NETwl--^Ene4;Ab!g>l+D*vCX^ZsW;egA(3 zktGshuZSQBjad{;B8VL^ifU`uuGym66FYVip{T08s;yd8by{1DwkWFen60jJ&~daq z=e)mu{(S$3`+i){`?{~|`9e{S9fLYmTE=B>4PRhM#%ZU*eTcF(lKHO^+C7GCo#?D- znLA^{hPoL!>F-3YkGXaa@!G~UpPP}#3^}@HfSkcJ*x66hz(4J@@J}2)U)f1y9TNeK zkT6~?9`|&TI;g-N$WnHg&8vuG`A+t?BMGhxV`1Y8KtG9_;ue9ZEKoXZ$Ok(r@<(|Y zQzb=sM>GRyHP-PQnh+rvjh!Pmq=bpO4WMO?noB(u3)0Q&vX+tZH54e7Q;_6eSJ-qIV0QfoSg{-oCzFhF`%oClX`Sb+b zJ)+2+lsB5;>Isi*?z#p$n>aUXu1m1u@Sl3d+;LY_Eh1wM{&w&fw-2*RK+OMTa}SXD zLLC2&IFprh=et9E{pS-6mj`w=1PuvKKp0JKljDMhpB-q$dZw)@p%E4LAwW(Y?bN76 z>7^Y;C{VMz#A8VAgrKkyo`E+xq@nNa)mvur@ewCEI*6NxDdP8{>NK8lau{`T>BjA} z>!j+PWb-C_mQnPVq?D)Rcx(Yl<5AqN+^x+)ieFOSg6HEWcQr4iux&Our!tP5+X6(s z4X9E2O;%>*Ucx(ky}lz0;~A7)pX>2of4yHFIJfG8%EfKTaeF9V>kB}~pO#SVSZW>( z?Hb)31AEHL(1wFW7)QNRiLoE{$E8NOPtwpK4vg1U0*Yk!^mzm4mfS$N=lw1#T8&LmMM6c$e&L}9wd1@qF*;ZGeJddm!)p|c%>tKk_#A9@V;ozM)1LyWF zPxTa!bhrq^<;;~C^v$300S18q-CR5O~(*;VBanHNH zcUAIuVq%$1D_dvop3sNOacM0T2CiY>7x-Dh4HfxfA}$D{b0UKddSAbFRI~#Xy%v12VwKO_Td{O;xVs z1(`<~qA=8mvF<%4PY|ktl74L5f&W|Vny$7%0MTr#_{ETTZCD#^oN=wU9ERT6oY2SO z(>K}%$Q2ZOWZ}t0SVs4F7U;6lhkK)%Jo$cI3$DRp-#)(27=Qfp{cSxdk=W}AUB|lk zv{79hIV!TN;UoY)Fm7yYOy-q1)P#3Bcm&e2eMFDfT#Of4truMKhf%5wN6TfUjzMMv z>}!!?6@ojKTciyIpXJ){=z#YS8yX=W{lR2p8Wo}XqpRqfO@&4XW+~_Dvsi|`i!`|? z#m=Fm5K!Di`2n2+adO|{*TMy3Te+q7rnoe3b#OJDn#QOx61@&SVYK@wBM_G%Ug)-> z+(wKRbKqjTe!oE%S+OyeHheW>Hs;8Vhn+mww;vaSlEi&UvtxnM)b`W&Oj3ZlIr5yH_+f2Z00sGQ9e zcMwa62}id-;sqc%`5rqqu8ts)|9vBx93}!faTJ50m7UkJCA{NoERSNjq zr;5YW2H5Oy*hrQtL;@ZaI?BAJ{H9|9bN0!k!37xE%D;DPz^2a4j8_~N0P}%Tgk4DI-gU2Fon4)?8LuUw+V4sgL zfp_RieX@apb(`zZ6(Oz|Z}@1)^9kJym^EmCk+`o{+K68u3ZzUZGe(KFesW*d{<4D^ zq|fD`Wo?-nX;T2NVQi+t6wVEwn)3G6BOHR*=EF;(x;Z8|_?#!-ZF<&aityhF5vl*^NpV^fk7i2P$!w2LrsgI8O9XbrKt$4~7M) z9Y5Y9NiNcA3>mcrQ-^eTkL7?S1O#pgoMTr=4Zpm-Ad@kFsFFg-{Ujjr9w@kdGS~~$ z@-q%Ld^7JWze68ANpCyI-whKOn7uLGG7579w|VA7*R#9ARLaiFZD!}UF;ptg8ybrL zI!mrDN_ywHtGJ@hxvOW*mZNQj0vjFwD@tj)Qk*j$G5W>_n|#x!EGt>Tz#!*?%)QWO z2N8~C?<-00BWTSbBU7>2|hPM(JifGCJ+qz86A6Igz^UO|-^cCxd|a+^Un6$SXxuCXJ;2eyuFm4|1#A=)!D) zrRbNW5r*u$1_`oF*Zbj#TXXj#6o7F$xK(0&IM__2mNTZ8J`J+!&cGY(= z01^y&4ZGc+OKo+>AzJ~T<)0P#UCUI4HY;h2AI4$P#VEX@j z5cM;A-+0{?pYhGYCtC8M`8kXHF`a^2FO?=k)4D%uixMo#=b-CKoiYXhrQqiH zdCbXfyOF^VoL#x%c))uepl%kVdQ`FjyN#w{DLNMon3D@7EgG`83jEz>r-$ZZOn72q zQ>~c7u_TiQkB|12g)dIWumj%(w##17IoNHyr9MmFn2h$|G`>-`&{Wl=6G?tB`*Yd2 zs#SNafY;0}7xwS51}?#g{_+`+mm^lM3c{1nu_tm(0$U8U0q_?#4pLou1HyOGvgJUh z$uYYK-l%{5SLCqR)bRMZ-y|*R>M>J|7v^c5*mCw9FAbp~o_^LzY0OcUW*i`&*96f# zGSf7+=UQptFa1n3D|cc9fn74eUE#D$Hm04HxI8 zwkS9V1G-^XTtKF~P6+`y$oRif#?j%#LPK8nWnou7aWrN(z%V z0yKvK;(Xkvf=WrQLg@HcfIJudMkKWNti(1_*WTCUAv|>Opdb`+0_`sP zCD3>Wu`*-@-EqNU)>h0o6%dE_J6uokqfO&;3A_<|u+|MtoiAJY^1Xm)1)u1?&3Zu8 z?=1^_``f|%7;)JNGV{ae6{d?{9Ff}Qry#fI9f52Ep{s)wvr|cxrCUWh)*rGt%`;j3 zh>Dd<$V}Q5Vu}TAU<7n-)Yu_+187P8+=$KS>~>ddy{*88q5kpACvMm38bfq*8pCwt zNJ{?a11poy&O7Q^obMXg$aI7LmNMBHko~Sw0W~nt?9}60)M?!-sm!Z)ETD+pQj*+P z3-&cFCi0>Y02=q8U92Q zpHNRLry{8Q2s%TbL1Ka2{$1||i5(4JB`l0Fnc5JbVKCNdl$kY&K7*hkVL*^DdwmC9zOWX#w-9WmKL)fDx-ViIq4r;!oB<1m&3Tt=f zggv__Xqni?;xFSaHBu$20%BQU5tw{J_ZrUzOQDUK7X{=;et9d9k}O%0%P?v$`#o-J zhiakz$?>?~JY*c4gy)vP)$*x`q>r4eNDL}j$Zua6j!;1M8l7jV>2zTf>Z?!piQUhgh~qI%|#+Dk1J?8GF?Bv zHhbL33w}!+T#c>KA`?w(X_$|I=~Kyew>}PoCOR}Xn4%4BpZ_3xzXo`7TAZF2gWjPt z5iPc>8kqLF--8E2SE`dXZxQIvhIu{5?vlRU?+a@faJm|8uGmUm>B%L!p8ui#R;~p4 zL^IcK;bxJ8^L0kH@f3|xmH^gMV8W+48&R)c`p4ALtp@I9%GmY$=&uRktRm zETnu_kPVQgC43~rDs63eSvf9RpMqjKy|w63^Th`ni~!lwCp5VWLE}RmLvQF9hWHTTYGDPuDSpp(@Q+Nac<5I);zdUs9 zmJdu5;@iq&&Wi^mIn<2XqrRs5u((Yo$$}j(_X~}W?xJN5sp`4I2^GY<;biWT)6>ed z(w}jRx<6m`s^a!Ee(r~eKF|s9zPyEQJJo7t&*iSK1$ZQ{ z2zVPWG86zd%Y&!Qe`d>lAHkE;6_uC3`zYnU%%h~A$M$EK4+G@vtHC__sUCt=9EqRN z>X+>`q#_U3cvsX3k|xQ4zZeu0M6t*w>S0k8Qzp_!);*T~QjukCa{`t!*IvpSh0VXu z2jZ(Wb$>LaBHy(SoBjqcx|c$qJ~@70NAD2(UdN24GU=W1LMQOIRuMJ2%ntfzu#<2Ah{FbJ*9(uEy-! zs7k$Uie@oNS#aPnSA#M}(7aCZ!^@wBc^@8iTU)*;as*E1!t(;yYilghv-{b9E4edl zIwl6Kb;XeuNZvL^SNBhTE5 zl5pzt^?1BBYz!N1qTU55NX75Ak^bQ}$U3XCLOo*2rz7AY_eFstM@`oIA4HV<2EXB8$8X6}*~>OV8L7RG+ihYR?WI zodJtUr6F~{kJlp49CVGF0gJ?o4drBIfW})GYeEVHdqW+SQ(Mx!Uzya9ui<$7VnBQ5 z^5MllAK`;U8%h-3C_+kZoP1xmH5H3d{>=4m;|z(F`nAK_NUZxD`qy68U9O}tQ~-K^ zGLcLniN5v@a2Da`iWdq0tdj$Zv86<89$)(?S|AJYTBSrAwi6MmK^qzUL-(2(R?(#X=`2$7Vs}K_N2j9^#hr9=ZYncx^D#uf9GF?WYBB8mAxGysz=KP zMY$389K8zw&z4|OGB~?OUITpHzs*kaxw3#*KXQuWdUlW{unIE1{%)9cEX|f*Z%O?m zPa*&67tQiqXp*q-tA=IEe)hZJx=i@+!?aYU$Y*uS2U{*mpNOO(w}V@uV>RJvN(G4Q zEJd;gU_v~ODYo3Cwc%M+_;&3u+MT_a>M+fJrJ|IqU`lhhPoM9 z!GtrFm!_7KImA2}E8TBR0m1d%FN$@hluTYuMXC=3h}}19Gb(u1ZWW+JY)Y_USf963 z3BPx+A(N+@eVNGLb}fZNU-chuONPHD`WY+^1*O0r^P)wqWYi}nledHAR!y*$AH^wj}t+DA|xD6v!y0Cv{Qwbv8*-_bq6d zOkE~lM&?TfqbqPss0@LYWQEzw3ZeXt4F4Q871FVKl>cgCcZj2u=z4N=>p1)-T-OWw zWtokm*I2ScC8{(K2}o%1WUuzQTroP?!- zY>|dKUS`f|>wrxA_>9|PkFgG!WBcU@5TA949V|MF_WOHh)n-ITwO+cug>)z`$m&c- zBBECzXjPFYP73$=l8Y2cw^U}OO#psYp`T862^bdJu1hQPtOb2%%-=dLC-Obw*%Nui zV5!~oh3z)C-sm(UE6J-gYXlhxaE~9;dV?=HUL+s*jsU^4Rd3aIkHY!rd9Wd01N2CE#yT_=14n!b=UbHnutoTPh=*; zk25wqre@hRve09T2C@1(>9ai%kox2J{_u#2V{7*W^)T7j!URY`@7m8X8J&xa@+isBqa#_Iwqt$Wr20*CR7ZD&4#+7jG9!*WGT zwuTJ9E;JsO=51lk-*TS_E_&3}SWLzij6CYjJ9D-GjEj+AvNwiwRI*0(%$R^wqlUieNY^Y{5%(-I66nt zaD(c`?YI4)zi838wNj`2d6mvTe;eImqCEDTYa&D#+x{^}_|i0KN6PrWJfwa9(WbCv zlBaht6bBAs)|C5{S+3k4e^2LGl@&3X)?$@gqb3Y{Gg;!-&Fvx`zp3AKM~g~Vc#=Va z9g(~^*EdS{))~`AY-0-rh4=)oPF)^A|3@5ZtKIzsywB;&%{Qxpa?;XfMk=@iXWqC4aAlg%P|ezX<2r9bLDfYqAC(k zi{iVVyc7{p?V}EN7y8(whHD=3{M<`wv5tnz(|PErN^ihhulg0Sv0=4l=U3(?6Dw^b zx+x&LE|Mx*rqxt6O~irVdOAlv4bIQKF+6!RM4OmRoc&!6K>IEk6iKxa{14}jA=<7D zpZJT>wDh$;q)Pkwp!Syunk4en3vWP?DZv|k@wXPvZqj%;ttcq7{VGS}IfUIfGmF{qbstzsOC`@9kzZ=Xl7y-uobHBb}M>M1QxzaN`tJlm*59>W(X(B0;X~ zbSFdxlP(r_O)Er1ae9F*Q0c1fs0OMCttR#3K%BdkL8pG~C!(-u_;^;@&e#{QGgGR`fxAgq4Qp;JFn=;5N=aL(BN^IY<8J9H*3Ami@E z51zDw+?c>A*$Z3L`xk_=tujw~Uk6P<&RG1m>+>j(-YUdgxSdWOtYdM9aJqm0;4Ex2 z^_kbVjN1-EDnOVNCOjPS_LQLbp-RwZo@nuXy~npc&D%f5Av~qy>!~*3FIrXZmSEPp z;#bQ>PXV~Q^Gw-NgwNkf%^6CcC#Kw}i=IOY}~chov%hChLDUfG2;@rmOEWB z&C#>>L+1KA&-QQ0$BG!hGn{ERyuMexdsM+C7fw?E=QuSO2*yKr>n+nnZN&n!=SRac zj<}&iZ#qH6iXN7gk>?_twL_`eXX&Y+-d#40@Hzc=$p9xF=h6U;SDi<5y;E>Wc%WO6 ziJb|*&ZZ)K#`8?o25RHYedix#9#?Ji^*8>sFm0~docxtcP$f%#xAtvcfXV5Q*9P6y zR(Ox~!D`e|&=)rv#lsX5GB=h5Z&mGK`&9Wfja8?^qlq8?c3V+AXGRbTvp?6=88}o} z<_BT~MMpj-Y;Q_GDX7sb??`&ti*q-VxNQ7DN(LY)LMx6Xg(tH{t5S3bN*0vthF*r? z@qD`!X7h^mr``7y=}sS<_e{kj{>t`PL%Ehte9tq8&7e($(%UaK?Vwuh+iJi-X5cK+ zuQzg`rw0ue$1z$$(iq~%hyK{CJw_^oT>-u{NgPYeP?83vcSUq8Ik=4`qyOU_ZmM0E za0Ofs5Byf(cRyUE_f=4GH#F}UwVM}AKC}loozeWtW9N+WilkDTXV8p46nQ~J?^H8= z{|RoE)vRWz?t~ z5B}JZ`!L$JOyhHb1qp@Yr3Mv24gvaP6)6i+eFKHN%E`i)jN3kcEI)Ct~19(1PRy zY#(WsN(k7p=HFnYIwog7y&D1Kyh0@FjAj`ikE}`pZBFoyC)bXQ?BxhYl0>C_h!ay2 zN5x!kg*r93`PVwOGgo2T5p{-I4|>Ht+bLz=PMc%(b{xy*10Rc`}vn9i1NK0hkyyKcV^f zV;>MfGT?a{egrdlswIdcLENN6p&*%0@%pC>;;!RYZU}rT8tmTgb%X!O!5qCbfq(mI zefo=2P>CzhYlk9}AZ#er{>4yehWig`jI)&r)Q-&D^a5`c-3!=V;c-mS@%foSxGt9F zJCmx`1(Dkh%3}1MXMw`|r}q6v+@;&aP0=wb(Fx2*@7o?OO@VMM0Z9$jC=o=4Xk+C| z?g!L$PCXH^(v<@{CYHS&yDG`_w65X_FN3fTSzW4_PC3O~b(l!;DbuF1yP=DuST)i9L^|1FSn^EUp3d1L*{!ExkzU61 zjj7y{kKE`lWiyU;AVt^wkg?sSZd9fvlK2jfQZv-ONmOr>P!gPsDv@qyf?m)r#&lC` z#ybI{nZA-gVeR&R&{d{yt!isfWa^3SJ3vLT&LBCtZid{kr2XqgpsPgf3^b1qcCz;F zPD>(#tK8zSk0QU}uT;R!C4H(tF-N@@fTe$(?R&d%1dduKg0WgTNL}~_qqF`jtICM3 z1RHNdjkPf12S`R=H~1O_t|6-fcOYdYVScze!zHBi6#0K_t|et#>ZVS9=2B2gc0He; z(76NjtJ&jZ_<2gAsP# zuc_$v?K2m`<^wSUs&P{7gU&%Ym!ojT&?)j z!D|gr4NGGo&3AQj1nSm9?F#MP(xuV&ehviN)~#9xwOV&+m+j6OftS3Yeka&9T&o=m zFS&be82wnO00$;!(yjM!qLc(Yj5yBs^qe=ixag`p9()mRmiWvb*O@Efeb28eL5v(} zYAFz0Ia^(2G(P*vK0G*qgYE8~=)sh$;Gn|+J z&^5qW-brQswg;9>PjFdzQtQn69Y!AQI^))0hFa1v zT|7y4L2!_X+fv9l4oRc2xSqBMe9U^`BJ`U;-TMU+HU;46Br=mkp3 zuQHKCVIoCBV$YxXaxncfh>MI^^M7)0SMgJy^uOX~QD>^)KSjd*#19R>pL%Gu&dhAkvRx8asds&@TNe?M6T_abiVlhL9EwT!54QU4<}f{=mv%FJ zEAS5qc%|lZjGCl)KSUesn)zL{wn@B=>zmd_oP^~})7}>vj%PjqI>m9xuvXMjI9PYM zM>7yjwfxKUfL#v}qLdGOT>N1nbiC%acT2<5x~gmP3s~<}as6LgondMr+FxdZN2? z5G(iWq_s-vEes+KNYN>`O=@nZBY_6xkV^@qPICR zB8bT5>E_wYYw?m|tiivAS@`CW#G9Q;bivF7C^2o{pO|4Y z$%{?xJj?@y`}9Zt;hjxAKvpS4BOg!$s7}j@!E$!y{Oydby5pHI?kol~eGKq&ZQs~n z`|{Gb>9}yHDXTc6@H@conOm3Y+aAp{isEde#yTTB!vk&XS)j{Fn5qfILH&Nam0-=kiXUnX7)GAN>~CV= zDkl&8Flv8HWI_+E3qcMeO{Z=tZ1Eaa4A8xh6h44yd#6s0e&>LinQDC6V(rgRI7o2f@ja{F}yX@=AF6cW+(-YdG4AVGvl7r!G2En)xr2qV_xa-Iz zH*&L5!%n^+t5(GzP`%(0D4>gS>KBi$s-MsT$A4PBxnNKPv#&G4Y@9B!m8YT<`&qV% z2}>5nKiSi{_ZiA!!onP=?7g&$gSfSxDYO(XQ>I{6H1jZj_h$cApl973&#IRUv#F5$h>$Nggjq%OS_v>P$E?DN4vxuIgi#FYMoke@SS(kPpCxK{rKD9kAdG{Om63S@M#On zR)7-wf_QPYdpLKS-ED7o=Pdq|G1_)?s^NUqqD`RBTvz{@}-#- zu;V8~{>@k{TIh`a3xK0&q6y+AU6PM}JvHFimVN}B?x)m%lZ0}j6JF8 zXlP?7^2@GJ>ybCkz-To3Soc{6;}XA?VJe+d%@Mia`PhbL%QQr$`(TgpU=t*Swg@pz z_~Dw^`K=b_poW@bj~~+1HOfv6XzJJ5hLa4_aIlK0!!gZ!j|d86C}i8j(X*$ELAdWZ za!`h<9nLVl#_6d$u9%=39y(kObkjMb+kqL`ZJW$u>W6U~f_9yXPyH*L#)XA8u_JUp zyZDijXj9q#7VPx1$OT;CV8fkE&#?R=dUR#r%eU%^5-tGMgPmj@hZ3X~*!)K_b6Lqm ze9z_L3aHfK)RC^79Uq6yqonu52!|}S2_wg$dE2Yy@T;}aTAy&Uo{d{3O0?m&;PT9+ zPB!|YHf1_ssY(y-9)5D5oz-b;Jzf*ti&U3o{a+sHWh0H`r(J0Um)Abe506ogxgSrt zB;S{>QCdnwY1j7&In;A8j>wI>bs~kav5WFx+*_Bc!7VZ=J0SPx^+(JIqS|JE6&t$s z9gM``Y{e#0&P3lk6p`oLWJ$f|!o8rpEYu>Z?*&Uspc{JbEXB&%F~JMoIM8s18eW`jO7T3J2m{@U(I;52%wM*Ywo)eP?N z(tzae#Lu(G0pnWhI^Hc@}cwI zxdpW#n2=QeAgxC+IK6%w=CEXTI2K>1+0m)(jH#8+g;5J;ppda1rIVCBpVke0M{KK3-wgCqF3tNX;BctZ2119U(()7cKCDlo z@|D<3+W<;ksuN|kXEF2&(V_?Y`;G5`k3r|jwK+d_8*=+Rl~hKD1EEaq$oHN@KU20n z?gYob=~QDCs!X0PDp-vu{~$t@IIon=nAU%jX;j+ayF@5_jg3b*#ye6XA6*OV_FRKA zsSORbZk{C{4A?6oIru2*IHm*HYx|7*ZS{&yRj&>ztR|zLzfg-io~!gSP>W*CdM2l2 zzMx&E6I5h+CsXY+yuboSAO zG+0A7i=m!jP@R&d8NECi@vpZbdmtWDUrKb@-UQ5rOe-EZikLO7WtDqL$Ru^BXM@@< zD!11yP6onNQBv~X8+t`o%FbjaDQyPEDi-49u%E)oGuKHacVrUg-^IO=I;kB+F<&oz zC2ppsojSb-hxCNLOgD=Z1bCNQ3*UyOAAX<0F616=7=yjpXE?%ddDD0#VNt)Cotj76_@ zAK3is`B1^BB`gdWfwcz=t{FrN% z5&yR<(0&{$O3NbRR_zuZ@uO&waoRa#=L~yAuBiDkb#7Xj#OdvYDqz@HfP=cUn9r%7c={iTx;ii&1TTmV zH?9c7jBbA*G@Q{iTNI9!^7~zU(qO#{Z^g4ugzq?Hy(1tg^ptCP2gOL@I*Ee1Hx{s_Gep`q?_+Orq(3gM}-2jZg>_(EaXmegP>PSkH;Nu3rb4i;xH1{Rp}i|K+l{x*hCQ4jx|Fwp2d` z5oU~iUrW4#FKh_SgS+S&>0oF~h~G_P!_fwDXOMw7W<0WF#sm1BhyJ=SZ+o#gY|Y^7 zU(33A0q5ll@B#AhoHGx++GTZ~Yo&m;p1TLR6{~u4>a6^qg@IZ{UsK#0{+?Z{1QNAq z)vfDKid@8$>PH5gUyEdub!up|+=5(5q4&t3w@bBzTn|~EwLmABspATZGa1C|q7^-; zf`5X3>vTOq(c{kz&#gCWKlmDe_lN=usjks-QSO)} zlic)vhdXz~B^YrPS@Km>s8|BDr|Fb{~r%|sALCX)}FCb2N}Q)KDDs;VjUX2 z`aOoH4(;Eq8GEJ&ZQxeUpl8+h9i%M2pC{ds(eaZ2UM2<%ooINXAif;;NWHm{rN^}G zH|K?K=9wnhLFFaa0rFT=(cf0@&?OqX(*T9G7jwZ_%QGc9`fBUqA`b~q(T{W)@MdMp zhXhM%-K?*Ih^+RdRp8Wh8WUqAw~7Xo+k0v#dMT=bP{zOIcJ?~jN4?;y%V(_F1Zj>< zq}?uQ_c3aGbj&T)5w)&4VS8QEyVsmPj0_^t)s9nVO~dd#R1u@k>e!IwB0B1_aNip@ z?2xIepfC?)jpFnQHvaY140mhR=`dS&52RJmq(N8L5bvQrt(u00l5I3+QAP448CoXv z(a0UkMDK~rl|1{0tmWO$j-qjNkerOch`T%WYDQ5ZJTqGn?Jw>CS3u@S5F{4}ZUJ`J$&woGz!bEXb(8HFgz{ z-NC70I66!bf0z}M+s=xYN}v=@7ocNb7yz;zT_}CcujQ34*J`w}arkjh*vxL0m)7u* zgo~!U;qq90+mV6V6xNk`+C6@)4yk%+8rGlolDJ{i<%T}OQi!pCrR1F;AalKk%H_?U`IezC!FN}@|!(Hy| zVOY|l3opJIj%i&hN*;alBPH`3ni2hh(sl1d3`;pp>({AZQPHtG`8v2i*T0D)QKp@> z#q}e(iVtEcJw<>xF=U54h%^6kX8{BDJcG)=fwL3z>b`XC&lHJ3jvWDeJ@}GjfT%3H zs>6G^K|8^&UuhjM;bQH>NdW9Zq{QS0DX>$78wl2Gl6V^eda@Hg#& z%{w=L+;3U?**cUiX|2pu;VHv9Jum=Z7b%G1Y6{GZ4d{+9R_S!Q0s3~8PEsI`6RmW3 zOd~dt=BGv0{%w02j4-IU+E9}cdTVjQF)9-z`f!rKE ze>Ul+#kWS#RX0ftz_CjWXC`j!oj)v>7mAg}16xMN(ScQGc<2V$p+nXvj_+(f(8pdI zD#O2DKTI;N(h8)tyuN66i;jt^u4Fc5M%qjq`Q1}P5Uep*Q=&rX9E3!uXPkLSD++Kx z!=^p2qfIKoyNrx-6&Xj#$xklV6g6B$C`2lt-m7MnV8$BT)WvEW$8bEtf^yX^cVL{4 zK5|66ma@`z2R1ThXy0e@l?>v8x{@`pR>qvOj>^7rf92p{9jM#qwA@q(L_&xZJfaG9B%( z8Xeuka-jUO7PSa>PKG8!)GMISv}=-Y8beF?>g7BIfZ0WUhJJ~vvxr7{%UjrQPKaj> zGmMio^J?$JOXQGdOt+`3;_ffi(90eT%jgxh)MWNUxCK^bKA$oP(G~X*`9j8_O3rfv z@t0-s54GK3iG2Et)twMn(9r2Kp6Ha|42KL034>l=^d!451D^JI0iu!J1disaHC(av zY|oRY;xpW50=iK!X%r$0zJpuUYlD2msoCVKAkrmB`o$I}*q9s7(`6&2p-ASam}w_@#G&}saeZSJdNEwkuCrb+ z693L=0^>LGsz^{aUptmPu3#9j9VvJ8WDX!!7v@~g0IM>iYwFznA1b2$Oa|pseM#Dx zOZj74tqZy#*m(?bKh&cY_uzxc$DYyB5eF1RPTs(t_(<*oZHY)_n54aYlp07#Iy>K zNrE*LM_N50{$BEXu^YvC{A(lI@9nF2>Nl#;#w7UE#YB*a<@Dj4mWC$WwlL6Td76PS z@!4(LQR>HNMx_w2nNMz~D~SJjf5ef~SeRSVHL70x%EpXts^-7>4x(9jsk6;oHlA0f z9=-u^Zt8x~m8txUQpp8fHOf5aLomM(hz7II{P{b_q(IR;SwYWqZmVjWp5WVw3r@vPA-xlVDr*cQw zQ{m7ISnQ#RtZ$4UsUqp}XUAFGtA?Ea+aLNLF*}}pq~T8N$WL_ENK_Un^r(-HM^-MY z`%KL0?`qu14Zv?Ig=*7up8V`_X+yF83aPTSza48ZX`6ZA zq>^Rrl7P7=i8vHSB@PpZRvetA97TqAXFa-4Jn&N6##lCy#xc>1Tyo~Kv+@+V0uXOi zHuzN^0Kca^-;%*c1XZ*}|C6#0)H<^?$_#FV^2Hn^AI@DIZCb*`4jzP1w05R6kw`7u zooAZYrlR{SAEQBbSB~iT)V!vA87rt|kvmTH*tu`qzr3&c=4aP7VMyaEIU?=C2alr+ znFRmA&6}=Z+Nb_yvnmQ(2#(q3k;;+RNv5{WFn8^+GwpiV2b{(%{ow9P99EaYSzg5h z2f@I^SjA?YopBN9ZTJSwmVUAh4GiKGjEhm>i+2q3Hwj=jS&^B0J2**ssbL>NLCD?` z%1)$5gLUV#FM(@>IxoNQr~s{UrHCFV7)1=l;S9fb5n^O=pjCek6!wdH5{#L5gGlu1rHL8s`QR8=704FWK>XQ24}^f^JH9vX#?F8*f0x@Z z2vAhXGq1I!O%`R)`Mr!fvpC%oYt;jJnE%J#eLpps{sF&FCxie=XrZUjdp96x z5&|SNL+?lz5D^d%>xR%mPiO{2q&JZ!Dk!?4R}~Ny6$*QF@F+C-b+GA8u!Y;|!uoN++JhlePef*d#J2c|UbDb3#4HVI z5DB^+WiaAUVVrfbvJF>6+xufwMDH6e87(g7wWgP}oMjEW8+)le-0*wn<#F7Pp!uz5 zu|u~d5TUXwb=D6%^hYyw+`J!6OCwc9+jTOV%J1apRZ4bt)3`Q5n)b5O-S1vw;*8yE z%Ih3F!QN0*gx28LngNjT?jCv}nk;5G{vAO4s#Vr+dM|xRwz@IZQ1{lN>_&Id3Qhmu zOm_AF{(ZSCba@e{^ zJCu$xI?V0SU%4{QMxC0CF7BX<@4p+od~$rb0ipatk^|0UV>ALjGWtp;kcKvwF|u^C z?FZ&3Uo0|vD0^G`>VchBGu$a>`^<*5ei#1Rp)50`G*$s*Evbik?OtSI@QGVtCNBYZ z<1{*zasXb6@A+D_QZ6!AtGRDnRK#NB7Bw9nuR&ypAL_ARxv5AkvJ<9rc3_1ds{3D_ zDA>ipp(}58-0=AmI!at~YM9fXCOj#)P$D@0QDr+vCtT}~ct5VH+-*-`Wo~ruhcHI) zMRvfioy@=Ppy-JT|Cl~h9J0CZ{|RGcoi1@PZRLS|oOPb4S$6E1;hQb5@{gnsBfFBh zQyjQW;4C48x{$6Jts$AcHM=5(rI;mLd(z2MLYY%unx%$J1+PAnX(REY&(& zLm_D$82Zs&N))+=lSSCVlRp!=I0P*JuSr0(>{QZMJ5K0g1HsChX$sb$m_y{__# zxz$<<^ZjM1_!2V8xKc`u4zKGJ%attBFsa&R;oVc&&l6CyJN4);@ddr2%ir~sI+zdF z#s_eDwQar|6*2$pP(4TKVsG;Qc`MogQ2V3L<&@O}FMaQ1{vM(?J^C_6OoJ zRnlUWnQ15$l#4spFQQRMEGH!<_&iiU+aON!oN%;6&2zgm_DWrl`cSVl-|veV)}%3T zz4#xFL0pctI~%n<2XPr|pCHjrEr!vzs0i{AQ{)Ny#KvFxCDW12yi{C3FAy+SE;*FV zk}o<^_07jq^@*MF1zZjtmg`GE{pb%W22|5X(P|yn>BMEi-f-1*GEj4?Y|?L9YXetH zWSSTsyk$7t-RM$C8Y73_;5a^%&irb@bA8vr!kxK*NOuf__;%%XupiVwASy%Xkj#MD zVx~d{GU5BDT$A`PRng2}F=v@GkJHo!`z@;hpGL&*Y(Pa=Z_^66Z1X} z(l*kvr+}QPWGpA?M2*<#d!)I4;)5L#_z;s3xwZF0<1$hHGyKR=p6ThKUwH=P8hFL& zb*vn{In{qyN8`Y@L9Ww9B{fe*U0<)@Vr)KKY1b3}s*|_2e7VI-NNF1U zmG^weKN|GPK;7oWWYH@}%iJF4x(1nBaQ!QxCYotm74lS6+Vka_|csBx%+(iIL&wA6!ZQt6hx*A0IZx0JDb$> z)r7d6ai|O3tK^Uc9UZi$%%jC!(e7GCv>*N0E<4Qzyn|7okG(28ElGCd5^recCJ4Du@I$e^JX8UK(Vs%MHvR-gg z06~U@;1)^h6R)dy-jF%s-zibp#sd#Hg&hhKdAghHb&_|0Q5rKoV>9Iar||j`_AEY| zaasO9i|uG?o9k5vBvNuWtU3UP0}mz1e$DpiNY;?y&_T0*Nr$Qo+h|U#*$7LYS?Wpv z>gD2(N>8Q8l3Ge2S;yM_kGt4Xnib!{JbHSITrgs+Ue&$Y9rh7gRB%`Bf7e55O-xDVMgTli>UD4D-V8`{#r&Bob2r!?hfgcUI>69hRsg6Ob5Z2zq1rbiX4DDnUC9SA+U*tu!3GN?LQGkw3lu=7? z{mjwgV|dfj^TQpkh7z$D+IZuD$WW=qzf7*-RtYk4oEBqpdsx=oIabVS`(2PKIzfEy z*CZI94{+kwPHd>>fF~G`Bkl9H7&@BOM1Sq`gSsSOxW3QZ`cAGHFCr5ltg^b$)DzA2 z{yT1J3k7E_jk=@AQG;n%i(gi#$8n*OW!OIwE1$f(tgrpqw|w9Lbu~39PS3jqFeR3r z?8NM|u$}^dO78~EgFLK*QPL;k;>ca&tLkO=>0ZH_2e24NzQX_LPyetvwQs7842b_Eq9-o53W1arCc+KgoI9ZF-V($ADcTv@^8BiQE_N;$743Bi z(hr*X(JUs%RnU;9ElG@~-$%erZ~9F%qQ~Lte_?;Du2o+;tdUuRwll&VID?~<%1Y5w zuR+*Ms|nYkLNm*%enWIn)@$i7I$ITaiMCKGC;#=A_sIAvBgmcP%&2{!a5HB+WxV)? z*n+X87`sod#0GdRk?=m!xIE2Uo|hEy!`@9@K0n{`S7}9a7&uip=~kODKW3sX>v45w zH(w7XOPXZHp?O_FIr$iMuF*)s^GuORwSVQM+b>z^%v0r}hsG8zC*2&4!i~Z&wSfue z*5lTi13SWXQcN5+x)i~fgP-%)0X2iG3KTfAVN@~&6YvTVbW6RULWq;&AVTSq?l6G|}cW9J_Y280#HuTuTiu;i7E2 zFRM*WWF85+wR;woE@dmSvoozJYwyRA`!|fXVG8jraEqn+ryYx`>p8pkCwZak!9s0x z_}?re{^WB@R~OQVY}|OUmLEn*w8(4H`wm27o^dA$S1Kd^nhc;%tX>6^TWR^TRHV`& zQ=k-?H)J=^KztU&IcL08HApZC9DgaTD`+8Ku{1RDQel8xKMV)U9w5qc;j{NmK0v+% zNaJNP(bnJM&{_(H6~C@sYIfI;Q2Tf58fDtQ0ga3X_SUIF$^*hH%ZqQ&9%mRn^xpg4 zzxKM@PT@dc&n%wYY=V=<2Aj+*rHTrupI!hR%T-lANN!^?4S-FD9u2=K{u-lvz;(EJ z6J5@hyiP%jO@v?{DwLou7Ol6;yj9i>L+BaA^XNEM#M{@NnWM74trCD5M8o(u&&zy7-mE zv@5~a`C=%N#J3*kLYEyy{Frhrnm#WodO%!%`pQlZJY14Fd+29N_t543!?OP&g=e-P zY~y2C!(}yfJ|Ktbs3_^O>D&x1#iExxH6C3`2Km&WpK!4)hu$wVGx#56s*Wqah%$7^ zt7{W?h&(UCSt$ZVy;t~Iry}I4;{1?SI>R5lA_%PL9nb06Cc@h8B8MO&&-CI1@CV&1E_o2fCY$@-PUEt6daOm|%L5}pLWHaB z%Ob}nT&wkCjGiNI3Q3JpWtW}MkJHMEWQiLn_fWw@N$7GF=jYsYkqplk%r=LkpCKx% z!BizjS<4D!-he7;18*eCU3KgWQryv3uO|Ix^f?VSCqGcwt7W8F3VBkWGmLmD!Oryu zr&JYqu#4C=nLbM7GPb&!tHQZZ%R}3wBGoKI8lW5UHSfydKXP~4aFA^ov^VBO%=6Xo ztD<3<<#V-YvumkJ1wMU9G0k-rFjs}S5z zzN%lkol%+Q&g?@EfYwOzkGoqrD%O;$LoWu5TSMFI>k##K<9P%V>)hYFDXE*1e51w~ z@{1tb%cF^jXDNfGEh;tyg8au*HH|7YY=(P5FPo58z*7I1-9J)CZ9py)Hs^?_M>@c@ zXa&gAdLWjP`2Nmqj7UEAHn#vK}!PF%0WXvT|(wlKEx}fyFt5H_mz^q zc5F%>VLcFNGZwMaNqLx&N1R!#CZ&YGN{|1`vDZZgO373kd(FfSvU2nP_-|zwr8*Fl zqiy;A)tu|G3{g1;uGIOJ2Q$K%hc^Y_cn6U_zcl+0xt_N#@0$h0J(zH@mk>t;gKW$j zqmCln@RWqh#wP%c7*zly8XE6=o$WS1?cMSjr|Fn6PMdyw{qYE5?-brYw>RMWx~Z)` zEAZ5(H%*6HO@AeBv#XGDqKcr5$dMk59NEex`PitvNYQy=IoizVH5R|wsf9jxDTj62 z;MaC76{ZWvpaUG(Qm? ztX%VcSk&&2WYbKKfpqK>f!hDBhvqF5%OzAp$B7qW7iVc|IWTLdw~ppzVRIb&BpAuu ztC`P_0^jeNlF~bRSN@8=ww_JCG!oUsRZ!K zX7_P)np#XsQH_pT$BW6chf%Z*p$}J;NM?>}Zc&XWImynI2FGRyX2J($^hzSCez?*l zUi!t#(g$gAh7MT+$j^RGJ|`RHT?360HwHZeS+-;}9%<4g#+k4-DRy|m5W(h#M<(wO z@QTG}*Io?sK%_wl?Z+`@Lq+EH0tlp72?Z6v53Z)+8$Rd-*ed8nI+?V zwBevna-_*6sK6A|6{xW#L<1Q{hHf$ho)o)Lc_|&~O#(ZuD&wssPr@2SQ;A36Ea`MD zL74%5r#@zx$r5MXuIKpr9Pvb^n`0I<)W(#GqDYxnNFkii!y02^5c5sO-WjZsvzt*i zUj#^TeT9!{wvi=`ha_U)Mmvt9_x*~@dZJaA(e=RRljeD49D=I0lXSa%Y9v%8YWi*S z*0Uy-jaRGd1BP%2x5eK{u8lGONToz{%2VTDEyP8My|pOZk`e?grj{GoEE?5M77ITz z(iuDzEIJgRWuF00ZxXRr{@R)`)4ioU%#GCQeGV{~qOOeUz#Pp@?}D zg}WLxwW6vDNO`pd>y(pJfwj28gV1C70TjQ#&ytN#x1%VC&faegf(fxwxM zKGl&Cq>R1sqvg_8>uS2^Xw)OE-cH|>;F<4V$sCm@KYwo8iNF@U(VJ#KqB9JoFIh&? zUGsd&seXx;r~xB!bkw^_$3C3a<0~h&SiF?^xWGTf7S7|f(mx(4VZ#h8C1}v2cTfDv zdoEAPsFuQA8#j!)X|SkZx|7+0-y7^$8(+_@(I}6d$&6}T3_u&;v+qH~FSgJKG?flJ zqC9d?y{jPOz)zL@ptXW4b>8M;(JPmhJ>`hrPbYu_M;KNlEBpEd^c?E4l`uGm3Vd*t znDgbV6WcXBs5SRwq{m&9h*$}2VJ1$yaSBKA#tsX+#Lp_!d7gJQrI#~uNjUaQsf1vf z_ou%at_C^LRBdDS*uJ4HD`%?5>CVGVgajj-;`fMow%-jfk4?gy4l*YoU)G&}S?RP& zhC&Ctqzyc4Y??t7AEk=Wm11CyyCKV4Ft;r0~dLi=@%UX^(^7s0K zSjAZ|qD+?UL*h6*1fr$)5VHPmRId9F*D|sm{kF);5`+n8Nsn;tF47*g3Pn@As4_q% z>E-5IVU&|E2|B~Axq3h5N}#Msy#X)}BU3ms_w|7dUsbh>yLXzGc}>^PnbcM-Zabp3 zEHJP%UP{X@RHHOp-nzzVPfk&B9l8X5tPrcVao*dVwkXMvU?w9oDF`+E8?n6RB|#n1 z)C=pJqH%;$bDR`X@8b~;6-C|F$wu%|1-dM&pj|DmYCGMWQj-Z659(s~-o1j9)h0n* z5!WUNINW(HuhXisp3lEMmS3eaJ*}fNly(%yJ-sp`m(ua#pa#qn_77Z7)HFFYcF93A z_PG|lg4G=e20Cx)dwQi;#LUg%;1*R=U=Aj9*oz;?PFd1g;`+WhtPWGS^D%#PPpJ^#f zgov3T@NwaV>GnDWofEE_P6g(pFz6&~>v^T4DK21V_MQ)w0G&`Hg?8}Jz_NiB7ES1@{1UIMIsZ?>2?qb>I>0%iR} zYbCqbC(cB29<^N;&dT?u0Ire^Sp@L?VWb%SFuFS%G`sBGXbth|+4hEuuf)KvSC z^tfyFATQc^_$BSy7^&Db#ibiJRxM%GCR5CnND0yo- zq#ua#nzW?d^Gi5x?QJ&+$$EvoY0q{3vLD`j?F^QyFnDGX?@gm#)ei^Fte;zYA4G7n zj!3~XyJrz3LMD_xbaGnU!MlGXp>~tWH4{U`v*Ljs`tXO9e3$UyA`zTbTj}I%W~y*Z z;BN}*_GVeGL680Gw0Y390_lI(Ltxvgc!0WHvn})tYe0IYLe6qrh304$>XLO-$A0Z4 zDky}QtVyYtOVWHL88qxUo4pkI3Z{1(b5X(Ub5;cyBs1s}mWnbcEfKpPJvV~s;QVvw zp|AO>qR|-^$iQAGm?sn!pUG^EtEK6~kJ8Z#m~s4FgRn-))U`MT6LH7h@uDT%3tPu+ zGrWYVDi({7g1gR{!JUOulPd^xUoAE9C>p6mnJJRt4&WPI-pL2Jt6I(`PZzh@H=qkMPEA8VPpIO zq0l&Q6Ag+viWL!S@J50QTvc&Ff!BQ+FpBvSXgRIbhIdQqk%rr*<+pR$V!5gj9zRgC zJ~kQGH*cDQ0au4FHY0v?r`On}pIzUqUK2tFT`u@D^7^vvs-mhJYMJl-9FM&X`V-PK zzB9bHL;R5Dxjg><5*8x*k4N732MYxVu`|QOFr5{E(x1&sId0QRoK#J*L>`=?JX|m~ zcfo}*{E&K7rYNy3W6*KJ!y1**Jj$NtAteK>qTftB{u6UqNejp9cvcW|Ar6;D9W3Q% zEUFA-Kh-KPQH7$@KMv9LC`g(q)ghv0MJg@=4>v0>QQw~d%$AxMXw&~iJjs4M z9Bj}AO@oVbOG-dzOEa~wy#pv`{r>}s#=y$@saZ4F$D$!gIrg~?Y3@<5c0uKJn zhH#>P_3SoGi*_4{{UJ*`U2WTH0ZWblDdg;~t5k6R7bmzg-5!T!@Em2-(yt~@HJkS? z4|~8R(6H{EOu_2`y(oo9*#+Iq#*+a1K+A#H0Hn4I($Qxkyg}YLkdQ!I4{}V`Erc&x z(AXf-;U1NcJ53K<$SzlA%8hI}f#Q-oi^9nA_G*@P%xf%sd00{VfFO@yk%gKm3X1Ix zJIKo+x5i>>CJfbBQbN&wn4qxj!fX-W_s&>LZaYq|^r%)auttP>J^DUDGt^k^@}FUO zzr)9O+bFd2zqL3YP#T;c@0!4RD7VI=DZ7NP8nVGem-p^H{FP5r*ki! z+5zd3SYmfN+SwJPBRd^GEtJ{V0SeF5KDgr!a?2AEad1v|&vS$2)=R4*Y@B9#-RA_ym`C(xr73qVdYnM7twj|%rUYwh+D7^(b2wNKtB6E2OtQSDH%AARZL|%VhZO+;w+-$Z**7*IDaQE!Ai4d9o@+>`G&Y%6gq( zr>ixgdq*Ms7?Y)^A1&0kW!n#DZj;frDtQvhEA;@{cW(a zGHx_cC+lO`TD03?TZQk*+$4HOgFEN|Lqz8wGDr=wx5HBz>$ z8MuadXSv;iAny>k#g+Ciu<3#Y71)4gPG!30=^7unZ4L}L@N9$!IDBM$dg|MxKs;n) z8}*?SSl(h#o0qR3}MYdhW>Mk7? zf7^W_r1|(H1d&yVt@sMIkyldnkGEh=Ov^bG808s9sX14x+-T0oi7R}@F@3~}bK%#N z**NAY(Wr)KSf}PP0mc8S31>sKa~PEg$Ur@crqB1Bx71vD>1qs5`)l*irO>j>SB#8} znf^f8_mv9IuUBM5*?EeAFR2|TlOCTw5 z?EP3ceVBsqHsWZ0q7fF?tAUiOR#WlB$w|KxYsMJpEE>+LF!3i;8b0N4qFj3mS&okH zi4*o}K+S|R3A7F;PMSooYJAhc7>3Ezm@Gbxti2tlDLa1c>4~c?76WDB2kq9Ms(LnT zC(+)0zMR1%JEs_?Rufdhe0xWhk~&K>-mrrS z2ITzKU9pY?P70R~^0(g_*fmG+?+>3z`rvf6MBOK*9@wNPu6Q`^1ocMCm}y}`FJ$Wm zBYRRbbKMc#u=3c#@>>5#SGA5yyzpml`TVzBXNy0SwdMy*(LmMcO$f+m+i4P(wu2)3 zJzZZ@IQ2c9MP321TM0EQeb3*vk1{k+i4WrD-&2Q<9wT5A-C(cNOaD~s0exo!?16YN zN+2<8i}EAaMiqT+QGgsVpvHshmh54Q-vn!Yb@i|FhjoN2M3ivP|5QA(?8@*wO}S_K_TxyF#x4GuFrXv45$8$6Pq^whHo)Y@L*6}V$ZPW_1xGf4 zFv*ffs_w#~VYrmNMF9KR$5{o_Pi6{^iNV!(U8l`p#ZnW2+QOF>=A%Yk(gdfqpKAn9 zv^yS(P!b#FxPGcE5oSHK`Uvl$5FPH{Y09Fy-pVQUUE+czc$d@7@!lwWC7pP76@h`Qf_8ntHiw zauycHSbpLMn-RV*Jw9NRLp|)zoBTkncBm#<{vs0%MY@WjtNQkS*qnt#{{yYP7;vb% z9}!M-f(Jm=ZK(cVDdNb)Q@} zr1YRifzG0l!Gy4(5#gc^?pWMQQH%dw4~4YOyfNL7pKnB2TpvZXcyc>_1G`!M9&9 zV4K}^^748kFS{T-+23eT;Heifk_(JXQnAHSl^#tOr>Hx5m`knnICk5a7G6 zHF$iIl6PR;Q7)1EiqAe95u7q#dj)u&Q0w@9kobgxt_X3eaW6vK9Dk;ffBe*R!Enjt zR;PLJgJ4Do;ziW*GG4A%>@lJ%WeZT>X>bprduBY9y3_9vA3m& z+$3YZW;v-!Q$!8fD>BH(`l?zCDOVt~=#J~_Wb;LVH6`zit&$e+d&m`0UF;FPP?zIA zY}|;NB7=))XbvvG<>e{HE zTx<>cciz0M`N6X^UCZ4>TFqd9;YnpjRIl_LpM9}C=tM#y>KBiFz z2JnFxO`#J!SBz6w|Dj3<;_NBas(K59gc5I!YzGWCF{p)kMtdpajH8N{wi>k7pjhQ3 zv%7lZLB|2mrz8;hcn*+x(=%tzO!bn<3CY9Xd>S2tivzUZy>SD;pWQY+#NHAN90S_s zFE8G_EI! z<|AxCnOq}h1m~kOF*4sl!U&u8V`(!nb>MtKX;6p79kOTEl2Gv`uE@fbSR$6~l1>ru z5e|pl+zW*L`qnD6iuv#P5?j^TvU2Cn$7nI=s3D80HrdVIlftAE5cTnpv_~0a5vX=| zaYNn_8-++SIM85f@k;vNh#rpNI_iKfjm4jP+7ViKV*K?3SIz*yT<)Wu(vS&3T;f>j zuIgr4ySS8Q5UxRPi0h&r(Z$6_^{C}a$}_n!!Rz+IgQC`Q9JH_w*{Ez}x}KFhMugaD zjXlragu6@n!xT0xY}(V+y-su9$R|H>E(Fk_%_efe1 zJxdWqebo5AT})`03>LQNTY9(Vz&q|lOR`89de$HB)SkF)(o!$u?lrB8NqWRk;9?&z z1|w+BgtSkeWp|r68DoEpk0&nlMB8gSFg(dVhSw#A3P-m4f}W>|%6i(j3okS|+4b0O zS8jEeUZW1Al3=Zj#!aDmJ$6C^%0LS*=}ul8?oF7QAsT2VPpo@(W4h$0?-J5GMD{vI-hBXpuafe3@iN#ZS z_i<_;!diuUW5V2jv(#6o&{##&z=PB!uUwmA+m!0$Y!8O=!domhDSlww7I~AgadRfu zTIJ+C@8>ayN2inss}r;lETnJ(aVcrug!S+eRewH8Q+C=P;u2q#NO{f-C@X0xwfd)hXXB{5R-5@pJ^vE{5e6%d!p?~bpoLk$BFAu zwxw-9VLli0=)nZclT=!iv3^BYa@YIJ zIk4uegzh;drRFy%<-vpXzkg9~w;-oZfND6uYHNIkkA**lt4IbFRvex_ztju)Al843 z-gccto5<8uZy6UhE>nM0cyP=BvdaEAP$AC7DXfCP{@0HJj-dS-CM9bBP+DePGk9lP zXR0`Znk!x&5;-+*Yeo%yH`o*>*EKP9yEzmh1xOG3I>LC~8CZ*~x2Ng()7%efG*3z& zAIF@vJw#`|sSQns7DdNd!d0wA0V>2;<1Fq|C_@_jQ!uvmEDiW6bK^!h&A${VXzaWZ z{Hcnqj|y^Hb8VEBM7#ueNJhE3Tc5KIo9C8o5iLX`m8!NkkGa(pSI-So=)C7GTK?1K z}C?Q6=mVuhGY z<%}DC{phfyH2DxVO#cN>e$<;=&g=w>8vO5isMfc>kEP|Vh43`X)8vUt)&_gp+Jd1f zun7@)5mHa8eeqqX!)k9@=-e=Z2+C^KX(A8*-}c}M~T7pe^VOrwawI4 zH2F2d7U|6U|7yj%G6dGCNZ;qEtZJ=PK`SjcghS`c-Nx>n@aYJ!6%LU*i(xSyNH8nR zBJADOX)49fX*%|2oT@?MrwJRay*h*(l1FckU^m*HDTF@CEuM%EmJbB6f+!jF%)JSH&CA#3*OpDJF4H+46?!HR-B}FrVgK0 ztA`sxezuTy3Z!L{>~rGcyQb3fvOcZV$INTmqSGF><=KC)7r%GlASnsNq${b3NWCiM z1{X5*$sX=cVzvBlMG zlJJQ5V%;=#!%Eq>I2S|LC({%KGXp0Z=8b0jZke^howOeo_spM8UNSoem<1wv83+{q zKg-v0td%hp5oBYW`|1pC+`Zv#kDr+s5?j23NLu|n`_c&Fv4A|s%$B^Kr||m$I6*`F zPe0Ri$-Zxfsm<H+4{G@dQg#3OrRtH#kiz8GyT^c7EfX<=0p?uLU~ZADb{r=& z|HW0wPU@59oz+Zz-&{KF9Ew;hApXizNP}h704=}Ri}f)xY6Qo`0=dRXj0KD{f@|KL zIyfhFkR5pD%o}00=}GgDzAee^S4wI~FjfIP2ANP6ySS5fx^|%mf1#n%w)*g3 zg>+oU*vQ2*&3)xHDo-gH=XwnsH;0)+0G+v>I(~?+s_R1xP~LbvFwefv!V>68ut)n^ zu3VsOMmye@rToV30MNeaks|lqC+L)ld#7R@C*{L89-A61f+C~p1hs`8Xn~;{L%RWb z+|c=E{3%C_o|%%9|K)^Zo>B!8aL$=i!4OFya4CcBe$u@*8yr7@ksTCbi%3I$H_JFc zLD0VDfXnW61rYEjT3hbl4i0d8_-Emt@MhS-QlEO--G#WPior`Wm9@u!@`q2Klb-dn z9cAT2EDwIV<3V3;HfRqk8TvbmkJHuqlVfBH^pRA{@6T|7c4XfrzT2)ZHmj3iV6=@B zR@AASoRC3oTv$s1@K6L#EdF_kqiUOS)pzU*P92*qtl3bB&lW|IO(sa=JmS={@Co#W z3vv?{&WE~T*mbAIE_DhUOXKjTR2{&MT%{IE_cjjf)N1;fbGBSui+YzHP(`B4^KzP+ z@re-cFb{<=(F?kR98ob_<~squ&ihS>6}lMp`(W|(f^t6g<|1?3MJO#gtg3VaGNy2+ zK#Fq$Y~2R0J*R4I<+t?#GME?8uVHki>2WJ9gKshgisNNCKS?G}gSn~HKLVHroAoxZ zvb03Wz94jK*i9nTj|YyN;sK3Cx_yQrz`~4Bn`j8{8}N0OAMvXKj=7dEZ`DUipMMfg zyq0ZA$T5dPhW~V4R2z;8zb34kdQ~Tr!LdDh#m&8zR~`<_)`i_fsg4h?dk+NmavvPL zAzng0YxX{}cyIFNz4Yf=w3u%p;pFT>_XuB%q1)|@teBLkuS+x|*wMu+31y!in}}GO znM8KNAbjT!VeYMu4WX^8g{wG>n?(#&=p&Ul}`GC(|~ zlko9pFIsBY&?#;+J~923uxyY(cimu+W}3e+t2UB+IgR-pp0Sm3&3Vvn5KCarLmkZ^9g=(n%m}8WiZ^j;brSVYiUz&;*$X?PsQ8DxU1i1KJ>jnf?`Pf&fH+EN_&nq zx~G5Bl%o3-skq)T-FT^<@u{epU=%r{uP$~w$UH3P0Yv7%vM6Jj@P_`(gj-yiPmD*}3N%QDQJYl#OKJ40lxNRxt%e zTZo>h>|x55zmBU=7LlVG1E1Hb`{HSU99_phXEM``B(5%GyBL$5>bQD>VC;7~e*!RA z?NPfqQ=Mf=X1}Q@7I{!9M!3`5Q*0fIHFMNk^25heL(q88MgO^|XL_0&x6q4o+KQ;` z>99&2C_&avtz)f0PQdat3ZzL}MMti#wfcgLX&>V#9{F-UTEB_Gwh&=4A%8X( zsXWem+>BgsFjjV5s&6}X0*?k8s%hM809{hFI3KC7fv%~cK_65a_pwrSjoI|B7#Yeq znu7M(%x*Sxl;E1)Q9XX@Gu^D%uOxhYe4{Ka$F3FoK|o%`m{Hn9!`xbmvzb4ndybQ6 z&lHTqX}|7dzWu9}v}p?nnmaaNO0^kQHS`+KVo=G*_ERfSg^Jc;)j9^{ar}c+;UW4m z)u~*CULu&~(X{|n#18Wz<8L5~i~ZmAP`XaZX5AL7T}Ww;HU;D58ASPf4_i1T{N_6C z#~PW0UR4~9i#9Wu(ZF4{jR=_ebd5&0RT7dS8%qB8eJ2KV%c%rw^# zkqrgsnLj?*>z({Sik?7`McTzBVimS-)>I+Nh$Yo?W5@qOhbS1^d<79`EhqoAWGBY! zKUVdAzpazw>3lWA`wa6C>HC^{-2u3y<#vs|YZ3f~4#I^oGI^8hL(Z!oe)zD9ndIKN zPJPFoJcC8_ol!|h6L;%}lx*)!%x-f+nFxc^X@aXqv)${xh3Y|R5=D0un4ykxCh-s1 z)yA_nSFZ(%zAyhV+p*Z-6yzKjnld0UAoP_r^O(|pW%NAms=yVe`d3D%CkJVLpw{QM z$>E^of9PYw=!;*bhrf=qocmGBtd?n9lq&)76W23-I)27HExK9P(tGCUa5%>O6BgI* z-FOT(BNZtz`9v9Z+q1;+lGD;9S+8D6lL--FuzX$4ugUF!;X1|(wSvX1)JJO33$Cy^ z^4n@F$*GdIo%Jag-?X(?)juNbidq`pB%p5BKChODgdth+9~r~~KM;dB#;^nD5uDT< z@R`|p7(a}tMA!zh?$kp%y82CcC<^*FV$M&^S-Rc7I?Sxy( zZG2sS-FD*BTsip}gGw?yTE)dB)JbB1-xIGyhN9)wHB5iE{jAIM8c4rb-q;+Iz#Do>y4m)Rr})Ei}eLAVo6c|@0?c-JnJx?A+mOHYIFH{y;6hg z_nF6HxhApq-p&`_j#RiGdN8y9pTD_BO}(8*c`ca_F*hTc0iwafVa2K%u)?6lQBT=tS&>U>H#ay8dM28=$6dY;^+(xeX; z$1a)hFcnE(w0dw)4dFy7Od})GU%lRI)p^~Q_=yeF(&Nz>3oivTj| ze%jneq!rtp#-GuZ0CVQMP6p|;BhqWBX(Z+OJ}rE=_23~xPu+pJc64b;dE5ogOg*#z z;`_?Z9x&>41yMaK>JC?XjpIKNktZmHkLP$6IvV|22~v^?_S`vt#smg~2OS;ePoNpL z;_9|9TGnVmj}9L2_$+z`Jn~wX{3T)MtUzbrhQCc%R0@@Cf51ea;7V_bQB(_j>W_E( z=8`F`uomgVVGll&^M#MQ=bSbOlL7krnZ4to}O+=wS!6FJdIs;hJg;^FM^;&7nRq@nnO z!>IrT;SDr#6dvOUz;AT{dNI=BBB2GGExo zE>%`h%)5HIsROB<9p2rt+PrR4VJxwcbVmg*E+>&b*WYW6^Vb`ZH)wB`S{#TCspL*|0QB^gbtwpeBQQuwiY6;Gpv2ld#gZL~s}3{(`T)Bc zy~`<*I4U13{G+=8|7Ww!G2s2ROpci+ed^hw$#aRr#X3baJ@FAQlIWA;K6=|V=rlcmdNyiPEoL#bJ9WVMM z&C1kPtkXlkJd5*Z7#eAP?aIvqPfZpbBw(1);#VMmh$>RFE5}#NyZb;Z9k1`RgB%8` zzZeK{s0i<$AIToSApR);5JYjcmDWKdr+Q^R)w+0Sr;qFwC8P)@a@8L~Sl3 zk-DLo_s6{B&#iZ`S=lihJ#6OD=- zpU|Ct4l@&qkcO&mO+dw^t2JLvUjVl>2q{on%kprU;S0)iVf^eyshtm=aoYA(txev_ zp?q~Pjl&F8sqnjo{Fw0O^DDK)(A{6e^|zit{WDZ&SGAczapil-dv{v1#jL|6*giS6 zHLf?&Cl1*Tu3Zn-<0#kt;+Q$UJ_zxHa~!+6oofB>pu#{P4VmjUgsfNPK_`@ZvhIBR zv|_U%I&R%fXjHi!gc!xsZHF=N262>15BWr5*1${6lIWb&7p^r3hcxqFTX)^3a%Im4 zvhbVSS#XVJrU7i2Ai#(wd>`G_{896w`AANQm2BTMt0Yw0=6cr_RH;o^m-Xr3nN>VVmy%5Vj<$qbE?>TUv`Y>vDn5VfX=6bgQlBY){_4GQes zFd5|E{P9JY^MnfOf*7)Y^q5nxQE+vJ*mfR*H`~~qJ7rr15dxkqV-nj84KhKfnxU}(o z1Zk%D_j{j8SjGsZK#!fo8$2;Ks+?_bq0eZo_>K}#NwEUBK{ZP{+Z%sleR@JVXp(># zH?@{hGW4hp#~#Q{&vR$ql3fFhF382A?)sb?pm{gzd#@~pNV4Er2&8cZ8!{knQYw9@ z%zx%{F2z_2)4sNTGB>MG!BJGCn&6<%jQsgz<|!F4(%yp#l2o~uNT?tL3{lV5R|kD zf@-`2L9wqvQ1}xNbax5_T^|HN7y3ZZ@lFu5w+RGot^z^%r64FL4+Kp~13@Ftf}q~< zASgX@uRprid+zm4dp&Khx7h0q_j--JUU{#V-s?s8ddOb?4-mRH69F2z0fc%l0ipC~ zKq%=U5UMc(gkt-FQ1}fXbhiZvU9Sd07cK#z;{`xyZw3(Bd>#npp8`TT(R+RHUhlov zAKB||_j;?n-ej-W-s=f_J$A1b-|Jy}{l5Tc?+yUk`~d*vuK=K&=KyHR3;-HA27r3s z2SDjJ0Z>vK0IE?3fMP2EP&f|&-OU0(*DnH~3rPUzc+6fOy4U;e^)7ooeXl>f*PHG2 zx_iCKUN67bWA=LCy&eF7{(nBb{kQu9`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{ z`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{`vUs{ z`vUs{`vUs{`vUs{`vUs{|GyC!8&Qm*;!coFzW+a$jQD@A{Qtggi(Q(@7o%E25`3atDa@nS|Nr6U?i7)k$QcT=08Fi zT|q@ih+x0g;NVe|;m;KJekhAn<~u7_t#j2T(3yu6oUI<%8tc<=%VR(mJl<~`{2OZ* z%4SdUt)qL9*QVp^I6dm#>jgzvGI5EAKsQ14SNp{irgnM(ZjZyRVa+5J8HO@hpVz7% zO(U#|l%y$vN?~*5O!ZJPb0cjv;J9i76-*SB#@tCh#3mC-QEJ6+Xw3tuWOeZ*$8ar! z5NhcPsQ_~%LIC{W7q95L^h3F{1`XU28566l?V`2cTQ_S*1xEerZK}6DySXIgU*9)3 z7a>d;Buu#`e@Tsceb^9yki|WPbDMRD)%_;yhpI12Z4$P|m+m8;p3Z=m2UTnLamr{y zzrtE}EKBhi8>a0kQb28G%k?%A#<1aop$+G?juzE8+NNP5yt}^ovGItZkUND%Ot3CZ zP|b>S(pGSK80RUBY%4llaN;i=FomPI2ErY7>B#sv_!_tswfjmSVt~_*hiZ<-8~RNQ zh6OfpT!AuYLzW1yGtF9<+tY+}0{%Cn*0bzTB8j%%CaT3rGzD+Ks8P0nwy+Ne^V?!d z*Xr2H79wwoV9$zu-7fb*x%;?cHwCM`T2TNPx^zeXP8jn80&dQWNiv z!pkc#?~^&}@o)Ur(O&S(QI_VjQRlXGL*UG9Ks#z4EEj7e?l8Y)x9FN#M79#Nxy z&!$zc<)%H{iYQtryE>%#8}m+rRG`WD!kyyN;!(0DV6~f~DGU}0R#{)%$jllNd4?rr zHQr5TP*V9~RvQUuvz0;;*weDTC+|pAl%Ot72zaIxo6A8JS8rAmd*Ji9M|;6jiUu2J zmXIP8&msBCzb3RJvOqO{S9D*%dEdj`sY|8*-}1VlyB7TsW}#FN8%dJo$vEE?L&AJu zKS%QMR;>9Je%U$|a|JW4@w8K2ZCScE@jSE0WR{@<1$J0#9TRq1yHet*--zEZzq9-! z1M()t+O!?$UZl}Fi_|4Kqem5VqlaIwZF!g}x*wkW0G?+Vwb@P&`ke(dL7N==R#9D( zPLH0VO~niQHd@mynD)0wCy3JV?OL;IZ$rQLi}0?VD%s*mM3~3!&{R0QmovEQ#cFzu zIydKmobjMz{4NVGN;dx%dW8vdJZ;RS!?cK4)V6WY081s6S3AmO`9Ln4IqPBvDw1VN@ zsod1WIp_I(AV=N|gLce^pRv3A9VBp#+X?)L-u1U~On9fI1j{X^<*Kr!GEi1+U`9k1 zb_bfG!HF#>eC9&=l!Q@_URLKx)9(%cg?VH4^uO^y!y6ONc#acqdc~eiVYqsw_!BxH z=|jaqFRQ1xWSb^xlt}{jrVw@%uBH^$RORMYv*m4MlLq&u%`&vQY%L7FU)vHu`;p!H z??#$gk8SjSV-$jw@2LLk6Iv@P^pkjAqy{COn9(fmUAiqFeaze~LB(jWXuB=0Mjun> zVByNK<&Xw7eSog(r=L5$G?(DIRb0cPR?oHVLD-`+u@B1PX?b~|9*#;yn7QikstOWs z1?Y(eKjUD6KNnfqwn~A%=7fI7x?J-OyDjki;7dW~7tq#Tw3kMXbHi=+22FqGhGjoV zV)HMcE5dHg=w>lJW}DKv-O|5UZNJ!HD)X4B0hu)#c9hp2pfcxF#^Gh@MU)=z(m)h^ z5E~HTKXg-L0<}1TtR5qCV^(maBWNk%{F1{FUZeA02t7j;GBm!(At59SR1# z8#sGn1MXWAH&v7a91;=#YT%q6VN13P?hR7LIeW4lw!#WgR*6{;9WVH;(5<3n<$cEG z^wqfe+=bXf)X!OX*eR<|_|!HepR*!JYc_$`)Xyf!b%Z0x^$%CLB*?^7=Y>$XG%kYC zK)}ODYU@V~3vwIN3slP2$q1$h3_w|)T)!FUv;x4z`9*}inelc-8*vZAN zGTE(V_+XiWf*LnUsqIjyPI6dl#rg6^u~lj?)CnrgO3%rygZfGdc#x}|(Z({L1b_+` zJohr}!Bx+_g>;#Uhf-r~P)>jX0T=enPG%9?(^!O)Ly&B#0C%_vwPIjc))VYL3>OX* zBNBxO))t2hk!TbSK%gV(AsswIkR~1vIhV#<89fkZOBC3)mA|jtHKC-nZTV!PJ~L&P@7L4 zj+%VSC}w4@9~Q)D$PFyb@=Pj(xd|Gr^FE%4iJTJbZ*R2;p%H|PSdT>v{QY2CGnA)o z=X-l8CWe(=(d~(7bZg(v^KxesKq`f>3QL=OUC!=YPw7srafN;$=u5r6=kk4(^t8pk~649k-u=`*y(E#G7wbdfBX|zm8xA3$Gn3 z`4|InMrtLIK26b<+Sm0s-$|`bI?x=>FzsCy;qRhoP(FBJwFNAxU3qo%6oL89N{8a8 z1b(Gw;8=i{eWht-5t4AWo2a#?kzw`;!Wvmbc;Mg?q6TE|lQEWt1Uu3nAr{2wmD}cJ z4V4S7$C|C8;+C{O!^M4ta?{7G4U00qnil1};ib4iXE#jPEi#*Uz~ww(Utz3RO3-6b z^y+~JP<+my&6JLn@vS>AkRG??W-v_eF-Mi|fD-E3wO>_E|KNyba{~i z&`f1bn{e8}SkBK}uFT?BVgDZwI%xm! zfa@1n;8V;dR0J}-8^x*zC7q+X`zD8tTkvp=y4wwDT%59SMNabtGsQ1h#cvbSU7kJG z2|;bXrEZUNLQqZ!fRRaQxO_Qi!F;kEIc1n{HrN*Cl*`3AlI;>jU69JAMmrAUF)Tzg zUE#_PA00Vn?A>+muqp)!zXwbh7 z&>Uk`4q+*Ki?EWvbvCh{0mWHel}cv~oTQbq>@la`CyrP>IEJAv)pAoFgDQ0PiYe3@ zcO@moht@4*_`c%2MSNau1G8%yo|fs$_eBlzS3@)*4ZB1k%YYw?_up$5;{tmPw5`bE zMM^(j(}v{zC-wpl6rgjhB|@JaR}H(A6lYqj<;!*L_G$LZy`CwCsQNG;H?X@7TO2r00YPg&V( z$yr_v9nVKEfo?HqCjQ7R738(wb|UVi(;1FW{RGk1Vb#QN@jx9`gjS2L?CzC2g3F9> zk%J+kTW6JCbUH>A$oeYSg5pGoq9M5le>79yiqap(U4N!=&&RMBv-&HIZGDNq#3{&* zdG9ibuItY>s3-2;K4Fi%{eq9>tzteY&_HApX@$#{i2Lh#uu*1d)LX5QR?puceh)?d z*Vt$WOPeFUqZ>RhE%*grkpOB?jhr6VCr!MPb?MGNO)z2W48jNK%^=x)X>trmxsEsj z1u&3v9p)`rpWdn7!mzd`tzU~;?qimP>>6m=Y3i|Ahi3(S*%jR>@dAfrw#$Ts$4A=w zLEPw)z!0=p_S1gq*T(1S0yzMGS0UP6VM0=$fxW6l*ud~dkxnI+f#lZc3frQA(} zlo^N5$9}Ed1c5M+Qua5J4f)*%8r@8L{df6vn1DkSz?4Ck4 zP+JQnf)>(E3;@nHHKLQFBqYQdM)L?;a(bbuCxdm+miTWR7bZLzucyF~1ghVuR`gAM z4RcO~`h5Kc_elObGH8*MNi&|{NY~0A9Z$w}_uh_xT*vfc^yc)UbYaX1A7t&F;V19Bg6!y5f!)zGRbh5s#mk z%;Tk&v#1}wA+?x^KYxPlaY0y5ni98^-(4mEHyx7fm;j9%{Wfy_sRa|KOgo6d%sLZo(;|RpPETT)I5!z)A=)$zDDx`6&SUybe~I=hvTe3 z#m5Qg<{FGb9gl1J;M7V$0?pmz7L8NQQ@7ADX0f9ldGC>5@$3}K05t4A2QiTvI>=CF z|~wf1kC2^vti54eI&!o`|gxfL4MP zMuHfk$K!h0nZ|D9cr~f>5MDjGQ9C^7GDmd5x)Y1HxkJ^h+FXnZfC9K@8prZmxtO!M zOv@zE=8+^P?-gyn{cE$jb)HlO*rbhAQ!|&C0B*e1q1oWAdCs{)6|{8fCL%SK0oc(v z8W+$qXJMa1iclh>3hU=>NiJqANMe{^&3V{96YGyNS!0BWdl#*8$Z>-@PEqM5G*5m` z_T1-=d*HNA!R8=Z4?G>)EoRz{W2Ls*yC3LV>f*$5H)$3K# zj!k0Pn8hiao*t*J{48kD9Z|glT-?ZR?je&U8!Bp(i`JBKj1Pt(3Jva=lF(@oa(|T! z`WN#UND$8 zy;!!)Yp}L=Nxj**!-ZC?df0~hXT2MOg4ekcC}617C6~0~L{vM6YZc{fsB8vW?*`T{ zH?xkeK;b`9E#VeD7@YSH)1w`$?_{tgtm`zuj-`P-!_)!?a!Ih41nvxMp!(khwt{Q@ zG84v#ayAJCqU2um$x%*6%EtDSi)|{3Q24a$v3X=LePROhF3+}e%mzE2J*1&hN>i<| zR;$5kL!1F3cZjevWa#Z%*n`OvCKOr*aYeAqRw%o?rX`@ka8nViTp^Jo!+MV&aUg#^ z<)KSl=eElxL5Jz6VlND_dZ>r*_+iv@J=!TzzO?+>)ZwDDDDzu6ZeTl&IWuRAHzDSa zkui0pHwI`ZfPs}ZP&M?A8w0>$g*BD+TAc~+CRbZ2)4PpVA~(&8OL@D;-CRRqjFm5Z z>7!r#PaZzy8vk4%EUR)jQ;z2BRNdab@QG8>?K1hXPLF_6{JfiQv7CYNCp=bIo^@o~ zbUHhLJ9eRCDLP1{bB_;%lLJ)zHQJphvRUgL51zG!Q~gqpcQP+?lG-zZE~X1PqIV#W z<0+Y1TtBIea@RD_62~7;)I~ZHa~nhuDKlWnKQ||?NM2ffqX8skf*O7R0DAe#Gz~7W z+M^usGaOdp|Lz6Qxt+Lje~bD)$B>-=z}UgqrdTmIbxeGW!`2oCiPtv}I3WO;UJw-v@o z{O-~)M%!3d7is1S-fx4 zB?V8FYGg=J8bDlOP{{D2O<~SN^S5x0++WJEbHxuQmW*^9NPeWuW>;vnfgl{NkVAjm zBRQ+$9Spqa^Kttdp6Lnx0sUfUZA|Fmnk#CA#?OPam)9c#S0Akbuu0jVWvGzWW$U>;mz$^fopQrLIT z=}H6P5Am|BFd^s^%Vn)&^yzA(v~tr;DBW}T<^WcY*>(5%Ui7Q3JdMV7@gsAaSb+80hO%C6vFk*hG)>`_>7|fj;^x*Gq=lqR$Rs9z*#wqS3hnu=CMD)* zAdv@e#$0Bjsad6mh&nO9l7uFE;+G|{l0SMiNvDk1Nv;zgqDn3A&E~tkPCX`C-b*+b zyZdeZU~tSsHWAszXSS&YAxB71i{kS9b45%{sLbh=eY}}b{7)*U^P-f0affR_{Vd&8 zpZ%YTI2j^P3ukP&jyuDOZx2Z)*M7FAzLLg#87?LP@*dwDPl0YOMl;xSlRB?@Bepv@ z32RMqc$S-k%pfV6#1hd_EAEJ7Z2c zt=_hD2J>G6q-IqqK2VT2;msPi@8J-oe9(m>&2MpkT9aFI5M7fw*dRoxQpnaFPyN-I zNCX6SmgnO&9&k6y@vWZez@F&%hvTMjOnT}rm7$_K-}iBiHhT-Fv~GK{7Z z4CM|yd8~|DdcmkxS;7u_{v|S|_PdUGz~LH?`}>yA_*Sn&po;AGEgM0TashJbGE8^i zs~za`l=dsM7f1CY?80wzAr$lFP(khu^!P$N$F zWXaTd0^Lb^`+;F(cXX|u<$sb@I- zDiKa;T>jNJnGF)y)q5#}2)`ae1-9wI>x{Os1ti4A!I|Gs@o;*IuJre$C4nwN3`igq z50KF78MfJK-rh*}h$Z>(001{#8&Yp*GRRHR#DN_V_Hl-g%9fdDiIv9N+`f#*Rf5gE z-Yxzv0}3F1JKmFYDB2VH-yjRh4XKoUNBn zT3Q?^Q$eL@#$NOi*$()>^+vsfDI@i77TqtG-te&Iy6W&w-%Fz5KHlb6q=f_cQS_OB z?J$=yyVfP@A#N)bUp0x(28EiQIE4iu23U?C?ROy5O&HJZO*tEs-qtR zcVFQk?ZjK9>Q4*CNsIx@meriz_o$ekFYT;9T1jSeGD#!@O!R<{CmWMIYZ-wV1Ss!9 zaLn}%bjByCn>vFuU3iumsShJrzJ3H-HAW9EkXN#i)SwJL@*U_KopBPafl&pMjy!z3 z{zXqz*_QBfUv&}BQYgqJ((59w5m#pQDPe(ZuK1aq=Cz$OT5U?L??M>G59rEh_llzU zv<8;ekhtpd81~EeDy(YuO+^MqV~{r8d}?opfIZ(EZ-C6ZYIFBcxXlNVbPXTrlJf$XErFb+&u3Z za@>=#-K?%6wZk4?H==|)5<_qa zKGIvT?gUAMOTn&cG8^*pDPRK6;BH_xfgApa|JHfczwuq!ee|bwAJztE96NozYA?>_{kcbl`snWq z2c0qQZb^tE_4NK~-#YoB=tOnA&+A{m%7J-`Q*uo70UFrPB~yim+5OQ`qO*j)W~Qe=@<*#ze;1 zlr4f{l<^v~0*f_iX^CW%coDaj+lbL$(^;Qs(bDUlxAUEm0z!X+k|B)_RS_TSYrXmI zBOs&3bn0iWv9U*MW`y3h{zmj4X#nio&F%j<@PEl4Zma$UO7fjT(H|rGpV9Zr&QZ#j z6(jElK6$O4d#u6o4}(j3d5gc8VwL0SC7}w9X*Cwr?zh=)H3C^g8f4{<$<8d$gjz@b zk$gYqKE7&BJ8{x{ZN8a|Q!Th63VClNW`Q!9@M0<`UHg(-{ zxxmG;b33i0dHB(hjx3g4978SB9CV5-{G1?D+LMTSuvIw>C>XR#+Em@AM)TG7CW%>` zpG-T+2!%Gh45vA%(VBr!sL^G@z9xnXUehAr=al)F*lRWDq4>E8l&H*Qt*+;o&agIQ@ zlyaFv7*|(lWK;~tot?jzZ+oB};>;Ka%y8pbPHO*cE(}K0H~inTyMz~}C}6Eu!o?d( zLy;(|rcD#RteLl_l{)$>_F^Bx#(+RyXo8^Uday0!SE<85!>E zu;k*Qq)dXpju0)C;8MR`RX^V)k^PSLn!i$U zH_4`l!HnVEWt)%%CUQ4Xb(Y)$ol_~@&~eisuz}C{mRG9pOr5GR4m9f!&uoIY`1IGo z6-EXbYG;|@O}X}aT6Z9Mv?k>_@ANN7-TH!CdvRPIU!lG(??I(qpf|)i5@uSNw_493 z*q;1;kPF|mZH?U{_3TeAA5!0wesT%FsxRkh8f2>aODschiTBr)oUFZ4sWLn{3upJe zWN#8CX9e?s274P{a~y?s&|TGQ_$9nL06GF~4T|XoMJj}vK|c8uP{HSJ4~fR4!MlG- z#7e{FU8YL~=1*#IqshpvRI{OW zhyPk)rWgqN!0wJ9grgh|>~ftE>Rc(%-$zdn_t?|n?W-zAN5lM%is7B*NE9u+^M0KM zp+3i#oWLR*NTWFM_p#JeqIpi?n_~>o< z5{E&jyf6M&4}Dz?wYc-lmd$k`V|NY=h2J1PPubfg@^swA0zu7$`4JJeBr5WW@?Cg8 zinU+b8inC?>zxLLJZ~4lQ&taqz@LB`9AY=awmJ%X2q8vkaoh*HATSX2G zSh}B5igsq`Q7g`j)h^&rJ{*(RkcJ~)VM(aRde!+RHfXBr89FM{t~44dfF{qk7Gr z-8imKv`NzQZ^q1&dNnd+ht!obi(E&ZKh>P;GZotV}y~&-E~92$&Fgsp@ek`gAnY}*?pL# zJaNy-l2OHb2=!s0$Wc4mH^ILHKc@AG)w%fLWgAbbifFZkOjp zl;^O<%RWPQK1?7NM_uD-!zoO4X37(uP~HWS@PVmSyYQZ6f2Htb_xqy?37@@vBZDO0 z+YE$`98d)8pib(&Wl21sgpD^oJes-Jvl}oY@-3;qF-f`Z{T?w~A*O3e1~bi{6>fqO zUK!JUo8C1Gw0iBKl6=t(p0Rooq)qI0jpyT;HP?gvDdO_cNik-$f(c0k?3Z)THuEzGQuh*E@p&AD;W!-FhPZF~g zm2={Q{B%)%Up#2Jx`dnfRRBD*fXiuyZhV?z!kZsa>g5~$4)_sfg&p%!3>jyJw=hi-pU&Ng4VZ3Y*zMtod0yeB?A`c8#5PPk zx**$HW8XxBKlVnbAE2U;0C^?YDK~2}blgQLHfHWGP^*dBS{V$WZHc8Q@>gQz-QM#>XSCp0ISF;^=z6*Qwp}?3(c~1Vr-d`OvdY!+zIqLDHA^l1j|2agHQ4Cv zq8i+HaCQ6f4GK!(yy1q(5-7U5%cR#jDx zpB9wc#&;Kx08kO&QIC(@`N$je=NH+jl~p2V=54m7fr#zHySJ^jIyTSDL1G8D<$qdq zWmeX%2`g94p=})=tOUM!b4gwYdyui@+Z?c5iCvo8;;GF;uvpax?WBWOQxa@4 z7e?Ap^O(i}l~M%8iY?CXru!v>8)OqQy(A*XP{LbEIW}=|RXb}5)6S^$fxwF%Ohtbn zlH#`bUegU>Bb*#`hUD?IWGs;xss<~;Uwk-Nh+&B(%S!EHOtnfx5|2s^@TaJ)4RcbP zIXJf&GCTLylWVA&WQL37?aK}%TuWK;gh5^Y(|feWZpayd;b>tCl38Gtft&Q}R-7sq zts^$Y1!Y^VmD5&MOd*_D-AtgAq!1W8y6H8a^t<&Ja88gZtjj*^argJ?-wu$X@~G;sXV zh{O~yaQ=IXeuffLw{-G~iejDLV3S?kLL(xSe?D)+AgyIE&!6|q1kvO6wdlE|b8)B1 z-0S~(d(t(jv#LQQoLG7KKIheQ@MXy!E=j7s;rhyAnG%aFqd0^PEIlKf^U{2 ziQW#fKpM?azE6=jb_>$DmsrCDXbQZ)9uqJ?hc|8VRHBNBz6FjqWAC5gsVl!RwUyO9 z;5aA>naT~^JH=Ed5;03+_708g#y%$id7}jZSHnkg@9xMCD|Aaga8NVycs~c>p7Q9B z7jVE~;-G6YYdGe@J{>6voB;=fqpk|%`Y8pmeCWW~}UnD1m%7#!mY6~CfmwN|k z@Mb+3O;ol$CTgocUU-YrI7p6U34E{?a`u@`QBaTm+ImF2)-=tqZLAF za9~+^sl<>5B-(R{mq3xmi>~tzDEJCpl2gkwDg+IbphaiWZx97DIKw?r)I-TiY&fep z7#UlnDk^Ibw;s}QF~g~2;~qhwZ4WpNo5r3eeHbOEt>Dib0DmE|zYe-xPj| zvtqfZXd`8)bUrqX-A-On#R1lJKHz3bmYDBm0Db)wvxI}&*83@#^D{E@h@?4ot>bxy zpkgC_y*jA&wmfDbl6|B^VLLNi{~3dWh^2KLT2@95MO<4*Wcb)3xm*5{V!Dz8XR-+6 z7$6g^1_M4ABY7;KSy1e0SQp9|22={7z|?V4Pt&7h(pk$Q?e}N=3)kf(%-$o=BLb{# ztrMO>wZyNx&8&vB)ZFf=*9dU|I+Tx1VP+s@d1 z!%B-KvHx;Ie*A?GMTHJ<+`sf*6C;4ME@TiVa;3i8_p1KU74RZIa2dbDxJ+M1iyzXp z`xi?re7c|Ovru2%f@O2wSZOvxgq~W(yR)6MBK1lg@AZT`77`JfH{z+)5ax-Fm(v{+ zt&K~ZD0h~(GV^aN1i!cVke?`vyd8&$LjA`1xKR2GX9C$W5Eeg1lKr7YtOqJCB1JJ? zCex>!LAbH2*$#y5+Hz&a8?KAv*&+nEW$A21Ez&$QSll6632v#P#Tr}4VyF2hTv#g-N0lf-gtXf zHE2OtuGG~_S6yVTsa56tv7L6*!*`Q>Zm7@E>@!YI^$OpMHK;!|DEh1aTRGTQc+sH7 z-wlzMCYjd@&qIlM+Rv`FstXcOFayy2+V zWk~>$Ov;iJ)KIe=gOU0r0Pd465zv1#KWxKrUxhF&49t70P^qhuDg@?Wvg6ioGP4>^ z=;vjXLgd2E$hph_ck*Ye@k@vx(f^3mRr(!pXx8V0cwbFq0gE2K02+~g8DuT?Wd8xp zAZ0dexi)8JOSkdiu2_rhSKem zpUqL$en*K*fnFqcGPD5O>~>a-Poxw_e>X_nNG_*e-BNpA5_0*uQDWSuFd~2m%85v- zP5d*)y(~D9^gR2=W41cn==X%U)DKNpPO+=rT69fc#z52!Spgz@7H#3{i?#pJdtF)| zcJpcHr8AUwy|YT^)wyw-o0P@hG;@fKWcfBHw-~UsOcCH`9%FlRvk7VEEZK~{Q7`ip z*mFGLC*Jl2T%(1`Kmkld?jMJ_aDFr5oZ5>qGlx<*F%?OxB~^Q{T#!N4bbrplxGFX< zl=;)$&veW3^(H(@nzzkn@j^6(tR+$y@3db?yt7p%`Pggm;^MPheNVa@pXkAQT7lUS zl!UsO|D=c@-YGi22aE8*TddnYXy~Al!2{)-Z?0qkT&>BiRt{r}8!h-zO57St+&n;@ z=r>$t!`w9BEEz=2JKHGYhTz@ieYIzedgzf0)D9$tc?fC|fP&MK=>wM1`<{bqowG9c^L^=M#xD81b} zS(%P;biQtz@Qo0dF+7<}P7A&EaTR;dw``s+%%>V5Of_mduH|~E6uZ#( zb9$BQx}?etwfu>2W1L9V#yzmE3-@qcYL#lP=~i{BUUj<7P1{>BO5;5bFT{v0VF^xt zj#`&|cVg!IXZyOiy9tV=J=T}I~twEke7 zn5A2LmcJXuRjJ&$cdn}i>amPd;G_kk+4-C=Py2s$5GB>ZepEzZj{1hZajW7*p@oAq zmFcKU*&FPc!>*bLBil~{46mCT74p-N&|LUP1zk#4>9=1t>V;{`IwxPu=RXe`zrnKh z_TG;vAZ@IyYl7r=zSAg(pigh)gKyP)-wCP3UR54DZQOKEfCaFHz)_Z*H1jM<7g3jE z*UUY9E};BgFeeo1r)q3_IMZb0eg2|- zC#yrXQ+3EQ>8*xlZIFZvub2JrB1# zZf*qD@BgWzGNx8At)B4|I|Xtn?_P*%#^w|uc!fBAmXy3$F=q3mcCef0Y+f4*UGd-5 zE%z=bZI@3=5$E9dFMT0&IYt880s$MFzzkP*`zckBcEn!H+LbUQ?l#ad9jKH___?yv zT)+YAt>a#=ZSDwr9haEU5Umyqxr5R}Z7wMVAE8{+l1USKccW4hc%ALQNvYqON}ZFL z#g=sVtn2K>AGHrWNq@n`u`>k7SFy^_Sx9p&Nob2KmvW=PK%Lt~PuWPV%@Tv^BNVgs zZyf0NHlfDK!G)4%gNax$kVlw~t<<=o`5=40tHu(w0Uvr(c8`#9AP>*6%1`(US z&W5|0tb$7R8jMg}*#kWa1yu ze(fSYHB8RBHm(9W(vS93`)>-|Lkyr=DlcuCfrHb3$x_l?jaC%8lZec`Og~7%=`0(> zs20}`=5a0SQUn-=6N=eA!R}a8IB}eZvK~bU&7I4-4<9blEE7?ck2)E6lc}(lqwJeh z4-*q9)O&w`ACqJ`AnR$ce#oU5dngy`K??A5YvhXN3-K4cn{O^Z_5<~Ksbl@3`d*3q zoHjJnB$PAI_*@8y%M;mlB?aMnR^kk*MoLLAwad%zBv+XGK3`%}7^VzFtsVn94wW^b zJXdG5Ed8xJ)(A>s;sSL>%+sovQS>C!9$PKnNc`vrJ}$OG8`?B(W?O3Nnk7ojX1lyi z5IH-F9=DL8Jo8U}+a?nrqO%g{B5@flRk-p%TozpyY)komTORaR=Bz55WLRzgB4dtQ z4K9x`qcdj}$>vmhX@&XNLv7K%dwilI;7wZ-IDu$Gi*BBIjm zx*U*B^;4U_5ogxORYmSpjcV9Xa1U^xjaX95uxol#dG~c4I$&ZOlh-3)_d>wJ6lK&9lpV95|nrnw2>>g*OEMP;pvF1fgKvF%$KA zC}qj@@#NGALpq{!cs&Wb8>>;M zF>Dr!KXu|?ejXCjNmT&a;csMwLEpy9jhOlb(@~Ptqb)}%Ox1g|u}JG-`)=YyKwdYd z&%Qp6Ln*C9CZF;-^Oc5=lc^o5U=ppU?u@a&oVt`9)Be)AtRGP62aG)`UYs_R@ z!3JrVk(4!(J3XCL`l%7^P2DafA)c3EC`C4*hu#IgDf+G}C>1FrLE%pMeCXe><7AAH zCb(L%xL5KuL<4qidJ}5=MYzP+BTEXJ#dSgn{8tAhFwY_R0M12tE{zwt>wUL3k~FhY zQrqh!+9|oM?2M5f}n6d!w3 z&o;@PtQR3jXm~#vgMI#jjypq^mzHMk89ye@gikQ)sqXG7(L?^%Q@Je9%!r`nisf?p z&)(WQD?tB_MK-q7fA~WF@54uP{>*VYr^o~fF~%Gj`BFdP47EHmCh%FtYm5h-Hicsw ztLV{Ke%OBj*Z35aldM!_%5fQO={j6-g59T!16o)T?feoXy64~-fpCsiNH}6mA*-a& zbT1nJx_B^1#M$$$9;7>HD5fZN@i|&{Z>DzTbiaGGMFzNjP_x$g;BL;;z|wGob#(z^ zMjb}Mkgk1sIn5>kezRc71CsNF8>j$OQiVuSz+b{LSPsY0MU{eY*ND5+tcbo*SSpA2 zy2+?|eaF?9^xZf`mQyQ309-s}Z_@T$AM}45_`e*`KBbt-b}-i9S2q?0H-;{N9m9`< zbq6cXzWmkeirzOgqW;R`#f;sXzRXgp5BGbKP61wf$7*#KQI0)=(BiO?SM>N(-C24<58|XS>tK#1-c;5WEBWEgxH$JW{@GLOy z|3P;@O0!8s5l^b-fdj{=xWBPR;?-u~-#g@FyZwtw>?SFJG>Z;qFGK7U-SXQSo!sms z6^if@rUF6zA(WxVA-Uj9IgGNSx77qOr7;xkgnS*z-}*bUeJw&G3q_ct`e&wwGfWCD zs&;?;J{*BP$qVMKp#`W>vS*7ig$UP$&^P7w$tDd1J;;RUyedfj(AiO&_=w4+96Vu~ zBFnJfXt#W^w0i3Euo#Qili<@z(GN2_?QZs9bEP}n96agmG5ApR&@pxPb)K;YKmK+a zX&^WKydgWHKAAnZC`m)y141%aqNzLW9U?ynW=q6gMvehgjQu;1{y}zWP`1-1fpe&+kD8k6^iX_ zes$f`v+49-T{a!i|DK9Fjj%+ONA!Vp@t5@#Zn<|M)40 z(g$h)ev&yKbfY0)Ad#kmlvjD2D?$d3TocPyIq%(N?ULQCyBh6C4g0p!AOpXt7SGxf z>_oHC{G*;FC|p&j|JAO0J9ScZN(Swa8o74p=LmHu>ZSPatv2~GBD1&YI`D;O_`w>J z%*c`K@KYk{aWvQhHj&QQ6^W`)?Rs6KkTE(TpU}GboS+jh4Z-E=!^`qW_bS$}A& z0S8#uP=^OoAPV+N!!yn@8g57A>K%;^Bx4aBjipCFw54TfTudJH0rFxZ(WcG9Oz>B4ioA{S$?6YY9n0Bk3>(N z2m?Y*F%zD7O_#HU%t*;h|V2C>~--zq$mx~d&qi;CDL#BE6*)YMMe$mloC_yL%9 zMW0>BYQ}ByPMUXFerr(Kei;(Yj@9+qP}n=80|FIk9cqwr$(C zopcA?{qE$Syiv{fw+FSVR@I{XVL1<i4- z2bokV@nMo=ix+ZD8@C!mzD43~+E^=7kOOI)WEXLdC+eTrf)E@7d0JMi-vR^coaPQF z&Z9HeXidCVuDsI)Np|=x_0Hb9rs4qxUCR_#^RX+F$3~Nr@-Dz)K|dB6q`_3vu1C-) z?pK~LlxQDn7&3_gf{(2~ie-Z5$5bPpv|eg0MBtYp0_!Q*_4K)JCrU;NSu3(tJpxa4 z_6w?KcdK-_I;j!l%{vi+aI`N3a>2-ikhTIS#e~pH_&R7rz&V*pt-_7kihg~ z6hYdblA?Fv;KW!;rFN^s7H}5|sOiz{X8M~_5~UCu0SwMmLVNiJL~p;xjqSMlGXAU% z8qIMUlNU6l;tPFern^twQJ=m%VJZkVH+H0#4T|LwH)SRoQ6aVKa#kHpM#e%W1uoUiJ+@x5YD6U^eu51jI5pn8u z;{)YL$e)F<7Isz67tAEwLV(aO^{|}!fAQ7aNeSjIWI!1j(#pNA537s1iQwE7?k~;S zk@|3WvJvrxB+pjUb8*J80HLRpy(xQeJC8oZC6xyZ#_WTHoPp`d)h7$TP7a^#*I`x} zpx@zj%j_98uGR*tEh5ru@l=NXQ8wp9U!avfxk<>0Kn<jng~}+2~(! zRNb|nV0`QV$pL~JtZm~n#`R*4y=v&|2Eg# zQ+85Zhb34QS>w6NB(uTC=0iFCG1fyL?5mnJBE} zMRA>CANmJhzUqfyx(aD<8!N6wr7*i4nre>jM*M(**ry`(S~UGt3z1papMhK0m} z@H^S&JxAFm#)`Mb( z$qIFGWX`BN8ZROa`0or44bVs=m!1z2DIyON;-sgw8!1~AXNDQ9DkR&#gA2Uo6RXX8>Tq% zil*j{M_@l9i>zI@RyTvc_wMS2oTWXfe#ap4Me^R$IiAO#$DM1z=~z;^3*Ven6?o%s zCYAwgkIR~;OMfpKnBFkG4OL40WG>is2-fF-mZI5IFoLtEWnP|Xl_-%nZH_}MB!~WX zuiXUbxXt3O8Nzymn#DbyOSvogJN5)jL>Ll}kmIO^K$SB-WFP@(Se%yQ>&ip2pEGA} z7)jN??n=TS;GSoBs3gV9`ad#*^8ia7VhL!}Wf)6%#w|vbU5*ZoYN))?CWLHe*y-G- z75Ga}q=z0nSyB6q-0~4Z15Zf@e$BsEkH)$K`R2Bo>{{FF{>KCVhsuW2%aTrpnGMPn zpZ7ClLjFbV-q>57_^eK)r>Lk(zh`MLp!uON39_;nEAi@kq=_K+7;#AIF+7v=^s6sM z3l1L`a>A@wSg%;AiIN?uO8g+}di)exB;6;BOZg1j{q^1rxGyNUboaRHO|y;a8u@T_ z;N1cXsublSt(Tfo7kUJnoY*VaxKsHzW{Gmz4KcY_FK0qnGN0jDuaoAQ1AqYTk~pjK zFcrf+d+MkBR68A~oTIX3Mwg2(L27-QQqM?TDqL8Q<2y~AB^R~Rt^{NAU({DF`S)~I z+J0vLQqsu45$U?fcF#0Bs0m@BMsl*+$d*UMw-e5_zk5>Rmw4p#Evh@_vIxF$lzw^+ zRaRG{B9P)MA2W0M7O%s7;Zj#kp}TV|QFdxlD8yX;sjBJG16`7;&{AMXtNuM$2({WQ zaa>3o>=dU*>3GF8MoEyhsoNhx?52RLQ!m3Oh|#vRj)BVk$~+ckE_rfuM9WBbI!DT}`=Bkg)Ll?Y zB$HDqK$BR@?9Y7mAp16;2ZQ$d4PC-aQ)C`Jt36#3*~sdFg>#%_lZt{xOW#adYcs7? zjQN7_=UWBnCCfS<=l(hJQoCm-Z<$oMfpi$k)H;EaNDk=?8wJ7XG)Y?>*y67%N4pJ*nh@d zz0a!v!?^^6`aasjb;Axb?1F-TQyUS(FxhFP%^;Cun6Orsp8)r;;}8X0okiXh`#B3l z*9ot}1~_?$LZ5=S38yvqr9iYJy6wN*sm|&USYBT=*YSL@a3)jNVi|7emJr=fCB*At z{#HUv|76(4hH2`@4oN9D;65Ld#M(Lja%QCfZDT6VKLVaWyu;|*6yftXXL`gvj;o1l z4hdZzjV!Q`ne+)+RZ6;CElF`4Vh_|?^fiA>{4XYI$LJ(kGxb(>wLl*wdW zz;rQkfu{sWGOb@%tgtlMraf9}IMYRGXG_*XyRhZ1 zs$EP$sCj3gJ}5Te{bPjb%Guq%uY_DC_vvUv02msn`2U1fl>ND2(1feLX;ekSR&kY+ z+)uAS%i>~P+woFwh!V%gFLCJRTR_PC1%xo&4P;se=iVcQe%t$7k4stAVJfZyY%xFJ z&0;j%wcBd^^zcU5y}jTo^h)8EgU%MSK^X9jy zHq|K!SCNOPBF=Rjt%g)zV@hVWW*k}bb$L$4s^nf$%U()b{ZMpP z{Rtc}~CP_{%JgT!%IS3YcnVyTfr;!9LTa^dki(A`x^O?l?4_)drpwEzER) zgB6!v7<}{`z(fAiJcZ@a$5vK2_i*ne*aiQ9BycCTM0@)Wa7V<~AxG={SDy7`~DKWWdh9oC@X|mZGKw03b z9}TnElSM|;G=nzPq^u-2ayJnlEY9hV&O}CC7M93k zg%}FW>+^bY!D~s934ORfnfglRs*$D9?5{djvb;r`wRDVZ+Nn(3*k&0{=&zQ|OFkkH z!;V(<*0&7w%G#^l0NRb*R{Ak}AyA~SbTv73aoUGnPyLXEN2Ugtl>2N9NgA^^*ep@A zy}|;kA&9*uK=Ez&`;$D6;sU&DXl1X#<<DB96o7L%Lq8*}`!bT+a<6tnKBR!tNpV=(Z=+8SbC*FoTG#}3<-tsjqgpzyg zK^{2AC2+Cn@582MdVN>ESOAj?{qNLLYN|90eqh-X$6|bUDw!~7d!%`+_58LEUG%ON zgpe|}DE{fe+}Dy>NZ>U68`HIE7`7!XJ5o%S&hG7M#Tl{Ni$s*ZrD0c%^5quNlTfVY zy1b;vs(p}pp)R7`k{#kU@gS75Jd zV0i^n|I{aiQ%!|4gqNq%Sw)6rZc4N}?^-oAeNHa^?tlV@)uTLQ3t;KRB{-Ed`vG|| zX1HD|lL$?Thk1DPhYOr6vv$q6UBFS;s@Xo`WX4D5{y51P&K_F#smpj=JWm9M1iQz5 zo5k^9efdd8wFONfO)kTHl%eTGjq(C<>44`2!W{g1Fp~ECStoE5fZ$N|>Se#xzPv_M z_^qmQw&`X@yq`B;%oRzkyM($8dF>a`pZ>hmNrcgYt`Erj7Y#kEkG?0)h#~Ss4e07fj*{I+F1;e*Z7 z681kH_&2g+c zgxoGs30$7EOuc90He`w8g6xjhSTETnMl#wS|7qBz zZ&&+7d+HxiP(QHG5|nIrARVQ9_2RUZZ_&8*uK5U`@2-hclp{1LKUKn(;c0dQQ*FP< zI^pn#IW20^3*_+cT+(WhR-t}?S}jPBIqP4?PzG%UQ+v*u(RcI0{txe zQ3yE+(e=T9tp_XjNzwJ`eDh29U9JzywgocO6Btn@tTV}AZtQTjfOXF6QvEVaQ z7`-+q>!RS^HnU~8M(fD2PVXvXO}8~DT;!_w#QA<=70Q^Fxsa)E76H6lr$td_!PzXG za?htK_4SWlF01939`Q9Kixr8}yghJNJh6EWvOg_O!x^Ntw3fmSSq)_rsd6*XE(j-M z(MEkbC-k4T%0TY+b=pEG+);xbp2ILUE|%Dp8!I+|cXmbriM;C*bHf zIX7~U=8A9Gd*ZU3?xXwh5(J6J5Nm`M7gK-gWvcRZQ6mOv^+J3qQp8uJNjk(kp3}iee;U z^%HCL;t=V`L0X78wzm*=GrP3XR+(iUV*J|Jo4Z~N9oKsBr52ZpRBkcE^~b93#v+2L zy^UE;+AVkXX`MsMCYY6w**a91tR@el&+=sTaMuF+Y`Y8)v9tQ^Ijpk9kH2)miMagttUF`hR0V$fvO{#T}!SrVhX-m^;)5Zl4GzOJJ;(pP+Rh^dO+347t~W$ z(6$hqqm~EU>!rY_|AilZL{Bjmlkc)SWMZ;6!`{5=IL2?`t}B}3nsQ=pOFWfjThRiry{(FyJV%|)dT3k{3$2)@G-Xp$6SQ*zX7HwAM`^)@E zD2Bq`zjDXO=OadWhb1D;ghuF0+7ne0$y~+pJ_ncsl(iNG!c)|~9z=Y2;74<~qq|U? zgf~plwbcwiIMk!t7|Y;fmOH_(q>!06?88MbV^1=64hR=eFW4JT&r}N;9OR-?9?)9m zqEGdVkTnMW-TXd9L^8k|0NxVI2RPu}_?Y855$>p)LOeCQ^n%z)LdkDGPuA*bg zJb;pxeTg?;tlMbc7fDC|ZipZyXe+UHO=}Wm46VzeJW{w2rG06_9>Izxkz*S+;`}m0 z0+ppA+TY@zS2()5M3TnD_0=m`#w4yvi!CwSZ`3V6-6Rse&&5QB>@^4_#5nApw{!}c z4QAaquW!u-;(ud-n6?&oVWhZhIHwSNn!eKGt$}$P2_KHcEk-gPM5%?&5aQ1%GbzK{tz&ZvUUnk_VssEKa0 zTe5c%?>@qF7!`M5?QQ8ijyocsb zSD(AOIHr<|ra;z}REAMRxHSHXWwu|yDB*?PF)fT&+hRVb7j49Y+NC1QtFNRgIcnp33> z_%~}~j6E6l9e@#CdY+`Y;Yh$wQVmU<)tF8pGQDbFPeYtP>hP3D>1qm29FCM49}EBCFw0h`-+?N%L8Us|8M@B+G-N z(4C_o{=MF9tq~k7PLj$zbJ%+!TAl}emy`V@$bA|5;Qj}t&Y6Sd7G{G$TIJ3hx-KX$ zJKQNr(hzB0EY)39Ne%Z;?1`A{oJB@qu$(Y&mw1Du%2*jP`5t_ zx~y7HLXw@Xw-c9Bo#!uE#?4YJ1z^*=UbEh$=>00I)+H?$%H4!3;xRtEb1` zeQ#{3@;iMHym^}(#_K0~dso5|vEdG|TlXLO|8-6@ao~A+SuTFJ?r4FK^~$nl41*Us z%tAZelDAd9AG?0v%JHq7%w=6zPEJZ^B@P%%BjYY%^A($RELk6YH734|_xfUSOs|LWV9==5e# zj2@tv{;aE=DYFNO=P$ibRp7apjFM~fGrc9bP4_*1a~ghg&E<&+(=B<2TX!Q)3Rfby zd0)AQ-7VHL_HT8@SQR^`WB4fSkMlg}ht1_cN$+_p@wTldhXT`f!3V^DC`R3M@l@Uo zt7z)~+Xv1=3EK+u+$9dR`D0H(LAys<{;yVm5Nc{QZ&` z;*iLUvyqBJ%&6Qi$j34Wmeq#Hrrs-}axIRYOkV<-b@Keq369MR1){C2P1{d5C>hxi zTYi4%D;9s0$f85~F|GdgzT5D()c!{nouA3%$ORq3?M6qOAP#JmYIa z^#_ZXJDk(Hb@O@$2{k&40iWkGhR9-L~A`Yx#s*_g^Ct7IOGFd-LACqNi^S|4nJ zC9KrZ{hsdght(&2C%n)616!UG67aDFGbFUwdTDnK`YWF0&&V?{&hDXKh%#U+1`->xywb1;uj#lVli3eFA*KLREOoatFEV?4F z^R$C9p}_?u1Ff!;rX3LN%2VN|{1dksT&tEn=IQNSAA5t~Pvc<6d0WFI-rC?Fg4-FP zyFXnq1om(uwVz^5VBEQC*PAI&%X-}jbfrG>A*?&3+8BP^DVmttEAr@0vZB& z;zV*4*Ui)_zcJHu0nuaOZj{TYnlM?CDBmvJpYR>4MrAwD<58rJN?BZ^4N04r$#D;~$dzcFx^-w=jrKM$sw+67xmDtDNIeuW))ZZT1}hajF$`PPC{xlX z8D2apM%o+S^ji`UnY=dH0hdt)2Cs#eJ};Lio>G^Al)aDRSIm1k8l>5^cJfK8zZ&Gs zYDJS$QxJil_phDkhNS26+?)F(yooE=L3Or73)1^|*Li~O6QuZ>y2E&pqLF&+ns>%3 zq=(p7xR8~Y*X8*-UGq}_=`y;YA%^yVthd;-1c}Z}!dJ-ftB1pA>ukkjk?gBwuqTKK zgaBLt4kEFq=l#C9_HvAW?$&LxawPJP%|_oO4`%63cr$(0Uzke~f0%o}z41Z$gi4xa z4?oB}3;|aS>f$2R)hr8fTa3xh2s-juKh&Vr@I-oC3T|}or=5NtB;B#%)Fufpy+!^; zs6-HMymnL+*0x|v`7@sBZE2;cTGbdV`#%z%U&Wa6WSVq8lZm$Vl^D|HOn`2uh`-A6 z#bY?J2v{ubs!b-V(FUH!uC`fS?pdhzw`E6Bt3ALIe2JL~2Y(V;QVvy26m{8zwOoD` zyf4~hp_;?suFxMH{vL2(T7PJ7vGyY-KFj%Kn$7Cttb`A}t%ux^qC0RKtztQ1J~zcY zeHW&yg@ZF^_#SHw*F|Ik!m5YU~3{B8{$OtY@ zPoYLO1t-(TDUm^xf226H^t8vyZqX?3r2z)z^*k3m1K>-TUJ|@RIKM)CYVl$I^8^VN9Vq^ zjKQK}X{#Oos1jJs6Q{yM99Z#T8dweMr}gs_Vky z(T|iFB)wKg;Cdp0Uh|#CtufFYN9kkF&rMWIJYCM zO)Dbtp#*zeh|*(( zKwSTj0@Z*zjEI|r(*~{`XZ$p*#k4f;p$T;O!*Ohj;r9{jq5~quM|d5p$uK;LDv=@;C;dHA_i^H^IMPHBpq|1@j7?iVLwq{Fa10g8n$_<|6-94)1bU`rF4 zUab`OI*@-=s@;JG*iEr4CC94E0e zT%(iX+K?t`GH!=aBAaNo)V+UL>QmFRZp=zv^4eL$aGDhgd0}2SlMk|7=6{2$?ERxC zf3Lgx+Y#m|>(VxwZ;2c4Kujo3=e0^4)(fjbL?)}x{7u`uU!U2zt1<+->~1&(u~rVK zf;7h5|_} z)IVSGD%}zh1&x~Uig)xz=dWY~AIy#ur-lp%aZ7nT%;~}L$a$_w^Gs7UHSS3`5+`9# zO^htX#o4pNq36u+xWv2dl_^O&0Yq%0A7pk^FLh;OMvB1vpDy@6e1K~xyBAe@PmXZ7 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�QACSI@)O+SNlzLX}Bc)4B|HF&HJ@TBJ}V` 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

{py`}I+jz>-Gh#y<3 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

  • e@3F>%r25sc9ywOEmTUm9USNqP0(R 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

    OBkp#N7Ll+2n=ul#!jZL|d2O1E&& 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
  • 48)vQIsbuQ*X$dpD-25p(#V`EqdP*a^!^A*p%yP-Eq(> zj6+dcxAKFS(zRz;ZFYq@bEM{kI*(?fK2JZfoMY!g^RSw8_6CGcX^e#I z&1`LNC{@aN6nR!~mk$L&ogY;~E# z=ADwuJ}X5MN$WUO?7D(swazoKwd#v;^dy-VC)!Au_)~NwOGSxZ!5Du)k#_7>MzD88 zC0bDVNf`3`Ol+WTj)$Z+PqU76#3HmSi9)e457HVMGuOwFuH<%iyt-#JsH*W zPw2EVk*26SX9MOE39@I>w(=$R3jREY*GHwM;$;xeKs4uMr~ik(UvI$Gbr*tCM)%bu z|Hx&YTB>xJ`*|0bd2(Gw;Q6XnSJKw=yNkn4p^yufXGUD)%1UO9%R-oJl$+ zU3<0GNRNUcTb>cHV~5G#?KHS?_p+I3+Cs=Jq&4>!OiCieqa=}3 zR?hC!CQQK_D|8{}W^HX&A2fL=O?r9P_arl=CS7+e(!Yuw&I|K>&87MyXDU!<7Fcr> zsTb)&$kv2Z(8_xr-_5MYrE2-6jd}9ve9mbq#wAtBnt2)#tFt0`0GuyNP2$bqBpNgg zX^^!##GWu}M#<|_hho#>^NeG<-yLHxQ#hbayuC`GpJ6>OWDi+d-HAJ0^CzR8@-W?X zL~6;Zy_Fcbg29v{&A&k}5sTXA4ht`|j!e4g@b#E?QC943wvFQM9{X`k^U&6i^|U)G zx1@BemYFG|$*`RmTI;+|I~fyQtMDQhDJ%J+i`d4t%QNi_{j42TW}PtIVB@l>6R9z+ zXVPtH88Oyq2l6#VipKNqjH5}oL^P7idxlfDg=4YF6hHShcge;%X7W2svR14NtPVBT zFgv0JH&;)ZaS<#mT}#u{E%5?iIrTgf~(aYMQXlQ$|>uqsa-M$E53}ztnt22GB=nAB}S7@ zp`TC0RgMG=f{L}69wx)FshbxE!RIaUA{%T^27x-qvBNG4@udx>5jqm(+N@(vQFe2} zmJ3Zwje<~V=sfx)GOfzQ$u5^}n@L5JT=eUuk~U0gv3cG-&)8z29zX6*Xw1 z8>mK}m$S%`9`>&}hDWN=&{iZ&CsylgMb+CgI}#2~VhTz%+K{{6xs!<=q3GP?{b9_8 z#BDA5!+<}nZwu+xnOLuDocgTF?o^6HiT+%37OPuAS&f)-2RU@jej!j0#$Bc(jXKhF zt|dZ+s&&GAx^TA^sCd&uTUt?^VVVO&PJ27cTT)haDMl>_R-#aQS4uEagFy4Q#jU8ThllawOyuQ>~;tNHa8PK8wTz zHPG^hr-@j<((c4tHNL$mG1KiU*1WYe_BiBffR*`FnLTZMB?OA-33k_R(y_%xyKuR^dIuAgs{5ET`X-ufG7+;nnS&hA(0ZZZx873kw z?+%Sq0$zMtXox>yIk^ zfLG9}oj`qB8jnMhpvgPuoR*K2`4-_vX>+B+vg(~xz{CHGOVCT1+RzsRyBqe zrpB?!tnDIAB*4iuQP%s}d}QD=PdLY+DA75a@!6t>razMw)beuz+FFgW$Ko0L#%%&$ z=Khq`M}yOlBO*n=S(j~tiP>aM_y@#Y&&V-wx2L^&y{XCS)Nby3tR2ETbJdA%Zg+K- zgu4RI!45*_a&(0F5`CAInB26ZF8ErrZi~6uNoOR>8M3iTD~-RYmAon^94wZ4irY1(nP6dM*qbEgwV^*0%(A*t853#WWNj-{P#8#=ip#CefbL7T+wbQDdBPdu zbZMqE@|5O|32EtaH6%njy^Lih=L^gczvpxcQ}#&TsS`G;B2tkGkpu=SMAL?vr9Rb*+KtX;e0cUXLF7Ix!}oR+tXp15sl zofXV>-Rtl=y(G%aC9`L!W);;D7)G>i#Gynu&EX#x{MK~E(VPpkiO=SmQp@)Vma}uS zF!#Gw57P=92{|0+^}Vk$r!CrLCMvY0jJn~08m6%vfCZ$4_gJqe1OJ@{U zH6_Q}A*Oa`u5{0(MHP5H`7n&!;0gWh;?kG3vrbbaQ*2xt-laVv&bo0EN zVbpvhJBreU=kZH^i#`#v$!0E9>g9@dB0Sv@`T}bN9fbOUdf7MONXpsO<4M)y>vVHh z3~_4dXo}ktFsqGhpI!oAC~H=-QiO!aPTMSHyQZApNXt2WY-%(Tw2AlTu`DgCIkg)~ zjfX$9zx4Y+*4%+|Rpr$$HMDwXWpjMgt&n-2jSEsSA4v@~cQifa z0+*PG6muzMNuh~{gxsRtHWYJ&|Ea93D&?8gH&T4FNoCOD8PSFzr z)h^`{LRvTF1C4yM$aDgFVA71^a60QXvoPiWe@k~aeL}G`%Zyyvh$HH$vD@B`)ypj& zOY^Ccz0bq4AbGs9J~Z><+~k;P{)dCf^iK-8Su|P^(yB}Iq_d5TS1eaEp;{rUm8Xgv z91atl$O>g_Qjc?IX&T{z92IQF#d+VZw3r}jE{rU#euvEAs5mEiTPEnS>gkrn`M_rG z_U)c=eAwy~ID*;enbToO@1-ndwMH)>V_vl0ObKS)m9cK+dye7xr8qHc(ef-d5c}zfZp&L`oxahmbr_!{ zr+$a(DE5cmPFx!&ds;b~_Z2!(A;uKYj##$QdFCoa#wP1n9rSZF(Me2yHP)!_0eSWj2ZA%1Vea_{Zt$}KTOqD@{=fa#V6YIKDNt*2>8(R`O=S_P&vq%VA4CJ?`d5bzhn(Q3}J) zqS=zO*kvg;)w52k?qZu+HawB4bz;&*XD`-_vT4gyKs6>i7``};_vk@Q`;>sw(TY}i zoUA2SI%65YL=O^)DYhT_kQK&0Rl~JOr=6^8Jw2hCgSAenHB`LrdXS-rWVy%uK7N_B z3A5b8MQNDR({f~Hp^vjIa?ZQl>lAxMPsXG=5;Lo_Flx;_A-ml@tC#)E)s_mjPPWFK zyJL=&b9DIVf;p5@q?)}KO%?-UEUB49vu!$`yP`x!hN{KVBq$UTZoj7#vbh|5ugGaG zTFvq_nrycFiJH@HQ^uXCOR9u&xpKhm(1V(D>futW)-8HV8WpmIsctgcs+Dmo=!v-r zd&n_axD(G1vep|9LutJ~GdIE}0*kBOw3zHES}RqX>a*;accq+(WZL#PrObA=|`yztL)YC~=6fl3eQf_zL+l)j(U$s^!6~oQPNjXQMr^5wMr(Go{O% zH%(|v$(j6erD#z(Ze~q-iq0T|j@w$IkyEltAkAD8_h{bdv)D|lE4s^5FV-6zyKK2= z&*cQJCio)asBdis#?9e`q%z$)={nOULC_Npo24hJejo2{u^j#Nah2ySdebws_nT{_ zpyZ^V+RRxiF-ttJiN)74ziK91ao(#{7zNpshh*7V>=k!H6|LE7#MS7rD&ZL`(@uZf zs}yvKk|rxzw&nfNl#Tc}ZqH$Ff_Gus?`2x~BAmfjrs2$txyHU^eUz_|W*8&sx7yKo z*lU`^WRRpTFN3EnO4U)6y44){VX;A(dzHjY)Y_!g)T@aB0ag}44;LE)n*PjLYf<69 zzNzk*C7UF?_$oZvn0X58W?VsgKRxlav$=vriy$PiX}5PHE_mHmm`Y zrB0Gh$zgFN+^{oh$sUmhf6)4jIY64vy}C;ra_4i zz(_Rio3+O^t1u#3P?>vprtC|~D3jzDUr*rtP2M@Irb_!7~2RICQ4jB5!F_28V!rCR)UiyBRN=~x5K9Jv{dKJ zMN4zpYAs8%NL-s(*K2+r!_#9=u2P-OBu;;3itJ^ReHY>lDOXL<+uR9^$^wl7wNgA9 z?BxfkNF2S=(EU9#c%c$4NUHPkAMt1;u9D4HHqeQ@ycR6K7LDa}aEVTyyn28$#zq~HCL$Z0B>YfZ{L2pf03tq;<23oaRoX$eY zD$d8f(ICSFPbD)b4l_2{G7AP01Ny4t)n-qOhD`mzXev}wYL50)%^}poeWs7kC86K; zOvbf}JCjXGEPyhUA!Er@OsPuO(a)uv$%ac!H3R+nRF=lNJ69MDg2TFK&l9d4==Zg_ z-xqUL{c6opt9X2@<}z;6W1R{-P{tDDnNkr3X|Fu>3n9Oa9!<6v=yGRKLsNR8XoFY! zj?)@yTg#=$Ophz$@;nxsd!r`7rMj%SdNt%B2$xA&S~Xi?SC^$cB_kGlVVV(VO0C$} z1Ezu3FLp}aW`Mz&-fDg}aF`O4?ktm!2a;-GYOBRvy|!~+wRCuH&K9eUzR%ev6S|@H zVw$U7ifiFqqF!{za zUtabS5*L_Mm?-D!RNNL#P1rS$E$7i8^oJ7%~tO<6eS+*2ZWG4Iq}l_ zQz-bDI2cQDD$c?(T!))+CmzOgcn$C4GpxZnKc;^81vbG#>;en+K>$gpsGx%( zj=-@v9p~UOT#wuFAfCn>cpD$!8~peu3l?mE4Y3(^fC(a82qKCk6dZ^edN>3};v}4d zEASWGiaYTjp21uA7@y;7th*lncGw8N!OqwX4!96R0{f$kHikG9$K!Ndgllmd?!W_h z3a{X8ypON(6TZkBV+$;X2@ZIX!~rOyhl6l5PQV#hhUK^c|G@ot63^pxe26cw*80>C zn_*j+uopteqJS>u_ybPC`M4H0;x4Sl<9Hr#<72GB`afH+;Fs74n_)-n0y{j2LPY^B z%y2YL#ThsU7vnNqkCnIw|HAWl1MlL$_#SI-z~6!mu{nN&UEzcmDJ($)8YVad$KZ6F zhf8rC{*Jq`3jfAScpsnQTdebQu5oONt+5;SL;y)-p`wI3+8AJlV{tOh!$r6bf5RPE zg(vYkKE)dR`2YAUEW{$1uowKu;6PN+zyMPmf@5(iF2>bZfqU>Mp2drJ6(8VB{15B= zf*N8YY=xa*ffGJNkV6>_XgCB%;{=?6^Kmh*$4$5u_u)}Ig;((&KF5##-+~4IhhJf9 zEQSCVd`P2+0S?A-I0YAC8UBhpa1S2A6LWZ zI2RXTIc~-6ScTPi8ZY4;e1h+>{;&DIVPkBK-C)C>2p|p>1ys<5jwz17@i+w+;tJe^ zd+-1r#uIoJZ{dA>hHtUoR6!q0=M8kJc1YS zHonAyjrcvo|HDEof(Z_I5kVYjl+eLJSc;QzCeFnbxE{CQZaj#m@H*bZC-@R;Z_IUx zEwK$2!-_qy4}3^L!M>;OE#BTVoek zA!1K>5Q2mxmY|FQCO8Zy;7nYIWw-*%u>!Z?POQSe@g$zb8+aR^<6ErF!{d6`1Uq0? z{0<@HZ~!W3qK^pUguM}hf+eV;jX4g(@i+&U z;2QiL_uvt{gxByk{)?}%-WJ?Lu_3m`_AtSL0OC+lhK30a$4U4zF2JR@8aLygcmR*! zMf?XJVGY*blHXQrjh*mY{02*QK?Y0EKo?USjuUVy&c+3}9M|Ax+=Eqk1kd1AyorzT1-`+0Tk(5+)j!HzxPLlSu`K@Dxpa4gQiMYs+( z;~%&WkKlQ{h7a%!zQ@mg!*>{4U_0!DU17#v2tq;{Dh@;yO^k6kj=}Lb4QJtET!)o- z2+!h0yn|2iE!NtW-vexp?XW8x*c1C8fDD$P4h=`*WSoNwa2c+`&A1Ks;|aWq5AiM5 z-HzV_Y>0)}9>0Z%eIOx+{ZWUGLvRF6!Ueb*D{v?Ni3jlv-oShK0zcZGYXh5OYix%_ zuwW1T9%0Bh05$Y*5SHRJoR6!p0(ankJcZZs5!T@6JMgz)Q*4W!u{#9(9v%ddMG*r` za0E`q1z3hFaV>7Z9k>UN;3>R>H}E08!5aKzM?M={U>j@?EA~JTGM1o>4hERwNc<6} z;w)T-t8g9uj(f2RkKrY}g?I5K7VO0R7+YamEP@?-BZ?H3pbZ^|<3yZ|OK}74#6x%# zFXLT&jQ`?$tiLn&du)P**cmqL1s@`aBZ~vkf{sIRH2#FMaS^V-O}GvBVKtt{OL!k& zV-40_#Qh7KVq5G2GaT?DjtmY!9RnPOV{kgo#+A4ZH{)JBhF9?+zQ%fsxlXV(ev9A1 zgE*F;jXn;;(Krnk;%eN4m3RP8<5j$g&#(qR+l7A@Y>u6V4jN@<;PQyjG9LsSd?#4rS8gJlje2H~T+{>{Qc7lMt5rvEc(8d(U;6$8< ztMFIcj)(9BUcf7O51-%*tYhYH!N%AQyTgg!BZ4ec6w!x{IS#{dI2~tW8Lq~SxErhR z2%f@g_z>S>T?^M9Ho|7u3A;eVK8QfY{-{C2A@~zc#TmF5*WqT|j@5V^ui-s>g0HZ^ z%ID$#urap6ju5aHde~z-Ra#>pQq^un@aI#9nYAiVXHg4H^!|F*qLQ;4)l`8*wKd!qa#G zZ{u^U!OxxCudp>1Lxc};?27}@#so*>PdEdY;%~SE58!D$k2mlxzQVUydk_8=Y=}*< zEzH;(5oDp_0F=oE)8Fy;V0$da?hvsj0!ZTk z)X~8dhv5(SGcLfDxDG4vAfCocco!ex8?3V@_j>#S8(|A9h7&FX5J46Ppn)-t#;G_9 z%kWqH19#y8Jc?)V7CyvxSZgo-F8mT3;Wt1yu@vf!$Wu+ui+hhiZAdTe!LHL#HLt? z9btlqJrRZk1xwJx5C`K(9ETHe9xlfXxD$`ydAy8w@DaYi0vDf&pJ6j>4-*{lBZDPq zVu&e@!Erbl=i*XagTG)U?!~|HBHqE5Sli9LAHTvvYzGtU@F9kMaUePvVuEAvN1TNV zaTTt|?YJBF<54_`m+=NZ#&`Ishx-RM$BtNx-63FaNZ1c0ba4p&h_i4huEVYPCmz7R z@EBgkJNN`^uz{B~KWvC?up2Dc3jrjMM-6=(hGTI$mf6KY0$#yecn=@p z3;f8(XJQL%kKJIw9`GTFJPPRGU>t+v@Mm0r<@hUZ$NhL1&*N2mgzxZEKlgZSh;6YG ztPtUa3@LO2ngdZ7{(1V5v zj=>2y7nk5#+=hGcI9|bf_!!?~{Sem*7GhiMhP~i|A5kQ+FUlC=a4f}fI1A_DDqN2h zxDEH?alD3)@defj^Y4dEum!fm?${G<1R-Hxlrg|TI10z(&$tAaV>wphF096Lcnxpi zBYcN-B77b;$F|rRzl9TCBya#q=s?2+hhQmA!^OB7*W)%kh$rwYUdP+`7~kP%Q9cXX zVrT3M5gsI<-~f~`#G&{DPQpkK1t{p2RD76QALG{9NL*unl&=B3SV|1dzcJG|?1bI1Cjv;JfDXo(;~1QPb8rc+#PzrZci>-m z953N*ypJ#NKm0hscN*JZF$C-b30dri20AzhN8<#XgJrl9H{$QO2dnWop2I763m@Ve ztS9qZiiOw#yJAm-kVOG)^fAUkSc;QzA+E$txCg88G@i#>_z>S>{Up}~w!m+&8*JDI ze#pq70u6`aD4dLQaWSsMU$6oz@cILw>X{du)U)u_FX{ z5P^aN(83Hy;6$8;v#|^};7+W;o^tkdQ(FZA@@Dmf}>LiOX<3ZoxnC03ODZcowhW zBYcN-_T#>YEwBhCIN?DAd6dzCj>B*~{)|g-1#ZOMcnDA86}*kl@io@q=S!#`7D0d; z2`oVyLmY}@a0<@HwYUxU;9qzG&*3fn7vE!p{kdOYd+Y)eM7R(_7E4e=8ye;~7N_Do zEW?%f3vR>xSdFLgBHqBe_!{dSz_oyd*a^GAf_>mc2r}}hqJx966sO<}T#PGmE&htz zaW5Xmi+B&8;#>UaKz_ThJ~qSF*dB}EfEO{OQNjQR<8b@|C*mxek7Zbnzv2%33oqbR ze2g{tae?ar+hRxThCSd%5?QFIqKkuZBu>KlxENRCW~{{BxDOBEaXgE+@Bu!-H(0mG zZy7elw%83e?1>;UI1nx9I1+!v8MpwK;~M-8cVji4#oPD@UtmFr8seAO3OizV2ynxX z42q~@ghOx){)m%sKCZ@1xDEH?NxXo!@j1T28mw35nG~C1CkSvMjx6>?85)kjF*p@x z<5FCQ6}TO%@NYbY7x4~0#5Y)j4Jv#Nw#Cl)Eq(_-WaO{}1@v$*j>QQ$7nk4){0+C@ zemsOn@eE$aCs>1Zs(hERB^JQ}KcdJWk0q!>$HDjmPQy947+2s1+>QtFG+x6e_yX(H z_ze6C3-KH5hCSg$99a}mg^nX|BF@AmxB+)!75A!mTUa1sZv>IS5|l8&p*RMo z;#@4l6&q2UPp31{FET#LWqEKq2m*586h&yl(9>I%v75~9| z_zYiTodNd?Y=s>mzzrGuql_MAI1ESQIGlv@a1Cz79e5BA;~Bh!_whN_8uGW{7uW>b zVKH`x6%P0iLkj!iKs3<97)RhwI34HXN-W1MSc!-5IG)Gb_!!^fCmP>r{1TgC8!UnY z9>lQ(1ys<6jze$^PQ}?+hUK^o58@HLi1+aY7U+BjusME%U17!E@FENa`=f*|#yAvz z!kM@jm*cNkiB)(KFXA=4jZg3ezQ+b5o;k1?w#8!D;YJ*J9Dp_^I2gy^PdFFLa3z-G z@3;?-;z_)Yckvaz#|C5W`PdTM!;C%PMg)1(Fv8I|4yWP*T#H+A4<5#2cm}WILwt@O zO}O^)Yiy2fumjB469L4rAIi{hB#y`FI2Tvp7Tkk}@Hk$@yZ938Ou5#v4R(hE9z>Bq z8Y)Vtp^rJ1;zaxz=i^HJ4J+|aJceiR20p-7SZBs_6E?T#$BTFs@8S!5i?!y|55L5wSco053+(VfLKgd>gdS!%6vyMwI2-5V zTKpY%;(q)K&*ByQ2cP3>{Ny11Ml8gRFk>$SkwqDO9E@Xe8ZN|jxEU*P4<5#ocmeO? zE3ADme-9R7G0d>zci0DUq)|d2Iu659oQkt?1^$YaxC^WC9A3ja_#EG3-9xy>u?2R- zV%XtA1S$?h3q5E!0!wiU&cT)V3s&M@Jcg(7GX8_l@HN&ul(iEq#12>t0d7c8QAP)2 z9EB5cE|y_A{)Ss|CsyMbyn)ZK25TM0=it}a3OmAry%9nZ`=NpsMmQ43;Z&T5D{(Xa zfq&vLJdaoK9=^dkhjZQG7uW<_VJGZ{J>W+KaqN#Gn$U45j>gG27nk7%+=Bb?2%f-m zcnxpkW30hCM^Hm7#Llq7i2#zw;y|=8!4X)B<8c<2;Y!?$m3RP8;B|b2Z?M*p)DXYI z=J@|8y2k)7u=j7kleSv@f4jBWwry=qwrjF&Ta#^TvTfTnnHwhCey-=m^>*&=bMEsw z=Q~qPQc{zZoD`)ZwP`?Gy3mJUCNrNEY-TsdI7KMexXV*s@|`Gy%sdH5Lq>8^kU+{) zn+CL^JHr^u4Cb(s^=xK0hX~~=cX-YhA`kYyAucJ%Mj=X4mg+R3BfSY`3UgS=7WQ+F z>)hoTZwMITJ|r%w$xL2~Qj+S_p$RQ$OIP|bg2~KeK1*567Itu)3)~@$cZ45m?f8ep zq$CH$2&5vlX+T^0FpN>mWG*XN%O>`7j@vxoIq!%tOs?}ciAh6dvQvbTRG|h9Xh9cx zGmx>&W(C_h$SE#ykEeX(mtZwWNP4nRnBr8X9*yWg4~8*`nJi!(TiC}jP7}%<9`T&F zd?nIwdqs5Okec-58qu0=^kyLAnaMm>v4bO=<^q?w%_BbWlRw9JXOfbPWT!AC zs6b8X(USJ`C75wcVLofv&M_`>m)CqH%2;;@@kvW=^7AhxDN7CN(TvvgB$&y}V+pHR z$1aW%$~7MIk)K2vXEsPdcJfn(Dm0=UJsHdxW-x~pY~v8;xyb|G@RgrL8m|wclbG~m zBR~IAo;oz6Eqxfo1g5i?)$Cv&C%MQ?9`c;md?CUFz3?Z|NkB?6l9z%6Ql82*q#2#) z#b8D;gJrB{D|0 zU^;UNVGUc@#}O`ZjfXtr6+ii7s$PgqLXwez92BBBm8eHc+S8lCjAJqjS;-C#aD-Fb z;0bRDm}c#WP7*SZk7AUj8ue&P7kbj45lm+ZYuLg8&TxrqJm3j0`9Xx~_J}`;L2|ND zmB;bzMV{*QPhAvIYkOgU=P zkd|~|5M!CeGPbavvs~sr&-p^QIWmI3iAxgFk(ZKGBZxM1rXORN%}Um@lf#5^kB5BV z3*qMa`usyOGLoNCl%p=q>Bd0DGK+bvWCwdW&S@@jhcI67k?%y9rw(yRPFiwPfYQ{U zA?@kM2qrL-MXX>O2RO|IuJMTHeBe6~=i3YZAt5QrKvwcngo@OpF)ipqe?~Hy8O$Ms z_3Yp%=ef!qp7NGY{Ib9~B_1isNCApdmdezm9?j`UF9tJ?X)ItFtJ%U~Lb=I*yx<#A z7Mf+^k(jjPqyS~9OkG;gjiHQX26I`>R(5iLBb?wG_jtu80v1_Eq7$2xq$dxBDN7}4 zQJ=eQh=&FD-If*H+J77)U6*07bG z9OfifxXW{16AbOqnXTfLfFI}j&Yu=+~hxA@t&`Q zU*eu3260J4Msib#GE}D?jcHF$1`*5@X0w1*Y-T%0IL#Fv@`A7YB=S;gOJdTKog$Q_ zCP6f$1N{hQG!vN40#>kzy&U5rcX`Zvz7ep@n(`0HNK0mNP>c%HB#7p8pc_LO$4ut3 zk`3(Q2$#6V177ouUza;;#3wmfDNG<0s7q7Y(u-gwFoOkzu!2qO;|M3X!ULZ3p3g*F zVNQrkGBT2jd<0U7y0oApJs8MP#xjX{tYj@aIm{Vua+hbk;Rg{`%1EM-nB=4;6Zt4c z8LCmACbXt2gBj0Ema(4g?B^_@T<0+_`9g$MW|EjBBt2QkMcGspgr9f%0#BKgq5sgH>bEl81D$T#@meF ziAEe!kc~nVqZE~?LlZjFpV7=>9*fz)R(5ijP_A>2$GqhSQP!%*|A#!sYHF6 z(t%zKXCiZ0!bY}nh!dRSHurhOJ0h&Je*8uZl9GHiO?dd`vhBAuj%wq*>*~Ljhxz0mg@R6^C-=Htz zkdXA`rU)e{Lrt2}iS7(y3{#lP3O2Bd;RXM7;S7V|-L z;*yZmWG6qRs6Z{6(TYy=U;v|;z$_NCjJ53KASb!TJznyO@BFgWn}ir7Cq23Omr|6Y z3JqyNTe{GTfsA1m3s}Mm*0Py{9Oo+k@r2Jr*ycPCgG8hy6S*l$DJoKphP0pyy$NP2 zvsuYz4so3GT;@7qyyFv*w!7bmMSN0{iTsqHDh+5wPX;rQc`RoeyEwoJE^&?fyyhEG zcc?);Qjwlq6rmios82h3F_cM6BZN)t@xSnAQ@T6MKLN+mj<+?E4>)b7$&ihwQOb&hd9MG zZgG#7yd%PHJ@E%|NJS>{P?+MBr6M(`OKZB)pAk%B9&6amAx?3fN4(@a5%+lO@P9-n z7AeR?4)PO7RT|TlPIO}s!R#WOL58*L{r+(i@}U%Hp|$|4)$?`vs~v6 zFZe{n{pygAWMriXC8$6x8qtnk1T>%w-9i+09ALa*Id2;VS_L%s0_ULMpOSm{L@y zDJ|(pH~KJ?vCLpTt60Y#PI8W${Krc^@|A#t=7AW*BQ04e#J^OeCUt2{YkJa`5lmnj zb6LhZ_Hv9f+~O&(`A*bB>Jg75q$4{8DM2L~(44k(VGyI4$$XZxncW=Y61RE5SAO!_ zVV^NcNqVwSh|*M}5gq8lAVxETc`Ri!`#8c`uJMR>{2w7L^xsA_=^}MBo#TxM+vIYfTnb$7sDCD zES9mA!<^?fPk2v+lQNqaBqtmBC`55eQH=()qbvOx&KRZ>!aBCIheMp^JU6+=3qBL^ zlzAf#smMWo0;xnTn$nqmjA9&9S;T5~aGbN;B8+!@Cdz4_wMjxM(vz1Wl%fJbw5B~h z=*u9+Fpb4*U@xb*$W5N`n)d{pQH#GxKuXe*oBRY)fhshlCGF_J0ERM&nJi&7TiMAz z4snia+#!r7yyY7KXRRaANlZraQj9Xxpa~u5%^*fIftf5}9XmM6NzQSbhrHn<0q49U z_=9M~ArTqKOEJn)jrugB4ZRq^2*xv=5LUC5-5lpU*Llnfz7zGlc_$I6$v|!bsYHER z(vCh1WgJrpVI^zX!C_8tmRmgJC7+0V!TynmG-MB$CLpsovA&g}rb6Cgd}%8^kNtjn8s|Du!c?S;y72h!5yCPl21gs zVeLpl26B_1qLiXC4QWXa1{2IUCNZ5kEMg_w+0SXNa*sEB=a-vif!HJ=Gx;b=X=>1r zW^`r%Lm0~>=ChPF?BoO&`H!c3A^a`#O>B~qnL_+aS!&RbmUN>(qnOAvW)s3%_HdX} zgmRl_yd(T=b%;Sy(vyV(6sH`uXhv%~(T`C~VgYN}!*R}Yg}XfCH6Quqj!fbo5|W-g z6sIx`X-+#j(T|Z#Vm=|PW*bKc!LsYh!%(T8BB62fZM zvxh^RC6wzt<~eT(ch|h}J8?)vTC$Um!c?FZ^=V6I`Y?nMjAt%O*~C6haDmG_;0d3J zbWhHafYf9qH^nGJ73$NR_Vi#NqnN^6R)gvl@5S{p>ARXDr zOCd^AiR#p$A+71f0LC$mMJ!_@dpONS?(v2n{PDnDMJlqAkD`>I8jWdBZw4@y=`3Xp zTiDMLPI8|Ac*19X5+%(15r zNk~?K5gyA9q7jP}WFi}dC{JA)(401OX8k+r+!UcKwWv>HI?;oE3}rOqna47=vY*3*a+5IL^OLC0%mqnEPZkPM zj!IOgF)ipuKSnc^c`RWqyE(*JuJ9iZdB%IfKbKp?Bq3?ZOaV$$nd&s96FnHfXeKk4 z<*a81$GE^9p7E7%FU%j&NJJX4k&8lUEgAA*_0Le{dG{hZ(u*SX7c z-Vx!Awc>B$k%%;8rXWSBL_J#4o?eV#EK^v-8aA_&L!9FV4|&RKKJb%BZ@q1aLn6|W zk=z7Qksun=iT(^_0&@sqCEGa2Nv?C7`#j?lKltUHJBzp^A`RKeO#w<%lV)_G4Ub@eO~d6 zh#%ZrL?aO?$V4{sQiPI}qdGw}p&gwV$WX>In?)>R3;Q_68Lkt?bG{Jiqc=P;NJs|q zQIwKYr9Q3bP9KIalBvvQG3(jGA#(qu{$}OJqh95+Z5H8?1{vsYpNk>lpr6P4` zL`yo-lOc>^95V=E1KZfgQ7&_nXT0VEks^i*_#d%JPCD`uNI7cJfM&F#7Xui|1g5fp zC9GpBdpOBO?(vdu{1Pc#Ky(t3kz5odkaES)FKt&T)t5eB+m2 z)F2TV$wz5wP>1?7qchzZ!Z@ZA!V1>1hXb78A~$)=TfPw`ve_UmsmMqkN>GVf1kr?+ zbfgc#jAAB>*uYlyahxmM;Q>#0$rmC zxX&YA@r{6}){ozaPHYm8iu7bA2L&lX1?tj-_Vgi`u}onx>)6S0&T*L=gz=UiMEx~f zz~3Yy16e3U8EVsvHuPcu!AxW>tJus=4swo5+~YB?_{evD|1DfVOyZG<6r>{y1t>}& z<)}(Mn$w2v3}6g1SGLh)TS{V>CPZV zF@@PIU^QFV#W6y;%_H9Nop681VPX)EBxEEnC8$JA8qtC73}76Sn86~}v5j3E3cun>^q--w6MI z&IJibLS}MNh~ku{Ce7%?K!TaVLRPSuog62WTioXrANax#e*d3yK?0JJnk?j@2xX{E z6WY<0evD)sa|vM+2RO-jZgQVTd?3BTbK!!4sam*lu zwQS=cC%DE#p7EZ~d?(7^Y7>W~q#`?o`Ij=(pbpLHM0ff!m=R23CJR`_c6M`+Q(Wf} zulY(qH1|8vNJM(FlaD|u5kzy^(}kW4W*oCv&T6)Cl#^WGCQo?HPohS5E{IN2(vpq5 z6r~j9s7gax(1z{|BAAKHC4?1hVL#`%#C={9@Q<@kG~$t*^yJ`QDp8Ff8q?HSQYKq@klpW>9I2K8x05Bf5iSi!o{*@L?aOy$WAc= zsYrdA)0SQgXEHNb!Upznf>5q=k7s-$Tx_$?AH*Oo$;nJ!0;xoG8qR|(@CKlvq|Hv}lx5Qa0BY0M#nP3+|~m$}a)UhtKO@vR|oNkvBT5lDGz5JW55)0=^eWI9V& z$8HXBj%z&NIiCriz&%b35|NSY6rm*5XhcVPGk}qdX9kN{$5wW-pA($tI{y*I3%(I4 zp>-rSDacA8%2SiNG^81w=*0-8Fp~wWWCPpS&0$V+o;y6}JrNT*&-_UYl9QV3k?tToj-T6{$}fdeV} z;v?UQlGJ(PbgG@&hB=*0knnZj(A zu#RmU;5^p}<1HWgMnDR4NlcQFmOK=qBvq(O3)<70;Y?&2OIXb|c5{@oT<0FodB;~G zr*yuFNdnT7g@XJ`1?th14)kXXQ(43sHnNR<9N`QXxynr*@Q(lgi^U`J7cogecJfo4 z@>HQdZRkcX`ZI!YOlLkz*}?&iahhw~=P93woLVj7l8VgaqY&k&O>;Wan<0#08Vgv# zR(5fmi~PrP-td7hgim7@iAe%dk)EvNqBxbQNqw5okzNEdiD@ii8LL>&R`zq2tNh1v zz7Zj48gp38YBsW+-5lX8*SXJ2-t&W~>B0s4 zAJIreIGOC)TRM#=|~?2GmyMJ@hE9FmikY~-g1fs~;-^=M8TdNZ7H zOkp0&Sj$GXvY*48Me)`#8cmZu5eVd?iv&ZzTR9E(u9RCh`(UC4y)~D>~4RF-&FwYuUwN&T^I8 zJme+c`8}7+Bn}BkN@{XZlrq$&1zi}xNT#rmRcv4@yV=h%&T)wcJmw{z`Oa^-%?1fc zMh3EwlYgm14I0pr9`s=-)hulZwZ&z8;O`CBo#R*NIB}#kT!H>Aj25Vbmp^?E$rnapUwCq9+3w%@h`~hAr&pG}m~{MC6DeGKHBeV-tHg$QiB?##=t}jb94b4`Py#q@*V+`6*2;f@n$?dN6=7Ok_68Sj{eu zbBS9#+rJ(sHCP~Rc4hm3;D%7GL&FIWP#xsqDtYjTqIKUB3ah_W|=N(^&T1d|G z56MVNPV!Nha@3^>?dU{L`Z0znEMys*+0QA?bD6um;0sX->x&d*qbTL5Lkrr`hhQc! zgE=fY~UG^9P<=+6))GKW>HXAeg>!BuYZls9}ON-;eVo%p072gL}a zBDHBjXZkRb8O&oT>)Fa44swp`Jm4J>{?!}NiAy3fkez}Qr!i(Ka+FZe*D;%1ygq$D#rDL`pzP?u(Or8ff^%`BF(j$It%GS>;?6(5LDLQni3 zF-SrxGLeJAl%XoMXiN**(w%{fV-Cw$%?9>ygi~DM0WbK#43cuE8OEH-w0n(PVgsjNlkY05lD5K(w=^dW-`;6$0Am-p1m9)lq=llEguP2N$wGq z{}G+Iq#-xODN7}4QkQ0Qpf>{uW)d@4#5#6zfV14<9*_BizuXcKiRi>92`NcOc5+jQ za@3_Mt?5C3Mly+6EMXmcIL!qv6UHmP6RwJS{7quglAXL1p#&AFMSYslnSqRF4lCHm zR`zg$YdqjFFZfKPs%C^}Bqk+UDMATKQ<>@n(S(llq(38=$^w?LnS-3>5;qCs8D9uj zO-+8~ACi%oLX@H$b!kRhx-*F3OlBb~Sj!Ifa*%V};Q?>>Nv z(~LHBX9y#i#5|U>o;@7kIG4E1Q(p3(2zB&EEaH=zY!szDHKM?z$GqeV5$gLM2C+y&2J%yq%G9J0t>{dDMlzN;EMyrQ z*~$?va+@c-N#{7E$8k%}zjr!Xa{ zLJ+O##sEe$ojHWCip^|iF9$hAD7U%KBi{3!$c>!=5|D!QWTp`1s6&04(w=VgV-(Yv zO9(4i$7T+4nrqzU6`%P*lqU9(xTGOB1u026s!@w(bfrHdnaFe&vymMf;|#ZW#v6VR zxv7~XCW%N+Hgb`V!jzy2wP;2gy3w2d3}GzOn8Q*waey;i;XcoK%O@f>bME+)xFjJH z`6)vss?mhbbY}n~8OwB*vXadlC=@$aU^; zpJ#j_prt+J|AJD!e=72vPb+w5;BsLVpO0G zjp;-;1~8m)OkpAG*~xy6ahgk9<1UZ*z;`0F_W70=BqbeLC_phvQH4fyqz}Q2Vgj>S z#wNCLh*0kFf)50=v0g+YF)2t-Rti&|Dm0=aUFpqm#xa)_Y-c}*Im>nK^OARbC45`! zM=TPOj5K5*7sV(~bsEr)UJPI)lbJ^d>)F9EPIH;tJmU*d+Sw=Kkd!RsAU}arq&}@_ zPZ#0)7 z5|e@~6rczd2%BkTzv4C~#BqTMtC`eICQI1Lk(U8`(rx!yR!E_e0f;DVsFQ>Rp7|(daSAOm4y+KOSlZC>R zpaRusOgnlrfH6#F4$IiUPL6Vh>)hcvUy0n!KJgDpNJkF-r84ztO-K4Mn32q29xK?) zUXF5#tK8)k?}^ae86q*s$wpC1P>!lJqB-s9#SkVii^Z&A7e_h8bsqDUfFAOj{}G4e zq$eLGsZM)65$_H&eT+~gil_(+64GMt#iBQfd8 zLm*XXKpVQzhmlNS28&q3W_GckW1QwXVZ7xd5&D`vVvw9Hs6|uS(19)tW;oNB z#S%8Lo0FX78g~ifC13bK8q%8f^ko>6Silliv6BNF;}lnTz-zt}X@Iju0#cKcf|R8? zb!kp#`Y?*A%wj&P*v3ANbA<=IBf>y)PHf_njyx2i9Mz~tE85eUfsA4*3s}WQwsDZt zoaZKwcuV*}KHKvLaY#;DvQvQ4)Fg7(1KT;o zDK2n>2Rz{eUx+%)`6Vgo$Vm|bDN7}))0p=3VE`i-%S;xtfvp_k7#Fz1LtgNK@WFDB zxFjMq8OTE+icyiOG^9E0=uB@$FrCG0U@r$b$u+`w#}^_E_dX{siAX~(ico>NG@=bX z=*ti$GJ~aTW(RvX%}v61%@2MXVJ3)23bIg$5|pMYK{TW#Js8RaX0eFXY+x4$IL#&Q z@|@RvWKs-CjX8_}v#5`8BgF~F;JhynpXCjSu&y#@EWTF6pRHG3sXirc2F_Ll2A%vA| zVi!j^%{3nLmQVaLMjhgifb?V~Cx!Tzl9Z=5E$Ge=Mlp`LtYRnoIZG%vc)|^zy;U-v5{vb99NJbX&Q<(Bpp&@PQ%?KtipCznk2YWcg3C?kqFy0Yi zqIV2&Nl0=skc%Rer6xf%p%py{W*oCv#(Fk$kW-xF22Xg)ccM!#3VUcDNJc9QJ}^=xM!C%MXfp7EJ*)65~i^B0LoPYw!Fnwm7C zBmEi9H0HC0t?cF`=eWaT-tdKh>DH6KNJJWPQjp@5rUp%EM^A<^npwSF;*f~s zWF-$JsXz_t(uB?oVk|RR$_DmvjB{M)HV=76gjq6|e~3#$QjnEggs_2KoZuRdcuTms`XC00$Uq(n5=a&5 z(~S1?WEf+Z%xsphiVf`HFlPznF3)+(Hv;B4OZ-g?;*pp%WFR+%38W&mX-QXlGl+3a zWiBh&%nl9_%6~lP3z6olM;ua-p6ukODCMa_5UuD$4~8*@smx&on>ffRE^wXOJmft; ziM&8PqLY*iB?ZnFpVXwV+(sY#Z~U`fVceM_l0JTlw=|o#VJn^O=wFG zhBBU6EMN^A*~TtTaE?1X;WgigyhuinfK+564<)HV5H0CSUxJy!9G0?%Z5-hocL?Jd zUx=_+juVX}q#`}}C`A?O(2`E{We}s8$~;!Fo&B8RBG-7#djdja9e)vr#AF}~1t>)| zYSECkbfhc&31%EqnaM&{vX)&O=PaSz+g(*R4%2Sy- zw4@7t31&QVS;00AbC%mY;sam#$*)W89kEG35>k_q>=dCi)u~T2+R~9e3}hTrS;RWF zvzIf3a+ha(;wQf?QnZzs> zv5Ku6F>Vas)CO)ajNg+y7g@!bxEj<~)P$n^-wQS}9XSl%wp7V~c1gz2v zF-b%Q@==VER3?aKbfPCi7|Se{v6gKd;24*=&OM&+md||Wx7BKqgfwI#FGVR&6>8Fu z7IbGQ^Of*x)Z=dwk(yi-qb!wZKwCP}pJ7a59!uHC4)$}J zP_FWjS9~VYS~*Sv(vg*1{7YGC(U7LJrV9fZ%2=i`o0V)}4=1?DeV+23A4FQ`y+kaM zkdge9qB>1zNhby}oUu$~J}cSEPWEz`bKK@39|%}4*ZG6Lh)Xik@c)Rq%itidt!=;% zsP~-r)SyU#;#OP|tPm0cgx~}SE+I&O07>worMMP{;uLpxm!d_AyB8?#((n5BF?0Q6 zW_9m<@3r<5I+G%lB%GQwp*=q_h;htdDQnok4)$?^%iQM?&k0zm1}R8SRti&$P-@bQ zR>biWgBZgU=CX=y?BN)vxygNAkbIT53;*RSQjw876sH1JX-G63NTeTw7{)|q@;fWo zz#a~Ah8sNO4arxlMOv~^h#v{12K8x1Yq~IiA&h1Qi&?`K_HvxlT;eA8dCq%2S|i`2 zCNnuGL@`1Mrw&bsqZ@q~${1#{kX3BwFef<84gTR70c-UM{zp18lb_<0rV0&cN(>!H zq#uJA!FXmdk7cZ8JNr1uSuS&vC;ZEQ*U1Ly$V_&M5=uqt(2Ndrr56Jk$s}g8l8x-* zIH$PAZ65KASG?nc^=guWG-M(#B`HG~)u>AoTGO7+^k)#G8P8l6vW}e`Q zFc0~f@A-isLa9nknh`@HeHp@7X0e>D?BW1NIn7NT@tkBE^$fluCF#jY5W!TVHVuiU zJqdK>7e??azcH7EEM-00*w0~3aD}@(;VmC;l26i+lY#_NiU?}ZnD%s|7sD9OWM;FH zP3&Yp$2i9|{^luf_+YcWBo*J2le`onh|*M{J}qcZcLp$u$^6brwsVNTxXMGG6R^cS z;0scck?iE91R<2C5;bW`D>~AZ-VA3VvzW(n*0Gu09Op9kdBw+D<%3M*B#b5fCoJQSn^<)}_1O=v|2y3>!5OlCgIS<4m< zaDr?6%|qVu!FF#?z9Iuz$VU-Es6iC1=tOS@GK}%eWI5~D%`wh#mA`q&dp_FX9+QE* zl%xVRs7*au5l0XDGn{cuXD*9b#TIsPnDgA?0Z({Iz)qPU133t!Bq3BHl4i6fp56>% z0#ljIGS;(~gB<5Px46p#p7NUa{AZV3kdd6^p(GWlL2a7Qp04y^I1`x55;n7sI?!pcQd+<0twuib>33DQnok7It!&3tZza&w0U^hoN z!FjH7i~Bq!V81iuTfQR`KTwEZDo~v|G@}g(bY%den8HGqv6;Ob<}^3C&kK_M;e9}Q zGLwTqLa9z|8q--%2SD2G$)n>`Y?!b%w`cA*vSEobDpdG z&0}7X?5{Tams=CFYEY-10H_>)WA;{_icabBe0d-4!ODAlP$BifNj9|kaz z$xLSft60Zw4so1w{LKsAlH{mbd_yMkQ<@6Ypf1hnNFN3;oQeF-8n&{VC&ShsWfBRHP>-MJP!K z<%yscO=wS7dNY(s%w_?r*vcOM_lp%~7G@%u3>B;~`GLD(d zXDRF0#Uak|H_v#(za%>$gZz*5{6JAkP>yh-XhmB()0d%4W*&>#$S#g?fm__=Denk4 zX?~H4EaW7JU@8+uW1{ImPX;iU@l0bLtJ%R}&TxZ&ct*0n>>H`bOn!<`oG@z9gm!eM zA0wE^JXWxl?HuAS&U1@B&W>`Qjmpwl%gzQRG}7iX-XU7=)y0IW;|0_z#6u)mqYx?DK2xLHw2vV-XH}T z$VFj-2%|Ffh^8G~`H8*^VH`79#u|2Wg3J8FV_xy`S(zgZ8OcpC!ibzQ zjORDzv7D{!;Q(j3$^+hz{G5FA72lGPToj@>Wr(0Y&1gd>y7Dtan85F>U>&B&rX3Q~-+l&2CksY63zXiG%=Y2^kFEIn9mYcvyCI1=N5N)%1hq!`Bm8`Be@79m`X$vMRQsaPfvbk z2ospfT$Zwq?d;_k7x|m#{L5$8)Z%+`P>|x3qY4daO(K05##p8@hZSt$5GOgyE$;D# zPp^BM@eOInL0*bej&N$yh-g~Vnf?r83^Q54I(Bh@lbqoSH+al@KD%L_kd>SSQjVI` zp&1?M#SkVih1o1)EBiRkRqpVB7bLwY+oU87naD;S3KK#N>d>5)#M71j3}F-#`Hh(@ zVl`XX&tXn-o?ATTElF?b!K5SuKaihd1QSM08WKYSy&1+t=CFX}Y+^4*IKd_E^Mdyz zzpdAkk}Tw>B%wqQMKrBQ z2gf+e74GnaBzNr}pYuP`lZl)Zr34j;B#Ib1(uDzxA_$|GL|XKWEmUT&nYf*m*>1D`F-yvz9k*GC_*X9Q<>`2r71Ba z(3hc%W(Lbx%Wn2_imUv?Q{IyFANxjXa!`n}gi)DD8qkb5dN6=rnZQhzvxPkz<07|s zOp*tFrpp(kAPt!)KyiYpL=-LPKmvUjz)(gpj@is(6&u*Y0Zww3>)hid$sejqO45>p zLIhEgO4Ok#t%;{6zc7jk{KhO+u#J5j=QQWJ%VUx}a;Ny3^kgP4g(*QeQM9BTUHF-y zjAa@NSi>$3bAqcp;yoWf_VZ~{kbxW&A(RT#A%;$Lr7uGm!5AhplSOP~4=1_KBa%Gv z-N=`G&kq#jN5Y68l6thH13ekcIDTU`3t7%;HuDE(xWG;B^OW}_dumpZiVS3>0Hq11 z3JqvZ8#>X2UJPS2Q<%XVma~Z+?By^gInQP8@q~b9`UT&RksRbFkTAljMm?I-o^JGG z1ivw#b?oIZXSvM_l026Oz9lVL$VFj-sY)Fh(UxxXVJM@R!tbnP3x_z)Wp410r~J#u zFJyu=WFRZKC_*UVRHHV{Xhlc5(3Ad*U=q_<%xc!Nl|7u`5_fpc8$Nky|42(N3K2*- z!l_CW(R89K{TR+TX7M{qSji^#^A{Jn!*i0q(s%hE>BvHUic*?zsu4v~;^;zu1~Gvd zEMhrp*~wv!bB=2~uqct7qN`FT1D>GQkN;b2H zKRL(WJmEdb-l)x&q#+XpC`xIYcld`leEQxShwsTk0ZLJh2%?A~p6(1{B)_qk6>MS;e{zzG z+~WlS|GESGkM!gqA0-H-8jWdBXL`_&fsA4rOIXJ)_VE|j_=mTA>NkOXOBV9+BbA7v z1)bCF&+Wd`$D z$wqdvpA($nI`??STLJyNN$^Y>knaNLSBB)Cv+LAzD1~GwIEMg@)*uzmSaF^F4{Wu`Wr=;Y2vXhUZgi@2H zw510_7|j&svY55(<_M>_!hPQGFQ0xA;CFlZZzm@~lp>tkG$xkr^kD$MGL407U=K$* z$t7;`ls6>(R1Ll)16j#M0g4hrIMu05eWHn{3w;>K7^d?(tJ%UHj&X_GJmVc7e&)RA#f3RqWs(r?|pHUh~O+)FCyQ$V)*=QIYC2q9q;Z!2pIaf!Qo%4LkXR6I|d9 zFZtlV&WQA6rvODMK?vd0q5-kQ(UpOWVmwos#S&JqmBSq8GJo@u5B|^jke1B+Kw*OT zk&4u!9?fY*M>^A!z6@eK)0xd8*06;g{K+})@RV01|DWDQ8nTj?K*~~`Mzo_lgBZm$ z=CXiQY+^fy`HPEO<1w#D_Jw}HH+)BK0tq968Z@Rko%o4iOkx%bSiu@Lvzud_;u6=m z$3xx_@TI*ZC7H=fDauowhBTuM3G`zqBbmYi*0YCWT;eA8c*1Mm^VwI{L|SrDfFQ!C zNfgb9p#z=i!7mJF4AWV{3O2Ks103NLm$=Cjl78)e@n60qHJQmp5M_y=77dA^4PEHT zV8%0>6>MNDdpOP+Zu5k<1bkyI@dc?!M{bH!o=ViB39X2yF9R9NZ_HvTtJ%R`4sw<& z+~+k(Qs^K2hg4)H55)MQYr@6vIp7NT2l->}eATv41 zM^Q>pfe7kQpH_6F2ZI^TSZ1<_RcvMlM>)+EZtJd`&7ckcS|`s6-SEX-;c8 z(t}?Z#zdwvhZU@42S>TYP5$9E0jbpEE7FmL0+b|#id3T!?dZt>#xRkoEMhg=Im`vF za*rpx;yoXx4oLDpQj(FZ0499`*2e}*%a1*~8_TiDHUE^vjvdC7-q)gmQn$xdzp38otL ziKY|X_=R7Y#e9~ti36PBCJ%Vc2j5u_Uy+_HX3}*^6n8Q*w z@&~86z%8DTG@af|3eu8;A1J_&gb+@3YSW13v>}mR3}X`0na>h7u$?^|;uM#;&s#o9 zFPo$#8wDsvC{<`k3tE#ve+DsvUzy4rRo5?_4icyY=)TTa7X+=E!7|Ar|vY55( zJi|ah%1#kE$i(bWdWFCPZVF`ap=VKaYlg40~* z3ICEjtM4rSkCc2zZi-Qw2&z+;Xkv+@Gd&r^SZ1({P3++W*LcWlKF%g@e8sn9Bo~2% zQHusd(~1Q8Gl&t4V>a_y%t|(}jlKNIX|8aGC%otL?AAqA3KC3ts!)U4G$)oW^k)#m znan)avWw%KwL!lk%kQ9 zBoBf7NF}OMk7mRWM^E}Pn6doEVm7js{T$&US9!owlH^vG|M4~H$xR`GC`mBYs6!0# z^ko>MnZhiVvWBf3<^-p?!QZ^%gCCqDDM>?C3R8>_!il6Q?dU>3hBK7~EN2V*IL2u% zahE3~&7%e>_>OGkC5RuXOg)+rOE(5EoY9PDE(=(}7It%#lU(8kPf3#38-O%qBrk!K zCX5=?BZf94(w`xWU^25=%1YL;g+rX?7Wa5f(tPs4H>4&5IVemi!iXS>#>CK(9t>d& z%5K@wvJOojO3PjS7SUS<00gPla)0xL|*0YTR9OoRj zxXVl45>UX|k&1L=B0EJWP6*|RAc_`rqz6AUgh~9yV%D&OJsjpdSGmn|-VspHog*a~ z$wy&I5==O?Xhv@Anyxf0?(&59{HM5VkcKSerzGX5NF5r} zl32Pkka5gmCF|MFZjNw)tK8-pZwV-&7AeU>ZVFO{iqxSoElH#&eHhL}rZJDDY+?sT zImtP$aG%G#CZME!xeV){0 zrywOLLq#gnfLOZIo574{3Nu*BDmJl;W1Q!2{^14h`TR%yh;(EoCxMiu8jWd99G&UU zXr{B2RcvJ!M>x)9Zt;YG(&h(W^BuVAjUC``K)9eyE(>1uJM>xBn@_6d__8P zk)Ps}qXtcgqbt1_##m;tgiY+?FvqyWP44rQBxPlfulb%_6eE~0DpQljv?P`Uequ1= znad*9v73V&<07|sz$-osv2SD`3%SWpamrJb+SH>FElHp|zc7NaOk@r#*})!;bC#Pt z;vFA`IxD^C9mj>)Fl${^T5& zxWzL9D)??79hoUeASDQ=4vlF?SNbx5QA}e#>)6CT4sx2CJmxuX__(4vq#!LhC`xh4 zP=U%s(UchC=}Iq#GK$H}U;!)H#10N|jEh|59_@F_C$!W)u54 z!fCE^n+H7Q9m%SBKk|QkM-B>5f{H}agmxs*mEH_uJX4s>5;n4vqnzM0SGmJel2x~V zq#!L>$VU+6s7PH}(1t|%F`D04$Z|Haja?k%G*@`QTRyE}??^`u@=%acL{Oc^w5KQi z7|nQQvzS$EW-rG$!*w2!q^9%X3o?+0l2oJ$ku;(WiTuPcMlqf_EM*njIKnwDagAF% zC7_nP^9>ouK@mz3MmW`|Lw#D)l|Bq%3{#oSVm7dwgB;}&H+aBXl0=%L{Erl*BNKTj zK{!>YM@!n#m7ervD5Dt9WahDmRjg+lM>x%SZg7{^B(1GBUy_n^WFj~D2_lpVL=sIa z+L1sver6D3n9K|ov5XCD;Sk3;#Z~U{gm-*a$2}l5*~m*lf{CCWjc83gJsH3lCNrC* ztYtGh*vnsB<2DcZmt=LlANY#z$wpzy5=JfR5kp6MGnikQ$PDJOoXza!1XsDoV_xz> zlp1``4-_Vda#W@+jc86BJsHR-#xt2YtYRnoIK+8wagUb-)RP<1k%^oXpbX`yMO|9b zmPESIi~bB@5_4J3Hg<8G%iQ2^o|3G-b0Q^~$VU*RC`T3Q)0#y3Fo^NYWg%7~HB56oV;^@T?CNY=QY+@$|InD*{aG#e1H1aOsJ2H`zLKG*IO4K2Scz$9a!x+zW z=CYFQ?BOt{xyEDOk-V{<#eeydbmXKcKT?Tm)FXy?dNGjUOkoyF*uXB1aDgk_@<*7nFS`$wn2JkCWna5hTv!BD9;v(0%%R^oh(A3)anlxmm0Hp|_ z22nJjHJ#`|e+Dt0sVrh8J2=Q$ZgH1qyyw$q_KytwKnY3{Mg-M~q807vLVt!Zk!j3g z85`NhVgBM0_jt@}0-Ec6q$D#r38XX?sYY!Y(3*~Pqd%jVz%&-Kj&1DY7-zV~V_uLX z+U(>Tz9Sp?DNaS|(ukJC(U}1ZXDTyT#(MT~j8k0a0nbU^LN6j6*(pLP!igf9jwI5T z0gPZgvslO)wy>MS9ODxI@R*l;6r+celC0#X1R>O*A#LeIPkv?uHN-eRIHTZ(`WF`+qC{1}HX-X^F(V3nM=2xaMk43CzD~CD31#a`4 zw|o$5Ht`kTlZ9O5Cx~)XrU5aup$mN(#zf|^lC^APJG(i=2`=-1w|vsp*^!2<~sLa0V#Vu+

    |ie^ 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%0DLb5ws54G^B=GWt@fUz*&VEg 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�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໿`%oI>m)v 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 Sb8 z;r`RBvD6m`lS}JoYZM?Ma{$pD6Njn4Yq<>7Z@1bs&9f>-_b21j`EF95e=90Woqs2T z{%CgNRA|F!p^zhA5B}I!s z;n+GGU1VUZK>5Hh(!Scimt{$;g;93C4_FXH6&`eluaJnyW-&EChtCVY`bI}C-%_O1 zwFxPDozHFCMeMQlvOijFKP={#$&;S}ro;$-Sr*%IjM%U;`0ZqQ%?Ir%qq)|8u6UDR zIgQuRo_Ai>;Km=oBUfp!i(p`sv|XYaw{aTMV^vbU-_{FYin2A*MAQSlGxKkEa#VY{ zm}7CHk73uN%OfgtsYz1d)XqqGBt*9NT9$ZDj)}W_dTj5j2`u-}OaregLJN&hX zgk5Etd~02GLyxjAy!2OnUx}e7?K+tWdDSMb`Py2N9~ZexfJMEGRPO zJD!hS5#HXJV=`(MQz9xjbHn)mv~ri=Z6?^LZj$}8D~fw+Q|3xk?b^eCpX{ll&Z52-q8byKGgdKO>L*_8*FFd_8&m7%@dC zB;JpYh9dI!si?uJxc}5b29@p7z&<7tbC*BDA@pcq_{K^A6-|hsGOE7~DYmU#ru$zw zXrm$^QtlrpNO*29e$^S}WduzWG5(CnuTH!eAa=?QyDF_7{)uQi2ZiSo;?8epz6{o9 z$oP-EtFY8fvW(VD2AJWU{*(kqC9%hA-_CuKwl4MciY! zIYTrK`GwbCGTE~BI06c)hVN#?DTfk~!zdL-q3F4VK(eQm;4_BL`Tcr-3pkGMF}x(y zEG3z;**08P9eII_=Iu)IE$=$|HNhBhzTxQy(QkLg2Hx7Ad3^S_HcGN@`JrC$K-

      IpxOnXgNHuq5r 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
      D;t42# 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
      Ek&gd@NbU+3zW~@a)MMV#fK0_Hjxw4d*`*_1< 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�nFz&uIVo5xwPBUT(xAs0`M+c2hNOKq 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
  • %L$Z;+O%Sd7IJ-tJN}g>j#@P8{K5 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

    0!1L$j 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 U;&1-<{r{f73;bQ+|6+mv0dH$`fB*mh literal 0 HcmV?d00001 diff --git a/extension/duckdb_scanner/test/test_files/duckdb_scanner.test b/extension/duckdb_scanner/test/test_files/duckdb_scanner.test new file mode 100644 index 00000000000..05a6ea6374d --- /dev/null +++ b/extension/duckdb_scanner/test/test_files/duckdb_scanner.test @@ -0,0 +1,68 @@ +-GROUP DuckDBScanner +-DATASET CSV empty + +-- + +-CASE ScanDuckDBTable +-STATEMENT load extension "${KUZU_ROOT_DIRECTORY}/extension/duckdb_scanner/build/libduckdb_scanner.kuzu_extension" +---- ok +-STATEMENT ATTACH '${KUZU_ROOT_DIRECTORY}/extension/duckdb_scanner/test/duckdb_database/tinysnb.db' as tinysnb (dbtype 'duckdb'); +---- ok +-STATEMENT LOAD FROM tinysnb_person RETURN *; +---- 8 +0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|[[10,8],[6,7,8]]|1.731000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 +10|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|2|False|True|83|4.900000|1990-11-27|2023-02-21 13:25:30|3 years 2 days 13:02:00|[10,11,12,3,4,5,6,7]|[Ad,De,Hi,Kye,Orlan]|[[7],[10],[6,7]]|1.323000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18 +2|Bob|2|True|False|30|5.100000|1900-01-01|2008-11-03 15:25:30.000526|10 years 5 months 13:00:00.000024|[12,8]|[Bobby]|[[8,9],[9,10]]|0.990000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12 +3|Carol|1|False|True|45|5.000000|1940-06-22|1911-08-20 02:32:21|48:24:11|[4,5]|[Carmen,Fred]|[[8,10]]|1.000000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13 +5|Dan|2|False|True|20|4.800000|1950-07-23|2031-11-30 12:25:30|10 years 5 months 13:00:00.000024|[1,9]|[Wolfeschlegelstein,Daniel]|[[7,4],[8,8],[9]]|1.300000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14 +7|Elizabeth|1|False|True|20|4.700000|1980-10-26|1976-12-23 11:21:42|48:24:11|[2]|[Ein]|[[6],[7],[8]]|1.463000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15 +8|Farooq|2|True|False|25|4.500000|1980-10-26|1972-07-31 13:22:30.678559|00:18:00.024|[3,4,5,6,7]|[Fesdwe]|[[8]]|1.510000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16 +9|Greg|2|False|False|40|4.900000|1980-10-26|1976-12-23 11:21:42|10 years 5 months 13:00:00.000024|[1]|[Grad]|[[10]]|1.600000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17 +-STATEMENT LOAD FROM tinysnb_organisation RETURN *; +---- 3 +1|ABFsUni|325|3.700000|-2|10 years 5 months 13 hours 24 us|3 years 5 days|1.000000|{revenue: 138, "location": ['toronto','montr,eal'], stock: {price: [96,56], volume: 1000}}|3.12 +4|CsWork|934|4.100000|-100|2 years 4 days 10 hours|26 years 52 days 48:00:00|0.780000|{revenue: 152, "location": ["vanco,uver north area"], stock: {price: [15,78,671], volume: 432}}|abcd +6|DEsWork|824|4.100000|7|2 years 4 hours 22 us 34 minutes|82:00:00.1|0.520000|{revenue: 558, "location": ['very long city name','new york'], stock: {price: [22], volume: 99}}|2023-12-15 +-STATEMENT LOAD FROM tinysnb_movies RETURN *; +---- 3 +Roma|298|the movie is very interesting and funny|{rating: 1223.000000, stars: 100, "views": 10003, "release": 2011-02-11 16:44:22, release_ns: 2011-02-11 16:44:22.123456, release_ms: 2011-02-11 16:44:22.123, release_sec: 2011-02-11 16:44:22, release_tz: 2011-02-11 16:44:22.123456+00, film: 2013-02-22, u8: 1, u16: 15, u32: 200, u64: 4, hugedata: -15}|pure ascii characters|{} +Sóló cón tu párejâ|126| this is a very very good movie|{rating: 5.300000, stars: 2, "views": 152, "release": 2011-08-20 11:25:30, release_ns: 2011-08-20 11:25:30.123456, release_ms: 2011-08-20 11:25:30.123, release_sec: 2011-08-20 11:25:30, release_tz: 2011-08-20 11:25:30.123456+00, film: 2012-05-11, u8: 220, u16: 20, u32: 1, u64: 180, hugedata: 1844674407370955161811111111}|\xAA\xABinteresting\x0B|{audience1=52, audience53=42} +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie|2544| the movie is very very good|{rating: 7.000000, stars: 10, "views": 982, "release": 2018-11-13 13:33:11, release_ns: 2018-11-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2018-11-13 13:33:11, release_tz: 2018-11-13 13:33:11.123456+00, film: 2014-09-12, u8: 12, u16: 120, u32: 55, u64: 1, hugedata: -1844674407370955161511}|\xAB\xCD|{audience1=33} +-STATEMENT LOAD FROM tinysnb_tableOfTypes RETURN count(*); +---- 1 +49999 +-STATEMENT LOAD FROM tinysnb_tableOfTypes WHERE id = 49992 or id = 28532 RETURN *; +---- 2 +28532|74|72.472423|True|1977-08-16|TKn|[94,92]|[AUSrJTUWVOESDor,ODOS6RfqMhsFO9aFUa,ziauQj]|[[123,55,181],[32]]|{ID: 666, "name": DiqSQ5u5UhS8aZi} +49992|50|31.582059|False|2056-05-02||[62,24,94]|[LpQO8OT3x45a]|[[268,281,166],[144,16,126,208,298],[22,287]]|{ID: 936, "name": sGPSafxMAhKiP} +-STATEMENT LOAD FROM tinysnb_person1 RETURN *; +---- error +Binder exception: No table named: person1 in database. +-STATEMENT DETACH tinysnb; +---- ok +-STATEMENT LOAD FROM tinysnb_person RETURN *; +---- error +Binder exception: No database named tinysnb has been attached. +-LOG AttachMultipleDuckDB +-STATEMENT ATTACH '${KUZU_ROOT_DIRECTORY}/extension/duckdb_scanner/test/duckdb_database/tinysnb.db' (dbtype 'duckdb'); +---- ok +-STATEMENT ATTACH '${KUZU_ROOT_DIRECTORY}/extension/duckdb_scanner/test/duckdb_database/other.db' as other (dbtype 'duckdb'); +---- ok +-STATEMENT LOAD FROM other_person RETURN *; +---- 4 +1 +2 +3 +5 +-STATEMENT LOAD FROM tinysnb_person RETURN count(*); +---- 1 +8 +-LOG UnsupportedDuckDBType +-STATEMENT LOAD FROM tinysnb_unsupportedType RETURN *; +---- error +Binder exception: Unsupported duckdb type: ENUM('sad', 'ok', 'happy'). + +-CASE InvalidDuckDBDatabase +-STATEMENT LOAD FROM tinysnb1_person RETURN *; +---- error +Binder exception: No database named tinysnb1 has been attached. diff --git a/extension/httpfs/CMakeLists.txt b/extension/httpfs/CMakeLists.txt index 813386e6a70..8c6b0f1d4f5 100644 --- a/extension/httpfs/CMakeLists.txt +++ b/extension/httpfs/CMakeLists.txt @@ -31,6 +31,7 @@ set_target_properties(httpfs PROPERTIES PREFIX "lib" SUFFIX ".kuzu_extension" ) + set_target_properties(httpfs PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" diff --git a/extension/httpfs/test/CMakeLists.txt b/extension/httpfs/test/CMakeLists.txt index 08b6fe8acfb..e69de29bb2d 100644 --- a/extension/httpfs/test/CMakeLists.txt +++ b/extension/httpfs/test/CMakeLists.txt @@ -1,11 +0,0 @@ -add_definitions(-DTEST_FILES_DIR="extension/httpfs/test/test_files") -add_subdirectory(${CMAKE_SOURCE_DIR}/test/gtest ${CMAKE_CURRENT_BINARY_DIR}/test/gtest EXCLUDE_FROM_ALL) -# Make gtest available to subdirectories. -add_library(GTest::GTest INTERFACE IMPORTED) -target_link_libraries(GTest::GTest INTERFACE gtest_main) -target_link_libraries(GTest::GTest INTERFACE gmock_main) -enable_testing() -add_subdirectory(${CMAKE_SOURCE_DIR}/test/test_helper ${CMAKE_CURRENT_BINARY_DIR}/test/test_helper) -add_subdirectory(${CMAKE_SOURCE_DIR}/test/test_runner ${CMAKE_CURRENT_BINARY_DIR}/test/test_runner) -add_subdirectory(${CMAKE_SOURCE_DIR}/test/graph_test ${CMAKE_CURRENT_BINARY_DIR}/test/graph_test) -add_subdirectory(${CMAKE_SOURCE_DIR}/test/runner ${CMAKE_CURRENT_BINARY_DIR}/test/runner) diff --git a/scripts/antlr4/Cypher.g4.copy b/scripts/antlr4/Cypher.g4.copy index 4fdaa086014..d3491a5ad84 100644 --- a/scripts/antlr4/Cypher.g4.copy +++ b/scripts/antlr4/Cypher.g4.copy @@ -31,7 +31,9 @@ oC_Statement | kU_Transaction | kU_Extension | kU_ExportDatabase - | kU_ImportDatabase; + | kU_ImportDatabase + | kU_AttachDatabase + | kU_DetachDatabase; kU_CopyFrom : COPY SP oC_SchemaName ( ( SP? kU_ColumnNames SP? ) | SP ) FROM SP kU_ScanSource ( SP? kU_ParsingOptions )? ; @@ -56,6 +58,18 @@ kU_ExportDatabase kU_ImportDatabase : IMPORT SP DATABASE SP StringLiteral; +kU_AttachDatabase + : ATTACH SP StringLiteral (SP AS SP oC_SchemaName SP)? (SP? '(' SP? DBTYPE SP StringLiteral SP? ')')?; + +ATTACH: + ( 'A' | 'a') ( 'T' | 't') ( 'T' | 't') ( 'A' | 'a') ( 'C' | 'c') ( 'H' | 'h'); + +DBTYPE: + ( 'D' | 'd') ( 'B' | 'b') ( 'T' | 't') ( 'Y' | 'y') ( 'P' | 'p') ( 'E' | 'e'); + +kU_DetachDatabase + : DETACH SP oC_SchemaName; + kU_StandaloneCall : CALL SP oC_SymbolicName SP? '=' SP? oC_Literal ; diff --git a/src/antlr4/Cypher.g4 b/src/antlr4/Cypher.g4 index 4fdaa086014..d3491a5ad84 100644 --- a/src/antlr4/Cypher.g4 +++ b/src/antlr4/Cypher.g4 @@ -31,7 +31,9 @@ oC_Statement | kU_Transaction | kU_Extension | kU_ExportDatabase - | kU_ImportDatabase; + | kU_ImportDatabase + | kU_AttachDatabase + | kU_DetachDatabase; kU_CopyFrom : COPY SP oC_SchemaName ( ( SP? kU_ColumnNames SP? ) | SP ) FROM SP kU_ScanSource ( SP? kU_ParsingOptions )? ; @@ -56,6 +58,18 @@ kU_ExportDatabase kU_ImportDatabase : IMPORT SP DATABASE SP StringLiteral; +kU_AttachDatabase + : ATTACH SP StringLiteral (SP AS SP oC_SchemaName SP)? (SP? '(' SP? DBTYPE SP StringLiteral SP? ')')?; + +ATTACH: + ( 'A' | 'a') ( 'T' | 't') ( 'T' | 't') ( 'A' | 'a') ( 'C' | 'c') ( 'H' | 'h'); + +DBTYPE: + ( 'D' | 'd') ( 'B' | 'b') ( 'T' | 't') ( 'Y' | 'y') ( 'P' | 'p') ( 'E' | 'e'); + +kU_DetachDatabase + : DETACH SP oC_SchemaName; + kU_StandaloneCall : CALL SP oC_SymbolicName SP? '=' SP? oC_Literal ; diff --git a/src/binder/bind/CMakeLists.txt b/src/binder/bind/CMakeLists.txt index 90047fb71eb..6fa7ba366db 100644 --- a/src/binder/bind/CMakeLists.txt +++ b/src/binder/bind/CMakeLists.txt @@ -4,10 +4,12 @@ add_subdirectory(ddl) add_library( kuzu_binder_bind OBJECT + bind_attach_database.cpp bind_comment_on.cpp bind_copy.cpp bind_create_macro.cpp bind_ddl.cpp + bind_detach_database.cpp bind_explain.cpp bind_file_scan.cpp bind_graph_pattern.cpp diff --git a/src/binder/bind/bind_attach_database.cpp b/src/binder/bind/bind_attach_database.cpp new file mode 100644 index 00000000000..b7adca93d2a --- /dev/null +++ b/src/binder/bind/bind_attach_database.cpp @@ -0,0 +1,15 @@ +#include "binder/binder.h" +#include "binder/bound_attach_database.h" +#include "parser/attach_database.h" + +namespace kuzu { +namespace binder { + +std::unique_ptr Binder::bindAttachDatabase(const parser::Statement& statement) { + auto& attachDatabase = + common::ku_dynamic_cast(statement); + return std::make_unique(attachDatabase.getAttachInfo()); +} + +} // namespace binder +} // namespace kuzu diff --git a/src/binder/bind/bind_detach_database.cpp b/src/binder/bind/bind_detach_database.cpp new file mode 100644 index 00000000000..af8fd52cdc5 --- /dev/null +++ b/src/binder/bind/bind_detach_database.cpp @@ -0,0 +1,15 @@ +#include "binder/binder.h" +#include "binder/bound_detach_database.h" +#include "parser/detach_database.h" + +namespace kuzu { +namespace binder { + +std::unique_ptr Binder::bindDetachDatabase(const parser::Statement& statement) { + auto& detachDatabase = + common::ku_dynamic_cast(statement); + return std::make_unique(detachDatabase.getDBName()); +} + +} // namespace binder +} // namespace kuzu diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index 6ab95a01e02..ddb7ee6557a 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -6,8 +6,11 @@ #include "binder/query/reading_clause/bound_unwind_clause.h" #include "common/exception/binder.h" #include "common/string_format.h" +#include "common/string_utils.h" #include "function/table/bind_input.h" -#include "main/client_context.h" +#include "main/attached_database.h" +#include "main/database.h" +#include "main/database_manager.h" #include "parser/expression/parsed_function_expression.h" #include "parser/query/reading_clause/in_query_call_clause.h" #include "parser/query/reading_clause/load_from.h" @@ -157,15 +160,29 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re case ScanSourceType::OBJECT: { auto objectSource = ku_dynamic_cast(source); auto objectName = objectSource->objectName; - auto objectExpr = expressionBinder.bindVariableExpression(objectName); - auto literalExpr = - ku_dynamic_cast(objectExpr.get()); - auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); - auto func = BuiltInFunctionsUtils::matchFunction( - READ_PANDAS_FUNC_NAME, std::vector{objectExpr->getDataType()}, functions); - scanFunction = ku_dynamic_cast(func); - bindInput = std::make_unique(); - bindInput->inputs.push_back(*literalExpr->getValue()); + if (objectName.find("_") == std::string::npos) { + auto objectExpr = expressionBinder.bindVariableExpression(objectName); + auto literalExpr = + ku_dynamic_cast(objectExpr.get()); + auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); + auto func = BuiltInFunctionsUtils::matchFunction(READ_PANDAS_FUNC_NAME, + std::vector{objectExpr->getDataType()}, functions); + scanFunction = ku_dynamic_cast(func); + bindInput = std::make_unique(); + bindInput->inputs.push_back(*literalExpr->getValue()); + } else { + auto dbName = common::StringUtils::split(objectName, "_")[0]; + auto attachedDB = + clientContext->getDatabase()->getDatabaseManagerUnsafe()->getAttachedDatabase( + dbName); + if (attachedDB == nullptr) { + throw BinderException{ + common::stringFormat("No database named {} has been attached.", dbName)}; + } + scanFunction = attachedDB->getScanFunction(); + bindInput = std::make_unique(); + bindInput->inputs.push_back(Value(common::StringUtils::split(objectName, "_")[1])); + } } break; case ScanSourceType::FILE: { auto fileSource = ku_dynamic_cast(source); diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 418908dac41..e6089f4967a 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -62,6 +62,12 @@ std::unique_ptr Binder::bind(const Statement& statement) { case StatementType::IMPORT_DATABASE: { boundStatement = bindImportDatabaseClause(statement); } break; + case StatementType::ATTACH_DATABASE: { + boundStatement = bindAttachDatabase(statement); + } break; + case StatementType::DETACH_DATABASE: { + boundStatement = bindDetachDatabase(statement); + } break; default: { KU_UNREACHABLE; } diff --git a/src/binder/bound_statement_visitor.cpp b/src/binder/bound_statement_visitor.cpp index fe67f121116..ce00260db72 100644 --- a/src/binder/bound_statement_visitor.cpp +++ b/src/binder/bound_statement_visitor.cpp @@ -55,6 +55,12 @@ void BoundStatementVisitor::visit(const BoundStatement& statement) { case StatementType::IMPORT_DATABASE: { visitImportDatabase(statement); } break; + case StatementType::ATTACH_DATABASE: { + visitAttachDatabase(statement); + } break; + case StatementType::DETACH_DATABASE: { + visitDetachDatabase(statement); + } break; default: KU_UNREACHABLE; } diff --git a/src/catalog/catalog.cpp b/src/catalog/catalog.cpp index 720adba49aa..0c9f446e0cb 100644 --- a/src/catalog/catalog.cpp +++ b/src/catalog/catalog.cpp @@ -4,6 +4,7 @@ #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "catalog/catalog_entry/rel_group_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" +#include "catalog/catalog_entry/scalar_macro_catalog_entry.h" #include "storage/wal/wal.h" #include "transaction/transaction.h" #include "transaction/transaction_action.h" @@ -264,7 +265,9 @@ void Catalog::addScalarMacroFunction( std::string name, std::unique_ptr macro) { KU_ASSERT(readWriteVersion != nullptr); setToUpdated(); - readWriteVersion->addScalarMacroFunction(std::move(name), std::move(macro)); + auto scalarMacroCatalogEntry = + std::make_unique(std::move(name), std::move(macro)); + readWriteVersion->functions->createEntry(std::move(scalarMacroCatalogEntry)); } std::vector Catalog::getMacroNames(transaction::Transaction* tx) const { diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index 00f3bd8ec68..0bf7ab4aa61 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -227,12 +227,6 @@ void CatalogContent::addFunction(std::string name, function::function_set defini std::make_unique(std::move(name), std::move(definitions))); } -void CatalogContent::addScalarMacroFunction( - std::string name, std::unique_ptr macro) { - functions->createEntry( - std::make_unique(std::move(name), std::move(macro))); -} - function::ScalarMacroFunction* CatalogContent::getScalarMacroFunction( const std::string& name) const { return ku_dynamic_cast(functions->getEntry(name)) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 513ef8acbec..0ae41a12b12 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(file_system) add_library(kuzu_common OBJECT + case_insensitive_map.cpp constants.cpp expression_type.cpp in_mem_overflow_buffer.cpp diff --git a/src/common/case_insensitive_map.cpp b/src/common/case_insensitive_map.cpp new file mode 100644 index 00000000000..ce961897d1f --- /dev/null +++ b/src/common/case_insensitive_map.cpp @@ -0,0 +1,18 @@ +#include "common/case_insensitive_map.h" + +#include "common/string_utils.h" + +namespace kuzu { +namespace common { + +uint64_t CaseInsensitiveStringHashFunction::operator()(const std::string& str) const { + return common::StringUtils::caseInsensitiveHash(str); +} + +bool CaseInsensitiveStringEquality::operator()( + const std::string& lhs, const std::string& rhs) const { + return common::StringUtils::caseInsensitiveEquals(lhs, rhs); +} + +} // namespace common +} // namespace kuzu diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index faa1a8275be..48a8ac254a0 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -139,10 +139,14 @@ class Binder { std::unique_ptr bindExportDatabaseClause(const parser::Statement& statement); std::unique_ptr bindImportDatabaseClause(const parser::Statement& statement); + std::unique_ptr bindAttachDatabase(const parser::Statement& statement); + std::unique_ptr bindDetachDatabase(const parser::Statement& statement); + /*** bind scan source ***/ std::unique_ptr bindScanSource(parser::BaseScanSource* scanSource, const parser::parsing_option_t& options, const std::vector& columnNames, const std::vector& columnTypes); + std::unordered_map bindParsingOptions( const parser::parsing_option_t& parsingOptions); common::FileType bindFileType(const std::vector& filePaths); diff --git a/src/include/binder/bound_attach_database.h b/src/include/binder/bound_attach_database.h new file mode 100644 index 00000000000..1d36954d7b3 --- /dev/null +++ b/src/include/binder/bound_attach_database.h @@ -0,0 +1,23 @@ +#pragma once + +#include "binder/bound_statement.h" +#include "parser/parsed_data/attach_info.h" + +namespace kuzu { +namespace binder { + +class BoundAttachDatabase final : public BoundStatement { +public: + explicit BoundAttachDatabase(parser::AttachInfo attachInfo) + : BoundStatement{common::StatementType::ATTACH_DATABASE, + BoundStatementResult::createEmptyResult()}, + attachInfo{std::move(attachInfo)} {} + + parser::AttachInfo getAttachInfo() const { return attachInfo; } + +private: + parser::AttachInfo attachInfo; +}; + +} // namespace binder +} // namespace kuzu diff --git a/src/include/binder/bound_detach_database.h b/src/include/binder/bound_detach_database.h new file mode 100644 index 00000000000..a99f88372bc --- /dev/null +++ b/src/include/binder/bound_detach_database.h @@ -0,0 +1,22 @@ +#pragma once + +#include "binder/bound_statement.h" + +namespace kuzu { +namespace binder { + +class BoundDetachDatabase final : public BoundStatement { +public: + explicit BoundDetachDatabase(std::string dbName) + : BoundStatement{common::StatementType::DETACH_DATABASE, + BoundStatementResult::createEmptyResult()}, + dbName{std::move(dbName)} {} + + std::string getDBName() const { return dbName; } + +private: + std::string dbName; +}; + +} // namespace binder +} // namespace kuzu diff --git a/src/include/binder/bound_statement_visitor.h b/src/include/binder/bound_statement_visitor.h index 2691255797c..efcd4318a33 100644 --- a/src/include/binder/bound_statement_visitor.h +++ b/src/include/binder/bound_statement_visitor.h @@ -48,6 +48,8 @@ class BoundStatementVisitor { virtual void visitProjectionBody(const BoundProjectionBody& /* projectionBody*/) {} virtual void visitProjectionBodyPredicate(const std::shared_ptr& /* predicate*/) {} + virtual void visitAttachDatabase(const BoundStatement&) {} + virtual void visitDetachDatabase(const BoundStatement&) {} }; } // namespace binder diff --git a/src/include/binder/copy/bound_export_database.h b/src/include/binder/copy/bound_export_database.h index 06dfa4e4f9a..62653cd3708 100644 --- a/src/include/binder/copy/bound_export_database.h +++ b/src/include/binder/copy/bound_export_database.h @@ -17,7 +17,7 @@ struct ExportedTableData { inline const BoundRegularQuery* getRegularQuery() const { return regularQuery.get(); } }; -class BoundExportDatabase : public BoundStatement { +class BoundExportDatabase final : public BoundStatement { public: BoundExportDatabase(std::string filePath, common::FileType fileType, std::vector exportData, diff --git a/src/include/binder/copy/bound_import_database.h b/src/include/binder/copy/bound_import_database.h index d6ec80b1a25..7dadc43b781 100644 --- a/src/include/binder/copy/bound_import_database.h +++ b/src/include/binder/copy/bound_import_database.h @@ -4,7 +4,7 @@ namespace kuzu { namespace binder { -class BoundImportDatabase : public BoundStatement { +class BoundImportDatabase final : public BoundStatement { public: BoundImportDatabase(std::string filePath, std::string query) : BoundStatement{common::StatementType::IMPORT_DATABASE, diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index cc980e33e95..975c3cdd54b 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -4,6 +4,7 @@ #include "catalog/catalog_entry/table_catalog_entry.h" #include "catalog_content.h" +#include "function/table_functions.h" namespace kuzu { namespace storage { diff --git a/src/include/catalog/catalog_content.h b/src/include/catalog/catalog_content.h index 2281911185d..484aeb639a8 100644 --- a/src/include/catalog/catalog_content.h +++ b/src/include/catalog/catalog_content.h @@ -44,8 +44,6 @@ class CatalogContent { return functions->containsEntry(macroName); } void addFunction(std::string name, function::function_set definitions); - void addScalarMacroFunction( - std::string name, std::unique_ptr macro); function::ScalarMacroFunction* getScalarMacroFunction(const std::string& name) const; diff --git a/src/include/common/case_insensitive_map.h b/src/include/common/case_insensitive_map.h index d11ddb146dc..5d4ac9f2f1e 100644 --- a/src/include/common/case_insensitive_map.h +++ b/src/include/common/case_insensitive_map.h @@ -3,21 +3,17 @@ #include #include -#include "common/string_utils.h" +#include "common/api.h" namespace kuzu { namespace common { struct CaseInsensitiveStringHashFunction { - uint64_t operator()(const std::string& str) const { - return common::StringUtils::caseInsensitiveHash(str); - } + KUZU_API uint64_t operator()(const std::string& str) const; }; struct CaseInsensitiveStringEquality { - bool operator()(const std::string& left, const std::string& right) const { - return common::StringUtils::caseInsensitiveEquals(left, right); - } + KUZU_API bool operator()(const std::string& lhs, const std::string& rhs) const; }; template diff --git a/src/include/common/enums/statement_type.h b/src/include/common/enums/statement_type.h index ac439eb70f0..6bc13472b90 100644 --- a/src/include/common/enums/statement_type.h +++ b/src/include/common/enums/statement_type.h @@ -20,6 +20,8 @@ enum class StatementType : uint8_t { EXTENSION = 31, EXPORT_DATABASE = 32, IMPORT_DATABASE = 33, + ATTACH_DATABASE = 34, + DETACH_DATABASE = 35, }; struct StatementTypeUtils { diff --git a/src/include/common/string_utils.h b/src/include/common/string_utils.h index 4bdee469534..c1013857c3d 100644 --- a/src/include/common/string_utils.h +++ b/src/include/common/string_utils.h @@ -11,7 +11,7 @@ namespace common { class StringUtils { public: - static std::vector splitComma(const std::string& input); + KUZU_API static std::vector splitComma(const std::string& input); KUZU_API static std::vector split( const std::string& input, const std::string& delimiter, bool ignoreEmptyStringParts = true); diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index d19f79ccfec..633a042f4d7 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -297,7 +297,7 @@ class LogicalType { static std::unique_ptr deserialize(Deserializer& deserializer); - std::unique_ptr copy() const; + KUZU_API std::unique_ptr copy() const; static std::vector> copy( const std::vector>& types); diff --git a/src/include/common/vector/auxiliary_buffer.h b/src/include/common/vector/auxiliary_buffer.h index 3f281ad9a6a..bac0a4002e9 100644 --- a/src/include/common/vector/auxiliary_buffer.h +++ b/src/include/common/vector/auxiliary_buffer.h @@ -69,19 +69,17 @@ class ListAuxiliaryBuffer : public AuxiliaryBuffer { public: ListAuxiliaryBuffer(const LogicalType& dataVectorType, storage::MemoryManager* memoryManager); - inline void setDataVector(std::shared_ptr vector) { - dataVector = std::move(vector); - } - inline ValueVector* getDataVector() const { return dataVector.get(); } - inline std::shared_ptr getSharedDataVector() const { return dataVector; } + void setDataVector(std::shared_ptr vector) { dataVector = std::move(vector); } + ValueVector* getDataVector() const { return dataVector.get(); } + std::shared_ptr getSharedDataVector() const { return dataVector; } list_entry_t addList(uint64_t listSize); - inline uint64_t getSize() const { return size; } + uint64_t getSize() const { return size; } - inline void resetSize() { size = 0; } + void resetSize() { size = 0; } - void resize(uint64_t numValues); + KUZU_API void resize(uint64_t numValues); private: void resizeDataVector(ValueVector* dataVector); diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index 5a1fd9f170f..49ff32355ad 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -36,16 +36,16 @@ class ValueVector { void setState(const std::shared_ptr& state_); - inline void setAllNull() { nullMask->setAllNull(); } - inline void setAllNonNull() { nullMask->setAllNonNull(); } + void setAllNull() { nullMask->setAllNull(); } + void setAllNonNull() { nullMask->setAllNonNull(); } // On return true, there are no null. On return false, there may or may not be nulls. - inline bool hasNoNullsGuarantee() const { return nullMask->hasNoNullsGuarantee(); } - inline void setNullRange(uint32_t startPos, uint32_t len, bool value) { + bool hasNoNullsGuarantee() const { return nullMask->hasNoNullsGuarantee(); } + void setNullRange(uint32_t startPos, uint32_t len, bool value) { nullMask->setNullFromRange(startPos, len, value); } inline const uint64_t* getNullMaskData() { return nullMask->getData(); } KUZU_API void setNull(uint32_t pos, bool isNull); - inline uint8_t isNull(uint32_t pos) const { return nullMask->isNull(pos); } + KUZU_API uint8_t isNull(uint32_t pos) const { return nullMask->isNull(pos); } inline void setAsSingleNullEntry() { state->selVector->selectedSize = 1; setNull(state->selVector->selectedPositions[0], true); @@ -54,7 +54,7 @@ class ValueVector { bool setNullFromBits(const uint64_t* srcNullEntries, uint64_t srcOffset, uint64_t dstOffset, uint64_t numBitsToCopy); - inline uint32_t getNumBytesPerValue() const { return numBytesPerValue; } + uint32_t getNumBytesPerValue() const { return numBytesPerValue; } // TODO(Guodong): Rename this to getValueRef template @@ -76,15 +76,15 @@ class ValueVector { std::unique_ptr getAsValue(uint64_t pos); - inline uint8_t* getData() const { return valueBuffer.get(); } + KUZU_API uint8_t* getData() const { return valueBuffer.get(); } - inline offset_t readNodeOffset(uint32_t pos) const { + offset_t readNodeOffset(uint32_t pos) const { KU_ASSERT(dataType.getLogicalTypeID() == LogicalTypeID::INTERNAL_ID); return getValue(pos).offset; } - inline void setSequential() { _isSequential = true; } - inline bool isSequential() const { return _isSequential; } + void setSequential() { _isSequential = true; } + bool isSequential() const { return _isSequential; } KUZU_API void resetAuxiliaryBuffer(); @@ -108,7 +108,7 @@ class ValueVector { std::unique_ptr auxiliaryBuffer; }; -class StringVector { +class KUZU_API StringVector { public: static inline InMemOverflowBuffer* getInMemOverflowBuffer(ValueVector* vector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); @@ -133,7 +133,7 @@ class StringVector { InMemOverflowBuffer* rowOverflowBuffer); }; -struct BlobVector { +struct KUZU_API BlobVector { static void addBlob(ValueVector* vector, uint32_t pos, const char* data, uint32_t length) { StringVector::addString(vector, pos, data, length); } @@ -142,52 +142,51 @@ struct BlobVector { } }; -class ListVector { +class KUZU_API ListVector { public: - static inline void setDataVector( - const ValueVector* vector, std::shared_ptr dataVector) { + static void setDataVector(const ValueVector* vector, std::shared_ptr dataVector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); auto listBuffer = ku_dynamic_cast(vector->auxiliaryBuffer.get()); listBuffer->setDataVector(std::move(dataVector)); } - static inline ValueVector* getDataVector(const ValueVector* vector) { + static ValueVector* getDataVector(const ValueVector* vector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getDataVector(); } - static inline std::shared_ptr getSharedDataVector(const ValueVector* vector) { + static std::shared_ptr getSharedDataVector(const ValueVector* vector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getSharedDataVector(); } - static inline uint64_t getDataVectorSize(const ValueVector* vector) { + static uint64_t getDataVectorSize(const ValueVector* vector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getSize(); } - static inline uint8_t* getListValues(const ValueVector* vector, const list_entry_t& listEntry) { + static uint8_t* getListValues(const ValueVector* vector, const list_entry_t& listEntry) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); auto dataVector = getDataVector(vector); return dataVector->getData() + dataVector->getNumBytesPerValue() * listEntry.offset; } - static inline uint8_t* getListValuesWithOffset( + static uint8_t* getListValuesWithOffset( const ValueVector* vector, const list_entry_t& listEntry, offset_t elementOffsetInList) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); return getListValues(vector, listEntry) + elementOffsetInList * getDataVector(vector)->getNumBytesPerValue(); } - static inline list_entry_t addList(ValueVector* vector, uint64_t listSize) { + static list_entry_t addList(ValueVector* vector, uint64_t listSize) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->addList(listSize); } - static inline void resizeDataVector(ValueVector* vector, uint64_t numValues) { + static void resizeDataVector(ValueVector* vector, uint64_t numValues) { ku_dynamic_cast(vector->auxiliaryBuffer.get()) ->resize(numValues); } @@ -202,7 +201,7 @@ class ListVector { static void sliceDataVector(ValueVector* vectorToSlice, uint64_t offset, uint64_t numValues); }; -class FixedListVector { +class KUZU_API FixedListVector { public: template static void getAsValue(ValueVector* vector, std::vector>& children, diff --git a/src/include/function/table_functions.h b/src/include/function/table_functions.h index 5d0723b72ac..760df58acb4 100644 --- a/src/include/function/table_functions.h +++ b/src/include/function/table_functions.h @@ -64,14 +64,14 @@ struct TableFunctionInitInput { virtual ~TableFunctionInitInput() = default; }; -typedef std::unique_ptr (*table_func_bind_t)( - main::ClientContext* context, TableFuncBindInput* input); -typedef common::offset_t (*table_func_t)(TableFuncInput& input, TableFuncOutput& output); -typedef std::unique_ptr (*table_func_init_shared_t)( - TableFunctionInitInput& input); -typedef std::unique_ptr (*table_func_init_local_t)( - TableFunctionInitInput& input, TableFuncSharedState* state, storage::MemoryManager* mm); -typedef bool (*table_func_can_parallel_t)(); +using table_func_bind_t = std::function( + main::ClientContext*, function::TableFuncBindInput*)>; +using table_func_t = std::function; +using table_func_init_shared_t = + std::function(TableFunctionInitInput&)>; +using table_func_init_local_t = std::function( + TableFunctionInitInput&, TableFuncSharedState*, storage::MemoryManager*)>; +using table_func_can_parallel_t = std::function; struct TableFunction : public Function { table_func_t tableFunc; diff --git a/src/include/main/attached_database.h b/src/include/main/attached_database.h new file mode 100644 index 00000000000..aa4df24abb1 --- /dev/null +++ b/src/include/main/attached_database.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include "function/table_functions.h" + +namespace kuzu { +namespace main { + +class AttachedDatabase { + +public: + AttachedDatabase(std::string dbName, function::TableFunction scanFunction) + : dbName{std::move(dbName)}, scanFunction{std::move(scanFunction)} {} + + std::string getDBName() { return dbName; } + + function::TableFunction* getScanFunction() { return &scanFunction; } + +private: + std::string dbName; + function::TableFunction scanFunction; +}; + +} // namespace main +} // namespace kuzu diff --git a/src/include/main/database.h b/src/include/main/database.h index 455b0a09700..8efb8340015 100644 --- a/src/include/main/database.h +++ b/src/include/main/database.h @@ -5,6 +5,7 @@ #include #include "common/api.h" +#include "common/case_insensitive_map.h" #include "kuzu_fwd.h" namespace kuzu { @@ -13,6 +14,10 @@ class FileSystem; enum class LogicalTypeID : uint8_t; } // namespace common +namespace catalog { +class CatalogEntry; +} // namespace catalog + namespace function { struct Function; } // namespace function @@ -22,8 +27,13 @@ struct ExtensionUtils; struct ExtensionOptions; } // namespace extension +namespace storage { +class StorageExtension; +} // namespace storage + namespace main { struct ExtensionOption; +class DatabaseManager; /** * @brief Stores runtime configuration for creating or opening a Database @@ -96,11 +106,19 @@ class Database { KUZU_API void registerFileSystem(std::unique_ptr fs); + KUZU_API void registerStorageExtension( + std::string name, std::unique_ptr storageExtension); + KUZU_API void addExtensionOption( std::string name, common::LogicalTypeID type, common::Value defaultValue); ExtensionOption* getExtensionOption(std::string name); + common::case_insensitive_map_t>& + getStorageExtensions(); + + DatabaseManager* getDatabaseManagerUnsafe() const; + private: void openLockFile(); void initDBDirAndCoreFilesIfNecessary(); @@ -131,6 +149,8 @@ class Database { std::shared_ptr logger; std::unique_ptr lockFile; std::unique_ptr extensionOptions; + std::unique_ptr databaseManager; + common::case_insensitive_map_t> storageExtensions; }; } // namespace main diff --git a/src/include/main/database_manager.h b/src/include/main/database_manager.h new file mode 100644 index 00000000000..35be0a6738b --- /dev/null +++ b/src/include/main/database_manager.h @@ -0,0 +1,19 @@ +#pragma once + +#include "attached_database.h" + +namespace kuzu { +namespace main { + +class DatabaseManager { +public: + void registerAttachedDatabase(std::unique_ptr attachedDatabase); + AttachedDatabase* getAttachedDatabase(const std::string& name); + void detachDatabase(const std::string& databaseName); + +private: + std::vector> attachedDatabases; +}; + +} // namespace main +} // namespace kuzu diff --git a/src/include/parser/attach_database.h b/src/include/parser/attach_database.h new file mode 100644 index 00000000000..975c16dbb60 --- /dev/null +++ b/src/include/parser/attach_database.h @@ -0,0 +1,21 @@ +#pragma once + +#include "parsed_data/attach_info.h" +#include "parser/statement.h" + +namespace kuzu { +namespace parser { + +class AttachDatabase final : public Statement { +public: + explicit AttachDatabase(AttachInfo attachInfo) + : Statement{common::StatementType::ATTACH_DATABASE}, attachInfo{std::move(attachInfo)} {} + + AttachInfo getAttachInfo() const { return attachInfo; } + +private: + AttachInfo attachInfo; +}; + +} // namespace parser +} // namespace kuzu diff --git a/src/include/parser/detach_database.h b/src/include/parser/detach_database.h new file mode 100644 index 00000000000..5a9b4f6bbef --- /dev/null +++ b/src/include/parser/detach_database.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "parser/statement.h" + +namespace kuzu { +namespace parser { + +class DetachDatabase final : public Statement { +public: + explicit DetachDatabase(std::string dbName) + : Statement{common::StatementType::DETACH_DATABASE}, dbName{std::move(dbName)} {} + + std::string getDBName() const { return dbName; } + +private: + std::string dbName; +}; + +} // namespace parser +} // namespace kuzu diff --git a/src/include/parser/parsed_data/attach_info.h b/src/include/parser/parsed_data/attach_info.h new file mode 100644 index 00000000000..71dbb9c54fc --- /dev/null +++ b/src/include/parser/parsed_data/attach_info.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace kuzu { +namespace parser { + +struct AttachInfo { + std::string dbPath, dbAlias, dbType; +}; + +} // namespace parser +} // namespace kuzu diff --git a/src/include/parser/parsed_statement_visitor.h b/src/include/parser/parsed_statement_visitor.h index 76769561aee..73673d1609a 100644 --- a/src/include/parser/parsed_statement_visitor.h +++ b/src/include/parser/parsed_statement_visitor.h @@ -50,6 +50,8 @@ class StatementVisitor { virtual void visitExtension(const Statement& /*statement*/) {} virtual void visitExportDatabase(const Statement& /*statement*/) {} virtual void visitImportDatabase(const Statement& /*statement*/) {} + virtual void visitAttachDatabase(const Statement& /*statement*/) {} + virtual void visitDetachDatabase(const Statement& /*statement*/) {} // LCOV_EXCL_STOP }; diff --git a/src/include/parser/transformer.h b/src/include/parser/transformer.h index cde91c72d41..ce5ccd92522 100644 --- a/src/include/parser/transformer.h +++ b/src/include/parser/transformer.h @@ -219,6 +219,10 @@ class Transformer { // Transform comment on. std::unique_ptr transformCommentOn(CypherParser::KU_CommentOnContext& ctx); + // Transform attach/detach database. + std::unique_ptr transformAttachDatabase(CypherParser::KU_AttachDatabaseContext& ctx); + std::unique_ptr transformDetachDatabase(CypherParser::KU_DetachDatabaseContext& ctx); + private: CypherParser::Ku_StatementsContext& root; }; diff --git a/src/include/planner/operator/logical_attach_database.h b/src/include/planner/operator/logical_attach_database.h new file mode 100644 index 00000000000..971c8da1d51 --- /dev/null +++ b/src/include/planner/operator/logical_attach_database.h @@ -0,0 +1,31 @@ +#pragma once + +#include "parser/parsed_data/attach_info.h" +#include "planner/operator/logical_operator.h" + +namespace kuzu { +namespace planner { + +class LogicalAttachDatabase final : public LogicalOperator { +public: + explicit LogicalAttachDatabase(parser::AttachInfo attachInfo) + : LogicalOperator{LogicalOperatorType::ATTACH_DATABASE}, attachInfo{std::move(attachInfo)} { + } + + parser::AttachInfo getAttachInfo() const { return attachInfo; } + + std::string getExpressionsForPrinting() const override { return attachInfo.dbPath; } + + void computeFactorizedSchema() override { createEmptySchema(); } + void computeFlatSchema() override { createEmptySchema(); } + + std::unique_ptr copy() override { + return std::make_unique(attachInfo); + } + +private: + parser::AttachInfo attachInfo; +}; + +} // namespace planner +} // namespace kuzu diff --git a/src/include/planner/operator/logical_detach_database.h b/src/include/planner/operator/logical_detach_database.h new file mode 100644 index 00000000000..feaa712b4e5 --- /dev/null +++ b/src/include/planner/operator/logical_detach_database.h @@ -0,0 +1,29 @@ +#pragma once + +#include "planner/operator/logical_operator.h" + +namespace kuzu { +namespace planner { + +class LogicalDetachDatabase final : public LogicalOperator { +public: + explicit LogicalDetachDatabase(std::string dbName) + : LogicalOperator{LogicalOperatorType::DETACH_DATABASE}, dbName{std::move(dbName)} {} + + std::string getDBName() const { return dbName; } + + std::string getExpressionsForPrinting() const override { return dbName; } + + void computeFactorizedSchema() override { createEmptySchema(); } + void computeFlatSchema() override { createEmptySchema(); } + + std::unique_ptr copy() override { + return std::make_unique(dbName); + } + +private: + std::string dbName; +}; + +} // namespace planner +} // namespace kuzu diff --git a/src/include/planner/operator/logical_operator.h b/src/include/planner/operator/logical_operator.h index c6c1749c503..6bcbf104e64 100644 --- a/src/include/planner/operator/logical_operator.h +++ b/src/include/planner/operator/logical_operator.h @@ -9,6 +9,8 @@ enum class LogicalOperatorType : uint8_t { ACCUMULATE, AGGREGATE, ALTER, + ATTACH_DATABASE, + DETACH_DATABASE, COMMENT_ON, COPY_FROM, COPY_TO, diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index c18a60191de..3cd39fece6c 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -50,6 +50,8 @@ class Planner { void appendCreateMacro(const binder::BoundStatement& statement, LogicalPlan& plan); void appendTransaction(const binder::BoundStatement& statement, LogicalPlan& plan); void appendExtension(const binder::BoundStatement& statement, LogicalPlan& plan); + void appendAttachDatabase(const binder::BoundStatement& statement, LogicalPlan& plan); + void appendDetachDatabase(const binder::BoundStatement& statement, LogicalPlan& plan); // Plan copy. std::unique_ptr planCopyTo(const binder::BoundStatement& statement); @@ -63,7 +65,7 @@ class Planner { std::unique_ptr planCopyRdfFrom( const binder::BoundCopyFromInfo* info, binder::expression_vector outExprs); - // Plan export database + // Plan export/import database std::unique_ptr planExportDatabase(const binder::BoundStatement& statement); std::unique_ptr planImportDatabase(const binder::BoundStatement& statement); diff --git a/src/include/processor/operator/attach_database.h b/src/include/processor/operator/attach_database.h new file mode 100644 index 00000000000..70783998e95 --- /dev/null +++ b/src/include/processor/operator/attach_database.h @@ -0,0 +1,29 @@ +#pragma once + +#include "parser/parsed_data/attach_info.h" +#include "processor/operator/physical_operator.h" + +namespace kuzu { +namespace processor { + +class AttachDatabase final : public PhysicalOperator { +public: + AttachDatabase(parser::AttachInfo attachInfo, uint32_t id, const std::string& paramsString) + : PhysicalOperator{PhysicalOperatorType::ATTACH_DATABASE, id, paramsString}, + attachInfo{std::move(attachInfo)} {} + + bool isSource() const override { return true; } + bool canParallel() const override { return false; } + + bool getNextTuplesInternal(ExecutionContext* context) override; + + std::unique_ptr clone() override { + return std::make_unique(attachInfo, id, paramsString); + } + +private: + parser::AttachInfo attachInfo; +}; + +} // namespace processor +} // namespace kuzu diff --git a/src/include/processor/operator/ddl/ddl.h b/src/include/processor/operator/ddl/ddl.h index c715d345031..345d0af395e 100644 --- a/src/include/processor/operator/ddl/ddl.h +++ b/src/include/processor/operator/ddl/ddl.h @@ -13,8 +13,8 @@ class DDL : public PhysicalOperator { : PhysicalOperator{operatorType, id, paramsString}, catalog{catalog}, outputPos{outputPos}, outputVector{nullptr}, hasExecuted{false} {} - inline bool isSource() const final { return true; } - inline bool canParallel() const final { return false; } + bool isSource() const final { return true; } + bool canParallel() const final { return false; } void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; diff --git a/src/include/processor/operator/detach_database.h b/src/include/processor/operator/detach_database.h new file mode 100644 index 00000000000..f40304eab6b --- /dev/null +++ b/src/include/processor/operator/detach_database.h @@ -0,0 +1,28 @@ +#pragma once + +#include "processor/operator/physical_operator.h" + +namespace kuzu { +namespace processor { + +class DetachDatabase final : public PhysicalOperator { +public: + DetachDatabase(std::string dbName, uint32_t id, const std::string& paramsString) + : PhysicalOperator{PhysicalOperatorType::DETACH_DATABASE, id, paramsString}, + dbName{std::move(dbName)} {} + + bool isSource() const override { return true; } + bool canParallel() const override { return false; } + + bool getNextTuplesInternal(ExecutionContext* context) override; + + std::unique_ptr clone() override { + return std::make_unique(dbName, id, paramsString); + } + +private: + std::string dbName; +}; + +} // namespace processor +} // namespace kuzu diff --git a/src/include/processor/operator/install_extension.h b/src/include/processor/operator/install_extension.h index b08203c4e8e..af86c649180 100644 --- a/src/include/processor/operator/install_extension.h +++ b/src/include/processor/operator/install_extension.h @@ -11,12 +11,12 @@ class InstallExtension final : public PhysicalOperator { : PhysicalOperator{PhysicalOperatorType::INSTALL_EXTENSION, id, paramsString}, name{std::move(name)}, hasExecuted{false} {} - inline bool isSource() const override { return true; } - inline bool canParallel() const override { return false; } + bool isSource() const override { return true; } + bool canParallel() const override { return false; } bool getNextTuplesInternal(ExecutionContext* context) override; - inline std::unique_ptr clone() override { + std::unique_ptr clone() override { return std::make_unique(name, id, paramsString); } diff --git a/src/include/processor/operator/physical_operator.h b/src/include/processor/operator/physical_operator.h index 867230393d3..c63f92d8160 100644 --- a/src/include/processor/operator/physical_operator.h +++ b/src/include/processor/operator/physical_operator.h @@ -10,9 +10,11 @@ enum class PhysicalOperatorType : uint8_t { ADD_PROPERTY, AGGREGATE, AGGREGATE_SCAN, + ATTACH_DATABASE, BATCH_INSERT, COMMENT_ON, CREATE_MACRO, + DETACH_DATABASE, STANDALONE_CALL, IN_QUERY_CALL, COPY_RDF, diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index 1a35c769b26..7044677c126 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -106,6 +106,8 @@ class PlanMapper { std::unique_ptr mapExtension(planner::LogicalOperator* logicalOperator); std::unique_ptr mapExportDatabase(planner::LogicalOperator* logicalOperator); std::unique_ptr mapImportDatabase(planner::LogicalOperator* logicalOperator); + std::unique_ptr mapAttachDatabase(planner::LogicalOperator* logicalOperator); + std::unique_ptr mapDetachDatabase(planner::LogicalOperator* logicalOperator); std::unique_ptr createCopyRel( std::shared_ptr partitionerSharedState, diff --git a/src/include/storage/storage_extension.h b/src/include/storage/storage_extension.h new file mode 100644 index 00000000000..c9aa991cc05 --- /dev/null +++ b/src/include/storage/storage_extension.h @@ -0,0 +1,28 @@ +#pragma once + +#include "main/attached_database.h" + +namespace kuzu { +namespace storage { + +using attach_function_t = std::unique_ptr (*)( + std::string dbPath, std::string dbName); + +class StorageExtension { +public: + explicit StorageExtension(attach_function_t attachFunction) + : attachFunction{std::move(attachFunction)} {} + virtual bool canHandleDB(std::string /*dbType*/) const { return false; } + + std::unique_ptr attach(std::string dbPath, std::string dbName) const { + return attachFunction(dbPath, dbName); + } + + virtual ~StorageExtension() = default; + +private: + attach_function_t attachFunction; +}; + +} // namespace storage +} // namespace kuzu diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt index 5d9049d1433..20e628f67dc 100644 --- a/src/main/CMakeLists.txt +++ b/src/main/CMakeLists.txt @@ -3,6 +3,7 @@ add_library(kuzu_main client_context.cpp connection.cpp database.cpp + database_manager.cpp plan_printer.cpp prepared_statement.cpp query_result.cpp diff --git a/src/main/database.cpp b/src/main/database.cpp index 7a5bc110800..8aabd21cf40 100644 --- a/src/main/database.cpp +++ b/src/main/database.cpp @@ -1,5 +1,7 @@ #include "main/database.h" +#include "main/database_manager.h" + #if defined(_WIN32) #include #else @@ -15,6 +17,7 @@ #include "main/db_config.h" #include "processor/processor.h" #include "spdlog/spdlog.h" +#include "storage/storage_extension.h" #include "storage/storage_manager.h" #include "storage/wal_replayer.h" #include "transaction/transaction_action.h" @@ -87,6 +90,7 @@ Database::Database(std::string_view databasePath, SystemConfig systemConfig) transactionManager = std::make_unique(*wal, memoryManager.get()); extensionOptions = std::make_unique(); + databaseManager = std::make_unique(); } Database::~Database() { @@ -106,6 +110,11 @@ void Database::registerFileSystem(std::unique_ptr fs) { vfs->registerFileSystem(std::move(fs)); } +void Database::registerStorageExtension( + std::string name, std::unique_ptr storageExtension) { + storageExtensions.emplace(std::move(name), std::move(storageExtension)); +} + void Database::addExtensionOption( std::string name, common::LogicalTypeID type, common::Value defaultValue) { if (extensionOptions->getExtensionOption(name) != nullptr) { @@ -118,6 +127,15 @@ ExtensionOption* Database::getExtensionOption(std::string name) { return extensionOptions->getExtensionOption(std::move(name)); } +common::case_insensitive_map_t>& +Database::getStorageExtensions() { + return storageExtensions; +} + +DatabaseManager* Database::getDatabaseManagerUnsafe() const { + return databaseManager.get(); +} + void Database::openLockFile() { int flags; FileLockType lock; diff --git a/src/main/database_manager.cpp b/src/main/database_manager.cpp new file mode 100644 index 00000000000..9c290769dd9 --- /dev/null +++ b/src/main/database_manager.cpp @@ -0,0 +1,36 @@ +#include "main/database_manager.h" + +#include "common/string_utils.h" + +namespace kuzu { +namespace main { + +void DatabaseManager::registerAttachedDatabase(std::unique_ptr attachedDatabase) { + attachedDatabases.push_back(std::move(attachedDatabase)); +} + +AttachedDatabase* DatabaseManager::getAttachedDatabase(const std::string& name) { + for (auto& attachedDatabase : attachedDatabases) { + if (attachedDatabase->getDBName() == name) { + return attachedDatabase.get(); + } + } + return nullptr; +} + +void DatabaseManager::detachDatabase(const std::string& databaseName) { + auto upperCaseDBName = databaseName; + common::StringUtils::toUpper(upperCaseDBName); + for (auto it = attachedDatabases.begin(); it != attachedDatabases.end(); ++it) { + auto attachedDBName = (*it)->getDBName(); + common::StringUtils::toUpper(attachedDBName); + if (attachedDBName == upperCaseDBName) { + attachedDatabases.erase(it); + return; + } + } + KU_UNREACHABLE; +} + +} // namespace main +} // namespace kuzu diff --git a/src/parser/parsed_statement_visitor.cpp b/src/parser/parsed_statement_visitor.cpp index 55bbf52219c..957e843f5be 100644 --- a/src/parser/parsed_statement_visitor.cpp +++ b/src/parser/parsed_statement_visitor.cpp @@ -53,6 +53,12 @@ void StatementVisitor::visit(const Statement& statement) { case StatementType::IMPORT_DATABASE: { visitImportDatabase(statement); } break; + case StatementType::ATTACH_DATABASE: { + visitAttachDatabase(statement); + } break; + case StatementType::DETACH_DATABASE: { + visitDetachDatabase(statement); + } break; default: KU_UNREACHABLE; } diff --git a/src/parser/transform/CMakeLists.txt b/src/parser/transform/CMakeLists.txt index 5a98ccb7adc..e98fe0caa0f 100644 --- a/src/parser/transform/CMakeLists.txt +++ b/src/parser/transform/CMakeLists.txt @@ -13,7 +13,9 @@ add_library(kuzu_parser_transform transform_transaction.cpp transform_updating_clause.cpp transform_extension.cpp - transform_port_db.cpp) + transform_port_db.cpp + transform_attach_database.cpp + transform_detach_database.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/parser/transform/transform_attach_database.cpp b/src/parser/transform/transform_attach_database.cpp new file mode 100644 index 00000000000..c472b67ea0e --- /dev/null +++ b/src/parser/transform/transform_attach_database.cpp @@ -0,0 +1,20 @@ +#include "parser/attach_database.h" +#include "parser/transformer.h" + +namespace kuzu { +namespace parser { + +std::unique_ptr Transformer::transformAttachDatabase( + CypherParser::KU_AttachDatabaseContext& ctx) { + AttachInfo attachInfo; + attachInfo.dbPath = transformStringLiteral(*ctx.StringLiteral()[0]); + attachInfo.dbAlias = ""; + if (ctx.oC_SchemaName()) { + attachInfo.dbAlias = transformSchemaName(*ctx.oC_SchemaName()); + } + attachInfo.dbType = transformStringLiteral(*ctx.StringLiteral()[1]); + return std::make_unique(std::move(attachInfo)); +} + +} // namespace parser +} // namespace kuzu diff --git a/src/parser/transform/transform_detach_database.cpp b/src/parser/transform/transform_detach_database.cpp new file mode 100644 index 00000000000..5f375c71817 --- /dev/null +++ b/src/parser/transform/transform_detach_database.cpp @@ -0,0 +1,14 @@ +#include "parser/detach_database.h" +#include "parser/transformer.h" + +namespace kuzu { +namespace parser { + +std::unique_ptr Transformer::transformDetachDatabase( + CypherParser::KU_DetachDatabaseContext& ctx) { + auto dbName = transformSchemaName(*ctx.oC_SchemaName()); + return std::make_unique(std::move(dbName)); +} + +} // namespace parser +} // namespace kuzu diff --git a/src/parser/transformer.cpp b/src/parser/transformer.cpp index 3350df9853f..2d3d63a3648 100644 --- a/src/parser/transformer.cpp +++ b/src/parser/transformer.cpp @@ -52,6 +52,10 @@ std::unique_ptr Transformer::transformStatement(CypherParser::OC_Stat return transformExportDatabase(*ctx.kU_ExportDatabase()); } else if (ctx.kU_ImportDatabase()) { return transformImportDatabase(*ctx.kU_ImportDatabase()); + } else if (ctx.kU_AttachDatabase()) { + return transformAttachDatabase(*ctx.kU_AttachDatabase()); + } else if (ctx.kU_DetachDatabase()) { + return transformDetachDatabase(*ctx.kU_DetachDatabase()); } else { KU_UNREACHABLE; } diff --git a/src/planner/plan/append_comment_on.cpp b/src/planner/plan/append_comment_on.cpp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/planner/plan/append_simple.cpp b/src/planner/plan/append_simple.cpp index cfff08a68e7..7873e1e9fc7 100644 --- a/src/planner/plan/append_simple.cpp +++ b/src/planner/plan/append_simple.cpp @@ -1,5 +1,7 @@ +#include "binder/bound_attach_database.h" #include "binder/bound_comment_on.h" #include "binder/bound_create_macro.h" +#include "binder/bound_detach_database.h" #include "binder/bound_explain.h" #include "binder/bound_extension_statement.h" #include "binder/bound_standalone_call.h" @@ -11,8 +13,10 @@ #include "planner/operator/ddl/logical_alter.h" #include "planner/operator/ddl/logical_create_table.h" #include "planner/operator/ddl/logical_drop_table.h" +#include "planner/operator/logical_attach_database.h" #include "planner/operator/logical_comment_on.h" #include "planner/operator/logical_create_macro.h" +#include "planner/operator/logical_detach_database.h" #include "planner/operator/logical_explain.h" #include "planner/operator/logical_extension.h" #include "planner/operator/logical_standalone_call.h" @@ -96,5 +100,22 @@ void Planner::appendExtension(const BoundStatement& statement, LogicalPlan& plan plan.setLastOperator(std::move(op)); } +void Planner::appendAttachDatabase(const BoundStatement& statement, LogicalPlan& plan) { + auto& boundAttachDatabase = + common::ku_dynamic_cast( + statement); + auto attachDatabase = + std::make_shared(boundAttachDatabase.getAttachInfo()); + plan.setLastOperator(std::move(attachDatabase)); +} + +void Planner::appendDetachDatabase(const BoundStatement& statement, LogicalPlan& plan) { + auto& boundDetachDatabase = + common::ku_dynamic_cast( + statement); + auto detachDatabase = std::make_shared(boundDetachDatabase.getDBName()); + plan.setLastOperator(std::move(detachDatabase)); +} + } // namespace planner } // namespace kuzu diff --git a/src/planner/planner.cpp b/src/planner/planner.cpp index 087bd331d8b..f3c36b237be 100644 --- a/src/planner/planner.cpp +++ b/src/planner/planner.cpp @@ -63,6 +63,12 @@ std::unique_ptr Planner::getBestPlan(const BoundStatement& statemen case StatementType::IMPORT_DATABASE: { plan = planImportDatabase(statement); } break; + case StatementType::ATTACH_DATABASE: { + appendAttachDatabase(statement, *plan); + } break; + case StatementType::DETACH_DATABASE: { + appendDetachDatabase(statement, *plan); + } break; default: KU_UNREACHABLE; } diff --git a/src/processor/map/CMakeLists.txt b/src/processor/map/CMakeLists.txt index 29cfa681293..8df4e48f0f3 100644 --- a/src/processor/map/CMakeLists.txt +++ b/src/processor/map/CMakeLists.txt @@ -7,6 +7,8 @@ add_library(kuzu_processor_mapper map_accumulate.cpp map_aggregate.cpp map_acc_hash_join.cpp + map_attach_database.cpp + map_detach_database.cpp map_standalone_call.cpp map_in_query_call.cpp map_comment_on.cpp diff --git a/src/processor/map/map_attach_database.cpp b/src/processor/map/map_attach_database.cpp new file mode 100644 index 00000000000..c8dbd5d1c16 --- /dev/null +++ b/src/processor/map/map_attach_database.cpp @@ -0,0 +1,19 @@ +#include "planner/operator/logical_attach_database.h" +#include "processor/operator/attach_database.h" +#include "processor/plan_mapper.h" + +namespace kuzu { +namespace processor { + +using namespace kuzu::planner; + +std::unique_ptr PlanMapper::mapAttachDatabase( + planner::LogicalOperator* logicalOperator) { + auto attachDatabase = + common::ku_dynamic_cast(logicalOperator); + return std::make_unique(attachDatabase->getAttachInfo(), getOperatorID(), + attachDatabase->getExpressionsForPrinting()); +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/map/map_detach_database.cpp b/src/processor/map/map_detach_database.cpp new file mode 100644 index 00000000000..84e331811ad --- /dev/null +++ b/src/processor/map/map_detach_database.cpp @@ -0,0 +1,19 @@ +#include "planner/operator/logical_detach_database.h" +#include "processor/operator/detach_database.h" +#include "processor/plan_mapper.h" + +namespace kuzu { +namespace processor { + +using namespace kuzu::planner; + +std::unique_ptr PlanMapper::mapDetachDatabase( + planner::LogicalOperator* logicalOperator) { + auto detachDatabase = + common::ku_dynamic_cast(logicalOperator); + return std::make_unique( + detachDatabase->getDBName(), getOperatorID(), detachDatabase->getExpressionsForPrinting()); +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/map/plan_mapper.cpp b/src/processor/map/plan_mapper.cpp index 5167a1636db..fa978480494 100644 --- a/src/processor/map/plan_mapper.cpp +++ b/src/processor/map/plan_mapper.cpp @@ -174,6 +174,12 @@ std::unique_ptr PlanMapper::mapOperator(LogicalOperator* logic case LogicalOperatorType::IMPORT_DATABASE: { physicalOperator = mapImportDatabase(logicalOperator); } break; + case LogicalOperatorType::ATTACH_DATABASE: { + physicalOperator = mapAttachDatabase(logicalOperator); + } break; + case LogicalOperatorType::DETACH_DATABASE: { + physicalOperator = mapDetachDatabase(logicalOperator); + } break; default: KU_UNREACHABLE; } diff --git a/src/processor/operator/CMakeLists.txt b/src/processor/operator/CMakeLists.txt index 992e9375184..4fd828a49d6 100644 --- a/src/processor/operator/CMakeLists.txt +++ b/src/processor/operator/CMakeLists.txt @@ -12,6 +12,8 @@ add_subdirectory(macro) add_library(kuzu_processor_operator OBJECT + attach_database.cpp + detach_database.cpp comment_on.cpp cross_product.cpp empty_result.cpp diff --git a/src/processor/operator/attach_database.cpp b/src/processor/operator/attach_database.cpp new file mode 100644 index 00000000000..507d3513acc --- /dev/null +++ b/src/processor/operator/attach_database.cpp @@ -0,0 +1,24 @@ +#include "processor/operator/attach_database.h" + +#include "main/database.h" +#include "main/database_manager.h" +#include "storage/storage_extension.h" + +namespace kuzu { +namespace processor { + +bool AttachDatabase::getNextTuplesInternal(kuzu::processor::ExecutionContext* context) { + for (auto& [name, storageExtension] : + context->clientContext->getDatabase()->getStorageExtensions()) { + if (storageExtension->canHandleDB(attachInfo.dbType)) { + auto db = storageExtension->attach(attachInfo.dbAlias, attachInfo.dbPath); + context->clientContext->getDatabase() + ->getDatabaseManagerUnsafe() + ->registerAttachedDatabase(std::move(db)); + } + } + return false; +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/operator/detach_database.cpp b/src/processor/operator/detach_database.cpp new file mode 100644 index 00000000000..c9c23041763 --- /dev/null +++ b/src/processor/operator/detach_database.cpp @@ -0,0 +1,16 @@ +#include "processor/operator/detach_database.h" + +#include "main/database.h" +#include "main/database_manager.h" + +namespace kuzu { +namespace processor { + +bool DetachDatabase::getNextTuplesInternal(kuzu::processor::ExecutionContext* context) { + auto dbManager = context->clientContext->getDatabase()->getDatabaseManagerUnsafe(); + dbManager->detachDatabase(dbName); + return false; +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/operator/physical_operator.cpp b/src/processor/operator/physical_operator.cpp index 237b32e479d..14a82e47852 100644 --- a/src/processor/operator/physical_operator.cpp +++ b/src/processor/operator/physical_operator.cpp @@ -15,6 +15,8 @@ std::string PhysicalOperatorUtils::operatorTypeToString(PhysicalOperatorType ope return "AGGREGATE"; case PhysicalOperatorType::AGGREGATE_SCAN: return "AGGREGATE_SCAN"; + case PhysicalOperatorType::ATTACH_DATABASE: + return "ATTACH_DATABASE"; case PhysicalOperatorType::BATCH_INSERT: return "BATCH_INSERT"; case PhysicalOperatorType::STANDALONE_CALL: @@ -25,6 +27,8 @@ std::string PhysicalOperatorUtils::operatorTypeToString(PhysicalOperatorType ope return "COPY_RDF"; case PhysicalOperatorType::CREATE_MACRO: return "CREATE_MACRO"; + case PhysicalOperatorType::DETACH_DATABASE: + return "DETACH_DATABASE"; case PhysicalOperatorType::READER: return "READER"; case PhysicalOperatorType::INSERT: diff --git a/third_party/antlr4_cypher/cypher_lexer.cpp b/third_party/antlr4_cypher/cypher_lexer.cpp index e3339bddb60..be35a83528e 100644 --- a/third_party/antlr4_cypher/cypher_lexer.cpp +++ b/third_party/antlr4_cypher/cypher_lexer.cpp @@ -62,11 +62,11 @@ void cypherlexerLexerInitialize() { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", - "T__41", "T__42", "T__43", "T__44", "CALL", "COMMENT_", "MACRO", "GLOB", - "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", "NODE", - "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", "RENAME", - "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", "BEGIN", - "TRANSACTION", "READ", "ONLY", "WRITE", "COMMIT", "COMMIT_SKIP_CHECKPOINT", + "T__41", "T__42", "T__43", "T__44", "ATTACH", "DBTYPE", "CALL", "COMMENT_", + "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", + "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", + "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", + "BEGIN", "TRANSACTION", "READ", "ONLY", "WRITE", "COMMIT", "COMMIT_SKIP_CHECKPOINT", "ROLLBACK", "ROLLBACK_SKIP_CHECKPOINT", "INSTALL", "EXTENSION", "UNION", "ALL", "LOAD", "HEADERS", "OPTIONAL", "MATCH", "UNWIND", "CREATE", "MERGE", "ON", "SET", "DETACH", "DELETE", "WITH", "RETURN", "DISTINCT", @@ -99,34 +99,34 @@ void cypherlexerLexerInitialize() { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "'*'", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "'!='", "'-'", "'!'", "':'", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'0'" + "", "", "", "'*'", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "'!='", "'-'", "'!'", "':'", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'0'" }, std::vector{ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "", "", "CALL", "COMMENT_", - "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", - "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", - "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", - "BEGIN", "TRANSACTION", "READ", "ONLY", "WRITE", "COMMIT", "COMMIT_SKIP_CHECKPOINT", - "ROLLBACK", "ROLLBACK_SKIP_CHECKPOINT", "INSTALL", "EXTENSION", "UNION", - "ALL", "LOAD", "HEADERS", "OPTIONAL", "MATCH", "UNWIND", "CREATE", - "MERGE", "ON", "SET", "DETACH", "DELETE", "WITH", "RETURN", "DISTINCT", - "STAR", "AS", "ORDER", "BY", "L_SKIP", "LIMIT", "ASCENDING", "ASC", - "DESCENDING", "DESC", "WHERE", "SHORTEST", "OR", "XOR", "AND", "NOT", - "INVALID_NOT_EQUAL", "MINUS", "FACTORIAL", "COLON", "IN", "STARTS", - "ENDS", "CONTAINS", "IS", "NULL_", "TRUE", "FALSE", "COUNT", "EXISTS", - "CASE", "ELSE", "END", "WHEN", "THEN", "StringLiteral", "EscapedChar", - "DecimalInteger", "HexLetter", "HexDigit", "Digit", "NonZeroDigit", - "NonZeroOctDigit", "ZeroDigit", "RegularDecimalReal", "UnescapedSymbolicName", - "IdentifierStart", "IdentifierPart", "EscapedSymbolicName", "SP", - "WHITESPACE", "Comment", "Unknown" + "", "", "", "", "", "", "", "", "", "", "", "", "ATTACH", "DBTYPE", + "CALL", "COMMENT_", "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", + "IMPORT", "DATABASE", "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", + "ALTER", "DEFAULT", "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", + "EXPLAIN", "PROFILE", "BEGIN", "TRANSACTION", "READ", "ONLY", "WRITE", + "COMMIT", "COMMIT_SKIP_CHECKPOINT", "ROLLBACK", "ROLLBACK_SKIP_CHECKPOINT", + "INSTALL", "EXTENSION", "UNION", "ALL", "LOAD", "HEADERS", "OPTIONAL", + "MATCH", "UNWIND", "CREATE", "MERGE", "ON", "SET", "DETACH", "DELETE", + "WITH", "RETURN", "DISTINCT", "STAR", "AS", "ORDER", "BY", "L_SKIP", + "LIMIT", "ASCENDING", "ASC", "DESCENDING", "DESC", "WHERE", "SHORTEST", + "OR", "XOR", "AND", "NOT", "INVALID_NOT_EQUAL", "MINUS", "FACTORIAL", + "COLON", "IN", "STARTS", "ENDS", "CONTAINS", "IS", "NULL_", "TRUE", + "FALSE", "COUNT", "EXISTS", "CASE", "ELSE", "END", "WHEN", "THEN", + "StringLiteral", "EscapedChar", "DecimalInteger", "HexLetter", "HexDigit", + "Digit", "NonZeroDigit", "NonZeroOctDigit", "ZeroDigit", "RegularDecimalReal", + "UnescapedSymbolicName", "IdentifierStart", "IdentifierPart", "EscapedSymbolicName", + "SP", "WHITESPACE", "Comment", "Unknown" } ); static const int32_t serializedATNSegment[] = { - 4,0,150,1183,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,0,152,1201,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2, 14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2, 21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2, @@ -151,619 +151,625 @@ void cypherlexerLexerInitialize() { 7,146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,2,152, 7,152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157,7,157,2,158, 7,158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162,2,163,7,163,2,164, - 7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,2,169,7,169,1,0, - 1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,7,1,7,1,8,1,8,1, - 9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,13,1,13,1,13,1,14,1,14, - 1,15,1,15,1,15,1,16,1,16,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,20, - 1,20,1,21,1,21,1,22,1,22,1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,26,1,26, - 1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,32,1,32,1,33,1,33, - 1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1,38,1,39,1,39,1,40,1,40, - 1,41,1,41,1,42,1,42,1,43,1,43,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,46, - 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,48, - 1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50, - 1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54, - 1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57, - 1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61, - 1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63, - 1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65, - 1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68, - 1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70, - 1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72, - 1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74, - 1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76, - 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76, - 1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78, - 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78, - 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79, - 1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81, - 1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83, - 1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,85, - 1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87, - 1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89, - 1,89,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92, - 1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95, - 1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96, - 1,96,1,97,1,97,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,100,1,100, - 1,100,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,102, - 1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,104,1,104, - 1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, - 1,105,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107, - 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109, - 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112, - 1,113,1,113,1,113,1,114,1,114,1,115,1,115,1,116,1,116,1,117,1,117,1,117, - 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119, - 1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,121, - 1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124, - 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126, - 1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,128,1,128, - 1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130, - 1,131,1,131,1,131,1,131,1,131,1,132,1,132,1,132,5,132,987,8,132,10,132, - 12,132,990,9,132,1,132,1,132,1,132,1,132,5,132,996,8,132,10,132,12,132, - 999,9,132,1,132,3,132,1002,8,132,1,133,1,133,1,133,1,133,1,133,1,133, - 1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133, - 3,133,1022,8,133,1,134,1,134,1,134,5,134,1027,8,134,10,134,12,134,1030, - 9,134,3,134,1032,8,134,1,135,3,135,1035,8,135,1,136,1,136,3,136,1039, - 8,136,1,137,1,137,3,137,1043,8,137,1,138,1,138,3,138,1047,8,138,1,139, - 1,139,1,140,1,140,1,141,5,141,1054,8,141,10,141,12,141,1057,9,141,1,141, - 1,141,4,141,1061,8,141,11,141,12,141,1062,1,142,1,142,5,142,1067,8,142, - 10,142,12,142,1070,9,142,1,143,1,143,3,143,1074,8,143,1,144,1,144,3,144, - 1078,8,144,1,145,1,145,5,145,1082,8,145,10,145,12,145,1085,9,145,1,145, - 4,145,1088,8,145,11,145,12,145,1089,1,146,4,146,1093,8,146,11,146,12, - 146,1094,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147, - 1,147,1,147,3,147,1109,8,147,1,148,1,148,1,148,1,148,1,148,1,148,5,148, - 1117,8,148,10,148,12,148,1120,9,148,1,148,1,148,1,148,1,148,1,148,1,148, - 5,148,1128,8,148,10,148,12,148,1131,9,148,1,148,3,148,1134,8,148,1,148, - 1,148,3,148,1138,8,148,3,148,1140,8,148,1,149,1,149,1,150,1,150,1,151, - 1,151,1,152,1,152,1,153,1,153,1,154,1,154,1,155,1,155,1,156,1,156,1,157, - 1,157,1,158,1,158,1,159,1,159,1,160,1,160,1,161,1,161,1,162,1,162,1,163, - 1,163,1,164,1,164,1,165,1,165,1,166,1,166,1,167,1,167,1,168,1,168,1,169, - 1,169,0,0,170,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23, - 12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, - 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69, - 35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, - 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113, - 57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133, - 67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153, - 77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173, - 87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193, - 97,195,98,197,99,199,100,201,101,203,102,205,103,207,104,209,105,211, - 106,213,107,215,108,217,109,219,110,221,111,223,112,225,113,227,114,229, - 115,231,116,233,117,235,118,237,119,239,120,241,121,243,122,245,123,247, - 124,249,125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265, - 133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281,141,283, - 142,285,143,287,144,289,145,291,146,293,147,295,148,297,149,299,0,301, - 0,303,0,305,0,307,0,309,0,311,0,313,0,315,0,317,0,319,0,321,0,323,0,325, - 0,327,0,329,0,331,0,333,0,335,0,337,0,339,150,1,0,45,2,0,67,67,99,99, - 2,0,65,65,97,97,2,0,76,76,108,108,2,0,79,79,111,111,2,0,77,77,109,109, - 2,0,69,69,101,101,2,0,78,78,110,110,2,0,84,84,116,116,2,0,82,82,114,114, - 2,0,71,71,103,103,2,0,66,66,98,98,2,0,80,80,112,112,2,0,89,89,121,121, - 2,0,70,70,102,102,2,0,85,85,117,117,2,0,88,88,120,120,2,0,73,73,105,105, - 2,0,68,68,100,100,2,0,83,83,115,115,2,0,72,72,104,104,2,0,75,75,107,107, - 2,0,87,87,119,119,13,0,34,34,39,39,66,66,70,70,78,78,82,82,84,84,92,92, - 98,98,102,102,110,110,114,114,116,116,2,0,65,70,97,102,8,0,160,160,5760, - 5760,6158,6158,8192,8202,8232,8233,8239,8239,8287,8287,12288,12288,1, - 0,12,12,1,0,96,96,1,0,30,30,768,0,48,57,65,90,95,95,97,122,170,170,181, - 181,183,183,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750, - 750,768,884,886,887,890,893,895,895,902,906,908,908,910,929,931,1013, - 1015,1153,1155,1159,1162,1327,1329,1366,1369,1369,1376,1416,1425,1469, - 1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1519,1522,1552,1562, - 1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866, - 1869,1969,1984,2037,2042,2042,2045,2045,2048,2093,2112,2139,2144,2154, - 2160,2183,2185,2190,2200,2273,2275,2403,2406,2415,2417,2435,2437,2444, - 2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504, - 2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2556,2556,2558,2558, - 2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614, - 2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652, - 2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736, - 2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787, - 2790,2799,2809,2815,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864, - 2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2901,2903,2908,2909, - 2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965, - 2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010, - 3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3072,3084,3086,3088, - 3090,3112,3114,3129,3132,3140,3142,3144,3146,3149,3157,3158,3160,3162, - 3165,3165,3168,3171,3174,3183,3200,3203,3205,3212,3214,3216,3218,3240, - 3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3293,3294, - 3296,3299,3302,3311,3313,3315,3328,3340,3342,3344,3346,3396,3398,3400, - 3402,3406,3412,3415,3423,3427,3430,3439,3450,3455,3457,3459,3461,3478, - 3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542, - 3544,3551,3558,3567,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714, - 3716,3716,3718,3722,3724,3747,3749,3749,3751,3773,3776,3780,3782,3782, - 3784,3790,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893, - 3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028, - 4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346, - 4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749, - 4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880, - 4882,4885,4888,4954,4957,4959,4969,4977,4992,5007,5024,5109,5112,5117, - 5121,5740,5743,5759,5761,5786,5792,5866,5870,5880,5888,5909,5919,5940, - 5952,5971,5984,5996,5998,6000,6002,6003,6016,6099,6103,6103,6108,6109, - 6112,6121,6155,6157,6159,6169,6176,6264,6272,6314,6320,6389,6400,6430, - 6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6618, - 6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6832,6845, - 6847,6862,6912,6988,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241, - 7245,7293,7296,7304,7312,7354,7357,7359,7376,7378,7380,7418,7424,7957, - 7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029, - 8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147, - 8150,8155,8160,8172,8178,8180,8182,8188,8255,8256,8276,8276,8305,8305, - 8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455, - 8458,8467,8469,8469,8472,8477,8484,8484,8486,8486,8488,8488,8490,8505, - 8508,8511,8517,8521,8526,8526,8544,8584,11264,11492,11499,11507,11520, - 11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680, - 11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728, - 11734,11736,11742,11744,11775,12293,12295,12321,12335,12337,12341,12344, - 12348,12353,12438,12441,12447,12449,12538,12540,12543,12549,12591,12593, - 12686,12704,12735,12784,12799,13312,19903,19968,42124,42192,42237,42240, - 42508,42512,42539,42560,42607,42612,42621,42623,42737,42775,42783,42786, - 42888,42891,42954,42960,42961,42963,42963,42965,42969,42994,43047,43052, - 43052,43072,43123,43136,43205,43216,43225,43232,43255,43259,43259,43261, - 43309,43312,43347,43360,43388,43392,43456,43471,43481,43488,43518,43520, - 43574,43584,43597,43600,43609,43616,43638,43642,43714,43739,43741,43744, - 43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816, - 43822,43824,43866,43868,43881,43888,44010,44012,44013,44016,44025,44032, - 55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275, - 64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323, - 64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024, - 65039,65056,65071,65075,65076,65101,65103,65136,65140,65142,65276,65296, - 65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482, - 65487,65490,65495,65498,65500,65536,65547,65549,65574,65576,65594,65596, - 65597,65599,65613,65616,65629,65664,65786,65856,65908,66045,66045,66176, - 66204,66208,66256,66272,66272,66304,66335,66349,66378,66384,66426,66432, - 66461,66464,66499,66504,66511,66513,66517,66560,66717,66720,66729,66736, - 66771,66776,66811,66816,66855,66864,66915,66928,66938,66940,66954,66956, - 66962,66964,66965,66967,66977,66979,66993,66995,67001,67003,67004,67072, - 67382,67392,67413,67424,67431,67456,67461,67463,67504,67506,67514,67584, - 67589,67592,67592,67594,67637,67639,67640,67644,67644,67647,67669,67680, - 67702,67712,67742,67808,67826,67828,67829,67840,67861,67872,67897,67968, - 68023,68030,68031,68096,68099,68101,68102,68108,68115,68117,68119,68121, - 68149,68152,68154,68159,68159,68192,68220,68224,68252,68288,68295,68297, - 68326,68352,68405,68416,68437,68448,68466,68480,68497,68608,68680,68736, - 68786,68800,68850,68864,68903,68912,68921,69248,69289,69291,69292,69296, - 69297,69373,69404,69415,69415,69424,69456,69488,69509,69552,69572,69600, - 69622,69632,69702,69734,69749,69759,69818,69826,69826,69840,69864,69872, - 69881,69888,69940,69942,69951,69956,69959,69968,70003,70006,70006,70016, - 70084,70089,70092,70094,70106,70108,70108,70144,70161,70163,70199,70206, - 70209,70272,70278,70280,70280,70282,70285,70287,70301,70303,70312,70320, - 70378,70384,70393,70400,70403,70405,70412,70415,70416,70419,70440,70442, - 70448,70450,70451,70453,70457,70459,70468,70471,70472,70475,70477,70480, - 70480,70487,70487,70493,70499,70502,70508,70512,70516,70656,70730,70736, - 70745,70750,70753,70784,70853,70855,70855,70864,70873,71040,71093,71096, - 71104,71128,71133,71168,71232,71236,71236,71248,71257,71296,71352,71360, - 71369,71424,71450,71453,71467,71472,71481,71488,71494,71680,71738,71840, - 71913,71935,71942,71945,71945,71948,71955,71957,71958,71960,71989,71991, - 71992,71995,72003,72016,72025,72096,72103,72106,72151,72154,72161,72163, - 72164,72192,72254,72263,72263,72272,72345,72349,72349,72368,72440,72704, - 72712,72714,72758,72760,72768,72784,72793,72818,72847,72850,72871,72873, - 72886,72960,72966,72968,72969,72971,73014,73018,73018,73020,73021,73023, - 73031,73040,73049,73056,73061,73063,73064,73066,73102,73104,73105,73107, - 73112,73120,73129,73440,73462,73472,73488,73490,73530,73534,73538,73552, - 73561,73648,73648,73728,74649,74752,74862,74880,75075,77712,77808,77824, - 78895,78912,78933,82944,83526,92160,92728,92736,92766,92768,92777,92784, - 92862,92864,92873,92880,92909,92912,92916,92928,92982,92992,92995,93008, - 93017,93027,93047,93053,93071,93760,93823,93952,94026,94031,94087,94095, - 94111,94176,94177,94179,94180,94192,94193,94208,100343,100352,101589, - 101632,101640,110576,110579,110581,110587,110589,110590,110592,110882, - 110898,110898,110928,110930,110933,110933,110948,110951,110960,111355, - 113664,113770,113776,113788,113792,113800,113808,113817,113821,113822, - 118528,118573,118576,118598,119141,119145,119149,119154,119163,119170, - 119173,119179,119210,119213,119362,119364,119808,119892,119894,119964, - 119966,119967,119970,119970,119973,119974,119977,119980,119982,119993, - 119995,119995,119997,120003,120005,120069,120071,120074,120077,120084, - 120086,120092,120094,120121,120123,120126,120128,120132,120134,120134, - 120138,120144,120146,120485,120488,120512,120514,120538,120540,120570, - 120572,120596,120598,120628,120630,120654,120656,120686,120688,120712, - 120714,120744,120746,120770,120772,120779,120782,120831,121344,121398, - 121403,121452,121461,121461,121476,121476,121499,121503,121505,121519, - 122624,122654,122661,122666,122880,122886,122888,122904,122907,122913, - 122915,122916,122918,122922,122928,122989,123023,123023,123136,123180, - 123184,123197,123200,123209,123214,123214,123536,123566,123584,123641, - 124112,124153,124896,124902,124904,124907,124909,124910,124912,124926, - 124928,125124,125136,125142,125184,125259,125264,125273,126464,126467, - 126469,126495,126497,126498,126500,126500,126503,126503,126505,126514, - 126516,126519,126521,126521,126523,126523,126530,126530,126535,126535, - 126537,126537,126539,126539,126541,126543,126545,126546,126548,126548, - 126551,126551,126553,126553,126555,126555,126557,126557,126559,126559, - 126561,126562,126564,126564,126567,126570,126572,126578,126580,126583, - 126585,126588,126590,126590,126592,126601,126603,126619,126625,126627, - 126629,126633,126635,126651,130032,130041,131072,173791,173824,177977, - 177984,178205,178208,183969,183984,191456,194560,195101,196608,201546, - 201552,205743,917760,917999,1,0,42,42,2,0,39,39,92,92,2,0,10,10,13,13, - 1,0,47,47,1,0,29,29,1,0,28,28,1,0,13,13,21,0,36,36,162,165,1423,1423, - 1547,1547,2046,2047,2546,2547,2555,2555,2801,2801,3065,3065,3647,3647, - 6107,6107,8352,8384,43064,43064,65020,65020,65129,65129,65284,65284,65504, - 65505,65509,65510,73693,73696,123647,123647,126128,126128,1,0,32,32,6, - 0,95,95,8255,8256,8276,8276,65075,65076,65101,65103,65343,65343,1,0,9, - 9,2,0,34,34,92,92,1,0,10,10,1,0,11,11,1,0,31,31,659,0,65,90,97,122,170, - 170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750, - 750,880,884,886,887,890,893,895,895,902,902,904,906,908,908,910,929,931, - 1013,1015,1153,1162,1327,1329,1366,1369,1369,1376,1416,1488,1514,1519, - 1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786, - 1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036, - 2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2144, - 2154,2160,2183,2185,2190,2208,2249,2308,2361,2365,2365,2384,2384,2392, - 2401,2417,2432,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486, - 2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2556,2556,2565, - 2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649, - 2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738, - 2739,2741,2745,2749,2749,2768,2768,2784,2785,2809,2809,2821,2828,2831, - 2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911, - 2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972, - 2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086, - 3088,3090,3112,3114,3129,3133,3133,3160,3162,3165,3165,3168,3169,3200, - 3200,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3293, - 3294,3296,3297,3313,3314,3332,3340,3342,3344,3346,3386,3389,3389,3406, - 3406,3412,3414,3423,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517, - 3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3718, - 3722,3724,3747,3749,3749,3751,3760,3762,3763,3773,3773,3776,3780,3782, - 3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159, - 4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238, - 4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688, - 4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792, - 4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992, - 5007,5024,5109,5112,5117,5121,5740,5743,5759,5761,5786,5792,5866,5870, - 5880,5888,5905,5919,5937,5952,5969,5984,5996,5998,6000,6016,6067,6103, - 6103,6108,6108,6176,6264,6272,6312,6314,6314,6320,6389,6400,6430,6480, - 6509,6512,6516,6528,6571,6576,6601,6656,6678,6688,6740,6823,6823,6917, - 6963,6981,6988,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258, - 7293,7296,7304,7312,7354,7357,7359,7401,7404,7406,7411,7413,7414,7418, - 7418,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025, - 8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130, - 8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305, - 8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8472, - 8477,8484,8484,8486,8486,8488,8488,8490,8505,8508,8511,8517,8521,8526, - 8526,8544,8584,11264,11492,11499,11502,11506,11507,11520,11557,11559, - 11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688, - 11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736, - 11742,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12443, + 7,164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,2,169,7,169,2,170, + 7,170,2,171,7,171,1,0,1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6, + 1,6,1,7,1,7,1,8,1,8,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1, + 13,1,13,1,13,1,14,1,14,1,15,1,15,1,15,1,16,1,16,1,17,1,17,1,17,1,18,1, + 18,1,18,1,19,1,19,1,20,1,20,1,21,1,21,1,22,1,22,1,23,1,23,1,23,1,24,1, + 24,1,25,1,25,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1, + 31,1,32,1,32,1,33,1,33,1,34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1, + 38,1,39,1,39,1,40,1,40,1,41,1,41,1,42,1,42,1,43,1,43,1,44,1,44,1,45,1, + 45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1, + 47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1, + 49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1, + 52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1, + 54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1, + 56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1, + 58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1, + 62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1, + 64,1,64,1,64,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1, + 70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1, + 72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1, + 76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1, + 78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1, + 78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1, + 79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1, + 80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1, + 81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1, + 82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1, + 85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1, + 87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1, + 89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1, + 91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1, + 94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1, + 96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1, + 98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,100,1,100,1,100,1,101,1,101,1, + 101,1,101,1,101,1,101,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103, + 1,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105, + 1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,108, + 1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110, + 1,110,1,110,1,110,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,113,1,113, + 1,113,1,113,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,116,1,116,1,117, + 1,117,1,118,1,118,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120, + 1,120,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122, + 1,122,1,122,1,122,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,125, + 1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,126,1,126,1,127,1,127, + 1,127,1,127,1,127,1,127,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,129, + 1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131, + 1,131,1,132,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,134, + 1,134,1,134,5,134,1005,8,134,10,134,12,134,1008,9,134,1,134,1,134,1,134, + 1,134,5,134,1014,8,134,10,134,12,134,1017,9,134,1,134,3,134,1020,8,134, + 1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135, + 1,135,1,135,1,135,1,135,1,135,1,135,3,135,1040,8,135,1,136,1,136,1,136, + 5,136,1045,8,136,10,136,12,136,1048,9,136,3,136,1050,8,136,1,137,3,137, + 1053,8,137,1,138,1,138,3,138,1057,8,138,1,139,1,139,3,139,1061,8,139, + 1,140,1,140,3,140,1065,8,140,1,141,1,141,1,142,1,142,1,143,5,143,1072, + 8,143,10,143,12,143,1075,9,143,1,143,1,143,4,143,1079,8,143,11,143,12, + 143,1080,1,144,1,144,5,144,1085,8,144,10,144,12,144,1088,9,144,1,145, + 1,145,3,145,1092,8,145,1,146,1,146,3,146,1096,8,146,1,147,1,147,5,147, + 1100,8,147,10,147,12,147,1103,9,147,1,147,4,147,1106,8,147,11,147,12, + 147,1107,1,148,4,148,1111,8,148,11,148,12,148,1112,1,149,1,149,1,149, + 1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,1,149,3,149,1127,8,149, + 1,150,1,150,1,150,1,150,1,150,1,150,5,150,1135,8,150,10,150,12,150,1138, + 9,150,1,150,1,150,1,150,1,150,1,150,1,150,5,150,1146,8,150,10,150,12, + 150,1149,9,150,1,150,3,150,1152,8,150,1,150,1,150,3,150,1156,8,150,3, + 150,1158,8,150,1,151,1,151,1,152,1,152,1,153,1,153,1,154,1,154,1,155, + 1,155,1,156,1,156,1,157,1,157,1,158,1,158,1,159,1,159,1,160,1,160,1,161, + 1,161,1,162,1,162,1,163,1,163,1,164,1,164,1,165,1,165,1,166,1,166,1,167, + 1,167,1,168,1,168,1,169,1,169,1,170,1,170,1,171,1,171,0,0,172,1,1,3,2, + 5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31, + 16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27, + 55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77, + 39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50, + 101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59,119,60, + 121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,69,139,70, + 141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,79,159,80, + 161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90, + 181,91,183,92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100, + 201,101,203,102,205,103,207,104,209,105,211,106,213,107,215,108,217,109, + 219,110,221,111,223,112,225,113,227,114,229,115,231,116,233,117,235,118, + 237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,126,253,127, + 255,128,257,129,259,130,261,131,263,132,265,133,267,134,269,135,271,136, + 273,137,275,138,277,139,279,140,281,141,283,142,285,143,287,144,289,145, + 291,146,293,147,295,148,297,149,299,150,301,151,303,0,305,0,307,0,309, + 0,311,0,313,0,315,0,317,0,319,0,321,0,323,0,325,0,327,0,329,0,331,0,333, + 0,335,0,337,0,339,0,341,0,343,152,1,0,45,2,0,65,65,97,97,2,0,84,84,116, + 116,2,0,67,67,99,99,2,0,72,72,104,104,2,0,68,68,100,100,2,0,66,66,98, + 98,2,0,89,89,121,121,2,0,80,80,112,112,2,0,69,69,101,101,2,0,76,76,108, + 108,2,0,79,79,111,111,2,0,77,77,109,109,2,0,78,78,110,110,2,0,82,82,114, + 114,2,0,71,71,103,103,2,0,70,70,102,102,2,0,85,85,117,117,2,0,88,88,120, + 120,2,0,73,73,105,105,2,0,83,83,115,115,2,0,75,75,107,107,2,0,87,87,119, + 119,13,0,34,34,39,39,66,66,70,70,78,78,82,82,84,84,92,92,98,98,102,102, + 110,110,114,114,116,116,2,0,65,70,97,102,8,0,160,160,5760,5760,6158,6158, + 8192,8202,8232,8233,8239,8239,8287,8287,12288,12288,1,0,12,12,1,0,96, + 96,1,0,30,30,768,0,48,57,65,90,95,95,97,122,170,170,181,181,183,183,186, + 186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886, + 887,890,893,895,895,902,906,908,908,910,929,931,1013,1015,1153,1155,1159, + 1162,1327,1329,1366,1369,1369,1376,1416,1425,1469,1471,1471,1473,1474, + 1476,1477,1479,1479,1488,1514,1519,1522,1552,1562,1568,1641,1646,1747, + 1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037, + 2042,2042,2045,2045,2048,2093,2112,2139,2144,2154,2160,2183,2185,2190, + 2200,2273,2275,2403,2406,2415,2417,2435,2437,2444,2447,2448,2451,2472, + 2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519, + 2524,2525,2527,2531,2534,2545,2556,2556,2558,2558,2561,2563,2565,2570, + 2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620, + 2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677, + 2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745, + 2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2809,2815, + 2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873, + 2876,2884,2887,2888,2891,2893,2901,2903,2908,2909,2911,2915,2918,2927, + 2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972, + 2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021, + 3024,3024,3031,3031,3046,3055,3072,3084,3086,3088,3090,3112,3114,3129, + 3132,3140,3142,3144,3146,3149,3157,3158,3160,3162,3165,3165,3168,3171, + 3174,3183,3200,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257, + 3260,3268,3270,3272,3274,3277,3285,3286,3293,3294,3296,3299,3302,3311, + 3313,3315,3328,3340,3342,3344,3346,3396,3398,3400,3402,3406,3412,3415, + 3423,3427,3430,3439,3450,3455,3457,3459,3461,3478,3482,3505,3507,3515, + 3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3558,3567, + 3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3718,3722, + 3724,3747,3749,3749,3751,3773,3776,3780,3782,3782,3784,3790,3792,3801, + 3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897, + 3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169, + 4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685, + 4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789, + 4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954, + 4957,4959,4969,4977,4992,5007,5024,5109,5112,5117,5121,5740,5743,5759, + 5761,5786,5792,5866,5870,5880,5888,5909,5919,5940,5952,5971,5984,5996, + 5998,6000,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157, + 6159,6169,6176,6264,6272,6314,6320,6389,6400,6430,6432,6443,6448,6459, + 6470,6509,6512,6516,6528,6571,6576,6601,6608,6618,6656,6683,6688,6750, + 6752,6780,6783,6793,6800,6809,6823,6823,6832,6845,6847,6862,6912,6988, + 6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7296,7304, + 7312,7354,7357,7359,7376,7378,7380,7418,7424,7957,7960,7965,7968,8005, + 8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116, + 8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172, + 8178,8180,8182,8188,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348, + 8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469, + 8472,8477,8484,8484,8486,8486,8488,8488,8490,8505,8508,8511,8517,8521, + 8526,8526,8544,8584,11264,11492,11499,11507,11520,11557,11559,11559,11565, + 11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696, + 11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744, + 11775,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441, 12447,12449,12538,12540,12543,12549,12591,12593,12686,12704,12735,12784, - 12799,13312,19903,19968,42124,42192,42237,42240,42508,42512,42527,42538, - 42539,42560,42606,42623,42653,42656,42735,42775,42783,42786,42888,42891, - 42954,42960,42961,42963,42963,42965,42969,42994,43009,43011,43013,43015, - 43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43261, - 43262,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43488, - 43492,43494,43503,43514,43518,43520,43560,43584,43586,43588,43595,43616, - 43638,43642,43642,43646,43695,43697,43697,43701,43702,43705,43709,43712, - 43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785, - 43790,43793,43798,43808,43814,43816,43822,43824,43866,43868,43881,43888, - 44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256, - 64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318, - 64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914, - 64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382, - 65470,65474,65479,65482,65487,65490,65495,65498,65500,65536,65547,65549, - 65574,65576,65594,65596,65597,65599,65613,65616,65629,65664,65786,65856, - 65908,66176,66204,66208,66256,66304,66335,66349,66378,66384,66421,66432, - 66461,66464,66499,66504,66511,66513,66517,66560,66717,66736,66771,66776, - 66811,66816,66855,66864,66915,66928,66938,66940,66954,66956,66962,66964, - 66965,66967,66977,66979,66993,66995,67001,67003,67004,67072,67382,67392, - 67413,67424,67431,67456,67461,67463,67504,67506,67514,67584,67589,67592, - 67592,67594,67637,67639,67640,67644,67644,67647,67669,67680,67702,67712, - 67742,67808,67826,67828,67829,67840,67861,67872,67897,67968,68023,68030, - 68031,68096,68096,68112,68115,68117,68119,68121,68149,68192,68220,68224, - 68252,68288,68295,68297,68324,68352,68405,68416,68437,68448,68466,68480, - 68497,68608,68680,68736,68786,68800,68850,68864,68899,69248,69289,69296, - 69297,69376,69404,69415,69415,69424,69445,69488,69505,69552,69572,69600, - 69622,69635,69687,69745,69746,69749,69749,69763,69807,69840,69864,69891, - 69926,69956,69956,69959,69959,69968,70002,70006,70006,70019,70066,70081, - 70084,70106,70106,70108,70108,70144,70161,70163,70187,70207,70208,70272, - 70278,70280,70280,70282,70285,70287,70301,70303,70312,70320,70366,70405, - 70412,70415,70416,70419,70440,70442,70448,70450,70451,70453,70457,70461, - 70461,70480,70480,70493,70497,70656,70708,70727,70730,70751,70753,70784, - 70831,70852,70853,70855,70855,71040,71086,71128,71131,71168,71215,71236, - 71236,71296,71338,71352,71352,71424,71450,71488,71494,71680,71723,71840, - 71903,71935,71942,71945,71945,71948,71955,71957,71958,71960,71983,71999, - 71999,72001,72001,72096,72103,72106,72144,72161,72161,72163,72163,72192, - 72192,72203,72242,72250,72250,72272,72272,72284,72329,72349,72349,72368, - 72440,72704,72712,72714,72750,72768,72768,72818,72847,72960,72966,72968, - 72969,72971,73008,73030,73030,73056,73061,73063,73064,73066,73097,73112, - 73112,73440,73458,73474,73474,73476,73488,73490,73523,73648,73648,73728, - 74649,74752,74862,74880,75075,77712,77808,77824,78895,78913,78918,82944, - 83526,92160,92728,92736,92766,92784,92862,92880,92909,92928,92975,92992, - 92995,93027,93047,93053,93071,93760,93823,93952,94026,94032,94032,94099, - 94111,94176,94177,94179,94179,94208,100343,100352,101589,101632,101640, - 110576,110579,110581,110587,110589,110590,110592,110882,110898,110898, - 110928,110930,110933,110933,110948,110951,110960,111355,113664,113770, - 113776,113788,113792,113800,113808,113817,119808,119892,119894,119964, - 119966,119967,119970,119970,119973,119974,119977,119980,119982,119993, - 119995,119995,119997,120003,120005,120069,120071,120074,120077,120084, - 120086,120092,120094,120121,120123,120126,120128,120132,120134,120134, - 120138,120144,120146,120485,120488,120512,120514,120538,120540,120570, - 120572,120596,120598,120628,120630,120654,120656,120686,120688,120712, - 120714,120744,120746,120770,120772,120779,122624,122654,122661,122666, - 122928,122989,123136,123180,123191,123197,123214,123214,123536,123565, - 123584,123627,124112,124139,124896,124902,124904,124907,124909,124910, - 124912,124926,124928,125124,125184,125251,125259,125259,126464,126467, - 126469,126495,126497,126498,126500,126500,126503,126503,126505,126514, - 126516,126519,126521,126521,126523,126523,126530,126530,126535,126535, - 126537,126537,126539,126539,126541,126543,126545,126546,126548,126548, - 126551,126551,126553,126553,126555,126555,126557,126557,126559,126559, - 126561,126562,126564,126564,126567,126570,126572,126578,126580,126583, - 126585,126588,126590,126590,126592,126601,126603,126619,126625,126627, - 126629,126633,126635,126651,131072,173791,173824,177977,177984,178205, - 178208,183969,183984,191456,194560,195101,196608,201546,201552,205743, - 1199,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, - 1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0, - 0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0, - 0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43, - 1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0, - 0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0, - 0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75, - 1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0, - 0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0, - 0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0, - 107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0, - 117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0, - 127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0, - 137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0, - 147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0, - 157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0,0, - 167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0,175,1,0,0,0,0, - 177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0, - 187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0, - 197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0, - 207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0, - 217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0, - 227,1,0,0,0,0,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0, - 237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0, - 247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0, - 257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0, - 267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0, - 277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0,0,0,0, - 287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0, - 297,1,0,0,0,0,339,1,0,0,0,1,341,1,0,0,0,3,343,1,0,0,0,5,345,1,0,0,0,7, - 347,1,0,0,0,9,349,1,0,0,0,11,351,1,0,0,0,13,353,1,0,0,0,15,355,1,0,0, - 0,17,357,1,0,0,0,19,359,1,0,0,0,21,361,1,0,0,0,23,364,1,0,0,0,25,367, - 1,0,0,0,27,369,1,0,0,0,29,372,1,0,0,0,31,374,1,0,0,0,33,377,1,0,0,0,35, - 379,1,0,0,0,37,382,1,0,0,0,39,385,1,0,0,0,41,387,1,0,0,0,43,389,1,0,0, - 0,45,391,1,0,0,0,47,393,1,0,0,0,49,396,1,0,0,0,51,398,1,0,0,0,53,400, - 1,0,0,0,55,402,1,0,0,0,57,404,1,0,0,0,59,406,1,0,0,0,61,408,1,0,0,0,63, - 410,1,0,0,0,65,412,1,0,0,0,67,414,1,0,0,0,69,416,1,0,0,0,71,418,1,0,0, - 0,73,420,1,0,0,0,75,422,1,0,0,0,77,424,1,0,0,0,79,426,1,0,0,0,81,428, - 1,0,0,0,83,430,1,0,0,0,85,432,1,0,0,0,87,434,1,0,0,0,89,436,1,0,0,0,91, - 438,1,0,0,0,93,443,1,0,0,0,95,451,1,0,0,0,97,457,1,0,0,0,99,462,1,0,0, - 0,101,467,1,0,0,0,103,472,1,0,0,0,105,479,1,0,0,0,107,486,1,0,0,0,109, - 493,1,0,0,0,111,502,1,0,0,0,113,507,1,0,0,0,115,513,1,0,0,0,117,519,1, - 0,0,0,119,528,1,0,0,0,121,533,1,0,0,0,123,539,1,0,0,0,125,547,1,0,0,0, - 127,554,1,0,0,0,129,558,1,0,0,0,131,566,1,0,0,0,133,570,1,0,0,0,135,574, - 1,0,0,0,137,577,1,0,0,0,139,585,1,0,0,0,141,593,1,0,0,0,143,599,1,0,0, - 0,145,611,1,0,0,0,147,616,1,0,0,0,149,621,1,0,0,0,151,627,1,0,0,0,153, - 634,1,0,0,0,155,657,1,0,0,0,157,666,1,0,0,0,159,691,1,0,0,0,161,699,1, - 0,0,0,163,709,1,0,0,0,165,715,1,0,0,0,167,719,1,0,0,0,169,724,1,0,0,0, - 171,732,1,0,0,0,173,741,1,0,0,0,175,747,1,0,0,0,177,754,1,0,0,0,179,761, - 1,0,0,0,181,767,1,0,0,0,183,770,1,0,0,0,185,774,1,0,0,0,187,781,1,0,0, - 0,189,788,1,0,0,0,191,793,1,0,0,0,193,800,1,0,0,0,195,809,1,0,0,0,197, - 811,1,0,0,0,199,814,1,0,0,0,201,820,1,0,0,0,203,823,1,0,0,0,205,828,1, - 0,0,0,207,834,1,0,0,0,209,844,1,0,0,0,211,848,1,0,0,0,213,859,1,0,0,0, - 215,864,1,0,0,0,217,870,1,0,0,0,219,879,1,0,0,0,221,882,1,0,0,0,223,886, - 1,0,0,0,225,890,1,0,0,0,227,894,1,0,0,0,229,897,1,0,0,0,231,899,1,0,0, - 0,233,901,1,0,0,0,235,903,1,0,0,0,237,906,1,0,0,0,239,913,1,0,0,0,241, - 918,1,0,0,0,243,927,1,0,0,0,245,930,1,0,0,0,247,935,1,0,0,0,249,940,1, - 0,0,0,251,946,1,0,0,0,253,952,1,0,0,0,255,959,1,0,0,0,257,964,1,0,0,0, - 259,969,1,0,0,0,261,973,1,0,0,0,263,978,1,0,0,0,265,1001,1,0,0,0,267, - 1003,1,0,0,0,269,1031,1,0,0,0,271,1034,1,0,0,0,273,1038,1,0,0,0,275,1042, - 1,0,0,0,277,1046,1,0,0,0,279,1048,1,0,0,0,281,1050,1,0,0,0,283,1055,1, - 0,0,0,285,1064,1,0,0,0,287,1073,1,0,0,0,289,1077,1,0,0,0,291,1087,1,0, - 0,0,293,1092,1,0,0,0,295,1108,1,0,0,0,297,1139,1,0,0,0,299,1141,1,0,0, - 0,301,1143,1,0,0,0,303,1145,1,0,0,0,305,1147,1,0,0,0,307,1149,1,0,0,0, - 309,1151,1,0,0,0,311,1153,1,0,0,0,313,1155,1,0,0,0,315,1157,1,0,0,0,317, - 1159,1,0,0,0,319,1161,1,0,0,0,321,1163,1,0,0,0,323,1165,1,0,0,0,325,1167, - 1,0,0,0,327,1169,1,0,0,0,329,1171,1,0,0,0,331,1173,1,0,0,0,333,1175,1, - 0,0,0,335,1177,1,0,0,0,337,1179,1,0,0,0,339,1181,1,0,0,0,341,342,5,59, - 0,0,342,2,1,0,0,0,343,344,5,40,0,0,344,4,1,0,0,0,345,346,5,44,0,0,346, - 6,1,0,0,0,347,348,5,41,0,0,348,8,1,0,0,0,349,350,5,61,0,0,350,10,1,0, - 0,0,351,352,5,91,0,0,352,12,1,0,0,0,353,354,5,93,0,0,354,14,1,0,0,0,355, - 356,5,123,0,0,356,16,1,0,0,0,357,358,5,125,0,0,358,18,1,0,0,0,359,360, - 5,124,0,0,360,20,1,0,0,0,361,362,5,46,0,0,362,363,5,46,0,0,363,22,1,0, - 0,0,364,365,5,60,0,0,365,366,5,62,0,0,366,24,1,0,0,0,367,368,5,60,0,0, - 368,26,1,0,0,0,369,370,5,60,0,0,370,371,5,61,0,0,371,28,1,0,0,0,372,373, - 5,62,0,0,373,30,1,0,0,0,374,375,5,62,0,0,375,376,5,61,0,0,376,32,1,0, - 0,0,377,378,5,38,0,0,378,34,1,0,0,0,379,380,5,62,0,0,380,381,5,62,0,0, - 381,36,1,0,0,0,382,383,5,60,0,0,383,384,5,60,0,0,384,38,1,0,0,0,385,386, - 5,43,0,0,386,40,1,0,0,0,387,388,5,47,0,0,388,42,1,0,0,0,389,390,5,37, - 0,0,390,44,1,0,0,0,391,392,5,94,0,0,392,46,1,0,0,0,393,394,5,61,0,0,394, - 395,5,126,0,0,395,48,1,0,0,0,396,397,5,46,0,0,397,50,1,0,0,0,398,399, - 5,36,0,0,399,52,1,0,0,0,400,401,5,10216,0,0,401,54,1,0,0,0,402,403,5, - 12296,0,0,403,56,1,0,0,0,404,405,5,65124,0,0,405,58,1,0,0,0,406,407,5, - 65308,0,0,407,60,1,0,0,0,408,409,5,10217,0,0,409,62,1,0,0,0,410,411,5, - 12297,0,0,411,64,1,0,0,0,412,413,5,65125,0,0,413,66,1,0,0,0,414,415,5, - 65310,0,0,415,68,1,0,0,0,416,417,5,173,0,0,417,70,1,0,0,0,418,419,5,8208, - 0,0,419,72,1,0,0,0,420,421,5,8209,0,0,421,74,1,0,0,0,422,423,5,8210,0, - 0,423,76,1,0,0,0,424,425,5,8211,0,0,425,78,1,0,0,0,426,427,5,8212,0,0, - 427,80,1,0,0,0,428,429,5,8213,0,0,429,82,1,0,0,0,430,431,5,8722,0,0,431, - 84,1,0,0,0,432,433,5,65112,0,0,433,86,1,0,0,0,434,435,5,65123,0,0,435, - 88,1,0,0,0,436,437,5,65293,0,0,437,90,1,0,0,0,438,439,7,0,0,0,439,440, - 7,1,0,0,440,441,7,2,0,0,441,442,7,2,0,0,442,92,1,0,0,0,443,444,7,0,0, - 0,444,445,7,3,0,0,445,446,7,4,0,0,446,447,7,4,0,0,447,448,7,5,0,0,448, - 449,7,6,0,0,449,450,7,7,0,0,450,94,1,0,0,0,451,452,7,4,0,0,452,453,7, - 1,0,0,453,454,7,0,0,0,454,455,7,8,0,0,455,456,7,3,0,0,456,96,1,0,0,0, - 457,458,7,9,0,0,458,459,7,2,0,0,459,460,7,3,0,0,460,461,7,10,0,0,461, - 98,1,0,0,0,462,463,7,0,0,0,463,464,7,3,0,0,464,465,7,11,0,0,465,466,7, - 12,0,0,466,100,1,0,0,0,467,468,7,13,0,0,468,469,7,8,0,0,469,470,7,3,0, - 0,470,471,7,4,0,0,471,102,1,0,0,0,472,473,7,0,0,0,473,474,7,3,0,0,474, - 475,7,2,0,0,475,476,7,14,0,0,476,477,7,4,0,0,477,478,7,6,0,0,478,104, - 1,0,0,0,479,480,7,5,0,0,480,481,7,15,0,0,481,482,7,11,0,0,482,483,7,3, - 0,0,483,484,7,8,0,0,484,485,7,7,0,0,485,106,1,0,0,0,486,487,7,16,0,0, - 487,488,7,4,0,0,488,489,7,11,0,0,489,490,7,3,0,0,490,491,7,8,0,0,491, - 492,7,7,0,0,492,108,1,0,0,0,493,494,7,17,0,0,494,495,7,1,0,0,495,496, - 7,7,0,0,496,497,7,1,0,0,497,498,7,10,0,0,498,499,7,1,0,0,499,500,7,18, - 0,0,500,501,7,5,0,0,501,110,1,0,0,0,502,503,7,6,0,0,503,504,7,3,0,0,504, - 505,7,17,0,0,505,506,7,5,0,0,506,112,1,0,0,0,507,508,7,7,0,0,508,509, - 7,1,0,0,509,510,7,10,0,0,510,511,7,2,0,0,511,512,7,5,0,0,512,114,1,0, - 0,0,513,514,7,9,0,0,514,515,7,8,0,0,515,516,7,3,0,0,516,517,7,14,0,0, - 517,518,7,11,0,0,518,116,1,0,0,0,519,520,7,8,0,0,520,521,7,17,0,0,521, - 522,7,13,0,0,522,523,7,9,0,0,523,524,7,8,0,0,524,525,7,1,0,0,525,526, - 7,11,0,0,526,527,7,19,0,0,527,118,1,0,0,0,528,529,7,17,0,0,529,530,7, - 8,0,0,530,531,7,3,0,0,531,532,7,11,0,0,532,120,1,0,0,0,533,534,7,1,0, - 0,534,535,7,2,0,0,535,536,7,7,0,0,536,537,7,5,0,0,537,538,7,8,0,0,538, - 122,1,0,0,0,539,540,7,17,0,0,540,541,7,5,0,0,541,542,7,13,0,0,542,543, - 7,1,0,0,543,544,7,14,0,0,544,545,7,2,0,0,545,546,7,7,0,0,546,124,1,0, - 0,0,547,548,7,8,0,0,548,549,7,5,0,0,549,550,7,6,0,0,550,551,7,1,0,0,551, - 552,7,4,0,0,552,553,7,5,0,0,553,126,1,0,0,0,554,555,7,1,0,0,555,556,7, - 17,0,0,556,557,7,17,0,0,557,128,1,0,0,0,558,559,7,11,0,0,559,560,7,8, - 0,0,560,561,7,16,0,0,561,562,7,4,0,0,562,563,7,1,0,0,563,564,7,8,0,0, - 564,565,7,12,0,0,565,130,1,0,0,0,566,567,7,20,0,0,567,568,7,5,0,0,568, - 569,7,12,0,0,569,132,1,0,0,0,570,571,7,8,0,0,571,572,7,5,0,0,572,573, - 7,2,0,0,573,134,1,0,0,0,574,575,7,7,0,0,575,576,7,3,0,0,576,136,1,0,0, - 0,577,578,7,5,0,0,578,579,7,15,0,0,579,580,7,11,0,0,580,581,7,2,0,0,581, - 582,7,1,0,0,582,583,7,16,0,0,583,584,7,6,0,0,584,138,1,0,0,0,585,586, - 7,11,0,0,586,587,7,8,0,0,587,588,7,3,0,0,588,589,7,13,0,0,589,590,7,16, - 0,0,590,591,7,2,0,0,591,592,7,5,0,0,592,140,1,0,0,0,593,594,7,10,0,0, - 594,595,7,5,0,0,595,596,7,9,0,0,596,597,7,16,0,0,597,598,7,6,0,0,598, - 142,1,0,0,0,599,600,7,7,0,0,600,601,7,8,0,0,601,602,7,1,0,0,602,603,7, - 6,0,0,603,604,7,18,0,0,604,605,7,1,0,0,605,606,7,0,0,0,606,607,7,7,0, - 0,607,608,7,16,0,0,608,609,7,3,0,0,609,610,7,6,0,0,610,144,1,0,0,0,611, - 612,7,8,0,0,612,613,7,5,0,0,613,614,7,1,0,0,614,615,7,17,0,0,615,146, - 1,0,0,0,616,617,7,3,0,0,617,618,7,6,0,0,618,619,7,2,0,0,619,620,7,12, - 0,0,620,148,1,0,0,0,621,622,7,21,0,0,622,623,7,8,0,0,623,624,7,16,0,0, - 624,625,7,7,0,0,625,626,7,5,0,0,626,150,1,0,0,0,627,628,7,0,0,0,628,629, - 7,3,0,0,629,630,7,4,0,0,630,631,7,4,0,0,631,632,7,16,0,0,632,633,7,7, - 0,0,633,152,1,0,0,0,634,635,7,0,0,0,635,636,7,3,0,0,636,637,7,4,0,0,637, - 638,7,4,0,0,638,639,7,16,0,0,639,640,7,7,0,0,640,641,5,95,0,0,641,642, - 7,18,0,0,642,643,7,20,0,0,643,644,7,16,0,0,644,645,7,11,0,0,645,646,5, - 95,0,0,646,647,7,0,0,0,647,648,7,19,0,0,648,649,7,5,0,0,649,650,7,0,0, - 0,650,651,7,20,0,0,651,652,7,11,0,0,652,653,7,3,0,0,653,654,7,16,0,0, - 654,655,7,6,0,0,655,656,7,7,0,0,656,154,1,0,0,0,657,658,7,8,0,0,658,659, - 7,3,0,0,659,660,7,2,0,0,660,661,7,2,0,0,661,662,7,10,0,0,662,663,7,1, - 0,0,663,664,7,0,0,0,664,665,7,20,0,0,665,156,1,0,0,0,666,667,7,8,0,0, - 667,668,7,3,0,0,668,669,7,2,0,0,669,670,7,2,0,0,670,671,7,10,0,0,671, - 672,7,1,0,0,672,673,7,0,0,0,673,674,7,20,0,0,674,675,5,95,0,0,675,676, - 7,18,0,0,676,677,7,20,0,0,677,678,7,16,0,0,678,679,7,11,0,0,679,680,5, - 95,0,0,680,681,7,0,0,0,681,682,7,19,0,0,682,683,7,5,0,0,683,684,7,0,0, - 0,684,685,7,20,0,0,685,686,7,11,0,0,686,687,7,3,0,0,687,688,7,16,0,0, - 688,689,7,6,0,0,689,690,7,7,0,0,690,158,1,0,0,0,691,692,7,16,0,0,692, - 693,7,6,0,0,693,694,7,18,0,0,694,695,7,7,0,0,695,696,7,1,0,0,696,697, - 7,2,0,0,697,698,7,2,0,0,698,160,1,0,0,0,699,700,7,5,0,0,700,701,7,15, - 0,0,701,702,7,7,0,0,702,703,7,5,0,0,703,704,7,6,0,0,704,705,7,18,0,0, - 705,706,7,16,0,0,706,707,7,3,0,0,707,708,7,6,0,0,708,162,1,0,0,0,709, - 710,7,14,0,0,710,711,7,6,0,0,711,712,7,16,0,0,712,713,7,3,0,0,713,714, - 7,6,0,0,714,164,1,0,0,0,715,716,7,1,0,0,716,717,7,2,0,0,717,718,7,2,0, - 0,718,166,1,0,0,0,719,720,7,2,0,0,720,721,7,3,0,0,721,722,7,1,0,0,722, - 723,7,17,0,0,723,168,1,0,0,0,724,725,7,19,0,0,725,726,7,5,0,0,726,727, - 7,1,0,0,727,728,7,17,0,0,728,729,7,5,0,0,729,730,7,8,0,0,730,731,7,18, - 0,0,731,170,1,0,0,0,732,733,7,3,0,0,733,734,7,11,0,0,734,735,7,7,0,0, - 735,736,7,16,0,0,736,737,7,3,0,0,737,738,7,6,0,0,738,739,7,1,0,0,739, - 740,7,2,0,0,740,172,1,0,0,0,741,742,7,4,0,0,742,743,7,1,0,0,743,744,7, - 7,0,0,744,745,7,0,0,0,745,746,7,19,0,0,746,174,1,0,0,0,747,748,7,14,0, - 0,748,749,7,6,0,0,749,750,7,21,0,0,750,751,7,16,0,0,751,752,7,6,0,0,752, - 753,7,17,0,0,753,176,1,0,0,0,754,755,7,0,0,0,755,756,7,8,0,0,756,757, - 7,5,0,0,757,758,7,1,0,0,758,759,7,7,0,0,759,760,7,5,0,0,760,178,1,0,0, - 0,761,762,7,4,0,0,762,763,7,5,0,0,763,764,7,8,0,0,764,765,7,9,0,0,765, - 766,7,5,0,0,766,180,1,0,0,0,767,768,7,3,0,0,768,769,7,6,0,0,769,182,1, - 0,0,0,770,771,7,18,0,0,771,772,7,5,0,0,772,773,7,7,0,0,773,184,1,0,0, - 0,774,775,7,17,0,0,775,776,7,5,0,0,776,777,7,7,0,0,777,778,7,1,0,0,778, - 779,7,0,0,0,779,780,7,19,0,0,780,186,1,0,0,0,781,782,7,17,0,0,782,783, - 7,5,0,0,783,784,7,2,0,0,784,785,7,5,0,0,785,786,7,7,0,0,786,787,7,5,0, - 0,787,188,1,0,0,0,788,789,7,21,0,0,789,790,7,16,0,0,790,791,7,7,0,0,791, - 792,7,19,0,0,792,190,1,0,0,0,793,794,7,8,0,0,794,795,7,5,0,0,795,796, - 7,7,0,0,796,797,7,14,0,0,797,798,7,8,0,0,798,799,7,6,0,0,799,192,1,0, - 0,0,800,801,7,17,0,0,801,802,7,16,0,0,802,803,7,18,0,0,803,804,7,7,0, - 0,804,805,7,16,0,0,805,806,7,6,0,0,806,807,7,0,0,0,807,808,7,7,0,0,808, - 194,1,0,0,0,809,810,5,42,0,0,810,196,1,0,0,0,811,812,7,1,0,0,812,813, - 7,18,0,0,813,198,1,0,0,0,814,815,7,3,0,0,815,816,7,8,0,0,816,817,7,17, - 0,0,817,818,7,5,0,0,818,819,7,8,0,0,819,200,1,0,0,0,820,821,7,10,0,0, - 821,822,7,12,0,0,822,202,1,0,0,0,823,824,7,18,0,0,824,825,7,20,0,0,825, - 826,7,16,0,0,826,827,7,11,0,0,827,204,1,0,0,0,828,829,7,2,0,0,829,830, - 7,16,0,0,830,831,7,4,0,0,831,832,7,16,0,0,832,833,7,7,0,0,833,206,1,0, - 0,0,834,835,7,1,0,0,835,836,7,18,0,0,836,837,7,0,0,0,837,838,7,5,0,0, - 838,839,7,6,0,0,839,840,7,17,0,0,840,841,7,16,0,0,841,842,7,6,0,0,842, - 843,7,9,0,0,843,208,1,0,0,0,844,845,7,1,0,0,845,846,7,18,0,0,846,847, - 7,0,0,0,847,210,1,0,0,0,848,849,7,17,0,0,849,850,7,5,0,0,850,851,7,18, - 0,0,851,852,7,0,0,0,852,853,7,5,0,0,853,854,7,6,0,0,854,855,7,17,0,0, - 855,856,7,16,0,0,856,857,7,6,0,0,857,858,7,9,0,0,858,212,1,0,0,0,859, - 860,7,17,0,0,860,861,7,5,0,0,861,862,7,18,0,0,862,863,7,0,0,0,863,214, - 1,0,0,0,864,865,7,21,0,0,865,866,7,19,0,0,866,867,7,5,0,0,867,868,7,8, - 0,0,868,869,7,5,0,0,869,216,1,0,0,0,870,871,7,18,0,0,871,872,7,19,0,0, - 872,873,7,3,0,0,873,874,7,8,0,0,874,875,7,7,0,0,875,876,7,5,0,0,876,877, - 7,18,0,0,877,878,7,7,0,0,878,218,1,0,0,0,879,880,7,3,0,0,880,881,7,8, - 0,0,881,220,1,0,0,0,882,883,7,15,0,0,883,884,7,3,0,0,884,885,7,8,0,0, - 885,222,1,0,0,0,886,887,7,1,0,0,887,888,7,6,0,0,888,889,7,17,0,0,889, - 224,1,0,0,0,890,891,7,6,0,0,891,892,7,3,0,0,892,893,7,7,0,0,893,226,1, - 0,0,0,894,895,5,33,0,0,895,896,5,61,0,0,896,228,1,0,0,0,897,898,5,45, - 0,0,898,230,1,0,0,0,899,900,5,33,0,0,900,232,1,0,0,0,901,902,5,58,0,0, - 902,234,1,0,0,0,903,904,7,16,0,0,904,905,7,6,0,0,905,236,1,0,0,0,906, - 907,7,18,0,0,907,908,7,7,0,0,908,909,7,1,0,0,909,910,7,8,0,0,910,911, - 7,7,0,0,911,912,7,18,0,0,912,238,1,0,0,0,913,914,7,5,0,0,914,915,7,6, - 0,0,915,916,7,17,0,0,916,917,7,18,0,0,917,240,1,0,0,0,918,919,7,0,0,0, - 919,920,7,3,0,0,920,921,7,6,0,0,921,922,7,7,0,0,922,923,7,1,0,0,923,924, - 7,16,0,0,924,925,7,6,0,0,925,926,7,18,0,0,926,242,1,0,0,0,927,928,7,16, - 0,0,928,929,7,18,0,0,929,244,1,0,0,0,930,931,7,6,0,0,931,932,7,14,0,0, - 932,933,7,2,0,0,933,934,7,2,0,0,934,246,1,0,0,0,935,936,7,7,0,0,936,937, - 7,8,0,0,937,938,7,14,0,0,938,939,7,5,0,0,939,248,1,0,0,0,940,941,7,13, - 0,0,941,942,7,1,0,0,942,943,7,2,0,0,943,944,7,18,0,0,944,945,7,5,0,0, - 945,250,1,0,0,0,946,947,7,0,0,0,947,948,7,3,0,0,948,949,7,14,0,0,949, - 950,7,6,0,0,950,951,7,7,0,0,951,252,1,0,0,0,952,953,7,5,0,0,953,954,7, - 15,0,0,954,955,7,16,0,0,955,956,7,18,0,0,956,957,7,7,0,0,957,958,7,18, - 0,0,958,254,1,0,0,0,959,960,7,0,0,0,960,961,7,1,0,0,961,962,7,18,0,0, - 962,963,7,5,0,0,963,256,1,0,0,0,964,965,7,5,0,0,965,966,7,2,0,0,966,967, - 7,18,0,0,967,968,7,5,0,0,968,258,1,0,0,0,969,970,7,5,0,0,970,971,7,6, - 0,0,971,972,7,17,0,0,972,260,1,0,0,0,973,974,7,21,0,0,974,975,7,19,0, - 0,975,976,7,5,0,0,976,977,7,6,0,0,977,262,1,0,0,0,978,979,7,7,0,0,979, - 980,7,19,0,0,980,981,7,5,0,0,981,982,7,6,0,0,982,264,1,0,0,0,983,988, - 5,34,0,0,984,987,3,329,164,0,985,987,3,267,133,0,986,984,1,0,0,0,986, - 985,1,0,0,0,987,990,1,0,0,0,988,986,1,0,0,0,988,989,1,0,0,0,989,991,1, - 0,0,0,990,988,1,0,0,0,991,1002,5,34,0,0,992,997,5,39,0,0,993,996,3,309, - 154,0,994,996,3,267,133,0,995,993,1,0,0,0,995,994,1,0,0,0,996,999,1,0, - 0,0,997,995,1,0,0,0,997,998,1,0,0,0,998,1000,1,0,0,0,999,997,1,0,0,0, - 1000,1002,5,39,0,0,1001,983,1,0,0,0,1001,992,1,0,0,0,1002,266,1,0,0,0, - 1003,1021,5,92,0,0,1004,1022,7,22,0,0,1005,1006,7,14,0,0,1006,1007,3, - 273,136,0,1007,1008,3,273,136,0,1008,1009,3,273,136,0,1009,1010,3,273, - 136,0,1010,1022,1,0,0,0,1011,1012,7,14,0,0,1012,1013,3,273,136,0,1013, - 1014,3,273,136,0,1014,1015,3,273,136,0,1015,1016,3,273,136,0,1016,1017, - 3,273,136,0,1017,1018,3,273,136,0,1018,1019,3,273,136,0,1019,1020,3,273, - 136,0,1020,1022,1,0,0,0,1021,1004,1,0,0,0,1021,1005,1,0,0,0,1021,1011, - 1,0,0,0,1022,268,1,0,0,0,1023,1032,3,281,140,0,1024,1028,3,277,138,0, - 1025,1027,3,275,137,0,1026,1025,1,0,0,0,1027,1030,1,0,0,0,1028,1026,1, - 0,0,0,1028,1029,1,0,0,0,1029,1032,1,0,0,0,1030,1028,1,0,0,0,1031,1023, - 1,0,0,0,1031,1024,1,0,0,0,1032,270,1,0,0,0,1033,1035,7,23,0,0,1034,1033, - 1,0,0,0,1035,272,1,0,0,0,1036,1039,3,275,137,0,1037,1039,3,271,135,0, - 1038,1036,1,0,0,0,1038,1037,1,0,0,0,1039,274,1,0,0,0,1040,1043,3,281, - 140,0,1041,1043,3,277,138,0,1042,1040,1,0,0,0,1042,1041,1,0,0,0,1043, - 276,1,0,0,0,1044,1047,3,279,139,0,1045,1047,2,56,57,0,1046,1044,1,0,0, - 0,1046,1045,1,0,0,0,1047,278,1,0,0,0,1048,1049,2,49,55,0,1049,280,1,0, - 0,0,1050,1051,5,48,0,0,1051,282,1,0,0,0,1052,1054,3,275,137,0,1053,1052, - 1,0,0,0,1054,1057,1,0,0,0,1055,1053,1,0,0,0,1055,1056,1,0,0,0,1056,1058, - 1,0,0,0,1057,1055,1,0,0,0,1058,1060,5,46,0,0,1059,1061,3,275,137,0,1060, - 1059,1,0,0,0,1061,1062,1,0,0,0,1062,1060,1,0,0,0,1062,1063,1,0,0,0,1063, - 284,1,0,0,0,1064,1068,3,287,143,0,1065,1067,3,289,144,0,1066,1065,1,0, - 0,0,1067,1070,1,0,0,0,1068,1066,1,0,0,0,1068,1069,1,0,0,0,1069,286,1, - 0,0,0,1070,1068,1,0,0,0,1071,1074,3,337,168,0,1072,1074,3,325,162,0,1073, - 1071,1,0,0,0,1073,1072,1,0,0,0,1074,288,1,0,0,0,1075,1078,3,305,152,0, - 1076,1078,3,321,160,0,1077,1075,1,0,0,0,1077,1076,1,0,0,0,1078,290,1, - 0,0,0,1079,1083,5,96,0,0,1080,1082,3,301,150,0,1081,1080,1,0,0,0,1082, - 1085,1,0,0,0,1083,1081,1,0,0,0,1083,1084,1,0,0,0,1084,1086,1,0,0,0,1085, - 1083,1,0,0,0,1086,1088,5,96,0,0,1087,1079,1,0,0,0,1088,1089,1,0,0,0,1089, - 1087,1,0,0,0,1089,1090,1,0,0,0,1090,292,1,0,0,0,1091,1093,3,295,147,0, - 1092,1091,1,0,0,0,1093,1094,1,0,0,0,1094,1092,1,0,0,0,1094,1095,1,0,0, - 0,1095,294,1,0,0,0,1096,1109,3,323,161,0,1097,1109,3,327,163,0,1098,1109, - 3,331,165,0,1099,1109,3,333,166,0,1100,1109,3,299,149,0,1101,1109,3,319, - 159,0,1102,1109,3,317,158,0,1103,1109,3,315,157,0,1104,1109,3,303,151, - 0,1105,1109,3,335,167,0,1106,1109,7,24,0,0,1107,1109,3,297,148,0,1108, - 1096,1,0,0,0,1108,1097,1,0,0,0,1108,1098,1,0,0,0,1108,1099,1,0,0,0,1108, - 1100,1,0,0,0,1108,1101,1,0,0,0,1108,1102,1,0,0,0,1108,1103,1,0,0,0,1108, - 1104,1,0,0,0,1108,1105,1,0,0,0,1108,1106,1,0,0,0,1108,1107,1,0,0,0,1109, - 296,1,0,0,0,1110,1111,5,47,0,0,1111,1112,5,42,0,0,1112,1118,1,0,0,0,1113, - 1117,3,307,153,0,1114,1115,5,42,0,0,1115,1117,3,313,156,0,1116,1113,1, - 0,0,0,1116,1114,1,0,0,0,1117,1120,1,0,0,0,1118,1116,1,0,0,0,1118,1119, - 1,0,0,0,1119,1121,1,0,0,0,1120,1118,1,0,0,0,1121,1122,5,42,0,0,1122,1140, - 5,47,0,0,1123,1124,5,47,0,0,1124,1125,5,47,0,0,1125,1129,1,0,0,0,1126, - 1128,3,311,155,0,1127,1126,1,0,0,0,1128,1131,1,0,0,0,1129,1127,1,0,0, - 0,1129,1130,1,0,0,0,1130,1133,1,0,0,0,1131,1129,1,0,0,0,1132,1134,3,319, - 159,0,1133,1132,1,0,0,0,1133,1134,1,0,0,0,1134,1137,1,0,0,0,1135,1138, - 3,331,165,0,1136,1138,5,0,0,1,1137,1135,1,0,0,0,1137,1136,1,0,0,0,1138, - 1140,1,0,0,0,1139,1110,1,0,0,0,1139,1123,1,0,0,0,1140,298,1,0,0,0,1141, - 1142,7,25,0,0,1142,300,1,0,0,0,1143,1144,8,26,0,0,1144,302,1,0,0,0,1145, - 1146,7,27,0,0,1146,304,1,0,0,0,1147,1148,7,28,0,0,1148,306,1,0,0,0,1149, - 1150,8,29,0,0,1150,308,1,0,0,0,1151,1152,8,30,0,0,1152,310,1,0,0,0,1153, - 1154,8,31,0,0,1154,312,1,0,0,0,1155,1156,8,32,0,0,1156,314,1,0,0,0,1157, - 1158,7,33,0,0,1158,316,1,0,0,0,1159,1160,7,34,0,0,1160,318,1,0,0,0,1161, - 1162,7,35,0,0,1162,320,1,0,0,0,1163,1164,7,36,0,0,1164,322,1,0,0,0,1165, - 1166,7,37,0,0,1166,324,1,0,0,0,1167,1168,7,38,0,0,1168,326,1,0,0,0,1169, - 1170,7,39,0,0,1170,328,1,0,0,0,1171,1172,8,40,0,0,1172,330,1,0,0,0,1173, - 1174,7,41,0,0,1174,332,1,0,0,0,1175,1176,7,42,0,0,1176,334,1,0,0,0,1177, - 1178,7,43,0,0,1178,336,1,0,0,0,1179,1180,7,44,0,0,1180,338,1,0,0,0,1181, - 1182,9,0,0,0,1182,340,1,0,0,0,28,0,986,988,995,997,1001,1021,1028,1031, - 1034,1038,1042,1046,1055,1062,1068,1073,1077,1083,1089,1094,1108,1116, - 1118,1129,1133,1137,1139,0 + 12799,13312,19903,19968,42124,42192,42237,42240,42508,42512,42539,42560, + 42607,42612,42621,42623,42737,42775,42783,42786,42888,42891,42954,42960, + 42961,42963,42963,42965,42969,42994,43047,43052,43052,43072,43123,43136, + 43205,43216,43225,43232,43255,43259,43259,43261,43309,43312,43347,43360, + 43388,43392,43456,43471,43481,43488,43518,43520,43574,43584,43597,43600, + 43609,43616,43638,43642,43714,43739,43741,43744,43759,43762,43766,43777, + 43782,43785,43790,43793,43798,43808,43814,43816,43822,43824,43866,43868, + 43881,43888,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243, + 55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298, + 64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467, + 64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65071,65075, + 65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343, + 65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498, + 65500,65536,65547,65549,65574,65576,65594,65596,65597,65599,65613,65616, + 65629,65664,65786,65856,65908,66045,66045,66176,66204,66208,66256,66272, + 66272,66304,66335,66349,66378,66384,66426,66432,66461,66464,66499,66504, + 66511,66513,66517,66560,66717,66720,66729,66736,66771,66776,66811,66816, + 66855,66864,66915,66928,66938,66940,66954,66956,66962,66964,66965,66967, + 66977,66979,66993,66995,67001,67003,67004,67072,67382,67392,67413,67424, + 67431,67456,67461,67463,67504,67506,67514,67584,67589,67592,67592,67594, + 67637,67639,67640,67644,67644,67647,67669,67680,67702,67712,67742,67808, + 67826,67828,67829,67840,67861,67872,67897,67968,68023,68030,68031,68096, + 68099,68101,68102,68108,68115,68117,68119,68121,68149,68152,68154,68159, + 68159,68192,68220,68224,68252,68288,68295,68297,68326,68352,68405,68416, + 68437,68448,68466,68480,68497,68608,68680,68736,68786,68800,68850,68864, + 68903,68912,68921,69248,69289,69291,69292,69296,69297,69373,69404,69415, + 69415,69424,69456,69488,69509,69552,69572,69600,69622,69632,69702,69734, + 69749,69759,69818,69826,69826,69840,69864,69872,69881,69888,69940,69942, + 69951,69956,69959,69968,70003,70006,70006,70016,70084,70089,70092,70094, + 70106,70108,70108,70144,70161,70163,70199,70206,70209,70272,70278,70280, + 70280,70282,70285,70287,70301,70303,70312,70320,70378,70384,70393,70400, + 70403,70405,70412,70415,70416,70419,70440,70442,70448,70450,70451,70453, + 70457,70459,70468,70471,70472,70475,70477,70480,70480,70487,70487,70493, + 70499,70502,70508,70512,70516,70656,70730,70736,70745,70750,70753,70784, + 70853,70855,70855,70864,70873,71040,71093,71096,71104,71128,71133,71168, + 71232,71236,71236,71248,71257,71296,71352,71360,71369,71424,71450,71453, + 71467,71472,71481,71488,71494,71680,71738,71840,71913,71935,71942,71945, + 71945,71948,71955,71957,71958,71960,71989,71991,71992,71995,72003,72016, + 72025,72096,72103,72106,72151,72154,72161,72163,72164,72192,72254,72263, + 72263,72272,72345,72349,72349,72368,72440,72704,72712,72714,72758,72760, + 72768,72784,72793,72818,72847,72850,72871,72873,72886,72960,72966,72968, + 72969,72971,73014,73018,73018,73020,73021,73023,73031,73040,73049,73056, + 73061,73063,73064,73066,73102,73104,73105,73107,73112,73120,73129,73440, + 73462,73472,73488,73490,73530,73534,73538,73552,73561,73648,73648,73728, + 74649,74752,74862,74880,75075,77712,77808,77824,78895,78912,78933,82944, + 83526,92160,92728,92736,92766,92768,92777,92784,92862,92864,92873,92880, + 92909,92912,92916,92928,92982,92992,92995,93008,93017,93027,93047,93053, + 93071,93760,93823,93952,94026,94031,94087,94095,94111,94176,94177,94179, + 94180,94192,94193,94208,100343,100352,101589,101632,101640,110576,110579, + 110581,110587,110589,110590,110592,110882,110898,110898,110928,110930, + 110933,110933,110948,110951,110960,111355,113664,113770,113776,113788, + 113792,113800,113808,113817,113821,113822,118528,118573,118576,118598, + 119141,119145,119149,119154,119163,119170,119173,119179,119210,119213, + 119362,119364,119808,119892,119894,119964,119966,119967,119970,119970, + 119973,119974,119977,119980,119982,119993,119995,119995,119997,120003, + 120005,120069,120071,120074,120077,120084,120086,120092,120094,120121, + 120123,120126,120128,120132,120134,120134,120138,120144,120146,120485, + 120488,120512,120514,120538,120540,120570,120572,120596,120598,120628, + 120630,120654,120656,120686,120688,120712,120714,120744,120746,120770, + 120772,120779,120782,120831,121344,121398,121403,121452,121461,121461, + 121476,121476,121499,121503,121505,121519,122624,122654,122661,122666, + 122880,122886,122888,122904,122907,122913,122915,122916,122918,122922, + 122928,122989,123023,123023,123136,123180,123184,123197,123200,123209, + 123214,123214,123536,123566,123584,123641,124112,124153,124896,124902, + 124904,124907,124909,124910,124912,124926,124928,125124,125136,125142, + 125184,125259,125264,125273,126464,126467,126469,126495,126497,126498, + 126500,126500,126503,126503,126505,126514,126516,126519,126521,126521, + 126523,126523,126530,126530,126535,126535,126537,126537,126539,126539, + 126541,126543,126545,126546,126548,126548,126551,126551,126553,126553, + 126555,126555,126557,126557,126559,126559,126561,126562,126564,126564, + 126567,126570,126572,126578,126580,126583,126585,126588,126590,126590, + 126592,126601,126603,126619,126625,126627,126629,126633,126635,126651, + 130032,130041,131072,173791,173824,177977,177984,178205,178208,183969, + 183984,191456,194560,195101,196608,201546,201552,205743,917760,917999, + 1,0,42,42,2,0,39,39,92,92,2,0,10,10,13,13,1,0,47,47,1,0,29,29,1,0,28, + 28,1,0,13,13,21,0,36,36,162,165,1423,1423,1547,1547,2046,2047,2546,2547, + 2555,2555,2801,2801,3065,3065,3647,3647,6107,6107,8352,8384,43064,43064, + 65020,65020,65129,65129,65284,65284,65504,65505,65509,65510,73693,73696, + 123647,123647,126128,126128,1,0,32,32,6,0,95,95,8255,8256,8276,8276,65075, + 65076,65101,65103,65343,65343,1,0,9,9,2,0,34,34,92,92,1,0,10,10,1,0,11, + 11,1,0,31,31,659,0,65,90,97,122,170,170,181,181,186,186,192,214,216,246, + 248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,895,895, + 902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1327,1329,1366, + 1369,1369,1376,1416,1488,1514,1519,1522,1568,1610,1646,1647,1649,1747, + 1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839, + 1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074, + 2084,2084,2088,2088,2112,2136,2144,2154,2160,2183,2185,2190,2208,2249, + 2308,2361,2365,2365,2384,2384,2392,2401,2417,2432,2437,2444,2447,2448, + 2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525, + 2527,2529,2544,2545,2556,2556,2565,2570,2575,2576,2579,2600,2602,2608, + 2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701, + 2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768, + 2784,2785,2809,2809,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867, + 2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954, + 2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986, + 2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3129,3133,3133, + 3160,3162,3165,3165,3168,3169,3200,3200,3205,3212,3214,3216,3218,3240, + 3242,3251,3253,3257,3261,3261,3293,3294,3296,3297,3313,3314,3332,3340, + 3342,3344,3346,3386,3389,3389,3406,3406,3412,3414,3423,3425,3450,3455, + 3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635, + 3648,3654,3713,3714,3716,3716,3718,3722,3724,3747,3749,3749,3751,3760, + 3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911, + 3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193, + 4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301, + 4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744, + 4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822, + 4824,4880,4882,4885,4888,4954,4992,5007,5024,5109,5112,5117,5121,5740, + 5743,5759,5761,5786,5792,5866,5870,5880,5888,5905,5919,5937,5952,5969, + 5984,5996,5998,6000,6016,6067,6103,6103,6108,6108,6176,6264,6272,6312, + 6314,6314,6320,6389,6400,6430,6480,6509,6512,6516,6528,6571,6576,6601, + 6656,6678,6688,6740,6823,6823,6917,6963,6981,6988,7043,7072,7086,7087, + 7098,7141,7168,7203,7245,7247,7258,7293,7296,7304,7312,7354,7357,7359, + 7401,7404,7406,7411,7413,7414,7418,7418,7424,7615,7680,7957,7960,7965, + 7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061, + 8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155, + 8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450, + 8455,8455,8458,8467,8469,8469,8472,8477,8484,8484,8486,8486,8488,8488, + 8490,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11492,11499,11502, + 11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631, + 11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718, + 11720,11726,11728,11734,11736,11742,12293,12295,12321,12329,12337,12341, + 12344,12348,12353,12438,12443,12447,12449,12538,12540,12543,12549,12591, + 12593,12686,12704,12735,12784,12799,13312,19903,19968,42124,42192,42237, + 42240,42508,42512,42527,42538,42539,42560,42606,42623,42653,42656,42735, + 42775,42783,42786,42888,42891,42954,42960,42961,42963,42963,42965,42969, + 42994,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187, + 43250,43255,43259,43259,43261,43262,43274,43301,43312,43334,43360,43388, + 43396,43442,43471,43471,43488,43492,43494,43503,43514,43518,43520,43560, + 43584,43586,43588,43595,43616,43638,43642,43642,43646,43695,43697,43697, + 43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754, + 43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822, + 43824,43866,43868,43881,43888,44002,44032,55203,55216,55238,55243,55291, + 63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296, + 64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433, + 64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276, + 65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495, + 65498,65500,65536,65547,65549,65574,65576,65594,65596,65597,65599,65613, + 65616,65629,65664,65786,65856,65908,66176,66204,66208,66256,66304,66335, + 66349,66378,66384,66421,66432,66461,66464,66499,66504,66511,66513,66517, + 66560,66717,66736,66771,66776,66811,66816,66855,66864,66915,66928,66938, + 66940,66954,66956,66962,66964,66965,66967,66977,66979,66993,66995,67001, + 67003,67004,67072,67382,67392,67413,67424,67431,67456,67461,67463,67504, + 67506,67514,67584,67589,67592,67592,67594,67637,67639,67640,67644,67644, + 67647,67669,67680,67702,67712,67742,67808,67826,67828,67829,67840,67861, + 67872,67897,67968,68023,68030,68031,68096,68096,68112,68115,68117,68119, + 68121,68149,68192,68220,68224,68252,68288,68295,68297,68324,68352,68405, + 68416,68437,68448,68466,68480,68497,68608,68680,68736,68786,68800,68850, + 68864,68899,69248,69289,69296,69297,69376,69404,69415,69415,69424,69445, + 69488,69505,69552,69572,69600,69622,69635,69687,69745,69746,69749,69749, + 69763,69807,69840,69864,69891,69926,69956,69956,69959,69959,69968,70002, + 70006,70006,70019,70066,70081,70084,70106,70106,70108,70108,70144,70161, + 70163,70187,70207,70208,70272,70278,70280,70280,70282,70285,70287,70301, + 70303,70312,70320,70366,70405,70412,70415,70416,70419,70440,70442,70448, + 70450,70451,70453,70457,70461,70461,70480,70480,70493,70497,70656,70708, + 70727,70730,70751,70753,70784,70831,70852,70853,70855,70855,71040,71086, + 71128,71131,71168,71215,71236,71236,71296,71338,71352,71352,71424,71450, + 71488,71494,71680,71723,71840,71903,71935,71942,71945,71945,71948,71955, + 71957,71958,71960,71983,71999,71999,72001,72001,72096,72103,72106,72144, + 72161,72161,72163,72163,72192,72192,72203,72242,72250,72250,72272,72272, + 72284,72329,72349,72349,72368,72440,72704,72712,72714,72750,72768,72768, + 72818,72847,72960,72966,72968,72969,72971,73008,73030,73030,73056,73061, + 73063,73064,73066,73097,73112,73112,73440,73458,73474,73474,73476,73488, + 73490,73523,73648,73648,73728,74649,74752,74862,74880,75075,77712,77808, + 77824,78895,78913,78918,82944,83526,92160,92728,92736,92766,92784,92862, + 92880,92909,92928,92975,92992,92995,93027,93047,93053,93071,93760,93823, + 93952,94026,94032,94032,94099,94111,94176,94177,94179,94179,94208,100343, + 100352,101589,101632,101640,110576,110579,110581,110587,110589,110590, + 110592,110882,110898,110898,110928,110930,110933,110933,110948,110951, + 110960,111355,113664,113770,113776,113788,113792,113800,113808,113817, + 119808,119892,119894,119964,119966,119967,119970,119970,119973,119974, + 119977,119980,119982,119993,119995,119995,119997,120003,120005,120069, + 120071,120074,120077,120084,120086,120092,120094,120121,120123,120126, + 120128,120132,120134,120134,120138,120144,120146,120485,120488,120512, + 120514,120538,120540,120570,120572,120596,120598,120628,120630,120654, + 120656,120686,120688,120712,120714,120744,120746,120770,120772,120779, + 122624,122654,122661,122666,122928,122989,123136,123180,123191,123197, + 123214,123214,123536,123565,123584,123627,124112,124139,124896,124902, + 124904,124907,124909,124910,124912,124926,124928,125124,125184,125251, + 125259,125259,126464,126467,126469,126495,126497,126498,126500,126500, + 126503,126503,126505,126514,126516,126519,126521,126521,126523,126523, + 126530,126530,126535,126535,126537,126537,126539,126539,126541,126543, + 126545,126546,126548,126548,126551,126551,126553,126553,126555,126555, + 126557,126557,126559,126559,126561,126562,126564,126564,126567,126570, + 126572,126578,126580,126583,126585,126588,126590,126590,126592,126601, + 126603,126619,126625,126627,126629,126633,126635,126651,131072,173791, + 173824,177977,177984,178205,178208,183969,183984,191456,194560,195101, + 196608,201546,201552,205743,1217,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0, + 0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1, + 0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0, + 0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0, + 39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1, + 0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0, + 0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0, + 71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1, + 0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0, + 0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0, + 103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0, + 113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0, + 123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0, + 133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0, + 143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0, + 153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0, + 163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0, + 173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0, + 183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0, + 193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0, + 203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0, + 213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0, + 223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,0,0,231,1,0,0,0,0, + 233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0, + 243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0, + 253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0, + 263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0, + 273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0, + 283,1,0,0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0, + 293,1,0,0,0,0,295,1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0, + 343,1,0,0,0,1,345,1,0,0,0,3,347,1,0,0,0,5,349,1,0,0,0,7,351,1,0,0,0,9, + 353,1,0,0,0,11,355,1,0,0,0,13,357,1,0,0,0,15,359,1,0,0,0,17,361,1,0,0, + 0,19,363,1,0,0,0,21,365,1,0,0,0,23,368,1,0,0,0,25,371,1,0,0,0,27,373, + 1,0,0,0,29,376,1,0,0,0,31,378,1,0,0,0,33,381,1,0,0,0,35,383,1,0,0,0,37, + 386,1,0,0,0,39,389,1,0,0,0,41,391,1,0,0,0,43,393,1,0,0,0,45,395,1,0,0, + 0,47,397,1,0,0,0,49,400,1,0,0,0,51,402,1,0,0,0,53,404,1,0,0,0,55,406, + 1,0,0,0,57,408,1,0,0,0,59,410,1,0,0,0,61,412,1,0,0,0,63,414,1,0,0,0,65, + 416,1,0,0,0,67,418,1,0,0,0,69,420,1,0,0,0,71,422,1,0,0,0,73,424,1,0,0, + 0,75,426,1,0,0,0,77,428,1,0,0,0,79,430,1,0,0,0,81,432,1,0,0,0,83,434, + 1,0,0,0,85,436,1,0,0,0,87,438,1,0,0,0,89,440,1,0,0,0,91,442,1,0,0,0,93, + 449,1,0,0,0,95,456,1,0,0,0,97,461,1,0,0,0,99,469,1,0,0,0,101,475,1,0, + 0,0,103,480,1,0,0,0,105,485,1,0,0,0,107,490,1,0,0,0,109,497,1,0,0,0,111, + 504,1,0,0,0,113,511,1,0,0,0,115,520,1,0,0,0,117,525,1,0,0,0,119,531,1, + 0,0,0,121,537,1,0,0,0,123,546,1,0,0,0,125,551,1,0,0,0,127,557,1,0,0,0, + 129,565,1,0,0,0,131,572,1,0,0,0,133,576,1,0,0,0,135,584,1,0,0,0,137,588, + 1,0,0,0,139,592,1,0,0,0,141,595,1,0,0,0,143,603,1,0,0,0,145,611,1,0,0, + 0,147,617,1,0,0,0,149,629,1,0,0,0,151,634,1,0,0,0,153,639,1,0,0,0,155, + 645,1,0,0,0,157,652,1,0,0,0,159,675,1,0,0,0,161,684,1,0,0,0,163,709,1, + 0,0,0,165,717,1,0,0,0,167,727,1,0,0,0,169,733,1,0,0,0,171,737,1,0,0,0, + 173,742,1,0,0,0,175,750,1,0,0,0,177,759,1,0,0,0,179,765,1,0,0,0,181,772, + 1,0,0,0,183,779,1,0,0,0,185,785,1,0,0,0,187,788,1,0,0,0,189,792,1,0,0, + 0,191,799,1,0,0,0,193,806,1,0,0,0,195,811,1,0,0,0,197,818,1,0,0,0,199, + 827,1,0,0,0,201,829,1,0,0,0,203,832,1,0,0,0,205,838,1,0,0,0,207,841,1, + 0,0,0,209,846,1,0,0,0,211,852,1,0,0,0,213,862,1,0,0,0,215,866,1,0,0,0, + 217,877,1,0,0,0,219,882,1,0,0,0,221,888,1,0,0,0,223,897,1,0,0,0,225,900, + 1,0,0,0,227,904,1,0,0,0,229,908,1,0,0,0,231,912,1,0,0,0,233,915,1,0,0, + 0,235,917,1,0,0,0,237,919,1,0,0,0,239,921,1,0,0,0,241,924,1,0,0,0,243, + 931,1,0,0,0,245,936,1,0,0,0,247,945,1,0,0,0,249,948,1,0,0,0,251,953,1, + 0,0,0,253,958,1,0,0,0,255,964,1,0,0,0,257,970,1,0,0,0,259,977,1,0,0,0, + 261,982,1,0,0,0,263,987,1,0,0,0,265,991,1,0,0,0,267,996,1,0,0,0,269,1019, + 1,0,0,0,271,1021,1,0,0,0,273,1049,1,0,0,0,275,1052,1,0,0,0,277,1056,1, + 0,0,0,279,1060,1,0,0,0,281,1064,1,0,0,0,283,1066,1,0,0,0,285,1068,1,0, + 0,0,287,1073,1,0,0,0,289,1082,1,0,0,0,291,1091,1,0,0,0,293,1095,1,0,0, + 0,295,1105,1,0,0,0,297,1110,1,0,0,0,299,1126,1,0,0,0,301,1157,1,0,0,0, + 303,1159,1,0,0,0,305,1161,1,0,0,0,307,1163,1,0,0,0,309,1165,1,0,0,0,311, + 1167,1,0,0,0,313,1169,1,0,0,0,315,1171,1,0,0,0,317,1173,1,0,0,0,319,1175, + 1,0,0,0,321,1177,1,0,0,0,323,1179,1,0,0,0,325,1181,1,0,0,0,327,1183,1, + 0,0,0,329,1185,1,0,0,0,331,1187,1,0,0,0,333,1189,1,0,0,0,335,1191,1,0, + 0,0,337,1193,1,0,0,0,339,1195,1,0,0,0,341,1197,1,0,0,0,343,1199,1,0,0, + 0,345,346,5,59,0,0,346,2,1,0,0,0,347,348,5,40,0,0,348,4,1,0,0,0,349,350, + 5,44,0,0,350,6,1,0,0,0,351,352,5,41,0,0,352,8,1,0,0,0,353,354,5,61,0, + 0,354,10,1,0,0,0,355,356,5,91,0,0,356,12,1,0,0,0,357,358,5,93,0,0,358, + 14,1,0,0,0,359,360,5,123,0,0,360,16,1,0,0,0,361,362,5,125,0,0,362,18, + 1,0,0,0,363,364,5,124,0,0,364,20,1,0,0,0,365,366,5,46,0,0,366,367,5,46, + 0,0,367,22,1,0,0,0,368,369,5,60,0,0,369,370,5,62,0,0,370,24,1,0,0,0,371, + 372,5,60,0,0,372,26,1,0,0,0,373,374,5,60,0,0,374,375,5,61,0,0,375,28, + 1,0,0,0,376,377,5,62,0,0,377,30,1,0,0,0,378,379,5,62,0,0,379,380,5,61, + 0,0,380,32,1,0,0,0,381,382,5,38,0,0,382,34,1,0,0,0,383,384,5,62,0,0,384, + 385,5,62,0,0,385,36,1,0,0,0,386,387,5,60,0,0,387,388,5,60,0,0,388,38, + 1,0,0,0,389,390,5,43,0,0,390,40,1,0,0,0,391,392,5,47,0,0,392,42,1,0,0, + 0,393,394,5,37,0,0,394,44,1,0,0,0,395,396,5,94,0,0,396,46,1,0,0,0,397, + 398,5,61,0,0,398,399,5,126,0,0,399,48,1,0,0,0,400,401,5,46,0,0,401,50, + 1,0,0,0,402,403,5,36,0,0,403,52,1,0,0,0,404,405,5,10216,0,0,405,54,1, + 0,0,0,406,407,5,12296,0,0,407,56,1,0,0,0,408,409,5,65124,0,0,409,58,1, + 0,0,0,410,411,5,65308,0,0,411,60,1,0,0,0,412,413,5,10217,0,0,413,62,1, + 0,0,0,414,415,5,12297,0,0,415,64,1,0,0,0,416,417,5,65125,0,0,417,66,1, + 0,0,0,418,419,5,65310,0,0,419,68,1,0,0,0,420,421,5,173,0,0,421,70,1,0, + 0,0,422,423,5,8208,0,0,423,72,1,0,0,0,424,425,5,8209,0,0,425,74,1,0,0, + 0,426,427,5,8210,0,0,427,76,1,0,0,0,428,429,5,8211,0,0,429,78,1,0,0,0, + 430,431,5,8212,0,0,431,80,1,0,0,0,432,433,5,8213,0,0,433,82,1,0,0,0,434, + 435,5,8722,0,0,435,84,1,0,0,0,436,437,5,65112,0,0,437,86,1,0,0,0,438, + 439,5,65123,0,0,439,88,1,0,0,0,440,441,5,65293,0,0,441,90,1,0,0,0,442, + 443,7,0,0,0,443,444,7,1,0,0,444,445,7,1,0,0,445,446,7,0,0,0,446,447,7, + 2,0,0,447,448,7,3,0,0,448,92,1,0,0,0,449,450,7,4,0,0,450,451,7,5,0,0, + 451,452,7,1,0,0,452,453,7,6,0,0,453,454,7,7,0,0,454,455,7,8,0,0,455,94, + 1,0,0,0,456,457,7,2,0,0,457,458,7,0,0,0,458,459,7,9,0,0,459,460,7,9,0, + 0,460,96,1,0,0,0,461,462,7,2,0,0,462,463,7,10,0,0,463,464,7,11,0,0,464, + 465,7,11,0,0,465,466,7,8,0,0,466,467,7,12,0,0,467,468,7,1,0,0,468,98, + 1,0,0,0,469,470,7,11,0,0,470,471,7,0,0,0,471,472,7,2,0,0,472,473,7,13, + 0,0,473,474,7,10,0,0,474,100,1,0,0,0,475,476,7,14,0,0,476,477,7,9,0,0, + 477,478,7,10,0,0,478,479,7,5,0,0,479,102,1,0,0,0,480,481,7,2,0,0,481, + 482,7,10,0,0,482,483,7,7,0,0,483,484,7,6,0,0,484,104,1,0,0,0,485,486, + 7,15,0,0,486,487,7,13,0,0,487,488,7,10,0,0,488,489,7,11,0,0,489,106,1, + 0,0,0,490,491,7,2,0,0,491,492,7,10,0,0,492,493,7,9,0,0,493,494,7,16,0, + 0,494,495,7,11,0,0,495,496,7,12,0,0,496,108,1,0,0,0,497,498,7,8,0,0,498, + 499,7,17,0,0,499,500,7,7,0,0,500,501,7,10,0,0,501,502,7,13,0,0,502,503, + 7,1,0,0,503,110,1,0,0,0,504,505,7,18,0,0,505,506,7,11,0,0,506,507,7,7, + 0,0,507,508,7,10,0,0,508,509,7,13,0,0,509,510,7,1,0,0,510,112,1,0,0,0, + 511,512,7,4,0,0,512,513,7,0,0,0,513,514,7,1,0,0,514,515,7,0,0,0,515,516, + 7,5,0,0,516,517,7,0,0,0,517,518,7,19,0,0,518,519,7,8,0,0,519,114,1,0, + 0,0,520,521,7,12,0,0,521,522,7,10,0,0,522,523,7,4,0,0,523,524,7,8,0,0, + 524,116,1,0,0,0,525,526,7,1,0,0,526,527,7,0,0,0,527,528,7,5,0,0,528,529, + 7,9,0,0,529,530,7,8,0,0,530,118,1,0,0,0,531,532,7,14,0,0,532,533,7,13, + 0,0,533,534,7,10,0,0,534,535,7,16,0,0,535,536,7,7,0,0,536,120,1,0,0,0, + 537,538,7,13,0,0,538,539,7,4,0,0,539,540,7,15,0,0,540,541,7,14,0,0,541, + 542,7,13,0,0,542,543,7,0,0,0,543,544,7,7,0,0,544,545,7,3,0,0,545,122, + 1,0,0,0,546,547,7,4,0,0,547,548,7,13,0,0,548,549,7,10,0,0,549,550,7,7, + 0,0,550,124,1,0,0,0,551,552,7,0,0,0,552,553,7,9,0,0,553,554,7,1,0,0,554, + 555,7,8,0,0,555,556,7,13,0,0,556,126,1,0,0,0,557,558,7,4,0,0,558,559, + 7,8,0,0,559,560,7,15,0,0,560,561,7,0,0,0,561,562,7,16,0,0,562,563,7,9, + 0,0,563,564,7,1,0,0,564,128,1,0,0,0,565,566,7,13,0,0,566,567,7,8,0,0, + 567,568,7,12,0,0,568,569,7,0,0,0,569,570,7,11,0,0,570,571,7,8,0,0,571, + 130,1,0,0,0,572,573,7,0,0,0,573,574,7,4,0,0,574,575,7,4,0,0,575,132,1, + 0,0,0,576,577,7,7,0,0,577,578,7,13,0,0,578,579,7,18,0,0,579,580,7,11, + 0,0,580,581,7,0,0,0,581,582,7,13,0,0,582,583,7,6,0,0,583,134,1,0,0,0, + 584,585,7,20,0,0,585,586,7,8,0,0,586,587,7,6,0,0,587,136,1,0,0,0,588, + 589,7,13,0,0,589,590,7,8,0,0,590,591,7,9,0,0,591,138,1,0,0,0,592,593, + 7,1,0,0,593,594,7,10,0,0,594,140,1,0,0,0,595,596,7,8,0,0,596,597,7,17, + 0,0,597,598,7,7,0,0,598,599,7,9,0,0,599,600,7,0,0,0,600,601,7,18,0,0, + 601,602,7,12,0,0,602,142,1,0,0,0,603,604,7,7,0,0,604,605,7,13,0,0,605, + 606,7,10,0,0,606,607,7,15,0,0,607,608,7,18,0,0,608,609,7,9,0,0,609,610, + 7,8,0,0,610,144,1,0,0,0,611,612,7,5,0,0,612,613,7,8,0,0,613,614,7,14, + 0,0,614,615,7,18,0,0,615,616,7,12,0,0,616,146,1,0,0,0,617,618,7,1,0,0, + 618,619,7,13,0,0,619,620,7,0,0,0,620,621,7,12,0,0,621,622,7,19,0,0,622, + 623,7,0,0,0,623,624,7,2,0,0,624,625,7,1,0,0,625,626,7,18,0,0,626,627, + 7,10,0,0,627,628,7,12,0,0,628,148,1,0,0,0,629,630,7,13,0,0,630,631,7, + 8,0,0,631,632,7,0,0,0,632,633,7,4,0,0,633,150,1,0,0,0,634,635,7,10,0, + 0,635,636,7,12,0,0,636,637,7,9,0,0,637,638,7,6,0,0,638,152,1,0,0,0,639, + 640,7,21,0,0,640,641,7,13,0,0,641,642,7,18,0,0,642,643,7,1,0,0,643,644, + 7,8,0,0,644,154,1,0,0,0,645,646,7,2,0,0,646,647,7,10,0,0,647,648,7,11, + 0,0,648,649,7,11,0,0,649,650,7,18,0,0,650,651,7,1,0,0,651,156,1,0,0,0, + 652,653,7,2,0,0,653,654,7,10,0,0,654,655,7,11,0,0,655,656,7,11,0,0,656, + 657,7,18,0,0,657,658,7,1,0,0,658,659,5,95,0,0,659,660,7,19,0,0,660,661, + 7,20,0,0,661,662,7,18,0,0,662,663,7,7,0,0,663,664,5,95,0,0,664,665,7, + 2,0,0,665,666,7,3,0,0,666,667,7,8,0,0,667,668,7,2,0,0,668,669,7,20,0, + 0,669,670,7,7,0,0,670,671,7,10,0,0,671,672,7,18,0,0,672,673,7,12,0,0, + 673,674,7,1,0,0,674,158,1,0,0,0,675,676,7,13,0,0,676,677,7,10,0,0,677, + 678,7,9,0,0,678,679,7,9,0,0,679,680,7,5,0,0,680,681,7,0,0,0,681,682,7, + 2,0,0,682,683,7,20,0,0,683,160,1,0,0,0,684,685,7,13,0,0,685,686,7,10, + 0,0,686,687,7,9,0,0,687,688,7,9,0,0,688,689,7,5,0,0,689,690,7,0,0,0,690, + 691,7,2,0,0,691,692,7,20,0,0,692,693,5,95,0,0,693,694,7,19,0,0,694,695, + 7,20,0,0,695,696,7,18,0,0,696,697,7,7,0,0,697,698,5,95,0,0,698,699,7, + 2,0,0,699,700,7,3,0,0,700,701,7,8,0,0,701,702,7,2,0,0,702,703,7,20,0, + 0,703,704,7,7,0,0,704,705,7,10,0,0,705,706,7,18,0,0,706,707,7,12,0,0, + 707,708,7,1,0,0,708,162,1,0,0,0,709,710,7,18,0,0,710,711,7,12,0,0,711, + 712,7,19,0,0,712,713,7,1,0,0,713,714,7,0,0,0,714,715,7,9,0,0,715,716, + 7,9,0,0,716,164,1,0,0,0,717,718,7,8,0,0,718,719,7,17,0,0,719,720,7,1, + 0,0,720,721,7,8,0,0,721,722,7,12,0,0,722,723,7,19,0,0,723,724,7,18,0, + 0,724,725,7,10,0,0,725,726,7,12,0,0,726,166,1,0,0,0,727,728,7,16,0,0, + 728,729,7,12,0,0,729,730,7,18,0,0,730,731,7,10,0,0,731,732,7,12,0,0,732, + 168,1,0,0,0,733,734,7,0,0,0,734,735,7,9,0,0,735,736,7,9,0,0,736,170,1, + 0,0,0,737,738,7,9,0,0,738,739,7,10,0,0,739,740,7,0,0,0,740,741,7,4,0, + 0,741,172,1,0,0,0,742,743,7,3,0,0,743,744,7,8,0,0,744,745,7,0,0,0,745, + 746,7,4,0,0,746,747,7,8,0,0,747,748,7,13,0,0,748,749,7,19,0,0,749,174, + 1,0,0,0,750,751,7,10,0,0,751,752,7,7,0,0,752,753,7,1,0,0,753,754,7,18, + 0,0,754,755,7,10,0,0,755,756,7,12,0,0,756,757,7,0,0,0,757,758,7,9,0,0, + 758,176,1,0,0,0,759,760,7,11,0,0,760,761,7,0,0,0,761,762,7,1,0,0,762, + 763,7,2,0,0,763,764,7,3,0,0,764,178,1,0,0,0,765,766,7,16,0,0,766,767, + 7,12,0,0,767,768,7,21,0,0,768,769,7,18,0,0,769,770,7,12,0,0,770,771,7, + 4,0,0,771,180,1,0,0,0,772,773,7,2,0,0,773,774,7,13,0,0,774,775,7,8,0, + 0,775,776,7,0,0,0,776,777,7,1,0,0,777,778,7,8,0,0,778,182,1,0,0,0,779, + 780,7,11,0,0,780,781,7,8,0,0,781,782,7,13,0,0,782,783,7,14,0,0,783,784, + 7,8,0,0,784,184,1,0,0,0,785,786,7,10,0,0,786,787,7,12,0,0,787,186,1,0, + 0,0,788,789,7,19,0,0,789,790,7,8,0,0,790,791,7,1,0,0,791,188,1,0,0,0, + 792,793,7,4,0,0,793,794,7,8,0,0,794,795,7,1,0,0,795,796,7,0,0,0,796,797, + 7,2,0,0,797,798,7,3,0,0,798,190,1,0,0,0,799,800,7,4,0,0,800,801,7,8,0, + 0,801,802,7,9,0,0,802,803,7,8,0,0,803,804,7,1,0,0,804,805,7,8,0,0,805, + 192,1,0,0,0,806,807,7,21,0,0,807,808,7,18,0,0,808,809,7,1,0,0,809,810, + 7,3,0,0,810,194,1,0,0,0,811,812,7,13,0,0,812,813,7,8,0,0,813,814,7,1, + 0,0,814,815,7,16,0,0,815,816,7,13,0,0,816,817,7,12,0,0,817,196,1,0,0, + 0,818,819,7,4,0,0,819,820,7,18,0,0,820,821,7,19,0,0,821,822,7,1,0,0,822, + 823,7,18,0,0,823,824,7,12,0,0,824,825,7,2,0,0,825,826,7,1,0,0,826,198, + 1,0,0,0,827,828,5,42,0,0,828,200,1,0,0,0,829,830,7,0,0,0,830,831,7,19, + 0,0,831,202,1,0,0,0,832,833,7,10,0,0,833,834,7,13,0,0,834,835,7,4,0,0, + 835,836,7,8,0,0,836,837,7,13,0,0,837,204,1,0,0,0,838,839,7,5,0,0,839, + 840,7,6,0,0,840,206,1,0,0,0,841,842,7,19,0,0,842,843,7,20,0,0,843,844, + 7,18,0,0,844,845,7,7,0,0,845,208,1,0,0,0,846,847,7,9,0,0,847,848,7,18, + 0,0,848,849,7,11,0,0,849,850,7,18,0,0,850,851,7,1,0,0,851,210,1,0,0,0, + 852,853,7,0,0,0,853,854,7,19,0,0,854,855,7,2,0,0,855,856,7,8,0,0,856, + 857,7,12,0,0,857,858,7,4,0,0,858,859,7,18,0,0,859,860,7,12,0,0,860,861, + 7,14,0,0,861,212,1,0,0,0,862,863,7,0,0,0,863,864,7,19,0,0,864,865,7,2, + 0,0,865,214,1,0,0,0,866,867,7,4,0,0,867,868,7,8,0,0,868,869,7,19,0,0, + 869,870,7,2,0,0,870,871,7,8,0,0,871,872,7,12,0,0,872,873,7,4,0,0,873, + 874,7,18,0,0,874,875,7,12,0,0,875,876,7,14,0,0,876,216,1,0,0,0,877,878, + 7,4,0,0,878,879,7,8,0,0,879,880,7,19,0,0,880,881,7,2,0,0,881,218,1,0, + 0,0,882,883,7,21,0,0,883,884,7,3,0,0,884,885,7,8,0,0,885,886,7,13,0,0, + 886,887,7,8,0,0,887,220,1,0,0,0,888,889,7,19,0,0,889,890,7,3,0,0,890, + 891,7,10,0,0,891,892,7,13,0,0,892,893,7,1,0,0,893,894,7,8,0,0,894,895, + 7,19,0,0,895,896,7,1,0,0,896,222,1,0,0,0,897,898,7,10,0,0,898,899,7,13, + 0,0,899,224,1,0,0,0,900,901,7,17,0,0,901,902,7,10,0,0,902,903,7,13,0, + 0,903,226,1,0,0,0,904,905,7,0,0,0,905,906,7,12,0,0,906,907,7,4,0,0,907, + 228,1,0,0,0,908,909,7,12,0,0,909,910,7,10,0,0,910,911,7,1,0,0,911,230, + 1,0,0,0,912,913,5,33,0,0,913,914,5,61,0,0,914,232,1,0,0,0,915,916,5,45, + 0,0,916,234,1,0,0,0,917,918,5,33,0,0,918,236,1,0,0,0,919,920,5,58,0,0, + 920,238,1,0,0,0,921,922,7,18,0,0,922,923,7,12,0,0,923,240,1,0,0,0,924, + 925,7,19,0,0,925,926,7,1,0,0,926,927,7,0,0,0,927,928,7,13,0,0,928,929, + 7,1,0,0,929,930,7,19,0,0,930,242,1,0,0,0,931,932,7,8,0,0,932,933,7,12, + 0,0,933,934,7,4,0,0,934,935,7,19,0,0,935,244,1,0,0,0,936,937,7,2,0,0, + 937,938,7,10,0,0,938,939,7,12,0,0,939,940,7,1,0,0,940,941,7,0,0,0,941, + 942,7,18,0,0,942,943,7,12,0,0,943,944,7,19,0,0,944,246,1,0,0,0,945,946, + 7,18,0,0,946,947,7,19,0,0,947,248,1,0,0,0,948,949,7,12,0,0,949,950,7, + 16,0,0,950,951,7,9,0,0,951,952,7,9,0,0,952,250,1,0,0,0,953,954,7,1,0, + 0,954,955,7,13,0,0,955,956,7,16,0,0,956,957,7,8,0,0,957,252,1,0,0,0,958, + 959,7,15,0,0,959,960,7,0,0,0,960,961,7,9,0,0,961,962,7,19,0,0,962,963, + 7,8,0,0,963,254,1,0,0,0,964,965,7,2,0,0,965,966,7,10,0,0,966,967,7,16, + 0,0,967,968,7,12,0,0,968,969,7,1,0,0,969,256,1,0,0,0,970,971,7,8,0,0, + 971,972,7,17,0,0,972,973,7,18,0,0,973,974,7,19,0,0,974,975,7,1,0,0,975, + 976,7,19,0,0,976,258,1,0,0,0,977,978,7,2,0,0,978,979,7,0,0,0,979,980, + 7,19,0,0,980,981,7,8,0,0,981,260,1,0,0,0,982,983,7,8,0,0,983,984,7,9, + 0,0,984,985,7,19,0,0,985,986,7,8,0,0,986,262,1,0,0,0,987,988,7,8,0,0, + 988,989,7,12,0,0,989,990,7,4,0,0,990,264,1,0,0,0,991,992,7,21,0,0,992, + 993,7,3,0,0,993,994,7,8,0,0,994,995,7,12,0,0,995,266,1,0,0,0,996,997, + 7,1,0,0,997,998,7,3,0,0,998,999,7,8,0,0,999,1000,7,12,0,0,1000,268,1, + 0,0,0,1001,1006,5,34,0,0,1002,1005,3,333,166,0,1003,1005,3,271,135,0, + 1004,1002,1,0,0,0,1004,1003,1,0,0,0,1005,1008,1,0,0,0,1006,1004,1,0,0, + 0,1006,1007,1,0,0,0,1007,1009,1,0,0,0,1008,1006,1,0,0,0,1009,1020,5,34, + 0,0,1010,1015,5,39,0,0,1011,1014,3,313,156,0,1012,1014,3,271,135,0,1013, + 1011,1,0,0,0,1013,1012,1,0,0,0,1014,1017,1,0,0,0,1015,1013,1,0,0,0,1015, + 1016,1,0,0,0,1016,1018,1,0,0,0,1017,1015,1,0,0,0,1018,1020,5,39,0,0,1019, + 1001,1,0,0,0,1019,1010,1,0,0,0,1020,270,1,0,0,0,1021,1039,5,92,0,0,1022, + 1040,7,22,0,0,1023,1024,7,16,0,0,1024,1025,3,277,138,0,1025,1026,3,277, + 138,0,1026,1027,3,277,138,0,1027,1028,3,277,138,0,1028,1040,1,0,0,0,1029, + 1030,7,16,0,0,1030,1031,3,277,138,0,1031,1032,3,277,138,0,1032,1033,3, + 277,138,0,1033,1034,3,277,138,0,1034,1035,3,277,138,0,1035,1036,3,277, + 138,0,1036,1037,3,277,138,0,1037,1038,3,277,138,0,1038,1040,1,0,0,0,1039, + 1022,1,0,0,0,1039,1023,1,0,0,0,1039,1029,1,0,0,0,1040,272,1,0,0,0,1041, + 1050,3,285,142,0,1042,1046,3,281,140,0,1043,1045,3,279,139,0,1044,1043, + 1,0,0,0,1045,1048,1,0,0,0,1046,1044,1,0,0,0,1046,1047,1,0,0,0,1047,1050, + 1,0,0,0,1048,1046,1,0,0,0,1049,1041,1,0,0,0,1049,1042,1,0,0,0,1050,274, + 1,0,0,0,1051,1053,7,23,0,0,1052,1051,1,0,0,0,1053,276,1,0,0,0,1054,1057, + 3,279,139,0,1055,1057,3,275,137,0,1056,1054,1,0,0,0,1056,1055,1,0,0,0, + 1057,278,1,0,0,0,1058,1061,3,285,142,0,1059,1061,3,281,140,0,1060,1058, + 1,0,0,0,1060,1059,1,0,0,0,1061,280,1,0,0,0,1062,1065,3,283,141,0,1063, + 1065,2,56,57,0,1064,1062,1,0,0,0,1064,1063,1,0,0,0,1065,282,1,0,0,0,1066, + 1067,2,49,55,0,1067,284,1,0,0,0,1068,1069,5,48,0,0,1069,286,1,0,0,0,1070, + 1072,3,279,139,0,1071,1070,1,0,0,0,1072,1075,1,0,0,0,1073,1071,1,0,0, + 0,1073,1074,1,0,0,0,1074,1076,1,0,0,0,1075,1073,1,0,0,0,1076,1078,5,46, + 0,0,1077,1079,3,279,139,0,1078,1077,1,0,0,0,1079,1080,1,0,0,0,1080,1078, + 1,0,0,0,1080,1081,1,0,0,0,1081,288,1,0,0,0,1082,1086,3,291,145,0,1083, + 1085,3,293,146,0,1084,1083,1,0,0,0,1085,1088,1,0,0,0,1086,1084,1,0,0, + 0,1086,1087,1,0,0,0,1087,290,1,0,0,0,1088,1086,1,0,0,0,1089,1092,3,341, + 170,0,1090,1092,3,329,164,0,1091,1089,1,0,0,0,1091,1090,1,0,0,0,1092, + 292,1,0,0,0,1093,1096,3,309,154,0,1094,1096,3,325,162,0,1095,1093,1,0, + 0,0,1095,1094,1,0,0,0,1096,294,1,0,0,0,1097,1101,5,96,0,0,1098,1100,3, + 305,152,0,1099,1098,1,0,0,0,1100,1103,1,0,0,0,1101,1099,1,0,0,0,1101, + 1102,1,0,0,0,1102,1104,1,0,0,0,1103,1101,1,0,0,0,1104,1106,5,96,0,0,1105, + 1097,1,0,0,0,1106,1107,1,0,0,0,1107,1105,1,0,0,0,1107,1108,1,0,0,0,1108, + 296,1,0,0,0,1109,1111,3,299,149,0,1110,1109,1,0,0,0,1111,1112,1,0,0,0, + 1112,1110,1,0,0,0,1112,1113,1,0,0,0,1113,298,1,0,0,0,1114,1127,3,327, + 163,0,1115,1127,3,331,165,0,1116,1127,3,335,167,0,1117,1127,3,337,168, + 0,1118,1127,3,303,151,0,1119,1127,3,323,161,0,1120,1127,3,321,160,0,1121, + 1127,3,319,159,0,1122,1127,3,307,153,0,1123,1127,3,339,169,0,1124,1127, + 7,24,0,0,1125,1127,3,301,150,0,1126,1114,1,0,0,0,1126,1115,1,0,0,0,1126, + 1116,1,0,0,0,1126,1117,1,0,0,0,1126,1118,1,0,0,0,1126,1119,1,0,0,0,1126, + 1120,1,0,0,0,1126,1121,1,0,0,0,1126,1122,1,0,0,0,1126,1123,1,0,0,0,1126, + 1124,1,0,0,0,1126,1125,1,0,0,0,1127,300,1,0,0,0,1128,1129,5,47,0,0,1129, + 1130,5,42,0,0,1130,1136,1,0,0,0,1131,1135,3,311,155,0,1132,1133,5,42, + 0,0,1133,1135,3,317,158,0,1134,1131,1,0,0,0,1134,1132,1,0,0,0,1135,1138, + 1,0,0,0,1136,1134,1,0,0,0,1136,1137,1,0,0,0,1137,1139,1,0,0,0,1138,1136, + 1,0,0,0,1139,1140,5,42,0,0,1140,1158,5,47,0,0,1141,1142,5,47,0,0,1142, + 1143,5,47,0,0,1143,1147,1,0,0,0,1144,1146,3,315,157,0,1145,1144,1,0,0, + 0,1146,1149,1,0,0,0,1147,1145,1,0,0,0,1147,1148,1,0,0,0,1148,1151,1,0, + 0,0,1149,1147,1,0,0,0,1150,1152,3,323,161,0,1151,1150,1,0,0,0,1151,1152, + 1,0,0,0,1152,1155,1,0,0,0,1153,1156,3,335,167,0,1154,1156,5,0,0,1,1155, + 1153,1,0,0,0,1155,1154,1,0,0,0,1156,1158,1,0,0,0,1157,1128,1,0,0,0,1157, + 1141,1,0,0,0,1158,302,1,0,0,0,1159,1160,7,25,0,0,1160,304,1,0,0,0,1161, + 1162,8,26,0,0,1162,306,1,0,0,0,1163,1164,7,27,0,0,1164,308,1,0,0,0,1165, + 1166,7,28,0,0,1166,310,1,0,0,0,1167,1168,8,29,0,0,1168,312,1,0,0,0,1169, + 1170,8,30,0,0,1170,314,1,0,0,0,1171,1172,8,31,0,0,1172,316,1,0,0,0,1173, + 1174,8,32,0,0,1174,318,1,0,0,0,1175,1176,7,33,0,0,1176,320,1,0,0,0,1177, + 1178,7,34,0,0,1178,322,1,0,0,0,1179,1180,7,35,0,0,1180,324,1,0,0,0,1181, + 1182,7,36,0,0,1182,326,1,0,0,0,1183,1184,7,37,0,0,1184,328,1,0,0,0,1185, + 1186,7,38,0,0,1186,330,1,0,0,0,1187,1188,7,39,0,0,1188,332,1,0,0,0,1189, + 1190,8,40,0,0,1190,334,1,0,0,0,1191,1192,7,41,0,0,1192,336,1,0,0,0,1193, + 1194,7,42,0,0,1194,338,1,0,0,0,1195,1196,7,43,0,0,1196,340,1,0,0,0,1197, + 1198,7,44,0,0,1198,342,1,0,0,0,1199,1200,9,0,0,0,1200,344,1,0,0,0,28, + 0,1004,1006,1013,1015,1019,1039,1046,1049,1052,1056,1060,1064,1073,1080, + 1086,1091,1095,1101,1107,1112,1126,1134,1136,1147,1151,1155,1157,0 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); diff --git a/third_party/antlr4_cypher/cypher_parser.cpp b/third_party/antlr4_cypher/cypher_parser.cpp index d60a8a0faf1..17cccc8fbc5 100644 --- a/third_party/antlr4_cypher/cypher_parser.cpp +++ b/third_party/antlr4_cypher/cypher_parser.cpp @@ -53,30 +53,31 @@ void cypherParserInitialize() { std::vector{ "ku_Statements", "oC_Cypher", "oC_Statement", "kU_CopyFrom", "kU_ColumnNames", "kU_ScanSource", "kU_CopyFromByColumn", "kU_CopyTO", "kU_ExportDatabase", - "kU_ImportDatabase", "kU_StandaloneCall", "kU_CommentOn", "kU_CreateMacro", - "kU_PositionalArgs", "kU_DefaultArg", "kU_FilePaths", "kU_ParsingOptions", - "kU_ParsingOption", "kU_DDL", "kU_CreateNodeTable", "kU_CreateRelTable", - "kU_CreateRelTableGroup", "kU_RelTableConnection", "kU_CreateRdfGraph", - "kU_DropTable", "kU_AlterTable", "kU_AlterOptions", "kU_AddProperty", - "kU_DropProperty", "kU_RenameTable", "kU_RenameProperty", "kU_PropertyDefinitions", - "kU_PropertyDefinition", "kU_CreateNodeConstraint", "kU_DataType", - "kU_ListIdentifiers", "kU_ListIdentifier", "oC_AnyCypherOption", "oC_Explain", - "oC_Profile", "kU_Transaction", "kU_Extension", "kU_LoadExtension", - "kU_InstallExtension", "oC_Query", "oC_RegularQuery", "oC_Union", - "oC_SingleQuery", "oC_SinglePartQuery", "oC_MultiPartQuery", "kU_QueryPart", - "oC_UpdatingClause", "oC_ReadingClause", "kU_LoadFrom", "kU_InQueryCall", - "oC_Match", "oC_Unwind", "oC_Create", "oC_Merge", "oC_MergeAction", - "oC_Set", "oC_SetItem", "oC_Delete", "oC_With", "oC_Return", "oC_ProjectionBody", - "oC_ProjectionItems", "oC_ProjectionItem", "oC_Order", "oC_Skip", - "oC_Limit", "oC_SortItem", "oC_Where", "oC_Pattern", "oC_PatternPart", - "oC_AnonymousPatternPart", "oC_PatternElement", "oC_NodePattern", - "oC_PatternElementChain", "oC_RelationshipPattern", "oC_RelationshipDetail", - "kU_Properties", "oC_RelationshipTypes", "oC_NodeLabels", "oC_NodeLabel", - "oC_RangeLiteral", "kU_RecursiveRelationshipComprehension", "kU_IntermediateNodeProjectionItems", - "kU_IntermediateRelProjectionItems", "oC_LowerBound", "oC_UpperBound", - "oC_LabelName", "oC_RelTypeName", "oC_Expression", "oC_OrExpression", - "oC_XorExpression", "oC_AndExpression", "oC_NotExpression", "oC_ComparisonExpression", - "kU_ComparisonOperator", "kU_BitwiseOrOperatorExpression", "kU_BitwiseAndOperatorExpression", + "kU_ImportDatabase", "kU_AttachDatabase", "kU_DetachDatabase", "kU_StandaloneCall", + "kU_CommentOn", "kU_CreateMacro", "kU_PositionalArgs", "kU_DefaultArg", + "kU_FilePaths", "kU_ParsingOptions", "kU_ParsingOption", "kU_DDL", + "kU_CreateNodeTable", "kU_CreateRelTable", "kU_CreateRelTableGroup", + "kU_RelTableConnection", "kU_CreateRdfGraph", "kU_DropTable", "kU_AlterTable", + "kU_AlterOptions", "kU_AddProperty", "kU_DropProperty", "kU_RenameTable", + "kU_RenameProperty", "kU_PropertyDefinitions", "kU_PropertyDefinition", + "kU_CreateNodeConstraint", "kU_DataType", "kU_ListIdentifiers", "kU_ListIdentifier", + "oC_AnyCypherOption", "oC_Explain", "oC_Profile", "kU_Transaction", + "kU_Extension", "kU_LoadExtension", "kU_InstallExtension", "oC_Query", + "oC_RegularQuery", "oC_Union", "oC_SingleQuery", "oC_SinglePartQuery", + "oC_MultiPartQuery", "kU_QueryPart", "oC_UpdatingClause", "oC_ReadingClause", + "kU_LoadFrom", "kU_InQueryCall", "oC_Match", "oC_Unwind", "oC_Create", + "oC_Merge", "oC_MergeAction", "oC_Set", "oC_SetItem", "oC_Delete", + "oC_With", "oC_Return", "oC_ProjectionBody", "oC_ProjectionItems", + "oC_ProjectionItem", "oC_Order", "oC_Skip", "oC_Limit", "oC_SortItem", + "oC_Where", "oC_Pattern", "oC_PatternPart", "oC_AnonymousPatternPart", + "oC_PatternElement", "oC_NodePattern", "oC_PatternElementChain", "oC_RelationshipPattern", + "oC_RelationshipDetail", "kU_Properties", "oC_RelationshipTypes", + "oC_NodeLabels", "oC_NodeLabel", "oC_RangeLiteral", "kU_RecursiveRelationshipComprehension", + "kU_IntermediateNodeProjectionItems", "kU_IntermediateRelProjectionItems", + "oC_LowerBound", "oC_UpperBound", "oC_LabelName", "oC_RelTypeName", + "oC_Expression", "oC_OrExpression", "oC_XorExpression", "oC_AndExpression", + "oC_NotExpression", "oC_ComparisonExpression", "kU_ComparisonOperator", + "kU_BitwiseOrOperatorExpression", "kU_BitwiseAndOperatorExpression", "kU_BitShiftOperatorExpression", "kU_BitShiftOperator", "oC_AddOrSubtractExpression", "kU_AddOrSubtractOperator", "oC_MultiplyDivideModuloExpression", "kU_MultiplyDivideModuloOperator", "oC_PowerOfExpression", "oC_UnaryAddSubtractOrFactorialExpression", @@ -102,34 +103,34 @@ void cypherParserInitialize() { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "'*'", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "'!='", "'-'", "'!'", "':'", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'0'" + "", "", "", "'*'", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "'!='", "'-'", "'!'", "':'", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'0'" }, std::vector{ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "", "", "CALL", "COMMENT_", - "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", "IMPORT", "DATABASE", - "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", "ALTER", "DEFAULT", - "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", "EXPLAIN", "PROFILE", - "BEGIN", "TRANSACTION", "READ", "ONLY", "WRITE", "COMMIT", "COMMIT_SKIP_CHECKPOINT", - "ROLLBACK", "ROLLBACK_SKIP_CHECKPOINT", "INSTALL", "EXTENSION", "UNION", - "ALL", "LOAD", "HEADERS", "OPTIONAL", "MATCH", "UNWIND", "CREATE", - "MERGE", "ON", "SET", "DETACH", "DELETE", "WITH", "RETURN", "DISTINCT", - "STAR", "AS", "ORDER", "BY", "L_SKIP", "LIMIT", "ASCENDING", "ASC", - "DESCENDING", "DESC", "WHERE", "SHORTEST", "OR", "XOR", "AND", "NOT", - "INVALID_NOT_EQUAL", "MINUS", "FACTORIAL", "COLON", "IN", "STARTS", - "ENDS", "CONTAINS", "IS", "NULL_", "TRUE", "FALSE", "COUNT", "EXISTS", - "CASE", "ELSE", "END", "WHEN", "THEN", "StringLiteral", "EscapedChar", - "DecimalInteger", "HexLetter", "HexDigit", "Digit", "NonZeroDigit", - "NonZeroOctDigit", "ZeroDigit", "RegularDecimalReal", "UnescapedSymbolicName", - "IdentifierStart", "IdentifierPart", "EscapedSymbolicName", "SP", - "WHITESPACE", "Comment", "Unknown" + "", "", "", "", "", "", "", "", "", "", "", "", "ATTACH", "DBTYPE", + "CALL", "COMMENT_", "MACRO", "GLOB", "COPY", "FROM", "COLUMN", "EXPORT", + "IMPORT", "DATABASE", "NODE", "TABLE", "GROUP", "RDFGRAPH", "DROP", + "ALTER", "DEFAULT", "RENAME", "ADD", "PRIMARY", "KEY", "REL", "TO", + "EXPLAIN", "PROFILE", "BEGIN", "TRANSACTION", "READ", "ONLY", "WRITE", + "COMMIT", "COMMIT_SKIP_CHECKPOINT", "ROLLBACK", "ROLLBACK_SKIP_CHECKPOINT", + "INSTALL", "EXTENSION", "UNION", "ALL", "LOAD", "HEADERS", "OPTIONAL", + "MATCH", "UNWIND", "CREATE", "MERGE", "ON", "SET", "DETACH", "DELETE", + "WITH", "RETURN", "DISTINCT", "STAR", "AS", "ORDER", "BY", "L_SKIP", + "LIMIT", "ASCENDING", "ASC", "DESCENDING", "DESC", "WHERE", "SHORTEST", + "OR", "XOR", "AND", "NOT", "INVALID_NOT_EQUAL", "MINUS", "FACTORIAL", + "COLON", "IN", "STARTS", "ENDS", "CONTAINS", "IS", "NULL_", "TRUE", + "FALSE", "COUNT", "EXISTS", "CASE", "ELSE", "END", "WHEN", "THEN", + "StringLiteral", "EscapedChar", "DecimalInteger", "HexLetter", "HexDigit", + "Digit", "NonZeroDigit", "NonZeroOctDigit", "ZeroDigit", "RegularDecimalReal", + "UnescapedSymbolicName", "IdentifierStart", "IdentifierPart", "EscapedSymbolicName", + "SP", "WHITESPACE", "Comment", "Unknown" } ); static const int32_t serializedATNSegment[] = { - 4,1,150,2294,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6, + 4,1,152,2331,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6, 2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14, 7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21, 7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28, @@ -150,885 +151,901 @@ void cypherParserInitialize() { 7,122,2,123,7,123,2,124,7,124,2,125,7,125,2,126,7,126,2,127,7,127,2,128, 7,128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133,7,133,2,134, 7,134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140, - 7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,1,0, - 1,0,3,0,295,8,0,1,0,1,0,3,0,299,8,0,1,0,5,0,302,8,0,10,0,12,0,305,9,0, - 1,0,3,0,308,8,0,1,0,1,0,1,1,3,1,313,8,1,1,1,3,1,316,8,1,1,1,1,1,3,1,320, - 8,1,1,1,3,1,323,8,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3, - 2,337,8,2,1,3,1,3,1,3,1,3,3,3,343,8,3,1,3,1,3,3,3,347,8,3,1,3,3,3,350, - 8,3,1,3,1,3,1,3,1,3,3,3,356,8,3,1,3,3,3,359,8,3,1,4,1,4,3,4,363,8,4,1, - 4,1,4,3,4,367,8,4,1,4,1,4,3,4,371,8,4,1,4,5,4,374,8,4,10,4,12,4,377,9, - 4,1,4,3,4,380,8,4,1,4,1,4,1,5,1,5,1,5,3,5,387,8,5,1,5,1,5,3,5,391,8,5, - 1,5,1,5,1,5,3,5,396,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,406,8,6,1, - 6,1,6,3,6,410,8,6,1,6,1,6,3,6,414,8,6,1,6,5,6,417,8,6,10,6,12,6,420,9, - 6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,3,7,432,8,7,1,7,1,7,3,7,436, - 8,7,1,7,1,7,1,7,1,7,1,7,1,7,3,7,444,8,7,1,7,3,7,447,8,7,1,8,1,8,1,8,1, - 8,1,8,1,8,3,8,455,8,8,1,8,3,8,458,8,8,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1, - 10,1,10,1,10,3,10,470,8,10,1,10,1,10,3,10,474,8,10,1,10,1,10,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12, - 1,12,1,12,3,12,496,8,12,1,12,1,12,3,12,500,8,12,1,12,3,12,503,8,12,1, - 12,3,12,506,8,12,1,12,3,12,509,8,12,1,12,3,12,512,8,12,1,12,1,12,3,12, - 516,8,12,1,12,5,12,519,8,12,10,12,12,12,522,9,12,1,12,3,12,525,8,12,1, - 12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,3,13,535,8,13,1,13,1,13,3,13,539, - 8,13,1,13,5,13,542,8,13,10,13,12,13,545,9,13,1,14,1,14,3,14,549,8,14, - 1,14,1,14,1,14,3,14,554,8,14,1,14,1,14,1,15,1,15,3,15,560,8,15,1,15,1, - 15,3,15,564,8,15,1,15,1,15,3,15,568,8,15,1,15,5,15,571,8,15,10,15,12, - 15,574,9,15,1,15,1,15,1,15,1,15,3,15,580,8,15,1,15,1,15,3,15,584,8,15, - 1,15,1,15,3,15,588,8,15,1,15,3,15,591,8,15,1,16,1,16,3,16,595,8,16,1, - 16,1,16,3,16,599,8,16,1,16,1,16,3,16,603,8,16,1,16,5,16,606,8,16,10,16, - 12,16,609,9,16,1,16,3,16,612,8,16,1,16,1,16,1,17,1,17,3,17,618,8,17,1, - 17,1,17,3,17,622,8,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,3,18,632, - 8,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,642,8,19,1,19,1,19, - 3,19,646,8,19,1,19,1,19,3,19,650,8,19,1,19,1,19,3,19,654,8,19,1,19,1, - 19,1,19,3,19,659,8,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, - 20,3,20,671,8,20,1,20,1,20,3,20,675,8,20,1,20,1,20,3,20,679,8,20,1,20, - 1,20,3,20,683,8,20,1,20,1,20,3,20,687,8,20,3,20,689,8,20,1,20,1,20,3, - 20,693,8,20,1,20,1,20,3,20,697,8,20,3,20,699,8,20,1,20,1,20,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,713,8,21,1,21,1,21,3,21, - 717,8,21,1,21,1,21,3,21,721,8,21,1,21,1,21,3,21,725,8,21,1,21,4,21,728, - 8,21,11,21,12,21,729,1,21,3,21,733,8,21,1,21,1,21,3,21,737,8,21,1,21, - 1,21,3,21,741,8,21,3,21,743,8,21,1,21,1,21,3,21,747,8,21,1,21,1,21,3, - 21,751,8,21,3,21,753,8,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22, - 1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,25, - 1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,3,26,789,8,26, - 1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,3,27,800,8,27,1,28,1,28, - 1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30, - 1,30,1,30,1,31,1,31,3,31,822,8,31,1,31,1,31,3,31,826,8,31,1,31,5,31,829, - 8,31,10,31,12,31,832,9,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,3,33, - 842,8,33,1,33,1,33,3,33,846,8,33,1,33,1,33,3,33,850,8,33,1,33,1,33,1, - 34,1,34,1,34,1,34,3,34,858,8,34,1,34,1,34,3,34,862,8,34,1,34,1,34,3,34, - 866,8,34,1,34,1,34,1,34,1,34,3,34,872,8,34,1,34,1,34,3,34,876,8,34,1, - 34,1,34,3,34,880,8,34,1,34,1,34,1,34,1,34,3,34,886,8,34,1,34,1,34,3,34, - 890,8,34,1,34,1,34,3,34,894,8,34,1,34,1,34,3,34,898,8,34,1,34,1,34,3, - 34,902,8,34,1,34,1,34,3,34,906,8,34,1,34,1,34,5,34,910,8,34,10,34,12, - 34,913,9,34,1,35,1,35,5,35,917,8,35,10,35,12,35,920,9,35,1,36,1,36,3, - 36,924,8,36,1,36,1,36,1,37,1,37,3,37,930,8,37,1,38,1,38,1,39,1,39,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40, - 950,8,40,1,41,1,41,3,41,954,8,41,1,42,1,42,1,42,1,42,1,42,1,42,3,42,962, - 8,42,1,43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,3,45,972,8,45,1,45,5,45, - 975,8,45,10,45,12,45,978,9,45,1,45,1,45,3,45,982,8,45,4,45,984,8,45,11, - 45,12,45,985,1,45,1,45,1,45,3,45,991,8,45,1,46,1,46,1,46,1,46,3,46,997, - 8,46,1,46,1,46,1,46,3,46,1002,8,46,1,46,3,46,1005,8,46,1,47,1,47,3,47, - 1009,8,47,1,48,1,48,3,48,1013,8,48,5,48,1015,8,48,10,48,12,48,1018,9, - 48,1,48,1,48,1,48,3,48,1023,8,48,5,48,1025,8,48,10,48,12,48,1028,9,48, - 1,48,1,48,3,48,1032,8,48,1,48,5,48,1035,8,48,10,48,12,48,1038,9,48,1, - 48,3,48,1041,8,48,1,48,3,48,1044,8,48,1,48,1,48,3,48,1048,8,48,4,48,1050, - 8,48,11,48,12,48,1051,1,48,1,48,3,48,1056,8,48,1,49,1,49,3,49,1060,8, - 49,4,49,1062,8,49,11,49,12,49,1063,1,49,1,49,1,50,1,50,3,50,1070,8,50, - 5,50,1072,8,50,10,50,12,50,1075,9,50,1,50,1,50,3,50,1079,8,50,5,50,1081, - 8,50,10,50,12,50,1084,9,50,1,50,1,50,1,51,1,51,1,51,1,51,3,51,1092,8, - 51,1,52,1,52,1,52,1,52,3,52,1098,8,52,1,53,1,53,1,53,1,53,1,53,1,53,3, - 53,1106,8,53,1,53,1,53,3,53,1110,8,53,1,53,1,53,3,53,1114,8,53,1,53,1, - 53,3,53,1118,8,53,1,53,1,53,1,53,1,53,1,53,3,53,1125,8,53,1,53,3,53,1128, - 8,53,1,53,3,53,1131,8,53,1,53,3,53,1134,8,53,1,54,1,54,1,54,1,54,3,54, - 1140,8,54,1,54,3,54,1143,8,54,1,55,1,55,3,55,1147,8,55,1,55,1,55,3,55, - 1151,8,55,1,55,1,55,3,55,1155,8,55,1,55,3,55,1158,8,55,1,56,1,56,3,56, - 1162,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,3,57,1172,8,57,1,57, - 1,57,1,58,1,58,3,58,1178,8,58,1,58,1,58,1,58,5,58,1183,8,58,10,58,12, - 58,1186,9,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1198, - 8,59,1,60,1,60,3,60,1202,8,60,1,60,1,60,3,60,1206,8,60,1,60,1,60,3,60, - 1210,8,60,1,60,5,60,1213,8,60,10,60,12,60,1216,9,60,1,61,1,61,3,61,1220, - 8,61,1,61,1,61,3,61,1224,8,61,1,61,1,61,1,62,1,62,3,62,1230,8,62,1,62, - 1,62,3,62,1234,8,62,1,62,1,62,3,62,1238,8,62,1,62,1,62,3,62,1242,8,62, - 1,62,5,62,1245,8,62,10,62,12,62,1248,9,62,1,63,1,63,1,63,3,63,1253,8, - 63,1,63,3,63,1256,8,63,1,64,1,64,1,64,1,65,3,65,1262,8,65,1,65,3,65,1265, - 8,65,1,65,1,65,1,65,1,65,3,65,1271,8,65,1,65,1,65,3,65,1275,8,65,1,65, - 1,65,3,65,1279,8,65,1,66,1,66,3,66,1283,8,66,1,66,1,66,3,66,1287,8,66, - 1,66,5,66,1290,8,66,10,66,12,66,1293,9,66,1,66,1,66,3,66,1297,8,66,1, - 66,1,66,3,66,1301,8,66,1,66,5,66,1304,8,66,10,66,12,66,1307,9,66,3,66, - 1309,8,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1318,8,67,1,68,1,68, - 1,68,1,68,1,68,1,68,1,68,3,68,1327,8,68,1,68,5,68,1330,8,68,10,68,12, - 68,1333,9,68,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,71,1,71,3,71,1345, - 8,71,1,71,3,71,1348,8,71,1,72,1,72,1,72,1,72,1,73,1,73,3,73,1356,8,73, - 1,73,1,73,3,73,1360,8,73,1,73,5,73,1363,8,73,10,73,12,73,1366,9,73,1, - 74,1,74,3,74,1370,8,74,1,74,1,74,3,74,1374,8,74,1,74,1,74,1,74,3,74,1379, - 8,74,1,75,1,75,1,76,1,76,3,76,1385,8,76,1,76,5,76,1388,8,76,10,76,12, - 76,1391,9,76,1,76,1,76,1,76,1,76,3,76,1397,8,76,1,77,1,77,3,77,1401,8, - 77,1,77,1,77,3,77,1405,8,77,3,77,1407,8,77,1,77,1,77,3,77,1411,8,77,3, - 77,1413,8,77,1,77,1,77,3,77,1417,8,77,3,77,1419,8,77,1,77,1,77,1,78,1, - 78,3,78,1425,8,78,1,78,1,78,1,79,1,79,3,79,1431,8,79,1,79,1,79,3,79,1435, - 8,79,1,79,3,79,1438,8,79,1,79,3,79,1441,8,79,1,79,1,79,1,79,1,79,3,79, - 1447,8,79,1,79,3,79,1450,8,79,1,79,3,79,1453,8,79,1,79,1,79,3,79,1457, - 8,79,1,79,1,79,1,79,1,79,3,79,1463,8,79,1,79,3,79,1466,8,79,1,79,3,79, - 1469,8,79,1,79,1,79,3,79,1473,8,79,1,80,1,80,3,80,1477,8,80,1,80,1,80, - 3,80,1481,8,80,3,80,1483,8,80,1,80,1,80,3,80,1487,8,80,3,80,1489,8,80, - 1,80,1,80,3,80,1493,8,80,3,80,1495,8,80,1,80,1,80,3,80,1499,8,80,3,80, - 1501,8,80,1,80,1,80,1,81,1,81,3,81,1507,8,81,1,81,1,81,3,81,1511,8,81, - 1,81,1,81,3,81,1515,8,81,1,81,1,81,3,81,1519,8,81,1,81,1,81,3,81,1523, - 8,81,1,81,1,81,3,81,1527,8,81,1,81,1,81,3,81,1531,8,81,1,81,1,81,3,81, - 1535,8,81,5,81,1537,8,81,10,81,12,81,1540,9,81,3,81,1542,8,81,1,81,1, - 81,1,82,1,82,3,82,1548,8,82,1,82,1,82,3,82,1552,8,82,1,82,1,82,3,82,1556, - 8,82,1,82,3,82,1559,8,82,1,82,5,82,1562,8,82,10,82,12,82,1565,9,82,1, - 83,1,83,3,83,1569,8,83,1,83,5,83,1572,8,83,10,83,12,83,1575,9,83,1,84, - 1,84,3,84,1579,8,84,1,84,1,84,1,85,1,85,3,85,1585,8,85,1,85,1,85,1,85, - 1,85,3,85,1591,8,85,1,85,3,85,1594,8,85,1,85,3,85,1597,8,85,1,85,3,85, - 1600,8,85,1,85,1,85,3,85,1604,8,85,1,85,3,85,1607,8,85,1,85,3,85,1610, - 8,85,1,85,3,85,1613,8,85,1,85,3,85,1616,8,85,1,86,1,86,3,86,1620,8,86, - 1,86,1,86,3,86,1624,8,86,1,86,1,86,3,86,1628,8,86,1,86,1,86,3,86,1632, - 8,86,1,86,1,86,3,86,1636,8,86,1,86,3,86,1639,8,86,1,86,3,86,1642,8,86, - 1,86,1,86,3,86,1646,8,86,1,86,1,86,3,86,1650,8,86,1,86,1,86,3,86,1654, - 8,86,1,86,1,86,3,86,1658,8,86,3,86,1660,8,86,1,86,1,86,1,87,1,87,3,87, - 1666,8,87,1,87,3,87,1669,8,87,1,87,3,87,1672,8,87,1,87,1,87,1,88,1,88, - 3,88,1678,8,88,1,88,3,88,1681,8,88,1,88,3,88,1684,8,88,1,88,1,88,1,89, - 1,89,1,90,1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,94,1,94,1,94, - 5,94,1703,8,94,10,94,12,94,1706,9,94,1,95,1,95,1,95,1,95,1,95,5,95,1713, - 8,95,10,95,12,95,1716,9,95,1,96,1,96,1,96,1,96,1,96,5,96,1723,8,96,10, - 96,12,96,1726,9,96,1,97,1,97,3,97,1730,8,97,5,97,1732,8,97,10,97,12,97, - 1735,9,97,1,97,1,97,1,98,1,98,3,98,1741,8,98,1,98,1,98,3,98,1745,8,98, - 1,98,1,98,3,98,1749,8,98,1,98,1,98,3,98,1753,8,98,1,98,1,98,3,98,1757, - 8,98,1,98,1,98,1,98,1,98,1,98,1,98,3,98,1765,8,98,1,98,1,98,3,98,1769, - 8,98,1,98,1,98,3,98,1773,8,98,1,98,1,98,3,98,1777,8,98,1,98,1,98,4,98, - 1781,8,98,11,98,12,98,1782,1,98,1,98,3,98,1787,8,98,1,99,1,99,1,100,1, - 100,3,100,1793,8,100,1,100,1,100,3,100,1797,8,100,1,100,5,100,1800,8, - 100,10,100,12,100,1803,9,100,1,101,1,101,3,101,1807,8,101,1,101,1,101, - 3,101,1811,8,101,1,101,5,101,1814,8,101,10,101,12,101,1817,9,101,1,102, - 1,102,3,102,1821,8,102,1,102,1,102,3,102,1825,8,102,1,102,1,102,5,102, - 1829,8,102,10,102,12,102,1832,9,102,1,103,1,103,1,104,1,104,3,104,1838, - 8,104,1,104,1,104,3,104,1842,8,104,1,104,1,104,5,104,1846,8,104,10,104, - 12,104,1849,9,104,1,105,1,105,1,106,1,106,3,106,1855,8,106,1,106,1,106, - 3,106,1859,8,106,1,106,1,106,5,106,1863,8,106,10,106,12,106,1866,9,106, - 1,107,1,107,1,108,1,108,3,108,1872,8,108,1,108,1,108,3,108,1876,8,108, - 1,108,5,108,1879,8,108,10,108,12,108,1882,9,108,1,109,1,109,3,109,1886, - 8,109,5,109,1888,8,109,10,109,12,109,1891,9,109,1,109,1,109,3,109,1895, - 8,109,1,109,3,109,1898,8,109,1,110,1,110,1,110,4,110,1903,8,110,11,110, - 12,110,1904,1,110,3,110,1908,8,110,1,111,1,111,1,111,3,111,1913,8,111, - 1,111,1,111,1,111,1,111,1,111,1,111,1,111,3,111,1922,8,111,1,111,1,111, - 3,111,1926,8,111,1,111,3,111,1929,8,111,1,112,1,112,1,112,1,112,1,112, - 1,112,1,112,1,112,1,112,1,112,1,112,3,112,1942,8,112,1,112,3,112,1945, - 8,112,1,112,1,112,1,113,3,113,1950,8,113,1,113,1,113,1,114,1,114,1,114, - 1,114,1,114,1,114,1,114,1,114,1,114,1,114,3,114,1964,8,114,1,115,1,115, - 3,115,1968,8,115,1,115,5,115,1971,8,115,10,115,12,115,1974,9,115,1,116, - 1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116,3,116,1985,8,116,1,117, - 1,117,1,117,1,117,1,117,1,117,3,117,1993,8,117,1,118,1,118,1,119,1,119, - 3,119,1999,8,119,1,119,1,119,3,119,2003,8,119,1,119,1,119,3,119,2007, - 8,119,5,119,2009,8,119,10,119,12,119,2012,9,119,3,119,2014,8,119,1,119, - 1,119,1,120,1,120,3,120,2020,8,120,1,120,3,120,2023,8,120,1,121,1,121, - 3,121,2027,8,121,1,121,1,121,3,121,2031,8,121,1,121,1,121,3,121,2035, - 8,121,1,121,1,121,3,121,2039,8,121,5,121,2041,8,121,10,121,12,121,2044, - 9,121,1,121,1,121,1,122,1,122,3,122,2050,8,122,1,122,3,122,2053,8,122, - 1,122,1,122,3,122,2057,8,122,1,122,1,122,1,123,1,123,3,123,2063,8,123, - 1,123,1,123,3,123,2067,8,123,1,123,1,123,1,124,1,124,3,124,2073,8,124, - 1,124,1,124,3,124,2077,8,124,1,124,1,124,3,124,2081,8,124,1,124,1,124, - 1,124,3,124,2086,8,124,1,124,1,124,3,124,2090,8,124,1,124,1,124,3,124, - 2094,8,124,3,124,2096,8,124,1,124,1,124,3,124,2100,8,124,1,124,1,124, - 3,124,2104,8,124,1,124,1,124,3,124,2108,8,124,5,124,2110,8,124,10,124, - 12,124,2113,9,124,3,124,2115,8,124,1,124,1,124,3,124,2119,8,124,1,125, - 1,125,1,126,1,126,3,126,2125,8,126,1,126,1,126,1,126,3,126,2130,8,126, - 3,126,2132,8,126,1,126,1,126,1,127,1,127,3,127,2138,8,127,1,127,4,127, - 2141,8,127,11,127,12,127,2142,1,128,1,128,3,128,2147,8,128,1,128,1,128, - 3,128,2151,8,128,1,128,1,128,3,128,2155,8,128,1,128,1,128,3,128,2159, - 8,128,1,128,3,128,2162,8,128,1,128,3,128,2165,8,128,1,128,1,128,1,129, - 1,129,3,129,2171,8,129,1,129,1,129,3,129,2175,8,129,1,129,1,129,3,129, - 2179,8,129,1,129,1,129,3,129,2183,8,129,1,129,3,129,2186,8,129,1,129, - 3,129,2189,8,129,1,129,1,129,1,130,1,130,3,130,2195,8,130,1,130,1,130, - 3,130,2199,8,130,1,131,1,131,3,131,2203,8,131,1,131,4,131,2206,8,131, - 11,131,12,131,2207,1,131,1,131,3,131,2212,8,131,1,131,1,131,3,131,2216, - 8,131,1,131,4,131,2219,8,131,11,131,12,131,2220,3,131,2223,8,131,1,131, - 3,131,2226,8,131,1,131,1,131,3,131,2230,8,131,1,131,3,131,2233,8,131, - 1,131,3,131,2236,8,131,1,131,1,131,1,132,1,132,3,132,2242,8,132,1,132, - 1,132,3,132,2246,8,132,1,132,1,132,3,132,2250,8,132,1,132,1,132,1,133, - 1,133,1,134,1,134,3,134,2258,8,134,1,135,1,135,1,135,3,135,2263,8,135, - 1,136,1,136,3,136,2267,8,136,1,136,1,136,1,137,1,137,1,138,1,138,1,139, - 1,139,1,140,1,140,1,141,1,141,1,141,1,141,1,141,3,141,2284,8,141,1,142, - 1,142,1,143,1,143,1,144,1,144,1,145,1,145,1,145,0,1,68,146,0,2,4,6,8, - 10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54, - 56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100, - 102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136, - 138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172, - 174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208, - 210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244, - 246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280, - 282,284,286,288,290,0,11,2,0,57,57,59,59,1,0,104,107,2,0,5,5,12,16,1, - 0,18,19,2,0,20,20,115,115,2,0,21,22,98,98,1,0,124,125,7,0,47,47,53,56, - 67,67,71,71,118,118,126,126,130,130,2,0,13,13,27,30,2,0,15,15,31,34,2, - 0,35,45,115,115,2594,0,292,1,0,0,0,2,312,1,0,0,0,4,336,1,0,0,0,6,338, - 1,0,0,0,8,360,1,0,0,0,10,395,1,0,0,0,12,397,1,0,0,0,14,427,1,0,0,0,16, - 448,1,0,0,0,18,459,1,0,0,0,20,465,1,0,0,0,22,477,1,0,0,0,24,489,1,0,0, - 0,26,532,1,0,0,0,28,546,1,0,0,0,30,590,1,0,0,0,32,592,1,0,0,0,34,615, - 1,0,0,0,36,631,1,0,0,0,38,633,1,0,0,0,40,662,1,0,0,0,42,702,1,0,0,0,44, - 756,1,0,0,0,46,764,1,0,0,0,48,770,1,0,0,0,50,776,1,0,0,0,52,788,1,0,0, - 0,54,790,1,0,0,0,56,801,1,0,0,0,58,805,1,0,0,0,60,811,1,0,0,0,62,819, - 1,0,0,0,64,833,1,0,0,0,66,837,1,0,0,0,68,905,1,0,0,0,70,914,1,0,0,0,72, - 921,1,0,0,0,74,929,1,0,0,0,76,931,1,0,0,0,78,933,1,0,0,0,80,949,1,0,0, - 0,82,953,1,0,0,0,84,955,1,0,0,0,86,963,1,0,0,0,88,967,1,0,0,0,90,990, - 1,0,0,0,92,1004,1,0,0,0,94,1008,1,0,0,0,96,1055,1,0,0,0,98,1061,1,0,0, - 0,100,1073,1,0,0,0,102,1091,1,0,0,0,104,1097,1,0,0,0,106,1099,1,0,0,0, - 108,1135,1,0,0,0,110,1146,1,0,0,0,112,1159,1,0,0,0,114,1169,1,0,0,0,116, - 1175,1,0,0,0,118,1197,1,0,0,0,120,1199,1,0,0,0,122,1217,1,0,0,0,124,1229, - 1,0,0,0,126,1249,1,0,0,0,128,1257,1,0,0,0,130,1264,1,0,0,0,132,1308,1, - 0,0,0,134,1317,1,0,0,0,136,1319,1,0,0,0,138,1334,1,0,0,0,140,1338,1,0, - 0,0,142,1342,1,0,0,0,144,1349,1,0,0,0,146,1353,1,0,0,0,148,1378,1,0,0, - 0,150,1380,1,0,0,0,152,1396,1,0,0,0,154,1398,1,0,0,0,156,1422,1,0,0,0, - 158,1472,1,0,0,0,160,1474,1,0,0,0,162,1504,1,0,0,0,164,1545,1,0,0,0,166, - 1566,1,0,0,0,168,1576,1,0,0,0,170,1582,1,0,0,0,172,1617,1,0,0,0,174,1663, - 1,0,0,0,176,1675,1,0,0,0,178,1687,1,0,0,0,180,1689,1,0,0,0,182,1691,1, - 0,0,0,184,1693,1,0,0,0,186,1695,1,0,0,0,188,1697,1,0,0,0,190,1707,1,0, - 0,0,192,1717,1,0,0,0,194,1733,1,0,0,0,196,1786,1,0,0,0,198,1788,1,0,0, - 0,200,1790,1,0,0,0,202,1804,1,0,0,0,204,1818,1,0,0,0,206,1833,1,0,0,0, - 208,1835,1,0,0,0,210,1850,1,0,0,0,212,1852,1,0,0,0,214,1867,1,0,0,0,216, - 1869,1,0,0,0,218,1889,1,0,0,0,220,1899,1,0,0,0,222,1928,1,0,0,0,224,1941, - 1,0,0,0,226,1949,1,0,0,0,228,1963,1,0,0,0,230,1965,1,0,0,0,232,1984,1, - 0,0,0,234,1992,1,0,0,0,236,1994,1,0,0,0,238,1996,1,0,0,0,240,2017,1,0, - 0,0,242,2024,1,0,0,0,244,2049,1,0,0,0,246,2060,1,0,0,0,248,2118,1,0,0, - 0,250,2120,1,0,0,0,252,2131,1,0,0,0,254,2135,1,0,0,0,256,2144,1,0,0,0, - 258,2168,1,0,0,0,260,2192,1,0,0,0,262,2222,1,0,0,0,264,2239,1,0,0,0,266, - 2253,1,0,0,0,268,2257,1,0,0,0,270,2259,1,0,0,0,272,2264,1,0,0,0,274,2270, - 1,0,0,0,276,2272,1,0,0,0,278,2274,1,0,0,0,280,2276,1,0,0,0,282,2283,1, - 0,0,0,284,2285,1,0,0,0,286,2287,1,0,0,0,288,2289,1,0,0,0,290,2291,1,0, - 0,0,292,303,3,2,1,0,293,295,5,147,0,0,294,293,1,0,0,0,294,295,1,0,0,0, - 295,296,1,0,0,0,296,298,5,1,0,0,297,299,5,147,0,0,298,297,1,0,0,0,298, - 299,1,0,0,0,299,300,1,0,0,0,300,302,3,2,1,0,301,294,1,0,0,0,302,305,1, - 0,0,0,303,301,1,0,0,0,303,304,1,0,0,0,304,307,1,0,0,0,305,303,1,0,0,0, - 306,308,5,147,0,0,307,306,1,0,0,0,307,308,1,0,0,0,308,309,1,0,0,0,309, - 310,5,0,0,1,310,1,1,0,0,0,311,313,3,74,37,0,312,311,1,0,0,0,312,313,1, - 0,0,0,313,315,1,0,0,0,314,316,5,147,0,0,315,314,1,0,0,0,315,316,1,0,0, - 0,316,317,1,0,0,0,317,322,3,4,2,0,318,320,5,147,0,0,319,318,1,0,0,0,319, - 320,1,0,0,0,320,321,1,0,0,0,321,323,5,1,0,0,322,319,1,0,0,0,322,323,1, - 0,0,0,323,3,1,0,0,0,324,337,3,88,44,0,325,337,3,36,18,0,326,337,3,6,3, - 0,327,337,3,12,6,0,328,337,3,14,7,0,329,337,3,20,10,0,330,337,3,24,12, - 0,331,337,3,22,11,0,332,337,3,80,40,0,333,337,3,82,41,0,334,337,3,16, - 8,0,335,337,3,18,9,0,336,324,1,0,0,0,336,325,1,0,0,0,336,326,1,0,0,0, - 336,327,1,0,0,0,336,328,1,0,0,0,336,329,1,0,0,0,336,330,1,0,0,0,336,331, - 1,0,0,0,336,332,1,0,0,0,336,333,1,0,0,0,336,334,1,0,0,0,336,335,1,0,0, - 0,337,5,1,0,0,0,338,339,5,50,0,0,339,340,5,147,0,0,340,349,3,280,140, - 0,341,343,5,147,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0,0,0,344, - 346,3,8,4,0,345,347,5,147,0,0,346,345,1,0,0,0,346,347,1,0,0,0,347,350, - 1,0,0,0,348,350,5,147,0,0,349,342,1,0,0,0,349,348,1,0,0,0,350,351,1,0, - 0,0,351,352,5,51,0,0,352,353,5,147,0,0,353,358,3,10,5,0,354,356,5,147, - 0,0,355,354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,359,3,32,16,0, - 358,355,1,0,0,0,358,359,1,0,0,0,359,7,1,0,0,0,360,362,5,2,0,0,361,363, - 5,147,0,0,362,361,1,0,0,0,362,363,1,0,0,0,363,364,1,0,0,0,364,375,3,280, - 140,0,365,367,5,147,0,0,366,365,1,0,0,0,366,367,1,0,0,0,367,368,1,0,0, - 0,368,370,5,3,0,0,369,371,5,147,0,0,370,369,1,0,0,0,370,371,1,0,0,0,371, - 372,1,0,0,0,372,374,3,280,140,0,373,366,1,0,0,0,374,377,1,0,0,0,375,373, - 1,0,0,0,375,376,1,0,0,0,376,379,1,0,0,0,377,375,1,0,0,0,378,380,5,147, - 0,0,379,378,1,0,0,0,379,380,1,0,0,0,380,381,1,0,0,0,381,382,5,4,0,0,382, - 9,1,0,0,0,383,396,3,30,15,0,384,386,5,2,0,0,385,387,5,147,0,0,386,385, - 1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388,390,3,88,44,0,389,391,5,147, - 0,0,390,389,1,0,0,0,390,391,1,0,0,0,391,392,1,0,0,0,392,393,5,4,0,0,393, - 396,1,0,0,0,394,396,3,266,133,0,395,383,1,0,0,0,395,384,1,0,0,0,395,394, - 1,0,0,0,396,11,1,0,0,0,397,398,5,50,0,0,398,399,5,147,0,0,399,400,3,280, - 140,0,400,401,5,147,0,0,401,402,5,51,0,0,402,403,5,147,0,0,403,405,5, - 2,0,0,404,406,5,147,0,0,405,404,1,0,0,0,405,406,1,0,0,0,406,407,1,0,0, - 0,407,418,5,133,0,0,408,410,5,147,0,0,409,408,1,0,0,0,409,410,1,0,0,0, - 410,411,1,0,0,0,411,413,5,3,0,0,412,414,5,147,0,0,413,412,1,0,0,0,413, - 414,1,0,0,0,414,415,1,0,0,0,415,417,5,133,0,0,416,409,1,0,0,0,417,420, - 1,0,0,0,418,416,1,0,0,0,418,419,1,0,0,0,419,421,1,0,0,0,420,418,1,0,0, - 0,421,422,5,4,0,0,422,423,5,147,0,0,423,424,5,101,0,0,424,425,5,147,0, - 0,425,426,5,52,0,0,426,13,1,0,0,0,427,428,5,50,0,0,428,429,5,147,0,0, - 429,431,5,2,0,0,430,432,5,147,0,0,431,430,1,0,0,0,431,432,1,0,0,0,432, - 433,1,0,0,0,433,435,3,88,44,0,434,436,5,147,0,0,435,434,1,0,0,0,435,436, - 1,0,0,0,436,437,1,0,0,0,437,438,5,4,0,0,438,439,5,147,0,0,439,440,5,68, - 0,0,440,441,5,147,0,0,441,446,5,133,0,0,442,444,5,147,0,0,443,442,1,0, - 0,0,443,444,1,0,0,0,444,445,1,0,0,0,445,447,3,32,16,0,446,443,1,0,0,0, - 446,447,1,0,0,0,447,15,1,0,0,0,448,449,5,53,0,0,449,450,5,147,0,0,450, - 451,5,55,0,0,451,452,5,147,0,0,452,457,5,133,0,0,453,455,5,147,0,0,454, - 453,1,0,0,0,454,455,1,0,0,0,455,456,1,0,0,0,456,458,3,32,16,0,457,454, - 1,0,0,0,457,458,1,0,0,0,458,17,1,0,0,0,459,460,5,54,0,0,460,461,5,147, - 0,0,461,462,5,55,0,0,462,463,5,147,0,0,463,464,5,133,0,0,464,19,1,0,0, - 0,465,466,5,46,0,0,466,467,5,147,0,0,467,469,3,282,141,0,468,470,5,147, - 0,0,469,468,1,0,0,0,469,470,1,0,0,0,470,471,1,0,0,0,471,473,5,5,0,0,472, - 474,5,147,0,0,473,472,1,0,0,0,473,474,1,0,0,0,474,475,1,0,0,0,475,476, - 3,234,117,0,476,21,1,0,0,0,477,478,5,47,0,0,478,479,5,147,0,0,479,480, - 5,91,0,0,480,481,5,147,0,0,481,482,5,57,0,0,482,483,5,147,0,0,483,484, - 3,280,140,0,484,485,5,147,0,0,485,486,5,122,0,0,486,487,5,147,0,0,487, - 488,5,133,0,0,488,23,1,0,0,0,489,490,5,89,0,0,490,491,5,147,0,0,491,492, - 5,48,0,0,492,493,5,147,0,0,493,495,3,250,125,0,494,496,5,147,0,0,495, - 494,1,0,0,0,495,496,1,0,0,0,496,497,1,0,0,0,497,499,5,2,0,0,498,500,5, - 147,0,0,499,498,1,0,0,0,499,500,1,0,0,0,500,502,1,0,0,0,501,503,3,26, - 13,0,502,501,1,0,0,0,502,503,1,0,0,0,503,505,1,0,0,0,504,506,5,147,0, - 0,505,504,1,0,0,0,505,506,1,0,0,0,506,508,1,0,0,0,507,509,3,28,14,0,508, - 507,1,0,0,0,508,509,1,0,0,0,509,520,1,0,0,0,510,512,5,147,0,0,511,510, - 1,0,0,0,511,512,1,0,0,0,512,513,1,0,0,0,513,515,5,3,0,0,514,516,5,147, - 0,0,515,514,1,0,0,0,515,516,1,0,0,0,516,517,1,0,0,0,517,519,3,28,14,0, - 518,511,1,0,0,0,519,522,1,0,0,0,520,518,1,0,0,0,520,521,1,0,0,0,521,524, - 1,0,0,0,522,520,1,0,0,0,523,525,5,147,0,0,524,523,1,0,0,0,524,525,1,0, - 0,0,525,526,1,0,0,0,526,527,5,4,0,0,527,528,5,147,0,0,528,529,5,99,0, - 0,529,530,5,147,0,0,530,531,3,186,93,0,531,25,1,0,0,0,532,543,3,282,141, - 0,533,535,5,147,0,0,534,533,1,0,0,0,534,535,1,0,0,0,535,536,1,0,0,0,536, - 538,5,3,0,0,537,539,5,147,0,0,538,537,1,0,0,0,538,539,1,0,0,0,539,540, - 1,0,0,0,540,542,3,282,141,0,541,534,1,0,0,0,542,545,1,0,0,0,543,541,1, - 0,0,0,543,544,1,0,0,0,544,27,1,0,0,0,545,543,1,0,0,0,546,548,3,282,141, - 0,547,549,5,147,0,0,548,547,1,0,0,0,548,549,1,0,0,0,549,550,1,0,0,0,550, - 551,5,117,0,0,551,553,5,5,0,0,552,554,5,147,0,0,553,552,1,0,0,0,553,554, - 1,0,0,0,554,555,1,0,0,0,555,556,3,234,117,0,556,29,1,0,0,0,557,559,5, - 6,0,0,558,560,5,147,0,0,559,558,1,0,0,0,559,560,1,0,0,0,560,561,1,0,0, - 0,561,572,5,133,0,0,562,564,5,147,0,0,563,562,1,0,0,0,563,564,1,0,0,0, - 564,565,1,0,0,0,565,567,5,3,0,0,566,568,5,147,0,0,567,566,1,0,0,0,567, - 568,1,0,0,0,568,569,1,0,0,0,569,571,5,133,0,0,570,563,1,0,0,0,571,574, - 1,0,0,0,572,570,1,0,0,0,572,573,1,0,0,0,573,575,1,0,0,0,574,572,1,0,0, - 0,575,591,5,7,0,0,576,591,5,133,0,0,577,579,5,49,0,0,578,580,5,147,0, - 0,579,578,1,0,0,0,579,580,1,0,0,0,580,581,1,0,0,0,581,583,5,2,0,0,582, - 584,5,147,0,0,583,582,1,0,0,0,583,584,1,0,0,0,584,585,1,0,0,0,585,587, - 5,133,0,0,586,588,5,147,0,0,587,586,1,0,0,0,587,588,1,0,0,0,588,589,1, - 0,0,0,589,591,5,4,0,0,590,557,1,0,0,0,590,576,1,0,0,0,590,577,1,0,0,0, - 591,31,1,0,0,0,592,594,5,2,0,0,593,595,5,147,0,0,594,593,1,0,0,0,594, - 595,1,0,0,0,595,596,1,0,0,0,596,607,3,34,17,0,597,599,5,147,0,0,598,597, - 1,0,0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,602,5,3,0,0,601,603,5,147, - 0,0,602,601,1,0,0,0,602,603,1,0,0,0,603,604,1,0,0,0,604,606,3,34,17,0, - 605,598,1,0,0,0,606,609,1,0,0,0,607,605,1,0,0,0,607,608,1,0,0,0,608,611, - 1,0,0,0,609,607,1,0,0,0,610,612,5,147,0,0,611,610,1,0,0,0,611,612,1,0, - 0,0,612,613,1,0,0,0,613,614,5,4,0,0,614,33,1,0,0,0,615,617,3,282,141, - 0,616,618,5,147,0,0,617,616,1,0,0,0,617,618,1,0,0,0,618,619,1,0,0,0,619, - 621,5,5,0,0,620,622,5,147,0,0,621,620,1,0,0,0,621,622,1,0,0,0,622,623, - 1,0,0,0,623,624,3,234,117,0,624,35,1,0,0,0,625,632,3,38,19,0,626,632, - 3,40,20,0,627,632,3,42,21,0,628,632,3,46,23,0,629,632,3,48,24,0,630,632, - 3,50,25,0,631,625,1,0,0,0,631,626,1,0,0,0,631,627,1,0,0,0,631,628,1,0, - 0,0,631,629,1,0,0,0,631,630,1,0,0,0,632,37,1,0,0,0,633,634,5,89,0,0,634, - 635,5,147,0,0,635,636,5,56,0,0,636,637,5,147,0,0,637,638,5,57,0,0,638, - 639,5,147,0,0,639,641,3,280,140,0,640,642,5,147,0,0,641,640,1,0,0,0,641, - 642,1,0,0,0,642,643,1,0,0,0,643,645,5,2,0,0,644,646,5,147,0,0,645,644, - 1,0,0,0,645,646,1,0,0,0,646,647,1,0,0,0,647,649,3,62,31,0,648,650,5,147, - 0,0,649,648,1,0,0,0,649,650,1,0,0,0,650,651,1,0,0,0,651,653,5,3,0,0,652, - 654,5,147,0,0,653,652,1,0,0,0,653,654,1,0,0,0,654,655,1,0,0,0,655,656, - 3,66,33,0,656,658,1,0,0,0,657,659,5,147,0,0,658,657,1,0,0,0,658,659,1, - 0,0,0,659,660,1,0,0,0,660,661,5,4,0,0,661,39,1,0,0,0,662,663,5,89,0,0, - 663,664,5,147,0,0,664,665,5,67,0,0,665,666,5,147,0,0,666,667,5,57,0,0, - 667,668,5,147,0,0,668,670,3,280,140,0,669,671,5,147,0,0,670,669,1,0,0, - 0,670,671,1,0,0,0,671,672,1,0,0,0,672,674,5,2,0,0,673,675,5,147,0,0,674, - 673,1,0,0,0,674,675,1,0,0,0,675,676,1,0,0,0,676,678,3,44,22,0,677,679, - 5,147,0,0,678,677,1,0,0,0,678,679,1,0,0,0,679,688,1,0,0,0,680,682,5,3, - 0,0,681,683,5,147,0,0,682,681,1,0,0,0,682,683,1,0,0,0,683,684,1,0,0,0, - 684,686,3,62,31,0,685,687,5,147,0,0,686,685,1,0,0,0,686,687,1,0,0,0,687, - 689,1,0,0,0,688,680,1,0,0,0,688,689,1,0,0,0,689,698,1,0,0,0,690,692,5, - 3,0,0,691,693,5,147,0,0,692,691,1,0,0,0,692,693,1,0,0,0,693,694,1,0,0, - 0,694,696,3,282,141,0,695,697,5,147,0,0,696,695,1,0,0,0,696,697,1,0,0, - 0,697,699,1,0,0,0,698,690,1,0,0,0,698,699,1,0,0,0,699,700,1,0,0,0,700, - 701,5,4,0,0,701,41,1,0,0,0,702,703,5,89,0,0,703,704,5,147,0,0,704,705, - 5,67,0,0,705,706,5,147,0,0,706,707,5,57,0,0,707,708,5,147,0,0,708,709, - 5,58,0,0,709,710,5,147,0,0,710,712,3,280,140,0,711,713,5,147,0,0,712, - 711,1,0,0,0,712,713,1,0,0,0,713,714,1,0,0,0,714,716,5,2,0,0,715,717,5, - 147,0,0,716,715,1,0,0,0,716,717,1,0,0,0,717,718,1,0,0,0,718,720,3,44, - 22,0,719,721,5,147,0,0,720,719,1,0,0,0,720,721,1,0,0,0,721,727,1,0,0, - 0,722,724,5,3,0,0,723,725,5,147,0,0,724,723,1,0,0,0,724,725,1,0,0,0,725, - 726,1,0,0,0,726,728,3,44,22,0,727,722,1,0,0,0,728,729,1,0,0,0,729,727, - 1,0,0,0,729,730,1,0,0,0,730,732,1,0,0,0,731,733,5,147,0,0,732,731,1,0, - 0,0,732,733,1,0,0,0,733,742,1,0,0,0,734,736,5,3,0,0,735,737,5,147,0,0, - 736,735,1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,740,3,62,31,0,739, - 741,5,147,0,0,740,739,1,0,0,0,740,741,1,0,0,0,741,743,1,0,0,0,742,734, - 1,0,0,0,742,743,1,0,0,0,743,752,1,0,0,0,744,746,5,3,0,0,745,747,5,147, - 0,0,746,745,1,0,0,0,746,747,1,0,0,0,747,748,1,0,0,0,748,750,3,282,141, - 0,749,751,5,147,0,0,750,749,1,0,0,0,750,751,1,0,0,0,751,753,1,0,0,0,752, - 744,1,0,0,0,752,753,1,0,0,0,753,754,1,0,0,0,754,755,5,4,0,0,755,43,1, - 0,0,0,756,757,5,51,0,0,757,758,5,147,0,0,758,759,3,280,140,0,759,760, - 5,147,0,0,760,761,5,68,0,0,761,762,5,147,0,0,762,763,3,280,140,0,763, - 45,1,0,0,0,764,765,5,89,0,0,765,766,5,147,0,0,766,767,5,59,0,0,767,768, - 5,147,0,0,768,769,3,280,140,0,769,47,1,0,0,0,770,771,5,60,0,0,771,772, - 5,147,0,0,772,773,7,0,0,0,773,774,5,147,0,0,774,775,3,280,140,0,775,49, - 1,0,0,0,776,777,5,61,0,0,777,778,5,147,0,0,778,779,5,57,0,0,779,780,5, - 147,0,0,780,781,3,280,140,0,781,782,5,147,0,0,782,783,3,52,26,0,783,51, - 1,0,0,0,784,789,3,54,27,0,785,789,3,56,28,0,786,789,3,58,29,0,787,789, - 3,60,30,0,788,784,1,0,0,0,788,785,1,0,0,0,788,786,1,0,0,0,788,787,1,0, - 0,0,789,53,1,0,0,0,790,791,5,64,0,0,791,792,5,147,0,0,792,793,3,274,137, - 0,793,794,5,147,0,0,794,799,3,68,34,0,795,796,5,147,0,0,796,797,5,62, - 0,0,797,798,5,147,0,0,798,800,3,186,93,0,799,795,1,0,0,0,799,800,1,0, - 0,0,800,55,1,0,0,0,801,802,5,60,0,0,802,803,5,147,0,0,803,804,3,274,137, - 0,804,57,1,0,0,0,805,806,5,63,0,0,806,807,5,147,0,0,807,808,5,68,0,0, - 808,809,5,147,0,0,809,810,3,280,140,0,810,59,1,0,0,0,811,812,5,63,0,0, - 812,813,5,147,0,0,813,814,3,274,137,0,814,815,5,147,0,0,815,816,5,68, - 0,0,816,817,5,147,0,0,817,818,3,274,137,0,818,61,1,0,0,0,819,830,3,64, - 32,0,820,822,5,147,0,0,821,820,1,0,0,0,821,822,1,0,0,0,822,823,1,0,0, - 0,823,825,5,3,0,0,824,826,5,147,0,0,825,824,1,0,0,0,825,826,1,0,0,0,826, - 827,1,0,0,0,827,829,3,64,32,0,828,821,1,0,0,0,829,832,1,0,0,0,830,828, - 1,0,0,0,830,831,1,0,0,0,831,63,1,0,0,0,832,830,1,0,0,0,833,834,3,274, - 137,0,834,835,5,147,0,0,835,836,3,68,34,0,836,65,1,0,0,0,837,838,5,65, - 0,0,838,839,5,147,0,0,839,841,5,66,0,0,840,842,5,147,0,0,841,840,1,0, - 0,0,841,842,1,0,0,0,842,843,1,0,0,0,843,845,5,2,0,0,844,846,5,147,0,0, - 845,844,1,0,0,0,845,846,1,0,0,0,846,847,1,0,0,0,847,849,3,274,137,0,848, - 850,5,147,0,0,849,848,1,0,0,0,849,850,1,0,0,0,850,851,1,0,0,0,851,852, - 5,4,0,0,852,67,1,0,0,0,853,854,6,34,-1,0,854,906,3,282,141,0,855,857, - 5,82,0,0,856,858,5,147,0,0,857,856,1,0,0,0,857,858,1,0,0,0,858,859,1, - 0,0,0,859,861,5,2,0,0,860,862,5,147,0,0,861,860,1,0,0,0,861,862,1,0,0, - 0,862,863,1,0,0,0,863,865,3,62,31,0,864,866,5,147,0,0,865,864,1,0,0,0, - 865,866,1,0,0,0,866,867,1,0,0,0,867,868,5,4,0,0,868,906,1,0,0,0,869,871, - 3,282,141,0,870,872,5,147,0,0,871,870,1,0,0,0,871,872,1,0,0,0,872,873, - 1,0,0,0,873,875,5,2,0,0,874,876,5,147,0,0,875,874,1,0,0,0,875,876,1,0, - 0,0,876,877,1,0,0,0,877,879,3,62,31,0,878,880,5,147,0,0,879,878,1,0,0, - 0,879,880,1,0,0,0,880,881,1,0,0,0,881,882,5,4,0,0,882,906,1,0,0,0,883, - 885,3,282,141,0,884,886,5,147,0,0,885,884,1,0,0,0,885,886,1,0,0,0,886, - 887,1,0,0,0,887,889,5,2,0,0,888,890,5,147,0,0,889,888,1,0,0,0,889,890, - 1,0,0,0,890,891,1,0,0,0,891,893,3,68,34,0,892,894,5,147,0,0,893,892,1, - 0,0,0,893,894,1,0,0,0,894,895,1,0,0,0,895,897,5,3,0,0,896,898,5,147,0, - 0,897,896,1,0,0,0,897,898,1,0,0,0,898,899,1,0,0,0,899,901,3,68,34,0,900, - 902,5,147,0,0,901,900,1,0,0,0,901,902,1,0,0,0,902,903,1,0,0,0,903,904, - 5,4,0,0,904,906,1,0,0,0,905,853,1,0,0,0,905,855,1,0,0,0,905,869,1,0,0, - 0,905,883,1,0,0,0,906,911,1,0,0,0,907,908,10,4,0,0,908,910,3,70,35,0, - 909,907,1,0,0,0,910,913,1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,69, - 1,0,0,0,913,911,1,0,0,0,914,918,3,72,36,0,915,917,3,72,36,0,916,915,1, - 0,0,0,917,920,1,0,0,0,918,916,1,0,0,0,918,919,1,0,0,0,919,71,1,0,0,0, - 920,918,1,0,0,0,921,923,5,6,0,0,922,924,3,276,138,0,923,922,1,0,0,0,923, - 924,1,0,0,0,924,925,1,0,0,0,925,926,5,7,0,0,926,73,1,0,0,0,927,930,3, - 76,38,0,928,930,3,78,39,0,929,927,1,0,0,0,929,928,1,0,0,0,930,75,1,0, - 0,0,931,932,5,69,0,0,932,77,1,0,0,0,933,934,5,70,0,0,934,79,1,0,0,0,935, - 936,5,71,0,0,936,937,5,147,0,0,937,950,5,72,0,0,938,939,5,71,0,0,939, - 940,5,147,0,0,940,941,5,72,0,0,941,942,5,147,0,0,942,943,5,73,0,0,943, - 944,5,147,0,0,944,950,5,74,0,0,945,950,5,76,0,0,946,950,5,77,0,0,947, - 950,5,78,0,0,948,950,5,79,0,0,949,935,1,0,0,0,949,938,1,0,0,0,949,945, - 1,0,0,0,949,946,1,0,0,0,949,947,1,0,0,0,949,948,1,0,0,0,950,81,1,0,0, - 0,951,954,3,84,42,0,952,954,3,86,43,0,953,951,1,0,0,0,953,952,1,0,0,0, - 954,83,1,0,0,0,955,956,5,84,0,0,956,957,5,147,0,0,957,958,5,81,0,0,958, - 961,5,147,0,0,959,962,5,133,0,0,960,962,3,266,133,0,961,959,1,0,0,0,961, - 960,1,0,0,0,962,85,1,0,0,0,963,964,5,80,0,0,964,965,5,147,0,0,965,966, - 3,266,133,0,966,87,1,0,0,0,967,968,3,90,45,0,968,89,1,0,0,0,969,976,3, - 94,47,0,970,972,5,147,0,0,971,970,1,0,0,0,971,972,1,0,0,0,972,973,1,0, - 0,0,973,975,3,92,46,0,974,971,1,0,0,0,975,978,1,0,0,0,976,974,1,0,0,0, - 976,977,1,0,0,0,977,991,1,0,0,0,978,976,1,0,0,0,979,981,3,128,64,0,980, - 982,5,147,0,0,981,980,1,0,0,0,981,982,1,0,0,0,982,984,1,0,0,0,983,979, - 1,0,0,0,984,985,1,0,0,0,985,983,1,0,0,0,985,986,1,0,0,0,986,987,1,0,0, - 0,987,988,3,94,47,0,988,989,6,45,-1,0,989,991,1,0,0,0,990,969,1,0,0,0, - 990,983,1,0,0,0,991,91,1,0,0,0,992,993,5,82,0,0,993,994,5,147,0,0,994, - 996,5,83,0,0,995,997,5,147,0,0,996,995,1,0,0,0,996,997,1,0,0,0,997,998, - 1,0,0,0,998,1005,3,94,47,0,999,1001,5,82,0,0,1000,1002,5,147,0,0,1001, - 1000,1,0,0,0,1001,1002,1,0,0,0,1002,1003,1,0,0,0,1003,1005,3,94,47,0, - 1004,992,1,0,0,0,1004,999,1,0,0,0,1005,93,1,0,0,0,1006,1009,3,96,48,0, - 1007,1009,3,98,49,0,1008,1006,1,0,0,0,1008,1007,1,0,0,0,1009,95,1,0,0, - 0,1010,1012,3,104,52,0,1011,1013,5,147,0,0,1012,1011,1,0,0,0,1012,1013, - 1,0,0,0,1013,1015,1,0,0,0,1014,1010,1,0,0,0,1015,1018,1,0,0,0,1016,1014, - 1,0,0,0,1016,1017,1,0,0,0,1017,1019,1,0,0,0,1018,1016,1,0,0,0,1019,1056, - 3,128,64,0,1020,1022,3,104,52,0,1021,1023,5,147,0,0,1022,1021,1,0,0,0, - 1022,1023,1,0,0,0,1023,1025,1,0,0,0,1024,1020,1,0,0,0,1025,1028,1,0,0, - 0,1026,1024,1,0,0,0,1026,1027,1,0,0,0,1027,1029,1,0,0,0,1028,1026,1,0, - 0,0,1029,1036,3,102,51,0,1030,1032,5,147,0,0,1031,1030,1,0,0,0,1031,1032, - 1,0,0,0,1032,1033,1,0,0,0,1033,1035,3,102,51,0,1034,1031,1,0,0,0,1035, - 1038,1,0,0,0,1036,1034,1,0,0,0,1036,1037,1,0,0,0,1037,1043,1,0,0,0,1038, - 1036,1,0,0,0,1039,1041,5,147,0,0,1040,1039,1,0,0,0,1040,1041,1,0,0,0, - 1041,1042,1,0,0,0,1042,1044,3,128,64,0,1043,1040,1,0,0,0,1043,1044,1, - 0,0,0,1044,1056,1,0,0,0,1045,1047,3,104,52,0,1046,1048,5,147,0,0,1047, - 1046,1,0,0,0,1047,1048,1,0,0,0,1048,1050,1,0,0,0,1049,1045,1,0,0,0,1050, - 1051,1,0,0,0,1051,1049,1,0,0,0,1051,1052,1,0,0,0,1052,1053,1,0,0,0,1053, - 1054,6,48,-1,0,1054,1056,1,0,0,0,1055,1016,1,0,0,0,1055,1026,1,0,0,0, - 1055,1049,1,0,0,0,1056,97,1,0,0,0,1057,1059,3,100,50,0,1058,1060,5,147, - 0,0,1059,1058,1,0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0,1061,1057,1, - 0,0,0,1062,1063,1,0,0,0,1063,1061,1,0,0,0,1063,1064,1,0,0,0,1064,1065, - 1,0,0,0,1065,1066,3,96,48,0,1066,99,1,0,0,0,1067,1069,3,104,52,0,1068, - 1070,5,147,0,0,1069,1068,1,0,0,0,1069,1070,1,0,0,0,1070,1072,1,0,0,0, - 1071,1067,1,0,0,0,1072,1075,1,0,0,0,1073,1071,1,0,0,0,1073,1074,1,0,0, - 0,1074,1082,1,0,0,0,1075,1073,1,0,0,0,1076,1078,3,102,51,0,1077,1079, - 5,147,0,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079,1081,1,0,0,0,1080, - 1076,1,0,0,0,1081,1084,1,0,0,0,1082,1080,1,0,0,0,1082,1083,1,0,0,0,1083, - 1085,1,0,0,0,1084,1082,1,0,0,0,1085,1086,3,126,63,0,1086,101,1,0,0,0, - 1087,1092,3,114,57,0,1088,1092,3,116,58,0,1089,1092,3,120,60,0,1090,1092, - 3,124,62,0,1091,1087,1,0,0,0,1091,1088,1,0,0,0,1091,1089,1,0,0,0,1091, - 1090,1,0,0,0,1092,103,1,0,0,0,1093,1098,3,110,55,0,1094,1098,3,112,56, - 0,1095,1098,3,108,54,0,1096,1098,3,106,53,0,1097,1093,1,0,0,0,1097,1094, - 1,0,0,0,1097,1095,1,0,0,0,1097,1096,1,0,0,0,1098,105,1,0,0,0,1099,1117, - 5,84,0,0,1100,1101,5,147,0,0,1101,1102,5,95,0,0,1102,1103,5,147,0,0,1103, - 1105,5,85,0,0,1104,1106,5,147,0,0,1105,1104,1,0,0,0,1105,1106,1,0,0,0, - 1106,1107,1,0,0,0,1107,1109,5,2,0,0,1108,1110,5,147,0,0,1109,1108,1,0, - 0,0,1109,1110,1,0,0,0,1110,1111,1,0,0,0,1111,1113,3,62,31,0,1112,1114, - 5,147,0,0,1113,1112,1,0,0,0,1113,1114,1,0,0,0,1114,1115,1,0,0,0,1115, - 1116,5,4,0,0,1116,1118,1,0,0,0,1117,1100,1,0,0,0,1117,1118,1,0,0,0,1118, - 1119,1,0,0,0,1119,1120,5,147,0,0,1120,1121,5,51,0,0,1121,1122,5,147,0, - 0,1122,1127,3,10,5,0,1123,1125,5,147,0,0,1124,1123,1,0,0,0,1124,1125, - 1,0,0,0,1125,1126,1,0,0,0,1126,1128,3,32,16,0,1127,1124,1,0,0,0,1127, - 1128,1,0,0,0,1128,1133,1,0,0,0,1129,1131,5,147,0,0,1130,1129,1,0,0,0, - 1130,1131,1,0,0,0,1131,1132,1,0,0,0,1132,1134,3,144,72,0,1133,1130,1, - 0,0,0,1133,1134,1,0,0,0,1134,107,1,0,0,0,1135,1136,5,46,0,0,1136,1137, - 5,147,0,0,1137,1142,3,248,124,0,1138,1140,5,147,0,0,1139,1138,1,0,0,0, - 1139,1140,1,0,0,0,1140,1141,1,0,0,0,1141,1143,3,144,72,0,1142,1139,1, - 0,0,0,1142,1143,1,0,0,0,1143,109,1,0,0,0,1144,1145,5,86,0,0,1145,1147, - 5,147,0,0,1146,1144,1,0,0,0,1146,1147,1,0,0,0,1147,1148,1,0,0,0,1148, - 1150,5,87,0,0,1149,1151,5,147,0,0,1150,1149,1,0,0,0,1150,1151,1,0,0,0, - 1151,1152,1,0,0,0,1152,1157,3,146,73,0,1153,1155,5,147,0,0,1154,1153, - 1,0,0,0,1154,1155,1,0,0,0,1155,1156,1,0,0,0,1156,1158,3,144,72,0,1157, - 1154,1,0,0,0,1157,1158,1,0,0,0,1158,111,1,0,0,0,1159,1161,5,88,0,0,1160, - 1162,5,147,0,0,1161,1160,1,0,0,0,1161,1162,1,0,0,0,1162,1163,1,0,0,0, - 1163,1164,3,186,93,0,1164,1165,5,147,0,0,1165,1166,5,99,0,0,1166,1167, - 5,147,0,0,1167,1168,3,266,133,0,1168,113,1,0,0,0,1169,1171,5,89,0,0,1170, - 1172,5,147,0,0,1171,1170,1,0,0,0,1171,1172,1,0,0,0,1172,1173,1,0,0,0, - 1173,1174,3,146,73,0,1174,115,1,0,0,0,1175,1177,5,90,0,0,1176,1178,5, - 147,0,0,1177,1176,1,0,0,0,1177,1178,1,0,0,0,1178,1179,1,0,0,0,1179,1184, - 3,146,73,0,1180,1181,5,147,0,0,1181,1183,3,118,59,0,1182,1180,1,0,0,0, - 1183,1186,1,0,0,0,1184,1182,1,0,0,0,1184,1185,1,0,0,0,1185,117,1,0,0, - 0,1186,1184,1,0,0,0,1187,1188,5,91,0,0,1188,1189,5,147,0,0,1189,1190, - 5,87,0,0,1190,1191,5,147,0,0,1191,1198,3,120,60,0,1192,1193,5,91,0,0, - 1193,1194,5,147,0,0,1194,1195,5,89,0,0,1195,1196,5,147,0,0,1196,1198, - 3,120,60,0,1197,1187,1,0,0,0,1197,1192,1,0,0,0,1198,119,1,0,0,0,1199, - 1201,5,92,0,0,1200,1202,5,147,0,0,1201,1200,1,0,0,0,1201,1202,1,0,0,0, - 1202,1203,1,0,0,0,1203,1214,3,122,61,0,1204,1206,5,147,0,0,1205,1204, - 1,0,0,0,1205,1206,1,0,0,0,1206,1207,1,0,0,0,1207,1209,5,3,0,0,1208,1210, - 5,147,0,0,1209,1208,1,0,0,0,1209,1210,1,0,0,0,1210,1211,1,0,0,0,1211, - 1213,3,122,61,0,1212,1205,1,0,0,0,1213,1216,1,0,0,0,1214,1212,1,0,0,0, - 1214,1215,1,0,0,0,1215,121,1,0,0,0,1216,1214,1,0,0,0,1217,1219,3,272, - 136,0,1218,1220,5,147,0,0,1219,1218,1,0,0,0,1219,1220,1,0,0,0,1220,1221, - 1,0,0,0,1221,1223,5,5,0,0,1222,1224,5,147,0,0,1223,1222,1,0,0,0,1223, - 1224,1,0,0,0,1224,1225,1,0,0,0,1225,1226,3,186,93,0,1226,123,1,0,0,0, - 1227,1228,5,93,0,0,1228,1230,5,147,0,0,1229,1227,1,0,0,0,1229,1230,1, - 0,0,0,1230,1231,1,0,0,0,1231,1233,5,94,0,0,1232,1234,5,147,0,0,1233,1232, - 1,0,0,0,1233,1234,1,0,0,0,1234,1235,1,0,0,0,1235,1246,3,186,93,0,1236, - 1238,5,147,0,0,1237,1236,1,0,0,0,1237,1238,1,0,0,0,1238,1239,1,0,0,0, - 1239,1241,5,3,0,0,1240,1242,5,147,0,0,1241,1240,1,0,0,0,1241,1242,1,0, - 0,0,1242,1243,1,0,0,0,1243,1245,3,186,93,0,1244,1237,1,0,0,0,1245,1248, - 1,0,0,0,1246,1244,1,0,0,0,1246,1247,1,0,0,0,1247,125,1,0,0,0,1248,1246, - 1,0,0,0,1249,1250,5,95,0,0,1250,1255,3,130,65,0,1251,1253,5,147,0,0,1252, - 1251,1,0,0,0,1252,1253,1,0,0,0,1253,1254,1,0,0,0,1254,1256,3,144,72,0, - 1255,1252,1,0,0,0,1255,1256,1,0,0,0,1256,127,1,0,0,0,1257,1258,5,96,0, - 0,1258,1259,3,130,65,0,1259,129,1,0,0,0,1260,1262,5,147,0,0,1261,1260, - 1,0,0,0,1261,1262,1,0,0,0,1262,1263,1,0,0,0,1263,1265,5,97,0,0,1264,1261, - 1,0,0,0,1264,1265,1,0,0,0,1265,1266,1,0,0,0,1266,1267,5,147,0,0,1267, - 1270,3,132,66,0,1268,1269,5,147,0,0,1269,1271,3,136,68,0,1270,1268,1, - 0,0,0,1270,1271,1,0,0,0,1271,1274,1,0,0,0,1272,1273,5,147,0,0,1273,1275, - 3,138,69,0,1274,1272,1,0,0,0,1274,1275,1,0,0,0,1275,1278,1,0,0,0,1276, - 1277,5,147,0,0,1277,1279,3,140,70,0,1278,1276,1,0,0,0,1278,1279,1,0,0, - 0,1279,131,1,0,0,0,1280,1291,5,98,0,0,1281,1283,5,147,0,0,1282,1281,1, - 0,0,0,1282,1283,1,0,0,0,1283,1284,1,0,0,0,1284,1286,5,3,0,0,1285,1287, - 5,147,0,0,1286,1285,1,0,0,0,1286,1287,1,0,0,0,1287,1288,1,0,0,0,1288, - 1290,3,134,67,0,1289,1282,1,0,0,0,1290,1293,1,0,0,0,1291,1289,1,0,0,0, - 1291,1292,1,0,0,0,1292,1309,1,0,0,0,1293,1291,1,0,0,0,1294,1305,3,134, - 67,0,1295,1297,5,147,0,0,1296,1295,1,0,0,0,1296,1297,1,0,0,0,1297,1298, - 1,0,0,0,1298,1300,5,3,0,0,1299,1301,5,147,0,0,1300,1299,1,0,0,0,1300, - 1301,1,0,0,0,1301,1302,1,0,0,0,1302,1304,3,134,67,0,1303,1296,1,0,0,0, - 1304,1307,1,0,0,0,1305,1303,1,0,0,0,1305,1306,1,0,0,0,1306,1309,1,0,0, - 0,1307,1305,1,0,0,0,1308,1280,1,0,0,0,1308,1294,1,0,0,0,1309,133,1,0, - 0,0,1310,1311,3,186,93,0,1311,1312,5,147,0,0,1312,1313,5,99,0,0,1313, - 1314,5,147,0,0,1314,1315,3,266,133,0,1315,1318,1,0,0,0,1316,1318,3,186, - 93,0,1317,1310,1,0,0,0,1317,1316,1,0,0,0,1318,135,1,0,0,0,1319,1320,5, - 100,0,0,1320,1321,5,147,0,0,1321,1322,5,101,0,0,1322,1323,5,147,0,0,1323, - 1331,3,142,71,0,1324,1326,5,3,0,0,1325,1327,5,147,0,0,1326,1325,1,0,0, - 0,1326,1327,1,0,0,0,1327,1328,1,0,0,0,1328,1330,3,142,71,0,1329,1324, - 1,0,0,0,1330,1333,1,0,0,0,1331,1329,1,0,0,0,1331,1332,1,0,0,0,1332,137, - 1,0,0,0,1333,1331,1,0,0,0,1334,1335,5,102,0,0,1335,1336,5,147,0,0,1336, - 1337,3,186,93,0,1337,139,1,0,0,0,1338,1339,5,103,0,0,1339,1340,5,147, - 0,0,1340,1341,3,186,93,0,1341,141,1,0,0,0,1342,1347,3,186,93,0,1343,1345, - 5,147,0,0,1344,1343,1,0,0,0,1344,1345,1,0,0,0,1345,1346,1,0,0,0,1346, - 1348,7,1,0,0,1347,1344,1,0,0,0,1347,1348,1,0,0,0,1348,143,1,0,0,0,1349, - 1350,5,108,0,0,1350,1351,5,147,0,0,1351,1352,3,186,93,0,1352,145,1,0, - 0,0,1353,1364,3,148,74,0,1354,1356,5,147,0,0,1355,1354,1,0,0,0,1355,1356, - 1,0,0,0,1356,1357,1,0,0,0,1357,1359,5,3,0,0,1358,1360,5,147,0,0,1359, - 1358,1,0,0,0,1359,1360,1,0,0,0,1360,1361,1,0,0,0,1361,1363,3,148,74,0, - 1362,1355,1,0,0,0,1363,1366,1,0,0,0,1364,1362,1,0,0,0,1364,1365,1,0,0, - 0,1365,147,1,0,0,0,1366,1364,1,0,0,0,1367,1369,3,266,133,0,1368,1370, - 5,147,0,0,1369,1368,1,0,0,0,1369,1370,1,0,0,0,1370,1371,1,0,0,0,1371, - 1373,5,5,0,0,1372,1374,5,147,0,0,1373,1372,1,0,0,0,1373,1374,1,0,0,0, - 1374,1375,1,0,0,0,1375,1376,3,150,75,0,1376,1379,1,0,0,0,1377,1379,3, - 150,75,0,1378,1367,1,0,0,0,1378,1377,1,0,0,0,1379,149,1,0,0,0,1380,1381, - 3,152,76,0,1381,151,1,0,0,0,1382,1389,3,154,77,0,1383,1385,5,147,0,0, - 1384,1383,1,0,0,0,1384,1385,1,0,0,0,1385,1386,1,0,0,0,1386,1388,3,156, - 78,0,1387,1384,1,0,0,0,1388,1391,1,0,0,0,1389,1387,1,0,0,0,1389,1390, - 1,0,0,0,1390,1397,1,0,0,0,1391,1389,1,0,0,0,1392,1393,5,2,0,0,1393,1394, - 3,152,76,0,1394,1395,5,4,0,0,1395,1397,1,0,0,0,1396,1382,1,0,0,0,1396, - 1392,1,0,0,0,1397,153,1,0,0,0,1398,1400,5,2,0,0,1399,1401,5,147,0,0,1400, - 1399,1,0,0,0,1400,1401,1,0,0,0,1401,1406,1,0,0,0,1402,1404,3,266,133, - 0,1403,1405,5,147,0,0,1404,1403,1,0,0,0,1404,1405,1,0,0,0,1405,1407,1, - 0,0,0,1406,1402,1,0,0,0,1406,1407,1,0,0,0,1407,1412,1,0,0,0,1408,1410, - 3,166,83,0,1409,1411,5,147,0,0,1410,1409,1,0,0,0,1410,1411,1,0,0,0,1411, - 1413,1,0,0,0,1412,1408,1,0,0,0,1412,1413,1,0,0,0,1413,1418,1,0,0,0,1414, - 1416,3,162,81,0,1415,1417,5,147,0,0,1416,1415,1,0,0,0,1416,1417,1,0,0, - 0,1417,1419,1,0,0,0,1418,1414,1,0,0,0,1418,1419,1,0,0,0,1419,1420,1,0, - 0,0,1420,1421,5,4,0,0,1421,155,1,0,0,0,1422,1424,3,158,79,0,1423,1425, - 5,147,0,0,1424,1423,1,0,0,0,1424,1425,1,0,0,0,1425,1426,1,0,0,0,1426, - 1427,3,154,77,0,1427,157,1,0,0,0,1428,1430,3,286,143,0,1429,1431,5,147, - 0,0,1430,1429,1,0,0,0,1430,1431,1,0,0,0,1431,1432,1,0,0,0,1432,1434,3, - 290,145,0,1433,1435,5,147,0,0,1434,1433,1,0,0,0,1434,1435,1,0,0,0,1435, - 1437,1,0,0,0,1436,1438,3,160,80,0,1437,1436,1,0,0,0,1437,1438,1,0,0,0, - 1438,1440,1,0,0,0,1439,1441,5,147,0,0,1440,1439,1,0,0,0,1440,1441,1,0, - 0,0,1441,1442,1,0,0,0,1442,1443,3,290,145,0,1443,1473,1,0,0,0,1444,1446, - 3,290,145,0,1445,1447,5,147,0,0,1446,1445,1,0,0,0,1446,1447,1,0,0,0,1447, - 1449,1,0,0,0,1448,1450,3,160,80,0,1449,1448,1,0,0,0,1449,1450,1,0,0,0, - 1450,1452,1,0,0,0,1451,1453,5,147,0,0,1452,1451,1,0,0,0,1452,1453,1,0, - 0,0,1453,1454,1,0,0,0,1454,1456,3,290,145,0,1455,1457,5,147,0,0,1456, - 1455,1,0,0,0,1456,1457,1,0,0,0,1457,1458,1,0,0,0,1458,1459,3,288,144, - 0,1459,1473,1,0,0,0,1460,1462,3,290,145,0,1461,1463,5,147,0,0,1462,1461, - 1,0,0,0,1462,1463,1,0,0,0,1463,1465,1,0,0,0,1464,1466,3,160,80,0,1465, - 1464,1,0,0,0,1465,1466,1,0,0,0,1466,1468,1,0,0,0,1467,1469,5,147,0,0, - 1468,1467,1,0,0,0,1468,1469,1,0,0,0,1469,1470,1,0,0,0,1470,1471,3,290, - 145,0,1471,1473,1,0,0,0,1472,1428,1,0,0,0,1472,1444,1,0,0,0,1472,1460, - 1,0,0,0,1473,159,1,0,0,0,1474,1476,5,6,0,0,1475,1477,5,147,0,0,1476,1475, - 1,0,0,0,1476,1477,1,0,0,0,1477,1482,1,0,0,0,1478,1480,3,266,133,0,1479, - 1481,5,147,0,0,1480,1479,1,0,0,0,1480,1481,1,0,0,0,1481,1483,1,0,0,0, - 1482,1478,1,0,0,0,1482,1483,1,0,0,0,1483,1488,1,0,0,0,1484,1486,3,164, - 82,0,1485,1487,5,147,0,0,1486,1485,1,0,0,0,1486,1487,1,0,0,0,1487,1489, - 1,0,0,0,1488,1484,1,0,0,0,1488,1489,1,0,0,0,1489,1494,1,0,0,0,1490,1492, - 3,170,85,0,1491,1493,5,147,0,0,1492,1491,1,0,0,0,1492,1493,1,0,0,0,1493, - 1495,1,0,0,0,1494,1490,1,0,0,0,1494,1495,1,0,0,0,1495,1500,1,0,0,0,1496, - 1498,3,162,81,0,1497,1499,5,147,0,0,1498,1497,1,0,0,0,1498,1499,1,0,0, - 0,1499,1501,1,0,0,0,1500,1496,1,0,0,0,1500,1501,1,0,0,0,1501,1502,1,0, - 0,0,1502,1503,5,7,0,0,1503,161,1,0,0,0,1504,1506,5,8,0,0,1505,1507,5, - 147,0,0,1506,1505,1,0,0,0,1506,1507,1,0,0,0,1507,1541,1,0,0,0,1508,1510, - 3,274,137,0,1509,1511,5,147,0,0,1510,1509,1,0,0,0,1510,1511,1,0,0,0,1511, - 1512,1,0,0,0,1512,1514,5,117,0,0,1513,1515,5,147,0,0,1514,1513,1,0,0, - 0,1514,1515,1,0,0,0,1515,1516,1,0,0,0,1516,1518,3,186,93,0,1517,1519, - 5,147,0,0,1518,1517,1,0,0,0,1518,1519,1,0,0,0,1519,1538,1,0,0,0,1520, - 1522,5,3,0,0,1521,1523,5,147,0,0,1522,1521,1,0,0,0,1522,1523,1,0,0,0, - 1523,1524,1,0,0,0,1524,1526,3,274,137,0,1525,1527,5,147,0,0,1526,1525, - 1,0,0,0,1526,1527,1,0,0,0,1527,1528,1,0,0,0,1528,1530,5,117,0,0,1529, - 1531,5,147,0,0,1530,1529,1,0,0,0,1530,1531,1,0,0,0,1531,1532,1,0,0,0, - 1532,1534,3,186,93,0,1533,1535,5,147,0,0,1534,1533,1,0,0,0,1534,1535, - 1,0,0,0,1535,1537,1,0,0,0,1536,1520,1,0,0,0,1537,1540,1,0,0,0,1538,1536, - 1,0,0,0,1538,1539,1,0,0,0,1539,1542,1,0,0,0,1540,1538,1,0,0,0,1541,1508, - 1,0,0,0,1541,1542,1,0,0,0,1542,1543,1,0,0,0,1543,1544,5,9,0,0,1544,163, - 1,0,0,0,1545,1547,5,117,0,0,1546,1548,5,147,0,0,1547,1546,1,0,0,0,1547, - 1548,1,0,0,0,1548,1549,1,0,0,0,1549,1563,3,184,92,0,1550,1552,5,147,0, - 0,1551,1550,1,0,0,0,1551,1552,1,0,0,0,1552,1553,1,0,0,0,1553,1555,5,10, - 0,0,1554,1556,5,117,0,0,1555,1554,1,0,0,0,1555,1556,1,0,0,0,1556,1558, - 1,0,0,0,1557,1559,5,147,0,0,1558,1557,1,0,0,0,1558,1559,1,0,0,0,1559, - 1560,1,0,0,0,1560,1562,3,184,92,0,1561,1551,1,0,0,0,1562,1565,1,0,0,0, - 1563,1561,1,0,0,0,1563,1564,1,0,0,0,1564,165,1,0,0,0,1565,1563,1,0,0, - 0,1566,1573,3,168,84,0,1567,1569,5,147,0,0,1568,1567,1,0,0,0,1568,1569, - 1,0,0,0,1569,1570,1,0,0,0,1570,1572,3,168,84,0,1571,1568,1,0,0,0,1572, - 1575,1,0,0,0,1573,1571,1,0,0,0,1573,1574,1,0,0,0,1574,167,1,0,0,0,1575, - 1573,1,0,0,0,1576,1578,5,117,0,0,1577,1579,5,147,0,0,1578,1577,1,0,0, - 0,1578,1579,1,0,0,0,1579,1580,1,0,0,0,1580,1581,3,182,91,0,1581,169,1, - 0,0,0,1582,1584,5,98,0,0,1583,1585,5,147,0,0,1584,1583,1,0,0,0,1584,1585, - 1,0,0,0,1585,1590,1,0,0,0,1586,1591,5,109,0,0,1587,1588,5,83,0,0,1588, - 1589,5,147,0,0,1589,1591,5,109,0,0,1590,1586,1,0,0,0,1590,1587,1,0,0, - 0,1590,1591,1,0,0,0,1591,1593,1,0,0,0,1592,1594,5,147,0,0,1593,1592,1, - 0,0,0,1593,1594,1,0,0,0,1594,1609,1,0,0,0,1595,1597,3,178,89,0,1596,1595, - 1,0,0,0,1596,1597,1,0,0,0,1597,1599,1,0,0,0,1598,1600,5,147,0,0,1599, - 1598,1,0,0,0,1599,1600,1,0,0,0,1600,1601,1,0,0,0,1601,1603,5,11,0,0,1602, - 1604,5,147,0,0,1603,1602,1,0,0,0,1603,1604,1,0,0,0,1604,1606,1,0,0,0, - 1605,1607,3,180,90,0,1606,1605,1,0,0,0,1606,1607,1,0,0,0,1607,1610,1, - 0,0,0,1608,1610,3,276,138,0,1609,1596,1,0,0,0,1609,1608,1,0,0,0,1609, - 1610,1,0,0,0,1610,1615,1,0,0,0,1611,1613,5,147,0,0,1612,1611,1,0,0,0, - 1612,1613,1,0,0,0,1613,1614,1,0,0,0,1614,1616,3,172,86,0,1615,1612,1, - 0,0,0,1615,1616,1,0,0,0,1616,171,1,0,0,0,1617,1619,5,2,0,0,1618,1620, - 5,147,0,0,1619,1618,1,0,0,0,1619,1620,1,0,0,0,1620,1621,1,0,0,0,1621, - 1623,3,266,133,0,1622,1624,5,147,0,0,1623,1622,1,0,0,0,1623,1624,1,0, - 0,0,1624,1625,1,0,0,0,1625,1627,5,3,0,0,1626,1628,5,147,0,0,1627,1626, - 1,0,0,0,1627,1628,1,0,0,0,1628,1629,1,0,0,0,1629,1638,3,266,133,0,1630, - 1632,5,147,0,0,1631,1630,1,0,0,0,1631,1632,1,0,0,0,1632,1633,1,0,0,0, - 1633,1635,5,10,0,0,1634,1636,5,147,0,0,1635,1634,1,0,0,0,1635,1636,1, - 0,0,0,1636,1637,1,0,0,0,1637,1639,3,144,72,0,1638,1631,1,0,0,0,1638,1639, - 1,0,0,0,1639,1659,1,0,0,0,1640,1642,5,147,0,0,1641,1640,1,0,0,0,1641, - 1642,1,0,0,0,1642,1643,1,0,0,0,1643,1645,5,10,0,0,1644,1646,5,147,0,0, - 1645,1644,1,0,0,0,1645,1646,1,0,0,0,1646,1647,1,0,0,0,1647,1649,3,176, - 88,0,1648,1650,5,147,0,0,1649,1648,1,0,0,0,1649,1650,1,0,0,0,1650,1651, - 1,0,0,0,1651,1653,5,3,0,0,1652,1654,5,147,0,0,1653,1652,1,0,0,0,1653, - 1654,1,0,0,0,1654,1655,1,0,0,0,1655,1657,3,174,87,0,1656,1658,5,147,0, - 0,1657,1656,1,0,0,0,1657,1658,1,0,0,0,1658,1660,1,0,0,0,1659,1641,1,0, - 0,0,1659,1660,1,0,0,0,1660,1661,1,0,0,0,1661,1662,5,4,0,0,1662,173,1, - 0,0,0,1663,1665,5,8,0,0,1664,1666,5,147,0,0,1665,1664,1,0,0,0,1665,1666, - 1,0,0,0,1666,1668,1,0,0,0,1667,1669,3,132,66,0,1668,1667,1,0,0,0,1668, - 1669,1,0,0,0,1669,1671,1,0,0,0,1670,1672,5,147,0,0,1671,1670,1,0,0,0, - 1671,1672,1,0,0,0,1672,1673,1,0,0,0,1673,1674,5,9,0,0,1674,175,1,0,0, - 0,1675,1677,5,8,0,0,1676,1678,5,147,0,0,1677,1676,1,0,0,0,1677,1678,1, - 0,0,0,1678,1680,1,0,0,0,1679,1681,3,132,66,0,1680,1679,1,0,0,0,1680,1681, - 1,0,0,0,1681,1683,1,0,0,0,1682,1684,5,147,0,0,1683,1682,1,0,0,0,1683, - 1684,1,0,0,0,1684,1685,1,0,0,0,1685,1686,5,9,0,0,1686,177,1,0,0,0,1687, - 1688,5,135,0,0,1688,179,1,0,0,0,1689,1690,5,135,0,0,1690,181,1,0,0,0, - 1691,1692,3,280,140,0,1692,183,1,0,0,0,1693,1694,3,280,140,0,1694,185, - 1,0,0,0,1695,1696,3,188,94,0,1696,187,1,0,0,0,1697,1704,3,190,95,0,1698, - 1699,5,147,0,0,1699,1700,5,110,0,0,1700,1701,5,147,0,0,1701,1703,3,190, - 95,0,1702,1698,1,0,0,0,1703,1706,1,0,0,0,1704,1702,1,0,0,0,1704,1705, - 1,0,0,0,1705,189,1,0,0,0,1706,1704,1,0,0,0,1707,1714,3,192,96,0,1708, - 1709,5,147,0,0,1709,1710,5,111,0,0,1710,1711,5,147,0,0,1711,1713,3,192, - 96,0,1712,1708,1,0,0,0,1713,1716,1,0,0,0,1714,1712,1,0,0,0,1714,1715, - 1,0,0,0,1715,191,1,0,0,0,1716,1714,1,0,0,0,1717,1724,3,194,97,0,1718, - 1719,5,147,0,0,1719,1720,5,112,0,0,1720,1721,5,147,0,0,1721,1723,3,194, - 97,0,1722,1718,1,0,0,0,1723,1726,1,0,0,0,1724,1722,1,0,0,0,1724,1725, - 1,0,0,0,1725,193,1,0,0,0,1726,1724,1,0,0,0,1727,1729,5,113,0,0,1728,1730, - 5,147,0,0,1729,1728,1,0,0,0,1729,1730,1,0,0,0,1730,1732,1,0,0,0,1731, - 1727,1,0,0,0,1732,1735,1,0,0,0,1733,1731,1,0,0,0,1733,1734,1,0,0,0,1734, - 1736,1,0,0,0,1735,1733,1,0,0,0,1736,1737,3,196,98,0,1737,195,1,0,0,0, - 1738,1748,3,200,100,0,1739,1741,5,147,0,0,1740,1739,1,0,0,0,1740,1741, - 1,0,0,0,1741,1742,1,0,0,0,1742,1744,3,198,99,0,1743,1745,5,147,0,0,1744, - 1743,1,0,0,0,1744,1745,1,0,0,0,1745,1746,1,0,0,0,1746,1747,3,200,100, - 0,1747,1749,1,0,0,0,1748,1740,1,0,0,0,1748,1749,1,0,0,0,1749,1787,1,0, - 0,0,1750,1752,3,200,100,0,1751,1753,5,147,0,0,1752,1751,1,0,0,0,1752, - 1753,1,0,0,0,1753,1754,1,0,0,0,1754,1756,5,114,0,0,1755,1757,5,147,0, - 0,1756,1755,1,0,0,0,1756,1757,1,0,0,0,1757,1758,1,0,0,0,1758,1759,3,200, - 100,0,1759,1760,1,0,0,0,1760,1761,6,98,-1,0,1761,1787,1,0,0,0,1762,1764, - 3,200,100,0,1763,1765,5,147,0,0,1764,1763,1,0,0,0,1764,1765,1,0,0,0,1765, - 1766,1,0,0,0,1766,1768,3,198,99,0,1767,1769,5,147,0,0,1768,1767,1,0,0, - 0,1768,1769,1,0,0,0,1769,1770,1,0,0,0,1770,1780,3,200,100,0,1771,1773, - 5,147,0,0,1772,1771,1,0,0,0,1772,1773,1,0,0,0,1773,1774,1,0,0,0,1774, - 1776,3,198,99,0,1775,1777,5,147,0,0,1776,1775,1,0,0,0,1776,1777,1,0,0, - 0,1777,1778,1,0,0,0,1778,1779,3,200,100,0,1779,1781,1,0,0,0,1780,1772, - 1,0,0,0,1781,1782,1,0,0,0,1782,1780,1,0,0,0,1782,1783,1,0,0,0,1783,1784, - 1,0,0,0,1784,1785,6,98,-1,0,1785,1787,1,0,0,0,1786,1738,1,0,0,0,1786, - 1750,1,0,0,0,1786,1762,1,0,0,0,1787,197,1,0,0,0,1788,1789,7,2,0,0,1789, - 199,1,0,0,0,1790,1801,3,202,101,0,1791,1793,5,147,0,0,1792,1791,1,0,0, - 0,1792,1793,1,0,0,0,1793,1794,1,0,0,0,1794,1796,5,10,0,0,1795,1797,5, - 147,0,0,1796,1795,1,0,0,0,1796,1797,1,0,0,0,1797,1798,1,0,0,0,1798,1800, - 3,202,101,0,1799,1792,1,0,0,0,1800,1803,1,0,0,0,1801,1799,1,0,0,0,1801, - 1802,1,0,0,0,1802,201,1,0,0,0,1803,1801,1,0,0,0,1804,1815,3,204,102,0, - 1805,1807,5,147,0,0,1806,1805,1,0,0,0,1806,1807,1,0,0,0,1807,1808,1,0, - 0,0,1808,1810,5,17,0,0,1809,1811,5,147,0,0,1810,1809,1,0,0,0,1810,1811, - 1,0,0,0,1811,1812,1,0,0,0,1812,1814,3,204,102,0,1813,1806,1,0,0,0,1814, - 1817,1,0,0,0,1815,1813,1,0,0,0,1815,1816,1,0,0,0,1816,203,1,0,0,0,1817, - 1815,1,0,0,0,1818,1830,3,208,104,0,1819,1821,5,147,0,0,1820,1819,1,0, - 0,0,1820,1821,1,0,0,0,1821,1822,1,0,0,0,1822,1824,3,206,103,0,1823,1825, - 5,147,0,0,1824,1823,1,0,0,0,1824,1825,1,0,0,0,1825,1826,1,0,0,0,1826, - 1827,3,208,104,0,1827,1829,1,0,0,0,1828,1820,1,0,0,0,1829,1832,1,0,0, - 0,1830,1828,1,0,0,0,1830,1831,1,0,0,0,1831,205,1,0,0,0,1832,1830,1,0, - 0,0,1833,1834,7,3,0,0,1834,207,1,0,0,0,1835,1847,3,212,106,0,1836,1838, - 5,147,0,0,1837,1836,1,0,0,0,1837,1838,1,0,0,0,1838,1839,1,0,0,0,1839, - 1841,3,210,105,0,1840,1842,5,147,0,0,1841,1840,1,0,0,0,1841,1842,1,0, - 0,0,1842,1843,1,0,0,0,1843,1844,3,212,106,0,1844,1846,1,0,0,0,1845,1837, - 1,0,0,0,1846,1849,1,0,0,0,1847,1845,1,0,0,0,1847,1848,1,0,0,0,1848,209, - 1,0,0,0,1849,1847,1,0,0,0,1850,1851,7,4,0,0,1851,211,1,0,0,0,1852,1864, - 3,216,108,0,1853,1855,5,147,0,0,1854,1853,1,0,0,0,1854,1855,1,0,0,0,1855, - 1856,1,0,0,0,1856,1858,3,214,107,0,1857,1859,5,147,0,0,1858,1857,1,0, - 0,0,1858,1859,1,0,0,0,1859,1860,1,0,0,0,1860,1861,3,216,108,0,1861,1863, - 1,0,0,0,1862,1854,1,0,0,0,1863,1866,1,0,0,0,1864,1862,1,0,0,0,1864,1865, - 1,0,0,0,1865,213,1,0,0,0,1866,1864,1,0,0,0,1867,1868,7,5,0,0,1868,215, - 1,0,0,0,1869,1880,3,218,109,0,1870,1872,5,147,0,0,1871,1870,1,0,0,0,1871, - 1872,1,0,0,0,1872,1873,1,0,0,0,1873,1875,5,23,0,0,1874,1876,5,147,0,0, - 1875,1874,1,0,0,0,1875,1876,1,0,0,0,1876,1877,1,0,0,0,1877,1879,3,218, - 109,0,1878,1871,1,0,0,0,1879,1882,1,0,0,0,1880,1878,1,0,0,0,1880,1881, - 1,0,0,0,1881,217,1,0,0,0,1882,1880,1,0,0,0,1883,1885,5,115,0,0,1884,1886, - 5,147,0,0,1885,1884,1,0,0,0,1885,1886,1,0,0,0,1886,1888,1,0,0,0,1887, - 1883,1,0,0,0,1888,1891,1,0,0,0,1889,1887,1,0,0,0,1889,1890,1,0,0,0,1890, - 1892,1,0,0,0,1891,1889,1,0,0,0,1892,1897,3,220,110,0,1893,1895,5,147, - 0,0,1894,1893,1,0,0,0,1894,1895,1,0,0,0,1895,1896,1,0,0,0,1896,1898,5, - 116,0,0,1897,1894,1,0,0,0,1897,1898,1,0,0,0,1898,219,1,0,0,0,1899,1907, - 3,230,115,0,1900,1908,3,224,112,0,1901,1903,3,222,111,0,1902,1901,1,0, - 0,0,1903,1904,1,0,0,0,1904,1902,1,0,0,0,1904,1905,1,0,0,0,1905,1908,1, - 0,0,0,1906,1908,3,228,114,0,1907,1900,1,0,0,0,1907,1902,1,0,0,0,1907, - 1906,1,0,0,0,1907,1908,1,0,0,0,1908,221,1,0,0,0,1909,1910,5,147,0,0,1910, - 1912,5,118,0,0,1911,1913,5,147,0,0,1912,1911,1,0,0,0,1912,1913,1,0,0, - 0,1913,1914,1,0,0,0,1914,1929,3,230,115,0,1915,1916,5,6,0,0,1916,1917, - 3,186,93,0,1917,1918,5,7,0,0,1918,1929,1,0,0,0,1919,1921,5,6,0,0,1920, - 1922,3,186,93,0,1921,1920,1,0,0,0,1921,1922,1,0,0,0,1922,1923,1,0,0,0, - 1923,1925,5,117,0,0,1924,1926,3,186,93,0,1925,1924,1,0,0,0,1925,1926, - 1,0,0,0,1926,1927,1,0,0,0,1927,1929,5,7,0,0,1928,1909,1,0,0,0,1928,1915, - 1,0,0,0,1928,1919,1,0,0,0,1929,223,1,0,0,0,1930,1942,3,226,113,0,1931, - 1932,5,147,0,0,1932,1933,5,119,0,0,1933,1934,5,147,0,0,1934,1942,5,95, - 0,0,1935,1936,5,147,0,0,1936,1937,5,120,0,0,1937,1938,5,147,0,0,1938, - 1942,5,95,0,0,1939,1940,5,147,0,0,1940,1942,5,121,0,0,1941,1930,1,0,0, - 0,1941,1931,1,0,0,0,1941,1935,1,0,0,0,1941,1939,1,0,0,0,1942,1944,1,0, - 0,0,1943,1945,5,147,0,0,1944,1943,1,0,0,0,1944,1945,1,0,0,0,1945,1946, - 1,0,0,0,1946,1947,3,230,115,0,1947,225,1,0,0,0,1948,1950,5,147,0,0,1949, - 1948,1,0,0,0,1949,1950,1,0,0,0,1950,1951,1,0,0,0,1951,1952,5,24,0,0,1952, - 227,1,0,0,0,1953,1954,5,147,0,0,1954,1955,5,122,0,0,1955,1956,5,147,0, - 0,1956,1964,5,123,0,0,1957,1958,5,147,0,0,1958,1959,5,122,0,0,1959,1960, - 5,147,0,0,1960,1961,5,113,0,0,1961,1962,5,147,0,0,1962,1964,5,123,0,0, - 1963,1953,1,0,0,0,1963,1957,1,0,0,0,1964,229,1,0,0,0,1965,1972,3,232, - 116,0,1966,1968,5,147,0,0,1967,1966,1,0,0,0,1967,1968,1,0,0,0,1968,1969, - 1,0,0,0,1969,1971,3,260,130,0,1970,1967,1,0,0,0,1971,1974,1,0,0,0,1972, - 1970,1,0,0,0,1972,1973,1,0,0,0,1973,231,1,0,0,0,1974,1972,1,0,0,0,1975, - 1985,3,234,117,0,1976,1985,3,270,135,0,1977,1985,3,262,131,0,1978,1985, - 3,246,123,0,1979,1985,3,248,124,0,1980,1985,3,254,127,0,1981,1985,3,256, - 128,0,1982,1985,3,258,129,0,1983,1985,3,266,133,0,1984,1975,1,0,0,0,1984, - 1976,1,0,0,0,1984,1977,1,0,0,0,1984,1978,1,0,0,0,1984,1979,1,0,0,0,1984, - 1980,1,0,0,0,1984,1981,1,0,0,0,1984,1982,1,0,0,0,1984,1983,1,0,0,0,1985, - 233,1,0,0,0,1986,1993,3,268,134,0,1987,1993,5,133,0,0,1988,1993,3,236, - 118,0,1989,1993,5,123,0,0,1990,1993,3,238,119,0,1991,1993,3,242,121,0, - 1992,1986,1,0,0,0,1992,1987,1,0,0,0,1992,1988,1,0,0,0,1992,1989,1,0,0, - 0,1992,1990,1,0,0,0,1992,1991,1,0,0,0,1993,235,1,0,0,0,1994,1995,7,6, - 0,0,1995,237,1,0,0,0,1996,1998,5,6,0,0,1997,1999,5,147,0,0,1998,1997, - 1,0,0,0,1998,1999,1,0,0,0,1999,2013,1,0,0,0,2000,2002,3,186,93,0,2001, - 2003,5,147,0,0,2002,2001,1,0,0,0,2002,2003,1,0,0,0,2003,2010,1,0,0,0, - 2004,2006,3,240,120,0,2005,2007,5,147,0,0,2006,2005,1,0,0,0,2006,2007, - 1,0,0,0,2007,2009,1,0,0,0,2008,2004,1,0,0,0,2009,2012,1,0,0,0,2010,2008, - 1,0,0,0,2010,2011,1,0,0,0,2011,2014,1,0,0,0,2012,2010,1,0,0,0,2013,2000, - 1,0,0,0,2013,2014,1,0,0,0,2014,2015,1,0,0,0,2015,2016,5,7,0,0,2016,239, - 1,0,0,0,2017,2019,5,3,0,0,2018,2020,5,147,0,0,2019,2018,1,0,0,0,2019, - 2020,1,0,0,0,2020,2022,1,0,0,0,2021,2023,3,186,93,0,2022,2021,1,0,0,0, - 2022,2023,1,0,0,0,2023,241,1,0,0,0,2024,2026,5,8,0,0,2025,2027,5,147, - 0,0,2026,2025,1,0,0,0,2026,2027,1,0,0,0,2027,2028,1,0,0,0,2028,2030,3, - 244,122,0,2029,2031,5,147,0,0,2030,2029,1,0,0,0,2030,2031,1,0,0,0,2031, - 2042,1,0,0,0,2032,2034,5,3,0,0,2033,2035,5,147,0,0,2034,2033,1,0,0,0, - 2034,2035,1,0,0,0,2035,2036,1,0,0,0,2036,2038,3,244,122,0,2037,2039,5, - 147,0,0,2038,2037,1,0,0,0,2038,2039,1,0,0,0,2039,2041,1,0,0,0,2040,2032, - 1,0,0,0,2041,2044,1,0,0,0,2042,2040,1,0,0,0,2042,2043,1,0,0,0,2043,2045, - 1,0,0,0,2044,2042,1,0,0,0,2045,2046,5,9,0,0,2046,243,1,0,0,0,2047,2050, - 3,282,141,0,2048,2050,5,133,0,0,2049,2047,1,0,0,0,2049,2048,1,0,0,0,2050, - 2052,1,0,0,0,2051,2053,5,147,0,0,2052,2051,1,0,0,0,2052,2053,1,0,0,0, - 2053,2054,1,0,0,0,2054,2056,5,117,0,0,2055,2057,5,147,0,0,2056,2055,1, - 0,0,0,2056,2057,1,0,0,0,2057,2058,1,0,0,0,2058,2059,3,186,93,0,2059,245, - 1,0,0,0,2060,2062,5,2,0,0,2061,2063,5,147,0,0,2062,2061,1,0,0,0,2062, - 2063,1,0,0,0,2063,2064,1,0,0,0,2064,2066,3,186,93,0,2065,2067,5,147,0, - 0,2066,2065,1,0,0,0,2066,2067,1,0,0,0,2067,2068,1,0,0,0,2068,2069,5,4, - 0,0,2069,247,1,0,0,0,2070,2072,5,126,0,0,2071,2073,5,147,0,0,2072,2071, - 1,0,0,0,2072,2073,1,0,0,0,2073,2074,1,0,0,0,2074,2076,5,2,0,0,2075,2077, - 5,147,0,0,2076,2075,1,0,0,0,2076,2077,1,0,0,0,2077,2078,1,0,0,0,2078, - 2080,5,98,0,0,2079,2081,5,147,0,0,2080,2079,1,0,0,0,2080,2081,1,0,0,0, - 2081,2082,1,0,0,0,2082,2119,5,4,0,0,2083,2085,3,250,125,0,2084,2086,5, - 147,0,0,2085,2084,1,0,0,0,2085,2086,1,0,0,0,2086,2087,1,0,0,0,2087,2089, - 5,2,0,0,2088,2090,5,147,0,0,2089,2088,1,0,0,0,2089,2090,1,0,0,0,2090, - 2095,1,0,0,0,2091,2093,5,97,0,0,2092,2094,5,147,0,0,2093,2092,1,0,0,0, - 2093,2094,1,0,0,0,2094,2096,1,0,0,0,2095,2091,1,0,0,0,2095,2096,1,0,0, - 0,2096,2114,1,0,0,0,2097,2099,3,252,126,0,2098,2100,5,147,0,0,2099,2098, - 1,0,0,0,2099,2100,1,0,0,0,2100,2111,1,0,0,0,2101,2103,5,3,0,0,2102,2104, - 5,147,0,0,2103,2102,1,0,0,0,2103,2104,1,0,0,0,2104,2105,1,0,0,0,2105, - 2107,3,252,126,0,2106,2108,5,147,0,0,2107,2106,1,0,0,0,2107,2108,1,0, - 0,0,2108,2110,1,0,0,0,2109,2101,1,0,0,0,2110,2113,1,0,0,0,2111,2109,1, - 0,0,0,2111,2112,1,0,0,0,2112,2115,1,0,0,0,2113,2111,1,0,0,0,2114,2097, - 1,0,0,0,2114,2115,1,0,0,0,2115,2116,1,0,0,0,2116,2117,5,4,0,0,2117,2119, - 1,0,0,0,2118,2070,1,0,0,0,2118,2083,1,0,0,0,2119,249,1,0,0,0,2120,2121, - 3,282,141,0,2121,251,1,0,0,0,2122,2124,3,282,141,0,2123,2125,5,147,0, - 0,2124,2123,1,0,0,0,2124,2125,1,0,0,0,2125,2126,1,0,0,0,2126,2127,5,117, - 0,0,2127,2129,5,5,0,0,2128,2130,5,147,0,0,2129,2128,1,0,0,0,2129,2130, - 1,0,0,0,2130,2132,1,0,0,0,2131,2122,1,0,0,0,2131,2132,1,0,0,0,2132,2133, - 1,0,0,0,2133,2134,3,186,93,0,2134,253,1,0,0,0,2135,2140,3,154,77,0,2136, - 2138,5,147,0,0,2137,2136,1,0,0,0,2137,2138,1,0,0,0,2138,2139,1,0,0,0, - 2139,2141,3,156,78,0,2140,2137,1,0,0,0,2141,2142,1,0,0,0,2142,2140,1, - 0,0,0,2142,2143,1,0,0,0,2143,255,1,0,0,0,2144,2146,5,127,0,0,2145,2147, - 5,147,0,0,2146,2145,1,0,0,0,2146,2147,1,0,0,0,2147,2148,1,0,0,0,2148, - 2150,5,8,0,0,2149,2151,5,147,0,0,2150,2149,1,0,0,0,2150,2151,1,0,0,0, - 2151,2152,1,0,0,0,2152,2154,5,87,0,0,2153,2155,5,147,0,0,2154,2153,1, - 0,0,0,2154,2155,1,0,0,0,2155,2156,1,0,0,0,2156,2161,3,146,73,0,2157,2159, - 5,147,0,0,2158,2157,1,0,0,0,2158,2159,1,0,0,0,2159,2160,1,0,0,0,2160, - 2162,3,144,72,0,2161,2158,1,0,0,0,2161,2162,1,0,0,0,2162,2164,1,0,0,0, - 2163,2165,5,147,0,0,2164,2163,1,0,0,0,2164,2165,1,0,0,0,2165,2166,1,0, - 0,0,2166,2167,5,9,0,0,2167,257,1,0,0,0,2168,2170,5,126,0,0,2169,2171, - 5,147,0,0,2170,2169,1,0,0,0,2170,2171,1,0,0,0,2171,2172,1,0,0,0,2172, - 2174,5,8,0,0,2173,2175,5,147,0,0,2174,2173,1,0,0,0,2174,2175,1,0,0,0, - 2175,2176,1,0,0,0,2176,2178,5,87,0,0,2177,2179,5,147,0,0,2178,2177,1, - 0,0,0,2178,2179,1,0,0,0,2179,2180,1,0,0,0,2180,2185,3,146,73,0,2181,2183, - 5,147,0,0,2182,2181,1,0,0,0,2182,2183,1,0,0,0,2183,2184,1,0,0,0,2184, - 2186,3,144,72,0,2185,2182,1,0,0,0,2185,2186,1,0,0,0,2186,2188,1,0,0,0, - 2187,2189,5,147,0,0,2188,2187,1,0,0,0,2188,2189,1,0,0,0,2189,2190,1,0, - 0,0,2190,2191,5,9,0,0,2191,259,1,0,0,0,2192,2194,5,25,0,0,2193,2195,5, - 147,0,0,2194,2193,1,0,0,0,2194,2195,1,0,0,0,2195,2198,1,0,0,0,2196,2199, - 3,274,137,0,2197,2199,5,98,0,0,2198,2196,1,0,0,0,2198,2197,1,0,0,0,2199, - 261,1,0,0,0,2200,2205,5,128,0,0,2201,2203,5,147,0,0,2202,2201,1,0,0,0, - 2202,2203,1,0,0,0,2203,2204,1,0,0,0,2204,2206,3,264,132,0,2205,2202,1, - 0,0,0,2206,2207,1,0,0,0,2207,2205,1,0,0,0,2207,2208,1,0,0,0,2208,2223, - 1,0,0,0,2209,2211,5,128,0,0,2210,2212,5,147,0,0,2211,2210,1,0,0,0,2211, - 2212,1,0,0,0,2212,2213,1,0,0,0,2213,2218,3,186,93,0,2214,2216,5,147,0, - 0,2215,2214,1,0,0,0,2215,2216,1,0,0,0,2216,2217,1,0,0,0,2217,2219,3,264, - 132,0,2218,2215,1,0,0,0,2219,2220,1,0,0,0,2220,2218,1,0,0,0,2220,2221, - 1,0,0,0,2221,2223,1,0,0,0,2222,2200,1,0,0,0,2222,2209,1,0,0,0,2223,2232, - 1,0,0,0,2224,2226,5,147,0,0,2225,2224,1,0,0,0,2225,2226,1,0,0,0,2226, - 2227,1,0,0,0,2227,2229,5,129,0,0,2228,2230,5,147,0,0,2229,2228,1,0,0, - 0,2229,2230,1,0,0,0,2230,2231,1,0,0,0,2231,2233,3,186,93,0,2232,2225, - 1,0,0,0,2232,2233,1,0,0,0,2233,2235,1,0,0,0,2234,2236,5,147,0,0,2235, - 2234,1,0,0,0,2235,2236,1,0,0,0,2236,2237,1,0,0,0,2237,2238,5,130,0,0, - 2238,263,1,0,0,0,2239,2241,5,131,0,0,2240,2242,5,147,0,0,2241,2240,1, - 0,0,0,2241,2242,1,0,0,0,2242,2243,1,0,0,0,2243,2245,3,186,93,0,2244,2246, - 5,147,0,0,2245,2244,1,0,0,0,2245,2246,1,0,0,0,2246,2247,1,0,0,0,2247, - 2249,5,132,0,0,2248,2250,5,147,0,0,2249,2248,1,0,0,0,2249,2250,1,0,0, - 0,2250,2251,1,0,0,0,2251,2252,3,186,93,0,2252,265,1,0,0,0,2253,2254,3, - 282,141,0,2254,267,1,0,0,0,2255,2258,3,278,139,0,2256,2258,3,276,138, - 0,2257,2255,1,0,0,0,2257,2256,1,0,0,0,2258,269,1,0,0,0,2259,2262,5,26, - 0,0,2260,2263,3,282,141,0,2261,2263,5,135,0,0,2262,2260,1,0,0,0,2262, - 2261,1,0,0,0,2263,271,1,0,0,0,2264,2266,3,232,116,0,2265,2267,5,147,0, - 0,2266,2265,1,0,0,0,2266,2267,1,0,0,0,2267,2268,1,0,0,0,2268,2269,3,260, - 130,0,2269,273,1,0,0,0,2270,2271,3,280,140,0,2271,275,1,0,0,0,2272,2273, - 5,135,0,0,2273,277,1,0,0,0,2274,2275,5,142,0,0,2275,279,1,0,0,0,2276, - 2277,3,282,141,0,2277,281,1,0,0,0,2278,2284,5,143,0,0,2279,2280,5,146, - 0,0,2280,2284,6,141,-1,0,2281,2284,5,136,0,0,2282,2284,3,284,142,0,2283, - 2278,1,0,0,0,2283,2279,1,0,0,0,2283,2281,1,0,0,0,2283,2282,1,0,0,0,2284, - 283,1,0,0,0,2285,2286,7,7,0,0,2286,285,1,0,0,0,2287,2288,7,8,0,0,2288, - 287,1,0,0,0,2289,2290,7,9,0,0,2290,289,1,0,0,0,2291,2292,7,10,0,0,2292, - 291,1,0,0,0,396,294,298,303,307,312,315,319,322,336,342,346,349,355,358, - 362,366,370,375,379,386,390,395,405,409,413,418,431,435,443,446,454,457, - 469,473,495,499,502,505,508,511,515,520,524,534,538,543,548,553,559,563, - 567,572,579,583,587,590,594,598,602,607,611,617,621,631,641,645,649,653, - 658,670,674,678,682,686,688,692,696,698,712,716,720,724,729,732,736,740, - 742,746,750,752,788,799,821,825,830,841,845,849,857,861,865,871,875,879, - 885,889,893,897,901,905,911,918,923,929,949,953,961,971,976,981,985,990, - 996,1001,1004,1008,1012,1016,1022,1026,1031,1036,1040,1043,1047,1051, - 1055,1059,1063,1069,1073,1078,1082,1091,1097,1105,1109,1113,1117,1124, - 1127,1130,1133,1139,1142,1146,1150,1154,1157,1161,1171,1177,1184,1197, - 1201,1205,1209,1214,1219,1223,1229,1233,1237,1241,1246,1252,1255,1261, - 1264,1270,1274,1278,1282,1286,1291,1296,1300,1305,1308,1317,1326,1331, - 1344,1347,1355,1359,1364,1369,1373,1378,1384,1389,1396,1400,1404,1406, - 1410,1412,1416,1418,1424,1430,1434,1437,1440,1446,1449,1452,1456,1462, - 1465,1468,1472,1476,1480,1482,1486,1488,1492,1494,1498,1500,1506,1510, - 1514,1518,1522,1526,1530,1534,1538,1541,1547,1551,1555,1558,1563,1568, - 1573,1578,1584,1590,1593,1596,1599,1603,1606,1609,1612,1615,1619,1623, - 1627,1631,1635,1638,1641,1645,1649,1653,1657,1659,1665,1668,1671,1677, - 1680,1683,1704,1714,1724,1729,1733,1740,1744,1748,1752,1756,1764,1768, - 1772,1776,1782,1786,1792,1796,1801,1806,1810,1815,1820,1824,1830,1837, - 1841,1847,1854,1858,1864,1871,1875,1880,1885,1889,1894,1897,1904,1907, - 1912,1921,1925,1928,1941,1944,1949,1963,1967,1972,1984,1992,1998,2002, - 2006,2010,2013,2019,2022,2026,2030,2034,2038,2042,2049,2052,2056,2062, - 2066,2072,2076,2080,2085,2089,2093,2095,2099,2103,2107,2111,2114,2118, - 2124,2129,2131,2137,2142,2146,2150,2154,2158,2161,2164,2170,2174,2178, - 2182,2185,2188,2194,2198,2202,2207,2211,2215,2220,2222,2225,2229,2232, - 2235,2241,2245,2249,2257,2262,2266,2283 + 7,140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146, + 7,146,2,147,7,147,1,0,1,0,3,0,299,8,0,1,0,1,0,3,0,303,8,0,1,0,5,0,306, + 8,0,10,0,12,0,309,9,0,1,0,3,0,312,8,0,1,0,1,0,1,1,3,1,317,8,1,1,1,3,1, + 320,8,1,1,1,1,1,3,1,324,8,1,1,1,3,1,327,8,1,1,2,1,2,1,2,1,2,1,2,1,2,1, + 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3,2,343,8,2,1,3,1,3,1,3,1,3,3,3,349,8,3, + 1,3,1,3,3,3,353,8,3,1,3,3,3,356,8,3,1,3,1,3,1,3,1,3,3,3,362,8,3,1,3,3, + 3,365,8,3,1,4,1,4,3,4,369,8,4,1,4,1,4,3,4,373,8,4,1,4,1,4,3,4,377,8,4, + 1,4,5,4,380,8,4,10,4,12,4,383,9,4,1,4,3,4,386,8,4,1,4,1,4,1,5,1,5,1,5, + 3,5,393,8,5,1,5,1,5,3,5,397,8,5,1,5,1,5,1,5,3,5,402,8,5,1,6,1,6,1,6,1, + 6,1,6,1,6,1,6,1,6,3,6,412,8,6,1,6,1,6,3,6,416,8,6,1,6,1,6,3,6,420,8,6, + 1,6,5,6,423,8,6,10,6,12,6,426,9,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7, + 1,7,3,7,438,8,7,1,7,1,7,3,7,442,8,7,1,7,1,7,1,7,1,7,1,7,1,7,3,7,450,8, + 7,1,7,3,7,453,8,7,1,8,1,8,1,8,1,8,1,8,1,8,3,8,461,8,8,1,8,3,8,464,8,8, + 1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 3,10,481,8,10,1,10,3,10,484,8,10,1,10,1,10,3,10,488,8,10,1,10,1,10,1, + 10,1,10,3,10,494,8,10,1,10,3,10,497,8,10,1,11,1,11,1,11,1,11,1,12,1,12, + 1,12,1,12,3,12,507,8,12,1,12,1,12,3,12,511,8,12,1,12,1,12,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1, + 14,1,14,3,14,533,8,14,1,14,1,14,3,14,537,8,14,1,14,3,14,540,8,14,1,14, + 3,14,543,8,14,1,14,3,14,546,8,14,1,14,3,14,549,8,14,1,14,1,14,3,14,553, + 8,14,1,14,5,14,556,8,14,10,14,12,14,559,9,14,1,14,3,14,562,8,14,1,14, + 1,14,1,14,1,14,1,14,1,14,1,15,1,15,3,15,572,8,15,1,15,1,15,3,15,576,8, + 15,1,15,5,15,579,8,15,10,15,12,15,582,9,15,1,16,1,16,3,16,586,8,16,1, + 16,1,16,1,16,3,16,591,8,16,1,16,1,16,1,17,1,17,3,17,597,8,17,1,17,1,17, + 3,17,601,8,17,1,17,1,17,3,17,605,8,17,1,17,5,17,608,8,17,10,17,12,17, + 611,9,17,1,17,1,17,1,17,1,17,3,17,617,8,17,1,17,1,17,3,17,621,8,17,1, + 17,1,17,3,17,625,8,17,1,17,3,17,628,8,17,1,18,1,18,3,18,632,8,18,1,18, + 1,18,3,18,636,8,18,1,18,1,18,3,18,640,8,18,1,18,5,18,643,8,18,10,18,12, + 18,646,9,18,1,18,3,18,649,8,18,1,18,1,18,1,19,1,19,3,19,655,8,19,1,19, + 1,19,3,19,659,8,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,3,20,669,8, + 20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,679,8,21,1,21,1,21,3, + 21,683,8,21,1,21,1,21,3,21,687,8,21,1,21,1,21,3,21,691,8,21,1,21,1,21, + 1,21,3,21,696,8,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 3,22,708,8,22,1,22,1,22,3,22,712,8,22,1,22,1,22,3,22,716,8,22,1,22,1, + 22,3,22,720,8,22,1,22,1,22,3,22,724,8,22,3,22,726,8,22,1,22,1,22,3,22, + 730,8,22,1,22,1,22,3,22,734,8,22,3,22,736,8,22,1,22,1,22,1,23,1,23,1, + 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,750,8,23,1,23,1,23,3,23,754, + 8,23,1,23,1,23,3,23,758,8,23,1,23,1,23,3,23,762,8,23,1,23,4,23,765,8, + 23,11,23,12,23,766,1,23,3,23,770,8,23,1,23,1,23,3,23,774,8,23,1,23,1, + 23,3,23,778,8,23,3,23,780,8,23,1,23,1,23,3,23,784,8,23,1,23,1,23,3,23, + 788,8,23,3,23,790,8,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1, + 24,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1, + 27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,3,28,826,8,28,1, + 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,837,8,29,1,30,1,30,1, + 30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,33,1,33,3,33,859,8,33,1,33,1,33,3,33,863,8,33,1,33,5,33,866, + 8,33,10,33,12,33,869,9,33,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,3,35, + 879,8,35,1,35,1,35,3,35,883,8,35,1,35,1,35,3,35,887,8,35,1,35,1,35,1, + 36,1,36,1,36,1,36,3,36,895,8,36,1,36,1,36,3,36,899,8,36,1,36,1,36,3,36, + 903,8,36,1,36,1,36,1,36,1,36,3,36,909,8,36,1,36,1,36,3,36,913,8,36,1, + 36,1,36,3,36,917,8,36,1,36,1,36,1,36,1,36,3,36,923,8,36,1,36,1,36,3,36, + 927,8,36,1,36,1,36,3,36,931,8,36,1,36,1,36,3,36,935,8,36,1,36,1,36,3, + 36,939,8,36,1,36,1,36,3,36,943,8,36,1,36,1,36,5,36,947,8,36,10,36,12, + 36,950,9,36,1,37,1,37,5,37,954,8,37,10,37,12,37,957,9,37,1,38,1,38,3, + 38,961,8,38,1,38,1,38,1,39,1,39,3,39,967,8,39,1,40,1,40,1,41,1,41,1,42, + 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42, + 987,8,42,1,43,1,43,3,43,991,8,43,1,44,1,44,1,44,1,44,1,44,1,44,3,44,999, + 8,44,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,3,47,1009,8,47,1,47,5,47, + 1012,8,47,10,47,12,47,1015,9,47,1,47,1,47,3,47,1019,8,47,4,47,1021,8, + 47,11,47,12,47,1022,1,47,1,47,1,47,3,47,1028,8,47,1,48,1,48,1,48,1,48, + 3,48,1034,8,48,1,48,1,48,1,48,3,48,1039,8,48,1,48,3,48,1042,8,48,1,49, + 1,49,3,49,1046,8,49,1,50,1,50,3,50,1050,8,50,5,50,1052,8,50,10,50,12, + 50,1055,9,50,1,50,1,50,1,50,3,50,1060,8,50,5,50,1062,8,50,10,50,12,50, + 1065,9,50,1,50,1,50,3,50,1069,8,50,1,50,5,50,1072,8,50,10,50,12,50,1075, + 9,50,1,50,3,50,1078,8,50,1,50,3,50,1081,8,50,1,50,1,50,3,50,1085,8,50, + 4,50,1087,8,50,11,50,12,50,1088,1,50,1,50,3,50,1093,8,50,1,51,1,51,3, + 51,1097,8,51,4,51,1099,8,51,11,51,12,51,1100,1,51,1,51,1,52,1,52,3,52, + 1107,8,52,5,52,1109,8,52,10,52,12,52,1112,9,52,1,52,1,52,3,52,1116,8, + 52,5,52,1118,8,52,10,52,12,52,1121,9,52,1,52,1,52,1,53,1,53,1,53,1,53, + 3,53,1129,8,53,1,54,1,54,1,54,1,54,3,54,1135,8,54,1,55,1,55,1,55,1,55, + 1,55,1,55,3,55,1143,8,55,1,55,1,55,3,55,1147,8,55,1,55,1,55,3,55,1151, + 8,55,1,55,1,55,3,55,1155,8,55,1,55,1,55,1,55,1,55,1,55,3,55,1162,8,55, + 1,55,3,55,1165,8,55,1,55,3,55,1168,8,55,1,55,3,55,1171,8,55,1,56,1,56, + 1,56,1,56,3,56,1177,8,56,1,56,3,56,1180,8,56,1,57,1,57,3,57,1184,8,57, + 1,57,1,57,3,57,1188,8,57,1,57,1,57,3,57,1192,8,57,1,57,3,57,1195,8,57, + 1,58,1,58,3,58,1199,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,3,59, + 1209,8,59,1,59,1,59,1,60,1,60,3,60,1215,8,60,1,60,1,60,1,60,5,60,1220, + 8,60,10,60,12,60,1223,9,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1, + 61,1,61,3,61,1235,8,61,1,62,1,62,3,62,1239,8,62,1,62,1,62,3,62,1243,8, + 62,1,62,1,62,3,62,1247,8,62,1,62,5,62,1250,8,62,10,62,12,62,1253,9,62, + 1,63,1,63,3,63,1257,8,63,1,63,1,63,3,63,1261,8,63,1,63,1,63,1,64,1,64, + 3,64,1267,8,64,1,64,1,64,3,64,1271,8,64,1,64,1,64,3,64,1275,8,64,1,64, + 1,64,3,64,1279,8,64,1,64,5,64,1282,8,64,10,64,12,64,1285,9,64,1,65,1, + 65,1,65,3,65,1290,8,65,1,65,3,65,1293,8,65,1,66,1,66,1,66,1,67,3,67,1299, + 8,67,1,67,3,67,1302,8,67,1,67,1,67,1,67,1,67,3,67,1308,8,67,1,67,1,67, + 3,67,1312,8,67,1,67,1,67,3,67,1316,8,67,1,68,1,68,3,68,1320,8,68,1,68, + 1,68,3,68,1324,8,68,1,68,5,68,1327,8,68,10,68,12,68,1330,9,68,1,68,1, + 68,3,68,1334,8,68,1,68,1,68,3,68,1338,8,68,1,68,5,68,1341,8,68,10,68, + 12,68,1344,9,68,3,68,1346,8,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69, + 1355,8,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,3,70,1364,8,70,1,70,5,70, + 1367,8,70,10,70,12,70,1370,9,70,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1, + 72,1,73,1,73,3,73,1382,8,73,1,73,3,73,1385,8,73,1,74,1,74,1,74,1,74,1, + 75,1,75,3,75,1393,8,75,1,75,1,75,3,75,1397,8,75,1,75,5,75,1400,8,75,10, + 75,12,75,1403,9,75,1,76,1,76,3,76,1407,8,76,1,76,1,76,3,76,1411,8,76, + 1,76,1,76,1,76,3,76,1416,8,76,1,77,1,77,1,78,1,78,3,78,1422,8,78,1,78, + 5,78,1425,8,78,10,78,12,78,1428,9,78,1,78,1,78,1,78,1,78,3,78,1434,8, + 78,1,79,1,79,3,79,1438,8,79,1,79,1,79,3,79,1442,8,79,3,79,1444,8,79,1, + 79,1,79,3,79,1448,8,79,3,79,1450,8,79,1,79,1,79,3,79,1454,8,79,3,79,1456, + 8,79,1,79,1,79,1,80,1,80,3,80,1462,8,80,1,80,1,80,1,81,1,81,3,81,1468, + 8,81,1,81,1,81,3,81,1472,8,81,1,81,3,81,1475,8,81,1,81,3,81,1478,8,81, + 1,81,1,81,1,81,1,81,3,81,1484,8,81,1,81,3,81,1487,8,81,1,81,3,81,1490, + 8,81,1,81,1,81,3,81,1494,8,81,1,81,1,81,1,81,1,81,3,81,1500,8,81,1,81, + 3,81,1503,8,81,1,81,3,81,1506,8,81,1,81,1,81,3,81,1510,8,81,1,82,1,82, + 3,82,1514,8,82,1,82,1,82,3,82,1518,8,82,3,82,1520,8,82,1,82,1,82,3,82, + 1524,8,82,3,82,1526,8,82,1,82,1,82,3,82,1530,8,82,3,82,1532,8,82,1,82, + 1,82,3,82,1536,8,82,3,82,1538,8,82,1,82,1,82,1,83,1,83,3,83,1544,8,83, + 1,83,1,83,3,83,1548,8,83,1,83,1,83,3,83,1552,8,83,1,83,1,83,3,83,1556, + 8,83,1,83,1,83,3,83,1560,8,83,1,83,1,83,3,83,1564,8,83,1,83,1,83,3,83, + 1568,8,83,1,83,1,83,3,83,1572,8,83,5,83,1574,8,83,10,83,12,83,1577,9, + 83,3,83,1579,8,83,1,83,1,83,1,84,1,84,3,84,1585,8,84,1,84,1,84,3,84,1589, + 8,84,1,84,1,84,3,84,1593,8,84,1,84,3,84,1596,8,84,1,84,5,84,1599,8,84, + 10,84,12,84,1602,9,84,1,85,1,85,3,85,1606,8,85,1,85,5,85,1609,8,85,10, + 85,12,85,1612,9,85,1,86,1,86,3,86,1616,8,86,1,86,1,86,1,87,1,87,3,87, + 1622,8,87,1,87,1,87,1,87,1,87,3,87,1628,8,87,1,87,3,87,1631,8,87,1,87, + 3,87,1634,8,87,1,87,3,87,1637,8,87,1,87,1,87,3,87,1641,8,87,1,87,3,87, + 1644,8,87,1,87,3,87,1647,8,87,1,87,3,87,1650,8,87,1,87,3,87,1653,8,87, + 1,88,1,88,3,88,1657,8,88,1,88,1,88,3,88,1661,8,88,1,88,1,88,3,88,1665, + 8,88,1,88,1,88,3,88,1669,8,88,1,88,1,88,3,88,1673,8,88,1,88,3,88,1676, + 8,88,1,88,3,88,1679,8,88,1,88,1,88,3,88,1683,8,88,1,88,1,88,3,88,1687, + 8,88,1,88,1,88,3,88,1691,8,88,1,88,1,88,3,88,1695,8,88,3,88,1697,8,88, + 1,88,1,88,1,89,1,89,3,89,1703,8,89,1,89,3,89,1706,8,89,1,89,3,89,1709, + 8,89,1,89,1,89,1,90,1,90,3,90,1715,8,90,1,90,3,90,1718,8,90,1,90,3,90, + 1721,8,90,1,90,1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,1,95, + 1,96,1,96,1,96,1,96,1,96,5,96,1740,8,96,10,96,12,96,1743,9,96,1,97,1, + 97,1,97,1,97,1,97,5,97,1750,8,97,10,97,12,97,1753,9,97,1,98,1,98,1,98, + 1,98,1,98,5,98,1760,8,98,10,98,12,98,1763,9,98,1,99,1,99,3,99,1767,8, + 99,5,99,1769,8,99,10,99,12,99,1772,9,99,1,99,1,99,1,100,1,100,3,100,1778, + 8,100,1,100,1,100,3,100,1782,8,100,1,100,1,100,3,100,1786,8,100,1,100, + 1,100,3,100,1790,8,100,1,100,1,100,3,100,1794,8,100,1,100,1,100,1,100, + 1,100,1,100,1,100,3,100,1802,8,100,1,100,1,100,3,100,1806,8,100,1,100, + 1,100,3,100,1810,8,100,1,100,1,100,3,100,1814,8,100,1,100,1,100,4,100, + 1818,8,100,11,100,12,100,1819,1,100,1,100,3,100,1824,8,100,1,101,1,101, + 1,102,1,102,3,102,1830,8,102,1,102,1,102,3,102,1834,8,102,1,102,5,102, + 1837,8,102,10,102,12,102,1840,9,102,1,103,1,103,3,103,1844,8,103,1,103, + 1,103,3,103,1848,8,103,1,103,5,103,1851,8,103,10,103,12,103,1854,9,103, + 1,104,1,104,3,104,1858,8,104,1,104,1,104,3,104,1862,8,104,1,104,1,104, + 5,104,1866,8,104,10,104,12,104,1869,9,104,1,105,1,105,1,106,1,106,3,106, + 1875,8,106,1,106,1,106,3,106,1879,8,106,1,106,1,106,5,106,1883,8,106, + 10,106,12,106,1886,9,106,1,107,1,107,1,108,1,108,3,108,1892,8,108,1,108, + 1,108,3,108,1896,8,108,1,108,1,108,5,108,1900,8,108,10,108,12,108,1903, + 9,108,1,109,1,109,1,110,1,110,3,110,1909,8,110,1,110,1,110,3,110,1913, + 8,110,1,110,5,110,1916,8,110,10,110,12,110,1919,9,110,1,111,1,111,3,111, + 1923,8,111,5,111,1925,8,111,10,111,12,111,1928,9,111,1,111,1,111,3,111, + 1932,8,111,1,111,3,111,1935,8,111,1,112,1,112,1,112,4,112,1940,8,112, + 11,112,12,112,1941,1,112,3,112,1945,8,112,1,113,1,113,1,113,3,113,1950, + 8,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,3,113,1959,8,113,1,113, + 1,113,3,113,1963,8,113,1,113,3,113,1966,8,113,1,114,1,114,1,114,1,114, + 1,114,1,114,1,114,1,114,1,114,1,114,1,114,3,114,1979,8,114,1,114,3,114, + 1982,8,114,1,114,1,114,1,115,3,115,1987,8,115,1,115,1,115,1,116,1,116, + 1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116,3,116,2001,8,116,1,117, + 1,117,3,117,2005,8,117,1,117,5,117,2008,8,117,10,117,12,117,2011,9,117, + 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,3,118,2022,8,118, + 1,119,1,119,1,119,1,119,1,119,1,119,3,119,2030,8,119,1,120,1,120,1,121, + 1,121,3,121,2036,8,121,1,121,1,121,3,121,2040,8,121,1,121,1,121,3,121, + 2044,8,121,5,121,2046,8,121,10,121,12,121,2049,9,121,3,121,2051,8,121, + 1,121,1,121,1,122,1,122,3,122,2057,8,122,1,122,3,122,2060,8,122,1,123, + 1,123,3,123,2064,8,123,1,123,1,123,3,123,2068,8,123,1,123,1,123,3,123, + 2072,8,123,1,123,1,123,3,123,2076,8,123,5,123,2078,8,123,10,123,12,123, + 2081,9,123,1,123,1,123,1,124,1,124,3,124,2087,8,124,1,124,3,124,2090, + 8,124,1,124,1,124,3,124,2094,8,124,1,124,1,124,1,125,1,125,3,125,2100, + 8,125,1,125,1,125,3,125,2104,8,125,1,125,1,125,1,126,1,126,3,126,2110, + 8,126,1,126,1,126,3,126,2114,8,126,1,126,1,126,3,126,2118,8,126,1,126, + 1,126,1,126,3,126,2123,8,126,1,126,1,126,3,126,2127,8,126,1,126,1,126, + 3,126,2131,8,126,3,126,2133,8,126,1,126,1,126,3,126,2137,8,126,1,126, + 1,126,3,126,2141,8,126,1,126,1,126,3,126,2145,8,126,5,126,2147,8,126, + 10,126,12,126,2150,9,126,3,126,2152,8,126,1,126,1,126,3,126,2156,8,126, + 1,127,1,127,1,128,1,128,3,128,2162,8,128,1,128,1,128,1,128,3,128,2167, + 8,128,3,128,2169,8,128,1,128,1,128,1,129,1,129,3,129,2175,8,129,1,129, + 4,129,2178,8,129,11,129,12,129,2179,1,130,1,130,3,130,2184,8,130,1,130, + 1,130,3,130,2188,8,130,1,130,1,130,3,130,2192,8,130,1,130,1,130,3,130, + 2196,8,130,1,130,3,130,2199,8,130,1,130,3,130,2202,8,130,1,130,1,130, + 1,131,1,131,3,131,2208,8,131,1,131,1,131,3,131,2212,8,131,1,131,1,131, + 3,131,2216,8,131,1,131,1,131,3,131,2220,8,131,1,131,3,131,2223,8,131, + 1,131,3,131,2226,8,131,1,131,1,131,1,132,1,132,3,132,2232,8,132,1,132, + 1,132,3,132,2236,8,132,1,133,1,133,3,133,2240,8,133,1,133,4,133,2243, + 8,133,11,133,12,133,2244,1,133,1,133,3,133,2249,8,133,1,133,1,133,3,133, + 2253,8,133,1,133,4,133,2256,8,133,11,133,12,133,2257,3,133,2260,8,133, + 1,133,3,133,2263,8,133,1,133,1,133,3,133,2267,8,133,1,133,3,133,2270, + 8,133,1,133,3,133,2273,8,133,1,133,1,133,1,134,1,134,3,134,2279,8,134, + 1,134,1,134,3,134,2283,8,134,1,134,1,134,3,134,2287,8,134,1,134,1,134, + 1,135,1,135,1,136,1,136,3,136,2295,8,136,1,137,1,137,1,137,3,137,2300, + 8,137,1,138,1,138,3,138,2304,8,138,1,138,1,138,1,139,1,139,1,140,1,140, + 1,141,1,141,1,142,1,142,1,143,1,143,1,143,1,143,1,143,3,143,2321,8,143, + 1,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,147,0,1,72,148,0,2, + 4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50, + 52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96, + 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132, + 134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168, + 170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204, + 206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240, + 242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276, + 278,280,282,284,286,288,290,292,294,0,11,2,0,59,59,61,61,1,0,106,109, + 2,0,5,5,12,16,1,0,18,19,2,0,20,20,117,117,2,0,21,22,100,100,1,0,126,127, + 7,0,49,49,55,58,69,69,73,73,120,120,128,128,132,132,2,0,13,13,27,30,2, + 0,15,15,31,34,2,0,35,45,117,117,2636,0,296,1,0,0,0,2,316,1,0,0,0,4,342, + 1,0,0,0,6,344,1,0,0,0,8,366,1,0,0,0,10,401,1,0,0,0,12,403,1,0,0,0,14, + 433,1,0,0,0,16,454,1,0,0,0,18,465,1,0,0,0,20,471,1,0,0,0,22,498,1,0,0, + 0,24,502,1,0,0,0,26,514,1,0,0,0,28,526,1,0,0,0,30,569,1,0,0,0,32,583, + 1,0,0,0,34,627,1,0,0,0,36,629,1,0,0,0,38,652,1,0,0,0,40,668,1,0,0,0,42, + 670,1,0,0,0,44,699,1,0,0,0,46,739,1,0,0,0,48,793,1,0,0,0,50,801,1,0,0, + 0,52,807,1,0,0,0,54,813,1,0,0,0,56,825,1,0,0,0,58,827,1,0,0,0,60,838, + 1,0,0,0,62,842,1,0,0,0,64,848,1,0,0,0,66,856,1,0,0,0,68,870,1,0,0,0,70, + 874,1,0,0,0,72,942,1,0,0,0,74,951,1,0,0,0,76,958,1,0,0,0,78,966,1,0,0, + 0,80,968,1,0,0,0,82,970,1,0,0,0,84,986,1,0,0,0,86,990,1,0,0,0,88,992, + 1,0,0,0,90,1000,1,0,0,0,92,1004,1,0,0,0,94,1027,1,0,0,0,96,1041,1,0,0, + 0,98,1045,1,0,0,0,100,1092,1,0,0,0,102,1098,1,0,0,0,104,1110,1,0,0,0, + 106,1128,1,0,0,0,108,1134,1,0,0,0,110,1136,1,0,0,0,112,1172,1,0,0,0,114, + 1183,1,0,0,0,116,1196,1,0,0,0,118,1206,1,0,0,0,120,1212,1,0,0,0,122,1234, + 1,0,0,0,124,1236,1,0,0,0,126,1254,1,0,0,0,128,1266,1,0,0,0,130,1286,1, + 0,0,0,132,1294,1,0,0,0,134,1301,1,0,0,0,136,1345,1,0,0,0,138,1354,1,0, + 0,0,140,1356,1,0,0,0,142,1371,1,0,0,0,144,1375,1,0,0,0,146,1379,1,0,0, + 0,148,1386,1,0,0,0,150,1390,1,0,0,0,152,1415,1,0,0,0,154,1417,1,0,0,0, + 156,1433,1,0,0,0,158,1435,1,0,0,0,160,1459,1,0,0,0,162,1509,1,0,0,0,164, + 1511,1,0,0,0,166,1541,1,0,0,0,168,1582,1,0,0,0,170,1603,1,0,0,0,172,1613, + 1,0,0,0,174,1619,1,0,0,0,176,1654,1,0,0,0,178,1700,1,0,0,0,180,1712,1, + 0,0,0,182,1724,1,0,0,0,184,1726,1,0,0,0,186,1728,1,0,0,0,188,1730,1,0, + 0,0,190,1732,1,0,0,0,192,1734,1,0,0,0,194,1744,1,0,0,0,196,1754,1,0,0, + 0,198,1770,1,0,0,0,200,1823,1,0,0,0,202,1825,1,0,0,0,204,1827,1,0,0,0, + 206,1841,1,0,0,0,208,1855,1,0,0,0,210,1870,1,0,0,0,212,1872,1,0,0,0,214, + 1887,1,0,0,0,216,1889,1,0,0,0,218,1904,1,0,0,0,220,1906,1,0,0,0,222,1926, + 1,0,0,0,224,1936,1,0,0,0,226,1965,1,0,0,0,228,1978,1,0,0,0,230,1986,1, + 0,0,0,232,2000,1,0,0,0,234,2002,1,0,0,0,236,2021,1,0,0,0,238,2029,1,0, + 0,0,240,2031,1,0,0,0,242,2033,1,0,0,0,244,2054,1,0,0,0,246,2061,1,0,0, + 0,248,2086,1,0,0,0,250,2097,1,0,0,0,252,2155,1,0,0,0,254,2157,1,0,0,0, + 256,2168,1,0,0,0,258,2172,1,0,0,0,260,2181,1,0,0,0,262,2205,1,0,0,0,264, + 2229,1,0,0,0,266,2259,1,0,0,0,268,2276,1,0,0,0,270,2290,1,0,0,0,272,2294, + 1,0,0,0,274,2296,1,0,0,0,276,2301,1,0,0,0,278,2307,1,0,0,0,280,2309,1, + 0,0,0,282,2311,1,0,0,0,284,2313,1,0,0,0,286,2320,1,0,0,0,288,2322,1,0, + 0,0,290,2324,1,0,0,0,292,2326,1,0,0,0,294,2328,1,0,0,0,296,307,3,2,1, + 0,297,299,5,149,0,0,298,297,1,0,0,0,298,299,1,0,0,0,299,300,1,0,0,0,300, + 302,5,1,0,0,301,303,5,149,0,0,302,301,1,0,0,0,302,303,1,0,0,0,303,304, + 1,0,0,0,304,306,3,2,1,0,305,298,1,0,0,0,306,309,1,0,0,0,307,305,1,0,0, + 0,307,308,1,0,0,0,308,311,1,0,0,0,309,307,1,0,0,0,310,312,5,149,0,0,311, + 310,1,0,0,0,311,312,1,0,0,0,312,313,1,0,0,0,313,314,5,0,0,1,314,1,1,0, + 0,0,315,317,3,78,39,0,316,315,1,0,0,0,316,317,1,0,0,0,317,319,1,0,0,0, + 318,320,5,149,0,0,319,318,1,0,0,0,319,320,1,0,0,0,320,321,1,0,0,0,321, + 326,3,4,2,0,322,324,5,149,0,0,323,322,1,0,0,0,323,324,1,0,0,0,324,325, + 1,0,0,0,325,327,5,1,0,0,326,323,1,0,0,0,326,327,1,0,0,0,327,3,1,0,0,0, + 328,343,3,92,46,0,329,343,3,40,20,0,330,343,3,6,3,0,331,343,3,12,6,0, + 332,343,3,14,7,0,333,343,3,24,12,0,334,343,3,28,14,0,335,343,3,26,13, + 0,336,343,3,84,42,0,337,343,3,86,43,0,338,343,3,16,8,0,339,343,3,18,9, + 0,340,343,3,20,10,0,341,343,3,22,11,0,342,328,1,0,0,0,342,329,1,0,0,0, + 342,330,1,0,0,0,342,331,1,0,0,0,342,332,1,0,0,0,342,333,1,0,0,0,342,334, + 1,0,0,0,342,335,1,0,0,0,342,336,1,0,0,0,342,337,1,0,0,0,342,338,1,0,0, + 0,342,339,1,0,0,0,342,340,1,0,0,0,342,341,1,0,0,0,343,5,1,0,0,0,344,345, + 5,52,0,0,345,346,5,149,0,0,346,355,3,284,142,0,347,349,5,149,0,0,348, + 347,1,0,0,0,348,349,1,0,0,0,349,350,1,0,0,0,350,352,3,8,4,0,351,353,5, + 149,0,0,352,351,1,0,0,0,352,353,1,0,0,0,353,356,1,0,0,0,354,356,5,149, + 0,0,355,348,1,0,0,0,355,354,1,0,0,0,356,357,1,0,0,0,357,358,5,53,0,0, + 358,359,5,149,0,0,359,364,3,10,5,0,360,362,5,149,0,0,361,360,1,0,0,0, + 361,362,1,0,0,0,362,363,1,0,0,0,363,365,3,36,18,0,364,361,1,0,0,0,364, + 365,1,0,0,0,365,7,1,0,0,0,366,368,5,2,0,0,367,369,5,149,0,0,368,367,1, + 0,0,0,368,369,1,0,0,0,369,370,1,0,0,0,370,381,3,284,142,0,371,373,5,149, + 0,0,372,371,1,0,0,0,372,373,1,0,0,0,373,374,1,0,0,0,374,376,5,3,0,0,375, + 377,5,149,0,0,376,375,1,0,0,0,376,377,1,0,0,0,377,378,1,0,0,0,378,380, + 3,284,142,0,379,372,1,0,0,0,380,383,1,0,0,0,381,379,1,0,0,0,381,382,1, + 0,0,0,382,385,1,0,0,0,383,381,1,0,0,0,384,386,5,149,0,0,385,384,1,0,0, + 0,385,386,1,0,0,0,386,387,1,0,0,0,387,388,5,4,0,0,388,9,1,0,0,0,389,402, + 3,34,17,0,390,392,5,2,0,0,391,393,5,149,0,0,392,391,1,0,0,0,392,393,1, + 0,0,0,393,394,1,0,0,0,394,396,3,92,46,0,395,397,5,149,0,0,396,395,1,0, + 0,0,396,397,1,0,0,0,397,398,1,0,0,0,398,399,5,4,0,0,399,402,1,0,0,0,400, + 402,3,270,135,0,401,389,1,0,0,0,401,390,1,0,0,0,401,400,1,0,0,0,402,11, + 1,0,0,0,403,404,5,52,0,0,404,405,5,149,0,0,405,406,3,284,142,0,406,407, + 5,149,0,0,407,408,5,53,0,0,408,409,5,149,0,0,409,411,5,2,0,0,410,412, + 5,149,0,0,411,410,1,0,0,0,411,412,1,0,0,0,412,413,1,0,0,0,413,424,5,135, + 0,0,414,416,5,149,0,0,415,414,1,0,0,0,415,416,1,0,0,0,416,417,1,0,0,0, + 417,419,5,3,0,0,418,420,5,149,0,0,419,418,1,0,0,0,419,420,1,0,0,0,420, + 421,1,0,0,0,421,423,5,135,0,0,422,415,1,0,0,0,423,426,1,0,0,0,424,422, + 1,0,0,0,424,425,1,0,0,0,425,427,1,0,0,0,426,424,1,0,0,0,427,428,5,4,0, + 0,428,429,5,149,0,0,429,430,5,103,0,0,430,431,5,149,0,0,431,432,5,54, + 0,0,432,13,1,0,0,0,433,434,5,52,0,0,434,435,5,149,0,0,435,437,5,2,0,0, + 436,438,5,149,0,0,437,436,1,0,0,0,437,438,1,0,0,0,438,439,1,0,0,0,439, + 441,3,92,46,0,440,442,5,149,0,0,441,440,1,0,0,0,441,442,1,0,0,0,442,443, + 1,0,0,0,443,444,5,4,0,0,444,445,5,149,0,0,445,446,5,70,0,0,446,447,5, + 149,0,0,447,452,5,135,0,0,448,450,5,149,0,0,449,448,1,0,0,0,449,450,1, + 0,0,0,450,451,1,0,0,0,451,453,3,36,18,0,452,449,1,0,0,0,452,453,1,0,0, + 0,453,15,1,0,0,0,454,455,5,55,0,0,455,456,5,149,0,0,456,457,5,57,0,0, + 457,458,5,149,0,0,458,463,5,135,0,0,459,461,5,149,0,0,460,459,1,0,0,0, + 460,461,1,0,0,0,461,462,1,0,0,0,462,464,3,36,18,0,463,460,1,0,0,0,463, + 464,1,0,0,0,464,17,1,0,0,0,465,466,5,56,0,0,466,467,5,149,0,0,467,468, + 5,57,0,0,468,469,5,149,0,0,469,470,5,135,0,0,470,19,1,0,0,0,471,472,5, + 46,0,0,472,473,5,149,0,0,473,480,5,135,0,0,474,475,5,149,0,0,475,476, + 5,101,0,0,476,477,5,149,0,0,477,478,3,284,142,0,478,479,5,149,0,0,479, + 481,1,0,0,0,480,474,1,0,0,0,480,481,1,0,0,0,481,496,1,0,0,0,482,484,5, + 149,0,0,483,482,1,0,0,0,483,484,1,0,0,0,484,485,1,0,0,0,485,487,5,2,0, + 0,486,488,5,149,0,0,487,486,1,0,0,0,487,488,1,0,0,0,488,489,1,0,0,0,489, + 490,5,47,0,0,490,491,5,149,0,0,491,493,5,135,0,0,492,494,5,149,0,0,493, + 492,1,0,0,0,493,494,1,0,0,0,494,495,1,0,0,0,495,497,5,4,0,0,496,483,1, + 0,0,0,496,497,1,0,0,0,497,21,1,0,0,0,498,499,5,95,0,0,499,500,5,149,0, + 0,500,501,3,284,142,0,501,23,1,0,0,0,502,503,5,48,0,0,503,504,5,149,0, + 0,504,506,3,286,143,0,505,507,5,149,0,0,506,505,1,0,0,0,506,507,1,0,0, + 0,507,508,1,0,0,0,508,510,5,5,0,0,509,511,5,149,0,0,510,509,1,0,0,0,510, + 511,1,0,0,0,511,512,1,0,0,0,512,513,3,238,119,0,513,25,1,0,0,0,514,515, + 5,49,0,0,515,516,5,149,0,0,516,517,5,93,0,0,517,518,5,149,0,0,518,519, + 5,59,0,0,519,520,5,149,0,0,520,521,3,284,142,0,521,522,5,149,0,0,522, + 523,5,124,0,0,523,524,5,149,0,0,524,525,5,135,0,0,525,27,1,0,0,0,526, + 527,5,91,0,0,527,528,5,149,0,0,528,529,5,50,0,0,529,530,5,149,0,0,530, + 532,3,254,127,0,531,533,5,149,0,0,532,531,1,0,0,0,532,533,1,0,0,0,533, + 534,1,0,0,0,534,536,5,2,0,0,535,537,5,149,0,0,536,535,1,0,0,0,536,537, + 1,0,0,0,537,539,1,0,0,0,538,540,3,30,15,0,539,538,1,0,0,0,539,540,1,0, + 0,0,540,542,1,0,0,0,541,543,5,149,0,0,542,541,1,0,0,0,542,543,1,0,0,0, + 543,545,1,0,0,0,544,546,3,32,16,0,545,544,1,0,0,0,545,546,1,0,0,0,546, + 557,1,0,0,0,547,549,5,149,0,0,548,547,1,0,0,0,548,549,1,0,0,0,549,550, + 1,0,0,0,550,552,5,3,0,0,551,553,5,149,0,0,552,551,1,0,0,0,552,553,1,0, + 0,0,553,554,1,0,0,0,554,556,3,32,16,0,555,548,1,0,0,0,556,559,1,0,0,0, + 557,555,1,0,0,0,557,558,1,0,0,0,558,561,1,0,0,0,559,557,1,0,0,0,560,562, + 5,149,0,0,561,560,1,0,0,0,561,562,1,0,0,0,562,563,1,0,0,0,563,564,5,4, + 0,0,564,565,5,149,0,0,565,566,5,101,0,0,566,567,5,149,0,0,567,568,3,190, + 95,0,568,29,1,0,0,0,569,580,3,286,143,0,570,572,5,149,0,0,571,570,1,0, + 0,0,571,572,1,0,0,0,572,573,1,0,0,0,573,575,5,3,0,0,574,576,5,149,0,0, + 575,574,1,0,0,0,575,576,1,0,0,0,576,577,1,0,0,0,577,579,3,286,143,0,578, + 571,1,0,0,0,579,582,1,0,0,0,580,578,1,0,0,0,580,581,1,0,0,0,581,31,1, + 0,0,0,582,580,1,0,0,0,583,585,3,286,143,0,584,586,5,149,0,0,585,584,1, + 0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,119,0,0,588,590,5,5,0, + 0,589,591,5,149,0,0,590,589,1,0,0,0,590,591,1,0,0,0,591,592,1,0,0,0,592, + 593,3,238,119,0,593,33,1,0,0,0,594,596,5,6,0,0,595,597,5,149,0,0,596, + 595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,609,5,135,0,0,599,601, + 5,149,0,0,600,599,1,0,0,0,600,601,1,0,0,0,601,602,1,0,0,0,602,604,5,3, + 0,0,603,605,5,149,0,0,604,603,1,0,0,0,604,605,1,0,0,0,605,606,1,0,0,0, + 606,608,5,135,0,0,607,600,1,0,0,0,608,611,1,0,0,0,609,607,1,0,0,0,609, + 610,1,0,0,0,610,612,1,0,0,0,611,609,1,0,0,0,612,628,5,7,0,0,613,628,5, + 135,0,0,614,616,5,51,0,0,615,617,5,149,0,0,616,615,1,0,0,0,616,617,1, + 0,0,0,617,618,1,0,0,0,618,620,5,2,0,0,619,621,5,149,0,0,620,619,1,0,0, + 0,620,621,1,0,0,0,621,622,1,0,0,0,622,624,5,135,0,0,623,625,5,149,0,0, + 624,623,1,0,0,0,624,625,1,0,0,0,625,626,1,0,0,0,626,628,5,4,0,0,627,594, + 1,0,0,0,627,613,1,0,0,0,627,614,1,0,0,0,628,35,1,0,0,0,629,631,5,2,0, + 0,630,632,5,149,0,0,631,630,1,0,0,0,631,632,1,0,0,0,632,633,1,0,0,0,633, + 644,3,38,19,0,634,636,5,149,0,0,635,634,1,0,0,0,635,636,1,0,0,0,636,637, + 1,0,0,0,637,639,5,3,0,0,638,640,5,149,0,0,639,638,1,0,0,0,639,640,1,0, + 0,0,640,641,1,0,0,0,641,643,3,38,19,0,642,635,1,0,0,0,643,646,1,0,0,0, + 644,642,1,0,0,0,644,645,1,0,0,0,645,648,1,0,0,0,646,644,1,0,0,0,647,649, + 5,149,0,0,648,647,1,0,0,0,648,649,1,0,0,0,649,650,1,0,0,0,650,651,5,4, + 0,0,651,37,1,0,0,0,652,654,3,286,143,0,653,655,5,149,0,0,654,653,1,0, + 0,0,654,655,1,0,0,0,655,656,1,0,0,0,656,658,5,5,0,0,657,659,5,149,0,0, + 658,657,1,0,0,0,658,659,1,0,0,0,659,660,1,0,0,0,660,661,3,238,119,0,661, + 39,1,0,0,0,662,669,3,42,21,0,663,669,3,44,22,0,664,669,3,46,23,0,665, + 669,3,50,25,0,666,669,3,52,26,0,667,669,3,54,27,0,668,662,1,0,0,0,668, + 663,1,0,0,0,668,664,1,0,0,0,668,665,1,0,0,0,668,666,1,0,0,0,668,667,1, + 0,0,0,669,41,1,0,0,0,670,671,5,91,0,0,671,672,5,149,0,0,672,673,5,58, + 0,0,673,674,5,149,0,0,674,675,5,59,0,0,675,676,5,149,0,0,676,678,3,284, + 142,0,677,679,5,149,0,0,678,677,1,0,0,0,678,679,1,0,0,0,679,680,1,0,0, + 0,680,682,5,2,0,0,681,683,5,149,0,0,682,681,1,0,0,0,682,683,1,0,0,0,683, + 684,1,0,0,0,684,686,3,66,33,0,685,687,5,149,0,0,686,685,1,0,0,0,686,687, + 1,0,0,0,687,688,1,0,0,0,688,690,5,3,0,0,689,691,5,149,0,0,690,689,1,0, + 0,0,690,691,1,0,0,0,691,692,1,0,0,0,692,693,3,70,35,0,693,695,1,0,0,0, + 694,696,5,149,0,0,695,694,1,0,0,0,695,696,1,0,0,0,696,697,1,0,0,0,697, + 698,5,4,0,0,698,43,1,0,0,0,699,700,5,91,0,0,700,701,5,149,0,0,701,702, + 5,69,0,0,702,703,5,149,0,0,703,704,5,59,0,0,704,705,5,149,0,0,705,707, + 3,284,142,0,706,708,5,149,0,0,707,706,1,0,0,0,707,708,1,0,0,0,708,709, + 1,0,0,0,709,711,5,2,0,0,710,712,5,149,0,0,711,710,1,0,0,0,711,712,1,0, + 0,0,712,713,1,0,0,0,713,715,3,48,24,0,714,716,5,149,0,0,715,714,1,0,0, + 0,715,716,1,0,0,0,716,725,1,0,0,0,717,719,5,3,0,0,718,720,5,149,0,0,719, + 718,1,0,0,0,719,720,1,0,0,0,720,721,1,0,0,0,721,723,3,66,33,0,722,724, + 5,149,0,0,723,722,1,0,0,0,723,724,1,0,0,0,724,726,1,0,0,0,725,717,1,0, + 0,0,725,726,1,0,0,0,726,735,1,0,0,0,727,729,5,3,0,0,728,730,5,149,0,0, + 729,728,1,0,0,0,729,730,1,0,0,0,730,731,1,0,0,0,731,733,3,286,143,0,732, + 734,5,149,0,0,733,732,1,0,0,0,733,734,1,0,0,0,734,736,1,0,0,0,735,727, + 1,0,0,0,735,736,1,0,0,0,736,737,1,0,0,0,737,738,5,4,0,0,738,45,1,0,0, + 0,739,740,5,91,0,0,740,741,5,149,0,0,741,742,5,69,0,0,742,743,5,149,0, + 0,743,744,5,59,0,0,744,745,5,149,0,0,745,746,5,60,0,0,746,747,5,149,0, + 0,747,749,3,284,142,0,748,750,5,149,0,0,749,748,1,0,0,0,749,750,1,0,0, + 0,750,751,1,0,0,0,751,753,5,2,0,0,752,754,5,149,0,0,753,752,1,0,0,0,753, + 754,1,0,0,0,754,755,1,0,0,0,755,757,3,48,24,0,756,758,5,149,0,0,757,756, + 1,0,0,0,757,758,1,0,0,0,758,764,1,0,0,0,759,761,5,3,0,0,760,762,5,149, + 0,0,761,760,1,0,0,0,761,762,1,0,0,0,762,763,1,0,0,0,763,765,3,48,24,0, + 764,759,1,0,0,0,765,766,1,0,0,0,766,764,1,0,0,0,766,767,1,0,0,0,767,769, + 1,0,0,0,768,770,5,149,0,0,769,768,1,0,0,0,769,770,1,0,0,0,770,779,1,0, + 0,0,771,773,5,3,0,0,772,774,5,149,0,0,773,772,1,0,0,0,773,774,1,0,0,0, + 774,775,1,0,0,0,775,777,3,66,33,0,776,778,5,149,0,0,777,776,1,0,0,0,777, + 778,1,0,0,0,778,780,1,0,0,0,779,771,1,0,0,0,779,780,1,0,0,0,780,789,1, + 0,0,0,781,783,5,3,0,0,782,784,5,149,0,0,783,782,1,0,0,0,783,784,1,0,0, + 0,784,785,1,0,0,0,785,787,3,286,143,0,786,788,5,149,0,0,787,786,1,0,0, + 0,787,788,1,0,0,0,788,790,1,0,0,0,789,781,1,0,0,0,789,790,1,0,0,0,790, + 791,1,0,0,0,791,792,5,4,0,0,792,47,1,0,0,0,793,794,5,53,0,0,794,795,5, + 149,0,0,795,796,3,284,142,0,796,797,5,149,0,0,797,798,5,70,0,0,798,799, + 5,149,0,0,799,800,3,284,142,0,800,49,1,0,0,0,801,802,5,91,0,0,802,803, + 5,149,0,0,803,804,5,61,0,0,804,805,5,149,0,0,805,806,3,284,142,0,806, + 51,1,0,0,0,807,808,5,62,0,0,808,809,5,149,0,0,809,810,7,0,0,0,810,811, + 5,149,0,0,811,812,3,284,142,0,812,53,1,0,0,0,813,814,5,63,0,0,814,815, + 5,149,0,0,815,816,5,59,0,0,816,817,5,149,0,0,817,818,3,284,142,0,818, + 819,5,149,0,0,819,820,3,56,28,0,820,55,1,0,0,0,821,826,3,58,29,0,822, + 826,3,60,30,0,823,826,3,62,31,0,824,826,3,64,32,0,825,821,1,0,0,0,825, + 822,1,0,0,0,825,823,1,0,0,0,825,824,1,0,0,0,826,57,1,0,0,0,827,828,5, + 66,0,0,828,829,5,149,0,0,829,830,3,278,139,0,830,831,5,149,0,0,831,836, + 3,72,36,0,832,833,5,149,0,0,833,834,5,64,0,0,834,835,5,149,0,0,835,837, + 3,190,95,0,836,832,1,0,0,0,836,837,1,0,0,0,837,59,1,0,0,0,838,839,5,62, + 0,0,839,840,5,149,0,0,840,841,3,278,139,0,841,61,1,0,0,0,842,843,5,65, + 0,0,843,844,5,149,0,0,844,845,5,70,0,0,845,846,5,149,0,0,846,847,3,284, + 142,0,847,63,1,0,0,0,848,849,5,65,0,0,849,850,5,149,0,0,850,851,3,278, + 139,0,851,852,5,149,0,0,852,853,5,70,0,0,853,854,5,149,0,0,854,855,3, + 278,139,0,855,65,1,0,0,0,856,867,3,68,34,0,857,859,5,149,0,0,858,857, + 1,0,0,0,858,859,1,0,0,0,859,860,1,0,0,0,860,862,5,3,0,0,861,863,5,149, + 0,0,862,861,1,0,0,0,862,863,1,0,0,0,863,864,1,0,0,0,864,866,3,68,34,0, + 865,858,1,0,0,0,866,869,1,0,0,0,867,865,1,0,0,0,867,868,1,0,0,0,868,67, + 1,0,0,0,869,867,1,0,0,0,870,871,3,278,139,0,871,872,5,149,0,0,872,873, + 3,72,36,0,873,69,1,0,0,0,874,875,5,67,0,0,875,876,5,149,0,0,876,878,5, + 68,0,0,877,879,5,149,0,0,878,877,1,0,0,0,878,879,1,0,0,0,879,880,1,0, + 0,0,880,882,5,2,0,0,881,883,5,149,0,0,882,881,1,0,0,0,882,883,1,0,0,0, + 883,884,1,0,0,0,884,886,3,278,139,0,885,887,5,149,0,0,886,885,1,0,0,0, + 886,887,1,0,0,0,887,888,1,0,0,0,888,889,5,4,0,0,889,71,1,0,0,0,890,891, + 6,36,-1,0,891,943,3,286,143,0,892,894,5,84,0,0,893,895,5,149,0,0,894, + 893,1,0,0,0,894,895,1,0,0,0,895,896,1,0,0,0,896,898,5,2,0,0,897,899,5, + 149,0,0,898,897,1,0,0,0,898,899,1,0,0,0,899,900,1,0,0,0,900,902,3,66, + 33,0,901,903,5,149,0,0,902,901,1,0,0,0,902,903,1,0,0,0,903,904,1,0,0, + 0,904,905,5,4,0,0,905,943,1,0,0,0,906,908,3,286,143,0,907,909,5,149,0, + 0,908,907,1,0,0,0,908,909,1,0,0,0,909,910,1,0,0,0,910,912,5,2,0,0,911, + 913,5,149,0,0,912,911,1,0,0,0,912,913,1,0,0,0,913,914,1,0,0,0,914,916, + 3,66,33,0,915,917,5,149,0,0,916,915,1,0,0,0,916,917,1,0,0,0,917,918,1, + 0,0,0,918,919,5,4,0,0,919,943,1,0,0,0,920,922,3,286,143,0,921,923,5,149, + 0,0,922,921,1,0,0,0,922,923,1,0,0,0,923,924,1,0,0,0,924,926,5,2,0,0,925, + 927,5,149,0,0,926,925,1,0,0,0,926,927,1,0,0,0,927,928,1,0,0,0,928,930, + 3,72,36,0,929,931,5,149,0,0,930,929,1,0,0,0,930,931,1,0,0,0,931,932,1, + 0,0,0,932,934,5,3,0,0,933,935,5,149,0,0,934,933,1,0,0,0,934,935,1,0,0, + 0,935,936,1,0,0,0,936,938,3,72,36,0,937,939,5,149,0,0,938,937,1,0,0,0, + 938,939,1,0,0,0,939,940,1,0,0,0,940,941,5,4,0,0,941,943,1,0,0,0,942,890, + 1,0,0,0,942,892,1,0,0,0,942,906,1,0,0,0,942,920,1,0,0,0,943,948,1,0,0, + 0,944,945,10,4,0,0,945,947,3,74,37,0,946,944,1,0,0,0,947,950,1,0,0,0, + 948,946,1,0,0,0,948,949,1,0,0,0,949,73,1,0,0,0,950,948,1,0,0,0,951,955, + 3,76,38,0,952,954,3,76,38,0,953,952,1,0,0,0,954,957,1,0,0,0,955,953,1, + 0,0,0,955,956,1,0,0,0,956,75,1,0,0,0,957,955,1,0,0,0,958,960,5,6,0,0, + 959,961,3,280,140,0,960,959,1,0,0,0,960,961,1,0,0,0,961,962,1,0,0,0,962, + 963,5,7,0,0,963,77,1,0,0,0,964,967,3,80,40,0,965,967,3,82,41,0,966,964, + 1,0,0,0,966,965,1,0,0,0,967,79,1,0,0,0,968,969,5,71,0,0,969,81,1,0,0, + 0,970,971,5,72,0,0,971,83,1,0,0,0,972,973,5,73,0,0,973,974,5,149,0,0, + 974,987,5,74,0,0,975,976,5,73,0,0,976,977,5,149,0,0,977,978,5,74,0,0, + 978,979,5,149,0,0,979,980,5,75,0,0,980,981,5,149,0,0,981,987,5,76,0,0, + 982,987,5,78,0,0,983,987,5,79,0,0,984,987,5,80,0,0,985,987,5,81,0,0,986, + 972,1,0,0,0,986,975,1,0,0,0,986,982,1,0,0,0,986,983,1,0,0,0,986,984,1, + 0,0,0,986,985,1,0,0,0,987,85,1,0,0,0,988,991,3,88,44,0,989,991,3,90,45, + 0,990,988,1,0,0,0,990,989,1,0,0,0,991,87,1,0,0,0,992,993,5,86,0,0,993, + 994,5,149,0,0,994,995,5,83,0,0,995,998,5,149,0,0,996,999,5,135,0,0,997, + 999,3,270,135,0,998,996,1,0,0,0,998,997,1,0,0,0,999,89,1,0,0,0,1000,1001, + 5,82,0,0,1001,1002,5,149,0,0,1002,1003,3,270,135,0,1003,91,1,0,0,0,1004, + 1005,3,94,47,0,1005,93,1,0,0,0,1006,1013,3,98,49,0,1007,1009,5,149,0, + 0,1008,1007,1,0,0,0,1008,1009,1,0,0,0,1009,1010,1,0,0,0,1010,1012,3,96, + 48,0,1011,1008,1,0,0,0,1012,1015,1,0,0,0,1013,1011,1,0,0,0,1013,1014, + 1,0,0,0,1014,1028,1,0,0,0,1015,1013,1,0,0,0,1016,1018,3,132,66,0,1017, + 1019,5,149,0,0,1018,1017,1,0,0,0,1018,1019,1,0,0,0,1019,1021,1,0,0,0, + 1020,1016,1,0,0,0,1021,1022,1,0,0,0,1022,1020,1,0,0,0,1022,1023,1,0,0, + 0,1023,1024,1,0,0,0,1024,1025,3,98,49,0,1025,1026,6,47,-1,0,1026,1028, + 1,0,0,0,1027,1006,1,0,0,0,1027,1020,1,0,0,0,1028,95,1,0,0,0,1029,1030, + 5,84,0,0,1030,1031,5,149,0,0,1031,1033,5,85,0,0,1032,1034,5,149,0,0,1033, + 1032,1,0,0,0,1033,1034,1,0,0,0,1034,1035,1,0,0,0,1035,1042,3,98,49,0, + 1036,1038,5,84,0,0,1037,1039,5,149,0,0,1038,1037,1,0,0,0,1038,1039,1, + 0,0,0,1039,1040,1,0,0,0,1040,1042,3,98,49,0,1041,1029,1,0,0,0,1041,1036, + 1,0,0,0,1042,97,1,0,0,0,1043,1046,3,100,50,0,1044,1046,3,102,51,0,1045, + 1043,1,0,0,0,1045,1044,1,0,0,0,1046,99,1,0,0,0,1047,1049,3,108,54,0,1048, + 1050,5,149,0,0,1049,1048,1,0,0,0,1049,1050,1,0,0,0,1050,1052,1,0,0,0, + 1051,1047,1,0,0,0,1052,1055,1,0,0,0,1053,1051,1,0,0,0,1053,1054,1,0,0, + 0,1054,1056,1,0,0,0,1055,1053,1,0,0,0,1056,1093,3,132,66,0,1057,1059, + 3,108,54,0,1058,1060,5,149,0,0,1059,1058,1,0,0,0,1059,1060,1,0,0,0,1060, + 1062,1,0,0,0,1061,1057,1,0,0,0,1062,1065,1,0,0,0,1063,1061,1,0,0,0,1063, + 1064,1,0,0,0,1064,1066,1,0,0,0,1065,1063,1,0,0,0,1066,1073,3,106,53,0, + 1067,1069,5,149,0,0,1068,1067,1,0,0,0,1068,1069,1,0,0,0,1069,1070,1,0, + 0,0,1070,1072,3,106,53,0,1071,1068,1,0,0,0,1072,1075,1,0,0,0,1073,1071, + 1,0,0,0,1073,1074,1,0,0,0,1074,1080,1,0,0,0,1075,1073,1,0,0,0,1076,1078, + 5,149,0,0,1077,1076,1,0,0,0,1077,1078,1,0,0,0,1078,1079,1,0,0,0,1079, + 1081,3,132,66,0,1080,1077,1,0,0,0,1080,1081,1,0,0,0,1081,1093,1,0,0,0, + 1082,1084,3,108,54,0,1083,1085,5,149,0,0,1084,1083,1,0,0,0,1084,1085, + 1,0,0,0,1085,1087,1,0,0,0,1086,1082,1,0,0,0,1087,1088,1,0,0,0,1088,1086, + 1,0,0,0,1088,1089,1,0,0,0,1089,1090,1,0,0,0,1090,1091,6,50,-1,0,1091, + 1093,1,0,0,0,1092,1053,1,0,0,0,1092,1063,1,0,0,0,1092,1086,1,0,0,0,1093, + 101,1,0,0,0,1094,1096,3,104,52,0,1095,1097,5,149,0,0,1096,1095,1,0,0, + 0,1096,1097,1,0,0,0,1097,1099,1,0,0,0,1098,1094,1,0,0,0,1099,1100,1,0, + 0,0,1100,1098,1,0,0,0,1100,1101,1,0,0,0,1101,1102,1,0,0,0,1102,1103,3, + 100,50,0,1103,103,1,0,0,0,1104,1106,3,108,54,0,1105,1107,5,149,0,0,1106, + 1105,1,0,0,0,1106,1107,1,0,0,0,1107,1109,1,0,0,0,1108,1104,1,0,0,0,1109, + 1112,1,0,0,0,1110,1108,1,0,0,0,1110,1111,1,0,0,0,1111,1119,1,0,0,0,1112, + 1110,1,0,0,0,1113,1115,3,106,53,0,1114,1116,5,149,0,0,1115,1114,1,0,0, + 0,1115,1116,1,0,0,0,1116,1118,1,0,0,0,1117,1113,1,0,0,0,1118,1121,1,0, + 0,0,1119,1117,1,0,0,0,1119,1120,1,0,0,0,1120,1122,1,0,0,0,1121,1119,1, + 0,0,0,1122,1123,3,130,65,0,1123,105,1,0,0,0,1124,1129,3,118,59,0,1125, + 1129,3,120,60,0,1126,1129,3,124,62,0,1127,1129,3,128,64,0,1128,1124,1, + 0,0,0,1128,1125,1,0,0,0,1128,1126,1,0,0,0,1128,1127,1,0,0,0,1129,107, + 1,0,0,0,1130,1135,3,114,57,0,1131,1135,3,116,58,0,1132,1135,3,112,56, + 0,1133,1135,3,110,55,0,1134,1130,1,0,0,0,1134,1131,1,0,0,0,1134,1132, + 1,0,0,0,1134,1133,1,0,0,0,1135,109,1,0,0,0,1136,1154,5,86,0,0,1137,1138, + 5,149,0,0,1138,1139,5,97,0,0,1139,1140,5,149,0,0,1140,1142,5,87,0,0,1141, + 1143,5,149,0,0,1142,1141,1,0,0,0,1142,1143,1,0,0,0,1143,1144,1,0,0,0, + 1144,1146,5,2,0,0,1145,1147,5,149,0,0,1146,1145,1,0,0,0,1146,1147,1,0, + 0,0,1147,1148,1,0,0,0,1148,1150,3,66,33,0,1149,1151,5,149,0,0,1150,1149, + 1,0,0,0,1150,1151,1,0,0,0,1151,1152,1,0,0,0,1152,1153,5,4,0,0,1153,1155, + 1,0,0,0,1154,1137,1,0,0,0,1154,1155,1,0,0,0,1155,1156,1,0,0,0,1156,1157, + 5,149,0,0,1157,1158,5,53,0,0,1158,1159,5,149,0,0,1159,1164,3,10,5,0,1160, + 1162,5,149,0,0,1161,1160,1,0,0,0,1161,1162,1,0,0,0,1162,1163,1,0,0,0, + 1163,1165,3,36,18,0,1164,1161,1,0,0,0,1164,1165,1,0,0,0,1165,1170,1,0, + 0,0,1166,1168,5,149,0,0,1167,1166,1,0,0,0,1167,1168,1,0,0,0,1168,1169, + 1,0,0,0,1169,1171,3,148,74,0,1170,1167,1,0,0,0,1170,1171,1,0,0,0,1171, + 111,1,0,0,0,1172,1173,5,48,0,0,1173,1174,5,149,0,0,1174,1179,3,252,126, + 0,1175,1177,5,149,0,0,1176,1175,1,0,0,0,1176,1177,1,0,0,0,1177,1178,1, + 0,0,0,1178,1180,3,148,74,0,1179,1176,1,0,0,0,1179,1180,1,0,0,0,1180,113, + 1,0,0,0,1181,1182,5,88,0,0,1182,1184,5,149,0,0,1183,1181,1,0,0,0,1183, + 1184,1,0,0,0,1184,1185,1,0,0,0,1185,1187,5,89,0,0,1186,1188,5,149,0,0, + 1187,1186,1,0,0,0,1187,1188,1,0,0,0,1188,1189,1,0,0,0,1189,1194,3,150, + 75,0,1190,1192,5,149,0,0,1191,1190,1,0,0,0,1191,1192,1,0,0,0,1192,1193, + 1,0,0,0,1193,1195,3,148,74,0,1194,1191,1,0,0,0,1194,1195,1,0,0,0,1195, + 115,1,0,0,0,1196,1198,5,90,0,0,1197,1199,5,149,0,0,1198,1197,1,0,0,0, + 1198,1199,1,0,0,0,1199,1200,1,0,0,0,1200,1201,3,190,95,0,1201,1202,5, + 149,0,0,1202,1203,5,101,0,0,1203,1204,5,149,0,0,1204,1205,3,270,135,0, + 1205,117,1,0,0,0,1206,1208,5,91,0,0,1207,1209,5,149,0,0,1208,1207,1,0, + 0,0,1208,1209,1,0,0,0,1209,1210,1,0,0,0,1210,1211,3,150,75,0,1211,119, + 1,0,0,0,1212,1214,5,92,0,0,1213,1215,5,149,0,0,1214,1213,1,0,0,0,1214, + 1215,1,0,0,0,1215,1216,1,0,0,0,1216,1221,3,150,75,0,1217,1218,5,149,0, + 0,1218,1220,3,122,61,0,1219,1217,1,0,0,0,1220,1223,1,0,0,0,1221,1219, + 1,0,0,0,1221,1222,1,0,0,0,1222,121,1,0,0,0,1223,1221,1,0,0,0,1224,1225, + 5,93,0,0,1225,1226,5,149,0,0,1226,1227,5,89,0,0,1227,1228,5,149,0,0,1228, + 1235,3,124,62,0,1229,1230,5,93,0,0,1230,1231,5,149,0,0,1231,1232,5,91, + 0,0,1232,1233,5,149,0,0,1233,1235,3,124,62,0,1234,1224,1,0,0,0,1234,1229, + 1,0,0,0,1235,123,1,0,0,0,1236,1238,5,94,0,0,1237,1239,5,149,0,0,1238, + 1237,1,0,0,0,1238,1239,1,0,0,0,1239,1240,1,0,0,0,1240,1251,3,126,63,0, + 1241,1243,5,149,0,0,1242,1241,1,0,0,0,1242,1243,1,0,0,0,1243,1244,1,0, + 0,0,1244,1246,5,3,0,0,1245,1247,5,149,0,0,1246,1245,1,0,0,0,1246,1247, + 1,0,0,0,1247,1248,1,0,0,0,1248,1250,3,126,63,0,1249,1242,1,0,0,0,1250, + 1253,1,0,0,0,1251,1249,1,0,0,0,1251,1252,1,0,0,0,1252,125,1,0,0,0,1253, + 1251,1,0,0,0,1254,1256,3,276,138,0,1255,1257,5,149,0,0,1256,1255,1,0, + 0,0,1256,1257,1,0,0,0,1257,1258,1,0,0,0,1258,1260,5,5,0,0,1259,1261,5, + 149,0,0,1260,1259,1,0,0,0,1260,1261,1,0,0,0,1261,1262,1,0,0,0,1262,1263, + 3,190,95,0,1263,127,1,0,0,0,1264,1265,5,95,0,0,1265,1267,5,149,0,0,1266, + 1264,1,0,0,0,1266,1267,1,0,0,0,1267,1268,1,0,0,0,1268,1270,5,96,0,0,1269, + 1271,5,149,0,0,1270,1269,1,0,0,0,1270,1271,1,0,0,0,1271,1272,1,0,0,0, + 1272,1283,3,190,95,0,1273,1275,5,149,0,0,1274,1273,1,0,0,0,1274,1275, + 1,0,0,0,1275,1276,1,0,0,0,1276,1278,5,3,0,0,1277,1279,5,149,0,0,1278, + 1277,1,0,0,0,1278,1279,1,0,0,0,1279,1280,1,0,0,0,1280,1282,3,190,95,0, + 1281,1274,1,0,0,0,1282,1285,1,0,0,0,1283,1281,1,0,0,0,1283,1284,1,0,0, + 0,1284,129,1,0,0,0,1285,1283,1,0,0,0,1286,1287,5,97,0,0,1287,1292,3,134, + 67,0,1288,1290,5,149,0,0,1289,1288,1,0,0,0,1289,1290,1,0,0,0,1290,1291, + 1,0,0,0,1291,1293,3,148,74,0,1292,1289,1,0,0,0,1292,1293,1,0,0,0,1293, + 131,1,0,0,0,1294,1295,5,98,0,0,1295,1296,3,134,67,0,1296,133,1,0,0,0, + 1297,1299,5,149,0,0,1298,1297,1,0,0,0,1298,1299,1,0,0,0,1299,1300,1,0, + 0,0,1300,1302,5,99,0,0,1301,1298,1,0,0,0,1301,1302,1,0,0,0,1302,1303, + 1,0,0,0,1303,1304,5,149,0,0,1304,1307,3,136,68,0,1305,1306,5,149,0,0, + 1306,1308,3,140,70,0,1307,1305,1,0,0,0,1307,1308,1,0,0,0,1308,1311,1, + 0,0,0,1309,1310,5,149,0,0,1310,1312,3,142,71,0,1311,1309,1,0,0,0,1311, + 1312,1,0,0,0,1312,1315,1,0,0,0,1313,1314,5,149,0,0,1314,1316,3,144,72, + 0,1315,1313,1,0,0,0,1315,1316,1,0,0,0,1316,135,1,0,0,0,1317,1328,5,100, + 0,0,1318,1320,5,149,0,0,1319,1318,1,0,0,0,1319,1320,1,0,0,0,1320,1321, + 1,0,0,0,1321,1323,5,3,0,0,1322,1324,5,149,0,0,1323,1322,1,0,0,0,1323, + 1324,1,0,0,0,1324,1325,1,0,0,0,1325,1327,3,138,69,0,1326,1319,1,0,0,0, + 1327,1330,1,0,0,0,1328,1326,1,0,0,0,1328,1329,1,0,0,0,1329,1346,1,0,0, + 0,1330,1328,1,0,0,0,1331,1342,3,138,69,0,1332,1334,5,149,0,0,1333,1332, + 1,0,0,0,1333,1334,1,0,0,0,1334,1335,1,0,0,0,1335,1337,5,3,0,0,1336,1338, + 5,149,0,0,1337,1336,1,0,0,0,1337,1338,1,0,0,0,1338,1339,1,0,0,0,1339, + 1341,3,138,69,0,1340,1333,1,0,0,0,1341,1344,1,0,0,0,1342,1340,1,0,0,0, + 1342,1343,1,0,0,0,1343,1346,1,0,0,0,1344,1342,1,0,0,0,1345,1317,1,0,0, + 0,1345,1331,1,0,0,0,1346,137,1,0,0,0,1347,1348,3,190,95,0,1348,1349,5, + 149,0,0,1349,1350,5,101,0,0,1350,1351,5,149,0,0,1351,1352,3,270,135,0, + 1352,1355,1,0,0,0,1353,1355,3,190,95,0,1354,1347,1,0,0,0,1354,1353,1, + 0,0,0,1355,139,1,0,0,0,1356,1357,5,102,0,0,1357,1358,5,149,0,0,1358,1359, + 5,103,0,0,1359,1360,5,149,0,0,1360,1368,3,146,73,0,1361,1363,5,3,0,0, + 1362,1364,5,149,0,0,1363,1362,1,0,0,0,1363,1364,1,0,0,0,1364,1365,1,0, + 0,0,1365,1367,3,146,73,0,1366,1361,1,0,0,0,1367,1370,1,0,0,0,1368,1366, + 1,0,0,0,1368,1369,1,0,0,0,1369,141,1,0,0,0,1370,1368,1,0,0,0,1371,1372, + 5,104,0,0,1372,1373,5,149,0,0,1373,1374,3,190,95,0,1374,143,1,0,0,0,1375, + 1376,5,105,0,0,1376,1377,5,149,0,0,1377,1378,3,190,95,0,1378,145,1,0, + 0,0,1379,1384,3,190,95,0,1380,1382,5,149,0,0,1381,1380,1,0,0,0,1381,1382, + 1,0,0,0,1382,1383,1,0,0,0,1383,1385,7,1,0,0,1384,1381,1,0,0,0,1384,1385, + 1,0,0,0,1385,147,1,0,0,0,1386,1387,5,110,0,0,1387,1388,5,149,0,0,1388, + 1389,3,190,95,0,1389,149,1,0,0,0,1390,1401,3,152,76,0,1391,1393,5,149, + 0,0,1392,1391,1,0,0,0,1392,1393,1,0,0,0,1393,1394,1,0,0,0,1394,1396,5, + 3,0,0,1395,1397,5,149,0,0,1396,1395,1,0,0,0,1396,1397,1,0,0,0,1397,1398, + 1,0,0,0,1398,1400,3,152,76,0,1399,1392,1,0,0,0,1400,1403,1,0,0,0,1401, + 1399,1,0,0,0,1401,1402,1,0,0,0,1402,151,1,0,0,0,1403,1401,1,0,0,0,1404, + 1406,3,270,135,0,1405,1407,5,149,0,0,1406,1405,1,0,0,0,1406,1407,1,0, + 0,0,1407,1408,1,0,0,0,1408,1410,5,5,0,0,1409,1411,5,149,0,0,1410,1409, + 1,0,0,0,1410,1411,1,0,0,0,1411,1412,1,0,0,0,1412,1413,3,154,77,0,1413, + 1416,1,0,0,0,1414,1416,3,154,77,0,1415,1404,1,0,0,0,1415,1414,1,0,0,0, + 1416,153,1,0,0,0,1417,1418,3,156,78,0,1418,155,1,0,0,0,1419,1426,3,158, + 79,0,1420,1422,5,149,0,0,1421,1420,1,0,0,0,1421,1422,1,0,0,0,1422,1423, + 1,0,0,0,1423,1425,3,160,80,0,1424,1421,1,0,0,0,1425,1428,1,0,0,0,1426, + 1424,1,0,0,0,1426,1427,1,0,0,0,1427,1434,1,0,0,0,1428,1426,1,0,0,0,1429, + 1430,5,2,0,0,1430,1431,3,156,78,0,1431,1432,5,4,0,0,1432,1434,1,0,0,0, + 1433,1419,1,0,0,0,1433,1429,1,0,0,0,1434,157,1,0,0,0,1435,1437,5,2,0, + 0,1436,1438,5,149,0,0,1437,1436,1,0,0,0,1437,1438,1,0,0,0,1438,1443,1, + 0,0,0,1439,1441,3,270,135,0,1440,1442,5,149,0,0,1441,1440,1,0,0,0,1441, + 1442,1,0,0,0,1442,1444,1,0,0,0,1443,1439,1,0,0,0,1443,1444,1,0,0,0,1444, + 1449,1,0,0,0,1445,1447,3,170,85,0,1446,1448,5,149,0,0,1447,1446,1,0,0, + 0,1447,1448,1,0,0,0,1448,1450,1,0,0,0,1449,1445,1,0,0,0,1449,1450,1,0, + 0,0,1450,1455,1,0,0,0,1451,1453,3,166,83,0,1452,1454,5,149,0,0,1453,1452, + 1,0,0,0,1453,1454,1,0,0,0,1454,1456,1,0,0,0,1455,1451,1,0,0,0,1455,1456, + 1,0,0,0,1456,1457,1,0,0,0,1457,1458,5,4,0,0,1458,159,1,0,0,0,1459,1461, + 3,162,81,0,1460,1462,5,149,0,0,1461,1460,1,0,0,0,1461,1462,1,0,0,0,1462, + 1463,1,0,0,0,1463,1464,3,158,79,0,1464,161,1,0,0,0,1465,1467,3,290,145, + 0,1466,1468,5,149,0,0,1467,1466,1,0,0,0,1467,1468,1,0,0,0,1468,1469,1, + 0,0,0,1469,1471,3,294,147,0,1470,1472,5,149,0,0,1471,1470,1,0,0,0,1471, + 1472,1,0,0,0,1472,1474,1,0,0,0,1473,1475,3,164,82,0,1474,1473,1,0,0,0, + 1474,1475,1,0,0,0,1475,1477,1,0,0,0,1476,1478,5,149,0,0,1477,1476,1,0, + 0,0,1477,1478,1,0,0,0,1478,1479,1,0,0,0,1479,1480,3,294,147,0,1480,1510, + 1,0,0,0,1481,1483,3,294,147,0,1482,1484,5,149,0,0,1483,1482,1,0,0,0,1483, + 1484,1,0,0,0,1484,1486,1,0,0,0,1485,1487,3,164,82,0,1486,1485,1,0,0,0, + 1486,1487,1,0,0,0,1487,1489,1,0,0,0,1488,1490,5,149,0,0,1489,1488,1,0, + 0,0,1489,1490,1,0,0,0,1490,1491,1,0,0,0,1491,1493,3,294,147,0,1492,1494, + 5,149,0,0,1493,1492,1,0,0,0,1493,1494,1,0,0,0,1494,1495,1,0,0,0,1495, + 1496,3,292,146,0,1496,1510,1,0,0,0,1497,1499,3,294,147,0,1498,1500,5, + 149,0,0,1499,1498,1,0,0,0,1499,1500,1,0,0,0,1500,1502,1,0,0,0,1501,1503, + 3,164,82,0,1502,1501,1,0,0,0,1502,1503,1,0,0,0,1503,1505,1,0,0,0,1504, + 1506,5,149,0,0,1505,1504,1,0,0,0,1505,1506,1,0,0,0,1506,1507,1,0,0,0, + 1507,1508,3,294,147,0,1508,1510,1,0,0,0,1509,1465,1,0,0,0,1509,1481,1, + 0,0,0,1509,1497,1,0,0,0,1510,163,1,0,0,0,1511,1513,5,6,0,0,1512,1514, + 5,149,0,0,1513,1512,1,0,0,0,1513,1514,1,0,0,0,1514,1519,1,0,0,0,1515, + 1517,3,270,135,0,1516,1518,5,149,0,0,1517,1516,1,0,0,0,1517,1518,1,0, + 0,0,1518,1520,1,0,0,0,1519,1515,1,0,0,0,1519,1520,1,0,0,0,1520,1525,1, + 0,0,0,1521,1523,3,168,84,0,1522,1524,5,149,0,0,1523,1522,1,0,0,0,1523, + 1524,1,0,0,0,1524,1526,1,0,0,0,1525,1521,1,0,0,0,1525,1526,1,0,0,0,1526, + 1531,1,0,0,0,1527,1529,3,174,87,0,1528,1530,5,149,0,0,1529,1528,1,0,0, + 0,1529,1530,1,0,0,0,1530,1532,1,0,0,0,1531,1527,1,0,0,0,1531,1532,1,0, + 0,0,1532,1537,1,0,0,0,1533,1535,3,166,83,0,1534,1536,5,149,0,0,1535,1534, + 1,0,0,0,1535,1536,1,0,0,0,1536,1538,1,0,0,0,1537,1533,1,0,0,0,1537,1538, + 1,0,0,0,1538,1539,1,0,0,0,1539,1540,5,7,0,0,1540,165,1,0,0,0,1541,1543, + 5,8,0,0,1542,1544,5,149,0,0,1543,1542,1,0,0,0,1543,1544,1,0,0,0,1544, + 1578,1,0,0,0,1545,1547,3,278,139,0,1546,1548,5,149,0,0,1547,1546,1,0, + 0,0,1547,1548,1,0,0,0,1548,1549,1,0,0,0,1549,1551,5,119,0,0,1550,1552, + 5,149,0,0,1551,1550,1,0,0,0,1551,1552,1,0,0,0,1552,1553,1,0,0,0,1553, + 1555,3,190,95,0,1554,1556,5,149,0,0,1555,1554,1,0,0,0,1555,1556,1,0,0, + 0,1556,1575,1,0,0,0,1557,1559,5,3,0,0,1558,1560,5,149,0,0,1559,1558,1, + 0,0,0,1559,1560,1,0,0,0,1560,1561,1,0,0,0,1561,1563,3,278,139,0,1562, + 1564,5,149,0,0,1563,1562,1,0,0,0,1563,1564,1,0,0,0,1564,1565,1,0,0,0, + 1565,1567,5,119,0,0,1566,1568,5,149,0,0,1567,1566,1,0,0,0,1567,1568,1, + 0,0,0,1568,1569,1,0,0,0,1569,1571,3,190,95,0,1570,1572,5,149,0,0,1571, + 1570,1,0,0,0,1571,1572,1,0,0,0,1572,1574,1,0,0,0,1573,1557,1,0,0,0,1574, + 1577,1,0,0,0,1575,1573,1,0,0,0,1575,1576,1,0,0,0,1576,1579,1,0,0,0,1577, + 1575,1,0,0,0,1578,1545,1,0,0,0,1578,1579,1,0,0,0,1579,1580,1,0,0,0,1580, + 1581,5,9,0,0,1581,167,1,0,0,0,1582,1584,5,119,0,0,1583,1585,5,149,0,0, + 1584,1583,1,0,0,0,1584,1585,1,0,0,0,1585,1586,1,0,0,0,1586,1600,3,188, + 94,0,1587,1589,5,149,0,0,1588,1587,1,0,0,0,1588,1589,1,0,0,0,1589,1590, + 1,0,0,0,1590,1592,5,10,0,0,1591,1593,5,119,0,0,1592,1591,1,0,0,0,1592, + 1593,1,0,0,0,1593,1595,1,0,0,0,1594,1596,5,149,0,0,1595,1594,1,0,0,0, + 1595,1596,1,0,0,0,1596,1597,1,0,0,0,1597,1599,3,188,94,0,1598,1588,1, + 0,0,0,1599,1602,1,0,0,0,1600,1598,1,0,0,0,1600,1601,1,0,0,0,1601,169, + 1,0,0,0,1602,1600,1,0,0,0,1603,1610,3,172,86,0,1604,1606,5,149,0,0,1605, + 1604,1,0,0,0,1605,1606,1,0,0,0,1606,1607,1,0,0,0,1607,1609,3,172,86,0, + 1608,1605,1,0,0,0,1609,1612,1,0,0,0,1610,1608,1,0,0,0,1610,1611,1,0,0, + 0,1611,171,1,0,0,0,1612,1610,1,0,0,0,1613,1615,5,119,0,0,1614,1616,5, + 149,0,0,1615,1614,1,0,0,0,1615,1616,1,0,0,0,1616,1617,1,0,0,0,1617,1618, + 3,186,93,0,1618,173,1,0,0,0,1619,1621,5,100,0,0,1620,1622,5,149,0,0,1621, + 1620,1,0,0,0,1621,1622,1,0,0,0,1622,1627,1,0,0,0,1623,1628,5,111,0,0, + 1624,1625,5,85,0,0,1625,1626,5,149,0,0,1626,1628,5,111,0,0,1627,1623, + 1,0,0,0,1627,1624,1,0,0,0,1627,1628,1,0,0,0,1628,1630,1,0,0,0,1629,1631, + 5,149,0,0,1630,1629,1,0,0,0,1630,1631,1,0,0,0,1631,1646,1,0,0,0,1632, + 1634,3,182,91,0,1633,1632,1,0,0,0,1633,1634,1,0,0,0,1634,1636,1,0,0,0, + 1635,1637,5,149,0,0,1636,1635,1,0,0,0,1636,1637,1,0,0,0,1637,1638,1,0, + 0,0,1638,1640,5,11,0,0,1639,1641,5,149,0,0,1640,1639,1,0,0,0,1640,1641, + 1,0,0,0,1641,1643,1,0,0,0,1642,1644,3,184,92,0,1643,1642,1,0,0,0,1643, + 1644,1,0,0,0,1644,1647,1,0,0,0,1645,1647,3,280,140,0,1646,1633,1,0,0, + 0,1646,1645,1,0,0,0,1646,1647,1,0,0,0,1647,1652,1,0,0,0,1648,1650,5,149, + 0,0,1649,1648,1,0,0,0,1649,1650,1,0,0,0,1650,1651,1,0,0,0,1651,1653,3, + 176,88,0,1652,1649,1,0,0,0,1652,1653,1,0,0,0,1653,175,1,0,0,0,1654,1656, + 5,2,0,0,1655,1657,5,149,0,0,1656,1655,1,0,0,0,1656,1657,1,0,0,0,1657, + 1658,1,0,0,0,1658,1660,3,270,135,0,1659,1661,5,149,0,0,1660,1659,1,0, + 0,0,1660,1661,1,0,0,0,1661,1662,1,0,0,0,1662,1664,5,3,0,0,1663,1665,5, + 149,0,0,1664,1663,1,0,0,0,1664,1665,1,0,0,0,1665,1666,1,0,0,0,1666,1675, + 3,270,135,0,1667,1669,5,149,0,0,1668,1667,1,0,0,0,1668,1669,1,0,0,0,1669, + 1670,1,0,0,0,1670,1672,5,10,0,0,1671,1673,5,149,0,0,1672,1671,1,0,0,0, + 1672,1673,1,0,0,0,1673,1674,1,0,0,0,1674,1676,3,148,74,0,1675,1668,1, + 0,0,0,1675,1676,1,0,0,0,1676,1696,1,0,0,0,1677,1679,5,149,0,0,1678,1677, + 1,0,0,0,1678,1679,1,0,0,0,1679,1680,1,0,0,0,1680,1682,5,10,0,0,1681,1683, + 5,149,0,0,1682,1681,1,0,0,0,1682,1683,1,0,0,0,1683,1684,1,0,0,0,1684, + 1686,3,180,90,0,1685,1687,5,149,0,0,1686,1685,1,0,0,0,1686,1687,1,0,0, + 0,1687,1688,1,0,0,0,1688,1690,5,3,0,0,1689,1691,5,149,0,0,1690,1689,1, + 0,0,0,1690,1691,1,0,0,0,1691,1692,1,0,0,0,1692,1694,3,178,89,0,1693,1695, + 5,149,0,0,1694,1693,1,0,0,0,1694,1695,1,0,0,0,1695,1697,1,0,0,0,1696, + 1678,1,0,0,0,1696,1697,1,0,0,0,1697,1698,1,0,0,0,1698,1699,5,4,0,0,1699, + 177,1,0,0,0,1700,1702,5,8,0,0,1701,1703,5,149,0,0,1702,1701,1,0,0,0,1702, + 1703,1,0,0,0,1703,1705,1,0,0,0,1704,1706,3,136,68,0,1705,1704,1,0,0,0, + 1705,1706,1,0,0,0,1706,1708,1,0,0,0,1707,1709,5,149,0,0,1708,1707,1,0, + 0,0,1708,1709,1,0,0,0,1709,1710,1,0,0,0,1710,1711,5,9,0,0,1711,179,1, + 0,0,0,1712,1714,5,8,0,0,1713,1715,5,149,0,0,1714,1713,1,0,0,0,1714,1715, + 1,0,0,0,1715,1717,1,0,0,0,1716,1718,3,136,68,0,1717,1716,1,0,0,0,1717, + 1718,1,0,0,0,1718,1720,1,0,0,0,1719,1721,5,149,0,0,1720,1719,1,0,0,0, + 1720,1721,1,0,0,0,1721,1722,1,0,0,0,1722,1723,5,9,0,0,1723,181,1,0,0, + 0,1724,1725,5,137,0,0,1725,183,1,0,0,0,1726,1727,5,137,0,0,1727,185,1, + 0,0,0,1728,1729,3,284,142,0,1729,187,1,0,0,0,1730,1731,3,284,142,0,1731, + 189,1,0,0,0,1732,1733,3,192,96,0,1733,191,1,0,0,0,1734,1741,3,194,97, + 0,1735,1736,5,149,0,0,1736,1737,5,112,0,0,1737,1738,5,149,0,0,1738,1740, + 3,194,97,0,1739,1735,1,0,0,0,1740,1743,1,0,0,0,1741,1739,1,0,0,0,1741, + 1742,1,0,0,0,1742,193,1,0,0,0,1743,1741,1,0,0,0,1744,1751,3,196,98,0, + 1745,1746,5,149,0,0,1746,1747,5,113,0,0,1747,1748,5,149,0,0,1748,1750, + 3,196,98,0,1749,1745,1,0,0,0,1750,1753,1,0,0,0,1751,1749,1,0,0,0,1751, + 1752,1,0,0,0,1752,195,1,0,0,0,1753,1751,1,0,0,0,1754,1761,3,198,99,0, + 1755,1756,5,149,0,0,1756,1757,5,114,0,0,1757,1758,5,149,0,0,1758,1760, + 3,198,99,0,1759,1755,1,0,0,0,1760,1763,1,0,0,0,1761,1759,1,0,0,0,1761, + 1762,1,0,0,0,1762,197,1,0,0,0,1763,1761,1,0,0,0,1764,1766,5,115,0,0,1765, + 1767,5,149,0,0,1766,1765,1,0,0,0,1766,1767,1,0,0,0,1767,1769,1,0,0,0, + 1768,1764,1,0,0,0,1769,1772,1,0,0,0,1770,1768,1,0,0,0,1770,1771,1,0,0, + 0,1771,1773,1,0,0,0,1772,1770,1,0,0,0,1773,1774,3,200,100,0,1774,199, + 1,0,0,0,1775,1785,3,204,102,0,1776,1778,5,149,0,0,1777,1776,1,0,0,0,1777, + 1778,1,0,0,0,1778,1779,1,0,0,0,1779,1781,3,202,101,0,1780,1782,5,149, + 0,0,1781,1780,1,0,0,0,1781,1782,1,0,0,0,1782,1783,1,0,0,0,1783,1784,3, + 204,102,0,1784,1786,1,0,0,0,1785,1777,1,0,0,0,1785,1786,1,0,0,0,1786, + 1824,1,0,0,0,1787,1789,3,204,102,0,1788,1790,5,149,0,0,1789,1788,1,0, + 0,0,1789,1790,1,0,0,0,1790,1791,1,0,0,0,1791,1793,5,116,0,0,1792,1794, + 5,149,0,0,1793,1792,1,0,0,0,1793,1794,1,0,0,0,1794,1795,1,0,0,0,1795, + 1796,3,204,102,0,1796,1797,1,0,0,0,1797,1798,6,100,-1,0,1798,1824,1,0, + 0,0,1799,1801,3,204,102,0,1800,1802,5,149,0,0,1801,1800,1,0,0,0,1801, + 1802,1,0,0,0,1802,1803,1,0,0,0,1803,1805,3,202,101,0,1804,1806,5,149, + 0,0,1805,1804,1,0,0,0,1805,1806,1,0,0,0,1806,1807,1,0,0,0,1807,1817,3, + 204,102,0,1808,1810,5,149,0,0,1809,1808,1,0,0,0,1809,1810,1,0,0,0,1810, + 1811,1,0,0,0,1811,1813,3,202,101,0,1812,1814,5,149,0,0,1813,1812,1,0, + 0,0,1813,1814,1,0,0,0,1814,1815,1,0,0,0,1815,1816,3,204,102,0,1816,1818, + 1,0,0,0,1817,1809,1,0,0,0,1818,1819,1,0,0,0,1819,1817,1,0,0,0,1819,1820, + 1,0,0,0,1820,1821,1,0,0,0,1821,1822,6,100,-1,0,1822,1824,1,0,0,0,1823, + 1775,1,0,0,0,1823,1787,1,0,0,0,1823,1799,1,0,0,0,1824,201,1,0,0,0,1825, + 1826,7,2,0,0,1826,203,1,0,0,0,1827,1838,3,206,103,0,1828,1830,5,149,0, + 0,1829,1828,1,0,0,0,1829,1830,1,0,0,0,1830,1831,1,0,0,0,1831,1833,5,10, + 0,0,1832,1834,5,149,0,0,1833,1832,1,0,0,0,1833,1834,1,0,0,0,1834,1835, + 1,0,0,0,1835,1837,3,206,103,0,1836,1829,1,0,0,0,1837,1840,1,0,0,0,1838, + 1836,1,0,0,0,1838,1839,1,0,0,0,1839,205,1,0,0,0,1840,1838,1,0,0,0,1841, + 1852,3,208,104,0,1842,1844,5,149,0,0,1843,1842,1,0,0,0,1843,1844,1,0, + 0,0,1844,1845,1,0,0,0,1845,1847,5,17,0,0,1846,1848,5,149,0,0,1847,1846, + 1,0,0,0,1847,1848,1,0,0,0,1848,1849,1,0,0,0,1849,1851,3,208,104,0,1850, + 1843,1,0,0,0,1851,1854,1,0,0,0,1852,1850,1,0,0,0,1852,1853,1,0,0,0,1853, + 207,1,0,0,0,1854,1852,1,0,0,0,1855,1867,3,212,106,0,1856,1858,5,149,0, + 0,1857,1856,1,0,0,0,1857,1858,1,0,0,0,1858,1859,1,0,0,0,1859,1861,3,210, + 105,0,1860,1862,5,149,0,0,1861,1860,1,0,0,0,1861,1862,1,0,0,0,1862,1863, + 1,0,0,0,1863,1864,3,212,106,0,1864,1866,1,0,0,0,1865,1857,1,0,0,0,1866, + 1869,1,0,0,0,1867,1865,1,0,0,0,1867,1868,1,0,0,0,1868,209,1,0,0,0,1869, + 1867,1,0,0,0,1870,1871,7,3,0,0,1871,211,1,0,0,0,1872,1884,3,216,108,0, + 1873,1875,5,149,0,0,1874,1873,1,0,0,0,1874,1875,1,0,0,0,1875,1876,1,0, + 0,0,1876,1878,3,214,107,0,1877,1879,5,149,0,0,1878,1877,1,0,0,0,1878, + 1879,1,0,0,0,1879,1880,1,0,0,0,1880,1881,3,216,108,0,1881,1883,1,0,0, + 0,1882,1874,1,0,0,0,1883,1886,1,0,0,0,1884,1882,1,0,0,0,1884,1885,1,0, + 0,0,1885,213,1,0,0,0,1886,1884,1,0,0,0,1887,1888,7,4,0,0,1888,215,1,0, + 0,0,1889,1901,3,220,110,0,1890,1892,5,149,0,0,1891,1890,1,0,0,0,1891, + 1892,1,0,0,0,1892,1893,1,0,0,0,1893,1895,3,218,109,0,1894,1896,5,149, + 0,0,1895,1894,1,0,0,0,1895,1896,1,0,0,0,1896,1897,1,0,0,0,1897,1898,3, + 220,110,0,1898,1900,1,0,0,0,1899,1891,1,0,0,0,1900,1903,1,0,0,0,1901, + 1899,1,0,0,0,1901,1902,1,0,0,0,1902,217,1,0,0,0,1903,1901,1,0,0,0,1904, + 1905,7,5,0,0,1905,219,1,0,0,0,1906,1917,3,222,111,0,1907,1909,5,149,0, + 0,1908,1907,1,0,0,0,1908,1909,1,0,0,0,1909,1910,1,0,0,0,1910,1912,5,23, + 0,0,1911,1913,5,149,0,0,1912,1911,1,0,0,0,1912,1913,1,0,0,0,1913,1914, + 1,0,0,0,1914,1916,3,222,111,0,1915,1908,1,0,0,0,1916,1919,1,0,0,0,1917, + 1915,1,0,0,0,1917,1918,1,0,0,0,1918,221,1,0,0,0,1919,1917,1,0,0,0,1920, + 1922,5,117,0,0,1921,1923,5,149,0,0,1922,1921,1,0,0,0,1922,1923,1,0,0, + 0,1923,1925,1,0,0,0,1924,1920,1,0,0,0,1925,1928,1,0,0,0,1926,1924,1,0, + 0,0,1926,1927,1,0,0,0,1927,1929,1,0,0,0,1928,1926,1,0,0,0,1929,1934,3, + 224,112,0,1930,1932,5,149,0,0,1931,1930,1,0,0,0,1931,1932,1,0,0,0,1932, + 1933,1,0,0,0,1933,1935,5,118,0,0,1934,1931,1,0,0,0,1934,1935,1,0,0,0, + 1935,223,1,0,0,0,1936,1944,3,234,117,0,1937,1945,3,228,114,0,1938,1940, + 3,226,113,0,1939,1938,1,0,0,0,1940,1941,1,0,0,0,1941,1939,1,0,0,0,1941, + 1942,1,0,0,0,1942,1945,1,0,0,0,1943,1945,3,232,116,0,1944,1937,1,0,0, + 0,1944,1939,1,0,0,0,1944,1943,1,0,0,0,1944,1945,1,0,0,0,1945,225,1,0, + 0,0,1946,1947,5,149,0,0,1947,1949,5,120,0,0,1948,1950,5,149,0,0,1949, + 1948,1,0,0,0,1949,1950,1,0,0,0,1950,1951,1,0,0,0,1951,1966,3,234,117, + 0,1952,1953,5,6,0,0,1953,1954,3,190,95,0,1954,1955,5,7,0,0,1955,1966, + 1,0,0,0,1956,1958,5,6,0,0,1957,1959,3,190,95,0,1958,1957,1,0,0,0,1958, + 1959,1,0,0,0,1959,1960,1,0,0,0,1960,1962,5,119,0,0,1961,1963,3,190,95, + 0,1962,1961,1,0,0,0,1962,1963,1,0,0,0,1963,1964,1,0,0,0,1964,1966,5,7, + 0,0,1965,1946,1,0,0,0,1965,1952,1,0,0,0,1965,1956,1,0,0,0,1966,227,1, + 0,0,0,1967,1979,3,230,115,0,1968,1969,5,149,0,0,1969,1970,5,121,0,0,1970, + 1971,5,149,0,0,1971,1979,5,97,0,0,1972,1973,5,149,0,0,1973,1974,5,122, + 0,0,1974,1975,5,149,0,0,1975,1979,5,97,0,0,1976,1977,5,149,0,0,1977,1979, + 5,123,0,0,1978,1967,1,0,0,0,1978,1968,1,0,0,0,1978,1972,1,0,0,0,1978, + 1976,1,0,0,0,1979,1981,1,0,0,0,1980,1982,5,149,0,0,1981,1980,1,0,0,0, + 1981,1982,1,0,0,0,1982,1983,1,0,0,0,1983,1984,3,234,117,0,1984,229,1, + 0,0,0,1985,1987,5,149,0,0,1986,1985,1,0,0,0,1986,1987,1,0,0,0,1987,1988, + 1,0,0,0,1988,1989,5,24,0,0,1989,231,1,0,0,0,1990,1991,5,149,0,0,1991, + 1992,5,124,0,0,1992,1993,5,149,0,0,1993,2001,5,125,0,0,1994,1995,5,149, + 0,0,1995,1996,5,124,0,0,1996,1997,5,149,0,0,1997,1998,5,115,0,0,1998, + 1999,5,149,0,0,1999,2001,5,125,0,0,2000,1990,1,0,0,0,2000,1994,1,0,0, + 0,2001,233,1,0,0,0,2002,2009,3,236,118,0,2003,2005,5,149,0,0,2004,2003, + 1,0,0,0,2004,2005,1,0,0,0,2005,2006,1,0,0,0,2006,2008,3,264,132,0,2007, + 2004,1,0,0,0,2008,2011,1,0,0,0,2009,2007,1,0,0,0,2009,2010,1,0,0,0,2010, + 235,1,0,0,0,2011,2009,1,0,0,0,2012,2022,3,238,119,0,2013,2022,3,274,137, + 0,2014,2022,3,266,133,0,2015,2022,3,250,125,0,2016,2022,3,252,126,0,2017, + 2022,3,258,129,0,2018,2022,3,260,130,0,2019,2022,3,262,131,0,2020,2022, + 3,270,135,0,2021,2012,1,0,0,0,2021,2013,1,0,0,0,2021,2014,1,0,0,0,2021, + 2015,1,0,0,0,2021,2016,1,0,0,0,2021,2017,1,0,0,0,2021,2018,1,0,0,0,2021, + 2019,1,0,0,0,2021,2020,1,0,0,0,2022,237,1,0,0,0,2023,2030,3,272,136,0, + 2024,2030,5,135,0,0,2025,2030,3,240,120,0,2026,2030,5,125,0,0,2027,2030, + 3,242,121,0,2028,2030,3,246,123,0,2029,2023,1,0,0,0,2029,2024,1,0,0,0, + 2029,2025,1,0,0,0,2029,2026,1,0,0,0,2029,2027,1,0,0,0,2029,2028,1,0,0, + 0,2030,239,1,0,0,0,2031,2032,7,6,0,0,2032,241,1,0,0,0,2033,2035,5,6,0, + 0,2034,2036,5,149,0,0,2035,2034,1,0,0,0,2035,2036,1,0,0,0,2036,2050,1, + 0,0,0,2037,2039,3,190,95,0,2038,2040,5,149,0,0,2039,2038,1,0,0,0,2039, + 2040,1,0,0,0,2040,2047,1,0,0,0,2041,2043,3,244,122,0,2042,2044,5,149, + 0,0,2043,2042,1,0,0,0,2043,2044,1,0,0,0,2044,2046,1,0,0,0,2045,2041,1, + 0,0,0,2046,2049,1,0,0,0,2047,2045,1,0,0,0,2047,2048,1,0,0,0,2048,2051, + 1,0,0,0,2049,2047,1,0,0,0,2050,2037,1,0,0,0,2050,2051,1,0,0,0,2051,2052, + 1,0,0,0,2052,2053,5,7,0,0,2053,243,1,0,0,0,2054,2056,5,3,0,0,2055,2057, + 5,149,0,0,2056,2055,1,0,0,0,2056,2057,1,0,0,0,2057,2059,1,0,0,0,2058, + 2060,3,190,95,0,2059,2058,1,0,0,0,2059,2060,1,0,0,0,2060,245,1,0,0,0, + 2061,2063,5,8,0,0,2062,2064,5,149,0,0,2063,2062,1,0,0,0,2063,2064,1,0, + 0,0,2064,2065,1,0,0,0,2065,2067,3,248,124,0,2066,2068,5,149,0,0,2067, + 2066,1,0,0,0,2067,2068,1,0,0,0,2068,2079,1,0,0,0,2069,2071,5,3,0,0,2070, + 2072,5,149,0,0,2071,2070,1,0,0,0,2071,2072,1,0,0,0,2072,2073,1,0,0,0, + 2073,2075,3,248,124,0,2074,2076,5,149,0,0,2075,2074,1,0,0,0,2075,2076, + 1,0,0,0,2076,2078,1,0,0,0,2077,2069,1,0,0,0,2078,2081,1,0,0,0,2079,2077, + 1,0,0,0,2079,2080,1,0,0,0,2080,2082,1,0,0,0,2081,2079,1,0,0,0,2082,2083, + 5,9,0,0,2083,247,1,0,0,0,2084,2087,3,286,143,0,2085,2087,5,135,0,0,2086, + 2084,1,0,0,0,2086,2085,1,0,0,0,2087,2089,1,0,0,0,2088,2090,5,149,0,0, + 2089,2088,1,0,0,0,2089,2090,1,0,0,0,2090,2091,1,0,0,0,2091,2093,5,119, + 0,0,2092,2094,5,149,0,0,2093,2092,1,0,0,0,2093,2094,1,0,0,0,2094,2095, + 1,0,0,0,2095,2096,3,190,95,0,2096,249,1,0,0,0,2097,2099,5,2,0,0,2098, + 2100,5,149,0,0,2099,2098,1,0,0,0,2099,2100,1,0,0,0,2100,2101,1,0,0,0, + 2101,2103,3,190,95,0,2102,2104,5,149,0,0,2103,2102,1,0,0,0,2103,2104, + 1,0,0,0,2104,2105,1,0,0,0,2105,2106,5,4,0,0,2106,251,1,0,0,0,2107,2109, + 5,128,0,0,2108,2110,5,149,0,0,2109,2108,1,0,0,0,2109,2110,1,0,0,0,2110, + 2111,1,0,0,0,2111,2113,5,2,0,0,2112,2114,5,149,0,0,2113,2112,1,0,0,0, + 2113,2114,1,0,0,0,2114,2115,1,0,0,0,2115,2117,5,100,0,0,2116,2118,5,149, + 0,0,2117,2116,1,0,0,0,2117,2118,1,0,0,0,2118,2119,1,0,0,0,2119,2156,5, + 4,0,0,2120,2122,3,254,127,0,2121,2123,5,149,0,0,2122,2121,1,0,0,0,2122, + 2123,1,0,0,0,2123,2124,1,0,0,0,2124,2126,5,2,0,0,2125,2127,5,149,0,0, + 2126,2125,1,0,0,0,2126,2127,1,0,0,0,2127,2132,1,0,0,0,2128,2130,5,99, + 0,0,2129,2131,5,149,0,0,2130,2129,1,0,0,0,2130,2131,1,0,0,0,2131,2133, + 1,0,0,0,2132,2128,1,0,0,0,2132,2133,1,0,0,0,2133,2151,1,0,0,0,2134,2136, + 3,256,128,0,2135,2137,5,149,0,0,2136,2135,1,0,0,0,2136,2137,1,0,0,0,2137, + 2148,1,0,0,0,2138,2140,5,3,0,0,2139,2141,5,149,0,0,2140,2139,1,0,0,0, + 2140,2141,1,0,0,0,2141,2142,1,0,0,0,2142,2144,3,256,128,0,2143,2145,5, + 149,0,0,2144,2143,1,0,0,0,2144,2145,1,0,0,0,2145,2147,1,0,0,0,2146,2138, + 1,0,0,0,2147,2150,1,0,0,0,2148,2146,1,0,0,0,2148,2149,1,0,0,0,2149,2152, + 1,0,0,0,2150,2148,1,0,0,0,2151,2134,1,0,0,0,2151,2152,1,0,0,0,2152,2153, + 1,0,0,0,2153,2154,5,4,0,0,2154,2156,1,0,0,0,2155,2107,1,0,0,0,2155,2120, + 1,0,0,0,2156,253,1,0,0,0,2157,2158,3,286,143,0,2158,255,1,0,0,0,2159, + 2161,3,286,143,0,2160,2162,5,149,0,0,2161,2160,1,0,0,0,2161,2162,1,0, + 0,0,2162,2163,1,0,0,0,2163,2164,5,119,0,0,2164,2166,5,5,0,0,2165,2167, + 5,149,0,0,2166,2165,1,0,0,0,2166,2167,1,0,0,0,2167,2169,1,0,0,0,2168, + 2159,1,0,0,0,2168,2169,1,0,0,0,2169,2170,1,0,0,0,2170,2171,3,190,95,0, + 2171,257,1,0,0,0,2172,2177,3,158,79,0,2173,2175,5,149,0,0,2174,2173,1, + 0,0,0,2174,2175,1,0,0,0,2175,2176,1,0,0,0,2176,2178,3,160,80,0,2177,2174, + 1,0,0,0,2178,2179,1,0,0,0,2179,2177,1,0,0,0,2179,2180,1,0,0,0,2180,259, + 1,0,0,0,2181,2183,5,129,0,0,2182,2184,5,149,0,0,2183,2182,1,0,0,0,2183, + 2184,1,0,0,0,2184,2185,1,0,0,0,2185,2187,5,8,0,0,2186,2188,5,149,0,0, + 2187,2186,1,0,0,0,2187,2188,1,0,0,0,2188,2189,1,0,0,0,2189,2191,5,89, + 0,0,2190,2192,5,149,0,0,2191,2190,1,0,0,0,2191,2192,1,0,0,0,2192,2193, + 1,0,0,0,2193,2198,3,150,75,0,2194,2196,5,149,0,0,2195,2194,1,0,0,0,2195, + 2196,1,0,0,0,2196,2197,1,0,0,0,2197,2199,3,148,74,0,2198,2195,1,0,0,0, + 2198,2199,1,0,0,0,2199,2201,1,0,0,0,2200,2202,5,149,0,0,2201,2200,1,0, + 0,0,2201,2202,1,0,0,0,2202,2203,1,0,0,0,2203,2204,5,9,0,0,2204,261,1, + 0,0,0,2205,2207,5,128,0,0,2206,2208,5,149,0,0,2207,2206,1,0,0,0,2207, + 2208,1,0,0,0,2208,2209,1,0,0,0,2209,2211,5,8,0,0,2210,2212,5,149,0,0, + 2211,2210,1,0,0,0,2211,2212,1,0,0,0,2212,2213,1,0,0,0,2213,2215,5,89, + 0,0,2214,2216,5,149,0,0,2215,2214,1,0,0,0,2215,2216,1,0,0,0,2216,2217, + 1,0,0,0,2217,2222,3,150,75,0,2218,2220,5,149,0,0,2219,2218,1,0,0,0,2219, + 2220,1,0,0,0,2220,2221,1,0,0,0,2221,2223,3,148,74,0,2222,2219,1,0,0,0, + 2222,2223,1,0,0,0,2223,2225,1,0,0,0,2224,2226,5,149,0,0,2225,2224,1,0, + 0,0,2225,2226,1,0,0,0,2226,2227,1,0,0,0,2227,2228,5,9,0,0,2228,263,1, + 0,0,0,2229,2231,5,25,0,0,2230,2232,5,149,0,0,2231,2230,1,0,0,0,2231,2232, + 1,0,0,0,2232,2235,1,0,0,0,2233,2236,3,278,139,0,2234,2236,5,100,0,0,2235, + 2233,1,0,0,0,2235,2234,1,0,0,0,2236,265,1,0,0,0,2237,2242,5,130,0,0,2238, + 2240,5,149,0,0,2239,2238,1,0,0,0,2239,2240,1,0,0,0,2240,2241,1,0,0,0, + 2241,2243,3,268,134,0,2242,2239,1,0,0,0,2243,2244,1,0,0,0,2244,2242,1, + 0,0,0,2244,2245,1,0,0,0,2245,2260,1,0,0,0,2246,2248,5,130,0,0,2247,2249, + 5,149,0,0,2248,2247,1,0,0,0,2248,2249,1,0,0,0,2249,2250,1,0,0,0,2250, + 2255,3,190,95,0,2251,2253,5,149,0,0,2252,2251,1,0,0,0,2252,2253,1,0,0, + 0,2253,2254,1,0,0,0,2254,2256,3,268,134,0,2255,2252,1,0,0,0,2256,2257, + 1,0,0,0,2257,2255,1,0,0,0,2257,2258,1,0,0,0,2258,2260,1,0,0,0,2259,2237, + 1,0,0,0,2259,2246,1,0,0,0,2260,2269,1,0,0,0,2261,2263,5,149,0,0,2262, + 2261,1,0,0,0,2262,2263,1,0,0,0,2263,2264,1,0,0,0,2264,2266,5,131,0,0, + 2265,2267,5,149,0,0,2266,2265,1,0,0,0,2266,2267,1,0,0,0,2267,2268,1,0, + 0,0,2268,2270,3,190,95,0,2269,2262,1,0,0,0,2269,2270,1,0,0,0,2270,2272, + 1,0,0,0,2271,2273,5,149,0,0,2272,2271,1,0,0,0,2272,2273,1,0,0,0,2273, + 2274,1,0,0,0,2274,2275,5,132,0,0,2275,267,1,0,0,0,2276,2278,5,133,0,0, + 2277,2279,5,149,0,0,2278,2277,1,0,0,0,2278,2279,1,0,0,0,2279,2280,1,0, + 0,0,2280,2282,3,190,95,0,2281,2283,5,149,0,0,2282,2281,1,0,0,0,2282,2283, + 1,0,0,0,2283,2284,1,0,0,0,2284,2286,5,134,0,0,2285,2287,5,149,0,0,2286, + 2285,1,0,0,0,2286,2287,1,0,0,0,2287,2288,1,0,0,0,2288,2289,3,190,95,0, + 2289,269,1,0,0,0,2290,2291,3,286,143,0,2291,271,1,0,0,0,2292,2295,3,282, + 141,0,2293,2295,3,280,140,0,2294,2292,1,0,0,0,2294,2293,1,0,0,0,2295, + 273,1,0,0,0,2296,2299,5,26,0,0,2297,2300,3,286,143,0,2298,2300,5,137, + 0,0,2299,2297,1,0,0,0,2299,2298,1,0,0,0,2300,275,1,0,0,0,2301,2303,3, + 236,118,0,2302,2304,5,149,0,0,2303,2302,1,0,0,0,2303,2304,1,0,0,0,2304, + 2305,1,0,0,0,2305,2306,3,264,132,0,2306,277,1,0,0,0,2307,2308,3,284,142, + 0,2308,279,1,0,0,0,2309,2310,5,137,0,0,2310,281,1,0,0,0,2311,2312,5,144, + 0,0,2312,283,1,0,0,0,2313,2314,3,286,143,0,2314,285,1,0,0,0,2315,2321, + 5,145,0,0,2316,2317,5,148,0,0,2317,2321,6,143,-1,0,2318,2321,5,138,0, + 0,2319,2321,3,288,144,0,2320,2315,1,0,0,0,2320,2316,1,0,0,0,2320,2318, + 1,0,0,0,2320,2319,1,0,0,0,2321,287,1,0,0,0,2322,2323,7,7,0,0,2323,289, + 1,0,0,0,2324,2325,7,8,0,0,2325,291,1,0,0,0,2326,2327,7,9,0,0,2327,293, + 1,0,0,0,2328,2329,7,10,0,0,2329,295,1,0,0,0,401,298,302,307,311,316,319, + 323,326,342,348,352,355,361,364,368,372,376,381,385,392,396,401,411,415, + 419,424,437,441,449,452,460,463,480,483,487,493,496,506,510,532,536,539, + 542,545,548,552,557,561,571,575,580,585,590,596,600,604,609,616,620,624, + 627,631,635,639,644,648,654,658,668,678,682,686,690,695,707,711,715,719, + 723,725,729,733,735,749,753,757,761,766,769,773,777,779,783,787,789,825, + 836,858,862,867,878,882,886,894,898,902,908,912,916,922,926,930,934,938, + 942,948,955,960,966,986,990,998,1008,1013,1018,1022,1027,1033,1038,1041, + 1045,1049,1053,1059,1063,1068,1073,1077,1080,1084,1088,1092,1096,1100, + 1106,1110,1115,1119,1128,1134,1142,1146,1150,1154,1161,1164,1167,1170, + 1176,1179,1183,1187,1191,1194,1198,1208,1214,1221,1234,1238,1242,1246, + 1251,1256,1260,1266,1270,1274,1278,1283,1289,1292,1298,1301,1307,1311, + 1315,1319,1323,1328,1333,1337,1342,1345,1354,1363,1368,1381,1384,1392, + 1396,1401,1406,1410,1415,1421,1426,1433,1437,1441,1443,1447,1449,1453, + 1455,1461,1467,1471,1474,1477,1483,1486,1489,1493,1499,1502,1505,1509, + 1513,1517,1519,1523,1525,1529,1531,1535,1537,1543,1547,1551,1555,1559, + 1563,1567,1571,1575,1578,1584,1588,1592,1595,1600,1605,1610,1615,1621, + 1627,1630,1633,1636,1640,1643,1646,1649,1652,1656,1660,1664,1668,1672, + 1675,1678,1682,1686,1690,1694,1696,1702,1705,1708,1714,1717,1720,1741, + 1751,1761,1766,1770,1777,1781,1785,1789,1793,1801,1805,1809,1813,1819, + 1823,1829,1833,1838,1843,1847,1852,1857,1861,1867,1874,1878,1884,1891, + 1895,1901,1908,1912,1917,1922,1926,1931,1934,1941,1944,1949,1958,1962, + 1965,1978,1981,1986,2000,2004,2009,2021,2029,2035,2039,2043,2047,2050, + 2056,2059,2063,2067,2071,2075,2079,2086,2089,2093,2099,2103,2109,2113, + 2117,2122,2126,2130,2132,2136,2140,2144,2148,2151,2155,2161,2166,2168, + 2174,2179,2183,2187,2191,2195,2198,2201,2207,2211,2215,2219,2222,2225, + 2231,2235,2239,2244,2248,2252,2257,2259,2262,2266,2269,2272,2278,2282, + 2286,2294,2299,2303,2320 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); @@ -1124,29 +1141,29 @@ CypherParser::Ku_StatementsContext* CypherParser::ku_Statements() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(292); + setState(296); oC_Cypher(); - setState(303); + setState(307); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 2, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(294); + setState(298); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(293); + setState(297); match(CypherParser::SP); } - setState(296); + setState(300); match(CypherParser::T__0); - setState(298); + setState(302); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 1, _ctx)) { case 1: { - setState(297); + setState(301); match(CypherParser::SP); break; } @@ -1154,22 +1171,22 @@ CypherParser::Ku_StatementsContext* CypherParser::ku_Statements() { default: break; } - setState(300); + setState(304); oC_Cypher(); } - setState(305); + setState(309); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 2, _ctx); } - setState(307); + setState(311); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(306); + setState(310); match(CypherParser::SP); } - setState(309); + setState(313); match(CypherParser::EOF); } @@ -1224,41 +1241,41 @@ CypherParser::OC_CypherContext* CypherParser::oC_Cypher() { }); try { enterOuterAlt(_localctx, 1); - setState(312); + setState(316); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::EXPLAIN || _la == CypherParser::PROFILE) { - setState(311); + setState(315); oC_AnyCypherOption(); } - setState(315); + setState(319); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(314); + setState(318); match(CypherParser::SP); } - setState(317); + setState(321); oC_Statement(); - setState(322); + setState(326); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 7, _ctx)) { case 1: { - setState(319); + setState(323); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(318); + setState(322); match(CypherParser::SP); } - setState(321); + setState(325); match(CypherParser::T__0); break; } @@ -1331,6 +1348,14 @@ CypherParser::KU_ImportDatabaseContext* CypherParser::OC_StatementContext::kU_Im return getRuleContext(0); } +CypherParser::KU_AttachDatabaseContext* CypherParser::OC_StatementContext::kU_AttachDatabase() { + return getRuleContext(0); +} + +CypherParser::KU_DetachDatabaseContext* CypherParser::OC_StatementContext::kU_DetachDatabase() { + return getRuleContext(0); +} + size_t CypherParser::OC_StatementContext::getRuleIndex() const { return CypherParser::RuleOC_Statement; @@ -1349,93 +1374,107 @@ CypherParser::OC_StatementContext* CypherParser::oC_Statement() { exitRule(); }); try { - setState(336); + setState(342); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 8, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(324); + setState(328); oC_Query(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(325); + setState(329); kU_DDL(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(326); + setState(330); kU_CopyFrom(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(327); + setState(331); kU_CopyFromByColumn(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(328); + setState(332); kU_CopyTO(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(329); + setState(333); kU_StandaloneCall(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(330); + setState(334); kU_CreateMacro(); break; } case 8: { enterOuterAlt(_localctx, 8); - setState(331); + setState(335); kU_CommentOn(); break; } case 9: { enterOuterAlt(_localctx, 9); - setState(332); + setState(336); kU_Transaction(); break; } case 10: { enterOuterAlt(_localctx, 10); - setState(333); + setState(337); kU_Extension(); break; } case 11: { enterOuterAlt(_localctx, 11); - setState(334); + setState(338); kU_ExportDatabase(); break; } case 12: { enterOuterAlt(_localctx, 12); - setState(335); + setState(339); kU_ImportDatabase(); break; } + case 13: { + enterOuterAlt(_localctx, 13); + setState(340); + kU_AttachDatabase(); + break; + } + + case 14: { + enterOuterAlt(_localctx, 14); + setState(341); + kU_DetachDatabase(); + break; + } + default: break; } @@ -1508,39 +1547,39 @@ CypherParser::KU_CopyFromContext* CypherParser::kU_CopyFrom() { }); try { enterOuterAlt(_localctx, 1); - setState(338); + setState(344); match(CypherParser::COPY); - setState(339); + setState(345); match(CypherParser::SP); - setState(340); + setState(346); oC_SchemaName(); - setState(349); + setState(355); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 11, _ctx)) { case 1: { - setState(342); + setState(348); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(341); + setState(347); match(CypherParser::SP); } - setState(344); + setState(350); kU_ColumnNames(); - setState(346); + setState(352); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(345); + setState(351); match(CypherParser::SP); } break; } case 2: { - setState(348); + setState(354); match(CypherParser::SP); break; } @@ -1548,26 +1587,26 @@ CypherParser::KU_CopyFromContext* CypherParser::kU_CopyFrom() { default: break; } - setState(351); + setState(357); match(CypherParser::FROM); - setState(352); + setState(358); match(CypherParser::SP); - setState(353); + setState(359); kU_ScanSource(); - setState(358); + setState(364); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 13, _ctx)) { case 1: { - setState(355); + setState(361); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(354); + setState(360); match(CypherParser::SP); } - setState(357); + setState(363); kU_ParsingOptions(); break; } @@ -1629,57 +1668,57 @@ CypherParser::KU_ColumnNamesContext* CypherParser::kU_ColumnNames() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(360); + setState(366); match(CypherParser::T__1); - setState(362); + setState(368); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(361); + setState(367); match(CypherParser::SP); } - setState(364); + setState(370); oC_SchemaName(); - setState(375); + setState(381); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 17, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(366); + setState(372); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(365); + setState(371); match(CypherParser::SP); } - setState(368); + setState(374); match(CypherParser::T__2); - setState(370); + setState(376); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(369); + setState(375); match(CypherParser::SP); } - setState(372); + setState(378); oC_SchemaName(); } - setState(377); + setState(383); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 17, _ctx); } - setState(379); + setState(385); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(378); + setState(384); match(CypherParser::SP); } - setState(381); + setState(387); match(CypherParser::T__3); } @@ -1737,41 +1776,41 @@ CypherParser::KU_ScanSourceContext* CypherParser::kU_ScanSource() { exitRule(); }); try { - setState(395); + setState(401); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::T__5: case CypherParser::GLOB: case CypherParser::StringLiteral: { enterOuterAlt(_localctx, 1); - setState(383); + setState(389); kU_FilePaths(); break; } case CypherParser::T__1: { enterOuterAlt(_localctx, 2); - setState(384); + setState(390); match(CypherParser::T__1); - setState(386); + setState(392); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(385); + setState(391); match(CypherParser::SP); } - setState(388); + setState(394); oC_Query(); - setState(390); + setState(396); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(389); + setState(395); match(CypherParser::SP); } - setState(392); + setState(398); match(CypherParser::T__3); break; } @@ -1790,7 +1829,7 @@ CypherParser::KU_ScanSourceContext* CypherParser::kU_ScanSource() { case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 3); - setState(394); + setState(400); oC_Variable(); break; } @@ -1871,67 +1910,67 @@ CypherParser::KU_CopyFromByColumnContext* CypherParser::kU_CopyFromByColumn() { }); try { enterOuterAlt(_localctx, 1); - setState(397); + setState(403); match(CypherParser::COPY); - setState(398); + setState(404); match(CypherParser::SP); - setState(399); + setState(405); oC_SchemaName(); - setState(400); + setState(406); match(CypherParser::SP); - setState(401); + setState(407); match(CypherParser::FROM); - setState(402); + setState(408); match(CypherParser::SP); - setState(403); + setState(409); match(CypherParser::T__1); - setState(405); + setState(411); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(404); + setState(410); match(CypherParser::SP); } - setState(407); + setState(413); match(CypherParser::StringLiteral); - setState(418); + setState(424); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2 || _la == CypherParser::SP) { - setState(409); + setState(415); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(408); + setState(414); match(CypherParser::SP); } - setState(411); + setState(417); match(CypherParser::T__2); - setState(413); + setState(419); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(412); + setState(418); match(CypherParser::SP); } - setState(415); + setState(421); match(CypherParser::StringLiteral); - setState(420); + setState(426); _errHandler->sync(this); _la = _input->LA(1); } - setState(421); + setState(427); match(CypherParser::T__3); - setState(422); + setState(428); match(CypherParser::SP); - setState(423); + setState(429); match(CypherParser::BY); - setState(424); + setState(430); match(CypherParser::SP); - setState(425); + setState(431); match(CypherParser::COLUMN); } @@ -1998,54 +2037,54 @@ CypherParser::KU_CopyTOContext* CypherParser::kU_CopyTO() { }); try { enterOuterAlt(_localctx, 1); - setState(427); + setState(433); match(CypherParser::COPY); - setState(428); + setState(434); match(CypherParser::SP); - setState(429); + setState(435); match(CypherParser::T__1); - setState(431); + setState(437); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(430); + setState(436); match(CypherParser::SP); } - setState(433); + setState(439); oC_Query(); - setState(435); + setState(441); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(434); + setState(440); match(CypherParser::SP); } - setState(437); + setState(443); match(CypherParser::T__3); - setState(438); + setState(444); match(CypherParser::SP); - setState(439); + setState(445); match(CypherParser::TO); - setState(440); + setState(446); match(CypherParser::SP); - setState(441); + setState(447); match(CypherParser::StringLiteral); - setState(446); + setState(452); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 29, _ctx)) { case 1: { - setState(443); + setState(449); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(442); + setState(448); match(CypherParser::SP); } - setState(445); + setState(451); kU_ParsingOptions(); break; } @@ -2114,30 +2153,30 @@ CypherParser::KU_ExportDatabaseContext* CypherParser::kU_ExportDatabase() { }); try { enterOuterAlt(_localctx, 1); - setState(448); + setState(454); match(CypherParser::EXPORT); - setState(449); + setState(455); match(CypherParser::SP); - setState(450); + setState(456); match(CypherParser::DATABASE); - setState(451); + setState(457); match(CypherParser::SP); - setState(452); + setState(458); match(CypherParser::StringLiteral); - setState(457); + setState(463); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { case 1: { - setState(454); + setState(460); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(453); + setState(459); match(CypherParser::SP); } - setState(456); + setState(462); kU_ParsingOptions(); break; } @@ -2201,16 +2240,211 @@ CypherParser::KU_ImportDatabaseContext* CypherParser::kU_ImportDatabase() { }); try { enterOuterAlt(_localctx, 1); - setState(459); + setState(465); match(CypherParser::IMPORT); - setState(460); + setState(466); match(CypherParser::SP); - setState(461); + setState(467); match(CypherParser::DATABASE); - setState(462); + setState(468); match(CypherParser::SP); - setState(463); + setState(469); + match(CypherParser::StringLiteral); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- KU_AttachDatabaseContext ------------------------------------------------------------------ + +CypherParser::KU_AttachDatabaseContext::KU_AttachDatabaseContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* CypherParser::KU_AttachDatabaseContext::ATTACH() { + return getToken(CypherParser::ATTACH, 0); +} + +std::vector CypherParser::KU_AttachDatabaseContext::SP() { + return getTokens(CypherParser::SP); +} + +tree::TerminalNode* CypherParser::KU_AttachDatabaseContext::SP(size_t i) { + return getToken(CypherParser::SP, i); +} + +std::vector CypherParser::KU_AttachDatabaseContext::StringLiteral() { + return getTokens(CypherParser::StringLiteral); +} + +tree::TerminalNode* CypherParser::KU_AttachDatabaseContext::StringLiteral(size_t i) { + return getToken(CypherParser::StringLiteral, i); +} + +tree::TerminalNode* CypherParser::KU_AttachDatabaseContext::AS() { + return getToken(CypherParser::AS, 0); +} + +CypherParser::OC_SchemaNameContext* CypherParser::KU_AttachDatabaseContext::oC_SchemaName() { + return getRuleContext(0); +} + +tree::TerminalNode* CypherParser::KU_AttachDatabaseContext::DBTYPE() { + return getToken(CypherParser::DBTYPE, 0); +} + + +size_t CypherParser::KU_AttachDatabaseContext::getRuleIndex() const { + return CypherParser::RuleKU_AttachDatabase; +} + + +CypherParser::KU_AttachDatabaseContext* CypherParser::kU_AttachDatabase() { + KU_AttachDatabaseContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 20, CypherParser::RuleKU_AttachDatabase); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(471); + match(CypherParser::ATTACH); + setState(472); + match(CypherParser::SP); + setState(473); match(CypherParser::StringLiteral); + setState(480); + _errHandler->sync(this); + + switch (getInterpreter()->adaptivePredict(_input, 32, _ctx)) { + case 1: { + setState(474); + match(CypherParser::SP); + setState(475); + match(CypherParser::AS); + setState(476); + match(CypherParser::SP); + setState(477); + oC_SchemaName(); + setState(478); + match(CypherParser::SP); + break; + } + + default: + break; + } + setState(496); + _errHandler->sync(this); + + switch (getInterpreter()->adaptivePredict(_input, 36, _ctx)) { + case 1: { + setState(483); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(482); + match(CypherParser::SP); + } + setState(485); + match(CypherParser::T__1); + setState(487); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(486); + match(CypherParser::SP); + } + setState(489); + match(CypherParser::DBTYPE); + setState(490); + match(CypherParser::SP); + setState(491); + match(CypherParser::StringLiteral); + setState(493); + _errHandler->sync(this); + + _la = _input->LA(1); + if (_la == CypherParser::SP) { + setState(492); + match(CypherParser::SP); + } + setState(495); + match(CypherParser::T__3); + break; + } + + default: + break; + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- KU_DetachDatabaseContext ------------------------------------------------------------------ + +CypherParser::KU_DetachDatabaseContext::KU_DetachDatabaseContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +tree::TerminalNode* CypherParser::KU_DetachDatabaseContext::DETACH() { + return getToken(CypherParser::DETACH, 0); +} + +tree::TerminalNode* CypherParser::KU_DetachDatabaseContext::SP() { + return getToken(CypherParser::SP, 0); +} + +CypherParser::OC_SchemaNameContext* CypherParser::KU_DetachDatabaseContext::oC_SchemaName() { + return getRuleContext(0); +} + + +size_t CypherParser::KU_DetachDatabaseContext::getRuleIndex() const { + return CypherParser::RuleKU_DetachDatabase; +} + + +CypherParser::KU_DetachDatabaseContext* CypherParser::kU_DetachDatabase() { + KU_DetachDatabaseContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 22, CypherParser::RuleKU_DetachDatabase); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(498); + match(CypherParser::DETACH); + setState(499); + match(CypherParser::SP); + setState(500); + oC_SchemaName(); } catch (RecognitionException &e) { @@ -2256,7 +2490,7 @@ size_t CypherParser::KU_StandaloneCallContext::getRuleIndex() const { CypherParser::KU_StandaloneCallContext* CypherParser::kU_StandaloneCall() { KU_StandaloneCallContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 20, CypherParser::RuleKU_StandaloneCall); + enterRule(_localctx, 24, CypherParser::RuleKU_StandaloneCall); size_t _la = 0; #if __cplusplus > 201703L @@ -2268,31 +2502,31 @@ CypherParser::KU_StandaloneCallContext* CypherParser::kU_StandaloneCall() { }); try { enterOuterAlt(_localctx, 1); - setState(465); + setState(502); match(CypherParser::CALL); - setState(466); + setState(503); match(CypherParser::SP); - setState(467); + setState(504); oC_SymbolicName(); - setState(469); + setState(506); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(468); + setState(505); match(CypherParser::SP); } - setState(471); + setState(508); match(CypherParser::T__4); - setState(473); + setState(510); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(472); + setState(509); match(CypherParser::SP); } - setState(475); + setState(512); oC_Literal(); } @@ -2351,7 +2585,7 @@ size_t CypherParser::KU_CommentOnContext::getRuleIndex() const { CypherParser::KU_CommentOnContext* CypherParser::kU_CommentOn() { KU_CommentOnContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 22, CypherParser::RuleKU_CommentOn); + enterRule(_localctx, 26, CypherParser::RuleKU_CommentOn); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2362,27 +2596,27 @@ CypherParser::KU_CommentOnContext* CypherParser::kU_CommentOn() { }); try { enterOuterAlt(_localctx, 1); - setState(477); + setState(514); match(CypherParser::COMMENT_); - setState(478); + setState(515); match(CypherParser::SP); - setState(479); + setState(516); match(CypherParser::ON); - setState(480); + setState(517); match(CypherParser::SP); - setState(481); + setState(518); match(CypherParser::TABLE); - setState(482); + setState(519); match(CypherParser::SP); - setState(483); + setState(520); oC_SchemaName(); - setState(484); + setState(521); match(CypherParser::SP); - setState(485); + setState(522); match(CypherParser::IS); - setState(486); + setState(523); match(CypherParser::SP); - setState(487); + setState(524); match(CypherParser::StringLiteral); } @@ -2449,7 +2683,7 @@ size_t CypherParser::KU_CreateMacroContext::getRuleIndex() const { CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { KU_CreateMacroContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 24, CypherParser::RuleKU_CreateMacro); + enterRule(_localctx, 28, CypherParser::RuleKU_CreateMacro); size_t _la = 0; #if __cplusplus > 201703L @@ -2462,32 +2696,32 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(489); + setState(526); match(CypherParser::CREATE); - setState(490); + setState(527); match(CypherParser::SP); - setState(491); + setState(528); match(CypherParser::MACRO); - setState(492); + setState(529); match(CypherParser::SP); - setState(493); + setState(530); oC_FunctionName(); - setState(495); + setState(532); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(494); + setState(531); match(CypherParser::SP); } - setState(497); + setState(534); match(CypherParser::T__1); - setState(499); + setState(536); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 35, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 40, _ctx)) { case 1: { - setState(498); + setState(535); match(CypherParser::SP); break; } @@ -2495,12 +2729,12 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { default: break; } - setState(502); + setState(539); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 36, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 41, _ctx)) { case 1: { - setState(501); + setState(538); kU_PositionalArgs(); break; } @@ -2508,12 +2742,12 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { default: break; } - setState(505); + setState(542); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 37, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 42, _ctx)) { case 1: { - setState(504); + setState(541); match(CypherParser::SP); break; } @@ -2521,63 +2755,63 @@ CypherParser::KU_CreateMacroContext* CypherParser::kU_CreateMacro() { default: break; } - setState(508); + setState(545); _errHandler->sync(this); _la = _input->LA(1); - if (((((_la - 47) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(507); + if (((((_la - 49) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 49)) & 17826753) != 0) || ((((_la - 120) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 120)) & 302256385) != 0)) { + setState(544); kU_DefaultArg(); } - setState(520); + setState(557); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 41, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 46, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(511); + setState(548); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(510); + setState(547); match(CypherParser::SP); } - setState(513); + setState(550); match(CypherParser::T__2); - setState(515); + setState(552); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(514); + setState(551); match(CypherParser::SP); } - setState(517); + setState(554); kU_DefaultArg(); } - setState(522); + setState(559); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 41, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 46, _ctx); } - setState(524); + setState(561); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(523); + setState(560); match(CypherParser::SP); } - setState(526); + setState(563); match(CypherParser::T__3); - setState(527); + setState(564); match(CypherParser::SP); - setState(528); + setState(565); match(CypherParser::AS); - setState(529); + setState(566); match(CypherParser::SP); - setState(530); + setState(567); oC_Expression(); } @@ -2620,7 +2854,7 @@ size_t CypherParser::KU_PositionalArgsContext::getRuleIndex() const { CypherParser::KU_PositionalArgsContext* CypherParser::kU_PositionalArgs() { KU_PositionalArgsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 26, CypherParser::RuleKU_PositionalArgs); + enterRule(_localctx, 30, CypherParser::RuleKU_PositionalArgs); size_t _la = 0; #if __cplusplus > 201703L @@ -2633,37 +2867,37 @@ CypherParser::KU_PositionalArgsContext* CypherParser::kU_PositionalArgs() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(532); + setState(569); oC_SymbolicName(); - setState(543); + setState(580); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 45, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 50, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(534); + setState(571); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(533); + setState(570); match(CypherParser::SP); } - setState(536); + setState(573); match(CypherParser::T__2); - setState(538); + setState(575); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(537); + setState(574); match(CypherParser::SP); } - setState(540); + setState(577); oC_SymbolicName(); } - setState(545); + setState(582); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 45, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 50, _ctx); } } @@ -2710,7 +2944,7 @@ size_t CypherParser::KU_DefaultArgContext::getRuleIndex() const { CypherParser::KU_DefaultArgContext* CypherParser::kU_DefaultArg() { KU_DefaultArgContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 28, CypherParser::RuleKU_DefaultArg); + enterRule(_localctx, 32, CypherParser::RuleKU_DefaultArg); size_t _la = 0; #if __cplusplus > 201703L @@ -2722,29 +2956,29 @@ CypherParser::KU_DefaultArgContext* CypherParser::kU_DefaultArg() { }); try { enterOuterAlt(_localctx, 1); - setState(546); + setState(583); oC_SymbolicName(); - setState(548); + setState(585); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(547); + setState(584); match(CypherParser::SP); } - setState(550); + setState(587); match(CypherParser::COLON); - setState(551); + setState(588); match(CypherParser::T__4); - setState(553); + setState(590); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(552); + setState(589); match(CypherParser::SP); } - setState(555); + setState(592); oC_Literal(); } @@ -2791,7 +3025,7 @@ size_t CypherParser::KU_FilePathsContext::getRuleIndex() const { CypherParser::KU_FilePathsContext* CypherParser::kU_FilePaths() { KU_FilePathsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 30, CypherParser::RuleKU_FilePaths); + enterRule(_localctx, 34, CypherParser::RuleKU_FilePaths); size_t _la = 0; #if __cplusplus > 201703L @@ -2802,96 +3036,96 @@ CypherParser::KU_FilePathsContext* CypherParser::kU_FilePaths() { exitRule(); }); try { - setState(590); + setState(627); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::T__5: { enterOuterAlt(_localctx, 1); - setState(557); + setState(594); match(CypherParser::T__5); - setState(559); + setState(596); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(558); + setState(595); match(CypherParser::SP); } - setState(561); + setState(598); match(CypherParser::StringLiteral); - setState(572); + setState(609); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2 || _la == CypherParser::SP) { - setState(563); + setState(600); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(562); + setState(599); match(CypherParser::SP); } - setState(565); + setState(602); match(CypherParser::T__2); - setState(567); + setState(604); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(566); + setState(603); match(CypherParser::SP); } - setState(569); + setState(606); match(CypherParser::StringLiteral); - setState(574); + setState(611); _errHandler->sync(this); _la = _input->LA(1); } - setState(575); + setState(612); match(CypherParser::T__6); break; } case CypherParser::StringLiteral: { enterOuterAlt(_localctx, 2); - setState(576); + setState(613); match(CypherParser::StringLiteral); break; } case CypherParser::GLOB: { enterOuterAlt(_localctx, 3); - setState(577); + setState(614); match(CypherParser::GLOB); - setState(579); + setState(616); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(578); + setState(615); match(CypherParser::SP); } - setState(581); + setState(618); match(CypherParser::T__1); - setState(583); + setState(620); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(582); + setState(619); match(CypherParser::SP); } - setState(585); + setState(622); match(CypherParser::StringLiteral); - setState(587); + setState(624); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(586); + setState(623); match(CypherParser::SP); } - setState(589); + setState(626); match(CypherParser::T__3); break; } @@ -2940,7 +3174,7 @@ size_t CypherParser::KU_ParsingOptionsContext::getRuleIndex() const { CypherParser::KU_ParsingOptionsContext* CypherParser::kU_ParsingOptions() { KU_ParsingOptionsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 32, CypherParser::RuleKU_ParsingOptions); + enterRule(_localctx, 36, CypherParser::RuleKU_ParsingOptions); size_t _la = 0; #if __cplusplus > 201703L @@ -2953,57 +3187,57 @@ CypherParser::KU_ParsingOptionsContext* CypherParser::kU_ParsingOptions() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(592); + setState(629); match(CypherParser::T__1); - setState(594); + setState(631); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(593); + setState(630); match(CypherParser::SP); } - setState(596); + setState(633); kU_ParsingOption(); - setState(607); + setState(644); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 64, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(598); + setState(635); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(597); + setState(634); match(CypherParser::SP); } - setState(600); + setState(637); match(CypherParser::T__2); - setState(602); + setState(639); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(601); + setState(638); match(CypherParser::SP); } - setState(604); + setState(641); kU_ParsingOption(); } - setState(609); + setState(646); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 64, _ctx); } - setState(611); + setState(648); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(610); + setState(647); match(CypherParser::SP); } - setState(613); + setState(650); match(CypherParser::T__3); } @@ -3046,7 +3280,7 @@ size_t CypherParser::KU_ParsingOptionContext::getRuleIndex() const { CypherParser::KU_ParsingOptionContext* CypherParser::kU_ParsingOption() { KU_ParsingOptionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 34, CypherParser::RuleKU_ParsingOption); + enterRule(_localctx, 38, CypherParser::RuleKU_ParsingOption); size_t _la = 0; #if __cplusplus > 201703L @@ -3058,27 +3292,27 @@ CypherParser::KU_ParsingOptionContext* CypherParser::kU_ParsingOption() { }); try { enterOuterAlt(_localctx, 1); - setState(615); + setState(652); oC_SymbolicName(); - setState(617); + setState(654); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(616); + setState(653); match(CypherParser::SP); } - setState(619); + setState(656); match(CypherParser::T__4); - setState(621); + setState(658); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(620); + setState(657); match(CypherParser::SP); } - setState(623); + setState(660); oC_Literal(); } @@ -3129,7 +3363,7 @@ size_t CypherParser::KU_DDLContext::getRuleIndex() const { CypherParser::KU_DDLContext* CypherParser::kU_DDL() { KU_DDLContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 36, CypherParser::RuleKU_DDL); + enterRule(_localctx, 40, CypherParser::RuleKU_DDL); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3139,47 +3373,47 @@ CypherParser::KU_DDLContext* CypherParser::kU_DDL() { exitRule(); }); try { - setState(631); + setState(668); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 63, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 68, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(625); + setState(662); kU_CreateNodeTable(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(626); + setState(663); kU_CreateRelTable(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(627); + setState(664); kU_CreateRelTableGroup(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(628); + setState(665); kU_CreateRdfGraph(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(629); + setState(666); kU_DropTable(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(630); + setState(667); kU_AlterTable(); break; } @@ -3244,7 +3478,7 @@ size_t CypherParser::KU_CreateNodeTableContext::getRuleIndex() const { CypherParser::KU_CreateNodeTableContext* CypherParser::kU_CreateNodeTable() { KU_CreateNodeTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 38, CypherParser::RuleKU_CreateNodeTable); + enterRule(_localctx, 42, CypherParser::RuleKU_CreateNodeTable); size_t _la = 0; #if __cplusplus > 201703L @@ -3256,70 +3490,70 @@ CypherParser::KU_CreateNodeTableContext* CypherParser::kU_CreateNodeTable() { }); try { enterOuterAlt(_localctx, 1); - setState(633); + setState(670); match(CypherParser::CREATE); - setState(634); + setState(671); match(CypherParser::SP); - setState(635); + setState(672); match(CypherParser::NODE); - setState(636); + setState(673); match(CypherParser::SP); - setState(637); + setState(674); match(CypherParser::TABLE); - setState(638); + setState(675); match(CypherParser::SP); - setState(639); + setState(676); oC_SchemaName(); - setState(641); + setState(678); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(640); + setState(677); match(CypherParser::SP); } - setState(643); + setState(680); match(CypherParser::T__1); - setState(645); + setState(682); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(644); + setState(681); match(CypherParser::SP); } - setState(647); + setState(684); kU_PropertyDefinitions(); - setState(649); + setState(686); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(648); + setState(685); match(CypherParser::SP); } - setState(651); + setState(688); match(CypherParser::T__2); - setState(653); + setState(690); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(652); + setState(689); match(CypherParser::SP); } - setState(655); + setState(692); kU_CreateNodeConstraint(); - setState(658); + setState(695); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(657); + setState(694); match(CypherParser::SP); } - setState(660); + setState(697); match(CypherParser::T__3); } @@ -3382,7 +3616,7 @@ size_t CypherParser::KU_CreateRelTableContext::getRuleIndex() const { CypherParser::KU_CreateRelTableContext* CypherParser::kU_CreateRelTable() { KU_CreateRelTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 40, CypherParser::RuleKU_CreateRelTable); + enterRule(_localctx, 44, CypherParser::RuleKU_CreateRelTable); size_t _la = 0; #if __cplusplus > 201703L @@ -3394,71 +3628,71 @@ CypherParser::KU_CreateRelTableContext* CypherParser::kU_CreateRelTable() { }); try { enterOuterAlt(_localctx, 1); - setState(662); + setState(699); match(CypherParser::CREATE); - setState(663); + setState(700); match(CypherParser::SP); - setState(664); + setState(701); match(CypherParser::REL); - setState(665); + setState(702); match(CypherParser::SP); - setState(666); + setState(703); match(CypherParser::TABLE); - setState(667); + setState(704); match(CypherParser::SP); - setState(668); + setState(705); oC_SchemaName(); - setState(670); + setState(707); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(669); + setState(706); match(CypherParser::SP); } - setState(672); + setState(709); match(CypherParser::T__1); - setState(674); + setState(711); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(673); + setState(710); match(CypherParser::SP); } - setState(676); + setState(713); kU_RelTableConnection(); - setState(678); + setState(715); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(677); + setState(714); match(CypherParser::SP); } - setState(688); + setState(725); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 74, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 79, _ctx)) { case 1: { - setState(680); + setState(717); match(CypherParser::T__2); - setState(682); + setState(719); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(681); + setState(718); match(CypherParser::SP); } - setState(684); + setState(721); kU_PropertyDefinitions(); - setState(686); + setState(723); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(685); + setState(722); match(CypherParser::SP); } break; @@ -3467,33 +3701,33 @@ CypherParser::KU_CreateRelTableContext* CypherParser::kU_CreateRelTable() { default: break; } - setState(698); + setState(735); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__2) { - setState(690); + setState(727); match(CypherParser::T__2); - setState(692); + setState(729); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(691); + setState(728); match(CypherParser::SP); } - setState(694); + setState(731); oC_SymbolicName(); - setState(696); + setState(733); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(695); + setState(732); match(CypherParser::SP); } } - setState(700); + setState(737); match(CypherParser::T__3); } @@ -3564,7 +3798,7 @@ size_t CypherParser::KU_CreateRelTableGroupContext::getRuleIndex() const { CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGroup() { KU_CreateRelTableGroupContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 42, CypherParser::RuleKU_CreateRelTableGroup); + enterRule(_localctx, 46, CypherParser::RuleKU_CreateRelTableGroup); size_t _la = 0; #if __cplusplus > 201703L @@ -3577,69 +3811,69 @@ CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGrou try { size_t alt; enterOuterAlt(_localctx, 1); - setState(702); + setState(739); match(CypherParser::CREATE); - setState(703); + setState(740); match(CypherParser::SP); - setState(704); + setState(741); match(CypherParser::REL); - setState(705); + setState(742); match(CypherParser::SP); - setState(706); + setState(743); match(CypherParser::TABLE); - setState(707); + setState(744); match(CypherParser::SP); - setState(708); + setState(745); match(CypherParser::GROUP); - setState(709); + setState(746); match(CypherParser::SP); - setState(710); + setState(747); oC_SchemaName(); - setState(712); + setState(749); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(711); + setState(748); match(CypherParser::SP); } - setState(714); + setState(751); match(CypherParser::T__1); - setState(716); + setState(753); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(715); + setState(752); match(CypherParser::SP); } - setState(718); + setState(755); kU_RelTableConnection(); - setState(720); + setState(757); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(719); + setState(756); match(CypherParser::SP); } - setState(727); + setState(764); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(722); + setState(759); match(CypherParser::T__2); - setState(724); + setState(761); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(723); + setState(760); match(CypherParser::SP); } - setState(726); + setState(763); kU_RelTableConnection(); break; } @@ -3647,41 +3881,41 @@ CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGrou default: throw NoViableAltException(this); } - setState(729); + setState(766); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 82, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 87, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); - setState(732); + setState(769); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(731); + setState(768); match(CypherParser::SP); } - setState(742); + setState(779); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 86, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 91, _ctx)) { case 1: { - setState(734); + setState(771); match(CypherParser::T__2); - setState(736); + setState(773); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(735); + setState(772); match(CypherParser::SP); } - setState(738); + setState(775); kU_PropertyDefinitions(); - setState(740); + setState(777); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(739); + setState(776); match(CypherParser::SP); } break; @@ -3690,33 +3924,33 @@ CypherParser::KU_CreateRelTableGroupContext* CypherParser::kU_CreateRelTableGrou default: break; } - setState(752); + setState(789); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__2) { - setState(744); + setState(781); match(CypherParser::T__2); - setState(746); + setState(783); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(745); + setState(782); match(CypherParser::SP); } - setState(748); + setState(785); oC_SymbolicName(); - setState(750); + setState(787); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(749); + setState(786); match(CypherParser::SP); } } - setState(754); + setState(791); match(CypherParser::T__3); } @@ -3767,7 +4001,7 @@ size_t CypherParser::KU_RelTableConnectionContext::getRuleIndex() const { CypherParser::KU_RelTableConnectionContext* CypherParser::kU_RelTableConnection() { KU_RelTableConnectionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 44, CypherParser::RuleKU_RelTableConnection); + enterRule(_localctx, 48, CypherParser::RuleKU_RelTableConnection); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3778,19 +4012,19 @@ CypherParser::KU_RelTableConnectionContext* CypherParser::kU_RelTableConnection( }); try { enterOuterAlt(_localctx, 1); - setState(756); + setState(793); match(CypherParser::FROM); - setState(757); + setState(794); match(CypherParser::SP); - setState(758); + setState(795); oC_SchemaName(); - setState(759); + setState(796); match(CypherParser::SP); - setState(760); + setState(797); match(CypherParser::TO); - setState(761); + setState(798); match(CypherParser::SP); - setState(762); + setState(799); oC_SchemaName(); } @@ -3837,7 +4071,7 @@ size_t CypherParser::KU_CreateRdfGraphContext::getRuleIndex() const { CypherParser::KU_CreateRdfGraphContext* CypherParser::kU_CreateRdfGraph() { KU_CreateRdfGraphContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 46, CypherParser::RuleKU_CreateRdfGraph); + enterRule(_localctx, 50, CypherParser::RuleKU_CreateRdfGraph); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3848,15 +4082,15 @@ CypherParser::KU_CreateRdfGraphContext* CypherParser::kU_CreateRdfGraph() { }); try { enterOuterAlt(_localctx, 1); - setState(764); + setState(801); match(CypherParser::CREATE); - setState(765); + setState(802); match(CypherParser::SP); - setState(766); + setState(803); match(CypherParser::RDFGRAPH); - setState(767); + setState(804); match(CypherParser::SP); - setState(768); + setState(805); oC_SchemaName(); } @@ -3907,7 +4141,7 @@ size_t CypherParser::KU_DropTableContext::getRuleIndex() const { CypherParser::KU_DropTableContext* CypherParser::kU_DropTable() { KU_DropTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 48, CypherParser::RuleKU_DropTable); + enterRule(_localctx, 52, CypherParser::RuleKU_DropTable); size_t _la = 0; #if __cplusplus > 201703L @@ -3919,11 +4153,11 @@ CypherParser::KU_DropTableContext* CypherParser::kU_DropTable() { }); try { enterOuterAlt(_localctx, 1); - setState(770); + setState(807); match(CypherParser::DROP); - setState(771); + setState(808); match(CypherParser::SP); - setState(772); + setState(809); _la = _input->LA(1); if (!(_la == CypherParser::TABLE @@ -3934,9 +4168,9 @@ CypherParser::KU_DropTableContext* CypherParser::kU_DropTable() { _errHandler->reportMatch(this); consume(); } - setState(773); + setState(810); match(CypherParser::SP); - setState(774); + setState(811); oC_SchemaName(); } @@ -3987,7 +4221,7 @@ size_t CypherParser::KU_AlterTableContext::getRuleIndex() const { CypherParser::KU_AlterTableContext* CypherParser::kU_AlterTable() { KU_AlterTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 50, CypherParser::RuleKU_AlterTable); + enterRule(_localctx, 54, CypherParser::RuleKU_AlterTable); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3998,19 +4232,19 @@ CypherParser::KU_AlterTableContext* CypherParser::kU_AlterTable() { }); try { enterOuterAlt(_localctx, 1); - setState(776); + setState(813); match(CypherParser::ALTER); - setState(777); + setState(814); match(CypherParser::SP); - setState(778); + setState(815); match(CypherParser::TABLE); - setState(779); + setState(816); match(CypherParser::SP); - setState(780); + setState(817); oC_SchemaName(); - setState(781); + setState(818); match(CypherParser::SP); - setState(782); + setState(819); kU_AlterOptions(); } @@ -4053,7 +4287,7 @@ size_t CypherParser::KU_AlterOptionsContext::getRuleIndex() const { CypherParser::KU_AlterOptionsContext* CypherParser::kU_AlterOptions() { KU_AlterOptionsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 52, CypherParser::RuleKU_AlterOptions); + enterRule(_localctx, 56, CypherParser::RuleKU_AlterOptions); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4063,33 +4297,33 @@ CypherParser::KU_AlterOptionsContext* CypherParser::kU_AlterOptions() { exitRule(); }); try { - setState(788); + setState(825); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 90, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 95, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(784); + setState(821); kU_AddProperty(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(785); + setState(822); kU_DropProperty(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(786); + setState(823); kU_RenameTable(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(787); + setState(824); kU_RenameProperty(); break; } @@ -4150,7 +4384,7 @@ size_t CypherParser::KU_AddPropertyContext::getRuleIndex() const { CypherParser::KU_AddPropertyContext* CypherParser::kU_AddProperty() { KU_AddPropertyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 54, CypherParser::RuleKU_AddProperty); + enterRule(_localctx, 58, CypherParser::RuleKU_AddProperty); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4161,28 +4395,28 @@ CypherParser::KU_AddPropertyContext* CypherParser::kU_AddProperty() { }); try { enterOuterAlt(_localctx, 1); - setState(790); + setState(827); match(CypherParser::ADD); - setState(791); + setState(828); match(CypherParser::SP); - setState(792); + setState(829); oC_PropertyKeyName(); - setState(793); + setState(830); match(CypherParser::SP); - setState(794); + setState(831); kU_DataType(0); - setState(799); + setState(836); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 91, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 96, _ctx)) { case 1: { - setState(795); + setState(832); match(CypherParser::SP); - setState(796); + setState(833); match(CypherParser::DEFAULT); - setState(797); + setState(834); match(CypherParser::SP); - setState(798); + setState(835); oC_Expression(); break; } @@ -4227,7 +4461,7 @@ size_t CypherParser::KU_DropPropertyContext::getRuleIndex() const { CypherParser::KU_DropPropertyContext* CypherParser::kU_DropProperty() { KU_DropPropertyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 56, CypherParser::RuleKU_DropProperty); + enterRule(_localctx, 60, CypherParser::RuleKU_DropProperty); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4238,11 +4472,11 @@ CypherParser::KU_DropPropertyContext* CypherParser::kU_DropProperty() { }); try { enterOuterAlt(_localctx, 1); - setState(801); + setState(838); match(CypherParser::DROP); - setState(802); + setState(839); match(CypherParser::SP); - setState(803); + setState(840); oC_PropertyKeyName(); } @@ -4289,7 +4523,7 @@ size_t CypherParser::KU_RenameTableContext::getRuleIndex() const { CypherParser::KU_RenameTableContext* CypherParser::kU_RenameTable() { KU_RenameTableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 58, CypherParser::RuleKU_RenameTable); + enterRule(_localctx, 62, CypherParser::RuleKU_RenameTable); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4300,15 +4534,15 @@ CypherParser::KU_RenameTableContext* CypherParser::kU_RenameTable() { }); try { enterOuterAlt(_localctx, 1); - setState(805); + setState(842); match(CypherParser::RENAME); - setState(806); + setState(843); match(CypherParser::SP); - setState(807); + setState(844); match(CypherParser::TO); - setState(808); + setState(845); match(CypherParser::SP); - setState(809); + setState(846); oC_SchemaName(); } @@ -4359,7 +4593,7 @@ size_t CypherParser::KU_RenamePropertyContext::getRuleIndex() const { CypherParser::KU_RenamePropertyContext* CypherParser::kU_RenameProperty() { KU_RenamePropertyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 60, CypherParser::RuleKU_RenameProperty); + enterRule(_localctx, 64, CypherParser::RuleKU_RenameProperty); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4370,19 +4604,19 @@ CypherParser::KU_RenamePropertyContext* CypherParser::kU_RenameProperty() { }); try { enterOuterAlt(_localctx, 1); - setState(811); + setState(848); match(CypherParser::RENAME); - setState(812); + setState(849); match(CypherParser::SP); - setState(813); + setState(850); oC_PropertyKeyName(); - setState(814); + setState(851); match(CypherParser::SP); - setState(815); + setState(852); match(CypherParser::TO); - setState(816); + setState(853); match(CypherParser::SP); - setState(817); + setState(854); oC_PropertyKeyName(); } @@ -4425,7 +4659,7 @@ size_t CypherParser::KU_PropertyDefinitionsContext::getRuleIndex() const { CypherParser::KU_PropertyDefinitionsContext* CypherParser::kU_PropertyDefinitions() { KU_PropertyDefinitionsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 62, CypherParser::RuleKU_PropertyDefinitions); + enterRule(_localctx, 66, CypherParser::RuleKU_PropertyDefinitions); size_t _la = 0; #if __cplusplus > 201703L @@ -4438,37 +4672,37 @@ CypherParser::KU_PropertyDefinitionsContext* CypherParser::kU_PropertyDefinition try { size_t alt; enterOuterAlt(_localctx, 1); - setState(819); + setState(856); kU_PropertyDefinition(); - setState(830); + setState(867); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 99, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(821); + setState(858); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(820); + setState(857); match(CypherParser::SP); } - setState(823); + setState(860); match(CypherParser::T__2); - setState(825); + setState(862); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(824); + setState(861); match(CypherParser::SP); } - setState(827); + setState(864); kU_PropertyDefinition(); } - setState(832); + setState(869); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 99, _ctx); } } @@ -4507,7 +4741,7 @@ size_t CypherParser::KU_PropertyDefinitionContext::getRuleIndex() const { CypherParser::KU_PropertyDefinitionContext* CypherParser::kU_PropertyDefinition() { KU_PropertyDefinitionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 64, CypherParser::RuleKU_PropertyDefinition); + enterRule(_localctx, 68, CypherParser::RuleKU_PropertyDefinition); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4518,11 +4752,11 @@ CypherParser::KU_PropertyDefinitionContext* CypherParser::kU_PropertyDefinition( }); try { enterOuterAlt(_localctx, 1); - setState(833); + setState(870); oC_PropertyKeyName(); - setState(834); + setState(871); match(CypherParser::SP); - setState(835); + setState(872); kU_DataType(0); } @@ -4569,7 +4803,7 @@ size_t CypherParser::KU_CreateNodeConstraintContext::getRuleIndex() const { CypherParser::KU_CreateNodeConstraintContext* CypherParser::kU_CreateNodeConstraint() { KU_CreateNodeConstraintContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 66, CypherParser::RuleKU_CreateNodeConstraint); + enterRule(_localctx, 70, CypherParser::RuleKU_CreateNodeConstraint); size_t _la = 0; #if __cplusplus > 201703L @@ -4581,41 +4815,41 @@ CypherParser::KU_CreateNodeConstraintContext* CypherParser::kU_CreateNodeConstra }); try { enterOuterAlt(_localctx, 1); - setState(837); + setState(874); match(CypherParser::PRIMARY); - setState(838); + setState(875); match(CypherParser::SP); - setState(839); + setState(876); match(CypherParser::KEY); - setState(841); + setState(878); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(840); + setState(877); match(CypherParser::SP); } - setState(843); + setState(880); match(CypherParser::T__1); - setState(845); + setState(882); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(844); + setState(881); match(CypherParser::SP); } - setState(847); + setState(884); oC_PropertyKeyName(); - setState(849); + setState(886); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(848); + setState(885); match(CypherParser::SP); } - setState(851); + setState(888); match(CypherParser::T__3); } @@ -4683,8 +4917,8 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { CypherParser::KU_DataTypeContext *_localctx = _tracker.createInstance(_ctx, parentState); CypherParser::KU_DataTypeContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 68; - enterRecursionRule(_localctx, 68, CypherParser::RuleKU_DataType, precedence); + size_t startState = 72; + enterRecursionRule(_localctx, 72, CypherParser::RuleKU_DataType, precedence); size_t _la = 0; @@ -4698,139 +4932,139 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(905); + setState(942); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 109, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 114, _ctx)) { case 1: { - setState(854); + setState(891); oC_SymbolicName(); break; } case 2: { - setState(855); + setState(892); match(CypherParser::UNION); - setState(857); + setState(894); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(856); + setState(893); match(CypherParser::SP); } - setState(859); + setState(896); match(CypherParser::T__1); - setState(861); + setState(898); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(860); + setState(897); match(CypherParser::SP); } - setState(863); + setState(900); kU_PropertyDefinitions(); - setState(865); + setState(902); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(864); + setState(901); match(CypherParser::SP); } - setState(867); + setState(904); match(CypherParser::T__3); break; } case 3: { - setState(869); + setState(906); oC_SymbolicName(); - setState(871); + setState(908); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(870); + setState(907); match(CypherParser::SP); } - setState(873); + setState(910); match(CypherParser::T__1); - setState(875); + setState(912); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(874); + setState(911); match(CypherParser::SP); } - setState(877); + setState(914); kU_PropertyDefinitions(); - setState(879); + setState(916); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(878); + setState(915); match(CypherParser::SP); } - setState(881); + setState(918); match(CypherParser::T__3); break; } case 4: { - setState(883); + setState(920); oC_SymbolicName(); - setState(885); + setState(922); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(884); + setState(921); match(CypherParser::SP); } - setState(887); + setState(924); match(CypherParser::T__1); - setState(889); + setState(926); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(888); + setState(925); match(CypherParser::SP); } - setState(891); + setState(928); kU_DataType(0); - setState(893); + setState(930); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(892); + setState(929); match(CypherParser::SP); } - setState(895); + setState(932); match(CypherParser::T__2); - setState(897); + setState(934); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(896); + setState(933); match(CypherParser::SP); } - setState(899); + setState(936); kU_DataType(0); - setState(901); + setState(938); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(900); + setState(937); match(CypherParser::SP); } - setState(903); + setState(940); match(CypherParser::T__3); break; } @@ -4839,9 +5073,9 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(911); + setState(948); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 110, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 115, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) @@ -4849,15 +5083,15 @@ CypherParser::KU_DataTypeContext* CypherParser::kU_DataType(int precedence) { previousContext = _localctx; _localctx = _tracker.createInstance(parentContext, parentState); pushNewRecursionContext(_localctx, startState, RuleKU_DataType); - setState(907); + setState(944); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(908); + setState(945); kU_ListIdentifiers(); } - setState(913); + setState(950); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 110, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 115, _ctx); } } catch (RecognitionException &e) { @@ -4890,7 +5124,7 @@ size_t CypherParser::KU_ListIdentifiersContext::getRuleIndex() const { CypherParser::KU_ListIdentifiersContext* CypherParser::kU_ListIdentifiers() { KU_ListIdentifiersContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 70, CypherParser::RuleKU_ListIdentifiers); + enterRule(_localctx, 74, CypherParser::RuleKU_ListIdentifiers); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4902,19 +5136,19 @@ CypherParser::KU_ListIdentifiersContext* CypherParser::kU_ListIdentifiers() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(914); + setState(951); kU_ListIdentifier(); - setState(918); + setState(955); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 111, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 116, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(915); + setState(952); kU_ListIdentifier(); } - setState(920); + setState(957); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 111, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 116, _ctx); } } @@ -4945,7 +5179,7 @@ size_t CypherParser::KU_ListIdentifierContext::getRuleIndex() const { CypherParser::KU_ListIdentifierContext* CypherParser::kU_ListIdentifier() { KU_ListIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 72, CypherParser::RuleKU_ListIdentifier); + enterRule(_localctx, 76, CypherParser::RuleKU_ListIdentifier); size_t _la = 0; #if __cplusplus > 201703L @@ -4957,17 +5191,17 @@ CypherParser::KU_ListIdentifierContext* CypherParser::kU_ListIdentifier() { }); try { enterOuterAlt(_localctx, 1); - setState(921); + setState(958); match(CypherParser::T__5); - setState(923); + setState(960); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DecimalInteger) { - setState(922); + setState(959); oC_IntegerLiteral(); } - setState(925); + setState(962); match(CypherParser::T__6); } @@ -5002,7 +5236,7 @@ size_t CypherParser::OC_AnyCypherOptionContext::getRuleIndex() const { CypherParser::OC_AnyCypherOptionContext* CypherParser::oC_AnyCypherOption() { OC_AnyCypherOptionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 74, CypherParser::RuleOC_AnyCypherOption); + enterRule(_localctx, 78, CypherParser::RuleOC_AnyCypherOption); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5012,19 +5246,19 @@ CypherParser::OC_AnyCypherOptionContext* CypherParser::oC_AnyCypherOption() { exitRule(); }); try { - setState(929); + setState(966); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::EXPLAIN: { enterOuterAlt(_localctx, 1); - setState(927); + setState(964); oC_Explain(); break; } case CypherParser::PROFILE: { enterOuterAlt(_localctx, 2); - setState(928); + setState(965); oC_Profile(); break; } @@ -5061,7 +5295,7 @@ size_t CypherParser::OC_ExplainContext::getRuleIndex() const { CypherParser::OC_ExplainContext* CypherParser::oC_Explain() { OC_ExplainContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 76, CypherParser::RuleOC_Explain); + enterRule(_localctx, 80, CypherParser::RuleOC_Explain); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5072,7 +5306,7 @@ CypherParser::OC_ExplainContext* CypherParser::oC_Explain() { }); try { enterOuterAlt(_localctx, 1); - setState(931); + setState(968); match(CypherParser::EXPLAIN); } @@ -5103,7 +5337,7 @@ size_t CypherParser::OC_ProfileContext::getRuleIndex() const { CypherParser::OC_ProfileContext* CypherParser::oC_Profile() { OC_ProfileContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 78, CypherParser::RuleOC_Profile); + enterRule(_localctx, 82, CypherParser::RuleOC_Profile); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5114,7 +5348,7 @@ CypherParser::OC_ProfileContext* CypherParser::oC_Profile() { }); try { enterOuterAlt(_localctx, 1); - setState(933); + setState(970); match(CypherParser::PROFILE); } @@ -5181,7 +5415,7 @@ size_t CypherParser::KU_TransactionContext::getRuleIndex() const { CypherParser::KU_TransactionContext* CypherParser::kU_Transaction() { KU_TransactionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 80, CypherParser::RuleKU_Transaction); + enterRule(_localctx, 84, CypherParser::RuleKU_Transaction); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5191,63 +5425,63 @@ CypherParser::KU_TransactionContext* CypherParser::kU_Transaction() { exitRule(); }); try { - setState(949); + setState(986); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 114, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 119, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(935); + setState(972); match(CypherParser::BEGIN); - setState(936); + setState(973); match(CypherParser::SP); - setState(937); + setState(974); match(CypherParser::TRANSACTION); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(938); + setState(975); match(CypherParser::BEGIN); - setState(939); + setState(976); match(CypherParser::SP); - setState(940); + setState(977); match(CypherParser::TRANSACTION); - setState(941); + setState(978); match(CypherParser::SP); - setState(942); + setState(979); match(CypherParser::READ); - setState(943); + setState(980); match(CypherParser::SP); - setState(944); + setState(981); match(CypherParser::ONLY); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(945); + setState(982); match(CypherParser::COMMIT); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(946); + setState(983); match(CypherParser::COMMIT_SKIP_CHECKPOINT); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(947); + setState(984); match(CypherParser::ROLLBACK); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(948); + setState(985); match(CypherParser::ROLLBACK_SKIP_CHECKPOINT); break; } @@ -5288,7 +5522,7 @@ size_t CypherParser::KU_ExtensionContext::getRuleIndex() const { CypherParser::KU_ExtensionContext* CypherParser::kU_Extension() { KU_ExtensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 82, CypherParser::RuleKU_Extension); + enterRule(_localctx, 86, CypherParser::RuleKU_Extension); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5298,19 +5532,19 @@ CypherParser::KU_ExtensionContext* CypherParser::kU_Extension() { exitRule(); }); try { - setState(953); + setState(990); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::LOAD: { enterOuterAlt(_localctx, 1); - setState(951); + setState(988); kU_LoadExtension(); break; } case CypherParser::INSTALL: { enterOuterAlt(_localctx, 2); - setState(952); + setState(989); kU_InstallExtension(); break; } @@ -5367,7 +5601,7 @@ size_t CypherParser::KU_LoadExtensionContext::getRuleIndex() const { CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { KU_LoadExtensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 84, CypherParser::RuleKU_LoadExtension); + enterRule(_localctx, 88, CypherParser::RuleKU_LoadExtension); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5378,19 +5612,19 @@ CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { }); try { enterOuterAlt(_localctx, 1); - setState(955); + setState(992); match(CypherParser::LOAD); - setState(956); + setState(993); match(CypherParser::SP); - setState(957); + setState(994); match(CypherParser::EXTENSION); - setState(958); + setState(995); match(CypherParser::SP); - setState(961); + setState(998); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::StringLiteral: { - setState(959); + setState(996); match(CypherParser::StringLiteral); break; } @@ -5408,7 +5642,7 @@ CypherParser::KU_LoadExtensionContext* CypherParser::kU_LoadExtension() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(960); + setState(997); oC_Variable(); break; } @@ -5453,7 +5687,7 @@ size_t CypherParser::KU_InstallExtensionContext::getRuleIndex() const { CypherParser::KU_InstallExtensionContext* CypherParser::kU_InstallExtension() { KU_InstallExtensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 86, CypherParser::RuleKU_InstallExtension); + enterRule(_localctx, 90, CypherParser::RuleKU_InstallExtension); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5464,11 +5698,11 @@ CypherParser::KU_InstallExtensionContext* CypherParser::kU_InstallExtension() { }); try { enterOuterAlt(_localctx, 1); - setState(963); + setState(1000); match(CypherParser::INSTALL); - setState(964); + setState(1001); match(CypherParser::SP); - setState(965); + setState(1002); oC_Variable(); } @@ -5499,7 +5733,7 @@ size_t CypherParser::OC_QueryContext::getRuleIndex() const { CypherParser::OC_QueryContext* CypherParser::oC_Query() { OC_QueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 88, CypherParser::RuleOC_Query); + enterRule(_localctx, 92, CypherParser::RuleOC_Query); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5510,7 +5744,7 @@ CypherParser::OC_QueryContext* CypherParser::oC_Query() { }); try { enterOuterAlt(_localctx, 1); - setState(967); + setState(1004); oC_RegularQuery(); } @@ -5565,7 +5799,7 @@ size_t CypherParser::OC_RegularQueryContext::getRuleIndex() const { CypherParser::OC_RegularQueryContext* CypherParser::oC_RegularQuery() { OC_RegularQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 90, CypherParser::RuleOC_RegularQuery); + enterRule(_localctx, 94, CypherParser::RuleOC_RegularQuery); size_t _la = 0; #if __cplusplus > 201703L @@ -5577,52 +5811,52 @@ CypherParser::OC_RegularQueryContext* CypherParser::oC_RegularQuery() { }); try { size_t alt; - setState(990); + setState(1027); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 121, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 126, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(969); + setState(1006); oC_SingleQuery(); - setState(976); + setState(1013); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 118, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 123, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(971); + setState(1008); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(970); + setState(1007); match(CypherParser::SP); } - setState(973); + setState(1010); oC_Union(); } - setState(978); + setState(1015); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 118, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 123, _ctx); } break; } case 2: { enterOuterAlt(_localctx, 2); - setState(983); + setState(1020); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(979); + setState(1016); oC_Return(); - setState(981); + setState(1018); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(980); + setState(1017); match(CypherParser::SP); } break; @@ -5631,11 +5865,11 @@ CypherParser::OC_RegularQueryContext* CypherParser::oC_RegularQuery() { default: throw NoViableAltException(this); } - setState(985); + setState(1022); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 120, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 125, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); - setState(987); + setState(1024); oC_SingleQuery(); notifyReturnNotAtEnd(_localctx->start); break; @@ -5689,7 +5923,7 @@ size_t CypherParser::OC_UnionContext::getRuleIndex() const { CypherParser::OC_UnionContext* CypherParser::oC_Union() { OC_UnionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 92, CypherParser::RuleOC_Union); + enterRule(_localctx, 96, CypherParser::RuleOC_Union); size_t _la = 0; #if __cplusplus > 201703L @@ -5700,43 +5934,43 @@ CypherParser::OC_UnionContext* CypherParser::oC_Union() { exitRule(); }); try { - setState(1004); + setState(1041); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 124, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 129, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(992); + setState(1029); match(CypherParser::UNION); - setState(993); + setState(1030); match(CypherParser::SP); - setState(994); + setState(1031); match(CypherParser::ALL); - setState(996); + setState(1033); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(995); + setState(1032); match(CypherParser::SP); } - setState(998); + setState(1035); oC_SingleQuery(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(999); + setState(1036); match(CypherParser::UNION); - setState(1001); + setState(1038); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1000); + setState(1037); match(CypherParser::SP); } - setState(1003); + setState(1040); oC_SingleQuery(); break; } @@ -5777,7 +6011,7 @@ size_t CypherParser::OC_SingleQueryContext::getRuleIndex() const { CypherParser::OC_SingleQueryContext* CypherParser::oC_SingleQuery() { OC_SingleQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 94, CypherParser::RuleOC_SingleQuery); + enterRule(_localctx, 98, CypherParser::RuleOC_SingleQuery); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5787,19 +6021,19 @@ CypherParser::OC_SingleQueryContext* CypherParser::oC_SingleQuery() { exitRule(); }); try { - setState(1008); + setState(1045); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 125, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 130, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1006); + setState(1043); oC_SinglePartQuery(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1007); + setState(1044); oC_MultiPartQuery(); break; } @@ -5860,7 +6094,7 @@ size_t CypherParser::OC_SinglePartQueryContext::getRuleIndex() const { CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { OC_SinglePartQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 96, CypherParser::RuleOC_SinglePartQuery); + enterRule(_localctx, 100, CypherParser::RuleOC_SinglePartQuery); size_t _la = 0; #if __cplusplus > 201703L @@ -5872,92 +6106,92 @@ CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { }); try { size_t alt; - setState(1055); + setState(1092); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 141, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1016); + setState(1053); _errHandler->sync(this); _la = _input->LA(1); - while (((((_la - 46) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 46)) & 7971459301377) != 0)) { - setState(1010); + while (((((_la - 48) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 48)) & 7971459301377) != 0)) { + setState(1047); oC_ReadingClause(); - setState(1012); + setState(1049); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1011); + setState(1048); match(CypherParser::SP); } - setState(1018); + setState(1055); _errHandler->sync(this); _la = _input->LA(1); } - setState(1019); + setState(1056); oC_Return(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1026); + setState(1063); _errHandler->sync(this); _la = _input->LA(1); - while (((((_la - 46) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 46)) & 7971459301377) != 0)) { - setState(1020); + while (((((_la - 48) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 48)) & 7971459301377) != 0)) { + setState(1057); oC_ReadingClause(); - setState(1022); + setState(1059); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1021); + setState(1058); match(CypherParser::SP); } - setState(1028); + setState(1065); _errHandler->sync(this); _la = _input->LA(1); } - setState(1029); + setState(1066); oC_UpdatingClause(); - setState(1036); + setState(1073); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 136, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1031); + setState(1068); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1030); + setState(1067); match(CypherParser::SP); } - setState(1033); + setState(1070); oC_UpdatingClause(); } - setState(1038); + setState(1075); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 136, _ctx); } - setState(1043); + setState(1080); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 133, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 138, _ctx)) { case 1: { - setState(1040); + setState(1077); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1039); + setState(1076); match(CypherParser::SP); } - setState(1042); + setState(1079); oC_Return(); break; } @@ -5970,18 +6204,18 @@ CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { case 3: { enterOuterAlt(_localctx, 3); - setState(1049); + setState(1086); _errHandler->sync(this); _la = _input->LA(1); do { - setState(1045); + setState(1082); oC_ReadingClause(); - setState(1047); + setState(1084); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 134, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 139, _ctx)) { case 1: { - setState(1046); + setState(1083); match(CypherParser::SP); break; } @@ -5989,11 +6223,11 @@ CypherParser::OC_SinglePartQueryContext* CypherParser::oC_SinglePartQuery() { default: break; } - setState(1051); + setState(1088); _errHandler->sync(this); _la = _input->LA(1); - } while (((((_la - 46) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 46)) & 7971459301377) != 0)); + } while (((((_la - 48) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 48)) & 7971459301377) != 0)); notifyQueryNotConcludeWithReturn(_localctx->start); break; } @@ -6046,7 +6280,7 @@ size_t CypherParser::OC_MultiPartQueryContext::getRuleIndex() const { CypherParser::OC_MultiPartQueryContext* CypherParser::oC_MultiPartQuery() { OC_MultiPartQueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 98, CypherParser::RuleOC_MultiPartQuery); + enterRule(_localctx, 102, CypherParser::RuleOC_MultiPartQuery); size_t _la = 0; #if __cplusplus > 201703L @@ -6059,20 +6293,20 @@ CypherParser::OC_MultiPartQueryContext* CypherParser::oC_MultiPartQuery() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1061); + setState(1098); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(1057); + setState(1094); kU_QueryPart(); - setState(1059); + setState(1096); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1058); + setState(1095); match(CypherParser::SP); } break; @@ -6081,11 +6315,11 @@ CypherParser::OC_MultiPartQueryContext* CypherParser::oC_MultiPartQuery() { default: throw NoViableAltException(this); } - setState(1063); + setState(1100); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 138, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 143, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); - setState(1065); + setState(1102); oC_SinglePartQuery(); } @@ -6140,7 +6374,7 @@ size_t CypherParser::KU_QueryPartContext::getRuleIndex() const { CypherParser::KU_QueryPartContext* CypherParser::kU_QueryPart() { KU_QueryPartContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 100, CypherParser::RuleKU_QueryPart); + enterRule(_localctx, 104, CypherParser::RuleKU_QueryPart); size_t _la = 0; #if __cplusplus > 201703L @@ -6152,45 +6386,45 @@ CypherParser::KU_QueryPartContext* CypherParser::kU_QueryPart() { }); try { enterOuterAlt(_localctx, 1); - setState(1073); + setState(1110); _errHandler->sync(this); _la = _input->LA(1); - while (((((_la - 46) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 46)) & 7971459301377) != 0)) { - setState(1067); + while (((((_la - 48) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 48)) & 7971459301377) != 0)) { + setState(1104); oC_ReadingClause(); - setState(1069); + setState(1106); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1068); + setState(1105); match(CypherParser::SP); } - setState(1075); + setState(1112); _errHandler->sync(this); _la = _input->LA(1); } - setState(1082); + setState(1119); _errHandler->sync(this); _la = _input->LA(1); - while (((((_la - 89) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 89)) & 59) != 0)) { - setState(1076); + while (((((_la - 91) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 91)) & 59) != 0)) { + setState(1113); oC_UpdatingClause(); - setState(1078); + setState(1115); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1077); + setState(1114); match(CypherParser::SP); } - setState(1084); + setState(1121); _errHandler->sync(this); _la = _input->LA(1); } - setState(1085); + setState(1122); oC_With(); } @@ -6233,7 +6467,7 @@ size_t CypherParser::OC_UpdatingClauseContext::getRuleIndex() const { CypherParser::OC_UpdatingClauseContext* CypherParser::oC_UpdatingClause() { OC_UpdatingClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 102, CypherParser::RuleOC_UpdatingClause); + enterRule(_localctx, 106, CypherParser::RuleOC_UpdatingClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6243,26 +6477,26 @@ CypherParser::OC_UpdatingClauseContext* CypherParser::oC_UpdatingClause() { exitRule(); }); try { - setState(1091); + setState(1128); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::CREATE: { enterOuterAlt(_localctx, 1); - setState(1087); + setState(1124); oC_Create(); break; } case CypherParser::MERGE: { enterOuterAlt(_localctx, 2); - setState(1088); + setState(1125); oC_Merge(); break; } case CypherParser::SET: { enterOuterAlt(_localctx, 3); - setState(1089); + setState(1126); oC_Set(); break; } @@ -6270,7 +6504,7 @@ CypherParser::OC_UpdatingClauseContext* CypherParser::oC_UpdatingClause() { case CypherParser::DETACH: case CypherParser::DELETE: { enterOuterAlt(_localctx, 4); - setState(1090); + setState(1127); oC_Delete(); break; } @@ -6319,7 +6553,7 @@ size_t CypherParser::OC_ReadingClauseContext::getRuleIndex() const { CypherParser::OC_ReadingClauseContext* CypherParser::oC_ReadingClause() { OC_ReadingClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 104, CypherParser::RuleOC_ReadingClause); + enterRule(_localctx, 108, CypherParser::RuleOC_ReadingClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6329,34 +6563,34 @@ CypherParser::OC_ReadingClauseContext* CypherParser::oC_ReadingClause() { exitRule(); }); try { - setState(1097); + setState(1134); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::OPTIONAL: case CypherParser::MATCH: { enterOuterAlt(_localctx, 1); - setState(1093); + setState(1130); oC_Match(); break; } case CypherParser::UNWIND: { enterOuterAlt(_localctx, 2); - setState(1094); + setState(1131); oC_Unwind(); break; } case CypherParser::CALL: { enterOuterAlt(_localctx, 3); - setState(1095); + setState(1132); kU_InQueryCall(); break; } case CypherParser::LOAD: { enterOuterAlt(_localctx, 4); - setState(1096); + setState(1133); kU_LoadFrom(); break; } @@ -6429,7 +6663,7 @@ size_t CypherParser::KU_LoadFromContext::getRuleIndex() const { CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { KU_LoadFromContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 106, CypherParser::RuleKU_LoadFrom); + enterRule(_localctx, 110, CypherParser::RuleKU_LoadFrom); size_t _la = 0; #if __cplusplus > 201703L @@ -6441,50 +6675,50 @@ CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { }); try { enterOuterAlt(_localctx, 1); - setState(1099); + setState(1136); match(CypherParser::LOAD); - setState(1117); + setState(1154); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 148, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 153, _ctx)) { case 1: { - setState(1100); + setState(1137); match(CypherParser::SP); - setState(1101); + setState(1138); match(CypherParser::WITH); - setState(1102); + setState(1139); match(CypherParser::SP); - setState(1103); + setState(1140); match(CypherParser::HEADERS); - setState(1105); + setState(1142); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1104); + setState(1141); match(CypherParser::SP); } - setState(1107); + setState(1144); match(CypherParser::T__1); - setState(1109); + setState(1146); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1108); + setState(1145); match(CypherParser::SP); } - setState(1111); + setState(1148); kU_PropertyDefinitions(); - setState(1113); + setState(1150); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1112); + setState(1149); match(CypherParser::SP); } - setState(1115); + setState(1152); match(CypherParser::T__3); break; } @@ -6492,28 +6726,28 @@ CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { default: break; } - setState(1119); + setState(1156); match(CypherParser::SP); - setState(1120); + setState(1157); match(CypherParser::FROM); - setState(1121); + setState(1158); match(CypherParser::SP); - setState(1122); + setState(1159); kU_ScanSource(); - setState(1127); + setState(1164); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 150, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 155, _ctx)) { case 1: { - setState(1124); + setState(1161); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1123); + setState(1160); match(CypherParser::SP); } - setState(1126); + setState(1163); kU_ParsingOptions(); break; } @@ -6521,20 +6755,20 @@ CypherParser::KU_LoadFromContext* CypherParser::kU_LoadFrom() { default: break; } - setState(1133); + setState(1170); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 152, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 157, _ctx)) { case 1: { - setState(1130); + setState(1167); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1129); + setState(1166); match(CypherParser::SP); } - setState(1132); + setState(1169); oC_Where(); break; } @@ -6587,7 +6821,7 @@ size_t CypherParser::KU_InQueryCallContext::getRuleIndex() const { CypherParser::KU_InQueryCallContext* CypherParser::kU_InQueryCall() { KU_InQueryCallContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 108, CypherParser::RuleKU_InQueryCall); + enterRule(_localctx, 112, CypherParser::RuleKU_InQueryCall); size_t _la = 0; #if __cplusplus > 201703L @@ -6599,26 +6833,26 @@ CypherParser::KU_InQueryCallContext* CypherParser::kU_InQueryCall() { }); try { enterOuterAlt(_localctx, 1); - setState(1135); + setState(1172); match(CypherParser::CALL); - setState(1136); + setState(1173); match(CypherParser::SP); - setState(1137); + setState(1174); oC_FunctionInvocation(); - setState(1142); + setState(1179); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 154, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 159, _ctx)) { case 1: { - setState(1139); + setState(1176); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1138); + setState(1175); match(CypherParser::SP); } - setState(1141); + setState(1178); oC_Where(); break; } @@ -6675,7 +6909,7 @@ size_t CypherParser::OC_MatchContext::getRuleIndex() const { CypherParser::OC_MatchContext* CypherParser::oC_Match() { OC_MatchContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 110, CypherParser::RuleOC_Match); + enterRule(_localctx, 114, CypherParser::RuleOC_Match); size_t _la = 0; #if __cplusplus > 201703L @@ -6687,42 +6921,42 @@ CypherParser::OC_MatchContext* CypherParser::oC_Match() { }); try { enterOuterAlt(_localctx, 1); - setState(1146); + setState(1183); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::OPTIONAL) { - setState(1144); + setState(1181); match(CypherParser::OPTIONAL); - setState(1145); + setState(1182); match(CypherParser::SP); } - setState(1148); + setState(1185); match(CypherParser::MATCH); - setState(1150); + setState(1187); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1149); + setState(1186); match(CypherParser::SP); } - setState(1152); + setState(1189); oC_Pattern(); - setState(1157); + setState(1194); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 158, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 163, _ctx)) { case 1: { - setState(1154); + setState(1191); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1153); + setState(1190); match(CypherParser::SP); } - setState(1156); + setState(1193); oC_Where(); break; } @@ -6779,7 +7013,7 @@ size_t CypherParser::OC_UnwindContext::getRuleIndex() const { CypherParser::OC_UnwindContext* CypherParser::oC_Unwind() { OC_UnwindContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 112, CypherParser::RuleOC_Unwind); + enterRule(_localctx, 116, CypherParser::RuleOC_Unwind); size_t _la = 0; #if __cplusplus > 201703L @@ -6791,25 +7025,25 @@ CypherParser::OC_UnwindContext* CypherParser::oC_Unwind() { }); try { enterOuterAlt(_localctx, 1); - setState(1159); + setState(1196); match(CypherParser::UNWIND); - setState(1161); + setState(1198); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1160); + setState(1197); match(CypherParser::SP); } - setState(1163); + setState(1200); oC_Expression(); - setState(1164); + setState(1201); match(CypherParser::SP); - setState(1165); + setState(1202); match(CypherParser::AS); - setState(1166); + setState(1203); match(CypherParser::SP); - setState(1167); + setState(1204); oC_Variable(); } @@ -6848,7 +7082,7 @@ size_t CypherParser::OC_CreateContext::getRuleIndex() const { CypherParser::OC_CreateContext* CypherParser::oC_Create() { OC_CreateContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 114, CypherParser::RuleOC_Create); + enterRule(_localctx, 118, CypherParser::RuleOC_Create); size_t _la = 0; #if __cplusplus > 201703L @@ -6860,17 +7094,17 @@ CypherParser::OC_CreateContext* CypherParser::oC_Create() { }); try { enterOuterAlt(_localctx, 1); - setState(1169); + setState(1206); match(CypherParser::CREATE); - setState(1171); + setState(1208); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1170); + setState(1207); match(CypherParser::SP); } - setState(1173); + setState(1210); oC_Pattern(); } @@ -6921,7 +7155,7 @@ size_t CypherParser::OC_MergeContext::getRuleIndex() const { CypherParser::OC_MergeContext* CypherParser::oC_Merge() { OC_MergeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 116, CypherParser::RuleOC_Merge); + enterRule(_localctx, 120, CypherParser::RuleOC_Merge); size_t _la = 0; #if __cplusplus > 201703L @@ -6934,31 +7168,31 @@ CypherParser::OC_MergeContext* CypherParser::oC_Merge() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1175); + setState(1212); match(CypherParser::MERGE); - setState(1177); + setState(1214); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1176); + setState(1213); match(CypherParser::SP); } - setState(1179); + setState(1216); oC_Pattern(); - setState(1184); + setState(1221); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 162, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1180); + setState(1217); match(CypherParser::SP); - setState(1181); + setState(1218); oC_MergeAction(); } - setState(1186); + setState(1223); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 162, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); } } @@ -7009,7 +7243,7 @@ size_t CypherParser::OC_MergeActionContext::getRuleIndex() const { CypherParser::OC_MergeActionContext* CypherParser::oC_MergeAction() { OC_MergeActionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 118, CypherParser::RuleOC_MergeAction); + enterRule(_localctx, 122, CypherParser::RuleOC_MergeAction); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7019,35 +7253,35 @@ CypherParser::OC_MergeActionContext* CypherParser::oC_MergeAction() { exitRule(); }); try { - setState(1197); + setState(1234); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 163, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 168, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1187); + setState(1224); match(CypherParser::ON); - setState(1188); + setState(1225); match(CypherParser::SP); - setState(1189); + setState(1226); match(CypherParser::MATCH); - setState(1190); + setState(1227); match(CypherParser::SP); - setState(1191); + setState(1228); oC_Set(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1192); + setState(1229); match(CypherParser::ON); - setState(1193); + setState(1230); match(CypherParser::SP); - setState(1194); + setState(1231); match(CypherParser::CREATE); - setState(1195); + setState(1232); match(CypherParser::SP); - setState(1196); + setState(1233); oC_Set(); break; } @@ -7100,7 +7334,7 @@ size_t CypherParser::OC_SetContext::getRuleIndex() const { CypherParser::OC_SetContext* CypherParser::oC_Set() { OC_SetContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 120, CypherParser::RuleOC_Set); + enterRule(_localctx, 124, CypherParser::RuleOC_Set); size_t _la = 0; #if __cplusplus > 201703L @@ -7113,47 +7347,47 @@ CypherParser::OC_SetContext* CypherParser::oC_Set() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1199); + setState(1236); match(CypherParser::SET); - setState(1201); + setState(1238); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1200); + setState(1237); match(CypherParser::SP); } - setState(1203); + setState(1240); oC_SetItem(); - setState(1214); + setState(1251); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 172, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1205); + setState(1242); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1204); + setState(1241); match(CypherParser::SP); } - setState(1207); + setState(1244); match(CypherParser::T__2); - setState(1209); + setState(1246); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1208); + setState(1245); match(CypherParser::SP); } - setState(1211); + setState(1248); oC_SetItem(); } - setState(1216); + setState(1253); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 167, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 172, _ctx); } } @@ -7196,7 +7430,7 @@ size_t CypherParser::OC_SetItemContext::getRuleIndex() const { CypherParser::OC_SetItemContext* CypherParser::oC_SetItem() { OC_SetItemContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 122, CypherParser::RuleOC_SetItem); + enterRule(_localctx, 126, CypherParser::RuleOC_SetItem); size_t _la = 0; #if __cplusplus > 201703L @@ -7208,27 +7442,27 @@ CypherParser::OC_SetItemContext* CypherParser::oC_SetItem() { }); try { enterOuterAlt(_localctx, 1); - setState(1217); + setState(1254); oC_PropertyExpression(); - setState(1219); + setState(1256); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1218); + setState(1255); match(CypherParser::SP); } - setState(1221); + setState(1258); match(CypherParser::T__4); - setState(1223); + setState(1260); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1222); + setState(1259); match(CypherParser::SP); } - setState(1225); + setState(1262); oC_Expression(); } @@ -7279,7 +7513,7 @@ size_t CypherParser::OC_DeleteContext::getRuleIndex() const { CypherParser::OC_DeleteContext* CypherParser::oC_Delete() { OC_DeleteContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 124, CypherParser::RuleOC_Delete); + enterRule(_localctx, 128, CypherParser::RuleOC_Delete); size_t _la = 0; #if __cplusplus > 201703L @@ -7292,57 +7526,57 @@ CypherParser::OC_DeleteContext* CypherParser::oC_Delete() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1229); + setState(1266); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DETACH) { - setState(1227); + setState(1264); match(CypherParser::DETACH); - setState(1228); + setState(1265); match(CypherParser::SP); } - setState(1231); + setState(1268); match(CypherParser::DELETE); - setState(1233); + setState(1270); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1232); + setState(1269); match(CypherParser::SP); } - setState(1235); + setState(1272); oC_Expression(); - setState(1246); + setState(1283); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 174, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 179, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1237); + setState(1274); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1236); + setState(1273); match(CypherParser::SP); } - setState(1239); + setState(1276); match(CypherParser::T__2); - setState(1241); + setState(1278); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1240); + setState(1277); match(CypherParser::SP); } - setState(1243); + setState(1280); oC_Expression(); } - setState(1248); + setState(1285); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 174, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 179, _ctx); } } @@ -7385,7 +7619,7 @@ size_t CypherParser::OC_WithContext::getRuleIndex() const { CypherParser::OC_WithContext* CypherParser::oC_With() { OC_WithContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 126, CypherParser::RuleOC_With); + enterRule(_localctx, 130, CypherParser::RuleOC_With); size_t _la = 0; #if __cplusplus > 201703L @@ -7397,24 +7631,24 @@ CypherParser::OC_WithContext* CypherParser::oC_With() { }); try { enterOuterAlt(_localctx, 1); - setState(1249); + setState(1286); match(CypherParser::WITH); - setState(1250); + setState(1287); oC_ProjectionBody(); - setState(1255); + setState(1292); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 176, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 181, _ctx)) { case 1: { - setState(1252); + setState(1289); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1251); + setState(1288); match(CypherParser::SP); } - setState(1254); + setState(1291); oC_Where(); break; } @@ -7455,7 +7689,7 @@ size_t CypherParser::OC_ReturnContext::getRuleIndex() const { CypherParser::OC_ReturnContext* CypherParser::oC_Return() { OC_ReturnContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 128, CypherParser::RuleOC_Return); + enterRule(_localctx, 132, CypherParser::RuleOC_Return); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7466,9 +7700,9 @@ CypherParser::OC_ReturnContext* CypherParser::oC_Return() { }); try { enterOuterAlt(_localctx, 1); - setState(1257); + setState(1294); match(CypherParser::RETURN); - setState(1258); + setState(1295); oC_ProjectionBody(); } @@ -7523,7 +7757,7 @@ size_t CypherParser::OC_ProjectionBodyContext::getRuleIndex() const { CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { OC_ProjectionBodyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 130, CypherParser::RuleOC_ProjectionBody); + enterRule(_localctx, 134, CypherParser::RuleOC_ProjectionBody); size_t _la = 0; #if __cplusplus > 201703L @@ -7535,20 +7769,20 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { }); try { enterOuterAlt(_localctx, 1); - setState(1264); + setState(1301); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 178, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 183, _ctx)) { case 1: { - setState(1261); + setState(1298); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1260); + setState(1297); match(CypherParser::SP); } - setState(1263); + setState(1300); match(CypherParser::DISTINCT); break; } @@ -7556,18 +7790,18 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { default: break; } - setState(1266); + setState(1303); match(CypherParser::SP); - setState(1267); + setState(1304); oC_ProjectionItems(); - setState(1270); + setState(1307); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 179, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 184, _ctx)) { case 1: { - setState(1268); + setState(1305); match(CypherParser::SP); - setState(1269); + setState(1306); oC_Order(); break; } @@ -7575,14 +7809,14 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { default: break; } - setState(1274); + setState(1311); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 180, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 185, _ctx)) { case 1: { - setState(1272); + setState(1309); match(CypherParser::SP); - setState(1273); + setState(1310); oC_Skip(); break; } @@ -7590,14 +7824,14 @@ CypherParser::OC_ProjectionBodyContext* CypherParser::oC_ProjectionBody() { default: break; } - setState(1278); + setState(1315); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 181, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 186, _ctx)) { case 1: { - setState(1276); + setState(1313); match(CypherParser::SP); - setState(1277); + setState(1314); oC_Limit(); break; } @@ -7650,7 +7884,7 @@ size_t CypherParser::OC_ProjectionItemsContext::getRuleIndex() const { CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { OC_ProjectionItemsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 132, CypherParser::RuleOC_ProjectionItems); + enterRule(_localctx, 136, CypherParser::RuleOC_ProjectionItems); size_t _la = 0; #if __cplusplus > 201703L @@ -7662,42 +7896,42 @@ CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { }); try { size_t alt; - setState(1308); + setState(1345); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::STAR: { enterOuterAlt(_localctx, 1); - setState(1280); + setState(1317); match(CypherParser::STAR); - setState(1291); + setState(1328); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 184, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 189, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1282); + setState(1319); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1281); + setState(1318); match(CypherParser::SP); } - setState(1284); + setState(1321); match(CypherParser::T__2); - setState(1286); + setState(1323); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1285); + setState(1322); match(CypherParser::SP); } - setState(1288); + setState(1325); oC_ProjectionItem(); } - setState(1293); + setState(1330); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 184, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 189, _ctx); } break; } @@ -7730,37 +7964,37 @@ CypherParser::OC_ProjectionItemsContext* CypherParser::oC_ProjectionItems() { case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 2); - setState(1294); + setState(1331); oC_ProjectionItem(); - setState(1305); + setState(1342); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 187, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 192, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1296); + setState(1333); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1295); + setState(1332); match(CypherParser::SP); } - setState(1298); + setState(1335); match(CypherParser::T__2); - setState(1300); + setState(1337); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1299); + setState(1336); match(CypherParser::SP); } - setState(1302); + setState(1339); oC_ProjectionItem(); } - setState(1307); + setState(1344); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 187, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 192, _ctx); } break; } @@ -7813,7 +8047,7 @@ size_t CypherParser::OC_ProjectionItemContext::getRuleIndex() const { CypherParser::OC_ProjectionItemContext* CypherParser::oC_ProjectionItem() { OC_ProjectionItemContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 134, CypherParser::RuleOC_ProjectionItem); + enterRule(_localctx, 138, CypherParser::RuleOC_ProjectionItem); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7823,27 +8057,27 @@ CypherParser::OC_ProjectionItemContext* CypherParser::oC_ProjectionItem() { exitRule(); }); try { - setState(1317); + setState(1354); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 189, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 194, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1310); + setState(1347); oC_Expression(); - setState(1311); + setState(1348); match(CypherParser::SP); - setState(1312); + setState(1349); match(CypherParser::AS); - setState(1313); + setState(1350); match(CypherParser::SP); - setState(1314); + setState(1351); oC_Variable(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1316); + setState(1353); oC_Expression(); break; } @@ -7900,7 +8134,7 @@ size_t CypherParser::OC_OrderContext::getRuleIndex() const { CypherParser::OC_OrderContext* CypherParser::oC_Order() { OC_OrderContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 136, CypherParser::RuleOC_Order); + enterRule(_localctx, 140, CypherParser::RuleOC_Order); size_t _la = 0; #if __cplusplus > 201703L @@ -7912,33 +8146,33 @@ CypherParser::OC_OrderContext* CypherParser::oC_Order() { }); try { enterOuterAlt(_localctx, 1); - setState(1319); + setState(1356); match(CypherParser::ORDER); - setState(1320); + setState(1357); match(CypherParser::SP); - setState(1321); + setState(1358); match(CypherParser::BY); - setState(1322); + setState(1359); match(CypherParser::SP); - setState(1323); + setState(1360); oC_SortItem(); - setState(1331); + setState(1368); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2) { - setState(1324); + setState(1361); match(CypherParser::T__2); - setState(1326); + setState(1363); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1325); + setState(1362); match(CypherParser::SP); } - setState(1328); + setState(1365); oC_SortItem(); - setState(1333); + setState(1370); _errHandler->sync(this); _la = _input->LA(1); } @@ -7979,7 +8213,7 @@ size_t CypherParser::OC_SkipContext::getRuleIndex() const { CypherParser::OC_SkipContext* CypherParser::oC_Skip() { OC_SkipContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 138, CypherParser::RuleOC_Skip); + enterRule(_localctx, 142, CypherParser::RuleOC_Skip); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -7990,11 +8224,11 @@ CypherParser::OC_SkipContext* CypherParser::oC_Skip() { }); try { enterOuterAlt(_localctx, 1); - setState(1334); + setState(1371); match(CypherParser::L_SKIP); - setState(1335); + setState(1372); match(CypherParser::SP); - setState(1336); + setState(1373); oC_Expression(); } @@ -8033,7 +8267,7 @@ size_t CypherParser::OC_LimitContext::getRuleIndex() const { CypherParser::OC_LimitContext* CypherParser::oC_Limit() { OC_LimitContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 140, CypherParser::RuleOC_Limit); + enterRule(_localctx, 144, CypherParser::RuleOC_Limit); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8044,11 +8278,11 @@ CypherParser::OC_LimitContext* CypherParser::oC_Limit() { }); try { enterOuterAlt(_localctx, 1); - setState(1338); + setState(1375); match(CypherParser::LIMIT); - setState(1339); + setState(1376); match(CypherParser::SP); - setState(1340); + setState(1377); oC_Expression(); } @@ -8099,7 +8333,7 @@ size_t CypherParser::OC_SortItemContext::getRuleIndex() const { CypherParser::OC_SortItemContext* CypherParser::oC_SortItem() { OC_SortItemContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 142, CypherParser::RuleOC_SortItem); + enterRule(_localctx, 146, CypherParser::RuleOC_SortItem); size_t _la = 0; #if __cplusplus > 201703L @@ -8111,25 +8345,25 @@ CypherParser::OC_SortItemContext* CypherParser::oC_SortItem() { }); try { enterOuterAlt(_localctx, 1); - setState(1342); + setState(1379); oC_Expression(); - setState(1347); + setState(1384); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 193, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 198, _ctx)) { case 1: { - setState(1344); + setState(1381); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1343); + setState(1380); match(CypherParser::SP); } - setState(1346); + setState(1383); _la = _input->LA(1); - if (!(((((_la - 104) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 104)) & 15) != 0))) { + if (!(((((_la - 106) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 106)) & 15) != 0))) { _errHandler->recoverInline(this); } else { @@ -8179,7 +8413,7 @@ size_t CypherParser::OC_WhereContext::getRuleIndex() const { CypherParser::OC_WhereContext* CypherParser::oC_Where() { OC_WhereContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 144, CypherParser::RuleOC_Where); + enterRule(_localctx, 148, CypherParser::RuleOC_Where); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8190,11 +8424,11 @@ CypherParser::OC_WhereContext* CypherParser::oC_Where() { }); try { enterOuterAlt(_localctx, 1); - setState(1349); + setState(1386); match(CypherParser::WHERE); - setState(1350); + setState(1387); match(CypherParser::SP); - setState(1351); + setState(1388); oC_Expression(); } @@ -8237,7 +8471,7 @@ size_t CypherParser::OC_PatternContext::getRuleIndex() const { CypherParser::OC_PatternContext* CypherParser::oC_Pattern() { OC_PatternContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 146, CypherParser::RuleOC_Pattern); + enterRule(_localctx, 150, CypherParser::RuleOC_Pattern); size_t _la = 0; #if __cplusplus > 201703L @@ -8250,37 +8484,37 @@ CypherParser::OC_PatternContext* CypherParser::oC_Pattern() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1353); + setState(1390); oC_PatternPart(); - setState(1364); + setState(1401); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 196, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1355); + setState(1392); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1354); + setState(1391); match(CypherParser::SP); } - setState(1357); + setState(1394); match(CypherParser::T__2); - setState(1359); + setState(1396); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1358); + setState(1395); match(CypherParser::SP); } - setState(1361); + setState(1398); oC_PatternPart(); } - setState(1366); + setState(1403); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 196, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); } } @@ -8323,7 +8557,7 @@ size_t CypherParser::OC_PatternPartContext::getRuleIndex() const { CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { OC_PatternPartContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 148, CypherParser::RuleOC_PatternPart); + enterRule(_localctx, 152, CypherParser::RuleOC_PatternPart); size_t _la = 0; #if __cplusplus > 201703L @@ -8334,7 +8568,7 @@ CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { exitRule(); }); try { - setState(1378); + setState(1415); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -8351,34 +8585,34 @@ CypherParser::OC_PatternPartContext* CypherParser::oC_PatternPart() { case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 1); - setState(1367); + setState(1404); oC_Variable(); - setState(1369); + setState(1406); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1368); + setState(1405); match(CypherParser::SP); } - setState(1371); + setState(1408); match(CypherParser::T__4); - setState(1373); + setState(1410); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1372); + setState(1409); match(CypherParser::SP); } - setState(1375); + setState(1412); oC_AnonymousPatternPart(); break; } case CypherParser::T__1: { enterOuterAlt(_localctx, 2); - setState(1377); + setState(1414); oC_AnonymousPatternPart(); break; } @@ -8415,7 +8649,7 @@ size_t CypherParser::OC_AnonymousPatternPartContext::getRuleIndex() const { CypherParser::OC_AnonymousPatternPartContext* CypherParser::oC_AnonymousPatternPart() { OC_AnonymousPatternPartContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 150, CypherParser::RuleOC_AnonymousPatternPart); + enterRule(_localctx, 154, CypherParser::RuleOC_AnonymousPatternPart); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -8426,7 +8660,7 @@ CypherParser::OC_AnonymousPatternPartContext* CypherParser::oC_AnonymousPatternP }); try { enterOuterAlt(_localctx, 1); - setState(1380); + setState(1417); oC_PatternElement(); } @@ -8477,7 +8711,7 @@ size_t CypherParser::OC_PatternElementContext::getRuleIndex() const { CypherParser::OC_PatternElementContext* CypherParser::oC_PatternElement() { OC_PatternElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 152, CypherParser::RuleOC_PatternElement); + enterRule(_localctx, 156, CypherParser::RuleOC_PatternElement); size_t _la = 0; #if __cplusplus > 201703L @@ -8489,43 +8723,43 @@ CypherParser::OC_PatternElementContext* CypherParser::oC_PatternElement() { }); try { size_t alt; - setState(1396); + setState(1433); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 202, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 207, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1382); + setState(1419); oC_NodePattern(); - setState(1389); + setState(1426); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 206, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1384); + setState(1421); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1383); + setState(1420); match(CypherParser::SP); } - setState(1386); + setState(1423); oC_PatternElementChain(); } - setState(1391); + setState(1428); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 201, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 206, _ctx); } break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1392); + setState(1429); match(CypherParser::T__1); - setState(1393); + setState(1430); oC_PatternElement(); - setState(1394); + setState(1431); match(CypherParser::T__3); break; } @@ -8578,7 +8812,7 @@ size_t CypherParser::OC_NodePatternContext::getRuleIndex() const { CypherParser::OC_NodePatternContext* CypherParser::oC_NodePattern() { OC_NodePatternContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 154, CypherParser::RuleOC_NodePattern); + enterRule(_localctx, 158, CypherParser::RuleOC_NodePattern); size_t _la = 0; #if __cplusplus > 201703L @@ -8590,67 +8824,67 @@ CypherParser::OC_NodePatternContext* CypherParser::oC_NodePattern() { }); try { enterOuterAlt(_localctx, 1); - setState(1398); + setState(1435); match(CypherParser::T__1); - setState(1400); + setState(1437); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1399); + setState(1436); match(CypherParser::SP); } - setState(1406); + setState(1443); _errHandler->sync(this); _la = _input->LA(1); - if (((((_la - 47) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(1402); + if (((((_la - 49) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 49)) & 17826753) != 0) || ((((_la - 120) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 120)) & 302256385) != 0)) { + setState(1439); oC_Variable(); - setState(1404); + setState(1441); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1403); + setState(1440); match(CypherParser::SP); } } - setState(1412); + setState(1449); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::COLON) { - setState(1408); + setState(1445); oC_NodeLabels(); - setState(1410); + setState(1447); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1409); + setState(1446); match(CypherParser::SP); } } - setState(1418); + setState(1455); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__7) { - setState(1414); + setState(1451); kU_Properties(); - setState(1416); + setState(1453); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1415); + setState(1452); match(CypherParser::SP); } } - setState(1420); + setState(1457); match(CypherParser::T__3); } @@ -8689,7 +8923,7 @@ size_t CypherParser::OC_PatternElementChainContext::getRuleIndex() const { CypherParser::OC_PatternElementChainContext* CypherParser::oC_PatternElementChain() { OC_PatternElementChainContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 156, CypherParser::RuleOC_PatternElementChain); + enterRule(_localctx, 160, CypherParser::RuleOC_PatternElementChain); size_t _la = 0; #if __cplusplus > 201703L @@ -8701,17 +8935,17 @@ CypherParser::OC_PatternElementChainContext* CypherParser::oC_PatternElementChai }); try { enterOuterAlt(_localctx, 1); - setState(1422); + setState(1459); oC_RelationshipPattern(); - setState(1424); + setState(1461); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1423); + setState(1460); match(CypherParser::SP); } - setState(1426); + setState(1463); oC_NodePattern(); } @@ -8766,7 +9000,7 @@ size_t CypherParser::OC_RelationshipPatternContext::getRuleIndex() const { CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPattern() { OC_RelationshipPatternContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 158, CypherParser::RuleOC_RelationshipPattern); + enterRule(_localctx, 162, CypherParser::RuleOC_RelationshipPattern); size_t _la = 0; #if __cplusplus > 201703L @@ -8777,29 +9011,29 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter exitRule(); }); try { - setState(1472); + setState(1509); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 222, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 227, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1428); + setState(1465); oC_LeftArrowHead(); - setState(1430); + setState(1467); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1429); + setState(1466); match(CypherParser::SP); } - setState(1432); + setState(1469); oC_Dash(); - setState(1434); + setState(1471); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 212, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 217, _ctx)) { case 1: { - setState(1433); + setState(1470); match(CypherParser::SP); break; } @@ -8807,37 +9041,37 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter default: break; } - setState(1437); + setState(1474); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__5) { - setState(1436); + setState(1473); oC_RelationshipDetail(); } - setState(1440); + setState(1477); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1439); + setState(1476); match(CypherParser::SP); } - setState(1442); + setState(1479); oC_Dash(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1444); + setState(1481); oC_Dash(); - setState(1446); + setState(1483); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 215, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 220, _ctx)) { case 1: { - setState(1445); + setState(1482); match(CypherParser::SP); break; } @@ -8845,47 +9079,47 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter default: break; } - setState(1449); + setState(1486); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__5) { - setState(1448); + setState(1485); oC_RelationshipDetail(); } - setState(1452); + setState(1489); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1451); + setState(1488); match(CypherParser::SP); } - setState(1454); + setState(1491); oC_Dash(); - setState(1456); + setState(1493); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1455); + setState(1492); match(CypherParser::SP); } - setState(1458); + setState(1495); oC_RightArrowHead(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1460); + setState(1497); oC_Dash(); - setState(1462); + setState(1499); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 219, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 224, _ctx)) { case 1: { - setState(1461); + setState(1498); match(CypherParser::SP); break; } @@ -8893,23 +9127,23 @@ CypherParser::OC_RelationshipPatternContext* CypherParser::oC_RelationshipPatter default: break; } - setState(1465); + setState(1502); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__5) { - setState(1464); + setState(1501); oC_RelationshipDetail(); } - setState(1468); + setState(1505); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1467); + setState(1504); match(CypherParser::SP); } - setState(1470); + setState(1507); oC_Dash(); break; } @@ -8966,7 +9200,7 @@ size_t CypherParser::OC_RelationshipDetailContext::getRuleIndex() const { CypherParser::OC_RelationshipDetailContext* CypherParser::oC_RelationshipDetail() { OC_RelationshipDetailContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 160, CypherParser::RuleOC_RelationshipDetail); + enterRule(_localctx, 164, CypherParser::RuleOC_RelationshipDetail); size_t _la = 0; #if __cplusplus > 201703L @@ -8978,83 +9212,83 @@ CypherParser::OC_RelationshipDetailContext* CypherParser::oC_RelationshipDetail( }); try { enterOuterAlt(_localctx, 1); - setState(1474); + setState(1511); match(CypherParser::T__5); - setState(1476); + setState(1513); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1475); + setState(1512); match(CypherParser::SP); } - setState(1482); + setState(1519); _errHandler->sync(this); _la = _input->LA(1); - if (((((_la - 47) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(1478); + if (((((_la - 49) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 49)) & 17826753) != 0) || ((((_la - 120) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 120)) & 302256385) != 0)) { + setState(1515); oC_Variable(); - setState(1480); + setState(1517); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1479); + setState(1516); match(CypherParser::SP); } } - setState(1488); + setState(1525); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::COLON) { - setState(1484); + setState(1521); oC_RelationshipTypes(); - setState(1486); + setState(1523); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1485); + setState(1522); match(CypherParser::SP); } } - setState(1494); + setState(1531); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::STAR) { - setState(1490); + setState(1527); oC_RangeLiteral(); - setState(1492); + setState(1529); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1491); + setState(1528); match(CypherParser::SP); } } - setState(1500); + setState(1537); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__7) { - setState(1496); + setState(1533); kU_Properties(); - setState(1498); + setState(1535); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1497); + setState(1534); match(CypherParser::SP); } } - setState(1502); + setState(1539); match(CypherParser::T__6); } @@ -9113,7 +9347,7 @@ size_t CypherParser::KU_PropertiesContext::getRuleIndex() const { CypherParser::KU_PropertiesContext* CypherParser::kU_Properties() { KU_PropertiesContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 162, CypherParser::RuleKU_Properties); + enterRule(_localctx, 166, CypherParser::RuleKU_Properties); size_t _la = 0; #if __cplusplus > 201703L @@ -9125,103 +9359,103 @@ CypherParser::KU_PropertiesContext* CypherParser::kU_Properties() { }); try { enterOuterAlt(_localctx, 1); - setState(1504); + setState(1541); match(CypherParser::T__7); - setState(1506); + setState(1543); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1505); + setState(1542); match(CypherParser::SP); } - setState(1541); + setState(1578); _errHandler->sync(this); _la = _input->LA(1); - if (((((_la - 47) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 47)) & 17826753) != 0) || ((((_la - 118) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 118)) & 302256385) != 0)) { - setState(1508); + if (((((_la - 49) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 49)) & 17826753) != 0) || ((((_la - 120) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 120)) & 302256385) != 0)) { + setState(1545); oC_PropertyKeyName(); - setState(1510); + setState(1547); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1509); + setState(1546); match(CypherParser::SP); } - setState(1512); + setState(1549); match(CypherParser::COLON); - setState(1514); + setState(1551); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1513); + setState(1550); match(CypherParser::SP); } - setState(1516); + setState(1553); oC_Expression(); - setState(1518); + setState(1555); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1517); + setState(1554); match(CypherParser::SP); } - setState(1538); + setState(1575); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2) { - setState(1520); + setState(1557); match(CypherParser::T__2); - setState(1522); + setState(1559); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1521); + setState(1558); match(CypherParser::SP); } - setState(1524); + setState(1561); oC_PropertyKeyName(); - setState(1526); + setState(1563); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1525); + setState(1562); match(CypherParser::SP); } - setState(1528); + setState(1565); match(CypherParser::COLON); - setState(1530); + setState(1567); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1529); + setState(1566); match(CypherParser::SP); } - setState(1532); + setState(1569); oC_Expression(); - setState(1534); + setState(1571); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1533); + setState(1570); match(CypherParser::SP); } - setState(1540); + setState(1577); _errHandler->sync(this); _la = _input->LA(1); } } - setState(1543); + setState(1580); match(CypherParser::T__8); } @@ -9272,7 +9506,7 @@ size_t CypherParser::OC_RelationshipTypesContext::getRuleIndex() const { CypherParser::OC_RelationshipTypesContext* CypherParser::oC_RelationshipTypes() { OC_RelationshipTypesContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 164, CypherParser::RuleOC_RelationshipTypes); + enterRule(_localctx, 168, CypherParser::RuleOC_RelationshipTypes); size_t _la = 0; #if __cplusplus > 201703L @@ -9285,55 +9519,55 @@ CypherParser::OC_RelationshipTypesContext* CypherParser::oC_RelationshipTypes() try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1545); + setState(1582); match(CypherParser::COLON); - setState(1547); + setState(1584); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1546); + setState(1583); match(CypherParser::SP); } - setState(1549); + setState(1586); oC_RelTypeName(); - setState(1563); + setState(1600); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 246, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 251, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1551); + setState(1588); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1550); + setState(1587); match(CypherParser::SP); } - setState(1553); + setState(1590); match(CypherParser::T__9); - setState(1555); + setState(1592); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::COLON) { - setState(1554); + setState(1591); match(CypherParser::COLON); } - setState(1558); + setState(1595); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1557); + setState(1594); match(CypherParser::SP); } - setState(1560); + setState(1597); oC_RelTypeName(); } - setState(1565); + setState(1602); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 246, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 251, _ctx); } } @@ -9376,7 +9610,7 @@ size_t CypherParser::OC_NodeLabelsContext::getRuleIndex() const { CypherParser::OC_NodeLabelsContext* CypherParser::oC_NodeLabels() { OC_NodeLabelsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 166, CypherParser::RuleOC_NodeLabels); + enterRule(_localctx, 170, CypherParser::RuleOC_NodeLabels); size_t _la = 0; #if __cplusplus > 201703L @@ -9389,27 +9623,27 @@ CypherParser::OC_NodeLabelsContext* CypherParser::oC_NodeLabels() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1566); + setState(1603); oC_NodeLabel(); - setState(1573); + setState(1610); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 248, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 253, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1568); + setState(1605); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1567); + setState(1604); match(CypherParser::SP); } - setState(1570); + setState(1607); oC_NodeLabel(); } - setState(1575); + setState(1612); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 248, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 253, _ctx); } } @@ -9448,7 +9682,7 @@ size_t CypherParser::OC_NodeLabelContext::getRuleIndex() const { CypherParser::OC_NodeLabelContext* CypherParser::oC_NodeLabel() { OC_NodeLabelContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 168, CypherParser::RuleOC_NodeLabel); + enterRule(_localctx, 172, CypherParser::RuleOC_NodeLabel); size_t _la = 0; #if __cplusplus > 201703L @@ -9460,17 +9694,17 @@ CypherParser::OC_NodeLabelContext* CypherParser::oC_NodeLabel() { }); try { enterOuterAlt(_localctx, 1); - setState(1576); + setState(1613); match(CypherParser::COLON); - setState(1578); + setState(1615); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1577); + setState(1614); match(CypherParser::SP); } - setState(1580); + setState(1617); oC_LabelName(); } @@ -9533,7 +9767,7 @@ size_t CypherParser::OC_RangeLiteralContext::getRuleIndex() const { CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { OC_RangeLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 170, CypherParser::RuleOC_RangeLiteral); + enterRule(_localctx, 174, CypherParser::RuleOC_RangeLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -9545,14 +9779,14 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(1582); + setState(1619); match(CypherParser::STAR); - setState(1584); + setState(1621); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 250, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 255, _ctx)) { case 1: { - setState(1583); + setState(1620); match(CypherParser::SP); break; } @@ -9560,21 +9794,21 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1590); + setState(1627); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::SHORTEST: { - setState(1586); + setState(1623); match(CypherParser::SHORTEST); break; } case CypherParser::ALL: { - setState(1587); + setState(1624); match(CypherParser::ALL); - setState(1588); + setState(1625); match(CypherParser::SP); - setState(1589); + setState(1626); match(CypherParser::SHORTEST); break; } @@ -9591,12 +9825,12 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1593); + setState(1630); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 252, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 257, _ctx)) { case 1: { - setState(1592); + setState(1629); match(CypherParser::SP); break; } @@ -9604,35 +9838,35 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1609); + setState(1646); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 257, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 262, _ctx)) { case 1: { - setState(1596); + setState(1633); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DecimalInteger) { - setState(1595); + setState(1632); oC_LowerBound(); } - setState(1599); + setState(1636); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1598); + setState(1635); match(CypherParser::SP); } - setState(1601); + setState(1638); match(CypherParser::T__10); - setState(1603); + setState(1640); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 255, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 260, _ctx)) { case 1: { - setState(1602); + setState(1639); match(CypherParser::SP); break; } @@ -9640,19 +9874,19 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1606); + setState(1643); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DecimalInteger) { - setState(1605); + setState(1642); oC_UpperBound(); } break; } case 2: { - setState(1608); + setState(1645); oC_IntegerLiteral(); break; } @@ -9660,20 +9894,20 @@ CypherParser::OC_RangeLiteralContext* CypherParser::oC_RangeLiteral() { default: break; } - setState(1615); + setState(1652); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 259, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 264, _ctx)) { case 1: { - setState(1612); + setState(1649); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1611); + setState(1648); match(CypherParser::SP); } - setState(1614); + setState(1651); kU_RecursiveRelationshipComprehension(); break; } @@ -9734,7 +9968,7 @@ size_t CypherParser::KU_RecursiveRelationshipComprehensionContext::getRuleIndex( CypherParser::KU_RecursiveRelationshipComprehensionContext* CypherParser::kU_RecursiveRelationshipComprehension() { KU_RecursiveRelationshipComprehensionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 172, CypherParser::RuleKU_RecursiveRelationshipComprehension); + enterRule(_localctx, 176, CypherParser::RuleKU_RecursiveRelationshipComprehension); size_t _la = 0; #if __cplusplus > 201703L @@ -9746,62 +9980,62 @@ CypherParser::KU_RecursiveRelationshipComprehensionContext* CypherParser::kU_Rec }); try { enterOuterAlt(_localctx, 1); - setState(1617); + setState(1654); match(CypherParser::T__1); - setState(1619); + setState(1656); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1618); + setState(1655); match(CypherParser::SP); } - setState(1621); + setState(1658); oC_Variable(); - setState(1623); + setState(1660); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1622); + setState(1659); match(CypherParser::SP); } - setState(1625); + setState(1662); match(CypherParser::T__2); - setState(1627); + setState(1664); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1626); + setState(1663); match(CypherParser::SP); } - setState(1629); + setState(1666); oC_Variable(); - setState(1638); + setState(1675); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 265, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 270, _ctx)) { case 1: { - setState(1631); + setState(1668); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1630); + setState(1667); match(CypherParser::SP); } - setState(1633); + setState(1670); match(CypherParser::T__9); - setState(1635); + setState(1672); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1634); + setState(1671); match(CypherParser::SP); } - setState(1637); + setState(1674); oC_Where(); break; } @@ -9809,61 +10043,61 @@ CypherParser::KU_RecursiveRelationshipComprehensionContext* CypherParser::kU_Rec default: break; } - setState(1659); + setState(1696); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::T__9 || _la == CypherParser::SP) { - setState(1641); + setState(1678); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1640); + setState(1677); match(CypherParser::SP); } - setState(1643); + setState(1680); match(CypherParser::T__9); - setState(1645); + setState(1682); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1644); + setState(1681); match(CypherParser::SP); } - setState(1647); + setState(1684); kU_IntermediateRelProjectionItems(); - setState(1649); + setState(1686); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1648); + setState(1685); match(CypherParser::SP); } - setState(1651); + setState(1688); match(CypherParser::T__2); - setState(1653); + setState(1690); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1652); + setState(1689); match(CypherParser::SP); } - setState(1655); + setState(1692); kU_IntermediateNodeProjectionItems(); - setState(1657); + setState(1694); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1656); + setState(1693); match(CypherParser::SP); } } - setState(1661); + setState(1698); match(CypherParser::T__3); } @@ -9902,7 +10136,7 @@ size_t CypherParser::KU_IntermediateNodeProjectionItemsContext::getRuleIndex() c CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_IntermediateNodeProjectionItems() { KU_IntermediateNodeProjectionItemsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 174, CypherParser::RuleKU_IntermediateNodeProjectionItems); + enterRule(_localctx, 178, CypherParser::RuleKU_IntermediateNodeProjectionItems); size_t _la = 0; #if __cplusplus > 201703L @@ -9914,14 +10148,14 @@ CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_Interm }); try { enterOuterAlt(_localctx, 1); - setState(1663); + setState(1700); match(CypherParser::T__7); - setState(1665); + setState(1702); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 272, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 277, _ctx)) { case 1: { - setState(1664); + setState(1701); match(CypherParser::SP); break; } @@ -9929,26 +10163,26 @@ CypherParser::KU_IntermediateNodeProjectionItemsContext* CypherParser::kU_Interm default: break; } - setState(1668); + setState(1705); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139966783258607) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1667); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139966783258607) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(1704); oC_ProjectionItems(); } - setState(1671); + setState(1708); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1670); + setState(1707); match(CypherParser::SP); } - setState(1673); + setState(1710); match(CypherParser::T__8); } @@ -9987,7 +10221,7 @@ size_t CypherParser::KU_IntermediateRelProjectionItemsContext::getRuleIndex() co CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_IntermediateRelProjectionItems() { KU_IntermediateRelProjectionItemsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 176, CypherParser::RuleKU_IntermediateRelProjectionItems); + enterRule(_localctx, 180, CypherParser::RuleKU_IntermediateRelProjectionItems); size_t _la = 0; #if __cplusplus > 201703L @@ -9999,14 +10233,14 @@ CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_Interme }); try { enterOuterAlt(_localctx, 1); - setState(1675); + setState(1712); match(CypherParser::T__7); - setState(1677); + setState(1714); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 275, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 280, _ctx)) { case 1: { - setState(1676); + setState(1713); match(CypherParser::SP); break; } @@ -10014,26 +10248,26 @@ CypherParser::KU_IntermediateRelProjectionItemsContext* CypherParser::kU_Interme default: break; } - setState(1680); + setState(1717); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139966783258607) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1679); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139966783258607) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(1716); oC_ProjectionItems(); } - setState(1683); + setState(1720); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1682); + setState(1719); match(CypherParser::SP); } - setState(1685); + setState(1722); match(CypherParser::T__8); } @@ -10064,7 +10298,7 @@ size_t CypherParser::OC_LowerBoundContext::getRuleIndex() const { CypherParser::OC_LowerBoundContext* CypherParser::oC_LowerBound() { OC_LowerBoundContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 178, CypherParser::RuleOC_LowerBound); + enterRule(_localctx, 182, CypherParser::RuleOC_LowerBound); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10075,7 +10309,7 @@ CypherParser::OC_LowerBoundContext* CypherParser::oC_LowerBound() { }); try { enterOuterAlt(_localctx, 1); - setState(1687); + setState(1724); match(CypherParser::DecimalInteger); } @@ -10106,7 +10340,7 @@ size_t CypherParser::OC_UpperBoundContext::getRuleIndex() const { CypherParser::OC_UpperBoundContext* CypherParser::oC_UpperBound() { OC_UpperBoundContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 180, CypherParser::RuleOC_UpperBound); + enterRule(_localctx, 184, CypherParser::RuleOC_UpperBound); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10117,7 +10351,7 @@ CypherParser::OC_UpperBoundContext* CypherParser::oC_UpperBound() { }); try { enterOuterAlt(_localctx, 1); - setState(1689); + setState(1726); match(CypherParser::DecimalInteger); } @@ -10148,7 +10382,7 @@ size_t CypherParser::OC_LabelNameContext::getRuleIndex() const { CypherParser::OC_LabelNameContext* CypherParser::oC_LabelName() { OC_LabelNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 182, CypherParser::RuleOC_LabelName); + enterRule(_localctx, 186, CypherParser::RuleOC_LabelName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10159,7 +10393,7 @@ CypherParser::OC_LabelNameContext* CypherParser::oC_LabelName() { }); try { enterOuterAlt(_localctx, 1); - setState(1691); + setState(1728); oC_SchemaName(); } @@ -10190,7 +10424,7 @@ size_t CypherParser::OC_RelTypeNameContext::getRuleIndex() const { CypherParser::OC_RelTypeNameContext* CypherParser::oC_RelTypeName() { OC_RelTypeNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 184, CypherParser::RuleOC_RelTypeName); + enterRule(_localctx, 188, CypherParser::RuleOC_RelTypeName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10201,7 +10435,7 @@ CypherParser::OC_RelTypeNameContext* CypherParser::oC_RelTypeName() { }); try { enterOuterAlt(_localctx, 1); - setState(1693); + setState(1730); oC_SchemaName(); } @@ -10232,7 +10466,7 @@ size_t CypherParser::OC_ExpressionContext::getRuleIndex() const { CypherParser::OC_ExpressionContext* CypherParser::oC_Expression() { OC_ExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 186, CypherParser::RuleOC_Expression); + enterRule(_localctx, 190, CypherParser::RuleOC_Expression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10243,7 +10477,7 @@ CypherParser::OC_ExpressionContext* CypherParser::oC_Expression() { }); try { enterOuterAlt(_localctx, 1); - setState(1695); + setState(1732); oC_OrExpression(); } @@ -10294,7 +10528,7 @@ size_t CypherParser::OC_OrExpressionContext::getRuleIndex() const { CypherParser::OC_OrExpressionContext* CypherParser::oC_OrExpression() { OC_OrExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 188, CypherParser::RuleOC_OrExpression); + enterRule(_localctx, 192, CypherParser::RuleOC_OrExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10306,25 +10540,25 @@ CypherParser::OC_OrExpressionContext* CypherParser::oC_OrExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1697); + setState(1734); oC_XorExpression(); - setState(1704); + setState(1741); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 278, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 283, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1698); + setState(1735); match(CypherParser::SP); - setState(1699); + setState(1736); match(CypherParser::OR); - setState(1700); + setState(1737); match(CypherParser::SP); - setState(1701); + setState(1738); oC_XorExpression(); } - setState(1706); + setState(1743); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 278, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 283, _ctx); } } @@ -10375,7 +10609,7 @@ size_t CypherParser::OC_XorExpressionContext::getRuleIndex() const { CypherParser::OC_XorExpressionContext* CypherParser::oC_XorExpression() { OC_XorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 190, CypherParser::RuleOC_XorExpression); + enterRule(_localctx, 194, CypherParser::RuleOC_XorExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10387,25 +10621,25 @@ CypherParser::OC_XorExpressionContext* CypherParser::oC_XorExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1707); + setState(1744); oC_AndExpression(); - setState(1714); + setState(1751); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 279, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 284, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1708); + setState(1745); match(CypherParser::SP); - setState(1709); + setState(1746); match(CypherParser::XOR); - setState(1710); + setState(1747); match(CypherParser::SP); - setState(1711); + setState(1748); oC_AndExpression(); } - setState(1716); + setState(1753); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 279, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 284, _ctx); } } @@ -10456,7 +10690,7 @@ size_t CypherParser::OC_AndExpressionContext::getRuleIndex() const { CypherParser::OC_AndExpressionContext* CypherParser::oC_AndExpression() { OC_AndExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 192, CypherParser::RuleOC_AndExpression); + enterRule(_localctx, 196, CypherParser::RuleOC_AndExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10468,25 +10702,25 @@ CypherParser::OC_AndExpressionContext* CypherParser::oC_AndExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1717); + setState(1754); oC_NotExpression(); - setState(1724); + setState(1761); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 280, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 285, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1718); + setState(1755); match(CypherParser::SP); - setState(1719); + setState(1756); match(CypherParser::AND); - setState(1720); + setState(1757); match(CypherParser::SP); - setState(1721); + setState(1758); oC_NotExpression(); } - setState(1726); + setState(1763); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 280, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 285, _ctx); } } @@ -10533,7 +10767,7 @@ size_t CypherParser::OC_NotExpressionContext::getRuleIndex() const { CypherParser::OC_NotExpressionContext* CypherParser::oC_NotExpression() { OC_NotExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 194, CypherParser::RuleOC_NotExpression); + enterRule(_localctx, 198, CypherParser::RuleOC_NotExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10545,25 +10779,25 @@ CypherParser::OC_NotExpressionContext* CypherParser::oC_NotExpression() { }); try { enterOuterAlt(_localctx, 1); - setState(1733); + setState(1770); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::NOT) { - setState(1727); + setState(1764); match(CypherParser::NOT); - setState(1729); + setState(1766); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1728); + setState(1765); match(CypherParser::SP); } - setState(1735); + setState(1772); _errHandler->sync(this); _la = _input->LA(1); } - setState(1736); + setState(1773); oC_ComparisonExpression(); } @@ -10618,7 +10852,7 @@ size_t CypherParser::OC_ComparisonExpressionContext::getRuleIndex() const { CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpression() { OC_ComparisonExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 196, CypherParser::RuleOC_ComparisonExpression); + enterRule(_localctx, 200, CypherParser::RuleOC_ComparisonExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10630,37 +10864,37 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress }); try { size_t alt; - setState(1786); + setState(1823); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 293, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 298, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1738); + setState(1775); kU_BitwiseOrOperatorExpression(); - setState(1748); + setState(1785); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 285, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 290, _ctx)) { case 1: { - setState(1740); + setState(1777); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1739); + setState(1776); match(CypherParser::SP); } - setState(1742); + setState(1779); kU_ComparisonOperator(); - setState(1744); + setState(1781); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1743); + setState(1780); match(CypherParser::SP); } - setState(1746); + setState(1783); kU_BitwiseOrOperatorExpression(); break; } @@ -10673,28 +10907,28 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress case 2: { enterOuterAlt(_localctx, 2); - setState(1750); + setState(1787); kU_BitwiseOrOperatorExpression(); - setState(1752); + setState(1789); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1751); + setState(1788); match(CypherParser::SP); } - setState(1754); + setState(1791); antlrcpp::downCast(_localctx)->invalid_not_equalToken = match(CypherParser::INVALID_NOT_EQUAL); - setState(1756); + setState(1793); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1755); + setState(1792); match(CypherParser::SP); } - setState(1758); + setState(1795); kU_BitwiseOrOperatorExpression(); notifyInvalidNotEqualOperator(antlrcpp::downCast(_localctx)->invalid_not_equalToken); break; @@ -10702,53 +10936,53 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress case 3: { enterOuterAlt(_localctx, 3); - setState(1762); + setState(1799); kU_BitwiseOrOperatorExpression(); - setState(1764); + setState(1801); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1763); + setState(1800); match(CypherParser::SP); } - setState(1766); + setState(1803); kU_ComparisonOperator(); - setState(1768); + setState(1805); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1767); + setState(1804); match(CypherParser::SP); } - setState(1770); + setState(1807); kU_BitwiseOrOperatorExpression(); - setState(1780); + setState(1817); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(1772); + setState(1809); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1771); + setState(1808); match(CypherParser::SP); } - setState(1774); + setState(1811); kU_ComparisonOperator(); - setState(1776); + setState(1813); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1775); + setState(1812); match(CypherParser::SP); } - setState(1778); + setState(1815); kU_BitwiseOrOperatorExpression(); break; } @@ -10756,9 +10990,9 @@ CypherParser::OC_ComparisonExpressionContext* CypherParser::oC_ComparisonExpress default: throw NoViableAltException(this); } - setState(1782); + setState(1819); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 292, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 297, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); notifyNonBinaryComparison(_localctx->start); break; @@ -10792,7 +11026,7 @@ size_t CypherParser::KU_ComparisonOperatorContext::getRuleIndex() const { CypherParser::KU_ComparisonOperatorContext* CypherParser::kU_ComparisonOperator() { KU_ComparisonOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 198, CypherParser::RuleKU_ComparisonOperator); + enterRule(_localctx, 202, CypherParser::RuleKU_ComparisonOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -10804,7 +11038,7 @@ CypherParser::KU_ComparisonOperatorContext* CypherParser::kU_ComparisonOperator( }); try { enterOuterAlt(_localctx, 1); - setState(1788); + setState(1825); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 127008) != 0))) { @@ -10855,7 +11089,7 @@ size_t CypherParser::KU_BitwiseOrOperatorExpressionContext::getRuleIndex() const CypherParser::KU_BitwiseOrOperatorExpressionContext* CypherParser::kU_BitwiseOrOperatorExpression() { KU_BitwiseOrOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 200, CypherParser::RuleKU_BitwiseOrOperatorExpression); + enterRule(_localctx, 204, CypherParser::RuleKU_BitwiseOrOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10868,37 +11102,37 @@ CypherParser::KU_BitwiseOrOperatorExpressionContext* CypherParser::kU_BitwiseOrO try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1790); + setState(1827); kU_BitwiseAndOperatorExpression(); - setState(1801); + setState(1838); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 296, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 301, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1792); + setState(1829); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1791); + setState(1828); match(CypherParser::SP); } - setState(1794); + setState(1831); match(CypherParser::T__9); - setState(1796); + setState(1833); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1795); + setState(1832); match(CypherParser::SP); } - setState(1798); + setState(1835); kU_BitwiseAndOperatorExpression(); } - setState(1803); + setState(1840); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 296, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 301, _ctx); } } @@ -10941,7 +11175,7 @@ size_t CypherParser::KU_BitwiseAndOperatorExpressionContext::getRuleIndex() cons CypherParser::KU_BitwiseAndOperatorExpressionContext* CypherParser::kU_BitwiseAndOperatorExpression() { KU_BitwiseAndOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 202, CypherParser::RuleKU_BitwiseAndOperatorExpression); + enterRule(_localctx, 206, CypherParser::RuleKU_BitwiseAndOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -10954,37 +11188,37 @@ CypherParser::KU_BitwiseAndOperatorExpressionContext* CypherParser::kU_BitwiseAn try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1804); + setState(1841); kU_BitShiftOperatorExpression(); - setState(1815); + setState(1852); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 299, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 304, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1806); + setState(1843); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1805); + setState(1842); match(CypherParser::SP); } - setState(1808); + setState(1845); match(CypherParser::T__16); - setState(1810); + setState(1847); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1809); + setState(1846); match(CypherParser::SP); } - setState(1812); + setState(1849); kU_BitShiftOperatorExpression(); } - setState(1817); + setState(1854); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 299, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 304, _ctx); } } @@ -11035,7 +11269,7 @@ size_t CypherParser::KU_BitShiftOperatorExpressionContext::getRuleIndex() const CypherParser::KU_BitShiftOperatorExpressionContext* CypherParser::kU_BitShiftOperatorExpression() { KU_BitShiftOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 204, CypherParser::RuleKU_BitShiftOperatorExpression); + enterRule(_localctx, 208, CypherParser::RuleKU_BitShiftOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11048,37 +11282,37 @@ CypherParser::KU_BitShiftOperatorExpressionContext* CypherParser::kU_BitShiftOpe try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1818); + setState(1855); oC_AddOrSubtractExpression(); - setState(1830); + setState(1867); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 302, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 307, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1820); + setState(1857); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1819); + setState(1856); match(CypherParser::SP); } - setState(1822); + setState(1859); kU_BitShiftOperator(); - setState(1824); + setState(1861); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1823); + setState(1860); match(CypherParser::SP); } - setState(1826); + setState(1863); oC_AddOrSubtractExpression(); } - setState(1832); + setState(1869); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 302, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 307, _ctx); } } @@ -11105,7 +11339,7 @@ size_t CypherParser::KU_BitShiftOperatorContext::getRuleIndex() const { CypherParser::KU_BitShiftOperatorContext* CypherParser::kU_BitShiftOperator() { KU_BitShiftOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 206, CypherParser::RuleKU_BitShiftOperator); + enterRule(_localctx, 210, CypherParser::RuleKU_BitShiftOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -11117,7 +11351,7 @@ CypherParser::KU_BitShiftOperatorContext* CypherParser::kU_BitShiftOperator() { }); try { enterOuterAlt(_localctx, 1); - setState(1833); + setState(1870); _la = _input->LA(1); if (!(_la == CypherParser::T__17 @@ -11177,7 +11411,7 @@ size_t CypherParser::OC_AddOrSubtractExpressionContext::getRuleIndex() const { CypherParser::OC_AddOrSubtractExpressionContext* CypherParser::oC_AddOrSubtractExpression() { OC_AddOrSubtractExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 208, CypherParser::RuleOC_AddOrSubtractExpression); + enterRule(_localctx, 212, CypherParser::RuleOC_AddOrSubtractExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11190,37 +11424,37 @@ CypherParser::OC_AddOrSubtractExpressionContext* CypherParser::oC_AddOrSubtractE try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1835); + setState(1872); oC_MultiplyDivideModuloExpression(); - setState(1847); + setState(1884); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 305, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 310, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1837); + setState(1874); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1836); + setState(1873); match(CypherParser::SP); } - setState(1839); + setState(1876); kU_AddOrSubtractOperator(); - setState(1841); + setState(1878); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1840); + setState(1877); match(CypherParser::SP); } - setState(1843); + setState(1880); oC_MultiplyDivideModuloExpression(); } - setState(1849); + setState(1886); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 305, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 310, _ctx); } } @@ -11251,7 +11485,7 @@ size_t CypherParser::KU_AddOrSubtractOperatorContext::getRuleIndex() const { CypherParser::KU_AddOrSubtractOperatorContext* CypherParser::kU_AddOrSubtractOperator() { KU_AddOrSubtractOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 210, CypherParser::RuleKU_AddOrSubtractOperator); + enterRule(_localctx, 214, CypherParser::RuleKU_AddOrSubtractOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -11263,7 +11497,7 @@ CypherParser::KU_AddOrSubtractOperatorContext* CypherParser::kU_AddOrSubtractOpe }); try { enterOuterAlt(_localctx, 1); - setState(1850); + setState(1887); _la = _input->LA(1); if (!(_la == CypherParser::T__19 || _la == CypherParser::MINUS)) { _errHandler->recoverInline(this); @@ -11321,7 +11555,7 @@ size_t CypherParser::OC_MultiplyDivideModuloExpressionContext::getRuleIndex() co CypherParser::OC_MultiplyDivideModuloExpressionContext* CypherParser::oC_MultiplyDivideModuloExpression() { OC_MultiplyDivideModuloExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 212, CypherParser::RuleOC_MultiplyDivideModuloExpression); + enterRule(_localctx, 216, CypherParser::RuleOC_MultiplyDivideModuloExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11334,37 +11568,37 @@ CypherParser::OC_MultiplyDivideModuloExpressionContext* CypherParser::oC_Multipl try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1852); + setState(1889); oC_PowerOfExpression(); - setState(1864); + setState(1901); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 308, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 313, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1854); + setState(1891); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1853); + setState(1890); match(CypherParser::SP); } - setState(1856); + setState(1893); kU_MultiplyDivideModuloOperator(); - setState(1858); + setState(1895); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1857); + setState(1894); match(CypherParser::SP); } - setState(1860); + setState(1897); oC_PowerOfExpression(); } - setState(1866); + setState(1903); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 308, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 313, _ctx); } } @@ -11395,7 +11629,7 @@ size_t CypherParser::KU_MultiplyDivideModuloOperatorContext::getRuleIndex() cons CypherParser::KU_MultiplyDivideModuloOperatorContext* CypherParser::kU_MultiplyDivideModuloOperator() { KU_MultiplyDivideModuloOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 214, CypherParser::RuleKU_MultiplyDivideModuloOperator); + enterRule(_localctx, 218, CypherParser::RuleKU_MultiplyDivideModuloOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -11407,7 +11641,7 @@ CypherParser::KU_MultiplyDivideModuloOperatorContext* CypherParser::kU_MultiplyD }); try { enterOuterAlt(_localctx, 1); - setState(1867); + setState(1904); _la = _input->LA(1); if (!(_la == CypherParser::T__20 @@ -11459,7 +11693,7 @@ size_t CypherParser::OC_PowerOfExpressionContext::getRuleIndex() const { CypherParser::OC_PowerOfExpressionContext* CypherParser::oC_PowerOfExpression() { OC_PowerOfExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 216, CypherParser::RuleOC_PowerOfExpression); + enterRule(_localctx, 220, CypherParser::RuleOC_PowerOfExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11472,37 +11706,37 @@ CypherParser::OC_PowerOfExpressionContext* CypherParser::oC_PowerOfExpression() try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1869); + setState(1906); oC_UnaryAddSubtractOrFactorialExpression(); - setState(1880); + setState(1917); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 311, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 316, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1871); + setState(1908); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1870); + setState(1907); match(CypherParser::SP); } - setState(1873); + setState(1910); match(CypherParser::T__22); - setState(1875); + setState(1912); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1874); + setState(1911); match(CypherParser::SP); } - setState(1877); + setState(1914); oC_UnaryAddSubtractOrFactorialExpression(); } - setState(1882); + setState(1919); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 311, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 316, _ctx); } } @@ -11553,7 +11787,7 @@ size_t CypherParser::OC_UnaryAddSubtractOrFactorialExpressionContext::getRuleInd CypherParser::OC_UnaryAddSubtractOrFactorialExpressionContext* CypherParser::oC_UnaryAddSubtractOrFactorialExpression() { OC_UnaryAddSubtractOrFactorialExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 218, CypherParser::RuleOC_UnaryAddSubtractOrFactorialExpression); + enterRule(_localctx, 222, CypherParser::RuleOC_UnaryAddSubtractOrFactorialExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11565,40 +11799,40 @@ CypherParser::OC_UnaryAddSubtractOrFactorialExpressionContext* CypherParser::oC_ }); try { enterOuterAlt(_localctx, 1); - setState(1889); + setState(1926); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::MINUS) { - setState(1883); + setState(1920); match(CypherParser::MINUS); - setState(1885); + setState(1922); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1884); + setState(1921); match(CypherParser::SP); } - setState(1891); + setState(1928); _errHandler->sync(this); _la = _input->LA(1); } - setState(1892); + setState(1929); oC_StringListNullOperatorExpression(); - setState(1897); + setState(1934); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 315, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 320, _ctx)) { case 1: { - setState(1894); + setState(1931); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1893); + setState(1930); match(CypherParser::SP); } - setState(1896); + setState(1933); match(CypherParser::FACTORIAL); break; } @@ -11651,7 +11885,7 @@ size_t CypherParser::OC_StringListNullOperatorExpressionContext::getRuleIndex() CypherParser::OC_StringListNullOperatorExpressionContext* CypherParser::oC_StringListNullOperatorExpression() { OC_StringListNullOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 220, CypherParser::RuleOC_StringListNullOperatorExpression); + enterRule(_localctx, 224, CypherParser::RuleOC_StringListNullOperatorExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11663,26 +11897,26 @@ CypherParser::OC_StringListNullOperatorExpressionContext* CypherParser::oC_Strin try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1899); + setState(1936); oC_PropertyOrLabelsExpression(); - setState(1907); + setState(1944); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 317, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 322, _ctx)) { case 1: { - setState(1900); + setState(1937); oC_StringOperatorExpression(); break; } case 2: { - setState(1902); + setState(1939); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(1901); + setState(1938); oC_ListOperatorExpression(); break; } @@ -11690,15 +11924,15 @@ CypherParser::OC_StringListNullOperatorExpressionContext* CypherParser::oC_Strin default: throw NoViableAltException(this); } - setState(1904); + setState(1941); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 316, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 321, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); break; } case 3: { - setState(1906); + setState(1943); oC_NullOperatorExpression(); break; } @@ -11759,7 +11993,7 @@ size_t CypherParser::OC_ListOperatorExpressionContext::getRuleIndex() const { CypherParser::OC_ListOperatorExpressionContext* CypherParser::oC_ListOperatorExpression() { OC_ListOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 222, CypherParser::RuleOC_ListOperatorExpression); + enterRule(_localctx, 226, CypherParser::RuleOC_ListOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11770,68 +12004,68 @@ CypherParser::OC_ListOperatorExpressionContext* CypherParser::oC_ListOperatorExp exitRule(); }); try { - setState(1928); + setState(1965); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 321, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 326, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1909); + setState(1946); match(CypherParser::SP); - setState(1910); + setState(1947); match(CypherParser::IN); - setState(1912); + setState(1949); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1911); + setState(1948); match(CypherParser::SP); } - setState(1914); + setState(1951); oC_PropertyOrLabelsExpression(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1915); + setState(1952); match(CypherParser::T__5); - setState(1916); + setState(1953); oC_Expression(); - setState(1917); + setState(1954); match(CypherParser::T__6); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1919); + setState(1956); match(CypherParser::T__5); - setState(1921); + setState(1958); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1920); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139968930742255) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(1957); oC_Expression(); } - setState(1923); + setState(1960); match(CypherParser::COLON); - setState(1925); + setState(1962); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(1924); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139968930742255) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(1961); oC_Expression(); } - setState(1927); + setState(1964); match(CypherParser::T__6); break; } @@ -11896,7 +12130,7 @@ size_t CypherParser::OC_StringOperatorExpressionContext::getRuleIndex() const { CypherParser::OC_StringOperatorExpressionContext* CypherParser::oC_StringOperatorExpression() { OC_StringOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 224, CypherParser::RuleOC_StringOperatorExpression); + enterRule(_localctx, 228, CypherParser::RuleOC_StringOperatorExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -11908,43 +12142,43 @@ CypherParser::OC_StringOperatorExpressionContext* CypherParser::oC_StringOperato }); try { enterOuterAlt(_localctx, 1); - setState(1941); + setState(1978); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 322, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 327, _ctx)) { case 1: { - setState(1930); + setState(1967); oC_RegularExpression(); break; } case 2: { - setState(1931); + setState(1968); match(CypherParser::SP); - setState(1932); + setState(1969); match(CypherParser::STARTS); - setState(1933); + setState(1970); match(CypherParser::SP); - setState(1934); + setState(1971); match(CypherParser::WITH); break; } case 3: { - setState(1935); + setState(1972); match(CypherParser::SP); - setState(1936); + setState(1973); match(CypherParser::ENDS); - setState(1937); + setState(1974); match(CypherParser::SP); - setState(1938); + setState(1975); match(CypherParser::WITH); break; } case 4: { - setState(1939); + setState(1976); match(CypherParser::SP); - setState(1940); + setState(1977); match(CypherParser::CONTAINS); break; } @@ -11952,15 +12186,15 @@ CypherParser::OC_StringOperatorExpressionContext* CypherParser::oC_StringOperato default: break; } - setState(1944); + setState(1981); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1943); + setState(1980); match(CypherParser::SP); } - setState(1946); + setState(1983); oC_PropertyOrLabelsExpression(); } @@ -11991,7 +12225,7 @@ size_t CypherParser::OC_RegularExpressionContext::getRuleIndex() const { CypherParser::OC_RegularExpressionContext* CypherParser::oC_RegularExpression() { OC_RegularExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 226, CypherParser::RuleOC_RegularExpression); + enterRule(_localctx, 230, CypherParser::RuleOC_RegularExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -12003,15 +12237,15 @@ CypherParser::OC_RegularExpressionContext* CypherParser::oC_RegularExpression() }); try { enterOuterAlt(_localctx, 1); - setState(1949); + setState(1986); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1948); + setState(1985); match(CypherParser::SP); } - setState(1951); + setState(1988); match(CypherParser::T__23); } @@ -12058,7 +12292,7 @@ size_t CypherParser::OC_NullOperatorExpressionContext::getRuleIndex() const { CypherParser::OC_NullOperatorExpressionContext* CypherParser::oC_NullOperatorExpression() { OC_NullOperatorExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 228, CypherParser::RuleOC_NullOperatorExpression); + enterRule(_localctx, 232, CypherParser::RuleOC_NullOperatorExpression); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12068,35 +12302,35 @@ CypherParser::OC_NullOperatorExpressionContext* CypherParser::oC_NullOperatorExp exitRule(); }); try { - setState(1963); + setState(2000); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 325, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 330, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1953); + setState(1990); match(CypherParser::SP); - setState(1954); + setState(1991); match(CypherParser::IS); - setState(1955); + setState(1992); match(CypherParser::SP); - setState(1956); + setState(1993); match(CypherParser::NULL_); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1957); + setState(1994); match(CypherParser::SP); - setState(1958); + setState(1995); match(CypherParser::IS); - setState(1959); + setState(1996); match(CypherParser::SP); - setState(1960); + setState(1997); match(CypherParser::NOT); - setState(1961); + setState(1998); match(CypherParser::SP); - setState(1962); + setState(1999); match(CypherParser::NULL_); break; } @@ -12149,7 +12383,7 @@ size_t CypherParser::OC_PropertyOrLabelsExpressionContext::getRuleIndex() const CypherParser::OC_PropertyOrLabelsExpressionContext* CypherParser::oC_PropertyOrLabelsExpression() { OC_PropertyOrLabelsExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 230, CypherParser::RuleOC_PropertyOrLabelsExpression); + enterRule(_localctx, 234, CypherParser::RuleOC_PropertyOrLabelsExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -12162,27 +12396,27 @@ CypherParser::OC_PropertyOrLabelsExpressionContext* CypherParser::oC_PropertyOrL try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1965); + setState(2002); oC_Atom(); - setState(1972); + setState(2009); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 327, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 332, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1967); + setState(2004); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1966); + setState(2003); match(CypherParser::SP); } - setState(1969); + setState(2006); oC_PropertyLookup(); } - setState(1974); + setState(2011); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 327, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 332, _ctx); } } @@ -12245,7 +12479,7 @@ size_t CypherParser::OC_AtomContext::getRuleIndex() const { CypherParser::OC_AtomContext* CypherParser::oC_Atom() { OC_AtomContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 232, CypherParser::RuleOC_Atom); + enterRule(_localctx, 236, CypherParser::RuleOC_Atom); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12255,68 +12489,68 @@ CypherParser::OC_AtomContext* CypherParser::oC_Atom() { exitRule(); }); try { - setState(1984); + setState(2021); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 328, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 333, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1975); + setState(2012); oC_Literal(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1976); + setState(2013); oC_Parameter(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1977); + setState(2014); oC_CaseExpression(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(1978); + setState(2015); oC_ParenthesizedExpression(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(1979); + setState(2016); oC_FunctionInvocation(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(1980); + setState(2017); oC_PathPatterns(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(1981); + setState(2018); oC_ExistSubquery(); break; } case 8: { enterOuterAlt(_localctx, 8); - setState(1982); + setState(2019); kU_CountSubquery(); break; } case 9: { enterOuterAlt(_localctx, 9); - setState(1983); + setState(2020); oC_Variable(); break; } @@ -12373,7 +12607,7 @@ size_t CypherParser::OC_LiteralContext::getRuleIndex() const { CypherParser::OC_LiteralContext* CypherParser::oC_Literal() { OC_LiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 234, CypherParser::RuleOC_Literal); + enterRule(_localctx, 238, CypherParser::RuleOC_Literal); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12383,20 +12617,20 @@ CypherParser::OC_LiteralContext* CypherParser::oC_Literal() { exitRule(); }); try { - setState(1992); + setState(2029); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::DecimalInteger: case CypherParser::RegularDecimalReal: { enterOuterAlt(_localctx, 1); - setState(1986); + setState(2023); oC_NumberLiteral(); break; } case CypherParser::StringLiteral: { enterOuterAlt(_localctx, 2); - setState(1987); + setState(2024); match(CypherParser::StringLiteral); break; } @@ -12404,28 +12638,28 @@ CypherParser::OC_LiteralContext* CypherParser::oC_Literal() { case CypherParser::TRUE: case CypherParser::FALSE: { enterOuterAlt(_localctx, 3); - setState(1988); + setState(2025); oC_BooleanLiteral(); break; } case CypherParser::NULL_: { enterOuterAlt(_localctx, 4); - setState(1989); + setState(2026); match(CypherParser::NULL_); break; } case CypherParser::T__5: { enterOuterAlt(_localctx, 5); - setState(1990); + setState(2027); oC_ListLiteral(); break; } case CypherParser::T__7: { enterOuterAlt(_localctx, 6); - setState(1991); + setState(2028); kU_StructLiteral(); break; } @@ -12466,7 +12700,7 @@ size_t CypherParser::OC_BooleanLiteralContext::getRuleIndex() const { CypherParser::OC_BooleanLiteralContext* CypherParser::oC_BooleanLiteral() { OC_BooleanLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 236, CypherParser::RuleOC_BooleanLiteral); + enterRule(_localctx, 240, CypherParser::RuleOC_BooleanLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -12478,7 +12712,7 @@ CypherParser::OC_BooleanLiteralContext* CypherParser::oC_BooleanLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(1994); + setState(2031); _la = _input->LA(1); if (!(_la == CypherParser::TRUE @@ -12534,7 +12768,7 @@ size_t CypherParser::OC_ListLiteralContext::getRuleIndex() const { CypherParser::OC_ListLiteralContext* CypherParser::oC_ListLiteral() { OC_ListLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 238, CypherParser::RuleOC_ListLiteral); + enterRule(_localctx, 242, CypherParser::RuleOC_ListLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -12546,54 +12780,54 @@ CypherParser::OC_ListLiteralContext* CypherParser::oC_ListLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(1996); + setState(2033); match(CypherParser::T__5); - setState(1998); + setState(2035); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(1997); + setState(2034); match(CypherParser::SP); } - setState(2013); + setState(2050); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(2000); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139968930742255) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(2037); oC_Expression(); - setState(2002); + setState(2039); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2001); + setState(2038); match(CypherParser::SP); } - setState(2010); + setState(2047); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2) { - setState(2004); + setState(2041); kU_ListEntry(); - setState(2006); + setState(2043); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2005); + setState(2042); match(CypherParser::SP); } - setState(2012); + setState(2049); _errHandler->sync(this); _la = _input->LA(1); } } - setState(2015); + setState(2052); match(CypherParser::T__6); } @@ -12628,7 +12862,7 @@ size_t CypherParser::KU_ListEntryContext::getRuleIndex() const { CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { KU_ListEntryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 240, CypherParser::RuleKU_ListEntry); + enterRule(_localctx, 244, CypherParser::RuleKU_ListEntry); size_t _la = 0; #if __cplusplus > 201703L @@ -12640,14 +12874,14 @@ CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { }); try { enterOuterAlt(_localctx, 1); - setState(2017); + setState(2054); match(CypherParser::T__2); - setState(2019); + setState(2056); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 335, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 340, _ctx)) { case 1: { - setState(2018); + setState(2055); match(CypherParser::SP); break; } @@ -12655,15 +12889,15 @@ CypherParser::KU_ListEntryContext* CypherParser::kU_ListEntry() { default: break; } - setState(2022); + setState(2059); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(2021); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139968930742255) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(2058); oC_Expression(); } @@ -12707,7 +12941,7 @@ size_t CypherParser::KU_StructLiteralContext::getRuleIndex() const { CypherParser::KU_StructLiteralContext* CypherParser::kU_StructLiteral() { KU_StructLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 242, CypherParser::RuleKU_StructLiteral); + enterRule(_localctx, 246, CypherParser::RuleKU_StructLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -12719,55 +12953,55 @@ CypherParser::KU_StructLiteralContext* CypherParser::kU_StructLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2024); + setState(2061); match(CypherParser::T__7); - setState(2026); + setState(2063); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2025); + setState(2062); match(CypherParser::SP); } - setState(2028); + setState(2065); kU_StructField(); - setState(2030); + setState(2067); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2029); + setState(2066); match(CypherParser::SP); } - setState(2042); + setState(2079); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2) { - setState(2032); + setState(2069); match(CypherParser::T__2); - setState(2034); + setState(2071); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2033); + setState(2070); match(CypherParser::SP); } - setState(2036); + setState(2073); kU_StructField(); - setState(2038); + setState(2075); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2037); + setState(2074); match(CypherParser::SP); } - setState(2044); + setState(2081); _errHandler->sync(this); _la = _input->LA(1); } - setState(2045); + setState(2082); match(CypherParser::T__8); } @@ -12818,7 +13052,7 @@ size_t CypherParser::KU_StructFieldContext::getRuleIndex() const { CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { KU_StructFieldContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 244, CypherParser::RuleKU_StructField); + enterRule(_localctx, 248, CypherParser::RuleKU_StructField); size_t _la = 0; #if __cplusplus > 201703L @@ -12830,7 +13064,7 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { }); try { enterOuterAlt(_localctx, 1); - setState(2049); + setState(2086); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -12846,13 +13080,13 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(2047); + setState(2084); oC_SymbolicName(); break; } case CypherParser::StringLiteral: { - setState(2048); + setState(2085); match(CypherParser::StringLiteral); break; } @@ -12860,25 +13094,25 @@ CypherParser::KU_StructFieldContext* CypherParser::kU_StructField() { default: throw NoViableAltException(this); } - setState(2052); + setState(2089); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2051); + setState(2088); match(CypherParser::SP); } - setState(2054); + setState(2091); match(CypherParser::COLON); - setState(2056); + setState(2093); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2055); + setState(2092); match(CypherParser::SP); } - setState(2058); + setState(2095); oC_Expression(); } @@ -12917,7 +13151,7 @@ size_t CypherParser::OC_ParenthesizedExpressionContext::getRuleIndex() const { CypherParser::OC_ParenthesizedExpressionContext* CypherParser::oC_ParenthesizedExpression() { OC_ParenthesizedExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 246, CypherParser::RuleOC_ParenthesizedExpression); + enterRule(_localctx, 250, CypherParser::RuleOC_ParenthesizedExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -12929,27 +13163,27 @@ CypherParser::OC_ParenthesizedExpressionContext* CypherParser::oC_ParenthesizedE }); try { enterOuterAlt(_localctx, 1); - setState(2060); + setState(2097); match(CypherParser::T__1); - setState(2062); + setState(2099); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2061); + setState(2098); match(CypherParser::SP); } - setState(2064); + setState(2101); oC_Expression(); - setState(2066); + setState(2103); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2065); + setState(2102); match(CypherParser::SP); } - setState(2068); + setState(2105); match(CypherParser::T__3); } @@ -13008,7 +13242,7 @@ size_t CypherParser::OC_FunctionInvocationContext::getRuleIndex() const { CypherParser::OC_FunctionInvocationContext* CypherParser::oC_FunctionInvocation() { OC_FunctionInvocationContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 248, CypherParser::RuleOC_FunctionInvocation); + enterRule(_localctx, 252, CypherParser::RuleOC_FunctionInvocation); size_t _la = 0; #if __cplusplus > 201703L @@ -13019,132 +13253,132 @@ CypherParser::OC_FunctionInvocationContext* CypherParser::oC_FunctionInvocation( exitRule(); }); try { - setState(2118); + setState(2155); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 359, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 364, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(2070); + setState(2107); match(CypherParser::COUNT); - setState(2072); + setState(2109); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2071); + setState(2108); match(CypherParser::SP); } - setState(2074); + setState(2111); match(CypherParser::T__1); - setState(2076); + setState(2113); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2075); + setState(2112); match(CypherParser::SP); } - setState(2078); + setState(2115); match(CypherParser::STAR); - setState(2080); + setState(2117); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2079); + setState(2116); match(CypherParser::SP); } - setState(2082); + setState(2119); match(CypherParser::T__3); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(2083); + setState(2120); oC_FunctionName(); - setState(2085); + setState(2122); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2084); + setState(2121); match(CypherParser::SP); } - setState(2087); + setState(2124); match(CypherParser::T__1); - setState(2089); + setState(2126); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2088); + setState(2125); match(CypherParser::SP); } - setState(2095); + setState(2132); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::DISTINCT) { - setState(2091); + setState(2128); match(CypherParser::DISTINCT); - setState(2093); + setState(2130); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2092); + setState(2129); match(CypherParser::SP); } } - setState(2114); + setState(2151); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726376579396) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -4681139968930742255) != 0) || ((((_la - 133) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 133)) & 9741) != 0)) { - setState(2097); + ((1ULL << _la) & 540994905304990020) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -4681139968930742255) != 0) || ((((_la - 135) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 135)) & 9741) != 0)) { + setState(2134); kU_FunctionParameter(); - setState(2099); + setState(2136); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2098); + setState(2135); match(CypherParser::SP); } - setState(2111); + setState(2148); _errHandler->sync(this); _la = _input->LA(1); while (_la == CypherParser::T__2) { - setState(2101); + setState(2138); match(CypherParser::T__2); - setState(2103); + setState(2140); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2102); + setState(2139); match(CypherParser::SP); } - setState(2105); + setState(2142); kU_FunctionParameter(); - setState(2107); + setState(2144); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2106); + setState(2143); match(CypherParser::SP); } - setState(2113); + setState(2150); _errHandler->sync(this); _la = _input->LA(1); } } - setState(2116); + setState(2153); match(CypherParser::T__3); break; } @@ -13181,7 +13415,7 @@ size_t CypherParser::OC_FunctionNameContext::getRuleIndex() const { CypherParser::OC_FunctionNameContext* CypherParser::oC_FunctionName() { OC_FunctionNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 250, CypherParser::RuleOC_FunctionName); + enterRule(_localctx, 254, CypherParser::RuleOC_FunctionName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -13192,7 +13426,7 @@ CypherParser::OC_FunctionNameContext* CypherParser::oC_FunctionName() { }); try { enterOuterAlt(_localctx, 1); - setState(2120); + setState(2157); oC_SymbolicName(); } @@ -13239,7 +13473,7 @@ size_t CypherParser::KU_FunctionParameterContext::getRuleIndex() const { CypherParser::KU_FunctionParameterContext* CypherParser::kU_FunctionParameter() { KU_FunctionParameterContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 252, CypherParser::RuleKU_FunctionParameter); + enterRule(_localctx, 256, CypherParser::RuleKU_FunctionParameter); size_t _la = 0; #if __cplusplus > 201703L @@ -13251,31 +13485,31 @@ CypherParser::KU_FunctionParameterContext* CypherParser::kU_FunctionParameter() }); try { enterOuterAlt(_localctx, 1); - setState(2131); + setState(2168); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 362, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 367, _ctx)) { case 1: { - setState(2122); + setState(2159); oC_SymbolicName(); - setState(2124); + setState(2161); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2123); + setState(2160); match(CypherParser::SP); } - setState(2126); + setState(2163); match(CypherParser::COLON); - setState(2127); + setState(2164); match(CypherParser::T__4); - setState(2129); + setState(2166); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2128); + setState(2165); match(CypherParser::SP); } break; @@ -13284,7 +13518,7 @@ CypherParser::KU_FunctionParameterContext* CypherParser::kU_FunctionParameter() default: break; } - setState(2133); + setState(2170); oC_Expression(); } @@ -13331,7 +13565,7 @@ size_t CypherParser::OC_PathPatternsContext::getRuleIndex() const { CypherParser::OC_PathPatternsContext* CypherParser::oC_PathPatterns() { OC_PathPatternsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 254, CypherParser::RuleOC_PathPatterns); + enterRule(_localctx, 258, CypherParser::RuleOC_PathPatterns); size_t _la = 0; #if __cplusplus > 201703L @@ -13344,23 +13578,23 @@ CypherParser::OC_PathPatternsContext* CypherParser::oC_PathPatterns() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(2135); + setState(2172); oC_NodePattern(); - setState(2140); + setState(2177); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(2137); + setState(2174); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2136); + setState(2173); match(CypherParser::SP); } - setState(2139); + setState(2176); oC_PatternElementChain(); break; } @@ -13368,9 +13602,9 @@ CypherParser::OC_PathPatternsContext* CypherParser::oC_PathPatterns() { default: throw NoViableAltException(this); } - setState(2142); + setState(2179); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 364, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 369, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); } @@ -13421,7 +13655,7 @@ size_t CypherParser::OC_ExistSubqueryContext::getRuleIndex() const { CypherParser::OC_ExistSubqueryContext* CypherParser::oC_ExistSubquery() { OC_ExistSubqueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 256, CypherParser::RuleOC_ExistSubquery); + enterRule(_localctx, 260, CypherParser::RuleOC_ExistSubquery); size_t _la = 0; #if __cplusplus > 201703L @@ -13433,52 +13667,52 @@ CypherParser::OC_ExistSubqueryContext* CypherParser::oC_ExistSubquery() { }); try { enterOuterAlt(_localctx, 1); - setState(2144); + setState(2181); match(CypherParser::EXISTS); - setState(2146); + setState(2183); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2145); + setState(2182); match(CypherParser::SP); } - setState(2148); + setState(2185); match(CypherParser::T__7); - setState(2150); + setState(2187); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2149); + setState(2186); match(CypherParser::SP); } - setState(2152); + setState(2189); match(CypherParser::MATCH); - setState(2154); + setState(2191); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2153); + setState(2190); match(CypherParser::SP); } - setState(2156); + setState(2193); oC_Pattern(); - setState(2161); + setState(2198); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 369, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 374, _ctx)) { case 1: { - setState(2158); + setState(2195); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2157); + setState(2194); match(CypherParser::SP); } - setState(2160); + setState(2197); oC_Where(); break; } @@ -13486,15 +13720,15 @@ CypherParser::OC_ExistSubqueryContext* CypherParser::oC_ExistSubquery() { default: break; } - setState(2164); + setState(2201); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2163); + setState(2200); match(CypherParser::SP); } - setState(2166); + setState(2203); match(CypherParser::T__8); } @@ -13545,7 +13779,7 @@ size_t CypherParser::KU_CountSubqueryContext::getRuleIndex() const { CypherParser::KU_CountSubqueryContext* CypherParser::kU_CountSubquery() { KU_CountSubqueryContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 258, CypherParser::RuleKU_CountSubquery); + enterRule(_localctx, 262, CypherParser::RuleKU_CountSubquery); size_t _la = 0; #if __cplusplus > 201703L @@ -13557,52 +13791,52 @@ CypherParser::KU_CountSubqueryContext* CypherParser::kU_CountSubquery() { }); try { enterOuterAlt(_localctx, 1); - setState(2168); + setState(2205); match(CypherParser::COUNT); - setState(2170); + setState(2207); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2169); + setState(2206); match(CypherParser::SP); } - setState(2172); + setState(2209); match(CypherParser::T__7); - setState(2174); + setState(2211); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2173); + setState(2210); match(CypherParser::SP); } - setState(2176); + setState(2213); match(CypherParser::MATCH); - setState(2178); + setState(2215); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2177); + setState(2214); match(CypherParser::SP); } - setState(2180); + setState(2217); oC_Pattern(); - setState(2185); + setState(2222); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 375, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 380, _ctx)) { case 1: { - setState(2182); + setState(2219); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2181); + setState(2218); match(CypherParser::SP); } - setState(2184); + setState(2221); oC_Where(); break; } @@ -13610,15 +13844,15 @@ CypherParser::KU_CountSubqueryContext* CypherParser::kU_CountSubquery() { default: break; } - setState(2188); + setState(2225); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2187); + setState(2224); match(CypherParser::SP); } - setState(2190); + setState(2227); match(CypherParser::T__8); } @@ -13657,7 +13891,7 @@ size_t CypherParser::OC_PropertyLookupContext::getRuleIndex() const { CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { OC_PropertyLookupContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 260, CypherParser::RuleOC_PropertyLookup); + enterRule(_localctx, 264, CypherParser::RuleOC_PropertyLookup); size_t _la = 0; #if __cplusplus > 201703L @@ -13669,17 +13903,17 @@ CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { }); try { enterOuterAlt(_localctx, 1); - setState(2192); + setState(2229); match(CypherParser::T__24); - setState(2194); + setState(2231); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2193); + setState(2230); match(CypherParser::SP); } - setState(2198); + setState(2235); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -13695,13 +13929,13 @@ CypherParser::OC_PropertyLookupContext* CypherParser::oC_PropertyLookup() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(2196); + setState(2233); oC_PropertyKeyName(); break; } case CypherParser::STAR: { - setState(2197); + setState(2234); match(CypherParser::STAR); break; } @@ -13770,7 +14004,7 @@ size_t CypherParser::OC_CaseExpressionContext::getRuleIndex() const { CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { OC_CaseExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 262, CypherParser::RuleOC_CaseExpression); + enterRule(_localctx, 266, CypherParser::RuleOC_CaseExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -13783,27 +14017,27 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(2222); + setState(2259); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 384, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 389, _ctx)) { case 1: { - setState(2200); + setState(2237); match(CypherParser::CASE); - setState(2205); + setState(2242); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(2202); + setState(2239); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2201); + setState(2238); match(CypherParser::SP); } - setState(2204); + setState(2241); oC_CaseAlternative(); break; } @@ -13811,41 +14045,41 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: throw NoViableAltException(this); } - setState(2207); + setState(2244); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 380, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 385, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); break; } case 2: { - setState(2209); + setState(2246); match(CypherParser::CASE); - setState(2211); + setState(2248); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2210); + setState(2247); match(CypherParser::SP); } - setState(2213); + setState(2250); oC_Expression(); - setState(2218); + setState(2255); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(2215); + setState(2252); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2214); + setState(2251); match(CypherParser::SP); } - setState(2217); + setState(2254); oC_CaseAlternative(); break; } @@ -13853,9 +14087,9 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: throw NoViableAltException(this); } - setState(2220); + setState(2257); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 383, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 388, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); break; } @@ -13863,30 +14097,30 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: break; } - setState(2232); + setState(2269); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 387, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 392, _ctx)) { case 1: { - setState(2225); + setState(2262); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2224); + setState(2261); match(CypherParser::SP); } - setState(2227); + setState(2264); match(CypherParser::ELSE); - setState(2229); + setState(2266); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2228); + setState(2265); match(CypherParser::SP); } - setState(2231); + setState(2268); oC_Expression(); break; } @@ -13894,15 +14128,15 @@ CypherParser::OC_CaseExpressionContext* CypherParser::oC_CaseExpression() { default: break; } - setState(2235); + setState(2272); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2234); + setState(2271); match(CypherParser::SP); } - setState(2237); + setState(2274); match(CypherParser::END); } @@ -13953,7 +14187,7 @@ size_t CypherParser::OC_CaseAlternativeContext::getRuleIndex() const { CypherParser::OC_CaseAlternativeContext* CypherParser::oC_CaseAlternative() { OC_CaseAlternativeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 264, CypherParser::RuleOC_CaseAlternative); + enterRule(_localctx, 268, CypherParser::RuleOC_CaseAlternative); size_t _la = 0; #if __cplusplus > 201703L @@ -13965,37 +14199,37 @@ CypherParser::OC_CaseAlternativeContext* CypherParser::oC_CaseAlternative() { }); try { enterOuterAlt(_localctx, 1); - setState(2239); + setState(2276); match(CypherParser::WHEN); - setState(2241); + setState(2278); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2240); + setState(2277); match(CypherParser::SP); } - setState(2243); + setState(2280); oC_Expression(); - setState(2245); + setState(2282); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2244); + setState(2281); match(CypherParser::SP); } - setState(2247); + setState(2284); match(CypherParser::THEN); - setState(2249); + setState(2286); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2248); + setState(2285); match(CypherParser::SP); } - setState(2251); + setState(2288); oC_Expression(); } @@ -14026,7 +14260,7 @@ size_t CypherParser::OC_VariableContext::getRuleIndex() const { CypherParser::OC_VariableContext* CypherParser::oC_Variable() { OC_VariableContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 266, CypherParser::RuleOC_Variable); + enterRule(_localctx, 270, CypherParser::RuleOC_Variable); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14037,7 +14271,7 @@ CypherParser::OC_VariableContext* CypherParser::oC_Variable() { }); try { enterOuterAlt(_localctx, 1); - setState(2253); + setState(2290); oC_SymbolicName(); } @@ -14072,7 +14306,7 @@ size_t CypherParser::OC_NumberLiteralContext::getRuleIndex() const { CypherParser::OC_NumberLiteralContext* CypherParser::oC_NumberLiteral() { OC_NumberLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 268, CypherParser::RuleOC_NumberLiteral); + enterRule(_localctx, 272, CypherParser::RuleOC_NumberLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14082,19 +14316,19 @@ CypherParser::OC_NumberLiteralContext* CypherParser::oC_NumberLiteral() { exitRule(); }); try { - setState(2257); + setState(2294); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::RegularDecimalReal: { enterOuterAlt(_localctx, 1); - setState(2255); + setState(2292); oC_DoubleLiteral(); break; } case CypherParser::DecimalInteger: { enterOuterAlt(_localctx, 2); - setState(2256); + setState(2293); oC_IntegerLiteral(); break; } @@ -14135,7 +14369,7 @@ size_t CypherParser::OC_ParameterContext::getRuleIndex() const { CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { OC_ParameterContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 270, CypherParser::RuleOC_Parameter); + enterRule(_localctx, 274, CypherParser::RuleOC_Parameter); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14146,9 +14380,9 @@ CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { }); try { enterOuterAlt(_localctx, 1); - setState(2259); + setState(2296); match(CypherParser::T__25); - setState(2262); + setState(2299); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::COMMENT_: @@ -14164,13 +14398,13 @@ CypherParser::OC_ParameterContext* CypherParser::oC_Parameter() { case CypherParser::HexLetter: case CypherParser::UnescapedSymbolicName: case CypherParser::EscapedSymbolicName: { - setState(2260); + setState(2297); oC_SymbolicName(); break; } case CypherParser::DecimalInteger: { - setState(2261); + setState(2298); match(CypherParser::DecimalInteger); break; } @@ -14215,7 +14449,7 @@ size_t CypherParser::OC_PropertyExpressionContext::getRuleIndex() const { CypherParser::OC_PropertyExpressionContext* CypherParser::oC_PropertyExpression() { OC_PropertyExpressionContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 272, CypherParser::RuleOC_PropertyExpression); + enterRule(_localctx, 276, CypherParser::RuleOC_PropertyExpression); size_t _la = 0; #if __cplusplus > 201703L @@ -14227,17 +14461,17 @@ CypherParser::OC_PropertyExpressionContext* CypherParser::oC_PropertyExpression( }); try { enterOuterAlt(_localctx, 1); - setState(2264); + setState(2301); oC_Atom(); - setState(2266); + setState(2303); _errHandler->sync(this); _la = _input->LA(1); if (_la == CypherParser::SP) { - setState(2265); + setState(2302); match(CypherParser::SP); } - setState(2268); + setState(2305); oC_PropertyLookup(); } @@ -14268,7 +14502,7 @@ size_t CypherParser::OC_PropertyKeyNameContext::getRuleIndex() const { CypherParser::OC_PropertyKeyNameContext* CypherParser::oC_PropertyKeyName() { OC_PropertyKeyNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 274, CypherParser::RuleOC_PropertyKeyName); + enterRule(_localctx, 278, CypherParser::RuleOC_PropertyKeyName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14279,7 +14513,7 @@ CypherParser::OC_PropertyKeyNameContext* CypherParser::oC_PropertyKeyName() { }); try { enterOuterAlt(_localctx, 1); - setState(2270); + setState(2307); oC_SchemaName(); } @@ -14310,7 +14544,7 @@ size_t CypherParser::OC_IntegerLiteralContext::getRuleIndex() const { CypherParser::OC_IntegerLiteralContext* CypherParser::oC_IntegerLiteral() { OC_IntegerLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 276, CypherParser::RuleOC_IntegerLiteral); + enterRule(_localctx, 280, CypherParser::RuleOC_IntegerLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14321,7 +14555,7 @@ CypherParser::OC_IntegerLiteralContext* CypherParser::oC_IntegerLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2272); + setState(2309); match(CypherParser::DecimalInteger); } @@ -14352,7 +14586,7 @@ size_t CypherParser::OC_DoubleLiteralContext::getRuleIndex() const { CypherParser::OC_DoubleLiteralContext* CypherParser::oC_DoubleLiteral() { OC_DoubleLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 278, CypherParser::RuleOC_DoubleLiteral); + enterRule(_localctx, 282, CypherParser::RuleOC_DoubleLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14363,7 +14597,7 @@ CypherParser::OC_DoubleLiteralContext* CypherParser::oC_DoubleLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(2274); + setState(2311); match(CypherParser::RegularDecimalReal); } @@ -14394,7 +14628,7 @@ size_t CypherParser::OC_SchemaNameContext::getRuleIndex() const { CypherParser::OC_SchemaNameContext* CypherParser::oC_SchemaName() { OC_SchemaNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 280, CypherParser::RuleOC_SchemaName); + enterRule(_localctx, 284, CypherParser::RuleOC_SchemaName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14405,7 +14639,7 @@ CypherParser::OC_SchemaNameContext* CypherParser::oC_SchemaName() { }); try { enterOuterAlt(_localctx, 1); - setState(2276); + setState(2313); oC_SymbolicName(); } @@ -14448,7 +14682,7 @@ size_t CypherParser::OC_SymbolicNameContext::getRuleIndex() const { CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { OC_SymbolicNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 282, CypherParser::RuleOC_SymbolicName); + enterRule(_localctx, 286, CypherParser::RuleOC_SymbolicName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -14458,19 +14692,19 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { exitRule(); }); try { - setState(2283); + setState(2320); _errHandler->sync(this); switch (_input->LA(1)) { case CypherParser::UnescapedSymbolicName: { enterOuterAlt(_localctx, 1); - setState(2278); + setState(2315); match(CypherParser::UnescapedSymbolicName); break; } case CypherParser::EscapedSymbolicName: { enterOuterAlt(_localctx, 2); - setState(2279); + setState(2316); antlrcpp::downCast(_localctx)->escapedsymbolicnameToken = match(CypherParser::EscapedSymbolicName); if ((antlrcpp::downCast(_localctx)->escapedsymbolicnameToken != nullptr ? antlrcpp::downCast(_localctx)->escapedsymbolicnameToken->getText() : "") == "``") { notifyEmptyToken(antlrcpp::downCast(_localctx)->escapedsymbolicnameToken); } break; @@ -14478,7 +14712,7 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { case CypherParser::HexLetter: { enterOuterAlt(_localctx, 3); - setState(2281); + setState(2318); match(CypherParser::HexLetter); break; } @@ -14494,7 +14728,7 @@ CypherParser::OC_SymbolicNameContext* CypherParser::oC_SymbolicName() { case CypherParser::COUNT: case CypherParser::END: { enterOuterAlt(_localctx, 4); - setState(2282); + setState(2319); kU_NonReservedKeywords(); break; } @@ -14567,7 +14801,7 @@ size_t CypherParser::KU_NonReservedKeywordsContext::getRuleIndex() const { CypherParser::KU_NonReservedKeywordsContext* CypherParser::kU_NonReservedKeywords() { KU_NonReservedKeywordsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 284, CypherParser::RuleKU_NonReservedKeywords); + enterRule(_localctx, 288, CypherParser::RuleKU_NonReservedKeywords); size_t _la = 0; #if __cplusplus > 201703L @@ -14579,11 +14813,11 @@ CypherParser::KU_NonReservedKeywordsContext* CypherParser::kU_NonReservedKeyword }); try { enterOuterAlt(_localctx, 1); - setState(2285); + setState(2322); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 135248726309470208) != 0) || ((((_la - 67) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 67)) & -8644659484737667055) != 0))) { + ((1ULL << _la) & 540994905237880832) != 0) || ((((_la - 69) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 69)) & -8644659484737667055) != 0))) { _errHandler->recoverInline(this); } else { @@ -14615,7 +14849,7 @@ size_t CypherParser::OC_LeftArrowHeadContext::getRuleIndex() const { CypherParser::OC_LeftArrowHeadContext* CypherParser::oC_LeftArrowHead() { OC_LeftArrowHeadContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 286, CypherParser::RuleOC_LeftArrowHead); + enterRule(_localctx, 290, CypherParser::RuleOC_LeftArrowHead); size_t _la = 0; #if __cplusplus > 201703L @@ -14627,7 +14861,7 @@ CypherParser::OC_LeftArrowHeadContext* CypherParser::oC_LeftArrowHead() { }); try { enterOuterAlt(_localctx, 1); - setState(2287); + setState(2324); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 2013274112) != 0))) { @@ -14662,7 +14896,7 @@ size_t CypherParser::OC_RightArrowHeadContext::getRuleIndex() const { CypherParser::OC_RightArrowHeadContext* CypherParser::oC_RightArrowHead() { OC_RightArrowHeadContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 288, CypherParser::RuleOC_RightArrowHead); + enterRule(_localctx, 292, CypherParser::RuleOC_RightArrowHead); size_t _la = 0; #if __cplusplus > 201703L @@ -14674,7 +14908,7 @@ CypherParser::OC_RightArrowHeadContext* CypherParser::oC_RightArrowHead() { }); try { enterOuterAlt(_localctx, 1); - setState(2289); + setState(2326); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 32212287488) != 0))) { @@ -14713,7 +14947,7 @@ size_t CypherParser::OC_DashContext::getRuleIndex() const { CypherParser::OC_DashContext* CypherParser::oC_Dash() { OC_DashContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 290, CypherParser::RuleOC_Dash); + enterRule(_localctx, 294, CypherParser::RuleOC_Dash); size_t _la = 0; #if __cplusplus > 201703L @@ -14725,7 +14959,7 @@ CypherParser::OC_DashContext* CypherParser::oC_Dash() { }); try { enterOuterAlt(_localctx, 1); - setState(2291); + setState(2328); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 70334384439296) != 0) || _la == CypherParser::MINUS)) { @@ -14748,7 +14982,7 @@ CypherParser::OC_DashContext* CypherParser::oC_Dash() { bool CypherParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) { switch (ruleIndex) { - case 34: return kU_DataTypeSempred(antlrcpp::downCast(context), predicateIndex); + case 36: return kU_DataTypeSempred(antlrcpp::downCast(context), predicateIndex); default: break; diff --git a/third_party/antlr4_cypher/include/cypher_lexer.h b/third_party/antlr4_cypher/include/cypher_lexer.h index ff904a1f414..d34c0d3a312 100644 --- a/third_party/antlr4_cypher/include/cypher_lexer.h +++ b/third_party/antlr4_cypher/include/cypher_lexer.h @@ -19,26 +19,27 @@ class CypherLexer : public antlr4::Lexer { T__26 = 27, T__27 = 28, T__28 = 29, T__29 = 30, T__30 = 31, T__31 = 32, T__32 = 33, T__33 = 34, T__34 = 35, T__35 = 36, T__36 = 37, T__37 = 38, T__38 = 39, T__39 = 40, T__40 = 41, T__41 = 42, T__42 = 43, T__43 = 44, - T__44 = 45, CALL = 46, COMMENT_ = 47, MACRO = 48, GLOB = 49, COPY = 50, - FROM = 51, COLUMN = 52, EXPORT = 53, IMPORT = 54, DATABASE = 55, NODE = 56, - TABLE = 57, GROUP = 58, RDFGRAPH = 59, DROP = 60, ALTER = 61, DEFAULT = 62, - RENAME = 63, ADD = 64, PRIMARY = 65, KEY = 66, REL = 67, TO = 68, EXPLAIN = 69, - PROFILE = 70, BEGIN = 71, TRANSACTION = 72, READ = 73, ONLY = 74, WRITE = 75, - COMMIT = 76, COMMIT_SKIP_CHECKPOINT = 77, ROLLBACK = 78, ROLLBACK_SKIP_CHECKPOINT = 79, - INSTALL = 80, EXTENSION = 81, UNION = 82, ALL = 83, LOAD = 84, HEADERS = 85, - OPTIONAL = 86, MATCH = 87, UNWIND = 88, CREATE = 89, MERGE = 90, ON = 91, - SET = 92, DETACH = 93, DELETE = 94, WITH = 95, RETURN = 96, DISTINCT = 97, - STAR = 98, AS = 99, ORDER = 100, BY = 101, L_SKIP = 102, LIMIT = 103, - ASCENDING = 104, ASC = 105, DESCENDING = 106, DESC = 107, WHERE = 108, - SHORTEST = 109, OR = 110, XOR = 111, AND = 112, NOT = 113, INVALID_NOT_EQUAL = 114, - MINUS = 115, FACTORIAL = 116, COLON = 117, IN = 118, STARTS = 119, ENDS = 120, - CONTAINS = 121, IS = 122, NULL_ = 123, TRUE = 124, FALSE = 125, COUNT = 126, - EXISTS = 127, CASE = 128, ELSE = 129, END = 130, WHEN = 131, THEN = 132, - StringLiteral = 133, EscapedChar = 134, DecimalInteger = 135, HexLetter = 136, - HexDigit = 137, Digit = 138, NonZeroDigit = 139, NonZeroOctDigit = 140, - ZeroDigit = 141, RegularDecimalReal = 142, UnescapedSymbolicName = 143, - IdentifierStart = 144, IdentifierPart = 145, EscapedSymbolicName = 146, - SP = 147, WHITESPACE = 148, Comment = 149, Unknown = 150 + T__44 = 45, ATTACH = 46, DBTYPE = 47, CALL = 48, COMMENT_ = 49, MACRO = 50, + GLOB = 51, COPY = 52, FROM = 53, COLUMN = 54, EXPORT = 55, IMPORT = 56, + DATABASE = 57, NODE = 58, TABLE = 59, GROUP = 60, RDFGRAPH = 61, DROP = 62, + ALTER = 63, DEFAULT = 64, RENAME = 65, ADD = 66, PRIMARY = 67, KEY = 68, + REL = 69, TO = 70, EXPLAIN = 71, PROFILE = 72, BEGIN = 73, TRANSACTION = 74, + READ = 75, ONLY = 76, WRITE = 77, COMMIT = 78, COMMIT_SKIP_CHECKPOINT = 79, + ROLLBACK = 80, ROLLBACK_SKIP_CHECKPOINT = 81, INSTALL = 82, EXTENSION = 83, + UNION = 84, ALL = 85, LOAD = 86, HEADERS = 87, OPTIONAL = 88, MATCH = 89, + UNWIND = 90, CREATE = 91, MERGE = 92, ON = 93, SET = 94, DETACH = 95, + DELETE = 96, WITH = 97, RETURN = 98, DISTINCT = 99, STAR = 100, AS = 101, + ORDER = 102, BY = 103, L_SKIP = 104, LIMIT = 105, ASCENDING = 106, ASC = 107, + DESCENDING = 108, DESC = 109, WHERE = 110, SHORTEST = 111, OR = 112, + XOR = 113, AND = 114, NOT = 115, INVALID_NOT_EQUAL = 116, MINUS = 117, + FACTORIAL = 118, COLON = 119, IN = 120, STARTS = 121, ENDS = 122, CONTAINS = 123, + IS = 124, NULL_ = 125, TRUE = 126, FALSE = 127, COUNT = 128, EXISTS = 129, + CASE = 130, ELSE = 131, END = 132, WHEN = 133, THEN = 134, StringLiteral = 135, + EscapedChar = 136, DecimalInteger = 137, HexLetter = 138, HexDigit = 139, + Digit = 140, NonZeroDigit = 141, NonZeroOctDigit = 142, ZeroDigit = 143, + RegularDecimalReal = 144, UnescapedSymbolicName = 145, IdentifierStart = 146, + IdentifierPart = 147, EscapedSymbolicName = 148, SP = 149, WHITESPACE = 150, + Comment = 151, Unknown = 152 }; explicit CypherLexer(antlr4::CharStream *input); diff --git a/third_party/antlr4_cypher/include/cypher_parser.h b/third_party/antlr4_cypher/include/cypher_parser.h index a92c4ae3bb9..64ea634c38a 100644 --- a/third_party/antlr4_cypher/include/cypher_parser.h +++ b/third_party/antlr4_cypher/include/cypher_parser.h @@ -19,79 +19,81 @@ class CypherParser : public antlr4::Parser { T__26 = 27, T__27 = 28, T__28 = 29, T__29 = 30, T__30 = 31, T__31 = 32, T__32 = 33, T__33 = 34, T__34 = 35, T__35 = 36, T__36 = 37, T__37 = 38, T__38 = 39, T__39 = 40, T__40 = 41, T__41 = 42, T__42 = 43, T__43 = 44, - T__44 = 45, CALL = 46, COMMENT_ = 47, MACRO = 48, GLOB = 49, COPY = 50, - FROM = 51, COLUMN = 52, EXPORT = 53, IMPORT = 54, DATABASE = 55, NODE = 56, - TABLE = 57, GROUP = 58, RDFGRAPH = 59, DROP = 60, ALTER = 61, DEFAULT = 62, - RENAME = 63, ADD = 64, PRIMARY = 65, KEY = 66, REL = 67, TO = 68, EXPLAIN = 69, - PROFILE = 70, BEGIN = 71, TRANSACTION = 72, READ = 73, ONLY = 74, WRITE = 75, - COMMIT = 76, COMMIT_SKIP_CHECKPOINT = 77, ROLLBACK = 78, ROLLBACK_SKIP_CHECKPOINT = 79, - INSTALL = 80, EXTENSION = 81, UNION = 82, ALL = 83, LOAD = 84, HEADERS = 85, - OPTIONAL = 86, MATCH = 87, UNWIND = 88, CREATE = 89, MERGE = 90, ON = 91, - SET = 92, DETACH = 93, DELETE = 94, WITH = 95, RETURN = 96, DISTINCT = 97, - STAR = 98, AS = 99, ORDER = 100, BY = 101, L_SKIP = 102, LIMIT = 103, - ASCENDING = 104, ASC = 105, DESCENDING = 106, DESC = 107, WHERE = 108, - SHORTEST = 109, OR = 110, XOR = 111, AND = 112, NOT = 113, INVALID_NOT_EQUAL = 114, - MINUS = 115, FACTORIAL = 116, COLON = 117, IN = 118, STARTS = 119, ENDS = 120, - CONTAINS = 121, IS = 122, NULL_ = 123, TRUE = 124, FALSE = 125, COUNT = 126, - EXISTS = 127, CASE = 128, ELSE = 129, END = 130, WHEN = 131, THEN = 132, - StringLiteral = 133, EscapedChar = 134, DecimalInteger = 135, HexLetter = 136, - HexDigit = 137, Digit = 138, NonZeroDigit = 139, NonZeroOctDigit = 140, - ZeroDigit = 141, RegularDecimalReal = 142, UnescapedSymbolicName = 143, - IdentifierStart = 144, IdentifierPart = 145, EscapedSymbolicName = 146, - SP = 147, WHITESPACE = 148, Comment = 149, Unknown = 150 + T__44 = 45, ATTACH = 46, DBTYPE = 47, CALL = 48, COMMENT_ = 49, MACRO = 50, + GLOB = 51, COPY = 52, FROM = 53, COLUMN = 54, EXPORT = 55, IMPORT = 56, + DATABASE = 57, NODE = 58, TABLE = 59, GROUP = 60, RDFGRAPH = 61, DROP = 62, + ALTER = 63, DEFAULT = 64, RENAME = 65, ADD = 66, PRIMARY = 67, KEY = 68, + REL = 69, TO = 70, EXPLAIN = 71, PROFILE = 72, BEGIN = 73, TRANSACTION = 74, + READ = 75, ONLY = 76, WRITE = 77, COMMIT = 78, COMMIT_SKIP_CHECKPOINT = 79, + ROLLBACK = 80, ROLLBACK_SKIP_CHECKPOINT = 81, INSTALL = 82, EXTENSION = 83, + UNION = 84, ALL = 85, LOAD = 86, HEADERS = 87, OPTIONAL = 88, MATCH = 89, + UNWIND = 90, CREATE = 91, MERGE = 92, ON = 93, SET = 94, DETACH = 95, + DELETE = 96, WITH = 97, RETURN = 98, DISTINCT = 99, STAR = 100, AS = 101, + ORDER = 102, BY = 103, L_SKIP = 104, LIMIT = 105, ASCENDING = 106, ASC = 107, + DESCENDING = 108, DESC = 109, WHERE = 110, SHORTEST = 111, OR = 112, + XOR = 113, AND = 114, NOT = 115, INVALID_NOT_EQUAL = 116, MINUS = 117, + FACTORIAL = 118, COLON = 119, IN = 120, STARTS = 121, ENDS = 122, CONTAINS = 123, + IS = 124, NULL_ = 125, TRUE = 126, FALSE = 127, COUNT = 128, EXISTS = 129, + CASE = 130, ELSE = 131, END = 132, WHEN = 133, THEN = 134, StringLiteral = 135, + EscapedChar = 136, DecimalInteger = 137, HexLetter = 138, HexDigit = 139, + Digit = 140, NonZeroDigit = 141, NonZeroOctDigit = 142, ZeroDigit = 143, + RegularDecimalReal = 144, UnescapedSymbolicName = 145, IdentifierStart = 146, + IdentifierPart = 147, EscapedSymbolicName = 148, SP = 149, WHITESPACE = 150, + Comment = 151, Unknown = 152 }; enum { RuleKu_Statements = 0, RuleOC_Cypher = 1, RuleOC_Statement = 2, RuleKU_CopyFrom = 3, RuleKU_ColumnNames = 4, RuleKU_ScanSource = 5, RuleKU_CopyFromByColumn = 6, RuleKU_CopyTO = 7, RuleKU_ExportDatabase = 8, RuleKU_ImportDatabase = 9, - RuleKU_StandaloneCall = 10, RuleKU_CommentOn = 11, RuleKU_CreateMacro = 12, - RuleKU_PositionalArgs = 13, RuleKU_DefaultArg = 14, RuleKU_FilePaths = 15, - RuleKU_ParsingOptions = 16, RuleKU_ParsingOption = 17, RuleKU_DDL = 18, - RuleKU_CreateNodeTable = 19, RuleKU_CreateRelTable = 20, RuleKU_CreateRelTableGroup = 21, - RuleKU_RelTableConnection = 22, RuleKU_CreateRdfGraph = 23, RuleKU_DropTable = 24, - RuleKU_AlterTable = 25, RuleKU_AlterOptions = 26, RuleKU_AddProperty = 27, - RuleKU_DropProperty = 28, RuleKU_RenameTable = 29, RuleKU_RenameProperty = 30, - RuleKU_PropertyDefinitions = 31, RuleKU_PropertyDefinition = 32, RuleKU_CreateNodeConstraint = 33, - RuleKU_DataType = 34, RuleKU_ListIdentifiers = 35, RuleKU_ListIdentifier = 36, - RuleOC_AnyCypherOption = 37, RuleOC_Explain = 38, RuleOC_Profile = 39, - RuleKU_Transaction = 40, RuleKU_Extension = 41, RuleKU_LoadExtension = 42, - RuleKU_InstallExtension = 43, RuleOC_Query = 44, RuleOC_RegularQuery = 45, - RuleOC_Union = 46, RuleOC_SingleQuery = 47, RuleOC_SinglePartQuery = 48, - RuleOC_MultiPartQuery = 49, RuleKU_QueryPart = 50, RuleOC_UpdatingClause = 51, - RuleOC_ReadingClause = 52, RuleKU_LoadFrom = 53, RuleKU_InQueryCall = 54, - RuleOC_Match = 55, RuleOC_Unwind = 56, RuleOC_Create = 57, RuleOC_Merge = 58, - RuleOC_MergeAction = 59, RuleOC_Set = 60, RuleOC_SetItem = 61, RuleOC_Delete = 62, - RuleOC_With = 63, RuleOC_Return = 64, RuleOC_ProjectionBody = 65, RuleOC_ProjectionItems = 66, - RuleOC_ProjectionItem = 67, RuleOC_Order = 68, RuleOC_Skip = 69, RuleOC_Limit = 70, - RuleOC_SortItem = 71, RuleOC_Where = 72, RuleOC_Pattern = 73, RuleOC_PatternPart = 74, - RuleOC_AnonymousPatternPart = 75, RuleOC_PatternElement = 76, RuleOC_NodePattern = 77, - RuleOC_PatternElementChain = 78, RuleOC_RelationshipPattern = 79, RuleOC_RelationshipDetail = 80, - RuleKU_Properties = 81, RuleOC_RelationshipTypes = 82, RuleOC_NodeLabels = 83, - RuleOC_NodeLabel = 84, RuleOC_RangeLiteral = 85, RuleKU_RecursiveRelationshipComprehension = 86, - RuleKU_IntermediateNodeProjectionItems = 87, RuleKU_IntermediateRelProjectionItems = 88, - RuleOC_LowerBound = 89, RuleOC_UpperBound = 90, RuleOC_LabelName = 91, - RuleOC_RelTypeName = 92, RuleOC_Expression = 93, RuleOC_OrExpression = 94, - RuleOC_XorExpression = 95, RuleOC_AndExpression = 96, RuleOC_NotExpression = 97, - RuleOC_ComparisonExpression = 98, RuleKU_ComparisonOperator = 99, RuleKU_BitwiseOrOperatorExpression = 100, - RuleKU_BitwiseAndOperatorExpression = 101, RuleKU_BitShiftOperatorExpression = 102, - RuleKU_BitShiftOperator = 103, RuleOC_AddOrSubtractExpression = 104, - RuleKU_AddOrSubtractOperator = 105, RuleOC_MultiplyDivideModuloExpression = 106, - RuleKU_MultiplyDivideModuloOperator = 107, RuleOC_PowerOfExpression = 108, - RuleOC_UnaryAddSubtractOrFactorialExpression = 109, RuleOC_StringListNullOperatorExpression = 110, - RuleOC_ListOperatorExpression = 111, RuleOC_StringOperatorExpression = 112, - RuleOC_RegularExpression = 113, RuleOC_NullOperatorExpression = 114, - RuleOC_PropertyOrLabelsExpression = 115, RuleOC_Atom = 116, RuleOC_Literal = 117, - RuleOC_BooleanLiteral = 118, RuleOC_ListLiteral = 119, RuleKU_ListEntry = 120, - RuleKU_StructLiteral = 121, RuleKU_StructField = 122, RuleOC_ParenthesizedExpression = 123, - RuleOC_FunctionInvocation = 124, RuleOC_FunctionName = 125, RuleKU_FunctionParameter = 126, - RuleOC_PathPatterns = 127, RuleOC_ExistSubquery = 128, RuleKU_CountSubquery = 129, - RuleOC_PropertyLookup = 130, RuleOC_CaseExpression = 131, RuleOC_CaseAlternative = 132, - RuleOC_Variable = 133, RuleOC_NumberLiteral = 134, RuleOC_Parameter = 135, - RuleOC_PropertyExpression = 136, RuleOC_PropertyKeyName = 137, RuleOC_IntegerLiteral = 138, - RuleOC_DoubleLiteral = 139, RuleOC_SchemaName = 140, RuleOC_SymbolicName = 141, - RuleKU_NonReservedKeywords = 142, RuleOC_LeftArrowHead = 143, RuleOC_RightArrowHead = 144, - RuleOC_Dash = 145 + RuleKU_AttachDatabase = 10, RuleKU_DetachDatabase = 11, RuleKU_StandaloneCall = 12, + RuleKU_CommentOn = 13, RuleKU_CreateMacro = 14, RuleKU_PositionalArgs = 15, + RuleKU_DefaultArg = 16, RuleKU_FilePaths = 17, RuleKU_ParsingOptions = 18, + RuleKU_ParsingOption = 19, RuleKU_DDL = 20, RuleKU_CreateNodeTable = 21, + RuleKU_CreateRelTable = 22, RuleKU_CreateRelTableGroup = 23, RuleKU_RelTableConnection = 24, + RuleKU_CreateRdfGraph = 25, RuleKU_DropTable = 26, RuleKU_AlterTable = 27, + RuleKU_AlterOptions = 28, RuleKU_AddProperty = 29, RuleKU_DropProperty = 30, + RuleKU_RenameTable = 31, RuleKU_RenameProperty = 32, RuleKU_PropertyDefinitions = 33, + RuleKU_PropertyDefinition = 34, RuleKU_CreateNodeConstraint = 35, RuleKU_DataType = 36, + RuleKU_ListIdentifiers = 37, RuleKU_ListIdentifier = 38, RuleOC_AnyCypherOption = 39, + RuleOC_Explain = 40, RuleOC_Profile = 41, RuleKU_Transaction = 42, RuleKU_Extension = 43, + RuleKU_LoadExtension = 44, RuleKU_InstallExtension = 45, RuleOC_Query = 46, + RuleOC_RegularQuery = 47, RuleOC_Union = 48, RuleOC_SingleQuery = 49, + RuleOC_SinglePartQuery = 50, RuleOC_MultiPartQuery = 51, RuleKU_QueryPart = 52, + RuleOC_UpdatingClause = 53, RuleOC_ReadingClause = 54, RuleKU_LoadFrom = 55, + RuleKU_InQueryCall = 56, RuleOC_Match = 57, RuleOC_Unwind = 58, RuleOC_Create = 59, + RuleOC_Merge = 60, RuleOC_MergeAction = 61, RuleOC_Set = 62, RuleOC_SetItem = 63, + RuleOC_Delete = 64, RuleOC_With = 65, RuleOC_Return = 66, RuleOC_ProjectionBody = 67, + RuleOC_ProjectionItems = 68, RuleOC_ProjectionItem = 69, RuleOC_Order = 70, + RuleOC_Skip = 71, RuleOC_Limit = 72, RuleOC_SortItem = 73, RuleOC_Where = 74, + RuleOC_Pattern = 75, RuleOC_PatternPart = 76, RuleOC_AnonymousPatternPart = 77, + RuleOC_PatternElement = 78, RuleOC_NodePattern = 79, RuleOC_PatternElementChain = 80, + RuleOC_RelationshipPattern = 81, RuleOC_RelationshipDetail = 82, RuleKU_Properties = 83, + RuleOC_RelationshipTypes = 84, RuleOC_NodeLabels = 85, RuleOC_NodeLabel = 86, + RuleOC_RangeLiteral = 87, RuleKU_RecursiveRelationshipComprehension = 88, + RuleKU_IntermediateNodeProjectionItems = 89, RuleKU_IntermediateRelProjectionItems = 90, + RuleOC_LowerBound = 91, RuleOC_UpperBound = 92, RuleOC_LabelName = 93, + RuleOC_RelTypeName = 94, RuleOC_Expression = 95, RuleOC_OrExpression = 96, + RuleOC_XorExpression = 97, RuleOC_AndExpression = 98, RuleOC_NotExpression = 99, + RuleOC_ComparisonExpression = 100, RuleKU_ComparisonOperator = 101, + RuleKU_BitwiseOrOperatorExpression = 102, RuleKU_BitwiseAndOperatorExpression = 103, + RuleKU_BitShiftOperatorExpression = 104, RuleKU_BitShiftOperator = 105, + RuleOC_AddOrSubtractExpression = 106, RuleKU_AddOrSubtractOperator = 107, + RuleOC_MultiplyDivideModuloExpression = 108, RuleKU_MultiplyDivideModuloOperator = 109, + RuleOC_PowerOfExpression = 110, RuleOC_UnaryAddSubtractOrFactorialExpression = 111, + RuleOC_StringListNullOperatorExpression = 112, RuleOC_ListOperatorExpression = 113, + RuleOC_StringOperatorExpression = 114, RuleOC_RegularExpression = 115, + RuleOC_NullOperatorExpression = 116, RuleOC_PropertyOrLabelsExpression = 117, + RuleOC_Atom = 118, RuleOC_Literal = 119, RuleOC_BooleanLiteral = 120, + RuleOC_ListLiteral = 121, RuleKU_ListEntry = 122, RuleKU_StructLiteral = 123, + RuleKU_StructField = 124, RuleOC_ParenthesizedExpression = 125, RuleOC_FunctionInvocation = 126, + RuleOC_FunctionName = 127, RuleKU_FunctionParameter = 128, RuleOC_PathPatterns = 129, + RuleOC_ExistSubquery = 130, RuleKU_CountSubquery = 131, RuleOC_PropertyLookup = 132, + RuleOC_CaseExpression = 133, RuleOC_CaseAlternative = 134, RuleOC_Variable = 135, + RuleOC_NumberLiteral = 136, RuleOC_Parameter = 137, RuleOC_PropertyExpression = 138, + RuleOC_PropertyKeyName = 139, RuleOC_IntegerLiteral = 140, RuleOC_DoubleLiteral = 141, + RuleOC_SchemaName = 142, RuleOC_SymbolicName = 143, RuleKU_NonReservedKeywords = 144, + RuleOC_LeftArrowHead = 145, RuleOC_RightArrowHead = 146, RuleOC_Dash = 147 }; explicit CypherParser(antlr4::TokenStream *input); @@ -121,6 +123,8 @@ class CypherParser : public antlr4::Parser { class KU_CopyTOContext; class KU_ExportDatabaseContext; class KU_ImportDatabaseContext; + class KU_AttachDatabaseContext; + class KU_DetachDatabaseContext; class KU_StandaloneCallContext; class KU_CommentOnContext; class KU_CreateMacroContext; @@ -303,6 +307,8 @@ class CypherParser : public antlr4::Parser { KU_ExtensionContext *kU_Extension(); KU_ExportDatabaseContext *kU_ExportDatabase(); KU_ImportDatabaseContext *kU_ImportDatabase(); + KU_AttachDatabaseContext *kU_AttachDatabase(); + KU_DetachDatabaseContext *kU_DetachDatabase(); }; @@ -423,6 +429,37 @@ class CypherParser : public antlr4::Parser { KU_ImportDatabaseContext* kU_ImportDatabase(); + class KU_AttachDatabaseContext : public antlr4::ParserRuleContext { + public: + KU_AttachDatabaseContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *ATTACH(); + std::vector SP(); + antlr4::tree::TerminalNode* SP(size_t i); + std::vector StringLiteral(); + antlr4::tree::TerminalNode* StringLiteral(size_t i); + antlr4::tree::TerminalNode *AS(); + OC_SchemaNameContext *oC_SchemaName(); + antlr4::tree::TerminalNode *DBTYPE(); + + + }; + + KU_AttachDatabaseContext* kU_AttachDatabase(); + + class KU_DetachDatabaseContext : public antlr4::ParserRuleContext { + public: + KU_DetachDatabaseContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + antlr4::tree::TerminalNode *DETACH(); + antlr4::tree::TerminalNode *SP(); + OC_SchemaNameContext *oC_SchemaName(); + + + }; + + KU_DetachDatabaseContext* kU_DetachDatabase(); + class KU_StandaloneCallContext : public antlr4::ParserRuleContext { public: KU_StandaloneCallContext(antlr4::ParserRuleContext *parent, size_t invokingState); diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 2a86c4d7047..3778956eeee 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -33,7 +33,6 @@ void PyConnection::initialize(py::handle& m) { PyConnection::PyConnection(PyDatabase* pyDatabase, uint64_t numThreads) { storageDriver = std::make_unique(pyDatabase->database.get()); conn = std::make_unique(pyDatabase->database.get()); - // TODO(Xiyang): We should implement a generic replacement framework in binder. conn->setReplaceFunc(kuzu::replacePD); if (numThreads > 0) { conn->setMaxNumThreadForExec(numThreads); diff --git a/tools/python_api/test/test_scan_pandas.py b/tools/python_api/test/test_scan_pandas.py index 15ed188c43a..0ce23232122 100644 --- a/tools/python_api/test/test_scan_pandas.py +++ b/tools/python_api/test/test_scan_pandas.py @@ -240,7 +240,7 @@ def test_replace_failure(tmp_path: Path) -> None: def test_int64_overflow(tmp_path: Path) -> None: db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) - overflow_pd = pd.DataFrame({"id": [4, 2**125]}) + overflowpd = pd.DataFrame({"id": [4, 2**125]}) with pytest.raises( RuntimeError, match=re.escape( @@ -248,7 +248,7 @@ def test_int64_overflow(tmp_path: Path) -> None: "Python value '42535295865117307932921825928971026432' to INT64" ), ): - conn.execute("LOAD FROM overflow_pd RETURN *;") + conn.execute("LOAD FROM overflowpd RETURN *;") def test_scan_pandas_with_filter(tmp_path: Path) -> None: diff --git a/tools/shell/test/test_shell_basics.py b/tools/shell/test/test_shell_basics.py index 1325e7ccdd5..cda3660d132 100644 --- a/tools/shell/test/test_shell_basics.py +++ b/tools/shell/test/test_shell_basics.py @@ -72,7 +72,7 @@ def test_multi_queries_one_line(temp_db) -> None: result.check_stdout("databases rule") result.check_stdout( [ - "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT_, COPY, EXPORT, IMPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", + "Error: Parser exception: mismatched input '' expecting {ATTACH, CALL, COMMENT_, COPY, EXPORT, IMPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", '" "', ], ) @@ -85,7 +85,7 @@ def test_multi_queries_one_line(temp_db) -> None: "Error: Parser exception: Invalid input < S>: expected rule ku_Statements (line: 1, offset: 24)", '"RETURN "databases rule" S a"', " ^", - "Error: Parser exception: mismatched input '' expecting {CALL, COMMENT_, COPY, EXPORT, IMPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", + "Error: Parser exception: mismatched input '' expecting {ATTACH, CALL, COMMENT_, COPY, EXPORT, IMPORT, DROP, ALTER, BEGIN, COMMIT, COMMIT_SKIP_CHECKPOINT, ROLLBACK, ROLLBACK_SKIP_CHECKPOINT, INSTALL, LOAD, OPTIONAL, MATCH, UNWIND, CREATE, MERGE, SET, DETACH, DELETE, WITH, RETURN} (line: 1, offset: 6)", '" "', ], ) From 2a3012c471bd5196da4a3e7deabd8591c4d22c00 Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Fri, 15 Mar 2024 17:32:07 -0400 Subject: [PATCH 040/136] Fix Hash index split slot ID when reserving a number of slots which are a power of two --- src/include/common/case_insensitive_map.h | 1 + src/storage/index/hash_index_builder.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/include/common/case_insensitive_map.h b/src/include/common/case_insensitive_map.h index 5d4ac9f2f1e..12e0acc2618 100644 --- a/src/include/common/case_insensitive_map.h +++ b/src/include/common/case_insensitive_map.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include diff --git a/src/storage/index/hash_index_builder.cpp b/src/storage/index/hash_index_builder.cpp index ef1b13f3573..be9f52d0d8b 100644 --- a/src/storage/index/hash_index_builder.cpp +++ b/src/storage/index/hash_index_builder.cpp @@ -38,13 +38,16 @@ void HashIndexBuilder::bulkReserve(uint32_t numEntries_) { // Build from scratch. auto numRequiredSlots = (numRequiredEntries + getSlotCapacity() - 1) / getSlotCapacity(); auto numSlotsOfCurrentLevel = 1u << this->indexHeader->currentLevel; - while ((numSlotsOfCurrentLevel << 1) < numRequiredSlots) { + while ((numSlotsOfCurrentLevel << 1) <= numRequiredSlots) { this->indexHeader->incrementLevel(); numSlotsOfCurrentLevel <<= 1; } - if (numRequiredSlots > numSlotsOfCurrentLevel) { + if (numRequiredSlots >= numSlotsOfCurrentLevel) { this->indexHeader->nextSplitSlotId = numRequiredSlots - numSlotsOfCurrentLevel; } + // The next slot to split should always be within the slots covered by the current level + // The level should be increased if it goes beyond that point + KU_ASSERT(this->indexHeader->nextSplitSlotId <= this->indexHeader->levelHashMask); auto existingSlots = pSlots->getNumElements(); if (numRequiredSlots > existingSlots) { allocatePSlots(numRequiredSlots - existingSlots); From 28bd03b46307c3851fbed0e3d98ef67cfcc27e08 Mon Sep 17 00:00:00 2001 From: xiyang Date: Sat, 16 Mar 2024 13:44:17 -0400 Subject: [PATCH 041/136] Copy table function instead of passing raw pointer --- src/binder/bind/bind_file_scan.cpp | 2 +- src/binder/bind/bind_reading_clause.cpp | 8 ++++---- src/binder/bind/copy/bind_copy_rdf_graph.cpp | 10 +++++----- src/binder/binder.cpp | 4 ++-- src/include/binder/binder.h | 2 +- src/include/binder/copy/bound_file_scan_info.h | 8 ++++---- .../query/reading_clause/bound_in_query_call.h | 12 ++++++------ src/include/function/function.h | 3 ++- src/include/function/table_functions.h | 3 +++ src/include/main/attached_database.h | 3 +-- src/include/planner/operator/logical_in_query_call.h | 6 +++--- src/include/processor/operator/call/in_query_call.h | 4 ++-- src/processor/map/create_factorized_table_scan.cpp | 2 +- src/processor/map/map_scan_file.cpp | 2 +- src/processor/operator/call/in_query_call.cpp | 6 +++--- 15 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/binder/bind/bind_file_scan.cpp b/src/binder/bind/bind_file_scan.cpp index dbbddf35d0e..e71ecbcd57e 100644 --- a/src/binder/bind/bind_file_scan.cpp +++ b/src/binder/bind/bind_file_scan.cpp @@ -81,7 +81,7 @@ std::unique_ptr Binder::bindScanSource(BaseScanSource* sour auto func = getScanFunction(config->fileType, *config); auto bindInput = std::make_unique(config->copy(), std::move(expectedColumnNames), std::move(expectedColumnTypes), clientContext); - auto bindData = func->bindFunc(clientContext, bindInput.get()); + auto bindData = func.bindFunc(clientContext, bindInput.get()); // Bind input columns expression_vector inputColumns; for (auto i = 0u; i < bindData->columnTypes.size(); i++) { diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index ddb7ee6557a..cb06e92091a 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -143,7 +143,7 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& auto offset = expressionBinder.createVariableExpression( *LogicalType::INT64(), std::string(InternalKeyword::ROW_OFFSET)); auto boundInQueryCall = std::make_unique( - tableFunc, std::move(bindData), std::move(columns), offset); + *tableFunc, std::move(bindData), std::move(columns), offset); if (call.hasWherePredicate()) { auto wherePredicate = expressionBinder.bindExpression(*call.getWherePredicate()); boundInQueryCall->setPredicate(std::move(wherePredicate)); @@ -153,7 +153,7 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& std::unique_ptr Binder::bindLoadFrom(const ReadingClause& readingClause) { auto& loadFrom = ku_dynamic_cast(readingClause); - function::TableFunction* scanFunction; + function::TableFunction scanFunction; std::unique_ptr bindInput; auto source = loadFrom.getSource(); switch (source->type) { @@ -167,7 +167,7 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); auto func = BuiltInFunctionsUtils::matchFunction(READ_PANDAS_FUNC_NAME, std::vector{objectExpr->getDataType()}, functions); - scanFunction = ku_dynamic_cast(func); + scanFunction = *ku_dynamic_cast(func); bindInput = std::make_unique(); bindInput->inputs.push_back(*literalExpr->getValue()); } else { @@ -219,7 +219,7 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re default: throw BinderException(stringFormat("LOAD FROM subquery is not supported.")); } - auto bindData = scanFunction->bindFunc(clientContext, bindInput.get()); + auto bindData = scanFunction.bindFunc(clientContext, bindInput.get()); expression_vector columns; for (auto i = 0u; i < bindData->columnTypes.size(); i++) { columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); diff --git a/src/binder/bind/copy/bind_copy_rdf_graph.cpp b/src/binder/bind/copy/bind_copy_rdf_graph.cpp index 7fbd5ab32b6..2d3fba9e791 100644 --- a/src/binder/bind/copy/bind_copy_rdf_graph.cpp +++ b/src/binder/bind/copy/bind_copy_rdf_graph.cpp @@ -57,7 +57,7 @@ std::unique_ptr Binder::bindCopyRdfFrom( BuiltInFunctionsUtils::matchFunction(READ_RDF_RESOURCE_FUNC_NAME, functions); auto rScanFunc = ku_dynamic_cast(func); auto rColumns = expression_vector{r}; - auto rFileScanInfo = BoundFileScanInfo(rScanFunc, bindData->copy(), std::move(rColumns)); + auto rFileScanInfo = BoundFileScanInfo(*rScanFunc, bindData->copy(), std::move(rColumns)); auto rSource = std::make_unique(std::move(rFileScanInfo)); auto rTableID = rdfGraphEntry->getResourceTableID(); auto rEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rTableID); @@ -68,7 +68,7 @@ std::unique_ptr Binder::bindCopyRdfFrom( BuiltInFunctionsUtils::matchFunction(READ_RDF_LITERAL_FUNC_NAME, functions); auto lScanFunc = ku_dynamic_cast(func); auto lColumns = expression_vector{l, lang}; - auto lFileScanInfo = BoundFileScanInfo(lScanFunc, bindData->copy(), std::move(lColumns)); + auto lFileScanInfo = BoundFileScanInfo(*lScanFunc, bindData->copy(), std::move(lColumns)); auto lSource = std::make_unique(std::move(lFileScanInfo)); auto lTableID = rdfGraphEntry->getLiteralTableID(); auto lEntry = catalog->getTableCatalogEntry(clientContext->getTx(), lTableID); @@ -80,7 +80,7 @@ std::unique_ptr Binder::bindCopyRdfFrom( BuiltInFunctionsUtils::matchFunction(READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, functions); auto rrrScanFunc = ku_dynamic_cast(func); auto rrrColumns = expression_vector{s, p, o}; - auto rrrFileScanInfo = BoundFileScanInfo(rrrScanFunc, bindData->copy(), rrrColumns); + auto rrrFileScanInfo = BoundFileScanInfo(*rrrScanFunc, bindData->copy(), rrrColumns); auto rrrSource = std::make_unique(std::move(rrrFileScanInfo)); auto rrrTableID = rdfGraphEntry->getResourceTripleTableID(); auto rrrEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rrrTableID); @@ -102,7 +102,7 @@ std::unique_ptr Binder::bindCopyRdfFrom( BuiltInFunctionsUtils::matchFunction(READ_RDF_LITERAL_TRIPLE_FUNC_NAME, functions); auto rrlScanFunc = ku_dynamic_cast(func); auto rrlColumns = expression_vector{s, p, oOffset}; - auto rrlFileScanInfo = BoundFileScanInfo(rrlScanFunc, bindData->copy(), rrlColumns); + auto rrlFileScanInfo = BoundFileScanInfo(*rrlScanFunc, bindData->copy(), rrlColumns); auto rrlSource = std::make_unique(std::move(rrlFileScanInfo)); auto rrlTableID = rdfGraphEntry->getLiteralTripleTableID(); auto rrlEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rrlTableID); @@ -119,7 +119,7 @@ std::unique_ptr Binder::bindCopyRdfFrom( std::move(rCopyInfo), std::move(lCopyInfo), std::move(rrrCopyInfo), std::move(rrLCopyInfo)); std::unique_ptr source; if (inMemory) { - auto fileScanInfo = BoundFileScanInfo(scanFunc, bindData->copy(), expression_vector{}); + auto fileScanInfo = BoundFileScanInfo(*scanFunc, bindData->copy(), expression_vector{}); source = std::make_unique(std::move(fileScanInfo)); } else { source = std::make_unique(); diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index e6089f4967a..1fe16826fbc 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -216,7 +216,7 @@ void Binder::restoreScope(std::unique_ptr prevVariableScope) { scope = std::move(prevVariableScope); } -function::TableFunction* Binder::getScanFunction(FileType fileType, const ReaderConfig& config) { +function::TableFunction Binder::getScanFunction(FileType fileType, const ReaderConfig& config) { function::Function* func; auto stringType = LogicalType(LogicalTypeID::STRING); std::vector inputTypes; @@ -240,7 +240,7 @@ function::TableFunction* Binder::getScanFunction(FileType fileType, const Reader default: KU_UNREACHABLE; } - return ku_dynamic_cast(func); + return *ku_dynamic_cast(func); } } // namespace binder diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index 48a8ac254a0..bc45de246bf 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -287,7 +287,7 @@ class Binder { std::unique_ptr saveScope(); void restoreScope(std::unique_ptr prevVariableScope); - function::TableFunction* getScanFunction( + function::TableFunction getScanFunction( common::FileType fileType, const common::ReaderConfig& config); private: diff --git a/src/include/binder/copy/bound_file_scan_info.h b/src/include/binder/copy/bound_file_scan_info.h index 2bf8f5de117..cc92eb48914 100644 --- a/src/include/binder/copy/bound_file_scan_info.h +++ b/src/include/binder/copy/bound_file_scan_info.h @@ -8,18 +8,18 @@ namespace kuzu { namespace binder { struct BoundFileScanInfo { - function::TableFunction* copyFunc; + function::TableFunction func; std::unique_ptr bindData; binder::expression_vector columns; - BoundFileScanInfo(function::TableFunction* copyFunc, + BoundFileScanInfo(function::TableFunction func, std::unique_ptr bindData, binder::expression_vector columns) - : copyFunc{copyFunc}, bindData{std::move(bindData)}, columns{std::move(columns)} {} + : func{func}, bindData{std::move(bindData)}, columns{std::move(columns)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundFileScanInfo); private: BoundFileScanInfo(const BoundFileScanInfo& other) - : copyFunc{other.copyFunc}, bindData{other.bindData->copy()}, columns{other.columns} {} + : func{other.func}, bindData{other.bindData->copy()}, columns{other.columns} {} }; } // namespace binder diff --git a/src/include/binder/query/reading_clause/bound_in_query_call.h b/src/include/binder/query/reading_clause/bound_in_query_call.h index 8e3760beda1..7d0c115f4f1 100644 --- a/src/include/binder/query/reading_clause/bound_in_query_call.h +++ b/src/include/binder/query/reading_clause/bound_in_query_call.h @@ -10,23 +10,23 @@ namespace binder { class BoundInQueryCall : public BoundReadingClause { public: - BoundInQueryCall(function::TableFunction* tableFunc, + BoundInQueryCall(function::TableFunction tableFunc, std::unique_ptr bindData, expression_vector outExprs, std::shared_ptr rowIdxExpr) : BoundReadingClause{common::ClauseType::IN_QUERY_CALL}, tableFunc{tableFunc}, bindData{std::move(bindData)}, outExprs{std::move(outExprs)}, rowIdxExpr{std::move( rowIdxExpr)} {} - inline function::TableFunction* getTableFunc() const { return tableFunc; } + function::TableFunction getTableFunc() const { return tableFunc; } - inline const function::TableFuncBindData* getBindData() const { return bindData.get(); } + const function::TableFuncBindData* getBindData() const { return bindData.get(); } - inline expression_vector getOutExprs() const { return outExprs; } + expression_vector getOutExprs() const { return outExprs; } - inline std::shared_ptr getRowIdxExpr() const { return rowIdxExpr; } + std::shared_ptr getRowIdxExpr() const { return rowIdxExpr; } private: - function::TableFunction* tableFunc; + function::TableFunction tableFunc; std::unique_ptr bindData; expression_vector outExprs; std::shared_ptr rowIdxExpr; diff --git a/src/include/function/function.h b/src/include/function/function.h index b025e247f45..71f0fd47389 100644 --- a/src/include/function/function.h +++ b/src/include/function/function.h @@ -18,9 +18,10 @@ struct Function; using scalar_bind_func = std::function( const binder::expression_vector&, Function* definition)>; -enum class FunctionType : uint8_t { SCALAR, AGGREGATE, TABLE }; +enum class FunctionType : uint8_t { UNKNOWN = 0, SCALAR = 1, AGGREGATE = 2, TABLE = 3 }; struct Function { + Function() : type{FunctionType::UNKNOWN} {}; Function( FunctionType type, std::string name, std::vector parameterTypeIDs) : type{type}, name{std::move(name)}, parameterTypeIDs{std::move(parameterTypeIDs)} {} diff --git a/src/include/function/table_functions.h b/src/include/function/table_functions.h index 760df58acb4..ffb4122b919 100644 --- a/src/include/function/table_functions.h +++ b/src/include/function/table_functions.h @@ -80,6 +80,9 @@ struct TableFunction : public Function { table_func_init_local_t initLocalStateFunc; table_func_can_parallel_t canParallelFunc = [] { return true; }; + TableFunction() + : Function{}, tableFunc{nullptr}, bindFunc{nullptr}, initSharedStateFunc{nullptr}, + initLocalStateFunc{nullptr} {}; TableFunction(std::string name, table_func_t tableFunc, table_func_bind_t bindFunc, table_func_init_shared_t initSharedFunc, table_func_init_local_t initLocalFunc, std::vector inputTypes) diff --git a/src/include/main/attached_database.h b/src/include/main/attached_database.h index aa4df24abb1..29f8293d4e9 100644 --- a/src/include/main/attached_database.h +++ b/src/include/main/attached_database.h @@ -8,14 +8,13 @@ namespace kuzu { namespace main { class AttachedDatabase { - public: AttachedDatabase(std::string dbName, function::TableFunction scanFunction) : dbName{std::move(dbName)}, scanFunction{std::move(scanFunction)} {} std::string getDBName() { return dbName; } - function::TableFunction* getScanFunction() { return &scanFunction; } + function::TableFunction getScanFunction() { return scanFunction; } private: std::string dbName; diff --git a/src/include/planner/operator/logical_in_query_call.h b/src/include/planner/operator/logical_in_query_call.h index e26c87e3f79..dc40a15c84c 100644 --- a/src/include/planner/operator/logical_in_query_call.h +++ b/src/include/planner/operator/logical_in_query_call.h @@ -9,7 +9,7 @@ namespace planner { class LogicalInQueryCall : public LogicalOperator { public: - LogicalInQueryCall(function::TableFunction* tableFunc, + LogicalInQueryCall(function::TableFunction tableFunc, std::unique_ptr bindData, binder::expression_vector outputExpressions, std::shared_ptr rowIDExpression) @@ -17,7 +17,7 @@ class LogicalInQueryCall : public LogicalOperator { bindData{std::move(bindData)}, outputExpressions{std::move(outputExpressions)}, rowIDExpression{std::move(rowIDExpression)} {} - inline function::TableFunction* getTableFunc() const { return tableFunc; } + inline function::TableFunction getTableFunc() const { return tableFunc; } inline function::TableFuncBindData* getBindData() const { return bindData.get(); } @@ -37,7 +37,7 @@ class LogicalInQueryCall : public LogicalOperator { } private: - function::TableFunction* tableFunc; + function::TableFunction tableFunc; std::unique_ptr bindData; binder::expression_vector outputExpressions; std::shared_ptr rowIDExpression; diff --git a/src/include/processor/operator/call/in_query_call.h b/src/include/processor/operator/call/in_query_call.h index 1b3a1047d35..24179e1ebd8 100644 --- a/src/include/processor/operator/call/in_query_call.h +++ b/src/include/processor/operator/call/in_query_call.h @@ -32,7 +32,7 @@ enum class TableScanOutputType : uint8_t { }; struct InQueryCallInfo { - function::TableFunction* function; + function::TableFunction function; std::unique_ptr bindData; std::vector outPosV; DataPos rowOffsetPos; @@ -66,7 +66,7 @@ class InQueryCall : public PhysicalOperator { bool isSource() const override { return true; } - bool canParallel() const override { return info.function->canParallelFunc(); } + bool canParallel() const override { return info.function.canParallelFunc(); } void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; diff --git a/src/processor/map/create_factorized_table_scan.cpp b/src/processor/map/create_factorized_table_scan.cpp index c5b1279396a..102e7dcfe77 100644 --- a/src/processor/map/create_factorized_table_scan.cpp +++ b/src/processor/map/create_factorized_table_scan.cpp @@ -27,7 +27,7 @@ std::unique_ptr PlanMapper::createFTableScan(const expression_ auto function = function::BuiltInFunctionsUtils::matchFunction( READ_FTABLE_FUNC_NAME, catalog->getFunctions(clientContext->getTx())); auto info = InQueryCallInfo(); - info.function = ku_dynamic_cast(function); + info.function = *ku_dynamic_cast(function); info.bindData = std::move(bindData); info.outPosV = std::move(outPosV); if (offset != nullptr) { diff --git a/src/processor/map/map_scan_file.cpp b/src/processor/map/map_scan_file.cpp index a006f2bf4fa..2cb623f5035 100644 --- a/src/processor/map/map_scan_file.cpp +++ b/src/processor/map/map_scan_file.cpp @@ -19,7 +19,7 @@ std::unique_ptr PlanMapper::mapScanFile(LogicalOperator* logic outPosV.emplace_back(getDataPos(*expr, *outSchema)); } auto info = InQueryCallInfo(); - info.function = scanFileInfo->copyFunc; + info.function = scanFileInfo->func; info.bindData = scanFileInfo->bindData->copy(); info.outPosV = outPosV; if (scanFile->hasOffset()) { diff --git a/src/processor/operator/call/in_query_call.cpp b/src/processor/operator/call/in_query_call.cpp index 52cc0970cc7..d3ddd81ce69 100644 --- a/src/processor/operator/call/in_query_call.cpp +++ b/src/processor/operator/call/in_query_call.cpp @@ -40,7 +40,7 @@ void InQueryCall::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* } // Init table function input. function::TableFunctionInitInput tableFunctionInitInput{info.bindData.get()}; - localState.funcState = info.function->initLocalStateFunc(tableFunctionInitInput, + localState.funcState = info.function.initLocalStateFunc(tableFunctionInitInput, sharedState->funcState.get(), context->clientContext->getMemoryManager()); localState.funcInput = function::TableFuncInput{ info.bindData.get(), localState.funcState.get(), sharedState->funcState.get()}; @@ -48,13 +48,13 @@ void InQueryCall::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* void InQueryCall::initGlobalStateInternal(ExecutionContext*) { function::TableFunctionInitInput tableFunctionInitInput{info.bindData.get()}; - sharedState->funcState = info.function->initSharedStateFunc(tableFunctionInitInput); + sharedState->funcState = info.function.initSharedStateFunc(tableFunctionInitInput); } bool InQueryCall::getNextTuplesInternal(ExecutionContext*) { localState.funcOutput.dataChunk.state->selVector->selectedSize = 0; localState.funcOutput.dataChunk.resetAuxiliaryBuffer(); - auto numTuplesScanned = info.function->tableFunc(localState.funcInput, localState.funcOutput); + auto numTuplesScanned = info.function.tableFunc(localState.funcInput, localState.funcOutput); localState.funcOutput.dataChunk.state->selVector->selectedSize = numTuplesScanned; if (localState.rowOffsetVector != nullptr) { auto rowIdx = sharedState->getAndIncreaseRowIdx(numTuplesScanned); From 1d7b9f3539d6018d8f60e89dc5d282216bb756d9 Mon Sep 17 00:00:00 2001 From: xiyang Date: Wed, 13 Mar 2024 02:29:47 -0400 Subject: [PATCH 042/136] Add replace func --- .../bind_boolean_expression.cpp | 4 +- .../bind_function_expression.cpp | 88 +++++++++---------- .../bind_null_operator_expression.cpp | 4 +- src/catalog/catalog.cpp | 21 +++-- src/catalog/catalog_content.cpp | 17 ---- src/catalog/catalog_set.cpp | 12 +++ src/function/CMakeLists.txt | 1 + src/function/built_in_function_utils.cpp | 26 ++++-- src/function/pattern/CMakeLists.txt | 7 ++ src/function/pattern/id_function.cpp | 46 ++++++++++ src/function/vector_boolean_functions.cpp | 12 +-- src/function/vector_cast_functions.cpp | 24 ++--- src/function/vector_list_functions.cpp | 4 +- src/function/vector_null_functions.cpp | 4 +- src/function/vector_struct_functions.cpp | 10 ++- .../binder/expression/function_expression.h | 12 +-- src/include/binder/expression_binder.h | 5 +- src/include/catalog/catalog.h | 6 +- src/include/catalog/catalog_content.h | 2 - .../catalog_entry/catalog_entry_type.h | 3 +- .../scalar_function_catalog_entry.h | 1 - .../expression_evaluator/function_evaluator.h | 4 +- .../arithmetic/vector_arithmetic_functions.h | 8 +- .../boolean/vector_boolean_functions.h | 12 +-- .../function/built_in_function_utils.h | 9 -- .../comparison/vector_comparison_functions.h | 10 +-- src/include/function/function.h | 17 ++-- .../function/list/vector_list_functions.h | 19 ++-- .../function/null/vector_null_functions.h | 4 +- src/include/function/rewrite_function.h | 32 +++++++ src/include/function/scalar_function.h | 34 +++---- .../schema/vector_node_rel_functions.h | 4 + .../function/struct/vector_struct_functions.h | 1 + src/include/function/udf_function.h | 26 +++--- src/include/main/connection.h | 4 +- .../expression/parsed_function_expression.h | 6 +- .../operator/persistent/copy_to_csv.h | 2 +- .../tinysnb/exception/relation.test | 11 ++- 38 files changed, 311 insertions(+), 201 deletions(-) create mode 100644 src/function/pattern/CMakeLists.txt create mode 100644 src/function/pattern/id_function.cpp create mode 100644 src/include/function/rewrite_function.h diff --git a/src/binder/bind_expression/bind_boolean_expression.cpp b/src/binder/bind_expression/bind_boolean_expression.cpp index d698e9710e6..8464a48ccd3 100644 --- a/src/binder/bind_expression/bind_boolean_expression.cpp +++ b/src/binder/bind_expression/bind_boolean_expression.cpp @@ -24,9 +24,9 @@ std::shared_ptr ExpressionBinder::bindBooleanExpression( childrenAfterCast.push_back(implicitCastIfNecessary(child, LogicalTypeID::BOOL)); } auto functionName = expressionTypeToString(expressionType); - function::scalar_exec_func execFunc; + function::scalar_func_exec_t execFunc; function::VectorBooleanFunction::bindExecFunction(expressionType, childrenAfterCast, execFunc); - function::scalar_select_func selectFunc; + function::scalar_func_select_t selectFunc; function::VectorBooleanFunction::bindSelectFunction( expressionType, childrenAfterCast, selectFunc); auto bindData = std::make_unique(LogicalType::BOOL()); diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index b887002fb7b..88ebe21f242 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -4,7 +4,7 @@ #include "binder/expression/property_expression.h" #include "binder/expression_binder.h" #include "common/exception/binder.h" -#include "common/string_utils.h" +#include "function/rewrite_function.h" #include "function/schema/vector_label_functions.h" #include "main/client_context.h" #include "parser/expression/parsed_function_expression.h" @@ -13,29 +13,29 @@ using namespace kuzu::common; using namespace kuzu::parser; using namespace kuzu::function; +using namespace kuzu::catalog; namespace kuzu { namespace binder { -std::shared_ptr ExpressionBinder::bindFunctionExpression( - const ParsedExpression& parsedExpression) { - auto& parsedFunctionExpression = (ParsedFunctionExpression&)parsedExpression; - auto functionName = parsedFunctionExpression.getFunctionName(); - StringUtils::toUpper(functionName); - auto result = rewriteFunctionExpression(parsedExpression, functionName); +std::shared_ptr ExpressionBinder::bindFunctionExpression(const ParsedExpression& expr) { + auto& funcExpr = + ku_dynamic_cast(expr); + auto functionName = funcExpr.getNormalizedFunctionName(); + auto result = rewriteFunctionExpression(expr, functionName); if (result != nullptr) { return result; } - auto functionType = - context->getCatalog()->getFunctionType(binder->clientContext->getTx(), functionName); - switch (functionType) { - case ExpressionType::FUNCTION: - return bindScalarFunctionExpression(parsedExpression, functionName); - case ExpressionType::AGGREGATE_FUNCTION: - return bindAggregateFunctionExpression( - parsedExpression, functionName, parsedFunctionExpression.getIsDistinct()); - case ExpressionType::MACRO: - return bindMacroExpression(parsedExpression, functionName); + auto entry = context->getCatalog()->getFunctionEntry(context->getTx(), functionName); + switch (entry->getType()) { + case CatalogEntryType::SCALAR_FUNCTION_ENTRY: + return bindScalarFunctionExpression(expr, functionName); + case CatalogEntryType::REWRITE_FUNCTION_ENTRY: + return bindRewriteFunctionExpression(expr); + case CatalogEntryType::AGGREGATE_FUNCTION_ENTRY: + return bindAggregateFunctionExpression(expr, functionName, funcExpr.getIsDistinct()); + case CatalogEntryType::SCALAR_MACRO_ENTRY: + return bindMacroExpression(expr, functionName); default: KU_UNREACHABLE; } @@ -51,12 +51,17 @@ std::shared_ptr ExpressionBinder::bindScalarFunctionExpression( return bindScalarFunctionExpression(children, functionName); } +static std::vector getTypes(const expression_vector& exprs) { + std::vector result; + for (auto& expr : exprs) { + result.push_back(expr->getDataType()); + } + return result; +} + std::shared_ptr ExpressionBinder::bindScalarFunctionExpression( const expression_vector& children, const std::string& functionName) { - std::vector childrenTypes; - for (auto& child : children) { - childrenTypes.push_back(child->dataType); - } + auto childrenTypes = getTypes(children); auto functions = context->getCatalog()->getFunctions(context->getTx()); auto function = ku_dynamic_cast( function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, functions)); @@ -93,6 +98,23 @@ std::shared_ptr ExpressionBinder::bindScalarFunctionExpression( function->compileFunc, uniqueExpressionName); } +std::shared_ptr ExpressionBinder::bindRewriteFunctionExpression( + const parser::ParsedExpression& expr) { + auto& funcExpr = + ku_dynamic_cast(expr); + expression_vector children; + for (auto i = 0u; i < expr.getNumChildren(); ++i) { + children.push_back(bindExpression(*expr.getChild(i))); + } + auto childrenTypes = getTypes(children); + auto functions = context->getCatalog()->getFunctions(context->getTx()); + auto match = BuiltInFunctionsUtils::matchFunction( + funcExpr.getNormalizedFunctionName(), childrenTypes, functions); + auto function = ku_dynamic_cast(match); + KU_ASSERT(function->rewriteFunc != nullptr); + return function->rewriteFunc(children, this); +} + std::shared_ptr ExpressionBinder::bindAggregateFunctionExpression( const ParsedExpression& parsedExpression, const std::string& functionName, bool isDistinct) { std::vector childrenTypes; @@ -159,19 +181,13 @@ std::shared_ptr ExpressionBinder::bindMacroExpression( // Function rewriting happens when we need to expose internal property access through function so // that it becomes read-only or the function involves catalog information. Currently we write // Before | After -// ID(a) | a._id // LABEL(a) | LIST_EXTRACT(offset(a), [table names from catalog]) // LENGTH(e) | e._length // STARTNODE(a) | a._src // ENDNODE(a) | a._dst std::shared_ptr ExpressionBinder::rewriteFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName) { - if (functionName == ID_FUNC_NAME) { - auto child = bindExpression(*parsedExpression.getChild(0)); - validateExpectedDataType(*child, std::vector{LogicalTypeID::NODE, - LogicalTypeID::REL, LogicalTypeID::STRUCT}); - return bindInternalIDExpression(child); - } else if (functionName == LABEL_FUNC_NAME) { + if (functionName == LABEL_FUNC_NAME) { auto child = bindExpression(*parsedExpression.getChild(0)); validateExpectedDataType( *child, std::vector{LogicalTypeID::NODE, LogicalTypeID::REL}); @@ -203,22 +219,6 @@ std::unique_ptr ExpressionBinder::createInternalNodeIDExpression( std::move(propertyIDPerTable), false /* isPrimaryKey */); } -std::shared_ptr ExpressionBinder::bindInternalIDExpression( - const std::shared_ptr& expression) { - if (ExpressionUtil::isNodePattern(*expression)) { - auto& node = (NodeExpression&)*expression; - return node.getInternalID(); - } - if (ExpressionUtil::isRelPattern(*expression)) { - return bindNodeOrRelPropertyExpression(*expression, InternalKeyword::ID); - } - KU_ASSERT(expression->dataType.getPhysicalType() == PhysicalTypeID::STRUCT); - auto stringValue = std::make_unique(LogicalType::STRING(), InternalKeyword::ID); - return bindScalarFunctionExpression( - expression_vector{expression, createLiteralExpression(std::move(stringValue))}, - STRUCT_EXTRACT_FUNC_NAME); -} - std::shared_ptr ExpressionBinder::bindStartNodeExpression( const Expression& expression) { auto& rel = (RelExpression&)expression; diff --git a/src/binder/bind_expression/bind_null_operator_expression.cpp b/src/binder/bind_expression/bind_null_operator_expression.cpp index cfa9cdd7eb1..b1450b692e4 100644 --- a/src/binder/bind_expression/bind_null_operator_expression.cpp +++ b/src/binder/bind_expression/bind_null_operator_expression.cpp @@ -21,9 +21,9 @@ std::shared_ptr ExpressionBinder::bindNullOperatorExpression( } auto expressionType = parsedExpression.getExpressionType(); auto functionName = expressionTypeToString(expressionType); - function::scalar_exec_func execFunc; + function::scalar_func_exec_t execFunc; function::VectorNullFunction::bindExecFunction(expressionType, children, execFunc); - function::scalar_select_func selectFunc; + function::scalar_func_select_t selectFunc; function::VectorNullFunction::bindSelectFunction(expressionType, children, selectFunc); auto bindData = std::make_unique(LogicalType::BOOL()); auto uniqueExpressionName = ScalarFunctionExpression::getUniqueName(functionName, children); diff --git a/src/catalog/catalog.cpp b/src/catalog/catalog.cpp index 0c9f446e0cb..d075773bf53 100644 --- a/src/catalog/catalog.cpp +++ b/src/catalog/catalog.cpp @@ -5,6 +5,7 @@ #include "catalog/catalog_entry/rel_group_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" #include "catalog/catalog_entry/scalar_macro_catalog_entry.h" +#include "common/exception/catalog.h" #include "storage/wal/wal.h" #include "transaction/transaction.h" #include "transaction/transaction_action.h" @@ -101,10 +102,6 @@ std::vector Catalog::getTableSchemas( return result; } -CatalogSet* Catalog::getFunctions(Transaction* tx) const { - return getVersion(tx)->functions.get(); -} - void Catalog::prepareCommitOrRollback(TransactionAction action) { if (hasUpdates()) { wal->logCatalogRecord(); @@ -121,10 +118,6 @@ void Catalog::checkpointInMemory() { } } -ExpressionType Catalog::getFunctionType(Transaction* tx, const std::string& name) const { - return getVersion(tx)->getFunctionType(name); -} - table_id_t Catalog::addNodeTableSchema(const binder::BoundCreateTableInfo& info) { KU_ASSERT(readWriteVersion != nullptr); setToUpdated(); @@ -257,6 +250,18 @@ void Catalog::addBuiltInFunction(std::string name, function::function_set functi readOnlyVersion->addFunction(std::move(name), std::move(functionSet)); } +CatalogSet* Catalog::getFunctions(Transaction* tx) const { + return getVersion(tx)->functions.get(); +} + +CatalogEntry* Catalog::getFunctionEntry(transaction::Transaction* tx, const std::string& name) { + auto catalogSet = getVersion(tx)->functions.get(); + if (!catalogSet->containsEntry(name)) { + throw CatalogException(stringFormat("function {} does not exist.", name)); + } + return catalogSet->getEntry(name); +} + bool Catalog::containsMacro(Transaction* tx, const std::string& macroName) const { return getVersion(tx)->containMacro(macroName); } diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index 0bf7ab4aa61..bfc5d307242 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -202,23 +202,6 @@ void CatalogContent::readFromFile(const std::string& directory, FileVersionType functions = CatalogSet::deserialize(deserializer); } -ExpressionType CatalogContent::getFunctionType(const std::string& name) const { - if (!functions->containsEntry(name)) { - throw CatalogException{common::stringFormat("function {} does not exist.", name)}; - } - auto functionEntry = functions->getEntry(name); - switch (functionEntry->getType()) { - case CatalogEntryType::SCALAR_MACRO_ENTRY: - return ExpressionType::MACRO; - case CatalogEntryType::SCALAR_FUNCTION_ENTRY: - return ExpressionType::FUNCTION; - case CatalogEntryType::AGGREGATE_FUNCTION_ENTRY: - return ExpressionType::AGGREGATE_FUNCTION; - default: - KU_UNREACHABLE; - } -} - void CatalogContent::addFunction(std::string name, function::function_set definitions) { if (functions->containsEntry(name)) { throw CatalogException{common::stringFormat("function {} already exists.", name)}; diff --git a/src/catalog/catalog_set.cpp b/src/catalog/catalog_set.cpp index 7f0a5122065..0c36fd5a39e 100644 --- a/src/catalog/catalog_set.cpp +++ b/src/catalog/catalog_set.cpp @@ -1,6 +1,10 @@ #include "catalog/catalog_set.h" #include "common/assert.h" +#include "common/exception/catalog.h" +#include "common/string_format.h" + +using namespace kuzu::common; namespace kuzu { namespace catalog { @@ -10,6 +14,13 @@ bool CatalogSet::containsEntry(const std::string& name) const { } CatalogEntry* CatalogSet::getEntry(const std::string& name) { + // LCOV_EXCL_START + // We should not trigger the following check. If so, we should throw more informative error + // message at catalog level. + if (!containsEntry(name)) { + throw CatalogException(stringFormat("Cannot find catalog entry with name {}.", name)); + } + // LCOV_EXCL_STOP return entries.at(name).get(); } @@ -36,6 +47,7 @@ void CatalogSet::serialize(common::Serializer serializer) const { for (auto& [name, entry] : entries) { switch (entry->getType()) { case CatalogEntryType::SCALAR_FUNCTION_ENTRY: + case CatalogEntryType::REWRITE_FUNCTION_ENTRY: case CatalogEntryType::AGGREGATE_FUNCTION_ENTRY: case CatalogEntryType::TABLE_FUNCTION_ENTRY: continue; diff --git a/src/function/CMakeLists.txt b/src/function/CMakeLists.txt index e7315706c84..55368d89150 100644 --- a/src/function/CMakeLists.txt +++ b/src/function/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(aggregate) add_subdirectory(arithmetic) add_subdirectory(cast) +add_subdirectory(pattern) add_subdirectory(table) add_library(kuzu_function diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 9977400acc9..804e3ff326f 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -41,6 +41,13 @@ using namespace kuzu::processor; namespace kuzu { namespace function { +static void validateNonEmptyCandidateFunctions(std::vector& candidateFunctions, + const std::string& name, const std::vector& inputTypes, bool isDistinct, + function::function_set& set); +static void validateNonEmptyCandidateFunctions(std::vector& candidateFunctions, + const std::string& name, const std::vector& inputTypes, + function::function_set& set); + void BuiltInFunctionsUtils::createFunctions(CatalogSet* catalogSet) { registerScalarFunctions(catalogSet); registerAggregateFunctions(catalogSet); @@ -453,10 +460,8 @@ uint32_t BuiltInFunctionsUtils::getFunctionCost( return matchParameters(inputTypes, function->parameterTypeIDs, isOverload); } } - case FunctionType::TABLE: - return matchParameters(inputTypes, function->parameterTypeIDs, isOverload); default: - KU_UNREACHABLE; + return matchParameters(inputTypes, function->parameterTypeIDs, isOverload); } } @@ -909,6 +914,9 @@ void BuiltInFunctionsUtils::registerUnionFunctions(CatalogSet* catalogSet) { void BuiltInFunctionsUtils::registerNodeRelFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( OFFSET_FUNC_NAME, OffsetFunction::getFunctionSet())); + catalogSet->createEntry( + std::make_unique(catalog::CatalogEntryType::REWRITE_FUNCTION_ENTRY, + ID_FUNC_NAME, IDFunction::getFunctionSet())); } void BuiltInFunctionsUtils::registerPathFunctions(CatalogSet* catalogSet) { @@ -1069,9 +1077,9 @@ static std::string getFunctionMatchFailureMsg(const std::string name, return result; } -void BuiltInFunctionsUtils::validateNonEmptyCandidateFunctions( - std::vector& candidateFunctions, const std::string& name, - const std::vector& inputTypes, bool isDistinct, function::function_set& set) { +void validateNonEmptyCandidateFunctions(std::vector& candidateFunctions, + const std::string& name, const std::vector& inputTypes, bool isDistinct, + function::function_set& set) { if (candidateFunctions.empty()) { std::string supportedInputsString; for (auto& function : set) { @@ -1086,9 +1094,9 @@ void BuiltInFunctionsUtils::validateNonEmptyCandidateFunctions( } } -void BuiltInFunctionsUtils::validateNonEmptyCandidateFunctions( - std::vector& candidateFunctions, const std::string& name, - const std::vector& inputTypes, function::function_set& set) { +void validateNonEmptyCandidateFunctions(std::vector& candidateFunctions, + const std::string& name, const std::vector& inputTypes, + function::function_set& set) { if (candidateFunctions.empty()) { std::string supportedInputsString; for (auto& function : set) { diff --git a/src/function/pattern/CMakeLists.txt b/src/function/pattern/CMakeLists.txt new file mode 100644 index 00000000000..4857f7f50d3 --- /dev/null +++ b/src/function/pattern/CMakeLists.txt @@ -0,0 +1,7 @@ +add_library(kuzu_function_pattern + OBJECT + id_function.cpp) + +set(ALL_OBJECT_FILES + ${ALL_OBJECT_FILES} $ + PARENT_SCOPE) diff --git a/src/function/pattern/id_function.cpp b/src/function/pattern/id_function.cpp new file mode 100644 index 00000000000..3305f047d83 --- /dev/null +++ b/src/function/pattern/id_function.cpp @@ -0,0 +1,46 @@ +#include "binder/expression/expression_util.h" +#include "binder/expression/node_expression.h" +#include "binder/expression/rel_expression.h" +#include "binder/expression_binder.h" +#include "function/rewrite_function.h" +#include "function/schema/vector_node_rel_functions.h" + +using namespace kuzu::common; +using namespace kuzu::binder; + +namespace kuzu { +namespace function { + +static std::shared_ptr rewriteFunc( + const expression_vector& params, ExpressionBinder* binder) { + KU_ASSERT(params.size() == 1); + auto param = params[0].get(); + if (ExpressionUtil::isNodePattern(*param)) { + auto node = ku_dynamic_cast(param); + return node->getInternalID(); + } + if (ExpressionUtil::isRelPattern(*param)) { + auto rel = ku_dynamic_cast(param); + return rel->getPropertyExpression(InternalKeyword::ID); + } + // Bind as struct_extract(param, "_id") + auto key = Value(LogicalType::STRING(), InternalKeyword::ID); + auto keyExpr = binder->createLiteralExpression(key.copy()); + auto newParams = expression_vector{params[0], keyExpr}; + return binder->bindScalarFunctionExpression(newParams, STRUCT_EXTRACT_FUNC_NAME); +} + +function_set IDFunction::getFunctionSet() { + function_set functionSet; + auto inputTypes = + std::vector{LogicalTypeID::NODE, LogicalTypeID::REL, LogicalTypeID::STRUCT}; + for (auto& inputType : inputTypes) { + auto function = std::make_unique( + InternalKeyword::ID, std::vector{inputType}, rewriteFunc); + functionSet.push_back(std::move(function)); + } + return functionSet; +} + +} // namespace function +} // namespace kuzu diff --git a/src/function/vector_boolean_functions.cpp b/src/function/vector_boolean_functions.cpp index cae7e3b2cf9..a71ae4fac19 100644 --- a/src/function/vector_boolean_functions.cpp +++ b/src/function/vector_boolean_functions.cpp @@ -8,7 +8,7 @@ namespace kuzu { namespace function { void VectorBooleanFunction::bindExecFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func) { + const binder::expression_vector& children, scalar_func_exec_t& func) { if (isExpressionBinary(expressionType)) { bindBinaryExecFunction(expressionType, children, func); } else { @@ -18,7 +18,7 @@ void VectorBooleanFunction::bindExecFunction(ExpressionType expressionType, } void VectorBooleanFunction::bindSelectFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func) { + const binder::expression_vector& children, scalar_func_select_t& func) { if (isExpressionBinary(expressionType)) { bindBinarySelectFunction(expressionType, children, func); } else { @@ -28,7 +28,7 @@ void VectorBooleanFunction::bindSelectFunction(ExpressionType expressionType, } void VectorBooleanFunction::bindBinaryExecFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func) { + const binder::expression_vector& children, scalar_func_exec_t& func) { KU_ASSERT(children.size() == 2); auto leftType = children[0]->dataType; auto rightType = children[1]->dataType; @@ -54,7 +54,7 @@ void VectorBooleanFunction::bindBinaryExecFunction(ExpressionType expressionType } void VectorBooleanFunction::bindBinarySelectFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func) { + const binder::expression_vector& children, scalar_func_select_t& func) { KU_ASSERT(children.size() == 2); auto leftType = children[0]->dataType; auto rightType = children[1]->dataType; @@ -80,7 +80,7 @@ void VectorBooleanFunction::bindBinarySelectFunction(ExpressionType expressionTy } void VectorBooleanFunction::bindUnaryExecFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func) { + const binder::expression_vector& children, scalar_func_exec_t& func) { KU_ASSERT( children.size() == 1 && children[0]->dataType.getLogicalTypeID() == LogicalTypeID::BOOL); (void)children; @@ -96,7 +96,7 @@ void VectorBooleanFunction::bindUnaryExecFunction(ExpressionType expressionType, } void VectorBooleanFunction::bindUnarySelectFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func) { + const binder::expression_vector& children, scalar_func_select_t& func) { KU_ASSERT( children.size() == 1 && children[0]->dataType.getLogicalTypeID() == LogicalTypeID::BOOL); (void)children; diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index c54c7aa2ea4..3982d274e99 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -36,10 +36,10 @@ static void fixedListToListCastExecFunction( ListVector::resizeDataVector(&result, numOfEntries * numValuesPerList); auto resultVector = ListVector::getDataVector(&result); - scalar_exec_func func = CastFunction::bindCastFunction( + scalar_func_exec_t func = CastFunction::bindCastFunction( "CAST", FixedListType::getChildType(&inputVector->dataType)->getLogicalTypeID(), resultVector->dataType.getLogicalTypeID()) - ->execFunc; + ->execFunc; reinterpret_cast(dataPtr)->numOfEntries = numOfEntries; func(params, *resultVector, dataPtr); } @@ -64,10 +64,10 @@ void fixedListToListCastExecFunction( } auto resultVector = ListVector::getDataVector(&result); - scalar_exec_func func = CastFunction::bindCastFunction( + scalar_func_exec_t func = CastFunction::bindCastFunction( "CAST", FixedListType::getChildType(&inputVector->dataType)->getLogicalTypeID(), resultVector->dataType.getLogicalTypeID()) - ->execFunc; + ->execFunc; func(params, *resultVector, dataPtr); } @@ -124,9 +124,9 @@ static void resolveNestedVector(std::shared_ptr inputVector, ValueV } // non-nested types - scalar_exec_func func = CastFunction::bindCastFunction( + scalar_func_exec_t func = CastFunction::bindCastFunction( "CAST", inputType->getLogicalTypeID(), resultType->getLogicalTypeID()) - ->execFunc; + ->execFunc; std::vector> childParams{inputVector}; dataPtr->numOfEntries = numOfEntries; func(childParams, *resultVector, (void*)dataPtr); @@ -174,7 +174,7 @@ bool CastFunction::hasImplicitCast(const LogicalType& srcType, const LogicalType template static std::unique_ptr bindCastFromStringFunction( const std::string& functionName, LogicalTypeID targetTypeID) { - scalar_exec_func execFunc; + scalar_func_exec_t execFunc; switch (targetTypeID) { case LogicalTypeID::DATE: { execFunc = @@ -298,7 +298,7 @@ static std::unique_ptr bindCastFromStringFunction( static std::unique_ptr bindCastFromRdfVariantFunction( const std::string& functionName, LogicalTypeID targetTypeID) { - scalar_exec_func execFunc; + scalar_func_exec_t execFunc; switch (targetTypeID) { case LogicalTypeID::DATE: { execFunc = ScalarFunction::UnaryRdfVariantCastExecFunction bindCastFromRdfVariantFunction( template static std::unique_ptr bindCastToStringFunction( const std::string& functionName, LogicalTypeID sourceTypeID) { - scalar_exec_func func; + scalar_func_exec_t func; switch (sourceTypeID) { case LogicalTypeID::BOOL: { func = ScalarFunction::UnaryCastExecFunction; @@ -497,7 +497,7 @@ static std::unique_ptr bindCastToStringFunction( static std::unique_ptr bindCastToRdfVariantFunction( const std::string& functionName, LogicalTypeID sourceTypeID) { - scalar_exec_func execFunc; + scalar_func_exec_t execFunc; switch (sourceTypeID) { case LogicalTypeID::DATE: { execFunc = ScalarFunction::UnaryRdfVariantCastExecFunction bindCastToRdfVariantFunction( template static std::unique_ptr bindCastToNumericFunction( const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { - scalar_exec_func func; + scalar_func_exec_t func; switch (sourceTypeID) { case LogicalTypeID::INT8: { func = ScalarFunction::UnaryExecFunction; @@ -664,7 +664,7 @@ static std::unique_ptr bindCastBetweenNested( template static std::unique_ptr bindCastToTimestampFunction( const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID dstTypeID) { - scalar_exec_func func; + scalar_func_exec_t func; switch (sourceTypeID) { case LogicalTypeID::DATE: { func = ScalarFunction::UnaryExecFunction; diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index d97167fb7c9..35c77e8e3b0 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -446,7 +446,7 @@ std::unique_ptr ListSortFunction::bindFunc( template void ListSortFunction::getExecFunction( - const binder::expression_vector& arguments, scalar_exec_func& func) { + const binder::expression_vector& arguments, scalar_func_exec_t& func) { if (arguments.size() == 1) { func = ScalarFunction::UnaryExecNestedTypeFunction>; return; @@ -548,7 +548,7 @@ std::unique_ptr ListReverseSortFunction::bindFunc( template void ListReverseSortFunction::getExecFunction( - const binder::expression_vector& arguments, scalar_exec_func& func) { + const binder::expression_vector& arguments, scalar_func_exec_t& func) { if (arguments.size() == 1) { func = ScalarFunction::UnaryExecNestedTypeFunction>; diff --git a/src/function/vector_null_functions.cpp b/src/function/vector_null_functions.cpp index 1c07f166bcf..03711dd973b 100644 --- a/src/function/vector_null_functions.cpp +++ b/src/function/vector_null_functions.cpp @@ -8,7 +8,7 @@ namespace kuzu { namespace function { void VectorNullFunction::bindExecFunction(ExpressionType expressionType, - const binder::expression_vector& /*children*/, scalar_exec_func& func) { + const binder::expression_vector& /*children*/, scalar_func_exec_t& func) { switch (expressionType) { case ExpressionType::IS_NULL: { func = UnaryNullExecFunction; @@ -25,7 +25,7 @@ void VectorNullFunction::bindExecFunction(ExpressionType expressionType, } void VectorNullFunction::bindSelectFunction(ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func) { + const binder::expression_vector& children, scalar_func_select_t& func) { KU_ASSERT(children.size() == 1); (void)children; switch (expressionType) { diff --git a/src/function/vector_struct_functions.cpp b/src/function/vector_struct_functions.cpp index 5c5f74e3ab8..81052f3065f 100644 --- a/src/function/vector_struct_functions.cpp +++ b/src/function/vector_struct_functions.cpp @@ -82,13 +82,17 @@ function_set StructExtractFunctions::getFunctionSet() { auto inputTypeIDs = std::vector{LogicalTypeID::STRUCT, LogicalTypeID::NODE, LogicalTypeID::REL}; for (auto inputTypeID : inputTypeIDs) { - functions.push_back(make_unique(STRUCT_EXTRACT_FUNC_NAME, - std::vector{inputTypeID, LogicalTypeID::STRING}, LogicalTypeID::ANY, - nullptr, nullptr, compileFunc, bindFunc, false /* isVarLength */)); + functions.push_back(getFunction(inputTypeID)); } return functions; } +std::unique_ptr StructExtractFunctions::getFunction(LogicalTypeID logicalTypeID) { + return std::make_unique(STRUCT_EXTRACT_FUNC_NAME, + std::vector{logicalTypeID, LogicalTypeID::STRING}, LogicalTypeID::ANY, + nullptr, nullptr, compileFunc, bindFunc, false /* isVarLength */); +} + std::unique_ptr StructExtractFunctions::bindFunc( const binder::expression_vector& arguments, Function* /*function*/) { auto structType = arguments[0]->getDataType(); diff --git a/src/include/binder/expression/function_expression.h b/src/include/binder/expression/function_expression.h index 8123dc4ae53..59d9963093b 100644 --- a/src/include/binder/expression/function_expression.h +++ b/src/include/binder/expression/function_expression.h @@ -42,7 +42,7 @@ class ScalarFunctionExpression : public FunctionExpression { public: ScalarFunctionExpression(std::string functionName, common::ExpressionType expressionType, std::unique_ptr bindData, expression_vector children, - function::scalar_exec_func execFunc, function::scalar_select_func selectFunc, + function::scalar_func_exec_t execFunc, function::scalar_func_select_t selectFunc, const std::string& uniqueName) : ScalarFunctionExpression{std::move(functionName), expressionType, std::move(bindData), std::move(children), std::move(execFunc), std::move(selectFunc), nullptr, @@ -50,8 +50,8 @@ class ScalarFunctionExpression : public FunctionExpression { ScalarFunctionExpression(std::string functionName, common::ExpressionType expressionType, std::unique_ptr bindData, expression_vector children, - function::scalar_exec_func execFunc, function::scalar_select_func selectFunc, - function::scalar_compile_func compileFunc, const std::string& uniqueName) + function::scalar_func_exec_t execFunc, function::scalar_func_select_t selectFunc, + function::scalar_func_compile_exec_t compileFunc, const std::string& uniqueName) : FunctionExpression{std::move(functionName), expressionType, std::move(bindData), std::move(children), uniqueName}, execFunc{std::move(execFunc)}, selectFunc{std::move(selectFunc)}, compileFunc{std::move( @@ -63,9 +63,9 @@ class ScalarFunctionExpression : public FunctionExpression { std::string toStringInternal() const final; public: - function::scalar_exec_func execFunc; - function::scalar_select_func selectFunc; - function::scalar_compile_func compileFunc; + function::scalar_func_exec_t execFunc; + function::scalar_func_select_t selectFunc; + function::scalar_func_compile_exec_t compileFunc; }; class AggregateFunctionExpression : public FunctionExpression { diff --git a/src/include/binder/expression_binder.h b/src/include/binder/expression_binder.h index 70221ddcf8e..8d4567ef1ee 100644 --- a/src/include/binder/expression_binder.h +++ b/src/include/binder/expression_binder.h @@ -35,7 +35,6 @@ class ExpressionBinder { const Expression& expression, const std::vector& targets); static void validateDataType(const Expression& expr, const common::LogicalType& expectedType); -private: // TODO(Xiyang): move to an expression rewriter std::shared_ptr foldExpression(const std::shared_ptr& expression); @@ -74,6 +73,8 @@ class ExpressionBinder { const parser::ParsedExpression& parsedExpression, const std::string& functionName); std::shared_ptr bindScalarFunctionExpression( const expression_vector& children, const std::string& functionName); + std::shared_ptr bindRewriteFunctionExpression( + const parser::ParsedExpression& parsedExpression); std::shared_ptr bindAggregateFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName, bool isDistinct); @@ -83,8 +84,6 @@ class ExpressionBinder { std::shared_ptr rewriteFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName); std::unique_ptr createInternalNodeIDExpression(const Expression& node); - std::shared_ptr bindInternalIDExpression( - const std::shared_ptr& expression); std::shared_ptr bindStartNodeExpression(const Expression& expression); std::shared_ptr bindEndNodeExpression(const Expression& expression); std::shared_ptr bindLabelFunction(const Expression& expression); diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index 975c3cdd54b..f65178f529f 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -51,7 +51,6 @@ class Catalog { std::vector getTableEntries(transaction::Transaction* tx) const; std::vector getTableSchemas( transaction::Transaction* tx, const common::table_id_vector_t& tableIDs) const; - CatalogSet* getFunctions(transaction::Transaction* tx) const; common::table_id_t addNodeTableSchema(const binder::BoundCreateTableInfo& info); common::table_id_t addRelTableSchema(const binder::BoundCreateTableInfo& info); @@ -73,10 +72,11 @@ class Catalog { void setTableComment(common::table_id_t tableID, const std::string& comment); // ----------------------------- Functions ---------------------------- - common::ExpressionType getFunctionType( - transaction::Transaction* tx, const std::string& name) const; void addFunction(std::string name, function::function_set functionSet); void addBuiltInFunction(std::string name, function::function_set functionSet); + CatalogSet* getFunctions(transaction::Transaction* tx) const; + CatalogEntry* getFunctionEntry(transaction::Transaction* tx, const std::string& name); + bool containsMacro(transaction::Transaction* tx, const std::string& macroName) const; void addScalarMacroFunction( std::string name, std::unique_ptr macro); diff --git a/src/include/catalog/catalog_content.h b/src/include/catalog/catalog_content.h index 484aeb639a8..7cc32f32fda 100644 --- a/src/include/catalog/catalog_content.h +++ b/src/include/catalog/catalog_content.h @@ -36,8 +36,6 @@ class CatalogContent { private: // ----------------------------- Functions ---------------------------- - common::ExpressionType getFunctionType(const std::string& name) const; - void registerBuiltInFunctions(); bool containMacro(const std::string& macroName) const { diff --git a/src/include/catalog/catalog_entry/catalog_entry_type.h b/src/include/catalog/catalog_entry/catalog_entry_type.h index f0dcf30f8f5..e94d9590676 100644 --- a/src/include/catalog/catalog_entry/catalog_entry_type.h +++ b/src/include/catalog/catalog_entry/catalog_entry_type.h @@ -13,7 +13,8 @@ enum class CatalogEntryType : uint8_t { SCALAR_MACRO_ENTRY = 4, AGGREGATE_FUNCTION_ENTRY = 5, SCALAR_FUNCTION_ENTRY = 6, - TABLE_FUNCTION_ENTRY = 7, + REWRITE_FUNCTION_ENTRY = 7, + TABLE_FUNCTION_ENTRY = 8, }; } // namespace catalog diff --git a/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h b/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h index 90470208ff1..08d7d7da731 100644 --- a/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h +++ b/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h @@ -1,6 +1,5 @@ #pragma once -#include "catalog_entry.h" #include "function_catalog_entry.h" namespace kuzu { diff --git a/src/include/expression_evaluator/function_evaluator.h b/src/include/expression_evaluator/function_evaluator.h index 123c87eb539..e2535f9d02e 100644 --- a/src/include/expression_evaluator/function_evaluator.h +++ b/src/include/expression_evaluator/function_evaluator.h @@ -32,8 +32,8 @@ class FunctionExpressionEvaluator : public ExpressionEvaluator { private: std::shared_ptr expression; - function::scalar_exec_func execFunc; - function::scalar_select_func selectFunc; + function::scalar_func_exec_t execFunc; + function::scalar_func_select_t selectFunc; std::vector> parameters; }; diff --git a/src/include/function/arithmetic/vector_arithmetic_functions.h b/src/include/function/arithmetic/vector_arithmetic_functions.h index 99adf58cd89..862f9cb7899 100644 --- a/src/include/function/arithmetic/vector_arithmetic_functions.h +++ b/src/include/function/arithmetic/vector_arithmetic_functions.h @@ -10,7 +10,7 @@ struct ArithmeticFunction { template static std::unique_ptr getUnaryFunction( std::string name, common::LogicalTypeID operandTypeID) { - function::scalar_exec_func execFunc; + function::scalar_func_exec_t execFunc; getUnaryExecFunc(operandTypeID, execFunc); return std::make_unique(std::move(name), std::vector{operandTypeID}, operandTypeID, execFunc); @@ -27,7 +27,7 @@ struct ArithmeticFunction { template static inline std::unique_ptr getBinaryFunction( std::string name, common::LogicalTypeID operandTypeID) { - function::scalar_exec_func execFunc; + function::scalar_func_exec_t execFunc; getBinaryExecFunc(operandTypeID, execFunc); return std::make_unique(std::move(name), std::vector{operandTypeID, operandTypeID}, operandTypeID, @@ -44,7 +44,7 @@ struct ArithmeticFunction { private: template - static void getUnaryExecFunc(common::LogicalTypeID operandTypeID, scalar_exec_func& func) { + static void getUnaryExecFunc(common::LogicalTypeID operandTypeID, scalar_func_exec_t& func) { switch (operandTypeID) { case common::LogicalTypeID::SERIAL: case common::LogicalTypeID::INT64: { @@ -87,7 +87,7 @@ struct ArithmeticFunction { } template - static void getBinaryExecFunc(common::LogicalTypeID operandTypeID, scalar_exec_func& func) { + static void getBinaryExecFunc(common::LogicalTypeID operandTypeID, scalar_func_exec_t& func) { switch (operandTypeID) { case common::LogicalTypeID::SERIAL: case common::LogicalTypeID::INT64: { diff --git a/src/include/function/boolean/vector_boolean_functions.h b/src/include/function/boolean/vector_boolean_functions.h index 0eec1ee40cf..76252c8cd61 100644 --- a/src/include/function/boolean/vector_boolean_functions.h +++ b/src/include/function/boolean/vector_boolean_functions.h @@ -9,10 +9,10 @@ namespace function { class VectorBooleanFunction { public: static void bindExecFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func); + const binder::expression_vector& children, scalar_func_exec_t& func); static void bindSelectFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func); + const binder::expression_vector& children, scalar_func_select_t& func); private: template @@ -48,16 +48,16 @@ class VectorBooleanFunction { } static void bindBinaryExecFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func); + const binder::expression_vector& children, scalar_func_exec_t& func); static void bindBinarySelectFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func); + const binder::expression_vector& children, scalar_func_select_t& func); static void bindUnaryExecFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func); + const binder::expression_vector& children, scalar_func_exec_t& func); static void bindUnarySelectFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func); + const binder::expression_vector& children, scalar_func_select_t& func); }; } // namespace function diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index e93577f9755..647d9e776e3 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -111,15 +111,6 @@ class BuiltInFunctionsUtils { // Table functions. static void registerTableFunctions(catalog::CatalogSet* catalogSet); - - // Validations - static void validateNonEmptyCandidateFunctions( - std::vector& candidateFunctions, const std::string& name, - const std::vector& inputTypes, bool isDistinct, - function::function_set& set); - static void validateNonEmptyCandidateFunctions(std::vector& candidateFunctions, - const std::string& name, const std::vector& inputTypes, - function::function_set& set); }; } // namespace function diff --git a/src/include/function/comparison/vector_comparison_functions.h b/src/include/function/comparison/vector_comparison_functions.h index c2538eacb3d..5b39b939188 100644 --- a/src/include/function/comparison/vector_comparison_functions.h +++ b/src/include/function/comparison/vector_comparison_functions.h @@ -50,9 +50,9 @@ struct ComparisonFunction { const std::string& name, common::LogicalTypeID leftType, common::LogicalTypeID rightType) { auto leftPhysical = common::LogicalType::getPhysicalType(leftType); auto rightPhysical = common::LogicalType::getPhysicalType(rightType); - scalar_exec_func execFunc; + scalar_func_exec_t execFunc; getExecFunc(leftPhysical, rightPhysical, execFunc); - scalar_select_func selectFunc; + scalar_func_select_t selectFunc; getSelectFunc(leftPhysical, rightPhysical, selectFunc); return std::make_unique(name, std::vector{leftType, rightType}, common::LogicalTypeID::BOOL, @@ -62,8 +62,8 @@ struct ComparisonFunction { // When comparing two values, we guarantee that they must have the same dataType. So we only // need to switch the physical type to get the corresponding exec function. template - static void getExecFunc( - common::PhysicalTypeID leftType, common::PhysicalTypeID rightType, scalar_exec_func& func) { + static void getExecFunc(common::PhysicalTypeID leftType, common::PhysicalTypeID rightType, + scalar_func_exec_t& func) { switch (leftType) { case common::PhysicalTypeID::INT64: { func = BinaryComparisonExecFunction; @@ -130,7 +130,7 @@ struct ComparisonFunction { template static void getSelectFunc(common::PhysicalTypeID leftTypeID, common::PhysicalTypeID rightTypeID, - scalar_select_func& func) { + scalar_func_select_t& func) { KU_ASSERT(leftTypeID == rightTypeID); switch (leftTypeID) { case common::PhysicalTypeID::INT64: { diff --git a/src/include/function/function.h b/src/include/function/function.h index 71f0fd47389..6ab54329102 100644 --- a/src/include/function/function.h +++ b/src/include/function/function.h @@ -18,7 +18,13 @@ struct Function; using scalar_bind_func = std::function( const binder::expression_vector&, Function* definition)>; -enum class FunctionType : uint8_t { UNKNOWN = 0, SCALAR = 1, AGGREGATE = 2, TABLE = 3 }; +enum class FunctionType : uint8_t { + UNKNOWN = 0, + SCALAR = 1, + REWRITE = 2, + AGGREGATE = 3, + TABLE = 4 +}; struct Function { Function() : type{FunctionType::UNKNOWN} {}; @@ -28,7 +34,9 @@ struct Function { virtual ~Function() = default; - virtual std::string signatureToString() const = 0; + virtual std::string signatureToString() const { + return common::LogicalTypeUtils::toString(parameterTypeIDs); + } virtual std::unique_ptr copy() const = 0; @@ -45,14 +53,13 @@ struct BaseScalarFunction : public Function { : Function{type, std::move(name), std::move(parameterTypeIDs)}, returnTypeID{returnTypeID}, bindFunc{std::move(bindFunc)} {} - inline std::string signatureToString() const override { - std::string result = common::LogicalTypeUtils::toString(parameterTypeIDs); + std::string signatureToString() const override { + auto result = Function::signatureToString(); result += " -> " + common::LogicalTypeUtils::toString(returnTypeID); return result; } common::LogicalTypeID returnTypeID; - // This function is used to bind parameter/return types for functions with nested dataType. scalar_bind_func bindFunc; }; diff --git a/src/include/function/list/vector_list_functions.h b/src/include/function/list/vector_list_functions.h index f65fa957835..aa39c62e2d9 100644 --- a/src/include/function/list/vector_list_functions.h +++ b/src/include/function/list/vector_list_functions.h @@ -10,8 +10,9 @@ namespace function { struct ListFunction { template - static scalar_exec_func getBinaryListExecFuncSwitchRight(const common::LogicalType& rightType) { - scalar_exec_func execFunc; + static scalar_func_exec_t getBinaryListExecFuncSwitchRight( + const common::LogicalType& rightType) { + scalar_func_exec_t execFunc; switch (rightType.getPhysicalType()) { case common::PhysicalTypeID::BOOL: { execFunc = ScalarFunction::BinaryExecListStructFunction - static scalar_exec_func getBinaryListExecFuncSwitchAll(const common::LogicalType& type) { - scalar_exec_func execFunc; + static scalar_func_exec_t getBinaryListExecFuncSwitchAll(const common::LogicalType& type) { + scalar_func_exec_t execFunc; switch (type.getPhysicalType()) { case common::PhysicalTypeID::INT64: { execFunc = ScalarFunction::BinaryExecListStructFunction - static scalar_exec_func getTernaryListExecFuncSwitchAll(const common::LogicalType& type) { - scalar_exec_func execFunc; + static scalar_func_exec_t getTernaryListExecFuncSwitchAll(const common::LogicalType& type) { + scalar_func_exec_t execFunc; switch (type.getPhysicalType()) { case common::PhysicalTypeID::INT64: { execFunc = ScalarFunction::TernaryExecListStructFunction bindFunc( const binder::expression_vector& arguments, Function* function); template - static void getExecFunction(const binder::expression_vector& arguments, scalar_exec_func& func); + static void getExecFunction( + const binder::expression_vector& arguments, scalar_func_exec_t& func); }; struct ListReverseSortFunction { @@ -286,7 +288,8 @@ struct ListReverseSortFunction { static std::unique_ptr bindFunc( const binder::expression_vector& arguments, Function* function); template - static void getExecFunction(const binder::expression_vector& arguments, scalar_exec_func& func); + static void getExecFunction( + const binder::expression_vector& arguments, scalar_func_exec_t& func); }; struct ListSumFunction { diff --git a/src/include/function/null/vector_null_functions.h b/src/include/function/null/vector_null_functions.h index 6e1ec837b78..d54c17f7d1b 100644 --- a/src/include/function/null/vector_null_functions.h +++ b/src/include/function/null/vector_null_functions.h @@ -9,10 +9,10 @@ namespace function { class VectorNullFunction { public: static void bindExecFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_exec_func& func); + const binder::expression_vector& children, scalar_func_exec_t& func); static void bindSelectFunction(common::ExpressionType expressionType, - const binder::expression_vector& children, scalar_select_func& func); + const binder::expression_vector& children, scalar_func_select_t& func); private: template diff --git a/src/include/function/rewrite_function.h b/src/include/function/rewrite_function.h new file mode 100644 index 00000000000..5b9b0a45a52 --- /dev/null +++ b/src/include/function/rewrite_function.h @@ -0,0 +1,32 @@ +#pragma once + +#include "function.h" + +namespace kuzu { +namespace binder { +class ExpressionBinder; +} +namespace function { + +// Rewrite function to a different expression, e.g. id(n) -> n._id. +using rewrite_func_rewrite_t = std::function( + const binder::expression_vector&, binder::ExpressionBinder*)>; + +// We write for the following functions +// ID(n) -> n._id +struct RewriteFunction final : public Function { + + RewriteFunction(std::string name, std::vector parameterTypeIDs, + rewrite_func_rewrite_t rewriteFunc) + : Function{FunctionType::REWRITE, name, std::move(parameterTypeIDs)}, rewriteFunc{ + rewriteFunc} {} + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } + + rewrite_func_rewrite_t rewriteFunc; +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/scalar_function.h b/src/include/function/scalar_function.h index eb89db0d9f8..cde381e5f1d 100644 --- a/src/include/function/scalar_function.h +++ b/src/include/function/scalar_function.h @@ -8,43 +8,45 @@ #include "unary_function_executor.h" namespace kuzu { -namespace function { -struct ScalarFunction; +namespace function { -using scalar_compile_func = +// Evaluate function at compile time, e.g. struct_extraction. +using scalar_func_compile_exec_t = std::function>&, std::shared_ptr&)>; -using scalar_exec_func = std::function>&, common::ValueVector&, void*)>; -using scalar_select_func = std::function>&, common::SelectionVector&)>; using function_set = std::vector>; struct ScalarFunction final : public BaseScalarFunction { ScalarFunction(std::string name, std::vector parameterTypeIDs, - common::LogicalTypeID returnTypeID, scalar_exec_func execFunc, bool isVarLength = false) + common::LogicalTypeID returnTypeID, scalar_func_exec_t execFunc, bool isVarLength = false) : ScalarFunction{std::move(name), std::move(parameterTypeIDs), returnTypeID, std::move(execFunc), nullptr, nullptr, nullptr, isVarLength} {} ScalarFunction(std::string name, std::vector parameterTypeIDs, - common::LogicalTypeID returnTypeID, scalar_exec_func execFunc, - scalar_select_func selectFunc, bool isVarLength = false) + common::LogicalTypeID returnTypeID, scalar_func_exec_t execFunc, + scalar_func_select_t selectFunc, bool isVarLength = false) : ScalarFunction{std::move(name), std::move(parameterTypeIDs), returnTypeID, std::move(execFunc), std::move(selectFunc), nullptr, nullptr, isVarLength} {} ScalarFunction(std::string name, std::vector parameterTypeIDs, - common::LogicalTypeID returnTypeID, scalar_exec_func execFunc, - scalar_select_func selectFunc, scalar_bind_func bindFunc, bool isVarLength = false) + common::LogicalTypeID returnTypeID, scalar_func_exec_t execFunc, + scalar_func_select_t selectFunc, scalar_bind_func bindFunc, bool isVarLength = false) : ScalarFunction{std::move(name), std::move(parameterTypeIDs), returnTypeID, std::move(execFunc), std::move(selectFunc), nullptr, std::move(bindFunc), isVarLength} {} ScalarFunction(std::string name, std::vector parameterTypeIDs, - common::LogicalTypeID returnTypeID, scalar_exec_func execFunc, - scalar_select_func selectFunc, scalar_compile_func compileFunc, scalar_bind_func bindFunc, - bool isVarLength = false) + common::LogicalTypeID returnTypeID, scalar_func_exec_t execFunc, + scalar_func_select_t selectFunc, scalar_func_compile_exec_t compileFunc, + scalar_bind_func bindFunc, bool isVarLength = false) : BaseScalarFunction{FunctionType::SCALAR, std::move(name), std::move(parameterTypeIDs), returnTypeID, std::move(bindFunc)}, execFunc{std::move(execFunc)}, selectFunc(std::move(selectFunc)), @@ -188,9 +190,9 @@ struct ScalarFunction final : public BaseScalarFunction { return std::make_unique(*this); } - scalar_exec_func execFunc; - scalar_select_func selectFunc; - scalar_compile_func compileFunc; + scalar_func_exec_t execFunc; + scalar_func_select_t selectFunc; + scalar_func_compile_exec_t compileFunc; // Currently we only one variable-length function which is list creation. The expectation is // that all parameters must have the same type as parameterTypes[0]. bool isVarLength; diff --git a/src/include/function/schema/vector_node_rel_functions.h b/src/include/function/schema/vector_node_rel_functions.h index 7d88a743c41..b6ccd51de88 100644 --- a/src/include/function/schema/vector_node_rel_functions.h +++ b/src/include/function/schema/vector_node_rel_functions.h @@ -15,5 +15,9 @@ struct OffsetFunction { } }; +struct IDFunction { + static function_set getFunctionSet(); +}; + } // namespace function } // namespace kuzu diff --git a/src/include/function/struct/vector_struct_functions.h b/src/include/function/struct/vector_struct_functions.h index 0dd0f17f064..4b41287d381 100644 --- a/src/include/function/struct/vector_struct_functions.h +++ b/src/include/function/struct/vector_struct_functions.h @@ -30,6 +30,7 @@ struct StructExtractBindData : public FunctionBindData { struct StructExtractFunctions { static function_set getFunctionSet(); + static std::unique_ptr getFunction(common::LogicalTypeID logicalTypeID); static std::unique_ptr bindFunc( const binder::expression_vector& arguments, Function* function); diff --git a/src/include/function/udf_function.h b/src/include/function/udf_function.h index 72d4bcd6b2a..50cf3f317ad 100644 --- a/src/include/function/udf_function.h +++ b/src/include/function/udf_function.h @@ -80,13 +80,13 @@ struct UDF { } template - static function::scalar_exec_func createUnaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), + static function::scalar_func_exec_t createUnaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), const std::vector& /*parameterTypes*/) { KU_UNREACHABLE; } template - static function::scalar_exec_func createUnaryExecFunc(RESULT_TYPE (*udfFunc)(OPERAND_TYPE), + static function::scalar_func_exec_t createUnaryExecFunc(RESULT_TYPE (*udfFunc)(OPERAND_TYPE), const std::vector& parameterTypes) { if (parameterTypes.size() != 1) { throw common::CatalogException{ @@ -94,7 +94,7 @@ struct UDF { std::to_string(parameterTypes.size()) + "."}; } validateType(parameterTypes[0]); - function::scalar_exec_func execFunc = + function::scalar_func_exec_t execFunc = [=](const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) -> void { KU_ASSERT(params.size() == 1); @@ -105,13 +105,13 @@ struct UDF { } template - static function::scalar_exec_func createBinaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), + static function::scalar_func_exec_t createBinaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), const std::vector& /*parameterTypes*/) { KU_UNREACHABLE; } template - static function::scalar_exec_func createBinaryExecFunc( + static function::scalar_func_exec_t createBinaryExecFunc( RESULT_TYPE (*udfFunc)(LEFT_TYPE, RIGHT_TYPE), const std::vector& parameterTypes) { if (parameterTypes.size() != 2) { @@ -121,7 +121,7 @@ struct UDF { } validateType(parameterTypes[0]); validateType(parameterTypes[1]); - function::scalar_exec_func execFunc = + function::scalar_func_exec_t execFunc = [=](const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) -> void { KU_ASSERT(params.size() == 2); @@ -132,13 +132,13 @@ struct UDF { } template - static function::scalar_exec_func createTernaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), + static function::scalar_func_exec_t createTernaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), const std::vector& /*parameterTypes*/) { KU_UNREACHABLE; } template - static function::scalar_exec_func createTernaryExecFunc( + static function::scalar_func_exec_t createTernaryExecFunc( RESULT_TYPE (*udfFunc)(A_TYPE, B_TYPE, C_TYPE), std::vector parameterTypes) { if (parameterTypes.size() != 3) { @@ -149,7 +149,7 @@ struct UDF { validateType(parameterTypes[0]); validateType(parameterTypes[1]); validateType(parameterTypes[2]); - function::scalar_exec_func execFunc = + function::scalar_func_exec_t execFunc = [=](const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) -> void { KU_ASSERT(params.size() == 3); @@ -160,7 +160,7 @@ struct UDF { } template - static scalar_exec_func getScalarExecFunc( + static scalar_func_exec_t getScalarExecFunc( TR (*udfFunc)(Args...), std::vector parameterTypes) { constexpr auto numArgs = sizeof...(Args); switch (numArgs) { @@ -222,7 +222,7 @@ struct UDF { KU_UNREACHABLE; } validateType

    (returnType); - scalar_exec_func scalarExecFunc = getScalarExecFunc(udfFunc, parameterTypes); + scalar_func_exec_t scalarExecFunc = getScalarExecFunc(udfFunc, parameterTypes); definitions.push_back(std::make_unique( std::move(name), std::move(parameterTypes), returnType, std::move(scalarExecFunc))); return definitions; @@ -235,14 +235,14 @@ struct UDF { } template - static function_set getVectorizedFunction(std::string name, scalar_exec_func execFunc) { + static function_set getVectorizedFunction(std::string name, scalar_func_exec_t execFunc) { function_set definitions; definitions.push_back(std::make_unique(std::move(name), getParameterTypes(), getParameterType(), std::move(execFunc))); return definitions; } - static function_set getVectorizedFunction(std::string name, scalar_exec_func execFunc, + static function_set getVectorizedFunction(std::string name, scalar_func_exec_t execFunc, std::vector parameterTypes, common::LogicalTypeID returnType) { function_set definitions; definitions.push_back(std::make_unique( diff --git a/src/include/main/connection.h b/src/include/main/connection.h index 38c3c601154..aa6f6cfefd2 100644 --- a/src/include/main/connection.h +++ b/src/include/main/connection.h @@ -112,7 +112,7 @@ class Connection { } template - void createVectorizedFunction(std::string name, function::scalar_exec_func scalarFunc) { + void createVectorizedFunction(std::string name, function::scalar_func_exec_t scalarFunc) { auto autoTrx = startUDFAutoTrx(clientContext->getTransactionContext()); auto nameCopy = std::string(name); addScalarFunction(std::move(nameCopy), function::UDF::getVectorizedFunction( @@ -122,7 +122,7 @@ class Connection { void createVectorizedFunction(std::string name, std::vector parameterTypes, common::LogicalTypeID returnType, - function::scalar_exec_func scalarFunc) { + function::scalar_func_exec_t scalarFunc) { auto autoTrx = startUDFAutoTrx(clientContext->getTransactionContext()); auto nameCopy = std::string(name); addScalarFunction( diff --git a/src/include/parser/expression/parsed_function_expression.h b/src/include/parser/expression/parsed_function_expression.h index 1c9e7951c44..ac9f4b18046 100644 --- a/src/include/parser/expression/parsed_function_expression.h +++ b/src/include/parser/expression/parsed_function_expression.h @@ -1,5 +1,6 @@ #pragma once +#include "common/string_utils.h" #include "parsed_expression.h" namespace kuzu { @@ -34,7 +35,10 @@ class ParsedFunctionExpression : public ParsedExpression { inline bool getIsDistinct() const { return isDistinct; } - inline std::string getFunctionName() const { return functionName; } + std::string getFunctionName() const { return functionName; } + std::string getNormalizedFunctionName() const { + return common::StringUtils::getUpper(functionName); + } // A function might have more than 2 parameters. inline void addChild(std::unique_ptr child) { diff --git a/src/include/processor/operator/persistent/copy_to_csv.h b/src/include/processor/operator/persistent/copy_to_csv.h index e4fe6a602ab..0bac084afd5 100644 --- a/src/include/processor/operator/persistent/copy_to_csv.h +++ b/src/include/processor/operator/persistent/copy_to_csv.h @@ -49,7 +49,7 @@ class CopyToCSVLocalState final : public CopyToLocalState { std::unique_ptr unflatCastDataChunk; std::unique_ptr flatCastDataChunk; std::vector castVectors; - std::vector castFuncs; + std::vector castFuncs; std::vector> vectorsToCast; }; diff --git a/test/test_files/tinysnb/exception/relation.test b/test/test_files/tinysnb/exception/relation.test index 78191ab81d9..e9c8c64093f 100644 --- a/test/test_files/tinysnb/exception/relation.test +++ b/test/test_files/tinysnb/exception/relation.test @@ -3,17 +3,20 @@ -- --CASE ReadVarlengthRelPropertyTest1 +-CASE ReadVarlengthRelPropertyTest + -STATEMENT MATCH (a:person)-[e:knows*1..3]->(b:person) RETURN e.age ---- error Binder exception: e has data type RECURSIVE_REL but (NODE,REL,STRUCT) was expected. --CASE ReadVarlengthRelPropertyTest2 + -STATEMENT MATCH (a:person)-[e:knows*1..3]->(b:person) WHERE ID(e) = 0 RETURN COUNT(*) ---- error -Binder exception: e has data type RECURSIVE_REL but (NODE,REL,STRUCT) was expected. +Binder exception: Cannot match a built-in function for given function ID(RECURSIVE_REL). Supported inputs are +(NODE) +(REL) +(STRUCT) --CASE AccessRelInternalIDTest -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE e._id > 1 RETURN COUNT(*) ---- error Binder exception: _id is reserved for system usage. External access is not allowed. From f12e5e756e7c545dc5c6360b1868713a5c8c9884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Mon, 18 Mar 2024 21:35:34 +0800 Subject: [PATCH 043/136] Remove unnecessary components for pip package (#3074) * Remove unnecessary components for pip package * Fix format * Fix conditional statement in CMakeLists.txt * Keep scripts * Use alternative way to skip extension building --- CMakeLists.txt | 4 +++- scripts/pip-package/package_tar.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a2bbff5f91d..79a6044af36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,7 +226,9 @@ elseif (${BUILD_BENCHMARK}) endif () add_subdirectory(tools) endif () -add_subdirectory(extension) +if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/extension/CMakeLists.txt") + add_subdirectory(extension) +endif () if (${BUILD_EXAMPLES}) add_subdirectory(examples/c) diff --git a/scripts/pip-package/package_tar.py b/scripts/pip-package/package_tar.py index 243131c90b9..9baaf416dec 100755 --- a/scripts/pip-package/package_tar.py +++ b/scripts/pip-package/package_tar.py @@ -52,6 +52,15 @@ def _get_kuzu_version(): os.remove(os.path.join(tempdir, "kuzu-source.tar")) + # Remove components that are not needed for the pip package + shutil.rmtree(os.path.join(tempdir, "kuzu-source/dataset")) + shutil.rmtree(os.path.join(tempdir, "kuzu-source/examples")) + shutil.rmtree(os.path.join(tempdir, "kuzu-source/benchmark")) + shutil.rmtree(os.path.join(tempdir, "kuzu-source/logo")) + shutil.rmtree(os.path.join(tempdir, "kuzu-source/extension")) + shutil.rmtree(os.path.join(tempdir, "kuzu-source/test")) + shutil.rmtree(os.path.join(tempdir, "kuzu-source/.github")) + os.makedirs(os.path.join(tempdir, "kuzu")) for path in ["setup.py", "setup.cfg", "MANIFEST.in"]: shutil.copy2(path, os.path.join(tempdir, path)) From cc9322628d2d437bc61a9dcf5b95148019fca5db Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Sun, 17 Mar 2024 22:09:01 -0400 Subject: [PATCH 044/136] Implement catalog cache for postgres scanner --- extension/duckdb_scanner/CMakeLists.txt | 4 +- .../duckdb_scanner/src/duckdb_catalog.cpp | 29 +++++++ extension/duckdb_scanner/src/duckdb_scan.cpp | 43 +++-------- .../duckdb_scanner/src/duckdb_storage.cpp | 77 ++++++++++++++++++- .../src/duckdb_table_catalog_entry.cpp | 20 +++++ .../src/include/duckdb_catalog.h | 33 ++++++++ .../duckdb_scanner/src/include/duckdb_scan.h | 6 +- .../src/include/duckdb_table_catalog_entry.h | 33 ++++++++ .../test/test_files/duckdb_scanner.test | 6 +- src/binder/bind/bind_reading_clause.cpp | 7 +- src/catalog/catalog_content.cpp | 19 +++-- .../binder/ddl/bound_create_table_info.h | 57 ++++++++------ src/include/catalog/catalog_content.h | 20 +++-- .../catalog/catalog_entry/catalog_entry.h | 2 +- .../catalog_entry/catalog_entry_type.h | 1 + .../catalog_entry/table_catalog_entry.h | 9 ++- src/include/catalog/catalog_set.h | 2 +- src/include/catalog/property.h | 8 +- src/include/common/enums/table_type.h | 1 + src/include/common/types/ku_string.h | 14 ++-- src/include/common/vector/value_vector.h | 18 ++--- src/include/main/attached_database.h | 11 +-- src/include/main/client_context.h | 2 +- src/include/storage/storage_extension.h | 7 +- src/main/database_manager.cpp | 10 ++- src/processor/operator/attach_database.cpp | 3 +- 26 files changed, 323 insertions(+), 119 deletions(-) create mode 100644 extension/duckdb_scanner/src/duckdb_catalog.cpp create mode 100644 extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp create mode 100644 extension/duckdb_scanner/src/include/duckdb_catalog.h create mode 100644 extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h diff --git a/extension/duckdb_scanner/CMakeLists.txt b/extension/duckdb_scanner/CMakeLists.txt index 7f33580c469..8adca714d24 100644 --- a/extension/duckdb_scanner/CMakeLists.txt +++ b/extension/duckdb_scanner/CMakeLists.txt @@ -10,7 +10,9 @@ add_library(duckdb_scanner src/duckdb_scanner_extension.cpp src/duckdb_storage.cpp src/duckdb_scan.cpp - src/duckdb_type_converter.cpp) + src/duckdb_type_converter.cpp + src/duckdb_catalog.cpp + src/duckdb_table_catalog_entry.cpp) set_target_properties(duckdb_scanner PROPERTIES OUTPUT_NAME duckdb_scanner diff --git a/extension/duckdb_scanner/src/duckdb_catalog.cpp b/extension/duckdb_scanner/src/duckdb_catalog.cpp new file mode 100644 index 00000000000..1bf5cb263fc --- /dev/null +++ b/extension/duckdb_scanner/src/duckdb_catalog.cpp @@ -0,0 +1,29 @@ +#include "duckdb_catalog.h" + +namespace kuzu { +namespace duckdb_scanner { + +common::table_id_t DuckDBCatalogContent::createForeignTable( + const binder::BoundCreateTableInfo& info) { + auto tableID = assignNextTableID(); + auto extraInfo = common::ku_dynamic_cast(info.extraInfo.get()); + std::vector columnTypes; + std::vector columnNames; + for (auto& propertyInfo : extraInfo->propertyInfos) { + columnNames.push_back(propertyInfo.name); + columnTypes.push_back(propertyInfo.type); + } + DuckDBScanBindData bindData(common::stringFormat("SELECT * FROM {}", info.tableName), + extraInfo->dbPath, std::move(columnTypes), std::move(columnNames)); + auto tableEntry = std::make_unique( + info.tableName, tableID, getScanFunction(std::move(bindData))); + for (auto& propertyInfo : extraInfo->propertyInfos) { + tableEntry->addProperty(propertyInfo.name, propertyInfo.type.copy()); + } + tables->createEntry(std::move(tableEntry)); + return tableID; +} + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/duckdb_scan.cpp b/extension/duckdb_scanner/src/duckdb_scan.cpp index b2225972f9a..95b0aa7ee9b 100644 --- a/extension/duckdb_scanner/src/duckdb_scan.cpp +++ b/extension/duckdb_scanner/src/duckdb_scan.cpp @@ -2,7 +2,6 @@ #include "common/exception/binder.h" #include "common/types/types.h" -#include "duckdb_type_converter.h" #include "function/table/bind_input.h" using namespace kuzu::function; @@ -38,8 +37,8 @@ struct DuckDBScanFunction { static common::offset_t tableFunc( function::TableFuncInput& input, function::TableFuncOutput& output); - static std::unique_ptr bindFunc( - std::string dbPath, main::ClientContext* /*context*/, function::TableFuncBindInput* input); + static std::unique_ptr bindFunc(DuckDBScanBindData bindData, + main::ClientContext* /*context*/, function::TableFuncBindInput* input); static std::unique_ptr initSharedState( function::TableFunctionInitInput& input); @@ -211,40 +210,18 @@ common::offset_t DuckDBScanFunction::tableFunc( return output.dataChunk.state->selVector->selectedSize; } -std::unique_ptr DuckDBScanFunction::bindFunc(std::string dbPath, - main::ClientContext* /*clientContext*/, function::TableFuncBindInput* input) { - auto tableName = input->inputs[0].getValue(); - duckdb::DBConfig dbConfig{true /* read_only */}; - duckdb::DuckDB db(dbPath, &dbConfig); - duckdb::Connection conn(db); - auto result = conn.Query( - common::stringFormat("select data_type,column_name from information_schema.columns where " - "table_name = '{}' and table_schema='main';", - tableName)); - if (result->RowCount() == 0) { - throw common::BinderException( - common::stringFormat("No table named: {} in database.", tableName)); - } - std::vector columnTypes; - std::vector columnNames; - columnTypes.reserve(result->RowCount()); - columnNames.reserve(result->RowCount()); - for (auto i = 0u; i < result->RowCount(); i++) { - columnTypes.push_back( - DuckDBTypeConverter::convertDuckDBType(result->GetValue(0, i).GetValue())); - columnNames.push_back(result->GetValue(1, i).GetValue()); - } - auto query = common::stringFormat("SELECT * FROM {}", tableName); - return std::make_unique( - query, dbPath, std::move(columnTypes), std::move(columnNames)); +std::unique_ptr DuckDBScanFunction::bindFunc( + DuckDBScanBindData bindData, main::ClientContext* /*clientContext*/, + function::TableFuncBindInput* /*input*/) { + return bindData.copy(); } -TableFunction getScanFunction(std::string dbPath) { +TableFunction getScanFunction(DuckDBScanBindData bindData) { return TableFunction(DuckDBScanFunction::DUCKDB_SCAN_FUNC_NAME, DuckDBScanFunction::tableFunc, - std::bind( - DuckDBScanFunction::bindFunc, dbPath, std::placeholders::_1, std::placeholders::_2), + std::bind(DuckDBScanFunction::bindFunc, std::move(bindData), std::placeholders::_1, + std::placeholders::_2), DuckDBScanFunction::initSharedState, DuckDBScanFunction::initLocalState, - std::vector{LogicalTypeID::STRING}); + std::vector{}); } } // namespace duckdb_scanner diff --git a/extension/duckdb_scanner/src/duckdb_storage.cpp b/extension/duckdb_scanner/src/duckdb_storage.cpp index b0f130d38a4..b3413d63834 100644 --- a/extension/duckdb_scanner/src/duckdb_storage.cpp +++ b/extension/duckdb_scanner/src/duckdb_storage.cpp @@ -1,11 +1,84 @@ #include "duckdb_storage.h" +#include "binder/ddl/bound_create_table_info.h" +#include "catalog/catalog_entry/table_catalog_entry.h" +#include "common/exception/binder.h" +#include "duckdb_catalog.h" #include "duckdb_scan.h" +#include "duckdb_type_converter.h" namespace kuzu { namespace duckdb_scanner { -std::unique_ptr attachDuckDB(std::string dbName, std::string dbPath) { +static bool getTableInfo(duckdb::Connection& con, std::string tableName, + std::vector& columnTypes, std::vector& columnNames) { + auto result = con.Query( + common::stringFormat("select data_type,column_name from information_schema.columns where " + "table_name = '{}' and table_schema='main';", + tableName)); + if (result->RowCount() == 0) { + return false; + } + columnTypes.reserve(result->RowCount()); + columnNames.reserve(result->RowCount()); + for (auto i = 0u; i < result->RowCount(); i++) { + try { + columnTypes.push_back(DuckDBTypeConverter::convertDuckDBType( + result->GetValue(0, i).GetValue())); + } catch (common::BinderException& e) { return false; } + columnNames.push_back(result->GetValue(1, i).GetValue()); + } + return true; +} + +std::unique_ptr getCreateTableInfo( + duckdb::Connection& con, std::string tableName, std::string dbPath) { + std::vector columnTypes; + std::vector columnNames; + if (!getTableInfo(con, tableName, columnTypes, columnNames)) { + return nullptr; + } + std::vector propertyInfos; + for (auto i = 0u; i < columnNames.size(); i++) { + auto propertyInfo = binder::PropertyInfo(columnNames[i], columnTypes[i]); + propertyInfos.push_back(std::move(propertyInfo)); + } + return std::make_unique(common::TableType::FOREIGN, tableName, + std::make_unique( + std::move(dbPath), std::move(propertyInfos))); +} + +std::unique_ptr createCatalog( + std::string dbPath, main::ClientContext* context) { + duckdb::DuckDB db(dbPath); + duckdb::Connection con(db); + auto query = "select table_name from information_schema.tables where table_schema = 'main';"; + auto result = con.SendQuery(query); + std::unique_ptr resultChunk; + try { + resultChunk = result->Fetch(); + } catch (std::exception& e) { return 0; } + if (resultChunk == nullptr) { + return 0; + } + auto tableNamesVector = std::make_unique( + common::LogicalTypeID::STRING, context->getMemoryManager()); + duckdb_conversion_func_t conversionFunc; + getDuckDBVectorConversionFunc(common::PhysicalTypeID::STRING, conversionFunc); + conversionFunc(resultChunk->data[0], *tableNamesVector, resultChunk->size()); + std::unique_ptr catalogContent = std::make_unique(); + for (auto i = 0u; i < resultChunk->size(); i++) { + auto tableName = tableNamesVector->getValue(i).getAsString(); + auto createTableInfo = getCreateTableInfo(con, tableName, dbPath); + if (createTableInfo != nullptr) { + catalogContent->createForeignTable(*createTableInfo); + } + } + return catalogContent; +} + +std::unique_ptr attachDuckDB( + std::string dbName, std::string dbPath, main::ClientContext* clientContext) { if (dbName == "") { if (dbPath.find('.') != std::string::npos) { auto fileNamePos = dbPath.find_last_of('/') + 1; @@ -14,7 +87,7 @@ std::unique_ptr attachDuckDB(std::string dbName, std::st dbName = dbPath; } } - return std::make_unique(dbName, getScanFunction(dbPath)); + return std::make_unique(dbName, createCatalog(dbPath, clientContext)); } DuckDBStorageExtension::DuckDBStorageExtension() : StorageExtension{attachDuckDB} {} diff --git a/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp b/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp new file mode 100644 index 00000000000..caf1267e7a2 --- /dev/null +++ b/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp @@ -0,0 +1,20 @@ +#include "duckdb_table_catalog_entry.h" + +namespace kuzu { +namespace catalog { + +DuckDBTableCatalogEntry::DuckDBTableCatalogEntry( + std::string name, common::table_id_t tableID, function::TableFunction scanFunction) + : TableCatalogEntry{CatalogEntryType::FOREIGN_TABLE_ENTRY, std::move(name), tableID}, + scanFunction{std::move(scanFunction)} {} + +common::TableType DuckDBTableCatalogEntry::getTableType() const { + return common::TableType::FOREIGN; +} + +std::unique_ptr DuckDBTableCatalogEntry::copy() const { + return std::make_unique(*this); +} + +} // namespace catalog +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_catalog.h b/extension/duckdb_scanner/src/include/duckdb_catalog.h new file mode 100644 index 00000000000..8ba6c0a3dd7 --- /dev/null +++ b/extension/duckdb_scanner/src/include/duckdb_catalog.h @@ -0,0 +1,33 @@ +#pragma once + +#include "catalog/catalog_content.h" +#include "catalog/catalog_entry/table_catalog_entry.h" +#include "duckdb_scan.h" +#include "duckdb_table_catalog_entry.h" + +namespace kuzu { +namespace duckdb_scanner { + +struct BoundExtraCreateDuckDBTableInfo final : public binder::BoundExtraCreateTableInfo { + std::string dbPath; + + BoundExtraCreateDuckDBTableInfo( + std::string dbPath, std::vector propertyInfos) + : BoundExtraCreateTableInfo{std::move(propertyInfos)}, dbPath{std::move(dbPath)} {} + BoundExtraCreateDuckDBTableInfo(const BoundExtraCreateDuckDBTableInfo& other) + : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, dbPath{other.dbPath} {} + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } +}; + +class DuckDBCatalogContent : public catalog::CatalogContent { +public: + DuckDBCatalogContent() : catalog::CatalogContent{nullptr /* vfs */} {} + + common::table_id_t createForeignTable(const binder::BoundCreateTableInfo& info); +}; + +} // namespace duckdb_scanner +} // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_scan.h b/extension/duckdb_scanner/src/include/duckdb_scan.h index 94a3eed4374..a783dfeb453 100644 --- a/extension/duckdb_scanner/src/include/duckdb_scan.h +++ b/extension/duckdb_scanner/src/include/duckdb_scan.h @@ -9,6 +9,7 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" // Supress warnings from duckdb.hpp #undef ARROW_FLAG_DICTIONARY_ORDERED +#include "common/types/types.h" #include "duckdb.hpp" #pragma GCC diagnostic pop @@ -35,7 +36,10 @@ struct DuckDBScanSharedState : public function::TableFuncSharedState { std::unique_ptr queryResult; }; -function::TableFunction getScanFunction(std::string dbPath); +void getDuckDBVectorConversionFunc( + common::PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func); + +function::TableFunction getScanFunction(DuckDBScanBindData bindData); } // namespace duckdb_scanner } // namespace kuzu diff --git a/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h b/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h new file mode 100644 index 00000000000..b896fc6ec2a --- /dev/null +++ b/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h @@ -0,0 +1,33 @@ +#pragma once + +#include "catalog/catalog_entry/table_catalog_entry.h" +#include "function/table_functions.h" + +namespace kuzu { +namespace catalog { + +class DuckDBTableCatalogEntry final : public TableCatalogEntry { +public: + //===--------------------------------------------------------------------===// + // constructors + //===--------------------------------------------------------------------===// + DuckDBTableCatalogEntry( + std::string name, common::table_id_t tableID, function::TableFunction scanFunction); + + //===--------------------------------------------------------------------===// + // getter & setter + //===--------------------------------------------------------------------===// + common::TableType getTableType() const override; + function::TableFunction getScanFunction() override { return scanFunction; } + + //===--------------------------------------------------------------------===// + // serialization & deserialization + //===--------------------------------------------------------------------===// + std::unique_ptr copy() const override; + +private: + function::TableFunction scanFunction; +}; + +} // namespace catalog +} // namespace kuzu diff --git a/extension/duckdb_scanner/test/test_files/duckdb_scanner.test b/extension/duckdb_scanner/test/test_files/duckdb_scanner.test index 05a6ea6374d..aa5a891cd63 100644 --- a/extension/duckdb_scanner/test/test_files/duckdb_scanner.test +++ b/extension/duckdb_scanner/test/test_files/duckdb_scanner.test @@ -37,7 +37,7 @@ The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie|2544| the movie is very v 49992|50|31.582059|False|2056-05-02||[62,24,94]|[LpQO8OT3x45a]|[[268,281,166],[144,16,126,208,298],[22,287]]|{ID: 936, "name": sGPSafxMAhKiP} -STATEMENT LOAD FROM tinysnb_person1 RETURN *; ---- error -Binder exception: No table named: person1 in database. +Catalog exception: Table: person1 does not exist. -STATEMENT DETACH tinysnb; ---- ok -STATEMENT LOAD FROM tinysnb_person RETURN *; @@ -57,10 +57,6 @@ Binder exception: No database named tinysnb has been attached. -STATEMENT LOAD FROM tinysnb_person RETURN count(*); ---- 1 8 --LOG UnsupportedDuckDBType --STATEMENT LOAD FROM tinysnb_unsupportedType RETURN *; ----- error -Binder exception: Unsupported duckdb type: ENUM('sad', 'ok', 'happy'). -CASE InvalidDuckDBDatabase -STATEMENT LOAD FROM tinysnb1_person RETURN *; diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index cb06e92091a..36dc3816878 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -179,9 +179,12 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re throw BinderException{ common::stringFormat("No database named {} has been attached.", dbName)}; } - scanFunction = attachedDB->getScanFunction(); + auto tableName = common::StringUtils::split(objectName, "_")[1]; + auto tableID = attachedDB->getCatalogContent()->getTableID(tableName); + auto tableCatalogEntry = ku_dynamic_cast( + attachedDB->getCatalogContent()->getTableCatalogEntry(tableID)); + scanFunction = tableCatalogEntry->getScanFunction(); bindInput = std::make_unique(); - bindInput->inputs.push_back(Value(common::StringUtils::split(objectName, "_")[1])); } } break; case ScanSourceType::FILE: { diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index bfc5d307242..c687e12fb16 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -40,8 +40,9 @@ CatalogContent::CatalogContent(const std::string& directory, VirtualFileSystem* table_id_t CatalogContent::createNodeTable(const binder::BoundCreateTableInfo& info) { table_id_t tableID = assignNextTableID(); - auto extraInfo = ku_dynamic_cast( - info.extraInfo.get()); + auto extraInfo = + ku_dynamic_cast( + info.extraInfo.get()); auto nodeTableEntry = std::make_unique(info.tableName, tableID, extraInfo->primaryKeyIdx); for (auto& propertyInfo : extraInfo->propertyInfos) { @@ -54,8 +55,9 @@ table_id_t CatalogContent::createNodeTable(const binder::BoundCreateTableInfo& i table_id_t CatalogContent::createRelTable(const binder::BoundCreateTableInfo& info) { table_id_t tableID = assignNextTableID(); - auto extraInfo = ku_dynamic_cast( - info.extraInfo.get()); + auto extraInfo = + ku_dynamic_cast( + info.extraInfo.get()); auto srcTableEntry = ku_dynamic_cast( getTableCatalogEntry(extraInfo->srcTableID)); auto dstTableEntry = ku_dynamic_cast( @@ -91,17 +93,18 @@ table_id_t CatalogContent::createRelGroup(const binder::BoundCreateTableInfo& in table_id_t CatalogContent::createRDFGraph(const binder::BoundCreateTableInfo& info) { table_id_t rdfGraphID = assignNextTableID(); - auto extraInfo = ku_dynamic_cast( - info.extraInfo.get()); + auto extraInfo = + ku_dynamic_cast( + info.extraInfo.get()); auto& resourceInfo = extraInfo->resourceInfo; auto& literalInfo = extraInfo->literalInfo; auto& resourceTripleInfo = extraInfo->resourceTripleInfo; auto& literalTripleInfo = extraInfo->literalTripleInfo; auto resourceTripleExtraInfo = - ku_dynamic_cast( + ku_dynamic_cast( resourceTripleInfo.extraInfo.get()); auto literalTripleExtraInfo = - ku_dynamic_cast( + ku_dynamic_cast( literalTripleInfo.extraInfo.get()); // Resource table auto resourceTableID = createNodeTable(resourceInfo); diff --git a/src/include/binder/ddl/bound_create_table_info.h b/src/include/binder/ddl/bound_create_table_info.h index ea9d35f10ea..9a7abde7c76 100644 --- a/src/include/binder/ddl/bound_create_table_info.h +++ b/src/include/binder/ddl/bound_create_table_info.h @@ -11,18 +11,18 @@ enum class RelMultiplicity : uint8_t; } namespace binder { -struct BoundExtraCreateTableInfo { - virtual ~BoundExtraCreateTableInfo() = default; - virtual inline std::unique_ptr copy() const = 0; +struct BoundExtraCreateCatalogEntryInfo { + virtual ~BoundExtraCreateCatalogEntryInfo() = default; + virtual inline std::unique_ptr copy() const = 0; }; struct BoundCreateTableInfo { common::TableType type; std::string tableName; - std::unique_ptr extraInfo; + std::unique_ptr extraInfo; BoundCreateTableInfo(common::TableType type, std::string tableName, - std::unique_ptr extraInfo) + std::unique_ptr extraInfo) : type{type}, tableName{std::move(tableName)}, extraInfo{std::move(extraInfo)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundCreateTableInfo); @@ -43,44 +43,57 @@ struct PropertyInfo { PropertyInfo(const PropertyInfo& other) : name{other.name}, type{other.type} {} }; -struct BoundExtraCreateNodeTableInfo : public BoundExtraCreateTableInfo { - common::property_id_t primaryKeyIdx; +struct BoundExtraCreateTableInfo : public BoundExtraCreateCatalogEntryInfo { std::vector propertyInfos; + explicit BoundExtraCreateTableInfo(std::vector propertyInfos) + : propertyInfos{std::move(propertyInfos)} {} + + BoundExtraCreateTableInfo(const BoundExtraCreateTableInfo& other) + : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)} {} + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } +}; + +struct BoundExtraCreateNodeTableInfo final : public BoundExtraCreateTableInfo { + common::property_id_t primaryKeyIdx; + BoundExtraCreateNodeTableInfo( common::property_id_t primaryKeyIdx, std::vector propertyInfos) - : primaryKeyIdx{primaryKeyIdx}, propertyInfos{std::move(propertyInfos)} {} + : BoundExtraCreateTableInfo{std::move(propertyInfos)}, primaryKeyIdx{primaryKeyIdx} {} BoundExtraCreateNodeTableInfo(const BoundExtraCreateNodeTableInfo& other) - : primaryKeyIdx{other.primaryKeyIdx}, propertyInfos{copyVector(other.propertyInfos)} {} + : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, primaryKeyIdx{ + other.primaryKeyIdx} {} - inline std::unique_ptr copy() const final { + std::unique_ptr copy() const override { return std::make_unique(*this); } }; -struct BoundExtraCreateRelTableInfo : public BoundExtraCreateTableInfo { +struct BoundExtraCreateRelTableInfo final : public BoundExtraCreateTableInfo { common::RelMultiplicity srcMultiplicity; common::RelMultiplicity dstMultiplicity; common::table_id_t srcTableID; common::table_id_t dstTableID; - std::vector propertyInfos; BoundExtraCreateRelTableInfo(common::RelMultiplicity srcMultiplicity, common::RelMultiplicity dstMultiplicity, common::table_id_t srcTableID, common::table_id_t dstTableID, std::vector propertyInfos) - : srcMultiplicity{srcMultiplicity}, dstMultiplicity{dstMultiplicity}, - srcTableID{srcTableID}, dstTableID{dstTableID}, propertyInfos{std::move(propertyInfos)} {} + : BoundExtraCreateTableInfo{std::move(propertyInfos)}, srcMultiplicity{srcMultiplicity}, + dstMultiplicity{dstMultiplicity}, srcTableID{srcTableID}, dstTableID{dstTableID} {} BoundExtraCreateRelTableInfo(const BoundExtraCreateRelTableInfo& other) - : srcMultiplicity{other.srcMultiplicity}, dstMultiplicity{other.dstMultiplicity}, - srcTableID{other.srcTableID}, dstTableID{other.dstTableID}, propertyInfos{copyVector( - other.propertyInfos)} {} + : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, + srcMultiplicity{other.srcMultiplicity}, dstMultiplicity{other.dstMultiplicity}, + srcTableID{other.srcTableID}, dstTableID{other.dstTableID} {} - inline std::unique_ptr copy() const final { + std::unique_ptr copy() const override { return std::make_unique(*this); } }; -struct BoundExtraCreateRelTableGroupInfo : public BoundExtraCreateTableInfo { +struct BoundExtraCreateRelTableGroupInfo final : public BoundExtraCreateCatalogEntryInfo { std::vector infos; explicit BoundExtraCreateRelTableGroupInfo(std::vector infos) @@ -88,12 +101,12 @@ struct BoundExtraCreateRelTableGroupInfo : public BoundExtraCreateTableInfo { BoundExtraCreateRelTableGroupInfo(const BoundExtraCreateRelTableGroupInfo& other) : infos{copyVector(other.infos)} {} - inline std::unique_ptr copy() const final { + inline std::unique_ptr copy() const override { return std::make_unique(*this); } }; -struct BoundExtraCreateRdfGraphInfo : public BoundExtraCreateTableInfo { +struct BoundExtraCreateRdfGraphInfo final : public BoundExtraCreateCatalogEntryInfo { BoundCreateTableInfo resourceInfo; BoundCreateTableInfo literalInfo; BoundCreateTableInfo resourceTripleInfo; @@ -110,7 +123,7 @@ struct BoundExtraCreateRdfGraphInfo : public BoundExtraCreateTableInfo { resourceTripleInfo{other.resourceTripleInfo.copy()}, literalTripleInfo{other.literalTripleInfo.copy()} {} - inline std::unique_ptr copy() const final { + inline std::unique_ptr copy() const override { return std::make_unique(*this); } }; diff --git a/src/include/catalog/catalog_content.h b/src/include/catalog/catalog_content.h index 7cc32f32fda..a1ffe6ad0bf 100644 --- a/src/include/catalog/catalog_content.h +++ b/src/include/catalog/catalog_content.h @@ -18,7 +18,7 @@ class CatalogContent { friend class Catalog; public: - explicit CatalogContent(common::VirtualFileSystem* vfs); + KUZU_API explicit CatalogContent(common::VirtualFileSystem* vfs); CatalogContent(const std::string& directory, common::VirtualFileSystem* vfs); @@ -26,14 +26,20 @@ class CatalogContent { std::unordered_map tableNameToIDMap, common::table_id_t nextTableID, std::unique_ptr functions, common::VirtualFileSystem* vfs) - : tableNameToIDMap{std::move(tableNameToIDMap)}, nextTableID{nextTableID}, vfs{vfs}, - tables{std::move(tables)}, functions{std::move(functions)} {} + : tables{std::move(tables)}, tableNameToIDMap{std::move(tableNameToIDMap)}, + nextTableID{nextTableID}, vfs{vfs}, functions{std::move(functions)} {} + + common::table_id_t getTableID(const std::string& tableName) const; + CatalogEntry* getTableCatalogEntry(common::table_id_t tableID) const; void saveToFile(const std::string& directory, common::FileVersionType dbFileType); void readFromFile(const std::string& directory, common::FileVersionType dbFileType); std::unique_ptr copy() const; +protected: + common::table_id_t assignNextTableID() { return nextTableID++; } + private: // ----------------------------- Functions ---------------------------- void registerBuiltInFunctions(); @@ -46,7 +52,6 @@ class CatalogContent { function::ScalarMacroFunction* getScalarMacroFunction(const std::string& name) const; // ----------------------------- Table entries ---------------------------- - common::table_id_t assignNextTableID() { return nextTableID++; } uint64_t getNumTables() const { return tables->getEntries().size(); } bool containsTable(const std::string& tableName) const; @@ -54,8 +59,6 @@ class CatalogContent { std::string getTableName(common::table_id_t tableID) const; - CatalogEntry* getTableCatalogEntry(common::table_id_t tableID) const; - template std::vector getTableCatalogEntries(CatalogEntryType catalogType) const { std::vector result; @@ -67,7 +70,6 @@ class CatalogContent { return result; } - common::table_id_t getTableID(const std::string& tableName) const; std::vector getTableIDs(CatalogEntryType catalogType) const; common::table_id_t createNodeTable(const binder::BoundCreateTableInfo& info); @@ -77,13 +79,15 @@ class CatalogContent { void dropTable(common::table_id_t tableID); void renameTable(common::table_id_t tableID, const std::string& newName); +protected: + std::unique_ptr tables; + private: // These two maps are maintained as caches. They are not serialized to the catalog file, but // is re-constructed when reading from the catalog file. std::unordered_map tableNameToIDMap; common::table_id_t nextTableID; common::VirtualFileSystem* vfs; - std::unique_ptr tables; std::unique_ptr functions; }; diff --git a/src/include/catalog/catalog_entry/catalog_entry.h b/src/include/catalog/catalog_entry/catalog_entry.h index e2b0ab3e5b2..65e4fedade2 100644 --- a/src/include/catalog/catalog_entry/catalog_entry.h +++ b/src/include/catalog/catalog_entry/catalog_entry.h @@ -9,7 +9,7 @@ namespace kuzu { namespace catalog { -class CatalogEntry { +class KUZU_API CatalogEntry { public: //===--------------------------------------------------------------------===// // constructor & destructor diff --git a/src/include/catalog/catalog_entry/catalog_entry_type.h b/src/include/catalog/catalog_entry/catalog_entry_type.h index e94d9590676..d44db816aca 100644 --- a/src/include/catalog/catalog_entry/catalog_entry_type.h +++ b/src/include/catalog/catalog_entry/catalog_entry_type.h @@ -15,6 +15,7 @@ enum class CatalogEntryType : uint8_t { SCALAR_FUNCTION_ENTRY = 6, REWRITE_FUNCTION_ENTRY = 7, TABLE_FUNCTION_ENTRY = 8, + FOREIGN_TABLE_ENTRY = 9, }; } // namespace catalog diff --git a/src/include/catalog/catalog_entry/table_catalog_entry.h b/src/include/catalog/catalog_entry/table_catalog_entry.h index 93990ea4d6f..7f31d175042 100644 --- a/src/include/catalog/catalog_entry/table_catalog_entry.h +++ b/src/include/catalog/catalog_entry/table_catalog_entry.h @@ -5,11 +5,12 @@ #include "catalog/property.h" #include "catalog_entry.h" #include "common/enums/table_type.h" +#include "function/table_functions.h" namespace kuzu { namespace catalog { -class TableCatalogEntry : public CatalogEntry { +class KUZU_API TableCatalogEntry : public CatalogEntry { public: //===--------------------------------------------------------------------===// // constructors @@ -19,7 +20,8 @@ class TableCatalogEntry : public CatalogEntry { : CatalogEntry{catalogType, std::move(name)}, tableID{tableID}, nextPID{0} {} TableCatalogEntry(const TableCatalogEntry& other) : CatalogEntry{other}, tableID{other.tableID}, comment{other.comment}, - nextPID{other.nextPID}, properties{other.properties} {} + nextPID{other.nextPID}, properties{copyVector(other.properties)} {} + TableCatalogEntry& operator=(const TableCatalogEntry&) = delete; //===--------------------------------------------------------------------===// // getter & setter @@ -27,9 +29,10 @@ class TableCatalogEntry : public CatalogEntry { common::table_id_t getTableID() const { return tableID; } std::string getComment() const { return comment; } void setComment(std::string newComment) { comment = std::move(newComment); } - virtual bool isParent(common::table_id_t tableID) = 0; + virtual bool isParent(common::table_id_t /*tableID*/) { return false; }; // TODO(Guodong/Ziyi): This function should be removed. Instead we should use CatalogEntryType. virtual common::TableType getTableType() const = 0; + virtual function::TableFunction getScanFunction() { KU_UNREACHABLE; } //===--------------------------------------------------------------------===// // properties functions diff --git a/src/include/catalog/catalog_set.h b/src/include/catalog/catalog_set.h index 1850c18548b..0165068ff20 100644 --- a/src/include/catalog/catalog_set.h +++ b/src/include/catalog/catalog_set.h @@ -14,7 +14,7 @@ class CatalogSet { //===--------------------------------------------------------------------===// bool containsEntry(const std::string& name) const; CatalogEntry* getEntry(const std::string& name); - void createEntry(std::unique_ptr entry); + KUZU_API void createEntry(std::unique_ptr entry); void removeEntry(const std::string& name); void renameEntry(const std::string& oldName, const std::string& newName); common::case_insensitive_map_t>& getEntries() { return entries; } diff --git a/src/include/catalog/property.h b/src/include/catalog/property.h index 9d116b5ec15..5ed9ef52c7d 100644 --- a/src/include/catalog/property.h +++ b/src/include/catalog/property.h @@ -20,9 +20,6 @@ class Property { common::property_id_t propertyID, common::table_id_t tableID) : name{std::move(name)}, dataType{std::move(dataType)}, propertyID{propertyID}, tableID{tableID} {} - Property(const Property& other) - : name{other.name}, dataType{other.dataType->copy()}, - propertyID{other.propertyID}, tableID{other.tableID} {} EXPLICIT_COPY_DEFAULT_MOVE(Property); std::string getName() const { return name; } @@ -41,6 +38,11 @@ class Property { static void toCypher( const std::vector& properties, std::stringstream& ss); +private: + Property(const Property& other) + : name{other.name}, dataType{other.dataType->copy()}, + propertyID{other.propertyID}, tableID{other.tableID} {} + private: std::string name; std::unique_ptr dataType; diff --git a/src/include/common/enums/table_type.h b/src/include/common/enums/table_type.h index eab71d76fd2..b41d9137418 100644 --- a/src/include/common/enums/table_type.h +++ b/src/include/common/enums/table_type.h @@ -13,6 +13,7 @@ enum class TableType : uint8_t { REL = 2, RDF = 3, REL_GROUP = 4, + FOREIGN = 5, }; struct TableTypeUtils { diff --git a/src/include/common/types/ku_string.h b/src/include/common/types/ku_string.h index 327f683e460..7bc58a48e32 100644 --- a/src/include/common/types/ku_string.h +++ b/src/include/common/types/ku_string.h @@ -4,10 +4,12 @@ #include #include +#include "common/api.h" + namespace kuzu { namespace common { -struct ku_string_t { +struct KUZU_API ku_string_t { static constexpr uint64_t PREFIX_LENGTH = 4; static constexpr uint64_t INLINED_SUFFIX_LENGTH = 8; @@ -25,7 +27,7 @@ struct ku_string_t { static bool isShortString(uint32_t len) { return len <= SHORT_STR_LENGTH; } - inline const uint8_t* getData() const { + const uint8_t* getData() const { return isShortString(len) ? prefix : reinterpret_cast(overflowPtr); } @@ -34,20 +36,20 @@ struct ku_string_t { void set(const std::string& value); void set(const char* value, uint64_t length); void set(const ku_string_t& value); - inline void setShortString(const char* value, uint64_t length) { + void setShortString(const char* value, uint64_t length) { this->len = length; memcpy(prefix, value, length); } - inline void setLongString(const char* value, uint64_t length) { + void setLongString(const char* value, uint64_t length) { this->len = length; memcpy(prefix, value, PREFIX_LENGTH); memcpy(reinterpret_cast(overflowPtr), value, length); } - inline void setShortString(const ku_string_t& value) { + void setShortString(const ku_string_t& value) { this->len = value.len; memcpy(prefix, value.prefix, value.len); } - inline void setLongString(const ku_string_t& value) { + void setLongString(const ku_string_t& value) { this->len = value.len; memcpy(prefix, value.prefix, PREFIX_LENGTH); memcpy(reinterpret_cast(overflowPtr), reinterpret_cast(value.overflowPtr), diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index 49ff32355ad..50ac2fe82fc 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -17,7 +17,7 @@ class Value; //! A Vector represents values of the same data type. //! The capacity of a ValueVector is either 1 (sequence) or DEFAULT_VECTOR_CAPACITY. -class ValueVector { +class KUZU_API ValueVector { friend class ListVector; friend class FixedListVector; friend class ListAuxiliaryBuffer; @@ -32,7 +32,7 @@ class ValueVector { KU_ASSERT(dataTypeID != LogicalTypeID::VAR_LIST); } - KUZU_API ~ValueVector() = default; + ~ValueVector() = default; void setState(const std::shared_ptr& state_); @@ -43,10 +43,10 @@ class ValueVector { void setNullRange(uint32_t startPos, uint32_t len, bool value) { nullMask->setNullFromRange(startPos, len, value); } - inline const uint64_t* getNullMaskData() { return nullMask->getData(); } - KUZU_API void setNull(uint32_t pos, bool isNull); - KUZU_API uint8_t isNull(uint32_t pos) const { return nullMask->isNull(pos); } - inline void setAsSingleNullEntry() { + const uint64_t* getNullMaskData() { return nullMask->getData(); } + void setNull(uint32_t pos, bool isNull); + uint8_t isNull(uint32_t pos) const { return nullMask->isNull(pos); } + void setAsSingleNullEntry() { state->selVector->selectedSize = 1; setNull(state->selVector->selectedPositions[0], true); } @@ -62,7 +62,7 @@ class ValueVector { return ((T*)valueBuffer.get())[pos]; } template - KUZU_API void setValue(uint32_t pos, T val); + void setValue(uint32_t pos, T val); // copyFromRowData assumes rowData is non-NULL. void copyFromRowData(uint32_t pos, const uint8_t* rowData); // copyToRowData assumes srcVectorData is non-NULL. @@ -76,7 +76,7 @@ class ValueVector { std::unique_ptr getAsValue(uint64_t pos); - KUZU_API uint8_t* getData() const { return valueBuffer.get(); } + uint8_t* getData() const { return valueBuffer.get(); } offset_t readNodeOffset(uint32_t pos) const { KU_ASSERT(dataType.getLogicalTypeID() == LogicalTypeID::INTERNAL_ID); @@ -86,7 +86,7 @@ class ValueVector { void setSequential() { _isSequential = true; } bool isSequential() const { return _isSequential; } - KUZU_API void resetAuxiliaryBuffer(); + void resetAuxiliaryBuffer(); // If there is still non-null values after discarding, return true. Otherwise, return false. // For an unflat vector, its selection vector is also updated to the resultSelVector. diff --git a/src/include/main/attached_database.h b/src/include/main/attached_database.h index 29f8293d4e9..811536e5aa2 100644 --- a/src/include/main/attached_database.h +++ b/src/include/main/attached_database.h @@ -1,24 +1,25 @@ #pragma once +#include #include -#include "function/table_functions.h" +#include "catalog/catalog_content.h" namespace kuzu { namespace main { class AttachedDatabase { public: - AttachedDatabase(std::string dbName, function::TableFunction scanFunction) - : dbName{std::move(dbName)}, scanFunction{std::move(scanFunction)} {} + AttachedDatabase(std::string dbName, std::unique_ptr catalogContent) + : dbName{std::move(dbName)}, catalogContent{std::move(catalogContent)} {} std::string getDBName() { return dbName; } - function::TableFunction getScanFunction() { return scanFunction; } + catalog::CatalogContent* getCatalogContent() { return catalogContent.get(); } private: std::string dbName; - function::TableFunction scanFunction; + std::unique_ptr catalogContent; }; } // namespace main diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index c4b3cd6b398..bd021e8f3b0 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -93,7 +93,7 @@ class ClientContext { // Database component getters. KUZU_API Database* getDatabase() const { return database; } storage::StorageManager* getStorageManager(); - storage::MemoryManager* getMemoryManager(); + KUZU_API storage::MemoryManager* getMemoryManager(); catalog::Catalog* getCatalog(); common::VirtualFileSystem* getVFSUnsafe() const; common::RandomEngine* getRandomEngine(); diff --git a/src/include/storage/storage_extension.h b/src/include/storage/storage_extension.h index c9aa991cc05..99aca94d3d1 100644 --- a/src/include/storage/storage_extension.h +++ b/src/include/storage/storage_extension.h @@ -6,7 +6,7 @@ namespace kuzu { namespace storage { using attach_function_t = std::unique_ptr (*)( - std::string dbPath, std::string dbName); + std::string dbPath, std::string dbName, main::ClientContext* clientContext); class StorageExtension { public: @@ -14,8 +14,9 @@ class StorageExtension { : attachFunction{std::move(attachFunction)} {} virtual bool canHandleDB(std::string /*dbType*/) const { return false; } - std::unique_ptr attach(std::string dbPath, std::string dbName) const { - return attachFunction(dbPath, dbName); + std::unique_ptr attach( + std::string dbPath, std::string dbName, main::ClientContext* clientContext) const { + return attachFunction(dbPath, dbName, clientContext); } virtual ~StorageExtension() = default; diff --git a/src/main/database_manager.cpp b/src/main/database_manager.cpp index 9c290769dd9..23dc3d111f7 100644 --- a/src/main/database_manager.cpp +++ b/src/main/database_manager.cpp @@ -10,8 +10,11 @@ void DatabaseManager::registerAttachedDatabase(std::unique_ptr } AttachedDatabase* DatabaseManager::getAttachedDatabase(const std::string& name) { + auto upperCaseName = common::StringUtils::getUpper(name); for (auto& attachedDatabase : attachedDatabases) { - if (attachedDatabase->getDBName() == name) { + auto attachedDBName = attachedDatabase->getDBName(); + common::StringUtils::toUpper(attachedDBName); + if (attachedDBName == upperCaseName) { return attachedDatabase.get(); } } @@ -19,12 +22,11 @@ AttachedDatabase* DatabaseManager::getAttachedDatabase(const std::string& name) } void DatabaseManager::detachDatabase(const std::string& databaseName) { - auto upperCaseDBName = databaseName; - common::StringUtils::toUpper(upperCaseDBName); + auto upperCaseName = common::StringUtils::getUpper(databaseName); for (auto it = attachedDatabases.begin(); it != attachedDatabases.end(); ++it) { auto attachedDBName = (*it)->getDBName(); common::StringUtils::toUpper(attachedDBName); - if (attachedDBName == upperCaseDBName) { + if (attachedDBName == upperCaseName) { attachedDatabases.erase(it); return; } diff --git a/src/processor/operator/attach_database.cpp b/src/processor/operator/attach_database.cpp index 507d3513acc..ec54db06fb3 100644 --- a/src/processor/operator/attach_database.cpp +++ b/src/processor/operator/attach_database.cpp @@ -11,7 +11,8 @@ bool AttachDatabase::getNextTuplesInternal(kuzu::processor::ExecutionContext* co for (auto& [name, storageExtension] : context->clientContext->getDatabase()->getStorageExtensions()) { if (storageExtension->canHandleDB(attachInfo.dbType)) { - auto db = storageExtension->attach(attachInfo.dbAlias, attachInfo.dbPath); + auto db = storageExtension->attach( + attachInfo.dbAlias, attachInfo.dbPath, context->clientContext); context->clientContext->getDatabase() ->getDatabaseManagerUnsafe() ->registerAttachedDatabase(std::move(db)); From 35b943857557ed5a7cf1951f07a82cd76a48657b Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Mon, 11 Mar 2024 11:40:25 -0400 Subject: [PATCH 045/136] Rework Fixed-list --- .../array_correct.csv} | 0 .../array_int64.csv} | 0 .../array_null.csv} | 0 .../array_null2.csv} | 0 .../array_string.csv} | 0 .../array_uint8.csv} | 0 .../array_with_null.csv} | 0 .../error_conversion.csv | 0 .../error_conversion2.csv | 0 .../{fixed_list => array}/incorrect_num.csv | 0 .../long_array.csv} | 0 .../long_array2.csv} | 0 .../{fixed_list => array}/zero_ele.csv | 0 ...h_fixed_list.csv => struct_with_array.csv} | 0 src/binder/binder.cpp | 24 +- src/c_api/data_type.cpp | 16 +- src/common/arrow/arrow_converter.cpp | 6 +- src/common/arrow/arrow_row_batch.cpp | 51 ++- src/common/type_utils.cpp | 19 +- src/common/types/types.cpp | 90 ++-- src/common/types/value/value.cpp | 28 +- src/common/vector/value_vector.cpp | 114 +----- src/function/built_in_function_utils.cpp | 4 +- src/function/cast/CMakeLists.txt | 2 +- src/function/cast/cast_array.cpp | 132 ++++++ src/function/cast/cast_fixed_list.cpp | 387 ------------------ src/function/cast_from_string_functions.cpp | 102 +---- src/function/vector_cast_functions.cpp | 96 +---- src/include/c_api/kuzu.h | 29 +- src/include/common/type_utils.h | 9 +- src/include/common/types/types.h | 61 +-- src/include/common/types/value/value.h | 1 - src/include/common/vector/value_vector.h | 26 +- .../function/cast/functions/cast_array.h | 20 + .../function/cast/functions/cast_fixed_list.h | 79 ---- .../functions/cast_from_string_functions.h | 3 - .../function/unary_function_executor.h | 19 - src/include/main/query_result.h | 6 +- src/main/query_result.cpp | 6 +- src/main/storage_driver.cpp | 22 +- .../persistent/reader/npy/npy_reader.cpp | 43 +- src/storage/storage_utils.cpp | 5 - src/storage/store/column.cpp | 4 +- src/storage/store/column_chunk.cpp | 69 ---- test/c_api/data_type_test.cpp | 24 +- test/ddl/e2e_ddl_test.cpp | 2 +- .../exceptions/binder/binder_error.test | 14 +- test/test_files/tinysnb/call/call.test | 4 +- test/test_files/tinysnb/cast/cast_error.test | 74 +--- .../tinysnb/cast/cast_to_nested_types.test | 84 +++- test/test_files/tinysnb/function/cast.test | 10 +- .../tinysnb/projection/single_label.test | 8 +- .../tinysnb/projection/skip_limit.test | 4 +- tools/java_api/src/jni/kuzu_java.cpp | 18 +- .../main/java/com/kuzudb/KuzuDataType.java | 6 +- .../main/java/com/kuzudb/KuzuDataTypeID.java | 10 +- .../src/main/java/com/kuzudb/KuzuNative.java | 4 +- .../java/com/kuzudb/test/DataTypeTest.java | 14 +- tools/nodejs_api/src_cpp/node_util.cpp | 2 +- tools/nodejs_api/test/test_data_type.js | 4 +- tools/python_api/src_cpp/py_query_result.cpp | 2 +- .../src_cpp/py_query_result_converter.cpp | 4 +- tools/python_api/src_py/types.py | 2 +- tools/rust_api/include/kuzu_rs.h | 6 +- tools/rust_api/src/ffi.rs | 18 +- tools/rust_api/src/kuzu_rs.cpp | 14 +- tools/rust_api/src/logical_type.rs | 18 +- tools/rust_api/src/value.rs | 30 +- 68 files changed, 576 insertions(+), 1273 deletions(-) rename dataset/load-from-test/{fixed_list/fixed_list_correct.csv => array/array_correct.csv} (100%) rename dataset/load-from-test/{fixed_list/fixed_list_int64.csv => array/array_int64.csv} (100%) rename dataset/load-from-test/{fixed_list/fixed_list_null.csv => array/array_null.csv} (100%) rename dataset/load-from-test/{fixed_list/fixed_list_null2.csv => array/array_null2.csv} (100%) rename dataset/load-from-test/{fixed_list/unsupported_type.csv => array/array_string.csv} (100%) rename dataset/load-from-test/{fixed_list/unsupported_type2.csv => array/array_uint8.csv} (100%) rename dataset/load-from-test/{fixed_list/fixed_list_with_null.csv => array/array_with_null.csv} (100%) rename dataset/load-from-test/{fixed_list => array}/error_conversion.csv (100%) rename dataset/load-from-test/{fixed_list => array}/error_conversion2.csv (100%) rename dataset/load-from-test/{fixed_list => array}/incorrect_num.csv (100%) rename dataset/load-from-test/{fixed_list/long_fixed_list.csv => array/long_array.csv} (100%) rename dataset/load-from-test/{fixed_list/long_fixed_list2.csv => array/long_array2.csv} (100%) rename dataset/load-from-test/{fixed_list => array}/zero_ele.csv (100%) rename dataset/load-from-test/struct/{struct_with_fixed_list.csv => struct_with_array.csv} (100%) create mode 100644 src/function/cast/cast_array.cpp delete mode 100644 src/function/cast/cast_fixed_list.cpp create mode 100644 src/include/function/cast/functions/cast_array.h delete mode 100644 src/include/function/cast/functions/cast_fixed_list.h diff --git a/dataset/load-from-test/fixed_list/fixed_list_correct.csv b/dataset/load-from-test/array/array_correct.csv similarity index 100% rename from dataset/load-from-test/fixed_list/fixed_list_correct.csv rename to dataset/load-from-test/array/array_correct.csv diff --git a/dataset/load-from-test/fixed_list/fixed_list_int64.csv b/dataset/load-from-test/array/array_int64.csv similarity index 100% rename from dataset/load-from-test/fixed_list/fixed_list_int64.csv rename to dataset/load-from-test/array/array_int64.csv diff --git a/dataset/load-from-test/fixed_list/fixed_list_null.csv b/dataset/load-from-test/array/array_null.csv similarity index 100% rename from dataset/load-from-test/fixed_list/fixed_list_null.csv rename to dataset/load-from-test/array/array_null.csv diff --git a/dataset/load-from-test/fixed_list/fixed_list_null2.csv b/dataset/load-from-test/array/array_null2.csv similarity index 100% rename from dataset/load-from-test/fixed_list/fixed_list_null2.csv rename to dataset/load-from-test/array/array_null2.csv diff --git a/dataset/load-from-test/fixed_list/unsupported_type.csv b/dataset/load-from-test/array/array_string.csv similarity index 100% rename from dataset/load-from-test/fixed_list/unsupported_type.csv rename to dataset/load-from-test/array/array_string.csv diff --git a/dataset/load-from-test/fixed_list/unsupported_type2.csv b/dataset/load-from-test/array/array_uint8.csv similarity index 100% rename from dataset/load-from-test/fixed_list/unsupported_type2.csv rename to dataset/load-from-test/array/array_uint8.csv diff --git a/dataset/load-from-test/fixed_list/fixed_list_with_null.csv b/dataset/load-from-test/array/array_with_null.csv similarity index 100% rename from dataset/load-from-test/fixed_list/fixed_list_with_null.csv rename to dataset/load-from-test/array/array_with_null.csv diff --git a/dataset/load-from-test/fixed_list/error_conversion.csv b/dataset/load-from-test/array/error_conversion.csv similarity index 100% rename from dataset/load-from-test/fixed_list/error_conversion.csv rename to dataset/load-from-test/array/error_conversion.csv diff --git a/dataset/load-from-test/fixed_list/error_conversion2.csv b/dataset/load-from-test/array/error_conversion2.csv similarity index 100% rename from dataset/load-from-test/fixed_list/error_conversion2.csv rename to dataset/load-from-test/array/error_conversion2.csv diff --git a/dataset/load-from-test/fixed_list/incorrect_num.csv b/dataset/load-from-test/array/incorrect_num.csv similarity index 100% rename from dataset/load-from-test/fixed_list/incorrect_num.csv rename to dataset/load-from-test/array/incorrect_num.csv diff --git a/dataset/load-from-test/fixed_list/long_fixed_list.csv b/dataset/load-from-test/array/long_array.csv similarity index 100% rename from dataset/load-from-test/fixed_list/long_fixed_list.csv rename to dataset/load-from-test/array/long_array.csv diff --git a/dataset/load-from-test/fixed_list/long_fixed_list2.csv b/dataset/load-from-test/array/long_array2.csv similarity index 100% rename from dataset/load-from-test/fixed_list/long_fixed_list2.csv rename to dataset/load-from-test/array/long_array2.csv diff --git a/dataset/load-from-test/fixed_list/zero_ele.csv b/dataset/load-from-test/array/zero_ele.csv similarity index 100% rename from dataset/load-from-test/fixed_list/zero_ele.csv rename to dataset/load-from-test/array/zero_ele.csv diff --git a/dataset/load-from-test/struct/struct_with_fixed_list.csv b/dataset/load-from-test/struct/struct_with_array.csv similarity index 100% rename from dataset/load-from-test/struct/struct_with_fixed_list.csv rename to dataset/load-from-test/struct/struct_with_array.csv diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 1fe16826fbc..e5c85438f95 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -8,7 +8,6 @@ #include "common/string_utils.h" #include "function/table_functions.h" #include "main/client_context.h" -#include "storage/storage_utils.h" using namespace kuzu::catalog; using namespace kuzu::common; @@ -113,27 +112,14 @@ std::shared_ptr Binder::createVariable( std::unique_ptr Binder::bindDataType(const std::string& dataType) { auto boundType = LogicalTypeUtils::dataTypeFromString(dataType); - if (boundType.getLogicalTypeID() == LogicalTypeID::FIXED_LIST) { - auto validNumericTypes = LogicalTypeUtils::getNumericalLogicalTypeIDs(); - auto childType = FixedListType::getChildType(&boundType); - auto numElementsInList = FixedListType::getNumValuesInList(&boundType); - if (find(validNumericTypes.begin(), validNumericTypes.end(), - childType->getLogicalTypeID()) == validNumericTypes.end()) { - throw BinderException("The child type of a fixed list must be a numeric type. Given: " + - childType->toString() + "."); - } - if (numElementsInList == 0) { + if (boundType.getLogicalTypeID() == LogicalTypeID::ARRAY) { + auto numElementsInArray = ArrayType::getNumElements(&boundType); + if (numElementsInArray == 0) { // Note: the parser already guarantees that the number of elements is a non-negative // number. However, we still need to check whether the number of elements is 0. throw BinderException( - "The number of elements in a fixed list must be greater than 0. Given: " + - std::to_string(numElementsInList) + "."); - } - auto numElementsPerPage = storage::PageUtils::getNumElementsInAPage( - storage::StorageUtils::getDataTypeSize(boundType), true /* hasNull */); - if (numElementsPerPage == 0) { - throw BinderException(stringFormat("Cannot store a fixed list of size {} in a page.", - storage::StorageUtils::getDataTypeSize(boundType))); + "The number of elements in an array must be greater than 0. Given: " + + std::to_string(numElementsInArray) + "."); } } return std::make_unique(boundType); diff --git a/src/c_api/data_type.cpp b/src/c_api/data_type.cpp index 6364d2e62e8..67f006e360c 100644 --- a/src/c_api/data_type.cpp +++ b/src/c_api/data_type.cpp @@ -13,7 +13,7 @@ struct CAPIHelper { } // namespace kuzu::common kuzu_logical_type* kuzu_data_type_create( - kuzu_data_type_id id, kuzu_logical_type* child_type, uint64_t fixed_num_elements_in_list) { + kuzu_data_type_id id, kuzu_logical_type* child_type, uint64_t num_elements_in_array) { auto* c_data_type = (kuzu_logical_type*)malloc(sizeof(kuzu_logical_type)); uint8_t data_type_id_u8 = id; LogicalType* data_type; @@ -23,10 +23,10 @@ kuzu_logical_type* kuzu_data_type_create( } else { auto child_type_pty = std::make_unique(*static_cast(child_type->_data_type)); - auto extraTypeInfo = fixed_num_elements_in_list > 0 ? - std::make_unique( - std::move(child_type_pty), fixed_num_elements_in_list) : - std::make_unique(std::move(child_type_pty)); + auto extraTypeInfo = + num_elements_in_array > 0 ? + std::make_unique(std::move(child_type_pty), num_elements_in_array) : + std::make_unique(std::move(child_type_pty)); data_type = CAPIHelper::createLogicalType(logicalTypeID, std::move(extraTypeInfo)); } c_data_type->_data_type = data_type; @@ -60,10 +60,10 @@ kuzu_data_type_id kuzu_data_type_get_id(kuzu_logical_type* data_type) { return static_cast(data_type_id_u8); } -uint64_t kuzu_data_type_get_fixed_num_elements_in_list(kuzu_logical_type* data_type) { +uint64_t kuzu_data_type_get_num_elements_in_array(kuzu_logical_type* data_type) { auto parent_type = static_cast(data_type->_data_type); - if (parent_type->getLogicalTypeID() != LogicalTypeID::FIXED_LIST) { + if (parent_type->getLogicalTypeID() != LogicalTypeID::ARRAY) { return 0; } - return FixedListType::getNumValuesInList(static_cast(data_type->_data_type)); + return ArrayType::getNumElements(static_cast(data_type->_data_type)); } diff --git a/src/common/arrow/arrow_converter.cpp b/src/common/arrow/arrow_converter.cpp index 7cb05e19309..9b666cdce04 100644 --- a/src/common/arrow/arrow_converter.cpp +++ b/src/common/arrow/arrow_converter.cpp @@ -139,9 +139,9 @@ void ArrowConverter::setArrowFormat( child.children[0]->name = "l"; setArrowFormat(rootHolder, **child.children, *typeInfo.childrenTypesInfo[0]); } break; - case LogicalTypeID::FIXED_LIST: { - auto numValuesPerList = "+w:" + std::to_string(typeInfo.numValuesPerList); - child.format = copyName(rootHolder, numValuesPerList); + case LogicalTypeID::ARRAY: { + auto numValuesPerArray = "+w:" + std::to_string(typeInfo.fixedNumValues); + child.format = copyName(rootHolder, numValuesPerArray); child.n_children = 1; rootHolder.nestedChildren.emplace_back(); rootHolder.nestedChildren.back().resize(1); diff --git a/src/common/arrow/arrow_row_batch.cpp b/src/common/arrow/arrow_row_batch.cpp index 435f9b26462..98874ed16a8 100644 --- a/src/common/arrow/arrow_row_batch.cpp +++ b/src/common/arrow/arrow_row_batch.cpp @@ -61,7 +61,7 @@ void ArrowRowBatch::templateInitializeVector( } template<> -void ArrowRowBatch::templateInitializeVector( +void ArrowRowBatch::templateInitializeVector( ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); KU_ASSERT(typeInfo.childrenTypesInfo.size() == 1); @@ -171,8 +171,8 @@ std::unique_ptr ArrowRowBatch::createVector( case LogicalTypeID::VAR_LIST: { templateInitializeVector(result.get(), typeInfo, capacity); } break; - case LogicalTypeID::FIXED_LIST: { - templateInitializeVector(result.get(), typeInfo, capacity); + case LogicalTypeID::ARRAY: { + templateInitializeVector(result.get(), typeInfo, capacity); } break; case LogicalTypeID::STRUCT: { templateInitializeVector(result.get(), typeInfo, capacity); @@ -277,7 +277,12 @@ void ArrowRowBatch::templateCopyNonNullValue( for (auto i = currentNumBytesForChildValidity; i < numBytesForChildValidity; i++) { vector->childData[0]->validity.data()[i] = 0xFF; // Init each value to be valid (as 1). } - if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::VAR_LIST) { + // If vector->childData[0] is a VAR_LIST, its data buffer will be resized when we add a new + // value into it + // If vector->childData[0] is an ARRAY, its data buffer is supposed to be empty, + // so we don't resize it here + if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::VAR_LIST && + typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::ARRAY) { vector->childData[0]->data.resize( numChildElements * storage::StorageUtils::getDataTypeSize( LogicalType{typeInfo.childrenTypesInfo[0]->typeID})); @@ -289,21 +294,28 @@ void ArrowRowBatch::templateCopyNonNullValue( } template<> -void ArrowRowBatch::templateCopyNonNullValue( +void ArrowRowBatch::templateCopyNonNullValue( ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { - auto numValuesPerList = value->childrenSize; - auto numValuesInChild = numValuesPerList * (pos + 1); + auto numElements = value->childrenSize; + auto numChildElements = numElements * (pos + 1); auto currentNumBytesForChildValidity = vector->childData[0]->validity.size(); - auto numBytesForChildValidity = getNumBytesForBits(numValuesInChild); + auto numBytesForChildValidity = getNumBytesForBits(numChildElements); vector->childData[0]->validity.resize(numBytesForChildValidity); // Initialize validity mask which is used to mark each value is valid (non-null) or not (null). for (auto i = currentNumBytesForChildValidity; i < numBytesForChildValidity; i++) { vector->childData[0]->validity.data()[i] = 0xFF; // Init each value to be valid (as 1). } - vector->childData[0]->data.resize( - numValuesInChild * - storage::StorageUtils::getDataTypeSize(LogicalType{typeInfo.childrenTypesInfo[0]->typeID})); - for (auto i = 0u; i < numValuesPerList; i++) { + // If vector->childData[0] is a VAR_LIST, its data buffer will be resized when we add a new + // value into it + // If vector->childData[0] is an ARRAY, its data buffer is supposed to be empty, + // so we don't resize it here + if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::VAR_LIST && + typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::ARRAY) { + vector->childData[0]->data.resize( + numChildElements * storage::StorageUtils::getDataTypeSize( + LogicalType{typeInfo.childrenTypesInfo[0]->typeID})); + } + for (auto i = 0u; i < numElements; i++) { appendValue( vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], value->children[i].get()); } @@ -433,8 +445,8 @@ void ArrowRowBatch::copyNonNullValue( case LogicalTypeID::VAR_LIST: { templateCopyNonNullValue(vector, typeInfo, value, pos); } break; - case LogicalTypeID::FIXED_LIST: { - templateCopyNonNullValue(vector, typeInfo, value, pos); + case LogicalTypeID::ARRAY: { + templateCopyNonNullValue(vector, typeInfo, value, pos); } break; case LogicalTypeID::STRUCT: { templateCopyNonNullValue(vector, typeInfo, value, pos); @@ -480,7 +492,7 @@ void ArrowRowBatch::templateCopyNullValue( } template<> -void ArrowRowBatch::templateCopyNullValue( +void ArrowRowBatch::templateCopyNullValue( ArrowVector* vector, std::int64_t pos) { setBitToZero(vector->validity.data(), pos); vector->numNulls++; @@ -559,6 +571,9 @@ void ArrowRowBatch::copyNullValue(ArrowVector* vector, Value* value, std::int64_ case LogicalTypeID::VAR_LIST: { templateCopyNullValue(vector, pos); } break; + case LogicalTypeID::ARRAY: { + templateCopyNullValue(vector, pos); + } break; case LogicalTypeID::INTERNAL_ID: { templateCopyNullValue(vector, pos); } break; @@ -637,7 +652,7 @@ ArrowArray* ArrowRowBatch::templateCreateArray( } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( +ArrowArray* ArrowRowBatch::templateCreateArray( ArrowVector& vector, const main::DataTypeInfo& typeInfo) { auto result = createArrayFromVector(vector); vector.childPointers.resize(1); @@ -756,8 +771,8 @@ ArrowArray* ArrowRowBatch::convertVectorToArray( case LogicalTypeID::VAR_LIST: { return templateCreateArray(vector, typeInfo); } - case LogicalTypeID::FIXED_LIST: { - return templateCreateArray(vector, typeInfo); + case LogicalTypeID::ARRAY: { + return templateCreateArray(vector, typeInfo); } case LogicalTypeID::STRUCT: { return templateCreateArray(vector, typeInfo); diff --git a/src/common/type_utils.cpp b/src/common/type_utils.cpp index 8a4035e5c10..bc30e8d2292 100644 --- a/src/common/type_utils.cpp +++ b/src/common/type_utils.cpp @@ -51,8 +51,7 @@ static std::string entryToString( return TypeUtils::toString(*reinterpret_cast(value)); case LogicalTypeID::INTERNAL_ID: return TypeUtils::toString(*reinterpret_cast(value)); - case LogicalTypeID::FIXED_LIST: - return TypeUtils::fixedListToString(value, dataType, valueVector); + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: return TypeUtils::toString(*reinterpret_cast(value), valueVector); case LogicalTypeID::MAP: @@ -81,22 +80,6 @@ static std::string entryToString(sel_t pos, ValueVector* vector) { vector->dataType, vector->getData() + vector->getNumBytesPerValue() * pos, vector); } -std::string TypeUtils::fixedListToString( - const uint8_t* val, const LogicalType& type, ValueVector* dummyVector) { - std::string result = "["; - auto numValuesPerList = FixedListType::getNumValuesInList(&type); - auto childType = FixedListType::getChildType(&type); - for (auto i = 0u; i < numValuesPerList - 1; ++i) { - // Note: FixedList can only store numeric types and doesn't allow nulls. - result += entryToString(*childType, val, dummyVector); - result += ","; - val += PhysicalTypeUtils::getFixedTypeSize(childType->getPhysicalType()); - } - result += entryToString(*childType, val, dummyVector); - result += "]"; - return result; -} - template<> std::string TypeUtils::toString(const int128_t& val, void* /*valueVector*/) { return Int128_t::ToString(val); diff --git a/src/common/types/types.cpp b/src/common/types/types.cpp index 27ce9f88ae8..bb30920ba56 100644 --- a/src/common/types/types.cpp +++ b/src/common/types/types.cpp @@ -45,8 +45,6 @@ std::string PhysicalTypeUtils::physicalTypeToString(PhysicalTypeID physicalType) return "FLOAT"; case PhysicalTypeID::INTERVAL: return "INTERVAL"; - case PhysicalTypeID::FIXED_LIST: - return "FIXED_LIST"; case PhysicalTypeID::INTERNAL_ID: return "INTERNAL_ID"; case PhysicalTypeID::STRING: @@ -114,24 +112,24 @@ void VarListTypeInfo::serializeInternal(Serializer& serializer) const { childType->serialize(serializer); } -bool FixedListTypeInfo::operator==(const FixedListTypeInfo& other) const { - return *childType == *other.childType && fixedNumElementsInList == other.fixedNumElementsInList; +bool ArrayTypeInfo::operator==(const ArrayTypeInfo& other) const { + return *childType == *other.childType && numElements == other.numElements; } -std::unique_ptr FixedListTypeInfo::deserialize(Deserializer& deserializer) { +std::unique_ptr ArrayTypeInfo::deserialize(Deserializer& deserializer) { auto childType = LogicalType::deserialize(deserializer); - uint64_t fixedNumElementsInList; - deserializer.deserializeValue(fixedNumElementsInList); - return std::make_unique(std::move(childType), fixedNumElementsInList); + uint64_t numElements; + deserializer.deserializeValue(numElements); + return std::make_unique(std::move(childType), numElements); } -std::unique_ptr FixedListTypeInfo::copy() const { - return std::make_unique(childType->copy(), fixedNumElementsInList); +std::unique_ptr ArrayTypeInfo::copy() const { + return std::make_unique(childType->copy(), numElements); } -void FixedListTypeInfo::serializeInternal(Serializer& serializer) const { +void ArrayTypeInfo::serializeInternal(Serializer& serializer) const { VarListTypeInfo::serializeInternal(serializer); - serializer.serializeValue(fixedNumElementsInList); + serializer.serializeValue(numElements); } bool StructField::operator==(const StructField& other) const { @@ -259,7 +257,6 @@ LogicalType::LogicalType(LogicalTypeID typeID) : typeID{typeID}, extraTypeInfo{n physicalType = getPhysicalType(typeID); // Complex types should not use this constructor as they need extra type information KU_ASSERT(physicalType != PhysicalTypeID::VAR_LIST); - KU_ASSERT(physicalType != PhysicalTypeID::FIXED_LIST); // Node/Rel types are exempted due to some complex code in bind_graph_pattern.cpp KU_ASSERT(physicalType != PhysicalTypeID::STRUCT || typeID == LogicalTypeID::NODE || typeID == LogicalTypeID::REL || typeID == LogicalTypeID::RECURSIVE_REL); @@ -290,11 +287,13 @@ bool LogicalType::operator==(const LogicalType& other) const { } switch (other.getPhysicalType()) { case PhysicalTypeID::VAR_LIST: - return *ku_dynamic_cast(extraTypeInfo.get()) == - *ku_dynamic_cast(other.extraTypeInfo.get()); - case PhysicalTypeID::FIXED_LIST: - return *ku_dynamic_cast(extraTypeInfo.get()) == - *ku_dynamic_cast(other.extraTypeInfo.get()); + if (typeID == LogicalTypeID::ARRAY) { + return *ku_dynamic_cast(extraTypeInfo.get()) == + *ku_dynamic_cast(other.extraTypeInfo.get()); + } else { + return *ku_dynamic_cast(extraTypeInfo.get()) == + *ku_dynamic_cast(other.extraTypeInfo.get()); + } case PhysicalTypeID::STRUCT: return *ku_dynamic_cast(extraTypeInfo.get()) == *ku_dynamic_cast(other.extraTypeInfo.get()); @@ -320,11 +319,10 @@ std::string LogicalType::toString() const { ku_dynamic_cast(extraTypeInfo.get()); return varListTypeInfo->getChildType()->toString() + "[]"; } - case LogicalTypeID::FIXED_LIST: { - auto fixedListTypeInfo = - ku_dynamic_cast(extraTypeInfo.get()); - return fixedListTypeInfo->getChildType()->toString() + "[" + - std::to_string(fixedListTypeInfo->getNumValuesInList()) + "]"; + case LogicalTypeID::ARRAY: { + auto arrayTypeInfo = ku_dynamic_cast(extraTypeInfo.get()); + return arrayTypeInfo->getChildType()->toString() + "[" + + std::to_string(arrayTypeInfo->getNumElements()) + "]"; } case LogicalTypeID::UNION: { auto unionTypeInfo = ku_dynamic_cast(extraTypeInfo.get()); @@ -392,7 +390,6 @@ void LogicalType::serialize(Serializer& serializer) const { serializer.serializeValue(physicalType); switch (physicalType) { case PhysicalTypeID::VAR_LIST: - case PhysicalTypeID::FIXED_LIST: case PhysicalTypeID::STRUCT: extraTypeInfo->serialize(serializer); default: @@ -408,10 +405,11 @@ std::unique_ptr LogicalType::deserialize(Deserializer& deserializer std::unique_ptr extraTypeInfo; switch (physicalType) { case PhysicalTypeID::VAR_LIST: { - extraTypeInfo = VarListTypeInfo::deserialize(deserializer); - } break; - case PhysicalTypeID::FIXED_LIST: { - extraTypeInfo = FixedListTypeInfo::deserialize(deserializer); + if (typeID == LogicalTypeID::ARRAY) { + extraTypeInfo = ArrayTypeInfo::deserialize(deserializer); + } else { + extraTypeInfo = VarListTypeInfo::deserialize(deserializer); + } } break; case PhysicalTypeID::STRUCT: { extraTypeInfo = StructTypeInfo::deserialize(deserializer); @@ -512,9 +510,6 @@ PhysicalTypeID LogicalType::getPhysicalType(LogicalTypeID typeID) { case LogicalTypeID::INTERVAL: { return PhysicalTypeID::INTERVAL; } break; - case LogicalTypeID::FIXED_LIST: { - return PhysicalTypeID::FIXED_LIST; - } break; case LogicalTypeID::INTERNAL_ID: { return PhysicalTypeID::INTERNAL_ID; } break; @@ -522,6 +517,7 @@ PhysicalTypeID LogicalType::getPhysicalType(LogicalTypeID typeID) { case LogicalTypeID::STRING: { return PhysicalTypeID::STRING; } break; + case LogicalTypeID::ARRAY: case LogicalTypeID::MAP: case LogicalTypeID::VAR_LIST: { return PhysicalTypeID::VAR_LIST; @@ -549,7 +545,7 @@ LogicalType LogicalTypeUtils::dataTypeFromString(const std::string& dataTypeStri if (upperDataTypeString.ends_with("[]")) { dataType = *parseVarListType(trimmedStr); } else if (upperDataTypeString.ends_with("]")) { - dataType = *parseFixedListType(trimmedStr); + dataType = *parseArrayType(trimmedStr); } else if (upperDataTypeString.starts_with("STRUCT")) { dataType = *parseStructType(trimmedStr); } else if (upperDataTypeString.starts_with("MAP")) { @@ -677,8 +673,8 @@ std::string LogicalTypeUtils::toString(LogicalTypeID dataTypeID) { return "STRING"; case LogicalTypeID::VAR_LIST: return "VAR_LIST"; - case LogicalTypeID::FIXED_LIST: - return "FIXED_LIST"; + case LogicalTypeID::ARRAY: + return "ARRAY"; case LogicalTypeID::STRUCT: return "STRUCT"; case LogicalTypeID::RDF_VARIANT: @@ -726,10 +722,6 @@ uint32_t LogicalTypeUtils::getRowLayoutSize(const LogicalType& type) { case PhysicalTypeID::STRING: { return sizeof(ku_string_t); } - case PhysicalTypeID::FIXED_LIST: { - return getRowLayoutSize(*FixedListType::getChildType(&type)) * - FixedListType::getNumValuesInList(&type); - } case PhysicalTypeID::VAR_LIST: { return sizeof(ku_list_t); } @@ -775,7 +767,7 @@ bool LogicalTypeUtils::isNested(kuzu::common::LogicalTypeID logicalTypeID) { switch (logicalTypeID) { case LogicalTypeID::STRUCT: case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: + case LogicalTypeID::ARRAY: case LogicalTypeID::UNION: case LogicalTypeID::MAP: case LogicalTypeID::NODE: @@ -818,7 +810,7 @@ std::vector LogicalTypeUtils::getAllValidLogicTypes() { LogicalTypeID::UUID, LogicalTypeID::DATE, LogicalTypeID::TIMESTAMP, LogicalTypeID::TIMESTAMP_NS, LogicalTypeID::TIMESTAMP_MS, LogicalTypeID::TIMESTAMP_SEC, LogicalTypeID::TIMESTAMP_TZ, LogicalTypeID::INTERVAL, LogicalTypeID::VAR_LIST, - LogicalTypeID::FIXED_LIST, LogicalTypeID::MAP, LogicalTypeID::FLOAT, LogicalTypeID::SERIAL, + LogicalTypeID::ARRAY, LogicalTypeID::MAP, LogicalTypeID::FLOAT, LogicalTypeID::SERIAL, LogicalTypeID::NODE, LogicalTypeID::REL, LogicalTypeID::STRUCT, LogicalTypeID::UNION, LogicalTypeID::RDF_VARIANT}; } @@ -858,15 +850,15 @@ std::unique_ptr LogicalTypeUtils::parseVarListType(const std::strin return LogicalType::VAR_LIST(dataTypeFromString(trimmedStr.substr(0, trimmedStr.size() - 2))); } -std::unique_ptr LogicalTypeUtils::parseFixedListType(const std::string& trimmedStr) { - auto leftBracketPos = trimmedStr.find('['); - auto rightBracketPos = trimmedStr.find(']'); +std::unique_ptr LogicalTypeUtils::parseArrayType(const std::string& trimmedStr) { + auto leftBracketPos = trimmedStr.find_last_of('['); + auto rightBracketPos = trimmedStr.find_last_of(']'); auto childType = std::make_unique(dataTypeFromString(trimmedStr.substr(0, leftBracketPos))); - auto fixedNumElementsInList = std::strtoll( + auto numElements = std::strtoll( trimmedStr.substr(leftBracketPos + 1, rightBracketPos - leftBracketPos - 1).c_str(), nullptr, 0 /* base */); - return LogicalType::FIXED_LIST(std::move(childType), fixedNumElementsInList); + return LogicalType::ARRAY(std::move(childType), numElements); } std::vector LogicalTypeUtils::parseStructTypeInfo(const std::string& structTypeStr) { @@ -961,10 +953,10 @@ std::unique_ptr LogicalType::MAP( LogicalTypeID::MAP, std::make_unique(std::move(mapStructType)))); } -std::unique_ptr LogicalType::FIXED_LIST( - std::unique_ptr childType, uint64_t fixedNumElementsInList) { - return std::unique_ptr(new LogicalType(LogicalTypeID::FIXED_LIST, - std::make_unique(std::move(childType), fixedNumElementsInList))); +std::unique_ptr LogicalType::ARRAY( + std::unique_ptr childType, uint64_t numElements) { + return std::unique_ptr(new LogicalType( + LogicalTypeID::ARRAY, std::make_unique(std::move(childType), numElements))); } } // namespace common diff --git a/src/common/types/value/value.cpp b/src/common/types/value/value.cpp index 2b4a73912c1..b56cdcb1d66 100644 --- a/src/common/types/value/value.cpp +++ b/src/common/types/value/value.cpp @@ -96,12 +96,12 @@ Value Value::createDefaultValue(const LogicalType& dataType) { return Value(LogicalType::STRING(), std::string("")); case LogicalTypeID::FLOAT: return Value((float)0); - case LogicalTypeID::FIXED_LIST: { + case LogicalTypeID::ARRAY: { std::vector> children; - auto childType = FixedListType::getChildType(&dataType); - auto listSize = FixedListType::getNumValuesInList(&dataType); - children.reserve(listSize); - for (auto i = 0u; i < listSize; ++i) { + auto childType = ArrayType::getChildType(&dataType); + auto arraySize = ArrayType::getNumElements(&dataType); + children.reserve(arraySize); + for (auto i = 0u; i < arraySize; ++i) { children.push_back(std::make_unique(createDefaultValue(*childType))); } return Value(dataType.copy(), std::move(children)); @@ -333,8 +333,8 @@ void Value::copyValueFrom(const uint8_t* value) { case LogicalTypeID::VAR_LIST: { copyFromVarList(*(ku_list_t*)value, *VarListType::getChildType(dataType.get())); } break; - case LogicalTypeID::FIXED_LIST: { - copyFromFixedList(value); + case LogicalTypeID::ARRAY: { + copyFromVarList(*(ku_list_t*)value, *ArrayType::getChildType(dataType.get())); } break; case LogicalTypeID::UNION: { copyFromUnion(value); @@ -408,7 +408,6 @@ void Value::copyValueFrom(const Value& other) { strVal = other.strVal; } break; case PhysicalTypeID::VAR_LIST: - case PhysicalTypeID::FIXED_LIST: case PhysicalTypeID::STRUCT: { for (auto& child : other.children) { children.push_back(child->copy()); @@ -482,7 +481,7 @@ std::string Value::toString() const { return mapToString(); } case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: { + case LogicalTypeID::ARRAY: { return listToString(); } case LogicalTypeID::UNION: { @@ -513,15 +512,6 @@ Value::Value(const LogicalType& dataType_) : isNull_{true} { dataType = dataType_.copy(); } -void Value::copyFromFixedList(const uint8_t* fixedList) { - auto numBytesPerElement = - storage::StorageUtils::getDataTypeSize(*FixedListType::getChildType(dataType.get())); - for (auto i = 0u; i < childrenSize; ++i) { - auto childValue = children[i].get(); - childValue->copyValueFrom(fixedList + i * numBytesPerElement); - } -} - void Value::copyFromVarList(ku_list_t& list, const LogicalType& childType) { if (list.size > children.size()) { children.reserve(list.size); @@ -635,7 +625,6 @@ void Value::serialize(Serializer& serializer) const { serializer.serializeValue(strVal); } break; case PhysicalTypeID::VAR_LIST: - case PhysicalTypeID::FIXED_LIST: case PhysicalTypeID::STRUCT: { for (auto i = 0u; i < childrenSize; ++i) { children[i]->serialize(serializer); @@ -700,7 +689,6 @@ std::unique_ptr Value::deserialize(Deserializer& deserializer) { deserializer.deserializeValue(val->strVal); } break; case PhysicalTypeID::VAR_LIST: - case PhysicalTypeID::FIXED_LIST: case PhysicalTypeID::STRUCT: { deserializer.deserializeVectorOfPtrs(val->children); } break; diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index b99d1bb4e7f..05d3900d6f2 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -198,36 +198,6 @@ void ValueVector::copyFromValue(uint64_t pos, const Value& value) { } } } break; - case PhysicalTypeID::FIXED_LIST: { - auto numValues = NestedVal::getChildrenSize(&value); - auto childType = FixedListType::getChildType(value.getDataType()); - auto numBytesPerChildValue = getDataTypeSize(*childType); - auto bufferToWrite = valueBuffer.get() + pos * numBytesPerValue; - for (auto i = 0u; i < numValues; i++) { - auto val = NestedVal::getChildVal(&value, i); - switch (childType->getPhysicalType()) { - case PhysicalTypeID::INT64: { - memcpy(bufferToWrite, &val->getValueReference(), numBytesPerChildValue); - } break; - case PhysicalTypeID::INT32: { - memcpy(bufferToWrite, &val->getValueReference(), numBytesPerChildValue); - } break; - case PhysicalTypeID::INT16: { - memcpy(bufferToWrite, &val->getValueReference(), numBytesPerChildValue); - } break; - case PhysicalTypeID::DOUBLE: { - memcpy(bufferToWrite, &val->getValueReference(), numBytesPerChildValue); - } break; - case PhysicalTypeID::FLOAT: { - memcpy(bufferToWrite, &val->getValueReference(), numBytesPerChildValue); - } break; - default: { - KU_UNREACHABLE; - } - } - bufferToWrite += numBytesPerChildValue; - } - } break; case PhysicalTypeID::STRUCT: { auto structFields = StructVector::getFieldVectors(this); for (auto i = 0u; i < structFields.size(); ++i) { @@ -240,7 +210,7 @@ void ValueVector::copyFromValue(uint64_t pos, const Value& value) { } } -std::unique_ptr ValueVector::getAsValue(uint64_t pos) { +std::unique_ptr ValueVector::getAsValue(uint64_t pos) const { if (isNull(pos)) { return Value::createNullValue(dataType).copy(); } @@ -299,33 +269,6 @@ std::unique_ptr ValueVector::getAsValue(uint64_t pos) { value->childrenSize = children.size(); value->children = std::move(children); } break; - case PhysicalTypeID::FIXED_LIST: { - auto childDataType = FixedListType::getChildType(&dataType); - auto numElements = FixedListType::getNumValuesInList(&dataType); - std::vector> children; - children.reserve(numElements); - switch (childDataType->getPhysicalType()) { - case PhysicalTypeID::INT64: { - FixedListVector::getAsValue(this, children, pos, numElements); - } break; - case PhysicalTypeID::INT32: { - FixedListVector::getAsValue(this, children, pos, numElements); - } break; - case PhysicalTypeID::INT16: { - FixedListVector::getAsValue(this, children, pos, numElements); - } break; - case PhysicalTypeID::DOUBLE: { - FixedListVector::getAsValue(this, children, pos, numElements); - } break; - case PhysicalTypeID::FLOAT: { - FixedListVector::getAsValue(this, children, pos, numElements); - } break; - default: - KU_UNREACHABLE; - } - value->childrenSize = numElements; - value->children = std::move(children); - } break; case PhysicalTypeID::STRUCT: { auto& fieldVectors = StructVector::getFieldVectors(this); std::vector> children; @@ -375,10 +318,6 @@ uint32_t ValueVector::getDataTypeSize(const LogicalType& type) { case PhysicalTypeID::STRING: { return sizeof(ku_string_t); } - case PhysicalTypeID::FIXED_LIST: { - return getDataTypeSize(*FixedListType::getChildType(&type)) * - FixedListType::getNumValuesInList(&type); - } case PhysicalTypeID::STRUCT: { return sizeof(struct_entry_t); } @@ -627,57 +566,6 @@ void ListVector::sliceDataVector(ValueVector* vectorToSlice, uint64_t offset, ui } } -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements) { - for (auto i = 0u; i < numElements; ++i) { - children.push_back(Value::createDefaultValue(LogicalType{LogicalTypeID::INT64}).copy()); - children[i]->val.int64Val = - reinterpret_cast(vector->getData() + vector->getNumBytesPerValue() * pos)[i]; - } -} - -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements) { - for (auto i = 0u; i < numElements; ++i) { - children.push_back(Value::createDefaultValue(LogicalType{LogicalTypeID::INT32}).copy()); - children[i]->val.int32Val = - reinterpret_cast(vector->getData() + vector->getNumBytesPerValue() * pos)[i]; - } -} - -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements) { - for (auto i = 0u; i < numElements; ++i) { - children.push_back(Value::createDefaultValue(LogicalType{LogicalTypeID::INT16}).copy()); - children[i]->val.int16Val = - reinterpret_cast(vector->getData() + vector->getNumBytesPerValue() * pos)[i]; - } -} - -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements) { - for (auto i = 0u; i < numElements; ++i) { - children.push_back(Value::createDefaultValue(LogicalType{LogicalTypeID::FLOAT}).copy()); - children[i]->val.floatVal = - reinterpret_cast(vector->getData() + vector->getNumBytesPerValue() * pos)[i]; - } -} - -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements) { - // default: int64 - for (auto i = 0u; i < numElements; ++i) { - children.push_back(Value::createDefaultValue(LogicalType{LogicalTypeID::DOUBLE}).copy()); - children[i]->val.doubleVal = - reinterpret_cast(vector->getData() + vector->getNumBytesPerValue() * pos)[i]; - } -} - void StructVector::copyFromRowData(ValueVector* vector, uint32_t pos, const uint8_t* rowData) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRUCT); auto& structFields = getFieldVectors(vector); diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 804e3ff326f..0cd5b744d0c 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -210,7 +210,7 @@ uint32_t BuiltInFunctionsUtils::getTargetTypeCost(LogicalTypeID typeID) { return 149; case LogicalTypeID::STRUCT: case LogicalTypeID::MAP: - case LogicalTypeID::FIXED_LIST: + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: case LogicalTypeID::UNION: return 160; @@ -406,7 +406,7 @@ uint32_t BuiltInFunctionsUtils::castFromRDFVariant(LogicalTypeID inputTypeID) { switch (inputTypeID) { case LogicalTypeID::STRUCT: case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: + case LogicalTypeID::ARRAY: case LogicalTypeID::UNION: case LogicalTypeID::MAP: case LogicalTypeID::NODE: diff --git a/src/function/cast/CMakeLists.txt b/src/function/cast/CMakeLists.txt index 2280180a29c..a1c9d7c6bb8 100644 --- a/src/function/cast/CMakeLists.txt +++ b/src/function/cast/CMakeLists.txt @@ -1,7 +1,7 @@ add_library(kuzu_function_cast OBJECT cast_rdf_variant.cpp - cast_fixed_list.cpp) + cast_array.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/function/cast/cast_array.cpp b/src/function/cast/cast_array.cpp new file mode 100644 index 00000000000..207b58099c0 --- /dev/null +++ b/src/function/cast/cast_array.cpp @@ -0,0 +1,132 @@ +#include "function/cast/functions/cast_array.h" + +#include "common/exception/conversion.h" +#include "common/type_utils.h" + +namespace kuzu { +namespace function { + +bool CastArrayHelper::checkCompatibleNestedTypes( + LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { + switch (sourceTypeID) { + case LogicalTypeID::VAR_LIST: { + if (targetTypeID == LogicalTypeID::ARRAY || targetTypeID == LogicalTypeID::VAR_LIST) { + return true; + } + } + case LogicalTypeID::MAP: + case LogicalTypeID::STRUCT: { + if (sourceTypeID == targetTypeID) { + return true; + } + } + case LogicalTypeID::ARRAY: { + if (targetTypeID == LogicalTypeID::VAR_LIST || targetTypeID == LogicalTypeID::ARRAY) { + return true; + } + } + default: + return false; + } + return false; +} + +bool CastArrayHelper::containsListToArray(const LogicalType* srcType, const LogicalType* dstType) { + if ((srcType->getLogicalTypeID() == LogicalTypeID::VAR_LIST || + srcType->getLogicalTypeID() == LogicalTypeID::ARRAY) && + dstType->getLogicalTypeID() == LogicalTypeID::ARRAY) { + return true; + } + + if (checkCompatibleNestedTypes(srcType->getLogicalTypeID(), dstType->getLogicalTypeID())) { + switch (srcType->getPhysicalType()) { + case PhysicalTypeID::VAR_LIST: { + auto srcChildType = (srcType->getLogicalTypeID() == LogicalTypeID::ARRAY) ? + ArrayType::getChildType(srcType) : + VarListType::getChildType(srcType); + auto dstChildType = (dstType->getLogicalTypeID() == LogicalTypeID::ARRAY) ? + ArrayType::getChildType(dstType) : + VarListType::getChildType(dstType); + return containsListToArray(srcChildType, dstChildType); + } + case PhysicalTypeID::STRUCT: { + auto srcFieldTypes = StructType::getFieldTypes(srcType); + auto dstFieldTypes = StructType::getFieldTypes(dstType); + if (srcFieldTypes.size() != dstFieldTypes.size()) { + throw ConversionException{ + stringFormat("Unsupported casting function from {} to {}.", srcType->toString(), + dstType->toString())}; + } + + for (auto i = 0u; i < srcFieldTypes.size(); i++) { + if (containsListToArray(srcFieldTypes[i], dstFieldTypes[i])) { + return true; + } + } + } + default: + return false; + } + } + return false; +} + +void CastArrayHelper::validateListEntry( + ValueVector* inputVector, LogicalType* resultType, uint64_t pos) { + if (inputVector->isNull(pos)) { + return; + } + auto inputType = inputVector->dataType; + + switch (resultType->getPhysicalType()) { + case PhysicalTypeID::VAR_LIST: { + if (inputType.getPhysicalType() == PhysicalTypeID::VAR_LIST) { + if (inputType.getLogicalTypeID() == LogicalTypeID::ARRAY && + resultType->getLogicalTypeID() == LogicalTypeID::ARRAY) { + if (ArrayType::getNumElements(&inputType) != + ArrayType::getNumElements(resultType)) { + throw ConversionException( + stringFormat("Unsupported casting function from {} to {}.", + inputType.toString(), resultType->toString())); + } + } + if (inputType.getLogicalTypeID() == LogicalTypeID::VAR_LIST && + resultType->getLogicalTypeID() == LogicalTypeID::ARRAY) { + auto listEntry = inputVector->getValue(pos); + if (listEntry.size != ArrayType::getNumElements(resultType)) { + throw ConversionException{stringFormat( + "Unsupported casting VAR_LIST with incorrect list entry to ARRAY. " + "Expected: {}, Actual: {}.", + ArrayType::getNumElements(resultType), + inputVector->getValue(pos).size)}; + } + } + auto listEntry = inputVector->getValue(pos); + auto inputChildVector = ListVector::getDataVector(inputVector); + auto resultChildType = (resultType->getLogicalTypeID() == LogicalTypeID::ARRAY) ? + ArrayType::getChildType(resultType) : + VarListType::getChildType(resultType); + for (auto i = listEntry.offset; i < listEntry.offset + listEntry.size; i++) { + validateListEntry(inputChildVector, resultChildType, i); + } + } + } break; + case PhysicalTypeID::STRUCT: { + if (inputType.getPhysicalType() == PhysicalTypeID::STRUCT) { + auto fieldVectors = StructVector::getFieldVectors(inputVector); + auto fieldTypes = StructType::getFieldTypes(resultType); + + auto structEntry = inputVector->getValue(pos); + for (auto i = 0u; i < fieldVectors.size(); i++) { + validateListEntry(fieldVectors[i].get(), fieldTypes[i], structEntry.pos); + } + } + } break; + default: { + return; + } + } +} + +} // namespace function +} // namespace kuzu diff --git a/src/function/cast/cast_fixed_list.cpp b/src/function/cast/cast_fixed_list.cpp deleted file mode 100644 index 44cd72cba04..00000000000 --- a/src/function/cast/cast_fixed_list.cpp +++ /dev/null @@ -1,387 +0,0 @@ -#include "function/cast/functions/cast_fixed_list.h" - -#include "common/exception/conversion.h" -#include "common/type_utils.h" -#include "function/cast/functions/cast_from_string_functions.h" -#include "function/cast/functions/cast_functions.h" - -namespace kuzu { -namespace function { - -bool CastFixedListHelper::containsListToFixedList( - const LogicalType* srcType, const LogicalType* dstType) { - if (srcType->getLogicalTypeID() == LogicalTypeID::VAR_LIST && - dstType->getLogicalTypeID() == LogicalTypeID::FIXED_LIST) { - return true; - } - - while (srcType->getLogicalTypeID() == dstType->getLogicalTypeID()) { - switch (srcType->getPhysicalType()) { - case PhysicalTypeID::VAR_LIST: { - return containsListToFixedList( - VarListType::getChildType(srcType), VarListType::getChildType(dstType)); - } - case PhysicalTypeID::STRUCT: { - auto srcFieldTypes = StructType::getFieldTypes(srcType); - auto dstFieldTypes = StructType::getFieldTypes(dstType); - if (srcFieldTypes.size() != dstFieldTypes.size()) { - throw ConversionException{ - stringFormat("Unsupported casting function from {} to {}.", srcType->toString(), - dstType->toString())}; - } - - std::vector fields; - for (auto i = 0u; i < srcFieldTypes.size(); i++) { - if (containsListToFixedList(srcFieldTypes[i], dstFieldTypes[i])) { - return true; - } - } - } - default: - return false; - } - } - return false; -} - -void CastFixedListHelper::validateListEntry( - ValueVector* inputVector, LogicalType* resultType, uint64_t pos) { - if (inputVector->isNull(pos)) { - return; - } - auto inputTypeID = inputVector->dataType.getPhysicalType(); - - switch (resultType->getPhysicalType()) { - case PhysicalTypeID::FIXED_LIST: { - if (inputTypeID == PhysicalTypeID::VAR_LIST) { - auto listEntry = inputVector->getValue(pos); - if (listEntry.size != FixedListType::getNumValuesInList(resultType)) { - throw ConversionException{stringFormat( - "Unsupported casting VAR_LIST with incorrect list entry to FIXED_LIST. " - "Expected: {}, Actual: {}.", - FixedListType::getNumValuesInList(resultType), - inputVector->getValue(pos).size)}; - } - - auto inputChildVector = ListVector::getDataVector(inputVector); - for (auto i = listEntry.offset; i < listEntry.offset + listEntry.size; i++) { - if (inputChildVector->isNull(i)) { - throw ConversionException("Cast failed. NULL is not allowed for FIXED_LIST."); - } - } - } - } break; - case PhysicalTypeID::VAR_LIST: { - if (inputTypeID == PhysicalTypeID::VAR_LIST) { - auto listEntry = inputVector->getValue(pos); - for (auto i = listEntry.offset; i < listEntry.offset + listEntry.size; i++) { - validateListEntry(ListVector::getDataVector(inputVector), - VarListType::getChildType(resultType), i); - } - } - } break; - case PhysicalTypeID::STRUCT: { - if (inputTypeID == PhysicalTypeID::STRUCT) { - auto fieldVectors = StructVector::getFieldVectors(inputVector); - auto fieldTypes = StructType::getFieldTypes(resultType); - - auto structEntry = inputVector->getValue(pos); - for (auto i = 0u; i < fieldVectors.size(); i++) { - validateListEntry(fieldVectors[i].get(), fieldTypes[i], structEntry.pos); - } - } - } break; - default: { - return; - } - } -} - -static void CastFixedListToString( - ValueVector& param, uint64_t pos, ValueVector& resultVector, uint64_t resultPos) { - resultVector.setNull(resultPos, param.isNull(pos)); - if (param.isNull(pos)) { - return; - } - auto value = param.getData() + pos * param.getNumBytesPerValue(); - auto result = TypeUtils::fixedListToString(value, param.dataType, ¶m); - StringVector::addString(&resultVector, resultPos, result); -} - -template<> -void CastFixedList::fixedListToStringCastExecFunction( - const std::vector>& params, ValueVector& result, - void* /*dataPtr*/) { - KU_ASSERT(params.size() == 1); - const auto& param = params[0]; - if (param->state->isFlat()) { - CastFixedListToString(*param, param->state->selVector->selectedPositions[0], result, - result.state->selVector->selectedPositions[0]); - } else if (param->state->selVector->isUnfiltered()) { - for (auto i = 0u; i < param->state->selVector->selectedSize; i++) { - CastFixedListToString(*param, i, result, i); - } - } else { - for (auto i = 0u; i < param->state->selVector->selectedSize; i++) { - CastFixedListToString(*param, param->state->selVector->selectedPositions[i], result, - result.state->selVector->selectedPositions[i]); - } - } -} - -// LCOV_EXCL_START -template<> -void CastFixedList::fixedListToStringCastExecFunction( - const std::vector>& /*params*/, ValueVector& /*result*/, - void* /*dataPtr*/) { - KU_UNREACHABLE; -} -// LCOV_EXCL_STOP - -template<> -void CastFixedList::fixedListToStringCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - KU_ASSERT(params.size() == 1); - - auto inputVector = params[0].get(); - auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - for (auto i = 0u; i < numOfEntries; i++) { - CastFixedListToString(*inputVector, i, result, i); - } -} - -template<> -void CastFixedList::stringtoFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - KU_ASSERT(params.size() == 1); - const auto& param = params[0]; - auto option = &reinterpret_cast(dataPtr)->option; - if (param->state->isFlat()) { - auto inputPos = param->state->selVector->selectedPositions[0]; - auto resultPos = result.state->selVector->selectedPositions[0]; - result.setNull(resultPos, param->isNull(inputPos)); - if (!result.isNull(inputPos)) { - CastString::castToFixedList( - param->getValue(inputPos), &result, resultPos, option); - } - } else if (param->state->selVector->isUnfiltered()) { - for (auto i = 0u; i < param->state->selVector->selectedSize; i++) { - result.setNull(i, param->isNull(i)); - if (!result.isNull(i)) { - CastString::castToFixedList(param->getValue(i), &result, i, option); - } - } - } else { - for (auto i = 0u; i < param->state->selVector->selectedSize; i++) { - auto pos = param->state->selVector->selectedPositions[i]; - result.setNull(pos, param->isNull(pos)); - if (!result.isNull(pos)) { - CastString::castToFixedList( - param->getValue(pos), &result, pos, option); - } - } - } -} - -// LCOV_EXCL_START -template<> -void CastFixedList::stringtoFixedListCastExecFunction( - const std::vector>& /*params*/, ValueVector& /*result*/, - void* /*dataPtr*/) { - KU_UNREACHABLE; -} -// LCOV_EXCL_STOP - -template<> -void CastFixedList::stringtoFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - KU_ASSERT(params.size() == 1); - auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - auto option = &reinterpret_cast(dataPtr)->option; - auto inputVector = params[0].get(); - for (auto i = 0u; i < numOfEntries; i++) { - result.setNull(i, inputVector->isNull(i)); - if (!result.isNull(i)) { - CastString::castToFixedList(inputVector->getValue(i), &result, i, option); - } - } -} - -template<> -void CastFixedList::listToFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - KU_ASSERT(params.size() == 1); - const auto& inputVector = params[0]; - - for (auto i = 0u; i < inputVector->state->selVector->selectedSize; i++) { - auto pos = inputVector->state->selVector->selectedPositions[i]; - CastFixedListHelper::validateListEntry(inputVector.get(), &result.dataType, pos); - } - - auto numOfEntries = inputVector->state->selVector - ->selectedPositions[inputVector->state->selVector->selectedSize - 1] + - 1; - reinterpret_cast(dataPtr)->numOfEntries = numOfEntries; - listToFixedListCastExecFunction(params, result, dataPtr); -} - -// LCOV_EXCL_START -template<> -void CastFixedList::listToFixedListCastExecFunction( - const std::vector>& /*params*/, ValueVector& /*result*/, - void* /*dataPtr*/) { - KU_UNREACHABLE; -} -// LCOV_EXCL_STOP - -using scalar_cast_func = std::function; - -template -static void getFixedListChildFuncHelper(scalar_cast_func& func, LogicalTypeID inputTypeID) { - switch (inputTypeID) { - case LogicalTypeID::STRING: { - func = UnaryCastStringFunctionWrapper::operation; - } break; - case LogicalTypeID::INT128: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::INT64: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::INT32: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::INT16: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::INT8: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::UINT8: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::UINT16: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::UINT32: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::UINT64: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::FLOAT: { - func = UnaryFunctionWrapper::operation; - } break; - case LogicalTypeID::DOUBLE: { - func = UnaryFunctionWrapper::operation; - } break; - default: { - throw ConversionException{ - stringFormat("Unsupported casting function from {} to numerical type.", - LogicalTypeUtils::toString(inputTypeID))}; - } - } -} - -static void getFixedListChildCastFunc( - scalar_cast_func& func, LogicalTypeID inputType, LogicalTypeID resultType) { - // only support limited Fixed List Types - switch (resultType) { - case LogicalTypeID::INT64: { - return getFixedListChildFuncHelper(func, inputType); - } - case LogicalTypeID::INT32: { - return getFixedListChildFuncHelper(func, inputType); - } - case LogicalTypeID::INT16: { - return getFixedListChildFuncHelper(func, inputType); - } - case LogicalTypeID::DOUBLE: { - return getFixedListChildFuncHelper(func, inputType); - } - case LogicalTypeID::FLOAT: { - return getFixedListChildFuncHelper(func, inputType); - } - default: { - throw RuntimeException("Unsupported FIXED_LIST type: Function::getFixedListChildCastFunc"); - } - } -} - -template<> -void CastFixedList::listToFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - const auto& inputVector = params[0]; - auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - - auto inputChildId = VarListType::getChildType(&inputVector->dataType)->getLogicalTypeID(); - auto outputChildId = FixedListType::getChildType(&result.dataType)->getLogicalTypeID(); - auto numValuesPerList = FixedListType::getNumValuesInList(&result.dataType); - scalar_cast_func func; - getFixedListChildCastFunc(func, inputChildId, outputChildId); - - result.setNullFromBits(inputVector->getNullMaskData(), 0, 0, numOfEntries); - auto inputChildVector = ListVector::getDataVector(inputVector.get()); - for (auto i = 0u; i < numOfEntries; i++) { - if (!result.isNull(i)) { - auto listEntry = inputVector->getValue(i); - if (listEntry.size == numValuesPerList) { - for (auto j = 0u; j < listEntry.size; j++) { - func((void*)(inputChildVector), listEntry.offset + j, (void*)(&result), - i * numValuesPerList + j, nullptr); - } - } - } - } -} - -template<> -void CastFixedList::castBetweenFixedListExecFunc( - const std::vector>& params, ValueVector& result, void* dataPtr) { - const auto& inputVector = params[0]; - auto numOfEntries = inputVector->state->selVector - ->selectedPositions[inputVector->state->selVector->selectedSize - 1] + - 1; - reinterpret_cast(dataPtr)->numOfEntries = numOfEntries; - castBetweenFixedListExecFunc(params, result, dataPtr); -} - -// LCOV_EXCL_START -template<> -void CastFixedList::castBetweenFixedListExecFunc( - const std::vector>& /*params*/, ValueVector& /*result*/, - void* /*dataPtr*/) { - KU_UNREACHABLE; -} -// LCOV_EXCL_STOP - -template<> -void CastFixedList::castBetweenFixedListExecFunc( - const std::vector>& params, ValueVector& result, void* dataPtr) { - const auto& inputVector = params[0]; - auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - - auto inputChildId = FixedListType::getChildType(&inputVector->dataType)->getLogicalTypeID(); - auto outputChildId = FixedListType::getChildType(&result.dataType)->getLogicalTypeID(); - auto numValuesPerList = FixedListType::getNumValuesInList(&result.dataType); - if (FixedListType::getNumValuesInList(&inputVector->dataType) != numValuesPerList) { - throw ConversionException(stringFormat("Unsupported casting function from {} to {}.", - inputVector->dataType.toString(), result.dataType.toString())); - } - - scalar_cast_func func; - getFixedListChildCastFunc(func, inputChildId, outputChildId); - - result.setNullFromBits(inputVector->getNullMaskData(), 0, 0, numOfEntries); - for (auto i = 0u; i < numOfEntries; i++) { - if (!result.isNull(i)) { - for (auto j = 0u; j < numValuesPerList; j++) { - func((void*)(inputVector.get()), i * numValuesPerList + j, (void*)(&result), - i * numValuesPerList + j, nullptr); - } - } - } -} - -} // namespace function -} // namespace kuzu diff --git a/src/function/cast_from_string_functions.cpp b/src/function/cast_from_string_functions.cpp index 183536feaea..522309b48c6 100644 --- a/src/function/cast_from_string_functions.cpp +++ b/src/function/cast_from_string_functions.cpp @@ -1,7 +1,6 @@ #include "function/cast/functions/cast_from_string_functions.h" #include "common/exception/copy.h" -#include "common/exception/not_implemented.h" #include "common/exception/parser.h" #include "common/string_format.h" #include "common/types/blob.h" @@ -19,9 +18,6 @@ struct CastStringHelper { uint64_t /*rowToAdd*/ = 0, const CSVOption* /*option*/ = nullptr) { simpleIntegerCast(input, len, result, LogicalTypeID::INT64); } - - static void castToFixedList(const char* input, uint64_t len, ValueVector* vector, - uint64_t rowToAdd, const CSVOption* option); }; template<> @@ -256,7 +252,7 @@ static bool isNull(std::string_view& str) { return false; } -// ---------------------- cast String to Varlist ------------------------------ // +// ---------------------- cast String to Varlist Helper ------------------------------ // struct CountPartOperation { uint64_t count = 0; @@ -342,12 +338,28 @@ static inline void startListCast( } } +// ---------------------- cast String to Array Helper ------------------------------ // +static void validateNumElementsInArray(uint64_t numElementsRead, const LogicalType& type) { + auto numElementsInArray = ArrayType::getNumElements(&type); + if (numElementsRead != numElementsInArray) { + throw CopyException(stringFormat( + "Each array should have fixed number of elements. Expected: {}, Actual: {}.", + numElementsInArray, numElementsRead)); + } +} + +// ---------------------- cast String to List/Array ------------------------------ // template<> void CastStringHelper::cast(const char* input, uint64_t len, list_entry_t& /*result*/, ValueVector* vector, uint64_t rowToAdd, const CSVOption* option) { + auto logicalTypeID = vector->dataType.getLogicalTypeID(); + // calculate the number of elements in array CountPartOperation state; splitCStringList(input, len, state, option); + if (logicalTypeID == LogicalTypeID::ARRAY) { + validateNumElementsInArray(state.count, vector->dataType); + } auto list_entry = ListVector::addList(vector, state.count); vector->setValue(rowToAdd, list_entry); @@ -364,81 +376,6 @@ void CastString::operation(const ku_string_t& input, list_entry_t& result, resultVector, rowToAdd, option); } -// ---------------------- cast String to FixedList ------------------------------ // -template -struct SplitStringFixedListOperation { - SplitStringFixedListOperation(uint64_t& offset, ValueVector* resultVector) - : offset(offset), resultVector(resultVector) {} - - uint64_t& offset; - ValueVector* resultVector; - - void handleValue(const char* start, const char* end, const CSVOption* /*option*/) { - T value; - auto str = std::string_view{start, (uint32_t)(end - start)}; - if (str.empty() || isNull(str)) { - throw ConversionException("Cast failed. NULL is not allowed for FIXED_LIST."); - } - CastStringHelper::cast(start, str.length(), value); - resultVector->setValue(offset, value); - offset++; - } -}; - -static void validateNumElementsInList(uint64_t numElementsRead, const LogicalType& type) { - auto numElementsInList = FixedListType::getNumValuesInList(&type); - if (numElementsRead != numElementsInList) { - throw CopyException(stringFormat( - "Each fixed list should have fixed number of elements. Expected: {}, Actual: {}.", - numElementsInList, numElementsRead)); - } -} - -void CastStringHelper::castToFixedList(const char* input, uint64_t len, ValueVector* vector, - uint64_t rowToAdd, const CSVOption* option) { - KU_ASSERT(vector->dataType.getLogicalTypeID() == LogicalTypeID::FIXED_LIST); - auto childDataType = FixedListType::getChildType(&vector->dataType); - - // calculate the number of elements in array - CountPartOperation state; - splitCStringList(input, len, state, option); - validateNumElementsInList(state.count, vector->dataType); - - auto startOffset = state.count * rowToAdd; - switch (childDataType->getLogicalTypeID()) { - // TODO(Kebing): currently only allow these type - case LogicalTypeID::INT64: { - SplitStringFixedListOperation split{startOffset, vector}; - startListCast(input, len, split, option, vector); - } break; - case LogicalTypeID::INT32: { - SplitStringFixedListOperation split{startOffset, vector}; - startListCast(input, len, split, option, vector); - } break; - case LogicalTypeID::INT16: { - SplitStringFixedListOperation split{startOffset, vector}; - startListCast(input, len, split, option, vector); - } break; - case LogicalTypeID::FLOAT: { - SplitStringFixedListOperation split{startOffset, vector}; - startListCast(input, len, split, option, vector); - } break; - case LogicalTypeID::DOUBLE: { - SplitStringFixedListOperation split{startOffset, vector}; - startListCast(input, len, split, option, vector); - } break; - default: { - throw NotImplementedException("Unsupported data type: Function::castStringToFixedList"); - } - } -} - -void CastString::castToFixedList(const ku_string_t& input, ValueVector* resultVector, - uint64_t rowToAdd, const CSVOption* option) { - CastStringHelper::castToFixedList( - reinterpret_cast(input.getData()), input.len, resultVector, rowToAdd, option); -} - // ---------------------- cast String to Map ------------------------------ // struct SplitStringMapOperation { SplitStringMapOperation(uint64_t& offset, ValueVector* resultVector) @@ -945,14 +882,11 @@ void CastString::copyStringToVector( map_entry_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: { list_entry_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; - case LogicalTypeID::FIXED_LIST: { - CastStringHelper::castToFixedList( - strVal.data(), strVal.length(), vector, vectorPos, option); - } break; case LogicalTypeID::STRUCT: { struct_entry_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index 3982d274e99..56bc1b74f13 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -4,7 +4,7 @@ #include "binder/expression/literal_expression.h" #include "common/exception/binder.h" #include "common/exception/conversion.h" -#include "function/cast/functions/cast_fixed_list.h" +#include "function/cast/functions/cast_array.h" #include "function/cast/functions/cast_from_string_functions.h" #include "function/cast/functions/cast_functions.h" #include "function/cast/functions/cast_rdf_variant.h" @@ -15,62 +15,6 @@ using namespace kuzu::binder; namespace kuzu { namespace function { -template -static void fixedListToListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - KU_ASSERT(params.size() == 1); - const auto& inputVector = params[0]; - - auto numValuesPerList = FixedListType::getNumValuesInList(&inputVector->dataType); - for (auto i = 0u; i < inputVector->state->selVector->selectedSize; i++) { - auto pos = inputVector->state->selVector->selectedPositions[i]; - result.setNull(pos, inputVector->isNull(pos)); - if (!result.isNull(pos)) { - list_entry_t listEntry{pos * numValuesPerList, numValuesPerList}; - result.setValue(pos, listEntry); - } - } - auto numOfEntries = inputVector->state->selVector - ->selectedPositions[inputVector->state->selVector->selectedSize - 1] + - 1; - ListVector::resizeDataVector(&result, numOfEntries * numValuesPerList); - - auto resultVector = ListVector::getDataVector(&result); - scalar_func_exec_t func = CastFunction::bindCastFunction( - "CAST", FixedListType::getChildType(&inputVector->dataType)->getLogicalTypeID(), - resultVector->dataType.getLogicalTypeID()) - ->execFunc; - reinterpret_cast(dataPtr)->numOfEntries = numOfEntries; - func(params, *resultVector, dataPtr); -} - -template<> -void fixedListToListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { - KU_ASSERT(params.size() == 1); - const auto& inputVector = params[0]; - - auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - result.setNullFromBits(inputVector->getNullMaskData(), 0, 0, numOfEntries); - auto numValuesPerList = FixedListType::getNumValuesInList(&inputVector->dataType); - ListVector::resizeDataVector(&result, numOfEntries * numValuesPerList); - - for (auto i = 0u; i < numOfEntries; i++) { - result.setNull(i, inputVector->isNull(i)); - if (!result.isNull(i)) { - list_entry_t listEntry{i * numValuesPerList, numValuesPerList}; - result.setValue(i, listEntry); - } - } - - auto resultVector = ListVector::getDataVector(&result); - scalar_func_exec_t func = CastFunction::bindCastFunction( - "CAST", FixedListType::getChildType(&inputVector->dataType)->getLogicalTypeID(), - resultVector->dataType.getLogicalTypeID()) - ->execFunc; - func(params, *resultVector, dataPtr); -} - static void resolveNestedVector(std::shared_ptr inputVector, ValueVector* resultVector, uint64_t numOfEntries, CastFunctionBindData* dataPtr) { auto inputType = &inputVector->dataType; @@ -139,10 +83,10 @@ static void nestedTypesCastExecFunction( const auto& inputVector = params[0]; // check if all selcted list entry have the requried fixed list size - if (CastFixedListHelper::containsListToFixedList(&inputVector->dataType, &result.dataType)) { + if (CastArrayHelper::containsListToArray(&inputVector->dataType, &result.dataType)) { for (auto i = 0u; i < inputVector->state->selVector->selectedSize; i++) { auto pos = inputVector->state->selVector->selectedPositions[i]; - CastFixedListHelper::validateListEntry(inputVector.get(), &result.dataType, pos); + CastArrayHelper::validateListEntry(inputVector.get(), &result.dataType, pos); } }; @@ -265,13 +209,11 @@ static std::unique_ptr bindCastFromStringFunction( execFunc = ScalarFunction::UnaryCastStringExecFunction; } break; + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: { execFunc = ScalarFunction::UnaryCastStringExecFunction; } break; - case LogicalTypeID::FIXED_LIST: { - execFunc = CastFixedList::stringtoFixedListCastExecFunction; - } break; case LogicalTypeID::MAP: { execFunc = ScalarFunction::UnaryCastStringExecFunction; @@ -460,13 +402,11 @@ static std::unique_ptr bindCastToStringFunction( func = ScalarFunction::UnaryCastExecFunction; } break; + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: { func = ScalarFunction::UnaryCastExecFunction; } break; - case LogicalTypeID::FIXED_LIST: { - func = CastFixedList::fixedListToStringCastExecFunction; - } break; case LogicalTypeID::MAP: { func = ScalarFunction::UnaryCastExecFunction; @@ -629,32 +569,16 @@ template static std::unique_ptr bindCastBetweenNested( const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { switch (sourceTypeID) { - case LogicalTypeID::VAR_LIST: { - if (targetTypeID == LogicalTypeID::FIXED_LIST) { - return std::make_unique(functionName, - std::vector{sourceTypeID}, targetTypeID, - CastFixedList::listToFixedListCastExecFunction); - } - } + case LogicalTypeID::VAR_LIST: case LogicalTypeID::MAP: - case LogicalTypeID::STRUCT: { - if (sourceTypeID == targetTypeID) { + case LogicalTypeID::STRUCT: + case LogicalTypeID::ARRAY: { + if (CastArrayHelper::checkCompatibleNestedTypes(sourceTypeID, targetTypeID)) { return std::make_unique(functionName, std::vector{sourceTypeID}, targetTypeID, nestedTypesCastExecFunction); } } - case LogicalTypeID::FIXED_LIST: { - if (targetTypeID == LogicalTypeID::VAR_LIST) { - return std::make_unique(functionName, - std::vector{sourceTypeID}, targetTypeID, - fixedListToListCastExecFunction); - } else if (sourceTypeID == targetTypeID) { - return std::make_unique(functionName, - std::vector{sourceTypeID}, targetTypeID, - CastFixedList::castBetweenFixedListExecFunc); - } - } default: throw ConversionException{stringFormat("Unsupported casting function from {} to {}.", LogicalTypeUtils::toString(sourceTypeID), LogicalTypeUtils::toString(targetTypeID))}; @@ -776,7 +700,7 @@ std::unique_ptr CastFunction::bindCastFunction( functionName, sourceTypeID, targetTypeID); } case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: + case LogicalTypeID::ARRAY: case LogicalTypeID::MAP: case LogicalTypeID::STRUCT: { return bindCastBetweenNested(functionName, sourceTypeID, targetTypeID); diff --git a/src/include/c_api/kuzu.h b/src/include/c_api/kuzu.h index 03e78511ae2..f27677d303c 100644 --- a/src/include/c_api/kuzu.h +++ b/src/include/c_api/kuzu.h @@ -292,18 +292,18 @@ typedef enum { KUZU_TIMESTAMP_NS = 38, KUZU_TIMESTAMP_TZ = 39, KUZU_INTERVAL = 40, - KUZU_FIXED_LIST = 41, KUZU_INTERNAL_ID = 42, // variable size types KUZU_STRING = 50, KUZU_BLOB = 51, KUZU_VAR_LIST = 52, - KUZU_STRUCT = 53, - KUZU_MAP = 54, - KUZU_UNION = 55, - KUZU_RDF_VARIANT = 56, - KUZU_POINTER = 57, - KUZU_UUID = 58 + KUZU_ARRAY = 53, + KUZU_STRUCT = 54, + KUZU_MAP = 55, + KUZU_UNION = 56, + KUZU_RDF_VARIANT = 57, + KUZU_POINTER = 58, + KUZU_UUID = 59 } kuzu_data_type_id; // Database @@ -683,15 +683,14 @@ KUZU_C_API char* kuzu_flat_tuple_to_string(kuzu_flat_tuple* flat_tuple); // DataType // TODO(Chang): Refactor the datatype constructor to follow the cpp way of creating dataTypes. /** - * @brief Creates a data type instance with the given id, childType and fixed_num_elements_in_list. + * @brief Creates a data type instance with the given id, childType and num_elements_in_array. * Caller is responsible for destroying the returned data type instance. * @param id The enum type id of the datatype to create. * @param child_type The child type of the datatype to create(only used for nested dataTypes). - * @param fixed_num_elements_in_list The fixed number of elements in the list(only used for - * FIXED_LIST). + * @param num_elements_in_array The number of elements in the array(only used for ARRAY). */ KUZU_C_API kuzu_logical_type* kuzu_data_type_create( - kuzu_data_type_id id, kuzu_logical_type* child_type, uint64_t fixed_num_elements_in_list); + kuzu_data_type_id id, kuzu_logical_type* child_type, uint64_t num_elements_in_array); /** * @brief Creates a new data type instance by cloning the given data type instance. * @param data_type The data type instance to clone. @@ -714,10 +713,10 @@ KUZU_C_API bool kuzu_data_type_equals(kuzu_logical_type* data_type1, kuzu_logica */ KUZU_C_API kuzu_data_type_id kuzu_data_type_get_id(kuzu_logical_type* data_type); /** - * @brief Returns the number of elements per list for fixedSizeList. + * @brief Returns the number of elements for array. * @param data_type The data type instance to return. */ -KUZU_C_API uint64_t kuzu_data_type_get_fixed_num_elements_in_list(kuzu_logical_type* data_type); +KUZU_C_API uint64_t kuzu_data_type_get_num_elements_in_array(kuzu_logical_type* data_type); // Value /** @@ -892,8 +891,8 @@ KUZU_C_API void kuzu_value_copy(kuzu_value* value, kuzu_value* other); KUZU_C_API void kuzu_value_destroy(kuzu_value* value); /** * @brief Returns the number of elements per list of the given value. The value must be of type - * FIXED_LIST. - * @param value The FIXED_LIST value to get list size. + * ARRAY. + * @param value The ARRAY value to get list size. */ KUZU_C_API uint64_t kuzu_value_get_list_size(kuzu_value* value); /** diff --git a/src/include/common/type_utils.h b/src/include/common/type_utils.h index b396fe1985c..7996d7a8ec4 100644 --- a/src/include/common/type_utils.h +++ b/src/include/common/type_utils.h @@ -34,11 +34,6 @@ class TypeUtils { std::is_same::value || std::is_same::value); return std::to_string(val); } - // Fixed list does not have a physical class. So we cannot reuse above toString template. - // dummyVector is used to avoid clang-tidy check and should be removed once we unify - // Fixed-LIST in memory layout with VAR-LIST. - static std::string fixedListToString( - const uint8_t* val, const common::LogicalType& type, ValueVector* dummyVector); static std::string nodeToString(const struct_entry_t& val, ValueVector* vector); static std::string relToString(const struct_entry_t& val, ValueVector* vector); @@ -177,6 +172,7 @@ class TypeUtils { return func(blob_t()); case LogicalTypeID::UUID: return func(ku_uuid_t()); + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: return func(list_entry_t()); case LogicalTypeID::MAP: @@ -189,11 +185,9 @@ class TypeUtils { case LogicalTypeID::UNION: return func(union_entry_t()); /* NOLINTEND(bugprone-branch-clone)*/ - case LogicalTypeID::FIXED_LIST: case LogicalTypeID::ANY: case LogicalTypeID::POINTER: case LogicalTypeID::RDF_VARIANT: - // FIXED_LIST has no type KU_UNREACHABLE; } } @@ -239,7 +233,6 @@ class TypeUtils { return func(list_entry_t()); /* NOLINTEND(bugprone-branch-clone)*/ case PhysicalTypeID::ANY: - case PhysicalTypeID::FIXED_LIST: case PhysicalTypeID::POINTER: case PhysicalTypeID::STRUCT: // Unsupported type diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 633a042f4d7..6f4b202fcda 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -115,7 +115,6 @@ enum class KUZU_API LogicalTypeID : uint8_t { TIMESTAMP_NS = 38, TIMESTAMP_TZ = 39, INTERVAL = 40, - FIXED_LIST = 41, INTERNAL_ID = 42, @@ -123,13 +122,14 @@ enum class KUZU_API LogicalTypeID : uint8_t { BLOB = 51, VAR_LIST = 52, - STRUCT = 53, - MAP = 54, - UNION = 55, - RDF_VARIANT = 56, - POINTER = 57, - - UUID = 58 + ARRAY = 53, + STRUCT = 54, + MAP = 55, + UNION = 56, + RDF_VARIANT = 57, + POINTER = 58, + + UUID = 59 }; enum class PhysicalTypeID : uint8_t { @@ -152,7 +152,6 @@ enum class PhysicalTypeID : uint8_t { // Variable size types. STRING = 20, - FIXED_LIST = 21, VAR_LIST = 22, STRUCT = 23, POINTER = 24, @@ -190,14 +189,13 @@ class VarListTypeInfo : public ExtraTypeInfo { std::unique_ptr childType; }; -class FixedListTypeInfo : public VarListTypeInfo { +class ArrayTypeInfo : public VarListTypeInfo { public: - FixedListTypeInfo() = default; - explicit FixedListTypeInfo( - std::unique_ptr childType, uint64_t fixedNumElementsInList) - : VarListTypeInfo{std::move(childType)}, fixedNumElementsInList{fixedNumElementsInList} {} - inline uint64_t getNumValuesInList() const { return fixedNumElementsInList; } - bool operator==(const FixedListTypeInfo& other) const; + ArrayTypeInfo() = default; + explicit ArrayTypeInfo(std::unique_ptr childType, uint64_t numElements) + : VarListTypeInfo{std::move(childType)}, numElements{numElements} {} + inline uint64_t getNumElements() const { return numElements; } + bool operator==(const ArrayTypeInfo& other) const; static std::unique_ptr deserialize(Deserializer& deserializer); std::unique_ptr copy() const override; @@ -205,7 +203,7 @@ class FixedListTypeInfo : public VarListTypeInfo { void serializeInternal(Serializer& serializer) const override; private: - uint64_t fixedNumElementsInList; + uint64_t numElements; }; class StructField { @@ -263,7 +261,7 @@ class LogicalType { friend class LogicalTypeUtils; friend struct StructType; friend struct VarListType; - friend struct FixedListType; + friend struct ArrayType; public: KUZU_API LogicalType() : typeID{LogicalTypeID::ANY}, extraTypeInfo{nullptr} { @@ -409,8 +407,13 @@ class LogicalType { std::make_unique(std::forward(valueType))); } - static KUZU_API std::unique_ptr FIXED_LIST( - std::unique_ptr childType, uint64_t fixedNumElementsInList); + static KUZU_API std::unique_ptr ARRAY( + std::unique_ptr childType, uint64_t numElements); + template + static inline std::unique_ptr ARRAY(T&& childType, uint64_t numElements) { + return LogicalType::ARRAY( + std::make_unique(std::forward(childType)), numElements); + } private: friend struct CAPIHelper; @@ -434,17 +437,17 @@ struct VarListType { } }; -struct FixedListType { +struct ArrayType { static inline LogicalType* getChildType(const LogicalType* type) { - KU_ASSERT(type->getLogicalTypeID() == LogicalTypeID::FIXED_LIST); - auto fixedListTypeInfo = reinterpret_cast(type->extraTypeInfo.get()); - return fixedListTypeInfo->getChildType(); + KU_ASSERT(type->getLogicalTypeID() == LogicalTypeID::ARRAY); + auto arrayTypeInfo = reinterpret_cast(type->extraTypeInfo.get()); + return arrayTypeInfo->getChildType(); } - static inline uint64_t getNumValuesInList(const LogicalType* type) { - KU_ASSERT(type->getLogicalTypeID() == LogicalTypeID::FIXED_LIST); - auto fixedListTypeInfo = reinterpret_cast(type->extraTypeInfo.get()); - return fixedListTypeInfo->getNumValuesInList(); + static inline uint64_t getNumElements(const LogicalType* type) { + KU_ASSERT(type->getLogicalTypeID() == LogicalTypeID::ARRAY); + auto arrayTypeInfo = reinterpret_cast(type->extraTypeInfo.get()); + return arrayTypeInfo->getNumElements(); } }; @@ -574,7 +577,7 @@ class LogicalTypeUtils { static LogicalTypeID dataTypeIDFromString(const std::string& trimmedStr); static std::vector parseStructFields(const std::string& structTypeStr); static std::unique_ptr parseVarListType(const std::string& trimmedStr); - static std::unique_ptr parseFixedListType(const std::string& trimmedStr); + static std::unique_ptr parseArrayType(const std::string& trimmedStr); static std::vector parseStructTypeInfo(const std::string& structTypeStr); static std::unique_ptr parseStructType(const std::string& trimmedStr); static std::unique_ptr parseMapType(const std::string& trimmedStr); diff --git a/src/include/common/types/value/value.h b/src/include/common/types/value/value.h index dc30bd38af2..8b59f60f0c6 100644 --- a/src/include/common/types/value/value.h +++ b/src/include/common/types/value/value.h @@ -236,7 +236,6 @@ class Value { Value(); explicit Value(const LogicalType& dataType); - void copyFromFixedList(const uint8_t* fixedList); void copyFromVarList(ku_list_t& list, const LogicalType& childType); void copyFromStruct(const uint8_t* kuStruct); void copyFromUnion(const uint8_t* kuUnion); diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index 50ac2fe82fc..ad28f89e0d9 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -19,7 +19,6 @@ class Value; //! The capacity of a ValueVector is either 1 (sequence) or DEFAULT_VECTOR_CAPACITY. class KUZU_API ValueVector { friend class ListVector; - friend class FixedListVector; friend class ListAuxiliaryBuffer; friend class StructVector; friend class StringVector; @@ -74,7 +73,7 @@ class KUZU_API ValueVector { void copyFromVectorData(uint64_t dstPos, const ValueVector* srcVector, uint64_t srcPos); void copyFromValue(uint64_t pos, const Value& value); - std::unique_ptr getAsValue(uint64_t pos); + std::unique_ptr getAsValue(uint64_t pos) const; uint8_t* getData() const { return valueBuffer.get(); } @@ -201,29 +200,6 @@ class KUZU_API ListVector { static void sliceDataVector(ValueVector* vectorToSlice, uint64_t offset, uint64_t numValues); }; -class KUZU_API FixedListVector { -public: - template - static void getAsValue(ValueVector* vector, std::vector>& children, - uint64_t pos, uint64_t numElements); -}; - -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements); -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements); -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements); -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements); -template<> -void FixedListVector::getAsValue(ValueVector* vector, - std::vector>& children, uint64_t pos, uint64_t numElements); - class StructVector { public: static inline const std::vector>& getFieldVectors( diff --git a/src/include/function/cast/functions/cast_array.h b/src/include/function/cast/functions/cast_array.h new file mode 100644 index 00000000000..d516d45dc87 --- /dev/null +++ b/src/include/function/cast/functions/cast_array.h @@ -0,0 +1,20 @@ +#pragma once + +#include "common/types/types.h" +#include "common/vector/value_vector.h" + +using namespace kuzu::common; + +namespace kuzu { +namespace function { + +struct CastArrayHelper { + static bool checkCompatibleNestedTypes(LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID); + + static bool containsListToArray(const LogicalType* srcType, const LogicalType* dstType); + + static void validateListEntry(ValueVector* inputVector, LogicalType* resultType, uint64_t pos); +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/cast/functions/cast_fixed_list.h b/src/include/function/cast/functions/cast_fixed_list.h deleted file mode 100644 index b313a9209be..00000000000 --- a/src/include/function/cast/functions/cast_fixed_list.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include "function/unary_function_executor.h" - -using namespace kuzu::common; - -namespace kuzu { -namespace function { - -struct CastFixedListHelper { - static bool containsListToFixedList(const LogicalType* srcType, const LogicalType* dstType); - - static void validateListEntry(ValueVector* inputVector, LogicalType* resultType, uint64_t pos); -}; - -struct CastFixedList { - template - static void fixedListToStringCastExecFunction( - const std::vector>& params, ValueVector& result, - void* dataPtr); - - template - static void stringtoFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, - void* dataPtr); - - template - static void listToFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, - void* dataPtr); - - template - static void castBetweenFixedListExecFunc( - const std::vector>& params, ValueVector& result, - void* dataPtr); -}; - -template<> -void CastFixedList::fixedListToStringCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::fixedListToStringCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::fixedListToStringCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); - -template<> -void CastFixedList::stringtoFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::stringtoFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::stringtoFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); - -template<> -void CastFixedList::listToFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::listToFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::listToFixedListCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr); - -template<> -void CastFixedList::castBetweenFixedListExecFunc( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::castBetweenFixedListExecFunc( - const std::vector>& params, ValueVector& result, void* dataPtr); -template<> -void CastFixedList::castBetweenFixedListExecFunc( - const std::vector>& params, ValueVector& result, void* dataPtr); - -} // namespace function -} // namespace kuzu diff --git a/src/include/function/cast/functions/cast_from_string_functions.h b/src/include/function/cast/functions/cast_from_string_functions.h index 7df9181deec..219021f3354 100644 --- a/src/include/function/cast/functions/cast_from_string_functions.h +++ b/src/include/function/cast/functions/cast_from_string_functions.h @@ -31,9 +31,6 @@ struct CastString { simpleIntegerCast(reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::INT64); } - - static void castToFixedList(const ku_string_t& input, ValueVector* resultVector, - uint64_t rowToAdd, const CSVOption* option); }; template<> diff --git a/src/include/function/unary_function_executor.h b/src/include/function/unary_function_executor.h index 7916bbbf5b4..ae9002eafa5 100644 --- a/src/include/function/unary_function_executor.h +++ b/src/include/function/unary_function_executor.h @@ -90,25 +90,6 @@ struct UnaryUDFFunctionWrapper { } }; -struct CastFixedListToListFunctionExecutor { - template - static void executeSwitch( - common::ValueVector& operand, common::ValueVector& result, void* dataPtr) { - auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; - auto numValuesPerList = common::FixedListType::getNumValuesInList(&operand.dataType); - - for (auto i = 0u; i < numOfEntries; i++) { - if (!operand.isNull(i)) { - for (auto j = 0u; j < numValuesPerList; j++) { - OP_WRAPPER::template operation( - (void*)(&operand), i * numValuesPerList + j, (void*)(&result), - i * numValuesPerList + j, nullptr); - } - } - } - } -}; - struct CastChildFunctionExecutor { template static void executeSwitch( diff --git a/src/include/main/query_result.h b/src/include/main/query_result.h index e52d957861f..de517b4c844 100644 --- a/src/include/main/query_result.h +++ b/src/include/main/query_result.h @@ -15,13 +15,13 @@ namespace main { struct DataTypeInfo { public: DataTypeInfo(common::LogicalTypeID typeID, std::string name) - : typeID{typeID}, name{std::move(name)}, numValuesPerList{0} {} + : typeID{typeID}, name{std::move(name)}, fixedNumValues{0} {} common::LogicalTypeID typeID; std::string name; std::vector> childrenTypesInfo; - // Used by fixedList only. - uint64_t numValuesPerList; + // Used by array only. + uint64_t fixedNumValues; static std::unique_ptr getInfoForDataType( const common::LogicalType& type, const std::string& name); diff --git a/src/main/query_result.cpp b/src/main/query_result.cpp index 1a62e21bd48..af96d6038cd 100644 --- a/src/main/query_result.cpp +++ b/src/main/query_result.cpp @@ -28,10 +28,10 @@ std::unique_ptr DataTypeInfo::getInfoForDataType( auto childType = VarListType::getChildType(&type); parentTypeInfo->childrenTypesInfo.push_back(getInfoForDataType(*childType, "")); } break; - case LogicalTypeID::FIXED_LIST: { + case LogicalTypeID::ARRAY: { auto parentTypeInfo = columnTypeInfo.get(); - parentTypeInfo->numValuesPerList = FixedListType::getNumValuesInList(&type); - auto childType = FixedListType::getChildType(&type); + parentTypeInfo->fixedNumValues = ArrayType::getNumElements(&type); + auto childType = ArrayType::getChildType(&type); parentTypeInfo->childrenTypesInfo.push_back(getInfoForDataType(*childType, "")); } break; case LogicalTypeID::STRUCT: { diff --git a/src/main/storage_driver.cpp b/src/main/storage_driver.cpp index 56032d4bb68..fd13a87f327 100644 --- a/src/main/storage_driver.cpp +++ b/src/main/storage_driver.cpp @@ -2,10 +2,14 @@ #include +#include "common/types/types.h" +#include "common/vector/value_vector.h" #include "storage/storage_manager.h" +#include "storage/storage_utils.h" using namespace kuzu::common; using namespace kuzu::transaction; +using namespace kuzu::storage; namespace kuzu { namespace main { @@ -56,7 +60,23 @@ uint64_t StorageDriver::getNumRels(const std::string& relName) { void StorageDriver::scanColumn(Transaction* transaction, storage::Column* column, offset_t* offsets, size_t size, uint8_t* result) { - column->batchLookup(transaction, offsets, size, result); + auto dataType = column->getDataType(); + if (dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST) { + auto resultVector = ValueVector(dataType); + for (auto i = 0u; i < size; ++i) { + auto nodeOffset = offsets[i]; + auto [nodeGroupIdx, offsetInChunk] = + StorageUtils::getNodeGroupIdxAndOffsetInChunk(nodeOffset); + column->scan( + transaction, nodeGroupIdx, offsetInChunk, offsetInChunk + 1, &resultVector, i); + } + auto dataVector = ListVector::getDataVector(&resultVector); + auto dataVectorSize = ListVector::getDataVectorSize(&resultVector); + auto dataChildTypeSize = LogicalTypeUtils::getRowLayoutSize(dataVector->dataType); + memcpy(result, dataVector->getData(), dataVectorSize * dataChildTypeSize); + } else { + column->batchLookup(transaction, offsets, size, result); + } } } // namespace main diff --git a/src/processor/operator/persistent/reader/npy/npy_reader.cpp b/src/processor/operator/persistent/reader/npy/npy_reader.cpp index 2b4425548fe..b343bd89ef2 100644 --- a/src/processor/operator/persistent/reader/npy/npy_reader.cpp +++ b/src/processor/operator/persistent/reader/npy/npy_reader.cpp @@ -183,7 +183,7 @@ void NpyReader::validate(const LogicalType& type_, offset_t numRows) { if (numNodesInFile != numRows) { throw CopyException("Number of rows in npy files is not equal to each other."); } - // TODO(Guodong): Set npy reader data type to FIXED_LIST, so we can simplify checks here. + // TODO(Guodong): Set npy reader data type to ARRAY, so we can simplify checks here. if (type_.getLogicalTypeID() == this->type) { if (getNumElementsPerRow() != 1) { throw CopyException(stringFormat("Cannot copy a vector property in npy file {} to a " @@ -191,13 +191,13 @@ void NpyReader::validate(const LogicalType& type_, offset_t numRows) { filePath)); } return; - } else if (type_.getLogicalTypeID() == LogicalTypeID::FIXED_LIST) { - if (this->type != FixedListType::getChildType(&type_)->getLogicalTypeID()) { + } else if (type_.getLogicalTypeID() == LogicalTypeID::ARRAY) { + if (this->type != ArrayType::getChildType(&type_)->getLogicalTypeID()) { throw CopyException(stringFormat("The type of npy file {} does not " "match the expected type.", filePath)); } - if (getNumElementsPerRow() != FixedListType::getNumValuesInList(&type_)) { + if (getNumElementsPerRow() != ArrayType::getNumElements(&type_)) { throw CopyException( stringFormat("The shape of {} does not match {}.", filePath, type_.toString())); } @@ -217,9 +217,22 @@ void NpyReader::readBlock(block_idx_t blockIdx, common::ValueVector* vectorToRea } else { auto rowPointer = getPointerToRow(rowNumber); auto numRowsToRead = std::min(DEFAULT_VECTOR_CAPACITY, getNumRows() - rowNumber); - memcpy(vectorToRead->getData(), rowPointer, - numRowsToRead * vectorToRead->getNumBytesPerValue()); - vectorToRead->state->selVector->selectedSize = numRowsToRead; + auto rowType = vectorToRead->dataType; + if (rowType.getLogicalTypeID() == LogicalTypeID::ARRAY) { + auto numValuesPerRow = ArrayType::getNumElements(&rowType); + for (auto i = 0u; i < numRowsToRead; i++) { + auto listEntry = ListVector::addList(vectorToRead, numValuesPerRow); + vectorToRead->setValue(i, listEntry); + } + auto dataVector = ListVector::getDataVector(vectorToRead); + memcpy(dataVector->getData(), rowPointer, + numRowsToRead * numValuesPerRow * dataVector->getNumBytesPerValue()); + vectorToRead->state->selVector->selectedSize = numRowsToRead; + } else { + memcpy(vectorToRead->getData(), rowPointer, + numRowsToRead * vectorToRead->getNumBytesPerValue()); + vectorToRead->state->selVector->selectedSize = numRowsToRead; + } } } @@ -247,21 +260,21 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output return output.dataChunk.state->selVector->selectedSize; } -static std::unique_ptr bindFixedListType( - const std::vector& shape, LogicalTypeID typeID) { - if (shape.size() == 1) { - return std::make_unique(typeID); +static std::unique_ptr bindColumnType(const NpyReader& reader) { + if (reader.getShape().size() == 1) { + return std::make_unique(reader.getType()); } - auto childShape = std::vector{shape.begin() + 1, shape.end()}; - auto childType = bindFixedListType(childShape, typeID); - return LogicalType::FIXED_LIST(std::move(childType), (uint32_t)shape[0]); + // For columns whose type is a multi-dimension array of size n*m, + // we flatten the row data into an 1-d array with size 1*k where k = n*m + return LogicalType::ARRAY( + std::make_unique(reader.getType()), reader.getNumElementsPerRow()); } static void bindColumns(const common::ReaderConfig& readerConfig, uint32_t fileIdx, std::vector& columnNames, std::vector& columnTypes) { auto reader = NpyReader(readerConfig.filePaths[fileIdx]); // TODO: double check auto columnName = std::string("column" + std::to_string(fileIdx)); - auto columnType = bindFixedListType(reader.getShape(), reader.getType()); + auto columnType = bindColumnType(reader); columnNames.push_back(columnName); columnTypes.push_back(*columnType); } diff --git a/src/storage/storage_utils.cpp b/src/storage/storage_utils.cpp index d346c0f54cf..baf868a0049 100644 --- a/src/storage/storage_utils.cpp +++ b/src/storage/storage_utils.cpp @@ -89,7 +89,6 @@ uint32_t StorageUtils::getDataTypeSize(PhysicalTypeID type) { case PhysicalTypeID::VAR_LIST: { return sizeof(ku_list_t); } - case PhysicalTypeID::FIXED_LIST: case PhysicalTypeID::STRUCT: { // Not calculable using this interface! KU_UNREACHABLE; @@ -105,10 +104,6 @@ uint32_t StorageUtils::getDataTypeSize(const LogicalType& type) { case PhysicalTypeID::STRING: { return sizeof(ku_string_t); } - case PhysicalTypeID::FIXED_LIST: { - return getDataTypeSize(*FixedListType::getChildType(&type)) * - FixedListType::getNumValuesInList(&type); - } case PhysicalTypeID::VAR_LIST: { return sizeof(ku_list_t); } diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 6a04b35dca0..9cb07d376ff 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -888,8 +888,7 @@ std::unique_ptr ColumnFactory::createColumn(std::string name, LogicalTyp case LogicalTypeID::TIMESTAMP_NS: case LogicalTypeID::TIMESTAMP_SEC: case LogicalTypeID::TIMESTAMP_TZ: - case LogicalTypeID::INTERVAL: - case LogicalTypeID::FIXED_LIST: { + case LogicalTypeID::INTERVAL: { return std::make_unique(name, std::move(dataType), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); } @@ -902,6 +901,7 @@ std::unique_ptr ColumnFactory::createColumn(std::string name, LogicalTyp return std::make_unique(name, std::move(dataType), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); } + case LogicalTypeID::ARRAY: case LogicalTypeID::MAP: case LogicalTypeID::VAR_LIST: { return std::make_unique(name, std::move(dataType), metaDAHeaderInfo, dataFH, diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 986c08a6e6a..2142f5362c5 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -397,12 +397,6 @@ uint64_t ColumnChunk::getBufferSize(uint64_t capacity_) const { // 8 values per byte, and we need a buffer size which is a multiple of 8 bytes. return ceil(capacity_ / 8.0 / 8.0) * 8; } - case LogicalTypeID::FIXED_LIST: { - auto numElementsInAPage = - PageUtils::getNumElementsInAPage(numBytesPerValue, false /* hasNull */); - auto numPages = capacity_ / numElementsInAPage + (capacity_ % numElementsInAPage ? 1 : 0); - return BufferPoolConstants::PAGE_4KB_SIZE * numPages; - } default: { return numBytesPerValue * capacity_; } @@ -496,65 +490,6 @@ void NullColumnChunk::append( numValues += numValuesToAppend; } -class FixedListColumnChunk : public ColumnChunk { -public: - FixedListColumnChunk(LogicalType dataType, uint64_t capacity, bool enableCompression) - : ColumnChunk(std::move(dataType), capacity, enableCompression, true /* hasNullChunk */) {} - - void append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final { - auto otherChunk = (FixedListColumnChunk*)other; - if (nullChunk) { - nullChunk->append(otherChunk->nullChunk.get(), startPosInOtherChunk, numValuesToAppend); - } - // TODO(Guodong): This can be optimized to not copy one by one. - for (auto i = 0u; i < numValuesToAppend; i++) { - memcpy(buffer.get() + getOffsetInBuffer(numValues + i), - otherChunk->buffer.get() + getOffsetInBuffer(startPosInOtherChunk + i), - numBytesPerValue); - } - numValues += numValuesToAppend; - } - - void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) final { - KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::FIXED_LIST && - dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64); - KU_ASSERT(chunk->getNumValues() == dstOffsets->getNumValues()); - for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { - auto dstOffset = dstOffsets->getValue(i); - KU_ASSERT(dstOffset < capacity); - nullChunk->setNull(dstOffset, chunk->getNullChunk()->isNull(i)); - if (!chunk->getNullChunk()->isNull(i)) { - memcpy(buffer.get() + getOffsetInBuffer(dstOffset), - chunk->getData() + i * numBytesPerValue, numBytesPerValue); - } - numValues = dstOffset >= numValues ? dstOffset + 1 : numValues; - } - } - - void write(ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) final { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::FIXED_LIST); - KU_ASSERT(offsetInChunk < capacity); - nullChunk->write(vector, offsetInVector, offsetInChunk); - if (!vector->isNull(offsetInVector)) { - memcpy(buffer.get() + getOffsetInBuffer(offsetInChunk), - vector->getData() + offsetInVector * numBytesPerValue, numBytesPerValue); - } - numValues = offsetInChunk >= numValues ? offsetInChunk + 1 : numValues; - } - - void copyVectorToBuffer( - ValueVector* vector, offset_t startPosInChunk, SelectionVector& selVector) final { - auto vectorDataToWriteFrom = vector->getData(); - for (auto i = 0u; i < selVector.selectedSize; i++) { - auto pos = selVector.selectedPositions[i]; - nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); - memcpy(buffer.get() + getOffsetInBuffer(startPosInChunk + i), - vectorDataToWriteFrom + pos * numBytesPerValue, numBytesPerValue); - } - } -}; - class InternalIDColumnChunk final : public ColumnChunk { public: // Physically, we only materialize offset of INTERNAL_ID, which is same as UINT64, @@ -621,10 +556,6 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( case PhysicalTypeID::INTERNAL_ID: { return std::make_unique(capacity); } - case PhysicalTypeID::FIXED_LIST: { - return std::make_unique( - std::move(dataType), capacity, enableCompression); - } case PhysicalTypeID::STRING: { return std::make_unique( std::move(dataType), capacity, enableCompression, inMemory); diff --git a/test/c_api/data_type_test.cpp b/test/c_api/data_type_test.cpp index 6708927d36f..917a8d1ef67 100644 --- a/test/c_api/data_type_test.cpp +++ b/test/c_api/data_type_test.cpp @@ -16,12 +16,12 @@ TEST(CApiDataTypeTest, Create) { ASSERT_EQ(dataTypeCpp2->getLogicalTypeID(), LogicalTypeID::VAR_LIST); // ASSERT_EQ(dataTypeCpp2->getChildType()->getLogicalTypeID(), LogicalTypeID::INT64); - auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_FIXED_LIST, dataType, 100); + auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); ASSERT_NE(dataType3, nullptr); auto dataTypeCpp3 = (LogicalType*)dataType3->_data_type; - ASSERT_EQ(dataTypeCpp3->getLogicalTypeID(), LogicalTypeID::FIXED_LIST); + ASSERT_EQ(dataTypeCpp3->getLogicalTypeID(), LogicalTypeID::ARRAY); // ASSERT_EQ(dataTypeCpp3->getChildType()->getLogicalTypeID(), LogicalTypeID::INT64); - ASSERT_EQ(FixedListType::getNumValuesInList(dataTypeCpp3), 100); + ASSERT_EQ(ArrayType::getNumElements(dataTypeCpp3), 100); // Since child type is copied, we should be able to destroy the original type without an error. kuzu_data_type_destroy(dataType); @@ -46,7 +46,7 @@ TEST(CApiDataTypeTest, Clone) { auto dataTypeCloneCpp2 = (LogicalType*)dataTypeClone2->_data_type; ASSERT_TRUE(*dataTypeCpp2 == *dataTypeCloneCpp2); - auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_FIXED_LIST, dataType, 100); + auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); ASSERT_NE(dataType3, nullptr); auto dataTypeClone3 = kuzu_data_type_clone(dataType3); ASSERT_NE(dataTypeClone3, nullptr); @@ -75,7 +75,7 @@ TEST(CApiDataTypeTest, Eqauls) { ASSERT_NE(dataTypeClone2, nullptr); ASSERT_TRUE(kuzu_data_type_equals(dataType2, dataTypeClone2)); - auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_FIXED_LIST, dataType, 100); + auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); ASSERT_NE(dataType3, nullptr); auto dataTypeClone3 = kuzu_data_type_clone(dataType3); ASSERT_NE(dataTypeClone3, nullptr); @@ -102,9 +102,9 @@ TEST(CApiDataTypeTest, GetID) { ASSERT_NE(dataType2, nullptr); ASSERT_EQ(kuzu_data_type_get_id(dataType2), kuzu_data_type_id::KUZU_VAR_LIST); - auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_FIXED_LIST, dataType, 100); + auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); ASSERT_NE(dataType3, nullptr); - ASSERT_EQ(kuzu_data_type_get_id(dataType3), kuzu_data_type_id::KUZU_FIXED_LIST); + ASSERT_EQ(kuzu_data_type_get_id(dataType3), kuzu_data_type_id::KUZU_ARRAY); kuzu_data_type_destroy(dataType); kuzu_data_type_destroy(dataType2); @@ -126,7 +126,7 @@ TEST(CApiDataTypeTest, GetID) { // kuzu_data_type_destroy(childType2); // kuzu_data_type_destroy(dataType2); // -// auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_FIXED_LIST, dataType, 100); +// auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); // ASSERT_NE(dataType3, nullptr); // auto childType3 = kuzu_data_type_get_child_type(dataType3); // kuzu_data_type_destroy(dataType3); @@ -141,15 +141,15 @@ TEST(CApiDataTypeTest, GetID) { TEST(CApiDataTypeTest, GetFixedNumElementsInList) { auto dataType = kuzu_data_type_create(kuzu_data_type_id::KUZU_INT64, nullptr, 0); ASSERT_NE(dataType, nullptr); - ASSERT_EQ(kuzu_data_type_get_fixed_num_elements_in_list(dataType), 0); + ASSERT_EQ(kuzu_data_type_get_num_elements_in_array(dataType), 0); auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); ASSERT_NE(dataType2, nullptr); - ASSERT_EQ(kuzu_data_type_get_fixed_num_elements_in_list(dataType2), 0); + ASSERT_EQ(kuzu_data_type_get_num_elements_in_array(dataType2), 0); - auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_FIXED_LIST, dataType, 100); + auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); ASSERT_NE(dataType3, nullptr); - ASSERT_EQ(kuzu_data_type_get_fixed_num_elements_in_list(dataType3), 100); + ASSERT_EQ(kuzu_data_type_get_num_elements_in_array(dataType3), 100); kuzu_data_type_destroy(dataType); kuzu_data_type_destroy(dataType2); diff --git a/test/ddl/e2e_ddl_test.cpp b/test/ddl/e2e_ddl_test.cpp index 1372b57bc3a..c976a540361 100644 --- a/test/ddl/e2e_ddl_test.cpp +++ b/test/ddl/e2e_ddl_test.cpp @@ -333,7 +333,7 @@ TEST_F(TinySnbDDLTest, AddInt64PropertyToPersonTableWithoutDefaultValueRecovery) "INT64" /* propertyType */, TransactionTestType::RECOVERY); } -TEST_F(TinySnbDDLTest, AddFixedListPropertyToPersonTableWithoutDefaultValueRecovery) { +TEST_F(TinySnbDDLTest, AddArrayPropertyToPersonTableWithoutDefaultValueRecovery) { addPropertyToPersonTableWithoutDefaultValue( "DOUBLE[5]" /* propertyType */, TransactionTestType::RECOVERY); } diff --git a/test/test_files/exceptions/binder/binder_error.test b/test/test_files/exceptions/binder/binder_error.test index c815e938aeb..c6f3e8c2d6c 100644 --- a/test/test_files/exceptions/binder/binder_error.test +++ b/test/test_files/exceptions/binder/binder_error.test @@ -494,20 +494,10 @@ Catalog exception: Table: person1 does not exist. ---- error Binder exception: person table already has property gender. --LOG InvalidFixedListChildType --STATEMENT create node table test1(ID INT64, marks STRING[5], PRIMARY KEY(ID)) ----- error -Binder exception: The child type of a fixed list must be a numeric type. Given: STRING. - --LOG InvalidFixedListNumElements +-LOG InvalidArrayNumElements -STATEMENT create node table test1(ID INT64, marks INT64[0], PRIMARY KEY(ID)) ---- error -Binder exception: The number of elements in a fixed list must be greater than 0. Given: 0. - --LOG InvalidFixedListSize --STATEMENT create node table test1(ID INT64, marks INT64[512], PRIMARY KEY(ID)) ----- error -Binder exception: Cannot store a fixed list of size 4096 in a page. +Binder exception: The number of elements in an array must be greater than 0. Given: 0. -LOG NonPKSerialType -STATEMENT CREATE NODE TABLE test(ID INT64, seq SERIAL, PRIMARY KEY(ID)) diff --git a/test/test_files/tinysnb/call/call.test b/test/test_files/tinysnb/call/call.test index dc10b125467..d9668f8d269 100644 --- a/test/test_files/tinysnb/call/call.test +++ b/test/test_files/tinysnb/call/call.test @@ -195,10 +195,10 @@ Binder exception: Cannot evaluate a.fName as a literal. 8 -STATEMENT CALL storage_info('person') RETURN COUNT(*) ---- 1 -37 +38 -STATEMENT CALL storage_info('knows') RETURN COUNT(*) ---- 1 84 -STATEMENT CALL storage_info('workAt') RETURN COUNT(*) ---- 1 -24 +26 diff --git a/test/test_files/tinysnb/cast/cast_error.test b/test/test_files/tinysnb/cast/cast_error.test index 7d2f1998bf0..1b41e89b3ae 100644 --- a/test/test_files/tinysnb/cast/cast_error.test +++ b/test/test_files/tinysnb/cast/cast_error.test @@ -641,30 +641,18 @@ Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/map/ -STATEMENT LOAD WITH HEADERS (a MAP(UINT16, UINT16[])) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/map/map_no_closing4.csv" RETURN *; ---- error Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/map/map_no_closing4.csv on line 1: Conversion exception: Cast failed. {432=[432,432} is not in MAP(UINT16: UINT16[]) range. --STATEMENT LOAD WITH HEADERS (a INT64[4]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/incorrect_num.csv" RETURN *; +-STATEMENT LOAD WITH HEADERS (a INT64[4]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/incorrect_num.csv" RETURN *; ---- error -Copy exception: Each fixed list should have fixed number of elements. Expected: 4, Actual: 2. --STATEMENT LOAD WITH HEADERS (a STRING[2]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/unsupported_type.csv" RETURN *; +Copy exception: Each array should have fixed number of elements. Expected: 4, Actual: 2. +-STATEMENT LOAD WITH HEADERS (a INT16[1]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/error_conversion.csv" RETURN *; ---- error -Binder exception: The child type of a fixed list must be a numeric type. Given: STRING. --STATEMENT LOAD WITH HEADERS (a INT16[1]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/error_conversion.csv" RETURN *; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/error_conversion.csv on line 1: Conversion exception: Cast failed. Could not convert "4324234543543534534524" to INT16. +-STATEMENT LOAD WITH HEADERS (a INT64[2]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/error_conversion2.csv" RETURN *; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/error_conversion.csv on line 1: Conversion exception: Cast failed. Could not convert "4324234543543534534524" to INT16. --STATEMENT LOAD WITH HEADERS (a INT64[2]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/error_conversion2.csv" RETURN *; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/error_conversion2.csv on line 1: Conversion exception: Cast failed. [4324, 432] fewrew is not in INT64[2] range. +-STATEMENT LOAD WITH HEADERS (array INT64[0]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/zero_ele.csv" RETURN *; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/error_conversion2.csv on line 1: Conversion exception: Cast failed. [4324, 432] fewrew is not in INT64[2] range. --STATEMENT LOAD WITH HEADERS (fixedList INT64[0]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/zero_ele.csv" RETURN *; ----- error -Binder exception: The number of elements in a fixed list must be greater than 0. Given: 0. --STATEMENT LOAD WITH HEADERS (fixedList UINT8[1]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/unsupported_type2.csv" RETURN *; ----- error -Unsupported data type: Function::castStringToFixedList --STATEMENT LOAD WITH HEADERS (fixedList INT64[1]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_null.csv" RETURN *; ----- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_null.csv on line 1: Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. --STATEMENT LOAD WITH HEADERS (fixedList INT64[2]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_null2.csv" RETURN *; ----- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_null2.csv on line 1: Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. +Binder exception: The number of elements in an array must be greater than 0. Given: 0. -STATEMENT LOAD WITH HEADERS (a UNION(v1 INT64, v2 STRING)) FROM "${KUZU_ROOT_DIRECTORY}/dataset/copy-fault-tests/invalid-utf8/invalid-utf8.csv" RETURN *; ---- error Copy exception: Invalid UTF8-encoded string. @@ -679,13 +667,13 @@ Conversion exception: Cast failed. Could not convert "-32769" to INT16. Conversion exception: Cast failed. [42, 42] fdaf is not in INT64[2] range. -STATEMENT RETURN cast("[42|42]", "DOUBLE[2]"); ---- error -Copy exception: Each fixed list should have fixed number of elements. Expected: 2, Actual: 1. +Copy exception: Each array should have fixed number of elements. Expected: 2, Actual: 1. -STATEMENT RETURN cast("[42,42", "FLOAT[2]"); ---- error -Copy exception: Each fixed list should have fixed number of elements. Expected: 2, Actual: 1. +Copy exception: Each array should have fixed number of elements. Expected: 2, Actual: 1. -STATEMENT RETURN cast("(42,42)", "INT32[2]"); ---- error -Copy exception: Each fixed list should have fixed number of elements. Expected: 2, Actual: 0. +Copy exception: Each array should have fixed number of elements. Expected: 2, Actual: 0. -LOG InvalidCastTypeError -STATEMENT RETURN cast("dfsa", "INTERNAL_ID"); @@ -749,67 +737,49 @@ Conversion exception: Unsupported casting function from STRUCT(a:STRING, b:STRIN ---- error Conversion exception: Unsupported casting function from STRUCT to MAP. --LOG InvalidFixedListToList +-LOG InvalidArrayToList -STATEMENT RETURN cast(cast("[1, -1]", "INT64[2]"), "UINT8[]"); ---- error Overflow exception: Value -1 is not within UINT8 range -STATEMENT RETURN cast(cast("[[1, 2], [3, 4]]", "INT64[2][]"), "INT8[]"); ---- error -Conversion exception: Unsupported casting function from FIXED_LIST to INT8. +Conversion exception: Unsupported casting function from ARRAY to INT8. --LOG InvalidListToFixedList +-LOG InvalidListToArray -STATEMENT RETURN cast([1000000000000000000], "INT16[1]"); ---- error Overflow exception: Value 1000000000000000000 is not within INT16 range -STATEMENT RETURN cast([43121], "INT8[1]") ---- error -Runtime exception: Unsupported FIXED_LIST type: Function::getFixedListChildCastFunc +Overflow exception: Value 43121 is not within INT8 range -STATEMENT RETURN cast([[1000000000000000000]], "INT64[1]"); ---- error -Conversion exception: Unsupported casting function from VAR_LIST to numerical type. --STATEMENT RETURN cast([NULL], "DOUBLE[1]"); ----- error -Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. --STATEMENT RETURN cast([NULL, 2], "DOUBLE[2]"); ----- error -Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. +Conversion exception: Unsupported casting function from VAR_LIST to INT64. -STATEMENT RETURN cast([1, 2], "DOUBLE[100]"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to FIXED_LIST. Expected: 100, Actual: 2. +Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 100, Actual: 2. -STATEMENT RETURN cast([[1, 2], [1, 4], [2, 4, 5], [1, 2]], "INT64[2][]"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to FIXED_LIST. Expected: 2, Actual: 3. --STATEMENT RETURN cast([[1, 2], [1, 4], [1, NULL], [1, 2]], "INT64[2][]"); ----- error -Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. --STATEMENT RETURN cast({a: 12, b: {a: [[NULL]]}, c: 2132}, "STRUCT(a INT64, b STRUCT(a INT64[1][]), c INT64)"); ----- error -Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. +Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 2, Actual: 3. -STATEMENT RETURN cast(cast("{3={}, 3= {a: 12}, 3={a:32, b:[1, 2, 3]}}", "MAP(STRING, STRUCT(a INT64, b INT64[]))"), "MAP(STRING, STRUCT(a INT64, b INT64[1]))"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to FIXED_LIST. Expected: 1, Actual: 3. +Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 1, Actual: 3. --LOG InvalidFixedListToList +-LOG InvalidArrayToArray -STATEMENT RETURN cast(cast([4, 1], "INT16[2]"), "FLOAT[3]"); ---- error Conversion exception: Unsupported casting function from INT16[2] to FLOAT[3]. -STATEMENT RETURN cast(cast([4, 1], "INT16[2]"), "FLOAT[1]"); ---- error Conversion exception: Unsupported casting function from INT16[2] to FLOAT[1]. --STATEMENT RETURN cast(cast([4, 1], "INT16[2]"), "UINT8[2]"); ----- error -Runtime exception: Unsupported FIXED_LIST type: Function::getFixedListChildCastFunc -LOG InvalidNestedCast -STATEMENT RETURN cast({a: {b: {c: [[1, 3, 4]], d: "str"}}, e: [1, 9, NULL]}, "STRUCT(a STRUCT(b STRUCT(c INT64[2][], d STRING)), e INT128[3])"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to FIXED_LIST. Expected: 2, Actual: 3. --STATEMENT RETURN cast({a: {b: {c: [[1, 3, 4]], d: "str"}}, e: [1, 9, NULL]}, "STRUCT(a STRUCT(b STRUCT(c INT64[3][], d STRING)), e INT128[3])"); ----- error -Conversion exception: Cast failed. NULL is not allowed for FIXED_LIST. +Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 2, Actual: 3. -STATEMENT RETURN cast(cast("{a: {b: {c: [[1, 3, 4]], d: {18=[3, 2]}}}, e: [1, 9, 3]}", "STRUCT(a STRUCT(b STRUCT(c INT64[3][], d MAP(INT32,INT32[]))), e FLOAT[3])"), "STRUCT(a STRUCT(b STRUCT(c INT64[3][], d MAP(INT32,INT32[5]))), e INT32[3])"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to FIXED_LIST. Expected: 5, Actual: 2. +Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 5, Actual: 2. -LOG InvalidNameCast -STATEMENT RETURN cast("nop", "STRUCT()"); diff --git a/test/test_files/tinysnb/cast/cast_to_nested_types.test b/test/test_files/tinysnb/cast/cast_to_nested_types.test index e9122469f74..3dc6ebfe8e8 100644 --- a/test/test_files/tinysnb/cast/cast_to_nested_types.test +++ b/test/test_files/tinysnb/cast/cast_to_nested_types.test @@ -3,8 +3,8 @@ -- --CASE CastStringToList --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), fixedList INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN *; +-CASE CastToNestedTypes +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN *; ---- 10 [[1,3,423,124,43242],[432]]|{num: -423432, str: this is a string []}|[255,254,43] [[1,3,423,124,43242],[432]]|{num: 3423423, str: this is a string}|[250,249,21] @@ -43,10 +43,10 @@ {{}={}} {=} {} --STATEMENT LOAD WITH HEADERS (fixedList INT32[92]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/long_fixed_list2.csv" (QUOTE="'") RETURN *; +-STATEMENT LOAD WITH HEADERS (array INT32[92]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/long_array2.csv" (QUOTE="'") RETURN *; ---- 1 [32131,0,0,43243,12313,432432,4324,1312,43241,432432,2342,13412,43242,23432,43242,43242,12313,32131,43243,12313,432432,4324,1312,43241,432432,2342,13412,43242,23432,43242,43242,12313,32131,43243,12313,432432,4324,1312,43241,432432,2342,13412,43242,23432,43242,43242,12313,32131,43243,12313,432432,4324,1312,43241,432432,2342,13412,43242,23432,43242,43242,12313,32131,43243,12313,432432,4324,1312,43241,432432,2342,13412,43242,23432,43242,43242,12313,32131,43243,12313,432432,4324,1312,43241,432432,2342,13412,43242,23432,43242,43242,12313] --STATEMENT LOAD WITH HEADERS (fixedList FLOAT[1], bool BOOLEAN, intv INTERVAL) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_correct.csv" RETURN *; +-STATEMENT LOAD WITH HEADERS (array FLOAT[1], bool BOOLEAN, intv INTERVAL) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_correct.csv" RETURN *; ---- 6 [23123.433594]|True|1 month 2 days [-4321312.500000]|True|1 year 3 days @@ -54,12 +54,12 @@ [43213123584.000000]|False|12 years 3 months 30 days [-4212.423340]|False| [-2.000000]|True|10 months --STATEMENT LOAD WITH HEADERS (fixedList INT64[3], date DATE, timestamp TIMESTAMP) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_int64.csv" RETURN *; +-STATEMENT LOAD WITH HEADERS (array INT64[3], date DATE, timestamp TIMESTAMP) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_int64.csv" RETURN *; ---- 3 [4234234,4234535,-3242342]|2022-06-06|2022-11-22 15:12:22 [4234234,4234535,0]|2013-02-21|1970-01-01 10:00:00.004666 [4234234,0,-3242342]|2019-12-30|1970-01-01 00:00:00.004666 --STATEMENT LOAD WITH HEADERS (fixedList DOUBLE[83]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/long_fixed_list.csv" RETURN *; +-STATEMENT LOAD WITH HEADERS (array DOUBLE[83]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/long_array.csv" RETURN *; ---- 1 [4123.120000,0.000000,0.000000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,4123.120000,42432.120000,435435.231000,432423.123340,43424.213400,4325245.130000,432423.123000,3242.123000,543523442342.434326] -STATEMENT LOAD WITH HEADERS (u UNION(v1 INT64, v2 BOOLEAN), u2 UNION(v1 UINT32, v2 INT32, v3 DATE), u3 UNION(v1 UINT8, v2 UINT16, v3 TIMESTAMP, v4 FLOAT), u4 UNION(v1 UINT64, v2 INT8, v3 INT16, v4 DOUBLE), u5 UNION(v1 STRING)) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/union/union_correct.csv" RETURN *; @@ -101,8 +101,8 @@ False|-4325||18446744073709551616.000000| dfsa [1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1.000000,2.000000,3.000000]|[1.000000,2.000000,3.000000] # timestamp/date/... list --LOG CastToFixedList --STATEMENT LOAD WITH HEADERS (fixedList STRING, bool BOOLEAN, intv INTERVAL) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_correct.csv" RETURN cast(fixedList, "FLOAT[1]"); +-LOG CastToArray +-STATEMENT LOAD WITH HEADERS (array STRING, bool BOOLEAN, intv INTERVAL) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_correct.csv" RETURN cast(array, "FLOAT[1]"); ---- 6 [23123.433594] [-4321312.500000] @@ -110,12 +110,12 @@ False|-4325||18446744073709551616.000000| dfsa [43213123584.000000] [-4212.423340] [-2.000000] --STATEMENT LOAD WITH HEADERS (stockPrice STRING) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_with_null.csv" RETURN cast(stockPrice, "DOUBLE[3]"); +-STATEMENT LOAD WITH HEADERS (stockPrice STRING) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_with_null.csv" RETURN cast(stockPrice, "DOUBLE[3]"); ---- 3 [3324.123000,342423.437500,432.123000] [1.000000,4231.000000,432.123000] --STATEMENT LOAD WITH HEADERS (stockPrice STRING) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_with_null.csv" where size(stockPrice) > 10 RETURN cast(stockPrice, "FLOAT[3]"); +-STATEMENT LOAD WITH HEADERS (stockPrice STRING) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_with_null.csv" where size(stockPrice) > 10 RETURN cast(stockPrice, "FLOAT[3]"); ---- 2 [3324.123047,342423.437500,432.122986] [1.000000,4231.000000,432.122986] @@ -125,6 +125,18 @@ False|-4325||18446744073709551616.000000| dfsa -STATEMENT Return cast(cast(-4324324, "int128"), "int64") ---- 1 -4324324 +-STATEMENT LOAD WITH HEADERS (array INT64[1]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_null.csv" RETURN *; +---- 1 +[] +-STATEMENT LOAD WITH HEADERS (array INT64[2]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_null2.csv" RETURN *; +---- 1 +[,432423] +-STATEMENT LOAD WITH HEADERS (a STRING[2]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_string.csv" RETURN *; +---- 1 +[fsdaf,sfadfwer] +-STATEMENT LOAD WITH HEADERS (array UINT8[1]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_uint8.csv" RETURN *; +---- 1 +[4] -LOG CastToMap -STATEMENT RETURN cast(" { c= {a = 3423 }, b = { g = 3421 } } ", "MAP(STRING, MAP(STRING, INT16))"), cast("{}", "MAP(STRING, MAP(STRING, INT16))"), cast("{d = {}}", "MAP(STRING, MAP(STRING, INT16))"); @@ -237,7 +249,7 @@ False|-4325|14|18446744073709551616.000000| dfsa -STATEMENT RETURN cast(cast(cast("{a: 12, b: 0}", "STRUCT(a STRING, b STRING, c STRING)"), "STRUCT(a INT128, b INT128, c INT128)"), "STRUCT(a INT64, b INT64, c INT64)"), cast(cast(cast("{a: 15}", "STRUCT(a STRING, b STRING)"), "STRUCT(a INT32, b INT32)"), "STRUCT(a INT16, b INT16)"), cast(cast(cast("{b: 15}", "STRUCT(a STRING, b STRING)"), "STRUCT(a INT8, b INT8)"), "STRUCT(a UINT16, b UINT16)"), cast(cast(cast("{}", "STRUCT(a STRING, b STRING)"), "STRUCT(a UINT32, b UINT32)"), "STRUCT(a UINT64, b UINT64)"), cast(cast("{a: 12, b: 0}", "STRUCT(a STRING, b STRING)"), "STRUCT(a DOUBLE, b DOUBLE)"), cast(cast("{a: 12, b: 0}", "STRUCT(a STRING, b STRING)"), "STRUCT(a FLOAT, b FLOAT)"); ---- 1 {a: 12, b: 0, c: }|{a: 15, b: }|{a: , b: 15}|{a: , b: }|{a: 12.000000, b: 0.000000}|{a: 12.000000, b: 0.000000} --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), fixedList INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(a, "struct(num INT64, str STRING)"), cast(a, "struct(num INT128, str STRING)"), cast(a, "struct(num STRING, str STRING)"), cast(a, "struct(num DOUBLE, str STRING)"), cast(a, "struct(num FLOAT, str STRING)"); +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(a, "struct(num INT64, str STRING)"), cast(a, "struct(num INT128, str STRING)"), cast(a, "struct(num STRING, str STRING)"), cast(a, "struct(num DOUBLE, str STRING)"), cast(a, "struct(num FLOAT, str STRING)"); ---- 10 {num: -423432, str: this is a string []}|{num: -423432, str: this is a string []}|{num: -423432, str: this is a string []}|{num: -423432.000000, str: this is a string []}|{num: -423432.000000, str: this is a string []} {num: 0, str: this is a string}|{num: 0, str: this is a string}|{num: 0, str: this is a string}|{num: 0.000000, str: this is a string}|{num: 0.000000, str: this is a string} @@ -267,11 +279,11 @@ False|-4325|14|18446744073709551616.000000| dfsa ---- 1 {[,,]={a: -1, b: 1.000000, c: }} --LOG CastFixedListToList +-LOG CastArrayToList -STATEMENT RETURN cast(cast("[1,2,3]", "INT64[3]"), "INT128[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT64[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT32[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT16[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT8[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT64[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT32[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT16[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT8[]"), cast(cast("[1,2,3]", "INT64[3]"), "DOUBLE[]"), cast(cast("[1,2,3]", "INT64[3]"), "STRING[]"), cast(cast("[1,2,3]", "INT64[3]"), "FLOAT[]"); ---- 1 [1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1.000000,2.000000,3.000000]|[1,2,3]|[1.000000,2.000000,3.000000] --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), fixedList INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(cast(cast(fixedList, "DOUBLE[]"), "STRING[]"), "FLOAT[]"); +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(cast(cast(array, "DOUBLE[]"), "STRING[]"), "FLOAT[]"); ---- 10 @@ -284,16 +296,16 @@ False|-4325|14|18446744073709551616.000000| dfsa [255.000000,254.000000,43.000000] [29.000000,21.000000,1.000000] --LOG CastNestedFixedListToList +-LOG CastNestedArrayToList -STATEMENT RETURN cast(cast("[NULL, [0, -1, 1], NULL, [1, 2, -2], NULL]", "FLOAT[3][]"), "INT64[][]"), cast(cast("[NULL, NULL]", "FLOAT[3][]"), "INT32[][]"), cast(cast("[[1, 1, 1], NULL]", "FLOAT[3][]"), "INT16[][]"), cast(cast("[NULL, [1, 1, 1]]", "FLOAT[3][]"), "INT8[][]"); ---- 1 [,[0,-1,1],,[1,2,-2],]|[,]|[[1,1,1],]|[,[1,1,1]] --LOG CastListToFixedList +-LOG CastListToArray -STATEMENT RETURN cast([1], "INT64[1]"), cast([1], "INT32[1]"), cast([1], "INT16[1]"), cast([1], "DOUBLE[1]"), cast([1], "FLOAT[1]"), cast(NULL, "INT64[15]"); ---- 1 [1]|[1]|[1]|[1.000000]|[1.000000]| --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), fixedList STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(cast(cast(fixedList, "INT16[3]"), "STRING[]"), "FLOAT[3]"); +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(cast(cast(array, "INT16[3]"), "STRING[]"), "FLOAT[3]"); ---- 10 @@ -305,7 +317,7 @@ False|-4325|14|18446744073709551616.000000| dfsa [250.000000,249.000000,21.000000] [255.000000,254.000000,43.000000] [29.000000,21.000000,1.000000] --STATEMENT LOAD WITH HEADERS (stockPrice STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/fixed_list/fixed_list_with_null.csv" RETURN cast(stockPrice, "DOUBLE[3]"); +-STATEMENT LOAD WITH HEADERS (stockPrice STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/array/array_with_null.csv" RETURN cast(stockPrice, "DOUBLE[3]"); ---- 3 [3324.123000,342423.437500,432.123000] @@ -314,31 +326,61 @@ False|-4325|14|18446744073709551616.000000| dfsa ---- 1 [1,2,3]|[4,5,6]|[7,8,9]|[10,11,12]|[13,14,15]|[16,17,18]|[0,-1,-2]|[-3,-4,-5]|[-6,-7,-8] --LOG CastNestedListToFixedList +-LOG CastNestedListToArray -STATEMENT RETURN cast([[1,2], [3, 4], [5, 6]], "INT32[2][]"); ---- 1 [[1,2],[3,4],[5,6]] -STATEMENT RETURN cast([NULL, [1]], "INT64[1][]"), cast([NULL], "INT64[1][]"), cast([[1], NULL], "INT64[1][]"), cast([NULL], "INT64[1][][]"), cast([[NULL]], "INT64[1][][]"), cast([[[2], NULL], [NULL, [1]]], "INT64[1][][]"), cast([NULL, [NULL, [1]]], "INT64[1][][]"); ---- 1 [,[1]]|[]|[[1],]|[]|[[]]|[[[2],],[,[1]]]|[,[,[1]]] --STATEMENT LOAD WITH HEADERS (struct STRUCT(a INT64, b MAP(INT64[][][], STRING))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/struct/struct_with_fixed_list.csv" where struct_extract(struct, 'a') > 0 RETURN cast(struct, "STRUCT(a INT64,b MAP(INT64[1][][], STRING))"); +-STATEMENT LOAD WITH HEADERS (struct STRUCT(a INT64, b MAP(INT64[][][], STRING))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/struct/struct_with_array.csv" where struct_extract(struct, 'a') > 0 RETURN cast(struct, "STRUCT(a INT64,b MAP(INT64[1][][], STRING))"); ---- 4 {a: 1999, b: {[[[1],[2],[3]]]=true}} {a: 1999, b: {[[]]=true}} {a: 1999, b: {[]=true}} {a: 2341, b: {[,[,[1],[2],[3],,[4]],[[8],,[7]],,[,[5]],[[6],],]=true}} --LOG CastFixedListToFixedList +-LOG CastArrayToArray -STATEMENT Return cast(Cast([1,2,3], "INT32[3]"), "INT64[3]"), cast(Cast([1,2,3], "INT32[3]"), "INT32[3]"), cast(Cast([1,2,3], "INT32[3]"), "INT16[3]"), cast(Cast([1,2,3], "INT32[3]"), "DOUBLE[3]"), cast(Cast([1,2,3], "INT32[3]"), "FLOAT[3]"); ---- 1 [1,2,3]|[1,2,3]|[1,2,3]|[1.000000,2.000000,3.000000]|[1.000000,2.000000,3.000000] -STATEMENT Return cast(cast(cast(cast(Cast([0,-1,1], "INT32[3]"), "INT64[3]"), "INT16[3]"), "DOUBLE[3]"), "FLOAT[3]"); ---- 1 [0.000000,-1.000000,1.000000] --STATEMENT LOAD WITH HEADERS (struct STRUCT(a INT64, b MAP(INT64[][][], STRING))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/struct/struct_with_fixed_list.csv" where struct_extract(struct, 'a') > 0 RETURN cast(cast(struct, "STRUCT(a INT64,b MAP(DOUBLE[1][][], STRING))"), "STRUCT(a INT64,b MAP(INT16[1][][], STRING))"); +-STATEMENT LOAD WITH HEADERS (struct STRUCT(a INT64, b MAP(INT64[][][], STRING))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/struct/struct_with_array.csv" where struct_extract(struct, 'a') > 0 RETURN cast(cast(struct, "STRUCT(a INT64,b MAP(DOUBLE[1][][], STRING))"), "STRUCT(a INT64,b MAP(INT16[1][][], STRING))"); ---- 4 {a: 1999, b: {[[[1],[2],[3]]]=true}} {a: 1999, b: {[[]]=true}} {a: 1999, b: {[]=true}} {a: 2341, b: {[,[,[1],[2],[3],,[4]],[[8],,[7]],,[,[5]],[[6],],]=true}} +-LOG CastToArrayWithNull +-STATEMENT RETURN cast([NULL, 2], "DOUBLE[2]"); +---- 1 +[,2.000000] +-STATEMENT RETURN cast([[1, 2], [1, 4], [1, NULL], [1, 2]], "INT64[2][]"); +---- 1 +[[1,2],[1,4],[1,],[1,2]] +-STATEMENT RETURN cast({a: 12, b: {a: [[NULL]]}, c: 2132}, "STRUCT(a INT64, b STRUCT(a INT64[1][]), c INT64)"); +---- 1 +{a: 12, b: {a: [[]]}, c: 2132} +-STATEMENT RETURN cast({a: {b: {c: [[1, 3, 4]], d: "str"}}, e: [1, 9, NULL]}, "STRUCT(a STRUCT(b STRUCT(c INT64[3][], d STRING)), e INT128[3])"); +---- 1 +{a: {b: {c: [[1,3,4]], d: str}}, e: [1,9,]} + +-LOG CastToArrayOfNestedTypes +-STATEMENT RETURN cast([map(['a', 'b'], [1, 2]), map(['c'], [3])], "MAP(STRING, INT64)[2]"); +---- 1 +[{a=1, b=2},{c=3}] +-STATEMENT RETURN cast([{a: 1, b: 2}, {a: 0, b: 11}, {a: 20, b: 21}], "STRUCT(a INT64, b INT64)[3]"); +---- 1 +[{a: 1, b: 2},{a: 0, b: 11},{a: 20, b: 21}] +-STATEMENT RETURN cast("[12, abcd, 1.75]", "UNION(a INT64, b STRING, c FLOAT)[3]"); +---- 1 +[12,abcd,1.75] +-STATEMENT RETURN cast("[[1], [2, 3], [4, 5, 6], []]", "INT64[][4]"); +---- 1 +[[1],[2,3],[4,5,6],[]] +-STATEMENT RETURN cast([[[1, 2, 3], [3, 4, 5]], [[5, 6, 7], [7, 8, 9]]], "INT64[3][2][2]"); +---- 1 +[[[1,2,3],[3,4,5]],[[5,6,7],[7,8,9]]] diff --git a/test/test_files/tinysnb/function/cast.test b/test/test_files/tinysnb/function/cast.test index 80064432e55..54e1bf514f3 100644 --- a/test/test_files/tinysnb/function/cast.test +++ b/test/test_files/tinysnb/function/cast.test @@ -484,7 +484,7 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff [4,5] [10,11,12,3,4,5,6,7] --LOG CastListOfIntsToFixedList +-LOG CastListOfIntsToArray -STATEMENT MATCH (p:person) WHERE size(p.workedHours) = 2 RETURN cast(p.workedHours, "INT64[2]"), cast(p.workedHours, "INT32[2]"), cast(p.workedHours, "INT16[2]"), cast(p.workedHours, "DOUBLE[2]"), cast(p.workedHours, "FLOAT[2]"); ---- 4 [1,9]|[1,9]|[1,9]|[1.000000,9.000000]|[1.000000,9.000000] @@ -547,7 +547,7 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff [[6],[7],[8]] [[7],[10],[6,7]] --LOG CastListOfListOfIntsToListOfFixedList +-LOG CastListOfListOfIntsToListOfArray -STATEMENT MATCH (p:person) WHERE p.ID > 6 and p.ID < 10 RETURN cast(cast(p.courseScoresPerTerm, "INT128[][]"), "INT16[1][]"); ---- 3 [[6],[7],[8]] @@ -555,7 +555,7 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff [[10]] --LOG CastFixedListToString +-LOG CastArrayToString -STATEMENT MATCH (p:person) where p.ID > 1 RETURN string(p.grades) ---- 8 @@ -578,7 +578,7 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff [43,83,67,43] [77,64,100,54] --LOG CastFixedListToList +-LOG CastArrayToList -STATEMENT MATCH(p:person) where p.ID > 4 RETURN cast(p.grades, "UINT64[]"), cast(p.grades, "UINT32[]"), cast(p.grades, "UINT16[]"), cast(p.grades, "UINT8[]"), cast(p.grades, "INT8[]"), cast(p.grades, "INT16[]"), cast(p.grades, "INT32[]"), cast(p.grades, "INT64[]"), cast(p.grades, "INT128[]"), cast(p.grades, "STRING[]"), cast(p.grades, "DOUBLE[]"), cast(p.grades, "FLOAT[]"); ---- 6 [43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43.000000,83.000000,67.000000,43.000000]|[43.000000,83.000000,67.000000,43.000000] @@ -588,7 +588,7 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff [96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96,59,65,88]|[96.000000,59.000000,65.000000,88.000000]|[96.000000,59.000000,65.000000,88.000000] ||||||||||| --LOG CastFixedListToFixedList +-LOG CastArrayToArray -STATEMENT MATCH(p:person) where p.ID > 8 RETURN cast(p.grades, "UINT64[]"), cast(p.grades, "UINT32[]"), cast(p.grades, "UINT16[]"), cast(p.grades, "UINT8[]"), cast(p.grades, "INT8[]"), cast(p.grades, "INT16[]"), cast(p.grades, "INT32[]"), cast(p.grades, "INT64[]"), cast(p.grades, "INT128[]"), cast(p.grades, "STRING[]"), cast(p.grades, "DOUBLE[]"), cast(p.grades, "FLOAT[]"); ---- 3 [43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43,83,67,43]|[43.000000,83.000000,67.000000,43.000000]|[43.000000,83.000000,67.000000,43.000000] diff --git a/test/test_files/tinysnb/projection/single_label.test b/test/test_files/tinysnb/projection/single_label.test index bdae8cc6060..1b7af024e9b 100644 --- a/test/test_files/tinysnb/projection/single_label.test +++ b/test/test_files/tinysnb/projection/single_label.test @@ -395,7 +395,7 @@ Dan|Carol #(0:2)-{_LABEL: marries, _ID: 7:1, address: [2,5], note: long long long string}->(0:3) #(0:4)-{_LABEL: marries, _ID: 7:2, usedAddress: [], address: [3,9], note: short str}->(0:5) --LOG ReturnFixedListNodeProp +-LOG ReturnArrayNodeProp -STATEMENT MATCH (a:person) RETURN a.grades ---- 8 [96,54,86,92] @@ -407,7 +407,7 @@ Dan|Carol [43,83,67,43] [77,64,100,54] --LOG ReturnFixedListRelProp +-LOG ReturnArrayRelProp -STATEMENT MATCH (a:person)-[e:workAt]->(o:organisation) RETURN e.grading ---- 3 [2.100000,4.400000] @@ -433,7 +433,7 @@ Dan|Carol 7.600000 9.200000 --LOG ReturnFixedListFloatRelProp +-LOG ReturnArrayFloatRelProp -STATEMENT MATCH (a:person)-[e:meets]->(b:person) RETURN e.location ---- 7 [7.820000,3.540000] @@ -458,7 +458,7 @@ Dan|Carol 55 22 --LOG ReturnFixedListInt16RelProp +-LOG ReturnArrayInt16RelProp -STATEMENT MATCH (a:person)-[e:marries]->(b:person) RETURN e.address ---- 3 [4,5] diff --git a/test/test_files/tinysnb/projection/skip_limit.test b/test/test_files/tinysnb/projection/skip_limit.test index 7102700791f..70adf7ba082 100644 --- a/test/test_files/tinysnb/projection/skip_limit.test +++ b/test/test_files/tinysnb/projection/skip_limit.test @@ -106,14 +106,14 @@ Dan ---- 1 Bob --LOG LimitFixedListNodeProp +-LOG LimitArrayNodeProp -STATEMENT MATCH (a:person) RETURN a.grades LIMIT 3 ---- 3 [96,54,86,92] [98,42,93,88] [91,75,21,95] --LOG LimitFixedListRelProp +-LOG LimitArrayRelProp -STATEMENT MATCH (a:person)-[e:workAt]->(o:organisation) RETURN e.grading LIMIT 2 ---- 2 [2.100000,4.400000] diff --git a/tools/java_api/src/jni/kuzu_java.cpp b/tools/java_api/src/jni/kuzu_java.cpp index 40c234ec450..29911ef785b 100644 --- a/tools/java_api/src/jni/kuzu_java.cpp +++ b/tools/java_api/src/jni/kuzu_java.cpp @@ -530,7 +530,7 @@ struct JavaAPIHelper { } // namespace kuzu::common JNIEXPORT jlong JNICALL Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1create( - JNIEnv* env, jclass, jobject id, jobject child_type, jlong fixed_num_elements_in_list) { + JNIEnv* env, jclass, jobject id, jobject child_type, jlong num_elements_in_array) { jclass javaIDClass = env->GetObjectClass(id); jfieldID fieldID = env->GetFieldID(javaIDClass, "value", "I"); jint fieldValue = env->GetIntField(id, fieldID); @@ -542,9 +542,9 @@ JNIEXPORT jlong JNICALL Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1create( data_type = new LogicalType(logicalTypeID); } else { auto child_type_pty = std::make_unique(*getDataType(env, child_type)); - auto extraTypeInfo = fixed_num_elements_in_list > 0 ? - std::make_unique( - std::move(child_type_pty), fixed_num_elements_in_list) : + auto extraTypeInfo = num_elements_in_array > 0 ? + std::make_unique( + std::move(child_type_pty), num_elements_in_array) : std::make_unique(std::move(child_type_pty)); data_type = JavaAPIHelper::createLogicalType(logicalTypeID, std::move(extraTypeInfo)); } @@ -591,8 +591,8 @@ JNIEXPORT jobject JNICALL Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1get_1chil JNIEnv* env, jclass, jobject thisDT) { auto* parent_type = getDataType(env, thisDT); LogicalType* child_type; - if (parent_type->getLogicalTypeID() == LogicalTypeID::FIXED_LIST) { - child_type = FixedListType::getChildType(parent_type); + if (parent_type->getLogicalTypeID() == LogicalTypeID::ARRAY) { + child_type = ArrayType::getChildType(parent_type); } else if (parent_type->getLogicalTypeID() == LogicalTypeID::VAR_LIST) { child_type = VarListType::getChildType(parent_type); } else { @@ -604,13 +604,13 @@ JNIEXPORT jobject JNICALL Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1get_1chil } JNIEXPORT jlong JNICALL -Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1get_1fixed_1num_1elements_1in_1list( +Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1get_1num_1elements_1in_1array( JNIEnv* env, jclass, jobject thisDT) { auto* dt = getDataType(env, thisDT); - if (dt->getLogicalTypeID() != LogicalTypeID::FIXED_LIST) { + if (dt->getLogicalTypeID() != LogicalTypeID::ARRAY) { return 0; } - return static_cast(FixedListType::getNumValuesInList(dt)); + return static_cast(ArrayType::getNumElements(dt)); } /** diff --git a/tools/java_api/src/main/java/com/kuzudb/KuzuDataType.java b/tools/java_api/src/main/java/com/kuzudb/KuzuDataType.java index b45e110b232..e3c4aba08fd 100644 --- a/tools/java_api/src/main/java/com/kuzudb/KuzuDataType.java +++ b/tools/java_api/src/main/java/com/kuzudb/KuzuDataType.java @@ -16,8 +16,8 @@ public KuzuDataType(KuzuDataTypeID id) { } public KuzuDataType - (KuzuDataTypeID id, KuzuDataType child_type, long fixed_num_elements_in_list) { - dt_ref = KuzuNative.kuzu_data_type_create(id, child_type, fixed_num_elements_in_list); + (KuzuDataTypeID id, KuzuDataType child_type, long num_elements_in_array) { + dt_ref = KuzuNative.kuzu_data_type_create(id, child_type, num_elements_in_array); } /** @@ -97,7 +97,7 @@ public KuzuDataType getChildType() throws KuzuObjectRefDestroyedException { */ public long getFixedNumElementsInList() throws KuzuObjectRefDestroyedException { checkNotDestroyed(); - return KuzuNative.kuzu_data_type_get_fixed_num_elements_in_list(this); + return KuzuNative.kuzu_data_type_get_num_elements_in_array(this); } } diff --git a/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java b/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java index dcf21faf692..09fff10ef2c 100644 --- a/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java +++ b/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java @@ -28,15 +28,15 @@ public enum KuzuDataTypeID { TIMESTAMP_NS(38), TIMESTAMP_TZ(39), INTERVAL(40), - FIXED_LIST(41), INTERNAL_ID(42), STRING(50), BLOB(51), VAR_LIST(52), - STRUCT(53), - MAP(54), - UNION(55), - UUID(56),; + ARRAY(53), + STRUCT(54), + MAP(55), + UNION(56), + UUID(59),; public final int value; diff --git a/tools/java_api/src/main/java/com/kuzudb/KuzuNative.java b/tools/java_api/src/main/java/com/kuzudb/KuzuNative.java index b6d68610dab..44a0d4d62b7 100644 --- a/tools/java_api/src/main/java/com/kuzudb/KuzuNative.java +++ b/tools/java_api/src/main/java/com/kuzudb/KuzuNative.java @@ -145,7 +145,7 @@ protected static native KuzuDataType kuzu_query_result_get_column_data_type( // DataType protected static native long kuzu_data_type_create( - KuzuDataTypeID id, KuzuDataType child_type, long fixed_num_elements_in_list); + KuzuDataTypeID id, KuzuDataType child_type, long num_elements_in_array); protected static native KuzuDataType kuzu_data_type_clone(KuzuDataType data_type); @@ -157,7 +157,7 @@ protected static native long kuzu_data_type_create( protected static native KuzuDataType kuzu_data_type_get_child_type(KuzuDataType data_type); - protected static native long kuzu_data_type_get_fixed_num_elements_in_list(KuzuDataType data_type); + protected static native long kuzu_data_type_get_num_elements_in_array(KuzuDataType data_type); // Value protected static native KuzuValue kuzu_value_create_null(); diff --git a/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java b/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java index 7977aa7fe1d..158db7e05a8 100644 --- a/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java +++ b/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java @@ -23,11 +23,11 @@ void DataTypeClone() throws KuzuObjectRefDestroyedException { assertEquals(dataTypeClone2.getID(), KuzuDataTypeID.VAR_LIST); assertEquals(dataTypeClone2.getChildType().getID(), KuzuDataTypeID.INT64); - KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.FIXED_LIST, dataType, 100); + KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); assertNotNull(dataType3); KuzuDataType dataTypeClone3 = dataType3.clone(); assertNotNull(dataTypeClone3); - assertEquals(dataTypeClone3.getID(), KuzuDataTypeID.FIXED_LIST); + assertEquals(dataTypeClone3.getID(), KuzuDataTypeID.ARRAY); assertEquals(dataTypeClone3.getChildType().getID(), KuzuDataTypeID.INT64); assertEquals(dataTypeClone3.getFixedNumElementsInList(), 100); @@ -55,7 +55,7 @@ void DataTypeEquals() throws KuzuObjectRefDestroyedException { assertNotNull(dataTypeClone2); assertTrue(dataType2.equals(dataTypeClone2)); - KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.FIXED_LIST, dataType, 100); + KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); assertNotNull(dataType3); KuzuDataType dataTypeClone3 = dataType3.clone(); assertNotNull(dataTypeClone3); @@ -84,9 +84,9 @@ void DataTypeGetID() throws KuzuObjectRefDestroyedException { assertNotNull(dataType2); assertEquals(dataType2.getID(), KuzuDataTypeID.VAR_LIST); - KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.FIXED_LIST, dataType, 100); + KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); assertNotNull(dataType3); - assertEquals(dataType3.getID(), KuzuDataTypeID.FIXED_LIST); + assertEquals(dataType3.getID(), KuzuDataTypeID.ARRAY); dataType.destroy(); dataType2.destroy(); @@ -102,7 +102,7 @@ void DataTypeGetChildType() throws KuzuObjectRefDestroyedException { assertNotNull(dataType2); assertEquals(dataType2.getChildType().getID(), KuzuDataTypeID.INT64); - KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.FIXED_LIST, dataType, 100); + KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); assertNotNull(dataType3); assertEquals(dataType3.getChildType().getID(), KuzuDataTypeID.INT64); @@ -121,7 +121,7 @@ void DataTypeGetFixedNumElementsInList() throws KuzuObjectRefDestroyedException assertNotNull(dataType2); assertEquals(dataType.getFixedNumElementsInList(), 0); - KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.FIXED_LIST, dataType, 100); + KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); assertNotNull(dataType3); assertEquals(dataType3.getFixedNumElementsInList(), 100); diff --git a/tools/nodejs_api/src_cpp/node_util.cpp b/tools/nodejs_api/src_cpp/node_util.cpp index 51c5ca41343..bb925a884a3 100644 --- a/tools/nodejs_api/src_cpp/node_util.cpp +++ b/tools/nodejs_api/src_cpp/node_util.cpp @@ -185,7 +185,7 @@ Napi::Value Util::ConvertToNapiObject(const Value& value, Napi::Env env) { return Napi::Number::New(env, milliseconds); } case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: { + case LogicalTypeID::ARRAY: { auto size = NestedVal::getChildrenSize(&value); auto napiArray = Napi::Array::New(env, size); for (auto i = 0u; i < size; ++i) { diff --git a/tools/nodejs_api/test/test_data_type.js b/tools/nodejs_api/test/test_data_type.js index eaaefa8d63c..75b4eb598c0 100644 --- a/tools/nodejs_api/test/test_data_type.js +++ b/tools/nodejs_api/test/test_data_type.js @@ -359,8 +359,8 @@ describe("VAR_LIST", function () { }); }); -describe("FIXED_LIST", function () { - it("should convert FIXED_LIST type", async function () { +describe("ARRAY", function () { + it("should convert ARRAY type", async function () { const queryResult = await conn.query( "MATCH (a:person) -[m:meets]-> (b:person) WHERE a.ID = 0 AND b.ID = 2 RETURN m.location" ); diff --git a/tools/python_api/src_cpp/py_query_result.cpp b/tools/python_api/src_cpp/py_query_result.cpp index cfa88c6f544..f20d3ea9b1b 100644 --- a/tools/python_api/src_cpp/py_query_result.cpp +++ b/tools/python_api/src_cpp/py_query_result.cpp @@ -243,7 +243,7 @@ py::object PyQueryResult::convertValueToPyObject(const Value& value) { py::arg("microseconds") = intervalVal.micros)); } case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: { + case LogicalTypeID::ARRAY: { py::list list; for (auto i = 0u; i < NestedVal::getChildrenSize(&value); ++i) { list.append(convertValueToPyObject(*NestedVal::getChildVal(&value, i))); diff --git a/tools/python_api/src_cpp/py_query_result_converter.cpp b/tools/python_api/src_cpp/py_query_result_converter.cpp index 07b85f681dc..9fb9f2ef0a8 100644 --- a/tools/python_api/src_cpp/py_query_result_converter.cpp +++ b/tools/python_api/src_cpp/py_query_result_converter.cpp @@ -93,7 +93,7 @@ void NPArrayWrapper::appendElement(Value* value) { case LogicalTypeID::REL: { ((py::object*)dataBuffer)[numElements] = PyQueryResult::convertValueToPyObject(*value); } break; - case LogicalTypeID::FIXED_LIST: + case LogicalTypeID::ARRAY: case LogicalTypeID::VAR_LIST: { ((py::list*)dataBuffer)[numElements] = PyQueryResult::convertValueToPyObject(*value); } break; @@ -174,7 +174,7 @@ py::dtype NPArrayWrapper::convertToArrayType(const LogicalType& type) { case LogicalTypeID::NODE: case LogicalTypeID::REL: case LogicalTypeID::VAR_LIST: - case LogicalTypeID::FIXED_LIST: + case LogicalTypeID::ARRAY: case LogicalTypeID::STRING: case LogicalTypeID::MAP: case LogicalTypeID::RECURSIVE_REL: diff --git a/tools/python_api/src_py/types.py b/tools/python_api/src_py/types.py index 1410a272e1d..4ec3f7b7830 100644 --- a/tools/python_api/src_py/types.py +++ b/tools/python_api/src_py/types.py @@ -28,12 +28,12 @@ class Type(Enum): TIMESTAMP_MS = "TIMESTAMP_MS" TIMESTAMP_SEC = "TIMESTAMP_SEC" INTERVAL = "INTERVAL" - FIXED_LIST = "FIXED_LIST" INTERNAL_ID = "INTERNAL_ID" STRING = "STRING" BLOB = "BLOB" UUID = "UUID" VAR_LIST = "VAR_LIST" + ARRAY = "ARRAY" STRUCT = "STRUCT" MAP = "MAP" UNION = "UNION" diff --git a/tools/rust_api/include/kuzu_rs.h b/tools/rust_api/include/kuzu_rs.h index e5661ef45aa..9d2b04a7950 100644 --- a/tools/rust_api/include/kuzu_rs.h +++ b/tools/rust_api/include/kuzu_rs.h @@ -41,7 +41,7 @@ std::unique_ptr new_params(); std::unique_ptr create_logical_type(kuzu::common::LogicalTypeID id); std::unique_ptr create_logical_type_var_list( std::unique_ptr childType); -std::unique_ptr create_logical_type_fixed_list( +std::unique_ptr create_logical_type_array( std::unique_ptr childType, uint64_t numElements); inline std::unique_ptr create_logical_type_struct( @@ -70,9 +70,9 @@ inline std::unique_ptr create_logical_type_rdf_varian const kuzu::common::LogicalType& logical_type_get_var_list_child_type( const kuzu::common::LogicalType& logicalType); -const kuzu::common::LogicalType& logical_type_get_fixed_list_child_type( +const kuzu::common::LogicalType& logical_type_get_array_child_type( const kuzu::common::LogicalType& logicalType); -uint64_t logical_type_get_fixed_list_num_elements(const kuzu::common::LogicalType& logicalType); +uint64_t logical_type_get_array_num_elements(const kuzu::common::LogicalType& logicalType); rust::Vec logical_type_get_struct_field_names(const kuzu::common::LogicalType& value); std::unique_ptr> logical_type_get_struct_field_types( diff --git a/tools/rust_api/src/ffi.rs b/tools/rust_api/src/ffi.rs index a547c398911..00dc763f4f7 100644 --- a/tools/rust_api/src/ffi.rs +++ b/tools/rust_api/src/ffi.rs @@ -72,7 +72,6 @@ pub(crate) mod ffi { TIMESTAMP_NS = 38, TIMESTAMP_TZ = 39, INTERVAL = 40, - FIXED_LIST = 41, INTERNAL_ID = 42, @@ -80,12 +79,13 @@ pub(crate) mod ffi { STRING = 50, BLOB = 51, VAR_LIST = 52, - STRUCT = 53, - MAP = 54, - UNION = 55, - RDF_VARIANT = 56, + ARRAY = 53, + STRUCT = 54, + MAP = 55, + UNION = 56, + RDF_VARIANT = 57, - UUID = 58, + UUID = 59, } #[namespace = "kuzu::common"] @@ -208,7 +208,7 @@ pub(crate) mod ffi { fn create_logical_type_var_list( child_type: UniquePtr, ) -> UniquePtr; - fn create_logical_type_fixed_list( + fn create_logical_type_array( child_type: UniquePtr, num_elements: u64, ) -> UniquePtr; @@ -226,8 +226,8 @@ pub(crate) mod ffi { ) -> UniquePtr; fn logical_type_get_var_list_child_type(value: &LogicalType) -> &LogicalType; - fn logical_type_get_fixed_list_child_type(value: &LogicalType) -> &LogicalType; - fn logical_type_get_fixed_list_num_elements(value: &LogicalType) -> u64; + fn logical_type_get_array_child_type(value: &LogicalType) -> &LogicalType; + fn logical_type_get_array_num_elements(value: &LogicalType) -> u64; fn logical_type_get_struct_field_names(value: &LogicalType) -> Vec; fn logical_type_get_struct_field_types( value: &LogicalType, diff --git a/tools/rust_api/src/kuzu_rs.cpp b/tools/rust_api/src/kuzu_rs.cpp index d06ef995868..59f2e3d7aa5 100644 --- a/tools/rust_api/src/kuzu_rs.cpp +++ b/tools/rust_api/src/kuzu_rs.cpp @@ -1,6 +1,6 @@ #include "kuzu_rs.h" -using kuzu::common::FixedListTypeInfo; +using kuzu::common::ArrayTypeInfo; using kuzu::common::Interval; using kuzu::common::LogicalType; using kuzu::common::LogicalTypeID; @@ -26,9 +26,9 @@ std::unique_ptr create_logical_type_var_list(std::unique_ptr create_logical_type_fixed_list( +std::unique_ptr create_logical_type_array( std::unique_ptr childType, uint64_t numElements) { - return LogicalType::FIXED_LIST(std::move(childType), numElements); + return LogicalType::ARRAY(std::move(childType), numElements); } std::unique_ptr create_logical_type_map( @@ -39,11 +39,11 @@ std::unique_ptr create_logical_type_map( const LogicalType& logical_type_get_var_list_child_type(const LogicalType& logicalType) { return *kuzu::common::VarListType::getChildType(&logicalType); } -const LogicalType& logical_type_get_fixed_list_child_type(const LogicalType& logicalType) { - return *kuzu::common::FixedListType::getChildType(&logicalType); +const LogicalType& logical_type_get_array_child_type(const LogicalType& logicalType) { + return *kuzu::common::ArrayType::getChildType(&logicalType); } -uint64_t logical_type_get_fixed_list_num_elements(const LogicalType& logicalType) { - return kuzu::common::FixedListType::getNumValuesInList(&logicalType); +uint64_t logical_type_get_array_num_elements(const LogicalType& logicalType) { + return kuzu::common::ArrayType::getNumElements(&logicalType); } rust::Vec logical_type_get_struct_field_names( diff --git a/tools/rust_api/src/logical_type.rs b/tools/rust_api/src/logical_type.rs index c16b8d53bab..69195603d82 100644 --- a/tools/rust_api/src/logical_type.rs +++ b/tools/rust_api/src/logical_type.rs @@ -58,8 +58,8 @@ pub enum LogicalType { VarList { child_type: Box, }, - /// Correponds to [Value::FixedList](crate::value::Value::FixedList) - FixedList { + /// Correponds to [Value::Array](crate::value::Value::Array) + Array { child_type: Box, num_elements: u64, }, @@ -123,11 +123,9 @@ impl From<&ffi::LogicalType> for LogicalType { ffi::logical_type_get_var_list_child_type(logical_type).into(), ), }, - LogicalTypeID::FIXED_LIST => LogicalType::FixedList { - child_type: Box::new( - ffi::logical_type_get_fixed_list_child_type(logical_type).into(), - ), - num_elements: ffi::logical_type_get_fixed_list_num_elements(logical_type), + LogicalTypeID::ARRAY => LogicalType::Array { + child_type: Box::new(ffi::logical_type_get_array_child_type(logical_type).into()), + num_elements: ffi::logical_type_get_array_num_elements(logical_type), }, LogicalTypeID::STRUCT => { let names = ffi::logical_type_get_struct_field_names(logical_type); @@ -217,10 +215,10 @@ impl From<&LogicalType> for cxx::UniquePtr { LogicalType::VarList { child_type } => { ffi::create_logical_type_var_list(child_type.as_ref().into()) } - LogicalType::FixedList { + LogicalType::Array { child_type, num_elements, - } => ffi::create_logical_type_fixed_list(child_type.as_ref().into(), *num_elements), + } => ffi::create_logical_type_array(child_type.as_ref().into(), *num_elements), LogicalType::Struct { fields } => { let mut builder = ffi::create_type_list(); let mut names = vec![]; @@ -279,7 +277,7 @@ impl LogicalType { LogicalType::TimestampSec => LogicalTypeID::TIMESTAMP_SEC, LogicalType::InternalID => LogicalTypeID::INTERNAL_ID, LogicalType::VarList { .. } => LogicalTypeID::VAR_LIST, - LogicalType::FixedList { .. } => LogicalTypeID::FIXED_LIST, + LogicalType::Array { .. } => LogicalTypeID::ARRAY, LogicalType::Struct { .. } => LogicalTypeID::STRUCT, LogicalType::Node => LogicalTypeID::NODE, LogicalType::Rel => LogicalTypeID::REL, diff --git a/tools/rust_api/src/value.rs b/tools/rust_api/src/value.rs index ab5853c6b1c..272a6d728c7 100644 --- a/tools/rust_api/src/value.rs +++ b/tools/rust_api/src/value.rs @@ -247,7 +247,7 @@ pub enum Value { VarList(LogicalType, Vec), /// These must contain elements which are all the same type. /// - FixedList(LogicalType, Vec), + Array(LogicalType, Vec), /// Struct(Vec<(String, Value)>), Node(NodeVal), @@ -300,7 +300,7 @@ impl std::fmt::Display for Value { Value::String(x) => write!(f, "{x}"), Value::Blob(x) => write!(f, "{x:x?}"), Value::Null(_) => write!(f, ""), - Value::VarList(_, x) | Value::FixedList(_, x) => display_list(f, x), + Value::VarList(_, x) | Value::Array(_, x) => display_list(f, x), // Note: These don't match kuzu's toString, but we probably don't want them to Value::Interval(x) => write!(f, "{x}"), Value::Timestamp(x) => write!(f, "{x}"), @@ -376,7 +376,7 @@ impl From<&Value> for LogicalType { Value::VarList(x, _) => LogicalType::VarList { child_type: Box::new(x.clone()), }, - Value::FixedList(x, value) => LogicalType::FixedList { + Value::Array(x, value) => LogicalType::Array { child_type: Box::new(x.clone()), num_elements: value.len() as u64, }, @@ -509,14 +509,14 @@ impl TryFrom<&ffi::Value> for Value { unreachable!() } } - LogicalTypeID::FIXED_LIST => { + LogicalTypeID::ARRAY => { let mut result = vec![]; for index in 0..ffi::value_get_children_size(value) { let value: Value = ffi::value_get_child(value, index).try_into()?; result.push(value); } - if let LogicalType::FixedList { child_type, .. } = value.into() { - Ok(Value::FixedList(*child_type, result)) + if let LogicalType::Array { child_type, .. } = value.into() { + Ok(Value::Array(*child_type, result)) } else { unreachable!() } @@ -848,14 +848,14 @@ impl TryInto> for Value { builder, )) } - Value::FixedList(typ, value) => { + Value::Array(typ, value) => { let mut builder = ffi::create_list(); let len = value.len(); for elem in value { builder.pin_mut().insert(elem.try_into()?); } Ok(ffi::get_list_value( - (&LogicalType::FixedList { + (&LogicalType::Array { child_type: Box::new(typ), num_elements: len as u64, }) @@ -1123,7 +1123,7 @@ mod tests { type_tests! { convert_var_list_type: LogicalType::VarList { child_type: Box::new(LogicalType::String) }, - convert_fixed_list_type: LogicalType::FixedList { child_type: Box::new(LogicalType::Int64), num_elements: 3 }, + convert_array_type: LogicalType::Array { child_type: Box::new(LogicalType::Int64), num_elements: 3 }, convert_int8_type: LogicalType::Int8, convert_int16_type: LogicalType::Int16, convert_int32_type: LogicalType::Int32, @@ -1159,7 +1159,7 @@ mod tests { value_tests! { convert_var_list: Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), convert_var_list_empty: Value::VarList(LogicalType::String, vec![]), - convert_fixed_list: Value::FixedList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), + convert_array: Value::Array(LogicalType::String, vec!["Alice".into(), "Bob".into()]), convert_int8: Value::Int8(0), convert_int16: Value::Int16(1), convert_int32: Value::Int32(2), @@ -1187,7 +1187,7 @@ mod tests { convert_blob: Value::Blob("Hello World".into()), convert_bool: Value::Bool(false), convert_null: Value::Null(LogicalType::VarList { - child_type: Box::new(LogicalType::FixedList { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) + child_type: Box::new(LogicalType::Array { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) }), convert_struct: Value::Struct(vec![("NAME".to_string(), "Alice".into()), ("AGE".to_string(), 25.into())]), convert_internal_id: Value::InternalID(InternalID { table_id: 0, offset: 0 }), @@ -1202,7 +1202,7 @@ mod tests { display_tests! { display_var_list: Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), display_var_list_empty: Value::VarList(LogicalType::String, vec![]), - display_fixed_list: Value::FixedList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), + display_array: Value::Array(LogicalType::String, vec!["Alice".into(), "Bob".into()]), display_int8: Value::Int8(0), display_int16: Value::Int16(1), display_int32: Value::Int32(2), @@ -1219,7 +1219,7 @@ mod tests { display_string: Value::String("Hello World".to_string()), display_bool: Value::Bool(false), display_null: Value::Null(LogicalType::VarList { - child_type: Box::new(LogicalType::FixedList { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) + child_type: Box::new(LogicalType::Array { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) }), display_struct: Value::Struct(vec![("NAME".to_string(), "Alice".into()), ("AGE".to_string(), 25.into())]), display_internal_id: Value::InternalID(InternalID { table_id: 0, offset: 0 }), @@ -1240,7 +1240,7 @@ mod tests { // db_var_list_string: Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), "STRING[]", // db_var_list_int: Value::VarList(LogicalType::Int64, vec![0i64.into(), 1i64.into(), 2i64.into()]), "INT64[]", // db_map: Value::Map((LogicalType::String, LogicalType::Int64), vec![(Value::String("key".to_string()), Value::Int64(24))]), "MAP(STRING,INT64)", - // db_fixed_list: Value::FixedList(LogicalType::Int64, vec![1i64.into(), 2i64.into(), 3i64.into()]), "INT64[3]", + // db_array: Value::Array(LogicalType::Int64, vec![1i64.into(), 2i64.into(), 3i64.into()]), "INT64[3]", // db_union: Value::Union { // types: vec![("Num".to_string(), LogicalType::Int8), ("duration".to_string(), LogicalType::Interval)], // value: Box::new(Value::Int8(-127)) @@ -1251,7 +1251,7 @@ mod tests { db_null_string: Value::Null(LogicalType::String), "STRING", db_null_int: Value::Null(LogicalType::Int64), "INT64", db_null_list: Value::Null(LogicalType::VarList { - child_type: Box::new(LogicalType::FixedList { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) + child_type: Box::new(LogicalType::Array { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) }), "INT16[3][]", db_int8: Value::Int8(0), "INT8", db_int16: Value::Int16(1), "INT16", From e963df1d8c18ea6009135ab3d974f5e9e0c8f601 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:37:39 -0700 Subject: [PATCH 046/136] Implemented Progress Bar for ScanNodeID Operator (#3051) I have read and agree to the CLA of the Kuzu repository. --- src/common/task_system/CMakeLists.txt | 3 +- src/common/task_system/progress_bar.cpp | 71 +++++++++++++++++++ src/include/common/task_system/progress_bar.h | 51 +++++++++++++ src/include/main/client_context.h | 7 ++ src/include/main/connection.h | 4 ++ .../processor/operator/physical_operator.h | 2 + src/include/processor/operator/scan_node_id.h | 7 ++ src/main/client_context.cpp | 1 + src/processor/operator/physical_operator.cpp | 5 ++ src/processor/operator/scan_node_id.cpp | 10 +++ src/processor/processor.cpp | 4 ++ src/processor/processor_task.cpp | 1 + tools/shell/embedded_shell.cpp | 45 +++++++++--- tools/shell/include/embedded_shell.h | 2 + tools/shell/test/test_shell_commands.py | 3 +- 15 files changed, 204 insertions(+), 12 deletions(-) create mode 100644 src/common/task_system/progress_bar.cpp create mode 100644 src/include/common/task_system/progress_bar.h diff --git a/src/common/task_system/CMakeLists.txt b/src/common/task_system/CMakeLists.txt index df38eee19d4..af22989bfe4 100644 --- a/src/common/task_system/CMakeLists.txt +++ b/src/common/task_system/CMakeLists.txt @@ -1,7 +1,8 @@ add_library(kuzu_common_task_system OBJECT task.cpp - task_scheduler.cpp) + task_scheduler.cpp + progress_bar.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/common/task_system/progress_bar.cpp b/src/common/task_system/progress_bar.cpp new file mode 100644 index 00000000000..3efb778a1e6 --- /dev/null +++ b/src/common/task_system/progress_bar.cpp @@ -0,0 +1,71 @@ +#include "common/task_system/progress_bar.h" + +namespace kuzu { +namespace common { + +void ProgressBar::startProgress() { + if (!trackProgress) { + return; + } + std::lock_guard lock(progressBarLock); + printProgressBar(0.0); +} + +void ProgressBar::addPipeline() { + if (!trackProgress) { + return; + } + numPipelines++; +} + +void ProgressBar::finishPipeline() { + if (!trackProgress) { + return; + } + numPipelinesFinished++; + prevCurPipelineProgress = 0.0; + updateProgress(0.0); + if (numPipelines == numPipelinesFinished) { + resetProgressBar(); + } +} + +void ProgressBar::updateProgress(double curPipelineProgress) { + if (!trackProgress || curPipelineProgress - prevCurPipelineProgress < 0.01) { + return; + } + std::lock_guard lock(progressBarLock); + prevCurPipelineProgress = curPipelineProgress; + std::cout << "\033[2A\033[2K\033[1B\033[2K\033[1A"; + printProgressBar(curPipelineProgress); +} + +void ProgressBar::printProgressBar(double curPipelineProgress) const { + float pipelineProgress = 0.0; + if (numPipelines > 0) { + pipelineProgress = (float)numPipelinesFinished / (float)numPipelines; + } + setGreenFont(); + std::cout << "Pipelines Finished: " << int(pipelineProgress * 100.0) << "%" + << "\n"; + std::cout << "Current Pipeline Progress: " << int(curPipelineProgress * 100.0) << "%" + << "\n"; + std::cout.flush(); + setDefaultFont(); +} + +void ProgressBar::resetProgressBar() { + std::lock_guard lock(progressBarLock); + std::cout << "\033[2A\033[2K\033[1B\033[2K\033[1A"; + std::cout.flush(); + numPipelines = 0; + numPipelinesFinished = 0; + prevCurPipelineProgress = 0.0; +} + +void ProgressBar::toggleProgressBarPrinting(bool enable) { + trackProgress = enable; +} + +} // namespace common +} // namespace kuzu diff --git a/src/include/common/task_system/progress_bar.h b/src/include/common/task_system/progress_bar.h new file mode 100644 index 00000000000..bfd0050e3a5 --- /dev/null +++ b/src/include/common/task_system/progress_bar.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include + +namespace kuzu { +namespace common { + +/** + * TODO: PUT DESCRIPTION HERE + */ +class ProgressBar { + +public: + ProgressBar() + : numPipelines{0}, numPipelinesFinished{0}, prevCurPipelineProgress{0.0}, trackProgress{ + false} {}; + + void addPipeline(); + + void finishPipeline(); + + void addJobsToPipeline(int jobs); + + void finishJobsInPipeline(int jobs); + + void startProgress(); + + void toggleProgressBarPrinting(bool enable); + + void updateProgress(double curPipelineProgress); + +private: + inline void setGreenFont() const { std::cerr << "\033[1;32m"; } + + inline void setDefaultFont() const { std::cerr << "\033[0m"; } + + void printProgressBar(double curPipelineProgress) const; + + void resetProgressBar(); + +private: + uint32_t numPipelines; + uint32_t numPipelinesFinished; + double prevCurPipelineProgress; + std::mutex progressBarLock; + bool trackProgress; +}; + +} // namespace common +} // namespace kuzu diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index bd021e8f3b0..0cf40830296 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -7,6 +7,7 @@ #include #include "client_config.h" +#include "common/task_system/progress_bar.h" #include "common/timer.h" #include "common/types/value/value.h" #include "function/scalar_function.h" @@ -105,6 +106,10 @@ class ClientContext { std::unique_ptr query(std::string_view queryStatement); void runQuery(std::string query); + void setProgressBarPrinting(bool progressBarPrinting); + + common::ProgressBar* getProgressBar() const { return progressBar.get(); } + private: std::unique_ptr query( std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans = true); @@ -154,6 +159,8 @@ class ClientContext { std::unique_ptr randomEngine; // Attached database. Database* database; + // Progress bar for queries + std::unique_ptr progressBar; std::mutex mtx; }; diff --git a/src/include/main/connection.h b/src/include/main/connection.h index aa6f6cfefd2..2b8c3a7f9eb 100644 --- a/src/include/main/connection.h +++ b/src/include/main/connection.h @@ -40,6 +40,10 @@ class Connection { */ KUZU_API uint64_t getMaxNumThreadForExec(); + void setProgressBarPrinting(bool enable) { + clientContext->progressBar->toggleProgressBarPrinting(enable); + } + /** * @brief Executes the given query and returns the result. * @param query The query to execute. diff --git a/src/include/processor/operator/physical_operator.h b/src/include/processor/operator/physical_operator.h index c63f92d8160..3920a98aec9 100644 --- a/src/include/processor/operator/physical_operator.h +++ b/src/include/processor/operator/physical_operator.h @@ -139,6 +139,8 @@ class PhysicalOperator { virtual std::unique_ptr clone() = 0; + virtual double getProgress(ExecutionContext* context) const; + protected: virtual void initGlobalStateInternal(ExecutionContext* /*context*/) {} virtual void initLocalStateInternal(ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) {} diff --git a/src/include/processor/operator/scan_node_id.h b/src/include/processor/operator/scan_node_id.h index 4f7f405df9b..afe2b26b7f1 100644 --- a/src/include/processor/operator/scan_node_id.h +++ b/src/include/processor/operator/scan_node_id.h @@ -47,7 +47,12 @@ class ScanNodeIDSharedState { std::tuple getNextRangeToRead(); + uint64_t getNumNodes() const { return numNodes; } + uint64_t getNumNodesScanned() const { return numNodesScanned; } + private: + uint64_t numNodes; + uint64_t numNodesScanned; std::mutex mtx; std::vector> tableStates; uint32_t currentStateIdx; @@ -72,6 +77,8 @@ class ScanNodeID : public PhysicalOperator { return std::make_unique(outDataPos, sharedState, id, paramsString); } + double getProgress(ExecutionContext* context) const override; + private: inline void initGlobalStateInternal(ExecutionContext* context) override { sharedState->initialize(context->clientContext->getTx()); diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 6e8bc71d8d1..1eac0c94ed6 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -43,6 +43,7 @@ void ActiveQuery::reset() { } ClientContext::ClientContext(Database* database) : database{database} { + progressBar = std::make_unique(); transactionContext = std::make_unique(database); randomEngine = std::make_unique(); #if defined(_WIN32) diff --git a/src/processor/operator/physical_operator.cpp b/src/processor/operator/physical_operator.cpp index 14a82e47852..daf6ab962ad 100644 --- a/src/processor/operator/physical_operator.cpp +++ b/src/processor/operator/physical_operator.cpp @@ -192,6 +192,7 @@ bool PhysicalOperator::getNextTuple(ExecutionContext* context) { } metrics->executionTime.start(); auto result = getNextTuplesInternal(context); + context->clientContext->getProgressBar()->updateProgress(getProgress(context)); metrics->executionTime.stop(); return result; } @@ -230,5 +231,9 @@ std::vector PhysicalOperator::getProfilerAttributes(Profiler& profi return result; } +double PhysicalOperator::getProgress(ExecutionContext* /*context*/) const { + return 0; +} + } // namespace processor } // namespace kuzu diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index 698a2c1f4f9..fda369511ad 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -26,11 +26,14 @@ std::pair NodeTableScanState::getNextRangeToRead() { void ScanNodeIDSharedState::initialize(transaction::Transaction* transaction) { auto numMask = tableStates[0]->getSemiMask()->getNumMasks(); + numNodes = 0; for (auto& tableState : tableStates) { KU_ASSERT(tableState->getSemiMask()->getNumMasks() == numMask); tableState->initializeMaxOffset(transaction); + numNodes += tableState->getTable()->getNumTuples(); } (void)numMask; // For clang-tidy: used for assert. + numNodesScanned = 0; } std::tuple ScanNodeIDSharedState::getNextRangeToRead() { @@ -49,6 +52,7 @@ std::tuple ScanNodeIDSharedState::getNe endOffset = _endOffset; } KU_ASSERT(currentStateIdx < tableStates.size()); + numNodesScanned += endOffset - startOffset; return std::make_tuple(tableStates[currentStateIdx].get(), startOffset, endOffset); } @@ -98,5 +102,11 @@ void ScanNodeID::setSelVector(ExecutionContext* context, NodeTableScanState* tab context->clientContext->getTx(), outValueVector); } +double ScanNodeID::getProgress(ExecutionContext* /*context*/) const { + uint64_t numNodes = sharedState->getNumNodes(); + uint64_t numReadNodes = sharedState->getNumNodesScanned(); + return numNodes == 0 ? 0.0 : (double)numReadNodes / numNodes; +} + } // namespace processor } // namespace kuzu diff --git a/src/processor/processor.cpp b/src/processor/processor.cpp index 16bce09fa84..382aa737bef 100644 --- a/src/processor/processor.cpp +++ b/src/processor/processor.cpp @@ -25,12 +25,16 @@ std::shared_ptr QueryProcessor::execute( auto task = std::make_shared(resultCollector, context); decomposePlanIntoTask(lastOperator->getChild(0), task.get(), context); initTask(task.get()); + context->clientContext->getProgressBar()->startProgress(); taskScheduler->scheduleTaskAndWaitOrError(task, context); return resultCollector->getResultFactorizedTable(); } void QueryProcessor::decomposePlanIntoTask( PhysicalOperator* op, Task* task, ExecutionContext* context) { + if (op->isSource()) { + context->clientContext->getProgressBar()->addPipeline(); + } if (op->isSink()) { auto childTask = std::make_unique(ku_dynamic_cast(op), context); diff --git a/src/processor/processor_task.cpp b/src/processor/processor_task.cpp index 972b2358336..b63da12a2c6 100644 --- a/src/processor/processor_task.cpp +++ b/src/processor/processor_task.cpp @@ -31,6 +31,7 @@ void ProcessorTask::run() { void ProcessorTask::finalizeIfNecessary() { auto resultSet = populateResultSet(sink, executionContext->clientContext->getMemoryManager()); sink->initLocalState(resultSet.get(), executionContext); + executionContext->clientContext->getProgressBar()->finishPipeline(); sink->finalize(executionContext); } diff --git a/tools/shell/embedded_shell.cpp b/tools/shell/embedded_shell.cpp index 0f0ab431c4d..68d6ccade2f 100644 --- a/tools/shell/embedded_shell.cpp +++ b/tools/shell/embedded_shell.cpp @@ -18,6 +18,13 @@ #include "utf8proc.h" #include "utf8proc_wrapper.h" +#include "common/task_system/progress_bar.h" + +// TODO: REMOVE +#ifdef _WIN32 +#include +#endif + using namespace kuzu::common; using namespace kuzu::utf8proc; @@ -42,9 +49,10 @@ struct ShellCommand { const char* HELP = ":help"; const char* CLEAR = ":clear"; const char* QUIT = ":quit"; - const char* MAXROWS = ":max_rows"; - const char* MAXWIDTH = ":max_width"; - const std::array commandList = {HELP, CLEAR, QUIT, MAXROWS, MAXWIDTH}; + const char* MAX_ROWS = ":max_rows"; + const char* MAX_WIDTH = ":max_width"; + const char* PROGRESS_BAR = ":progress_bar"; + const std::array commandList = {HELP, CLEAR, QUIT, MAX_ROWS, MAX_WIDTH, PROGRESS_BAR}; } shellCommand; const char* TAB = " "; @@ -273,10 +281,12 @@ int EmbeddedShell::processShellCommands(std::string lineStr) { linenoiseClearScreen(); } else if (lineStr == shellCommand.QUIT) { return -1; - } else if (lineStr.rfind(shellCommand.MAXROWS) == 0) { - setMaxRows(lineStr.substr(strlen(shellCommand.MAXROWS))); - } else if (lineStr.rfind(shellCommand.MAXWIDTH) == 0) { - setMaxWidth(lineStr.substr(strlen(shellCommand.MAXWIDTH))); + } else if (lineStr.rfind(shellCommand.MAX_ROWS) == 0) { + setMaxRows(lineStr.substr(strlen(shellCommand.MAX_ROWS))); + } else if (lineStr.rfind(shellCommand.MAX_WIDTH) == 0) { + setMaxWidth(lineStr.substr(strlen(shellCommand.MAX_WIDTH))); + } else if (lineStr.rfind(shellCommand.PROGRESS_BAR) == 0) { + toggleProgressBar(lineStr.substr(strlen(shellCommand.PROGRESS_BAR))); } else { printf("Error: Unknown command: \"%s\". Enter \":help\" for help\n", lineStr.c_str()); printf("Did you mean: \"%s\"?\n", findClosestCommand(lineStr).c_str()); @@ -420,20 +430,35 @@ void EmbeddedShell::setMaxWidth(const std::string& maxWidthString) { printf("maxWidth set as %d\n", parsedMaxWidth); } +void EmbeddedShell::toggleProgressBar(const std::string& state) { + std::string stateTrimmed = state; + stateTrimmed = stateTrimmed.erase(0, state.find_first_not_of(" \t\n\r\f\v")); + if (stateTrimmed == "on") { + conn->setProgressBarPrinting(true); + printf("Turned progress bar on.\n"); + } else if (stateTrimmed == "off") { + conn->setProgressBarPrinting(false); + printf("Turned progress bar off\n"); + } else { + printf("Cannot parse '%s' as progress bar state. Expect on|off.\n", stateTrimmed.c_str()); + } +} + void EmbeddedShell::printHelp() { printf("%s%s %sget command list\n", TAB, shellCommand.HELP, TAB); printf("%s%s %sclear shell\n", TAB, shellCommand.CLEAR, TAB); printf("%s%s %sexit from shell\n", TAB, shellCommand.QUIT, TAB); printf("%s%s [max_rows] %sset maximum number of rows for display (default: 20)\n", TAB, - shellCommand.MAXROWS, TAB); + shellCommand.MAX_ROWS, TAB); printf("%s%s [max_width] %sset maximum width in characters for display\n", TAB, - shellCommand.MAXWIDTH, TAB); + shellCommand.MAX_WIDTH, TAB); + printf("%s%s [on|off] %stoggle progress bar for queries\n", TAB, shellCommand.PROGRESS_BAR, TAB); printf("\n"); printf("%sNote: you can change and see several system configurations, such as num-threads, \n", TAB); printf("%s%s timeout, and logging_level using Cypher CALL statements.\n", TAB, TAB); printf("%s%s e.g. CALL THREADS=5; or CALL current_setting('threads') return *;\n", TAB, TAB); - printf("%s%s See: https://kuzudb.com/docusaurus/cypher/configuration\n", TAB, TAB); + printf("%s%s See: https://docs.kuzudb.com/cypher/configuration\n", TAB, TAB); } void EmbeddedShell::printExecutionResult(QueryResult& queryResult) const { diff --git a/tools/shell/include/embedded_shell.h b/tools/shell/include/embedded_shell.h index 7b5171f455f..8aa44e6c047 100644 --- a/tools/shell/include/embedded_shell.h +++ b/tools/shell/include/embedded_shell.h @@ -32,6 +32,8 @@ class EmbeddedShell { void setMaxWidth(const std::string& maxWidthString); + void toggleProgressBar(const std::string& state); + private: std::unique_ptr database; std::unique_ptr conn; diff --git a/tools/shell/test/test_shell_commands.py b/tools/shell/test/test_shell_commands.py index 9c4f0fd5b07..f402eba89cc 100644 --- a/tools/shell/test/test_shell_commands.py +++ b/tools/shell/test/test_shell_commands.py @@ -11,11 +11,12 @@ def test_help(temp_db) -> None: " :quit exit from shell", " :max_rows [max_rows] set maximum number of rows for display (default: 20)", " :max_width [max_width] set maximum width in characters for display", + " :progress_bar [on|off] toggle progress bar for queries", "", " Note: you can change and see several system configurations, such as num-threads, ", " timeout, and logging_level using Cypher CALL statements.", " e.g. CALL THREADS=5; or CALL current_setting('threads') return *;", - " See: https://kuzudb.com/docusaurus/cypher/configuration", + " See: https://docs.kuzudb.com/cypher/configuration", ], ) From 775d2e691ad99dacebc9151d6eb93c5763e760e8 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Thu, 14 Mar 2024 18:05:14 +0800 Subject: [PATCH 047/136] replace ValueVector with ColumnChunk in LocalStorage --- src/common/vector/value_vector.cpp | 4 + .../operator/persistent/batch_insert.h | 2 +- .../operator/persistent/node_batch_insert.h | 6 +- .../operator/persistent/rel_batch_insert.h | 6 +- .../storage/local_storage/local_node_table.h | 12 +- .../storage/local_storage/local_rel_table.h | 12 +- .../storage/local_storage/local_storage.h | 10 +- .../storage/local_storage/local_table.h | 74 +- src/include/storage/store/column.h | 33 +- src/include/storage/store/column_chunk.h | 15 +- src/include/storage/store/node_group.h | 76 +- src/include/storage/store/node_table.h | 2 +- src/include/storage/store/node_table_data.h | 2 +- src/include/storage/store/null_column.h | 13 +- src/include/storage/store/rel_table.h | 2 +- src/include/storage/store/rel_table_data.h | 28 +- src/include/storage/store/string_column.h | 6 +- .../storage/store/string_column_chunk.h | 16 +- src/include/storage/store/struct_column.h | 12 +- .../storage/store/struct_column_chunk.h | 16 +- src/include/storage/store/table_data.h | 2 +- src/include/storage/store/var_list_column.h | 2 +- .../storage/store/var_list_column_chunk.h | 19 +- src/include/transaction/transaction.h | 5 +- src/include/transaction/transaction_manager.h | 6 +- src/main/database.cpp | 3 +- .../operator/persistent/insert_executor.cpp | 2 +- .../operator/persistent/node_batch_insert.cpp | 4 +- .../operator/persistent/rel_batch_insert.cpp | 9 +- .../local_storage/local_node_table.cpp | 3 +- src/storage/local_storage/local_rel_table.cpp | 8 +- src/storage/local_storage/local_storage.cpp | 4 +- src/storage/local_storage/local_table.cpp | 96 +- src/storage/store/column.cpp | 115 +- src/storage/store/column_chunk.cpp | 73 +- src/storage/store/node_group.cpp | 54 +- src/storage/store/node_table_data.cpp | 4 +- src/storage/store/null_column.cpp | 40 +- src/storage/store/rel_table_data.cpp | 31 +- src/storage/store/string_column.cpp | 20 +- src/storage/store/string_column_chunk.cpp | 15 +- src/storage/store/struct_column.cpp | 35 +- src/storage/store/struct_column_chunk.cpp | 16 +- src/storage/store/var_list_column_chunk.cpp | 22 +- src/transaction/transaction_manager.cpp | 5 +- test/hammer.test | 4415 ----------------- test/test_files/update_rel/create_empty.test | 2 +- .../update_rel/create_read_tinysnb.test | 10 +- test/test_files/update_rel/merge_tinysnb.test | 2 +- test/transaction/transaction_manager_test.cpp | 3 +- 50 files changed, 562 insertions(+), 4810 deletions(-) delete mode 100644 test/hammer.test diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index 05d3900d6f2..ad00a5e4ed9 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -369,6 +369,10 @@ template<> void ValueVector::setValue(uint32_t pos, std::string val) { StringVector::addString(this, pos, val.data(), val.length()); } +template<> +void ValueVector::setValue(uint32_t pos, std::string_view val) { + StringVector::addString(this, pos, val.data(), val.length()); +} void ValueVector::setNull(uint32_t pos, bool isNull) { nullMask->setNull(pos, isNull); diff --git a/src/include/processor/operator/persistent/batch_insert.h b/src/include/processor/operator/persistent/batch_insert.h index ccc380a1604..e23158690e6 100644 --- a/src/include/processor/operator/persistent/batch_insert.h +++ b/src/include/processor/operator/persistent/batch_insert.h @@ -52,7 +52,7 @@ struct BatchInsertSharedState { }; struct BatchInsertLocalState { - std::unique_ptr nodeGroup; + std::unique_ptr nodeGroup; virtual ~BatchInsertLocalState() = default; }; diff --git a/src/include/processor/operator/persistent/node_batch_insert.h b/src/include/processor/operator/persistent/node_batch_insert.h index a17962b9741..bfcaea3de8c 100644 --- a/src/include/processor/operator/persistent/node_batch_insert.h +++ b/src/include/processor/operator/persistent/node_batch_insert.h @@ -44,7 +44,7 @@ struct NodeBatchInsertSharedState final : public BatchInsertSharedState { uint64_t currentNodeGroupIdx; // The sharedNodeGroup is to accumulate left data within local node groups in NodeBatchInsert // ops. - std::unique_ptr sharedNodeGroup; + std::unique_ptr sharedNodeGroup; NodeBatchInsertSharedState( storage::Table* table, std::shared_ptr fTable, storage::WAL* wal) @@ -60,7 +60,7 @@ struct NodeBatchInsertSharedState final : public BatchInsertSharedState { inline uint64_t getCurNodeGroupIdx() const { return currentNodeGroupIdx; } - void appendIncompleteNodeGroup(std::unique_ptr localNodeGroup, + void appendIncompleteNodeGroup(std::unique_ptr localNodeGroup, std::optional& indexBuilder); inline common::offset_t getNextNodeGroupIdxWithoutLock() { return currentNodeGroupIdx++; } @@ -107,7 +107,7 @@ class NodeBatchInsert final : public BatchInsert { static void writeAndResetNodeGroup(common::node_group_idx_t nodeGroupIdx, std::optional& indexBuilder, common::column_id_t pkColumnID, - storage::NodeTable* table, storage::NodeGroup* nodeGroup); + storage::NodeTable* table, storage::ChunkedNodeGroup* nodeGroup); private: void copyToNodeGroup(); diff --git a/src/include/processor/operator/persistent/rel_batch_insert.h b/src/include/processor/operator/persistent/rel_batch_insert.h index 59233b8d9f7..387bfffaed9 100644 --- a/src/include/processor/operator/persistent/rel_batch_insert.h +++ b/src/include/processor/operator/persistent/rel_batch_insert.h @@ -66,10 +66,10 @@ class RelBatchInsert final : public BatchInsert { static common::length_t getGapSize(common::length_t length); static std::vector populateStartCSROffsetsAndLengths( - storage::CSRHeaderChunks& csrHeader, common::offset_t numNodes, + storage::ChunkedCSRHeader& csrHeader, common::offset_t numNodes, PartitioningBuffer::Partition& partition, common::vector_idx_t offsetVectorIdx); static void populateEndCSROffsets( - storage::CSRHeaderChunks& csrHeader, std::vector& gaps); + storage::ChunkedCSRHeader& csrHeader, std::vector& gaps); static void setOffsetToWithinNodeGroup( storage::ColumnChunk& chunk, common::offset_t startOffset); static void setOffsetFromCSROffsets( @@ -77,7 +77,7 @@ class RelBatchInsert final : public BatchInsert { // We only check rel multiplcity constraint (MANY_ONE, ONE_ONE) for now. std::optional checkRelMultiplicityConstraint( - const storage::CSRHeaderChunks& csrHeader); + const storage::ChunkedCSRHeader& csrHeader); private: std::shared_ptr partitionerSharedState; diff --git a/src/include/storage/local_storage/local_node_table.h b/src/include/storage/local_storage/local_node_table.h index 42343b40ec0..c13ca3dcc33 100644 --- a/src/include/storage/local_storage/local_node_table.h +++ b/src/include/storage/local_storage/local_node_table.h @@ -2,6 +2,7 @@ #include +#include "common/copy_constructors.h" #include "local_table.h" namespace kuzu { @@ -9,9 +10,10 @@ namespace storage { class LocalNodeNG final : public LocalNodeGroup { public: - LocalNodeNG(common::offset_t nodeGroupStartOffset, - const std::vector& dataTypes, MemoryManager* mm) - : LocalNodeGroup{nodeGroupStartOffset, dataTypes, mm} {} + LocalNodeNG( + common::offset_t nodeGroupStartOffset, const std::vector& dataTypes) + : LocalNodeGroup{nodeGroupStartOffset, dataTypes} {} + DELETE_COPY_DEFAULT_MOVE(LocalNodeNG); void scan(common::ValueVector* nodeIDVector, const std::vector& columnIDs, const std::vector& outputVectors); @@ -35,8 +37,8 @@ class LocalNodeNG final : public LocalNodeGroup { class LocalNodeTableData final : public LocalTableData { public: - LocalNodeTableData(std::vector dataTypes, MemoryManager* mm) - : LocalTableData{std::move(dataTypes), mm} {} + explicit LocalNodeTableData(std::vector dataTypes) + : LocalTableData{std::move(dataTypes)} {} void scan(common::ValueVector* nodeIDVector, const std::vector& columnIDs, const std::vector& outputVectors); diff --git a/src/include/storage/local_storage/local_rel_table.h b/src/include/storage/local_storage/local_rel_table.h index 96c49be7c0f..8e91853bb60 100644 --- a/src/include/storage/local_storage/local_rel_table.h +++ b/src/include/storage/local_storage/local_rel_table.h @@ -1,5 +1,6 @@ #pragma once +#include "common/copy_constructors.h" #include "common/enums/rel_multiplicity.h" #include "common/vector/value_vector.h" #include "storage/local_storage/local_table.h" @@ -14,8 +15,9 @@ class LocalRelNG final : public LocalNodeGroup { friend class RelTableData; public: - LocalRelNG(common::offset_t nodeGroupStartOffset, std::vector dataTypes, - MemoryManager* mm, common::RelMultiplicity multiplicity); + LocalRelNG(common::offset_t nodeGroupStartOffset, std::vector dataTypes, + common::RelMultiplicity multiplicity); + DELETE_COPY_DEFAULT_MOVE(LocalRelNG); common::row_idx_t scanCSR(common::offset_t srcOffset, common::offset_t posToReadForOffset, const std::vector& columnIDs, @@ -53,9 +55,9 @@ class LocalRelTableData final : public LocalTableData { friend class RelTableData; public: - LocalRelTableData(common::RelMultiplicity multiplicity, - std::vector dataTypes, MemoryManager* mm) - : LocalTableData{std::move(dataTypes), mm}, multiplicity{multiplicity} {} + LocalRelTableData( + common::RelMultiplicity multiplicity, std::vector dataTypes) + : LocalTableData{std::move(dataTypes)}, multiplicity{multiplicity} {} private: LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) override; diff --git a/src/include/storage/local_storage/local_storage.h b/src/include/storage/local_storage/local_storage.h index 26f8804a14a..539c4f9306a 100644 --- a/src/include/storage/local_storage/local_storage.h +++ b/src/include/storage/local_storage/local_storage.h @@ -2,23 +2,20 @@ #include +#include "common/copy_constructors.h" #include "storage/local_storage/local_table.h" namespace kuzu { -namespace catalog { -class TableCatalogEntry; -} namespace storage { -class MemoryManager; - // Data structures in LocalStorage are not thread-safe. // For now, we only support single thread insertions and updates. Once we optimize them with // multiple threads, LocalStorage and its related data structures should be reworked to be // thread-safe. class LocalStorage { public: - explicit LocalStorage(storage::MemoryManager* mm); + explicit LocalStorage() {} + DELETE_COPY_AND_MOVE(LocalStorage); // This function will create the local table data if not exists. LocalTableData* getOrCreateLocalTableData(common::table_id_t tableID, @@ -32,7 +29,6 @@ class LocalStorage { private: std::unordered_map> tables; - storage::MemoryManager* mm; }; } // namespace storage diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index 989e324df56..6608a2641ba 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -2,10 +2,10 @@ #include -#include "common/data_chunk/data_chunk_collection.h" #include "common/enums/rel_multiplicity.h" #include "common/enums/table_type.h" #include "common/vector/value_vector.h" +#include "storage/store/node_group.h" namespace kuzu { namespace storage { @@ -18,26 +18,21 @@ using offset_set_t = std::unordered_set; static constexpr common::column_id_t NBR_ID_COLUMN_ID = 0; static constexpr common::column_id_t REL_ID_COLUMN_ID = 1; -struct LocalVectorCollection { - std::vector vectors; +using ChunkCollection = std::vector; - static LocalVectorCollection empty() { return LocalVectorCollection{}; } - - inline bool isEmpty() const { return vectors.empty(); } - inline void appendVector(common::ValueVector* vector) { vectors.push_back(vector); } - inline common::ValueVector* getLocalVector(common::row_idx_t rowIdx) const { - auto vectorIdx = rowIdx >> common::DEFAULT_VECTOR_CAPACITY_LOG_2; - KU_ASSERT(vectorIdx < vectors.size()); - return vectors[vectorIdx]; - } +class LocalChunkedGroupCollection { +public: + static constexpr uint64_t CHUNK_CAPACITY = 2048; - LocalVectorCollection getStructChildVectorCollection(common::struct_field_idx_t idx) const; -}; + explicit LocalChunkedGroupCollection(std::vector dataTypes) + : dataTypes{std::move(dataTypes)}, numRows{0} {} + DELETE_COPY_DEFAULT_MOVE(LocalChunkedGroupCollection); -class LocalDataChunkCollection { -public: - LocalDataChunkCollection(MemoryManager* mm, std::vector dataTypes) - : dataChunkCollection{mm}, mm{mm}, dataTypes{std::move(dataTypes)}, numRows{0} {} + static inline std::pair getChunkIdxAndOffsetInChunk( + common::row_idx_t rowIdx) { + return std::make_pair(rowIdx / LocalChunkedGroupCollection::CHUNK_CAPACITY, + rowIdx % LocalChunkedGroupCollection::CHUNK_CAPACITY); + } inline common::row_idx_t getRowIdxFromOffset(common::offset_t offset) { KU_ASSERT(offsetToRowIdx.contains(offset)); @@ -61,12 +56,12 @@ class LocalDataChunkCollection { bool isEmpty() const { return offsetToRowIdx.empty() && srcNodeOffsetToRelOffsets.empty(); } void readValueAtRowIdx(common::row_idx_t rowIdx, common::column_id_t columnID, - common::ValueVector* outputVector, common::sel_t posInOutputVector); + common::ValueVector* outputVector, common::sel_t posInOutputVector) const; bool read(common::offset_t offset, common::column_id_t columnID, common::ValueVector* outputVector, common::sel_t posInOutputVector); inline void append(common::offset_t offset, std::vector vectors) { - offsetToRowIdx[offset] = appendToDataChunkCollection(vectors); + offsetToRowIdx[offset] = append(vectors); } // Only used for rel tables. Should be moved out later. inline void append(common::offset_t nodeOffset, common::offset_t relOffset, @@ -84,23 +79,21 @@ class LocalDataChunkCollection { // Only used for rel tables. Should be moved out later. void remove(common::offset_t srcNodeOffset, common::offset_t relOffset); - inline LocalVectorCollection getLocalChunk(common::column_id_t columnID) { - LocalVectorCollection localVectorCollection; - for (auto& chunk : dataChunkCollection.getChunksUnsafe()) { - localVectorCollection.appendVector(chunk.getValueVector(columnID).get()); + inline ChunkCollection getLocalChunk(common::column_id_t columnID) { + ChunkCollection localChunkCollection; + for (auto& chunkedGroup : chunkedGroups.getChunkedGroups()) { + localChunkCollection.push_back(chunkedGroup->getColumnChunkUnsafe(columnID)); } - return localVectorCollection; + return localChunkCollection; } private: - common::row_idx_t appendToDataChunkCollection(std::vector vectors); - common::DataChunk createNewDataChunk(); + common::row_idx_t append(std::vector vectors); private: - common::DataChunkCollection dataChunkCollection; + ChunkedNodeGroupCollection chunkedGroups; // The offset here can either be nodeOffset ( for node table) or relOffset (for rel table). offset_to_row_idx_t offsetToRowIdx; - storage::MemoryManager* mm; std::vector dataTypes; common::row_idx_t numRows; @@ -147,8 +140,9 @@ class LocalDeletionInfo { class LocalNodeGroup { public: - LocalNodeGroup(common::offset_t nodeGroupStartOffset, - std::vector dataTypes, MemoryManager* mm); + LocalNodeGroup( + common::offset_t nodeGroupStartOffset, const std::vector& dataTypes); + DELETE_COPY_DEFAULT_MOVE(LocalNodeGroup); virtual ~LocalNodeGroup() = default; virtual bool insert(std::vector nodeIDVectors, @@ -157,29 +151,28 @@ class LocalNodeGroup { common::column_id_t columnID, common::ValueVector* propertyVector) = 0; virtual bool delete_(common::ValueVector* IDVector, common::ValueVector* extraVector) = 0; - LocalDataChunkCollection& getUpdateChunks(common::column_id_t columnID) { + LocalChunkedGroupCollection& getUpdateChunks(common::column_id_t columnID) { KU_ASSERT(columnID < updateChunks.size()); return updateChunks[columnID]; } - LocalDataChunkCollection& getInsesrtChunks() { return insertChunks; } + LocalChunkedGroupCollection& getInsesrtChunks() { return insertChunks; } bool hasUpdatesOrDeletions() const; protected: common::offset_t nodeGroupStartOffset; - storage::MemoryManager* mm; - LocalDataChunkCollection insertChunks; + LocalChunkedGroupCollection insertChunks; LocalDeletionInfo deleteInfo; - std::vector updateChunks; + std::vector updateChunks; }; class LocalTableData { friend class NodeTableData; public: - LocalTableData(std::vector dataTypes, MemoryManager* mm) - : dataTypes{std::move(dataTypes)}, mm{mm} {} + explicit LocalTableData(std::vector dataTypes) + : dataTypes{std::move(dataTypes)} {} virtual ~LocalTableData() = default; inline void clear() { nodeGroups.clear(); } @@ -194,8 +187,7 @@ class LocalTableData { virtual LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) = 0; protected: - std::vector dataTypes; - MemoryManager* mm; + std::vector dataTypes; std::unordered_map> nodeGroups; }; @@ -206,7 +198,7 @@ class LocalTable { explicit LocalTable(common::TableType tableType) : tableType{tableType} {}; LocalTableData* getOrCreateLocalTableData(const std::vector>& columns, - MemoryManager* mm, common::vector_idx_t dataIdx, common::RelMultiplicity multiplicity); + common::vector_idx_t dataIdx, common::RelMultiplicity multiplicity); inline LocalTableData* getLocalTableData(common::vector_idx_t dataIdx) { KU_ASSERT(dataIdx < localTableDataCollection.size()); return localTableDataCollection[dataIdx].get(); diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index 69277a3b010..a1f23cd0bbb 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -28,7 +28,6 @@ using batch_lookup_func_t = read_values_to_page_func_t; class NullColumn; class StructColumn; -struct LocalVectorCollection; class Column { friend class StringColumn; friend class VarListLocalColumn; @@ -76,8 +75,8 @@ class Column { Column* getNullColumn(); virtual void prepareCommitForChunk(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo); virtual void prepareCommitForChunk(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, @@ -115,7 +114,7 @@ class Column { transaction::TransactionType transactionType, common::node_group_idx_t nodeGroupIdx) const; virtual std::unique_ptr getEmptyChunkForCommit(uint64_t capacity); - static void applyLocalChunkToColumnChunk(const LocalVectorCollection& localChunk, + static void applyLocalChunkToColumnChunk(const ChunkCollection& localChunks, ColumnChunk* columnChunk, const offset_to_row_idx_t& info); protected: @@ -158,28 +157,30 @@ class Column { return maxOffset; } + static ChunkCollection getNullChunkCollection(const ChunkCollection& chunkCollection); + private: bool isInsertionsOutOfPagesCapacity( const ColumnChunkMetadata& metadata, const offset_to_row_idx_t& insertInfo); bool isMaxOffsetOutOfPagesCapacity( const ColumnChunkMetadata& metadata, common::offset_t maxOffset); - bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, - const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo); + bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, const ChunkCollection& localChunks, + const offset_to_row_idx_t& writeInfo); virtual bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo); virtual bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t srcOffset); virtual void commitLocalChunkInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo); virtual void commitLocalChunkOutOfPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, bool isNewNodeGroup, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo); virtual void commitColumnChunkInPlace(common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, @@ -190,7 +191,7 @@ class Column { common::offset_t srcOffset); void applyLocalChunkToColumn(common::node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localChunk, const offset_to_row_idx_t& info); + const ChunkCollection& localChunks, const offset_to_row_idx_t& info); // check if val is in range [start, end) static inline bool isInRange(uint64_t val, uint64_t start, uint64_t end) { @@ -201,8 +202,8 @@ class Column { std::string name; DBFileID dbFileID; common::LogicalType dataType; - // TODO(bmwinger): Remove. Only used by var_list_column_chunk for something which should be - // rewritten + // TODO(bmwinger): Remove. Only used by StorageDriver, which should be rewritten to not use this + // field. uint32_t numBytesPerFixedSizedValue; BMFileHandle* dataFH; BMFileHandle* metadataFH; @@ -245,7 +246,7 @@ class InternalIDColumn : public Column { populateCommonTableID(resultVector); } - // TODO(Guodong): Should figure out a better way to set tableID, and remove this function. + // TODO(Guodong): This function should be removed through rewritting INTERNAL_ID as STRUCT. inline void setCommonTableID(common::table_id_t tableID) { commonTableID = tableID; } private: diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index 54cabac287c..d4bcc437453 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -4,6 +4,7 @@ #include "common/constants.h" #include "common/data_chunk/sel_vector.h" +#include "common/enums/rel_multiplicity.h" #include "common/types/types.h" #include "common/vector/value_vector.h" #include "storage/buffer_manager/bm_file_handle.h" @@ -70,13 +71,18 @@ class ColumnChunk { inline uint64_t getNumBytesPerValue() const { return numBytesPerValue; } inline uint8_t* getData() const { return buffer.get(); } + virtual void lookup(common::offset_t offsetInChunk, common::ValueVector& output, + common::sel_t posInOutputVector) const; + // TODO(Guodong): In general, this is not a good interface. Instead of passing in // `offsetInVector`, we should flatten the vector to pos at `offsetInVector`. virtual void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk); - virtual void write(ColumnChunk* chunk, ColumnChunk* offsetsInChunk, bool isCSR); + virtual void write( + ColumnChunk* chunk, ColumnChunk* offsetsInChunk, common::RelMultiplicity multiplicity); virtual void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy); + // TODO(Guodong): Used in `applyDeletionsToChunk`. Should unify with `write`. virtual void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy); @@ -154,9 +160,14 @@ class BoolColumnChunk : public ColumnChunk { void append(common::ValueVector* vector, common::SelectionVector& sel) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) override; + + void lookup(common::offset_t offsetInChunk, common::ValueVector& output, + common::sel_t posInOutputVector) const override; + void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) override; - void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; + void write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) final; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; }; diff --git a/src/include/storage/store/node_group.h b/src/include/storage/store/node_group.h index 1a59796fef9..35645ab9184 100644 --- a/src/include/storage/store/node_group.h +++ b/src/include/storage/store/node_group.h @@ -1,6 +1,7 @@ #pragma once #include "common/column_data_format.h" +#include "common/copy_constructors.h" #include "storage/store/column_chunk.h" namespace kuzu { @@ -8,15 +9,20 @@ namespace storage { class Column; -class NodeGroup { +class ChunkedNodeGroup { public: - NodeGroup(const std::vector& columnTypes, bool enableCompression, + ChunkedNodeGroup(const std::vector& columnTypes, bool enableCompression, uint64_t capacity); - NodeGroup(const std::vector>& columns, bool enableCompression); - virtual ~NodeGroup() = default; + ChunkedNodeGroup(const std::vector>& columns, bool enableCompression); + virtual ~ChunkedNodeGroup() = default; inline uint64_t getNodeGroupIdx() const { return nodeGroupIdx; } inline common::row_idx_t getNumRows() const { return numRows; } + inline common::vector_idx_t getNumColumns() const { return chunks.size(); } + inline const ColumnChunk& getColumnChunk(common::column_id_t columnID) const { + KU_ASSERT(columnID < chunks.size()); + return *chunks[columnID]; + } inline ColumnChunk* getColumnChunkUnsafe(common::column_id_t columnID) { KU_ASSERT(columnID < chunks.size()); return chunks[columnID].get(); @@ -34,7 +40,7 @@ class NodeGroup { uint64_t append(const std::vector& columnVectors, common::DataChunkState* columnState, uint64_t numValuesToAppend); - common::offset_t append(NodeGroup* other, common::offset_t offsetInOtherNodeGroup); + common::offset_t append(ChunkedNodeGroup* other, common::offset_t offsetInOtherNodeGroup); void write(std::vector>& data, common::vector_idx_t offsetVector); void finalize(uint64_t nodeGroupIdx_); @@ -42,7 +48,7 @@ class NodeGroup { virtual inline void writeToColumnChunk(common::vector_idx_t chunkIdx, common::vector_idx_t vectorIdx, std::vector>& data, ColumnChunk& offsetChunk) { - chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, false /*isCSR*/); + chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, common::RelMultiplicity::ONE); } protected: @@ -53,20 +59,21 @@ class NodeGroup { common::row_idx_t numRows; }; -struct CSRHeaderChunks { +struct ChunkedCSRHeader { std::unique_ptr offset; std::unique_ptr length; - CSRHeaderChunks() {} - explicit CSRHeaderChunks( + ChunkedCSRHeader() {} + explicit ChunkedCSRHeader( bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE); + DELETE_COPY_DEFAULT_MOVE(ChunkedCSRHeader); common::offset_t getStartCSROffset(common::offset_t nodeOffset) const; common::offset_t getEndCSROffset(common::offset_t nodeOffset) const; common::length_t getCSRLength(common::offset_t nodeOffset) const; bool sanityCheck() const; - void copyFrom(const CSRHeaderChunks& other) const; + void copyFrom(const ChunkedCSRHeader& other) const; void fillDefaultValues(common::offset_t newNumValues) const; inline void setNumValues(common::offset_t numValues) const { offset->setNumValues(numValues); @@ -74,29 +81,56 @@ struct CSRHeaderChunks { } }; -class CSRNodeGroup : public NodeGroup { +class ChunkedCSRNodeGroup : public ChunkedNodeGroup { public: - CSRNodeGroup(const std::vector& columnTypes, bool enableCompression); + ChunkedCSRNodeGroup( + const std::vector& columnTypes, bool enableCompression); - CSRHeaderChunks& getCSRHeader() { return csrHeaderChunks; } - const CSRHeaderChunks& getCSRHeader() const { return csrHeaderChunks; } + ChunkedCSRHeader& getCSRHeader() { return csrHeader; } + const ChunkedCSRHeader& getCSRHeader() const { return csrHeader; } inline void writeToColumnChunk(common::vector_idx_t chunkIdx, common::vector_idx_t vectorIdx, std::vector>& data, ColumnChunk& offsetChunk) override { - chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, true /* isCSR */); + chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, common::RelMultiplicity::MANY); + } + +private: + ChunkedCSRHeader csrHeader; +}; + +class ChunkedNodeGroupCollection { +public: + ChunkedNodeGroupCollection() {} + + inline const std::vector>& getChunkedGroups() const { + return chunkedGroups; + } + inline const ChunkedNodeGroup* getChunkedGroup(uint64_t groupIdx) const { + KU_ASSERT(groupIdx < chunkedGroups.size()); + return chunkedGroups[groupIdx].get(); } + inline ChunkedNodeGroup* getChunkedGroupUnsafe(uint64_t groupIdx) { + KU_ASSERT(groupIdx < chunkedGroups.size()); + return chunkedGroups[groupIdx].get(); + } + inline uint64_t getNumChunks() const { return chunkedGroups.size(); } + void append(std::unique_ptr chunkedGroup); + +private: + // Assert that all chunked node groups have the same num columns and same data types. + bool sanityCheckForAppend(); private: - CSRHeaderChunks csrHeaderChunks; + std::vector> chunkedGroups; }; struct NodeGroupFactory { - static inline std::unique_ptr createNodeGroup(common::ColumnDataFormat dataFormat, - const std::vector& columnTypes, bool enableCompression, - uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { + static inline std::unique_ptr createNodeGroup( + common::ColumnDataFormat dataFormat, const std::vector& columnTypes, + bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { return dataFormat == common::ColumnDataFormat::REGULAR ? - std::make_unique(columnTypes, enableCompression, capacity) : - std::make_unique(columnTypes, enableCompression); + std::make_unique(columnTypes, enableCompression, capacity) : + std::make_unique(columnTypes, enableCompression); } }; diff --git a/src/include/storage/store/node_table.h b/src/include/storage/store/node_table.h index 8b232ba94dc..320bb11b588 100644 --- a/src/include/storage/store/node_table.h +++ b/src/include/storage/store/node_table.h @@ -57,7 +57,7 @@ class NodeTable final : public Table { common::ValueVector* nodeIDVector, common::ValueVector* propertyVector); void delete_(transaction::Transaction* transaction, common::ValueVector* nodeIDVector, common::ValueVector* pkVector); - inline void append(NodeGroup* nodeGroup) { tableData->append(nodeGroup); } + inline void append(ChunkedNodeGroup* nodeGroup) { tableData->append(nodeGroup); } inline common::column_id_t getNumColumns() const { return tableData->getNumColumns(); } inline Column* getColumn(common::column_id_t columnID) { diff --git a/src/include/storage/store/node_table_data.h b/src/include/storage/store/node_table_data.h index 370e524fe13..e283e7cc376 100644 --- a/src/include/storage/store/node_table_data.h +++ b/src/include/storage/store/node_table_data.h @@ -36,7 +36,7 @@ class NodeTableData final : public TableData { void delete_(transaction::Transaction* transaction, common::ValueVector* nodeIDVector); // Flush the nodeGroup to disk and update metadataDAs. - void append(NodeGroup* nodeGroup) override; + void append(ChunkedNodeGroup* nodeGroup) override; void prepareLocalTableToCommit( transaction::Transaction* transaction, LocalTableData* localTable) override; diff --git a/src/include/storage/store/null_column.h b/src/include/storage/store/null_column.h index 5a507a90bc1..5b79d87c4c0 100644 --- a/src/include/storage/store/null_column.h +++ b/src/include/storage/store/null_column.h @@ -44,20 +44,19 @@ class NullColumn final : public Column { ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues) override; bool canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, - const offset_to_row_idx_t& updateInfo) override; + const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) override; bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t srcOffset) override; void commitLocalChunkInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override; private: - bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, - const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo); + bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, const ChunkCollection& localChunk, + const offset_to_row_idx_t& writeInfo); std::unique_ptr getEmptyChunkForCommit(uint64_t capacity) override { return ColumnChunkFactory::createNullColumnChunk(enableCompression, capacity); } diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index 305ca0d7399..903b91810d8 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -71,7 +71,7 @@ class RelTable final : public Table { bwdRelTableData->getColumn(columnID); } - inline void append(NodeGroup* nodeGroup, common::RelDataDirection direction) { + inline void append(ChunkedNodeGroup* nodeGroup, common::RelDataDirection direction) { direction == common::RelDataDirection::FWD ? fwdRelTableData->append(nodeGroup) : bwdRelTableData->append(nodeGroup); } diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index dd37d955fa6..2ddb88e0439 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -18,7 +18,7 @@ struct RelDataReadState : public TableReadState { common::offset_t posInCurrentCSR; std::vector csrListEntries; // Temp auxiliary data structure to scan the offset of each CSR node in the offset column chunk. - CSRHeaderChunks csrHeaderChunks = CSRHeaderChunks(false /*enableCompression*/); + ChunkedCSRHeader csrHeaderChunks = ChunkedCSRHeader(false /*enableCompression*/); // Following fields are used for local storage. bool readFromLocalStorage; @@ -44,12 +44,12 @@ struct CSRHeaderColumns { std::unique_ptr length; inline void scan(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, - CSRHeaderChunks& chunks) const { + ChunkedCSRHeader& chunks) const { offset->scan(transaction, nodeGroupIdx, chunks.offset.get()); length->scan(transaction, nodeGroupIdx, chunks.length.get()); } inline void append( - const CSRHeaderChunks& headerChunks, common::node_group_idx_t nodeGroupIdx) const { + const ChunkedCSRHeader& headerChunks, common::node_group_idx_t nodeGroupIdx) const { offset->append(headerChunks.offset.get(), nodeGroupIdx); length->append(headerChunks.length.get(), nodeGroupIdx); } @@ -98,20 +98,20 @@ class RelsStoreStats; class RelTableData final : public TableData { public: struct PersistentState { - CSRHeaderChunks header; + ChunkedCSRHeader header; std::unique_ptr relIDChunk; common::offset_t leftCSROffset = common::INVALID_OFFSET; common::offset_t rightCSROffset = common::INVALID_OFFSET; explicit PersistentState(common::offset_t numNodes) { - header = CSRHeaderChunks(false /*enableCompression*/, numNodes); + header = ChunkedCSRHeader(false /*enableCompression*/, numNodes); } }; struct LocalState { public: LocalRelNG* localNG; - CSRHeaderChunks header; + ChunkedCSRHeader header; PackedCSRRegion region; std::vector sizeChangesPerSegment; std::vector hasChangesPerSegment; @@ -155,7 +155,7 @@ class RelTableData final : public TableData { transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector) const; bool checkIfNodeHasRels( transaction::Transaction* transaction, common::offset_t nodeOffset) const; - void append(NodeGroup* nodeGroup) override; + void append(ChunkedNodeGroup* nodeGroup) override; inline Column* getNbrIDColumn() const { return columns[NBR_ID_COLUMN_ID].get(); } inline Column* getCSROffsetColumn() const { return csrHeaderColumns.offset.get(); } @@ -174,13 +174,13 @@ class RelTableData final : public TableData { private: static common::offset_t getMaxNumNodesInRegion( - const CSRHeaderChunks& header, const PackedCSRRegion& region, const LocalRelNG* localNG); + const ChunkedCSRHeader& header, const PackedCSRRegion& region, const LocalRelNG* localNG); std::vector findRegions( - const CSRHeaderChunks& headerChunks, LocalState& localState); - common::length_t getNewRegionSize(const CSRHeaderChunks& header, + const ChunkedCSRHeader& headerChunks, LocalState& localState); + common::length_t getNewRegionSize(const ChunkedCSRHeader& header, const std::vector& sizeChangesPerSegment, PackedCSRRegion& region); - bool isWithinDensityBound(const CSRHeaderChunks& headerChunks, + bool isWithinDensityBound(const ChunkedCSRHeader& headerChunks, const std::vector& sizeChangesPerSegment, PackedCSRRegion& region); double getHighDensity(uint64_t level) const; @@ -190,7 +190,7 @@ class RelTableData final : public TableData { void updateCSRHeader(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, PersistentState& persistentState, LocalState& localState); - void distributeOffsets(const CSRHeaderChunks& header, LocalState& localState, + void distributeOffsets(const ChunkedCSRHeader& header, LocalState& localState, common::offset_t leftBoundary, common::offset_t rightBoundary); void updateRegion(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, PersistentState& persistentState, LocalState& localState); @@ -211,9 +211,9 @@ class RelTableData final : public TableData { LocalState& localState, uint64_t numValuesToInsert); void applyUpdatesToChunk(const PersistentState& persistentState, LocalState& localState, - const LocalVectorCollection& localChunk, ColumnChunk* chunk, common::column_id_t columnID); + const ChunkCollection& localChunk, ColumnChunk* chunk, common::column_id_t columnID); void applyInsertionsToChunk(const PersistentState& persistentState, - const LocalState& localState, const LocalVectorCollection& localChunk, ColumnChunk* chunk); + const LocalState& localState, const ChunkCollection& localChunk, ColumnChunk* chunk); void applyDeletionsToChunk( const PersistentState& persistentState, const LocalState& localState, ColumnChunk* chunk); diff --git a/src/include/storage/store/string_column.h b/src/include/storage/store/string_column.h index 4b1eff6a8ae..3edf4f51328 100644 --- a/src/include/storage/store/string_column.h +++ b/src/include/storage/store/string_column.h @@ -49,8 +49,8 @@ class StringColumn final : public Column { private: bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) override; bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, @@ -60,7 +60,7 @@ class StringColumn final : public Column { common::node_group_idx_t nodeGroupIdx, uint64_t numStrings, common::offset_t maxOffset); bool checkUpdateInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localChunk, const offset_to_row_idx_t& writeInfo); private: diff --git a/src/include/storage/store/string_column_chunk.h b/src/include/storage/store/string_column_chunk.h index a08dd04e929..88ad3028727 100644 --- a/src/include/storage/store/string_column_chunk.h +++ b/src/include/storage/store/string_column_chunk.h @@ -9,7 +9,7 @@ namespace kuzu { namespace storage { -class StringColumnChunk : public ColumnChunk { +class StringColumnChunk final : public ColumnChunk { public: StringColumnChunk( common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); @@ -17,15 +17,19 @@ class StringColumnChunk : public ColumnChunk { void resetToEmpty() final; void append(common::ValueVector* vector, common::SelectionVector& selVector) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, - uint32_t numValuesToAppend) final; + uint32_t numValuesToAppend) override; + + void lookup(common::offset_t offsetInChunk, common::ValueVector& output, + common::sel_t posInOutputVector) const override; void write(common::ValueVector* vector, common::offset_t offsetInVector, - common::offset_t offsetInChunk) final; - void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; + common::offset_t offsetInChunk) override; + void write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) override; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, - common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) final; + common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; template T getValue(common::offset_t /*pos*/) const { @@ -40,7 +44,7 @@ class StringColumnChunk : public ColumnChunk { inline DictionaryChunk& getDictionaryChunk() { return *dictionaryChunk; } inline const DictionaryChunk& getDictionaryChunk() const { return *dictionaryChunk; } - void finalize() final; + void finalize() override; private: void appendStringColumnChunk(StringColumnChunk* other, common::offset_t startPosInOtherChunk, diff --git a/src/include/storage/store/struct_column.h b/src/include/storage/store/struct_column.h index 613dfff7c96..5827275afa0 100644 --- a/src/include/storage/store/struct_column.h +++ b/src/include/storage/store/struct_column.h @@ -34,8 +34,8 @@ class StructColumn final : public Column { ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues) override; void prepareCommitForChunk(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override; void prepareCommitForChunk(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, @@ -48,13 +48,17 @@ class StructColumn final : public Column { common::ValueVector* resultVector) override; bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunk, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) override; bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, common::offset_t dataOffset) override; +private: + static ChunkCollection getStructChildChunkCollection( + const ChunkCollection& chunkCollection, common::vector_idx_t childIdx); + private: std::vector> childColumns; }; diff --git a/src/include/storage/store/struct_column_chunk.h b/src/include/storage/store/struct_column_chunk.h index 508efd80412..69054aac7a4 100644 --- a/src/include/storage/store/struct_column_chunk.h +++ b/src/include/storage/store/struct_column_chunk.h @@ -8,7 +8,7 @@ namespace kuzu { namespace storage { -class StructColumnChunk : public ColumnChunk { +class StructColumnChunk final : public ColumnChunk { public: StructColumnChunk( common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); @@ -18,24 +18,28 @@ class StructColumnChunk : public ColumnChunk { return childChunks[childIdx].get(); } - void finalize() final; + void finalize() override; protected: void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final; void append(common::ValueVector* vector, common::SelectionVector& selVector) final; + void lookup(common::offset_t offsetInChunk, common::ValueVector& output, + common::sel_t posInOutputVector) const override; + void write(common::ValueVector* vector, common::offset_t offsetInVector, - common::offset_t offsetInChunk) final; - void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; + common::offset_t offsetInChunk) override; + void write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) override; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; - void resize(uint64_t newCapacity) final; + void resize(uint64_t newCapacity) override; - void resetToEmpty() final; + void resetToEmpty() override; bool numValuesSanityCheck() const override; diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index c9ba360cb39..10beea3fa5a 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -24,7 +24,7 @@ class TableData { common::ValueVector* nodeIDVector, const std::vector& outputVectors) = 0; - virtual void append(NodeGroup* nodeGroup) = 0; + virtual void append(ChunkedNodeGroup* nodeGroup) = 0; inline void dropColumn(common::column_id_t columnID) { columns.erase(columns.begin() + columnID); diff --git a/src/include/storage/store/var_list_column.h b/src/include/storage/store/var_list_column.h index 186ee43c7ff..8fdef63e785 100644 --- a/src/include/storage/store/var_list_column.h +++ b/src/include/storage/store/var_list_column.h @@ -83,7 +83,7 @@ class VarListColumn : public Column { common::ValueVector* offsetVector, const ListOffsetInfoInStorage& listOffsetInfoInStorage); inline bool canCommitInPlace(transaction::Transaction*, common::node_group_idx_t, - const LocalVectorCollection&, const offset_to_row_idx_t&, const LocalVectorCollection&, + const ChunkCollection&, const offset_to_row_idx_t&, const ChunkCollection&, const offset_to_row_idx_t&) override { // Always perform out-of-place commit for VAR_LIST columns. return false; diff --git a/src/include/storage/store/var_list_column_chunk.h b/src/include/storage/store/var_list_column_chunk.h index 15077ab3639..3790334cdba 100644 --- a/src/include/storage/store/var_list_column_chunk.h +++ b/src/include/storage/store/var_list_column_chunk.h @@ -25,7 +25,7 @@ struct VarListDataColumnChunk { inline uint64_t getNumValues() const { return dataColumnChunk->getNumValues(); } }; -class VarListColumnChunk : public ColumnChunk { +class VarListColumnChunk final : public ColumnChunk { public: VarListColumnChunk( @@ -35,23 +35,28 @@ class VarListColumnChunk : public ColumnChunk { return varListDataColumnChunk->dataColumnChunk.get(); } - void resetToEmpty() final; + void resetToEmpty() override; void append(common::ValueVector* vector, common::SelectionVector& selVector) final; + + void lookup(common::offset_t offsetInChunk, common::ValueVector& output, + common::sel_t posInOutputVector) const override; + // Note: `write` assumes that no `append` will be called afterward. void write(common::ValueVector* vector, common::offset_t offsetInVector, - common::offset_t offsetInChunk) final; - void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) final; + common::offset_t offsetInChunk) override; + void write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) override; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, - common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) final; + common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; inline void resizeDataColumnChunk(uint64_t numValues) { varListDataColumnChunk->resizeBuffer(numValues); } - void finalize() final; + void finalize() override; inline common::offset_t getListOffset(common::offset_t offset) const { return offset == 0 ? 0 : getValue(offset - 1); @@ -62,7 +67,7 @@ class VarListColumnChunk : public ColumnChunk { private: void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, - uint32_t numValuesToAppend) final; + uint32_t numValuesToAppend) override; inline void initializeIndices() { indicesColumnChunk = ColumnChunkFactory::createColumnChunk( diff --git a/src/include/transaction/transaction.h b/src/include/transaction/transaction.h index 2088ffb457a..f23bd14f09a 100644 --- a/src/include/transaction/transaction.h +++ b/src/include/transaction/transaction.h @@ -7,7 +7,6 @@ namespace kuzu { namespace storage { class LocalStorage; -class MemoryManager; } // namespace storage namespace transaction { class TransactionManager; @@ -19,9 +18,9 @@ class Transaction { friend class TransactionManager; public: - Transaction(TransactionType transactionType, uint64_t transactionID, storage::MemoryManager* mm) + Transaction(TransactionType transactionType, uint64_t transactionID) : type{transactionType}, ID{transactionID} { - localStorage = std::make_unique(mm); + localStorage = std::make_unique(); } constexpr explicit Transaction(TransactionType transactionType) noexcept diff --git a/src/include/transaction/transaction_manager.h b/src/include/transaction/transaction_manager.h index eea9a340b9c..99dc0941c97 100644 --- a/src/include/transaction/transaction_manager.h +++ b/src/include/transaction/transaction_manager.h @@ -15,9 +15,8 @@ namespace transaction { class TransactionManager { public: - explicit TransactionManager(storage::WAL& wal, storage::MemoryManager* mm) - : wal{wal}, mm{mm}, activeWriteTransactionID{INT64_MAX}, lastTransactionID{0}, lastCommitID{ - 0} {}; + explicit TransactionManager(storage::WAL& wal) + : wal{wal}, activeWriteTransactionID{INT64_MAX}, lastTransactionID{0}, lastCommitID{0} {}; std::unique_ptr beginWriteTransaction(); std::unique_ptr beginReadOnlyTransaction(); void commit(Transaction* transaction); @@ -61,7 +60,6 @@ class TransactionManager { private: storage::WAL& wal; - storage::MemoryManager* mm; uint64_t activeWriteTransactionID; diff --git a/src/main/database.cpp b/src/main/database.cpp index 8aabd21cf40..931065f11e3 100644 --- a/src/main/database.cpp +++ b/src/main/database.cpp @@ -87,8 +87,7 @@ Database::Database(std::string_view databasePath, SystemConfig systemConfig) catalog = std::make_unique(wal.get(), vfs.get()); storageManager = std::make_unique(systemConfig.readOnly, *catalog, *memoryManager, wal.get(), systemConfig.enableCompression, vfs.get()); - transactionManager = - std::make_unique(*wal, memoryManager.get()); + transactionManager = std::make_unique(*wal); extensionOptions = std::make_unique(); databaseManager = std::make_unique(); } diff --git a/src/processor/operator/persistent/insert_executor.cpp b/src/processor/operator/persistent/insert_executor.cpp index 7400881cef9..cdccf52dd5f 100644 --- a/src/processor/operator/persistent/insert_executor.cpp +++ b/src/processor/operator/persistent/insert_executor.cpp @@ -124,7 +124,7 @@ void RelInsertExecutor::insert(transaction::Transaction* tx, ExecutionContext* c return; } auto offset = relsStatistics->getNextRelOffset(tx, table->getTableID()); - columnDataVectors[0]->setValue(0, offset); // internal ID property + columnDataVectors[0]->setValue(0, internalID_t{offset, table->getTableID()}); columnDataVectors[0]->setNull(0, false); for (auto i = 1u; i < columnDataEvaluators.size(); ++i) { columnDataEvaluators[i]->evaluate(context->clientContext); diff --git a/src/processor/operator/persistent/node_batch_insert.cpp b/src/processor/operator/persistent/node_batch_insert.cpp index 908d09d3092..e9a3e57f034 100644 --- a/src/processor/operator/persistent/node_batch_insert.cpp +++ b/src/processor/operator/persistent/node_batch_insert.cpp @@ -32,7 +32,7 @@ void NodeBatchInsertSharedState::initPKIndex(kuzu::processor::ExecutionContext* } void NodeBatchInsertSharedState::appendIncompleteNodeGroup( - std::unique_ptr localNodeGroup, std::optional& indexBuilder) { + std::unique_ptr localNodeGroup, std::optional& indexBuilder) { std::unique_lock xLck{mtx}; if (!sharedNodeGroup) { sharedNodeGroup = std::move(localNodeGroup); @@ -129,7 +129,7 @@ void NodeBatchInsert::executeInternal(ExecutionContext* context) { void NodeBatchInsert::writeAndResetNodeGroup(node_group_idx_t nodeGroupIdx, std::optional& indexBuilder, column_id_t pkColumnID, NodeTable* table, - NodeGroup* nodeGroup) { + ChunkedNodeGroup* nodeGroup) { nodeGroup->finalize(nodeGroupIdx); if (indexBuilder) { auto nodeOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index 859fb45fc8c..f96d4bcd85d 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -65,7 +65,8 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { void RelBatchInsert::prepareCSRNodeGroup(PartitioningBuffer::Partition& partition, common::offset_t startNodeOffset, vector_idx_t offsetVectorIdx, offset_t numNodes) { auto relInfo = ku_dynamic_cast(info.get()); - auto csrNodeGroup = ku_dynamic_cast(localState->nodeGroup.get()); + auto csrNodeGroup = + ku_dynamic_cast(localState->nodeGroup.get()); auto& csrHeader = csrNodeGroup->getCSRHeader(); csrHeader.setNumValues(numNodes); // Populate start csr offsets and lengths for each node. @@ -88,7 +89,7 @@ void RelBatchInsert::prepareCSRNodeGroup(PartitioningBuffer::Partition& partitio } void RelBatchInsert::populateEndCSROffsets( - CSRHeaderChunks& csrHeader, std::vector& gaps) { + ChunkedCSRHeader& csrHeader, std::vector& gaps) { auto csrOffsets = (offset_t*)csrHeader.offset->getData(); for (auto i = 0u; i < csrHeader.offset->getNumValues(); i++) { csrOffsets[i] += gaps[i]; @@ -104,7 +105,7 @@ length_t RelBatchInsert::getGapSize(length_t length) { length; } -std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(CSRHeaderChunks& csrHeader, +std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(ChunkedCSRHeader& csrHeader, offset_t numNodes, PartitioningBuffer::Partition& partition, vector_idx_t offsetVectorIdx) { KU_ASSERT(numNodes == csrHeader.length->getNumValues() && numNodes == csrHeader.offset->getNumValues()); @@ -154,7 +155,7 @@ void RelBatchInsert::setOffsetFromCSROffsets( } std::optional RelBatchInsert::checkRelMultiplicityConstraint( - const storage::CSRHeaderChunks& csrHeader) { + const storage::ChunkedCSRHeader& csrHeader) { auto relInfo = ku_dynamic_cast(info.get()); auto relTableEntry = ku_dynamic_cast( diff --git a/src/storage/local_storage/local_node_table.cpp b/src/storage/local_storage/local_node_table.cpp index 543cbb78f47..6b97a823e3b 100644 --- a/src/storage/local_storage/local_node_table.cpp +++ b/src/storage/local_storage/local_node_table.cpp @@ -128,8 +128,7 @@ LocalNodeGroup* LocalNodeTableData::getOrCreateLocalNodeGroup(common::ValueVecto auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(nodeOffset); if (!nodeGroups.contains(nodeGroupIdx)) { auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); - nodeGroups[nodeGroupIdx] = - std::make_unique(nodeGroupStartOffset, dataTypes, mm); + nodeGroups[nodeGroupIdx] = std::make_unique(nodeGroupStartOffset, dataTypes); } return nodeGroups.at(nodeGroupIdx).get(); } diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index 7f40321acb8..be00019977c 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -7,9 +7,9 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -LocalRelNG::LocalRelNG(offset_t nodeGroupStartOffset, std::vector dataTypes, - MemoryManager* mm, RelMultiplicity multiplicity) - : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes), mm}, multiplicity{multiplicity} {} +LocalRelNG::LocalRelNG( + offset_t nodeGroupStartOffset, std::vector dataTypes, RelMultiplicity multiplicity) + : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes)}, multiplicity{multiplicity} {} row_idx_t LocalRelNG::scanCSR(offset_t srcOffsetInChunk, offset_t posToReadForOffset, const std::vector& columnIDs, const std::vector& outputVectors) { @@ -201,7 +201,7 @@ LocalNodeGroup* LocalRelTableData::getOrCreateLocalNodeGroup(ValueVector* nodeID if (!nodeGroups.contains(nodeGroupIdx)) { auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); nodeGroups[nodeGroupIdx] = - std::make_unique(nodeGroupStartOffset, dataTypes, mm, multiplicity); + std::make_unique(nodeGroupStartOffset, dataTypes, multiplicity); } return nodeGroups.at(nodeGroupIdx).get(); } diff --git a/src/storage/local_storage/local_storage.cpp b/src/storage/local_storage/local_storage.cpp index 1b06bd581dd..ca644b36f1a 100644 --- a/src/storage/local_storage/local_storage.cpp +++ b/src/storage/local_storage/local_storage.cpp @@ -9,15 +9,13 @@ using namespace kuzu::transaction; namespace kuzu { namespace storage { -LocalStorage::LocalStorage(MemoryManager* mm) : mm{mm} {} - LocalTableData* LocalStorage::getOrCreateLocalTableData(common::table_id_t tableID, const std::vector>& columns, TableType tableType, common::vector_idx_t dataIdx, RelMultiplicity multiplicity) { if (!tables.contains(tableID)) { tables[tableID] = std::make_unique(tableType); } - return tables.at(tableID)->getOrCreateLocalTableData(columns, mm, dataIdx, multiplicity); + return tables.at(tableID)->getOrCreateLocalTableData(columns, dataIdx, multiplicity); } LocalTable* LocalStorage::getLocalTable(table_id_t tableID) { diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index d44ba287442..d07cf36bca9 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -3,29 +3,21 @@ #include "storage/local_storage/local_node_table.h" #include "storage/local_storage/local_rel_table.h" #include "storage/store/column.h" +#include "storage/store/node_group.h" using namespace kuzu::common; namespace kuzu { namespace storage { -LocalVectorCollection LocalVectorCollection::getStructChildVectorCollection( - struct_field_idx_t idx) const { - LocalVectorCollection childCollection; - for (auto vector : vectors) { - auto fieldVector = StructVector::getFieldVector(vector, idx).get(); - childCollection.vectors.push_back(fieldVector); - } - return childCollection; -} - LocalNodeGroup::LocalNodeGroup( - offset_t nodeGroupStartOffset, std::vector dataTypes, MemoryManager* mm) - : nodeGroupStartOffset{nodeGroupStartOffset}, insertChunks{mm, LogicalType::copy(dataTypes)} { + offset_t nodeGroupStartOffset, const std::vector& dataTypes) + : nodeGroupStartOffset{nodeGroupStartOffset}, insertChunks{LogicalType::copy(dataTypes)} { + updateChunks.reserve(dataTypes.size()); for (auto i = 0u; i < dataTypes.size(); i++) { std::vector chunkCollectionTypes; - chunkCollectionTypes.push_back(*dataTypes[i]->copy()); - LocalDataChunkCollection localDataChunkCollection(mm, std::move(chunkCollectionTypes)); + chunkCollectionTypes.push_back(*dataTypes[i].copy()); + LocalChunkedGroupCollection localDataChunkCollection(std::move(chunkCollectionTypes)); updateChunks.push_back(std::move(localDataChunkCollection)); } } @@ -42,16 +34,14 @@ bool LocalNodeGroup::hasUpdatesOrDeletions() const { return false; } -void LocalDataChunkCollection::readValueAtRowIdx( - row_idx_t rowIdx, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { - outputVector->copyFromVectorData(posInOutputVector, - dataChunkCollection.getChunkUnsafe(rowIdx >> DEFAULT_VECTOR_CAPACITY_LOG_2) - .getValueVector(columnID) - .get(), - rowIdx % DEFAULT_VECTOR_CAPACITY); +void LocalChunkedGroupCollection::readValueAtRowIdx(row_idx_t rowIdx, column_id_t columnID, + ValueVector* outputVector, sel_t posInOutputVector) const { + auto [chunkIdx, offsetInChunk] = getChunkIdxAndOffsetInChunk(rowIdx); + auto& chunk = chunkedGroups.getChunkedGroup(chunkIdx)->getColumnChunk(columnID); + chunk.lookup(offsetInChunk, *outputVector, posInOutputVector); } -bool LocalDataChunkCollection::read( +bool LocalChunkedGroupCollection::read( offset_t offset, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { if (!offsetToRowIdx.contains(offset)) { return false; @@ -61,17 +51,17 @@ bool LocalDataChunkCollection::read( return true; } -void LocalDataChunkCollection::update( +void LocalChunkedGroupCollection::update( offset_t offset, column_id_t columnID, ValueVector* propertyVector) { KU_ASSERT(offsetToRowIdx.contains(offset)); auto rowIdx = offsetToRowIdx.at(offset); - dataChunkCollection.getChunkUnsafe(rowIdx >> DEFAULT_VECTOR_CAPACITY_LOG_2) - .getValueVector(columnID) - ->copyFromVectorData(rowIdx % DEFAULT_VECTOR_CAPACITY, propertyVector, - propertyVector->state->selVector->selectedPositions[0]); + auto [chunkIdx, offsetInChunk] = getChunkIdxAndOffsetInChunk(rowIdx); + auto chunk = chunkedGroups.getChunkedGroupUnsafe(chunkIdx)->getColumnChunkUnsafe(columnID); + chunk->write( + propertyVector, propertyVector->state->selVector->selectedPositions[0], offsetInChunk); } -void LocalDataChunkCollection::remove(offset_t srcNodeOffset, offset_t relOffset) { +void LocalChunkedGroupCollection::remove(offset_t srcNodeOffset, offset_t relOffset) { KU_ASSERT(srcNodeOffsetToRelOffsets.contains(srcNodeOffset)); remove(relOffset); offsetToRowIdx.erase(relOffset); @@ -82,39 +72,23 @@ void LocalDataChunkCollection::remove(offset_t srcNodeOffset, offset_t relOffset } } -row_idx_t LocalDataChunkCollection::appendToDataChunkCollection(std::vector vectors) { +row_idx_t LocalChunkedGroupCollection::append(std::vector vectors) { KU_ASSERT(vectors.size() == dataTypes.size()); - if (dataChunkCollection.getNumChunks() == 0 || - dataChunkCollection.getChunkUnsafe(dataChunkCollection.getNumChunks() - 1) - .state->selVector->selectedSize == DEFAULT_VECTOR_CAPACITY) { - dataChunkCollection.merge(createNewDataChunk()); + if (chunkedGroups.getNumChunks() == 0 || + chunkedGroups.getChunkedGroup(chunkedGroups.getNumChunks() - 1)->getNumRows() == + CHUNK_CAPACITY) { + chunkedGroups.append(std::make_unique( + dataTypes, false /*enableCompression*/, CHUNK_CAPACITY)); } - auto& lastDataChunk = - dataChunkCollection.getChunkUnsafe(dataChunkCollection.getNumChunks() - 1); + auto lastChunkGroup = chunkedGroups.getChunkedGroupUnsafe(chunkedGroups.getNumChunks() - 1); for (auto i = 0u; i < vectors.size(); i++) { - auto localVector = lastDataChunk.getValueVector(i); KU_ASSERT(vectors[i]->state->selVector->selectedSize == 1); - auto pos = vectors[i]->state->selVector->selectedPositions[0]; - localVector->copyFromVectorData( - lastDataChunk.state->selVector->selectedSize, vectors[i], pos); + lastChunkGroup->getColumnChunkUnsafe(i)->append(vectors[i], *vectors[i]->state->selVector); } - lastDataChunk.state->selVector->selectedSize++; - KU_ASSERT((dataChunkCollection.getNumChunks() - 1) * DEFAULT_VECTOR_CAPACITY + - lastDataChunk.state->selVector->selectedSize == - numRows + 1); + lastChunkGroup->setNumValues(lastChunkGroup->getNumRows() + 1); return numRows++; } -common::DataChunk LocalDataChunkCollection::createNewDataChunk() { - DataChunk newDataChunk(dataTypes.size()); - for (auto i = 0u; i < dataTypes.size(); i++) { - auto valueVector = std::make_unique(dataTypes[i], mm); - newDataChunk.insert(i, std::move(valueVector)); - } - newDataChunk.state->selVector->resetSelectorToValuePosBuffer(); - return newDataChunk; -} - bool LocalTableData::insert( std::vector nodeIDVectors, std::vector propertyVectors) { KU_ASSERT(nodeIDVectors.size() >= 1); @@ -135,25 +109,25 @@ bool LocalTableData::delete_(ValueVector* nodeIDVector, ValueVector* extraVector } LocalTableData* LocalTable::getOrCreateLocalTableData( - const std::vector>& columns, MemoryManager* mm, vector_idx_t dataIdx, + const std::vector>& columns, vector_idx_t dataIdx, RelMultiplicity multiplicity) { if (localTableDataCollection.empty()) { - std::vector dataTypes; + std::vector dataTypes; dataTypes.reserve(columns.size()); for (auto& column : columns) { - dataTypes.push_back(&column->getDataType()); + dataTypes.push_back(column->getDataType()); } switch (tableType) { case TableType::NODE: { localTableDataCollection.reserve(1); localTableDataCollection.push_back( - std::make_unique(std::move(dataTypes), mm)); + std::make_unique(std::move(dataTypes))); } break; case TableType::REL: { KU_ASSERT(dataIdx < 2); localTableDataCollection.resize(2); localTableDataCollection[dataIdx] = - std::make_unique(multiplicity, std::move(dataTypes), mm); + std::make_unique(multiplicity, std::move(dataTypes)); } break; default: { KU_UNREACHABLE; @@ -163,13 +137,13 @@ LocalTableData* LocalTable::getOrCreateLocalTableData( KU_ASSERT(dataIdx < localTableDataCollection.size()); if (!localTableDataCollection[dataIdx]) { KU_ASSERT(tableType == TableType::REL); - std::vector dataTypes; + std::vector dataTypes; dataTypes.reserve(columns.size()); for (auto& column : columns) { - dataTypes.push_back(&column->getDataType()); + dataTypes.push_back(column->getDataType()); } localTableDataCollection[dataIdx] = - std::make_unique(multiplicity, std::move(dataTypes), mm); + std::make_unique(multiplicity, std::move(dataTypes)); } KU_ASSERT(localTableDataCollection[dataIdx] != nullptr); return localTableDataCollection[dataIdx].get(); diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 9cb07d376ff..3528156c1c6 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -122,8 +122,8 @@ class SerialColumn final : public Column { } } - bool canCommitInPlace(Transaction*, node_group_idx_t, const LocalVectorCollection&, - const offset_to_row_idx_t&, const LocalVectorCollection&, + bool canCommitInPlace(Transaction*, node_group_idx_t, const ChunkCollection&, + const offset_to_row_idx_t&, const ChunkCollection&, const offset_to_row_idx_t& updateInfo) override { (void)updateInfo; // Avoid unused parameter warnings during release build. KU_ASSERT(updateInfo.empty()); @@ -140,9 +140,8 @@ class SerialColumn final : public Column { } void commitLocalChunkInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& /*localChunk*/, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection&, const offset_to_row_idx_t& updateInfo, - const offset_set_t& deleteInfo) override { + const ChunkCollection&, const offset_to_row_idx_t& insertInfo, const ChunkCollection&, + const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override { // Avoid unused parameter warnings during release build. (void)updateInfo; (void)deleteInfo; @@ -161,8 +160,8 @@ class SerialColumn final : public Column { } void commitLocalChunkOutOfPlace(Transaction* /*transaction*/, node_group_idx_t nodeGroupIdx, - bool isNewNodeGroup, const LocalVectorCollection&, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection&, const offset_to_row_idx_t& updateInfo, + bool isNewNodeGroup, const ChunkCollection&, const offset_to_row_idx_t& insertInfo, + const ChunkCollection&, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override { // Avoid unused parameter warnings during release build. (void)isNewNodeGroup; @@ -582,43 +581,46 @@ Column::ReadState Column::getReadState( } void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; if (isNewNodeGroup) { // If this is a new node group, updateInfo should be empty. We should perform out-of-place // commit with a new column chunk. - commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunk, - insertInfo, localUpdateChunk, updateInfo, deleteInfo); + commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunks, + insertInfo, localUpdateChunks, updateInfo, deleteInfo); } else { bool didInPlaceCommit = false; // If this is not a new node group, we should first check if we can perform in-place commit. - if (canCommitInPlace(transaction, nodeGroupIdx, localInsertChunk, insertInfo, - localUpdateChunk, updateInfo)) { - commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunk, insertInfo, - localUpdateChunk, updateInfo, deleteInfo); + if (canCommitInPlace(transaction, nodeGroupIdx, localInsertChunks, insertInfo, + localUpdateChunks, updateInfo)) { + commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunks, insertInfo, + localUpdateChunks, updateInfo, deleteInfo); didInPlaceCommit = true; } else { - commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunk, - insertInfo, localUpdateChunk, updateInfo, deleteInfo); + commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunks, + insertInfo, localUpdateChunks, updateInfo, deleteInfo); } // TODO(Guodong/Ben): The logic here on NullColumn is confusing as out-of-place commits and // in-place commits handle it differently. See if we can unify them. if (nullColumn) { // Uses functions written for the null chunk which only access the localColumnChunk's // null information - if (nullColumn->canCommitInPlace(transaction, nodeGroupIdx, localInsertChunk, - insertInfo, localUpdateChunk, updateInfo)) { - nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunk, - insertInfo, localUpdateChunk, updateInfo, deleteInfo); + if (nullColumn->canCommitInPlace(transaction, nodeGroupIdx, + getNullChunkCollection(localInsertChunks), insertInfo, + getNullChunkCollection(localUpdateChunks), updateInfo)) { + nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, + getNullChunkCollection(localInsertChunks), insertInfo, + getNullChunkCollection(localUpdateChunks), updateInfo, deleteInfo); } else if (didInPlaceCommit) { // Out-of-place commits also commit the null chunk out of place, // so we only need to do a separate out of place commit for the null chunk if the // main chunk did an in-place commit. nullColumn->commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, - localInsertChunk, insertInfo, localUpdateChunk, updateInfo, deleteInfo); + getNullChunkCollection(localInsertChunks), insertInfo, + getNullChunkCollection(localUpdateChunks), updateInfo, deleteInfo); } } } @@ -678,20 +680,20 @@ bool Column::isMaxOffsetOutOfPagesCapacity( } bool Column::checkUpdateInPlace(const ColumnChunkMetadata& metadata, - const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo) { + const ChunkCollection& localChunks, const offset_to_row_idx_t& writeInfo) { std::vector rowIdxesToRead; for (auto& [_, rowIdx] : writeInfo) { rowIdxesToRead.push_back(rowIdx); } std::sort(rowIdxesToRead.begin(), rowIdxesToRead.end()); for (auto rowIdx : rowIdxesToRead) { - auto localVector = localChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - if (localVector->isNull(offsetInVector)) { + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + if (localChunks[chunkIdx]->getNullChunk()->isNull(offsetInLocalChunk)) { continue; } if (!metadata.compMeta.canUpdateInPlace( - localVector->getData(), offsetInVector, dataType.getPhysicalType())) { + localChunks[chunkIdx]->getData(), offsetInLocalChunk, dataType.getPhysicalType())) { return false; } } @@ -699,8 +701,8 @@ bool Column::checkUpdateInPlace(const ColumnChunkMetadata& metadata, } bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { + const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo) { auto metadata = getMetadata(nodeGroupIdx, transaction->getType()); if (isInsertionsOutOfPagesCapacity(metadata, insertInfo)) { return false; @@ -708,8 +710,8 @@ bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGro if (metadata.compMeta.canAlwaysUpdateInPlace()) { return true; } - return checkUpdateInPlace(metadata, localInsertChunk, insertInfo) && - checkUpdateInPlace(metadata, localUpdateChunk, updateInfo); + return checkUpdateInPlace(metadata, localInsertChunks, insertInfo) && + checkUpdateInPlace(metadata, localUpdateChunks, updateInfo); } bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -733,11 +735,11 @@ bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGro } void Column::commitLocalChunkInPlace(Transaction* /*transaction*/, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& /*deleteInfo*/) { - applyLocalChunkToColumn(nodeGroupIdx, localUpdateChunk, updateInfo); - applyLocalChunkToColumn(nodeGroupIdx, localInsertChunk, insertInfo); + applyLocalChunkToColumn(nodeGroupIdx, localUpdateChunks, updateInfo); + applyLocalChunkToColumn(nodeGroupIdx, localInsertChunks, insertInfo); } std::unique_ptr Column::getEmptyChunkForCommit(uint64_t capacity) { @@ -745,21 +747,21 @@ std::unique_ptr Column::getEmptyChunkForCommit(uint64_t capacity) { } void Column::commitLocalChunkOutOfPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - bool isNewNodeGroup, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + bool isNewNodeGroup, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { auto columnChunk = getEmptyChunkForCommit(common::StorageConstants::NODE_GROUP_SIZE); if (isNewNodeGroup) { KU_ASSERT(updateInfo.empty() && deleteInfo.empty()); // Apply inserts from the local chunk. - applyLocalChunkToColumnChunk(localInsertChunk, columnChunk.get(), insertInfo); + applyLocalChunkToColumnChunk(localInsertChunks, columnChunk.get(), insertInfo); } else { // First, scan the whole column chunk from persistent storage. scan(transaction, nodeGroupIdx, columnChunk.get()); // Then, apply updates from the local chunk. - applyLocalChunkToColumnChunk(localUpdateChunk, columnChunk.get(), updateInfo); + applyLocalChunkToColumnChunk(localUpdateChunks, columnChunk.get(), updateInfo); // Lastly, apply inserts from the local chunk. - applyLocalChunkToColumnChunk(localInsertChunk, columnChunk.get(), insertInfo); + applyLocalChunkToColumnChunk(localInsertChunks, columnChunk.get(), insertInfo); if (columnChunk->getNullChunk()) { // Set nulls based on deleteInfo. for (auto offsetInChunk : deleteInfo) { @@ -798,23 +800,24 @@ void Column::commitColumnChunkOutOfPlace(Transaction* transaction, node_group_id } } -void Column::applyLocalChunkToColumnChunk(const LocalVectorCollection& localChunk, +void Column::applyLocalChunkToColumnChunk(const ChunkCollection& localChunks, ColumnChunk* columnChunk, const offset_to_row_idx_t& updateInfo) { - for (auto& [offsetInChunk, rowIdx] : updateInfo) { - auto localVector = localChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - localVector->state->selVector->selectedPositions[0] = offsetInVector; - columnChunk->write(localVector, offsetInVector, offsetInChunk); + for (auto& [offsetInDstChunk, rowIdx] : updateInfo) { + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + columnChunk->write( + localChunks[chunkIdx], offsetInLocalChunk, offsetInDstChunk, 1 /* numValues */); } } void Column::applyLocalChunkToColumn(node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localChunk, const offset_to_row_idx_t& updateInfo) { - for (auto& [offsetInChunk, rowIdx] : updateInfo) { - auto localVector = localChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - if (!localVector->isNull(offsetInVector)) { - write(nodeGroupIdx, offsetInChunk, localVector, offsetInVector); + const ChunkCollection& localChunks, const offset_to_row_idx_t& updateInfo) { + for (auto& [offsetInDstChunk, rowIdx] : updateInfo) { + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + if (!localChunks[chunkIdx]->getNullChunk()->isNull(offsetInLocalChunk)) { + write(nodeGroupIdx, offsetInDstChunk, localChunks[chunkIdx], offsetInLocalChunk, + 1 /*numValues*/); } } } @@ -864,6 +867,14 @@ PageCursor Column::getPageCursorForOffset( return getPageCursorForOffsetInGroup(offsetInChunk, state); } +ChunkCollection Column::getNullChunkCollection(const ChunkCollection& chunkCollection) { + ChunkCollection nullChunkCollection; + for (const auto& chunk : chunkCollection) { + nullChunkCollection.push_back(chunk->getNullChunk()); + } + return nullChunkCollection; +} + std::unique_ptr ColumnFactory::createColumn(std::string name, LogicalType dataType, const MetadataDAHInfo& metaDAHeaderInfo, BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction, diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 2142f5362c5..dcea4fb697f 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -227,14 +227,24 @@ void ColumnChunk::append( numValues += numValuesToAppend; } -void ColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) { +void ColumnChunk::lookup( + offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { + KU_ASSERT(offsetInChunk < capacity); + output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); + if (!output.isNull(posInOutputVector)) { + memcpy(output.getData() + posInOutputVector * numBytesPerValue, + buffer.get() + offsetInChunk * numBytesPerValue, numBytesPerValue); + } +} + +void ColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity multiplicity) { KU_ASSERT(chunk->dataType.getPhysicalType() == dataType.getPhysicalType() && dstOffsets->dataType.getPhysicalType() == PhysicalTypeID::INT64 && chunk->getNumValues() == dstOffsets->getNumValues()); for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto dstOffset = dstOffsets->getValue(i); KU_ASSERT(dstOffset < capacity); - if (!isCSR && !nullChunk->isNull(dstOffset)) { + if (multiplicity == RelMultiplicity::ONE && !nullChunk->isNull(dstOffset)) { throw CopyException(stringFormat("Node with offset: {} can only have one neighbour due " "to the MANY-ONE/ONE-ONE relationship constraint.", dstOffset)); @@ -275,6 +285,9 @@ void ColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset srcChunk->buffer.get() + srcOffsetInChunk * numBytesPerValue, numValuesToCopy * numBytesPerValue); nullChunk->write(srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); + if (dstOffsetInChunk + numValuesToCopy >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy; + } } void ColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, @@ -423,7 +436,18 @@ void BoolColumnChunk::append( numValues += numValuesToAppend; } -void BoolColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) { +void BoolColumnChunk::lookup( + offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { + KU_ASSERT(offsetInChunk < capacity); + output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); + if (!output.isNull(posInOutputVector)) { + output.setValue( + posInOutputVector, NullMask::isNull((uint64_t*)buffer.get(), offsetInChunk)); + } +} + +void BoolColumnChunk::write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && chunk->getNumValues() == dstOffsets->getNumValues()); @@ -455,6 +479,9 @@ void BoolColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, } NullMask::copyNullMask((uint64_t*)static_cast(srcChunk)->buffer.get(), srcOffsetInChunk, (uint64_t*)buffer.get(), dstOffsetInChunk, numValuesToCopy); + if (dstOffsetInChunk + numValuesToCopy >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy + 1; + } } void NullColumnChunk::setNull(offset_t pos, bool isNull) { @@ -481,6 +508,9 @@ void NullColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, } copyFromBuffer((uint64_t*)static_cast(srcChunk)->buffer.get(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); + if (dstOffsetInChunk + numValuesToCopy >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy + 1; + } } void NullColumnChunk::append( @@ -494,7 +524,8 @@ class InternalIDColumnChunk final : public ColumnChunk { public: // Physically, we only materialize offset of INTERNAL_ID, which is same as UINT64, explicit InternalIDColumnChunk(uint64_t capacity) - : ColumnChunk(*LogicalType::INT64(), capacity, false /*enableCompression*/) {} + : ColumnChunk(*LogicalType::INT64(), capacity, false /*enableCompression*/), + commonTableID{INVALID_TABLE_ID} {} void append(ValueVector* vector, common::SelectionVector& selVector) override { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); @@ -505,7 +536,11 @@ class InternalIDColumnChunk final : public ColumnChunk { void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk, common::SelectionVector& selVector) override { auto relIDsInVector = (internalID_t*)vector->getData(); + if (commonTableID == INVALID_TABLE_ID) { + commonTableID = relIDsInVector[selVector.selectedPositions[0]].tableID; + } for (auto i = 0u; i < selVector.selectedSize; i++) { + KU_ASSERT(relIDsInVector[i].tableID == commonTableID); auto pos = selVector.selectedPositions[i]; nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); memcpy(buffer.get() + (startPosInChunk + i) * numBytesPerValue, @@ -513,10 +548,27 @@ class InternalIDColumnChunk final : public ColumnChunk { } } + void lookup( + offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const override { + KU_ASSERT(offsetInChunk < capacity); + output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); + if (!output.isNull(posInOutputVector)) { + auto relID = output.getValue(posInOutputVector); + relID.offset = getValue(offsetInChunk); + KU_ASSERT(commonTableID != INVALID_TABLE_ID); + relID.tableID = commonTableID; + output.setValue(posInOutputVector, relID); + } + } + void write(ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) override { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); nullChunk->setNull(offsetInChunk, vector->isNull(offsetInVector)); auto relIDsInVector = (internalID_t*)vector->getData(); + if (commonTableID == INVALID_TABLE_ID) { + commonTableID = relIDsInVector[offsetInVector].tableID; + } + KU_ASSERT(commonTableID == relIDsInVector[offsetInVector].tableID); if (!vector->isNull(offsetInVector)) { memcpy(buffer.get() + offsetInChunk * numBytesPerValue, &relIDsInVector[offsetInVector].offset, numBytesPerValue); @@ -525,8 +577,12 @@ class InternalIDColumnChunk final : public ColumnChunk { numValues = offsetInChunk + 1; } } + +private: + common::table_id_t commonTableID; }; +// TODO(Guodong): Change the input param `dataType` to PhysicalType. std::unique_ptr ColumnChunkFactory::createColumnChunk( LogicalType dataType, bool enableCompression, uint64_t capacity, bool inMemory) { switch (dataType.getPhysicalType()) { @@ -545,12 +601,9 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( case PhysicalTypeID::DOUBLE: case PhysicalTypeID::FLOAT: case PhysicalTypeID::INTERVAL: { - if (dataType.getLogicalTypeID() == LogicalTypeID::SERIAL) { - return std::make_unique(std::move(dataType), capacity, - false /*enableCompression*/, false /* hasNullChunk */); - } else { - return std::make_unique(std::move(dataType), capacity, enableCompression); - } + // TODO: As we have constant compression, SERIAL column should always be compressed as + // constant non-null when flushed to disk. We should add a sanity check for this. + return std::make_unique(std::move(dataType), capacity, enableCompression); } // Physically, we only materialize offset of INTERNAL_ID, which is same as INT64, case PhysicalTypeID::INTERNAL_ID: { diff --git a/src/storage/store/node_group.cpp b/src/storage/store/node_group.cpp index bf2ef90829c..9ddaf8f784b 100644 --- a/src/storage/store/node_group.cpp +++ b/src/storage/store/node_group.cpp @@ -9,7 +9,7 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -bool CSRHeaderChunks::sanityCheck() const { +bool ChunkedCSRHeader::sanityCheck() const { if (offset->getNumValues() != length->getNumValues()) { return false; } @@ -28,7 +28,7 @@ bool CSRHeaderChunks::sanityCheck() const { return true; } -void CSRHeaderChunks::copyFrom(const CSRHeaderChunks& other) const { +void ChunkedCSRHeader::copyFrom(const ChunkedCSRHeader& other) const { auto numValues = other.offset->getNumValues(); memcpy(offset->getData(), other.offset->getData(), numValues * sizeof(offset_t)); memcpy(length->getData(), other.length->getData(), numValues * sizeof(length_t)); @@ -36,7 +36,7 @@ void CSRHeaderChunks::copyFrom(const CSRHeaderChunks& other) const { offset->setNumValues(numValues); } -void CSRHeaderChunks::fillDefaultValues(offset_t newNumValues) const { +void ChunkedCSRHeader::fillDefaultValues(offset_t newNumValues) const { auto lastCSROffset = getEndCSROffset(length->getNumValues() - 1); for (auto i = length->getNumValues(); i < newNumValues; i++) { offset->setValue(lastCSROffset, i); @@ -46,7 +46,7 @@ void CSRHeaderChunks::fillDefaultValues(offset_t newNumValues) const { offset->getNumValues() >= newNumValues && length->getNumValues() == offset->getNumValues()); } -NodeGroup::NodeGroup( +ChunkedNodeGroup::ChunkedNodeGroup( const std::vector& columnTypes, bool enableCompression, uint64_t capacity) : nodeGroupIdx{UINT64_MAX}, numRows{0} { chunks.reserve(columnTypes.size()); @@ -56,7 +56,8 @@ NodeGroup::NodeGroup( } } -NodeGroup::NodeGroup(const std::vector>& columns, bool enableCompression) +ChunkedNodeGroup::ChunkedNodeGroup( + const std::vector>& columns, bool enableCompression) : nodeGroupIdx{UINT64_MAX}, numRows{0} { chunks.reserve(columns.size()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { @@ -65,7 +66,7 @@ NodeGroup::NodeGroup(const std::vector>& columns, bool e } } -void NodeGroup::resetToEmpty() { +void ChunkedNodeGroup::resetToEmpty() { numRows = 0; nodeGroupIdx = UINT64_MAX; for (auto& chunk : chunks) { @@ -73,25 +74,26 @@ void NodeGroup::resetToEmpty() { } } -void NodeGroup::setAllNull() { +void ChunkedNodeGroup::setAllNull() { for (auto& chunk : chunks) { chunk->getNullChunk()->resetToAllNull(); } } -void NodeGroup::setNumValues(common::offset_t numValues) { +void ChunkedNodeGroup::setNumValues(common::offset_t numValues) { for (auto& chunk : chunks) { chunk->setNumValues(numValues); } + numRows = numValues; } -void NodeGroup::resizeChunks(uint64_t newSize) { +void ChunkedNodeGroup::resizeChunks(uint64_t newSize) { for (auto& chunk : chunks) { chunk->resize(newSize); } } -uint64_t NodeGroup::append(const std::vector& columnVectors, +uint64_t ChunkedNodeGroup::append(const std::vector& columnVectors, DataChunkState* columnState, uint64_t numValuesToAppend) { auto numValuesToAppendInChunk = std::min(numValuesToAppend, StorageConstants::NODE_GROUP_SIZE - numRows); @@ -115,7 +117,7 @@ uint64_t NodeGroup::append(const std::vector& columnVectors, return numValuesToAppendInChunk; } -offset_t NodeGroup::append(NodeGroup* other, offset_t offsetInOtherNodeGroup) { +offset_t ChunkedNodeGroup::append(ChunkedNodeGroup* other, offset_t offsetInOtherNodeGroup) { KU_ASSERT(other->chunks.size() == chunks.size()); auto numNodesToAppend = std::min( other->numRows - offsetInOtherNodeGroup, StorageConstants::NODE_GROUP_SIZE - numRows); @@ -126,7 +128,7 @@ offset_t NodeGroup::append(NodeGroup* other, offset_t offsetInOtherNodeGroup) { return numNodesToAppend; } -void NodeGroup::write( +void ChunkedNodeGroup::write( std::vector>& data, vector_idx_t offsetVectorIdx) { KU_ASSERT(data.size() == chunks.size() + 1); auto& offsetChunk = data[offsetVectorIdx]; @@ -144,21 +146,32 @@ void NodeGroup::write( numRows += offsetChunk->getNumValues(); } -void NodeGroup::finalize(uint64_t nodeGroupIdx_) { +void ChunkedNodeGroup::finalize(uint64_t nodeGroupIdx_) { nodeGroupIdx = nodeGroupIdx_; for (auto i = 0u; i < chunks.size(); i++) { chunks[i]->finalize(); } } -CSRHeaderChunks::CSRHeaderChunks(bool enableCompression, uint64_t capacity) { +void ChunkedNodeGroupCollection::append(std::unique_ptr chunkedGroup) { + if (chunkedGroups.size() > 1) { + KU_ASSERT(chunkedGroup->getNumColumns() == chunkedGroups[0]->getNumColumns()); + for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { + KU_ASSERT(chunkedGroup->getColumnChunk(i).getDataType() == + chunkedGroups[0]->getColumnChunk(i).getDataType()); + } + } + chunkedGroups.push_back(std::move(chunkedGroup)); +} + +ChunkedCSRHeader::ChunkedCSRHeader(bool enableCompression, uint64_t capacity) { offset = ColumnChunkFactory::createColumnChunk(*LogicalType::UINT64(), enableCompression, capacity); length = ColumnChunkFactory::createColumnChunk(*LogicalType::UINT64(), enableCompression, capacity); } -offset_t CSRHeaderChunks::getStartCSROffset(offset_t nodeOffset) const { +offset_t ChunkedCSRHeader::getStartCSROffset(offset_t nodeOffset) const { if (nodeOffset == 0 || offset->getNumValues() == 0) { return 0; } @@ -166,7 +179,7 @@ offset_t CSRHeaderChunks::getStartCSROffset(offset_t nodeOffset) const { nodeOffset >= offset->getNumValues() ? (offset->getNumValues() - 1) : (nodeOffset - 1)); } -offset_t CSRHeaderChunks::getEndCSROffset(offset_t nodeOffset) const { +offset_t ChunkedCSRHeader::getEndCSROffset(offset_t nodeOffset) const { if (offset->getNumValues() == 0) { return 0; } @@ -174,15 +187,16 @@ offset_t CSRHeaderChunks::getEndCSROffset(offset_t nodeOffset) const { nodeOffset >= offset->getNumValues() ? (offset->getNumValues() - 1) : nodeOffset); } -length_t CSRHeaderChunks::getCSRLength(offset_t nodeOffset) const { +length_t ChunkedCSRHeader::getCSRLength(offset_t nodeOffset) const { return nodeOffset >= length->getNumValues() ? 0 : length->getValue(nodeOffset); } -CSRNodeGroup::CSRNodeGroup(const std::vector& columnTypes, bool enableCompression) +ChunkedCSRNodeGroup::ChunkedCSRNodeGroup( + const std::vector& columnTypes, bool enableCompression) // By default, initialize all column chunks except for the csrOffsetChunk to empty, as they // should be resized after csr offset calculation (e.g., during RelBatchInsert). - : NodeGroup{columnTypes, enableCompression, 0 /* capacity */} { - csrHeaderChunks = CSRHeaderChunks(enableCompression); + : ChunkedNodeGroup{columnTypes, enableCompression, 0 /* capacity */} { + csrHeader = ChunkedCSRHeader(enableCompression); } } // namespace storage diff --git a/src/storage/store/node_table_data.cpp b/src/storage/store/node_table_data.cpp index f614ed834dc..4df1b9ad59c 100644 --- a/src/storage/store/node_table_data.cpp +++ b/src/storage/store/node_table_data.cpp @@ -97,7 +97,7 @@ void NodeTableData::lookup(Transaction* transaction, TableReadState& readState, } } -void NodeTableData::append(NodeGroup* nodeGroup) { +void NodeTableData::append(ChunkedNodeGroup* nodeGroup) { for (auto columnID = 0u; columnID < columns.size(); columnID++) { auto columnChunk = nodeGroup->getColumnChunkUnsafe(columnID); KU_ASSERT(columnID < columns.size()); @@ -112,7 +112,7 @@ void NodeTableData::prepareLocalTableToCommit( auto column = columns[columnID].get(); auto localInsertChunk = localNodeGroup->getInsesrtChunks().getLocalChunk(columnID); auto localUpdateChunk = localNodeGroup->getUpdateChunks(columnID).getLocalChunk(0); - if (localInsertChunk.isEmpty() && localUpdateChunk.isEmpty()) { + if (localInsertChunk.empty() && localUpdateChunk.empty()) { continue; } auto localNodeNG = ku_dynamic_cast(localNodeGroup.get()); diff --git a/src/storage/store/null_column.cpp b/src/storage/store/null_column.cpp index 06e699d14dd..334292c1ffc 100644 --- a/src/storage/store/null_column.cpp +++ b/src/storage/store/null_column.cpp @@ -147,8 +147,8 @@ void NullColumn::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, } } -void NullColumn::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, - kuzu::storage::ColumnChunk* data, offset_t dataOffset, length_t numValues) { +void NullColumn::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, ColumnChunk* data, + offset_t dataOffset, length_t numValues) { auto state = getReadState(TransactionType::WRITE, nodeGroupIdx); writeValues(state, offsetInChunk, data->getData(), dataOffset, numValues); auto nullChunk = ku_dynamic_cast(data); @@ -164,8 +164,8 @@ void NullColumn::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, } bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { + const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { auto metadata = getMetadata(nodeGroupIdx, transaction->getType()); if (metadata.compMeta.canAlwaysUpdateInPlace()) { return true; @@ -175,16 +175,18 @@ bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nod } bool NullColumn::checkUpdateInPlace(const ColumnChunkMetadata& metadata, - const LocalVectorCollection& localChunk, const offset_to_row_idx_t& writeInfo) { + const ChunkCollection& localChunks, const offset_to_row_idx_t& writeInfo) { std::vector rowIdxesToRead; for (auto& [_, rowIdx] : writeInfo) { rowIdxesToRead.push_back(rowIdx); } std::sort(rowIdxesToRead.begin(), rowIdxesToRead.end()); for (auto rowIdx : rowIdxesToRead) { - auto localVector = localChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - bool value = localVector->isNull(offsetInVector); + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localNullChunk = + ku_dynamic_cast(localChunks[chunkIdx]); + bool value = localNullChunk->isNull(offsetInLocalChunk); if (!metadata.compMeta.canUpdateInPlace( reinterpret_cast(&value), 0, dataType.getPhysicalType())) { return false; @@ -220,18 +222,24 @@ bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nod } void NullColumn::commitLocalChunkInPlace(Transaction* /*transaction*/, - node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { for (auto& [offsetInChunk, rowIdx] : updateInfo) { - auto localVector = localUpdateChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - write(nodeGroupIdx, offsetInChunk, localVector, offsetInVector); + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localChunk = localUpdateChunks[chunkIdx]; + KU_ASSERT(localChunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL && + !localChunk->getNullChunk()); + write(nodeGroupIdx, offsetInChunk, localChunk, offsetInLocalChunk, 1 /*numValues*/); } for (auto& [offsetInChunk, rowIdx] : insertInfo) { - auto localVector = localInsertChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - write(nodeGroupIdx, offsetInChunk, localVector, offsetInVector); + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localChunk = localInsertChunks[chunkIdx]; + KU_ASSERT(localChunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL && + !localChunk->getNullChunk()); + write(nodeGroupIdx, offsetInChunk, localChunk, offsetInLocalChunk, 1 /*numValues*/); } // Set nulls based on deleteInfo. Note that this code path actually only gets executed when // the column is a regular format one. This is not a good design, should be unified with csr diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index affd144620d..742ecce0266 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -302,8 +302,8 @@ bool RelTableData::checkIfNodeHasRels(Transaction* transaction, offset_t nodeOff return length > 0; } -void RelTableData::append(NodeGroup* nodeGroup) { - auto csrNodeGroup = ku_dynamic_cast(nodeGroup); +void RelTableData::append(ChunkedNodeGroup* nodeGroup) { + auto csrNodeGroup = ku_dynamic_cast(nodeGroup); csrHeaderColumns.append(csrNodeGroup->getCSRHeader(), nodeGroup->getNodeGroupIdx()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { getColumn(columnID)->append( @@ -311,17 +311,17 @@ void RelTableData::append(NodeGroup* nodeGroup) { } } -static length_t getGapSizeForNode(const CSRHeaderChunks& header, offset_t nodeOffset) { +static length_t getGapSizeForNode(const ChunkedCSRHeader& header, offset_t nodeOffset) { return header.getEndCSROffset(nodeOffset) - header.getStartCSROffset(nodeOffset) - header.getCSRLength(nodeOffset); } -static length_t getRegionCapacity(const CSRHeaderChunks& header, PackedCSRRegion region) { +static length_t getRegionCapacity(const ChunkedCSRHeader& header, PackedCSRRegion region) { auto [startNodeOffset, endNodeOffset] = region.getNodeOffsetBoundaries(); return header.getEndCSROffset(endNodeOffset) - header.getStartCSROffset(startNodeOffset); } -length_t RelTableData::getNewRegionSize(const CSRHeaderChunks& header, +length_t RelTableData::getNewRegionSize(const ChunkedCSRHeader& header, const std::vector& sizeChangesPerSegment, PackedCSRRegion& region) { auto [startNodeOffsetInNG, endNodeOffsetInNG] = region.getNodeOffsetBoundaries(); endNodeOffsetInNG = std::min(endNodeOffsetInNG, header.offset->getNumValues() - 1); @@ -368,7 +368,7 @@ void RelTableData::prepareLocalTableToCommit(Transaction* transaction, LocalTabl } } -bool RelTableData::isWithinDensityBound(const CSRHeaderChunks& header, +bool RelTableData::isWithinDensityBound(const ChunkedCSRHeader& header, const std::vector& sizeChangesPerSegment, PackedCSRRegion& region) { auto sizeInRegion = getNewRegionSize(header, sizeChangesPerSegment, region); auto capacityInRegion = getRegionCapacity(header, region); @@ -390,7 +390,7 @@ RelTableData::LocalState::LocalState(LocalRelNG* localNG) : localNG{localNG} { } void RelTableData::applyUpdatesToChunk(const PersistentState& persistentState, - LocalState& localState, const LocalVectorCollection& localChunk, ColumnChunk* chunk, + LocalState& localState, const ChunkCollection& localChunk, ColumnChunk* chunk, column_id_t columnID) { offset_to_row_idx_t csrOffsetInRegionToRowIdx; auto [leftNodeBoundary, rightNodeBoundary] = localState.region.getNodeOffsetBoundaries(); @@ -409,7 +409,7 @@ void RelTableData::applyUpdatesToChunk(const PersistentState& persistentState, } void RelTableData::applyInsertionsToChunk(const PersistentState& persistentState, - const LocalState& localState, const LocalVectorCollection& localChunk, ColumnChunk* newChunk) { + const LocalState& localState, const ChunkCollection& localChunk, ColumnChunk* newChunk) { offset_to_row_idx_t csrOffsetToRowIdx; auto [leftNodeBoundary, rightNodeBoundary] = localState.region.getNodeOffsetBoundaries(); auto& insertChunks = localState.localNG->insertChunks; @@ -511,7 +511,7 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, } std::vector RelTableData::findRegions( - const CSRHeaderChunks& headerChunks, LocalState& localState) { + const ChunkedCSRHeader& headerChunks, LocalState& localState) { std::vector regions; auto segmentIdx = 0u; auto numSegments = StorageConstants::NODE_GROUP_SIZE / StorageConstants::CSR_SEGMENT_SIZE; @@ -703,8 +703,8 @@ void RelTableData::applyUpdatesToColumn(Transaction* transaction, node_group_idx } if (!writeInfo.empty()) { auto localChunk = updateChunk.getLocalChunk(0 /*columnID*/); - column->prepareCommitForChunk(transaction, nodeGroupIdx, LocalVectorCollection::empty(), - {} /*insertInfo*/, localChunk, writeInfo, {} /*deleteInfo*/); + column->prepareCommitForChunk(transaction, nodeGroupIdx, {}, {} /*insertInfo*/, localChunk, + writeInfo, {} /*deleteInfo*/); } } @@ -730,8 +730,7 @@ void RelTableData::applyInsertionsToColumn(Transaction* transaction, node_group_ } } auto localChunk = insertChunks.getLocalChunk(columnID); - column->prepareCommitForChunk( - transaction, nodeGroupIdx, localChunk, writeInfo, LocalVectorCollection::empty(), {}, {}); + column->prepareCommitForChunk(transaction, nodeGroupIdx, localChunk, writeInfo, {}, {}, {}); } std::vector> RelTableData::getSlidesForDeletions( @@ -841,7 +840,7 @@ void RelTableData::applySliding(Transaction* transaction, node_group_idx_t nodeG } offset_t RelTableData::getMaxNumNodesInRegion( - const CSRHeaderChunks& header, const PackedCSRRegion& region, const LocalRelNG* localNG) { + const ChunkedCSRHeader& header, const PackedCSRRegion& region, const LocalRelNG* localNG) { auto numNodes = header.offset->getNumValues(); KU_ASSERT(numNodes == header.length->getNumValues()); for (auto& [offset, _] : localNG->insertChunks.getSrcNodeOffsetToRelOffsets()) { @@ -863,7 +862,7 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no localState.region.rightBoundary = std::min(rightBoundary, maxNumNodesInRegion - 1); persistentState.leftCSROffset = header.getStartCSROffset(localState.region.leftBoundary); persistentState.rightCSROffset = header.getEndCSROffset(localState.region.rightBoundary); - localState.header = CSRHeaderChunks(enableCompression, maxNumNodesInRegion); + localState.header = ChunkedCSRHeader(enableCompression, maxNumNodesInRegion); auto& newHeader = localState.header; newHeader.copyFrom(header); newHeader.fillDefaultValues(localState.region.rightBoundary + 1); @@ -915,7 +914,7 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no newHeader.length.get(), localState.region.leftBoundary); } -void RelTableData::distributeOffsets(const CSRHeaderChunks& header, LocalState& localState, +void RelTableData::distributeOffsets(const ChunkedCSRHeader& header, LocalState& localState, offset_t leftBoundary, offset_t rightBoundary) { if (localState.region.level > packedCSRInfo.calibratorTreeHeight) { // Need to resize the capacity and reset regionToDistribute to the top level one. diff --git a/src/storage/store/string_column.cpp b/src/storage/store/string_column.cpp index 57aea542718..88d630cd909 100644 --- a/src/storage/store/string_column.cpp +++ b/src/storage/store/string_column.cpp @@ -170,14 +170,15 @@ void StringColumn::lookupInternal( } bool StringColumn::canCommitInPlace(transaction::Transaction* transaction, - node_group_idx_t nodeGroupIdx, const LocalVectorCollection& localInsertChunk, - const offset_to_row_idx_t& insertInfo, const LocalVectorCollection& localUpdateChunk, + node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo) { auto strLenToAdd = 0u; for (auto& [_, rowIdx] : updateInfo) { - auto localVector = localUpdateChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - auto kuStr = localVector->getValue(offsetInVector); + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localUpdateChunk = localUpdateChunks[chunkIdx]; + auto kuStr = localUpdateChunk->getValue(offsetInLocalChunk); strLenToAdd += kuStr.len; } offset_t maxOffset = 0u; @@ -185,9 +186,10 @@ bool StringColumn::canCommitInPlace(transaction::Transaction* transaction, if (offset > maxOffset) { maxOffset = offset; } - auto localVector = localInsertChunk.getLocalVector(rowIdx); - auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); - auto kuStr = localVector->getValue(offsetInVector); + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localInsertChunk = localInsertChunks[chunkIdx]; + auto kuStr = localInsertChunk->getValue(offsetInLocalChunk); strLenToAdd += kuStr.len; } auto numStrings = insertInfo.size() + updateInfo.size(); @@ -229,7 +231,7 @@ bool StringColumn::canIndexCommitInPlace(Transaction* transaction, node_group_id dictionary.getNumValuesInOffsets(transaction, nodeGroupIdx) + numStrings; // Check if the index column can store the largest new index in-place if (!metadata.compMeta.canUpdateInPlace( - (const uint8_t*)&totalStringsAfterUpdate, 0 /*pos*/, dataType.getPhysicalType())) { + (const uint8_t*)&totalStringsAfterUpdate, 0 /*pos*/, PhysicalTypeID::UINT32)) { return false; } return true; diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index e0c18523546..1684460e043 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -52,6 +52,17 @@ void StringColumnChunk::append( } } +void StringColumnChunk::lookup( + offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { + KU_ASSERT(offsetInChunk < numValues); + output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); + if (nullChunk->isNull(offsetInChunk)) { + return; + } + auto str = getValue(offsetInChunk); + output.setValue(posInOutputVector, str); +} + void StringColumnChunk::write( ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); @@ -68,7 +79,8 @@ void StringColumnChunk::write( } } -void StringColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) { +void StringColumnChunk::write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRING && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && chunk->getNumValues() == dstOffsets->getNumValues()); @@ -136,7 +148,6 @@ void StringColumnChunk::appendStringColumnChunk( } void StringColumnChunk::setValueFromString(std::string_view value, uint64_t pos) { - KU_ASSERT(pos < numValues); auto index = dictionaryChunk->appendString(value); ColumnChunk::setValue(index, pos); } diff --git a/src/storage/store/struct_column.cpp b/src/storage/store/struct_column.cpp index 19c27e9e5e4..e1fd4ac181d 100644 --- a/src/storage/store/struct_column.cpp +++ b/src/storage/store/struct_column.cpp @@ -126,12 +126,13 @@ void StructColumn::rollbackInMemory() { } bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { + const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { // STRUCT column doesn't have actual data stored in buffer. Only need to check the null column. // Children columns are committed separately. - return nullColumn->canCommitInPlace( - transaction, nodeGroupIdx, localInsertChunk, insertInfo, localUpdateChunk, updateInfo); + return nullColumn->canCommitInPlace(transaction, nodeGroupIdx, + getNullChunkCollection(localInsertChunk), insertInfo, + getNullChunkCollection(localUpdateChunk), updateInfo); } bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -141,8 +142,8 @@ bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t n } void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const LocalVectorCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const LocalVectorCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, + const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; @@ -156,18 +157,20 @@ void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_id // column. if (canCommitInPlace(transaction, nodeGroupIdx, localInsertChunk, insertInfo, localUpdateChunk, updateInfo)) { - nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, localInsertChunk, - insertInfo, localUpdateChunk, updateInfo, deleteInfo); + nullColumn->commitLocalChunkInPlace(transaction, nodeGroupIdx, + getNullChunkCollection(localInsertChunk), insertInfo, + getNullChunkCollection(localUpdateChunk), updateInfo, deleteInfo); } else { nullColumn->commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, - localInsertChunk, insertInfo, localUpdateChunk, updateInfo, deleteInfo); + getNullChunkCollection(localInsertChunk), insertInfo, + getNullChunkCollection(localUpdateChunk), updateInfo, deleteInfo); } // Update each child column separately for (auto i = 0u; i < childColumns.size(); i++) { const auto& childColumn = childColumns[i]; childColumn->prepareCommitForChunk(transaction, nodeGroupIdx, - localInsertChunk.getStructChildVectorCollection(i), insertInfo, - localUpdateChunk.getStructChildVectorCollection(i), updateInfo, deleteInfo); + getStructChildChunkCollection(localInsertChunk, i), insertInfo, + getStructChildChunkCollection(localUpdateChunk, i), updateInfo, deleteInfo); } } } @@ -202,5 +205,15 @@ void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_id } } +ChunkCollection StructColumn::getStructChildChunkCollection( + const ChunkCollection& chunkCollection, vector_idx_t childIdx) { + ChunkCollection childChunkCollection; + for (const auto& chunk : chunkCollection) { + auto structChunk = ku_dynamic_cast(chunk); + childChunkCollection.push_back(structChunk->getChild(childIdx)); + } + return childChunkCollection; +} + } // namespace storage } // namespace kuzu diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index 97c9ce3ca66..06d30bc76f3 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -53,6 +53,17 @@ void StructColumnChunk::append(ValueVector* vector, SelectionVector& selVector) numValues += selVector.selectedSize; } +void StructColumnChunk::lookup( + offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { + KU_ASSERT(offsetInChunk < numValues); + auto numFields = StructType::getNumFields(&dataType); + output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); + for (auto i = 0u; i < numFields; i++) { + childChunks[i]->lookup( + offsetInChunk, *StructVector::getFieldVector(&output, i).get(), posInOutputVector); + } +} + void StructColumnChunk::resize(uint64_t newCapacity) { ColumnChunk::resize(newCapacity); capacity = newCapacity; @@ -81,7 +92,8 @@ void StructColumnChunk::write( } } -void StructColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool isCSR) { +void StructColumnChunk::write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity multiplicity) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT); for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto offsetInChunk = dstOffsets->getValue(i); @@ -90,7 +102,7 @@ void StructColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool } auto structChunk = ku_dynamic_cast(chunk); for (auto i = 0u; i < childChunks.size(); i++) { - childChunks[i]->write(structChunk->getChild(i), dstOffsets, isCSR); + childChunks[i]->write(structChunk->getChild(i), dstOffsets, multiplicity); } } diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index e1635a7e14e..e7893e31ff7 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -101,7 +101,27 @@ void VarListColumnChunk::appendNullList() { numValues++; } -void VarListColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, bool /*isCSR*/) { +void VarListColumnChunk::lookup( + offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { + KU_ASSERT(offsetInChunk < numValues); + output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); + if (output.isNull(posInOutputVector)) { + return; + } + auto startOffset = offsetInChunk == 0 ? 0 : getValue(offsetInChunk - 1); + auto endOffset = getValue(offsetInChunk); + auto listLen = endOffset - startOffset; + auto dataVector = ListVector::getDataVector(&output); + auto currentListDataSize = ListVector::getDataVectorSize(&output); + ListVector::resizeDataVector(&output, currentListDataSize + listLen); + // TODO(Guodong): Should add `scan` interface and use `scan` here. + for (auto i = 0u; i < listLen; i++) { + varListDataColumnChunk->dataColumnChunk->lookup(startOffset + i, *dataVector, i); + } +} + +void VarListColumnChunk::write( + ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { needFinalize = true; if (!indicesColumnChunk) { initializeIndices(); diff --git a/src/transaction/transaction_manager.cpp b/src/transaction/transaction_manager.cpp index f4306a3f1ab..dbf654c405e 100644 --- a/src/transaction/transaction_manager.cpp +++ b/src/transaction/transaction_manager.cpp @@ -19,8 +19,7 @@ std::unique_ptr TransactionManager::beginWriteTransaction() { "Cannot start a new write transaction in the system. Only one write transaction at a " "time is allowed in the system."); } - auto transaction = - std::make_unique(TransactionType::WRITE, ++lastTransactionID, mm); + auto transaction = std::make_unique(TransactionType::WRITE, ++lastTransactionID); activeWriteTransactionID = lastTransactionID; return transaction; } @@ -31,7 +30,7 @@ std::unique_ptr TransactionManager::beginReadOnlyTransaction() { lock_t newTransactionLck{mtxForStartingNewTransactions}; lock_t publicFunctionLck{mtxForSerializingPublicFunctionCalls}; auto transaction = - std::make_unique(TransactionType::READ_ONLY, ++lastTransactionID, mm); + std::make_unique(TransactionType::READ_ONLY, ++lastTransactionID); activeReadOnlyTransactionIDs.insert(transaction->getID()); return transaction; } diff --git a/test/hammer.test b/test/hammer.test deleted file mode 100644 index bca248b8504..00000000000 --- a/test/hammer.test +++ /dev/null @@ -1,4415 +0,0 @@ --GROUP [hammer] --DATASET CSV empty --- - --CASE hammer --STATEMENT CREATE NODE TABLE Person(id SERIAL, prop1 INT64, prop2 STRING, PRIMARY KEY(id)); ----- ok --STATEMENT CREATE REL TABLE knows(FROM Person TO Person, prop1 INT64); ----- ok --STATEMENT CREATE (p:Person {prop1: 142215, prop2: 'Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 878242, prop2: 'GO4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 836516, prop2: '7R2MJD25G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 206382, prop2: 'X137NINSSS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 120923, prop2: 'TVB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 876432, prop2: 'YIKU910'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 38863, prop2: 'MZVHYJ0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 927513, prop2: '80QOC1HMG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 371524, prop2: 'V2J1HETGK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 550015, prop2: 'MPZWQC5SW7A'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 487871, prop2: 'EHVFGX86N5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 595954, prop2: 'B185J2K'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 122737, prop2: '5RK9HBF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 985147, prop2: 'TEGKHN5LIDU77P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 824973, prop2: 'EJCDDAYLXH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 565022, prop2: 'ZIHY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 583825, prop2: 'NC9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 685363, prop2: 'RH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 958294, prop2: 'YLENEN4NQ1A'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 284652, prop2: 'UQNYSKI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 210888, prop2: 'LGWV7OIMJ0O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 281745, prop2: 'NH4WXFWO7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 280189, prop2: 'FDPBGGH5I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 269537, prop2: 'BO5JAX62ZHEW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 734377, prop2: 'DAWIYOLU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 152454, prop2: 'WGF0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 848083, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 639375, prop2: '42WN66XP9C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 110955, prop2: 'N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 103714, prop2: 'A78TOD4HMSHPX3N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 180357, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 955977, prop2: 'N8NZGFAT3WC6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 561795, prop2: 'TJEPGIKWOB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 775568, prop2: 'Z6JA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 446328, prop2: 'ZN732JW8V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 357881, prop2: '2XDI1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 651829, prop2: 'TSFSRD9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 533241, prop2: 'JYIU65HS7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 526516, prop2: 'WF3T6TYE0S0G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 172117, prop2: '0CGK01OP7I3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 842075, prop2: '78Z6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 476616, prop2: '3R7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 198061, prop2: 'NWA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 578273, prop2: 'Z2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 502321, prop2: 'WVML0NE65859MT3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 869561, prop2: 'P74KOQS4DQ5E'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 313493, prop2: 'QI5CYSQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 774511, prop2: 'UTV79CVE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 272775, prop2: 'A0P8GWYI829K'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 903471, prop2: '8T1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 759878, prop2: 'R21SJGEJY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 321168, prop2: 'VG3IGJ8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 260765, prop2: 'CQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 734470, prop2: 'VC4IHNL2ECR02C6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 83448, prop2: 'OMYU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 432067, prop2: 'COZ8Q7GCOJNG0H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 726038, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 4987, prop2: 'UXBR1066RBUN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 682142, prop2: 'NWH9L0M9S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 193306, prop2: 'N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 576741, prop2: 'EQJ8PAMCHKFO37'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 319178, prop2: 'HTYJP1XGUC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 475596, prop2: 'LWB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 410752, prop2: '8RMZOWD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 497200, prop2: 'OADFC0K7OOS62FV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 729981, prop2: '36TNCVK1I3R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 263975, prop2: '4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 577758, prop2: 'C9NG9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 246488, prop2: 'HTZ1QS1AJ12WN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 521264, prop2: '24BI1SFKVJNV1K2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 400001, prop2: '1Y20'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 685249, prop2: 'O8U7PDMV8WSQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 977470, prop2: 'DAGYKA2074OVM6M'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 267925, prop2: 'JD3HLW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 814093, prop2: 'H8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 248280, prop2: 'UW8SYG1GFMTNQZU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 186303, prop2: '8N5P72QGNM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 202328, prop2: 'V7T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 267629, prop2: '3NKG5IBZN6C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 442319, prop2: 'WOBU124ROR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 918851, prop2: 'Z42RM4W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 489975, prop2: '62U2M0WBVEY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 765461, prop2: '65TAGXYIS2L3NH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 925161, prop2: 'C4E35H4JGKZE6Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 43575, prop2: 'UI9XTE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 699449, prop2: 'SW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 264126, prop2: 'WT34RHLW44'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 473492, prop2: 'IH2AJUMI7NU89'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 350244, prop2: 'RBCKIS1SJN0BHW5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 282497, prop2: 'O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 194572, prop2: '25O1CMU6KW3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 499424, prop2: '9ZJ5KPDV313F1T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 124516, prop2: '9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 480616, prop2: 'N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 886471, prop2: 'J'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 652691, prop2: 'WD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 652602, prop2: 'L8N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 203657, prop2: 'EW7HF91NJX5HD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 364764, prop2: '031DV0SG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 160943, prop2: 'X0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 423712, prop2: 'OTRCXTBAT85H7L0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 856546, prop2: 'E8M1UGJNSB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 72737, prop2: '39APMZWXQKR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 538681, prop2: 'GVWT9UTHBFBW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 104942, prop2: 'K0S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 118091, prop2: 'HCV6J0Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 472091, prop2: '779RUF27I8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 481565, prop2: '5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 919296, prop2: 'KKNFCXMEBG23ZY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 103019, prop2: 'HMNW2R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 20762, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 879748, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 828648, prop2: 'OY1HH6I1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 884177, prop2: 'A8W46I6P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 47315, prop2: 'AKE9AZ9WHP73R17'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 253408, prop2: '4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 302335, prop2: '2ETE8NY0EBVT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 150650, prop2: '7AANX6F2JXQDJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 530197, prop2: 'C8EK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 674541, prop2: 'MHM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 837944, prop2: '384'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 194173, prop2: '8BGI8SFJ7CEYV9I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 361779, prop2: 'MC0FATBIL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 203176, prop2: 'RH5VQM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 133891, prop2: '0P17N0TVK8WRTKP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 957099, prop2: 'DG9CRR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 103250, prop2: 'VU3L18HW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 750558, prop2: 'RCJJJ9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 414057, prop2: 'EGVD5L5ZA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 885326, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 364776, prop2: 'K4KYXRJ63502LQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 483675, prop2: 'N0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 122272, prop2: 'MKXTIOVD3NX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 15043, prop2: 'O7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 997850, prop2: 'FM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 985927, prop2: '8X3HL63JBUFLYH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 199424, prop2: 'EZ7XBN89AK90OZS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 955757, prop2: 'R0ALKQ56'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 364172, prop2: 'OMF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 930597, prop2: 'RRC8C4Y0MME4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 592133, prop2: 'QMC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 608173, prop2: '5UENR7GFVJ7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 516501, prop2: 'JF4HBC86'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 957693, prop2: '4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 497660, prop2: 'LNE4JNVCJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 394920, prop2: '0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 922644, prop2: 'VG2B7R0QVBZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 44759, prop2: 'Z42F32BTNW9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 685034, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 539925, prop2: 'JJKDKHDPJ9ID'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 502806, prop2: 'QZUKTYUT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 114969, prop2: 'YDJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 40658, prop2: 'UZB2XHWX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 390989, prop2: '27EZ2QZYQUIDYXV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 440884, prop2: 'MRIW9R9PKFXXWG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 734377, prop2: 'Z5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 630481, prop2: 'C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 191992, prop2: 'XKYHIL3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 820384, prop2: 'FULAR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 244510, prop2: 'D56Z4SF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 494734, prop2: 'TAQV3MLYJD047'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 629927, prop2: '3OXTLP40GR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 369165, prop2: 'GK43TN45WFLE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 235024, prop2: 'HTU2I171DURL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 880112, prop2: 'VRV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 844206, prop2: 'WNDKLU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 462068, prop2: 'N6U4PC7ARY2K5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 534866, prop2: '5O68667TI4V3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 903326, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 453947, prop2: 'VVL3UYYXJN2TM6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 271343, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 871109, prop2: 'I8Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 454952, prop2: '4D5B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 222941, prop2: 'CT3B18OGZMKI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 833976, prop2: 'XI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 135018, prop2: 'EVXBF4QE5A'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 782324, prop2: 'T6ZJ61AGYQN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 905482, prop2: '1EB2LXZ434YX0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 223428, prop2: 'I4I7142'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 594296, prop2: 'PZ8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 544426, prop2: 'T5FOKNCL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 125393, prop2: 'F'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 8255, prop2: '8Z3AXZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 37142, prop2: 'X99BSKTORMME'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 225633, prop2: 'HE087WORS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 34079, prop2: 'H3CC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 676606, prop2: 'H6W1G3BWBDH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 6388, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 962040, prop2: '2Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 198524, prop2: '6KF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 152006, prop2: 'IAW4PL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 292753, prop2: 'NICR8O53PC0773'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 662167, prop2: '8R4PXTB9QQDW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 572552, prop2: 'R5P9UFF2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 811113, prop2: 'RYE380ZFNFJF7F'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 327384, prop2: 'ONK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 405724, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 871561, prop2: '5LSZ2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 674045, prop2: '1W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 395645, prop2: 'QGCTLTPF4I4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 462174, prop2: 'XS8P433Q5KX1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 88425, prop2: 'ZTCR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 288861, prop2: 'ZM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 116402, prop2: 'VHTOLATS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 887562, prop2: '3I7TU23O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 224737, prop2: 'PZ7139GGK7A8V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 268841, prop2: 'USNYAC4H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 621933, prop2: '22X4D1Q1Z4VV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 520613, prop2: 'ESEVKUUK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 280407, prop2: 'HZIE6KE1HNY2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 844790, prop2: '4TLE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 83970, prop2: 'ZV1RY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 296349, prop2: 'H0S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 757312, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 853698, prop2: 'VTTMM403Q7JVJBN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 410925, prop2: 'J'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 310419, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 679786, prop2: 'RZVS3SOZAAF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 975262, prop2: '19M6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 289821, prop2: 'EEH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 662388, prop2: 'FWB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 436588, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 324746, prop2: '9YRP0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 699161, prop2: 'I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 735853, prop2: '1FBRLJ03ZY73'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 479085, prop2: 'T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 655291, prop2: 'ZSUKW33F2W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 835867, prop2: '4QQIF5NT86AJD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 986275, prop2: '3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 294049, prop2: 'YPMT6G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 413538, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 177809, prop2: '6DDN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 738289, prop2: '9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 10660, prop2: 'K8ZVWEU84IZF4PM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 427506, prop2: 'GNYE87'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 762513, prop2: 'AD5K204TJPQNL6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 260983, prop2: 'ZMDQ44'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 454747, prop2: 'GE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 232801, prop2: '8OYH4B9JXY40VW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 786186, prop2: 'S5B7HLFC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 27236, prop2: 'DVPMJ9YN1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 171890, prop2: 'OSX2Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 472746, prop2: '9OLJ6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 391483, prop2: 'MK0P1WX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 585953, prop2: '8LYB9R0MN53S7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 329419, prop2: '73YVFHQTXH5HP2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 660510, prop2: '8R6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 562727, prop2: 'EXXIZT79'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 990153, prop2: 'ZLW8PXB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 485008, prop2: '7S2SAY6R8L2ADLB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 717787, prop2: '6K6KZS1GTMTBJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 914875, prop2: 'B6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 760785, prop2: '0B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 285781, prop2: 'BJGN5IAH6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 910763, prop2: '25Z8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 747230, prop2: 'K3KCN87U4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 954294, prop2: '3G7KIU4ZSELC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 709840, prop2: 'WJHE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 739379, prop2: '6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 321387, prop2: 'DWBLCZP0V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 126667, prop2: 'Z81NLTM36D'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 402383, prop2: 'IMLYNJNRWK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 265875, prop2: 'K2CJXVP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 421157, prop2: 'FEXY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 915608, prop2: 'HSO8T88'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 95350, prop2: 'I99MGI9B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 523169, prop2: 'G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 216252, prop2: 'ZRGOTFGJZ30'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 350858, prop2: 'IFTBFU6XZ3SZE5Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 716103, prop2: 'D2RHVZ6CGCGR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 330884, prop2: '4VENCV9ASBGBKRF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 363796, prop2: 'BZ5VGH3L'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 222647, prop2: 'ISIYYM8S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 241754, prop2: '8PW9OL67KWJK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 946564, prop2: 'AJ4FSMRBO1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 613257, prop2: 'EH1PD7VY6MY9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 931154, prop2: '60O57'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 656112, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 281344, prop2: 'SK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 288437, prop2: 'ATJ1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 949633, prop2: 'L0G4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 533941, prop2: 'N6VP2MSI7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 688596, prop2: 'UD28YW7HM2FG2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 636589, prop2: '2AZ5E1SP1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 843812, prop2: 'W6HETKVO4Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 641012, prop2: 'FFNFE8G2E'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 425626, prop2: 'K1HHKRW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 383051, prop2: 'Q70Z2OK1HK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 85241, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 653641, prop2: '050PD4867'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 880159, prop2: '6YNDB4ZPX3UGX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 163818, prop2: 'YMLM0T7AD15Y6R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 560946, prop2: 'HPVZT23KBN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 323105, prop2: 'MIJYZGXSBDQEXOY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 922551, prop2: 'TQF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 637013, prop2: 'I9F5IXS1WX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 537762, prop2: 'QBUV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 709409, prop2: 'FSMSLA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 219421, prop2: 'GKI0TZ9HL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 575534, prop2: 'I8A3I8MBJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 495790, prop2: 'AV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 164280, prop2: 'Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 857553, prop2: 'GRAY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 415602, prop2: '56S3X6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 533701, prop2: '9SH7M'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 478174, prop2: 'ZR9W8M3K072IM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 560184, prop2: 'F83RTG6W67Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 321642, prop2: '0LUB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 987544, prop2: 'R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 411604, prop2: 'YNIQ8G5YQUEJ2YT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 213349, prop2: 'V9WOPK7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 213199, prop2: 'BSMUAGT304ZPIEV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 905451, prop2: 'AECJU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 43274, prop2: 'YX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 153063, prop2: '8GTC5VGPL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 606314, prop2: '41LNY2VHY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 85485, prop2: '0I5Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 70561, prop2: 'DWHOL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 713046, prop2: 'YQCNAP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 224919, prop2: '5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 701011, prop2: 'FQ2VVR9RYW63Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 792846, prop2: '7663'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 118194, prop2: 'U418GML21BGEEHB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 930111, prop2: 'K2SU82PKS8WO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 199833, prop2: '3A2J9631SVEK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 94525, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 644504, prop2: '2X526TX7P8ZT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 610924, prop2: 'P851BZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 105592, prop2: '72DWX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 118673, prop2: 'MYEBIHF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 572728, prop2: 'FD6JV5567SC5KF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 832154, prop2: 'B3N1RE74KJ3KJ8T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 783792, prop2: 'I8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 148611, prop2: 'S0RISRHI2J48'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 66527, prop2: 'QFQDG74FX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 522321, prop2: 'OSVT8KROBU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 66936, prop2: 'WL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 497847, prop2: 'W8JESP55'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 845447, prop2: '15'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 781343, prop2: 'ZUPJZT8R2B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 343180, prop2: '7T8ZRKK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 4929, prop2: 'I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 132902, prop2: 'WW5BQU9I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 488509, prop2: 'NWCEPS9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 64694, prop2: 'WZLMTWZF6VN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 449132, prop2: '2AA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 575889, prop2: '1EPB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 45215, prop2: '35AGD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 970030, prop2: 'IZZAOMTYQYRB7C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 453223, prop2: 'JO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 821793, prop2: '749'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 950571, prop2: 'PT872H5XUCND'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 720321, prop2: '7V32124OHYV3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 300987, prop2: 'K20OEM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 646710, prop2: '8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 253539, prop2: '1462BK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 589840, prop2: 'P2JH87'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 954218, prop2: 'EONNEYOL5M'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 571588, prop2: 'I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 601747, prop2: '8XWJQCXDF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 946023, prop2: 'KSYFF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 969232, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 64081, prop2: 'S9EZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 13235, prop2: 'IRIKZDTB4NA6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 236342, prop2: '76OK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 634885, prop2: '5U2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 754049, prop2: 'IDALDMDWD5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 164282, prop2: 'J1C8PAHHMG560R6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 807608, prop2: 'GHY9TBY5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 68780, prop2: '5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 383042, prop2: 'YJ39H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 393704, prop2: 'WC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 86061, prop2: 'PVRSRRY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 226238, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 237693, prop2: 'B44Z2N5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 90989, prop2: 'SVA8TW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 529059, prop2: 'HWZ0EW3S8LE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 818095, prop2: 'N0IABNDE8E'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 397368, prop2: 'O2WSIO2C13NAKEV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 553393, prop2: 'T9S495'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 625516, prop2: '1Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 428584, prop2: 'T8NWM5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 416608, prop2: 'VAUTHZ8L643PILR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 193979, prop2: 'K0C26'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 494700, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 852823, prop2: 'XLX6GZYV3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 756538, prop2: 'RF09STO9GXAH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 375593, prop2: 'FXBVL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 96835, prop2: 'YQNQ6CR7PZ8PCV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 282885, prop2: 'CZ5SJTJJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 543548, prop2: 'AQXQS0X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 181154, prop2: '1G23VRGK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 581131, prop2: '5MORMGN4MDBYHDX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 619480, prop2: 'NX0603XXVG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 68792, prop2: 'WH0ML0CPF30W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 890917, prop2: 'ZRH97846THGJYA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 838728, prop2: '5OPIFB4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 222606, prop2: '3LFLEZSP6V1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 982116, prop2: '3EEQ8PHR94'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 652161, prop2: 'I2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 841569, prop2: 'HDEH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 469186, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 837495, prop2: '3MTEN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 990988, prop2: 'UJ9E76I4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 563304, prop2: 'R5RD9I0TGN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 709357, prop2: 'ZH7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 725595, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 461587, prop2: '8XE86H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 910053, prop2: 'VFOGTA8G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 640945, prop2: '15WRM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 11896, prop2: 'ID0HO2P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 657625, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 369481, prop2: '9J5I68P7C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 222590, prop2: 'ZJPE6BYJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 406345, prop2: 'SIDMHLYHV1CYOM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 136029, prop2: 'GT1W95QRQUL0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 825143, prop2: 'F11TGV03WKLVP9P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 61786, prop2: 'QBWC1I4CRT86'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 121359, prop2: 'Y1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 367725, prop2: 'R9O2LMU07X5VRA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 799769, prop2: 'DGP5JR2Z9G7YBSR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 424369, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 585278, prop2: '97SZV220E2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 621193, prop2: 'UF3OXRB255G3KN6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 192294, prop2: 'F11C5QQNYL9GH5T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 830061, prop2: 'SC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 134664, prop2: 'IWIYF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 563700, prop2: '6AZMUI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 225744, prop2: 'KIRN82R9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 605610, prop2: '7LXYASFTZ87'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 660732, prop2: 'J5XHCN8Y0O2SN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 712624, prop2: 'BWCUWHPA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 76271, prop2: 'KRL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 488397, prop2: 'H6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 894742, prop2: '9ZXT131U'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 219610, prop2: '3F6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 378634, prop2: '2DF96PZWKXKH3YW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 912271, prop2: 'Q9HFT6KID13'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 642330, prop2: '7B7Y13K1QLFYF4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 883818, prop2: 'IVKVZ2WN2E4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 835557, prop2: '9ZUWLR0EWR8JD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 442343, prop2: 'PB4MBY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 548113, prop2: 'P6B6X5F4E5BA3C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 778766, prop2: '6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 289452, prop2: 'AV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 144038, prop2: 'WLHVZBR9KZEL7BJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 653104, prop2: 'XXP8NI5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 404822, prop2: '133CV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 828039, prop2: '8N1886SD24USMZQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 403379, prop2: 'JNOE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 717466, prop2: 'B4RAZMNT8Z5S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 449924, prop2: '1ST6HF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 489710, prop2: 'XPJX33ETX42'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 98965, prop2: 'V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 115763, prop2: 'W2Y3MNB1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 503334, prop2: '6GE0SL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 597859, prop2: '3Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 225392, prop2: 'OOLH1OPJSPK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 563599, prop2: 'YUBK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 900299, prop2: '25UGKX5R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 424854, prop2: '6F1DAMQ9SZYU0W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 638528, prop2: 'NL6LIJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 632686, prop2: 'FC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 68530, prop2: '12N4SP7IW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 785331, prop2: 'JPN0PY1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 68059, prop2: 'B7HLXLW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 535239, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 406003, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 641669, prop2: '3O32B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 35085, prop2: 'H5WKMOILX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 47273, prop2: 'V7B7N3TO12C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 516061, prop2: 'PLH4C8L0SB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 128641, prop2: '6URM3JRKZC8Y3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 869031, prop2: '2PIS8WG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 700621, prop2: '4HHVS2B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 324756, prop2: 'PTXUW7M3UW7Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 975496, prop2: 'DEI52'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 994319, prop2: '5VO05WF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 981110, prop2: 'N1OA7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 20975, prop2: 'NFSWQ0W2SH5PNI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 931809, prop2: 'TH34C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 236777, prop2: 'Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 315448, prop2: '5SP6A1GAU40OV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 436839, prop2: 'RILQTTXCWP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 628785, prop2: 'RWAX8E15MF2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 123556, prop2: 'ZFZRJCSIGCWV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 753004, prop2: 'CVS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 68915, prop2: '7NZW1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 555336, prop2: 'YDW2RMNL89B4AVJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 15184, prop2: '82KPS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 217076, prop2: 'AVAV6KTYRF4DV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 990918, prop2: '0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 563927, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 714762, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 852314, prop2: 'A7IOTWZF22X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 991143, prop2: 'X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 292869, prop2: 'ZW5O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 150418, prop2: 'KFVOKYL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 229997, prop2: 'YFPR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 133597, prop2: 'T24OVAXVIH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 53404, prop2: 'S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 418334, prop2: 'FZ7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 226074, prop2: '4PPFZJ0XESA9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 727958, prop2: '7DHNIC4YP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 602431, prop2: '2AEPENBXJU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 699135, prop2: 'B0G4XEOOIX0XD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 895374, prop2: '3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 366928, prop2: 'BEW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 42270, prop2: 'L84TJ4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 337799, prop2: 'KF2Z2TMP4C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 844128, prop2: '1A'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 863723, prop2: 'SF9R0X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 511907, prop2: 'SSU4B4QRI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 72152, prop2: 'JI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 57401, prop2: '9U50RC2BH02Q0HF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 514742, prop2: 'CYCSB4E9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 497558, prop2: 'OGCG12102XH4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 274782, prop2: 'XZ3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 722327, prop2: 'WAZU63KHG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 344167, prop2: 'H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 902029, prop2: 'Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 986051, prop2: 'MGF1GC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 815225, prop2: 'SONKJO6I743S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 494448, prop2: 'OLY8ZVS5BKO1Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 496098, prop2: 'NMI5ZCBE9ING5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 842833, prop2: 'T4SLZR4FDWN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 101869, prop2: '8U7KM3H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 653393, prop2: 'LRIUFSPLIO8WQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 477532, prop2: '0IZJVS05'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 663846, prop2: '2EC6OUV8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 922713, prop2: 'ZDSL9VXS34'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 631594, prop2: 'DS3Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 937700, prop2: '84'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 620805, prop2: 'N5PB2U3C9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 463913, prop2: 'N9JBO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 128550, prop2: 'FMPYX3S8KV1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 998761, prop2: 'PCG7NBEAGP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 857187, prop2: '1VS7T8CNRCS7E6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 660784, prop2: 'EY5B8115'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 820509, prop2: 'BV2G7L07'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 619458, prop2: '1Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 677393, prop2: 'Y0SPGCXE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 566910, prop2: '2PJ7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 933745, prop2: '6WV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 553248, prop2: 'Z1S7RRCZLU2PJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 833433, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 619663, prop2: 'I7RO7TBG48BC4P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 610750, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 909571, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 124612, prop2: 'S7TM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 832897, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 582155, prop2: 'QVUK4X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 220115, prop2: 'INBKQYFQHBCB6T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 485790, prop2: 'HF2E6VMA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 208123, prop2: 'N4Q3Y9PME'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 975960, prop2: 'EKDPDG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 504318, prop2: 'UQY0ZHJ5PR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 484098, prop2: 'FT0L'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 361180, prop2: 'P480OEE4RPHZ3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 332664, prop2: 'CFMNQ3TBJE8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 655321, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 252209, prop2: 'JRWXXPN4661IL0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 880708, prop2: '01T4X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 137845, prop2: 'VIGJB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 689023, prop2: 'JQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 575955, prop2: 'ML9RT2M69'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 401573, prop2: '825EZML676'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 880218, prop2: 'IWX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 204365, prop2: 'DS065PZR4T13'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 22674, prop2: 'CYIR6IK6XQ89AYV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 529449, prop2: '7IBMU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 61851, prop2: '7CK4Z0S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 901263, prop2: 'P1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 269222, prop2: 'QXVM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 28913, prop2: 'TKWBLZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 308949, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 805751, prop2: 'ZUX3UB3GAHV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 662326, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 60534, prop2: 'KWC7BCC3CY0MX2X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 663639, prop2: 'M7SGYXM9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 836997, prop2: '9J5RQBK6CIM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 55787, prop2: 'JJ9E4YK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 12736, prop2: 'WH9POV76K'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 280894, prop2: '70'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 53401, prop2: '1YYZG796'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 725580, prop2: 'CAGKGMTLL4ETTRL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 119203, prop2: 'DW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 959312, prop2: '30GS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 612281, prop2: '2G169WGPZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 765461, prop2: 'ECT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 527992, prop2: 'Z5JVXK9FNS1KJFP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 647029, prop2: 'AKO8XFUJUPP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 971718, prop2: 'L'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 451068, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 334532, prop2: 'ZC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 463682, prop2: 'ICKZ2GT7KL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 163354, prop2: '5ESUHXG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 716176, prop2: '1Y0999NI1T0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 340071, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 122409, prop2: '3MV7NVBJ89M4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 397932, prop2: '7VDFR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 77409, prop2: 'UVYCPTLY9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 963479, prop2: 'NW915DJJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 982421, prop2: '9JDZBJ1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 230894, prop2: '1S1NQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 527145, prop2: '22'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 649454, prop2: 'ST58KRS2WN99BBK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 658253, prop2: 'FHINK5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 608344, prop2: '63U1CTZ6OPZ6HKK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 165208, prop2: '7YWQVQA4V2RA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 211633, prop2: 'OXMQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 521526, prop2: '0GGKBW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 908564, prop2: '493'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 320421, prop2: 'HGP97BUI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 580404, prop2: 'K7PFY1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 722606, prop2: 'K0LL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 993752, prop2: 'LAQOTOS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 814532, prop2: 'DBM1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 406833, prop2: '8EQ1CGMX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 307266, prop2: 'O4HV7YJOKNNFYP3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 314958, prop2: 'KCZYBLQKMSO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 770077, prop2: 'S0U1NBE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 139021, prop2: '5IJ7SOR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 821201, prop2: '7CWKCSZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 423647, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 457356, prop2: 'SBYNTJ0UVFXNV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 180780, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 485065, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 7308, prop2: 'MYX5RJAEPDYQZNG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 585439, prop2: '66G53'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 17910, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 689917, prop2: 'GJFQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 975195, prop2: 'NS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 912502, prop2: 'TX97CFNMYE7B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 861767, prop2: 'A7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 367691, prop2: 'OE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 471435, prop2: 'A1JFTND37GL7IK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 65853, prop2: 'GM56G0192WGN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 389375, prop2: 'LP7L'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 940337, prop2: 'Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 971565, prop2: 'H7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 424219, prop2: 'VQG5ZP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 897483, prop2: 'WYJZFZ688HZ7QD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 399273, prop2: 'T8OMDAS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 478465, prop2: 'HRJA2GPX34'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 344932, prop2: 'QM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 81415, prop2: 'X4FGRVTF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 35230, prop2: 'U038'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 940752, prop2: 'BVFEBR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 172534, prop2: 'SR0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 801151, prop2: 'KERHFWKZFQWAAR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 834460, prop2: '60LFTI4Z0LNLY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 762961, prop2: 'HTFM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 776237, prop2: '6X9Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 742897, prop2: '2FDV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 2174, prop2: 'W6C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 40288, prop2: '3QSTXEP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 30684, prop2: 'EQT4DCM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 270774, prop2: 'GP5IWG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 558542, prop2: 'LANC6U58N2HVSIN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 98623, prop2: 'Y120ZAP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 491834, prop2: 'UBV52THSIP05OC9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 825245, prop2: 'BLJIHD5MZ5Y2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 457272, prop2: '4O2WT8LQOSUGNY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 31823, prop2: '1U1FX7K4N8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 988155, prop2: 'P3CRGKRK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 818499, prop2: 'PTFYH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 619420, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 743588, prop2: '3CSE0HN41B5D'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 335215, prop2: 'B3HRGRFXX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 787690, prop2: 'ZP1VTQ128MQ8A'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 787275, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 114886, prop2: 'X7IQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 394847, prop2: 'E89D84I2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 657583, prop2: 'WA2MH4OTH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 259098, prop2: '5L793QHG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 188432, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 381417, prop2: 'XDI1TKBEU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 423183, prop2: 'PC5PB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 105617, prop2: 'O1U5BYAFAV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 383693, prop2: '02FRWM6P4MZT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 701756, prop2: 'I1Y5KU6KIO7YF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 66313, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 506104, prop2: 'YRWTBOOPZUTO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 183315, prop2: '3AMSRMY7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 810041, prop2: 'LG3XT9Z42DPFV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 509411, prop2: 'I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 206801, prop2: 'Q5TVG48DM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 516108, prop2: 'TYRYS5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 340200, prop2: 'QG40WYKOHV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 757478, prop2: '0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 997613, prop2: '24'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 305381, prop2: 'M0V2BG5Z8O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 516977, prop2: '5KODUN64LG23'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 477132, prop2: 'SASYKXPAT3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 778825, prop2: 'KEECSWCXQOZY97'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 475913, prop2: '9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 60440, prop2: 'UCTOT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 538176, prop2: 'GZMHPCM511D'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 731985, prop2: 'Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 83616, prop2: 'SDRMJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 441868, prop2: 'S2EZIQDC9YJ88Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 783981, prop2: 'T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 963209, prop2: '5U6UTNIT4JVKECN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 382539, prop2: 'AP3ZTXR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 421761, prop2: '69OQP3NPB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 562314, prop2: 'MLI9UBE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 871817, prop2: 'SA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 538969, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 883489, prop2: '1JPZYJJBUWNBE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 799813, prop2: 'NJ6REVV7FXCWOK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 358179, prop2: '0TUJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 494492, prop2: 'M'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 123951, prop2: '7XGSN9PDQQQCV1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 376909, prop2: '53996RZBN0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 203367, prop2: 'YNAFB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 563140, prop2: 'WZFNJJDSIMOL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 460495, prop2: 'PEVIH0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 480257, prop2: 'LR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 351826, prop2: 'CQZEHWJXR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 502891, prop2: 'BNO8NE9M9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 368942, prop2: 'VHR7IQ3OM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 792731, prop2: '3V1V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 597183, prop2: 'WEYRG35FJVKSRO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 982499, prop2: 'RKJK2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 252729, prop2: 'CG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 172742, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 318335, prop2: '770VQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 707951, prop2: 'PJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 84909, prop2: '0YR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 826711, prop2: 'BU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 918444, prop2: 'O63QJ1042YOR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 519158, prop2: 'UFVTJ6X1YB4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 587717, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 69086, prop2: 'ZD0SAYZTX3KF82'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 258411, prop2: '4V07M2B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 202523, prop2: 'RHTX2DYN35P18'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 593572, prop2: 'P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 81462, prop2: 'M9ORT50BZCHZEOE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 640022, prop2: '02E0EVRN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 999673, prop2: 'EOV9CEDYTL8TX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 398833, prop2: 'JFCOCIMKW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 213771, prop2: 'FFYNXG3HTZO0S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 275074, prop2: 'K70WBHQ4UQJ8SV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 665203, prop2: 'A47EUVRXLY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 554943, prop2: 'NMI9GGKK0E'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 186041, prop2: 'TO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 451983, prop2: '01OVWIN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 657035, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 381292, prop2: 'K7W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 49671, prop2: 'QFSNCLRCL04LR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 886106, prop2: '7GII677G3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 641157, prop2: 'G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 996771, prop2: 'OLSWHSDL19QT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 69267, prop2: 'L4Z8T64AT84V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 933245, prop2: 'G855ASOEI4G00X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 376822, prop2: 'L8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 711668, prop2: '5H3OE4B6B2TILX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 611004, prop2: 'JC64YI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 746144, prop2: 'G4UHD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 288194, prop2: 'KMRVJC2S0DS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 220689, prop2: 'W63'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 420641, prop2: 'K7C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 86384, prop2: 'CL0SZFB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 92112, prop2: 'F1BTQ5Q5EP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 601052, prop2: 'NSCXOF9DTH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 297671, prop2: 'R6KOXN2QH5RV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 306986, prop2: 'UKRCTXT431D22MK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 118651, prop2: 'AZ9QS18BIW6E1SZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 387713, prop2: '3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 698874, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 596451, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 954553, prop2: '37WG2GFM8L8FHH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 846094, prop2: 'C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 40265, prop2: '5B05UFXMG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 500960, prop2: '41Y2ZTOCWXPD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 777913, prop2: '9AHJUTDVR0L6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 340617, prop2: '1CLE8V88'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 424418, prop2: 'GEVJFCPBVD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 980271, prop2: 'F9MWWQPKV63'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 26548, prop2: 'XS9E'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 128345, prop2: 'AGAA4T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 479646, prop2: 'BWX5F9I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 712445, prop2: 'YS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 142387, prop2: 'V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 13253, prop2: 'FIJ7PCOULO1AN0J'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 943609, prop2: '19WGIAQ0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 535048, prop2: 'B0N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 86106, prop2: '4DLQGYR6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 142878, prop2: '0BOR4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 516507, prop2: 'K3XGN2JSZRO9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 598999, prop2: 'BDBPGQ1U7Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 224533, prop2: 'RBGRZW5EEH9FDP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 800314, prop2: '7DX8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 349555, prop2: 'G85UM9PA2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 878647, prop2: '1F09F74A332W'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 244396, prop2: '8429C3T3U4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 65403, prop2: 'CMM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 548098, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 303757, prop2: 'CU21BVEUQQFB1O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 921695, prop2: 'SA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 563745, prop2: '8HUO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 552974, prop2: 'IL11BB3T7V6IUNH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 2186, prop2: 'OTPWGZTWIMBN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 51293, prop2: 'AACC1ZBLM2L19F'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 700205, prop2: 'T0LRDX9S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 511169, prop2: '5F99T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 529986, prop2: '1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 654160, prop2: '9DRVVZE906'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 931149, prop2: '78P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 309101, prop2: '51'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 555070, prop2: 'U1HFT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 600385, prop2: 'QX6U31M1QMYPUPA'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 701572, prop2: 'UX30OLTU1659'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 838526, prop2: 'GSNTP8M2AJ85R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 129752, prop2: '0N1S1DGB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 621945, prop2: 'NQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 740537, prop2: '44AZ9NSFZ9TPPK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 736123, prop2: 'TTSVN7Z1ISXFH0'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 357503, prop2: '02HT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 424125, prop2: 'BHO9NBW9TWP5YXD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 244340, prop2: '97VKPEO2FRFV'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 226752, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 134643, prop2: 'D'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 783729, prop2: 'SGUF4LX1QLMWI0V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 896228, prop2: 'SJ6XEQJJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 537378, prop2: '37QQU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 737328, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 178385, prop2: 'OVEJISHGIS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 225648, prop2: 'Z44N4C37WIM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 969182, prop2: '35U716IRE3ZI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 57539, prop2: 'RUM9CZ8C9T'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 362577, prop2: '8AL9O6V9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 850019, prop2: 'U4ISQ2M'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 366493, prop2: 'GJTG1090'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 664823, prop2: '27QARXGXWD7U'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 816428, prop2: 'D3ZLWVYU2M'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 791917, prop2: 'KAWX07'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 871307, prop2: 'O93B37PUR1W6V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 19798, prop2: 'E57DS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 993995, prop2: 'H06X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 108359, prop2: 'MCYVTOO27IXHI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 750748, prop2: '11N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 848806, prop2: '9KBWJF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 656421, prop2: '2PUJ8E1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 605980, prop2: '3HJNFYX69TB7T92'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 455177, prop2: 'OFJ6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 569235, prop2: '4VXI43OWKQI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 986151, prop2: '9ME'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 154108, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 512450, prop2: '3P4FQMR4EAZT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 209608, prop2: 'FD3D1HDCO5Y'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 960608, prop2: '6WDRM82HWPALMHT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 129314, prop2: 'EWGY5114QT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 500752, prop2: 'PG90R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 24402, prop2: 'AXWARMMRP2K399'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 702032, prop2: 'K13IC25'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 914596, prop2: '4N81T98Q93Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 975164, prop2: 'E54Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 854602, prop2: '5GWIJXQ14K09J'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 523133, prop2: 'WAYR5E9'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 926343, prop2: 'MJQUO4PLZIYNJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 890503, prop2: '7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 995293, prop2: 'QT87C106F'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 785377, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 756958, prop2: '5A'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 684842, prop2: 'H70W6O5JCX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 426304, prop2: 'Y7ZW5K'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 780935, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 508374, prop2: 'VTEB8Q18WH7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 996890, prop2: 'W91T3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 8478, prop2: 'M5B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 609868, prop2: 'ZN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 965508, prop2: 'XBG3BA9K0UR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 671190, prop2: 'AOF7ISB86H'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 386538, prop2: 'TC5W5WRB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 116460, prop2: 'X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 323899, prop2: 'X32'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 620732, prop2: 'JNY4JDOZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 562987, prop2: '1OVOY7AQEAYZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 191373, prop2: 'ME'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 747843, prop2: 'TVO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 501433, prop2: '5D9H97ZAOB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 88673, prop2: 'JFCBF3A4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 843877, prop2: 'GS7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 642427, prop2: '9LPS2P6N'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 428839, prop2: 'YMT2WYIJ24'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 497354, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 456975, prop2: 'O6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 783910, prop2: 'I'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 465047, prop2: 'S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 380378, prop2: 'A5YRTK8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 101821, prop2: 'E55WLB9DI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 310362, prop2: 'CAGO0U6X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 301984, prop2: '45JNC9OS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 940856, prop2: 'MG3AQP5IVN'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 521565, prop2: '21H2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 404063, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 631401, prop2: 'YBW366'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 126126, prop2: '43'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 99716, prop2: '3YGUAG3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 422743, prop2: '34IHAC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 601542, prop2: 'PKBXCR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 360555, prop2: '0ITJBWCPJQS6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 898384, prop2: 'AQ9RB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 267187, prop2: '7ODNS'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 528232, prop2: 'ZXVUIN0UCQ8NEV7'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 826422, prop2: 'Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 972155, prop2: '5CGRS1FWDSCJ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 840127, prop2: 'MN7JX'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 846332, prop2: 'QSIAE8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 881706, prop2: 'B3881X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 427532, prop2: 'GB7Q2V60'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 784307, prop2: '5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 372206, prop2: 'D'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 339800, prop2: 'S6JK3EF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 363202, prop2: 'U'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 267686, prop2: 'FYF88E4U0B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 201851, prop2: 'JE7XOI29FQM09L'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 480833, prop2: 'N83DEQVTIKZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 756133, prop2: 'JLO1Q7LGE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 649633, prop2: 'DKTNO1VX8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 655840, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 656130, prop2: 'NAGHE9JAOMDC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 644337, prop2: 'W8DD5BUHVIOFKP5'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 831648, prop2: 'UW'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 519354, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 616041, prop2: 'J'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 857213, prop2: 'X'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 572213, prop2: 'C8C9OAPYKTG5W0O'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 778226, prop2: 'Q2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 462618, prop2: '7RDWAPXYCQYYCPB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 735572, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 218169, prop2: 'P14JQLDK'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 62947, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 239560, prop2: 'MQMK9O9CVCT70BI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 65970, prop2: 'V02ZC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 356524, prop2: '1VJKUYDZNSM6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 971643, prop2: 'FPSE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 507539, prop2: '8V3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 179675, prop2: '0RK2GBPR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 718372, prop2: 'IAERU8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 758098, prop2: 'TCO7QJG'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 604562, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 982789, prop2: 'QW1NCJXVI9C4R7U'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 207852, prop2: 'LQD1'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 878586, prop2: 'HG4Z3YVTT0C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 350952, prop2: 'OOU4AXKG556'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 73189, prop2: 'U'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 929891, prop2: '59CW2ZB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 963585, prop2: 'I7T6RBX6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 243195, prop2: 'G'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 591486, prop2: 'XV9D165HP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 203722, prop2: '02'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 226465, prop2: '3C6'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 656275, prop2: 'LKMXV9O8K16S'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 785509, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 613976, prop2: '2B'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 972995, prop2: '3R7GN0QJRC'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 982973, prop2: 'C'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 6846, prop2: 'XI07C4FBY5JZ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 219163, prop2: 'VCLB'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 410246, prop2: '5GL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 667818, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 181234, prop2: '4JD27PRH7TAS4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 226227, prop2: 'G3MRK548P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 578961, prop2: 'V4E8'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 730591, prop2: 'MFBJGE1EQA4'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 530830, prop2: '287'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 573394, prop2: 'XVLQR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 696688, prop2: 'GSNC8NECI'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 399414, prop2: 'B2OXLY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 496931, prop2: 'X4GWEK2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 85364, prop2: 'CVTRC9KE3DO5R'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 133669, prop2: 'W5SC58VFVJY'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 760240, prop2: '9ESG02FEMMVA9Q'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 781824, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 700768, prop2: 'TL'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 884081, prop2: '2Z8MXJRFF2GRSQ'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 992748, prop2: 'I8VVND4BR'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 941454, prop2: '1IHFOVBVE'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 323230, prop2: '6N2'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 569611, prop2: 'NMQTDO'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 333298, prop2: 'T1MQEIRH'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 890940, prop2: 'RYIHT385J'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 244687, prop2: '7B6LAD'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 175180, prop2: '07P'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 523195, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 214723, prop2: 'A9KVESQ587U'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 891945, prop2: 'Y3L307KPRDJ4WR3'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 550035, prop2: 'L7X67G4QY4V'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 424124, prop2: '1OF523OWP'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 104646, prop2: ''}); ----- ok --STATEMENT CREATE (p:Person {prop1: 765752, prop2: 'PSU21N9YV5KT'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 649873, prop2: 'I1PEA8K'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 959449, prop2: 'ZAUL7LERRJU'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 752360, prop2: 'WJF'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 661157, prop2: 'FAUWJ055ZSM'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 708876, prop2: 'M4UGSLZLSQ257Z'}); ----- ok --STATEMENT CREATE (p:Person {prop1: 375732, prop2: '84'}); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=221 AND p2.id=684 CREATE (p1)-[e:knows {prop1: 187438}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=12 AND p2.id=411 CREATE (p1)-[e:knows {prop1: 347757}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=314 AND p2.id=737 CREATE (p1)-[e:knows {prop1: 648070}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=464 AND p2.id=803 CREATE (p1)-[e:knows {prop1: 254041}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=190 AND p2.id=208 CREATE (p1)-[e:knows {prop1: 864300}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=826 AND p2.id=205 CREATE (p1)-[e:knows {prop1: 661907}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=748 AND p2.id=24 CREATE (p1)-[e:knows {prop1: 960069}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=953 AND p2.id=173 CREATE (p1)-[e:knows {prop1: 598856}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=947 AND p2.id=568 CREATE (p1)-[e:knows {prop1: 353656}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=288 AND p2.id=363 CREATE (p1)-[e:knows {prop1: 436642}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=327 AND p2.id=66 CREATE (p1)-[e:knows {prop1: 872512}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=628 AND p2.id=881 CREATE (p1)-[e:knows {prop1: 398202}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=736 AND p2.id=270 CREATE (p1)-[e:knows {prop1: 559624}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=394 AND p2.id=606 CREATE (p1)-[e:knows {prop1: 714122}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=568 AND p2.id=290 CREATE (p1)-[e:knows {prop1: 457840}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=637 AND p2.id=680 CREATE (p1)-[e:knows {prop1: 340454}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=632 AND p2.id=604 CREATE (p1)-[e:knows {prop1: 522070}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=615 AND p2.id=237 CREATE (p1)-[e:knows {prop1: 937204}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=865 AND p2.id=434 CREATE (p1)-[e:knows {prop1: 595093}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=927 AND p2.id=760 CREATE (p1)-[e:knows {prop1: 306874}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=127 AND p2.id=952 CREATE (p1)-[e:knows {prop1: 337563}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=410 AND p2.id=783 CREATE (p1)-[e:knows {prop1: 320975}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=788 AND p2.id=937 CREATE (p1)-[e:knows {prop1: 77654}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=72 AND p2.id=329 CREATE (p1)-[e:knows {prop1: 240520}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=359 AND p2.id=20 CREATE (p1)-[e:knows {prop1: 793412}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=594 AND p2.id=895 CREATE (p1)-[e:knows {prop1: 534205}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=739 AND p2.id=322 CREATE (p1)-[e:knows {prop1: 408644}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=870 AND p2.id=507 CREATE (p1)-[e:knows {prop1: 259464}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=14 AND p2.id=27 CREATE (p1)-[e:knows {prop1: 881527}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=509 AND p2.id=808 CREATE (p1)-[e:knows {prop1: 684129}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=535 AND p2.id=156 CREATE (p1)-[e:knows {prop1: 763319}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=438 AND p2.id=329 CREATE (p1)-[e:knows {prop1: 680292}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=947 AND p2.id=440 CREATE (p1)-[e:knows {prop1: 955132}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=75 AND p2.id=970 CREATE (p1)-[e:knows {prop1: 539073}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=523 AND p2.id=639 CREATE (p1)-[e:knows {prop1: 840683}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=64 AND p2.id=682 CREATE (p1)-[e:knows {prop1: 411664}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=22 AND p2.id=156 CREATE (p1)-[e:knows {prop1: 981174}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=480 AND p2.id=678 CREATE (p1)-[e:knows {prop1: 624107}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=158 AND p2.id=485 CREATE (p1)-[e:knows {prop1: 424967}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=131 AND p2.id=241 CREATE (p1)-[e:knows {prop1: 414736}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=214 AND p2.id=958 CREATE (p1)-[e:knows {prop1: 505276}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=271 AND p2.id=867 CREATE (p1)-[e:knows {prop1: 808145}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=363 AND p2.id=968 CREATE (p1)-[e:knows {prop1: 478478}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=429 AND p2.id=391 CREATE (p1)-[e:knows {prop1: 926749}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=132 AND p2.id=174 CREATE (p1)-[e:knows {prop1: 868681}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=759 AND p2.id=156 CREATE (p1)-[e:knows {prop1: 541832}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=941 AND p2.id=729 CREATE (p1)-[e:knows {prop1: 52253}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=858 AND p2.id=785 CREATE (p1)-[e:knows {prop1: 653724}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=547 AND p2.id=712 CREATE (p1)-[e:knows {prop1: 850017}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=500 AND p2.id=33 CREATE (p1)-[e:knows {prop1: 77445}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=126 AND p2.id=442 CREATE (p1)-[e:knows {prop1: 813124}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=345 AND p2.id=194 CREATE (p1)-[e:knows {prop1: 460423}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=197 AND p2.id=628 CREATE (p1)-[e:knows {prop1: 601291}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=138 AND p2.id=549 CREATE (p1)-[e:knows {prop1: 995588}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=153 AND p2.id=129 CREATE (p1)-[e:knows {prop1: 894599}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=51 AND p2.id=794 CREATE (p1)-[e:knows {prop1: 921834}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=953 AND p2.id=70 CREATE (p1)-[e:knows {prop1: 857345}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=175 AND p2.id=76 CREATE (p1)-[e:knows {prop1: 846226}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=76 AND p2.id=763 CREATE (p1)-[e:knows {prop1: 301400}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=99 AND p2.id=909 CREATE (p1)-[e:knows {prop1: 483705}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=368 AND p2.id=952 CREATE (p1)-[e:knows {prop1: 128799}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=252 AND p2.id=438 CREATE (p1)-[e:knows {prop1: 205126}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=869 AND p2.id=778 CREATE (p1)-[e:knows {prop1: 954850}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=142 AND p2.id=665 CREATE (p1)-[e:knows {prop1: 504341}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=341 AND p2.id=746 CREATE (p1)-[e:knows {prop1: 923368}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=910 AND p2.id=226 CREATE (p1)-[e:knows {prop1: 12935}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=73 AND p2.id=120 CREATE (p1)-[e:knows {prop1: 963673}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=13 AND p2.id=133 CREATE (p1)-[e:knows {prop1: 493026}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=536 AND p2.id=295 CREATE (p1)-[e:knows {prop1: 213245}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=968 AND p2.id=217 CREATE (p1)-[e:knows {prop1: 248463}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=736 AND p2.id=774 CREATE (p1)-[e:knows {prop1: 827694}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=46 AND p2.id=784 CREATE (p1)-[e:knows {prop1: 174688}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=141 AND p2.id=363 CREATE (p1)-[e:knows {prop1: 663636}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=607 AND p2.id=906 CREATE (p1)-[e:knows {prop1: 365437}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=681 AND p2.id=659 CREATE (p1)-[e:knows {prop1: 701020}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=326 AND p2.id=881 CREATE (p1)-[e:knows {prop1: 67425}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=699 AND p2.id=693 CREATE (p1)-[e:knows {prop1: 769695}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=136 AND p2.id=388 CREATE (p1)-[e:knows {prop1: 625616}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=85 AND p2.id=987 CREATE (p1)-[e:knows {prop1: 842083}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=382 AND p2.id=135 CREATE (p1)-[e:knows {prop1: 890433}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=357 AND p2.id=488 CREATE (p1)-[e:knows {prop1: 574862}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=706 AND p2.id=240 CREATE (p1)-[e:knows {prop1: 118672}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=177 AND p2.id=574 CREATE (p1)-[e:knows {prop1: 528880}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=428 AND p2.id=65 CREATE (p1)-[e:knows {prop1: 645328}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=524 AND p2.id=8 CREATE (p1)-[e:knows {prop1: 663415}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=479 AND p2.id=307 CREATE (p1)-[e:knows {prop1: 407395}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=630 AND p2.id=326 CREATE (p1)-[e:knows {prop1: 69066}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=313 AND p2.id=557 CREATE (p1)-[e:knows {prop1: 981291}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=614 AND p2.id=430 CREATE (p1)-[e:knows {prop1: 961153}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=436 AND p2.id=857 CREATE (p1)-[e:knows {prop1: 909400}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=295 AND p2.id=623 CREATE (p1)-[e:knows {prop1: 893432}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=477 AND p2.id=999 CREATE (p1)-[e:knows {prop1: 749738}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=901 AND p2.id=106 CREATE (p1)-[e:knows {prop1: 321588}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=478 AND p2.id=885 CREATE (p1)-[e:knows {prop1: 730897}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=739 AND p2.id=761 CREATE (p1)-[e:knows {prop1: 387158}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=729 AND p2.id=543 CREATE (p1)-[e:knows {prop1: 270683}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=350 AND p2.id=634 CREATE (p1)-[e:knows {prop1: 189728}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=94 AND p2.id=856 CREATE (p1)-[e:knows {prop1: 158671}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=909 AND p2.id=366 CREATE (p1)-[e:knows {prop1: 221017}]->(p2); ----- ok --STATEMENT MATCH (p1:Person), (p2:Person) WHERE p1.id=771 AND p2.id=135 CREATE (p1)-[e:knows {prop1: 518103}]->(p2); ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=221 AND p2.id=684 AND e.prop1=187438 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=12 AND p2.id=411 AND e.prop1=347757 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=314 AND p2.id=737 AND e.prop1=648070 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=464 AND p2.id=803 AND e.prop1=254041 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=190 AND p2.id=208 AND e.prop1=864300 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=826 AND p2.id=205 AND e.prop1=661907 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=748 AND p2.id=24 AND e.prop1=960069 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=953 AND p2.id=173 AND e.prop1=598856 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=947 AND p2.id=568 AND e.prop1=353656 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=288 AND p2.id=363 AND e.prop1=436642 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=327 AND p2.id=66 AND e.prop1=872512 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=628 AND p2.id=881 AND e.prop1=398202 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=736 AND p2.id=270 AND e.prop1=559624 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=394 AND p2.id=606 AND e.prop1=714122 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=568 AND p2.id=290 AND e.prop1=457840 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=637 AND p2.id=680 AND e.prop1=340454 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=632 AND p2.id=604 AND e.prop1=522070 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=615 AND p2.id=237 AND e.prop1=937204 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=865 AND p2.id=434 AND e.prop1=595093 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=927 AND p2.id=760 AND e.prop1=306874 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=127 AND p2.id=952 AND e.prop1=337563 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=410 AND p2.id=783 AND e.prop1=320975 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=788 AND p2.id=937 AND e.prop1=77654 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=72 AND p2.id=329 AND e.prop1=240520 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=359 AND p2.id=20 AND e.prop1=793412 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=594 AND p2.id=895 AND e.prop1=534205 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=739 AND p2.id=322 AND e.prop1=408644 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=870 AND p2.id=507 AND e.prop1=259464 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=14 AND p2.id=27 AND e.prop1=881527 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=509 AND p2.id=808 AND e.prop1=684129 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=535 AND p2.id=156 AND e.prop1=763319 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=438 AND p2.id=329 AND e.prop1=680292 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=947 AND p2.id=440 AND e.prop1=955132 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=75 AND p2.id=970 AND e.prop1=539073 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=523 AND p2.id=639 AND e.prop1=840683 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=64 AND p2.id=682 AND e.prop1=411664 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=22 AND p2.id=156 AND e.prop1=981174 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=480 AND p2.id=678 AND e.prop1=624107 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=158 AND p2.id=485 AND e.prop1=424967 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=131 AND p2.id=241 AND e.prop1=414736 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=214 AND p2.id=958 AND e.prop1=505276 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=271 AND p2.id=867 AND e.prop1=808145 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=363 AND p2.id=968 AND e.prop1=478478 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=429 AND p2.id=391 AND e.prop1=926749 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=132 AND p2.id=174 AND e.prop1=868681 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=759 AND p2.id=156 AND e.prop1=541832 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=941 AND p2.id=729 AND e.prop1=52253 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=858 AND p2.id=785 AND e.prop1=653724 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=547 AND p2.id=712 AND e.prop1=850017 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=500 AND p2.id=33 AND e.prop1=77445 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=126 AND p2.id=442 AND e.prop1=813124 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=345 AND p2.id=194 AND e.prop1=460423 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=197 AND p2.id=628 AND e.prop1=601291 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=138 AND p2.id=549 AND e.prop1=995588 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=153 AND p2.id=129 AND e.prop1=894599 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=51 AND p2.id=794 AND e.prop1=921834 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=953 AND p2.id=70 AND e.prop1=857345 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=175 AND p2.id=76 AND e.prop1=846226 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=76 AND p2.id=763 AND e.prop1=301400 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=99 AND p2.id=909 AND e.prop1=483705 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=368 AND p2.id=952 AND e.prop1=128799 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=252 AND p2.id=438 AND e.prop1=205126 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=869 AND p2.id=778 AND e.prop1=954850 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=142 AND p2.id=665 AND e.prop1=504341 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=341 AND p2.id=746 AND e.prop1=923368 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=910 AND p2.id=226 AND e.prop1=12935 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=73 AND p2.id=120 AND e.prop1=963673 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=13 AND p2.id=133 AND e.prop1=493026 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=536 AND p2.id=295 AND e.prop1=213245 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=968 AND p2.id=217 AND e.prop1=248463 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=736 AND p2.id=774 AND e.prop1=827694 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=46 AND p2.id=784 AND e.prop1=174688 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=141 AND p2.id=363 AND e.prop1=663636 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=607 AND p2.id=906 AND e.prop1=365437 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=681 AND p2.id=659 AND e.prop1=701020 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=326 AND p2.id=881 AND e.prop1=67425 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=699 AND p2.id=693 AND e.prop1=769695 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=136 AND p2.id=388 AND e.prop1=625616 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=85 AND p2.id=987 AND e.prop1=842083 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=382 AND p2.id=135 AND e.prop1=890433 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=357 AND p2.id=488 AND e.prop1=574862 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=706 AND p2.id=240 AND e.prop1=118672 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=177 AND p2.id=574 AND e.prop1=528880 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=428 AND p2.id=65 AND e.prop1=645328 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=524 AND p2.id=8 AND e.prop1=663415 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=479 AND p2.id=307 AND e.prop1=407395 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=630 AND p2.id=326 AND e.prop1=69066 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=313 AND p2.id=557 AND e.prop1=981291 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=614 AND p2.id=430 AND e.prop1=961153 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=436 AND p2.id=857 AND e.prop1=909400 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=295 AND p2.id=623 AND e.prop1=893432 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=477 AND p2.id=999 AND e.prop1=749738 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=901 AND p2.id=106 AND e.prop1=321588 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=478 AND p2.id=885 AND e.prop1=730897 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=739 AND p2.id=761 AND e.prop1=387158 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=729 AND p2.id=543 AND e.prop1=270683 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=350 AND p2.id=634 AND e.prop1=189728 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=94 AND p2.id=856 AND e.prop1=158671 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=909 AND p2.id=366 AND e.prop1=221017 DELETE e; ----- ok --STATEMENT MATCH (p1:Person)-[e:knows]->(p2:Person) WHERE p1.id=771 AND p2.id=135 AND e.prop1=518103 DELETE e; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=0 AND p.prop1=142215 AND p.prop2='Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=1 AND p.prop1=878242 AND p.prop2='GO4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=2 AND p.prop1=836516 AND p.prop2='7R2MJD25G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=3 AND p.prop1=206382 AND p.prop2='X137NINSSS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=4 AND p.prop1=120923 AND p.prop2='TVB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=5 AND p.prop1=876432 AND p.prop2='YIKU910' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=6 AND p.prop1=38863 AND p.prop2='MZVHYJ0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=7 AND p.prop1=927513 AND p.prop2='80QOC1HMG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=8 AND p.prop1=371524 AND p.prop2='V2J1HETGK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=9 AND p.prop1=550015 AND p.prop2='MPZWQC5SW7A' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=10 AND p.prop1=487871 AND p.prop2='EHVFGX86N5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=11 AND p.prop1=595954 AND p.prop2='B185J2K' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=12 AND p.prop1=122737 AND p.prop2='5RK9HBF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=13 AND p.prop1=985147 AND p.prop2='TEGKHN5LIDU77P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=14 AND p.prop1=824973 AND p.prop2='EJCDDAYLXH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=15 AND p.prop1=565022 AND p.prop2='ZIHY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=16 AND p.prop1=583825 AND p.prop2='NC9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=17 AND p.prop1=685363 AND p.prop2='RH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=18 AND p.prop1=958294 AND p.prop2='YLENEN4NQ1A' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=19 AND p.prop1=284652 AND p.prop2='UQNYSKI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=20 AND p.prop1=210888 AND p.prop2='LGWV7OIMJ0O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=21 AND p.prop1=281745 AND p.prop2='NH4WXFWO7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=22 AND p.prop1=280189 AND p.prop2='FDPBGGH5I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=23 AND p.prop1=269537 AND p.prop2='BO5JAX62ZHEW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=24 AND p.prop1=734377 AND p.prop2='DAWIYOLU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=25 AND p.prop1=152454 AND p.prop2='WGF0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=26 AND p.prop1=848083 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=27 AND p.prop1=639375 AND p.prop2='42WN66XP9C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=28 AND p.prop1=110955 AND p.prop2='N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=29 AND p.prop1=103714 AND p.prop2='A78TOD4HMSHPX3N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=30 AND p.prop1=180357 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=31 AND p.prop1=955977 AND p.prop2='N8NZGFAT3WC6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=32 AND p.prop1=561795 AND p.prop2='TJEPGIKWOB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=33 AND p.prop1=775568 AND p.prop2='Z6JA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=34 AND p.prop1=446328 AND p.prop2='ZN732JW8V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=35 AND p.prop1=357881 AND p.prop2='2XDI1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=36 AND p.prop1=651829 AND p.prop2='TSFSRD9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=37 AND p.prop1=533241 AND p.prop2='JYIU65HS7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=38 AND p.prop1=526516 AND p.prop2='WF3T6TYE0S0G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=39 AND p.prop1=172117 AND p.prop2='0CGK01OP7I3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=40 AND p.prop1=842075 AND p.prop2='78Z6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=41 AND p.prop1=476616 AND p.prop2='3R7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=42 AND p.prop1=198061 AND p.prop2='NWA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=43 AND p.prop1=578273 AND p.prop2='Z2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=44 AND p.prop1=502321 AND p.prop2='WVML0NE65859MT3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=45 AND p.prop1=869561 AND p.prop2='P74KOQS4DQ5E' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=46 AND p.prop1=313493 AND p.prop2='QI5CYSQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=47 AND p.prop1=774511 AND p.prop2='UTV79CVE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=48 AND p.prop1=272775 AND p.prop2='A0P8GWYI829K' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=49 AND p.prop1=903471 AND p.prop2='8T1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=50 AND p.prop1=759878 AND p.prop2='R21SJGEJY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=51 AND p.prop1=321168 AND p.prop2='VG3IGJ8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=52 AND p.prop1=260765 AND p.prop2='CQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=53 AND p.prop1=734470 AND p.prop2='VC4IHNL2ECR02C6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=54 AND p.prop1=83448 AND p.prop2='OMYU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=55 AND p.prop1=432067 AND p.prop2='COZ8Q7GCOJNG0H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=56 AND p.prop1=726038 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=57 AND p.prop1=4987 AND p.prop2='UXBR1066RBUN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=58 AND p.prop1=682142 AND p.prop2='NWH9L0M9S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=59 AND p.prop1=193306 AND p.prop2='N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=60 AND p.prop1=576741 AND p.prop2='EQJ8PAMCHKFO37' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=61 AND p.prop1=319178 AND p.prop2='HTYJP1XGUC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=62 AND p.prop1=475596 AND p.prop2='LWB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=63 AND p.prop1=410752 AND p.prop2='8RMZOWD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=64 AND p.prop1=497200 AND p.prop2='OADFC0K7OOS62FV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=65 AND p.prop1=729981 AND p.prop2='36TNCVK1I3R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=66 AND p.prop1=263975 AND p.prop2='4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=67 AND p.prop1=577758 AND p.prop2='C9NG9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=68 AND p.prop1=246488 AND p.prop2='HTZ1QS1AJ12WN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=69 AND p.prop1=521264 AND p.prop2='24BI1SFKVJNV1K2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=70 AND p.prop1=400001 AND p.prop2='1Y20' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=71 AND p.prop1=685249 AND p.prop2='O8U7PDMV8WSQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=72 AND p.prop1=977470 AND p.prop2='DAGYKA2074OVM6M' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=73 AND p.prop1=267925 AND p.prop2='JD3HLW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=74 AND p.prop1=814093 AND p.prop2='H8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=75 AND p.prop1=248280 AND p.prop2='UW8SYG1GFMTNQZU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=76 AND p.prop1=186303 AND p.prop2='8N5P72QGNM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=77 AND p.prop1=202328 AND p.prop2='V7T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=78 AND p.prop1=267629 AND p.prop2='3NKG5IBZN6C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=79 AND p.prop1=442319 AND p.prop2='WOBU124ROR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=80 AND p.prop1=918851 AND p.prop2='Z42RM4W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=81 AND p.prop1=489975 AND p.prop2='62U2M0WBVEY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=82 AND p.prop1=765461 AND p.prop2='65TAGXYIS2L3NH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=83 AND p.prop1=925161 AND p.prop2='C4E35H4JGKZE6Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=84 AND p.prop1=43575 AND p.prop2='UI9XTE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=85 AND p.prop1=699449 AND p.prop2='SW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=86 AND p.prop1=264126 AND p.prop2='WT34RHLW44' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=87 AND p.prop1=473492 AND p.prop2='IH2AJUMI7NU89' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=88 AND p.prop1=350244 AND p.prop2='RBCKIS1SJN0BHW5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=89 AND p.prop1=282497 AND p.prop2='O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=90 AND p.prop1=194572 AND p.prop2='25O1CMU6KW3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=91 AND p.prop1=499424 AND p.prop2='9ZJ5KPDV313F1T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=92 AND p.prop1=124516 AND p.prop2='9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=93 AND p.prop1=480616 AND p.prop2='N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=94 AND p.prop1=886471 AND p.prop2='J' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=95 AND p.prop1=652691 AND p.prop2='WD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=96 AND p.prop1=652602 AND p.prop2='L8N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=97 AND p.prop1=203657 AND p.prop2='EW7HF91NJX5HD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=98 AND p.prop1=364764 AND p.prop2='031DV0SG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=99 AND p.prop1=160943 AND p.prop2='X0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=100 AND p.prop1=423712 AND p.prop2='OTRCXTBAT85H7L0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=101 AND p.prop1=856546 AND p.prop2='E8M1UGJNSB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=102 AND p.prop1=72737 AND p.prop2='39APMZWXQKR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=103 AND p.prop1=538681 AND p.prop2='GVWT9UTHBFBW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=104 AND p.prop1=104942 AND p.prop2='K0S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=105 AND p.prop1=118091 AND p.prop2='HCV6J0Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=106 AND p.prop1=472091 AND p.prop2='779RUF27I8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=107 AND p.prop1=481565 AND p.prop2='5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=108 AND p.prop1=919296 AND p.prop2='KKNFCXMEBG23ZY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=109 AND p.prop1=103019 AND p.prop2='HMNW2R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=110 AND p.prop1=20762 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=111 AND p.prop1=879748 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=112 AND p.prop1=828648 AND p.prop2='OY1HH6I1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=113 AND p.prop1=884177 AND p.prop2='A8W46I6P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=114 AND p.prop1=47315 AND p.prop2='AKE9AZ9WHP73R17' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=115 AND p.prop1=253408 AND p.prop2='4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=116 AND p.prop1=302335 AND p.prop2='2ETE8NY0EBVT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=117 AND p.prop1=150650 AND p.prop2='7AANX6F2JXQDJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=118 AND p.prop1=530197 AND p.prop2='C8EK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=119 AND p.prop1=674541 AND p.prop2='MHM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=120 AND p.prop1=837944 AND p.prop2='384' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=121 AND p.prop1=194173 AND p.prop2='8BGI8SFJ7CEYV9I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=122 AND p.prop1=361779 AND p.prop2='MC0FATBIL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=123 AND p.prop1=203176 AND p.prop2='RH5VQM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=124 AND p.prop1=133891 AND p.prop2='0P17N0TVK8WRTKP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=125 AND p.prop1=957099 AND p.prop2='DG9CRR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=126 AND p.prop1=103250 AND p.prop2='VU3L18HW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=127 AND p.prop1=750558 AND p.prop2='RCJJJ9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=128 AND p.prop1=414057 AND p.prop2='EGVD5L5ZA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=129 AND p.prop1=885326 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=130 AND p.prop1=364776 AND p.prop2='K4KYXRJ63502LQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=131 AND p.prop1=483675 AND p.prop2='N0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=132 AND p.prop1=122272 AND p.prop2='MKXTIOVD3NX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=133 AND p.prop1=15043 AND p.prop2='O7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=134 AND p.prop1=997850 AND p.prop2='FM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=135 AND p.prop1=985927 AND p.prop2='8X3HL63JBUFLYH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=136 AND p.prop1=199424 AND p.prop2='EZ7XBN89AK90OZS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=137 AND p.prop1=955757 AND p.prop2='R0ALKQ56' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=138 AND p.prop1=364172 AND p.prop2='OMF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=139 AND p.prop1=930597 AND p.prop2='RRC8C4Y0MME4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=140 AND p.prop1=592133 AND p.prop2='QMC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=141 AND p.prop1=608173 AND p.prop2='5UENR7GFVJ7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=142 AND p.prop1=516501 AND p.prop2='JF4HBC86' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=143 AND p.prop1=957693 AND p.prop2='4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=144 AND p.prop1=497660 AND p.prop2='LNE4JNVCJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=145 AND p.prop1=394920 AND p.prop2='0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=146 AND p.prop1=922644 AND p.prop2='VG2B7R0QVBZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=147 AND p.prop1=44759 AND p.prop2='Z42F32BTNW9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=148 AND p.prop1=685034 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=149 AND p.prop1=539925 AND p.prop2='JJKDKHDPJ9ID' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=150 AND p.prop1=502806 AND p.prop2='QZUKTYUT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=151 AND p.prop1=114969 AND p.prop2='YDJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=152 AND p.prop1=40658 AND p.prop2='UZB2XHWX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=153 AND p.prop1=390989 AND p.prop2='27EZ2QZYQUIDYXV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=154 AND p.prop1=440884 AND p.prop2='MRIW9R9PKFXXWG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=155 AND p.prop1=734377 AND p.prop2='Z5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=156 AND p.prop1=630481 AND p.prop2='C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=157 AND p.prop1=191992 AND p.prop2='XKYHIL3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=158 AND p.prop1=820384 AND p.prop2='FULAR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=159 AND p.prop1=244510 AND p.prop2='D56Z4SF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=160 AND p.prop1=494734 AND p.prop2='TAQV3MLYJD047' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=161 AND p.prop1=629927 AND p.prop2='3OXTLP40GR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=162 AND p.prop1=369165 AND p.prop2='GK43TN45WFLE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=163 AND p.prop1=235024 AND p.prop2='HTU2I171DURL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=164 AND p.prop1=880112 AND p.prop2='VRV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=165 AND p.prop1=844206 AND p.prop2='WNDKLU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=166 AND p.prop1=462068 AND p.prop2='N6U4PC7ARY2K5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=167 AND p.prop1=534866 AND p.prop2='5O68667TI4V3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=168 AND p.prop1=903326 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=169 AND p.prop1=453947 AND p.prop2='VVL3UYYXJN2TM6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=170 AND p.prop1=271343 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=171 AND p.prop1=871109 AND p.prop2='I8Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=172 AND p.prop1=454952 AND p.prop2='4D5B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=173 AND p.prop1=222941 AND p.prop2='CT3B18OGZMKI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=174 AND p.prop1=833976 AND p.prop2='XI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=175 AND p.prop1=135018 AND p.prop2='EVXBF4QE5A' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=176 AND p.prop1=782324 AND p.prop2='T6ZJ61AGYQN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=177 AND p.prop1=905482 AND p.prop2='1EB2LXZ434YX0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=178 AND p.prop1=223428 AND p.prop2='I4I7142' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=179 AND p.prop1=594296 AND p.prop2='PZ8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=180 AND p.prop1=544426 AND p.prop2='T5FOKNCL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=181 AND p.prop1=125393 AND p.prop2='F' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=182 AND p.prop1=8255 AND p.prop2='8Z3AXZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=183 AND p.prop1=37142 AND p.prop2='X99BSKTORMME' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=184 AND p.prop1=225633 AND p.prop2='HE087WORS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=185 AND p.prop1=34079 AND p.prop2='H3CC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=186 AND p.prop1=676606 AND p.prop2='H6W1G3BWBDH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=187 AND p.prop1=6388 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=188 AND p.prop1=962040 AND p.prop2='2Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=189 AND p.prop1=198524 AND p.prop2='6KF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=190 AND p.prop1=152006 AND p.prop2='IAW4PL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=191 AND p.prop1=292753 AND p.prop2='NICR8O53PC0773' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=192 AND p.prop1=662167 AND p.prop2='8R4PXTB9QQDW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=193 AND p.prop1=572552 AND p.prop2='R5P9UFF2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=194 AND p.prop1=811113 AND p.prop2='RYE380ZFNFJF7F' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=195 AND p.prop1=327384 AND p.prop2='ONK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=196 AND p.prop1=405724 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=197 AND p.prop1=871561 AND p.prop2='5LSZ2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=198 AND p.prop1=674045 AND p.prop2='1W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=199 AND p.prop1=395645 AND p.prop2='QGCTLTPF4I4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=200 AND p.prop1=462174 AND p.prop2='XS8P433Q5KX1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=201 AND p.prop1=88425 AND p.prop2='ZTCR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=202 AND p.prop1=288861 AND p.prop2='ZM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=203 AND p.prop1=116402 AND p.prop2='VHTOLATS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=204 AND p.prop1=887562 AND p.prop2='3I7TU23O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=205 AND p.prop1=224737 AND p.prop2='PZ7139GGK7A8V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=206 AND p.prop1=268841 AND p.prop2='USNYAC4H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=207 AND p.prop1=621933 AND p.prop2='22X4D1Q1Z4VV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=208 AND p.prop1=520613 AND p.prop2='ESEVKUUK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=209 AND p.prop1=280407 AND p.prop2='HZIE6KE1HNY2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=210 AND p.prop1=844790 AND p.prop2='4TLE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=211 AND p.prop1=83970 AND p.prop2='ZV1RY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=212 AND p.prop1=296349 AND p.prop2='H0S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=213 AND p.prop1=757312 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=214 AND p.prop1=853698 AND p.prop2='VTTMM403Q7JVJBN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=215 AND p.prop1=410925 AND p.prop2='J' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=216 AND p.prop1=310419 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=217 AND p.prop1=679786 AND p.prop2='RZVS3SOZAAF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=218 AND p.prop1=975262 AND p.prop2='19M6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=219 AND p.prop1=289821 AND p.prop2='EEH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=220 AND p.prop1=662388 AND p.prop2='FWB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=221 AND p.prop1=436588 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=222 AND p.prop1=324746 AND p.prop2='9YRP0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=223 AND p.prop1=699161 AND p.prop2='I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=224 AND p.prop1=735853 AND p.prop2='1FBRLJ03ZY73' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=225 AND p.prop1=479085 AND p.prop2='T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=226 AND p.prop1=655291 AND p.prop2='ZSUKW33F2W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=227 AND p.prop1=835867 AND p.prop2='4QQIF5NT86AJD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=228 AND p.prop1=986275 AND p.prop2='3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=229 AND p.prop1=294049 AND p.prop2='YPMT6G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=230 AND p.prop1=413538 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=231 AND p.prop1=177809 AND p.prop2='6DDN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=232 AND p.prop1=738289 AND p.prop2='9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=233 AND p.prop1=10660 AND p.prop2='K8ZVWEU84IZF4PM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=234 AND p.prop1=427506 AND p.prop2='GNYE87' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=235 AND p.prop1=762513 AND p.prop2='AD5K204TJPQNL6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=236 AND p.prop1=260983 AND p.prop2='ZMDQ44' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=237 AND p.prop1=454747 AND p.prop2='GE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=238 AND p.prop1=232801 AND p.prop2='8OYH4B9JXY40VW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=239 AND p.prop1=786186 AND p.prop2='S5B7HLFC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=240 AND p.prop1=27236 AND p.prop2='DVPMJ9YN1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=241 AND p.prop1=171890 AND p.prop2='OSX2Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=242 AND p.prop1=472746 AND p.prop2='9OLJ6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=243 AND p.prop1=391483 AND p.prop2='MK0P1WX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=244 AND p.prop1=585953 AND p.prop2='8LYB9R0MN53S7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=245 AND p.prop1=329419 AND p.prop2='73YVFHQTXH5HP2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=246 AND p.prop1=660510 AND p.prop2='8R6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=247 AND p.prop1=562727 AND p.prop2='EXXIZT79' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=248 AND p.prop1=990153 AND p.prop2='ZLW8PXB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=249 AND p.prop1=485008 AND p.prop2='7S2SAY6R8L2ADLB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=250 AND p.prop1=717787 AND p.prop2='6K6KZS1GTMTBJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=251 AND p.prop1=914875 AND p.prop2='B6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=252 AND p.prop1=760785 AND p.prop2='0B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=253 AND p.prop1=285781 AND p.prop2='BJGN5IAH6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=254 AND p.prop1=910763 AND p.prop2='25Z8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=255 AND p.prop1=747230 AND p.prop2='K3KCN87U4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=256 AND p.prop1=954294 AND p.prop2='3G7KIU4ZSELC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=257 AND p.prop1=709840 AND p.prop2='WJHE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=258 AND p.prop1=739379 AND p.prop2='6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=259 AND p.prop1=321387 AND p.prop2='DWBLCZP0V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=260 AND p.prop1=126667 AND p.prop2='Z81NLTM36D' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=261 AND p.prop1=402383 AND p.prop2='IMLYNJNRWK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=262 AND p.prop1=265875 AND p.prop2='K2CJXVP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=263 AND p.prop1=421157 AND p.prop2='FEXY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=264 AND p.prop1=915608 AND p.prop2='HSO8T88' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=265 AND p.prop1=95350 AND p.prop2='I99MGI9B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=266 AND p.prop1=523169 AND p.prop2='G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=267 AND p.prop1=216252 AND p.prop2='ZRGOTFGJZ30' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=268 AND p.prop1=350858 AND p.prop2='IFTBFU6XZ3SZE5Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=269 AND p.prop1=716103 AND p.prop2='D2RHVZ6CGCGR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=270 AND p.prop1=330884 AND p.prop2='4VENCV9ASBGBKRF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=271 AND p.prop1=363796 AND p.prop2='BZ5VGH3L' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=272 AND p.prop1=222647 AND p.prop2='ISIYYM8S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=273 AND p.prop1=241754 AND p.prop2='8PW9OL67KWJK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=274 AND p.prop1=946564 AND p.prop2='AJ4FSMRBO1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=275 AND p.prop1=613257 AND p.prop2='EH1PD7VY6MY9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=276 AND p.prop1=931154 AND p.prop2='60O57' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=277 AND p.prop1=656112 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=278 AND p.prop1=281344 AND p.prop2='SK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=279 AND p.prop1=288437 AND p.prop2='ATJ1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=280 AND p.prop1=949633 AND p.prop2='L0G4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=281 AND p.prop1=533941 AND p.prop2='N6VP2MSI7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=282 AND p.prop1=688596 AND p.prop2='UD28YW7HM2FG2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=283 AND p.prop1=636589 AND p.prop2='2AZ5E1SP1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=284 AND p.prop1=843812 AND p.prop2='W6HETKVO4Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=285 AND p.prop1=641012 AND p.prop2='FFNFE8G2E' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=286 AND p.prop1=425626 AND p.prop2='K1HHKRW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=287 AND p.prop1=383051 AND p.prop2='Q70Z2OK1HK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=288 AND p.prop1=85241 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=289 AND p.prop1=653641 AND p.prop2='050PD4867' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=290 AND p.prop1=880159 AND p.prop2='6YNDB4ZPX3UGX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=291 AND p.prop1=163818 AND p.prop2='YMLM0T7AD15Y6R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=292 AND p.prop1=560946 AND p.prop2='HPVZT23KBN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=293 AND p.prop1=323105 AND p.prop2='MIJYZGXSBDQEXOY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=294 AND p.prop1=922551 AND p.prop2='TQF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=295 AND p.prop1=637013 AND p.prop2='I9F5IXS1WX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=296 AND p.prop1=537762 AND p.prop2='QBUV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=297 AND p.prop1=709409 AND p.prop2='FSMSLA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=298 AND p.prop1=219421 AND p.prop2='GKI0TZ9HL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=299 AND p.prop1=575534 AND p.prop2='I8A3I8MBJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=300 AND p.prop1=495790 AND p.prop2='AV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=301 AND p.prop1=164280 AND p.prop2='Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=302 AND p.prop1=857553 AND p.prop2='GRAY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=303 AND p.prop1=415602 AND p.prop2='56S3X6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=304 AND p.prop1=533701 AND p.prop2='9SH7M' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=305 AND p.prop1=478174 AND p.prop2='ZR9W8M3K072IM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=306 AND p.prop1=560184 AND p.prop2='F83RTG6W67Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=307 AND p.prop1=321642 AND p.prop2='0LUB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=308 AND p.prop1=987544 AND p.prop2='R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=309 AND p.prop1=411604 AND p.prop2='YNIQ8G5YQUEJ2YT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=310 AND p.prop1=213349 AND p.prop2='V9WOPK7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=311 AND p.prop1=213199 AND p.prop2='BSMUAGT304ZPIEV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=312 AND p.prop1=905451 AND p.prop2='AECJU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=313 AND p.prop1=43274 AND p.prop2='YX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=314 AND p.prop1=153063 AND p.prop2='8GTC5VGPL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=315 AND p.prop1=606314 AND p.prop2='41LNY2VHY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=316 AND p.prop1=85485 AND p.prop2='0I5Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=317 AND p.prop1=70561 AND p.prop2='DWHOL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=318 AND p.prop1=713046 AND p.prop2='YQCNAP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=319 AND p.prop1=224919 AND p.prop2='5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=320 AND p.prop1=701011 AND p.prop2='FQ2VVR9RYW63Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=321 AND p.prop1=792846 AND p.prop2='7663' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=322 AND p.prop1=118194 AND p.prop2='U418GML21BGEEHB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=323 AND p.prop1=930111 AND p.prop2='K2SU82PKS8WO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=324 AND p.prop1=199833 AND p.prop2='3A2J9631SVEK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=325 AND p.prop1=94525 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=326 AND p.prop1=644504 AND p.prop2='2X526TX7P8ZT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=327 AND p.prop1=610924 AND p.prop2='P851BZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=328 AND p.prop1=105592 AND p.prop2='72DWX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=329 AND p.prop1=118673 AND p.prop2='MYEBIHF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=330 AND p.prop1=572728 AND p.prop2='FD6JV5567SC5KF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=331 AND p.prop1=832154 AND p.prop2='B3N1RE74KJ3KJ8T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=332 AND p.prop1=783792 AND p.prop2='I8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=333 AND p.prop1=148611 AND p.prop2='S0RISRHI2J48' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=334 AND p.prop1=66527 AND p.prop2='QFQDG74FX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=335 AND p.prop1=522321 AND p.prop2='OSVT8KROBU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=336 AND p.prop1=66936 AND p.prop2='WL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=337 AND p.prop1=497847 AND p.prop2='W8JESP55' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=338 AND p.prop1=845447 AND p.prop2='15' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=339 AND p.prop1=781343 AND p.prop2='ZUPJZT8R2B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=340 AND p.prop1=343180 AND p.prop2='7T8ZRKK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=341 AND p.prop1=4929 AND p.prop2='I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=342 AND p.prop1=132902 AND p.prop2='WW5BQU9I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=343 AND p.prop1=488509 AND p.prop2='NWCEPS9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=344 AND p.prop1=64694 AND p.prop2='WZLMTWZF6VN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=345 AND p.prop1=449132 AND p.prop2='2AA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=346 AND p.prop1=575889 AND p.prop2='1EPB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=347 AND p.prop1=45215 AND p.prop2='35AGD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=348 AND p.prop1=970030 AND p.prop2='IZZAOMTYQYRB7C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=349 AND p.prop1=453223 AND p.prop2='JO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=350 AND p.prop1=821793 AND p.prop2='749' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=351 AND p.prop1=950571 AND p.prop2='PT872H5XUCND' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=352 AND p.prop1=720321 AND p.prop2='7V32124OHYV3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=353 AND p.prop1=300987 AND p.prop2='K20OEM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=354 AND p.prop1=646710 AND p.prop2='8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=355 AND p.prop1=253539 AND p.prop2='1462BK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=356 AND p.prop1=589840 AND p.prop2='P2JH87' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=357 AND p.prop1=954218 AND p.prop2='EONNEYOL5M' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=358 AND p.prop1=571588 AND p.prop2='I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=359 AND p.prop1=601747 AND p.prop2='8XWJQCXDF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=360 AND p.prop1=946023 AND p.prop2='KSYFF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=361 AND p.prop1=969232 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=362 AND p.prop1=64081 AND p.prop2='S9EZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=363 AND p.prop1=13235 AND p.prop2='IRIKZDTB4NA6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=364 AND p.prop1=236342 AND p.prop2='76OK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=365 AND p.prop1=634885 AND p.prop2='5U2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=366 AND p.prop1=754049 AND p.prop2='IDALDMDWD5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=367 AND p.prop1=164282 AND p.prop2='J1C8PAHHMG560R6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=368 AND p.prop1=807608 AND p.prop2='GHY9TBY5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=369 AND p.prop1=68780 AND p.prop2='5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=370 AND p.prop1=383042 AND p.prop2='YJ39H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=371 AND p.prop1=393704 AND p.prop2='WC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=372 AND p.prop1=86061 AND p.prop2='PVRSRRY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=373 AND p.prop1=226238 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=374 AND p.prop1=237693 AND p.prop2='B44Z2N5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=375 AND p.prop1=90989 AND p.prop2='SVA8TW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=376 AND p.prop1=529059 AND p.prop2='HWZ0EW3S8LE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=377 AND p.prop1=818095 AND p.prop2='N0IABNDE8E' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=378 AND p.prop1=397368 AND p.prop2='O2WSIO2C13NAKEV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=379 AND p.prop1=553393 AND p.prop2='T9S495' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=380 AND p.prop1=625516 AND p.prop2='1Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=381 AND p.prop1=428584 AND p.prop2='T8NWM5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=382 AND p.prop1=416608 AND p.prop2='VAUTHZ8L643PILR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=383 AND p.prop1=193979 AND p.prop2='K0C26' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=384 AND p.prop1=494700 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=385 AND p.prop1=852823 AND p.prop2='XLX6GZYV3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=386 AND p.prop1=756538 AND p.prop2='RF09STO9GXAH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=387 AND p.prop1=375593 AND p.prop2='FXBVL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=388 AND p.prop1=96835 AND p.prop2='YQNQ6CR7PZ8PCV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=389 AND p.prop1=282885 AND p.prop2='CZ5SJTJJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=390 AND p.prop1=543548 AND p.prop2='AQXQS0X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=391 AND p.prop1=181154 AND p.prop2='1G23VRGK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=392 AND p.prop1=581131 AND p.prop2='5MORMGN4MDBYHDX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=393 AND p.prop1=619480 AND p.prop2='NX0603XXVG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=394 AND p.prop1=68792 AND p.prop2='WH0ML0CPF30W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=395 AND p.prop1=890917 AND p.prop2='ZRH97846THGJYA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=396 AND p.prop1=838728 AND p.prop2='5OPIFB4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=397 AND p.prop1=222606 AND p.prop2='3LFLEZSP6V1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=398 AND p.prop1=982116 AND p.prop2='3EEQ8PHR94' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=399 AND p.prop1=652161 AND p.prop2='I2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=400 AND p.prop1=841569 AND p.prop2='HDEH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=401 AND p.prop1=469186 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=402 AND p.prop1=837495 AND p.prop2='3MTEN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=403 AND p.prop1=990988 AND p.prop2='UJ9E76I4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=404 AND p.prop1=563304 AND p.prop2='R5RD9I0TGN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=405 AND p.prop1=709357 AND p.prop2='ZH7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=406 AND p.prop1=725595 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=407 AND p.prop1=461587 AND p.prop2='8XE86H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=408 AND p.prop1=910053 AND p.prop2='VFOGTA8G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=409 AND p.prop1=640945 AND p.prop2='15WRM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=410 AND p.prop1=11896 AND p.prop2='ID0HO2P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=411 AND p.prop1=657625 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=412 AND p.prop1=369481 AND p.prop2='9J5I68P7C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=413 AND p.prop1=222590 AND p.prop2='ZJPE6BYJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=414 AND p.prop1=406345 AND p.prop2='SIDMHLYHV1CYOM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=415 AND p.prop1=136029 AND p.prop2='GT1W95QRQUL0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=416 AND p.prop1=825143 AND p.prop2='F11TGV03WKLVP9P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=417 AND p.prop1=61786 AND p.prop2='QBWC1I4CRT86' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=418 AND p.prop1=121359 AND p.prop2='Y1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=419 AND p.prop1=367725 AND p.prop2='R9O2LMU07X5VRA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=420 AND p.prop1=799769 AND p.prop2='DGP5JR2Z9G7YBSR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=421 AND p.prop1=424369 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=422 AND p.prop1=585278 AND p.prop2='97SZV220E2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=423 AND p.prop1=621193 AND p.prop2='UF3OXRB255G3KN6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=424 AND p.prop1=192294 AND p.prop2='F11C5QQNYL9GH5T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=425 AND p.prop1=830061 AND p.prop2='SC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=426 AND p.prop1=134664 AND p.prop2='IWIYF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=427 AND p.prop1=563700 AND p.prop2='6AZMUI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=428 AND p.prop1=225744 AND p.prop2='KIRN82R9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=429 AND p.prop1=605610 AND p.prop2='7LXYASFTZ87' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=430 AND p.prop1=660732 AND p.prop2='J5XHCN8Y0O2SN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=431 AND p.prop1=712624 AND p.prop2='BWCUWHPA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=432 AND p.prop1=76271 AND p.prop2='KRL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=433 AND p.prop1=488397 AND p.prop2='H6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=434 AND p.prop1=894742 AND p.prop2='9ZXT131U' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=435 AND p.prop1=219610 AND p.prop2='3F6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=436 AND p.prop1=378634 AND p.prop2='2DF96PZWKXKH3YW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=437 AND p.prop1=912271 AND p.prop2='Q9HFT6KID13' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=438 AND p.prop1=642330 AND p.prop2='7B7Y13K1QLFYF4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=439 AND p.prop1=883818 AND p.prop2='IVKVZ2WN2E4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=440 AND p.prop1=835557 AND p.prop2='9ZUWLR0EWR8JD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=441 AND p.prop1=442343 AND p.prop2='PB4MBY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=442 AND p.prop1=548113 AND p.prop2='P6B6X5F4E5BA3C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=443 AND p.prop1=778766 AND p.prop2='6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=444 AND p.prop1=289452 AND p.prop2='AV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=445 AND p.prop1=144038 AND p.prop2='WLHVZBR9KZEL7BJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=446 AND p.prop1=653104 AND p.prop2='XXP8NI5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=447 AND p.prop1=404822 AND p.prop2='133CV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=448 AND p.prop1=828039 AND p.prop2='8N1886SD24USMZQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=449 AND p.prop1=403379 AND p.prop2='JNOE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=450 AND p.prop1=717466 AND p.prop2='B4RAZMNT8Z5S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=451 AND p.prop1=449924 AND p.prop2='1ST6HF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=452 AND p.prop1=489710 AND p.prop2='XPJX33ETX42' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=453 AND p.prop1=98965 AND p.prop2='V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=454 AND p.prop1=115763 AND p.prop2='W2Y3MNB1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=455 AND p.prop1=503334 AND p.prop2='6GE0SL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=456 AND p.prop1=597859 AND p.prop2='3Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=457 AND p.prop1=225392 AND p.prop2='OOLH1OPJSPK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=458 AND p.prop1=563599 AND p.prop2='YUBK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=459 AND p.prop1=900299 AND p.prop2='25UGKX5R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=460 AND p.prop1=424854 AND p.prop2='6F1DAMQ9SZYU0W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=461 AND p.prop1=638528 AND p.prop2='NL6LIJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=462 AND p.prop1=632686 AND p.prop2='FC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=463 AND p.prop1=68530 AND p.prop2='12N4SP7IW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=464 AND p.prop1=785331 AND p.prop2='JPN0PY1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=465 AND p.prop1=68059 AND p.prop2='B7HLXLW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=466 AND p.prop1=535239 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=467 AND p.prop1=406003 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=468 AND p.prop1=641669 AND p.prop2='3O32B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=469 AND p.prop1=35085 AND p.prop2='H5WKMOILX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=470 AND p.prop1=47273 AND p.prop2='V7B7N3TO12C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=471 AND p.prop1=516061 AND p.prop2='PLH4C8L0SB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=472 AND p.prop1=128641 AND p.prop2='6URM3JRKZC8Y3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=473 AND p.prop1=869031 AND p.prop2='2PIS8WG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=474 AND p.prop1=700621 AND p.prop2='4HHVS2B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=475 AND p.prop1=324756 AND p.prop2='PTXUW7M3UW7Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=476 AND p.prop1=975496 AND p.prop2='DEI52' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=477 AND p.prop1=994319 AND p.prop2='5VO05WF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=478 AND p.prop1=981110 AND p.prop2='N1OA7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=479 AND p.prop1=20975 AND p.prop2='NFSWQ0W2SH5PNI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=480 AND p.prop1=931809 AND p.prop2='TH34C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=481 AND p.prop1=236777 AND p.prop2='Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=482 AND p.prop1=315448 AND p.prop2='5SP6A1GAU40OV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=483 AND p.prop1=436839 AND p.prop2='RILQTTXCWP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=484 AND p.prop1=628785 AND p.prop2='RWAX8E15MF2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=485 AND p.prop1=123556 AND p.prop2='ZFZRJCSIGCWV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=486 AND p.prop1=753004 AND p.prop2='CVS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=487 AND p.prop1=68915 AND p.prop2='7NZW1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=488 AND p.prop1=555336 AND p.prop2='YDW2RMNL89B4AVJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=489 AND p.prop1=15184 AND p.prop2='82KPS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=490 AND p.prop1=217076 AND p.prop2='AVAV6KTYRF4DV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=491 AND p.prop1=990918 AND p.prop2='0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=492 AND p.prop1=563927 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=493 AND p.prop1=714762 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=494 AND p.prop1=852314 AND p.prop2='A7IOTWZF22X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=495 AND p.prop1=991143 AND p.prop2='X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=496 AND p.prop1=292869 AND p.prop2='ZW5O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=497 AND p.prop1=150418 AND p.prop2='KFVOKYL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=498 AND p.prop1=229997 AND p.prop2='YFPR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=499 AND p.prop1=133597 AND p.prop2='T24OVAXVIH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=500 AND p.prop1=53404 AND p.prop2='S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=501 AND p.prop1=418334 AND p.prop2='FZ7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=502 AND p.prop1=226074 AND p.prop2='4PPFZJ0XESA9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=503 AND p.prop1=727958 AND p.prop2='7DHNIC4YP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=504 AND p.prop1=602431 AND p.prop2='2AEPENBXJU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=505 AND p.prop1=699135 AND p.prop2='B0G4XEOOIX0XD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=506 AND p.prop1=895374 AND p.prop2='3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=507 AND p.prop1=366928 AND p.prop2='BEW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=508 AND p.prop1=42270 AND p.prop2='L84TJ4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=509 AND p.prop1=337799 AND p.prop2='KF2Z2TMP4C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=510 AND p.prop1=844128 AND p.prop2='1A' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=511 AND p.prop1=863723 AND p.prop2='SF9R0X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=512 AND p.prop1=511907 AND p.prop2='SSU4B4QRI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=513 AND p.prop1=72152 AND p.prop2='JI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=514 AND p.prop1=57401 AND p.prop2='9U50RC2BH02Q0HF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=515 AND p.prop1=514742 AND p.prop2='CYCSB4E9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=516 AND p.prop1=497558 AND p.prop2='OGCG12102XH4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=517 AND p.prop1=274782 AND p.prop2='XZ3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=518 AND p.prop1=722327 AND p.prop2='WAZU63KHG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=519 AND p.prop1=344167 AND p.prop2='H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=520 AND p.prop1=902029 AND p.prop2='Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=521 AND p.prop1=986051 AND p.prop2='MGF1GC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=522 AND p.prop1=815225 AND p.prop2='SONKJO6I743S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=523 AND p.prop1=494448 AND p.prop2='OLY8ZVS5BKO1Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=524 AND p.prop1=496098 AND p.prop2='NMI5ZCBE9ING5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=525 AND p.prop1=842833 AND p.prop2='T4SLZR4FDWN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=526 AND p.prop1=101869 AND p.prop2='8U7KM3H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=527 AND p.prop1=653393 AND p.prop2='LRIUFSPLIO8WQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=528 AND p.prop1=477532 AND p.prop2='0IZJVS05' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=529 AND p.prop1=663846 AND p.prop2='2EC6OUV8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=530 AND p.prop1=922713 AND p.prop2='ZDSL9VXS34' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=531 AND p.prop1=631594 AND p.prop2='DS3Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=532 AND p.prop1=937700 AND p.prop2='84' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=533 AND p.prop1=620805 AND p.prop2='N5PB2U3C9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=534 AND p.prop1=463913 AND p.prop2='N9JBO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=535 AND p.prop1=128550 AND p.prop2='FMPYX3S8KV1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=536 AND p.prop1=998761 AND p.prop2='PCG7NBEAGP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=537 AND p.prop1=857187 AND p.prop2='1VS7T8CNRCS7E6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=538 AND p.prop1=660784 AND p.prop2='EY5B8115' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=539 AND p.prop1=820509 AND p.prop2='BV2G7L07' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=540 AND p.prop1=619458 AND p.prop2='1Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=541 AND p.prop1=677393 AND p.prop2='Y0SPGCXE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=542 AND p.prop1=566910 AND p.prop2='2PJ7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=543 AND p.prop1=933745 AND p.prop2='6WV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=544 AND p.prop1=553248 AND p.prop2='Z1S7RRCZLU2PJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=545 AND p.prop1=833433 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=546 AND p.prop1=619663 AND p.prop2='I7RO7TBG48BC4P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=547 AND p.prop1=610750 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=548 AND p.prop1=909571 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=549 AND p.prop1=124612 AND p.prop2='S7TM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=550 AND p.prop1=832897 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=551 AND p.prop1=582155 AND p.prop2='QVUK4X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=552 AND p.prop1=220115 AND p.prop2='INBKQYFQHBCB6T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=553 AND p.prop1=485790 AND p.prop2='HF2E6VMA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=554 AND p.prop1=208123 AND p.prop2='N4Q3Y9PME' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=555 AND p.prop1=975960 AND p.prop2='EKDPDG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=556 AND p.prop1=504318 AND p.prop2='UQY0ZHJ5PR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=557 AND p.prop1=484098 AND p.prop2='FT0L' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=558 AND p.prop1=361180 AND p.prop2='P480OEE4RPHZ3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=559 AND p.prop1=332664 AND p.prop2='CFMNQ3TBJE8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=560 AND p.prop1=655321 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=561 AND p.prop1=252209 AND p.prop2='JRWXXPN4661IL0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=562 AND p.prop1=880708 AND p.prop2='01T4X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=563 AND p.prop1=137845 AND p.prop2='VIGJB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=564 AND p.prop1=689023 AND p.prop2='JQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=565 AND p.prop1=575955 AND p.prop2='ML9RT2M69' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=566 AND p.prop1=401573 AND p.prop2='825EZML676' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=567 AND p.prop1=880218 AND p.prop2='IWX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=568 AND p.prop1=204365 AND p.prop2='DS065PZR4T13' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=569 AND p.prop1=22674 AND p.prop2='CYIR6IK6XQ89AYV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=570 AND p.prop1=529449 AND p.prop2='7IBMU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=571 AND p.prop1=61851 AND p.prop2='7CK4Z0S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=572 AND p.prop1=901263 AND p.prop2='P1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=573 AND p.prop1=269222 AND p.prop2='QXVM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=574 AND p.prop1=28913 AND p.prop2='TKWBLZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=575 AND p.prop1=308949 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=576 AND p.prop1=805751 AND p.prop2='ZUX3UB3GAHV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=577 AND p.prop1=662326 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=578 AND p.prop1=60534 AND p.prop2='KWC7BCC3CY0MX2X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=579 AND p.prop1=663639 AND p.prop2='M7SGYXM9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=580 AND p.prop1=836997 AND p.prop2='9J5RQBK6CIM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=581 AND p.prop1=55787 AND p.prop2='JJ9E4YK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=582 AND p.prop1=12736 AND p.prop2='WH9POV76K' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=583 AND p.prop1=280894 AND p.prop2='70' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=584 AND p.prop1=53401 AND p.prop2='1YYZG796' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=585 AND p.prop1=725580 AND p.prop2='CAGKGMTLL4ETTRL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=586 AND p.prop1=119203 AND p.prop2='DW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=587 AND p.prop1=959312 AND p.prop2='30GS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=588 AND p.prop1=612281 AND p.prop2='2G169WGPZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=589 AND p.prop1=765461 AND p.prop2='ECT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=590 AND p.prop1=527992 AND p.prop2='Z5JVXK9FNS1KJFP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=591 AND p.prop1=647029 AND p.prop2='AKO8XFUJUPP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=592 AND p.prop1=971718 AND p.prop2='L' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=593 AND p.prop1=451068 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=594 AND p.prop1=334532 AND p.prop2='ZC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=595 AND p.prop1=463682 AND p.prop2='ICKZ2GT7KL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=596 AND p.prop1=163354 AND p.prop2='5ESUHXG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=597 AND p.prop1=716176 AND p.prop2='1Y0999NI1T0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=598 AND p.prop1=340071 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=599 AND p.prop1=122409 AND p.prop2='3MV7NVBJ89M4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=600 AND p.prop1=397932 AND p.prop2='7VDFR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=601 AND p.prop1=77409 AND p.prop2='UVYCPTLY9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=602 AND p.prop1=963479 AND p.prop2='NW915DJJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=603 AND p.prop1=982421 AND p.prop2='9JDZBJ1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=604 AND p.prop1=230894 AND p.prop2='1S1NQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=605 AND p.prop1=527145 AND p.prop2='22' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=606 AND p.prop1=649454 AND p.prop2='ST58KRS2WN99BBK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=607 AND p.prop1=658253 AND p.prop2='FHINK5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=608 AND p.prop1=608344 AND p.prop2='63U1CTZ6OPZ6HKK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=609 AND p.prop1=165208 AND p.prop2='7YWQVQA4V2RA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=610 AND p.prop1=211633 AND p.prop2='OXMQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=611 AND p.prop1=521526 AND p.prop2='0GGKBW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=612 AND p.prop1=908564 AND p.prop2='493' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=613 AND p.prop1=320421 AND p.prop2='HGP97BUI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=614 AND p.prop1=580404 AND p.prop2='K7PFY1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=615 AND p.prop1=722606 AND p.prop2='K0LL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=616 AND p.prop1=993752 AND p.prop2='LAQOTOS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=617 AND p.prop1=814532 AND p.prop2='DBM1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=618 AND p.prop1=406833 AND p.prop2='8EQ1CGMX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=619 AND p.prop1=307266 AND p.prop2='O4HV7YJOKNNFYP3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=620 AND p.prop1=314958 AND p.prop2='KCZYBLQKMSO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=621 AND p.prop1=770077 AND p.prop2='S0U1NBE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=622 AND p.prop1=139021 AND p.prop2='5IJ7SOR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=623 AND p.prop1=821201 AND p.prop2='7CWKCSZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=624 AND p.prop1=423647 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=625 AND p.prop1=457356 AND p.prop2='SBYNTJ0UVFXNV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=626 AND p.prop1=180780 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=627 AND p.prop1=485065 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=628 AND p.prop1=7308 AND p.prop2='MYX5RJAEPDYQZNG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=629 AND p.prop1=585439 AND p.prop2='66G53' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=630 AND p.prop1=17910 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=631 AND p.prop1=689917 AND p.prop2='GJFQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=632 AND p.prop1=975195 AND p.prop2='NS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=633 AND p.prop1=912502 AND p.prop2='TX97CFNMYE7B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=634 AND p.prop1=861767 AND p.prop2='A7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=635 AND p.prop1=367691 AND p.prop2='OE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=636 AND p.prop1=471435 AND p.prop2='A1JFTND37GL7IK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=637 AND p.prop1=65853 AND p.prop2='GM56G0192WGN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=638 AND p.prop1=389375 AND p.prop2='LP7L' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=639 AND p.prop1=940337 AND p.prop2='Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=640 AND p.prop1=971565 AND p.prop2='H7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=641 AND p.prop1=424219 AND p.prop2='VQG5ZP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=642 AND p.prop1=897483 AND p.prop2='WYJZFZ688HZ7QD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=643 AND p.prop1=399273 AND p.prop2='T8OMDAS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=644 AND p.prop1=478465 AND p.prop2='HRJA2GPX34' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=645 AND p.prop1=344932 AND p.prop2='QM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=646 AND p.prop1=81415 AND p.prop2='X4FGRVTF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=647 AND p.prop1=35230 AND p.prop2='U038' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=648 AND p.prop1=940752 AND p.prop2='BVFEBR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=649 AND p.prop1=172534 AND p.prop2='SR0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=650 AND p.prop1=801151 AND p.prop2='KERHFWKZFQWAAR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=651 AND p.prop1=834460 AND p.prop2='60LFTI4Z0LNLY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=652 AND p.prop1=762961 AND p.prop2='HTFM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=653 AND p.prop1=776237 AND p.prop2='6X9Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=654 AND p.prop1=742897 AND p.prop2='2FDV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=655 AND p.prop1=2174 AND p.prop2='W6C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=656 AND p.prop1=40288 AND p.prop2='3QSTXEP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=657 AND p.prop1=30684 AND p.prop2='EQT4DCM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=658 AND p.prop1=270774 AND p.prop2='GP5IWG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=659 AND p.prop1=558542 AND p.prop2='LANC6U58N2HVSIN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=660 AND p.prop1=98623 AND p.prop2='Y120ZAP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=661 AND p.prop1=491834 AND p.prop2='UBV52THSIP05OC9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=662 AND p.prop1=825245 AND p.prop2='BLJIHD5MZ5Y2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=663 AND p.prop1=457272 AND p.prop2='4O2WT8LQOSUGNY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=664 AND p.prop1=31823 AND p.prop2='1U1FX7K4N8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=665 AND p.prop1=988155 AND p.prop2='P3CRGKRK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=666 AND p.prop1=818499 AND p.prop2='PTFYH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=667 AND p.prop1=619420 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=668 AND p.prop1=743588 AND p.prop2='3CSE0HN41B5D' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=669 AND p.prop1=335215 AND p.prop2='B3HRGRFXX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=670 AND p.prop1=787690 AND p.prop2='ZP1VTQ128MQ8A' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=671 AND p.prop1=787275 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=672 AND p.prop1=114886 AND p.prop2='X7IQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=673 AND p.prop1=394847 AND p.prop2='E89D84I2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=674 AND p.prop1=657583 AND p.prop2='WA2MH4OTH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=675 AND p.prop1=259098 AND p.prop2='5L793QHG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=676 AND p.prop1=188432 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=677 AND p.prop1=381417 AND p.prop2='XDI1TKBEU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=678 AND p.prop1=423183 AND p.prop2='PC5PB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=679 AND p.prop1=105617 AND p.prop2='O1U5BYAFAV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=680 AND p.prop1=383693 AND p.prop2='02FRWM6P4MZT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=681 AND p.prop1=701756 AND p.prop2='I1Y5KU6KIO7YF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=682 AND p.prop1=66313 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=683 AND p.prop1=506104 AND p.prop2='YRWTBOOPZUTO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=684 AND p.prop1=183315 AND p.prop2='3AMSRMY7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=685 AND p.prop1=810041 AND p.prop2='LG3XT9Z42DPFV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=686 AND p.prop1=509411 AND p.prop2='I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=687 AND p.prop1=206801 AND p.prop2='Q5TVG48DM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=688 AND p.prop1=516108 AND p.prop2='TYRYS5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=689 AND p.prop1=340200 AND p.prop2='QG40WYKOHV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=690 AND p.prop1=757478 AND p.prop2='0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=691 AND p.prop1=997613 AND p.prop2='24' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=692 AND p.prop1=305381 AND p.prop2='M0V2BG5Z8O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=693 AND p.prop1=516977 AND p.prop2='5KODUN64LG23' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=694 AND p.prop1=477132 AND p.prop2='SASYKXPAT3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=695 AND p.prop1=778825 AND p.prop2='KEECSWCXQOZY97' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=696 AND p.prop1=475913 AND p.prop2='9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=697 AND p.prop1=60440 AND p.prop2='UCTOT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=698 AND p.prop1=538176 AND p.prop2='GZMHPCM511D' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=699 AND p.prop1=731985 AND p.prop2='Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=700 AND p.prop1=83616 AND p.prop2='SDRMJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=701 AND p.prop1=441868 AND p.prop2='S2EZIQDC9YJ88Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=702 AND p.prop1=783981 AND p.prop2='T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=703 AND p.prop1=963209 AND p.prop2='5U6UTNIT4JVKECN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=704 AND p.prop1=382539 AND p.prop2='AP3ZTXR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=705 AND p.prop1=421761 AND p.prop2='69OQP3NPB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=706 AND p.prop1=562314 AND p.prop2='MLI9UBE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=707 AND p.prop1=871817 AND p.prop2='SA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=708 AND p.prop1=538969 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=709 AND p.prop1=883489 AND p.prop2='1JPZYJJBUWNBE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=710 AND p.prop1=799813 AND p.prop2='NJ6REVV7FXCWOK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=711 AND p.prop1=358179 AND p.prop2='0TUJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=712 AND p.prop1=494492 AND p.prop2='M' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=713 AND p.prop1=123951 AND p.prop2='7XGSN9PDQQQCV1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=714 AND p.prop1=376909 AND p.prop2='53996RZBN0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=715 AND p.prop1=203367 AND p.prop2='YNAFB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=716 AND p.prop1=563140 AND p.prop2='WZFNJJDSIMOL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=717 AND p.prop1=460495 AND p.prop2='PEVIH0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=718 AND p.prop1=480257 AND p.prop2='LR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=719 AND p.prop1=351826 AND p.prop2='CQZEHWJXR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=720 AND p.prop1=502891 AND p.prop2='BNO8NE9M9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=721 AND p.prop1=368942 AND p.prop2='VHR7IQ3OM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=722 AND p.prop1=792731 AND p.prop2='3V1V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=723 AND p.prop1=597183 AND p.prop2='WEYRG35FJVKSRO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=724 AND p.prop1=982499 AND p.prop2='RKJK2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=725 AND p.prop1=252729 AND p.prop2='CG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=726 AND p.prop1=172742 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=727 AND p.prop1=318335 AND p.prop2='770VQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=728 AND p.prop1=707951 AND p.prop2='PJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=729 AND p.prop1=84909 AND p.prop2='0YR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=730 AND p.prop1=826711 AND p.prop2='BU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=731 AND p.prop1=918444 AND p.prop2='O63QJ1042YOR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=732 AND p.prop1=519158 AND p.prop2='UFVTJ6X1YB4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=733 AND p.prop1=587717 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=734 AND p.prop1=69086 AND p.prop2='ZD0SAYZTX3KF82' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=735 AND p.prop1=258411 AND p.prop2='4V07M2B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=736 AND p.prop1=202523 AND p.prop2='RHTX2DYN35P18' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=737 AND p.prop1=593572 AND p.prop2='P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=738 AND p.prop1=81462 AND p.prop2='M9ORT50BZCHZEOE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=739 AND p.prop1=640022 AND p.prop2='02E0EVRN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=740 AND p.prop1=999673 AND p.prop2='EOV9CEDYTL8TX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=741 AND p.prop1=398833 AND p.prop2='JFCOCIMKW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=742 AND p.prop1=213771 AND p.prop2='FFYNXG3HTZO0S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=743 AND p.prop1=275074 AND p.prop2='K70WBHQ4UQJ8SV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=744 AND p.prop1=665203 AND p.prop2='A47EUVRXLY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=745 AND p.prop1=554943 AND p.prop2='NMI9GGKK0E' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=746 AND p.prop1=186041 AND p.prop2='TO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=747 AND p.prop1=451983 AND p.prop2='01OVWIN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=748 AND p.prop1=657035 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=749 AND p.prop1=381292 AND p.prop2='K7W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=750 AND p.prop1=49671 AND p.prop2='QFSNCLRCL04LR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=751 AND p.prop1=886106 AND p.prop2='7GII677G3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=752 AND p.prop1=641157 AND p.prop2='G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=753 AND p.prop1=996771 AND p.prop2='OLSWHSDL19QT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=754 AND p.prop1=69267 AND p.prop2='L4Z8T64AT84V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=755 AND p.prop1=933245 AND p.prop2='G855ASOEI4G00X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=756 AND p.prop1=376822 AND p.prop2='L8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=757 AND p.prop1=711668 AND p.prop2='5H3OE4B6B2TILX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=758 AND p.prop1=611004 AND p.prop2='JC64YI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=759 AND p.prop1=746144 AND p.prop2='G4UHD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=760 AND p.prop1=288194 AND p.prop2='KMRVJC2S0DS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=761 AND p.prop1=220689 AND p.prop2='W63' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=762 AND p.prop1=420641 AND p.prop2='K7C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=763 AND p.prop1=86384 AND p.prop2='CL0SZFB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=764 AND p.prop1=92112 AND p.prop2='F1BTQ5Q5EP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=765 AND p.prop1=601052 AND p.prop2='NSCXOF9DTH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=766 AND p.prop1=297671 AND p.prop2='R6KOXN2QH5RV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=767 AND p.prop1=306986 AND p.prop2='UKRCTXT431D22MK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=768 AND p.prop1=118651 AND p.prop2='AZ9QS18BIW6E1SZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=769 AND p.prop1=387713 AND p.prop2='3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=770 AND p.prop1=698874 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=771 AND p.prop1=596451 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=772 AND p.prop1=954553 AND p.prop2='37WG2GFM8L8FHH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=773 AND p.prop1=846094 AND p.prop2='C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=774 AND p.prop1=40265 AND p.prop2='5B05UFXMG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=775 AND p.prop1=500960 AND p.prop2='41Y2ZTOCWXPD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=776 AND p.prop1=777913 AND p.prop2='9AHJUTDVR0L6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=777 AND p.prop1=340617 AND p.prop2='1CLE8V88' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=778 AND p.prop1=424418 AND p.prop2='GEVJFCPBVD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=779 AND p.prop1=980271 AND p.prop2='F9MWWQPKV63' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=780 AND p.prop1=26548 AND p.prop2='XS9E' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=781 AND p.prop1=128345 AND p.prop2='AGAA4T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=782 AND p.prop1=479646 AND p.prop2='BWX5F9I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=783 AND p.prop1=712445 AND p.prop2='YS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=784 AND p.prop1=142387 AND p.prop2='V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=785 AND p.prop1=13253 AND p.prop2='FIJ7PCOULO1AN0J' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=786 AND p.prop1=943609 AND p.prop2='19WGIAQ0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=787 AND p.prop1=535048 AND p.prop2='B0N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=788 AND p.prop1=86106 AND p.prop2='4DLQGYR6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=789 AND p.prop1=142878 AND p.prop2='0BOR4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=790 AND p.prop1=516507 AND p.prop2='K3XGN2JSZRO9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=791 AND p.prop1=598999 AND p.prop2='BDBPGQ1U7Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=792 AND p.prop1=224533 AND p.prop2='RBGRZW5EEH9FDP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=793 AND p.prop1=800314 AND p.prop2='7DX8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=794 AND p.prop1=349555 AND p.prop2='G85UM9PA2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=795 AND p.prop1=878647 AND p.prop2='1F09F74A332W' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=796 AND p.prop1=244396 AND p.prop2='8429C3T3U4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=797 AND p.prop1=65403 AND p.prop2='CMM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=798 AND p.prop1=548098 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=799 AND p.prop1=303757 AND p.prop2='CU21BVEUQQFB1O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=800 AND p.prop1=921695 AND p.prop2='SA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=801 AND p.prop1=563745 AND p.prop2='8HUO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=802 AND p.prop1=552974 AND p.prop2='IL11BB3T7V6IUNH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=803 AND p.prop1=2186 AND p.prop2='OTPWGZTWIMBN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=804 AND p.prop1=51293 AND p.prop2='AACC1ZBLM2L19F' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=805 AND p.prop1=700205 AND p.prop2='T0LRDX9S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=806 AND p.prop1=511169 AND p.prop2='5F99T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=807 AND p.prop1=529986 AND p.prop2='1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=808 AND p.prop1=654160 AND p.prop2='9DRVVZE906' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=809 AND p.prop1=931149 AND p.prop2='78P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=810 AND p.prop1=309101 AND p.prop2='51' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=811 AND p.prop1=555070 AND p.prop2='U1HFT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=812 AND p.prop1=600385 AND p.prop2='QX6U31M1QMYPUPA' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=813 AND p.prop1=701572 AND p.prop2='UX30OLTU1659' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=814 AND p.prop1=838526 AND p.prop2='GSNTP8M2AJ85R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=815 AND p.prop1=129752 AND p.prop2='0N1S1DGB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=816 AND p.prop1=621945 AND p.prop2='NQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=817 AND p.prop1=740537 AND p.prop2='44AZ9NSFZ9TPPK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=818 AND p.prop1=736123 AND p.prop2='TTSVN7Z1ISXFH0' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=819 AND p.prop1=357503 AND p.prop2='02HT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=820 AND p.prop1=424125 AND p.prop2='BHO9NBW9TWP5YXD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=821 AND p.prop1=244340 AND p.prop2='97VKPEO2FRFV' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=822 AND p.prop1=226752 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=823 AND p.prop1=134643 AND p.prop2='D' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=824 AND p.prop1=783729 AND p.prop2='SGUF4LX1QLMWI0V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=825 AND p.prop1=896228 AND p.prop2='SJ6XEQJJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=826 AND p.prop1=537378 AND p.prop2='37QQU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=827 AND p.prop1=737328 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=828 AND p.prop1=178385 AND p.prop2='OVEJISHGIS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=829 AND p.prop1=225648 AND p.prop2='Z44N4C37WIM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=830 AND p.prop1=969182 AND p.prop2='35U716IRE3ZI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=831 AND p.prop1=57539 AND p.prop2='RUM9CZ8C9T' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=832 AND p.prop1=362577 AND p.prop2='8AL9O6V9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=833 AND p.prop1=850019 AND p.prop2='U4ISQ2M' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=834 AND p.prop1=366493 AND p.prop2='GJTG1090' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=835 AND p.prop1=664823 AND p.prop2='27QARXGXWD7U' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=836 AND p.prop1=816428 AND p.prop2='D3ZLWVYU2M' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=837 AND p.prop1=791917 AND p.prop2='KAWX07' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=838 AND p.prop1=871307 AND p.prop2='O93B37PUR1W6V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=839 AND p.prop1=19798 AND p.prop2='E57DS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=840 AND p.prop1=993995 AND p.prop2='H06X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=841 AND p.prop1=108359 AND p.prop2='MCYVTOO27IXHI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=842 AND p.prop1=750748 AND p.prop2='11N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=843 AND p.prop1=848806 AND p.prop2='9KBWJF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=844 AND p.prop1=656421 AND p.prop2='2PUJ8E1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=845 AND p.prop1=605980 AND p.prop2='3HJNFYX69TB7T92' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=846 AND p.prop1=455177 AND p.prop2='OFJ6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=847 AND p.prop1=569235 AND p.prop2='4VXI43OWKQI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=848 AND p.prop1=986151 AND p.prop2='9ME' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=849 AND p.prop1=154108 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=850 AND p.prop1=512450 AND p.prop2='3P4FQMR4EAZT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=851 AND p.prop1=209608 AND p.prop2='FD3D1HDCO5Y' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=852 AND p.prop1=960608 AND p.prop2='6WDRM82HWPALMHT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=853 AND p.prop1=129314 AND p.prop2='EWGY5114QT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=854 AND p.prop1=500752 AND p.prop2='PG90R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=855 AND p.prop1=24402 AND p.prop2='AXWARMMRP2K399' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=856 AND p.prop1=702032 AND p.prop2='K13IC25' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=857 AND p.prop1=914596 AND p.prop2='4N81T98Q93Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=858 AND p.prop1=975164 AND p.prop2='E54Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=859 AND p.prop1=854602 AND p.prop2='5GWIJXQ14K09J' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=860 AND p.prop1=523133 AND p.prop2='WAYR5E9' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=861 AND p.prop1=926343 AND p.prop2='MJQUO4PLZIYNJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=862 AND p.prop1=890503 AND p.prop2='7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=863 AND p.prop1=995293 AND p.prop2='QT87C106F' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=864 AND p.prop1=785377 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=865 AND p.prop1=756958 AND p.prop2='5A' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=866 AND p.prop1=684842 AND p.prop2='H70W6O5JCX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=867 AND p.prop1=426304 AND p.prop2='Y7ZW5K' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=868 AND p.prop1=780935 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=869 AND p.prop1=508374 AND p.prop2='VTEB8Q18WH7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=870 AND p.prop1=996890 AND p.prop2='W91T3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=871 AND p.prop1=8478 AND p.prop2='M5B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=872 AND p.prop1=609868 AND p.prop2='ZN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=873 AND p.prop1=965508 AND p.prop2='XBG3BA9K0UR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=874 AND p.prop1=671190 AND p.prop2='AOF7ISB86H' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=875 AND p.prop1=386538 AND p.prop2='TC5W5WRB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=876 AND p.prop1=116460 AND p.prop2='X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=877 AND p.prop1=323899 AND p.prop2='X32' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=878 AND p.prop1=620732 AND p.prop2='JNY4JDOZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=879 AND p.prop1=562987 AND p.prop2='1OVOY7AQEAYZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=880 AND p.prop1=191373 AND p.prop2='ME' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=881 AND p.prop1=747843 AND p.prop2='TVO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=882 AND p.prop1=501433 AND p.prop2='5D9H97ZAOB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=883 AND p.prop1=88673 AND p.prop2='JFCBF3A4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=884 AND p.prop1=843877 AND p.prop2='GS7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=885 AND p.prop1=642427 AND p.prop2='9LPS2P6N' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=886 AND p.prop1=428839 AND p.prop2='YMT2WYIJ24' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=887 AND p.prop1=497354 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=888 AND p.prop1=456975 AND p.prop2='O6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=889 AND p.prop1=783910 AND p.prop2='I' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=890 AND p.prop1=465047 AND p.prop2='S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=891 AND p.prop1=380378 AND p.prop2='A5YRTK8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=892 AND p.prop1=101821 AND p.prop2='E55WLB9DI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=893 AND p.prop1=310362 AND p.prop2='CAGO0U6X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=894 AND p.prop1=301984 AND p.prop2='45JNC9OS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=895 AND p.prop1=940856 AND p.prop2='MG3AQP5IVN' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=896 AND p.prop1=521565 AND p.prop2='21H2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=897 AND p.prop1=404063 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=898 AND p.prop1=631401 AND p.prop2='YBW366' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=899 AND p.prop1=126126 AND p.prop2='43' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=900 AND p.prop1=99716 AND p.prop2='3YGUAG3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=901 AND p.prop1=422743 AND p.prop2='34IHAC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=902 AND p.prop1=601542 AND p.prop2='PKBXCR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=903 AND p.prop1=360555 AND p.prop2='0ITJBWCPJQS6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=904 AND p.prop1=898384 AND p.prop2='AQ9RB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=905 AND p.prop1=267187 AND p.prop2='7ODNS' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=906 AND p.prop1=528232 AND p.prop2='ZXVUIN0UCQ8NEV7' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=907 AND p.prop1=826422 AND p.prop2='Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=908 AND p.prop1=972155 AND p.prop2='5CGRS1FWDSCJ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=909 AND p.prop1=840127 AND p.prop2='MN7JX' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=910 AND p.prop1=846332 AND p.prop2='QSIAE8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=911 AND p.prop1=881706 AND p.prop2='B3881X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=912 AND p.prop1=427532 AND p.prop2='GB7Q2V60' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=913 AND p.prop1=784307 AND p.prop2='5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=914 AND p.prop1=372206 AND p.prop2='D' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=915 AND p.prop1=339800 AND p.prop2='S6JK3EF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=916 AND p.prop1=363202 AND p.prop2='U' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=917 AND p.prop1=267686 AND p.prop2='FYF88E4U0B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=918 AND p.prop1=201851 AND p.prop2='JE7XOI29FQM09L' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=919 AND p.prop1=480833 AND p.prop2='N83DEQVTIKZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=920 AND p.prop1=756133 AND p.prop2='JLO1Q7LGE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=921 AND p.prop1=649633 AND p.prop2='DKTNO1VX8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=922 AND p.prop1=655840 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=923 AND p.prop1=656130 AND p.prop2='NAGHE9JAOMDC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=924 AND p.prop1=644337 AND p.prop2='W8DD5BUHVIOFKP5' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=925 AND p.prop1=831648 AND p.prop2='UW' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=926 AND p.prop1=519354 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=927 AND p.prop1=616041 AND p.prop2='J' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=928 AND p.prop1=857213 AND p.prop2='X' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=929 AND p.prop1=572213 AND p.prop2='C8C9OAPYKTG5W0O' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=930 AND p.prop1=778226 AND p.prop2='Q2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=931 AND p.prop1=462618 AND p.prop2='7RDWAPXYCQYYCPB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=932 AND p.prop1=735572 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=933 AND p.prop1=218169 AND p.prop2='P14JQLDK' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=934 AND p.prop1=62947 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=935 AND p.prop1=239560 AND p.prop2='MQMK9O9CVCT70BI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=936 AND p.prop1=65970 AND p.prop2='V02ZC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=937 AND p.prop1=356524 AND p.prop2='1VJKUYDZNSM6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=938 AND p.prop1=971643 AND p.prop2='FPSE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=939 AND p.prop1=507539 AND p.prop2='8V3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=940 AND p.prop1=179675 AND p.prop2='0RK2GBPR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=941 AND p.prop1=718372 AND p.prop2='IAERU8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=942 AND p.prop1=758098 AND p.prop2='TCO7QJG' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=943 AND p.prop1=604562 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=944 AND p.prop1=982789 AND p.prop2='QW1NCJXVI9C4R7U' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=945 AND p.prop1=207852 AND p.prop2='LQD1' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=946 AND p.prop1=878586 AND p.prop2='HG4Z3YVTT0C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=947 AND p.prop1=350952 AND p.prop2='OOU4AXKG556' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=948 AND p.prop1=73189 AND p.prop2='U' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=949 AND p.prop1=929891 AND p.prop2='59CW2ZB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=950 AND p.prop1=963585 AND p.prop2='I7T6RBX6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=951 AND p.prop1=243195 AND p.prop2='G' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=952 AND p.prop1=591486 AND p.prop2='XV9D165HP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=953 AND p.prop1=203722 AND p.prop2='02' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=954 AND p.prop1=226465 AND p.prop2='3C6' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=955 AND p.prop1=656275 AND p.prop2='LKMXV9O8K16S' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=956 AND p.prop1=785509 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=957 AND p.prop1=613976 AND p.prop2='2B' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=958 AND p.prop1=972995 AND p.prop2='3R7GN0QJRC' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=959 AND p.prop1=982973 AND p.prop2='C' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=960 AND p.prop1=6846 AND p.prop2='XI07C4FBY5JZ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=961 AND p.prop1=219163 AND p.prop2='VCLB' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=962 AND p.prop1=410246 AND p.prop2='5GL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=963 AND p.prop1=667818 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=964 AND p.prop1=181234 AND p.prop2='4JD27PRH7TAS4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=965 AND p.prop1=226227 AND p.prop2='G3MRK548P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=966 AND p.prop1=578961 AND p.prop2='V4E8' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=967 AND p.prop1=730591 AND p.prop2='MFBJGE1EQA4' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=968 AND p.prop1=530830 AND p.prop2='287' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=969 AND p.prop1=573394 AND p.prop2='XVLQR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=970 AND p.prop1=696688 AND p.prop2='GSNC8NECI' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=971 AND p.prop1=399414 AND p.prop2='B2OXLY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=972 AND p.prop1=496931 AND p.prop2='X4GWEK2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=973 AND p.prop1=85364 AND p.prop2='CVTRC9KE3DO5R' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=974 AND p.prop1=133669 AND p.prop2='W5SC58VFVJY' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=975 AND p.prop1=760240 AND p.prop2='9ESG02FEMMVA9Q' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=976 AND p.prop1=781824 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=977 AND p.prop1=700768 AND p.prop2='TL' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=978 AND p.prop1=884081 AND p.prop2='2Z8MXJRFF2GRSQ' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=979 AND p.prop1=992748 AND p.prop2='I8VVND4BR' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=980 AND p.prop1=941454 AND p.prop2='1IHFOVBVE' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=981 AND p.prop1=323230 AND p.prop2='6N2' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=982 AND p.prop1=569611 AND p.prop2='NMQTDO' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=983 AND p.prop1=333298 AND p.prop2='T1MQEIRH' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=984 AND p.prop1=890940 AND p.prop2='RYIHT385J' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=985 AND p.prop1=244687 AND p.prop2='7B6LAD' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=986 AND p.prop1=175180 AND p.prop2='07P' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=987 AND p.prop1=523195 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=988 AND p.prop1=214723 AND p.prop2='A9KVESQ587U' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=989 AND p.prop1=891945 AND p.prop2='Y3L307KPRDJ4WR3' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=990 AND p.prop1=550035 AND p.prop2='L7X67G4QY4V' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=991 AND p.prop1=424124 AND p.prop2='1OF523OWP' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=992 AND p.prop1=104646 AND p.prop2='' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=993 AND p.prop1=765752 AND p.prop2='PSU21N9YV5KT' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=994 AND p.prop1=649873 AND p.prop2='I1PEA8K' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=995 AND p.prop1=959449 AND p.prop2='ZAUL7LERRJU' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=996 AND p.prop1=752360 AND p.prop2='WJF' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=997 AND p.prop1=661157 AND p.prop2='FAUWJ055ZSM' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=998 AND p.prop1=708876 AND p.prop2='M4UGSLZLSQ257Z' DELETE p; ----- ok --STATEMENT MATCH (p:Person) WHERE p.id=999 AND p.prop1=375732 AND p.prop2='84' DELETE p; ----- ok --STATEMENT MATCH () RETURN COUNT(*) ----- 1 -0 --STATEMENT MATCH ()-[]->() RETURN COUNT(*) ----- 1 -0 diff --git a/test/test_files/update_rel/create_empty.test b/test/test_files/update_rel/create_empty.test index b8f1f9d31a1..79b7d45212a 100644 --- a/test/test_files/update_rel/create_empty.test +++ b/test/test_files/update_rel/create_empty.test @@ -184,7 +184,7 @@ ---- ok -STATEMENT MATCH (n1:N1)-[r:Rel1]->(n2:N2) WHERE n1.ID=10 AND n2.ID=12 RETURN r ---- 1 -(0:0)-{_LABEL: Rel1, _ID: 0:0}->(1:0) +(0:0)-{_LABEL: Rel1, _ID: 2:0}->(1:0) -STATEMENT MATCH (n1:N1)-[r:Rel1]->(n2:N2) WHERE n1.ID=10 AND n2.ID=12 DELETE r ---- ok -STATEMENT MATCH (n:N1)-[r:Rel1]->(m:N2) RETURN n.ID, m.ID diff --git a/test/test_files/update_rel/create_read_tinysnb.test b/test/test_files/update_rel/create_read_tinysnb.test index eda65f2d098..6ba899b6b5e 100644 --- a/test/test_files/update_rel/create_read_tinysnb.test +++ b/test/test_files/update_rel/create_read_tinysnb.test @@ -5,14 +5,14 @@ -CASE CreateRelRead1 -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 2 CREATE (a)-[e:knows {date:date('2023-03-03')}]->(b) RETURN id(e), e.date; ---- 1 -0:14|2023-03-03 +3:14|2023-03-03 -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID = 0 AND b.ID = 2 RETURN e; ---- 2 (0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf], summary: {locations: ['toronto','waterloo'], transfer: {day: 2021-01-02, amount: [100,200]}}, notes: 1, someMap: {a=b}}->(0:1) (0:0)-{_LABEL: knows, _ID: 3:14, date: 2023-03-03}->(0:1) -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 2 CREATE (a)-[e:knows {date:date('2023-04-04')}]->(b) RETURN e; ---- 1 -(0:0)-{_LABEL: knows, _ID: 0:15, date: 2023-04-04}->(0:1) +(0:0)-{_LABEL: knows, _ID: 3:15, date: 2023-04-04}->(0:1) -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID = 0 AND b.ID = 2 RETURN e; ---- 3 (0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf], summary: {locations: ['toronto','waterloo'], transfer: {day: 2021-01-02, amount: [100,200]}}, notes: 1, someMap: {a=b}}->(0:1) @@ -22,9 +22,9 @@ -CASE CreateRelRead2 -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID = 0 CREATE (a)-[f:knows {date:date('2023-04-04')}]->(b) RETURN f; ---- 3 -(0:0)-{_LABEL: knows, _ID: 0:14, date: 2023-04-04}->(0:1) -(0:0)-{_LABEL: knows, _ID: 0:15, date: 2023-04-04}->(0:2) -(0:0)-{_LABEL: knows, _ID: 0:16, date: 2023-04-04}->(0:3) +(0:0)-{_LABEL: knows, _ID: 3:14, date: 2023-04-04}->(0:1) +(0:0)-{_LABEL: knows, _ID: 3:15, date: 2023-04-04}->(0:2) +(0:0)-{_LABEL: knows, _ID: 3:16, date: 2023-04-04}->(0:3) -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID = 0 RETURN e; ---- 6 (0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf], summary: {locations: ['toronto','waterloo'], transfer: {day: 2021-01-02, amount: [100,200]}}, notes: 1, someMap: {a=b}}->(0:1) diff --git a/test/test_files/update_rel/merge_tinysnb.test b/test/test_files/update_rel/merge_tinysnb.test index 08ea21fa05a..0705a325fde 100644 --- a/test/test_files/update_rel/merge_tinysnb.test +++ b/test/test_files/update_rel/merge_tinysnb.test @@ -32,7 +32,7 @@ -CASE Merge3 -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 7 MERGE (a)-[r:knows {date:a.birthdate}]->(b) RETURN r; ---- 1 -(0:0)-{_LABEL: knows, _ID: 0:14, date: 1900-01-01}->(0:4) +(0:0)-{_LABEL: knows, _ID: 3:14, date: 1900-01-01}->(0:4) -CASE MergeOneToOne -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 9 AND b.ID = 10 MERGE (a)-[r:marries]->(b) ON CREATE SET a.age = 0, r.note = 'merged ntoes' diff --git a/test/transaction/transaction_manager_test.cpp b/test/transaction/transaction_manager_test.cpp index d76bc1e440f..7207dd3c919 100644 --- a/test/transaction/transaction_manager_test.cpp +++ b/test/transaction/transaction_manager_test.cpp @@ -20,8 +20,7 @@ class TransactionManagerTest : public EmptyDBTest { BufferPoolConstants::DEFAULT_VM_REGION_MAX_SIZE); wal = std::make_unique( databasePath, false /* readOnly */, *bufferManager, getFileSystem(*database)); - transactionManager = - std::make_unique(*wal, getMemoryManager(*database)); + transactionManager = std::make_unique(*wal); } void TearDown() override { EmptyDBTest::TearDown(); } From 3ce3b1fb7c80b92a3ad5b73d85be8b801741209e Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Fri, 15 Mar 2024 23:57:19 +0800 Subject: [PATCH 048/136] fix rel insert and append sanityCheck for column chunk --- src/include/storage/store/column_chunk.h | 4 ++- .../storage/store/struct_column_chunk.h | 7 ++++ src/storage/store/column.cpp | 9 +++++ src/storage/store/column_chunk.cpp | 26 +++++++------- src/storage/store/rel_table_data.cpp | 5 ++- src/storage/store/struct_column_chunk.cpp | 4 +++ test/test_files/issue/issue3.test | 36 +++++++++++++++++++ 7 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 test/test_files/issue/issue3.test diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index d4bcc437453..8eecf3857f6 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -104,10 +104,12 @@ class ColumnChunk { inline uint64_t getCapacity() const { return capacity; } inline uint64_t getNumValues() const { return numValues; } - void setNumValues(uint64_t numValues_); + virtual void setNumValues(uint64_t numValues_); virtual bool numValuesSanityCheck() const; bool isCompressionEnabled() const { return enableCompression; } + virtual bool sanityCheck(); + protected: // Initializes the data buffer. Is (and should be) only called in constructor. void initializeBuffer(common::offset_t capacity); diff --git a/src/include/storage/store/struct_column_chunk.h b/src/include/storage/store/struct_column_chunk.h index 69054aac7a4..20c157b88bc 100644 --- a/src/include/storage/store/struct_column_chunk.h +++ b/src/include/storage/store/struct_column_chunk.h @@ -43,6 +43,13 @@ class StructColumnChunk final : public ColumnChunk { bool numValuesSanityCheck() const override; + void setNumValues(uint64_t numValues) override { + ColumnChunk::setNumValues(numValues); + for (auto& childChunk : childChunks) { + childChunk->setNumValues(numValues); + } + } + private: std::vector> childChunks; }; diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 3528156c1c6..b5587f7f4be 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -475,6 +475,7 @@ static bool sanityCheckForWrites(const ColumnChunkMetadata& metadata, const Logi void Column::append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) { KU_ASSERT(enableCompression == columnChunk->isCompressionEnabled()); + KU_ASSERT(columnChunk->sanityCheck()); // Main column chunk. auto preScanMetadata = columnChunk->getMetadataToFlush(); auto startPageIdx = dataFH->addNewPages(preScanMetadata.numPages); @@ -770,6 +771,7 @@ void Column::commitLocalChunkOutOfPlace(Transaction* transaction, node_group_idx } } columnChunk->finalize(); + KU_ASSERT(columnChunk->sanityCheck()); append(columnChunk.get(), nodeGroupIdx); } @@ -818,6 +820,13 @@ void Column::applyLocalChunkToColumn(node_group_idx_t nodeGroupIdx, if (!localChunks[chunkIdx]->getNullChunk()->isNull(offsetInLocalChunk)) { write(nodeGroupIdx, offsetInDstChunk, localChunks[chunkIdx], offsetInLocalChunk, 1 /*numValues*/); + } else { + auto chunkMeta = metadataDA->get(nodeGroupIdx, TransactionType::WRITE); + if (offsetInDstChunk >= chunkMeta.numValues) { + chunkMeta.numValues = offsetInDstChunk + 1; + KU_ASSERT(sanityCheckForWrites(chunkMeta, dataType)); + metadataDA->update(nodeGroupIdx, chunkMeta); + } } } } diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index dcea4fb697f..2d44a553d06 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -266,13 +266,13 @@ void ColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset_t o KU_ASSERT(dataType.getPhysicalType() != PhysicalTypeID::BOOL && dataType.getPhysicalType() != PhysicalTypeID::VAR_LIST); nullChunk->setNull(offsetInChunk, vector->isNull(offsetInVector)); + if (offsetInChunk >= numValues) { + numValues = offsetInChunk + 1; + } if (!vector->isNull(offsetInVector)) { memcpy(buffer.get() + offsetInChunk * numBytesPerValue, vector->getData() + offsetInVector * numBytesPerValue, numBytesPerValue); } - if (offsetInChunk >= numValues) { - numValues = offsetInChunk + 1; - } } void ColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, @@ -285,9 +285,6 @@ void ColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset srcChunk->buffer.get() + srcOffsetInChunk * numBytesPerValue, numValuesToCopy * numBytesPerValue); nullChunk->write(srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); - if (dstOffsetInChunk + numValuesToCopy >= numValues) { - numValues = dstOffsetInChunk + numValuesToCopy; - } } void ColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, @@ -382,6 +379,13 @@ bool ColumnChunk::numValuesSanityCheck() const { return numValues <= capacity; } +bool ColumnChunk::sanityCheck() { + if (nullChunk) { + return nullChunk->sanityCheck() && numValuesSanityCheck(); + } + return numValues <= capacity; +} + ColumnChunkMetadata ColumnChunk::getMetadataToFlush() const { KU_ASSERT(numValues <= capacity); if (enableCompression) { @@ -474,14 +478,15 @@ void BoolColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset void BoolColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { + if (nullChunk) { + nullChunk->write( + srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); + } if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { numValues = dstOffsetInChunk + numValuesToCopy; } NullMask::copyNullMask((uint64_t*)static_cast(srcChunk)->buffer.get(), srcOffsetInChunk, (uint64_t*)buffer.get(), dstOffsetInChunk, numValuesToCopy); - if (dstOffsetInChunk + numValuesToCopy >= numValues) { - numValues = dstOffsetInChunk + numValuesToCopy + 1; - } } void NullColumnChunk::setNull(offset_t pos, bool isNull) { @@ -508,9 +513,6 @@ void NullColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, } copyFromBuffer((uint64_t*)static_cast(srcChunk)->buffer.get(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); - if (dstOffsetInChunk + numValuesToCopy >= numValues) { - numValues = dstOffsetInChunk + numValuesToCopy + 1; - } } void NullColumnChunk::append( diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 742ecce0266..682d1a13542 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -506,6 +506,7 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, std::vector dstOffsets; dstOffsets.resize(newChunk->getNumValues()); fillSequence(dstOffsets, localState.leftCSROffset); + KU_ASSERT(newChunk->sanityCheck()); column->prepareCommitForChunk( transaction, nodeGroupIdx, dstOffsets, newChunk.get(), 0 /*srcOffset*/); } @@ -881,6 +882,7 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no int64_t newLength = (int64_t)oldLength - deletions.size(); KU_ASSERT(newLength >= 0); newHeader.length->setValue(newLength, offset); + newHeader.length->getNullChunk()->setNull(offset, false); } for (auto& [offset, _] : localState.localNG->insertChunks.getSrcNodeOffsetToRelOffsets()) { if (localState.region.isOutOfBoundary(offset)) { @@ -894,6 +896,7 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no int64_t newLength = (int64_t)oldLength + numInsertions; KU_ASSERT(newLength >= 0); newHeader.length->setValue(newLength, offset); + newHeader.length->getNullChunk()->setNull(offset, false); } if (localState.region.level > 0) { distributeOffsets(header, localState, localState.region.leftBoundary, maxNumNodesInRegion); @@ -902,7 +905,6 @@ void RelTableData::updateCSRHeader(Transaction* transaction, node_group_idx_t no getNewRegionSize(header, localState.sizeChangesPerSegment, localState.region); localState.regionCapacity = getRegionCapacity(header, localState.region); } - KU_ASSERT(newHeader.sanityCheck()); localState.leftCSROffset = newHeader.getStartCSROffset(localState.region.leftBoundary); localState.rightCSROffset = newHeader.getEndCSROffset(localState.region.rightBoundary); std::vector dstOffsets; @@ -939,6 +941,7 @@ void RelTableData::distributeOffsets(const ChunkedCSRHeader& header, LocalState& auto startCSROffset = newHeader.getStartCSROffset(nodeOffset); auto newOffset = startCSROffset + newLength + newGap; newHeader.offset->setValue(newOffset, nodeOffset); + newHeader.offset->getNullChunk()->setNull(nodeOffset, false); } localState.needSliding = true; } diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index 06d30bc76f3..7c52b7fe621 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -99,6 +99,7 @@ void StructColumnChunk::write( auto offsetInChunk = dstOffsets->getValue(i); KU_ASSERT(offsetInChunk < capacity); nullChunk->setNull(offsetInChunk, chunk->getNullChunk()->isNull(i)); + numValues = offsetInChunk >= numValues ? offsetInChunk + 1 : numValues; } auto structChunk = ku_dynamic_cast(chunk); for (auto i = 0u; i < childChunks.size(); i++) { @@ -112,6 +113,9 @@ void StructColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, auto srcStructChunk = ku_dynamic_cast(srcChunk); KU_ASSERT(childChunks.size() == srcStructChunk->childChunks.size()); nullChunk->write(srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); + if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { + numValues = dstOffsetInChunk + numValuesToCopy; + } for (auto i = 0u; i < childChunks.size(); i++) { childChunks[i]->write(srcStructChunk->childChunks[i].get(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); diff --git a/test/test_files/issue/issue3.test b/test/test_files/issue/issue3.test new file mode 100644 index 00000000000..693dc4f33cc --- /dev/null +++ b/test/test_files/issue/issue3.test @@ -0,0 +1,36 @@ +-GROUP IssueTest +-DATASET CSV empty + +-- + +-CASE BUG +-STATEMENT CREATE NODE TABLE n ( id STRING, name STRING, PRIMARY KEY(id) ) +---- ok +-STATEMENT CREATE NODE TABLE f ( id STRING, prop1 STRING, prop2 STRING, prop3 INT64, prop4 STRING, prop5 STRING, PRIMARY KEY(id) ) +---- ok +-STATEMENT CREATE REL TABLE E ( FROM n TO f , prop BOOLEAN ) +---- ok +-STATEMENT MERGE (n:f { id: "fewnjw32i3o#new" }) SET n.prop1 = "wen3", n.prop2 = "ewfw23", n.prop5 = "d6112fewnfw2323ir203092323f78r2r" RETURN n.id +---- ok +-STATEMENT MERGE (n:n { id: "wfw24sd" }) SET n.name = "fs23" RETURN n.id +---- ok +-STATEMENT MATCH (f:n), (t:f) WHERE f.id = "wfw24sd" AND t.id = "fewnjw32i3o#new" CREATE (f)-[r:E { prop : True }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:n { id: "fwfw232few" }) SET n.name = "fw3dds" RETURN n.id +---- ok +-STATEMENT MATCH (f:n), (t:f) WHERE f.id = "fwfw232few" AND t.id = "fewnjw32i3o#new" CREATE (f)-[r:E { prop : True }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:n { id: "7fnfjwe*33" }) SET n.name = "89njfew23" RETURN n.id +---- ok +-STATEMENT MATCH (f:n), (t:f) WHERE f.id = "7fnfjwe*33" AND t.id = "fewnjw32i3o#new" CREATE (f)-[r:E { prop : True }]->(t) RETURN r +---- ok +-STATEMENT MERGE (n:n { id: "8nfw*" }) SET n.name = "fs23" RETURN n.id +---- ok +-STATEMENT MERGE (n:n { id: "wefn&323" }) SET n.name = "89njfew23" RETURN n.id +---- ok +-STATEMENT MERGE (n:f { id: "nj2r2br2&323h^w8" }) SET n.prop1 = "wen3", n.prop2 = "wpy", n.prop3 = 6, n.prop4 = "tpi32", n.prop5 = "s12" RETURN n.id +---- ok +-STATEMENT MERGE (n:n { id: "njwf&33bnjkfw*f" }) SET n.name = "cs" RETURN n.id +---- ok +-STATEMENT MATCH (f:n), (t:f) WHERE f.id = "njwf&33bnjkfw*f" AND t.id = "nj2r2br2&323h^w8" CREATE (f)-[r:E { prop : False }]->(t) RETURN r +---- ok From 0531afe6dfeb6660c61a12451f97853168f0bf95 Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Tue, 19 Mar 2024 04:29:47 -0400 Subject: [PATCH 049/136] Exclude extension files from the rust crate (#3076) --- tools/rust_api/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/rust_api/Cargo.toml b/tools/rust_api/Cargo.toml index c4a675456c9..02bd46173e0 100644 --- a/tools/rust_api/Cargo.toml +++ b/tools/rust_api/Cargo.toml @@ -14,7 +14,6 @@ include = [ "build.rs", "/src", "/include", - "/kuzu-src/extension", "/kuzu-src/src", "/kuzu-src/third_party", "/kuzu-src/Makefile", From 907d831d3ac197bcee0a3347446801f6fa016012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Tue, 19 Mar 2024 22:33:16 +0800 Subject: [PATCH 050/136] Remove unnecessary components for pip package (#3085) --- src/include/main/client_config.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/include/main/client_config.h b/src/include/main/client_config.h index 8649c5bd2c0..b35fbe85e20 100644 --- a/src/include/main/client_config.h +++ b/src/include/main/client_config.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace kuzu { From c39704d34580f0839f7d663fd7bea3b682636e47 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Wed, 20 Mar 2024 00:59:54 +0800 Subject: [PATCH 051/136] fix deadlock issue due to bm no frame to claim exception and fix usedMem size --- src/binder/bind/ddl/bind_create_rdf_graph.cpp | 12 +- .../catalog_entry/rel_table_catalog_entry.cpp | 19 +- .../binder/ddl/bound_create_table_info.h | 2 +- .../storage/buffer_manager/buffer_manager.h | 5 +- src/storage/buffer_manager/buffer_manager.cpp | 6 +- .../storage_structure/db_file_utils.cpp | 37 +- src/storage/store/rel_table_data.cpp | 12 +- .../index/orderby_nosort/1000/slt_good_0.test | 1161 + .../update_node/create_random_int.test | 20010 ++++++++++++++++ 9 files changed, 21224 insertions(+), 40 deletions(-) create mode 100644 test/test_files/cypherlogic/index/orderby_nosort/1000/slt_good_0.test create mode 100644 test/test_files/update_node/create_random_int.test diff --git a/src/binder/bind/ddl/bind_create_rdf_graph.cpp b/src/binder/bind/ddl/bind_create_rdf_graph.cpp index f4e85b15a97..1fd97c0d70d 100644 --- a/src/binder/bind/ddl/bind_create_rdf_graph.cpp +++ b/src/binder/bind/ddl/bind_create_rdf_graph.cpp @@ -35,9 +35,9 @@ BoundCreateTableInfo Binder::bindCreateRdfGraphInfo(const CreateTableInfo* info) std::vector resourceTripleProperties; resourceTripleProperties.emplace_back(InternalKeyword::ID, *LogicalType::INTERNAL_ID()); resourceTripleProperties.emplace_back(std::string(rdf::PID), *LogicalType::INTERNAL_ID()); - auto boundResourceTripleExtraInfo = std::make_unique( - common::RelMultiplicity::MANY, common::RelMultiplicity::MANY, INVALID_TABLE_ID, - INVALID_TABLE_ID, std::move(resourceTripleProperties)); + auto boundResourceTripleExtraInfo = + std::make_unique(RelMultiplicity::MANY, RelMultiplicity::MANY, + INVALID_TABLE_ID, INVALID_TABLE_ID, std::move(resourceTripleProperties)); auto boundResourceTripleCreateInfo = BoundCreateTableInfo( TableType::REL, resourceTripleTableName, std::move(boundResourceTripleExtraInfo)); // Literal triple table. @@ -45,9 +45,9 @@ BoundCreateTableInfo Binder::bindCreateRdfGraphInfo(const CreateTableInfo* info) std::vector literalTripleProperties; literalTripleProperties.emplace_back(InternalKeyword::ID, *LogicalType::INTERNAL_ID()); literalTripleProperties.emplace_back(std::string(rdf::PID), *LogicalType::INTERNAL_ID()); - auto boundLiteralTripleExtraInfo = std::make_unique( - common::RelMultiplicity::MANY, common::RelMultiplicity::MANY, INVALID_TABLE_ID, - INVALID_TABLE_ID, std::move(literalTripleProperties)); + auto boundLiteralTripleExtraInfo = + std::make_unique(RelMultiplicity::MANY, RelMultiplicity::MANY, + INVALID_TABLE_ID, INVALID_TABLE_ID, std::move(literalTripleProperties)); auto boundLiteralTripleCreateInfo = BoundCreateTableInfo( TableType::REL, literalTripleTableName, std::move(boundLiteralTripleExtraInfo)); // Rdf table. diff --git a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp index 0ea59ba5e59..cf3d4a75ffd 100644 --- a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp @@ -8,8 +8,8 @@ namespace kuzu { namespace catalog { RelTableCatalogEntry::RelTableCatalogEntry(std::string name, table_id_t tableID, - common::RelMultiplicity srcMultiplicity, common::RelMultiplicity dstMultiplicity, - table_id_t srcTableID, table_id_t dstTableID) + RelMultiplicity srcMultiplicity, RelMultiplicity dstMultiplicity, table_id_t srcTableID, + table_id_t dstTableID) : TableCatalogEntry{CatalogEntryType::REL_TABLE_ENTRY, std::move(name), tableID}, srcMultiplicity{srcMultiplicity}, dstMultiplicity{dstMultiplicity}, srcTableID{srcTableID}, dstTableID{dstTableID} {} @@ -30,14 +30,13 @@ column_id_t RelTableCatalogEntry::getColumnID(property_id_t propertyID) const { auto it = std::find_if(properties.begin(), properties.end(), [&propertyID](const auto& property) { return property.getPropertyID() == propertyID; }); // Skip the first column in the rel table, which is reserved for nbrID. - return it == properties.end() ? common::INVALID_COLUMN_ID : - std::distance(properties.begin(), it) + 1; + return it == properties.end() ? INVALID_COLUMN_ID : std::distance(properties.begin(), it) + 1; } bool RelTableCatalogEntry::isSingleMultiplicity(RelDataDirection direction) const { - return getMultiplicity(direction) == common::RelMultiplicity::ONE; + return getMultiplicity(direction) == RelMultiplicity::ONE; } -common::RelMultiplicity RelTableCatalogEntry::getMultiplicity(RelDataDirection direction) const { +RelMultiplicity RelTableCatalogEntry::getMultiplicity(RelDataDirection direction) const { return direction == RelDataDirection::FWD ? dstMultiplicity : srcMultiplicity; } table_id_t RelTableCatalogEntry::getBoundTableID(RelDataDirection relDirection) const { @@ -57,8 +56,8 @@ void RelTableCatalogEntry::serialize(Serializer& serializer) const { std::unique_ptr RelTableCatalogEntry::deserialize( Deserializer& deserializer) { - common::RelMultiplicity srcMultiplicity; - common::RelMultiplicity dstMultiplicity; + RelMultiplicity srcMultiplicity; + RelMultiplicity dstMultiplicity; table_id_t srcTableID; table_id_t dstTableID; deserializer.deserializeValue(srcMultiplicity); @@ -85,8 +84,8 @@ std::string RelTableCatalogEntry::toCypher(main::ClientContext* clientContext) c ss << "CREATE REL TABLE " << getName() << "( FROM " << srcTableName << " TO " << dstTableName << ", "; Property::toCypher(getPropertiesRef(), ss); - auto srcMultiStr = srcMultiplicity == common::RelMultiplicity::MANY ? "MANY" : "ONE"; - auto dstMultiStr = dstMultiplicity == common::RelMultiplicity::MANY ? "MANY" : "ONE"; + auto srcMultiStr = srcMultiplicity == RelMultiplicity::MANY ? "MANY" : "ONE"; + auto dstMultiStr = dstMultiplicity == RelMultiplicity::MANY ? "MANY" : "ONE"; ss << srcMultiStr << "_" << dstMultiStr << ");"; return ss.str(); } diff --git a/src/include/binder/ddl/bound_create_table_info.h b/src/include/binder/ddl/bound_create_table_info.h index 9a7abde7c76..1db69672bd8 100644 --- a/src/include/binder/ddl/bound_create_table_info.h +++ b/src/include/binder/ddl/bound_create_table_info.h @@ -6,7 +6,7 @@ #include "common/types/types.h" namespace kuzu { -namespace catalog { +namespace common { enum class RelMultiplicity : uint8_t; } namespace binder { diff --git a/src/include/storage/buffer_manager/buffer_manager.h b/src/include/storage/buffer_manager/buffer_manager.h index 0852042e57b..2ecd9227be9 100644 --- a/src/include/storage/buffer_manager/buffer_manager.h +++ b/src/include/storage/buffer_manager/buffer_manager.h @@ -211,7 +211,10 @@ class BufferManager { BMFileHandle* fileHandle, common::page_idx_t pageIdx, PageState* pageState); inline uint64_t reserveUsedMemory(uint64_t size) { return usedMemory.fetch_add(size); } - inline uint64_t freeUsedMemory(uint64_t size) { return usedMemory.fetch_sub(size); } + inline uint64_t freeUsedMemory(uint64_t size) { + KU_ASSERT(usedMemory.load() >= size); + return usedMemory.fetch_sub(size); + } inline uint8_t* getFrame(BMFileHandle& fileHandle, common::page_idx_t pageIdx) { return vmRegions[fileHandle.getPageSizeClass()]->getFrame(fileHandle.getFrameIdx(pageIdx)); diff --git a/src/storage/buffer_manager/buffer_manager.cpp b/src/storage/buffer_manager/buffer_manager.cpp index aea817cf05c..01909c60acd 100644 --- a/src/storage/buffer_manager/buffer_manager.cpp +++ b/src/storage/buffer_manager/buffer_manager.cpp @@ -334,7 +334,7 @@ void BufferManager::removeFilePagesFromFrames(BMFileHandle& fileHandle) { void BufferManager::flushAllDirtyPagesInFrames(BMFileHandle& fileHandle) { for (auto pageIdx = 0u; pageIdx < fileHandle.getNumPages(); ++pageIdx) { - removePageFromFrame(fileHandle, pageIdx, true /* flush */); + flushIfDirtyWithoutLock(fileHandle, pageIdx); } } @@ -357,11 +357,15 @@ void BufferManager::removePageFromFrameIfNecessary(BMFileHandle& fileHandle, pag void BufferManager::removePageFromFrame( BMFileHandle& fileHandle, page_idx_t pageIdx, bool shouldFlush) { auto pageState = fileHandle.getPageState(pageIdx); + if (PageState::getState(pageState->getStateAndVersion()) == PageState::EVICTED) { + return; + } pageState->spinLock(pageState->getStateAndVersion()); if (shouldFlush) { flushIfDirtyWithoutLock(fileHandle, pageIdx); } releaseFrameForPage(fileHandle, pageIdx); + freeUsedMemory(fileHandle.getPageSize()); pageState->resetToEvicted(); } diff --git a/src/storage/storage_structure/db_file_utils.cpp b/src/storage/storage_structure/db_file_utils.cpp index a079e737c32..c164c90b4b4 100644 --- a/src/storage/storage_structure/db_file_utils.cpp +++ b/src/storage/storage_structure/db_file_utils.cpp @@ -26,22 +26,29 @@ WALPageIdxAndFrame createWALVersionIfNecessaryAndPinPage(page_idx_t originalPage page_idx_t pageIdxInWAL; uint8_t* walFrame; fileHandle.acquireWALPageIdxLock(originalPageIdx); - if (fileHandle.hasWALPageVersionNoWALPageIdxLock(originalPageIdx)) { - pageIdxInWAL = fileHandle.getWALPageIdxNoWALPageIdxLock(originalPageIdx); - walFrame = bufferManager.pin( - *wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::READ_PAGE); - } else { - pageIdxInWAL = - wal.logPageUpdateRecord(dbFileID, originalPageIdx /* pageIdxInOriginalFile */); - walFrame = bufferManager.pin( - *wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::DONT_READ_PAGE); - if (!insertingNewPage) { - bufferManager.optimisticRead(fileHandle, originalPageIdx, [&](uint8_t* frame) -> void { - memcpy(walFrame, frame, BufferPoolConstants::PAGE_4KB_SIZE); - }); + try { + if (fileHandle.hasWALPageVersionNoWALPageIdxLock(originalPageIdx)) { + pageIdxInWAL = fileHandle.getWALPageIdxNoWALPageIdxLock(originalPageIdx); + walFrame = bufferManager.pin( + *wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::READ_PAGE); + } else { + pageIdxInWAL = + wal.logPageUpdateRecord(dbFileID, originalPageIdx /* pageIdxInOriginalFile */); + walFrame = bufferManager.pin( + *wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::DONT_READ_PAGE); + if (!insertingNewPage) { + bufferManager.optimisticRead( + fileHandle, originalPageIdx, [&](uint8_t* frame) -> void { + memcpy(walFrame, frame, BufferPoolConstants::PAGE_4KB_SIZE); + }); + } + fileHandle.setWALPageIdxNoLock( + originalPageIdx /* pageIdxInOriginalFile */, pageIdxInWAL); + wal.fileHandle->setLockedPageDirty(pageIdxInWAL); } - fileHandle.setWALPageIdxNoLock(originalPageIdx /* pageIdxInOriginalFile */, pageIdxInWAL); - wal.fileHandle->setLockedPageDirty(pageIdxInWAL); + } catch (Exception& e) { + fileHandle.releaseWALPageIdxLock(originalPageIdx); + throw; } return {originalPageIdx, pageIdxInWAL, walFrame}; } diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 682d1a13542..feb03ae34ee 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -35,7 +35,7 @@ bool RelDataReadState::trySwitchToLocalStorage() { return false; } -bool RelDataReadState::hasMoreToRead(transaction::Transaction* transaction) { +bool RelDataReadState::hasMoreToRead(Transaction* transaction) { if (transaction->isWriteTransaction()) { if (readFromLocalStorage) { // Already read from local storage. Check if there are more in local storage. @@ -250,18 +250,18 @@ void RelTableData::lookup(Transaction* /*transaction*/, TableReadState& /*readSt KU_ASSERT(false); } -void RelTableData::insert(transaction::Transaction* transaction, ValueVector* srcNodeIDVector, +void RelTableData::insert(Transaction* transaction, ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); auto checkPersistent = localTableData->insert({srcNodeIDVector, dstNodeIDVector}, propertyVectors); - if (checkPersistent && multiplicity == common::RelMultiplicity::ONE) { + if (checkPersistent && multiplicity == RelMultiplicity::ONE) { checkRelMultiplicityConstraint(transaction, srcNodeIDVector); } } -void RelTableData::update(transaction::Transaction* transaction, column_id_t columnID, +void RelTableData::update(Transaction* transaction, column_id_t columnID, ValueVector* srcNodeIDVector, ValueVector* relIDVector, ValueVector* propertyVector) { KU_ASSERT(columnID < columns.size() && columnID != REL_ID_COLUMN_ID); auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( @@ -278,7 +278,7 @@ bool RelTableData::delete_( void RelTableData::checkRelMultiplicityConstraint( Transaction* transaction, ValueVector* srcNodeIDVector) const { - KU_ASSERT(srcNodeIDVector->state->isFlat() && multiplicity == common::RelMultiplicity::ONE); + KU_ASSERT(srcNodeIDVector->state->isFlat() && multiplicity == RelMultiplicity::ONE); auto nodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; auto nodeOffset = srcNodeIDVector->getValue(nodeIDPos).offset; if (checkIfNodeHasRels(transaction, nodeOffset)) { @@ -963,7 +963,7 @@ void RelTableData::prepareCommitNodeGroup( } LocalRelNG* RelTableData::getLocalNodeGroup( - transaction::Transaction* transaction, node_group_idx_t nodeGroupIdx) { + Transaction* transaction, node_group_idx_t nodeGroupIdx) { auto localTableData = transaction->getLocalStorage()->getLocalTableData( tableID, getDataIdxFromDirection(direction)); LocalRelNG* localNodeGroup = nullptr; diff --git a/test/test_files/cypherlogic/index/orderby_nosort/1000/slt_good_0.test b/test/test_files/cypherlogic/index/orderby_nosort/1000/slt_good_0.test new file mode 100644 index 00000000000..f06d913ff65 --- /dev/null +++ b/test/test_files/cypherlogic/index/orderby_nosort/1000/slt_good_0.test @@ -0,0 +1,1161 @@ +# These test are translated from SQLLogicTest. +# They are part of the CypherLogicTest project. +-GROUP CypherLogicTest +-DATASET CSV empty + +-- + +-CASE indexorderby_nosort1000slt_good_0 +-SKIP_32BIT +-STATEMENT CREATE NODE TABLE tab0(ID SERIAL,pk INT32, col0 INT32, col1 FLOAT, col2 STRING, col3 INT32, col4 FLOAT, col5 STRING, PRIMARY KEY(ID)) +---- ok +-STATEMENT CREATE (:tab0 {pk:0,col0:7086,col1:4595.50,col2:'gqivt',col3:9925,col4:6167.39,col5:'hzmxz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:1,col0:6270,col1:7871.18,col2:'llwfi',col3:5983,col4:6247.6,col5:'sufqd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:2,col0:5619,col1:9015.49,col2:'hheql',col3:9244,col4:2610.97,col5:'oqqxj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:3,col0:620,col1:5977.83,col2:'gsgir',col3:5949,col4:605.30,col5:'vhsef'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:4,col0:9598,col1:6807.56,col2:'wewcu',col3:8763,col4:6288.2,col5:'kjemy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:5,col0:1119,col1:904.65,col2:'xivyv',col3:3025,col4:7710.50,col5:'uhtvo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:6,col0:9092,col1:595.28,col2:'nxxwc',col3:3004,col4:6129.13,col5:'ltjya'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:7,col0:9589,col1:718.47,col2:'ffbfn',col3:8140,col4:7281.98,col5:'uiaxk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:8,col0:6985,col1:3221.72,col2:'evmqo',col3:9304,col4:2624.39,col5:'offqy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:9,col0:621,col1:5054.64,col2:'hdxjk',col3:5038,col4:588.61,col5:'nsvtb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:10,col0:8973,col1:1105.53,col2:'gbldf',col3:7813,col4:7827.44,col5:'czjxv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:11,col0:624,col1:5105.6,col2:'sqapz',col3:604,col4:582.81,col5:'aocsq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:12,col0:3564,col1:890.86,col2:'mphca',col3:1491,col4:5352.44,col5:'ubbdu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:13,col0:9093,col1:3627.15,col2:'naufs',col3:3213,col4:1308.48,col5:'sslge'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:14,col0:2079,col1:1104.39,col2:'cbdjx',col3:6113,col4:583.9,col5:'wehtu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:15,col0:626,col1:4939.87,col2:'bjdny',col3:6039,col4:9078.10,col5:'mwdtp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:16,col0:8652,col1:1856.36,col2:'rywss',col3:606,col4:9646.62,col5:'wxreu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:17,col0:8348,col1:4923.70,col2:'cotvw',col3:3742,col4:1296.67,col5:'qldru'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:18,col0:627,col1:4806.50,col2:'fmwab',col3:5346,col4:1460.79,col5:'tojyo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:19,col0:2471,col1:1021.66,col2:'wfxms',col3:4129,col4:7046.70,col5:'urzom'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:20,col0:6564,col1:3179.10,col2:'buicp',col3:5567,col4:5684.89,col5:'xhknu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:21,col0:3540,col1:2240.30,col2:'zuoyn',col3:7816,col4:6976.25,col5:'bozxj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:22,col0:628,col1:1762.97,col2:'crayv',col3:7953,col4:3747.73,col5:'cygmc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:23,col0:5531,col1:9150.69,col2:'lnhpg',col3:8234,col4:3295.91,col5:'ywzhz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:24,col0:6618,col1:6906.47,col2:'nrile',col3:2340,col4:8641.67,col5:'offjb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:25,col0:5233,col1:3881.44,col2:'qjkxu',col3:1626,col4:9776.80,col5:'hengv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:26,col0:3914,col1:6524.46,col2:'ygjpa',col3:1376,col4:4916.60,col5:'vocub'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:27,col0:2249,col1:598.71,col2:'lduiw',col3:7047,col4:1752.56,col5:'lvvng'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:28,col0:3129,col1:602.35,col2:'jnxkn',col3:607,col4:8691.93,col5:'zgmkm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:29,col0:8994,col1:3147.16,col2:'bialg',col3:6364,col4:6120.38,col5:'cyuqp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:30,col0:8085,col1:8640.9,col2:'gmjxv',col3:8055,col4:7643.61,col5:'jgpxm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:31,col0:697,col1:9756.99,col2:'djjum',col3:4258,col4:1340.97,col5:'jlxia'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:32,col0:5414,col1:4778.14,col2:'muteb',col3:5059,col4:1012.11,col5:'vkfyh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:33,col0:5389,col1:8337.94,col2:'sirxc',col3:8221,col4:7434.58,col5:'tbjjq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:34,col0:4563,col1:2664.50,col2:'favhb',col3:5433,col4:9603.45,col5:'pgxhy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:35,col0:3931,col1:8834.28,col2:'fcnml',col3:8559,col4:5987.97,col5:'feakm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:36,col0:7790,col1:8023.71,col2:'dlyju',col3:5889,col4:5780.16,col5:'heurj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:37,col0:9985,col1:2754.81,col2:'ojccx',col3:8389,col4:584.46,col5:'cdhgk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:38,col0:632,col1:8145.83,col2:'jddpz',col3:5951,col4:3471.32,col5:'xisyl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:39,col0:633,col1:3164.86,col2:'yqglr',col3:3641,col4:4618.88,col5:'bxkth'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:40,col0:9572,col1:1877.45,col2:'hybeh',col3:7955,col4:8169.53,col5:'zqdvz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:41,col0:3348,col1:4697.28,col2:'bcnfv',col3:3059,col4:5678.59,col5:'iictv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:42,col0:6707,col1:9633.70,col2:'uncih',col3:7050,col4:6925.92,col5:'htehp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:43,col0:2050,col1:3546.46,col2:'zvafm',col3:8197,col4:1159.51,col5:'lawbr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:44,col0:5078,col1:3389.25,col2:'ehghm',col3:1197,col4:8355.15,col5:'cgqdy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:45,col0:1045,col1:7467.34,col2:'eprdn',col3:3422,col4:591.5,col5:'hivqi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:46,col0:1006,col1:6681.26,col2:'dkeig',col3:1171,col4:2639.44,col5:'bizim'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:47,col0:8063,col1:5780.37,col2:'ozwwu',col3:5916,col4:4536.19,col5:'ikujh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:48,col0:3623,col1:4610.48,col2:'swdvx',col3:608,col4:1515.49,col5:'gchvq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:49,col0:3642,col1:9366.52,col2:'lkudb',col3:5671,col4:5913.41,col5:'gfchw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:50,col0:4877,col1:3838.14,col2:'lmdbq',col3:5756,col4:8289.57,col5:'eiior'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:51,col0:1135,col1:669.33,col2:'lzfxz',col3:5491,col4:8674.75,col5:'hmwii'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:52,col0:9525,col1:2591.4,col2:'fsumo',col3:5978,col4:7825.48,col5:'qrmpu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:53,col0:6705,col1:3693.83,col2:'trpzc',col3:998,col4:8467.75,col5:'zrwow'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:54,col0:5137,col1:656.47,col2:'jyjlr',col3:3247,col4:6551.53,col5:'anvze'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:55,col0:9331,col1:4010.60,col2:'vebjx',col3:613,col4:2500.50,col5:'jdlam'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:56,col0:2098,col1:9383.30,col2:'ogvky',col3:2399,col4:2459.58,col5:'yacsu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:57,col0:801,col1:8750.76,col2:'pzjzt',col3:5587,col4:9546.62,col5:'uxsug'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:58,col0:3603,col1:1685.89,col2:'yotwe',col3:1084,col4:5101.0,col5:'nesao'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:59,col0:5718,col1:6608.95,col2:'lixvy',col3:9973,col4:9938.27,col5:'cuiaz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:60,col0:5661,col1:2037.16,col2:'bmkhb',col3:9763,col4:5594.73,col5:'grqxj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:61,col0:1496,col1:7838.34,col2:'zjuyr',col3:638,col4:5575.11,col5:'lmrwm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:62,col0:7091,col1:6476.53,col2:'vmrgh',col3:1709,col4:6615.19,col5:'bbqqy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:63,col0:8363,col1:4261.63,col2:'mwtiz',col3:7263,col4:9916.38,col5:'mivmm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:64,col0:9529,col1:2603.99,col2:'ouchk',col3:3010,col4:2405.37,col5:'hqzky'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:65,col0:9357,col1:9258.7,col2:'jlecy',col3:2341,col4:7982.79,col5:'gojcn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:66,col0:7418,col1:9580.3,col2:'blxaw',col3:2565,col4:8768.78,col5:'pmtkw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:67,col0:634,col1:7771.41,col2:'robjk',col3:1174,col4:6358.65,col5:'cdrzd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:68,col0:8018,col1:8132.69,col2:'lfacz',col3:2083,col4:3069.47,col5:'eloxg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:69,col0:9950,col1:6309.96,col2:'siehf',col3:1883,col4:3191.74,col5:'yvtju'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:70,col0:1400,col1:610.53,col2:'gsxcc',col3:6091,col4:4237.99,col5:'metfk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:71,col0:9690,col1:2939.54,col2:'gtvbc',col3:5398,col4:8190.40,col5:'yegps'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:72,col0:636,col1:675.64,col2:'mfuui',col3:1923,col4:2761.45,col5:'ochrp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:73,col0:3841,col1:7293.52,col2:'mpbvq',col3:5460,col4:2628.51,col5:'vllaf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:74,col0:852,col1:3928.65,col2:'nxmxt',col3:9729,col4:696.49,col5:'rlvpb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:75,col0:9505,col1:613.79,col2:'yinwk',col3:8625,col4:9339.46,col5:'otiaj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:76,col0:1128,col1:7283.71,col2:'csndj',col3:2471,col4:1657.28,col5:'qdqkw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:77,col0:6597,col1:5511.77,col2:'qhplu',col3:4261,col4:2720.19,col5:'ralyf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:78,col0:2593,col1:9275.53,col2:'liaic',col3:5921,col4:822.50,col5:'oaqmz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:79,col0:7844,col1:6450.41,col2:'ypevf',col3:4548,col4:8730.15,col5:'awegt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:80,col0:9381,col1:615.31,col2:'deugr',col3:8667,col4:4932.39,col5:'aqlii'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:81,col0:8785,col1:9263.21,col2:'rbylw',col3:4479,col4:4891.35,col5:'vsjku'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:82,col0:8437,col1:1138.81,col2:'dpiuw',col3:2109,col4:2290.71,col5:'agikr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:83,col0:7772,col1:1394.17,col2:'ajfox',col3:1858,col4:593.30,col5:'uvpyc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:84,col0:9521,col1:5895.31,col2:'wptug',col3:610,col4:2763.74,col5:'xbffu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:85,col0:5970,col1:1850.84,col2:'oyyqk',col3:7304,col4:5568.6,col5:'zeeji'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:86,col0:5202,col1:9067.62,col2:'eavfi',col3:733,col4:7778.31,col5:'mwqhg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:87,col0:7355,col1:1200.31,col2:'iarbj',col3:4246,col4:2940.21,col5:'ypyfb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:88,col0:868,col1:7002.9,col2:'flayn',col3:2776,col4:594.77,col5:'ylvgp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:89,col0:8718,col1:1574.19,col2:'tptip',col3:8928,col4:6176.89,col5:'mplcu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:90,col0:4704,col1:7613.59,col2:'qgjaf',col3:9234,col4:4959.0,col5:'xerrf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:91,col0:9661,col1:6666.62,col2:'qkawy',col3:611,col4:614.72,col5:'zoyqx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:92,col0:7729,col1:617.54,col2:'mqrjo',col3:5570,col4:7794.43,col5:'hhsen'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:93,col0:2598,col1:1734.26,col2:'fadgb',col3:612,col4:3142.91,col5:'cphmq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:94,col0:3760,col1:6328.87,col2:'enhcu',col3:616,col4:6510.99,col5:'pwdms'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:95,col0:2756,col1:3595.33,col2:'dugao',col3:4023,col4:2227.15,col5:'zpyif'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:96,col0:9429,col1:8069.5,col2:'nrigw',col3:3779,col4:599.17,col5:'psugx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:97,col0:8174,col1:633.56,col2:'lwhtx',col3:8338,col4:7890.70,col5:'dhext'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:98,col0:4184,col1:9762.9,col2:'vomxu',col3:639,col4:600.97,col5:'oifff'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:99,col0:9705,col1:2787.22,col2:'pcvbo',col3:3794,col4:1714.32,col5:'ldtxg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:100,col0:637,col1:7132.50,col2:'sndfk',col3:7345,col4:8156.93,col5:'bdndo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:101,col0:1014,col1:1568.10,col2:'keaqu',col3:3507,col4:6847.33,col5:'ikedq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:102,col0:2796,col1:7466.37,col2:'fohjm',col3:3423,col4:8424.12,col5:'dgovw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:103,col0:8576,col1:620.53,col2:'eptbv',col3:3409,col4:7998.56,col5:'lbqls'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:104,col0:9606,col1:9614.28,col2:'vpqmr',col3:1208,col4:6401.16,col5:'hqudv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:105,col0:1683,col1:2843.39,col2:'opncu',col3:2241,col4:1439.37,col5:'zawpe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:106,col0:1409,col1:3990.36,col2:'lfovp',col3:5851,col4:9140.17,col5:'hziwe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:107,col0:2435,col1:6163.5,col2:'qenns',col3:1559,col4:5004.67,col5:'lujos'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:108,col0:1714,col1:2568.27,col2:'hxart',col3:5311,col4:5256.81,col5:'ltaxm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:109,col0:5748,col1:7758.44,col2:'weobo',col3:5730,col4:8091.90,col5:'wuhdw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:110,col0:6841,col1:8886.19,col2:'curhl',col3:617,col4:4928.29,col5:'jggfg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:111,col0:9348,col1:6948.1,col2:'edcmd',col3:1936,col4:1659.0,col5:'ofija'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:112,col0:5924,col1:8043.85,col2:'xwwzb',col3:4595,col4:9897.33,col5:'emdtv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:113,col0:3776,col1:4614.75,col2:'vmisg',col3:619,col4:8229.48,col5:'hyycp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:114,col0:909,col1:6703.49,col2:'gymcs',col3:4403,col4:3465.19,col5:'ihmlp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:115,col0:2382,col1:3200.18,col2:'niznm',col3:3230,col4:1887.35,col5:'gsglu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:116,col0:6553,col1:3091.91,col2:'angap',col3:9001,col4:615.66,col5:'sipit'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:117,col0:1333,col1:6712.35,col2:'jqpwl',col3:6743,col4:8279.18,col5:'abyiv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:118,col0:638,col1:6994.41,col2:'oxjfs',col3:620,col4:7427.6,col5:'ozqlj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:119,col0:9603,col1:719.83,col2:'xcerp',col3:9135,col4:4615.6,col5:'pflxs'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:120,col0:2918,col1:9763.84,col2:'ngvay',col3:3470,col4:2239.25,col5:'qjixm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:121,col0:8984,col1:2351.74,col2:'agovh',col3:1648,col4:9667.59,col5:'jhufm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:122,col0:7216,col1:4308.57,col2:'akead',col3:5827,col4:4489.60,col5:'znzua'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:123,col0:4078,col1:623.71,col2:'bhdlw',col3:8340,col4:3769.94,col5:'dcsjz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:124,col0:9333,col1:5107.51,col2:'rbsqa',col3:7944,col4:5292.4,col5:'ddrfw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:125,col0:2298,col1:4834.92,col2:'siakl',col3:6076,col4:8818.77,col5:'bhooa'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:126,col0:8088,col1:8197.10,col2:'irglg',col3:3095,col4:7327.2,col5:'zsdjs'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:127,col0:3872,col1:7759.8,col2:'efwwd',col3:4537,col4:8274.31,col5:'vhjyh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:128,col0:5116,col1:1177.32,col2:'jkmaj',col3:7365,col4:4834.50,col5:'wpqlf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:129,col0:1840,col1:2460.41,col2:'yodwz',col3:6216,col4:7158.30,col5:'lgusj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:130,col0:4862,col1:3211.66,col2:'ojnxv',col3:9654,col4:3617.99,col5:'mvgsz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:131,col0:2053,col1:3882.70,col2:'zswov',col3:6418,col4:2056.1,col5:'heeeu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:132,col0:4584,col1:5023.15,col2:'zggvz',col3:1673,col4:1041.55,col5:'zhqjj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:133,col0:3176,col1:8531.22,col2:'qysao',col3:3261,col4:1114.24,col5:'guopz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:134,col0:4352,col1:8901.36,col2:'gsgjd',col3:7947,col4:6035.74,col5:'wqbuw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:135,col0:6686,col1:4476.83,col2:'rebmv',col3:7674,col4:4041.34,col5:'oqmgg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:136,col0:7051,col1:8695.38,col2:'ibrfj',col3:5811,col4:9089.65,col5:'dgofq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:137,col0:6873,col1:1347.86,col2:'hdydh',col3:3401,col4:2110.17,col5:'ubjmu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:138,col0:8377,col1:9818.84,col2:'omjdw',col3:5415,col4:2257.94,col5:'cksby'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:139,col0:839,col1:625.23,col2:'ajafl',col3:6997,col4:8155.14,col5:'cdbsu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:140,col0:6836,col1:9245.90,col2:'tvvxo',col3:9719,col4:9153.75,col5:'nbvru'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:141,col0:8497,col1:4210.34,col2:'wepau',col3:7829,col4:6573.17,col5:'wshhg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:142,col0:3751,col1:5513.24,col2:'buegi',col3:4499,col4:4957.80,col5:'nywng'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:143,col0:2576,col1:7276.16,col2:'grruq',col3:8078,col4:3323.72,col5:'zmfrc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:144,col0:3254,col1:8722.9,col2:'byhzz',col3:8341,col4:6409.30,col5:'tqkaf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:145,col0:8616,col1:5420.16,col2:'wrwyg',col3:2735,col4:5928.80,col5:'sxwig'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:146,col0:2292,col1:626.20,col2:'vlqaf',col3:2640,col4:1813.1,col5:'cmsrl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:147,col0:4967,col1:6084.38,col2:'axntt',col3:9607,col4:3472.91,col5:'sdtul'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:148,col0:640,col1:4178.84,col2:'rkgfr',col3:1613,col4:1033.23,col5:'zpryq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:149,col0:2794,col1:8277.35,col2:'gsnrf',col3:9311,col4:6601.13,col5:'dgdmh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:150,col0:816,col1:4438.84,col2:'mpalw',col3:2281,col4:5499.78,col5:'fvxlm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:151,col0:6075,col1:2566.15,col2:'pkodq',col3:5278,col4:7526.3,col5:'jzybk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:152,col0:8257,col1:7664.54,col2:'krhre',col3:4482,col4:8201.1,col5:'yxprl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:153,col0:1599,col1:1083.39,col2:'mxupw',col3:3749,col4:619.74,col5:'kyrch'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:154,col0:1139,col1:1770.81,col2:'dzfwy',col3:864,col4:3692.80,col5:'tgqiz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:155,col0:8968,col1:7521.23,col2:'ragnr',col3:3780,col4:9412.91,col5:'mlpfg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:156,col0:641,col1:6230.6,col2:'ptmbk',col3:6886,col4:8088.57,col5:'sdozl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:157,col0:642,col1:7138.32,col2:'mhlku',col3:7239,col4:2605.70,col5:'iqnaq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:158,col0:644,col1:2082.23,col2:'ivoht',col3:826,col4:9067.26,col5:'eopia'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:159,col0:1712,col1:6751.88,col2:'ncpwu',col3:8807,col4:8056.85,col5:'bkagq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:160,col0:6589,col1:1927.79,col2:'camoz',col3:3768,col4:5871.36,col5:'zhnbx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:161,col0:645,col1:4743.63,col2:'vnqmd',col3:5974,col4:5787.59,col5:'elgpj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:162,col0:9450,col1:9927.75,col2:'fvzba',col3:9613,col4:9301.87,col5:'iyxxc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:163,col0:7374,col1:1056.85,col2:'vlcuh',col3:9048,col4:7383.69,col5:'qgavu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:164,col0:920,col1:1806.63,col2:'gnkvu',col3:5070,col4:1724.33,col5:'xwxqq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:165,col0:6437,col1:7199.34,col2:'kpeno',col3:1145,col4:5991.47,col5:'tbwsv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:166,col0:6070,col1:4853.49,col2:'jfuca',col3:9664,col4:7069.82,col5:'rghbj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:167,col0:4019,col1:6238.42,col2:'ulthd',col3:8195,col4:6319.76,col5:'gxwai'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:168,col0:2783,col1:7918.94,col2:'xrvak',col3:5731,col4:825.93,col5:'dypya'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:169,col0:9412,col1:2806.95,col2:'rehwd',col3:8942,col4:4641.92,col5:'hpxra'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:170,col0:1755,col1:1413.9,col2:'wqwvm',col3:8421,col4:620.81,col5:'csxfi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:171,col0:4715,col1:3097.33,col2:'ewzyq',col3:4940,col4:8791.86,col5:'ltkmn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:172,col0:6495,col1:7313.62,col2:'kmwuu',col3:5695,col4:3348.11,col5:'wabsw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:173,col0:4845,col1:4866.48,col2:'rirhn',col3:622,col4:8164.1,col5:'qsmjj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:174,col0:3322,col1:9156.69,col2:'ijofr',col3:8326,col4:909.3,col5:'adlkb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:175,col0:7528,col1:7433.86,col2:'ddvtr',col3:2974,col4:3723.33,col5:'grxga'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:176,col0:1370,col1:2043.5,col2:'pjeim',col3:9902,col4:4469.31,col5:'rdefk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:177,col0:3304,col1:1679.44,col2:'wqpdv',col3:2183,col4:7987.31,col5:'aocdu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:178,col0:2586,col1:2634.93,col2:'vdspj',col3:6820,col4:7333.19,col5:'iuacd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:179,col0:5524,col1:629.75,col2:'mathq',col3:989,col4:5041.98,col5:'ecdzz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:180,col0:1727,col1:9157.11,col2:'vhuil',col3:8293,col4:4365.47,col5:'vukcn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:181,col0:647,col1:6546.83,col2:'dfucs',col3:5010,col4:621.89,col5:'gvuvt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:182,col0:6365,col1:1398.92,col2:'zcsyt',col3:6344,col4:1994.48,col5:'lmjgq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:183,col0:6770,col1:6742.27,col2:'jxtol',col3:2676,col4:1672.14,col5:'hylse'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:184,col0:6882,col1:709.20,col2:'yskwf',col3:5810,col4:8211.6,col5:'warqn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:185,col0:6562,col1:7768.17,col2:'bpmog',col3:5230,col4:7229.33,col5:'qpdue'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:186,col0:6474,col1:9998.32,col2:'xalqq',col3:4340,col4:2568.59,col5:'gkqic'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:187,col0:4331,col1:8317.17,col2:'opidk',col3:6726,col4:7540.63,col5:'cppds'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:188,col0:1150,col1:3744.19,col2:'hqbst',col3:2395,col4:6182.0,col5:'bjjnf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:189,col0:7494,col1:8645.46,col2:'oxkgd',col3:4033,col4:4502.70,col5:'xofxn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:190,col0:9730,col1:7984.25,col2:'dbfpg',col3:3250,col4:1731.73,col5:'fknjp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:191,col0:6275,col1:631.73,col2:'gklal',col3:6831,col4:1573.77,col5:'qxyhi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:192,col0:3848,col1:634.48,col2:'snlyq',col3:2989,col4:3455.76,col5:'zvlbw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:193,col0:3716,col1:7479.21,col2:'ctvnk',col3:7612,col4:3776.57,col5:'jwnns'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:194,col0:7950,col1:9909.36,col2:'uzxhj',col3:624,col4:7159.60,col5:'esevr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:195,col0:5668,col1:4309.69,col2:'dgpvy',col3:1682,col4:7695.39,col5:'ljfve'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:196,col0:9293,col1:7481.93,col2:'ohohu',col3:7533,col4:622.28,col5:'wyixk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:197,col0:796,col1:7570.44,col2:'relcu',col3:7158,col4:1478.2,col5:'uecme'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:198,col0:7949,col1:5322.77,col2:'nzxoe',col3:8573,col4:1525.38,col5:'pdgqk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:199,col0:651,col1:5329.31,col2:'mkuns',col3:4971,col4:4833.80,col5:'putuz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:200,col0:6801,col1:7282.95,col2:'qkdws',col3:969,col4:1609.0,col5:'hsyia'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:201,col0:9299,col1:7219.66,col2:'ttohi',col3:8862,col4:9033.61,col5:'mpndw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:202,col0:1545,col1:8774.12,col2:'itbxn',col3:4870,col4:2509.78,col5:'ixzik'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:203,col0:4066,col1:4432.37,col2:'atlre',col3:5388,col4:6912.83,col5:'oqjvy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:204,col0:691,col1:6773.42,col2:'jwfkm',col3:3238,col4:7841.88,col5:'lsrap'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:205,col0:4792,col1:9726.87,col2:'gquys',col3:3916,col4:2867.41,col5:'fvwig'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:206,col0:5554,col1:9817.54,col2:'xnsdo',col3:1846,col4:2784.99,col5:'vwzwr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:207,col0:4204,col1:7419.11,col2:'xopjg',col3:6626,col4:2857.81,col5:'juhbs'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:208,col0:652,col1:8005.71,col2:'ndkzo',col3:9281,col4:4078.35,col5:'aymgl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:209,col0:7841,col1:3393.58,col2:'skmha',col3:8511,col4:4406.1,col5:'hzqlf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:210,col0:1791,col1:3000.67,col2:'hattd',col3:6942,col4:623.71,col5:'aglsu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:211,col0:4056,col1:5091.29,col2:'xttbg',col3:7376,col4:6596.55,col5:'pqkam'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:212,col0:9868,col1:8027.71,col2:'ndwjx',col3:9040,col4:624.37,col5:'dyutj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:213,col0:4013,col1:1520.80,col2:'ccicx',col3:3839,col4:625.47,col5:'lsxhf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:214,col0:7074,col1:7875.65,col2:'bknrk',col3:2600,col4:6913.15,col5:'gvbwv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:215,col0:1689,col1:3248.19,col2:'gpwwb',col3:1329,col4:7053.37,col5:'hbywz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:216,col0:8793,col1:8892.82,col2:'djeqc',col3:7457,col4:2268.39,col5:'mrnrr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:217,col0:3873,col1:2408.5,col2:'viptn',col3:6090,col4:1301.37,col5:'afehf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:218,col0:3219,col1:8992.10,col2:'jlwgf',col3:6260,col4:1117.99,col5:'lxauj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:219,col0:654,col1:2692.54,col2:'qzkgb',col3:7177,col4:8154.10,col5:'yntei'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:220,col0:1362,col1:7650.91,col2:'tuknb',col3:4472,col4:9574.35,col5:'etcve'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:221,col0:2990,col1:9358.33,col2:'xeyyl',col3:6456,col4:4509.77,col5:'tcofq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:222,col0:7042,col1:5903.17,col2:'tjelt',col3:626,col4:5317.43,col5:'bgyml'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:223,col0:7563,col1:9223.63,col2:'hfkie',col3:8610,col4:8826.7,col5:'owcch'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:224,col0:6893,col1:6351.37,col2:'fwgdj',col3:5027,col4:7587.70,col5:'xeklf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:225,col0:1928,col1:670.16,col2:'vgsau',col3:1130,col4:1126.25,col5:'ynpml'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:226,col0:655,col1:3158.49,col2:'iviru',col3:2356,col4:7188.17,col5:'ycakp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:227,col0:6937,col1:3642.19,col2:'ydiqs',col3:4321,col4:2993.8,col5:'tnvea'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:228,col0:9702,col1:2047.8,col2:'vnuez',col3:9064,col4:6484.38,col5:'vkyep'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:229,col0:6254,col1:9645.54,col2:'npoug',col3:1301,col4:7575.88,col5:'jdhya'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:230,col0:9989,col1:635.19,col2:'tbqvp',col3:4674,col4:9405.41,col5:'ogyoz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:231,col0:6357,col1:1750.51,col2:'ucedp',col3:8001,col4:9582.47,col5:'njeof'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:232,col0:9106,col1:6788.43,col2:'ngpuk',col3:1524,col4:1440.85,col5:'pooip'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:233,col0:6535,col1:4585.97,col2:'lwtmx',col3:3163,col4:5285.23,col5:'ibfwi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:234,col0:7746,col1:1902.91,col2:'auzix',col3:4761,col4:9644.84,col5:'tawjc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:235,col0:8890,col1:4347.33,col2:'oykme',col3:8342,col4:2518.6,col5:'jvyvb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:236,col0:9419,col1:7625.30,col2:'oavrq',col3:2348,col4:2631.5,col5:'icspb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:237,col0:8337,col1:8790.49,col2:'qczxk',col3:7904,col4:680.39,col5:'palfw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:238,col0:656,col1:7494.78,col2:'uftcy',col3:5058,col4:626.67,col5:'zcnxa'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:239,col0:2603,col1:7234.91,col2:'nzapj',col3:9033,col4:728.17,col5:'jumbf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:240,col0:9961,col1:6609.8,col2:'vhbye',col3:6478,col4:5234.43,col5:'tbifi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:241,col0:2227,col1:637.58,col2:'nxokv',col3:1719,col4:5185.91,col5:'lcmhm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:242,col0:9907,col1:1632.44,col2:'ebton',col3:3006,col4:9892.59,col5:'dvznh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:243,col0:658,col1:1213.2,col2:'ibmdm',col3:8768,col4:8136.62,col5:'aroxx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:244,col0:5045,col1:793.65,col2:'ralib',col3:3855,col4:9422.93,col5:'aavxe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:245,col0:3770,col1:3197.26,col2:'bjfsw',col3:5797,col4:5228.87,col5:'rzlyr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:246,col0:2945,col1:3869.2,col2:'rnkqw',col3:1047,col4:628.79,col5:'qzzia'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:247,col0:831,col1:2083.91,col2:'fnvbl',col3:1237,col4:3670.73,col5:'kimmv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:248,col0:3990,col1:2219.40,col2:'yroyu',col3:9421,col4:629.1,col5:'syexx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:249,col0:3534,col1:5002.5,col2:'tbcdq',col3:6330,col4:2233.84,col5:'ouuoj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:250,col0:1376,col1:8754.16,col2:'mintr',col3:6623,col4:9340.98,col5:'jvsst'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:251,col0:6480,col1:650.34,col2:'yfmyq',col3:5132,col4:1253.33,col5:'afbie'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:252,col0:1111,col1:7947.21,col2:'yenmi',col3:3116,col4:8263.61,col5:'bjsxj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:253,col0:7084,col1:9274.95,col2:'ocbms',col3:4510,col4:2627.90,col5:'xfqya'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:254,col0:2016,col1:5838.99,col2:'esmth',col3:2174,col4:9826.35,col5:'tcvro'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:255,col0:5574,col1:2703.58,col2:'smmuy',col3:4144,col4:9814.74,col5:'wfopp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:256,col0:5725,col1:638.46,col2:'obzce',col3:9883,col4:8267.17,col5:'sikfx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:257,col0:4988,col1:4315.47,col2:'yagah',col3:6528,col4:7835.61,col5:'yjmmn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:258,col0:6682,col1:9673.14,col2:'viedk',col3:5142,col4:9390.59,col5:'rdmsz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:259,col0:1178,col1:9053.38,col2:'fdifr',col3:6965,col4:3276.78,col5:'osuwh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:260,col0:2147,col1:5505.5,col2:'dgzmj',col3:9663,col4:637.65,col5:'virmg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:261,col0:2811,col1:3425.62,col2:'wylny',col3:3575,col4:4283.6,col5:'nylbi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:262,col0:2191,col1:9809.76,col2:'alyuh',col3:7969,col4:707.91,col5:'pqjuc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:263,col0:1361,col1:5499.0,col2:'rnyeu',col3:7286,col4:638.78,col5:'bpbhz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:264,col0:9696,col1:6436.36,col2:'mfetj',col3:7396,col4:643.49,col5:'almzt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:265,col0:1120,col1:4906.91,col2:'vmwiv',col3:1843,col4:3397.81,col5:'wazyl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:266,col0:662,col1:799.47,col2:'xtpdr',col3:8095,col4:1452.1,col5:'kzqkl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:267,col0:9188,col1:2841.21,col2:'wmvhp',col3:3799,col4:5610.54,col5:'yiekv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:268,col0:2686,col1:9868.26,col2:'axsqf',col3:3026,col4:7720.64,col5:'meekg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:269,col0:5481,col1:2058.35,col2:'usggo',col3:2523,col4:1603.93,col5:'uifbf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:270,col0:8001,col1:2187.41,col2:'alpbw',col3:7963,col4:4302.7,col5:'mvamd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:271,col0:2725,col1:6878.26,col2:'ziana',col3:630,col4:7334.41,col5:'fskin'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:272,col0:663,col1:7854.15,col2:'nvcfk',col3:1492,col4:7937.54,col5:'xnsba'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:273,col0:6461,col1:3182.45,col2:'ffvmg',col3:1806,col4:644.99,col5:'ozrsq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:274,col0:6935,col1:8532.22,col2:'mhszo',col3:5013,col4:6931.81,col5:'topos'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:275,col0:5039,col1:8414.91,col2:'syymk',col3:5164,col4:9662.20,col5:'lgprh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:276,col0:7259,col1:7443.91,col2:'iwogy',col3:2737,col4:1148.15,col5:'jbooy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:277,col0:9626,col1:1579.22,col2:'bajxo',col3:885,col4:5992.8,col5:'zpkud'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:278,col0:3977,col1:9379.3,col2:'xljwa',col3:1688,col4:2016.41,col5:'pwdpg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:279,col0:4197,col1:3247.43,col2:'hrqer',col3:2400,col4:1522.23,col5:'quaot'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:280,col0:2473,col1:688.93,col2:'jopvh',col3:1701,col4:2527.91,col5:'ptpfg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:281,col0:5543,col1:5549.16,col2:'vvbtp',col3:5950,col4:650.76,col5:'ijyqq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:282,col0:943,col1:9282.48,col2:'iqjcb',col3:5428,col4:7233.57,col5:'zcubi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:283,col0:3265,col1:2180.56,col2:'mhodd',col3:632,col4:6838.32,col5:'islpe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:284,col0:665,col1:4637.9,col2:'xvkrn',col3:8327,col4:2251.77,col5:'segtu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:285,col0:9777,col1:8394.30,col2:'mqrvz',col3:8193,col4:8855.10,col5:'jyjcp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:286,col0:4651,col1:7790.69,col2:'lcdpv',col3:8675,col4:5258.49,col5:'gzeyy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:287,col0:667,col1:1011.58,col2:'lesks',col3:3433,col4:4537.80,col5:'ozfwe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:288,col0:668,col1:1342.77,col2:'udpxb',col3:7556,col4:5495.18,col5:'kiljx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:289,col0:2896,col1:8415.14,col2:'lbmlw',col3:3805,col4:3905.67,col5:'kmfoz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:290,col0:6915,col1:9455.31,col2:'gnmtd',col3:8870,col4:3765.86,col5:'kunss'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:291,col0:8394,col1:640.24,col2:'yenou',col3:9614,col4:8544.49,col5:'vydyz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:292,col0:6629,col1:7855.86,col2:'kmfgy',col3:9328,col4:2435.8,col5:'vspuj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:293,col0:670,col1:8909.69,col2:'tfdkw',col3:3978,col4:1602.55,col5:'fpnve'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:294,col0:4553,col1:3828.47,col2:'kdvnf',col3:8455,col4:5432.89,col5:'thmjs'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:295,col0:5589,col1:6578.80,col2:'eqbpg',col3:2827,col4:7786.71,col5:'fnmzh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:296,col0:8572,col1:6224.74,col2:'phyur',col3:8586,col4:8247.91,col5:'plrgn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:297,col0:3053,col1:8181.45,col2:'wqxyc',col3:4903,col4:3370.32,col5:'bmvhd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:298,col0:9382,col1:5458.80,col2:'yqyhw',col3:4871,col4:7933.27,col5:'gvgjl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:299,col0:4960,col1:9913.2,col2:'wiuck',col3:1762,col4:6188.28,col5:'gcaoh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:300,col0:672,col1:3503.31,col2:'sovgg',col3:5271,col4:3106.64,col5:'xybnd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:301,col0:6223,col1:9531.44,col2:'smnxe',col3:7771,col4:5636.3,col5:'ttfui'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:302,col0:8216,col1:3897.44,col2:'oghzh',col3:633,col4:3945.20,col5:'hcmrb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:303,col0:4572,col1:6352.17,col2:'grqcf',col3:634,col4:2675.53,col5:'yocvr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:304,col0:1695,col1:1741.94,col2:'osouf',col3:4324,col4:2189.70,col5:'khrtp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:305,col0:676,col1:1258.18,col2:'vggng',col3:8774,col4:9827.27,col5:'poerr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:306,col0:2873,col1:3696.3,col2:'grqbg',col3:2962,col4:1143.38,col5:'ukiub'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:307,col0:7492,col1:6694.99,col2:'blecz',col3:6566,col4:1173.28,col5:'vjnho'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:308,col0:6508,col1:7989.51,col2:'nsecm',col3:5686,col4:5671.4,col5:'gaytr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:309,col0:1581,col1:6665.65,col2:'ccvrz',col3:9103,col4:2365.11,col5:'iovup'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:310,col0:677,col1:4406.69,col2:'rdkjz',col3:4520,col4:2203.99,col5:'dnnsn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:311,col0:1787,col1:6740.75,col2:'maieq',col3:4817,col4:653.85,col5:'zkodt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:312,col0:4243,col1:4297.42,col2:'kbhhq',col3:4300,col4:8728.11,col5:'ddvsr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:313,col0:9900,col1:4051.39,col2:'bplok',col3:4950,col4:4679.11,col5:'fysma'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:314,col0:1922,col1:651.7,col2:'wjlih',col3:2675,col4:4801.75,col5:'htewa'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:315,col0:678,col1:7292.21,col2:'ffqwo',col3:3557,col4:4908.6,col5:'wazyj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:316,col0:9217,col1:7717.55,col2:'pscaq',col3:636,col4:1536.85,col5:'ddril'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:317,col0:1069,col1:6718.40,col2:'rvxag',col3:7506,col4:3194.36,col5:'chvrm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:318,col0:4947,col1:1759.30,col2:'modxj',col3:9868,col4:1613.85,col5:'qvahq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:319,col0:1766,col1:4150.64,col2:'ojaeo',col3:6477,col4:2996.23,col5:'odevc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:320,col0:747,col1:652.28,col2:'xccna',col3:8046,col4:9270.72,col5:'adnxg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:321,col0:5653,col1:2967.18,col2:'kkjjo',col3:2963,col4:9336.42,col5:'gutqu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:322,col0:1059,col1:2504.0,col2:'pkhmz',col3:3540,col4:654.98,col5:'abekw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:323,col0:8583,col1:8114.78,col2:'dizsc',col3:2268,col4:8798.20,col5:'pfwjd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:324,col0:3146,col1:9096.50,col2:'sfmks',col3:8061,col4:2107.66,col5:'vorcy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:325,col0:9220,col1:6097.74,col2:'ejpia',col3:2511,col4:9530.37,col5:'lcnhm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:326,col0:7077,col1:2363.33,col2:'vdhzl',col3:6134,col4:3580.34,col5:'yfjgw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:327,col0:9041,col1:4985.90,col2:'glolz',col3:4622,col4:1241.27,col5:'zbjre'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:328,col0:5735,col1:6155.59,col2:'wmvxh',col3:5093,col4:5222.12,col5:'imdew'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:329,col0:2335,col1:4410.61,col2:'oiwgs',col3:2343,col4:5203.77,col5:'yjsxm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:330,col0:4816,col1:5886.91,col2:'flzvk',col3:5090,col4:9087.63,col5:'hosgd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:331,col0:6205,col1:5565.76,col2:'pnfzr',col3:2229,col4:4250.27,col5:'hdnjl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:332,col0:2828,col1:8529.44,col2:'rygpt',col3:9083,col4:8790.4,col5:'pkiwt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:333,col0:679,col1:1207.78,col2:'ljwxh',col3:3649,col4:2780.71,col5:'ngjle'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:334,col0:1092,col1:2624.87,col2:'kpuyf',col3:2849,col4:9511.5,col5:'kvykt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:335,col0:8142,col1:5654.62,col2:'kyxhy',col3:8782,col4:6751.53,col5:'nionp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:336,col0:3742,col1:8269.43,col2:'zzkso',col3:4973,col4:7989.88,col5:'ikdjz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:337,col0:4475,col1:4788.77,col2:'icwow',col3:2621,col4:3686.74,col5:'nwado'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:338,col0:7723,col1:7128.86,col2:'lhnso',col3:6854,col4:2528.29,col5:'hkefh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:339,col0:7918,col1:6053.24,col2:'jndzg',col3:2972,col4:2670.87,col5:'fbiuu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:340,col0:2793,col1:2425.44,col2:'eoiwt',col3:2703,col4:2992.58,col5:'ryzlj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:341,col0:9634,col1:8455.58,col2:'eppac',col3:640,col4:4348.96,col5:'swsya'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:342,col0:1524,col1:8949.0,col2:'zrobs',col3:9545,col4:814.56,col5:'hydqv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:343,col0:3600,col1:2563.88,col2:'soxcl',col3:8490,col4:933.60,col5:'lecfu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:344,col0:9300,col1:3049.87,col2:'cfqgu',col3:7216,col4:8977.58,col5:'hcvie'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:345,col0:6607,col1:654.73,col2:'llhpc',col3:3330,col4:6192.91,col5:'ilaeo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:346,col0:4312,col1:2637.93,col2:'cnslk',col3:8364,col4:2041.54,col5:'iuydw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:347,col0:8255,col1:5983.29,col2:'eyrcw',col3:4027,col4:5463.55,col5:'rcrls'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:348,col0:7574,col1:7190.59,col2:'bvnos',col3:8452,col4:6119.84,col5:'iibsg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:349,col0:965,col1:4247.23,col2:'dsqcl',col3:2449,col4:5643.69,col5:'efyro'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:350,col0:2904,col1:7744.79,col2:'jblsx',col3:5753,col4:8890.44,col5:'usiso'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:351,col0:9948,col1:2117.74,col2:'zalcl',col3:3276,col4:5190.5,col5:'ytjnh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:352,col0:6936,col1:6899.0,col2:'xxnya',col3:1354,col4:9594.80,col5:'mtqvy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:353,col0:3259,col1:7974.58,col2:'szytj',col3:4000,col4:4127.86,col5:'ojcua'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:354,col0:9114,col1:8819.21,col2:'xynia',col3:9153,col4:9035.95,col5:'qzlvl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:355,col0:1746,col1:1763.99,col2:'vospo',col3:4927,col4:4037.91,col5:'wnzds'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:356,col0:1700,col1:9228.97,col2:'alubs',col3:5862,col4:9577.41,col5:'wvyla'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:357,col0:9072,col1:4989.79,col2:'ekxjj',col3:9174,col4:8069.50,col5:'fmmkh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:358,col0:9762,col1:5414.33,col2:'hlifx',col3:1005,col4:5151.27,col5:'gjymn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:359,col0:1716,col1:723.30,col2:'yzlrb',col3:2672,col4:934.46,col5:'jhujq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:360,col0:1184,col1:6228.89,col2:'fvwbg',col3:6918,col4:1245.11,col5:'epytu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:361,col0:8965,col1:3593.38,col2:'xnuhr',col3:4162,col4:8896.17,col5:'mtrwk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:362,col0:6661,col1:2080.78,col2:'qfttj',col3:8750,col4:4914.9,col5:'neacl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:363,col0:2923,col1:9796.43,col2:'bbdwi',col3:5202,col4:9798.52,col5:'bmqth'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:364,col0:9703,col1:4948.65,col2:'wbypr',col3:4463,col4:4773.86,col5:'ooamc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:365,col0:8504,col1:7088.36,col2:'ylhfw',col3:641,col4:3034.95,col5:'dwszt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:366,col0:6630,col1:8367.69,col2:'ondwq',col3:4831,col4:1000.62,col5:'xcjtf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:367,col0:3435,col1:4786.63,col2:'ketef',col3:6208,col4:9563.41,col5:'zatmi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:368,col0:6575,col1:7439.62,col2:'upqxn',col3:3439,col4:5336.10,col5:'qvdwf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:369,col0:8256,col1:3772.23,col2:'tsrnc',col3:3348,col4:1907.41,col5:'kxdeh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:370,col0:1484,col1:8827.70,col2:'cbjzm',col3:6688,col4:1085.56,col5:'gncvk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:371,col0:6318,col1:6492.67,col2:'revee',col3:4383,col4:4151.96,col5:'pgzcy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:372,col0:6115,col1:754.71,col2:'jkzps',col3:3787,col4:3112.78,col5:'pvrra'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:373,col0:3786,col1:6949.0,col2:'hlrzz',col3:4929,col4:1943.62,col5:'doahl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:374,col0:8040,col1:3009.95,col2:'watbe',col3:6763,col4:7844.9,col5:'zdyjd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:375,col0:9637,col1:716.80,col2:'ciixz',col3:3417,col4:2490.48,col5:'zcqtw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:376,col0:7640,col1:6942.28,col2:'kyqvu',col3:642,col4:3274.34,col5:'cppbu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:377,col0:5662,col1:4918.19,col2:'agnwp',col3:1090,col4:4566.16,col5:'oywpe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:378,col0:8113,col1:5465.7,col2:'adfkk',col3:2496,col4:8954.92,col5:'bgbvx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:379,col0:6460,col1:8254.79,col2:'jnswc',col3:2002,col4:8504.80,col5:'rzmag'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:380,col0:5467,col1:3053.22,col2:'gfsht',col3:3366,col4:6000.74,col5:'hsivi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:381,col0:9449,col1:979.80,col2:'xfyzr',col3:3022,col4:6202.9,col5:'ntubx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:382,col0:8522,col1:5745.19,col2:'bpbam',col3:6331,col4:7091.24,col5:'vqdeu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:383,col0:4853,col1:4913.90,col2:'uczej',col3:3829,col4:1119.24,col5:'stvzu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:384,col0:8911,col1:1140.93,col2:'upved',col3:7479,col4:6465.41,col5:'wftdy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:385,col0:5714,col1:3435.34,col2:'mwfog',col3:6917,col4:8278.0,col5:'gdhzo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:386,col0:1081,col1:8401.95,col2:'defid',col3:5708,col4:9928.76,col5:'fohxj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:387,col0:7882,col1:1490.88,col2:'zxqhe',col3:7590,col4:4262.63,col5:'pwmhs'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:388,col0:2290,col1:8253.27,col2:'idbcw',col3:2730,col4:4845.32,col5:'yniun'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:389,col0:682,col1:5585.83,col2:'qjamz',col3:3967,col4:7218.94,col5:'oskep'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:390,col0:2608,col1:2983.48,col2:'wazeq',col3:3068,col4:655.66,col5:'qugas'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:391,col0:3615,col1:3788.0,col2:'gfrik',col3:6976,col4:6857.28,col5:'jesaq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:392,col0:4919,col1:6441.65,col2:'sgbgn',col3:4060,col4:6316.89,col5:'euzyh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:393,col0:2944,col1:5730.77,col2:'xgpaa',col3:643,col4:4450.51,col5:'sqsbz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:394,col0:4918,col1:4041.42,col2:'hxfar',col3:5853,col4:5413.65,col5:'zrexk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:395,col0:5117,col1:2607.2,col2:'gynuk',col3:679,col4:2831.2,col5:'pdjtu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:396,col0:1115,col1:2757.94,col2:'ixyhb',col3:1410,col4:1053.9,col5:'tldjc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:397,col0:684,col1:7172.17,col2:'fqtxy',col3:7295,col4:6398.75,col5:'mohmc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:398,col0:4829,col1:1127.91,col2:'azivp',col3:6505,col4:8412.92,col5:'rwtql'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:399,col0:685,col1:3746.19,col2:'gkgsb',col3:2389,col4:1110.17,col5:'hpsrw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:400,col0:692,col1:9251.53,col2:'zpgka',col3:9723,col4:4231.36,col5:'iorgh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:401,col0:1884,col1:8211.55,col2:'bcqmx',col3:956,col4:4488.26,col5:'frpty'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:402,col0:4156,col1:8792.57,col2:'ezexb',col3:2464,col4:6815.17,col5:'qtdrl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:403,col0:2691,col1:8009.27,col2:'ykgqt',col3:802,col4:5619.55,col5:'yzohb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:404,col0:6473,col1:2974.30,col2:'agefj',col3:8939,col4:6029.64,col5:'bqbkq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:405,col0:4036,col1:2147.91,col2:'ktbno',col3:2537,col4:5147.10,col5:'pouux'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:406,col0:9716,col1:6585.54,col2:'idbgk',col3:6172,col4:3299.60,col5:'hbzym'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:407,col0:9898,col1:1194.53,col2:'nippj',col3:9599,col4:5283.49,col5:'rfeta'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:408,col0:9268,col1:5976.64,col2:'iihyp',col3:4001,col4:1619.39,col5:'oseyl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:409,col0:7065,col1:7284.75,col2:'sdeiz',col3:8229,col4:9800.84,col5:'aliwy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:410,col0:3326,col1:9059.47,col2:'pdxgh',col3:5071,col4:5540.90,col5:'mbnzb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:411,col0:5140,col1:4104.72,col2:'uyseg',col3:7482,col4:4030.80,col5:'yqkrz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:412,col0:2897,col1:5309.43,col2:'fusft',col3:4847,col4:1179.55,col5:'ainsp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:413,col0:6536,col1:6916.11,col2:'zjurw',col3:9225,col4:4872.56,col5:'exiwm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:414,col0:1801,col1:5763.47,col2:'ofbvb',col3:1601,col4:6214.28,col5:'qnjth'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:415,col0:6482,col1:2538.11,col2:'xrqki',col3:8138,col4:784.82,col5:'vendq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:416,col0:6673,col1:3023.6,col2:'neafh',col3:6421,col4:9884.57,col5:'dmywi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:417,col0:3017,col1:9350.47,col2:'qadwg',col3:1714,col4:1789.82,col5:'kdhfn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:418,col0:6958,col1:1250.20,col2:'icjkk',col3:3205,col4:2995.42,col5:'sttst'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:419,col0:6993,col1:7297.45,col2:'phvuz',col3:644,col4:9472.35,col5:'vgjtd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:420,col0:4915,col1:6168.41,col2:'qikpg',col3:8665,col4:7911.39,col5:'asxdm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:421,col0:2073,col1:7885.85,col2:'rfxsv',col3:6889,col4:6978.71,col5:'lugqk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:422,col0:5615,col1:5068.77,col2:'myexp',col3:2324,col4:8561.53,col5:'cmhwl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:423,col0:4737,col1:4183.1,col2:'cegja',col3:7536,col4:9018.73,col5:'ztdqe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:424,col0:6940,col1:6797.87,col2:'iuknd',col3:6519,col4:656.46,col5:'iaitk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:425,col0:4272,col1:822.77,col2:'omjms',col3:942,col4:1864.79,col5:'pzvpe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:426,col0:9586,col1:1769.83,col2:'cnksk',col3:6399,col4:657.31,col5:'qafra'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:427,col0:2781,col1:3996.53,col2:'delsw',col3:8661,col4:3350.77,col5:'wbtjz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:428,col0:7062,col1:1959.32,col2:'anerx',col3:9926,col4:7630.73,col5:'gzqmw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:429,col0:5180,col1:1461.23,col2:'hzgym',col3:5062,col4:2873.13,col5:'rkaxe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:430,col0:5689,col1:905.52,col2:'vzjta',col3:7871,col4:1746.94,col5:'veddl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:431,col0:9193,col1:2536.30,col2:'xoiwk',col3:7325,col4:1392.81,col5:'lclbf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:432,col0:4599,col1:3705.14,col2:'nyhfc',col3:3824,col4:4674.65,col5:'kptnf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:433,col0:5362,col1:8103.73,col2:'hgukj',col3:5443,col4:1430.31,col5:'yekxl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:434,col0:5739,col1:7023.45,col2:'sdxlh',col3:4183,col4:9718.13,col5:'ndgsj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:435,col0:7038,col1:655.5,col2:'efljz',col3:2220,col4:7071.65,col5:'hhzib'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:436,col0:3867,col1:9086.23,col2:'fbxus',col3:8158,col4:1743.17,col5:'akcqf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:437,col0:693,col1:4049.30,col2:'pksrx',col3:3275,col4:3962.40,col5:'dyzli'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:438,col0:6554,col1:9679.78,col2:'jclsj',col3:7774,col4:7177.8,col5:'dthjv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:439,col0:4382,col1:4004.6,col2:'cmtgn',col3:7037,col4:9312.63,col5:'lmtgg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:440,col0:4182,col1:657.96,col2:'whopf',col3:7868,col4:4012.72,col5:'rjozg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:441,col0:818,col1:7600.44,col2:'pahag',col3:4749,col4:1894.97,col5:'qxixu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:442,col0:9949,col1:3420.14,col2:'xpvzc',col3:6087,col4:1799.48,col5:'pgipj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:443,col0:4292,col1:3533.8,col2:'lftai',col3:647,col4:2042.56,col5:'lcmmx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:444,col0:9862,col1:3956.23,col2:'xrlir',col3:2895,col4:1656.27,col5:'ncqib'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:445,col0:2222,col1:2057.15,col2:'iefga',col3:1058,col4:1652.9,col5:'dqndi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:446,col0:2741,col1:7798.66,col2:'xxjdq',col3:1564,col4:6260.53,col5:'ildkb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:447,col0:4835,col1:4992.37,col2:'kskuj',col3:6201,col4:4184.77,col5:'hanbt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:448,col0:699,col1:2547.40,col2:'dodbo',col3:8181,col4:9851.25,col5:'hoeya'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:449,col0:5169,col1:5720.96,col2:'fltrj',col3:8391,col4:4661.34,col5:'yjcmv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:450,col0:6747,col1:7364.97,col2:'lrzqv',col3:1645,col4:8235.93,col5:'eoufm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:451,col0:9076,col1:9183.69,col2:'sugay',col3:2932,col4:9668.8,col5:'nrppz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:452,col0:9577,col1:2976.38,col2:'xatnv',col3:3668,col4:8775.62,col5:'ciqmy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:453,col0:5222,col1:1889.87,col2:'gypax',col3:7942,col4:7348.79,col5:'wsbus'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:454,col0:8783,col1:1669.21,col2:'dezjw',col3:8772,col4:660.87,col5:'qlbbs'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:455,col0:5083,col1:1907.31,col2:'pwfvy',col3:4351,col4:7415.81,col5:'fzcgh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:456,col0:7247,col1:7294.54,col2:'cmxwb',col3:4296,col4:3601.81,col5:'qjzgc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:457,col0:2949,col1:8867.38,col2:'xhbqt',col3:5901,col4:1138.1,col5:'euakz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:458,col0:701,col1:5263.2,col2:'cbhsm',col3:649,col4:661.6,col5:'nhbjg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:459,col0:5921,col1:3964.98,col2:'tsvsu',col3:9148,col4:1354.78,col5:'vhtpw'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:460,col0:7545,col1:2551.78,col2:'zwrte',col3:650,col4:4506.78,col5:'agoxi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:461,col0:3915,col1:9954.52,col2:'dmvhn',col3:3460,col4:2458.7,col5:'qiyfa'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:462,col0:9209,col1:7697.52,col2:'xofra',col3:8930,col4:1004.68,col5:'hymeg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:463,col0:9658,col1:1155.96,col2:'lsasi',col3:1016,col4:665.33,col5:'mnxsj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:464,col0:9790,col1:800.46,col2:'mrsit',col3:5743,col4:6665.98,col5:'xzjry'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:465,col0:8688,col1:3450.78,col2:'lfdhk',col3:6810,col4:2732.55,col5:'okmou'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:466,col0:6233,col1:3522.36,col2:'rlqpd',col3:1844,col4:9794.44,col5:'wqmxf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:467,col0:9358,col1:4281.1,col2:'jqjjx',col3:8646,col4:8509.26,col5:'qcifa'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:468,col0:8297,col1:9089.49,col2:'xwdit',col3:1444,col4:667.35,col5:'mctjt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:469,col0:2833,col1:2656.18,col2:'umsky',col3:7142,col4:8387.51,col5:'srqht'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:470,col0:8552,col1:2289.67,col2:'yvyld',col3:1569,col4:9478.54,col5:'peupf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:471,col0:3090,col1:9143.39,col2:'txttl',col3:5729,col4:4576.90,col5:'jxign'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:472,col0:2383,col1:9470.24,col2:'bxnwr',col3:2053,col4:668.34,col5:'kpsdc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:473,col0:6918,col1:5873.23,col2:'qxvxi',col3:651,col4:848.53,col5:'kiytu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:474,col0:7984,col1:8547.8,col2:'wmyot',col3:5547,col4:7731.66,col5:'lvmqv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:475,col0:3919,col1:6540.86,col2:'hhtji',col3:957,col4:2538.7,col5:'eirjz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:476,col0:6363,col1:8995.60,col2:'jtzpo',col3:7511,col4:7431.90,col5:'ubqtt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:477,col0:6507,col1:6402.94,col2:'ypere',col3:8520,col4:6542.69,col5:'jzluk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:478,col0:1343,col1:1851.73,col2:'aqayg',col3:6219,col4:7230.1,col5:'vjicd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:479,col0:9911,col1:2276.68,col2:'fehhk',col3:8020,col4:1320.10,col5:'dhsrf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:480,col0:9555,col1:9713.95,col2:'qwdsw',col3:2759,col4:6366.47,col5:'jmlkb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:481,col0:2169,col1:2543.82,col2:'edaxo',col3:6948,col4:6893.55,col5:'yvsum'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:482,col0:702,col1:6746.26,col2:'mybzj',col3:1028,col4:5647.29,col5:'qalkq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:483,col0:4134,col1:7149.61,col2:'gjxbb',col3:5611,col4:4847.81,col5:'sdgvh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:484,col0:6276,col1:8675.18,col2:'ffdwp',col3:7738,col4:7436.1,col5:'fjowv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:485,col0:9469,col1:7598.87,col2:'ipdke',col3:7125,col4:8329.19,col5:'wmuon'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:486,col0:2112,col1:2788.79,col2:'xrjoj',col3:2413,col4:5662.69,col5:'gqoom'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:487,col0:4653,col1:6960.92,col2:'rgore',col3:7420,col4:2047.52,col5:'awnwz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:488,col0:5840,col1:7933.68,col2:'zgngh',col3:7390,col4:5815.95,col5:'btxij'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:489,col0:8974,col1:9867.61,col2:'xornd',col3:5241,col4:2273.17,col5:'kcgnk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:490,col0:8155,col1:4524.97,col2:'inwdz',col3:7817,col4:4949.91,col5:'pltae'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:491,col0:4534,col1:2511.35,col2:'cpssc',col3:2140,col4:6843.5,col5:'oukkl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:492,col0:2565,col1:4536.32,col2:'fylmx',col3:1656,col4:1679.25,col5:'aexom'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:493,col0:6250,col1:2651.5,col2:'udlza',col3:2487,col4:5153.58,col5:'liclp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:494,col0:5391,col1:1507.92,col2:'isxpm',col3:9682,col4:6184.15,col5:'cguuv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:495,col0:1846,col1:9603.17,col2:'vujet',col3:3462,col4:8163.72,col5:'jwdpi'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:496,col0:5767,col1:658.49,col2:'uuouz',col3:5479,col4:669.35,col5:'urntn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:497,col0:1863,col1:4250.69,col2:'nxqda',col3:5057,col4:8395.98,col5:'dixta'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:498,col0:5639,col1:8287.29,col2:'bxijq',col3:5447,col4:7043.10,col5:'qhviy'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:499,col0:9653,col1:9036.14,col2:'oqarm',col3:652,col4:9932.36,col5:'ymnzx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:500,col0:9763,col1:2984.8,col2:'brwum',col3:8798,col4:1566.20,col5:'mtdqh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:501,col0:1380,col1:7966.55,col2:'ayzss',col3:4140,col4:8423.44,col5:'jtshe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:502,col0:5712,col1:4415.20,col2:'cjmjq',col3:7555,col4:672.96,col5:'qkmqq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:503,col0:6021,col1:6610.52,col2:'mnqef',col3:5676,col4:1076.30,col5:'jmwsv'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:504,col0:3869,col1:3930.48,col2:'xdcqz',col3:6556,col4:940.25,col5:'ukrlb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:505,col0:5367,col1:2099.14,col2:'vwtbg',col3:5928,col4:6663.54,col5:'jtcjx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:506,col0:7429,col1:4442.30,col2:'ougah',col3:3448,col4:3335.44,col5:'auael'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:507,col0:4020,col1:3127.7,col2:'jfthg',col3:8951,col4:5520.34,col5:'djajh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:508,col0:2401,col1:660.56,col2:'pcgbj',col3:8694,col4:8503.44,col5:'vgoxr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:509,col0:9391,col1:9951.47,col2:'vssxh',col3:1612,col4:9543.36,col5:'yybws'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:510,col0:7605,col1:7919.71,col2:'zkagv',col3:5568,col4:9121.71,col5:'ehaxl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:511,col0:1711,col1:4388.4,col2:'kdizm',col3:3593,col4:2191.81,col5:'iyfby'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:512,col0:4676,col1:4520.71,col2:'aaaeg',col3:654,col4:9429.23,col5:'ifthl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:513,col0:4018,col1:9821.4,col2:'ocapw',col3:7385,col4:8486.45,col5:'inedn'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:514,col0:8058,col1:9394.7,col2:'mxpla',col3:1352,col4:5232.50,col5:'acsif'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:515,col0:2165,col1:1193.21,col2:'hbvwi',col3:8294,col4:5013.55,col5:'krgja'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:516,col0:5010,col1:3266.82,col2:'oxnro',col3:878,col4:3896.56,col5:'jwpgf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:517,col0:4815,col1:5010.86,col2:'zdlxs',col3:4437,col4:9919.90,col5:'jcmau'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:518,col0:5603,col1:8422.52,col2:'snjnd',col3:3246,col4:4347.98,col5:'yctku'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:519,col0:3446,col1:9342.82,col2:'iigxr',col3:6745,col4:2914.86,col5:'mkmlf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:520,col0:2719,col1:8713.27,col2:'zehrw',col3:5801,col4:7077.87,col5:'qfdcg'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:521,col0:2348,col1:3820.45,col2:'nkfdw',col3:8960,col4:5268.28,col5:'iwoxl'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:522,col0:2056,col1:9551.69,col2:'syexv',col3:8690,col4:4140.86,col5:'wmiqt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:523,col0:8621,col1:9638.64,col2:'evbsv',col3:7637,col4:9818.57,col5:'aprvr'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:524,col0:2121,col1:7912.94,col2:'runxc',col3:4873,col4:9151.12,col5:'ivrmk'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:525,col0:2182,col1:9552.82,col2:'fycaa',col3:2145,col4:960.65,col5:'allqx'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:526,col0:4235,col1:2333.72,col2:'bklnm',col3:655,col4:7287.34,col5:'fbcae'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:527,col0:5757,col1:7880.93,col2:'bvhit',col3:4663,col4:4652.0,col5:'cccrc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:528,col0:2531,col1:2914.23,col2:'mgtnu',col3:3032,col4:5291.75,col5:'bsfry'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:529,col0:4886,col1:663.47,col2:'mkhyg',col3:656,col4:8417.60,col5:'qaqnd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:530,col0:3955,col1:1318.23,col2:'xpyut',col3:4993,col4:1465.11,col5:'wcgzp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:531,col0:7920,col1:4869.45,col2:'rgkgt',col3:6512,col4:1341.98,col5:'gjppt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:532,col0:8265,col1:771.1,col2:'tmedy',col3:657,col4:5675.70,col5:'zidkt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:533,col0:6025,col1:9981.42,col2:'hvpqg',col3:4267,col4:4068.19,col5:'beglo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:534,col0:8033,col1:6058.38,col2:'vtdpx',col3:5735,col4:9348.36,col5:'gjlnb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:535,col0:3177,col1:6407.45,col2:'iikns',col3:6878,col4:8811.82,col5:'mgmqf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:536,col0:8641,col1:3531.67,col2:'izhzb',col3:1377,col4:5476.44,col5:'uukwc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:537,col0:6165,col1:6280.17,col2:'eudjb',col3:659,col4:9341.0,col5:'mduud'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:538,col0:8286,col1:1102.78,col2:'xoujt',col3:9792,col4:8613.81,col5:'gdwcf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:539,col0:4592,col1:3294.70,col2:'qztrb',col3:4450,col4:988.36,col5:'jemmt'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:540,col0:7975,col1:8247.10,col2:'orisd',col3:6444,col4:4873.90,col5:'qpkwu'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:541,col0:874,col1:2704.73,col2:'altzj',col3:661,col4:673.9,col5:'umjjh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:542,col0:1529,col1:6003.57,col2:'tgiam',col3:9606,col4:1935.64,col5:'ifetb'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:543,col0:704,col1:1329.46,col2:'xnlvq',col3:2921,col4:6797.90,col5:'waydz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:544,col0:5582,col1:6969.68,col2:'hbvls',col3:662,col4:9040.52,col5:'dtbne'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:545,col0:720,col1:7552.62,col2:'jjqth',col3:9702,col4:9439.4,col5:'ellny'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:546,col0:9580,col1:5310.40,col2:'looaw',col3:2619,col4:6990.55,col5:'ivoxe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:547,col0:3169,col1:1316.48,col2:'vvylu',col3:983,col4:674.29,col5:'pfrhe'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:548,col0:5780,col1:6748.29,col2:'wbywt',col3:3080,col4:8153.27,col5:'nvvra'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:549,col0:1259,col1:4127.84,col2:'dpoml',col3:9879,col4:2120.93,col5:'mpdep'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:550,col0:9254,col1:8573.39,col2:'pqxfd',col3:1271,col4:6455.74,col5:'svroq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:551,col0:1463,col1:9054.3,col2:'pdhom',col3:2325,col4:681.82,col5:'nqyzz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:552,col0:7885,col1:9635.32,col2:'cefet',col3:9530,col4:7388.58,col5:'jtqms'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:553,col0:3070,col1:728.91,col2:'vtrlz',col3:7059,col4:682.32,col5:'ydypc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:554,col0:2368,col1:664.18,col2:'hhfbc',col3:3005,col4:8004.91,col5:'iktfz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:555,col0:8182,col1:5344.87,col2:'yjyuz',col3:5639,col4:683.34,col5:'growp'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:556,col0:6213,col1:2680.65,col2:'kjvas',col3:9657,col4:6920.40,col5:'xevrz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:557,col0:1715,col1:665.83,col2:'kxvkm',col3:2432,col4:9875.29,col5:'jrysz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:558,col0:5740,col1:666.91,col2:'dquly',col3:663,col4:4313.25,col5:'rjjuh'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:559,col0:1393,col1:5986.25,col2:'cwwch',col3:4618,col4:9876.15,col5:'shwas'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:560,col0:705,col1:7934.67,col2:'objoe',col3:8403,col4:1925.18,col5:'salmf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:561,col0:7758,col1:2214.11,col2:'iqesc',col3:2190,col4:2800.41,col5:'bksvc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:562,col0:1182,col1:2616.20,col2:'floum',col3:669,col4:3059.46,col5:'oauuc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:563,col0:4162,col1:1782.93,col2:'ukocr',col3:7954,col4:2734.9,col5:'ouobm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:564,col0:3804,col1:2449.27,col2:'ygymc',col3:5709,col4:2581.87,col5:'axvre'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:565,col0:6768,col1:8699.76,col2:'pcmcm',col3:7524,col4:5325.75,col5:'uzfuz'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:566,col0:5515,col1:7218.20,col2:'cxway',col3:6106,col4:6917.74,col5:'lcqfo'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:567,col0:4555,col1:8533.18,col2:'gjatb',col3:9334,col4:7781.48,col5:'sebbq'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:568,col0:6700,col1:8274.82,col2:'kkexz',col3:6513,col4:4060.91,col5:'mtxlf'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:569,col0:9312,col1:8416.30,col2:'ruzxs',col3:4626,col4:8874.89,col5:'umczm'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:570,col0:706,col1:8530.53,col2:'ysnob',col3:4578,col4:3563.78,col5:'fwbnd'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:571,col0:5640,col1:7039.76,col2:'epsqu',col3:7454,col4:8940.13,col5:'uubrj'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:572,col0:3085,col1:2461.22,col2:'hmenw',col3:763,col4:6541.26,col5:'fedod'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:573,col0:954,col1:4661.73,col2:'mwkxl',col3:4687,col4:9877.89,col5:'yqihc'}) +---- ok +-STATEMENT CREATE (:tab0 {pk:574,col0:3114,col1:6104.34,col2:'idzic',col3:8339,col4:5673.79,col5:'idvsy'}) +---- ok diff --git a/test/test_files/update_node/create_random_int.test b/test/test_files/update_node/create_random_int.test new file mode 100644 index 00000000000..8af6cf3c0a0 --- /dev/null +++ b/test/test_files/update_node/create_random_int.test @@ -0,0 +1,20010 @@ +-GROUP CreateRandomInt +-DATASET CSV empty +-- +-CASE Seed10 +-SKIP_32BIT +-STATEMENT CREATE NODE TABLE test(id SERIAL, prop INT64, PRIMARY KEY(id)); +---- ok +-STATEMENT CREATE (t:test {prop: 599159}); +---- ok +-STATEMENT CREATE (t:test {prop: 34167}); +---- ok +-STATEMENT CREATE (t:test {prop: 449722}); +---- ok +-STATEMENT CREATE (t:test {prop: 506002}); +---- ok +-STATEMENT CREATE (t:test {prop: 606172}); +---- ok +-STATEMENT CREATE (t:test {prop: 15552}); +---- ok +-STATEMENT CREATE (t:test {prop: 216109}); +---- ok +-STATEMENT CREATE (t:test {prop: 485050}); +---- ok +-STATEMENT CREATE (t:test {prop: 852829}); +---- ok +-STATEMENT CREATE (t:test {prop: 515161}); +---- ok +-STATEMENT CREATE (t:test {prop: 863595}); +---- ok +-STATEMENT CREATE (t:test {prop: 291001}); +---- ok +-STATEMENT CREATE (t:test {prop: 685215}); +---- ok +-STATEMENT CREATE (t:test {prop: 849995}); +---- ok +-STATEMENT CREATE (t:test {prop: 168012}); +---- ok +-STATEMENT CREATE (t:test {prop: 36074}); +---- ok +-STATEMENT CREATE (t:test {prop: 545961}); +---- ok +-STATEMENT CREATE (t:test {prop: 513891}); +---- ok +-STATEMENT CREATE (t:test {prop: 343694}); +---- ok +-STATEMENT CREATE (t:test {prop: 79785}); +---- ok +-STATEMENT CREATE (t:test {prop: 262140}); +---- ok +-STATEMENT CREATE (t:test {prop: 998662}); +---- ok +-STATEMENT CREATE (t:test {prop: 999100}); +---- ok +-STATEMENT CREATE (t:test {prop: 781762}); +---- ok +-STATEMENT CREATE (t:test {prop: 378702}); +---- ok +-STATEMENT CREATE (t:test {prop: 46720}); +---- ok +-STATEMENT CREATE (t:test {prop: 440817}); +---- ok +-STATEMENT CREATE (t:test {prop: 901944}); +---- ok +-STATEMENT CREATE (t:test {prop: 145426}); +---- ok +-STATEMENT CREATE (t:test {prop: 632491}); +---- ok +-STATEMENT CREATE (t:test {prop: 372330}); +---- ok +-STATEMENT CREATE (t:test {prop: 400142}); +---- ok +-STATEMENT CREATE (t:test {prop: 441727}); +---- ok +-STATEMENT CREATE (t:test {prop: 297395}); +---- ok +-STATEMENT CREATE (t:test {prop: 867013}); +---- ok +-STATEMENT CREATE (t:test {prop: 707751}); +---- ok +-STATEMENT CREATE (t:test {prop: 275063}); +---- ok +-STATEMENT CREATE (t:test {prop: 479022}); +---- ok +-STATEMENT CREATE (t:test {prop: 183155}); +---- ok +-STATEMENT CREATE (t:test {prop: 719177}); +---- ok +-STATEMENT CREATE (t:test {prop: 317828}); +---- ok +-STATEMENT CREATE (t:test {prop: 693996}); +---- ok +-STATEMENT CREATE (t:test {prop: 380200}); +---- ok +-STATEMENT CREATE (t:test {prop: 139437}); +---- ok +-STATEMENT CREATE (t:test {prop: 479124}); +---- ok +-STATEMENT CREATE (t:test {prop: 805136}); +---- ok +-STATEMENT CREATE (t:test {prop: 901826}); +---- ok +-STATEMENT CREATE (t:test {prop: 251008}); +---- ok +-STATEMENT CREATE (t:test {prop: 461004}); +---- ok +-STATEMENT CREATE (t:test {prop: 643119}); +---- ok +-STATEMENT CREATE (t:test {prop: 393470}); +---- ok +-STATEMENT CREATE (t:test {prop: 46410}); +---- ok +-STATEMENT CREATE (t:test {prop: 611248}); +---- ok +-STATEMENT CREATE (t:test {prop: 4252}); +---- ok +-STATEMENT CREATE (t:test {prop: 247101}); +---- ok +-STATEMENT CREATE (t:test {prop: 140480}); +---- ok +-STATEMENT CREATE (t:test {prop: 204423}); +---- ok +-STATEMENT CREATE (t:test {prop: 986712}); +---- ok +-STATEMENT CREATE (t:test {prop: 953772}); +---- ok +-STATEMENT CREATE (t:test {prop: 317572}); +---- ok +-STATEMENT CREATE (t:test {prop: 562398}); +---- ok +-STATEMENT CREATE (t:test {prop: 383931}); +---- ok +-STATEMENT CREATE (t:test {prop: 809558}); +---- ok +-STATEMENT CREATE (t:test {prop: 941827}); +---- ok +-STATEMENT CREATE (t:test {prop: 251849}); +---- ok +-STATEMENT CREATE (t:test {prop: 329634}); +---- ok +-STATEMENT CREATE (t:test {prop: 699075}); +---- ok +-STATEMENT CREATE (t:test {prop: 575649}); +---- ok +-STATEMENT CREATE (t:test {prop: 472512}); +---- ok +-STATEMENT CREATE (t:test {prop: 457211}); +---- ok +-STATEMENT CREATE (t:test {prop: 492803}); +---- ok +-STATEMENT CREATE (t:test {prop: 68151}); +---- ok +-STATEMENT CREATE (t:test {prop: 684696}); +---- ok +-STATEMENT CREATE (t:test {prop: 612941}); +---- ok +-STATEMENT CREATE (t:test {prop: 340460}); +---- ok +-STATEMENT CREATE (t:test {prop: 885069}); +---- ok +-STATEMENT CREATE (t:test {prop: 526298}); +---- ok +-STATEMENT CREATE (t:test {prop: 164017}); +---- ok +-STATEMENT CREATE (t:test {prop: 883084}); +---- ok +-STATEMENT CREATE (t:test {prop: 235194}); +---- ok +-STATEMENT CREATE (t:test {prop: 432925}); +---- ok +-STATEMENT CREATE (t:test {prop: 249953}); +---- ok +-STATEMENT CREATE (t:test {prop: 38718}); +---- ok +-STATEMENT CREATE (t:test {prop: 33288}); +---- ok +-STATEMENT CREATE (t:test {prop: 520726}); +---- ok +-STATEMENT CREATE (t:test {prop: 315793}); +---- ok +-STATEMENT CREATE (t:test {prop: 857717}); +---- ok +-STATEMENT CREATE (t:test {prop: 636147}); +---- ok +-STATEMENT CREATE (t:test {prop: 689848}); +---- ok +-STATEMENT CREATE (t:test {prop: 75533}); +---- ok +-STATEMENT CREATE (t:test {prop: 559398}); +---- ok +-STATEMENT CREATE (t:test {prop: 969164}); +---- ok +-STATEMENT CREATE (t:test {prop: 896664}); +---- ok +-STATEMENT CREATE (t:test {prop: 84881}); +---- ok +-STATEMENT CREATE (t:test {prop: 156959}); +---- ok +-STATEMENT CREATE (t:test {prop: 403092}); +---- ok +-STATEMENT CREATE (t:test {prop: 594789}); +---- ok +-STATEMENT CREATE (t:test {prop: 991496}); +---- ok +-STATEMENT CREATE (t:test {prop: 392350}); +---- ok +-STATEMENT CREATE (t:test {prop: 957310}); +---- ok +-STATEMENT CREATE (t:test {prop: 630513}); +---- ok +-STATEMENT CREATE (t:test {prop: 156931}); +---- ok +-STATEMENT CREATE (t:test {prop: 118400}); +---- ok +-STATEMENT CREATE (t:test {prop: 813184}); +---- ok +-STATEMENT CREATE (t:test {prop: 810694}); +---- ok +-STATEMENT CREATE (t:test {prop: 101298}); +---- ok +-STATEMENT CREATE (t:test {prop: 462999}); +---- ok +-STATEMENT CREATE (t:test {prop: 174445}); +---- ok +-STATEMENT CREATE (t:test {prop: 846672}); +---- ok +-STATEMENT CREATE (t:test {prop: 200200}); +---- ok +-STATEMENT CREATE (t:test {prop: 993729}); +---- ok +-STATEMENT CREATE (t:test {prop: 365618}); +---- ok +-STATEMENT CREATE (t:test {prop: 454276}); +---- ok +-STATEMENT CREATE (t:test {prop: 434195}); +---- ok +-STATEMENT CREATE (t:test {prop: 467253}); +---- ok +-STATEMENT CREATE (t:test {prop: 257406}); +---- ok +-STATEMENT CREATE (t:test {prop: 713859}); +---- ok +-STATEMENT CREATE (t:test {prop: 288047}); +---- ok +-STATEMENT CREATE (t:test {prop: 150484}); +---- ok +-STATEMENT CREATE (t:test {prop: 647236}); +---- ok +-STATEMENT CREATE (t:test {prop: 547206}); +---- ok +-STATEMENT CREATE (t:test {prop: 187129}); +---- ok +-STATEMENT CREATE (t:test {prop: 906895}); +---- ok +-STATEMENT CREATE (t:test {prop: 125286}); +---- ok +-STATEMENT CREATE (t:test {prop: 279998}); +---- ok +-STATEMENT CREATE (t:test {prop: 477872}); +---- ok +-STATEMENT CREATE (t:test {prop: 317267}); +---- ok +-STATEMENT CREATE (t:test {prop: 172949}); +---- ok +-STATEMENT CREATE (t:test {prop: 692502}); +---- ok +-STATEMENT CREATE (t:test {prop: 680237}); +---- ok +-STATEMENT CREATE (t:test {prop: 988833}); +---- ok +-STATEMENT CREATE (t:test {prop: 860939}); +---- ok +-STATEMENT CREATE (t:test {prop: 182775}); +---- ok +-STATEMENT CREATE (t:test {prop: 815279}); +---- ok +-STATEMENT CREATE (t:test {prop: 184643}); +---- ok +-STATEMENT CREATE (t:test {prop: 503456}); +---- ok +-STATEMENT CREATE (t:test {prop: 810391}); +---- ok +-STATEMENT CREATE (t:test {prop: 364454}); +---- ok +-STATEMENT CREATE (t:test {prop: 343999}); +---- ok +-STATEMENT CREATE (t:test {prop: 455827}); +---- ok +-STATEMENT CREATE (t:test {prop: 234530}); +---- ok +-STATEMENT CREATE (t:test {prop: 5251}); +---- ok +-STATEMENT CREATE (t:test {prop: 571317}); +---- ok +-STATEMENT CREATE (t:test {prop: 747187}); +---- ok +-STATEMENT CREATE (t:test {prop: 45794}); +---- ok +-STATEMENT CREATE (t:test {prop: 347767}); +---- ok +-STATEMENT CREATE (t:test {prop: 940495}); +---- ok +-STATEMENT CREATE (t:test {prop: 334939}); +---- ok +-STATEMENT CREATE (t:test {prop: 254408}); +---- ok +-STATEMENT CREATE (t:test {prop: 83807}); +---- ok +-STATEMENT CREATE (t:test {prop: 274482}); +---- ok +-STATEMENT CREATE (t:test {prop: 469820}); +---- ok +-STATEMENT CREATE (t:test {prop: 424455}); +---- ok +-STATEMENT CREATE (t:test {prop: 611161}); +---- ok +-STATEMENT CREATE (t:test {prop: 165918}); +---- ok +-STATEMENT CREATE (t:test {prop: 409560}); +---- ok +-STATEMENT CREATE (t:test {prop: 965340}); +---- ok +-STATEMENT CREATE (t:test {prop: 911784}); +---- ok +-STATEMENT CREATE (t:test {prop: 519842}); +---- ok +-STATEMENT CREATE (t:test {prop: 706062}); +---- ok +-STATEMENT CREATE (t:test {prop: 936878}); +---- ok +-STATEMENT CREATE (t:test {prop: 253134}); +---- ok +-STATEMENT CREATE (t:test {prop: 772088}); +---- ok +-STATEMENT CREATE (t:test {prop: 550873}); +---- ok +-STATEMENT CREATE (t:test {prop: 954763}); +---- ok +-STATEMENT CREATE (t:test {prop: 284890}); +---- ok +-STATEMENT CREATE (t:test {prop: 545374}); +---- ok +-STATEMENT CREATE (t:test {prop: 506037}); +---- ok +-STATEMENT CREATE (t:test {prop: 631352}); +---- ok +-STATEMENT CREATE (t:test {prop: 524162}); +---- ok +-STATEMENT CREATE (t:test {prop: 65822}); +---- ok +-STATEMENT CREATE (t:test {prop: 174387}); +---- ok +-STATEMENT CREATE (t:test {prop: 513158}); +---- ok +-STATEMENT CREATE (t:test {prop: 707049}); +---- ok +-STATEMENT CREATE (t:test {prop: 483856}); +---- ok +-STATEMENT CREATE (t:test {prop: 941609}); +---- ok +-STATEMENT CREATE (t:test {prop: 420615}); +---- ok +-STATEMENT CREATE (t:test {prop: 142355}); +---- ok +-STATEMENT CREATE (t:test {prop: 440858}); +---- ok +-STATEMENT CREATE (t:test {prop: 567586}); +---- ok +-STATEMENT CREATE (t:test {prop: 613348}); +---- ok +-STATEMENT CREATE (t:test {prop: 366194}); +---- ok +-STATEMENT CREATE (t:test {prop: 564833}); +---- ok +-STATEMENT CREATE (t:test {prop: 406659}); +---- ok +-STATEMENT CREATE (t:test {prop: 513692}); +---- ok +-STATEMENT CREATE (t:test {prop: 735843}); +---- ok +-STATEMENT CREATE (t:test {prop: 173850}); +---- ok +-STATEMENT CREATE (t:test {prop: 585860}); +---- ok +-STATEMENT CREATE (t:test {prop: 462785}); +---- ok +-STATEMENT CREATE (t:test {prop: 103443}); +---- ok +-STATEMENT CREATE (t:test {prop: 435341}); +---- ok +-STATEMENT CREATE (t:test {prop: 869339}); +---- ok +-STATEMENT CREATE (t:test {prop: 37033}); +---- ok +-STATEMENT CREATE (t:test {prop: 914372}); +---- ok +-STATEMENT CREATE (t:test {prop: 2967}); +---- ok +-STATEMENT CREATE (t:test {prop: 459882}); +---- ok +-STATEMENT CREATE (t:test {prop: 561426}); +---- ok +-STATEMENT CREATE (t:test {prop: 68095}); +---- ok +-STATEMENT CREATE (t:test {prop: 53029}); +---- ok +-STATEMENT CREATE (t:test {prop: 366621}); +---- ok +-STATEMENT CREATE (t:test {prop: 97248}); +---- ok +-STATEMENT CREATE (t:test {prop: 159396}); +---- ok +-STATEMENT CREATE (t:test {prop: 114039}); +---- ok +-STATEMENT CREATE (t:test {prop: 637767}); +---- ok +-STATEMENT CREATE (t:test {prop: 476135}); +---- ok +-STATEMENT CREATE (t:test {prop: 873937}); +---- ok +-STATEMENT CREATE (t:test {prop: 838363}); +---- ok +-STATEMENT CREATE (t:test {prop: 508617}); +---- ok +-STATEMENT CREATE (t:test {prop: 146066}); +---- ok +-STATEMENT CREATE (t:test {prop: 480919}); +---- ok +-STATEMENT CREATE (t:test {prop: 903910}); +---- ok +-STATEMENT CREATE (t:test {prop: 457714}); +---- ok +-STATEMENT CREATE (t:test {prop: 812228}); +---- ok +-STATEMENT CREATE (t:test {prop: 525454}); +---- ok +-STATEMENT CREATE (t:test {prop: 967461}); +---- ok +-STATEMENT CREATE (t:test {prop: 468805}); +---- ok +-STATEMENT CREATE (t:test {prop: 359902}); +---- ok +-STATEMENT CREATE (t:test {prop: 761491}); +---- ok +-STATEMENT CREATE (t:test {prop: 271708}); +---- ok +-STATEMENT CREATE (t:test {prop: 941559}); +---- ok +-STATEMENT CREATE (t:test {prop: 827043}); +---- ok +-STATEMENT CREATE (t:test {prop: 731770}); +---- ok +-STATEMENT CREATE (t:test {prop: 480505}); +---- ok +-STATEMENT CREATE (t:test {prop: 443873}); +---- ok +-STATEMENT CREATE (t:test {prop: 344326}); +---- ok +-STATEMENT CREATE (t:test {prop: 681080}); +---- ok +-STATEMENT CREATE (t:test {prop: 544907}); +---- ok +-STATEMENT CREATE (t:test {prop: 953722}); +---- ok +-STATEMENT CREATE (t:test {prop: 548813}); +---- ok +-STATEMENT CREATE (t:test {prop: 161089}); +---- ok +-STATEMENT CREATE (t:test {prop: 775570}); +---- ok +-STATEMENT CREATE (t:test {prop: 248871}); +---- ok +-STATEMENT CREATE (t:test {prop: 338754}); +---- ok +-STATEMENT CREATE (t:test {prop: 649185}); +---- ok +-STATEMENT CREATE (t:test {prop: 34497}); +---- ok +-STATEMENT CREATE (t:test {prop: 720392}); +---- ok +-STATEMENT CREATE (t:test {prop: 205078}); +---- ok +-STATEMENT CREATE (t:test {prop: 673815}); +---- ok +-STATEMENT CREATE (t:test {prop: 948614}); +---- ok +-STATEMENT CREATE (t:test {prop: 617116}); +---- ok +-STATEMENT CREATE (t:test {prop: 603265}); +---- ok +-STATEMENT CREATE (t:test {prop: 869713}); +---- ok +-STATEMENT CREATE (t:test {prop: 658955}); +---- ok +-STATEMENT CREATE (t:test {prop: 502208}); +---- ok +-STATEMENT CREATE (t:test {prop: 26112}); +---- ok +-STATEMENT CREATE (t:test {prop: 846818}); +---- ok +-STATEMENT CREATE (t:test {prop: 122028}); +---- ok +-STATEMENT CREATE (t:test {prop: 310672}); +---- ok +-STATEMENT CREATE (t:test {prop: 456504}); +---- ok +-STATEMENT CREATE (t:test {prop: 892563}); +---- ok +-STATEMENT CREATE (t:test {prop: 900564}); +---- ok +-STATEMENT CREATE (t:test {prop: 258516}); +---- ok +-STATEMENT CREATE (t:test {prop: 753131}); +---- ok +-STATEMENT CREATE (t:test {prop: 303364}); +---- ok +-STATEMENT CREATE (t:test {prop: 931850}); +---- ok +-STATEMENT CREATE (t:test {prop: 93372}); +---- ok +-STATEMENT CREATE (t:test {prop: 48481}); +---- ok +-STATEMENT CREATE (t:test {prop: 626257}); +---- ok +-STATEMENT CREATE (t:test {prop: 957453}); +---- ok +-STATEMENT CREATE (t:test {prop: 577367}); +---- ok +-STATEMENT CREATE (t:test {prop: 804088}); +---- ok +-STATEMENT CREATE (t:test {prop: 110733}); +---- ok +-STATEMENT CREATE (t:test {prop: 856386}); +---- ok +-STATEMENT CREATE (t:test {prop: 299353}); +---- ok +-STATEMENT CREATE (t:test {prop: 170533}); +---- ok +-STATEMENT CREATE (t:test {prop: 702547}); +---- ok +-STATEMENT CREATE (t:test {prop: 500512}); +---- ok +-STATEMENT CREATE (t:test {prop: 148136}); +---- ok +-STATEMENT CREATE (t:test {prop: 378519}); +---- ok +-STATEMENT CREATE (t:test {prop: 624041}); +---- ok +-STATEMENT CREATE (t:test {prop: 420132}); +---- ok +-STATEMENT CREATE (t:test {prop: 964249}); +---- ok +-STATEMENT CREATE (t:test {prop: 825071}); +---- ok +-STATEMENT CREATE (t:test {prop: 201298}); +---- ok +-STATEMENT CREATE (t:test {prop: 366863}); +---- ok +-STATEMENT CREATE (t:test {prop: 191411}); +---- ok +-STATEMENT CREATE (t:test {prop: 83619}); +---- ok +-STATEMENT CREATE (t:test {prop: 620205}); +---- ok +-STATEMENT CREATE (t:test {prop: 204111}); +---- ok +-STATEMENT CREATE (t:test {prop: 447476}); +---- ok +-STATEMENT CREATE (t:test {prop: 217792}); +---- ok +-STATEMENT CREATE (t:test {prop: 100664}); +---- ok +-STATEMENT CREATE (t:test {prop: 717620}); +---- ok +-STATEMENT CREATE (t:test {prop: 323489}); +---- ok +-STATEMENT CREATE (t:test {prop: 930646}); +---- ok +-STATEMENT CREATE (t:test {prop: 486287}); +---- ok +-STATEMENT CREATE (t:test {prop: 905102}); +---- ok +-STATEMENT CREATE (t:test {prop: 779828}); +---- ok +-STATEMENT CREATE (t:test {prop: 787912}); +---- ok +-STATEMENT CREATE (t:test {prop: 729008}); +---- ok +-STATEMENT CREATE (t:test {prop: 867525}); +---- ok +-STATEMENT CREATE (t:test {prop: 547833}); +---- ok +-STATEMENT CREATE (t:test {prop: 757569}); +---- ok +-STATEMENT CREATE (t:test {prop: 444058}); +---- ok +-STATEMENT CREATE (t:test {prop: 469366}); +---- ok +-STATEMENT CREATE (t:test {prop: 696331}); +---- ok +-STATEMENT CREATE (t:test {prop: 779558}); +---- ok +-STATEMENT CREATE (t:test {prop: 582504}); +---- ok +-STATEMENT CREATE (t:test {prop: 218635}); +---- ok +-STATEMENT CREATE (t:test {prop: 278805}); +---- ok +-STATEMENT CREATE (t:test {prop: 626556}); +---- ok +-STATEMENT CREATE (t:test {prop: 382023}); +---- ok +-STATEMENT CREATE (t:test {prop: 121558}); +---- ok +-STATEMENT CREATE (t:test {prop: 657736}); +---- ok +-STATEMENT CREATE (t:test {prop: 820788}); +---- ok +-STATEMENT CREATE (t:test {prop: 657592}); +---- ok +-STATEMENT CREATE (t:test {prop: 8123}); +---- ok +-STATEMENT CREATE (t:test {prop: 219774}); +---- ok +-STATEMENT CREATE (t:test {prop: 444468}); +---- ok +-STATEMENT CREATE (t:test {prop: 639393}); +---- ok +-STATEMENT CREATE (t:test {prop: 428304}); +---- ok +-STATEMENT CREATE (t:test {prop: 917429}); +---- ok +-STATEMENT CREATE (t:test {prop: 400391}); +---- ok +-STATEMENT CREATE (t:test {prop: 913663}); +---- ok +-STATEMENT CREATE (t:test {prop: 851563}); +---- ok +-STATEMENT CREATE (t:test {prop: 683947}); +---- ok +-STATEMENT CREATE (t:test {prop: 209443}); +---- ok +-STATEMENT CREATE (t:test {prop: 73581}); +---- ok +-STATEMENT CREATE (t:test {prop: 809790}); +---- ok +-STATEMENT CREATE (t:test {prop: 444090}); +---- ok +-STATEMENT CREATE (t:test {prop: 835840}); +---- ok +-STATEMENT CREATE (t:test {prop: 93346}); +---- ok +-STATEMENT CREATE (t:test {prop: 863907}); +---- ok +-STATEMENT CREATE (t:test {prop: 57933}); +---- ok +-STATEMENT CREATE (t:test {prop: 364909}); +---- ok +-STATEMENT CREATE (t:test {prop: 267070}); +---- ok +-STATEMENT CREATE (t:test {prop: 377720}); +---- ok +-STATEMENT CREATE (t:test {prop: 479066}); +---- ok +-STATEMENT CREATE (t:test {prop: 444775}); +---- ok +-STATEMENT CREATE (t:test {prop: 796288}); +---- ok +-STATEMENT CREATE (t:test {prop: 203025}); +---- ok +-STATEMENT CREATE (t:test {prop: 659388}); +---- ok +-STATEMENT CREATE (t:test {prop: 785851}); +---- ok +-STATEMENT CREATE (t:test {prop: 296206}); +---- ok +-STATEMENT CREATE (t:test {prop: 489350}); +---- ok +-STATEMENT CREATE (t:test {prop: 728832}); +---- ok +-STATEMENT CREATE (t:test {prop: 308282}); +---- ok +-STATEMENT CREATE (t:test {prop: 531111}); +---- ok +-STATEMENT CREATE (t:test {prop: 523649}); +---- ok +-STATEMENT CREATE (t:test {prop: 532183}); +---- ok +-STATEMENT CREATE (t:test {prop: 952145}); +---- ok +-STATEMENT CREATE (t:test {prop: 276427}); +---- ok +-STATEMENT CREATE (t:test {prop: 424211}); +---- ok +-STATEMENT CREATE (t:test {prop: 463099}); +---- ok +-STATEMENT CREATE (t:test {prop: 670563}); +---- ok +-STATEMENT CREATE (t:test {prop: 358115}); +---- ok +-STATEMENT CREATE (t:test {prop: 365931}); +---- ok +-STATEMENT CREATE (t:test {prop: 761839}); +---- ok +-STATEMENT CREATE (t:test {prop: 290519}); +---- ok +-STATEMENT CREATE (t:test {prop: 506039}); +---- ok +-STATEMENT CREATE (t:test {prop: 949999}); +---- ok +-STATEMENT CREATE (t:test {prop: 468467}); +---- ok +-STATEMENT CREATE (t:test {prop: 894725}); +---- ok +-STATEMENT CREATE (t:test {prop: 500179}); +---- ok +-STATEMENT CREATE (t:test {prop: 615710}); +---- ok +-STATEMENT CREATE (t:test {prop: 503223}); +---- ok +-STATEMENT CREATE (t:test {prop: 88027}); +---- ok +-STATEMENT CREATE (t:test {prop: 723138}); +---- ok +-STATEMENT CREATE (t:test {prop: 566028}); +---- ok +-STATEMENT CREATE (t:test {prop: 754815}); +---- ok +-STATEMENT CREATE (t:test {prop: 384846}); +---- ok +-STATEMENT CREATE (t:test {prop: 840011}); +---- ok +-STATEMENT CREATE (t:test {prop: 757150}); +---- ok +-STATEMENT CREATE (t:test {prop: 424942}); +---- ok +-STATEMENT CREATE (t:test {prop: 955124}); +---- ok +-STATEMENT CREATE (t:test {prop: 832086}); +---- ok +-STATEMENT CREATE (t:test {prop: 176694}); +---- ok +-STATEMENT CREATE (t:test {prop: 632210}); +---- ok +-STATEMENT CREATE (t:test {prop: 435939}); +---- ok +-STATEMENT CREATE (t:test {prop: 755662}); +---- ok +-STATEMENT CREATE (t:test {prop: 591647}); +---- ok +-STATEMENT CREATE (t:test {prop: 68669}); +---- ok +-STATEMENT CREATE (t:test {prop: 624462}); +---- ok +-STATEMENT CREATE (t:test {prop: 888444}); +---- ok +-STATEMENT CREATE (t:test {prop: 769181}); +---- ok +-STATEMENT CREATE (t:test {prop: 877088}); +---- ok +-STATEMENT CREATE (t:test {prop: 321046}); +---- ok +-STATEMENT CREATE (t:test {prop: 17110}); +---- ok +-STATEMENT CREATE (t:test {prop: 620518}); +---- ok +-STATEMENT CREATE (t:test {prop: 343582}); +---- ok +-STATEMENT CREATE (t:test {prop: 683102}); +---- ok +-STATEMENT CREATE (t:test {prop: 337743}); +---- ok +-STATEMENT CREATE (t:test {prop: 77457}); +---- ok +-STATEMENT CREATE (t:test {prop: 776409}); +---- ok +-STATEMENT CREATE (t:test {prop: 415797}); +---- ok +-STATEMENT CREATE (t:test {prop: 639952}); +---- ok +-STATEMENT CREATE (t:test {prop: 392149}); +---- ok +-STATEMENT CREATE (t:test {prop: 296036}); +---- ok +-STATEMENT CREATE (t:test {prop: 635165}); +---- ok +-STATEMENT CREATE (t:test {prop: 195418}); +---- ok +-STATEMENT CREATE (t:test {prop: 252546}); +---- ok +-STATEMENT CREATE (t:test {prop: 176716}); +---- ok +-STATEMENT CREATE (t:test {prop: 322671}); +---- ok +-STATEMENT CREATE (t:test {prop: 100089}); +---- ok +-STATEMENT CREATE (t:test {prop: 583120}); +---- ok +-STATEMENT CREATE (t:test {prop: 828975}); +---- ok +-STATEMENT CREATE (t:test {prop: 856824}); +---- ok +-STATEMENT CREATE (t:test {prop: 981190}); +---- ok +-STATEMENT CREATE (t:test {prop: 55908}); +---- ok +-STATEMENT CREATE (t:test {prop: 230557}); +---- ok +-STATEMENT CREATE (t:test {prop: 597718}); +---- ok +-STATEMENT CREATE (t:test {prop: 781097}); +---- ok +-STATEMENT CREATE (t:test {prop: 77478}); +---- ok +-STATEMENT CREATE (t:test {prop: 997346}); +---- ok +-STATEMENT CREATE (t:test {prop: 442137}); +---- ok +-STATEMENT CREATE (t:test {prop: 201040}); +---- ok +-STATEMENT CREATE (t:test {prop: 597194}); +---- ok +-STATEMENT CREATE (t:test {prop: 599674}); +---- ok +-STATEMENT CREATE (t:test {prop: 460652}); +---- ok +-STATEMENT CREATE (t:test {prop: 959357}); +---- ok +-STATEMENT CREATE (t:test {prop: 843635}); +---- ok +-STATEMENT CREATE (t:test {prop: 911833}); +---- ok +-STATEMENT CREATE (t:test {prop: 622263}); +---- ok +-STATEMENT CREATE (t:test {prop: 16827}); +---- ok +-STATEMENT CREATE (t:test {prop: 411544}); +---- ok +-STATEMENT CREATE (t:test {prop: 211106}); +---- ok +-STATEMENT CREATE (t:test {prop: 355828}); +---- ok +-STATEMENT CREATE (t:test {prop: 889175}); +---- ok +-STATEMENT CREATE (t:test {prop: 931173}); +---- ok +-STATEMENT CREATE (t:test {prop: 602135}); +---- ok +-STATEMENT CREATE (t:test {prop: 200053}); +---- ok +-STATEMENT CREATE (t:test {prop: 548215}); +---- ok +-STATEMENT CREATE (t:test {prop: 977941}); +---- ok +-STATEMENT CREATE (t:test {prop: 849151}); +---- ok +-STATEMENT CREATE (t:test {prop: 591471}); +---- ok +-STATEMENT CREATE (t:test {prop: 801155}); +---- ok +-STATEMENT CREATE (t:test {prop: 808210}); +---- ok +-STATEMENT CREATE (t:test {prop: 876189}); +---- ok +-STATEMENT CREATE (t:test {prop: 342567}); +---- ok +-STATEMENT CREATE (t:test {prop: 912517}); +---- ok +-STATEMENT CREATE (t:test {prop: 49968}); +---- ok +-STATEMENT CREATE (t:test {prop: 689579}); +---- ok +-STATEMENT CREATE (t:test {prop: 725911}); +---- ok +-STATEMENT CREATE (t:test {prop: 606346}); +---- ok +-STATEMENT CREATE (t:test {prop: 52573}); +---- ok +-STATEMENT CREATE (t:test {prop: 38326}); +---- ok +-STATEMENT CREATE (t:test {prop: 592633}); +---- ok +-STATEMENT CREATE (t:test {prop: 383743}); +---- ok +-STATEMENT CREATE (t:test {prop: 901498}); +---- ok +-STATEMENT CREATE (t:test {prop: 980599}); +---- ok +-STATEMENT CREATE (t:test {prop: 416314}); +---- ok +-STATEMENT CREATE (t:test {prop: 340327}); +---- ok +-STATEMENT CREATE (t:test {prop: 630360}); +---- ok +-STATEMENT CREATE (t:test {prop: 669366}); +---- ok +-STATEMENT CREATE (t:test {prop: 179757}); +---- ok +-STATEMENT CREATE (t:test {prop: 810249}); +---- ok +-STATEMENT CREATE (t:test {prop: 165397}); +---- ok +-STATEMENT CREATE (t:test {prop: 123118}); +---- ok +-STATEMENT CREATE (t:test {prop: 635494}); +---- ok +-STATEMENT CREATE (t:test {prop: 827664}); +---- ok +-STATEMENT CREATE (t:test {prop: 906476}); +---- ok +-STATEMENT CREATE (t:test {prop: 362181}); +---- ok +-STATEMENT CREATE (t:test {prop: 172257}); +---- ok +-STATEMENT CREATE (t:test {prop: 32651}); +---- ok +-STATEMENT CREATE (t:test {prop: 758027}); +---- ok +-STATEMENT CREATE (t:test {prop: 965719}); +---- ok +-STATEMENT CREATE (t:test {prop: 562768}); +---- ok +-STATEMENT CREATE (t:test {prop: 535946}); +---- ok +-STATEMENT CREATE (t:test {prop: 844596}); +---- ok +-STATEMENT CREATE (t:test {prop: 366325}); +---- ok +-STATEMENT CREATE (t:test {prop: 92491}); +---- ok +-STATEMENT CREATE (t:test {prop: 416719}); +---- ok +-STATEMENT CREATE (t:test {prop: 460579}); +---- ok +-STATEMENT CREATE (t:test {prop: 605961}); +---- ok +-STATEMENT CREATE (t:test {prop: 923698}); +---- ok +-STATEMENT CREATE (t:test {prop: 364586}); +---- ok +-STATEMENT CREATE (t:test {prop: 62554}); +---- ok +-STATEMENT CREATE (t:test {prop: 152577}); +---- ok +-STATEMENT CREATE (t:test {prop: 968857}); +---- ok +-STATEMENT CREATE (t:test {prop: 907609}); +---- ok +-STATEMENT CREATE (t:test {prop: 466347}); +---- ok +-STATEMENT CREATE (t:test {prop: 740807}); +---- ok +-STATEMENT CREATE (t:test {prop: 493678}); +---- ok +-STATEMENT CREATE (t:test {prop: 639479}); +---- ok +-STATEMENT CREATE (t:test {prop: 473553}); +---- ok +-STATEMENT CREATE (t:test {prop: 757658}); +---- ok +-STATEMENT CREATE (t:test {prop: 463381}); +---- ok +-STATEMENT CREATE (t:test {prop: 633516}); +---- ok +-STATEMENT CREATE (t:test {prop: 183598}); +---- ok +-STATEMENT CREATE (t:test {prop: 370971}); +---- ok +-STATEMENT CREATE (t:test {prop: 864203}); +---- ok +-STATEMENT CREATE (t:test {prop: 444155}); +---- ok +-STATEMENT CREATE (t:test {prop: 862248}); +---- ok +-STATEMENT CREATE (t:test {prop: 865018}); +---- ok +-STATEMENT CREATE (t:test {prop: 360026}); +---- ok +-STATEMENT CREATE (t:test {prop: 585919}); +---- ok +-STATEMENT CREATE (t:test {prop: 537725}); +---- ok +-STATEMENT CREATE (t:test {prop: 480662}); +---- ok +-STATEMENT CREATE (t:test {prop: 407098}); +---- ok +-STATEMENT CREATE (t:test {prop: 203776}); +---- ok +-STATEMENT CREATE (t:test {prop: 101745}); +---- ok +-STATEMENT CREATE (t:test {prop: 453926}); +---- ok +-STATEMENT CREATE (t:test {prop: 672298}); +---- ok +-STATEMENT CREATE (t:test {prop: 159969}); +---- ok +-STATEMENT CREATE (t:test {prop: 43352}); +---- ok +-STATEMENT CREATE (t:test {prop: 977485}); +---- ok +-STATEMENT CREATE (t:test {prop: 901942}); +---- ok +-STATEMENT CREATE (t:test {prop: 196569}); +---- ok +-STATEMENT CREATE (t:test {prop: 671145}); +---- ok +-STATEMENT CREATE (t:test {prop: 664672}); +---- ok +-STATEMENT CREATE (t:test {prop: 199363}); +---- ok +-STATEMENT CREATE (t:test {prop: 597701}); +---- ok +-STATEMENT CREATE (t:test {prop: 449595}); +---- ok +-STATEMENT CREATE (t:test {prop: 953694}); +---- ok +-STATEMENT CREATE (t:test {prop: 832147}); +---- ok +-STATEMENT CREATE (t:test {prop: 944717}); +---- ok +-STATEMENT CREATE (t:test {prop: 377687}); +---- ok +-STATEMENT CREATE (t:test {prop: 586276}); +---- ok +-STATEMENT CREATE (t:test {prop: 394386}); +---- ok +-STATEMENT CREATE (t:test {prop: 52321}); +---- ok +-STATEMENT CREATE (t:test {prop: 634813}); +---- ok +-STATEMENT CREATE (t:test {prop: 54355}); +---- ok +-STATEMENT CREATE (t:test {prop: 173532}); +---- ok +-STATEMENT CREATE (t:test {prop: 326079}); +---- ok +-STATEMENT CREATE (t:test {prop: 995969}); +---- ok +-STATEMENT CREATE (t:test {prop: 234166}); +---- ok +-STATEMENT CREATE (t:test {prop: 51948}); +---- ok +-STATEMENT CREATE (t:test {prop: 608172}); +---- ok +-STATEMENT CREATE (t:test {prop: 185328}); +---- ok +-STATEMENT CREATE (t:test {prop: 104482}); +---- ok +-STATEMENT CREATE (t:test {prop: 667089}); +---- ok +-STATEMENT CREATE (t:test {prop: 591982}); +---- ok +-STATEMENT CREATE (t:test {prop: 377971}); +---- ok +-STATEMENT CREATE (t:test {prop: 876579}); +---- ok +-STATEMENT CREATE (t:test {prop: 194591}); +---- ok +-STATEMENT CREATE (t:test {prop: 317335}); +---- ok +-STATEMENT CREATE (t:test {prop: 993405}); +---- ok +-STATEMENT CREATE (t:test {prop: 891615}); +---- ok +-STATEMENT CREATE (t:test {prop: 44846}); +---- ok +-STATEMENT CREATE (t:test {prop: 415034}); +---- ok +-STATEMENT CREATE (t:test {prop: 627110}); +---- ok +-STATEMENT CREATE (t:test {prop: 800511}); +---- ok +-STATEMENT CREATE (t:test {prop: 449596}); +---- ok +-STATEMENT CREATE (t:test {prop: 81517}); +---- ok +-STATEMENT CREATE (t:test {prop: 362113}); +---- ok +-STATEMENT CREATE (t:test {prop: 796435}); +---- ok +-STATEMENT CREATE (t:test {prop: 204399}); +---- ok +-STATEMENT CREATE (t:test {prop: 515548}); +---- ok +-STATEMENT CREATE (t:test {prop: 170718}); +---- ok +-STATEMENT CREATE (t:test {prop: 176556}); +---- ok +-STATEMENT CREATE (t:test {prop: 425331}); +---- ok +-STATEMENT CREATE (t:test {prop: 848136}); +---- ok +-STATEMENT CREATE (t:test {prop: 788891}); +---- ok +-STATEMENT CREATE (t:test {prop: 490971}); +---- ok +-STATEMENT CREATE (t:test {prop: 986809}); +---- ok +-STATEMENT CREATE (t:test {prop: 815075}); +---- ok +-STATEMENT CREATE (t:test {prop: 344196}); +---- ok +-STATEMENT CREATE (t:test {prop: 921344}); +---- ok +-STATEMENT CREATE (t:test {prop: 39136}); +---- ok +-STATEMENT CREATE (t:test {prop: 181515}); +---- ok +-STATEMENT CREATE (t:test {prop: 873843}); +---- ok +-STATEMENT CREATE (t:test {prop: 922381}); +---- ok +-STATEMENT CREATE (t:test {prop: 184757}); +---- ok +-STATEMENT CREATE (t:test {prop: 609645}); +---- ok +-STATEMENT CREATE (t:test {prop: 740488}); +---- ok +-STATEMENT CREATE (t:test {prop: 441070}); +---- ok +-STATEMENT CREATE (t:test {prop: 160573}); +---- ok +-STATEMENT CREATE (t:test {prop: 538292}); +---- ok +-STATEMENT CREATE (t:test {prop: 672933}); +---- ok +-STATEMENT CREATE (t:test {prop: 933197}); +---- ok +-STATEMENT CREATE (t:test {prop: 730701}); +---- ok +-STATEMENT CREATE (t:test {prop: 411005}); +---- ok +-STATEMENT CREATE (t:test {prop: 98873}); +---- ok +-STATEMENT CREATE (t:test {prop: 415870}); +---- ok +-STATEMENT CREATE (t:test {prop: 852666}); +---- ok +-STATEMENT CREATE (t:test {prop: 124128}); +---- ok +-STATEMENT CREATE (t:test {prop: 246464}); +---- ok +-STATEMENT CREATE (t:test {prop: 112016}); +---- ok +-STATEMENT CREATE (t:test {prop: 443182}); +---- ok +-STATEMENT CREATE (t:test {prop: 756750}); +---- ok +-STATEMENT CREATE (t:test {prop: 669828}); +---- ok +-STATEMENT CREATE (t:test {prop: 325937}); +---- ok +-STATEMENT CREATE (t:test {prop: 758395}); +---- ok +-STATEMENT CREATE (t:test {prop: 304051}); +---- ok +-STATEMENT CREATE (t:test {prop: 559505}); +---- ok +-STATEMENT CREATE (t:test {prop: 681095}); +---- ok +-STATEMENT CREATE (t:test {prop: 890646}); +---- ok +-STATEMENT CREATE (t:test {prop: 934759}); +---- ok +-STATEMENT CREATE (t:test {prop: 103882}); +---- ok +-STATEMENT CREATE (t:test {prop: 362369}); +---- ok +-STATEMENT CREATE (t:test {prop: 874145}); +---- ok +-STATEMENT CREATE (t:test {prop: 951284}); +---- ok +-STATEMENT CREATE (t:test {prop: 547160}); +---- ok +-STATEMENT CREATE (t:test {prop: 649846}); +---- ok +-STATEMENT CREATE (t:test {prop: 498277}); +---- ok +-STATEMENT CREATE (t:test {prop: 637354}); +---- ok +-STATEMENT CREATE (t:test {prop: 256414}); +---- ok +-STATEMENT CREATE (t:test {prop: 558394}); +---- ok +-STATEMENT CREATE (t:test {prop: 304740}); +---- ok +-STATEMENT CREATE (t:test {prop: 12813}); +---- ok +-STATEMENT CREATE (t:test {prop: 697447}); +---- ok +-STATEMENT CREATE (t:test {prop: 165731}); +---- ok +-STATEMENT CREATE (t:test {prop: 709956}); +---- ok +-STATEMENT CREATE (t:test {prop: 405183}); +---- ok +-STATEMENT CREATE (t:test {prop: 727092}); +---- ok +-STATEMENT CREATE (t:test {prop: 240030}); +---- ok +-STATEMENT CREATE (t:test {prop: 101601}); +---- ok +-STATEMENT CREATE (t:test {prop: 535079}); +---- ok +-STATEMENT CREATE (t:test {prop: 667933}); +---- ok +-STATEMENT CREATE (t:test {prop: 799035}); +---- ok +-STATEMENT CREATE (t:test {prop: 497345}); +---- ok +-STATEMENT CREATE (t:test {prop: 104569}); +---- ok +-STATEMENT CREATE (t:test {prop: 604988}); +---- ok +-STATEMENT CREATE (t:test {prop: 949908}); +---- ok +-STATEMENT CREATE (t:test {prop: 418518}); +---- ok +-STATEMENT CREATE (t:test {prop: 611085}); +---- ok +-STATEMENT CREATE (t:test {prop: 228428}); +---- ok +-STATEMENT CREATE (t:test {prop: 301275}); +---- ok +-STATEMENT CREATE (t:test {prop: 372734}); +---- ok +-STATEMENT CREATE (t:test {prop: 73146}); +---- ok +-STATEMENT CREATE (t:test {prop: 925470}); +---- ok +-STATEMENT CREATE (t:test {prop: 197658}); +---- ok +-STATEMENT CREATE (t:test {prop: 652652}); +---- ok +-STATEMENT CREATE (t:test {prop: 904183}); +---- ok +-STATEMENT CREATE (t:test {prop: 585255}); +---- ok +-STATEMENT CREATE (t:test {prop: 557050}); +---- ok +-STATEMENT CREATE (t:test {prop: 27372}); +---- ok +-STATEMENT CREATE (t:test {prop: 78503}); +---- ok +-STATEMENT CREATE (t:test {prop: 419644}); +---- ok +-STATEMENT CREATE (t:test {prop: 850627}); +---- ok +-STATEMENT CREATE (t:test {prop: 32785}); +---- ok +-STATEMENT CREATE (t:test {prop: 18126}); +---- ok +-STATEMENT CREATE (t:test {prop: 684873}); +---- ok +-STATEMENT CREATE (t:test {prop: 877877}); +---- ok +-STATEMENT CREATE (t:test {prop: 451461}); +---- ok +-STATEMENT CREATE (t:test {prop: 354940}); +---- ok +-STATEMENT CREATE (t:test {prop: 874411}); +---- ok +-STATEMENT CREATE (t:test {prop: 963241}); +---- ok +-STATEMENT CREATE (t:test {prop: 186842}); +---- ok +-STATEMENT CREATE (t:test {prop: 762308}); +---- ok +-STATEMENT CREATE (t:test {prop: 49675}); +---- ok +-STATEMENT CREATE (t:test {prop: 375836}); +---- ok +-STATEMENT CREATE (t:test {prop: 340216}); +---- ok +-STATEMENT CREATE (t:test {prop: 655707}); +---- ok +-STATEMENT CREATE (t:test {prop: 499255}); +---- ok +-STATEMENT CREATE (t:test {prop: 825482}); +---- ok +-STATEMENT CREATE (t:test {prop: 179405}); +---- ok +-STATEMENT CREATE (t:test {prop: 19774}); +---- ok +-STATEMENT CREATE (t:test {prop: 215554}); +---- ok +-STATEMENT CREATE (t:test {prop: 133489}); +---- ok +-STATEMENT CREATE (t:test {prop: 303249}); +---- ok +-STATEMENT CREATE (t:test {prop: 860526}); +---- ok +-STATEMENT CREATE (t:test {prop: 211334}); +---- ok +-STATEMENT CREATE (t:test {prop: 258925}); +---- ok +-STATEMENT CREATE (t:test {prop: 950220}); +---- ok +-STATEMENT CREATE (t:test {prop: 258352}); +---- ok +-STATEMENT CREATE (t:test {prop: 405095}); +---- ok +-STATEMENT CREATE (t:test {prop: 644563}); +---- ok +-STATEMENT CREATE (t:test {prop: 571507}); +---- ok +-STATEMENT CREATE (t:test {prop: 612971}); +---- ok +-STATEMENT CREATE (t:test {prop: 624475}); +---- ok +-STATEMENT CREATE (t:test {prop: 439079}); +---- ok +-STATEMENT CREATE (t:test {prop: 916190}); +---- ok +-STATEMENT CREATE (t:test {prop: 577885}); +---- ok +-STATEMENT CREATE (t:test {prop: 797889}); +---- ok +-STATEMENT CREATE (t:test {prop: 32606}); +---- ok +-STATEMENT CREATE (t:test {prop: 131437}); +---- ok +-STATEMENT CREATE (t:test {prop: 5727}); +---- ok +-STATEMENT CREATE (t:test {prop: 129169}); +---- ok +-STATEMENT CREATE (t:test {prop: 29013}); +---- ok +-STATEMENT CREATE (t:test {prop: 879304}); +---- ok +-STATEMENT CREATE (t:test {prop: 57672}); +---- ok +-STATEMENT CREATE (t:test {prop: 718997}); +---- ok +-STATEMENT CREATE (t:test {prop: 808162}); +---- ok +-STATEMENT CREATE (t:test {prop: 804750}); +---- ok +-STATEMENT CREATE (t:test {prop: 186501}); +---- ok +-STATEMENT CREATE (t:test {prop: 130692}); +---- ok +-STATEMENT CREATE (t:test {prop: 726824}); +---- ok +-STATEMENT CREATE (t:test {prop: 403986}); +---- ok +-STATEMENT CREATE (t:test {prop: 70683}); +---- ok +-STATEMENT CREATE (t:test {prop: 15338}); +---- ok +-STATEMENT CREATE (t:test {prop: 694219}); +---- ok +-STATEMENT CREATE (t:test {prop: 455060}); +---- ok +-STATEMENT CREATE (t:test {prop: 774151}); +---- ok +-STATEMENT CREATE (t:test {prop: 693810}); +---- ok +-STATEMENT CREATE (t:test {prop: 191730}); +---- ok +-STATEMENT CREATE (t:test {prop: 654452}); +---- ok +-STATEMENT CREATE (t:test {prop: 442235}); +---- ok +-STATEMENT CREATE (t:test {prop: 945349}); +---- ok +-STATEMENT CREATE (t:test {prop: 50115}); +---- ok +-STATEMENT CREATE (t:test {prop: 578490}); +---- ok +-STATEMENT CREATE (t:test {prop: 177755}); +---- ok +-STATEMENT CREATE (t:test {prop: 55333}); +---- ok +-STATEMENT CREATE (t:test {prop: 736883}); +---- ok +-STATEMENT CREATE (t:test {prop: 394607}); +---- ok +-STATEMENT CREATE (t:test {prop: 606264}); +---- ok +-STATEMENT CREATE (t:test {prop: 481406}); +---- ok +-STATEMENT CREATE (t:test {prop: 477386}); +---- ok +-STATEMENT CREATE (t:test {prop: 352127}); +---- ok +-STATEMENT CREATE (t:test {prop: 194769}); +---- ok +-STATEMENT CREATE (t:test {prop: 36201}); +---- ok +-STATEMENT CREATE (t:test {prop: 418209}); +---- ok +-STATEMENT CREATE (t:test {prop: 657948}); +---- ok +-STATEMENT CREATE (t:test {prop: 482170}); +---- ok +-STATEMENT CREATE (t:test {prop: 512571}); +---- ok +-STATEMENT CREATE (t:test {prop: 998878}); +---- ok +-STATEMENT CREATE (t:test {prop: 743798}); +---- ok +-STATEMENT CREATE (t:test {prop: 747603}); +---- ok +-STATEMENT CREATE (t:test {prop: 382294}); +---- ok +-STATEMENT CREATE (t:test {prop: 698314}); +---- ok +-STATEMENT CREATE (t:test {prop: 73983}); +---- ok +-STATEMENT CREATE (t:test {prop: 145797}); +---- ok +-STATEMENT CREATE (t:test {prop: 278201}); +---- ok +-STATEMENT CREATE (t:test {prop: 265486}); +---- ok +-STATEMENT CREATE (t:test {prop: 184627}); +---- ok +-STATEMENT CREATE (t:test {prop: 95568}); +---- ok +-STATEMENT CREATE (t:test {prop: 483122}); +---- ok +-STATEMENT CREATE (t:test {prop: 13949}); +---- ok +-STATEMENT CREATE (t:test {prop: 161066}); +---- ok +-STATEMENT CREATE (t:test {prop: 291534}); +---- ok +-STATEMENT CREATE (t:test {prop: 82393}); +---- ok +-STATEMENT CREATE (t:test {prop: 953854}); +---- ok +-STATEMENT CREATE (t:test {prop: 550396}); +---- ok +-STATEMENT CREATE (t:test {prop: 323458}); +---- ok +-STATEMENT CREATE (t:test {prop: 147626}); +---- ok +-STATEMENT CREATE (t:test {prop: 804156}); +---- ok +-STATEMENT CREATE (t:test {prop: 109604}); +---- ok +-STATEMENT CREATE (t:test {prop: 563161}); +---- ok +-STATEMENT CREATE (t:test {prop: 126232}); +---- ok +-STATEMENT CREATE (t:test {prop: 301742}); +---- ok +-STATEMENT CREATE (t:test {prop: 739660}); +---- ok +-STATEMENT CREATE (t:test {prop: 648348}); +---- ok +-STATEMENT CREATE (t:test {prop: 845839}); +---- ok +-STATEMENT CREATE (t:test {prop: 350893}); +---- ok +-STATEMENT CREATE (t:test {prop: 849095}); +---- ok +-STATEMENT CREATE (t:test {prop: 3677}); +---- ok +-STATEMENT CREATE (t:test {prop: 603762}); +---- ok +-STATEMENT CREATE (t:test {prop: 272276}); +---- ok +-STATEMENT CREATE (t:test {prop: 666062}); +---- ok +-STATEMENT CREATE (t:test {prop: 978467}); +---- ok +-STATEMENT CREATE (t:test {prop: 790299}); +---- ok +-STATEMENT CREATE (t:test {prop: 542609}); +---- ok +-STATEMENT CREATE (t:test {prop: 448426}); +---- ok +-STATEMENT CREATE (t:test {prop: 918107}); +---- ok +-STATEMENT CREATE (t:test {prop: 534521}); +---- ok +-STATEMENT CREATE (t:test {prop: 153024}); +---- ok +-STATEMENT CREATE (t:test {prop: 747682}); +---- ok +-STATEMENT CREATE (t:test {prop: 62225}); +---- ok +-STATEMENT CREATE (t:test {prop: 664677}); +---- ok +-STATEMENT CREATE (t:test {prop: 59359}); +---- ok +-STATEMENT CREATE (t:test {prop: 638392}); +---- ok +-STATEMENT CREATE (t:test {prop: 63263}); +---- ok +-STATEMENT CREATE (t:test {prop: 677704}); +---- ok +-STATEMENT CREATE (t:test {prop: 221205}); +---- ok +-STATEMENT CREATE (t:test {prop: 561592}); +---- ok +-STATEMENT CREATE (t:test {prop: 15341}); +---- ok +-STATEMENT CREATE (t:test {prop: 224309}); +---- ok +-STATEMENT CREATE (t:test {prop: 153753}); +---- ok +-STATEMENT CREATE (t:test {prop: 320653}); +---- ok +-STATEMENT CREATE (t:test {prop: 902190}); +---- ok +-STATEMENT CREATE (t:test {prop: 724879}); +---- ok +-STATEMENT CREATE (t:test {prop: 882829}); +---- ok +-STATEMENT CREATE (t:test {prop: 439257}); +---- ok +-STATEMENT CREATE (t:test {prop: 158240}); +---- ok +-STATEMENT CREATE (t:test {prop: 900127}); +---- ok +-STATEMENT CREATE (t:test {prop: 28229}); +---- ok +-STATEMENT CREATE (t:test {prop: 392295}); +---- ok +-STATEMENT CREATE (t:test {prop: 541273}); +---- ok +-STATEMENT CREATE (t:test {prop: 701868}); +---- ok +-STATEMENT CREATE (t:test {prop: 744454}); +---- ok +-STATEMENT CREATE (t:test {prop: 121180}); +---- ok +-STATEMENT CREATE (t:test {prop: 501027}); +---- ok +-STATEMENT CREATE (t:test {prop: 314088}); +---- ok +-STATEMENT CREATE (t:test {prop: 486710}); +---- ok +-STATEMENT CREATE (t:test {prop: 892430}); +---- ok +-STATEMENT CREATE (t:test {prop: 486218}); +---- ok +-STATEMENT CREATE (t:test {prop: 184070}); +---- ok +-STATEMENT CREATE (t:test {prop: 948101}); +---- ok +-STATEMENT CREATE (t:test {prop: 656317}); +---- ok +-STATEMENT CREATE (t:test {prop: 147582}); +---- ok +-STATEMENT CREATE (t:test {prop: 29128}); +---- ok +-STATEMENT CREATE (t:test {prop: 422367}); +---- ok +-STATEMENT CREATE (t:test {prop: 638883}); +---- ok +-STATEMENT CREATE (t:test {prop: 161488}); +---- ok +-STATEMENT CREATE (t:test {prop: 473350}); +---- ok +-STATEMENT CREATE (t:test {prop: 688229}); +---- ok +-STATEMENT CREATE (t:test {prop: 943088}); +---- ok +-STATEMENT CREATE (t:test {prop: 734547}); +---- ok +-STATEMENT CREATE (t:test {prop: 865553}); +---- ok +-STATEMENT CREATE (t:test {prop: 857311}); +---- ok +-STATEMENT CREATE (t:test {prop: 810762}); +---- ok +-STATEMENT CREATE (t:test {prop: 187744}); +---- ok +-STATEMENT CREATE (t:test {prop: 355145}); +---- ok +-STATEMENT CREATE (t:test {prop: 531277}); +---- ok +-STATEMENT CREATE (t:test {prop: 701543}); +---- ok +-STATEMENT CREATE (t:test {prop: 492125}); +---- ok +-STATEMENT CREATE (t:test {prop: 162286}); +---- ok +-STATEMENT CREATE (t:test {prop: 45236}); +---- ok +-STATEMENT CREATE (t:test {prop: 513564}); +---- ok +-STATEMENT CREATE (t:test {prop: 619131}); +---- ok +-STATEMENT CREATE (t:test {prop: 408284}); +---- ok +-STATEMENT CREATE (t:test {prop: 174540}); +---- ok +-STATEMENT CREATE (t:test {prop: 492473}); +---- ok +-STATEMENT CREATE (t:test {prop: 736047}); +---- ok +-STATEMENT CREATE (t:test {prop: 287406}); +---- ok +-STATEMENT CREATE (t:test {prop: 222004}); +---- ok +-STATEMENT CREATE (t:test {prop: 518662}); +---- ok +-STATEMENT CREATE (t:test {prop: 545103}); +---- ok +-STATEMENT CREATE (t:test {prop: 370605}); +---- ok +-STATEMENT CREATE (t:test {prop: 685370}); +---- ok +-STATEMENT CREATE (t:test {prop: 590104}); +---- ok +-STATEMENT CREATE (t:test {prop: 806360}); +---- ok +-STATEMENT CREATE (t:test {prop: 999325}); +---- ok +-STATEMENT CREATE (t:test {prop: 896162}); +---- ok +-STATEMENT CREATE (t:test {prop: 583479}); +---- ok +-STATEMENT CREATE (t:test {prop: 398074}); +---- ok +-STATEMENT CREATE (t:test {prop: 156497}); +---- ok +-STATEMENT CREATE (t:test {prop: 934330}); +---- ok +-STATEMENT CREATE (t:test {prop: 672782}); +---- ok +-STATEMENT CREATE (t:test {prop: 998967}); +---- ok +-STATEMENT CREATE (t:test {prop: 331954}); +---- ok +-STATEMENT CREATE (t:test {prop: 774480}); +---- ok +-STATEMENT CREATE (t:test {prop: 984129}); +---- ok +-STATEMENT CREATE (t:test {prop: 332782}); +---- ok +-STATEMENT CREATE (t:test {prop: 136210}); +---- ok +-STATEMENT CREATE (t:test {prop: 57900}); +---- ok +-STATEMENT CREATE (t:test {prop: 479887}); +---- ok +-STATEMENT CREATE (t:test {prop: 55903}); +---- ok +-STATEMENT CREATE (t:test {prop: 706463}); +---- ok +-STATEMENT CREATE (t:test {prop: 350772}); +---- ok +-STATEMENT CREATE (t:test {prop: 553509}); +---- ok +-STATEMENT CREATE (t:test {prop: 547252}); +---- ok +-STATEMENT CREATE (t:test {prop: 50765}); +---- ok +-STATEMENT CREATE (t:test {prop: 398591}); +---- ok +-STATEMENT CREATE (t:test {prop: 639547}); +---- ok +-STATEMENT CREATE (t:test {prop: 814001}); +---- ok +-STATEMENT CREATE (t:test {prop: 964431}); +---- ok +-STATEMENT CREATE (t:test {prop: 825187}); +---- ok +-STATEMENT CREATE (t:test {prop: 85250}); +---- ok +-STATEMENT CREATE (t:test {prop: 958055}); +---- ok +-STATEMENT CREATE (t:test {prop: 731776}); +---- ok +-STATEMENT CREATE (t:test {prop: 756480}); +---- ok +-STATEMENT CREATE (t:test {prop: 37666}); +---- ok +-STATEMENT CREATE (t:test {prop: 133800}); +---- ok +-STATEMENT CREATE (t:test {prop: 34827}); +---- ok +-STATEMENT CREATE (t:test {prop: 10287}); +---- ok +-STATEMENT CREATE (t:test {prop: 975890}); +---- ok +-STATEMENT CREATE (t:test {prop: 383875}); +---- ok +-STATEMENT CREATE (t:test {prop: 456410}); +---- ok +-STATEMENT CREATE (t:test {prop: 232215}); +---- ok +-STATEMENT CREATE (t:test {prop: 691323}); +---- ok +-STATEMENT CREATE (t:test {prop: 500752}); +---- ok +-STATEMENT CREATE (t:test {prop: 874819}); +---- ok +-STATEMENT CREATE (t:test {prop: 593643}); +---- ok +-STATEMENT CREATE (t:test {prop: 961422}); +---- ok +-STATEMENT CREATE (t:test {prop: 694119}); +---- ok +-STATEMENT CREATE (t:test {prop: 758155}); +---- ok +-STATEMENT CREATE (t:test {prop: 981851}); +---- ok +-STATEMENT CREATE (t:test {prop: 94994}); +---- ok +-STATEMENT CREATE (t:test {prop: 107922}); +---- ok +-STATEMENT CREATE (t:test {prop: 71123}); +---- ok +-STATEMENT CREATE (t:test {prop: 384073}); +---- ok +-STATEMENT CREATE (t:test {prop: 847589}); +---- ok +-STATEMENT CREATE (t:test {prop: 478145}); +---- ok +-STATEMENT CREATE (t:test {prop: 448527}); +---- ok +-STATEMENT CREATE (t:test {prop: 326453}); +---- ok +-STATEMENT CREATE (t:test {prop: 186270}); +---- ok +-STATEMENT CREATE (t:test {prop: 785894}); +---- ok +-STATEMENT CREATE (t:test {prop: 132794}); +---- ok +-STATEMENT CREATE (t:test {prop: 800790}); +---- ok +-STATEMENT CREATE (t:test {prop: 660839}); +---- ok +-STATEMENT CREATE (t:test {prop: 419111}); +---- ok +-STATEMENT CREATE (t:test {prop: 569762}); +---- ok +-STATEMENT CREATE (t:test {prop: 731947}); +---- ok +-STATEMENT CREATE (t:test {prop: 566644}); +---- ok +-STATEMENT CREATE (t:test {prop: 201881}); +---- ok +-STATEMENT CREATE (t:test {prop: 713904}); +---- ok +-STATEMENT CREATE (t:test {prop: 997607}); +---- ok +-STATEMENT CREATE (t:test {prop: 781870}); +---- ok +-STATEMENT CREATE (t:test {prop: 253208}); +---- ok +-STATEMENT CREATE (t:test {prop: 754319}); +---- ok +-STATEMENT CREATE (t:test {prop: 163814}); +---- ok +-STATEMENT CREATE (t:test {prop: 879091}); +---- ok +-STATEMENT CREATE (t:test {prop: 400716}); +---- ok +-STATEMENT CREATE (t:test {prop: 228783}); +---- ok +-STATEMENT CREATE (t:test {prop: 904972}); +---- ok +-STATEMENT CREATE (t:test {prop: 540661}); +---- ok +-STATEMENT CREATE (t:test {prop: 627295}); +---- ok +-STATEMENT CREATE (t:test {prop: 513212}); +---- ok +-STATEMENT CREATE (t:test {prop: 719437}); +---- ok +-STATEMENT CREATE (t:test {prop: 870009}); +---- ok +-STATEMENT CREATE (t:test {prop: 858028}); +---- ok +-STATEMENT CREATE (t:test {prop: 695664}); +---- ok +-STATEMENT CREATE (t:test {prop: 404652}); +---- ok +-STATEMENT CREATE (t:test {prop: 826506}); +---- ok +-STATEMENT CREATE (t:test {prop: 199974}); +---- ok +-STATEMENT CREATE (t:test {prop: 71220}); +---- ok +-STATEMENT CREATE (t:test {prop: 561168}); +---- ok +-STATEMENT CREATE (t:test {prop: 764924}); +---- ok +-STATEMENT CREATE (t:test {prop: 785767}); +---- ok +-STATEMENT CREATE (t:test {prop: 162438}); +---- ok +-STATEMENT CREATE (t:test {prop: 895235}); +---- ok +-STATEMENT CREATE (t:test {prop: 635621}); +---- ok +-STATEMENT CREATE (t:test {prop: 620379}); +---- ok +-STATEMENT CREATE (t:test {prop: 564272}); +---- ok +-STATEMENT CREATE (t:test {prop: 136518}); +---- ok +-STATEMENT CREATE (t:test {prop: 74913}); +---- ok +-STATEMENT CREATE (t:test {prop: 688709}); +---- ok +-STATEMENT CREATE (t:test {prop: 415266}); +---- ok +-STATEMENT CREATE (t:test {prop: 477838}); +---- ok +-STATEMENT CREATE (t:test {prop: 93047}); +---- ok +-STATEMENT CREATE (t:test {prop: 895744}); +---- ok +-STATEMENT CREATE (t:test {prop: 994791}); +---- ok +-STATEMENT CREATE (t:test {prop: 219421}); +---- ok +-STATEMENT CREATE (t:test {prop: 983378}); +---- ok +-STATEMENT CREATE (t:test {prop: 12348}); +---- ok +-STATEMENT CREATE (t:test {prop: 476223}); +---- ok +-STATEMENT CREATE (t:test {prop: 187526}); +---- ok +-STATEMENT CREATE (t:test {prop: 696350}); +---- ok +-STATEMENT CREATE (t:test {prop: 179101}); +---- ok +-STATEMENT CREATE (t:test {prop: 384801}); +---- ok +-STATEMENT CREATE (t:test {prop: 402977}); +---- ok +-STATEMENT CREATE (t:test {prop: 662560}); +---- ok +-STATEMENT CREATE (t:test {prop: 217890}); +---- ok +-STATEMENT CREATE (t:test {prop: 259935}); +---- ok +-STATEMENT CREATE (t:test {prop: 350184}); +---- ok +-STATEMENT CREATE (t:test {prop: 313616}); +---- ok +-STATEMENT CREATE (t:test {prop: 617683}); +---- ok +-STATEMENT CREATE (t:test {prop: 271644}); +---- ok +-STATEMENT CREATE (t:test {prop: 162476}); +---- ok +-STATEMENT CREATE (t:test {prop: 62442}); +---- ok +-STATEMENT CREATE (t:test {prop: 508124}); +---- ok +-STATEMENT CREATE (t:test {prop: 436966}); +---- ok +-STATEMENT CREATE (t:test {prop: 372838}); +---- ok +-STATEMENT CREATE (t:test {prop: 358300}); +---- ok +-STATEMENT CREATE (t:test {prop: 5148}); +---- ok +-STATEMENT CREATE (t:test {prop: 341386}); +---- ok +-STATEMENT CREATE (t:test {prop: 706945}); +---- ok +-STATEMENT CREATE (t:test {prop: 307690}); +---- ok +-STATEMENT CREATE (t:test {prop: 525872}); +---- ok +-STATEMENT CREATE (t:test {prop: 941126}); +---- ok +-STATEMENT CREATE (t:test {prop: 813926}); +---- ok +-STATEMENT CREATE (t:test {prop: 732587}); +---- ok +-STATEMENT CREATE (t:test {prop: 919447}); +---- ok +-STATEMENT CREATE (t:test {prop: 616980}); +---- ok +-STATEMENT CREATE (t:test {prop: 50371}); +---- ok +-STATEMENT CREATE (t:test {prop: 426265}); +---- ok +-STATEMENT CREATE (t:test {prop: 748794}); +---- ok +-STATEMENT CREATE (t:test {prop: 297587}); +---- ok +-STATEMENT CREATE (t:test {prop: 481599}); +---- ok +-STATEMENT CREATE (t:test {prop: 178692}); +---- ok +-STATEMENT CREATE (t:test {prop: 916709}); +---- ok +-STATEMENT CREATE (t:test {prop: 864753}); +---- ok +-STATEMENT CREATE (t:test {prop: 121118}); +---- ok +-STATEMENT CREATE (t:test {prop: 934421}); +---- ok +-STATEMENT CREATE (t:test {prop: 879522}); +---- ok +-STATEMENT CREATE (t:test {prop: 438345}); +---- ok +-STATEMENT CREATE (t:test {prop: 450473}); +---- ok +-STATEMENT CREATE (t:test {prop: 97200}); +---- ok +-STATEMENT CREATE (t:test {prop: 126534}); +---- ok +-STATEMENT CREATE (t:test {prop: 484601}); +---- ok +-STATEMENT CREATE (t:test {prop: 169420}); +---- ok +-STATEMENT CREATE (t:test {prop: 919732}); +---- ok +-STATEMENT CREATE (t:test {prop: 831330}); +---- ok +-STATEMENT CREATE (t:test {prop: 77002}); +---- ok +-STATEMENT CREATE (t:test {prop: 859602}); +---- ok +-STATEMENT CREATE (t:test {prop: 397126}); +---- ok +-STATEMENT CREATE (t:test {prop: 557098}); +---- ok +-STATEMENT CREATE (t:test {prop: 83995}); +---- ok +-STATEMENT CREATE (t:test {prop: 7400}); +---- ok +-STATEMENT CREATE (t:test {prop: 545514}); +---- ok +-STATEMENT CREATE (t:test {prop: 866850}); +---- ok +-STATEMENT CREATE (t:test {prop: 759627}); +---- ok +-STATEMENT CREATE (t:test {prop: 577495}); +---- ok +-STATEMENT CREATE (t:test {prop: 272523}); +---- ok +-STATEMENT CREATE (t:test {prop: 598411}); +---- ok +-STATEMENT CREATE (t:test {prop: 506484}); +---- ok +-STATEMENT CREATE (t:test {prop: 942966}); +---- ok +-STATEMENT CREATE (t:test {prop: 906852}); +---- ok +-STATEMENT CREATE (t:test {prop: 89113}); +---- ok +-STATEMENT CREATE (t:test {prop: 441968}); +---- ok +-STATEMENT CREATE (t:test {prop: 990212}); +---- ok +-STATEMENT CREATE (t:test {prop: 121537}); +---- ok +-STATEMENT CREATE (t:test {prop: 789672}); +---- ok +-STATEMENT CREATE (t:test {prop: 426739}); +---- ok +-STATEMENT CREATE (t:test {prop: 892226}); +---- ok +-STATEMENT CREATE (t:test {prop: 499916}); +---- ok +-STATEMENT CREATE (t:test {prop: 854813}); +---- ok +-STATEMENT CREATE (t:test {prop: 231465}); +---- ok +-STATEMENT CREATE (t:test {prop: 412931}); +---- ok +-STATEMENT CREATE (t:test {prop: 940152}); +---- ok +-STATEMENT CREATE (t:test {prop: 24317}); +---- ok +-STATEMENT CREATE (t:test {prop: 465410}); +---- ok +-STATEMENT CREATE (t:test {prop: 481058}); +---- ok +-STATEMENT CREATE (t:test {prop: 663649}); +---- ok +-STATEMENT CREATE (t:test {prop: 595741}); +---- ok +-STATEMENT CREATE (t:test {prop: 746247}); +---- ok +-STATEMENT CREATE (t:test {prop: 517056}); +---- ok +-STATEMENT CREATE (t:test {prop: 729430}); +---- ok +-STATEMENT CREATE (t:test {prop: 439993}); +---- ok +-STATEMENT CREATE (t:test {prop: 313262}); +---- ok +-STATEMENT CREATE (t:test {prop: 589192}); +---- ok +-STATEMENT CREATE (t:test {prop: 688814}); +---- ok +-STATEMENT CREATE (t:test {prop: 162743}); +---- ok +-STATEMENT CREATE (t:test {prop: 472656}); +---- ok +-STATEMENT CREATE (t:test {prop: 174674}); +---- ok +-STATEMENT CREATE (t:test {prop: 237800}); +---- ok +-STATEMENT CREATE (t:test {prop: 495282}); +---- ok +-STATEMENT CREATE (t:test {prop: 523802}); +---- ok +-STATEMENT CREATE (t:test {prop: 600271}); +---- ok +-STATEMENT CREATE (t:test {prop: 490474}); +---- ok +-STATEMENT CREATE (t:test {prop: 423142}); +---- ok +-STATEMENT CREATE (t:test {prop: 316598}); +---- ok +-STATEMENT CREATE (t:test {prop: 785843}); +---- ok +-STATEMENT CREATE (t:test {prop: 577936}); +---- ok +-STATEMENT CREATE (t:test {prop: 953045}); +---- ok +-STATEMENT CREATE (t:test {prop: 469937}); +---- ok +-STATEMENT CREATE (t:test {prop: 627102}); +---- ok +-STATEMENT CREATE (t:test {prop: 796615}); +---- ok +-STATEMENT CREATE (t:test {prop: 24322}); +---- ok +-STATEMENT CREATE (t:test {prop: 525113}); +---- ok +-STATEMENT CREATE (t:test {prop: 570891}); +---- ok +-STATEMENT CREATE (t:test {prop: 385441}); +---- ok +-STATEMENT CREATE (t:test {prop: 661507}); +---- ok +-STATEMENT CREATE (t:test {prop: 739132}); +---- ok +-STATEMENT CREATE (t:test {prop: 855106}); +---- ok +-STATEMENT CREATE (t:test {prop: 486514}); +---- ok +-STATEMENT CREATE (t:test {prop: 318169}); +---- ok +-STATEMENT CREATE (t:test {prop: 192661}); +---- ok +-STATEMENT CREATE (t:test {prop: 245786}); +---- ok +-STATEMENT CREATE (t:test {prop: 233885}); +---- ok +-STATEMENT CREATE (t:test {prop: 391901}); +---- ok +-STATEMENT CREATE (t:test {prop: 632507}); +---- ok +-STATEMENT CREATE (t:test {prop: 168414}); +---- ok +-STATEMENT CREATE (t:test {prop: 556848}); +---- ok +-STATEMENT CREATE (t:test {prop: 817207}); +---- ok +-STATEMENT CREATE (t:test {prop: 872894}); +---- ok +-STATEMENT CREATE (t:test {prop: 28423}); +---- ok +-STATEMENT CREATE (t:test {prop: 567898}); +---- ok +-STATEMENT CREATE (t:test {prop: 592225}); +---- ok +-STATEMENT CREATE (t:test {prop: 838461}); +---- ok +-STATEMENT CREATE (t:test {prop: 873691}); +---- ok +-STATEMENT CREATE (t:test {prop: 898890}); +---- ok +-STATEMENT CREATE (t:test {prop: 33972}); +---- ok +-STATEMENT CREATE (t:test {prop: 61222}); +---- ok +-STATEMENT CREATE (t:test {prop: 172456}); +---- ok +-STATEMENT CREATE (t:test {prop: 440455}); +---- ok +-STATEMENT CREATE (t:test {prop: 798597}); +---- ok +-STATEMENT CREATE (t:test {prop: 322490}); +---- ok +-STATEMENT CREATE (t:test {prop: 172670}); +---- ok +-STATEMENT CREATE (t:test {prop: 805181}); +---- ok +-STATEMENT CREATE (t:test {prop: 205226}); +---- ok +-STATEMENT CREATE (t:test {prop: 29794}); +---- ok +-STATEMENT CREATE (t:test {prop: 176213}); +---- ok +-STATEMENT CREATE (t:test {prop: 489643}); +---- ok +-STATEMENT CREATE (t:test {prop: 329441}); +---- ok +-STATEMENT CREATE (t:test {prop: 45007}); +---- ok +-STATEMENT CREATE (t:test {prop: 528616}); +---- ok +-STATEMENT CREATE (t:test {prop: 257382}); +---- ok +-STATEMENT CREATE (t:test {prop: 37337}); +---- ok +-STATEMENT CREATE (t:test {prop: 18123}); +---- ok +-STATEMENT CREATE (t:test {prop: 148526}); +---- ok +-STATEMENT CREATE (t:test {prop: 712370}); +---- ok +-STATEMENT CREATE (t:test {prop: 513098}); +---- ok +-STATEMENT CREATE (t:test {prop: 476130}); +---- ok +-STATEMENT CREATE (t:test {prop: 808721}); +---- ok +-STATEMENT CREATE (t:test {prop: 369101}); +---- ok +-STATEMENT CREATE (t:test {prop: 23227}); +---- ok +-STATEMENT CREATE (t:test {prop: 440897}); +---- ok +-STATEMENT CREATE (t:test {prop: 661888}); +---- ok +-STATEMENT CREATE (t:test {prop: 713262}); +---- ok +-STATEMENT CREATE (t:test {prop: 373719}); +---- ok +-STATEMENT CREATE (t:test {prop: 271454}); +---- ok +-STATEMENT CREATE (t:test {prop: 18049}); +---- ok +-STATEMENT CREATE (t:test {prop: 162104}); +---- ok +-STATEMENT CREATE (t:test {prop: 268247}); +---- ok +-STATEMENT CREATE (t:test {prop: 43908}); +---- ok +-STATEMENT CREATE (t:test {prop: 147717}); +---- ok +-STATEMENT CREATE (t:test {prop: 685574}); +---- ok +-STATEMENT CREATE (t:test {prop: 719119}); +---- ok +-STATEMENT CREATE (t:test {prop: 696770}); +---- ok +-STATEMENT CREATE (t:test {prop: 939381}); +---- ok +-STATEMENT CREATE (t:test {prop: 250861}); +---- ok +-STATEMENT CREATE (t:test {prop: 119890}); +---- ok +-STATEMENT CREATE (t:test {prop: 540268}); +---- ok +-STATEMENT CREATE (t:test {prop: 748278}); +---- ok +-STATEMENT CREATE (t:test {prop: 974849}); +---- ok +-STATEMENT CREATE (t:test {prop: 496371}); +---- ok +-STATEMENT CREATE (t:test {prop: 814871}); +---- ok +-STATEMENT CREATE (t:test {prop: 803344}); +---- ok +-STATEMENT CREATE (t:test {prop: 310849}); +---- ok +-STATEMENT CREATE (t:test {prop: 367552}); +---- ok +-STATEMENT CREATE (t:test {prop: 335789}); +---- ok +-STATEMENT CREATE (t:test {prop: 578891}); +---- ok +-STATEMENT CREATE (t:test {prop: 447141}); +---- ok +-STATEMENT CREATE (t:test {prop: 816570}); +---- ok +-STATEMENT CREATE (t:test {prop: 906717}); +---- ok +-STATEMENT CREATE (t:test {prop: 731829}); +---- ok +-STATEMENT CREATE (t:test {prop: 344893}); +---- ok +-STATEMENT CREATE (t:test {prop: 626386}); +---- ok +-STATEMENT CREATE (t:test {prop: 859885}); +---- ok +-STATEMENT CREATE (t:test {prop: 308980}); +---- ok +-STATEMENT CREATE (t:test {prop: 450365}); +---- ok +-STATEMENT CREATE (t:test {prop: 59196}); +---- ok +-STATEMENT CREATE (t:test {prop: 112599}); +---- ok +-STATEMENT CREATE (t:test {prop: 505660}); +---- ok +-STATEMENT CREATE (t:test {prop: 697935}); +---- ok +-STATEMENT CREATE (t:test {prop: 757851}); +---- ok +-STATEMENT CREATE (t:test {prop: 750574}); +---- ok +-STATEMENT CREATE (t:test {prop: 377179}); +---- ok +-STATEMENT CREATE (t:test {prop: 509552}); +---- ok +-STATEMENT CREATE (t:test {prop: 761816}); +---- ok +-STATEMENT CREATE (t:test {prop: 458480}); +---- ok +-STATEMENT CREATE (t:test {prop: 493846}); +---- ok +-STATEMENT CREATE (t:test {prop: 374408}); +---- ok +-STATEMENT CREATE (t:test {prop: 73250}); +---- ok +-STATEMENT CREATE (t:test {prop: 165376}); +---- ok +-STATEMENT CREATE (t:test {prop: 609148}); +---- ok +-STATEMENT CREATE (t:test {prop: 200273}); +---- ok +-STATEMENT CREATE (t:test {prop: 575845}); +---- ok +-STATEMENT CREATE (t:test {prop: 793945}); +---- ok +-STATEMENT CREATE (t:test {prop: 337358}); +---- ok +-STATEMENT CREATE (t:test {prop: 302563}); +---- ok +-STATEMENT CREATE (t:test {prop: 208774}); +---- ok +-STATEMENT CREATE (t:test {prop: 5251}); +---- ok +-STATEMENT CREATE (t:test {prop: 765072}); +---- ok +-STATEMENT CREATE (t:test {prop: 614082}); +---- ok +-STATEMENT CREATE (t:test {prop: 450514}); +---- ok +-STATEMENT CREATE (t:test {prop: 759631}); +---- ok +-STATEMENT CREATE (t:test {prop: 804186}); +---- ok +-STATEMENT CREATE (t:test {prop: 44245}); +---- ok +-STATEMENT CREATE (t:test {prop: 800035}); +---- ok +-STATEMENT CREATE (t:test {prop: 768920}); +---- ok +-STATEMENT CREATE (t:test {prop: 179691}); +---- ok +-STATEMENT CREATE (t:test {prop: 169343}); +---- ok +-STATEMENT CREATE (t:test {prop: 835376}); +---- ok +-STATEMENT CREATE (t:test {prop: 506576}); +---- ok +-STATEMENT CREATE (t:test {prop: 377866}); +---- ok +-STATEMENT CREATE (t:test {prop: 412839}); +---- ok +-STATEMENT CREATE (t:test {prop: 125909}); +---- ok +-STATEMENT CREATE (t:test {prop: 407806}); +---- ok +-STATEMENT CREATE (t:test {prop: 260138}); +---- ok +-STATEMENT CREATE (t:test {prop: 829124}); +---- ok +-STATEMENT CREATE (t:test {prop: 212467}); +---- ok +-STATEMENT CREATE (t:test {prop: 947497}); +---- ok +-STATEMENT CREATE (t:test {prop: 990955}); +---- ok +-STATEMENT CREATE (t:test {prop: 602396}); +---- ok +-STATEMENT CREATE (t:test {prop: 891238}); +---- ok +-STATEMENT CREATE (t:test {prop: 81230}); +---- ok +-STATEMENT CREATE (t:test {prop: 515283}); +---- ok +-STATEMENT CREATE (t:test {prop: 857623}); +---- ok +-STATEMENT CREATE (t:test {prop: 918807}); +---- ok +-STATEMENT CREATE (t:test {prop: 56183}); +---- ok +-STATEMENT CREATE (t:test {prop: 576451}); +---- ok +-STATEMENT CREATE (t:test {prop: 879190}); +---- ok +-STATEMENT CREATE (t:test {prop: 962940}); +---- ok +-STATEMENT CREATE (t:test {prop: 269131}); +---- ok +-STATEMENT CREATE (t:test {prop: 512233}); +---- ok +-STATEMENT CREATE (t:test {prop: 86982}); +---- ok +-STATEMENT CREATE (t:test {prop: 816552}); +---- ok +-STATEMENT CREATE (t:test {prop: 780125}); +---- ok +-STATEMENT CREATE (t:test {prop: 953684}); +---- ok +-STATEMENT CREATE (t:test {prop: 690217}); +---- ok +-STATEMENT CREATE (t:test {prop: 643030}); +---- ok +-STATEMENT CREATE (t:test {prop: 729281}); +---- ok +-STATEMENT CREATE (t:test {prop: 90538}); +---- ok +-STATEMENT CREATE (t:test {prop: 256844}); +---- ok +-STATEMENT CREATE (t:test {prop: 906885}); +---- ok +-STATEMENT CREATE (t:test {prop: 678745}); +---- ok +-STATEMENT CREATE (t:test {prop: 182954}); +---- ok +-STATEMENT CREATE (t:test {prop: 177962}); +---- ok +-STATEMENT CREATE (t:test {prop: 471097}); +---- ok +-STATEMENT CREATE (t:test {prop: 424408}); +---- ok +-STATEMENT CREATE (t:test {prop: 937311}); +---- ok +-STATEMENT CREATE (t:test {prop: 737504}); +---- ok +-STATEMENT CREATE (t:test {prop: 587186}); +---- ok +-STATEMENT CREATE (t:test {prop: 200034}); +---- ok +-STATEMENT CREATE (t:test {prop: 719362}); +---- ok +-STATEMENT CREATE (t:test {prop: 443813}); +---- ok +-STATEMENT CREATE (t:test {prop: 734200}); +---- ok +-STATEMENT CREATE (t:test {prop: 240511}); +---- ok +-STATEMENT CREATE (t:test {prop: 456026}); +---- ok +-STATEMENT CREATE (t:test {prop: 433912}); +---- ok +-STATEMENT CREATE (t:test {prop: 199265}); +---- ok +-STATEMENT CREATE (t:test {prop: 242502}); +---- ok +-STATEMENT CREATE (t:test {prop: 758724}); +---- ok +-STATEMENT CREATE (t:test {prop: 737162}); +---- ok +-STATEMENT CREATE (t:test {prop: 893516}); +---- ok +-STATEMENT CREATE (t:test {prop: 875182}); +---- ok +-STATEMENT CREATE (t:test {prop: 378012}); +---- ok +-STATEMENT CREATE (t:test {prop: 504607}); +---- ok +-STATEMENT CREATE (t:test {prop: 877707}); +---- ok +-STATEMENT CREATE (t:test {prop: 746898}); +---- ok +-STATEMENT CREATE (t:test {prop: 136814}); +---- ok +-STATEMENT CREATE (t:test {prop: 791500}); +---- ok +-STATEMENT CREATE (t:test {prop: 966864}); +---- ok +-STATEMENT CREATE (t:test {prop: 846947}); +---- ok +-STATEMENT CREATE (t:test {prop: 208011}); +---- ok +-STATEMENT CREATE (t:test {prop: 841106}); +---- ok +-STATEMENT CREATE (t:test {prop: 598501}); +---- ok +-STATEMENT CREATE (t:test {prop: 689255}); +---- ok +-STATEMENT CREATE (t:test {prop: 891843}); +---- ok +-STATEMENT CREATE (t:test {prop: 774583}); +---- ok +-STATEMENT CREATE (t:test {prop: 54979}); +---- ok +-STATEMENT CREATE (t:test {prop: 764807}); +---- ok +-STATEMENT CREATE (t:test {prop: 717770}); +---- ok +-STATEMENT CREATE (t:test {prop: 548337}); +---- ok +-STATEMENT CREATE (t:test {prop: 735659}); +---- ok +-STATEMENT CREATE (t:test {prop: 834709}); +---- ok +-STATEMENT CREATE (t:test {prop: 195404}); +---- ok +-STATEMENT CREATE (t:test {prop: 198403}); +---- ok +-STATEMENT CREATE (t:test {prop: 82365}); +---- ok +-STATEMENT CREATE (t:test {prop: 754863}); +---- ok +-STATEMENT CREATE (t:test {prop: 412661}); +---- ok +-STATEMENT CREATE (t:test {prop: 669359}); +---- ok +-STATEMENT CREATE (t:test {prop: 716738}); +---- ok +-STATEMENT CREATE (t:test {prop: 566984}); +---- ok +-STATEMENT CREATE (t:test {prop: 3159}); +---- ok +-STATEMENT CREATE (t:test {prop: 633700}); +---- ok +-STATEMENT CREATE (t:test {prop: 526869}); +---- ok +-STATEMENT CREATE (t:test {prop: 962906}); +---- ok +-STATEMENT CREATE (t:test {prop: 238587}); +---- ok +-STATEMENT CREATE (t:test {prop: 827851}); +---- ok +-STATEMENT CREATE (t:test {prop: 942191}); +---- ok +-STATEMENT CREATE (t:test {prop: 724196}); +---- ok +-STATEMENT CREATE (t:test {prop: 749076}); +---- ok +-STATEMENT CREATE (t:test {prop: 944523}); +---- ok +-STATEMENT CREATE (t:test {prop: 595882}); +---- ok +-STATEMENT CREATE (t:test {prop: 913657}); +---- ok +-STATEMENT CREATE (t:test {prop: 971024}); +---- ok +-STATEMENT CREATE (t:test {prop: 343530}); +---- ok +-STATEMENT CREATE (t:test {prop: 330499}); +---- ok +-STATEMENT CREATE (t:test {prop: 902559}); +---- ok +-STATEMENT CREATE (t:test {prop: 514358}); +---- ok +-STATEMENT CREATE (t:test {prop: 929154}); +---- ok +-STATEMENT CREATE (t:test {prop: 963898}); +---- ok +-STATEMENT CREATE (t:test {prop: 610634}); +---- ok +-STATEMENT CREATE (t:test {prop: 986195}); +---- ok +-STATEMENT CREATE (t:test {prop: 970329}); +---- ok +-STATEMENT CREATE (t:test {prop: 656638}); +---- ok +-STATEMENT CREATE (t:test {prop: 183984}); +---- ok +-STATEMENT CREATE (t:test {prop: 838915}); +---- ok +-STATEMENT CREATE (t:test {prop: 840981}); +---- ok +-STATEMENT CREATE (t:test {prop: 492248}); +---- ok +-STATEMENT CREATE (t:test {prop: 254422}); +---- ok +-STATEMENT CREATE (t:test {prop: 393712}); +---- ok +-STATEMENT CREATE (t:test {prop: 419093}); +---- ok +-STATEMENT CREATE (t:test {prop: 485761}); +---- ok +-STATEMENT CREATE (t:test {prop: 532664}); +---- ok +-STATEMENT CREATE (t:test {prop: 112050}); +---- ok +-STATEMENT CREATE (t:test {prop: 442240}); +---- ok +-STATEMENT CREATE (t:test {prop: 632629}); +---- ok +-STATEMENT CREATE (t:test {prop: 541928}); +---- ok +-STATEMENT CREATE (t:test {prop: 762594}); +---- ok +-STATEMENT CREATE (t:test {prop: 97183}); +---- ok +-STATEMENT CREATE (t:test {prop: 258608}); +---- ok +-STATEMENT CREATE (t:test {prop: 61863}); +---- ok +-STATEMENT CREATE (t:test {prop: 114307}); +---- ok +-STATEMENT CREATE (t:test {prop: 759500}); +---- ok +-STATEMENT CREATE (t:test {prop: 68410}); +---- ok +-STATEMENT CREATE (t:test {prop: 283496}); +---- ok +-STATEMENT CREATE (t:test {prop: 259868}); +---- ok +-STATEMENT CREATE (t:test {prop: 291027}); +---- ok +-STATEMENT CREATE (t:test {prop: 753829}); +---- ok +-STATEMENT CREATE (t:test {prop: 734278}); +---- ok +-STATEMENT CREATE (t:test {prop: 357226}); +---- ok +-STATEMENT CREATE (t:test {prop: 793395}); +---- ok +-STATEMENT CREATE (t:test {prop: 300263}); +---- ok +-STATEMENT CREATE (t:test {prop: 560961}); +---- ok +-STATEMENT CREATE (t:test {prop: 386070}); +---- ok +-STATEMENT CREATE (t:test {prop: 857460}); +---- ok +-STATEMENT CREATE (t:test {prop: 141932}); +---- ok +-STATEMENT CREATE (t:test {prop: 367685}); +---- ok +-STATEMENT CREATE (t:test {prop: 807939}); +---- ok +-STATEMENT CREATE (t:test {prop: 933276}); +---- ok +-STATEMENT CREATE (t:test {prop: 594320}); +---- ok +-STATEMENT CREATE (t:test {prop: 669236}); +---- ok +-STATEMENT CREATE (t:test {prop: 831018}); +---- ok +-STATEMENT CREATE (t:test {prop: 887856}); +---- ok +-STATEMENT CREATE (t:test {prop: 954170}); +---- ok +-STATEMENT CREATE (t:test {prop: 853441}); +---- ok +-STATEMENT CREATE (t:test {prop: 134332}); +---- ok +-STATEMENT CREATE (t:test {prop: 735001}); +---- ok +-STATEMENT CREATE (t:test {prop: 74993}); +---- ok +-STATEMENT CREATE (t:test {prop: 969047}); +---- ok +-STATEMENT CREATE (t:test {prop: 14667}); +---- ok +-STATEMENT CREATE (t:test {prop: 790861}); +---- ok +-STATEMENT CREATE (t:test {prop: 807082}); +---- ok +-STATEMENT CREATE (t:test {prop: 472079}); +---- ok +-STATEMENT CREATE (t:test {prop: 678089}); +---- ok +-STATEMENT CREATE (t:test {prop: 124157}); +---- ok +-STATEMENT CREATE (t:test {prop: 959510}); +---- ok +-STATEMENT CREATE (t:test {prop: 422938}); +---- ok +-STATEMENT CREATE (t:test {prop: 643570}); +---- ok +-STATEMENT CREATE (t:test {prop: 648921}); +---- ok +-STATEMENT CREATE (t:test {prop: 24074}); +---- ok +-STATEMENT CREATE (t:test {prop: 171424}); +---- ok +-STATEMENT CREATE (t:test {prop: 625475}); +---- ok +-STATEMENT CREATE (t:test {prop: 142662}); +---- ok +-STATEMENT CREATE (t:test {prop: 427763}); +---- ok +-STATEMENT CREATE (t:test {prop: 253923}); +---- ok +-STATEMENT CREATE (t:test {prop: 498703}); +---- ok +-STATEMENT CREATE (t:test {prop: 483844}); +---- ok +-STATEMENT CREATE (t:test {prop: 69449}); +---- ok +-STATEMENT CREATE (t:test {prop: 180087}); +---- ok +-STATEMENT CREATE (t:test {prop: 82036}); +---- ok +-STATEMENT CREATE (t:test {prop: 359251}); +---- ok +-STATEMENT CREATE (t:test {prop: 679946}); +---- ok +-STATEMENT CREATE (t:test {prop: 688489}); +---- ok +-STATEMENT CREATE (t:test {prop: 282340}); +---- ok +-STATEMENT CREATE (t:test {prop: 805043}); +---- ok +-STATEMENT CREATE (t:test {prop: 161836}); +---- ok +-STATEMENT CREATE (t:test {prop: 669691}); +---- ok +-STATEMENT CREATE (t:test {prop: 908842}); +---- ok +-STATEMENT CREATE (t:test {prop: 929090}); +---- ok +-STATEMENT CREATE (t:test {prop: 59920}); +---- ok +-STATEMENT CREATE (t:test {prop: 463206}); +---- ok +-STATEMENT CREATE (t:test {prop: 737251}); +---- ok +-STATEMENT CREATE (t:test {prop: 771956}); +---- ok +-STATEMENT CREATE (t:test {prop: 863030}); +---- ok +-STATEMENT CREATE (t:test {prop: 544806}); +---- ok +-STATEMENT CREATE (t:test {prop: 940087}); +---- ok +-STATEMENT CREATE (t:test {prop: 43465}); +---- ok +-STATEMENT CREATE (t:test {prop: 691284}); +---- ok +-STATEMENT CREATE (t:test {prop: 56239}); +---- ok +-STATEMENT CREATE (t:test {prop: 35047}); +---- ok +-STATEMENT CREATE (t:test {prop: 458843}); +---- ok +-STATEMENT CREATE (t:test {prop: 932653}); +---- ok +-STATEMENT CREATE (t:test {prop: 916992}); +---- ok +-STATEMENT CREATE (t:test {prop: 556202}); +---- ok +-STATEMENT CREATE (t:test {prop: 430470}); +---- ok +-STATEMENT CREATE (t:test {prop: 576497}); +---- ok +-STATEMENT CREATE (t:test {prop: 561359}); +---- ok +-STATEMENT CREATE (t:test {prop: 325613}); +---- ok +-STATEMENT CREATE (t:test {prop: 778882}); +---- ok +-STATEMENT CREATE (t:test {prop: 631065}); +---- ok +-STATEMENT CREATE (t:test {prop: 605068}); +---- ok +-STATEMENT CREATE (t:test {prop: 714495}); +---- ok +-STATEMENT CREATE (t:test {prop: 378097}); +---- ok +-STATEMENT CREATE (t:test {prop: 306303}); +---- ok +-STATEMENT CREATE (t:test {prop: 620966}); +---- ok +-STATEMENT CREATE (t:test {prop: 142023}); +---- ok +-STATEMENT CREATE (t:test {prop: 487032}); +---- ok +-STATEMENT CREATE (t:test {prop: 759303}); +---- ok +-STATEMENT CREATE (t:test {prop: 348888}); +---- ok +-STATEMENT CREATE (t:test {prop: 374142}); +---- ok +-STATEMENT CREATE (t:test {prop: 73199}); +---- ok +-STATEMENT CREATE (t:test {prop: 927939}); +---- ok +-STATEMENT CREATE (t:test {prop: 273055}); +---- ok +-STATEMENT CREATE (t:test {prop: 739517}); +---- ok +-STATEMENT CREATE (t:test {prop: 922787}); +---- ok +-STATEMENT CREATE (t:test {prop: 306948}); +---- ok +-STATEMENT CREATE (t:test {prop: 684268}); +---- ok +-STATEMENT CREATE (t:test {prop: 365298}); +---- ok +-STATEMENT CREATE (t:test {prop: 737098}); +---- ok +-STATEMENT CREATE (t:test {prop: 585889}); +---- ok +-STATEMENT CREATE (t:test {prop: 107757}); +---- ok +-STATEMENT CREATE (t:test {prop: 987884}); +---- ok +-STATEMENT CREATE (t:test {prop: 265059}); +---- ok +-STATEMENT CREATE (t:test {prop: 657189}); +---- ok +-STATEMENT CREATE (t:test {prop: 394923}); +---- ok +-STATEMENT CREATE (t:test {prop: 328530}); +---- ok +-STATEMENT CREATE (t:test {prop: 486632}); +---- ok +-STATEMENT CREATE (t:test {prop: 448689}); +---- ok +-STATEMENT CREATE (t:test {prop: 424619}); +---- ok +-STATEMENT CREATE (t:test {prop: 174746}); +---- ok +-STATEMENT CREATE (t:test {prop: 287855}); +---- ok +-STATEMENT CREATE (t:test {prop: 121664}); +---- ok +-STATEMENT CREATE (t:test {prop: 157694}); +---- ok +-STATEMENT CREATE (t:test {prop: 974247}); +---- ok +-STATEMENT CREATE (t:test {prop: 582396}); +---- ok +-STATEMENT CREATE (t:test {prop: 647476}); +---- ok +-STATEMENT CREATE (t:test {prop: 177188}); +---- ok +-STATEMENT CREATE (t:test {prop: 888170}); +---- ok +-STATEMENT CREATE (t:test {prop: 3826}); +---- ok +-STATEMENT CREATE (t:test {prop: 465646}); +---- ok +-STATEMENT CREATE (t:test {prop: 796016}); +---- ok +-STATEMENT CREATE (t:test {prop: 841847}); +---- ok +-STATEMENT CREATE (t:test {prop: 800729}); +---- ok +-STATEMENT CREATE (t:test {prop: 972393}); +---- ok +-STATEMENT CREATE (t:test {prop: 378717}); +---- ok +-STATEMENT CREATE (t:test {prop: 451024}); +---- ok +-STATEMENT CREATE (t:test {prop: 924741}); +---- ok +-STATEMENT CREATE (t:test {prop: 280214}); +---- ok +-STATEMENT CREATE (t:test {prop: 167026}); +---- ok +-STATEMENT CREATE (t:test {prop: 328724}); +---- ok +-STATEMENT CREATE (t:test {prop: 944739}); +---- ok +-STATEMENT CREATE (t:test {prop: 197863}); +---- ok +-STATEMENT CREATE (t:test {prop: 714510}); +---- ok +-STATEMENT CREATE (t:test {prop: 670314}); +---- ok +-STATEMENT CREATE (t:test {prop: 702795}); +---- ok +-STATEMENT CREATE (t:test {prop: 134963}); +---- ok +-STATEMENT CREATE (t:test {prop: 52462}); +---- ok +-STATEMENT CREATE (t:test {prop: 56199}); +---- ok +-STATEMENT CREATE (t:test {prop: 798755}); +---- ok +-STATEMENT CREATE (t:test {prop: 613005}); +---- ok +-STATEMENT CREATE (t:test {prop: 177278}); +---- ok +-STATEMENT CREATE (t:test {prop: 593336}); +---- ok +-STATEMENT CREATE (t:test {prop: 561704}); +---- ok +-STATEMENT CREATE (t:test {prop: 980217}); +---- ok +-STATEMENT CREATE (t:test {prop: 576955}); +---- ok +-STATEMENT CREATE (t:test {prop: 158607}); +---- ok +-STATEMENT CREATE (t:test {prop: 63419}); +---- ok +-STATEMENT CREATE (t:test {prop: 602785}); +---- ok +-STATEMENT CREATE (t:test {prop: 309619}); +---- ok +-STATEMENT CREATE (t:test {prop: 369726}); +---- ok +-STATEMENT CREATE (t:test {prop: 964140}); +---- ok +-STATEMENT CREATE (t:test {prop: 483461}); +---- ok +-STATEMENT CREATE (t:test {prop: 795749}); +---- ok +-STATEMENT CREATE (t:test {prop: 382698}); +---- ok +-STATEMENT CREATE (t:test {prop: 322813}); +---- ok +-STATEMENT CREATE (t:test {prop: 901387}); +---- ok +-STATEMENT CREATE (t:test {prop: 268303}); +---- ok +-STATEMENT CREATE (t:test {prop: 75554}); +---- ok +-STATEMENT CREATE (t:test {prop: 208875}); +---- ok +-STATEMENT CREATE (t:test {prop: 684275}); +---- ok +-STATEMENT CREATE (t:test {prop: 842630}); +---- ok +-STATEMENT CREATE (t:test {prop: 371899}); +---- ok +-STATEMENT CREATE (t:test {prop: 888797}); +---- ok +-STATEMENT CREATE (t:test {prop: 73436}); +---- ok +-STATEMENT CREATE (t:test {prop: 678260}); +---- ok +-STATEMENT CREATE (t:test {prop: 74527}); +---- ok +-STATEMENT CREATE (t:test {prop: 775325}); +---- ok +-STATEMENT CREATE (t:test {prop: 591719}); +---- ok +-STATEMENT CREATE (t:test {prop: 258276}); +---- ok +-STATEMENT CREATE (t:test {prop: 464237}); +---- ok +-STATEMENT CREATE (t:test {prop: 820595}); +---- ok +-STATEMENT CREATE (t:test {prop: 567641}); +---- ok +-STATEMENT CREATE (t:test {prop: 713684}); +---- ok +-STATEMENT CREATE (t:test {prop: 249246}); +---- ok +-STATEMENT CREATE (t:test {prop: 601876}); +---- ok +-STATEMENT CREATE (t:test {prop: 652603}); +---- ok +-STATEMENT CREATE (t:test {prop: 279854}); +---- ok +-STATEMENT CREATE (t:test {prop: 581651}); +---- ok +-STATEMENT CREATE (t:test {prop: 704745}); +---- ok +-STATEMENT CREATE (t:test {prop: 303395}); +---- ok +-STATEMENT CREATE (t:test {prop: 52049}); +---- ok +-STATEMENT CREATE (t:test {prop: 886719}); +---- ok +-STATEMENT CREATE (t:test {prop: 526623}); +---- ok +-STATEMENT CREATE (t:test {prop: 451165}); +---- ok +-STATEMENT CREATE (t:test {prop: 689371}); +---- ok +-STATEMENT CREATE (t:test {prop: 755733}); +---- ok +-STATEMENT CREATE (t:test {prop: 354948}); +---- ok +-STATEMENT CREATE (t:test {prop: 490103}); +---- ok +-STATEMENT CREATE (t:test {prop: 629057}); +---- ok +-STATEMENT CREATE (t:test {prop: 730480}); +---- ok +-STATEMENT CREATE (t:test {prop: 58621}); +---- ok +-STATEMENT CREATE (t:test {prop: 392049}); +---- ok +-STATEMENT CREATE (t:test {prop: 350767}); +---- ok +-STATEMENT CREATE (t:test {prop: 501537}); +---- ok +-STATEMENT CREATE (t:test {prop: 514759}); +---- ok +-STATEMENT CREATE (t:test {prop: 295825}); +---- ok +-STATEMENT CREATE (t:test {prop: 868546}); +---- ok +-STATEMENT CREATE (t:test {prop: 562708}); +---- ok +-STATEMENT CREATE (t:test {prop: 511246}); +---- ok +-STATEMENT CREATE (t:test {prop: 974997}); +---- ok +-STATEMENT CREATE (t:test {prop: 1208}); +---- ok +-STATEMENT CREATE (t:test {prop: 391366}); +---- ok +-STATEMENT CREATE (t:test {prop: 264041}); +---- ok +-STATEMENT CREATE (t:test {prop: 935519}); +---- ok +-STATEMENT CREATE (t:test {prop: 610606}); +---- ok +-STATEMENT CREATE (t:test {prop: 610154}); +---- ok +-STATEMENT CREATE (t:test {prop: 679034}); +---- ok +-STATEMENT CREATE (t:test {prop: 493135}); +---- ok +-STATEMENT CREATE (t:test {prop: 979548}); +---- ok +-STATEMENT CREATE (t:test {prop: 191414}); +---- ok +-STATEMENT CREATE (t:test {prop: 857348}); +---- ok +-STATEMENT CREATE (t:test {prop: 866543}); +---- ok +-STATEMENT CREATE (t:test {prop: 860421}); +---- ok +-STATEMENT CREATE (t:test {prop: 833871}); +---- ok +-STATEMENT CREATE (t:test {prop: 239920}); +---- ok +-STATEMENT CREATE (t:test {prop: 406295}); +---- ok +-STATEMENT CREATE (t:test {prop: 457520}); +---- ok +-STATEMENT CREATE (t:test {prop: 336870}); +---- ok +-STATEMENT CREATE (t:test {prop: 712988}); +---- ok +-STATEMENT CREATE (t:test {prop: 287190}); +---- ok +-STATEMENT CREATE (t:test {prop: 110728}); +---- ok +-STATEMENT CREATE (t:test {prop: 356681}); +---- ok +-STATEMENT CREATE (t:test {prop: 118725}); +---- ok +-STATEMENT CREATE (t:test {prop: 95408}); +---- ok +-STATEMENT CREATE (t:test {prop: 111981}); +---- ok +-STATEMENT CREATE (t:test {prop: 896094}); +---- ok +-STATEMENT CREATE (t:test {prop: 269708}); +---- ok +-STATEMENT CREATE (t:test {prop: 457435}); +---- ok +-STATEMENT CREATE (t:test {prop: 245975}); +---- ok +-STATEMENT CREATE (t:test {prop: 186217}); +---- ok +-STATEMENT CREATE (t:test {prop: 571931}); +---- ok +-STATEMENT CREATE (t:test {prop: 714711}); +---- ok +-STATEMENT CREATE (t:test {prop: 801344}); +---- ok +-STATEMENT CREATE (t:test {prop: 183923}); +---- ok +-STATEMENT CREATE (t:test {prop: 806457}); +---- ok +-STATEMENT CREATE (t:test {prop: 922414}); +---- ok +-STATEMENT CREATE (t:test {prop: 903593}); +---- ok +-STATEMENT CREATE (t:test {prop: 4595}); +---- ok +-STATEMENT CREATE (t:test {prop: 526698}); +---- ok +-STATEMENT CREATE (t:test {prop: 580097}); +---- ok +-STATEMENT CREATE (t:test {prop: 301282}); +---- ok +-STATEMENT CREATE (t:test {prop: 671638}); +---- ok +-STATEMENT CREATE (t:test {prop: 169856}); +---- ok +-STATEMENT CREATE (t:test {prop: 359254}); +---- ok +-STATEMENT CREATE (t:test {prop: 601669}); +---- ok +-STATEMENT CREATE (t:test {prop: 202511}); +---- ok +-STATEMENT CREATE (t:test {prop: 947928}); +---- ok +-STATEMENT CREATE (t:test {prop: 942993}); +---- ok +-STATEMENT CREATE (t:test {prop: 620675}); +---- ok +-STATEMENT CREATE (t:test {prop: 755532}); +---- ok +-STATEMENT CREATE (t:test {prop: 729044}); +---- ok +-STATEMENT CREATE (t:test {prop: 128142}); +---- ok +-STATEMENT CREATE (t:test {prop: 174130}); +---- ok +-STATEMENT CREATE (t:test {prop: 329757}); +---- ok +-STATEMENT CREATE (t:test {prop: 10041}); +---- ok +-STATEMENT CREATE (t:test {prop: 358060}); +---- ok +-STATEMENT CREATE (t:test {prop: 951113}); +---- ok +-STATEMENT CREATE (t:test {prop: 498012}); +---- ok +-STATEMENT CREATE (t:test {prop: 197215}); +---- ok +-STATEMENT CREATE (t:test {prop: 469450}); +---- ok +-STATEMENT CREATE (t:test {prop: 57571}); +---- ok +-STATEMENT CREATE (t:test {prop: 623644}); +---- ok +-STATEMENT CREATE (t:test {prop: 815084}); +---- ok +-STATEMENT CREATE (t:test {prop: 502325}); +---- ok +-STATEMENT CREATE (t:test {prop: 593999}); +---- ok +-STATEMENT CREATE (t:test {prop: 140831}); +---- ok +-STATEMENT CREATE (t:test {prop: 17981}); +---- ok +-STATEMENT CREATE (t:test {prop: 901509}); +---- ok +-STATEMENT CREATE (t:test {prop: 584630}); +---- ok +-STATEMENT CREATE (t:test {prop: 309050}); +---- ok +-STATEMENT CREATE (t:test {prop: 533544}); +---- ok +-STATEMENT CREATE (t:test {prop: 186738}); +---- ok +-STATEMENT CREATE (t:test {prop: 967919}); +---- ok +-STATEMENT CREATE (t:test {prop: 546764}); +---- ok +-STATEMENT CREATE (t:test {prop: 618870}); +---- ok +-STATEMENT CREATE (t:test {prop: 110240}); +---- ok +-STATEMENT CREATE (t:test {prop: 157929}); +---- ok +-STATEMENT CREATE (t:test {prop: 521872}); +---- ok +-STATEMENT CREATE (t:test {prop: 655517}); +---- ok +-STATEMENT CREATE (t:test {prop: 839333}); +---- ok +-STATEMENT CREATE (t:test {prop: 785719}); +---- ok +-STATEMENT CREATE (t:test {prop: 326341}); +---- ok +-STATEMENT CREATE (t:test {prop: 994645}); +---- ok +-STATEMENT CREATE (t:test {prop: 605208}); +---- ok +-STATEMENT CREATE (t:test {prop: 315123}); +---- ok +-STATEMENT CREATE (t:test {prop: 49999}); +---- ok +-STATEMENT CREATE (t:test {prop: 409511}); +---- ok +-STATEMENT CREATE (t:test {prop: 175135}); +---- ok +-STATEMENT CREATE (t:test {prop: 149797}); +---- ok +-STATEMENT CREATE (t:test {prop: 393853}); +---- ok +-STATEMENT CREATE (t:test {prop: 684556}); +---- ok +-STATEMENT CREATE (t:test {prop: 683243}); +---- ok +-STATEMENT CREATE (t:test {prop: 897534}); +---- ok +-STATEMENT CREATE (t:test {prop: 9765}); +---- ok +-STATEMENT CREATE (t:test {prop: 503001}); +---- ok +-STATEMENT CREATE (t:test {prop: 453996}); +---- ok +-STATEMENT CREATE (t:test {prop: 927156}); +---- ok +-STATEMENT CREATE (t:test {prop: 426944}); +---- ok +-STATEMENT CREATE (t:test {prop: 637367}); +---- ok +-STATEMENT CREATE (t:test {prop: 596229}); +---- ok +-STATEMENT CREATE (t:test {prop: 663234}); +---- ok +-STATEMENT CREATE (t:test {prop: 894208}); +---- ok +-STATEMENT CREATE (t:test {prop: 669904}); +---- ok +-STATEMENT CREATE (t:test {prop: 17091}); +---- ok +-STATEMENT CREATE (t:test {prop: 31952}); +---- ok +-STATEMENT CREATE (t:test {prop: 905112}); +---- ok +-STATEMENT CREATE (t:test {prop: 971447}); +---- ok +-STATEMENT CREATE (t:test {prop: 886938}); +---- ok +-STATEMENT CREATE (t:test {prop: 611491}); +---- ok +-STATEMENT CREATE (t:test {prop: 172707}); +---- ok +-STATEMENT CREATE (t:test {prop: 731524}); +---- ok +-STATEMENT CREATE (t:test {prop: 810152}); +---- ok +-STATEMENT CREATE (t:test {prop: 289276}); +---- ok +-STATEMENT CREATE (t:test {prop: 425387}); +---- ok +-STATEMENT CREATE (t:test {prop: 201222}); +---- ok +-STATEMENT CREATE (t:test {prop: 620372}); +---- ok +-STATEMENT CREATE (t:test {prop: 535703}); +---- ok +-STATEMENT CREATE (t:test {prop: 627301}); +---- ok +-STATEMENT CREATE (t:test {prop: 745871}); +---- ok +-STATEMENT CREATE (t:test {prop: 507585}); +---- ok +-STATEMENT CREATE (t:test {prop: 399113}); +---- ok +-STATEMENT CREATE (t:test {prop: 248901}); +---- ok +-STATEMENT CREATE (t:test {prop: 357781}); +---- ok +-STATEMENT CREATE (t:test {prop: 566339}); +---- ok +-STATEMENT CREATE (t:test {prop: 235124}); +---- ok +-STATEMENT CREATE (t:test {prop: 377113}); +---- ok +-STATEMENT CREATE (t:test {prop: 602334}); +---- ok +-STATEMENT CREATE (t:test {prop: 890956}); +---- ok +-STATEMENT CREATE (t:test {prop: 611503}); +---- ok +-STATEMENT CREATE (t:test {prop: 37942}); +---- ok +-STATEMENT CREATE (t:test {prop: 910010}); +---- ok +-STATEMENT CREATE (t:test {prop: 598404}); +---- ok +-STATEMENT CREATE (t:test {prop: 874913}); +---- ok +-STATEMENT CREATE (t:test {prop: 8490}); +---- ok +-STATEMENT CREATE (t:test {prop: 839358}); +---- ok +-STATEMENT CREATE (t:test {prop: 153826}); +---- ok +-STATEMENT CREATE (t:test {prop: 13718}); +---- ok +-STATEMENT CREATE (t:test {prop: 138180}); +---- ok +-STATEMENT CREATE (t:test {prop: 214420}); +---- ok +-STATEMENT CREATE (t:test {prop: 285185}); +---- ok +-STATEMENT CREATE (t:test {prop: 255883}); +---- ok +-STATEMENT CREATE (t:test {prop: 778294}); +---- ok +-STATEMENT CREATE (t:test {prop: 79073}); +---- ok +-STATEMENT CREATE (t:test {prop: 513049}); +---- ok +-STATEMENT CREATE (t:test {prop: 433049}); +---- ok +-STATEMENT CREATE (t:test {prop: 765764}); +---- ok +-STATEMENT CREATE (t:test {prop: 62691}); +---- ok +-STATEMENT CREATE (t:test {prop: 882136}); +---- ok +-STATEMENT CREATE (t:test {prop: 474931}); +---- ok +-STATEMENT CREATE (t:test {prop: 387638}); +---- ok +-STATEMENT CREATE (t:test {prop: 732565}); +---- ok +-STATEMENT CREATE (t:test {prop: 3616}); +---- ok +-STATEMENT CREATE (t:test {prop: 656768}); +---- ok +-STATEMENT CREATE (t:test {prop: 223559}); +---- ok +-STATEMENT CREATE (t:test {prop: 185574}); +---- ok +-STATEMENT CREATE (t:test {prop: 646922}); +---- ok +-STATEMENT CREATE (t:test {prop: 600815}); +---- ok +-STATEMENT CREATE (t:test {prop: 854409}); +---- ok +-STATEMENT CREATE (t:test {prop: 214025}); +---- ok +-STATEMENT CREATE (t:test {prop: 725080}); +---- ok +-STATEMENT CREATE (t:test {prop: 791015}); +---- ok +-STATEMENT CREATE (t:test {prop: 365263}); +---- ok +-STATEMENT CREATE (t:test {prop: 30373}); +---- ok +-STATEMENT CREATE (t:test {prop: 310155}); +---- ok +-STATEMENT CREATE (t:test {prop: 162278}); +---- ok +-STATEMENT CREATE (t:test {prop: 913412}); +---- ok +-STATEMENT CREATE (t:test {prop: 543589}); +---- ok +-STATEMENT CREATE (t:test {prop: 823788}); +---- ok +-STATEMENT CREATE (t:test {prop: 633926}); +---- ok +-STATEMENT CREATE (t:test {prop: 961874}); +---- ok +-STATEMENT CREATE (t:test {prop: 513017}); +---- ok +-STATEMENT CREATE (t:test {prop: 402675}); +---- ok +-STATEMENT CREATE (t:test {prop: 93589}); +---- ok +-STATEMENT CREATE (t:test {prop: 852241}); +---- ok +-STATEMENT CREATE (t:test {prop: 131680}); +---- ok +-STATEMENT CREATE (t:test {prop: 495222}); +---- ok +-STATEMENT CREATE (t:test {prop: 81250}); +---- ok +-STATEMENT CREATE (t:test {prop: 316777}); +---- ok +-STATEMENT CREATE (t:test {prop: 696670}); +---- ok +-STATEMENT CREATE (t:test {prop: 998946}); +---- ok +-STATEMENT CREATE (t:test {prop: 192247}); +---- ok +-STATEMENT CREATE (t:test {prop: 519821}); +---- ok +-STATEMENT CREATE (t:test {prop: 812512}); +---- ok +-STATEMENT CREATE (t:test {prop: 741699}); +---- ok +-STATEMENT CREATE (t:test {prop: 498348}); +---- ok +-STATEMENT CREATE (t:test {prop: 306571}); +---- ok +-STATEMENT CREATE (t:test {prop: 794850}); +---- ok +-STATEMENT CREATE (t:test {prop: 927615}); +---- ok +-STATEMENT CREATE (t:test {prop: 57438}); +---- ok +-STATEMENT CREATE (t:test {prop: 499785}); +---- ok +-STATEMENT CREATE (t:test {prop: 308421}); +---- ok +-STATEMENT CREATE (t:test {prop: 49125}); +---- ok +-STATEMENT CREATE (t:test {prop: 377373}); +---- ok +-STATEMENT CREATE (t:test {prop: 70566}); +---- ok +-STATEMENT CREATE (t:test {prop: 81980}); +---- ok +-STATEMENT CREATE (t:test {prop: 369854}); +---- ok +-STATEMENT CREATE (t:test {prop: 552688}); +---- ok +-STATEMENT CREATE (t:test {prop: 448395}); +---- ok +-STATEMENT CREATE (t:test {prop: 40413}); +---- ok +-STATEMENT CREATE (t:test {prop: 116647}); +---- ok +-STATEMENT CREATE (t:test {prop: 995933}); +---- ok +-STATEMENT CREATE (t:test {prop: 890156}); +---- ok +-STATEMENT CREATE (t:test {prop: 713089}); +---- ok +-STATEMENT CREATE (t:test {prop: 583783}); +---- ok +-STATEMENT CREATE (t:test {prop: 993943}); +---- ok +-STATEMENT CREATE (t:test {prop: 961562}); +---- ok +-STATEMENT CREATE (t:test {prop: 682542}); +---- ok +-STATEMENT CREATE (t:test {prop: 985910}); +---- ok +-STATEMENT CREATE (t:test {prop: 837787}); +---- ok +-STATEMENT CREATE (t:test {prop: 923797}); +---- ok +-STATEMENT CREATE (t:test {prop: 178722}); +---- ok +-STATEMENT CREATE (t:test {prop: 134641}); +---- ok +-STATEMENT CREATE (t:test {prop: 46194}); +---- ok +-STATEMENT CREATE (t:test {prop: 833065}); +---- ok +-STATEMENT CREATE (t:test {prop: 239234}); +---- ok +-STATEMENT CREATE (t:test {prop: 704070}); +---- ok +-STATEMENT CREATE (t:test {prop: 439550}); +---- ok +-STATEMENT CREATE (t:test {prop: 929421}); +---- ok +-STATEMENT CREATE (t:test {prop: 52519}); +---- ok +-STATEMENT CREATE (t:test {prop: 80130}); +---- ok +-STATEMENT CREATE (t:test {prop: 972472}); +---- ok +-STATEMENT CREATE (t:test {prop: 997341}); +---- ok +-STATEMENT CREATE (t:test {prop: 313394}); +---- ok +-STATEMENT CREATE (t:test {prop: 913185}); +---- ok +-STATEMENT CREATE (t:test {prop: 830972}); +---- ok +-STATEMENT CREATE (t:test {prop: 982418}); +---- ok +-STATEMENT CREATE (t:test {prop: 48095}); +---- ok +-STATEMENT CREATE (t:test {prop: 434124}); +---- ok +-STATEMENT CREATE (t:test {prop: 891085}); +---- ok +-STATEMENT CREATE (t:test {prop: 386904}); +---- ok +-STATEMENT CREATE (t:test {prop: 349450}); +---- ok +-STATEMENT CREATE (t:test {prop: 972043}); +---- ok +-STATEMENT CREATE (t:test {prop: 539754}); +---- ok +-STATEMENT CREATE (t:test {prop: 638256}); +---- ok +-STATEMENT CREATE (t:test {prop: 639078}); +---- ok +-STATEMENT CREATE (t:test {prop: 939949}); +---- ok +-STATEMENT CREATE (t:test {prop: 640459}); +---- ok +-STATEMENT CREATE (t:test {prop: 310512}); +---- ok +-STATEMENT CREATE (t:test {prop: 405253}); +---- ok +-STATEMENT CREATE (t:test {prop: 266332}); +---- ok +-STATEMENT CREATE (t:test {prop: 964225}); +---- ok +-STATEMENT CREATE (t:test {prop: 406979}); +---- ok +-STATEMENT CREATE (t:test {prop: 16342}); +---- ok +-STATEMENT CREATE (t:test {prop: 583170}); +---- ok +-STATEMENT CREATE (t:test {prop: 568091}); +---- ok +-STATEMENT CREATE (t:test {prop: 584}); +---- ok +-STATEMENT CREATE (t:test {prop: 488385}); +---- ok +-STATEMENT CREATE (t:test {prop: 238173}); +---- ok +-STATEMENT CREATE (t:test {prop: 583220}); +---- ok +-STATEMENT CREATE (t:test {prop: 73388}); +---- ok +-STATEMENT CREATE (t:test {prop: 394683}); +---- ok +-STATEMENT CREATE (t:test {prop: 873495}); +---- ok +-STATEMENT CREATE (t:test {prop: 566971}); +---- ok +-STATEMENT CREATE (t:test {prop: 734545}); +---- ok +-STATEMENT CREATE (t:test {prop: 372533}); +---- ok +-STATEMENT CREATE (t:test {prop: 871725}); +---- ok +-STATEMENT CREATE (t:test {prop: 281166}); +---- ok +-STATEMENT CREATE (t:test {prop: 702089}); +---- ok +-STATEMENT CREATE (t:test {prop: 572581}); +---- ok +-STATEMENT CREATE (t:test {prop: 36926}); +---- ok +-STATEMENT CREATE (t:test {prop: 51701}); +---- ok +-STATEMENT CREATE (t:test {prop: 343199}); +---- ok +-STATEMENT CREATE (t:test {prop: 611646}); +---- ok +-STATEMENT CREATE (t:test {prop: 924791}); +---- ok +-STATEMENT CREATE (t:test {prop: 694839}); +---- ok +-STATEMENT CREATE (t:test {prop: 489226}); +---- ok +-STATEMENT CREATE (t:test {prop: 325635}); +---- ok +-STATEMENT CREATE (t:test {prop: 337556}); +---- ok +-STATEMENT CREATE (t:test {prop: 178427}); +---- ok +-STATEMENT CREATE (t:test {prop: 165736}); +---- ok +-STATEMENT CREATE (t:test {prop: 361392}); +---- ok +-STATEMENT CREATE (t:test {prop: 957223}); +---- ok +-STATEMENT CREATE (t:test {prop: 518924}); +---- ok +-STATEMENT CREATE (t:test {prop: 98441}); +---- ok +-STATEMENT CREATE (t:test {prop: 778340}); +---- ok +-STATEMENT CREATE (t:test {prop: 378403}); +---- ok +-STATEMENT CREATE (t:test {prop: 232298}); +---- ok +-STATEMENT CREATE (t:test {prop: 331424}); +---- ok +-STATEMENT CREATE (t:test {prop: 54986}); +---- ok +-STATEMENT CREATE (t:test {prop: 668227}); +---- ok +-STATEMENT CREATE (t:test {prop: 320266}); +---- ok +-STATEMENT CREATE (t:test {prop: 955726}); +---- ok +-STATEMENT CREATE (t:test {prop: 946388}); +---- ok +-STATEMENT CREATE (t:test {prop: 775833}); +---- ok +-STATEMENT CREATE (t:test {prop: 7613}); +---- ok +-STATEMENT CREATE (t:test {prop: 539942}); +---- ok +-STATEMENT CREATE (t:test {prop: 298718}); +---- ok +-STATEMENT CREATE (t:test {prop: 118761}); +---- ok +-STATEMENT CREATE (t:test {prop: 782211}); +---- ok +-STATEMENT CREATE (t:test {prop: 786234}); +---- ok +-STATEMENT CREATE (t:test {prop: 747496}); +---- ok +-STATEMENT CREATE (t:test {prop: 380186}); +---- ok +-STATEMENT CREATE (t:test {prop: 55746}); +---- ok +-STATEMENT CREATE (t:test {prop: 138962}); +---- ok +-STATEMENT CREATE (t:test {prop: 601743}); +---- ok +-STATEMENT CREATE (t:test {prop: 919965}); +---- ok +-STATEMENT CREATE (t:test {prop: 905344}); +---- ok +-STATEMENT CREATE (t:test {prop: 31758}); +---- ok +-STATEMENT CREATE (t:test {prop: 286142}); +---- ok +-STATEMENT CREATE (t:test {prop: 238405}); +---- ok +-STATEMENT CREATE (t:test {prop: 370953}); +---- ok +-STATEMENT CREATE (t:test {prop: 561649}); +---- ok +-STATEMENT CREATE (t:test {prop: 19175}); +---- ok +-STATEMENT CREATE (t:test {prop: 637555}); +---- ok +-STATEMENT CREATE (t:test {prop: 313446}); +---- ok +-STATEMENT CREATE (t:test {prop: 570975}); +---- ok +-STATEMENT CREATE (t:test {prop: 973593}); +---- ok +-STATEMENT CREATE (t:test {prop: 926038}); +---- ok +-STATEMENT CREATE (t:test {prop: 714412}); +---- ok +-STATEMENT CREATE (t:test {prop: 397669}); +---- ok +-STATEMENT CREATE (t:test {prop: 973443}); +---- ok +-STATEMENT CREATE (t:test {prop: 690423}); +---- ok +-STATEMENT CREATE (t:test {prop: 749326}); +---- ok +-STATEMENT CREATE (t:test {prop: 571212}); +---- ok +-STATEMENT CREATE (t:test {prop: 666623}); +---- ok +-STATEMENT CREATE (t:test {prop: 861278}); +---- ok +-STATEMENT CREATE (t:test {prop: 912378}); +---- ok +-STATEMENT CREATE (t:test {prop: 409874}); +---- ok +-STATEMENT CREATE (t:test {prop: 655110}); +---- ok +-STATEMENT CREATE (t:test {prop: 963570}); +---- ok +-STATEMENT CREATE (t:test {prop: 469716}); +---- ok +-STATEMENT CREATE (t:test {prop: 888590}); +---- ok +-STATEMENT CREATE (t:test {prop: 333049}); +---- ok +-STATEMENT CREATE (t:test {prop: 758231}); +---- ok +-STATEMENT CREATE (t:test {prop: 8164}); +---- ok +-STATEMENT CREATE (t:test {prop: 960330}); +---- ok +-STATEMENT CREATE (t:test {prop: 899151}); +---- ok +-STATEMENT CREATE (t:test {prop: 695132}); +---- ok +-STATEMENT CREATE (t:test {prop: 134528}); +---- ok +-STATEMENT CREATE (t:test {prop: 308070}); +---- ok +-STATEMENT CREATE (t:test {prop: 199910}); +---- ok +-STATEMENT CREATE (t:test {prop: 368935}); +---- ok +-STATEMENT CREATE (t:test {prop: 363607}); +---- ok +-STATEMENT CREATE (t:test {prop: 657531}); +---- ok +-STATEMENT CREATE (t:test {prop: 854267}); +---- ok +-STATEMENT CREATE (t:test {prop: 524681}); +---- ok +-STATEMENT CREATE (t:test {prop: 935009}); +---- ok +-STATEMENT CREATE (t:test {prop: 297792}); +---- ok +-STATEMENT CREATE (t:test {prop: 434499}); +---- ok +-STATEMENT CREATE (t:test {prop: 729475}); +---- ok +-STATEMENT CREATE (t:test {prop: 978190}); +---- ok +-STATEMENT CREATE (t:test {prop: 100767}); +---- ok +-STATEMENT CREATE (t:test {prop: 472558}); +---- ok +-STATEMENT CREATE (t:test {prop: 149768}); +---- ok +-STATEMENT CREATE (t:test {prop: 236322}); +---- ok +-STATEMENT CREATE (t:test {prop: 401270}); +---- ok +-STATEMENT CREATE (t:test {prop: 561641}); +---- ok +-STATEMENT CREATE (t:test {prop: 346049}); +---- ok +-STATEMENT CREATE (t:test {prop: 706119}); +---- ok +-STATEMENT CREATE (t:test {prop: 709963}); +---- ok +-STATEMENT CREATE (t:test {prop: 314976}); +---- ok +-STATEMENT CREATE (t:test {prop: 259960}); +---- ok +-STATEMENT CREATE (t:test {prop: 615457}); +---- ok +-STATEMENT CREATE (t:test {prop: 718048}); +---- ok +-STATEMENT CREATE (t:test {prop: 458248}); +---- ok +-STATEMENT CREATE (t:test {prop: 22396}); +---- ok +-STATEMENT CREATE (t:test {prop: 851869}); +---- ok +-STATEMENT CREATE (t:test {prop: 68049}); +---- ok +-STATEMENT CREATE (t:test {prop: 241545}); +---- ok +-STATEMENT CREATE (t:test {prop: 398312}); +---- ok +-STATEMENT CREATE (t:test {prop: 806512}); +---- ok +-STATEMENT CREATE (t:test {prop: 734707}); +---- ok +-STATEMENT CREATE (t:test {prop: 220421}); +---- ok +-STATEMENT CREATE (t:test {prop: 165995}); +---- ok +-STATEMENT CREATE (t:test {prop: 52046}); +---- ok +-STATEMENT CREATE (t:test {prop: 88450}); +---- ok +-STATEMENT CREATE (t:test {prop: 380633}); +---- ok +-STATEMENT CREATE (t:test {prop: 390544}); +---- ok +-STATEMENT CREATE (t:test {prop: 113036}); +---- ok +-STATEMENT CREATE (t:test {prop: 704711}); +---- ok +-STATEMENT CREATE (t:test {prop: 195759}); +---- ok +-STATEMENT CREATE (t:test {prop: 774361}); +---- ok +-STATEMENT CREATE (t:test {prop: 965267}); +---- ok +-STATEMENT CREATE (t:test {prop: 692022}); +---- ok +-STATEMENT CREATE (t:test {prop: 886214}); +---- ok +-STATEMENT CREATE (t:test {prop: 628584}); +---- ok +-STATEMENT CREATE (t:test {prop: 694247}); +---- ok +-STATEMENT CREATE (t:test {prop: 971643}); +---- ok +-STATEMENT CREATE (t:test {prop: 61460}); +---- ok +-STATEMENT CREATE (t:test {prop: 673316}); +---- ok +-STATEMENT CREATE (t:test {prop: 81123}); +---- ok +-STATEMENT CREATE (t:test {prop: 24109}); +---- ok +-STATEMENT CREATE (t:test {prop: 432856}); +---- ok +-STATEMENT CREATE (t:test {prop: 246243}); +---- ok +-STATEMENT CREATE (t:test {prop: 737118}); +---- ok +-STATEMENT CREATE (t:test {prop: 70810}); +---- ok +-STATEMENT CREATE (t:test {prop: 585675}); +---- ok +-STATEMENT CREATE (t:test {prop: 703403}); +---- ok +-STATEMENT CREATE (t:test {prop: 455192}); +---- ok +-STATEMENT CREATE (t:test {prop: 858990}); +---- ok +-STATEMENT CREATE (t:test {prop: 520592}); +---- ok +-STATEMENT CREATE (t:test {prop: 274024}); +---- ok +-STATEMENT CREATE (t:test {prop: 117671}); +---- ok +-STATEMENT CREATE (t:test {prop: 17869}); +---- ok +-STATEMENT CREATE (t:test {prop: 568682}); +---- ok +-STATEMENT CREATE (t:test {prop: 106989}); +---- ok +-STATEMENT CREATE (t:test {prop: 890788}); +---- ok +-STATEMENT CREATE (t:test {prop: 842671}); +---- ok +-STATEMENT CREATE (t:test {prop: 206257}); +---- ok +-STATEMENT CREATE (t:test {prop: 597391}); +---- ok +-STATEMENT CREATE (t:test {prop: 834976}); +---- ok +-STATEMENT CREATE (t:test {prop: 653786}); +---- ok +-STATEMENT CREATE (t:test {prop: 661416}); +---- ok +-STATEMENT CREATE (t:test {prop: 894227}); +---- ok +-STATEMENT CREATE (t:test {prop: 81849}); +---- ok +-STATEMENT CREATE (t:test {prop: 875575}); +---- ok +-STATEMENT CREATE (t:test {prop: 801179}); +---- ok +-STATEMENT CREATE (t:test {prop: 959309}); +---- ok +-STATEMENT CREATE (t:test {prop: 801259}); +---- ok +-STATEMENT CREATE (t:test {prop: 396329}); +---- ok +-STATEMENT CREATE (t:test {prop: 677529}); +---- ok +-STATEMENT CREATE (t:test {prop: 278510}); +---- ok +-STATEMENT CREATE (t:test {prop: 78592}); +---- ok +-STATEMENT CREATE (t:test {prop: 341944}); +---- ok +-STATEMENT CREATE (t:test {prop: 632007}); +---- ok +-STATEMENT CREATE (t:test {prop: 118874}); +---- ok +-STATEMENT CREATE (t:test {prop: 313602}); +---- ok +-STATEMENT CREATE (t:test {prop: 748787}); +---- ok +-STATEMENT CREATE (t:test {prop: 245000}); +---- ok +-STATEMENT CREATE (t:test {prop: 252371}); +---- ok +-STATEMENT CREATE (t:test {prop: 470680}); +---- ok +-STATEMENT CREATE (t:test {prop: 878392}); +---- ok +-STATEMENT CREATE (t:test {prop: 134742}); +---- ok +-STATEMENT CREATE (t:test {prop: 505880}); +---- ok +-STATEMENT CREATE (t:test {prop: 691742}); +---- ok +-STATEMENT CREATE (t:test {prop: 820164}); +---- ok +-STATEMENT CREATE (t:test {prop: 339822}); +---- ok +-STATEMENT CREATE (t:test {prop: 792990}); +---- ok +-STATEMENT CREATE (t:test {prop: 308114}); +---- ok +-STATEMENT CREATE (t:test {prop: 211005}); +---- ok +-STATEMENT CREATE (t:test {prop: 453665}); +---- ok +-STATEMENT CREATE (t:test {prop: 56651}); +---- ok +-STATEMENT CREATE (t:test {prop: 455436}); +---- ok +-STATEMENT CREATE (t:test {prop: 132777}); +---- ok +-STATEMENT CREATE (t:test {prop: 456126}); +---- ok +-STATEMENT CREATE (t:test {prop: 266249}); +---- ok +-STATEMENT CREATE (t:test {prop: 149209}); +---- ok +-STATEMENT CREATE (t:test {prop: 789666}); +---- ok +-STATEMENT CREATE (t:test {prop: 382291}); +---- ok +-STATEMENT CREATE (t:test {prop: 939213}); +---- ok +-STATEMENT CREATE (t:test {prop: 147666}); +---- ok +-STATEMENT CREATE (t:test {prop: 592853}); +---- ok +-STATEMENT CREATE (t:test {prop: 756654}); +---- ok +-STATEMENT CREATE (t:test {prop: 817509}); +---- ok +-STATEMENT CREATE (t:test {prop: 849709}); +---- ok +-STATEMENT CREATE (t:test {prop: 846569}); +---- ok +-STATEMENT CREATE (t:test {prop: 299750}); +---- ok +-STATEMENT CREATE (t:test {prop: 696668}); +---- ok +-STATEMENT CREATE (t:test {prop: 911464}); +---- ok +-STATEMENT CREATE (t:test {prop: 597045}); +---- ok +-STATEMENT CREATE (t:test {prop: 668200}); +---- ok +-STATEMENT CREATE (t:test {prop: 666250}); +---- ok +-STATEMENT CREATE (t:test {prop: 535323}); +---- ok +-STATEMENT CREATE (t:test {prop: 579957}); +---- ok +-STATEMENT CREATE (t:test {prop: 424432}); +---- ok +-STATEMENT CREATE (t:test {prop: 927505}); +---- ok +-STATEMENT CREATE (t:test {prop: 214294}); +---- ok +-STATEMENT CREATE (t:test {prop: 515859}); +---- ok +-STATEMENT CREATE (t:test {prop: 423337}); +---- ok +-STATEMENT CREATE (t:test {prop: 744195}); +---- ok +-STATEMENT CREATE (t:test {prop: 101350}); +---- ok +-STATEMENT CREATE (t:test {prop: 271903}); +---- ok +-STATEMENT CREATE (t:test {prop: 52208}); +---- ok +-STATEMENT CREATE (t:test {prop: 167651}); +---- ok +-STATEMENT CREATE (t:test {prop: 412582}); +---- ok +-STATEMENT CREATE (t:test {prop: 565406}); +---- ok +-STATEMENT CREATE (t:test {prop: 713311}); +---- ok +-STATEMENT CREATE (t:test {prop: 864868}); +---- ok +-STATEMENT CREATE (t:test {prop: 104222}); +---- ok +-STATEMENT CREATE (t:test {prop: 151373}); +---- ok +-STATEMENT CREATE (t:test {prop: 542842}); +---- ok +-STATEMENT CREATE (t:test {prop: 760485}); +---- ok +-STATEMENT CREATE (t:test {prop: 234804}); +---- ok +-STATEMENT CREATE (t:test {prop: 287215}); +---- ok +-STATEMENT CREATE (t:test {prop: 232822}); +---- ok +-STATEMENT CREATE (t:test {prop: 116867}); +---- ok +-STATEMENT CREATE (t:test {prop: 63511}); +---- ok +-STATEMENT CREATE (t:test {prop: 849138}); +---- ok +-STATEMENT CREATE (t:test {prop: 830108}); +---- ok +-STATEMENT CREATE (t:test {prop: 60836}); +---- ok +-STATEMENT CREATE (t:test {prop: 728996}); +---- ok +-STATEMENT CREATE (t:test {prop: 440050}); +---- ok +-STATEMENT CREATE (t:test {prop: 418068}); +---- ok +-STATEMENT CREATE (t:test {prop: 687577}); +---- ok +-STATEMENT CREATE (t:test {prop: 524487}); +---- ok +-STATEMENT CREATE (t:test {prop: 736585}); +---- ok +-STATEMENT CREATE (t:test {prop: 33284}); +---- ok +-STATEMENT CREATE (t:test {prop: 803154}); +---- ok +-STATEMENT CREATE (t:test {prop: 758851}); +---- ok +-STATEMENT CREATE (t:test {prop: 104293}); +---- ok +-STATEMENT CREATE (t:test {prop: 958246}); +---- ok +-STATEMENT CREATE (t:test {prop: 137366}); +---- ok +-STATEMENT CREATE (t:test {prop: 444713}); +---- ok +-STATEMENT CREATE (t:test {prop: 321056}); +---- ok +-STATEMENT CREATE (t:test {prop: 51353}); +---- ok +-STATEMENT CREATE (t:test {prop: 883796}); +---- ok +-STATEMENT CREATE (t:test {prop: 232872}); +---- ok +-STATEMENT CREATE (t:test {prop: 938950}); +---- ok +-STATEMENT CREATE (t:test {prop: 442698}); +---- ok +-STATEMENT CREATE (t:test {prop: 328959}); +---- ok +-STATEMENT CREATE (t:test {prop: 295499}); +---- ok +-STATEMENT CREATE (t:test {prop: 459185}); +---- ok +-STATEMENT CREATE (t:test {prop: 644506}); +---- ok +-STATEMENT CREATE (t:test {prop: 565884}); +---- ok +-STATEMENT CREATE (t:test {prop: 450620}); +---- ok +-STATEMENT CREATE (t:test {prop: 861936}); +---- ok +-STATEMENT CREATE (t:test {prop: 20784}); +---- ok +-STATEMENT CREATE (t:test {prop: 999927}); +---- ok +-STATEMENT CREATE (t:test {prop: 637632}); +---- ok +-STATEMENT CREATE (t:test {prop: 227816}); +---- ok +-STATEMENT CREATE (t:test {prop: 973480}); +---- ok +-STATEMENT CREATE (t:test {prop: 170377}); +---- ok +-STATEMENT CREATE (t:test {prop: 698400}); +---- ok +-STATEMENT CREATE (t:test {prop: 879865}); +---- ok +-STATEMENT CREATE (t:test {prop: 759826}); +---- ok +-STATEMENT CREATE (t:test {prop: 217173}); +---- ok +-STATEMENT CREATE (t:test {prop: 74706}); +---- ok +-STATEMENT CREATE (t:test {prop: 34273}); +---- ok +-STATEMENT CREATE (t:test {prop: 643114}); +---- ok +-STATEMENT CREATE (t:test {prop: 151389}); +---- ok +-STATEMENT CREATE (t:test {prop: 986537}); +---- ok +-STATEMENT CREATE (t:test {prop: 638023}); +---- ok +-STATEMENT CREATE (t:test {prop: 284989}); +---- ok +-STATEMENT CREATE (t:test {prop: 789415}); +---- ok +-STATEMENT CREATE (t:test {prop: 336181}); +---- ok +-STATEMENT CREATE (t:test {prop: 983796}); +---- ok +-STATEMENT CREATE (t:test {prop: 262336}); +---- ok +-STATEMENT CREATE (t:test {prop: 548881}); +---- ok +-STATEMENT CREATE (t:test {prop: 627065}); +---- ok +-STATEMENT CREATE (t:test {prop: 979349}); +---- ok +-STATEMENT CREATE (t:test {prop: 361346}); +---- ok +-STATEMENT CREATE (t:test {prop: 687908}); +---- ok +-STATEMENT CREATE (t:test {prop: 890030}); +---- ok +-STATEMENT CREATE (t:test {prop: 52075}); +---- ok +-STATEMENT CREATE (t:test {prop: 709159}); +---- ok +-STATEMENT CREATE (t:test {prop: 797789}); +---- ok +-STATEMENT CREATE (t:test {prop: 571475}); +---- ok +-STATEMENT CREATE (t:test {prop: 146078}); +---- ok +-STATEMENT CREATE (t:test {prop: 798333}); +---- ok +-STATEMENT CREATE (t:test {prop: 604517}); +---- ok +-STATEMENT CREATE (t:test {prop: 218009}); +---- ok +-STATEMENT CREATE (t:test {prop: 413747}); +---- ok +-STATEMENT CREATE (t:test {prop: 262903}); +---- ok +-STATEMENT CREATE (t:test {prop: 509650}); +---- ok +-STATEMENT CREATE (t:test {prop: 444159}); +---- ok +-STATEMENT CREATE (t:test {prop: 598903}); +---- ok +-STATEMENT CREATE (t:test {prop: 413005}); +---- ok +-STATEMENT CREATE (t:test {prop: 707931}); +---- ok +-STATEMENT CREATE (t:test {prop: 461035}); +---- ok +-STATEMENT CREATE (t:test {prop: 374916}); +---- ok +-STATEMENT CREATE (t:test {prop: 434901}); +---- ok +-STATEMENT CREATE (t:test {prop: 339716}); +---- ok +-STATEMENT CREATE (t:test {prop: 889771}); +---- ok +-STATEMENT CREATE (t:test {prop: 588581}); +---- ok +-STATEMENT CREATE (t:test {prop: 874177}); +---- ok +-STATEMENT CREATE (t:test {prop: 237661}); +---- ok +-STATEMENT CREATE (t:test {prop: 332360}); +---- ok +-STATEMENT CREATE (t:test {prop: 563557}); +---- ok +-STATEMENT CREATE (t:test {prop: 412080}); +---- ok +-STATEMENT CREATE (t:test {prop: 43157}); +---- ok +-STATEMENT CREATE (t:test {prop: 23728}); +---- ok +-STATEMENT CREATE (t:test {prop: 792415}); +---- ok +-STATEMENT CREATE (t:test {prop: 728802}); +---- ok +-STATEMENT CREATE (t:test {prop: 508293}); +---- ok +-STATEMENT CREATE (t:test {prop: 487228}); +---- ok +-STATEMENT CREATE (t:test {prop: 177703}); +---- ok +-STATEMENT CREATE (t:test {prop: 943468}); +---- ok +-STATEMENT CREATE (t:test {prop: 946570}); +---- ok +-STATEMENT CREATE (t:test {prop: 38995}); +---- ok +-STATEMENT CREATE (t:test {prop: 470447}); +---- ok +-STATEMENT CREATE (t:test {prop: 791063}); +---- ok +-STATEMENT CREATE (t:test {prop: 253561}); +---- ok +-STATEMENT CREATE (t:test {prop: 35550}); +---- ok +-STATEMENT CREATE (t:test {prop: 498688}); +---- ok +-STATEMENT CREATE (t:test {prop: 621163}); +---- ok +-STATEMENT CREATE (t:test {prop: 178719}); +---- ok +-STATEMENT CREATE (t:test {prop: 80042}); +---- ok +-STATEMENT CREATE (t:test {prop: 252395}); +---- ok +-STATEMENT CREATE (t:test {prop: 735569}); +---- ok +-STATEMENT CREATE (t:test {prop: 676962}); +---- ok +-STATEMENT CREATE (t:test {prop: 742850}); +---- ok +-STATEMENT CREATE (t:test {prop: 688027}); +---- ok +-STATEMENT CREATE (t:test {prop: 995311}); +---- ok +-STATEMENT CREATE (t:test {prop: 110358}); +---- ok +-STATEMENT CREATE (t:test {prop: 568433}); +---- ok +-STATEMENT CREATE (t:test {prop: 771833}); +---- ok +-STATEMENT CREATE (t:test {prop: 677897}); +---- ok +-STATEMENT CREATE (t:test {prop: 809336}); +---- ok +-STATEMENT CREATE (t:test {prop: 166834}); +---- ok +-STATEMENT CREATE (t:test {prop: 563619}); +---- ok +-STATEMENT CREATE (t:test {prop: 223780}); +---- ok +-STATEMENT CREATE (t:test {prop: 638420}); +---- ok +-STATEMENT CREATE (t:test {prop: 389455}); +---- ok +-STATEMENT CREATE (t:test {prop: 640148}); +---- ok +-STATEMENT CREATE (t:test {prop: 861486}); +---- ok +-STATEMENT CREATE (t:test {prop: 813492}); +---- ok +-STATEMENT CREATE (t:test {prop: 168490}); +---- ok +-STATEMENT CREATE (t:test {prop: 747361}); +---- ok +-STATEMENT CREATE (t:test {prop: 823524}); +---- ok +-STATEMENT CREATE (t:test {prop: 50567}); +---- ok +-STATEMENT CREATE (t:test {prop: 541647}); +---- ok +-STATEMENT CREATE (t:test {prop: 491210}); +---- ok +-STATEMENT CREATE (t:test {prop: 253699}); +---- ok +-STATEMENT CREATE (t:test {prop: 148027}); +---- ok +-STATEMENT CREATE (t:test {prop: 742373}); +---- ok +-STATEMENT CREATE (t:test {prop: 704165}); +---- ok +-STATEMENT CREATE (t:test {prop: 488027}); +---- ok +-STATEMENT CREATE (t:test {prop: 673078}); +---- ok +-STATEMENT CREATE (t:test {prop: 75356}); +---- ok +-STATEMENT CREATE (t:test {prop: 808417}); +---- ok +-STATEMENT CREATE (t:test {prop: 818529}); +---- ok +-STATEMENT CREATE (t:test {prop: 678561}); +---- ok +-STATEMENT CREATE (t:test {prop: 255962}); +---- ok +-STATEMENT CREATE (t:test {prop: 519500}); +---- ok +-STATEMENT CREATE (t:test {prop: 105335}); +---- ok +-STATEMENT CREATE (t:test {prop: 60612}); +---- ok +-STATEMENT CREATE (t:test {prop: 181263}); +---- ok +-STATEMENT CREATE (t:test {prop: 681038}); +---- ok +-STATEMENT CREATE (t:test {prop: 813345}); +---- ok +-STATEMENT CREATE (t:test {prop: 708088}); +---- ok +-STATEMENT CREATE (t:test {prop: 179574}); +---- ok +-STATEMENT CREATE (t:test {prop: 140854}); +---- ok +-STATEMENT CREATE (t:test {prop: 640131}); +---- ok +-STATEMENT CREATE (t:test {prop: 246988}); +---- ok +-STATEMENT CREATE (t:test {prop: 81210}); +---- ok +-STATEMENT CREATE (t:test {prop: 486133}); +---- ok +-STATEMENT CREATE (t:test {prop: 41869}); +---- ok +-STATEMENT CREATE (t:test {prop: 122824}); +---- ok +-STATEMENT CREATE (t:test {prop: 842887}); +---- ok +-STATEMENT CREATE (t:test {prop: 98641}); +---- ok +-STATEMENT CREATE (t:test {prop: 77179}); +---- ok +-STATEMENT CREATE (t:test {prop: 856352}); +---- ok +-STATEMENT CREATE (t:test {prop: 733838}); +---- ok +-STATEMENT CREATE (t:test {prop: 803702}); +---- ok +-STATEMENT CREATE (t:test {prop: 914815}); +---- ok +-STATEMENT CREATE (t:test {prop: 888609}); +---- ok +-STATEMENT CREATE (t:test {prop: 63652}); +---- ok +-STATEMENT CREATE (t:test {prop: 105813}); +---- ok +-STATEMENT CREATE (t:test {prop: 502368}); +---- ok +-STATEMENT CREATE (t:test {prop: 875104}); +---- ok +-STATEMENT CREATE (t:test {prop: 462660}); +---- ok +-STATEMENT CREATE (t:test {prop: 81161}); +---- ok +-STATEMENT CREATE (t:test {prop: 623632}); +---- ok +-STATEMENT CREATE (t:test {prop: 628099}); +---- ok +-STATEMENT CREATE (t:test {prop: 611954}); +---- ok +-STATEMENT CREATE (t:test {prop: 220302}); +---- ok +-STATEMENT CREATE (t:test {prop: 786300}); +---- ok +-STATEMENT CREATE (t:test {prop: 801369}); +---- ok +-STATEMENT CREATE (t:test {prop: 909226}); +---- ok +-STATEMENT CREATE (t:test {prop: 810201}); +---- ok +-STATEMENT CREATE (t:test {prop: 112168}); +---- ok +-STATEMENT CREATE (t:test {prop: 210305}); +---- ok +-STATEMENT CREATE (t:test {prop: 116450}); +---- ok +-STATEMENT CREATE (t:test {prop: 997776}); +---- ok +-STATEMENT CREATE (t:test {prop: 671498}); +---- ok +-STATEMENT CREATE (t:test {prop: 604226}); +---- ok +-STATEMENT CREATE (t:test {prop: 951160}); +---- ok +-STATEMENT CREATE (t:test {prop: 914579}); +---- ok +-STATEMENT CREATE (t:test {prop: 744505}); +---- ok +-STATEMENT CREATE (t:test {prop: 688748}); +---- ok +-STATEMENT CREATE (t:test {prop: 957260}); +---- ok +-STATEMENT CREATE (t:test {prop: 391158}); +---- ok +-STATEMENT CREATE (t:test {prop: 172797}); +---- ok +-STATEMENT CREATE (t:test {prop: 556018}); +---- ok +-STATEMENT CREATE (t:test {prop: 288255}); +---- ok +-STATEMENT CREATE (t:test {prop: 332013}); +---- ok +-STATEMENT CREATE (t:test {prop: 198211}); +---- ok +-STATEMENT CREATE (t:test {prop: 525379}); +---- ok +-STATEMENT CREATE (t:test {prop: 566022}); +---- ok +-STATEMENT CREATE (t:test {prop: 218953}); +---- ok +-STATEMENT CREATE (t:test {prop: 456860}); +---- ok +-STATEMENT CREATE (t:test {prop: 209940}); +---- ok +-STATEMENT CREATE (t:test {prop: 559400}); +---- ok +-STATEMENT CREATE (t:test {prop: 467681}); +---- ok +-STATEMENT CREATE (t:test {prop: 860218}); +---- ok +-STATEMENT CREATE (t:test {prop: 489957}); +---- ok +-STATEMENT CREATE (t:test {prop: 610986}); +---- ok +-STATEMENT CREATE (t:test {prop: 572954}); +---- ok +-STATEMENT CREATE (t:test {prop: 777401}); +---- ok +-STATEMENT CREATE (t:test {prop: 314209}); +---- ok +-STATEMENT CREATE (t:test {prop: 689429}); +---- ok +-STATEMENT CREATE (t:test {prop: 468112}); +---- ok +-STATEMENT CREATE (t:test {prop: 804039}); +---- ok +-STATEMENT CREATE (t:test {prop: 576}); +---- ok +-STATEMENT CREATE (t:test {prop: 361150}); +---- ok +-STATEMENT CREATE (t:test {prop: 3055}); +---- ok +-STATEMENT CREATE (t:test {prop: 274247}); +---- ok +-STATEMENT CREATE (t:test {prop: 551742}); +---- ok +-STATEMENT CREATE (t:test {prop: 267645}); +---- ok +-STATEMENT CREATE (t:test {prop: 109923}); +---- ok +-STATEMENT CREATE (t:test {prop: 639536}); +---- ok +-STATEMENT CREATE (t:test {prop: 427435}); +---- ok +-STATEMENT CREATE (t:test {prop: 430762}); +---- ok +-STATEMENT CREATE (t:test {prop: 315618}); +---- ok +-STATEMENT CREATE (t:test {prop: 452226}); +---- ok +-STATEMENT CREATE (t:test {prop: 81036}); +---- ok +-STATEMENT CREATE (t:test {prop: 311908}); +---- ok +-STATEMENT CREATE (t:test {prop: 169304}); +---- ok +-STATEMENT CREATE (t:test {prop: 904664}); +---- ok +-STATEMENT CREATE (t:test {prop: 809126}); +---- ok +-STATEMENT CREATE (t:test {prop: 360720}); +---- ok +-STATEMENT CREATE (t:test {prop: 147728}); +---- ok +-STATEMENT CREATE (t:test {prop: 906807}); +---- ok +-STATEMENT CREATE (t:test {prop: 118314}); +---- ok +-STATEMENT CREATE (t:test {prop: 69278}); +---- ok +-STATEMENT CREATE (t:test {prop: 394136}); +---- ok +-STATEMENT CREATE (t:test {prop: 663583}); +---- ok +-STATEMENT CREATE (t:test {prop: 281513}); +---- ok +-STATEMENT CREATE (t:test {prop: 193953}); +---- ok +-STATEMENT CREATE (t:test {prop: 252296}); +---- ok +-STATEMENT CREATE (t:test {prop: 969859}); +---- ok +-STATEMENT CREATE (t:test {prop: 922114}); +---- ok +-STATEMENT CREATE (t:test {prop: 46277}); +---- ok +-STATEMENT CREATE (t:test {prop: 359309}); +---- ok +-STATEMENT CREATE (t:test {prop: 872894}); +---- ok +-STATEMENT CREATE (t:test {prop: 266580}); +---- ok +-STATEMENT CREATE (t:test {prop: 804102}); +---- ok +-STATEMENT CREATE (t:test {prop: 453552}); +---- ok +-STATEMENT CREATE (t:test {prop: 417696}); +---- ok +-STATEMENT CREATE (t:test {prop: 544228}); +---- ok +-STATEMENT CREATE (t:test {prop: 67303}); +---- ok +-STATEMENT CREATE (t:test {prop: 762478}); +---- ok +-STATEMENT CREATE (t:test {prop: 741572}); +---- ok +-STATEMENT CREATE (t:test {prop: 275526}); +---- ok +-STATEMENT CREATE (t:test {prop: 760260}); +---- ok +-STATEMENT CREATE (t:test {prop: 999018}); +---- ok +-STATEMENT CREATE (t:test {prop: 829806}); +---- ok +-STATEMENT CREATE (t:test {prop: 766225}); +---- ok +-STATEMENT CREATE (t:test {prop: 711835}); +---- ok +-STATEMENT CREATE (t:test {prop: 358812}); +---- ok +-STATEMENT CREATE (t:test {prop: 861176}); +---- ok +-STATEMENT CREATE (t:test {prop: 745119}); +---- ok +-STATEMENT CREATE (t:test {prop: 416937}); +---- ok +-STATEMENT CREATE (t:test {prop: 261038}); +---- ok +-STATEMENT CREATE (t:test {prop: 679551}); +---- ok +-STATEMENT CREATE (t:test {prop: 9560}); +---- ok +-STATEMENT CREATE (t:test {prop: 947188}); +---- ok +-STATEMENT CREATE (t:test {prop: 783986}); +---- ok +-STATEMENT CREATE (t:test {prop: 306102}); +---- ok +-STATEMENT CREATE (t:test {prop: 905527}); +---- ok +-STATEMENT CREATE (t:test {prop: 237892}); +---- ok +-STATEMENT CREATE (t:test {prop: 889283}); +---- ok +-STATEMENT CREATE (t:test {prop: 318032}); +---- ok +-STATEMENT CREATE (t:test {prop: 253860}); +---- ok +-STATEMENT CREATE (t:test {prop: 18731}); +---- ok +-STATEMENT CREATE (t:test {prop: 215719}); +---- ok +-STATEMENT CREATE (t:test {prop: 882370}); +---- ok +-STATEMENT CREATE (t:test {prop: 970763}); +---- ok +-STATEMENT CREATE (t:test {prop: 183240}); +---- ok +-STATEMENT CREATE (t:test {prop: 199165}); +---- ok +-STATEMENT CREATE (t:test {prop: 8961}); +---- ok +-STATEMENT CREATE (t:test {prop: 126732}); +---- ok +-STATEMENT CREATE (t:test {prop: 274896}); +---- ok +-STATEMENT CREATE (t:test {prop: 278213}); +---- ok +-STATEMENT CREATE (t:test {prop: 492815}); +---- ok +-STATEMENT CREATE (t:test {prop: 117341}); +---- ok +-STATEMENT CREATE (t:test {prop: 946336}); +---- ok +-STATEMENT CREATE (t:test {prop: 368033}); +---- ok +-STATEMENT CREATE (t:test {prop: 986819}); +---- ok +-STATEMENT CREATE (t:test {prop: 907046}); +---- ok +-STATEMENT CREATE (t:test {prop: 851634}); +---- ok +-STATEMENT CREATE (t:test {prop: 975716}); +---- ok +-STATEMENT CREATE (t:test {prop: 86562}); +---- ok +-STATEMENT CREATE (t:test {prop: 614205}); +---- ok +-STATEMENT CREATE (t:test {prop: 688686}); +---- ok +-STATEMENT CREATE (t:test {prop: 579176}); +---- ok +-STATEMENT CREATE (t:test {prop: 739879}); +---- ok +-STATEMENT CREATE (t:test {prop: 826872}); +---- ok +-STATEMENT CREATE (t:test {prop: 422706}); +---- ok +-STATEMENT CREATE (t:test {prop: 720887}); +---- ok +-STATEMENT CREATE (t:test {prop: 339537}); +---- ok +-STATEMENT CREATE (t:test {prop: 108667}); +---- ok +-STATEMENT CREATE (t:test {prop: 416107}); +---- ok +-STATEMENT CREATE (t:test {prop: 430049}); +---- ok +-STATEMENT CREATE (t:test {prop: 445140}); +---- ok +-STATEMENT CREATE (t:test {prop: 894928}); +---- ok +-STATEMENT CREATE (t:test {prop: 800719}); +---- ok +-STATEMENT CREATE (t:test {prop: 441722}); +---- ok +-STATEMENT CREATE (t:test {prop: 619954}); +---- ok +-STATEMENT CREATE (t:test {prop: 826869}); +---- ok +-STATEMENT CREATE (t:test {prop: 742006}); +---- ok +-STATEMENT CREATE (t:test {prop: 885618}); +---- ok +-STATEMENT CREATE (t:test {prop: 809972}); +---- ok +-STATEMENT CREATE (t:test {prop: 49872}); +---- ok +-STATEMENT CREATE (t:test {prop: 762579}); +---- ok +-STATEMENT CREATE (t:test {prop: 374462}); +---- ok +-STATEMENT CREATE (t:test {prop: 349234}); +---- ok +-STATEMENT CREATE (t:test {prop: 2573}); +---- ok +-STATEMENT CREATE (t:test {prop: 526728}); +---- ok +-STATEMENT CREATE (t:test {prop: 630138}); +---- ok +-STATEMENT CREATE (t:test {prop: 877571}); +---- ok +-STATEMENT CREATE (t:test {prop: 109623}); +---- ok +-STATEMENT CREATE (t:test {prop: 456312}); +---- ok +-STATEMENT CREATE (t:test {prop: 568018}); +---- ok +-STATEMENT CREATE (t:test {prop: 602414}); +---- ok +-STATEMENT CREATE (t:test {prop: 536683}); +---- ok +-STATEMENT CREATE (t:test {prop: 52108}); +---- ok +-STATEMENT CREATE (t:test {prop: 632742}); +---- ok +-STATEMENT CREATE (t:test {prop: 458706}); +---- ok +-STATEMENT CREATE (t:test {prop: 125495}); +---- ok +-STATEMENT CREATE (t:test {prop: 524235}); +---- ok +-STATEMENT CREATE (t:test {prop: 599289}); +---- ok +-STATEMENT CREATE (t:test {prop: 165658}); +---- ok +-STATEMENT CREATE (t:test {prop: 940550}); +---- ok +-STATEMENT CREATE (t:test {prop: 405735}); +---- ok +-STATEMENT CREATE (t:test {prop: 839037}); +---- ok +-STATEMENT CREATE (t:test {prop: 80327}); +---- ok +-STATEMENT CREATE (t:test {prop: 276156}); +---- ok +-STATEMENT CREATE (t:test {prop: 119924}); +---- ok +-STATEMENT CREATE (t:test {prop: 146834}); +---- ok +-STATEMENT CREATE (t:test {prop: 733591}); +---- ok +-STATEMENT CREATE (t:test {prop: 753143}); +---- ok +-STATEMENT CREATE (t:test {prop: 699771}); +---- ok +-STATEMENT CREATE (t:test {prop: 280017}); +---- ok +-STATEMENT CREATE (t:test {prop: 367697}); +---- ok +-STATEMENT CREATE (t:test {prop: 319028}); +---- ok +-STATEMENT CREATE (t:test {prop: 902759}); +---- ok +-STATEMENT CREATE (t:test {prop: 634879}); +---- ok +-STATEMENT CREATE (t:test {prop: 557946}); +---- ok +-STATEMENT CREATE (t:test {prop: 834902}); +---- ok +-STATEMENT CREATE (t:test {prop: 254912}); +---- ok +-STATEMENT CREATE (t:test {prop: 700812}); +---- ok +-STATEMENT CREATE (t:test {prop: 99741}); +---- ok +-STATEMENT CREATE (t:test {prop: 452859}); +---- ok +-STATEMENT CREATE (t:test {prop: 447251}); +---- ok +-STATEMENT CREATE (t:test {prop: 928654}); +---- ok +-STATEMENT CREATE (t:test {prop: 351392}); +---- ok +-STATEMENT CREATE (t:test {prop: 791089}); +---- ok +-STATEMENT CREATE (t:test {prop: 223996}); +---- ok +-STATEMENT CREATE (t:test {prop: 399158}); +---- ok +-STATEMENT CREATE (t:test {prop: 970532}); +---- ok +-STATEMENT CREATE (t:test {prop: 70218}); +---- ok +-STATEMENT CREATE (t:test {prop: 646189}); +---- ok +-STATEMENT CREATE (t:test {prop: 454239}); +---- ok +-STATEMENT CREATE (t:test {prop: 123079}); +---- ok +-STATEMENT CREATE (t:test {prop: 126212}); +---- ok +-STATEMENT CREATE (t:test {prop: 487039}); +---- ok +-STATEMENT CREATE (t:test {prop: 511552}); +---- ok +-STATEMENT CREATE (t:test {prop: 342683}); +---- ok +-STATEMENT CREATE (t:test {prop: 352164}); +---- ok +-STATEMENT CREATE (t:test {prop: 830848}); +---- ok +-STATEMENT CREATE (t:test {prop: 149822}); +---- ok +-STATEMENT CREATE (t:test {prop: 601602}); +---- ok +-STATEMENT CREATE (t:test {prop: 42656}); +---- ok +-STATEMENT CREATE (t:test {prop: 17984}); +---- ok +-STATEMENT CREATE (t:test {prop: 557003}); +---- ok +-STATEMENT CREATE (t:test {prop: 724104}); +---- ok +-STATEMENT CREATE (t:test {prop: 503673}); +---- ok +-STATEMENT CREATE (t:test {prop: 671586}); +---- ok +-STATEMENT CREATE (t:test {prop: 273549}); +---- ok +-STATEMENT CREATE (t:test {prop: 955159}); +---- ok +-STATEMENT CREATE (t:test {prop: 457626}); +---- ok +-STATEMENT CREATE (t:test {prop: 770672}); +---- ok +-STATEMENT CREATE (t:test {prop: 273326}); +---- ok +-STATEMENT CREATE (t:test {prop: 155984}); +---- ok +-STATEMENT CREATE (t:test {prop: 138963}); +---- ok +-STATEMENT CREATE (t:test {prop: 411126}); +---- ok +-STATEMENT CREATE (t:test {prop: 311366}); +---- ok +-STATEMENT CREATE (t:test {prop: 825109}); +---- ok +-STATEMENT CREATE (t:test {prop: 63712}); +---- ok +-STATEMENT CREATE (t:test {prop: 887124}); +---- ok +-STATEMENT CREATE (t:test {prop: 599357}); +---- ok +-STATEMENT CREATE (t:test {prop: 384167}); +---- ok +-STATEMENT CREATE (t:test {prop: 858983}); +---- ok +-STATEMENT CREATE (t:test {prop: 870520}); +---- ok +-STATEMENT CREATE (t:test {prop: 906759}); +---- ok +-STATEMENT CREATE (t:test {prop: 600129}); +---- ok +-STATEMENT CREATE (t:test {prop: 483236}); +---- ok +-STATEMENT CREATE (t:test {prop: 570112}); +---- ok +-STATEMENT CREATE (t:test {prop: 746386}); +---- ok +-STATEMENT CREATE (t:test {prop: 391341}); +---- ok +-STATEMENT CREATE (t:test {prop: 497791}); +---- ok +-STATEMENT CREATE (t:test {prop: 16037}); +---- ok +-STATEMENT CREATE (t:test {prop: 595222}); +---- ok +-STATEMENT CREATE (t:test {prop: 310729}); +---- ok +-STATEMENT CREATE (t:test {prop: 160125}); +---- ok +-STATEMENT CREATE (t:test {prop: 532287}); +---- ok +-STATEMENT CREATE (t:test {prop: 860592}); +---- ok +-STATEMENT CREATE (t:test {prop: 889190}); +---- ok +-STATEMENT CREATE (t:test {prop: 841564}); +---- ok +-STATEMENT CREATE (t:test {prop: 697447}); +---- ok +-STATEMENT CREATE (t:test {prop: 280367}); +---- ok +-STATEMENT CREATE (t:test {prop: 184130}); +---- ok +-STATEMENT CREATE (t:test {prop: 637787}); +---- ok +-STATEMENT CREATE (t:test {prop: 213388}); +---- ok +-STATEMENT CREATE (t:test {prop: 530809}); +---- ok +-STATEMENT CREATE (t:test {prop: 828690}); +---- ok +-STATEMENT CREATE (t:test {prop: 649445}); +---- ok +-STATEMENT CREATE (t:test {prop: 138541}); +---- ok +-STATEMENT CREATE (t:test {prop: 77163}); +---- ok +-STATEMENT CREATE (t:test {prop: 206546}); +---- ok +-STATEMENT CREATE (t:test {prop: 97055}); +---- ok +-STATEMENT CREATE (t:test {prop: 491728}); +---- ok +-STATEMENT CREATE (t:test {prop: 344820}); +---- ok +-STATEMENT CREATE (t:test {prop: 337517}); +---- ok +-STATEMENT CREATE (t:test {prop: 793640}); +---- ok +-STATEMENT CREATE (t:test {prop: 460301}); +---- ok +-STATEMENT CREATE (t:test {prop: 359867}); +---- ok +-STATEMENT CREATE (t:test {prop: 128152}); +---- ok +-STATEMENT CREATE (t:test {prop: 383891}); +---- ok +-STATEMENT CREATE (t:test {prop: 738972}); +---- ok +-STATEMENT CREATE (t:test {prop: 907509}); +---- ok +-STATEMENT CREATE (t:test {prop: 168392}); +---- ok +-STATEMENT CREATE (t:test {prop: 752632}); +---- ok +-STATEMENT CREATE (t:test {prop: 100141}); +---- ok +-STATEMENT CREATE (t:test {prop: 717546}); +---- ok +-STATEMENT CREATE (t:test {prop: 565097}); +---- ok +-STATEMENT CREATE (t:test {prop: 34918}); +---- ok +-STATEMENT CREATE (t:test {prop: 866946}); +---- ok +-STATEMENT CREATE (t:test {prop: 548493}); +---- ok +-STATEMENT CREATE (t:test {prop: 692979}); +---- ok +-STATEMENT CREATE (t:test {prop: 890294}); +---- ok +-STATEMENT CREATE (t:test {prop: 764747}); +---- ok +-STATEMENT CREATE (t:test {prop: 590548}); +---- ok +-STATEMENT CREATE (t:test {prop: 272916}); +---- ok +-STATEMENT CREATE (t:test {prop: 92556}); +---- ok +-STATEMENT CREATE (t:test {prop: 381415}); +---- ok +-STATEMENT CREATE (t:test {prop: 632171}); +---- ok +-STATEMENT CREATE (t:test {prop: 629057}); +---- ok +-STATEMENT CREATE (t:test {prop: 758828}); +---- ok +-STATEMENT CREATE (t:test {prop: 321394}); +---- ok +-STATEMENT CREATE (t:test {prop: 597532}); +---- ok +-STATEMENT CREATE (t:test {prop: 384757}); +---- ok +-STATEMENT CREATE (t:test {prop: 142510}); +---- ok +-STATEMENT CREATE (t:test {prop: 809711}); +---- ok +-STATEMENT CREATE (t:test {prop: 480958}); +---- ok +-STATEMENT CREATE (t:test {prop: 88657}); +---- ok +-STATEMENT CREATE (t:test {prop: 929134}); +---- ok +-STATEMENT CREATE (t:test {prop: 677686}); +---- ok +-STATEMENT CREATE (t:test {prop: 828457}); +---- ok +-STATEMENT CREATE (t:test {prop: 309630}); +---- ok +-STATEMENT CREATE (t:test {prop: 760632}); +---- ok +-STATEMENT CREATE (t:test {prop: 277050}); +---- ok +-STATEMENT CREATE (t:test {prop: 483089}); +---- ok +-STATEMENT CREATE (t:test {prop: 850050}); +---- ok +-STATEMENT CREATE (t:test {prop: 452650}); +---- ok +-STATEMENT CREATE (t:test {prop: 862350}); +---- ok +-STATEMENT CREATE (t:test {prop: 826078}); +---- ok +-STATEMENT CREATE (t:test {prop: 69032}); +---- ok +-STATEMENT CREATE (t:test {prop: 96011}); +---- ok +-STATEMENT CREATE (t:test {prop: 539264}); +---- ok +-STATEMENT CREATE (t:test {prop: 376787}); +---- ok +-STATEMENT CREATE (t:test {prop: 513819}); +---- ok +-STATEMENT CREATE (t:test {prop: 462976}); +---- ok +-STATEMENT CREATE (t:test {prop: 371291}); +---- ok +-STATEMENT CREATE (t:test {prop: 425723}); +---- ok +-STATEMENT CREATE (t:test {prop: 902362}); +---- ok +-STATEMENT CREATE (t:test {prop: 676103}); +---- ok +-STATEMENT CREATE (t:test {prop: 164173}); +---- ok +-STATEMENT CREATE (t:test {prop: 390781}); +---- ok +-STATEMENT CREATE (t:test {prop: 654010}); +---- ok +-STATEMENT CREATE (t:test {prop: 241532}); +---- ok +-STATEMENT CREATE (t:test {prop: 852084}); +---- ok +-STATEMENT CREATE (t:test {prop: 732161}); +---- ok +-STATEMENT CREATE (t:test {prop: 46822}); +---- ok +-STATEMENT CREATE (t:test {prop: 854297}); +---- ok +-STATEMENT CREATE (t:test {prop: 852683}); +---- ok +-STATEMENT CREATE (t:test {prop: 885758}); +---- ok +-STATEMENT CREATE (t:test {prop: 229138}); +---- ok +-STATEMENT CREATE (t:test {prop: 399142}); +---- ok +-STATEMENT CREATE (t:test {prop: 823844}); +---- ok +-STATEMENT CREATE (t:test {prop: 37558}); +---- ok +-STATEMENT CREATE (t:test {prop: 591383}); +---- ok +-STATEMENT CREATE (t:test {prop: 102061}); +---- ok +-STATEMENT CREATE (t:test {prop: 52322}); +---- ok +-STATEMENT CREATE (t:test {prop: 744293}); +---- ok +-STATEMENT CREATE (t:test {prop: 216048}); +---- ok +-STATEMENT CREATE (t:test {prop: 962347}); +---- ok +-STATEMENT CREATE (t:test {prop: 621082}); +---- ok +-STATEMENT CREATE (t:test {prop: 355034}); +---- ok +-STATEMENT CREATE (t:test {prop: 516019}); +---- ok +-STATEMENT CREATE (t:test {prop: 430076}); +---- ok +-STATEMENT CREATE (t:test {prop: 887600}); +---- ok +-STATEMENT CREATE (t:test {prop: 753191}); +---- ok +-STATEMENT CREATE (t:test {prop: 13481}); +---- ok +-STATEMENT CREATE (t:test {prop: 483093}); +---- ok +-STATEMENT CREATE (t:test {prop: 441736}); +---- ok +-STATEMENT CREATE (t:test {prop: 10633}); +---- ok +-STATEMENT CREATE (t:test {prop: 81306}); +---- ok +-STATEMENT CREATE (t:test {prop: 787435}); +---- ok +-STATEMENT CREATE (t:test {prop: 294678}); +---- ok +-STATEMENT CREATE (t:test {prop: 972453}); +---- ok +-STATEMENT CREATE (t:test {prop: 394999}); +---- ok +-STATEMENT CREATE (t:test {prop: 29107}); +---- ok +-STATEMENT CREATE (t:test {prop: 770324}); +---- ok +-STATEMENT CREATE (t:test {prop: 791924}); +---- ok +-STATEMENT CREATE (t:test {prop: 238016}); +---- ok +-STATEMENT CREATE (t:test {prop: 730496}); +---- ok +-STATEMENT CREATE (t:test {prop: 449506}); +---- ok +-STATEMENT CREATE (t:test {prop: 457177}); +---- ok +-STATEMENT CREATE (t:test {prop: 196553}); +---- ok +-STATEMENT CREATE (t:test {prop: 547235}); +---- ok +-STATEMENT CREATE (t:test {prop: 616984}); +---- ok +-STATEMENT CREATE (t:test {prop: 782666}); +---- ok +-STATEMENT CREATE (t:test {prop: 33889}); +---- ok +-STATEMENT CREATE (t:test {prop: 729353}); +---- ok +-STATEMENT CREATE (t:test {prop: 537856}); +---- ok +-STATEMENT CREATE (t:test {prop: 198456}); +---- ok +-STATEMENT CREATE (t:test {prop: 821183}); +---- ok +-STATEMENT CREATE (t:test {prop: 903864}); +---- ok +-STATEMENT CREATE (t:test {prop: 359029}); +---- ok +-STATEMENT CREATE (t:test {prop: 853193}); +---- ok +-STATEMENT CREATE (t:test {prop: 432223}); +---- ok +-STATEMENT CREATE (t:test {prop: 760087}); +---- ok +-STATEMENT CREATE (t:test {prop: 418846}); +---- ok +-STATEMENT CREATE (t:test {prop: 679396}); +---- ok +-STATEMENT CREATE (t:test {prop: 569088}); +---- ok +-STATEMENT CREATE (t:test {prop: 495524}); +---- ok +-STATEMENT CREATE (t:test {prop: 191207}); +---- ok +-STATEMENT CREATE (t:test {prop: 543515}); +---- ok +-STATEMENT CREATE (t:test {prop: 79872}); +---- ok +-STATEMENT CREATE (t:test {prop: 966792}); +---- ok +-STATEMENT CREATE (t:test {prop: 92364}); +---- ok +-STATEMENT CREATE (t:test {prop: 111173}); +---- ok +-STATEMENT CREATE (t:test {prop: 42380}); +---- ok +-STATEMENT CREATE (t:test {prop: 235160}); +---- ok +-STATEMENT CREATE (t:test {prop: 881445}); +---- ok +-STATEMENT CREATE (t:test {prop: 757985}); +---- ok +-STATEMENT CREATE (t:test {prop: 606808}); +---- ok +-STATEMENT CREATE (t:test {prop: 881218}); +---- ok +-STATEMENT CREATE (t:test {prop: 817}); +---- ok +-STATEMENT CREATE (t:test {prop: 891334}); +---- ok +-STATEMENT CREATE (t:test {prop: 878568}); +---- ok +-STATEMENT CREATE (t:test {prop: 786437}); +---- ok +-STATEMENT CREATE (t:test {prop: 57815}); +---- ok +-STATEMENT CREATE (t:test {prop: 795792}); +---- ok +-STATEMENT CREATE (t:test {prop: 431996}); +---- ok +-STATEMENT CREATE (t:test {prop: 332111}); +---- ok +-STATEMENT CREATE (t:test {prop: 598332}); +---- ok +-STATEMENT CREATE (t:test {prop: 766364}); +---- ok +-STATEMENT CREATE (t:test {prop: 287287}); +---- ok +-STATEMENT CREATE (t:test {prop: 715217}); +---- ok +-STATEMENT CREATE (t:test {prop: 906323}); +---- ok +-STATEMENT CREATE (t:test {prop: 735754}); +---- ok +-STATEMENT CREATE (t:test {prop: 481135}); +---- ok +-STATEMENT CREATE (t:test {prop: 964017}); +---- ok +-STATEMENT CREATE (t:test {prop: 643952}); +---- ok +-STATEMENT CREATE (t:test {prop: 698933}); +---- ok +-STATEMENT CREATE (t:test {prop: 937750}); +---- ok +-STATEMENT CREATE (t:test {prop: 538236}); +---- ok +-STATEMENT CREATE (t:test {prop: 349411}); +---- ok +-STATEMENT CREATE (t:test {prop: 602008}); +---- ok +-STATEMENT CREATE (t:test {prop: 814543}); +---- ok +-STATEMENT CREATE (t:test {prop: 65926}); +---- ok +-STATEMENT CREATE (t:test {prop: 790798}); +---- ok +-STATEMENT CREATE (t:test {prop: 897072}); +---- ok +-STATEMENT CREATE (t:test {prop: 560223}); +---- ok +-STATEMENT CREATE (t:test {prop: 178405}); +---- ok +-STATEMENT CREATE (t:test {prop: 332619}); +---- ok +-STATEMENT CREATE (t:test {prop: 507469}); +---- ok +-STATEMENT CREATE (t:test {prop: 678343}); +---- ok +-STATEMENT CREATE (t:test {prop: 472290}); +---- ok +-STATEMENT CREATE (t:test {prop: 473845}); +---- ok +-STATEMENT CREATE (t:test {prop: 446289}); +---- ok +-STATEMENT CREATE (t:test {prop: 406215}); +---- ok +-STATEMENT CREATE (t:test {prop: 646263}); +---- ok +-STATEMENT CREATE (t:test {prop: 464225}); +---- ok +-STATEMENT CREATE (t:test {prop: 246282}); +---- ok +-STATEMENT CREATE (t:test {prop: 847805}); +---- ok +-STATEMENT CREATE (t:test {prop: 483935}); +---- ok +-STATEMENT CREATE (t:test {prop: 714874}); +---- ok +-STATEMENT CREATE (t:test {prop: 291891}); +---- ok +-STATEMENT CREATE (t:test {prop: 923377}); +---- ok +-STATEMENT CREATE (t:test {prop: 581566}); +---- ok +-STATEMENT CREATE (t:test {prop: 159832}); +---- ok +-STATEMENT CREATE (t:test {prop: 147260}); +---- ok +-STATEMENT CREATE (t:test {prop: 139681}); +---- ok +-STATEMENT CREATE (t:test {prop: 32479}); +---- ok +-STATEMENT CREATE (t:test {prop: 762540}); +---- ok +-STATEMENT CREATE (t:test {prop: 730008}); +---- ok +-STATEMENT CREATE (t:test {prop: 370183}); +---- ok +-STATEMENT CREATE (t:test {prop: 255829}); +---- ok +-STATEMENT CREATE (t:test {prop: 42955}); +---- ok +-STATEMENT CREATE (t:test {prop: 13836}); +---- ok +-STATEMENT CREATE (t:test {prop: 159529}); +---- ok +-STATEMENT CREATE (t:test {prop: 821772}); +---- ok +-STATEMENT CREATE (t:test {prop: 833324}); +---- ok +-STATEMENT CREATE (t:test {prop: 651314}); +---- ok +-STATEMENT CREATE (t:test {prop: 971154}); +---- ok +-STATEMENT CREATE (t:test {prop: 95133}); +---- ok +-STATEMENT CREATE (t:test {prop: 669667}); +---- ok +-STATEMENT CREATE (t:test {prop: 419684}); +---- ok +-STATEMENT CREATE (t:test {prop: 112972}); +---- ok +-STATEMENT CREATE (t:test {prop: 474592}); +---- ok +-STATEMENT CREATE (t:test {prop: 180468}); +---- ok +-STATEMENT CREATE (t:test {prop: 626763}); +---- ok +-STATEMENT CREATE (t:test {prop: 42588}); +---- ok +-STATEMENT CREATE (t:test {prop: 974522}); +---- ok +-STATEMENT CREATE (t:test {prop: 634717}); +---- ok +-STATEMENT CREATE (t:test {prop: 780415}); +---- ok +-STATEMENT CREATE (t:test {prop: 512205}); +---- ok +-STATEMENT CREATE (t:test {prop: 871753}); +---- ok +-STATEMENT CREATE (t:test {prop: 36029}); +---- ok +-STATEMENT CREATE (t:test {prop: 99121}); +---- ok +-STATEMENT CREATE (t:test {prop: 60565}); +---- ok +-STATEMENT CREATE (t:test {prop: 571774}); +---- ok +-STATEMENT CREATE (t:test {prop: 821518}); +---- ok +-STATEMENT CREATE (t:test {prop: 702143}); +---- ok +-STATEMENT CREATE (t:test {prop: 175830}); +---- ok +-STATEMENT CREATE (t:test {prop: 257660}); +---- ok +-STATEMENT CREATE (t:test {prop: 705453}); +---- ok +-STATEMENT CREATE (t:test {prop: 402504}); +---- ok +-STATEMENT CREATE (t:test {prop: 351283}); +---- ok +-STATEMENT CREATE (t:test {prop: 79487}); +---- ok +-STATEMENT CREATE (t:test {prop: 770245}); +---- ok +-STATEMENT CREATE (t:test {prop: 795505}); +---- ok +-STATEMENT CREATE (t:test {prop: 573366}); +---- ok +-STATEMENT CREATE (t:test {prop: 441087}); +---- ok +-STATEMENT CREATE (t:test {prop: 125568}); +---- ok +-STATEMENT CREATE (t:test {prop: 214051}); +---- ok +-STATEMENT CREATE (t:test {prop: 792571}); +---- ok +-STATEMENT CREATE (t:test {prop: 897698}); +---- ok +-STATEMENT CREATE (t:test {prop: 994561}); +---- ok +-STATEMENT CREATE (t:test {prop: 723506}); +---- ok +-STATEMENT CREATE (t:test {prop: 500584}); +---- ok +-STATEMENT CREATE (t:test {prop: 393323}); +---- ok +-STATEMENT CREATE (t:test {prop: 946544}); +---- ok +-STATEMENT CREATE (t:test {prop: 629355}); +---- ok +-STATEMENT CREATE (t:test {prop: 631617}); +---- ok +-STATEMENT CREATE (t:test {prop: 524523}); +---- ok +-STATEMENT CREATE (t:test {prop: 373053}); +---- ok +-STATEMENT CREATE (t:test {prop: 487276}); +---- ok +-STATEMENT CREATE (t:test {prop: 904163}); +---- ok +-STATEMENT CREATE (t:test {prop: 539500}); +---- ok +-STATEMENT CREATE (t:test {prop: 913568}); +---- ok +-STATEMENT CREATE (t:test {prop: 896366}); +---- ok +-STATEMENT CREATE (t:test {prop: 454107}); +---- ok +-STATEMENT CREATE (t:test {prop: 619752}); +---- ok +-STATEMENT CREATE (t:test {prop: 618984}); +---- ok +-STATEMENT CREATE (t:test {prop: 826635}); +---- ok +-STATEMENT CREATE (t:test {prop: 350716}); +---- ok +-STATEMENT CREATE (t:test {prop: 519316}); +---- ok +-STATEMENT CREATE (t:test {prop: 889162}); +---- ok +-STATEMENT CREATE (t:test {prop: 654345}); +---- ok +-STATEMENT CREATE (t:test {prop: 868633}); +---- ok +-STATEMENT CREATE (t:test {prop: 349047}); +---- ok +-STATEMENT CREATE (t:test {prop: 354980}); +---- ok +-STATEMENT CREATE (t:test {prop: 575728}); +---- ok +-STATEMENT CREATE (t:test {prop: 367901}); +---- ok +-STATEMENT CREATE (t:test {prop: 977440}); +---- ok +-STATEMENT CREATE (t:test {prop: 994619}); +---- ok +-STATEMENT CREATE (t:test {prop: 571392}); +---- ok +-STATEMENT CREATE (t:test {prop: 663413}); +---- ok +-STATEMENT CREATE (t:test {prop: 68800}); +---- ok +-STATEMENT CREATE (t:test {prop: 228502}); +---- ok +-STATEMENT CREATE (t:test {prop: 145954}); +---- ok +-STATEMENT CREATE (t:test {prop: 860541}); +---- ok +-STATEMENT CREATE (t:test {prop: 904276}); +---- ok +-STATEMENT CREATE (t:test {prop: 311063}); +---- ok +-STATEMENT CREATE (t:test {prop: 974232}); +---- ok +-STATEMENT CREATE (t:test {prop: 876266}); +---- ok +-STATEMENT CREATE (t:test {prop: 139242}); +---- ok +-STATEMENT CREATE (t:test {prop: 954080}); +---- ok +-STATEMENT CREATE (t:test {prop: 882346}); +---- ok +-STATEMENT CREATE (t:test {prop: 946798}); +---- ok +-STATEMENT CREATE (t:test {prop: 81391}); +---- ok +-STATEMENT CREATE (t:test {prop: 326165}); +---- ok +-STATEMENT CREATE (t:test {prop: 343192}); +---- ok +-STATEMENT CREATE (t:test {prop: 76821}); +---- ok +-STATEMENT CREATE (t:test {prop: 458160}); +---- ok +-STATEMENT CREATE (t:test {prop: 143448}); +---- ok +-STATEMENT CREATE (t:test {prop: 933561}); +---- ok +-STATEMENT CREATE (t:test {prop: 816353}); +---- ok +-STATEMENT CREATE (t:test {prop: 475777}); +---- ok +-STATEMENT CREATE (t:test {prop: 984194}); +---- ok +-STATEMENT CREATE (t:test {prop: 398375}); +---- ok +-STATEMENT CREATE (t:test {prop: 532291}); +---- ok +-STATEMENT CREATE (t:test {prop: 543254}); +---- ok +-STATEMENT CREATE (t:test {prop: 585798}); +---- ok +-STATEMENT CREATE (t:test {prop: 65854}); +---- ok +-STATEMENT CREATE (t:test {prop: 436160}); +---- ok +-STATEMENT CREATE (t:test {prop: 512677}); +---- ok +-STATEMENT CREATE (t:test {prop: 976921}); +---- ok +-STATEMENT CREATE (t:test {prop: 247337}); +---- ok +-STATEMENT CREATE (t:test {prop: 789763}); +---- ok +-STATEMENT CREATE (t:test {prop: 164296}); +---- ok +-STATEMENT CREATE (t:test {prop: 570799}); +---- ok +-STATEMENT CREATE (t:test {prop: 60444}); +---- ok +-STATEMENT CREATE (t:test {prop: 668145}); +---- ok +-STATEMENT CREATE (t:test {prop: 936658}); +---- ok +-STATEMENT CREATE (t:test {prop: 166167}); +---- ok +-STATEMENT CREATE (t:test {prop: 246647}); +---- ok +-STATEMENT CREATE (t:test {prop: 440923}); +---- ok +-STATEMENT CREATE (t:test {prop: 707747}); +---- ok +-STATEMENT CREATE (t:test {prop: 736234}); +---- ok +-STATEMENT CREATE (t:test {prop: 419394}); +---- ok +-STATEMENT CREATE (t:test {prop: 774241}); +---- ok +-STATEMENT CREATE (t:test {prop: 415502}); +---- ok +-STATEMENT CREATE (t:test {prop: 912756}); +---- ok +-STATEMENT CREATE (t:test {prop: 866752}); +---- ok +-STATEMENT CREATE (t:test {prop: 851733}); +---- ok +-STATEMENT CREATE (t:test {prop: 264658}); +---- ok +-STATEMENT CREATE (t:test {prop: 162339}); +---- ok +-STATEMENT CREATE (t:test {prop: 473957}); +---- ok +-STATEMENT CREATE (t:test {prop: 322014}); +---- ok +-STATEMENT CREATE (t:test {prop: 468092}); +---- ok +-STATEMENT CREATE (t:test {prop: 426217}); +---- ok +-STATEMENT CREATE (t:test {prop: 805721}); +---- ok +-STATEMENT CREATE (t:test {prop: 620400}); +---- ok +-STATEMENT CREATE (t:test {prop: 961360}); +---- ok +-STATEMENT CREATE (t:test {prop: 50852}); +---- ok +-STATEMENT CREATE (t:test {prop: 409607}); +---- ok +-STATEMENT CREATE (t:test {prop: 702290}); +---- ok +-STATEMENT CREATE (t:test {prop: 47283}); +---- ok +-STATEMENT CREATE (t:test {prop: 397128}); +---- ok +-STATEMENT CREATE (t:test {prop: 73391}); +---- ok +-STATEMENT CREATE (t:test {prop: 839245}); +---- ok +-STATEMENT CREATE (t:test {prop: 688791}); +---- ok +-STATEMENT CREATE (t:test {prop: 746362}); +---- ok +-STATEMENT CREATE (t:test {prop: 91131}); +---- ok +-STATEMENT CREATE (t:test {prop: 25914}); +---- ok +-STATEMENT CREATE (t:test {prop: 423080}); +---- ok +-STATEMENT CREATE (t:test {prop: 452983}); +---- ok +-STATEMENT CREATE (t:test {prop: 573891}); +---- ok +-STATEMENT CREATE (t:test {prop: 87031}); +---- ok +-STATEMENT CREATE (t:test {prop: 194141}); +---- ok +-STATEMENT CREATE (t:test {prop: 410480}); +---- ok +-STATEMENT CREATE (t:test {prop: 21215}); +---- ok +-STATEMENT CREATE (t:test {prop: 706498}); +---- ok +-STATEMENT CREATE (t:test {prop: 401463}); +---- ok +-STATEMENT CREATE (t:test {prop: 538903}); +---- ok +-STATEMENT CREATE (t:test {prop: 175017}); +---- ok +-STATEMENT CREATE (t:test {prop: 823412}); +---- ok +-STATEMENT CREATE (t:test {prop: 960392}); +---- ok +-STATEMENT CREATE (t:test {prop: 461902}); +---- ok +-STATEMENT CREATE (t:test {prop: 152232}); +---- ok +-STATEMENT CREATE (t:test {prop: 933141}); +---- ok +-STATEMENT CREATE (t:test {prop: 726747}); +---- ok +-STATEMENT CREATE (t:test {prop: 334210}); +---- ok +-STATEMENT CREATE (t:test {prop: 462302}); +---- ok +-STATEMENT CREATE (t:test {prop: 627435}); +---- ok +-STATEMENT CREATE (t:test {prop: 970800}); +---- ok +-STATEMENT CREATE (t:test {prop: 116005}); +---- ok +-STATEMENT CREATE (t:test {prop: 506337}); +---- ok +-STATEMENT CREATE (t:test {prop: 26350}); +---- ok +-STATEMENT CREATE (t:test {prop: 679923}); +---- ok +-STATEMENT CREATE (t:test {prop: 716902}); +---- ok +-STATEMENT CREATE (t:test {prop: 418299}); +---- ok +-STATEMENT CREATE (t:test {prop: 385708}); +---- ok +-STATEMENT CREATE (t:test {prop: 496654}); +---- ok +-STATEMENT CREATE (t:test {prop: 552958}); +---- ok +-STATEMENT CREATE (t:test {prop: 927838}); +---- ok +-STATEMENT CREATE (t:test {prop: 480255}); +---- ok +-STATEMENT CREATE (t:test {prop: 477534}); +---- ok +-STATEMENT CREATE (t:test {prop: 774172}); +---- ok +-STATEMENT CREATE (t:test {prop: 41201}); +---- ok +-STATEMENT CREATE (t:test {prop: 258885}); +---- ok +-STATEMENT CREATE (t:test {prop: 555996}); +---- ok +-STATEMENT CREATE (t:test {prop: 96059}); +---- ok +-STATEMENT CREATE (t:test {prop: 465889}); +---- ok +-STATEMENT CREATE (t:test {prop: 809313}); +---- ok +-STATEMENT CREATE (t:test {prop: 146110}); +---- ok +-STATEMENT CREATE (t:test {prop: 639291}); +---- ok +-STATEMENT CREATE (t:test {prop: 207979}); +---- ok +-STATEMENT CREATE (t:test {prop: 492230}); +---- ok +-STATEMENT CREATE (t:test {prop: 919068}); +---- ok +-STATEMENT CREATE (t:test {prop: 467336}); +---- ok +-STATEMENT CREATE (t:test {prop: 187212}); +---- ok +-STATEMENT CREATE (t:test {prop: 901474}); +---- ok +-STATEMENT CREATE (t:test {prop: 312342}); +---- ok +-STATEMENT CREATE (t:test {prop: 323075}); +---- ok +-STATEMENT CREATE (t:test {prop: 513924}); +---- ok +-STATEMENT CREATE (t:test {prop: 284763}); +---- ok +-STATEMENT CREATE (t:test {prop: 655793}); +---- ok +-STATEMENT CREATE (t:test {prop: 884655}); +---- ok +-STATEMENT CREATE (t:test {prop: 522427}); +---- ok +-STATEMENT CREATE (t:test {prop: 324224}); +---- ok +-STATEMENT CREATE (t:test {prop: 172093}); +---- ok +-STATEMENT CREATE (t:test {prop: 867685}); +---- ok +-STATEMENT CREATE (t:test {prop: 283154}); +---- ok +-STATEMENT CREATE (t:test {prop: 58102}); +---- ok +-STATEMENT CREATE (t:test {prop: 439047}); +---- ok +-STATEMENT CREATE (t:test {prop: 337401}); +---- ok +-STATEMENT CREATE (t:test {prop: 77337}); +---- ok +-STATEMENT CREATE (t:test {prop: 323450}); +---- ok +-STATEMENT CREATE (t:test {prop: 434185}); +---- ok +-STATEMENT CREATE (t:test {prop: 884948}); +---- ok +-STATEMENT CREATE (t:test {prop: 116021}); +---- ok +-STATEMENT CREATE (t:test {prop: 464596}); +---- ok +-STATEMENT CREATE (t:test {prop: 115735}); +---- ok +-STATEMENT CREATE (t:test {prop: 842982}); +---- ok +-STATEMENT CREATE (t:test {prop: 800802}); +---- ok +-STATEMENT CREATE (t:test {prop: 868138}); +---- ok +-STATEMENT CREATE (t:test {prop: 727713}); +---- ok +-STATEMENT CREATE (t:test {prop: 252362}); +---- ok +-STATEMENT CREATE (t:test {prop: 362015}); +---- ok +-STATEMENT CREATE (t:test {prop: 232021}); +---- ok +-STATEMENT CREATE (t:test {prop: 564579}); +---- ok +-STATEMENT CREATE (t:test {prop: 70254}); +---- ok +-STATEMENT CREATE (t:test {prop: 588455}); +---- ok +-STATEMENT CREATE (t:test {prop: 576462}); +---- ok +-STATEMENT CREATE (t:test {prop: 477212}); +---- ok +-STATEMENT CREATE (t:test {prop: 114597}); +---- ok +-STATEMENT CREATE (t:test {prop: 713110}); +---- ok +-STATEMENT CREATE (t:test {prop: 334661}); +---- ok +-STATEMENT CREATE (t:test {prop: 206557}); +---- ok +-STATEMENT CREATE (t:test {prop: 532503}); +---- ok +-STATEMENT CREATE (t:test {prop: 676365}); +---- ok +-STATEMENT CREATE (t:test {prop: 305205}); +---- ok +-STATEMENT CREATE (t:test {prop: 132263}); +---- ok +-STATEMENT CREATE (t:test {prop: 589105}); +---- ok +-STATEMENT CREATE (t:test {prop: 845937}); +---- ok +-STATEMENT CREATE (t:test {prop: 293574}); +---- ok +-STATEMENT CREATE (t:test {prop: 792747}); +---- ok +-STATEMENT CREATE (t:test {prop: 870357}); +---- ok +-STATEMENT CREATE (t:test {prop: 68757}); +---- ok +-STATEMENT CREATE (t:test {prop: 201972}); +---- ok +-STATEMENT CREATE (t:test {prop: 956888}); +---- ok +-STATEMENT CREATE (t:test {prop: 741753}); +---- ok +-STATEMENT CREATE (t:test {prop: 931681}); +---- ok +-STATEMENT CREATE (t:test {prop: 782555}); +---- ok +-STATEMENT CREATE (t:test {prop: 373705}); +---- ok +-STATEMENT CREATE (t:test {prop: 965362}); +---- ok +-STATEMENT CREATE (t:test {prop: 824856}); +---- ok +-STATEMENT CREATE (t:test {prop: 314089}); +---- ok +-STATEMENT CREATE (t:test {prop: 544792}); +---- ok +-STATEMENT CREATE (t:test {prop: 436759}); +---- ok +-STATEMENT CREATE (t:test {prop: 215637}); +---- ok +-STATEMENT CREATE (t:test {prop: 311947}); +---- ok +-STATEMENT CREATE (t:test {prop: 48160}); +---- ok +-STATEMENT CREATE (t:test {prop: 445202}); +---- ok +-STATEMENT CREATE (t:test {prop: 598375}); +---- ok +-STATEMENT CREATE (t:test {prop: 825658}); +---- ok +-STATEMENT CREATE (t:test {prop: 879361}); +---- ok +-STATEMENT CREATE (t:test {prop: 543097}); +---- ok +-STATEMENT CREATE (t:test {prop: 673889}); +---- ok +-STATEMENT CREATE (t:test {prop: 851133}); +---- ok +-STATEMENT CREATE (t:test {prop: 604566}); +---- ok +-STATEMENT CREATE (t:test {prop: 214266}); +---- ok +-STATEMENT CREATE (t:test {prop: 959289}); +---- ok +-STATEMENT CREATE (t:test {prop: 409690}); +---- ok +-STATEMENT CREATE (t:test {prop: 758470}); +---- ok +-STATEMENT CREATE (t:test {prop: 687793}); +---- ok +-STATEMENT CREATE (t:test {prop: 904689}); +---- ok +-STATEMENT CREATE (t:test {prop: 922894}); +---- ok +-STATEMENT CREATE (t:test {prop: 18519}); +---- ok +-STATEMENT CREATE (t:test {prop: 646024}); +---- ok +-STATEMENT CREATE (t:test {prop: 987166}); +---- ok +-STATEMENT CREATE (t:test {prop: 981786}); +---- ok +-STATEMENT CREATE (t:test {prop: 837675}); +---- ok +-STATEMENT CREATE (t:test {prop: 10566}); +---- ok +-STATEMENT CREATE (t:test {prop: 194596}); +---- ok +-STATEMENT CREATE (t:test {prop: 795067}); +---- ok +-STATEMENT CREATE (t:test {prop: 345714}); +---- ok +-STATEMENT CREATE (t:test {prop: 282336}); +---- ok +-STATEMENT CREATE (t:test {prop: 994366}); +---- ok +-STATEMENT CREATE (t:test {prop: 530807}); +---- ok +-STATEMENT CREATE (t:test {prop: 934961}); +---- ok +-STATEMENT CREATE (t:test {prop: 691533}); +---- ok +-STATEMENT CREATE (t:test {prop: 854029}); +---- ok +-STATEMENT CREATE (t:test {prop: 966584}); +---- ok +-STATEMENT CREATE (t:test {prop: 871832}); +---- ok +-STATEMENT CREATE (t:test {prop: 38452}); +---- ok +-STATEMENT CREATE (t:test {prop: 97421}); +---- ok +-STATEMENT CREATE (t:test {prop: 534728}); +---- ok +-STATEMENT CREATE (t:test {prop: 4740}); +---- ok +-STATEMENT CREATE (t:test {prop: 428743}); +---- ok +-STATEMENT CREATE (t:test {prop: 415600}); +---- ok +-STATEMENT CREATE (t:test {prop: 850986}); +---- ok +-STATEMENT CREATE (t:test {prop: 25578}); +---- ok +-STATEMENT CREATE (t:test {prop: 39848}); +---- ok +-STATEMENT CREATE (t:test {prop: 64219}); +---- ok +-STATEMENT CREATE (t:test {prop: 87973}); +---- ok +-STATEMENT CREATE (t:test {prop: 104624}); +---- ok +-STATEMENT CREATE (t:test {prop: 348205}); +---- ok +-STATEMENT CREATE (t:test {prop: 568123}); +---- ok +-STATEMENT CREATE (t:test {prop: 289482}); +---- ok +-STATEMENT CREATE (t:test {prop: 491693}); +---- ok +-STATEMENT CREATE (t:test {prop: 561056}); +---- ok +-STATEMENT CREATE (t:test {prop: 597014}); +---- ok +-STATEMENT CREATE (t:test {prop: 856678}); +---- ok +-STATEMENT CREATE (t:test {prop: 563188}); +---- ok +-STATEMENT CREATE (t:test {prop: 70866}); +---- ok +-STATEMENT CREATE (t:test {prop: 280809}); +---- ok +-STATEMENT CREATE (t:test {prop: 437524}); +---- ok +-STATEMENT CREATE (t:test {prop: 416144}); +---- ok +-STATEMENT CREATE (t:test {prop: 129404}); +---- ok +-STATEMENT CREATE (t:test {prop: 826959}); +---- ok +-STATEMENT CREATE (t:test {prop: 634236}); +---- ok +-STATEMENT CREATE (t:test {prop: 558360}); +---- ok +-STATEMENT CREATE (t:test {prop: 562343}); +---- ok +-STATEMENT CREATE (t:test {prop: 182199}); +---- ok +-STATEMENT CREATE (t:test {prop: 137958}); +---- ok +-STATEMENT CREATE (t:test {prop: 835589}); +---- ok +-STATEMENT CREATE (t:test {prop: 727412}); +---- ok +-STATEMENT CREATE (t:test {prop: 622046}); +---- ok +-STATEMENT CREATE (t:test {prop: 178736}); +---- ok +-STATEMENT CREATE (t:test {prop: 665135}); +---- ok +-STATEMENT CREATE (t:test {prop: 165349}); +---- ok +-STATEMENT CREATE (t:test {prop: 594759}); +---- ok +-STATEMENT CREATE (t:test {prop: 814149}); +---- ok +-STATEMENT CREATE (t:test {prop: 944853}); +---- ok +-STATEMENT CREATE (t:test {prop: 137653}); +---- ok +-STATEMENT CREATE (t:test {prop: 638096}); +---- ok +-STATEMENT CREATE (t:test {prop: 409076}); +---- ok +-STATEMENT CREATE (t:test {prop: 758846}); +---- ok +-STATEMENT CREATE (t:test {prop: 874578}); +---- ok +-STATEMENT CREATE (t:test {prop: 112897}); +---- ok +-STATEMENT CREATE (t:test {prop: 517085}); +---- ok +-STATEMENT CREATE (t:test {prop: 907319}); +---- ok +-STATEMENT CREATE (t:test {prop: 338580}); +---- ok +-STATEMENT CREATE (t:test {prop: 323239}); +---- ok +-STATEMENT CREATE (t:test {prop: 97181}); +---- ok +-STATEMENT CREATE (t:test {prop: 604317}); +---- ok +-STATEMENT CREATE (t:test {prop: 633819}); +---- ok +-STATEMENT CREATE (t:test {prop: 399069}); +---- ok +-STATEMENT CREATE (t:test {prop: 656691}); +---- ok +-STATEMENT CREATE (t:test {prop: 242619}); +---- ok +-STATEMENT CREATE (t:test {prop: 939636}); +---- ok +-STATEMENT CREATE (t:test {prop: 383065}); +---- ok +-STATEMENT CREATE (t:test {prop: 979897}); +---- ok +-STATEMENT CREATE (t:test {prop: 337800}); +---- ok +-STATEMENT CREATE (t:test {prop: 777964}); +---- ok +-STATEMENT CREATE (t:test {prop: 957376}); +---- ok +-STATEMENT CREATE (t:test {prop: 903091}); +---- ok +-STATEMENT CREATE (t:test {prop: 921178}); +---- ok +-STATEMENT CREATE (t:test {prop: 597182}); +---- ok +-STATEMENT CREATE (t:test {prop: 861012}); +---- ok +-STATEMENT CREATE (t:test {prop: 824959}); +---- ok +-STATEMENT CREATE (t:test {prop: 957959}); +---- ok +-STATEMENT CREATE (t:test {prop: 642601}); +---- ok +-STATEMENT CREATE (t:test {prop: 66140}); +---- ok +-STATEMENT CREATE (t:test {prop: 254501}); +---- ok +-STATEMENT CREATE (t:test {prop: 123832}); +---- ok +-STATEMENT CREATE (t:test {prop: 987284}); +---- ok +-STATEMENT CREATE (t:test {prop: 599230}); +---- ok +-STATEMENT CREATE (t:test {prop: 628761}); +---- ok +-STATEMENT CREATE (t:test {prop: 545260}); +---- ok +-STATEMENT CREATE (t:test {prop: 540521}); +---- ok +-STATEMENT CREATE (t:test {prop: 376946}); +---- ok +-STATEMENT CREATE (t:test {prop: 842985}); +---- ok +-STATEMENT CREATE (t:test {prop: 529260}); +---- ok +-STATEMENT CREATE (t:test {prop: 725641}); +---- ok +-STATEMENT CREATE (t:test {prop: 514508}); +---- ok +-STATEMENT CREATE (t:test {prop: 12820}); +---- ok +-STATEMENT CREATE (t:test {prop: 684006}); +---- ok +-STATEMENT CREATE (t:test {prop: 950759}); +---- ok +-STATEMENT CREATE (t:test {prop: 773474}); +---- ok +-STATEMENT CREATE (t:test {prop: 523005}); +---- ok +-STATEMENT CREATE (t:test {prop: 734552}); +---- ok +-STATEMENT CREATE (t:test {prop: 251969}); +---- ok +-STATEMENT CREATE (t:test {prop: 702376}); +---- ok +-STATEMENT CREATE (t:test {prop: 635497}); +---- ok +-STATEMENT CREATE (t:test {prop: 253524}); +---- ok +-STATEMENT CREATE (t:test {prop: 448988}); +---- ok +-STATEMENT CREATE (t:test {prop: 626045}); +---- ok +-STATEMENT CREATE (t:test {prop: 365346}); +---- ok +-STATEMENT CREATE (t:test {prop: 237126}); +---- ok +-STATEMENT CREATE (t:test {prop: 401934}); +---- ok +-STATEMENT CREATE (t:test {prop: 638803}); +---- ok +-STATEMENT CREATE (t:test {prop: 999970}); +---- ok +-STATEMENT CREATE (t:test {prop: 536958}); +---- ok +-STATEMENT CREATE (t:test {prop: 203597}); +---- ok +-STATEMENT CREATE (t:test {prop: 740245}); +---- ok +-STATEMENT CREATE (t:test {prop: 548677}); +---- ok +-STATEMENT CREATE (t:test {prop: 403516}); +---- ok +-STATEMENT CREATE (t:test {prop: 479687}); +---- ok +-STATEMENT CREATE (t:test {prop: 947202}); +---- ok +-STATEMENT CREATE (t:test {prop: 61539}); +---- ok +-STATEMENT CREATE (t:test {prop: 677888}); +---- ok +-STATEMENT CREATE (t:test {prop: 568675}); +---- ok +-STATEMENT CREATE (t:test {prop: 498645}); +---- ok +-STATEMENT CREATE (t:test {prop: 590727}); +---- ok +-STATEMENT CREATE (t:test {prop: 644529}); +---- ok +-STATEMENT CREATE (t:test {prop: 723264}); +---- ok +-STATEMENT CREATE (t:test {prop: 487142}); +---- ok +-STATEMENT CREATE (t:test {prop: 611960}); +---- ok +-STATEMENT CREATE (t:test {prop: 690811}); +---- ok +-STATEMENT CREATE (t:test {prop: 262536}); +---- ok +-STATEMENT CREATE (t:test {prop: 280876}); +---- ok +-STATEMENT CREATE (t:test {prop: 109733}); +---- ok +-STATEMENT CREATE (t:test {prop: 902749}); +---- ok +-STATEMENT CREATE (t:test {prop: 829355}); +---- ok +-STATEMENT CREATE (t:test {prop: 544856}); +---- ok +-STATEMENT CREATE (t:test {prop: 894212}); +---- ok +-STATEMENT CREATE (t:test {prop: 886836}); +---- ok +-STATEMENT CREATE (t:test {prop: 305723}); +---- ok +-STATEMENT CREATE (t:test {prop: 782978}); +---- ok +-STATEMENT CREATE (t:test {prop: 398908}); +---- ok +-STATEMENT CREATE (t:test {prop: 449654}); +---- ok +-STATEMENT CREATE (t:test {prop: 815077}); +---- ok +-STATEMENT CREATE (t:test {prop: 504336}); +---- ok +-STATEMENT CREATE (t:test {prop: 504817}); +---- ok +-STATEMENT CREATE (t:test {prop: 475080}); +---- ok +-STATEMENT CREATE (t:test {prop: 801503}); +---- ok +-STATEMENT CREATE (t:test {prop: 736708}); +---- ok +-STATEMENT CREATE (t:test {prop: 950818}); +---- ok +-STATEMENT CREATE (t:test {prop: 887947}); +---- ok +-STATEMENT CREATE (t:test {prop: 447909}); +---- ok +-STATEMENT CREATE (t:test {prop: 25105}); +---- ok +-STATEMENT CREATE (t:test {prop: 259140}); +---- ok +-STATEMENT CREATE (t:test {prop: 285432}); +---- ok +-STATEMENT CREATE (t:test {prop: 812605}); +---- ok +-STATEMENT CREATE (t:test {prop: 181612}); +---- ok +-STATEMENT CREATE (t:test {prop: 711455}); +---- ok +-STATEMENT CREATE (t:test {prop: 254020}); +---- ok +-STATEMENT CREATE (t:test {prop: 443808}); +---- ok +-STATEMENT CREATE (t:test {prop: 128276}); +---- ok +-STATEMENT CREATE (t:test {prop: 426253}); +---- ok +-STATEMENT CREATE (t:test {prop: 626150}); +---- ok +-STATEMENT CREATE (t:test {prop: 542562}); +---- ok +-STATEMENT CREATE (t:test {prop: 835372}); +---- ok +-STATEMENT CREATE (t:test {prop: 659388}); +---- ok +-STATEMENT CREATE (t:test {prop: 730847}); +---- ok +-STATEMENT CREATE (t:test {prop: 465907}); +---- ok +-STATEMENT CREATE (t:test {prop: 359958}); +---- ok +-STATEMENT CREATE (t:test {prop: 863686}); +---- ok +-STATEMENT CREATE (t:test {prop: 887075}); +---- ok +-STATEMENT CREATE (t:test {prop: 712289}); +---- ok +-STATEMENT CREATE (t:test {prop: 373749}); +---- ok +-STATEMENT CREATE (t:test {prop: 463961}); +---- ok +-STATEMENT CREATE (t:test {prop: 56664}); +---- ok +-STATEMENT CREATE (t:test {prop: 323964}); +---- ok +-STATEMENT CREATE (t:test {prop: 117209}); +---- ok +-STATEMENT CREATE (t:test {prop: 421426}); +---- ok +-STATEMENT CREATE (t:test {prop: 923749}); +---- ok +-STATEMENT CREATE (t:test {prop: 854313}); +---- ok +-STATEMENT CREATE (t:test {prop: 83036}); +---- ok +-STATEMENT CREATE (t:test {prop: 306496}); +---- ok +-STATEMENT CREATE (t:test {prop: 649255}); +---- ok +-STATEMENT CREATE (t:test {prop: 244072}); +---- ok +-STATEMENT CREATE (t:test {prop: 507398}); +---- ok +-STATEMENT CREATE (t:test {prop: 212679}); +---- ok +-STATEMENT CREATE (t:test {prop: 368425}); +---- ok +-STATEMENT CREATE (t:test {prop: 176111}); +---- ok +-STATEMENT CREATE (t:test {prop: 169668}); +---- ok +-STATEMENT CREATE (t:test {prop: 14520}); +---- ok +-STATEMENT CREATE (t:test {prop: 279263}); +---- ok +-STATEMENT CREATE (t:test {prop: 637710}); +---- ok +-STATEMENT CREATE (t:test {prop: 16096}); +---- ok +-STATEMENT CREATE (t:test {prop: 198729}); +---- ok +-STATEMENT CREATE (t:test {prop: 829091}); +---- ok +-STATEMENT CREATE (t:test {prop: 477129}); +---- ok +-STATEMENT CREATE (t:test {prop: 335041}); +---- ok +-STATEMENT CREATE (t:test {prop: 939841}); +---- ok +-STATEMENT CREATE (t:test {prop: 346892}); +---- ok +-STATEMENT CREATE (t:test {prop: 674817}); +---- ok +-STATEMENT CREATE (t:test {prop: 289696}); +---- ok +-STATEMENT CREATE (t:test {prop: 397687}); +---- ok +-STATEMENT CREATE (t:test {prop: 107396}); +---- ok +-STATEMENT CREATE (t:test {prop: 10428}); +---- ok +-STATEMENT CREATE (t:test {prop: 337515}); +---- ok +-STATEMENT CREATE (t:test {prop: 286226}); +---- ok +-STATEMENT CREATE (t:test {prop: 487644}); +---- ok +-STATEMENT CREATE (t:test {prop: 728582}); +---- ok +-STATEMENT CREATE (t:test {prop: 306058}); +---- ok +-STATEMENT CREATE (t:test {prop: 339249}); +---- ok +-STATEMENT CREATE (t:test {prop: 280639}); +---- ok +-STATEMENT CREATE (t:test {prop: 434812}); +---- ok +-STATEMENT CREATE (t:test {prop: 34961}); +---- ok +-STATEMENT CREATE (t:test {prop: 418393}); +---- ok +-STATEMENT CREATE (t:test {prop: 375972}); +---- ok +-STATEMENT CREATE (t:test {prop: 487410}); +---- ok +-STATEMENT CREATE (t:test {prop: 62163}); +---- ok +-STATEMENT CREATE (t:test {prop: 646610}); +---- ok +-STATEMENT CREATE (t:test {prop: 648950}); +---- ok +-STATEMENT CREATE (t:test {prop: 699131}); +---- ok +-STATEMENT CREATE (t:test {prop: 169509}); +---- ok +-STATEMENT CREATE (t:test {prop: 324898}); +---- ok +-STATEMENT CREATE (t:test {prop: 269107}); +---- ok +-STATEMENT CREATE (t:test {prop: 414462}); +---- ok +-STATEMENT CREATE (t:test {prop: 932661}); +---- ok +-STATEMENT CREATE (t:test {prop: 685216}); +---- ok +-STATEMENT CREATE (t:test {prop: 14073}); +---- ok +-STATEMENT CREATE (t:test {prop: 801065}); +---- ok +-STATEMENT CREATE (t:test {prop: 883336}); +---- ok +-STATEMENT CREATE (t:test {prop: 303301}); +---- ok +-STATEMENT CREATE (t:test {prop: 320469}); +---- ok +-STATEMENT CREATE (t:test {prop: 27624}); +---- ok +-STATEMENT CREATE (t:test {prop: 727923}); +---- ok +-STATEMENT CREATE (t:test {prop: 583474}); +---- ok +-STATEMENT CREATE (t:test {prop: 623520}); +---- ok +-STATEMENT CREATE (t:test {prop: 467990}); +---- ok +-STATEMENT CREATE (t:test {prop: 546692}); +---- ok +-STATEMENT CREATE (t:test {prop: 92126}); +---- ok +-STATEMENT CREATE (t:test {prop: 393468}); +---- ok +-STATEMENT CREATE (t:test {prop: 360357}); +---- ok +-STATEMENT CREATE (t:test {prop: 793288}); +---- ok +-STATEMENT CREATE (t:test {prop: 623946}); +---- ok +-STATEMENT CREATE (t:test {prop: 402111}); +---- ok +-STATEMENT CREATE (t:test {prop: 859398}); +---- ok +-STATEMENT CREATE (t:test {prop: 288968}); +---- ok +-STATEMENT CREATE (t:test {prop: 378695}); +---- ok +-STATEMENT CREATE (t:test {prop: 737853}); +---- ok +-STATEMENT CREATE (t:test {prop: 987206}); +---- ok +-STATEMENT CREATE (t:test {prop: 119035}); +---- ok +-STATEMENT CREATE (t:test {prop: 36662}); +---- ok +-STATEMENT CREATE (t:test {prop: 913847}); +---- ok +-STATEMENT CREATE (t:test {prop: 401365}); +---- ok +-STATEMENT CREATE (t:test {prop: 728145}); +---- ok +-STATEMENT CREATE (t:test {prop: 473138}); +---- ok +-STATEMENT CREATE (t:test {prop: 563741}); +---- ok +-STATEMENT CREATE (t:test {prop: 524006}); +---- ok +-STATEMENT CREATE (t:test {prop: 199594}); +---- ok +-STATEMENT CREATE (t:test {prop: 168380}); +---- ok +-STATEMENT CREATE (t:test {prop: 169586}); +---- ok +-STATEMENT CREATE (t:test {prop: 756167}); +---- ok +-STATEMENT CREATE (t:test {prop: 784157}); +---- ok +-STATEMENT CREATE (t:test {prop: 158250}); +---- ok +-STATEMENT CREATE (t:test {prop: 494790}); +---- ok +-STATEMENT CREATE (t:test {prop: 149213}); +---- ok +-STATEMENT CREATE (t:test {prop: 622319}); +---- ok +-STATEMENT CREATE (t:test {prop: 944810}); +---- ok +-STATEMENT CREATE (t:test {prop: 342944}); +---- ok +-STATEMENT CREATE (t:test {prop: 459362}); +---- ok +-STATEMENT CREATE (t:test {prop: 229484}); +---- ok +-STATEMENT CREATE (t:test {prop: 917750}); +---- ok +-STATEMENT CREATE (t:test {prop: 829341}); +---- ok +-STATEMENT CREATE (t:test {prop: 373863}); +---- ok +-STATEMENT CREATE (t:test {prop: 996571}); +---- ok +-STATEMENT CREATE (t:test {prop: 936865}); +---- ok +-STATEMENT CREATE (t:test {prop: 117341}); +---- ok +-STATEMENT CREATE (t:test {prop: 89840}); +---- ok +-STATEMENT CREATE (t:test {prop: 584878}); +---- ok +-STATEMENT CREATE (t:test {prop: 963264}); +---- ok +-STATEMENT CREATE (t:test {prop: 35876}); +---- ok +-STATEMENT CREATE (t:test {prop: 790269}); +---- ok +-STATEMENT CREATE (t:test {prop: 689318}); +---- ok +-STATEMENT CREATE (t:test {prop: 466514}); +---- ok +-STATEMENT CREATE (t:test {prop: 207648}); +---- ok +-STATEMENT CREATE (t:test {prop: 878515}); +---- ok +-STATEMENT CREATE (t:test {prop: 873148}); +---- ok +-STATEMENT CREATE (t:test {prop: 282336}); +---- ok +-STATEMENT CREATE (t:test {prop: 661977}); +---- ok +-STATEMENT CREATE (t:test {prop: 601447}); +---- ok +-STATEMENT CREATE (t:test {prop: 423923}); +---- ok +-STATEMENT CREATE (t:test {prop: 493758}); +---- ok +-STATEMENT CREATE (t:test {prop: 97248}); +---- ok +-STATEMENT CREATE (t:test {prop: 188544}); +---- ok +-STATEMENT CREATE (t:test {prop: 661029}); +---- ok +-STATEMENT CREATE (t:test {prop: 177454}); +---- ok +-STATEMENT CREATE (t:test {prop: 846594}); +---- ok +-STATEMENT CREATE (t:test {prop: 917765}); +---- ok +-STATEMENT CREATE (t:test {prop: 430198}); +---- ok +-STATEMENT CREATE (t:test {prop: 472782}); +---- ok +-STATEMENT CREATE (t:test {prop: 277496}); +---- ok +-STATEMENT CREATE (t:test {prop: 892947}); +---- ok +-STATEMENT CREATE (t:test {prop: 350680}); +---- ok +-STATEMENT CREATE (t:test {prop: 192537}); +---- ok +-STATEMENT CREATE (t:test {prop: 604275}); +---- ok +-STATEMENT CREATE (t:test {prop: 385010}); +---- ok +-STATEMENT CREATE (t:test {prop: 800777}); +---- ok +-STATEMENT CREATE (t:test {prop: 789539}); +---- ok +-STATEMENT CREATE (t:test {prop: 316219}); +---- ok +-STATEMENT CREATE (t:test {prop: 914284}); +---- ok +-STATEMENT CREATE (t:test {prop: 109671}); +---- ok +-STATEMENT CREATE (t:test {prop: 603698}); +---- ok +-STATEMENT CREATE (t:test {prop: 151788}); +---- ok +-STATEMENT CREATE (t:test {prop: 580370}); +---- ok +-STATEMENT CREATE (t:test {prop: 966356}); +---- ok +-STATEMENT CREATE (t:test {prop: 447462}); +---- ok +-STATEMENT CREATE (t:test {prop: 945952}); +---- ok +-STATEMENT CREATE (t:test {prop: 308910}); +---- ok +-STATEMENT CREATE (t:test {prop: 323157}); +---- ok +-STATEMENT CREATE (t:test {prop: 782356}); +---- ok +-STATEMENT CREATE (t:test {prop: 619997}); +---- ok +-STATEMENT CREATE (t:test {prop: 83642}); +---- ok +-STATEMENT CREATE (t:test {prop: 374130}); +---- ok +-STATEMENT CREATE (t:test {prop: 678027}); +---- ok +-STATEMENT CREATE (t:test {prop: 208642}); +---- ok +-STATEMENT CREATE (t:test {prop: 180867}); +---- ok +-STATEMENT CREATE (t:test {prop: 503995}); +---- ok +-STATEMENT CREATE (t:test {prop: 52282}); +---- ok +-STATEMENT CREATE (t:test {prop: 463868}); +---- ok +-STATEMENT CREATE (t:test {prop: 533871}); +---- ok +-STATEMENT CREATE (t:test {prop: 609757}); +---- ok +-STATEMENT CREATE (t:test {prop: 766928}); +---- ok +-STATEMENT CREATE (t:test {prop: 42696}); +---- ok +-STATEMENT CREATE (t:test {prop: 534012}); +---- ok +-STATEMENT CREATE (t:test {prop: 556457}); +---- ok +-STATEMENT CREATE (t:test {prop: 947047}); +---- ok +-STATEMENT CREATE (t:test {prop: 163399}); +---- ok +-STATEMENT CREATE (t:test {prop: 866119}); +---- ok +-STATEMENT CREATE (t:test {prop: 857906}); +---- ok +-STATEMENT CREATE (t:test {prop: 750833}); +---- ok +-STATEMENT CREATE (t:test {prop: 693179}); +---- ok +-STATEMENT CREATE (t:test {prop: 752093}); +---- ok +-STATEMENT CREATE (t:test {prop: 973377}); +---- ok +-STATEMENT CREATE (t:test {prop: 867522}); +---- ok +-STATEMENT CREATE (t:test {prop: 946239}); +---- ok +-STATEMENT CREATE (t:test {prop: 375702}); +---- ok +-STATEMENT CREATE (t:test {prop: 307686}); +---- ok +-STATEMENT CREATE (t:test {prop: 824166}); +---- ok +-STATEMENT CREATE (t:test {prop: 918538}); +---- ok +-STATEMENT CREATE (t:test {prop: 28183}); +---- ok +-STATEMENT CREATE (t:test {prop: 411943}); +---- ok +-STATEMENT CREATE (t:test {prop: 496057}); +---- ok +-STATEMENT CREATE (t:test {prop: 182602}); +---- ok +-STATEMENT CREATE (t:test {prop: 666875}); +---- ok +-STATEMENT CREATE (t:test {prop: 425493}); +---- ok +-STATEMENT CREATE (t:test {prop: 290955}); +---- ok +-STATEMENT CREATE (t:test {prop: 381654}); +---- ok +-STATEMENT CREATE (t:test {prop: 132418}); +---- ok +-STATEMENT CREATE (t:test {prop: 308473}); +---- ok +-STATEMENT CREATE (t:test {prop: 63984}); +---- ok +-STATEMENT CREATE (t:test {prop: 95413}); +---- ok +-STATEMENT CREATE (t:test {prop: 794602}); +---- ok +-STATEMENT CREATE (t:test {prop: 984722}); +---- ok +-STATEMENT CREATE (t:test {prop: 848659}); +---- ok +-STATEMENT CREATE (t:test {prop: 984993}); +---- ok +-STATEMENT CREATE (t:test {prop: 41855}); +---- ok +-STATEMENT CREATE (t:test {prop: 972406}); +---- ok +-STATEMENT CREATE (t:test {prop: 669539}); +---- ok +-STATEMENT CREATE (t:test {prop: 640841}); +---- ok +-STATEMENT CREATE (t:test {prop: 357560}); +---- ok +-STATEMENT CREATE (t:test {prop: 176977}); +---- ok +-STATEMENT CREATE (t:test {prop: 759494}); +---- ok +-STATEMENT CREATE (t:test {prop: 664436}); +---- ok +-STATEMENT CREATE (t:test {prop: 279433}); +---- ok +-STATEMENT CREATE (t:test {prop: 946403}); +---- ok +-STATEMENT CREATE (t:test {prop: 818540}); +---- ok +-STATEMENT CREATE (t:test {prop: 348110}); +---- ok +-STATEMENT CREATE (t:test {prop: 46897}); +---- ok +-STATEMENT CREATE (t:test {prop: 86680}); +---- ok +-STATEMENT CREATE (t:test {prop: 440232}); +---- ok +-STATEMENT CREATE (t:test {prop: 725682}); +---- ok +-STATEMENT CREATE (t:test {prop: 379292}); +---- ok +-STATEMENT CREATE (t:test {prop: 822133}); +---- ok +-STATEMENT CREATE (t:test {prop: 601921}); +---- ok +-STATEMENT CREATE (t:test {prop: 442136}); +---- ok +-STATEMENT CREATE (t:test {prop: 803719}); +---- ok +-STATEMENT CREATE (t:test {prop: 596952}); +---- ok +-STATEMENT CREATE (t:test {prop: 575255}); +---- ok +-STATEMENT CREATE (t:test {prop: 725852}); +---- ok +-STATEMENT CREATE (t:test {prop: 740932}); +---- ok +-STATEMENT CREATE (t:test {prop: 548571}); +---- ok +-STATEMENT CREATE (t:test {prop: 926797}); +---- ok +-STATEMENT CREATE (t:test {prop: 718754}); +---- ok +-STATEMENT CREATE (t:test {prop: 273863}); +---- ok +-STATEMENT CREATE (t:test {prop: 195058}); +---- ok +-STATEMENT CREATE (t:test {prop: 924317}); +---- ok +-STATEMENT CREATE (t:test {prop: 762445}); +---- ok +-STATEMENT CREATE (t:test {prop: 971701}); +---- ok +-STATEMENT CREATE (t:test {prop: 937133}); +---- ok +-STATEMENT CREATE (t:test {prop: 560674}); +---- ok +-STATEMENT CREATE (t:test {prop: 989858}); +---- ok +-STATEMENT CREATE (t:test {prop: 145564}); +---- ok +-STATEMENT CREATE (t:test {prop: 771183}); +---- ok +-STATEMENT CREATE (t:test {prop: 390292}); +---- ok +-STATEMENT CREATE (t:test {prop: 343498}); +---- ok +-STATEMENT CREATE (t:test {prop: 241564}); +---- ok +-STATEMENT CREATE (t:test {prop: 630199}); +---- ok +-STATEMENT CREATE (t:test {prop: 574455}); +---- ok +-STATEMENT CREATE (t:test {prop: 887844}); +---- ok +-STATEMENT CREATE (t:test {prop: 290871}); +---- ok +-STATEMENT CREATE (t:test {prop: 784755}); +---- ok +-STATEMENT CREATE (t:test {prop: 731621}); +---- ok +-STATEMENT CREATE (t:test {prop: 882779}); +---- ok +-STATEMENT CREATE (t:test {prop: 499928}); +---- ok +-STATEMENT CREATE (t:test {prop: 100140}); +---- ok +-STATEMENT CREATE (t:test {prop: 793657}); +---- ok +-STATEMENT CREATE (t:test {prop: 800341}); +---- ok +-STATEMENT CREATE (t:test {prop: 666248}); +---- ok +-STATEMENT CREATE (t:test {prop: 642830}); +---- ok +-STATEMENT CREATE (t:test {prop: 975858}); +---- ok +-STATEMENT CREATE (t:test {prop: 181480}); +---- ok +-STATEMENT CREATE (t:test {prop: 360578}); +---- ok +-STATEMENT CREATE (t:test {prop: 623774}); +---- ok +-STATEMENT CREATE (t:test {prop: 754089}); +---- ok +-STATEMENT CREATE (t:test {prop: 730315}); +---- ok +-STATEMENT CREATE (t:test {prop: 598866}); +---- ok +-STATEMENT CREATE (t:test {prop: 297486}); +---- ok +-STATEMENT CREATE (t:test {prop: 515364}); +---- ok +-STATEMENT CREATE (t:test {prop: 457203}); +---- ok +-STATEMENT CREATE (t:test {prop: 288145}); +---- ok +-STATEMENT CREATE (t:test {prop: 18269}); +---- ok +-STATEMENT CREATE (t:test {prop: 403221}); +---- ok +-STATEMENT CREATE (t:test {prop: 296323}); +---- ok +-STATEMENT CREATE (t:test {prop: 847442}); +---- ok +-STATEMENT CREATE (t:test {prop: 884672}); +---- ok +-STATEMENT CREATE (t:test {prop: 707993}); +---- ok +-STATEMENT CREATE (t:test {prop: 891295}); +---- ok +-STATEMENT CREATE (t:test {prop: 699504}); +---- ok +-STATEMENT CREATE (t:test {prop: 865419}); +---- ok +-STATEMENT CREATE (t:test {prop: 688655}); +---- ok +-STATEMENT CREATE (t:test {prop: 957855}); +---- ok +-STATEMENT CREATE (t:test {prop: 421045}); +---- ok +-STATEMENT CREATE (t:test {prop: 824495}); +---- ok +-STATEMENT CREATE (t:test {prop: 604712}); +---- ok +-STATEMENT CREATE (t:test {prop: 772213}); +---- ok +-STATEMENT CREATE (t:test {prop: 960662}); +---- ok +-STATEMENT CREATE (t:test {prop: 913260}); +---- ok +-STATEMENT CREATE (t:test {prop: 353435}); +---- ok +-STATEMENT CREATE (t:test {prop: 821275}); +---- ok +-STATEMENT CREATE (t:test {prop: 882853}); +---- ok +-STATEMENT CREATE (t:test {prop: 612757}); +---- ok +-STATEMENT CREATE (t:test {prop: 689300}); +---- ok +-STATEMENT CREATE (t:test {prop: 782492}); +---- ok +-STATEMENT CREATE (t:test {prop: 79561}); +---- ok +-STATEMENT CREATE (t:test {prop: 611900}); +---- ok +-STATEMENT CREATE (t:test {prop: 996048}); +---- ok +-STATEMENT CREATE (t:test {prop: 402195}); +---- ok +-STATEMENT CREATE (t:test {prop: 354230}); +---- ok +-STATEMENT CREATE (t:test {prop: 177052}); +---- ok +-STATEMENT CREATE (t:test {prop: 746612}); +---- ok +-STATEMENT CREATE (t:test {prop: 53486}); +---- ok +-STATEMENT CREATE (t:test {prop: 201797}); +---- ok +-STATEMENT CREATE (t:test {prop: 706436}); +---- ok +-STATEMENT CREATE (t:test {prop: 650660}); +---- ok +-STATEMENT CREATE (t:test {prop: 213356}); +---- ok +-STATEMENT CREATE (t:test {prop: 341669}); +---- ok +-STATEMENT CREATE (t:test {prop: 775240}); +---- ok +-STATEMENT CREATE (t:test {prop: 591689}); +---- ok +-STATEMENT CREATE (t:test {prop: 343934}); +---- ok +-STATEMENT CREATE (t:test {prop: 917287}); +---- ok +-STATEMENT CREATE (t:test {prop: 417094}); +---- ok +-STATEMENT CREATE (t:test {prop: 926024}); +---- ok +-STATEMENT CREATE (t:test {prop: 379557}); +---- ok +-STATEMENT CREATE (t:test {prop: 460171}); +---- ok +-STATEMENT CREATE (t:test {prop: 805947}); +---- ok +-STATEMENT CREATE (t:test {prop: 625604}); +---- ok +-STATEMENT CREATE (t:test {prop: 959950}); +---- ok +-STATEMENT CREATE (t:test {prop: 117427}); +---- ok +-STATEMENT CREATE (t:test {prop: 77988}); +---- ok +-STATEMENT CREATE (t:test {prop: 830563}); +---- ok +-STATEMENT CREATE (t:test {prop: 124519}); +---- ok +-STATEMENT CREATE (t:test {prop: 794866}); +---- ok +-STATEMENT CREATE (t:test {prop: 609511}); +---- ok +-STATEMENT CREATE (t:test {prop: 379464}); +---- ok +-STATEMENT CREATE (t:test {prop: 867661}); +---- ok +-STATEMENT CREATE (t:test {prop: 678052}); +---- ok +-STATEMENT CREATE (t:test {prop: 862403}); +---- ok +-STATEMENT CREATE (t:test {prop: 202885}); +---- ok +-STATEMENT CREATE (t:test {prop: 686155}); +---- ok +-STATEMENT CREATE (t:test {prop: 576610}); +---- ok +-STATEMENT CREATE (t:test {prop: 893882}); +---- ok +-STATEMENT CREATE (t:test {prop: 811107}); +---- ok +-STATEMENT CREATE (t:test {prop: 623078}); +---- ok +-STATEMENT CREATE (t:test {prop: 528309}); +---- ok +-STATEMENT CREATE (t:test {prop: 532005}); +---- ok +-STATEMENT CREATE (t:test {prop: 562504}); +---- ok +-STATEMENT CREATE (t:test {prop: 20749}); +---- ok +-STATEMENT CREATE (t:test {prop: 182506}); +---- ok +-STATEMENT CREATE (t:test {prop: 865830}); +---- ok +-STATEMENT CREATE (t:test {prop: 887855}); +---- ok +-STATEMENT CREATE (t:test {prop: 194476}); +---- ok +-STATEMENT CREATE (t:test {prop: 543811}); +---- ok +-STATEMENT CREATE (t:test {prop: 351140}); +---- ok +-STATEMENT CREATE (t:test {prop: 444750}); +---- ok +-STATEMENT CREATE (t:test {prop: 608035}); +---- ok +-STATEMENT CREATE (t:test {prop: 767205}); +---- ok +-STATEMENT CREATE (t:test {prop: 306011}); +---- ok +-STATEMENT CREATE (t:test {prop: 434416}); +---- ok +-STATEMENT CREATE (t:test {prop: 997025}); +---- ok +-STATEMENT CREATE (t:test {prop: 997653}); +---- ok +-STATEMENT CREATE (t:test {prop: 267845}); +---- ok +-STATEMENT CREATE (t:test {prop: 110506}); +---- ok +-STATEMENT CREATE (t:test {prop: 482470}); +---- ok +-STATEMENT CREATE (t:test {prop: 862405}); +---- ok +-STATEMENT CREATE (t:test {prop: 172728}); +---- ok +-STATEMENT CREATE (t:test {prop: 379501}); +---- ok +-STATEMENT CREATE (t:test {prop: 103252}); +---- ok +-STATEMENT CREATE (t:test {prop: 375060}); +---- ok +-STATEMENT CREATE (t:test {prop: 736589}); +---- ok +-STATEMENT CREATE (t:test {prop: 382796}); +---- ok +-STATEMENT CREATE (t:test {prop: 416407}); +---- ok +-STATEMENT CREATE (t:test {prop: 925164}); +---- ok +-STATEMENT CREATE (t:test {prop: 898972}); +---- ok +-STATEMENT CREATE (t:test {prop: 274836}); +---- ok +-STATEMENT CREATE (t:test {prop: 333660}); +---- ok +-STATEMENT CREATE (t:test {prop: 944898}); +---- ok +-STATEMENT CREATE (t:test {prop: 807119}); +---- ok +-STATEMENT CREATE (t:test {prop: 746836}); +---- ok +-STATEMENT CREATE (t:test {prop: 566272}); +---- ok +-STATEMENT CREATE (t:test {prop: 226547}); +---- ok +-STATEMENT CREATE (t:test {prop: 958053}); +---- ok +-STATEMENT CREATE (t:test {prop: 14994}); +---- ok +-STATEMENT CREATE (t:test {prop: 454955}); +---- ok +-STATEMENT CREATE (t:test {prop: 678624}); +---- ok +-STATEMENT CREATE (t:test {prop: 731055}); +---- ok +-STATEMENT CREATE (t:test {prop: 618740}); +---- ok +-STATEMENT CREATE (t:test {prop: 734344}); +---- ok +-STATEMENT CREATE (t:test {prop: 181260}); +---- ok +-STATEMENT CREATE (t:test {prop: 260403}); +---- ok +-STATEMENT CREATE (t:test {prop: 109624}); +---- ok +-STATEMENT CREATE (t:test {prop: 339293}); +---- ok +-STATEMENT CREATE (t:test {prop: 614183}); +---- ok +-STATEMENT CREATE (t:test {prop: 469785}); +---- ok +-STATEMENT CREATE (t:test {prop: 806549}); +---- ok +-STATEMENT CREATE (t:test {prop: 444817}); +---- ok +-STATEMENT CREATE (t:test {prop: 20529}); +---- ok +-STATEMENT CREATE (t:test {prop: 519104}); +---- ok +-STATEMENT CREATE (t:test {prop: 282361}); +---- ok +-STATEMENT CREATE (t:test {prop: 731859}); +---- ok +-STATEMENT CREATE (t:test {prop: 452853}); +---- ok +-STATEMENT CREATE (t:test {prop: 560166}); +---- ok +-STATEMENT CREATE (t:test {prop: 376460}); +---- ok +-STATEMENT CREATE (t:test {prop: 555476}); +---- ok +-STATEMENT CREATE (t:test {prop: 645006}); +---- ok +-STATEMENT CREATE (t:test {prop: 713476}); +---- ok +-STATEMENT CREATE (t:test {prop: 986185}); +---- ok +-STATEMENT CREATE (t:test {prop: 584258}); +---- ok +-STATEMENT CREATE (t:test {prop: 541659}); +---- ok +-STATEMENT CREATE (t:test {prop: 357140}); +---- ok +-STATEMENT CREATE (t:test {prop: 968366}); +---- ok +-STATEMENT CREATE (t:test {prop: 907531}); +---- ok +-STATEMENT CREATE (t:test {prop: 575118}); +---- ok +-STATEMENT CREATE (t:test {prop: 729321}); +---- ok +-STATEMENT CREATE (t:test {prop: 822549}); +---- ok +-STATEMENT CREATE (t:test {prop: 263313}); +---- ok +-STATEMENT CREATE (t:test {prop: 222920}); +---- ok +-STATEMENT CREATE (t:test {prop: 436232}); +---- ok +-STATEMENT CREATE (t:test {prop: 815223}); +---- ok +-STATEMENT CREATE (t:test {prop: 581658}); +---- ok +-STATEMENT CREATE (t:test {prop: 56211}); +---- ok +-STATEMENT CREATE (t:test {prop: 77114}); +---- ok +-STATEMENT CREATE (t:test {prop: 704511}); +---- ok +-STATEMENT CREATE (t:test {prop: 826050}); +---- ok +-STATEMENT CREATE (t:test {prop: 966950}); +---- ok +-STATEMENT CREATE (t:test {prop: 215319}); +---- ok +-STATEMENT CREATE (t:test {prop: 38596}); +---- ok +-STATEMENT CREATE (t:test {prop: 136442}); +---- ok +-STATEMENT CREATE (t:test {prop: 159543}); +---- ok +-STATEMENT CREATE (t:test {prop: 485110}); +---- ok +-STATEMENT CREATE (t:test {prop: 587401}); +---- ok +-STATEMENT CREATE (t:test {prop: 129681}); +---- ok +-STATEMENT CREATE (t:test {prop: 985842}); +---- ok +-STATEMENT CREATE (t:test {prop: 97361}); +---- ok +-STATEMENT CREATE (t:test {prop: 609526}); +---- ok +-STATEMENT CREATE (t:test {prop: 299476}); +---- ok +-STATEMENT CREATE (t:test {prop: 488350}); +---- ok +-STATEMENT CREATE (t:test {prop: 784094}); +---- ok +-STATEMENT CREATE (t:test {prop: 852058}); +---- ok +-STATEMENT CREATE (t:test {prop: 818485}); +---- ok +-STATEMENT CREATE (t:test {prop: 490751}); +---- ok +-STATEMENT CREATE (t:test {prop: 180984}); +---- ok +-STATEMENT CREATE (t:test {prop: 576227}); +---- ok +-STATEMENT CREATE (t:test {prop: 35566}); +---- ok +-STATEMENT CREATE (t:test {prop: 857580}); +---- ok +-STATEMENT CREATE (t:test {prop: 981080}); +---- ok +-STATEMENT CREATE (t:test {prop: 146960}); +---- ok +-STATEMENT CREATE (t:test {prop: 7607}); +---- ok +-STATEMENT CREATE (t:test {prop: 233270}); +---- ok +-STATEMENT CREATE (t:test {prop: 247475}); +---- ok +-STATEMENT CREATE (t:test {prop: 19993}); +---- ok +-STATEMENT CREATE (t:test {prop: 611932}); +---- ok +-STATEMENT CREATE (t:test {prop: 666809}); +---- ok +-STATEMENT CREATE (t:test {prop: 729417}); +---- ok +-STATEMENT CREATE (t:test {prop: 867707}); +---- ok +-STATEMENT CREATE (t:test {prop: 925482}); +---- ok +-STATEMENT CREATE (t:test {prop: 642584}); +---- ok +-STATEMENT CREATE (t:test {prop: 424468}); +---- ok +-STATEMENT CREATE (t:test {prop: 547207}); +---- ok +-STATEMENT CREATE (t:test {prop: 378535}); +---- ok +-STATEMENT CREATE (t:test {prop: 752099}); +---- ok +-STATEMENT CREATE (t:test {prop: 524482}); +---- ok +-STATEMENT CREATE (t:test {prop: 596}); +---- ok +-STATEMENT CREATE (t:test {prop: 732524}); +---- ok +-STATEMENT CREATE (t:test {prop: 73309}); +---- ok +-STATEMENT CREATE (t:test {prop: 828540}); +---- ok +-STATEMENT CREATE (t:test {prop: 267834}); +---- ok +-STATEMENT CREATE (t:test {prop: 633266}); +---- ok +-STATEMENT CREATE (t:test {prop: 255758}); +---- ok +-STATEMENT CREATE (t:test {prop: 873120}); +---- ok +-STATEMENT CREATE (t:test {prop: 122487}); +---- ok +-STATEMENT CREATE (t:test {prop: 378551}); +---- ok +-STATEMENT CREATE (t:test {prop: 165429}); +---- ok +-STATEMENT CREATE (t:test {prop: 696183}); +---- ok +-STATEMENT CREATE (t:test {prop: 247425}); +---- ok +-STATEMENT CREATE (t:test {prop: 742913}); +---- ok +-STATEMENT CREATE (t:test {prop: 480347}); +---- ok +-STATEMENT CREATE (t:test {prop: 806724}); +---- ok +-STATEMENT CREATE (t:test {prop: 429312}); +---- ok +-STATEMENT CREATE (t:test {prop: 19824}); +---- ok +-STATEMENT CREATE (t:test {prop: 663043}); +---- ok +-STATEMENT CREATE (t:test {prop: 113948}); +---- ok +-STATEMENT CREATE (t:test {prop: 893308}); +---- ok +-STATEMENT CREATE (t:test {prop: 50865}); +---- ok +-STATEMENT CREATE (t:test {prop: 890825}); +---- ok +-STATEMENT CREATE (t:test {prop: 978787}); +---- ok +-STATEMENT CREATE (t:test {prop: 675807}); +---- ok +-STATEMENT CREATE (t:test {prop: 881666}); +---- ok +-STATEMENT CREATE (t:test {prop: 326618}); +---- ok +-STATEMENT CREATE (t:test {prop: 798750}); +---- ok +-STATEMENT CREATE (t:test {prop: 330325}); +---- ok +-STATEMENT CREATE (t:test {prop: 548923}); +---- ok +-STATEMENT CREATE (t:test {prop: 962895}); +---- ok +-STATEMENT CREATE (t:test {prop: 721988}); +---- ok +-STATEMENT CREATE (t:test {prop: 714420}); +---- ok +-STATEMENT CREATE (t:test {prop: 568691}); +---- ok +-STATEMENT CREATE (t:test {prop: 53991}); +---- ok +-STATEMENT CREATE (t:test {prop: 75556}); +---- ok +-STATEMENT CREATE (t:test {prop: 528767}); +---- ok +-STATEMENT CREATE (t:test {prop: 353057}); +---- ok +-STATEMENT CREATE (t:test {prop: 410349}); +---- ok +-STATEMENT CREATE (t:test {prop: 486792}); +---- ok +-STATEMENT CREATE (t:test {prop: 232518}); +---- ok +-STATEMENT CREATE (t:test {prop: 297816}); +---- ok +-STATEMENT CREATE (t:test {prop: 936748}); +---- ok +-STATEMENT CREATE (t:test {prop: 484031}); +---- ok +-STATEMENT CREATE (t:test {prop: 546119}); +---- ok +-STATEMENT CREATE (t:test {prop: 807327}); +---- ok +-STATEMENT CREATE (t:test {prop: 481030}); +---- ok +-STATEMENT CREATE (t:test {prop: 96215}); +---- ok +-STATEMENT CREATE (t:test {prop: 145337}); +---- ok +-STATEMENT CREATE (t:test {prop: 272910}); +---- ok +-STATEMENT CREATE (t:test {prop: 47213}); +---- ok +-STATEMENT CREATE (t:test {prop: 38601}); +---- ok +-STATEMENT CREATE (t:test {prop: 24096}); +---- ok +-STATEMENT CREATE (t:test {prop: 736463}); +---- ok +-STATEMENT CREATE (t:test {prop: 53392}); +---- ok +-STATEMENT CREATE (t:test {prop: 820960}); +---- ok +-STATEMENT CREATE (t:test {prop: 694077}); +---- ok +-STATEMENT CREATE (t:test {prop: 383392}); +---- ok +-STATEMENT CREATE (t:test {prop: 462991}); +---- ok +-STATEMENT CREATE (t:test {prop: 932052}); +---- ok +-STATEMENT CREATE (t:test {prop: 578970}); +---- ok +-STATEMENT CREATE (t:test {prop: 510414}); +---- ok +-STATEMENT CREATE (t:test {prop: 934489}); +---- ok +-STATEMENT CREATE (t:test {prop: 641137}); +---- ok +-STATEMENT CREATE (t:test {prop: 204438}); +---- ok +-STATEMENT CREATE (t:test {prop: 590163}); +---- ok +-STATEMENT CREATE (t:test {prop: 81716}); +---- ok +-STATEMENT CREATE (t:test {prop: 875479}); +---- ok +-STATEMENT CREATE (t:test {prop: 919029}); +---- ok +-STATEMENT CREATE (t:test {prop: 424524}); +---- ok +-STATEMENT CREATE (t:test {prop: 990364}); +---- ok +-STATEMENT CREATE (t:test {prop: 907586}); +---- ok +-STATEMENT CREATE (t:test {prop: 153718}); +---- ok +-STATEMENT CREATE (t:test {prop: 765407}); +---- ok +-STATEMENT CREATE (t:test {prop: 161374}); +---- ok +-STATEMENT CREATE (t:test {prop: 320223}); +---- ok +-STATEMENT CREATE (t:test {prop: 427885}); +---- ok +-STATEMENT CREATE (t:test {prop: 620520}); +---- ok +-STATEMENT CREATE (t:test {prop: 796580}); +---- ok +-STATEMENT CREATE (t:test {prop: 72936}); +---- ok +-STATEMENT CREATE (t:test {prop: 515941}); +---- ok +-STATEMENT CREATE (t:test {prop: 114339}); +---- ok +-STATEMENT CREATE (t:test {prop: 992434}); +---- ok +-STATEMENT CREATE (t:test {prop: 985071}); +---- ok +-STATEMENT CREATE (t:test {prop: 685110}); +---- ok +-STATEMENT CREATE (t:test {prop: 735334}); +---- ok +-STATEMENT CREATE (t:test {prop: 488791}); +---- ok +-STATEMENT CREATE (t:test {prop: 417088}); +---- ok +-STATEMENT CREATE (t:test {prop: 26326}); +---- ok +-STATEMENT CREATE (t:test {prop: 174873}); +---- ok +-STATEMENT CREATE (t:test {prop: 792943}); +---- ok +-STATEMENT CREATE (t:test {prop: 524819}); +---- ok +-STATEMENT CREATE (t:test {prop: 561432}); +---- ok +-STATEMENT CREATE (t:test {prop: 449142}); +---- ok +-STATEMENT CREATE (t:test {prop: 971528}); +---- ok +-STATEMENT CREATE (t:test {prop: 767111}); +---- ok +-STATEMENT CREATE (t:test {prop: 192551}); +---- ok +-STATEMENT CREATE (t:test {prop: 524116}); +---- ok +-STATEMENT CREATE (t:test {prop: 238644}); +---- ok +-STATEMENT CREATE (t:test {prop: 694519}); +---- ok +-STATEMENT CREATE (t:test {prop: 635424}); +---- ok +-STATEMENT CREATE (t:test {prop: 265033}); +---- ok +-STATEMENT CREATE (t:test {prop: 486429}); +---- ok +-STATEMENT CREATE (t:test {prop: 799654}); +---- ok +-STATEMENT CREATE (t:test {prop: 288817}); +---- ok +-STATEMENT CREATE (t:test {prop: 207301}); +---- ok +-STATEMENT CREATE (t:test {prop: 271112}); +---- ok +-STATEMENT CREATE (t:test {prop: 378227}); +---- ok +-STATEMENT CREATE (t:test {prop: 572316}); +---- ok +-STATEMENT CREATE (t:test {prop: 763946}); +---- ok +-STATEMENT CREATE (t:test {prop: 237573}); +---- ok +-STATEMENT CREATE (t:test {prop: 904129}); +---- ok +-STATEMENT CREATE (t:test {prop: 385138}); +---- ok +-STATEMENT CREATE (t:test {prop: 560352}); +---- ok +-STATEMENT CREATE (t:test {prop: 87403}); +---- ok +-STATEMENT CREATE (t:test {prop: 722024}); +---- ok +-STATEMENT CREATE (t:test {prop: 794545}); +---- ok +-STATEMENT CREATE (t:test {prop: 136330}); +---- ok +-STATEMENT CREATE (t:test {prop: 234799}); +---- ok +-STATEMENT CREATE (t:test {prop: 518494}); +---- ok +-STATEMENT CREATE (t:test {prop: 652197}); +---- ok +-STATEMENT CREATE (t:test {prop: 26521}); +---- ok +-STATEMENT CREATE (t:test {prop: 434374}); +---- ok +-STATEMENT CREATE (t:test {prop: 226134}); +---- ok +-STATEMENT CREATE (t:test {prop: 886636}); +---- ok +-STATEMENT CREATE (t:test {prop: 847680}); +---- ok +-STATEMENT CREATE (t:test {prop: 603636}); +---- ok +-STATEMENT CREATE (t:test {prop: 438088}); +---- ok +-STATEMENT CREATE (t:test {prop: 680585}); +---- ok +-STATEMENT CREATE (t:test {prop: 176380}); +---- ok +-STATEMENT CREATE (t:test {prop: 98224}); +---- ok +-STATEMENT CREATE (t:test {prop: 441352}); +---- ok +-STATEMENT CREATE (t:test {prop: 237456}); +---- ok +-STATEMENT CREATE (t:test {prop: 421210}); +---- ok +-STATEMENT CREATE (t:test {prop: 83294}); +---- ok +-STATEMENT CREATE (t:test {prop: 868465}); +---- ok +-STATEMENT CREATE (t:test {prop: 261118}); +---- ok +-STATEMENT CREATE (t:test {prop: 207167}); +---- ok +-STATEMENT CREATE (t:test {prop: 401708}); +---- ok +-STATEMENT CREATE (t:test {prop: 490041}); +---- ok +-STATEMENT CREATE (t:test {prop: 241747}); +---- ok +-STATEMENT CREATE (t:test {prop: 960319}); +---- ok +-STATEMENT CREATE (t:test {prop: 54905}); +---- ok +-STATEMENT CREATE (t:test {prop: 526338}); +---- ok +-STATEMENT CREATE (t:test {prop: 856715}); +---- ok +-STATEMENT CREATE (t:test {prop: 533682}); +---- ok +-STATEMENT CREATE (t:test {prop: 849122}); +---- ok +-STATEMENT CREATE (t:test {prop: 482955}); +---- ok +-STATEMENT CREATE (t:test {prop: 921477}); +---- ok +-STATEMENT CREATE (t:test {prop: 182922}); +---- ok +-STATEMENT CREATE (t:test {prop: 182473}); +---- ok +-STATEMENT CREATE (t:test {prop: 107878}); +---- ok +-STATEMENT CREATE (t:test {prop: 967871}); +---- ok +-STATEMENT CREATE (t:test {prop: 760205}); +---- ok +-STATEMENT CREATE (t:test {prop: 520378}); +---- ok +-STATEMENT CREATE (t:test {prop: 211575}); +---- ok +-STATEMENT CREATE (t:test {prop: 840357}); +---- ok +-STATEMENT CREATE (t:test {prop: 977452}); +---- ok +-STATEMENT CREATE (t:test {prop: 180476}); +---- ok +-STATEMENT CREATE (t:test {prop: 954486}); +---- ok +-STATEMENT CREATE (t:test {prop: 932618}); +---- ok +-STATEMENT CREATE (t:test {prop: 562875}); +---- ok +-STATEMENT CREATE (t:test {prop: 845045}); +---- ok +-STATEMENT CREATE (t:test {prop: 281335}); +---- ok +-STATEMENT CREATE (t:test {prop: 765181}); +---- ok +-STATEMENT CREATE (t:test {prop: 846359}); +---- ok +-STATEMENT CREATE (t:test {prop: 117705}); +---- ok +-STATEMENT CREATE (t:test {prop: 986151}); +---- ok +-STATEMENT CREATE (t:test {prop: 999689}); +---- ok +-STATEMENT CREATE (t:test {prop: 970892}); +---- ok +-STATEMENT CREATE (t:test {prop: 191845}); +---- ok +-STATEMENT CREATE (t:test {prop: 549040}); +---- ok +-STATEMENT CREATE (t:test {prop: 312422}); +---- ok +-STATEMENT CREATE (t:test {prop: 646534}); +---- ok +-STATEMENT CREATE (t:test {prop: 607389}); +---- ok +-STATEMENT CREATE (t:test {prop: 369768}); +---- ok +-STATEMENT CREATE (t:test {prop: 527236}); +---- ok +-STATEMENT CREATE (t:test {prop: 118689}); +---- ok +-STATEMENT CREATE (t:test {prop: 815152}); +---- ok +-STATEMENT CREATE (t:test {prop: 166266}); +---- ok +-STATEMENT CREATE (t:test {prop: 758295}); +---- ok +-STATEMENT CREATE (t:test {prop: 53444}); +---- ok +-STATEMENT CREATE (t:test {prop: 941465}); +---- ok +-STATEMENT CREATE (t:test {prop: 632354}); +---- ok +-STATEMENT CREATE (t:test {prop: 226626}); +---- ok +-STATEMENT CREATE (t:test {prop: 145877}); +---- ok +-STATEMENT CREATE (t:test {prop: 768625}); +---- ok +-STATEMENT CREATE (t:test {prop: 875349}); +---- ok +-STATEMENT CREATE (t:test {prop: 145139}); +---- ok +-STATEMENT CREATE (t:test {prop: 533693}); +---- ok +-STATEMENT CREATE (t:test {prop: 278336}); +---- ok +-STATEMENT CREATE (t:test {prop: 236563}); +---- ok +-STATEMENT CREATE (t:test {prop: 411496}); +---- ok +-STATEMENT CREATE (t:test {prop: 908647}); +---- ok +-STATEMENT CREATE (t:test {prop: 436369}); +---- ok +-STATEMENT CREATE (t:test {prop: 494040}); +---- ok +-STATEMENT CREATE (t:test {prop: 643418}); +---- ok +-STATEMENT CREATE (t:test {prop: 681386}); +---- ok +-STATEMENT CREATE (t:test {prop: 727120}); +---- ok +-STATEMENT CREATE (t:test {prop: 339417}); +---- ok +-STATEMENT CREATE (t:test {prop: 145833}); +---- ok +-STATEMENT CREATE (t:test {prop: 879067}); +---- ok +-STATEMENT CREATE (t:test {prop: 516244}); +---- ok +-STATEMENT CREATE (t:test {prop: 376840}); +---- ok +-STATEMENT CREATE (t:test {prop: 708507}); +---- ok +-STATEMENT CREATE (t:test {prop: 387973}); +---- ok +-STATEMENT CREATE (t:test {prop: 961936}); +---- ok +-STATEMENT CREATE (t:test {prop: 852695}); +---- ok +-STATEMENT CREATE (t:test {prop: 49636}); +---- ok +-STATEMENT CREATE (t:test {prop: 3658}); +---- ok +-STATEMENT CREATE (t:test {prop: 794484}); +---- ok +-STATEMENT CREATE (t:test {prop: 633562}); +---- ok +-STATEMENT CREATE (t:test {prop: 236301}); +---- ok +-STATEMENT CREATE (t:test {prop: 125616}); +---- ok +-STATEMENT CREATE (t:test {prop: 42370}); +---- ok +-STATEMENT CREATE (t:test {prop: 585513}); +---- ok +-STATEMENT CREATE (t:test {prop: 653018}); +---- ok +-STATEMENT CREATE (t:test {prop: 772558}); +---- ok +-STATEMENT CREATE (t:test {prop: 236196}); +---- ok +-STATEMENT CREATE (t:test {prop: 920098}); +---- ok +-STATEMENT CREATE (t:test {prop: 398197}); +---- ok +-STATEMENT CREATE (t:test {prop: 512904}); +---- ok +-STATEMENT CREATE (t:test {prop: 305979}); +---- ok +-STATEMENT CREATE (t:test {prop: 542731}); +---- ok +-STATEMENT CREATE (t:test {prop: 442768}); +---- ok +-STATEMENT CREATE (t:test {prop: 18977}); +---- ok +-STATEMENT CREATE (t:test {prop: 123909}); +---- ok +-STATEMENT CREATE (t:test {prop: 894292}); +---- ok +-STATEMENT CREATE (t:test {prop: 328129}); +---- ok +-STATEMENT CREATE (t:test {prop: 245344}); +---- ok +-STATEMENT CREATE (t:test {prop: 459748}); +---- ok +-STATEMENT CREATE (t:test {prop: 83350}); +---- ok +-STATEMENT CREATE (t:test {prop: 217092}); +---- ok +-STATEMENT CREATE (t:test {prop: 63922}); +---- ok +-STATEMENT CREATE (t:test {prop: 736860}); +---- ok +-STATEMENT CREATE (t:test {prop: 282672}); +---- ok +-STATEMENT CREATE (t:test {prop: 977398}); +---- ok +-STATEMENT CREATE (t:test {prop: 749780}); +---- ok +-STATEMENT CREATE (t:test {prop: 877618}); +---- ok +-STATEMENT CREATE (t:test {prop: 10013}); +---- ok +-STATEMENT CREATE (t:test {prop: 61284}); +---- ok +-STATEMENT CREATE (t:test {prop: 872606}); +---- ok +-STATEMENT CREATE (t:test {prop: 462563}); +---- ok +-STATEMENT CREATE (t:test {prop: 477394}); +---- ok +-STATEMENT CREATE (t:test {prop: 824152}); +---- ok +-STATEMENT CREATE (t:test {prop: 198770}); +---- ok +-STATEMENT CREATE (t:test {prop: 211767}); +---- ok +-STATEMENT CREATE (t:test {prop: 822301}); +---- ok +-STATEMENT CREATE (t:test {prop: 756963}); +---- ok +-STATEMENT CREATE (t:test {prop: 211139}); +---- ok +-STATEMENT CREATE (t:test {prop: 10637}); +---- ok +-STATEMENT CREATE (t:test {prop: 67713}); +---- ok +-STATEMENT CREATE (t:test {prop: 194608}); +---- ok +-STATEMENT CREATE (t:test {prop: 511767}); +---- ok +-STATEMENT CREATE (t:test {prop: 978453}); +---- ok +-STATEMENT CREATE (t:test {prop: 901577}); +---- ok +-STATEMENT CREATE (t:test {prop: 529752}); +---- ok +-STATEMENT CREATE (t:test {prop: 777602}); +---- ok +-STATEMENT CREATE (t:test {prop: 567391}); +---- ok +-STATEMENT CREATE (t:test {prop: 318253}); +---- ok +-STATEMENT CREATE (t:test {prop: 287934}); +---- ok +-STATEMENT CREATE (t:test {prop: 827510}); +---- ok +-STATEMENT CREATE (t:test {prop: 70079}); +---- ok +-STATEMENT CREATE (t:test {prop: 247585}); +---- ok +-STATEMENT CREATE (t:test {prop: 60292}); +---- ok +-STATEMENT CREATE (t:test {prop: 146575}); +---- ok +-STATEMENT CREATE (t:test {prop: 8995}); +---- ok +-STATEMENT CREATE (t:test {prop: 114630}); +---- ok +-STATEMENT CREATE (t:test {prop: 766173}); +---- ok +-STATEMENT CREATE (t:test {prop: 397233}); +---- ok +-STATEMENT CREATE (t:test {prop: 522397}); +---- ok +-STATEMENT CREATE (t:test {prop: 800474}); +---- ok +-STATEMENT CREATE (t:test {prop: 397750}); +---- ok +-STATEMENT CREATE (t:test {prop: 340236}); +---- ok +-STATEMENT CREATE (t:test {prop: 289118}); +---- ok +-STATEMENT CREATE (t:test {prop: 600721}); +---- ok +-STATEMENT CREATE (t:test {prop: 577106}); +---- ok +-STATEMENT CREATE (t:test {prop: 69995}); +---- ok +-STATEMENT CREATE (t:test {prop: 86006}); +---- ok +-STATEMENT CREATE (t:test {prop: 218223}); +---- ok +-STATEMENT CREATE (t:test {prop: 117979}); +---- ok +-STATEMENT CREATE (t:test {prop: 410655}); +---- ok +-STATEMENT CREATE (t:test {prop: 943515}); +---- ok +-STATEMENT CREATE (t:test {prop: 707503}); +---- ok +-STATEMENT CREATE (t:test {prop: 546534}); +---- ok +-STATEMENT CREATE (t:test {prop: 745966}); +---- ok +-STATEMENT CREATE (t:test {prop: 954818}); +---- ok +-STATEMENT CREATE (t:test {prop: 371147}); +---- ok +-STATEMENT CREATE (t:test {prop: 599477}); +---- ok +-STATEMENT CREATE (t:test {prop: 61577}); +---- ok +-STATEMENT CREATE (t:test {prop: 370701}); +---- ok +-STATEMENT CREATE (t:test {prop: 555210}); +---- ok +-STATEMENT CREATE (t:test {prop: 723573}); +---- ok +-STATEMENT CREATE (t:test {prop: 990603}); +---- ok +-STATEMENT CREATE (t:test {prop: 401050}); +---- ok +-STATEMENT CREATE (t:test {prop: 456654}); +---- ok +-STATEMENT CREATE (t:test {prop: 466108}); +---- ok +-STATEMENT CREATE (t:test {prop: 196826}); +---- ok +-STATEMENT CREATE (t:test {prop: 824310}); +---- ok +-STATEMENT CREATE (t:test {prop: 143647}); +---- ok +-STATEMENT CREATE (t:test {prop: 892116}); +---- ok +-STATEMENT CREATE (t:test {prop: 225021}); +---- ok +-STATEMENT CREATE (t:test {prop: 635445}); +---- ok +-STATEMENT CREATE (t:test {prop: 739438}); +---- ok +-STATEMENT CREATE (t:test {prop: 131728}); +---- ok +-STATEMENT CREATE (t:test {prop: 863306}); +---- ok +-STATEMENT CREATE (t:test {prop: 672110}); +---- ok +-STATEMENT CREATE (t:test {prop: 648288}); +---- ok +-STATEMENT CREATE (t:test {prop: 839409}); +---- ok +-STATEMENT CREATE (t:test {prop: 111609}); +---- ok +-STATEMENT CREATE (t:test {prop: 846506}); +---- ok +-STATEMENT CREATE (t:test {prop: 459622}); +---- ok +-STATEMENT CREATE (t:test {prop: 355025}); +---- ok +-STATEMENT CREATE (t:test {prop: 546187}); +---- ok +-STATEMENT CREATE (t:test {prop: 630485}); +---- ok +-STATEMENT CREATE (t:test {prop: 389575}); +---- ok +-STATEMENT CREATE (t:test {prop: 76632}); +---- ok +-STATEMENT CREATE (t:test {prop: 478}); +---- ok +-STATEMENT CREATE (t:test {prop: 435873}); +---- ok +-STATEMENT CREATE (t:test {prop: 502760}); +---- ok +-STATEMENT CREATE (t:test {prop: 663080}); +---- ok +-STATEMENT CREATE (t:test {prop: 432089}); +---- ok +-STATEMENT CREATE (t:test {prop: 718983}); +---- ok +-STATEMENT CREATE (t:test {prop: 268134}); +---- ok +-STATEMENT CREATE (t:test {prop: 560395}); +---- ok +-STATEMENT CREATE (t:test {prop: 736027}); +---- ok +-STATEMENT CREATE (t:test {prop: 778153}); +---- ok +-STATEMENT CREATE (t:test {prop: 224261}); +---- ok +-STATEMENT CREATE (t:test {prop: 584785}); +---- ok +-STATEMENT CREATE (t:test {prop: 681420}); +---- ok +-STATEMENT CREATE (t:test {prop: 52829}); +---- ok +-STATEMENT CREATE (t:test {prop: 885501}); +---- ok +-STATEMENT CREATE (t:test {prop: 555299}); +---- ok +-STATEMENT CREATE (t:test {prop: 1220}); +---- ok +-STATEMENT CREATE (t:test {prop: 318686}); +---- ok +-STATEMENT CREATE (t:test {prop: 592005}); +---- ok +-STATEMENT CREATE (t:test {prop: 856821}); +---- ok +-STATEMENT CREATE (t:test {prop: 358921}); +---- ok +-STATEMENT CREATE (t:test {prop: 596277}); +---- ok +-STATEMENT CREATE (t:test {prop: 482327}); +---- ok +-STATEMENT CREATE (t:test {prop: 924602}); +---- ok +-STATEMENT CREATE (t:test {prop: 130615}); +---- ok +-STATEMENT CREATE (t:test {prop: 451508}); +---- ok +-STATEMENT CREATE (t:test {prop: 913044}); +---- ok +-STATEMENT CREATE (t:test {prop: 849789}); +---- ok +-STATEMENT CREATE (t:test {prop: 408496}); +---- ok +-STATEMENT CREATE (t:test {prop: 63223}); +---- ok +-STATEMENT CREATE (t:test {prop: 631407}); +---- ok +-STATEMENT CREATE (t:test {prop: 12827}); +---- ok +-STATEMENT CREATE (t:test {prop: 819154}); +---- ok +-STATEMENT CREATE (t:test {prop: 387811}); +---- ok +-STATEMENT CREATE (t:test {prop: 417555}); +---- ok +-STATEMENT CREATE (t:test {prop: 173346}); +---- ok +-STATEMENT CREATE (t:test {prop: 11872}); +---- ok +-STATEMENT CREATE (t:test {prop: 138143}); +---- ok +-STATEMENT CREATE (t:test {prop: 883705}); +---- ok +-STATEMENT CREATE (t:test {prop: 597340}); +---- ok +-STATEMENT CREATE (t:test {prop: 216552}); +---- ok +-STATEMENT CREATE (t:test {prop: 326567}); +---- ok +-STATEMENT CREATE (t:test {prop: 877738}); +---- ok +-STATEMENT CREATE (t:test {prop: 178941}); +---- ok +-STATEMENT CREATE (t:test {prop: 454521}); +---- ok +-STATEMENT CREATE (t:test {prop: 108259}); +---- ok +-STATEMENT CREATE (t:test {prop: 751859}); +---- ok +-STATEMENT CREATE (t:test {prop: 667437}); +---- ok +-STATEMENT CREATE (t:test {prop: 373297}); +---- ok +-STATEMENT CREATE (t:test {prop: 77829}); +---- ok +-STATEMENT CREATE (t:test {prop: 558340}); +---- ok +-STATEMENT CREATE (t:test {prop: 523187}); +---- ok +-STATEMENT CREATE (t:test {prop: 328374}); +---- ok +-STATEMENT CREATE (t:test {prop: 911420}); +---- ok +-STATEMENT CREATE (t:test {prop: 382334}); +---- ok +-STATEMENT CREATE (t:test {prop: 644005}); +---- ok +-STATEMENT CREATE (t:test {prop: 209782}); +---- ok +-STATEMENT CREATE (t:test {prop: 977230}); +---- ok +-STATEMENT CREATE (t:test {prop: 921032}); +---- ok +-STATEMENT CREATE (t:test {prop: 98893}); +---- ok +-STATEMENT CREATE (t:test {prop: 478431}); +---- ok +-STATEMENT CREATE (t:test {prop: 478165}); +---- ok +-STATEMENT CREATE (t:test {prop: 461699}); +---- ok +-STATEMENT CREATE (t:test {prop: 630187}); +---- ok +-STATEMENT CREATE (t:test {prop: 185843}); +---- ok +-STATEMENT CREATE (t:test {prop: 415670}); +---- ok +-STATEMENT CREATE (t:test {prop: 291180}); +---- ok +-STATEMENT CREATE (t:test {prop: 911516}); +---- ok +-STATEMENT CREATE (t:test {prop: 636744}); +---- ok +-STATEMENT CREATE (t:test {prop: 568915}); +---- ok +-STATEMENT CREATE (t:test {prop: 424377}); +---- ok +-STATEMENT CREATE (t:test {prop: 732617}); +---- ok +-STATEMENT CREATE (t:test {prop: 263721}); +---- ok +-STATEMENT CREATE (t:test {prop: 408115}); +---- ok +-STATEMENT CREATE (t:test {prop: 171380}); +---- ok +-STATEMENT CREATE (t:test {prop: 673546}); +---- ok +-STATEMENT CREATE (t:test {prop: 297215}); +---- ok +-STATEMENT CREATE (t:test {prop: 332667}); +---- ok +-STATEMENT CREATE (t:test {prop: 688127}); +---- ok +-STATEMENT CREATE (t:test {prop: 110227}); +---- ok +-STATEMENT CREATE (t:test {prop: 120203}); +---- ok +-STATEMENT CREATE (t:test {prop: 254247}); +---- ok +-STATEMENT CREATE (t:test {prop: 524731}); +---- ok +-STATEMENT CREATE (t:test {prop: 693186}); +---- ok +-STATEMENT CREATE (t:test {prop: 219621}); +---- ok +-STATEMENT CREATE (t:test {prop: 857594}); +---- ok +-STATEMENT CREATE (t:test {prop: 180261}); +---- ok +-STATEMENT CREATE (t:test {prop: 247405}); +---- ok +-STATEMENT CREATE (t:test {prop: 174377}); +---- ok +-STATEMENT CREATE (t:test {prop: 163859}); +---- ok +-STATEMENT CREATE (t:test {prop: 82316}); +---- ok +-STATEMENT CREATE (t:test {prop: 463015}); +---- ok +-STATEMENT CREATE (t:test {prop: 937517}); +---- ok +-STATEMENT CREATE (t:test {prop: 342407}); +---- ok +-STATEMENT CREATE (t:test {prop: 427458}); +---- ok +-STATEMENT CREATE (t:test {prop: 753520}); +---- ok +-STATEMENT CREATE (t:test {prop: 322445}); +---- ok +-STATEMENT CREATE (t:test {prop: 521772}); +---- ok +-STATEMENT CREATE (t:test {prop: 603868}); +---- ok +-STATEMENT CREATE (t:test {prop: 491978}); +---- ok +-STATEMENT CREATE (t:test {prop: 471843}); +---- ok +-STATEMENT CREATE (t:test {prop: 634649}); +---- ok +-STATEMENT CREATE (t:test {prop: 146409}); +---- ok +-STATEMENT CREATE (t:test {prop: 768747}); +---- ok +-STATEMENT CREATE (t:test {prop: 380494}); +---- ok +-STATEMENT CREATE (t:test {prop: 145565}); +---- ok +-STATEMENT CREATE (t:test {prop: 601119}); +---- ok +-STATEMENT CREATE (t:test {prop: 24744}); +---- ok +-STATEMENT CREATE (t:test {prop: 464392}); +---- ok +-STATEMENT CREATE (t:test {prop: 538787}); +---- ok +-STATEMENT CREATE (t:test {prop: 512116}); +---- ok +-STATEMENT CREATE (t:test {prop: 672181}); +---- ok +-STATEMENT CREATE (t:test {prop: 692979}); +---- ok +-STATEMENT CREATE (t:test {prop: 981739}); +---- ok +-STATEMENT CREATE (t:test {prop: 273804}); +---- ok +-STATEMENT CREATE (t:test {prop: 771112}); +---- ok +-STATEMENT CREATE (t:test {prop: 450824}); +---- ok +-STATEMENT CREATE (t:test {prop: 305428}); +---- ok +-STATEMENT CREATE (t:test {prop: 883754}); +---- ok +-STATEMENT CREATE (t:test {prop: 636041}); +---- ok +-STATEMENT CREATE (t:test {prop: 777701}); +---- ok +-STATEMENT CREATE (t:test {prop: 651584}); +---- ok +-STATEMENT CREATE (t:test {prop: 892876}); +---- ok +-STATEMENT CREATE (t:test {prop: 154647}); +---- ok +-STATEMENT CREATE (t:test {prop: 284314}); +---- ok +-STATEMENT CREATE (t:test {prop: 771437}); +---- ok +-STATEMENT CREATE (t:test {prop: 933172}); +---- ok +-STATEMENT CREATE (t:test {prop: 535886}); +---- ok +-STATEMENT CREATE (t:test {prop: 921146}); +---- ok +-STATEMENT CREATE (t:test {prop: 559381}); +---- ok +-STATEMENT CREATE (t:test {prop: 778952}); +---- ok +-STATEMENT CREATE (t:test {prop: 34850}); +---- ok +-STATEMENT CREATE (t:test {prop: 726882}); +---- ok +-STATEMENT CREATE (t:test {prop: 997268}); +---- ok +-STATEMENT CREATE (t:test {prop: 627294}); +---- ok +-STATEMENT CREATE (t:test {prop: 7370}); +---- ok +-STATEMENT CREATE (t:test {prop: 172190}); +---- ok +-STATEMENT CREATE (t:test {prop: 292901}); +---- ok +-STATEMENT CREATE (t:test {prop: 691457}); +---- ok +-STATEMENT CREATE (t:test {prop: 779844}); +---- ok +-STATEMENT CREATE (t:test {prop: 41132}); +---- ok +-STATEMENT CREATE (t:test {prop: 416372}); +---- ok +-STATEMENT CREATE (t:test {prop: 144722}); +---- ok +-STATEMENT CREATE (t:test {prop: 880342}); +---- ok +-STATEMENT CREATE (t:test {prop: 77353}); +---- ok +-STATEMENT CREATE (t:test {prop: 107709}); +---- ok +-STATEMENT CREATE (t:test {prop: 318965}); +---- ok +-STATEMENT CREATE (t:test {prop: 824006}); +---- ok +-STATEMENT CREATE (t:test {prop: 206556}); +---- ok +-STATEMENT CREATE (t:test {prop: 200980}); +---- ok +-STATEMENT CREATE (t:test {prop: 867952}); +---- ok +-STATEMENT CREATE (t:test {prop: 584767}); +---- ok +-STATEMENT CREATE (t:test {prop: 358753}); +---- ok +-STATEMENT CREATE (t:test {prop: 248658}); +---- ok +-STATEMENT CREATE (t:test {prop: 572341}); +---- ok +-STATEMENT CREATE (t:test {prop: 423885}); +---- ok +-STATEMENT CREATE (t:test {prop: 634861}); +---- ok +-STATEMENT CREATE (t:test {prop: 877479}); +---- ok +-STATEMENT CREATE (t:test {prop: 703792}); +---- ok +-STATEMENT CREATE (t:test {prop: 920016}); +---- ok +-STATEMENT CREATE (t:test {prop: 216225}); +---- ok +-STATEMENT CREATE (t:test {prop: 798490}); +---- ok +-STATEMENT CREATE (t:test {prop: 797396}); +---- ok +-STATEMENT CREATE (t:test {prop: 468336}); +---- ok +-STATEMENT CREATE (t:test {prop: 683049}); +---- ok +-STATEMENT CREATE (t:test {prop: 346802}); +---- ok +-STATEMENT CREATE (t:test {prop: 944251}); +---- ok +-STATEMENT CREATE (t:test {prop: 952915}); +---- ok +-STATEMENT CREATE (t:test {prop: 254715}); +---- ok +-STATEMENT CREATE (t:test {prop: 998167}); +---- ok +-STATEMENT CREATE (t:test {prop: 51207}); +---- ok +-STATEMENT CREATE (t:test {prop: 785778}); +---- ok +-STATEMENT CREATE (t:test {prop: 458416}); +---- ok +-STATEMENT CREATE (t:test {prop: 479788}); +---- ok +-STATEMENT CREATE (t:test {prop: 136034}); +---- ok +-STATEMENT CREATE (t:test {prop: 755761}); +---- ok +-STATEMENT CREATE (t:test {prop: 362717}); +---- ok +-STATEMENT CREATE (t:test {prop: 358544}); +---- ok +-STATEMENT CREATE (t:test {prop: 283252}); +---- ok +-STATEMENT CREATE (t:test {prop: 185815}); +---- ok +-STATEMENT CREATE (t:test {prop: 711342}); +---- ok +-STATEMENT CREATE (t:test {prop: 192008}); +---- ok +-STATEMENT CREATE (t:test {prop: 644583}); +---- ok +-STATEMENT CREATE (t:test {prop: 474577}); +---- ok +-STATEMENT CREATE (t:test {prop: 942003}); +---- ok +-STATEMENT CREATE (t:test {prop: 364615}); +---- ok +-STATEMENT CREATE (t:test {prop: 594673}); +---- ok +-STATEMENT CREATE (t:test {prop: 623772}); +---- ok +-STATEMENT CREATE (t:test {prop: 837381}); +---- ok +-STATEMENT CREATE (t:test {prop: 913537}); +---- ok +-STATEMENT CREATE (t:test {prop: 879787}); +---- ok +-STATEMENT CREATE (t:test {prop: 720885}); +---- ok +-STATEMENT CREATE (t:test {prop: 104918}); +---- ok +-STATEMENT CREATE (t:test {prop: 982001}); +---- ok +-STATEMENT CREATE (t:test {prop: 380788}); +---- ok +-STATEMENT CREATE (t:test {prop: 158957}); +---- ok +-STATEMENT CREATE (t:test {prop: 282029}); +---- ok +-STATEMENT CREATE (t:test {prop: 322165}); +---- ok +-STATEMENT CREATE (t:test {prop: 969603}); +---- ok +-STATEMENT CREATE (t:test {prop: 141378}); +---- ok +-STATEMENT CREATE (t:test {prop: 118501}); +---- ok +-STATEMENT CREATE (t:test {prop: 649633}); +---- ok +-STATEMENT CREATE (t:test {prop: 988681}); +---- ok +-STATEMENT CREATE (t:test {prop: 971095}); +---- ok +-STATEMENT CREATE (t:test {prop: 529685}); +---- ok +-STATEMENT CREATE (t:test {prop: 449444}); +---- ok +-STATEMENT CREATE (t:test {prop: 588657}); +---- ok +-STATEMENT CREATE (t:test {prop: 510523}); +---- ok +-STATEMENT CREATE (t:test {prop: 286995}); +---- ok +-STATEMENT CREATE (t:test {prop: 509259}); +---- ok +-STATEMENT CREATE (t:test {prop: 703384}); +---- ok +-STATEMENT CREATE (t:test {prop: 986241}); +---- ok +-STATEMENT CREATE (t:test {prop: 405347}); +---- ok +-STATEMENT CREATE (t:test {prop: 382944}); +---- ok +-STATEMENT CREATE (t:test {prop: 555734}); +---- ok +-STATEMENT CREATE (t:test {prop: 915486}); +---- ok +-STATEMENT CREATE (t:test {prop: 941527}); +---- ok +-STATEMENT CREATE (t:test {prop: 235575}); +---- ok +-STATEMENT CREATE (t:test {prop: 800547}); +---- ok +-STATEMENT CREATE (t:test {prop: 403153}); +---- ok +-STATEMENT CREATE (t:test {prop: 73246}); +---- ok +-STATEMENT CREATE (t:test {prop: 732873}); +---- ok +-STATEMENT CREATE (t:test {prop: 817558}); +---- ok +-STATEMENT CREATE (t:test {prop: 20802}); +---- ok +-STATEMENT CREATE (t:test {prop: 952177}); +---- ok +-STATEMENT CREATE (t:test {prop: 247935}); +---- ok +-STATEMENT CREATE (t:test {prop: 774613}); +---- ok +-STATEMENT CREATE (t:test {prop: 263204}); +---- ok +-STATEMENT CREATE (t:test {prop: 766591}); +---- ok +-STATEMENT CREATE (t:test {prop: 73939}); +---- ok +-STATEMENT CREATE (t:test {prop: 974462}); +---- ok +-STATEMENT CREATE (t:test {prop: 280192}); +---- ok +-STATEMENT CREATE (t:test {prop: 634515}); +---- ok +-STATEMENT CREATE (t:test {prop: 270311}); +---- ok +-STATEMENT CREATE (t:test {prop: 901357}); +---- ok +-STATEMENT CREATE (t:test {prop: 633990}); +---- ok +-STATEMENT CREATE (t:test {prop: 110160}); +---- ok +-STATEMENT CREATE (t:test {prop: 198598}); +---- ok +-STATEMENT CREATE (t:test {prop: 100455}); +---- ok +-STATEMENT CREATE (t:test {prop: 929050}); +---- ok +-STATEMENT CREATE (t:test {prop: 201841}); +---- ok +-STATEMENT CREATE (t:test {prop: 999233}); +---- ok +-STATEMENT CREATE (t:test {prop: 190485}); +---- ok +-STATEMENT CREATE (t:test {prop: 676616}); +---- ok +-STATEMENT CREATE (t:test {prop: 907350}); +---- ok +-STATEMENT CREATE (t:test {prop: 758720}); +---- ok +-STATEMENT CREATE (t:test {prop: 855265}); +---- ok +-STATEMENT CREATE (t:test {prop: 437765}); +---- ok +-STATEMENT CREATE (t:test {prop: 69862}); +---- ok +-STATEMENT CREATE (t:test {prop: 330192}); +---- ok +-STATEMENT CREATE (t:test {prop: 983778}); +---- ok +-STATEMENT CREATE (t:test {prop: 183774}); +---- ok +-STATEMENT CREATE (t:test {prop: 747399}); +---- ok +-STATEMENT CREATE (t:test {prop: 834967}); +---- ok +-STATEMENT CREATE (t:test {prop: 341264}); +---- ok +-STATEMENT CREATE (t:test {prop: 818106}); +---- ok +-STATEMENT CREATE (t:test {prop: 886965}); +---- ok +-STATEMENT CREATE (t:test {prop: 614082}); +---- ok +-STATEMENT CREATE (t:test {prop: 587656}); +---- ok +-STATEMENT CREATE (t:test {prop: 860816}); +---- ok +-STATEMENT CREATE (t:test {prop: 233688}); +---- ok +-STATEMENT CREATE (t:test {prop: 253116}); +---- ok +-STATEMENT CREATE (t:test {prop: 356618}); +---- ok +-STATEMENT CREATE (t:test {prop: 417937}); +---- ok +-STATEMENT CREATE (t:test {prop: 529478}); +---- ok +-STATEMENT CREATE (t:test {prop: 997678}); +---- ok +-STATEMENT CREATE (t:test {prop: 356371}); +---- ok +-STATEMENT CREATE (t:test {prop: 250293}); +---- ok +-STATEMENT CREATE (t:test {prop: 808728}); +---- ok +-STATEMENT CREATE (t:test {prop: 553373}); +---- ok +-STATEMENT CREATE (t:test {prop: 664656}); +---- ok +-STATEMENT CREATE (t:test {prop: 174402}); +---- ok +-STATEMENT CREATE (t:test {prop: 288071}); +---- ok +-STATEMENT CREATE (t:test {prop: 567084}); +---- ok +-STATEMENT CREATE (t:test {prop: 7111}); +---- ok +-STATEMENT CREATE (t:test {prop: 287429}); +---- ok +-STATEMENT CREATE (t:test {prop: 91624}); +---- ok +-STATEMENT CREATE (t:test {prop: 384621}); +---- ok +-STATEMENT CREATE (t:test {prop: 8537}); +---- ok +-STATEMENT CREATE (t:test {prop: 526082}); +---- ok +-STATEMENT CREATE (t:test {prop: 833718}); +---- ok +-STATEMENT CREATE (t:test {prop: 882579}); +---- ok +-STATEMENT CREATE (t:test {prop: 473671}); +---- ok +-STATEMENT CREATE (t:test {prop: 816546}); +---- ok +-STATEMENT CREATE (t:test {prop: 110281}); +---- ok +-STATEMENT CREATE (t:test {prop: 735315}); +---- ok +-STATEMENT CREATE (t:test {prop: 78491}); +---- ok +-STATEMENT CREATE (t:test {prop: 561732}); +---- ok +-STATEMENT CREATE (t:test {prop: 809414}); +---- ok +-STATEMENT CREATE (t:test {prop: 375203}); +---- ok +-STATEMENT CREATE (t:test {prop: 426017}); +---- ok +-STATEMENT CREATE (t:test {prop: 246223}); +---- ok +-STATEMENT CREATE (t:test {prop: 915591}); +---- ok +-STATEMENT CREATE (t:test {prop: 315104}); +---- ok +-STATEMENT CREATE (t:test {prop: 265070}); +---- ok +-STATEMENT CREATE (t:test {prop: 574499}); +---- ok +-STATEMENT CREATE (t:test {prop: 170017}); +---- ok +-STATEMENT CREATE (t:test {prop: 41889}); +---- ok +-STATEMENT CREATE (t:test {prop: 347315}); +---- ok +-STATEMENT CREATE (t:test {prop: 802298}); +---- ok +-STATEMENT CREATE (t:test {prop: 444864}); +---- ok +-STATEMENT CREATE (t:test {prop: 847183}); +---- ok +-STATEMENT CREATE (t:test {prop: 722764}); +---- ok +-STATEMENT CREATE (t:test {prop: 275834}); +---- ok +-STATEMENT CREATE (t:test {prop: 863456}); +---- ok +-STATEMENT CREATE (t:test {prop: 478832}); +---- ok +-STATEMENT CREATE (t:test {prop: 71924}); +---- ok +-STATEMENT CREATE (t:test {prop: 617125}); +---- ok +-STATEMENT CREATE (t:test {prop: 183408}); +---- ok +-STATEMENT CREATE (t:test {prop: 507310}); +---- ok +-STATEMENT CREATE (t:test {prop: 424303}); +---- ok +-STATEMENT CREATE (t:test {prop: 500776}); +---- ok +-STATEMENT CREATE (t:test {prop: 380456}); +---- ok +-STATEMENT CREATE (t:test {prop: 704311}); +---- ok +-STATEMENT CREATE (t:test {prop: 608395}); +---- ok +-STATEMENT CREATE (t:test {prop: 759592}); +---- ok +-STATEMENT CREATE (t:test {prop: 852814}); +---- ok +-STATEMENT CREATE (t:test {prop: 239753}); +---- ok +-STATEMENT CREATE (t:test {prop: 514161}); +---- ok +-STATEMENT CREATE (t:test {prop: 527362}); +---- ok +-STATEMENT CREATE (t:test {prop: 131442}); +---- ok +-STATEMENT CREATE (t:test {prop: 968632}); +---- ok +-STATEMENT CREATE (t:test {prop: 759329}); +---- ok +-STATEMENT CREATE (t:test {prop: 649351}); +---- ok +-STATEMENT CREATE (t:test {prop: 969544}); +---- ok +-STATEMENT CREATE (t:test {prop: 397291}); +---- ok +-STATEMENT CREATE (t:test {prop: 6757}); +---- ok +-STATEMENT CREATE (t:test {prop: 160681}); +---- ok +-STATEMENT CREATE (t:test {prop: 166193}); +---- ok +-STATEMENT CREATE (t:test {prop: 241054}); +---- ok +-STATEMENT CREATE (t:test {prop: 273698}); +---- ok +-STATEMENT CREATE (t:test {prop: 675350}); +---- ok +-STATEMENT CREATE (t:test {prop: 724757}); +---- ok +-STATEMENT CREATE (t:test {prop: 732581}); +---- ok +-STATEMENT CREATE (t:test {prop: 929205}); +---- ok +-STATEMENT CREATE (t:test {prop: 598711}); +---- ok +-STATEMENT CREATE (t:test {prop: 859617}); +---- ok +-STATEMENT CREATE (t:test {prop: 798622}); +---- ok +-STATEMENT CREATE (t:test {prop: 278112}); +---- ok +-STATEMENT CREATE (t:test {prop: 24090}); +---- ok +-STATEMENT CREATE (t:test {prop: 723038}); +---- ok +-STATEMENT CREATE (t:test {prop: 752055}); +---- ok +-STATEMENT CREATE (t:test {prop: 572195}); +---- ok +-STATEMENT CREATE (t:test {prop: 964438}); +---- ok +-STATEMENT CREATE (t:test {prop: 815080}); +---- ok +-STATEMENT CREATE (t:test {prop: 607425}); +---- ok +-STATEMENT CREATE (t:test {prop: 339014}); +---- ok +-STATEMENT CREATE (t:test {prop: 444658}); +---- ok +-STATEMENT CREATE (t:test {prop: 39869}); +---- ok +-STATEMENT CREATE (t:test {prop: 12041}); +---- ok +-STATEMENT CREATE (t:test {prop: 77263}); +---- ok +-STATEMENT CREATE (t:test {prop: 231801}); +---- ok +-STATEMENT CREATE (t:test {prop: 958396}); +---- ok +-STATEMENT CREATE (t:test {prop: 347474}); +---- ok +-STATEMENT CREATE (t:test {prop: 442707}); +---- ok +-STATEMENT CREATE (t:test {prop: 168432}); +---- ok +-STATEMENT CREATE (t:test {prop: 870668}); +---- ok +-STATEMENT CREATE (t:test {prop: 925414}); +---- ok +-STATEMENT CREATE (t:test {prop: 986511}); +---- ok +-STATEMENT CREATE (t:test {prop: 655822}); +---- ok +-STATEMENT CREATE (t:test {prop: 204078}); +---- ok +-STATEMENT CREATE (t:test {prop: 58719}); +---- ok +-STATEMENT CREATE (t:test {prop: 910750}); +---- ok +-STATEMENT CREATE (t:test {prop: 912572}); +---- ok +-STATEMENT CREATE (t:test {prop: 52507}); +---- ok +-STATEMENT CREATE (t:test {prop: 135035}); +---- ok +-STATEMENT CREATE (t:test {prop: 800915}); +---- ok +-STATEMENT CREATE (t:test {prop: 23312}); +---- ok +-STATEMENT CREATE (t:test {prop: 868243}); +---- ok +-STATEMENT CREATE (t:test {prop: 883684}); +---- ok +-STATEMENT CREATE (t:test {prop: 431445}); +---- ok +-STATEMENT CREATE (t:test {prop: 367878}); +---- ok +-STATEMENT CREATE (t:test {prop: 808946}); +---- ok +-STATEMENT CREATE (t:test {prop: 10013}); +---- ok +-STATEMENT CREATE (t:test {prop: 341352}); +---- ok +-STATEMENT CREATE (t:test {prop: 547587}); +---- ok +-STATEMENT CREATE (t:test {prop: 484603}); +---- ok +-STATEMENT CREATE (t:test {prop: 355358}); +---- ok +-STATEMENT CREATE (t:test {prop: 384135}); +---- ok +-STATEMENT CREATE (t:test {prop: 115335}); +---- ok +-STATEMENT CREATE (t:test {prop: 919393}); +---- ok +-STATEMENT CREATE (t:test {prop: 141217}); +---- ok +-STATEMENT CREATE (t:test {prop: 684765}); +---- ok +-STATEMENT CREATE (t:test {prop: 295924}); +---- ok +-STATEMENT CREATE (t:test {prop: 861958}); +---- ok +-STATEMENT CREATE (t:test {prop: 787919}); +---- ok +-STATEMENT CREATE (t:test {prop: 415301}); +---- ok +-STATEMENT CREATE (t:test {prop: 408322}); +---- ok +-STATEMENT CREATE (t:test {prop: 765904}); +---- ok +-STATEMENT CREATE (t:test {prop: 625968}); +---- ok +-STATEMENT CREATE (t:test {prop: 516465}); +---- ok +-STATEMENT CREATE (t:test {prop: 726511}); +---- ok +-STATEMENT CREATE (t:test {prop: 168817}); +---- ok +-STATEMENT CREATE (t:test {prop: 779647}); +---- ok +-STATEMENT CREATE (t:test {prop: 782063}); +---- ok +-STATEMENT CREATE (t:test {prop: 196095}); +---- ok +-STATEMENT CREATE (t:test {prop: 928125}); +---- ok +-STATEMENT CREATE (t:test {prop: 117103}); +---- ok +-STATEMENT CREATE (t:test {prop: 287471}); +---- ok +-STATEMENT CREATE (t:test {prop: 541047}); +---- ok +-STATEMENT CREATE (t:test {prop: 923659}); +---- ok +-STATEMENT CREATE (t:test {prop: 507363}); +---- ok +-STATEMENT CREATE (t:test {prop: 902712}); +---- ok +-STATEMENT CREATE (t:test {prop: 716250}); +---- ok +-STATEMENT CREATE (t:test {prop: 717739}); +---- ok +-STATEMENT CREATE (t:test {prop: 241844}); +---- ok +-STATEMENT CREATE (t:test {prop: 132937}); +---- ok +-STATEMENT CREATE (t:test {prop: 792437}); +---- ok +-STATEMENT CREATE (t:test {prop: 442355}); +---- ok +-STATEMENT CREATE (t:test {prop: 420957}); +---- ok +-STATEMENT CREATE (t:test {prop: 255519}); +---- ok +-STATEMENT CREATE (t:test {prop: 21877}); +---- ok +-STATEMENT CREATE (t:test {prop: 109936}); +---- ok +-STATEMENT CREATE (t:test {prop: 556538}); +---- ok +-STATEMENT CREATE (t:test {prop: 196119}); +---- ok +-STATEMENT CREATE (t:test {prop: 324356}); +---- ok +-STATEMENT CREATE (t:test {prop: 964222}); +---- ok +-STATEMENT CREATE (t:test {prop: 86485}); +---- ok +-STATEMENT CREATE (t:test {prop: 253250}); +---- ok +-STATEMENT CREATE (t:test {prop: 736061}); +---- ok +-STATEMENT CREATE (t:test {prop: 553820}); +---- ok +-STATEMENT CREATE (t:test {prop: 971571}); +---- ok +-STATEMENT CREATE (t:test {prop: 683028}); +---- ok +-STATEMENT CREATE (t:test {prop: 165023}); +---- ok +-STATEMENT CREATE (t:test {prop: 864129}); +---- ok +-STATEMENT CREATE (t:test {prop: 501997}); +---- ok +-STATEMENT CREATE (t:test {prop: 569079}); +---- ok +-STATEMENT CREATE (t:test {prop: 64037}); +---- ok +-STATEMENT CREATE (t:test {prop: 359683}); +---- ok +-STATEMENT CREATE (t:test {prop: 491905}); +---- ok +-STATEMENT CREATE (t:test {prop: 688538}); +---- ok +-STATEMENT CREATE (t:test {prop: 44063}); +---- ok +-STATEMENT CREATE (t:test {prop: 997795}); +---- ok +-STATEMENT CREATE (t:test {prop: 508990}); +---- ok +-STATEMENT CREATE (t:test {prop: 440888}); +---- ok +-STATEMENT CREATE (t:test {prop: 204216}); +---- ok +-STATEMENT CREATE (t:test {prop: 5234}); +---- ok +-STATEMENT CREATE (t:test {prop: 293239}); +---- ok +-STATEMENT CREATE (t:test {prop: 963648}); +---- ok +-STATEMENT CREATE (t:test {prop: 202600}); +---- ok +-STATEMENT CREATE (t:test {prop: 283223}); +---- ok +-STATEMENT CREATE (t:test {prop: 937070}); +---- ok +-STATEMENT CREATE (t:test {prop: 675684}); +---- ok +-STATEMENT CREATE (t:test {prop: 532592}); +---- ok +-STATEMENT CREATE (t:test {prop: 899162}); +---- ok +-STATEMENT CREATE (t:test {prop: 502879}); +---- ok +-STATEMENT CREATE (t:test {prop: 372469}); +---- ok +-STATEMENT CREATE (t:test {prop: 523078}); +---- ok +-STATEMENT CREATE (t:test {prop: 235919}); +---- ok +-STATEMENT CREATE (t:test {prop: 940614}); +---- ok +-STATEMENT CREATE (t:test {prop: 440877}); +---- ok +-STATEMENT CREATE (t:test {prop: 233073}); +---- ok +-STATEMENT CREATE (t:test {prop: 84273}); +---- ok +-STATEMENT CREATE (t:test {prop: 212447}); +---- ok +-STATEMENT CREATE (t:test {prop: 635762}); +---- ok +-STATEMENT CREATE (t:test {prop: 195455}); +---- ok +-STATEMENT CREATE (t:test {prop: 609699}); +---- ok +-STATEMENT CREATE (t:test {prop: 876573}); +---- ok +-STATEMENT CREATE (t:test {prop: 622201}); +---- ok +-STATEMENT CREATE (t:test {prop: 596856}); +---- ok +-STATEMENT CREATE (t:test {prop: 502475}); +---- ok +-STATEMENT CREATE (t:test {prop: 173739}); +---- ok +-STATEMENT CREATE (t:test {prop: 421770}); +---- ok +-STATEMENT CREATE (t:test {prop: 43566}); +---- ok +-STATEMENT CREATE (t:test {prop: 1663}); +---- ok +-STATEMENT CREATE (t:test {prop: 78644}); +---- ok +-STATEMENT CREATE (t:test {prop: 961572}); +---- ok +-STATEMENT CREATE (t:test {prop: 710190}); +---- ok +-STATEMENT CREATE (t:test {prop: 414012}); +---- ok +-STATEMENT CREATE (t:test {prop: 879915}); +---- ok +-STATEMENT CREATE (t:test {prop: 668792}); +---- ok +-STATEMENT CREATE (t:test {prop: 288543}); +---- ok +-STATEMENT CREATE (t:test {prop: 93907}); +---- ok +-STATEMENT CREATE (t:test {prop: 276011}); +---- ok +-STATEMENT CREATE (t:test {prop: 151464}); +---- ok +-STATEMENT CREATE (t:test {prop: 776446}); +---- ok +-STATEMENT CREATE (t:test {prop: 553586}); +---- ok +-STATEMENT CREATE (t:test {prop: 568691}); +---- ok +-STATEMENT CREATE (t:test {prop: 887107}); +---- ok +-STATEMENT CREATE (t:test {prop: 823193}); +---- ok +-STATEMENT CREATE (t:test {prop: 721938}); +---- ok +-STATEMENT CREATE (t:test {prop: 349395}); +---- ok +-STATEMENT CREATE (t:test {prop: 837539}); +---- ok +-STATEMENT CREATE (t:test {prop: 838908}); +---- ok +-STATEMENT CREATE (t:test {prop: 949082}); +---- ok +-STATEMENT CREATE (t:test {prop: 211231}); +---- ok +-STATEMENT CREATE (t:test {prop: 168574}); +---- ok +-STATEMENT CREATE (t:test {prop: 536729}); +---- ok +-STATEMENT CREATE (t:test {prop: 180675}); +---- ok +-STATEMENT CREATE (t:test {prop: 958226}); +---- ok +-STATEMENT CREATE (t:test {prop: 570549}); +---- ok +-STATEMENT CREATE (t:test {prop: 603120}); +---- ok +-STATEMENT CREATE (t:test {prop: 566070}); +---- ok +-STATEMENT CREATE (t:test {prop: 414552}); +---- ok +-STATEMENT CREATE (t:test {prop: 797297}); +---- ok +-STATEMENT CREATE (t:test {prop: 518758}); +---- ok +-STATEMENT CREATE (t:test {prop: 504908}); +---- ok +-STATEMENT CREATE (t:test {prop: 979950}); +---- ok +-STATEMENT CREATE (t:test {prop: 696848}); +---- ok +-STATEMENT CREATE (t:test {prop: 249401}); +---- ok +-STATEMENT CREATE (t:test {prop: 408868}); +---- ok +-STATEMENT CREATE (t:test {prop: 353745}); +---- ok +-STATEMENT CREATE (t:test {prop: 685196}); +---- ok +-STATEMENT CREATE (t:test {prop: 5964}); +---- ok +-STATEMENT CREATE (t:test {prop: 142030}); +---- ok +-STATEMENT CREATE (t:test {prop: 265563}); +---- ok +-STATEMENT CREATE (t:test {prop: 254968}); +---- ok +-STATEMENT CREATE (t:test {prop: 389658}); +---- ok +-STATEMENT CREATE (t:test {prop: 283659}); +---- ok +-STATEMENT CREATE (t:test {prop: 769225}); +---- ok +-STATEMENT CREATE (t:test {prop: 155262}); +---- ok +-STATEMENT CREATE (t:test {prop: 174575}); +---- ok +-STATEMENT CREATE (t:test {prop: 82094}); +---- ok +-STATEMENT CREATE (t:test {prop: 553872}); +---- ok +-STATEMENT CREATE (t:test {prop: 113697}); +---- ok +-STATEMENT CREATE (t:test {prop: 413659}); +---- ok +-STATEMENT CREATE (t:test {prop: 418742}); +---- ok +-STATEMENT CREATE (t:test {prop: 617353}); +---- ok +-STATEMENT CREATE (t:test {prop: 366929}); +---- ok +-STATEMENT CREATE (t:test {prop: 25324}); +---- ok +-STATEMENT CREATE (t:test {prop: 431430}); +---- ok +-STATEMENT CREATE (t:test {prop: 714135}); +---- ok +-STATEMENT CREATE (t:test {prop: 65919}); +---- ok +-STATEMENT CREATE (t:test {prop: 753316}); +---- ok +-STATEMENT CREATE (t:test {prop: 776744}); +---- ok +-STATEMENT CREATE (t:test {prop: 595627}); +---- ok +-STATEMENT CREATE (t:test {prop: 490597}); +---- ok +-STATEMENT CREATE (t:test {prop: 13318}); +---- ok +-STATEMENT CREATE (t:test {prop: 389173}); +---- ok +-STATEMENT CREATE (t:test {prop: 440096}); +---- ok +-STATEMENT CREATE (t:test {prop: 425270}); +---- ok +-STATEMENT CREATE (t:test {prop: 604035}); +---- ok +-STATEMENT CREATE (t:test {prop: 794793}); +---- ok +-STATEMENT CREATE (t:test {prop: 175454}); +---- ok +-STATEMENT CREATE (t:test {prop: 417201}); +---- ok +-STATEMENT CREATE (t:test {prop: 981173}); +---- ok +-STATEMENT CREATE (t:test {prop: 555871}); +---- ok +-STATEMENT CREATE (t:test {prop: 46501}); +---- ok +-STATEMENT CREATE (t:test {prop: 325031}); +---- ok +-STATEMENT CREATE (t:test {prop: 257154}); +---- ok +-STATEMENT CREATE (t:test {prop: 43421}); +---- ok +-STATEMENT CREATE (t:test {prop: 240662}); +---- ok +-STATEMENT CREATE (t:test {prop: 426801}); +---- ok +-STATEMENT CREATE (t:test {prop: 532607}); +---- ok +-STATEMENT CREATE (t:test {prop: 632935}); +---- ok +-STATEMENT CREATE (t:test {prop: 23138}); +---- ok +-STATEMENT CREATE (t:test {prop: 584061}); +---- ok +-STATEMENT CREATE (t:test {prop: 120980}); +---- ok +-STATEMENT CREATE (t:test {prop: 497221}); +---- ok +-STATEMENT CREATE (t:test {prop: 217949}); +---- ok +-STATEMENT CREATE (t:test {prop: 526030}); +---- ok +-STATEMENT CREATE (t:test {prop: 216722}); +---- ok +-STATEMENT CREATE (t:test {prop: 344908}); +---- ok +-STATEMENT CREATE (t:test {prop: 600490}); +---- ok +-STATEMENT CREATE (t:test {prop: 379194}); +---- ok +-STATEMENT CREATE (t:test {prop: 945647}); +---- ok +-STATEMENT CREATE (t:test {prop: 339005}); +---- ok +-STATEMENT CREATE (t:test {prop: 232221}); +---- ok +-STATEMENT CREATE (t:test {prop: 340993}); +---- ok +-STATEMENT CREATE (t:test {prop: 536875}); +---- ok +-STATEMENT CREATE (t:test {prop: 93096}); +---- ok +-STATEMENT CREATE (t:test {prop: 816709}); +---- ok +-STATEMENT CREATE (t:test {prop: 657846}); +---- ok +-STATEMENT CREATE (t:test {prop: 719749}); +---- ok +-STATEMENT CREATE (t:test {prop: 116862}); +---- ok +-STATEMENT CREATE (t:test {prop: 462839}); +---- ok +-STATEMENT CREATE (t:test {prop: 59020}); +---- ok +-STATEMENT CREATE (t:test {prop: 279612}); +---- ok +-STATEMENT CREATE (t:test {prop: 838232}); +---- ok +-STATEMENT CREATE (t:test {prop: 277765}); +---- ok +-STATEMENT CREATE (t:test {prop: 822629}); +---- ok +-STATEMENT CREATE (t:test {prop: 959854}); +---- ok +-STATEMENT CREATE (t:test {prop: 382722}); +---- ok +-STATEMENT CREATE (t:test {prop: 573594}); +---- ok +-STATEMENT CREATE (t:test {prop: 629742}); +---- ok +-STATEMENT CREATE (t:test {prop: 224117}); +---- ok +-STATEMENT CREATE (t:test {prop: 456789}); +---- ok +-STATEMENT CREATE (t:test {prop: 764960}); +---- ok +-STATEMENT CREATE (t:test {prop: 737480}); +---- ok +-STATEMENT CREATE (t:test {prop: 358691}); +---- ok +-STATEMENT CREATE (t:test {prop: 63582}); +---- ok +-STATEMENT CREATE (t:test {prop: 83023}); +---- ok +-STATEMENT CREATE (t:test {prop: 156883}); +---- ok +-STATEMENT CREATE (t:test {prop: 155297}); +---- ok +-STATEMENT CREATE (t:test {prop: 390185}); +---- ok +-STATEMENT CREATE (t:test {prop: 564778}); +---- ok +-STATEMENT CREATE (t:test {prop: 186048}); +---- ok +-STATEMENT CREATE (t:test {prop: 525212}); +---- ok +-STATEMENT CREATE (t:test {prop: 866869}); +---- ok +-STATEMENT CREATE (t:test {prop: 795919}); +---- ok +-STATEMENT CREATE (t:test {prop: 369879}); +---- ok +-STATEMENT CREATE (t:test {prop: 153284}); +---- ok +-STATEMENT CREATE (t:test {prop: 430138}); +---- ok +-STATEMENT CREATE (t:test {prop: 955226}); +---- ok +-STATEMENT CREATE (t:test {prop: 213927}); +---- ok +-STATEMENT CREATE (t:test {prop: 59326}); +---- ok +-STATEMENT CREATE (t:test {prop: 226480}); +---- ok +-STATEMENT CREATE (t:test {prop: 316388}); +---- ok +-STATEMENT CREATE (t:test {prop: 711284}); +---- ok +-STATEMENT CREATE (t:test {prop: 63965}); +---- ok +-STATEMENT CREATE (t:test {prop: 906016}); +---- ok +-STATEMENT CREATE (t:test {prop: 128517}); +---- ok +-STATEMENT CREATE (t:test {prop: 508553}); +---- ok +-STATEMENT CREATE (t:test {prop: 119614}); +---- ok +-STATEMENT CREATE (t:test {prop: 465117}); +---- ok +-STATEMENT CREATE (t:test {prop: 40089}); +---- ok +-STATEMENT CREATE (t:test {prop: 88417}); +---- ok +-STATEMENT CREATE (t:test {prop: 725975}); +---- ok +-STATEMENT CREATE (t:test {prop: 491740}); +---- ok +-STATEMENT CREATE (t:test {prop: 435981}); +---- ok +-STATEMENT CREATE (t:test {prop: 800643}); +---- ok +-STATEMENT CREATE (t:test {prop: 179930}); +---- ok +-STATEMENT CREATE (t:test {prop: 146984}); +---- ok +-STATEMENT CREATE (t:test {prop: 44354}); +---- ok +-STATEMENT CREATE (t:test {prop: 215128}); +---- ok +-STATEMENT CREATE (t:test {prop: 963031}); +---- ok +-STATEMENT CREATE (t:test {prop: 175526}); +---- ok +-STATEMENT CREATE (t:test {prop: 786732}); +---- ok +-STATEMENT CREATE (t:test {prop: 134115}); +---- ok +-STATEMENT CREATE (t:test {prop: 246290}); +---- ok +-STATEMENT CREATE (t:test {prop: 714973}); +---- ok +-STATEMENT CREATE (t:test {prop: 578255}); +---- ok +-STATEMENT CREATE (t:test {prop: 797135}); +---- ok +-STATEMENT CREATE (t:test {prop: 841308}); +---- ok +-STATEMENT CREATE (t:test {prop: 559619}); +---- ok +-STATEMENT CREATE (t:test {prop: 755826}); +---- ok +-STATEMENT CREATE (t:test {prop: 649420}); +---- ok +-STATEMENT CREATE (t:test {prop: 363635}); +---- ok +-STATEMENT CREATE (t:test {prop: 924660}); +---- ok +-STATEMENT CREATE (t:test {prop: 116765}); +---- ok +-STATEMENT CREATE (t:test {prop: 792518}); +---- ok +-STATEMENT CREATE (t:test {prop: 704612}); +---- ok +-STATEMENT CREATE (t:test {prop: 693428}); +---- ok +-STATEMENT CREATE (t:test {prop: 660856}); +---- ok +-STATEMENT CREATE (t:test {prop: 451689}); +---- ok +-STATEMENT CREATE (t:test {prop: 660811}); +---- ok +-STATEMENT CREATE (t:test {prop: 305890}); +---- ok +-STATEMENT CREATE (t:test {prop: 271048}); +---- ok +-STATEMENT CREATE (t:test {prop: 811133}); +---- ok +-STATEMENT CREATE (t:test {prop: 377173}); +---- ok +-STATEMENT CREATE (t:test {prop: 819186}); +---- ok +-STATEMENT CREATE (t:test {prop: 136380}); +---- ok +-STATEMENT CREATE (t:test {prop: 745911}); +---- ok +-STATEMENT CREATE (t:test {prop: 488324}); +---- ok +-STATEMENT CREATE (t:test {prop: 997226}); +---- ok +-STATEMENT CREATE (t:test {prop: 928440}); +---- ok +-STATEMENT CREATE (t:test {prop: 348585}); +---- ok +-STATEMENT CREATE (t:test {prop: 663868}); +---- ok +-STATEMENT CREATE (t:test {prop: 719479}); +---- ok +-STATEMENT CREATE (t:test {prop: 908717}); +---- ok +-STATEMENT CREATE (t:test {prop: 112260}); +---- ok +-STATEMENT CREATE (t:test {prop: 450563}); +---- ok +-STATEMENT CREATE (t:test {prop: 674187}); +---- ok +-STATEMENT CREATE (t:test {prop: 574604}); +---- ok +-STATEMENT CREATE (t:test {prop: 277931}); +---- ok +-STATEMENT CREATE (t:test {prop: 238873}); +---- ok +-STATEMENT CREATE (t:test {prop: 446629}); +---- ok +-STATEMENT CREATE (t:test {prop: 648086}); +---- ok +-STATEMENT CREATE (t:test {prop: 729303}); +---- ok +-STATEMENT CREATE (t:test {prop: 604576}); +---- ok +-STATEMENT CREATE (t:test {prop: 558166}); +---- ok +-STATEMENT CREATE (t:test {prop: 587884}); +---- ok +-STATEMENT CREATE (t:test {prop: 252874}); +---- ok +-STATEMENT CREATE (t:test {prop: 665421}); +---- ok +-STATEMENT CREATE (t:test {prop: 181940}); +---- ok +-STATEMENT CREATE (t:test {prop: 769861}); +---- ok +-STATEMENT CREATE (t:test {prop: 363585}); +---- ok +-STATEMENT CREATE (t:test {prop: 324710}); +---- ok +-STATEMENT CREATE (t:test {prop: 134053}); +---- ok +-STATEMENT CREATE (t:test {prop: 448368}); +---- ok +-STATEMENT CREATE (t:test {prop: 617668}); +---- ok +-STATEMENT CREATE (t:test {prop: 140384}); +---- ok +-STATEMENT CREATE (t:test {prop: 132493}); +---- ok +-STATEMENT CREATE (t:test {prop: 441506}); +---- ok +-STATEMENT CREATE (t:test {prop: 909480}); +---- ok +-STATEMENT CREATE (t:test {prop: 149528}); +---- ok +-STATEMENT CREATE (t:test {prop: 77565}); +---- ok +-STATEMENT CREATE (t:test {prop: 27400}); +---- ok +-STATEMENT CREATE (t:test {prop: 42381}); +---- ok +-STATEMENT CREATE (t:test {prop: 686513}); +---- ok +-STATEMENT CREATE (t:test {prop: 989940}); +---- ok +-STATEMENT CREATE (t:test {prop: 485843}); +---- ok +-STATEMENT CREATE (t:test {prop: 618008}); +---- ok +-STATEMENT CREATE (t:test {prop: 504841}); +---- ok +-STATEMENT CREATE (t:test {prop: 940179}); +---- ok +-STATEMENT CREATE (t:test {prop: 520197}); +---- ok +-STATEMENT CREATE (t:test {prop: 969684}); +---- ok +-STATEMENT CREATE (t:test {prop: 380483}); +---- ok +-STATEMENT CREATE (t:test {prop: 381044}); +---- ok +-STATEMENT CREATE (t:test {prop: 883320}); +---- ok +-STATEMENT CREATE (t:test {prop: 339132}); +---- ok +-STATEMENT CREATE (t:test {prop: 736270}); +---- ok +-STATEMENT CREATE (t:test {prop: 329280}); +---- ok +-STATEMENT CREATE (t:test {prop: 357269}); +---- ok +-STATEMENT CREATE (t:test {prop: 753727}); +---- ok +-STATEMENT CREATE (t:test {prop: 802108}); +---- ok +-STATEMENT CREATE (t:test {prop: 22654}); +---- ok +-STATEMENT CREATE (t:test {prop: 854718}); +---- ok +-STATEMENT CREATE (t:test {prop: 267454}); +---- ok +-STATEMENT CREATE (t:test {prop: 339707}); +---- ok +-STATEMENT CREATE (t:test {prop: 447958}); +---- ok +-STATEMENT CREATE (t:test {prop: 441887}); +---- ok +-STATEMENT CREATE (t:test {prop: 879693}); +---- ok +-STATEMENT CREATE (t:test {prop: 207578}); +---- ok +-STATEMENT CREATE (t:test {prop: 511114}); +---- ok +-STATEMENT CREATE (t:test {prop: 986272}); +---- ok +-STATEMENT CREATE (t:test {prop: 203071}); +---- ok +-STATEMENT CREATE (t:test {prop: 755336}); +---- ok +-STATEMENT CREATE (t:test {prop: 627251}); +---- ok +-STATEMENT CREATE (t:test {prop: 692234}); +---- ok +-STATEMENT CREATE (t:test {prop: 718852}); +---- ok +-STATEMENT CREATE (t:test {prop: 883037}); +---- ok +-STATEMENT CREATE (t:test {prop: 38089}); +---- ok +-STATEMENT CREATE (t:test {prop: 197761}); +---- ok +-STATEMENT CREATE (t:test {prop: 301754}); +---- ok +-STATEMENT CREATE (t:test {prop: 814639}); +---- ok +-STATEMENT CREATE (t:test {prop: 233369}); +---- ok +-STATEMENT CREATE (t:test {prop: 952093}); +---- ok +-STATEMENT CREATE (t:test {prop: 477250}); +---- ok +-STATEMENT CREATE (t:test {prop: 111779}); +---- ok +-STATEMENT CREATE (t:test {prop: 76606}); +---- ok +-STATEMENT CREATE (t:test {prop: 583038}); +---- ok +-STATEMENT CREATE (t:test {prop: 672139}); +---- ok +-STATEMENT CREATE (t:test {prop: 427861}); +---- ok +-STATEMENT CREATE (t:test {prop: 338829}); +---- ok +-STATEMENT CREATE (t:test {prop: 593705}); +---- ok +-STATEMENT CREATE (t:test {prop: 598488}); +---- ok +-STATEMENT CREATE (t:test {prop: 354653}); +---- ok +-STATEMENT CREATE (t:test {prop: 963883}); +---- ok +-STATEMENT CREATE (t:test {prop: 666593}); +---- ok +-STATEMENT CREATE (t:test {prop: 812867}); +---- ok +-STATEMENT CREATE (t:test {prop: 675290}); +---- ok +-STATEMENT CREATE (t:test {prop: 399325}); +---- ok +-STATEMENT CREATE (t:test {prop: 4846}); +---- ok +-STATEMENT CREATE (t:test {prop: 141232}); +---- ok +-STATEMENT CREATE (t:test {prop: 668957}); +---- ok +-STATEMENT CREATE (t:test {prop: 915986}); +---- ok +-STATEMENT CREATE (t:test {prop: 963775}); +---- ok +-STATEMENT CREATE (t:test {prop: 33396}); +---- ok +-STATEMENT CREATE (t:test {prop: 985555}); +---- ok +-STATEMENT CREATE (t:test {prop: 690892}); +---- ok +-STATEMENT CREATE (t:test {prop: 451914}); +---- ok +-STATEMENT CREATE (t:test {prop: 147779}); +---- ok +-STATEMENT CREATE (t:test {prop: 890650}); +---- ok +-STATEMENT CREATE (t:test {prop: 102421}); +---- ok +-STATEMENT CREATE (t:test {prop: 386298}); +---- ok +-STATEMENT CREATE (t:test {prop: 74340}); +---- ok +-STATEMENT CREATE (t:test {prop: 700815}); +---- ok +-STATEMENT CREATE (t:test {prop: 186806}); +---- ok +-STATEMENT CREATE (t:test {prop: 700491}); +---- ok +-STATEMENT CREATE (t:test {prop: 872652}); +---- ok +-STATEMENT CREATE (t:test {prop: 844964}); +---- ok +-STATEMENT CREATE (t:test {prop: 804349}); +---- ok +-STATEMENT CREATE (t:test {prop: 936880}); +---- ok +-STATEMENT CREATE (t:test {prop: 201984}); +---- ok +-STATEMENT CREATE (t:test {prop: 935749}); +---- ok +-STATEMENT CREATE (t:test {prop: 126155}); +---- ok +-STATEMENT CREATE (t:test {prop: 233113}); +---- ok +-STATEMENT CREATE (t:test {prop: 831692}); +---- ok +-STATEMENT CREATE (t:test {prop: 85321}); +---- ok +-STATEMENT CREATE (t:test {prop: 878787}); +---- ok +-STATEMENT CREATE (t:test {prop: 957180}); +---- ok +-STATEMENT CREATE (t:test {prop: 804517}); +---- ok +-STATEMENT CREATE (t:test {prop: 42613}); +---- ok +-STATEMENT CREATE (t:test {prop: 499203}); +---- ok +-STATEMENT CREATE (t:test {prop: 635942}); +---- ok +-STATEMENT CREATE (t:test {prop: 33470}); +---- ok +-STATEMENT CREATE (t:test {prop: 639997}); +---- ok +-STATEMENT CREATE (t:test {prop: 487943}); +---- ok +-STATEMENT CREATE (t:test {prop: 559922}); +---- ok +-STATEMENT CREATE (t:test {prop: 496091}); +---- ok +-STATEMENT CREATE (t:test {prop: 740050}); +---- ok +-STATEMENT CREATE (t:test {prop: 521585}); +---- ok +-STATEMENT CREATE (t:test {prop: 481386}); +---- ok +-STATEMENT CREATE (t:test {prop: 615686}); +---- ok +-STATEMENT CREATE (t:test {prop: 505727}); +---- ok +-STATEMENT CREATE (t:test {prop: 297636}); +---- ok +-STATEMENT CREATE (t:test {prop: 517486}); +---- ok +-STATEMENT CREATE (t:test {prop: 46401}); +---- ok +-STATEMENT CREATE (t:test {prop: 795382}); +---- ok +-STATEMENT CREATE (t:test {prop: 161397}); +---- ok +-STATEMENT CREATE (t:test {prop: 558718}); +---- ok +-STATEMENT CREATE (t:test {prop: 831056}); +---- ok +-STATEMENT CREATE (t:test {prop: 564992}); +---- ok +-STATEMENT CREATE (t:test {prop: 88419}); +---- ok +-STATEMENT CREATE (t:test {prop: 944380}); +---- ok +-STATEMENT CREATE (t:test {prop: 591131}); +---- ok +-STATEMENT CREATE (t:test {prop: 709798}); +---- ok +-STATEMENT CREATE (t:test {prop: 205593}); +---- ok +-STATEMENT CREATE (t:test {prop: 305943}); +---- ok +-STATEMENT CREATE (t:test {prop: 30192}); +---- ok +-STATEMENT CREATE (t:test {prop: 9768}); +---- ok +-STATEMENT CREATE (t:test {prop: 848175}); +---- ok +-STATEMENT CREATE (t:test {prop: 693731}); +---- ok +-STATEMENT CREATE (t:test {prop: 440376}); +---- ok +-STATEMENT CREATE (t:test {prop: 102928}); +---- ok +-STATEMENT CREATE (t:test {prop: 628955}); +---- ok +-STATEMENT CREATE (t:test {prop: 234294}); +---- ok +-STATEMENT CREATE (t:test {prop: 704412}); +---- ok +-STATEMENT CREATE (t:test {prop: 742259}); +---- ok +-STATEMENT CREATE (t:test {prop: 740878}); +---- ok +-STATEMENT CREATE (t:test {prop: 703290}); +---- ok +-STATEMENT CREATE (t:test {prop: 579286}); +---- ok +-STATEMENT CREATE (t:test {prop: 729761}); +---- ok +-STATEMENT CREATE (t:test {prop: 888605}); +---- ok +-STATEMENT CREATE (t:test {prop: 973405}); +---- ok +-STATEMENT CREATE (t:test {prop: 30744}); +---- ok +-STATEMENT CREATE (t:test {prop: 796041}); +---- ok +-STATEMENT CREATE (t:test {prop: 217426}); +---- ok +-STATEMENT CREATE (t:test {prop: 103509}); +---- ok +-STATEMENT CREATE (t:test {prop: 512728}); +---- ok +-STATEMENT CREATE (t:test {prop: 759271}); +---- ok +-STATEMENT CREATE (t:test {prop: 158201}); +---- ok +-STATEMENT CREATE (t:test {prop: 33185}); +---- ok +-STATEMENT CREATE (t:test {prop: 464936}); +---- ok +-STATEMENT CREATE (t:test {prop: 673185}); +---- ok +-STATEMENT CREATE (t:test {prop: 318843}); +---- ok +-STATEMENT CREATE (t:test {prop: 982780}); +---- ok +-STATEMENT CREATE (t:test {prop: 313389}); +---- ok +-STATEMENT CREATE (t:test {prop: 940014}); +---- ok +-STATEMENT CREATE (t:test {prop: 549110}); +---- ok +-STATEMENT CREATE (t:test {prop: 512608}); +---- ok +-STATEMENT CREATE (t:test {prop: 890876}); +---- ok +-STATEMENT CREATE (t:test {prop: 293365}); +---- ok +-STATEMENT CREATE (t:test {prop: 312388}); +---- ok +-STATEMENT CREATE (t:test {prop: 867063}); +---- ok +-STATEMENT CREATE (t:test {prop: 441213}); +---- ok +-STATEMENT CREATE (t:test {prop: 837462}); +---- ok +-STATEMENT CREATE (t:test {prop: 282281}); +---- ok +-STATEMENT CREATE (t:test {prop: 236122}); +---- ok +-STATEMENT CREATE (t:test {prop: 194160}); +---- ok +-STATEMENT CREATE (t:test {prop: 83145}); +---- ok +-STATEMENT CREATE (t:test {prop: 804240}); +---- ok +-STATEMENT CREATE (t:test {prop: 642850}); +---- ok +-STATEMENT CREATE (t:test {prop: 951931}); +---- ok +-STATEMENT CREATE (t:test {prop: 427218}); +---- ok +-STATEMENT CREATE (t:test {prop: 271096}); +---- ok +-STATEMENT CREATE (t:test {prop: 604756}); +---- ok +-STATEMENT CREATE (t:test {prop: 323147}); +---- ok +-STATEMENT CREATE (t:test {prop: 89903}); +---- ok +-STATEMENT CREATE (t:test {prop: 106334}); +---- ok +-STATEMENT CREATE (t:test {prop: 469514}); +---- ok +-STATEMENT CREATE (t:test {prop: 581307}); +---- ok +-STATEMENT CREATE (t:test {prop: 17501}); +---- ok +-STATEMENT CREATE (t:test {prop: 757021}); +---- ok +-STATEMENT CREATE (t:test {prop: 27319}); +---- ok +-STATEMENT CREATE (t:test {prop: 243042}); +---- ok +-STATEMENT CREATE (t:test {prop: 716513}); +---- ok +-STATEMENT CREATE (t:test {prop: 561028}); +---- ok +-STATEMENT CREATE (t:test {prop: 453286}); +---- ok +-STATEMENT CREATE (t:test {prop: 52060}); +---- ok +-STATEMENT CREATE (t:test {prop: 215772}); +---- ok +-STATEMENT CREATE (t:test {prop: 334172}); +---- ok +-STATEMENT CREATE (t:test {prop: 704140}); +---- ok +-STATEMENT CREATE (t:test {prop: 48298}); +---- ok +-STATEMENT CREATE (t:test {prop: 790133}); +---- ok +-STATEMENT CREATE (t:test {prop: 577301}); +---- ok +-STATEMENT CREATE (t:test {prop: 891790}); +---- ok +-STATEMENT CREATE (t:test {prop: 572843}); +---- ok +-STATEMENT CREATE (t:test {prop: 786415}); +---- ok +-STATEMENT CREATE (t:test {prop: 117005}); +---- ok +-STATEMENT CREATE (t:test {prop: 706283}); +---- ok +-STATEMENT CREATE (t:test {prop: 47533}); +---- ok +-STATEMENT CREATE (t:test {prop: 280617}); +---- ok +-STATEMENT CREATE (t:test {prop: 595770}); +---- ok +-STATEMENT CREATE (t:test {prop: 171412}); +---- ok +-STATEMENT CREATE (t:test {prop: 558945}); +---- ok +-STATEMENT CREATE (t:test {prop: 670869}); +---- ok +-STATEMENT CREATE (t:test {prop: 694104}); +---- ok +-STATEMENT CREATE (t:test {prop: 374780}); +---- ok +-STATEMENT CREATE (t:test {prop: 223435}); +---- ok +-STATEMENT CREATE (t:test {prop: 801114}); +---- ok +-STATEMENT CREATE (t:test {prop: 975353}); +---- ok +-STATEMENT CREATE (t:test {prop: 639020}); +---- ok +-STATEMENT CREATE (t:test {prop: 966720}); +---- ok +-STATEMENT CREATE (t:test {prop: 312370}); +---- ok +-STATEMENT CREATE (t:test {prop: 986501}); +---- ok +-STATEMENT CREATE (t:test {prop: 294404}); +---- ok +-STATEMENT CREATE (t:test {prop: 892333}); +---- ok +-STATEMENT CREATE (t:test {prop: 147601}); +---- ok +-STATEMENT CREATE (t:test {prop: 535230}); +---- ok +-STATEMENT CREATE (t:test {prop: 973607}); +---- ok +-STATEMENT CREATE (t:test {prop: 209187}); +---- ok +-STATEMENT CREATE (t:test {prop: 758482}); +---- ok +-STATEMENT CREATE (t:test {prop: 177169}); +---- ok +-STATEMENT CREATE (t:test {prop: 139553}); +---- ok +-STATEMENT CREATE (t:test {prop: 340702}); +---- ok +-STATEMENT CREATE (t:test {prop: 380761}); +---- ok +-STATEMENT CREATE (t:test {prop: 151884}); +---- ok +-STATEMENT CREATE (t:test {prop: 534715}); +---- ok +-STATEMENT CREATE (t:test {prop: 966420}); +---- ok +-STATEMENT CREATE (t:test {prop: 619278}); +---- ok +-STATEMENT CREATE (t:test {prop: 41507}); +---- ok +-STATEMENT CREATE (t:test {prop: 270526}); +---- ok +-STATEMENT CREATE (t:test {prop: 872016}); +---- ok +-STATEMENT CREATE (t:test {prop: 462166}); +---- ok +-STATEMENT CREATE (t:test {prop: 788409}); +---- ok +-STATEMENT CREATE (t:test {prop: 520642}); +---- ok +-STATEMENT CREATE (t:test {prop: 870238}); +---- ok +-STATEMENT CREATE (t:test {prop: 192644}); +---- ok +-STATEMENT CREATE (t:test {prop: 721405}); +---- ok +-STATEMENT CREATE (t:test {prop: 402477}); +---- ok +-STATEMENT CREATE (t:test {prop: 572322}); +---- ok +-STATEMENT CREATE (t:test {prop: 102909}); +---- ok +-STATEMENT CREATE (t:test {prop: 139680}); +---- ok +-STATEMENT CREATE (t:test {prop: 538968}); +---- ok +-STATEMENT CREATE (t:test {prop: 58375}); +---- ok +-STATEMENT CREATE (t:test {prop: 68315}); +---- ok +-STATEMENT CREATE (t:test {prop: 643723}); +---- ok +-STATEMENT CREATE (t:test {prop: 916698}); +---- ok +-STATEMENT CREATE (t:test {prop: 314929}); +---- ok +-STATEMENT CREATE (t:test {prop: 489548}); +---- ok +-STATEMENT CREATE (t:test {prop: 693138}); +---- ok +-STATEMENT CREATE (t:test {prop: 852603}); +---- ok +-STATEMENT CREATE (t:test {prop: 221800}); +---- ok +-STATEMENT CREATE (t:test {prop: 283180}); +---- ok +-STATEMENT CREATE (t:test {prop: 458033}); +---- ok +-STATEMENT CREATE (t:test {prop: 106761}); +---- ok +-STATEMENT CREATE (t:test {prop: 457977}); +---- ok +-STATEMENT CREATE (t:test {prop: 83851}); +---- ok +-STATEMENT CREATE (t:test {prop: 90818}); +---- ok +-STATEMENT CREATE (t:test {prop: 655829}); +---- ok +-STATEMENT CREATE (t:test {prop: 278600}); +---- ok +-STATEMENT CREATE (t:test {prop: 315228}); +---- ok +-STATEMENT CREATE (t:test {prop: 267692}); +---- ok +-STATEMENT CREATE (t:test {prop: 322011}); +---- ok +-STATEMENT CREATE (t:test {prop: 796709}); +---- ok +-STATEMENT CREATE (t:test {prop: 648544}); +---- ok +-STATEMENT CREATE (t:test {prop: 797572}); +---- ok +-STATEMENT CREATE (t:test {prop: 575581}); +---- ok +-STATEMENT CREATE (t:test {prop: 501704}); +---- ok +-STATEMENT CREATE (t:test {prop: 541607}); +---- ok +-STATEMENT CREATE (t:test {prop: 883525}); +---- ok +-STATEMENT CREATE (t:test {prop: 786717}); +---- ok +-STATEMENT CREATE (t:test {prop: 436369}); +---- ok +-STATEMENT CREATE (t:test {prop: 514334}); +---- ok +-STATEMENT CREATE (t:test {prop: 281874}); +---- ok +-STATEMENT CREATE (t:test {prop: 441615}); +---- ok +-STATEMENT CREATE (t:test {prop: 194102}); +---- ok +-STATEMENT CREATE (t:test {prop: 507035}); +---- ok +-STATEMENT CREATE (t:test {prop: 662279}); +---- ok +-STATEMENT CREATE (t:test {prop: 951091}); +---- ok +-STATEMENT CREATE (t:test {prop: 144605}); +---- ok +-STATEMENT CREATE (t:test {prop: 707029}); +---- ok +-STATEMENT CREATE (t:test {prop: 435854}); +---- ok +-STATEMENT CREATE (t:test {prop: 746772}); +---- ok +-STATEMENT CREATE (t:test {prop: 244186}); +---- ok +-STATEMENT CREATE (t:test {prop: 625141}); +---- ok +-STATEMENT CREATE (t:test {prop: 397082}); +---- ok +-STATEMENT CREATE (t:test {prop: 508388}); +---- ok +-STATEMENT CREATE (t:test {prop: 657624}); +---- ok +-STATEMENT CREATE (t:test {prop: 318978}); +---- ok +-STATEMENT CREATE (t:test {prop: 433471}); +---- ok +-STATEMENT CREATE (t:test {prop: 551958}); +---- ok +-STATEMENT CREATE (t:test {prop: 711341}); +---- ok +-STATEMENT CREATE (t:test {prop: 979200}); +---- ok +-STATEMENT CREATE (t:test {prop: 220485}); +---- ok +-STATEMENT CREATE (t:test {prop: 452482}); +---- ok +-STATEMENT CREATE (t:test {prop: 384122}); +---- ok +-STATEMENT CREATE (t:test {prop: 539330}); +---- ok +-STATEMENT CREATE (t:test {prop: 485079}); +---- ok +-STATEMENT CREATE (t:test {prop: 635146}); +---- ok +-STATEMENT CREATE (t:test {prop: 784007}); +---- ok +-STATEMENT CREATE (t:test {prop: 707090}); +---- ok +-STATEMENT CREATE (t:test {prop: 518374}); +---- ok +-STATEMENT CREATE (t:test {prop: 19977}); +---- ok +-STATEMENT CREATE (t:test {prop: 509580}); +---- ok +-STATEMENT CREATE (t:test {prop: 420047}); +---- ok +-STATEMENT CREATE (t:test {prop: 589346}); +---- ok +-STATEMENT CREATE (t:test {prop: 242757}); +---- ok +-STATEMENT CREATE (t:test {prop: 768963}); +---- ok +-STATEMENT CREATE (t:test {prop: 357817}); +---- ok +-STATEMENT CREATE (t:test {prop: 234004}); +---- ok +-STATEMENT CREATE (t:test {prop: 200467}); +---- ok +-STATEMENT CREATE (t:test {prop: 967768}); +---- ok +-STATEMENT CREATE (t:test {prop: 451582}); +---- ok +-STATEMENT CREATE (t:test {prop: 764578}); +---- ok +-STATEMENT CREATE (t:test {prop: 679013}); +---- ok +-STATEMENT CREATE (t:test {prop: 940310}); +---- ok +-STATEMENT CREATE (t:test {prop: 270408}); +---- ok +-STATEMENT CREATE (t:test {prop: 302669}); +---- ok +-STATEMENT CREATE (t:test {prop: 929262}); +---- ok +-STATEMENT CREATE (t:test {prop: 927710}); +---- ok +-STATEMENT CREATE (t:test {prop: 838482}); +---- ok +-STATEMENT CREATE (t:test {prop: 732681}); +---- ok +-STATEMENT CREATE (t:test {prop: 623416}); +---- ok +-STATEMENT CREATE (t:test {prop: 324346}); +---- ok +-STATEMENT CREATE (t:test {prop: 176095}); +---- ok +-STATEMENT CREATE (t:test {prop: 906265}); +---- ok +-STATEMENT CREATE (t:test {prop: 734618}); +---- ok +-STATEMENT CREATE (t:test {prop: 522601}); +---- ok +-STATEMENT CREATE (t:test {prop: 219376}); +---- ok +-STATEMENT CREATE (t:test {prop: 458087}); +---- ok +-STATEMENT CREATE (t:test {prop: 363914}); +---- ok +-STATEMENT CREATE (t:test {prop: 342444}); +---- ok +-STATEMENT CREATE (t:test {prop: 876355}); +---- ok +-STATEMENT CREATE (t:test {prop: 632700}); +---- ok +-STATEMENT CREATE (t:test {prop: 129700}); +---- ok +-STATEMENT CREATE (t:test {prop: 108735}); +---- ok +-STATEMENT CREATE (t:test {prop: 879547}); +---- ok +-STATEMENT CREATE (t:test {prop: 221869}); +---- ok +-STATEMENT CREATE (t:test {prop: 840275}); +---- ok +-STATEMENT CREATE (t:test {prop: 516608}); +---- ok +-STATEMENT CREATE (t:test {prop: 661422}); +---- ok +-STATEMENT CREATE (t:test {prop: 158403}); +---- ok +-STATEMENT CREATE (t:test {prop: 938476}); +---- ok +-STATEMENT CREATE (t:test {prop: 455122}); +---- ok +-STATEMENT CREATE (t:test {prop: 28172}); +---- ok +-STATEMENT CREATE (t:test {prop: 940124}); +---- ok +-STATEMENT CREATE (t:test {prop: 514992}); +---- ok +-STATEMENT CREATE (t:test {prop: 702774}); +---- ok +-STATEMENT CREATE (t:test {prop: 252257}); +---- ok +-STATEMENT CREATE (t:test {prop: 896652}); +---- ok +-STATEMENT CREATE (t:test {prop: 220212}); +---- ok +-STATEMENT CREATE (t:test {prop: 556299}); +---- ok +-STATEMENT CREATE (t:test {prop: 725818}); +---- ok +-STATEMENT CREATE (t:test {prop: 361499}); +---- ok +-STATEMENT CREATE (t:test {prop: 853667}); +---- ok +-STATEMENT CREATE (t:test {prop: 989393}); +---- ok +-STATEMENT CREATE (t:test {prop: 817876}); +---- ok +-STATEMENT CREATE (t:test {prop: 176820}); +---- ok +-STATEMENT CREATE (t:test {prop: 166532}); +---- ok +-STATEMENT CREATE (t:test {prop: 206459}); +---- ok +-STATEMENT CREATE (t:test {prop: 839395}); +---- ok +-STATEMENT CREATE (t:test {prop: 147016}); +---- ok +-STATEMENT CREATE (t:test {prop: 22865}); +---- ok +-STATEMENT CREATE (t:test {prop: 672798}); +---- ok +-STATEMENT CREATE (t:test {prop: 173107}); +---- ok +-STATEMENT CREATE (t:test {prop: 601489}); +---- ok +-STATEMENT CREATE (t:test {prop: 478100}); +---- ok +-STATEMENT CREATE (t:test {prop: 909340}); +---- ok +-STATEMENT CREATE (t:test {prop: 565183}); +---- ok +-STATEMENT CREATE (t:test {prop: 128780}); +---- ok +-STATEMENT CREATE (t:test {prop: 386062}); +---- ok +-STATEMENT CREATE (t:test {prop: 726828}); +---- ok +-STATEMENT CREATE (t:test {prop: 953093}); +---- ok +-STATEMENT CREATE (t:test {prop: 579724}); +---- ok +-STATEMENT CREATE (t:test {prop: 222855}); +---- ok +-STATEMENT CREATE (t:test {prop: 307064}); +---- ok +-STATEMENT CREATE (t:test {prop: 493850}); +---- ok +-STATEMENT CREATE (t:test {prop: 490953}); +---- ok +-STATEMENT CREATE (t:test {prop: 570965}); +---- ok +-STATEMENT CREATE (t:test {prop: 593999}); +---- ok +-STATEMENT CREATE (t:test {prop: 668668}); +---- ok +-STATEMENT CREATE (t:test {prop: 528897}); +---- ok +-STATEMENT CREATE (t:test {prop: 960897}); +---- ok +-STATEMENT CREATE (t:test {prop: 534674}); +---- ok +-STATEMENT CREATE (t:test {prop: 959821}); +---- ok +-STATEMENT CREATE (t:test {prop: 268912}); +---- ok +-STATEMENT CREATE (t:test {prop: 301880}); +---- ok +-STATEMENT CREATE (t:test {prop: 624961}); +---- ok +-STATEMENT CREATE (t:test {prop: 977396}); +---- ok +-STATEMENT CREATE (t:test {prop: 326247}); +---- ok +-STATEMENT CREATE (t:test {prop: 700544}); +---- ok +-STATEMENT CREATE (t:test {prop: 103252}); +---- ok +-STATEMENT CREATE (t:test {prop: 254767}); +---- ok +-STATEMENT CREATE (t:test {prop: 270289}); +---- ok +-STATEMENT CREATE (t:test {prop: 460919}); +---- ok +-STATEMENT CREATE (t:test {prop: 409083}); +---- ok +-STATEMENT CREATE (t:test {prop: 989891}); +---- ok +-STATEMENT CREATE (t:test {prop: 60004}); +---- ok +-STATEMENT CREATE (t:test {prop: 841614}); +---- ok +-STATEMENT CREATE (t:test {prop: 607497}); +---- ok +-STATEMENT CREATE (t:test {prop: 677064}); +---- ok +-STATEMENT CREATE (t:test {prop: 646795}); +---- ok +-STATEMENT CREATE (t:test {prop: 548131}); +---- ok +-STATEMENT CREATE (t:test {prop: 66656}); +---- ok +-STATEMENT CREATE (t:test {prop: 426488}); +---- ok +-STATEMENT CREATE (t:test {prop: 149584}); +---- ok +-STATEMENT CREATE (t:test {prop: 933458}); +---- ok +-STATEMENT CREATE (t:test {prop: 780693}); +---- ok +-STATEMENT CREATE (t:test {prop: 417990}); +---- ok +-STATEMENT CREATE (t:test {prop: 363210}); +---- ok +-STATEMENT CREATE (t:test {prop: 30937}); +---- ok +-STATEMENT CREATE (t:test {prop: 687898}); +---- ok +-STATEMENT CREATE (t:test {prop: 918384}); +---- ok +-STATEMENT CREATE (t:test {prop: 359348}); +---- ok +-STATEMENT CREATE (t:test {prop: 910041}); +---- ok +-STATEMENT CREATE (t:test {prop: 189823}); +---- ok +-STATEMENT CREATE (t:test {prop: 880075}); +---- ok +-STATEMENT CREATE (t:test {prop: 102431}); +---- ok +-STATEMENT CREATE (t:test {prop: 354141}); +---- ok +-STATEMENT CREATE (t:test {prop: 339734}); +---- ok +-STATEMENT CREATE (t:test {prop: 52982}); +---- ok +-STATEMENT CREATE (t:test {prop: 864825}); +---- ok +-STATEMENT CREATE (t:test {prop: 157643}); +---- ok +-STATEMENT CREATE (t:test {prop: 579563}); +---- ok +-STATEMENT CREATE (t:test {prop: 914095}); +---- ok +-STATEMENT CREATE (t:test {prop: 438283}); +---- ok +-STATEMENT CREATE (t:test {prop: 271249}); +---- ok +-STATEMENT CREATE (t:test {prop: 217259}); +---- ok +-STATEMENT CREATE (t:test {prop: 303587}); +---- ok +-STATEMENT CREATE (t:test {prop: 131963}); +---- ok +-STATEMENT CREATE (t:test {prop: 622814}); +---- ok +-STATEMENT CREATE (t:test {prop: 994829}); +---- ok +-STATEMENT CREATE (t:test {prop: 242677}); +---- ok +-STATEMENT CREATE (t:test {prop: 636383}); +---- ok +-STATEMENT CREATE (t:test {prop: 337113}); +---- ok +-STATEMENT CREATE (t:test {prop: 988046}); +---- ok +-STATEMENT CREATE (t:test {prop: 660094}); +---- ok +-STATEMENT CREATE (t:test {prop: 806104}); +---- ok +-STATEMENT CREATE (t:test {prop: 82405}); +---- ok +-STATEMENT CREATE (t:test {prop: 86998}); +---- ok +-STATEMENT CREATE (t:test {prop: 213773}); +---- ok +-STATEMENT CREATE (t:test {prop: 922428}); +---- ok +-STATEMENT CREATE (t:test {prop: 630936}); +---- ok +-STATEMENT CREATE (t:test {prop: 520192}); +---- ok +-STATEMENT CREATE (t:test {prop: 37953}); +---- ok +-STATEMENT CREATE (t:test {prop: 420498}); +---- ok +-STATEMENT CREATE (t:test {prop: 359270}); +---- ok +-STATEMENT CREATE (t:test {prop: 306338}); +---- ok +-STATEMENT CREATE (t:test {prop: 498989}); +---- ok +-STATEMENT CREATE (t:test {prop: 202280}); +---- ok +-STATEMENT CREATE (t:test {prop: 476068}); +---- ok +-STATEMENT CREATE (t:test {prop: 407519}); +---- ok +-STATEMENT CREATE (t:test {prop: 458904}); +---- ok +-STATEMENT CREATE (t:test {prop: 427075}); +---- ok +-STATEMENT CREATE (t:test {prop: 637291}); +---- ok +-STATEMENT CREATE (t:test {prop: 788125}); +---- ok +-STATEMENT CREATE (t:test {prop: 701034}); +---- ok +-STATEMENT CREATE (t:test {prop: 598755}); +---- ok +-STATEMENT CREATE (t:test {prop: 733843}); +---- ok +-STATEMENT CREATE (t:test {prop: 912889}); +---- ok +-STATEMENT CREATE (t:test {prop: 936971}); +---- ok +-STATEMENT CREATE (t:test {prop: 443780}); +---- ok +-STATEMENT CREATE (t:test {prop: 197993}); +---- ok +-STATEMENT CREATE (t:test {prop: 630798}); +---- ok +-STATEMENT CREATE (t:test {prop: 738234}); +---- ok +-STATEMENT CREATE (t:test {prop: 755639}); +---- ok +-STATEMENT CREATE (t:test {prop: 203390}); +---- ok +-STATEMENT CREATE (t:test {prop: 887849}); +---- ok +-STATEMENT CREATE (t:test {prop: 254438}); +---- ok +-STATEMENT CREATE (t:test {prop: 159440}); +---- ok +-STATEMENT CREATE (t:test {prop: 245536}); +---- ok +-STATEMENT CREATE (t:test {prop: 440461}); +---- ok +-STATEMENT CREATE (t:test {prop: 197273}); +---- ok +-STATEMENT CREATE (t:test {prop: 416303}); +---- ok +-STATEMENT CREATE (t:test {prop: 439380}); +---- ok +-STATEMENT CREATE (t:test {prop: 817032}); +---- ok +-STATEMENT CREATE (t:test {prop: 861513}); +---- ok +-STATEMENT CREATE (t:test {prop: 617062}); +---- ok +-STATEMENT CREATE (t:test {prop: 722819}); +---- ok +-STATEMENT CREATE (t:test {prop: 219408}); +---- ok +-STATEMENT CREATE (t:test {prop: 495488}); +---- ok +-STATEMENT CREATE (t:test {prop: 640464}); +---- ok +-STATEMENT CREATE (t:test {prop: 188831}); +---- ok +-STATEMENT CREATE (t:test {prop: 350343}); +---- ok +-STATEMENT CREATE (t:test {prop: 695787}); +---- ok +-STATEMENT CREATE (t:test {prop: 671039}); +---- ok +-STATEMENT CREATE (t:test {prop: 87711}); +---- ok +-STATEMENT CREATE (t:test {prop: 786982}); +---- ok +-STATEMENT CREATE (t:test {prop: 379531}); +---- ok +-STATEMENT CREATE (t:test {prop: 350335}); +---- ok +-STATEMENT CREATE (t:test {prop: 97732}); +---- ok +-STATEMENT CREATE (t:test {prop: 7103}); +---- ok +-STATEMENT CREATE (t:test {prop: 917952}); +---- ok +-STATEMENT CREATE (t:test {prop: 136675}); +---- ok +-STATEMENT CREATE (t:test {prop: 694148}); +---- ok +-STATEMENT CREATE (t:test {prop: 595695}); +---- ok +-STATEMENT CREATE (t:test {prop: 524122}); +---- ok +-STATEMENT CREATE (t:test {prop: 73725}); +---- ok +-STATEMENT CREATE (t:test {prop: 917310}); +---- ok +-STATEMENT CREATE (t:test {prop: 44674}); +---- ok +-STATEMENT CREATE (t:test {prop: 817623}); +---- ok +-STATEMENT CREATE (t:test {prop: 99439}); +---- ok +-STATEMENT CREATE (t:test {prop: 654238}); +---- ok +-STATEMENT CREATE (t:test {prop: 717928}); +---- ok +-STATEMENT CREATE (t:test {prop: 54250}); +---- ok +-STATEMENT CREATE (t:test {prop: 579568}); +---- ok +-STATEMENT CREATE (t:test {prop: 174495}); +---- ok +-STATEMENT CREATE (t:test {prop: 815121}); +---- ok +-STATEMENT CREATE (t:test {prop: 832497}); +---- ok +-STATEMENT CREATE (t:test {prop: 946370}); +---- ok +-STATEMENT CREATE (t:test {prop: 97958}); +---- ok +-STATEMENT CREATE (t:test {prop: 482376}); +---- ok +-STATEMENT CREATE (t:test {prop: 351240}); +---- ok +-STATEMENT CREATE (t:test {prop: 829832}); +---- ok +-STATEMENT CREATE (t:test {prop: 376926}); +---- ok +-STATEMENT CREATE (t:test {prop: 413123}); +---- ok +-STATEMENT CREATE (t:test {prop: 406837}); +---- ok +-STATEMENT CREATE (t:test {prop: 53065}); +---- ok +-STATEMENT CREATE (t:test {prop: 475371}); +---- ok +-STATEMENT CREATE (t:test {prop: 562149}); +---- ok +-STATEMENT CREATE (t:test {prop: 664548}); +---- ok +-STATEMENT CREATE (t:test {prop: 254516}); +---- ok +-STATEMENT CREATE (t:test {prop: 21968}); +---- ok +-STATEMENT CREATE (t:test {prop: 203831}); +---- ok +-STATEMENT CREATE (t:test {prop: 43033}); +---- ok +-STATEMENT CREATE (t:test {prop: 116343}); +---- ok +-STATEMENT CREATE (t:test {prop: 587827}); +---- ok +-STATEMENT CREATE (t:test {prop: 552339}); +---- ok +-STATEMENT CREATE (t:test {prop: 843812}); +---- ok +-STATEMENT CREATE (t:test {prop: 728369}); +---- ok +-STATEMENT CREATE (t:test {prop: 599588}); +---- ok +-STATEMENT CREATE (t:test {prop: 217655}); +---- ok +-STATEMENT CREATE (t:test {prop: 345036}); +---- ok +-STATEMENT CREATE (t:test {prop: 434470}); +---- ok +-STATEMENT CREATE (t:test {prop: 432548}); +---- ok +-STATEMENT CREATE (t:test {prop: 177049}); +---- ok +-STATEMENT CREATE (t:test {prop: 507546}); +---- ok +-STATEMENT CREATE (t:test {prop: 404164}); +---- ok +-STATEMENT CREATE (t:test {prop: 13073}); +---- ok +-STATEMENT CREATE (t:test {prop: 101587}); +---- ok +-STATEMENT CREATE (t:test {prop: 124538}); +---- ok +-STATEMENT CREATE (t:test {prop: 309177}); +---- ok +-STATEMENT CREATE (t:test {prop: 367619}); +---- ok +-STATEMENT CREATE (t:test {prop: 149463}); +---- ok +-STATEMENT CREATE (t:test {prop: 546763}); +---- ok +-STATEMENT CREATE (t:test {prop: 144619}); +---- ok +-STATEMENT CREATE (t:test {prop: 419507}); +---- ok +-STATEMENT CREATE (t:test {prop: 728130}); +---- ok +-STATEMENT CREATE (t:test {prop: 967265}); +---- ok +-STATEMENT CREATE (t:test {prop: 574534}); +---- ok +-STATEMENT CREATE (t:test {prop: 794893}); +---- ok +-STATEMENT CREATE (t:test {prop: 736645}); +---- ok +-STATEMENT CREATE (t:test {prop: 656193}); +---- ok +-STATEMENT CREATE (t:test {prop: 791758}); +---- ok +-STATEMENT CREATE (t:test {prop: 532991}); +---- ok +-STATEMENT CREATE (t:test {prop: 255631}); +---- ok +-STATEMENT CREATE (t:test {prop: 502875}); +---- ok +-STATEMENT CREATE (t:test {prop: 315633}); +---- ok +-STATEMENT CREATE (t:test {prop: 855656}); +---- ok +-STATEMENT CREATE (t:test {prop: 800396}); +---- ok +-STATEMENT CREATE (t:test {prop: 59362}); +---- ok +-STATEMENT CREATE (t:test {prop: 393856}); +---- ok +-STATEMENT CREATE (t:test {prop: 320436}); +---- ok +-STATEMENT CREATE (t:test {prop: 343703}); +---- ok +-STATEMENT CREATE (t:test {prop: 272776}); +---- ok +-STATEMENT CREATE (t:test {prop: 229107}); +---- ok +-STATEMENT CREATE (t:test {prop: 345351}); +---- ok +-STATEMENT CREATE (t:test {prop: 86581}); +---- ok +-STATEMENT CREATE (t:test {prop: 137472}); +---- ok +-STATEMENT CREATE (t:test {prop: 488921}); +---- ok +-STATEMENT CREATE (t:test {prop: 861566}); +---- ok +-STATEMENT CREATE (t:test {prop: 333847}); +---- ok +-STATEMENT CREATE (t:test {prop: 438771}); +---- ok +-STATEMENT CREATE (t:test {prop: 694430}); +---- ok +-STATEMENT CREATE (t:test {prop: 309178}); +---- ok +-STATEMENT CREATE (t:test {prop: 441751}); +---- ok +-STATEMENT CREATE (t:test {prop: 605024}); +---- ok +-STATEMENT CREATE (t:test {prop: 675665}); +---- ok +-STATEMENT CREATE (t:test {prop: 832180}); +---- ok +-STATEMENT CREATE (t:test {prop: 302304}); +---- ok +-STATEMENT CREATE (t:test {prop: 782842}); +---- ok +-STATEMENT CREATE (t:test {prop: 982314}); +---- ok +-STATEMENT CREATE (t:test {prop: 538520}); +---- ok +-STATEMENT CREATE (t:test {prop: 384790}); +---- ok +-STATEMENT CREATE (t:test {prop: 902370}); +---- ok +-STATEMENT CREATE (t:test {prop: 967741}); +---- ok +-STATEMENT CREATE (t:test {prop: 899890}); +---- ok +-STATEMENT CREATE (t:test {prop: 715689}); +---- ok +-STATEMENT CREATE (t:test {prop: 395190}); +---- ok +-STATEMENT CREATE (t:test {prop: 418799}); +---- ok +-STATEMENT CREATE (t:test {prop: 668799}); +---- ok +-STATEMENT CREATE (t:test {prop: 52844}); +---- ok +-STATEMENT CREATE (t:test {prop: 327028}); +---- ok +-STATEMENT CREATE (t:test {prop: 774455}); +---- ok +-STATEMENT CREATE (t:test {prop: 928285}); +---- ok +-STATEMENT CREATE (t:test {prop: 790847}); +---- ok +-STATEMENT CREATE (t:test {prop: 807013}); +---- ok +-STATEMENT CREATE (t:test {prop: 856572}); +---- ok +-STATEMENT CREATE (t:test {prop: 486113}); +---- ok +-STATEMENT CREATE (t:test {prop: 412134}); +---- ok +-STATEMENT CREATE (t:test {prop: 680454}); +---- ok +-STATEMENT CREATE (t:test {prop: 817474}); +---- ok +-STATEMENT CREATE (t:test {prop: 710814}); +---- ok +-STATEMENT CREATE (t:test {prop: 955610}); +---- ok +-STATEMENT CREATE (t:test {prop: 207034}); +---- ok +-STATEMENT CREATE (t:test {prop: 118628}); +---- ok +-STATEMENT CREATE (t:test {prop: 758027}); +---- ok +-STATEMENT CREATE (t:test {prop: 154716}); +---- ok +-STATEMENT CREATE (t:test {prop: 94886}); +---- ok +-STATEMENT CREATE (t:test {prop: 816593}); +---- ok +-STATEMENT CREATE (t:test {prop: 991940}); +---- ok +-STATEMENT CREATE (t:test {prop: 794319}); +---- ok +-STATEMENT CREATE (t:test {prop: 672561}); +---- ok +-STATEMENT CREATE (t:test {prop: 661770}); +---- ok +-STATEMENT CREATE (t:test {prop: 711937}); +---- ok +-STATEMENT CREATE (t:test {prop: 134855}); +---- ok +-STATEMENT CREATE (t:test {prop: 653450}); +---- ok +-STATEMENT CREATE (t:test {prop: 905556}); +---- ok +-STATEMENT CREATE (t:test {prop: 839155}); +---- ok +-STATEMENT CREATE (t:test {prop: 97286}); +---- ok +-STATEMENT CREATE (t:test {prop: 941306}); +---- ok +-STATEMENT CREATE (t:test {prop: 641821}); +---- ok +-STATEMENT CREATE (t:test {prop: 633898}); +---- ok +-STATEMENT CREATE (t:test {prop: 784219}); +---- ok +-STATEMENT CREATE (t:test {prop: 556483}); +---- ok +-STATEMENT CREATE (t:test {prop: 484652}); +---- ok +-STATEMENT CREATE (t:test {prop: 98221}); +---- ok +-STATEMENT CREATE (t:test {prop: 929541}); +---- ok +-STATEMENT CREATE (t:test {prop: 6598}); +---- ok +-STATEMENT CREATE (t:test {prop: 173479}); +---- ok +-STATEMENT CREATE (t:test {prop: 926364}); +---- ok +-STATEMENT CREATE (t:test {prop: 565778}); +---- ok +-STATEMENT CREATE (t:test {prop: 889791}); +---- ok +-STATEMENT CREATE (t:test {prop: 500948}); +---- ok +-STATEMENT CREATE (t:test {prop: 286073}); +---- ok +-STATEMENT CREATE (t:test {prop: 281238}); +---- ok +-STATEMENT CREATE (t:test {prop: 965674}); +---- ok +-STATEMENT CREATE (t:test {prop: 183963}); +---- ok +-STATEMENT CREATE (t:test {prop: 583574}); +---- ok +-STATEMENT CREATE (t:test {prop: 847350}); +---- ok +-STATEMENT CREATE (t:test {prop: 152378}); +---- ok +-STATEMENT CREATE (t:test {prop: 786589}); +---- ok +-STATEMENT CREATE (t:test {prop: 384874}); +---- ok +-STATEMENT CREATE (t:test {prop: 620295}); +---- ok +-STATEMENT CREATE (t:test {prop: 88349}); +---- ok +-STATEMENT CREATE (t:test {prop: 404898}); +---- ok +-STATEMENT CREATE (t:test {prop: 466567}); +---- ok +-STATEMENT CREATE (t:test {prop: 151511}); +---- ok +-STATEMENT CREATE (t:test {prop: 778038}); +---- ok +-STATEMENT CREATE (t:test {prop: 655031}); +---- ok +-STATEMENT CREATE (t:test {prop: 66903}); +---- ok +-STATEMENT CREATE (t:test {prop: 407534}); +---- ok +-STATEMENT CREATE (t:test {prop: 748699}); +---- ok +-STATEMENT CREATE (t:test {prop: 76174}); +---- ok +-STATEMENT CREATE (t:test {prop: 450800}); +---- ok +-STATEMENT CREATE (t:test {prop: 787153}); +---- ok +-STATEMENT CREATE (t:test {prop: 561895}); +---- ok +-STATEMENT CREATE (t:test {prop: 86584}); +---- ok +-STATEMENT CREATE (t:test {prop: 122130}); +---- ok +-STATEMENT CREATE (t:test {prop: 792714}); +---- ok +-STATEMENT CREATE (t:test {prop: 430716}); +---- ok +-STATEMENT CREATE (t:test {prop: 19231}); +---- ok +-STATEMENT CREATE (t:test {prop: 91852}); +---- ok +-STATEMENT CREATE (t:test {prop: 597149}); +---- ok +-STATEMENT CREATE (t:test {prop: 340732}); +---- ok +-STATEMENT CREATE (t:test {prop: 449305}); +---- ok +-STATEMENT CREATE (t:test {prop: 139761}); +---- ok +-STATEMENT CREATE (t:test {prop: 871156}); +---- ok +-STATEMENT CREATE (t:test {prop: 700053}); +---- ok +-STATEMENT CREATE (t:test {prop: 572790}); +---- ok +-STATEMENT CREATE (t:test {prop: 252764}); +---- ok +-STATEMENT CREATE (t:test {prop: 863261}); +---- ok +-STATEMENT CREATE (t:test {prop: 936767}); +---- ok +-STATEMENT CREATE (t:test {prop: 288614}); +---- ok +-STATEMENT CREATE (t:test {prop: 173532}); +---- ok +-STATEMENT CREATE (t:test {prop: 137693}); +---- ok +-STATEMENT CREATE (t:test {prop: 35022}); +---- ok +-STATEMENT CREATE (t:test {prop: 38738}); +---- ok +-STATEMENT CREATE (t:test {prop: 454057}); +---- ok +-STATEMENT CREATE (t:test {prop: 799919}); +---- ok +-STATEMENT CREATE (t:test {prop: 817993}); +---- ok +-STATEMENT CREATE (t:test {prop: 431313}); +---- ok +-STATEMENT CREATE (t:test {prop: 744998}); +---- ok +-STATEMENT CREATE (t:test {prop: 56902}); +---- ok +-STATEMENT CREATE (t:test {prop: 564776}); +---- ok +-STATEMENT CREATE (t:test {prop: 35395}); +---- ok +-STATEMENT CREATE (t:test {prop: 14286}); +---- ok +-STATEMENT CREATE (t:test {prop: 237618}); +---- ok +-STATEMENT CREATE (t:test {prop: 186490}); +---- ok +-STATEMENT CREATE (t:test {prop: 551453}); +---- ok +-STATEMENT CREATE (t:test {prop: 392297}); +---- ok +-STATEMENT CREATE (t:test {prop: 218562}); +---- ok +-STATEMENT CREATE (t:test {prop: 98294}); +---- ok +-STATEMENT CREATE (t:test {prop: 858513}); +---- ok +-STATEMENT CREATE (t:test {prop: 535959}); +---- ok +-STATEMENT CREATE (t:test {prop: 869145}); +---- ok +-STATEMENT CREATE (t:test {prop: 666184}); +---- ok +-STATEMENT CREATE (t:test {prop: 804708}); +---- ok +-STATEMENT CREATE (t:test {prop: 566911}); +---- ok +-STATEMENT CREATE (t:test {prop: 882276}); +---- ok +-STATEMENT CREATE (t:test {prop: 984685}); +---- ok +-STATEMENT CREATE (t:test {prop: 250341}); +---- ok +-STATEMENT CREATE (t:test {prop: 110429}); +---- ok +-STATEMENT CREATE (t:test {prop: 134878}); +---- ok +-STATEMENT CREATE (t:test {prop: 51654}); +---- ok +-STATEMENT CREATE (t:test {prop: 580121}); +---- ok +-STATEMENT CREATE (t:test {prop: 594494}); +---- ok +-STATEMENT CREATE (t:test {prop: 313626}); +---- ok +-STATEMENT CREATE (t:test {prop: 333552}); +---- ok +-STATEMENT CREATE (t:test {prop: 109014}); +---- ok +-STATEMENT CREATE (t:test {prop: 140305}); +---- ok +-STATEMENT CREATE (t:test {prop: 220774}); +---- ok +-STATEMENT CREATE (t:test {prop: 623584}); +---- ok +-STATEMENT CREATE (t:test {prop: 395857}); +---- ok +-STATEMENT CREATE (t:test {prop: 343965}); +---- ok +-STATEMENT CREATE (t:test {prop: 126735}); +---- ok +-STATEMENT CREATE (t:test {prop: 783729}); +---- ok +-STATEMENT CREATE (t:test {prop: 818439}); +---- ok +-STATEMENT CREATE (t:test {prop: 530337}); +---- ok +-STATEMENT CREATE (t:test {prop: 220551}); +---- ok +-STATEMENT CREATE (t:test {prop: 619189}); +---- ok +-STATEMENT CREATE (t:test {prop: 339470}); +---- ok +-STATEMENT CREATE (t:test {prop: 546689}); +---- ok +-STATEMENT CREATE (t:test {prop: 127910}); +---- ok +-STATEMENT CREATE (t:test {prop: 623681}); +---- ok +-STATEMENT CREATE (t:test {prop: 27214}); +---- ok +-STATEMENT CREATE (t:test {prop: 818685}); +---- ok +-STATEMENT CREATE (t:test {prop: 917667}); +---- ok +-STATEMENT CREATE (t:test {prop: 520703}); +---- ok +-STATEMENT CREATE (t:test {prop: 134470}); +---- ok +-STATEMENT CREATE (t:test {prop: 402722}); +---- ok +-STATEMENT CREATE (t:test {prop: 221161}); +---- ok +-STATEMENT CREATE (t:test {prop: 323996}); +---- ok +-STATEMENT CREATE (t:test {prop: 176840}); +---- ok +-STATEMENT CREATE (t:test {prop: 800424}); +---- ok +-STATEMENT CREATE (t:test {prop: 871914}); +---- ok +-STATEMENT CREATE (t:test {prop: 165009}); +---- ok +-STATEMENT CREATE (t:test {prop: 588274}); +---- ok +-STATEMENT CREATE (t:test {prop: 221413}); +---- ok +-STATEMENT CREATE (t:test {prop: 192914}); +---- ok +-STATEMENT CREATE (t:test {prop: 697630}); +---- ok +-STATEMENT CREATE (t:test {prop: 997973}); +---- ok +-STATEMENT CREATE (t:test {prop: 237959}); +---- ok +-STATEMENT CREATE (t:test {prop: 14669}); +---- ok +-STATEMENT CREATE (t:test {prop: 878750}); +---- ok +-STATEMENT CREATE (t:test {prop: 717886}); +---- ok +-STATEMENT CREATE (t:test {prop: 353705}); +---- ok +-STATEMENT CREATE (t:test {prop: 940973}); +---- ok +-STATEMENT CREATE (t:test {prop: 349757}); +---- ok +-STATEMENT CREATE (t:test {prop: 219752}); +---- ok +-STATEMENT CREATE (t:test {prop: 297444}); +---- ok +-STATEMENT CREATE (t:test {prop: 419663}); +---- ok +-STATEMENT CREATE (t:test {prop: 895870}); +---- ok +-STATEMENT CREATE (t:test {prop: 470768}); +---- ok +-STATEMENT CREATE (t:test {prop: 527004}); +---- ok +-STATEMENT CREATE (t:test {prop: 286042}); +---- ok +-STATEMENT CREATE (t:test {prop: 196616}); +---- ok +-STATEMENT CREATE (t:test {prop: 688746}); +---- ok +-STATEMENT CREATE (t:test {prop: 342202}); +---- ok +-STATEMENT CREATE (t:test {prop: 60417}); +---- ok +-STATEMENT CREATE (t:test {prop: 846882}); +---- ok +-STATEMENT CREATE (t:test {prop: 130958}); +---- ok +-STATEMENT CREATE (t:test {prop: 159779}); +---- ok +-STATEMENT CREATE (t:test {prop: 933254}); +---- ok +-STATEMENT CREATE (t:test {prop: 209722}); +---- ok +-STATEMENT CREATE (t:test {prop: 817937}); +---- ok +-STATEMENT CREATE (t:test {prop: 497649}); +---- ok +-STATEMENT CREATE (t:test {prop: 961238}); +---- ok +-STATEMENT CREATE (t:test {prop: 368441}); +---- ok +-STATEMENT CREATE (t:test {prop: 928726}); +---- ok +-STATEMENT CREATE (t:test {prop: 806346}); +---- ok +-STATEMENT CREATE (t:test {prop: 135346}); +---- ok +-STATEMENT CREATE (t:test {prop: 318816}); +---- ok +-STATEMENT CREATE (t:test {prop: 785645}); +---- ok +-STATEMENT CREATE (t:test {prop: 139795}); +---- ok +-STATEMENT CREATE (t:test {prop: 746391}); +---- ok +-STATEMENT CREATE (t:test {prop: 201469}); +---- ok +-STATEMENT CREATE (t:test {prop: 456428}); +---- ok +-STATEMENT CREATE (t:test {prop: 158543}); +---- ok +-STATEMENT CREATE (t:test {prop: 597146}); +---- ok +-STATEMENT CREATE (t:test {prop: 891739}); +---- ok +-STATEMENT CREATE (t:test {prop: 434470}); +---- ok +-STATEMENT CREATE (t:test {prop: 369443}); +---- ok +-STATEMENT CREATE (t:test {prop: 306029}); +---- ok +-STATEMENT CREATE (t:test {prop: 92398}); +---- ok +-STATEMENT CREATE (t:test {prop: 739338}); +---- ok +-STATEMENT CREATE (t:test {prop: 775247}); +---- ok +-STATEMENT CREATE (t:test {prop: 510588}); +---- ok +-STATEMENT CREATE (t:test {prop: 937003}); +---- ok +-STATEMENT CREATE (t:test {prop: 543518}); +---- ok +-STATEMENT CREATE (t:test {prop: 469810}); +---- ok +-STATEMENT CREATE (t:test {prop: 937197}); +---- ok +-STATEMENT CREATE (t:test {prop: 976304}); +---- ok +-STATEMENT CREATE (t:test {prop: 176279}); +---- ok +-STATEMENT CREATE (t:test {prop: 552453}); +---- ok +-STATEMENT CREATE (t:test {prop: 113803}); +---- ok +-STATEMENT CREATE (t:test {prop: 286130}); +---- ok +-STATEMENT CREATE (t:test {prop: 233391}); +---- ok +-STATEMENT CREATE (t:test {prop: 796962}); +---- ok +-STATEMENT CREATE (t:test {prop: 362407}); +---- ok +-STATEMENT CREATE (t:test {prop: 620348}); +---- ok +-STATEMENT CREATE (t:test {prop: 196708}); +---- ok +-STATEMENT CREATE (t:test {prop: 606230}); +---- ok +-STATEMENT CREATE (t:test {prop: 128359}); +---- ok +-STATEMENT CREATE (t:test {prop: 572323}); +---- ok +-STATEMENT CREATE (t:test {prop: 575470}); +---- ok +-STATEMENT CREATE (t:test {prop: 784421}); +---- ok +-STATEMENT CREATE (t:test {prop: 77788}); +---- ok +-STATEMENT CREATE (t:test {prop: 174524}); +---- ok +-STATEMENT CREATE (t:test {prop: 303215}); +---- ok +-STATEMENT CREATE (t:test {prop: 925356}); +---- ok +-STATEMENT CREATE (t:test {prop: 791997}); +---- ok +-STATEMENT CREATE (t:test {prop: 31244}); +---- ok +-STATEMENT CREATE (t:test {prop: 321229}); +---- ok +-STATEMENT CREATE (t:test {prop: 956316}); +---- ok +-STATEMENT CREATE (t:test {prop: 717169}); +---- ok +-STATEMENT CREATE (t:test {prop: 419139}); +---- ok +-STATEMENT CREATE (t:test {prop: 815272}); +---- ok +-STATEMENT CREATE (t:test {prop: 753408}); +---- ok +-STATEMENT CREATE (t:test {prop: 392563}); +---- ok +-STATEMENT CREATE (t:test {prop: 128193}); +---- ok +-STATEMENT CREATE (t:test {prop: 19556}); +---- ok +-STATEMENT CREATE (t:test {prop: 399258}); +---- ok +-STATEMENT CREATE (t:test {prop: 552807}); +---- ok +-STATEMENT CREATE (t:test {prop: 534298}); +---- ok +-STATEMENT CREATE (t:test {prop: 668914}); +---- ok +-STATEMENT CREATE (t:test {prop: 884039}); +---- ok +-STATEMENT CREATE (t:test {prop: 466746}); +---- ok +-STATEMENT CREATE (t:test {prop: 857384}); +---- ok +-STATEMENT CREATE (t:test {prop: 343159}); +---- ok +-STATEMENT CREATE (t:test {prop: 820088}); +---- ok +-STATEMENT CREATE (t:test {prop: 190964}); +---- ok +-STATEMENT CREATE (t:test {prop: 727970}); +---- ok +-STATEMENT CREATE (t:test {prop: 30249}); +---- ok +-STATEMENT CREATE (t:test {prop: 37595}); +---- ok +-STATEMENT CREATE (t:test {prop: 150758}); +---- ok +-STATEMENT CREATE (t:test {prop: 782681}); +---- ok +-STATEMENT CREATE (t:test {prop: 427666}); +---- ok +-STATEMENT CREATE (t:test {prop: 235823}); +---- ok +-STATEMENT CREATE (t:test {prop: 89995}); +---- ok +-STATEMENT CREATE (t:test {prop: 692024}); +---- ok +-STATEMENT CREATE (t:test {prop: 939477}); +---- ok +-STATEMENT CREATE (t:test {prop: 558387}); +---- ok +-STATEMENT CREATE (t:test {prop: 470420}); +---- ok +-STATEMENT CREATE (t:test {prop: 446599}); +---- ok +-STATEMENT CREATE (t:test {prop: 657029}); +---- ok +-STATEMENT CREATE (t:test {prop: 172486}); +---- ok +-STATEMENT CREATE (t:test {prop: 897751}); +---- ok +-STATEMENT CREATE (t:test {prop: 601720}); +---- ok +-STATEMENT CREATE (t:test {prop: 291913}); +---- ok +-STATEMENT CREATE (t:test {prop: 308275}); +---- ok +-STATEMENT CREATE (t:test {prop: 645188}); +---- ok +-STATEMENT CREATE (t:test {prop: 3434}); +---- ok +-STATEMENT CREATE (t:test {prop: 482967}); +---- ok +-STATEMENT CREATE (t:test {prop: 22466}); +---- ok +-STATEMENT CREATE (t:test {prop: 615469}); +---- ok +-STATEMENT CREATE (t:test {prop: 506035}); +---- ok +-STATEMENT CREATE (t:test {prop: 628265}); +---- ok +-STATEMENT CREATE (t:test {prop: 275644}); +---- ok +-STATEMENT CREATE (t:test {prop: 20267}); +---- ok +-STATEMENT CREATE (t:test {prop: 352712}); +---- ok +-STATEMENT CREATE (t:test {prop: 283028}); +---- ok +-STATEMENT CREATE (t:test {prop: 382385}); +---- ok +-STATEMENT CREATE (t:test {prop: 771315}); +---- ok +-STATEMENT CREATE (t:test {prop: 727633}); +---- ok +-STATEMENT CREATE (t:test {prop: 878772}); +---- ok +-STATEMENT CREATE (t:test {prop: 730537}); +---- ok +-STATEMENT CREATE (t:test {prop: 271456}); +---- ok +-STATEMENT CREATE (t:test {prop: 96436}); +---- ok +-STATEMENT CREATE (t:test {prop: 355295}); +---- ok +-STATEMENT CREATE (t:test {prop: 144911}); +---- ok +-STATEMENT CREATE (t:test {prop: 593337}); +---- ok +-STATEMENT CREATE (t:test {prop: 195188}); +---- ok +-STATEMENT CREATE (t:test {prop: 97531}); +---- ok +-STATEMENT CREATE (t:test {prop: 212146}); +---- ok +-STATEMENT CREATE (t:test {prop: 547102}); +---- ok +-STATEMENT CREATE (t:test {prop: 681581}); +---- ok +-STATEMENT CREATE (t:test {prop: 230819}); +---- ok +-STATEMENT CREATE (t:test {prop: 893197}); +---- ok +-STATEMENT CREATE (t:test {prop: 296777}); +---- ok +-STATEMENT CREATE (t:test {prop: 709417}); +---- ok +-STATEMENT CREATE (t:test {prop: 332712}); +---- ok +-STATEMENT CREATE (t:test {prop: 880738}); +---- ok +-STATEMENT CREATE (t:test {prop: 803990}); +---- ok +-STATEMENT CREATE (t:test {prop: 380580}); +---- ok +-STATEMENT CREATE (t:test {prop: 12163}); +---- ok +-STATEMENT CREATE (t:test {prop: 832171}); +---- ok +-STATEMENT CREATE (t:test {prop: 323711}); +---- ok +-STATEMENT CREATE (t:test {prop: 120167}); +---- ok +-STATEMENT CREATE (t:test {prop: 779904}); +---- ok +-STATEMENT CREATE (t:test {prop: 274399}); +---- ok +-STATEMENT CREATE (t:test {prop: 761150}); +---- ok +-STATEMENT CREATE (t:test {prop: 4839}); +---- ok +-STATEMENT CREATE (t:test {prop: 780644}); +---- ok +-STATEMENT CREATE (t:test {prop: 239910}); +---- ok +-STATEMENT CREATE (t:test {prop: 824046}); +---- ok +-STATEMENT CREATE (t:test {prop: 299738}); +---- ok +-STATEMENT CREATE (t:test {prop: 892346}); +---- ok +-STATEMENT CREATE (t:test {prop: 253811}); +---- ok +-STATEMENT CREATE (t:test {prop: 77327}); +---- ok +-STATEMENT CREATE (t:test {prop: 656053}); +---- ok +-STATEMENT CREATE (t:test {prop: 795410}); +---- ok +-STATEMENT CREATE (t:test {prop: 937643}); +---- ok +-STATEMENT CREATE (t:test {prop: 777631}); +---- ok +-STATEMENT CREATE (t:test {prop: 241481}); +---- ok +-STATEMENT CREATE (t:test {prop: 554152}); +---- ok +-STATEMENT CREATE (t:test {prop: 232271}); +---- ok +-STATEMENT CREATE (t:test {prop: 934510}); +---- ok +-STATEMENT CREATE (t:test {prop: 520377}); +---- ok +-STATEMENT CREATE (t:test {prop: 633775}); +---- ok +-STATEMENT CREATE (t:test {prop: 452863}); +---- ok +-STATEMENT CREATE (t:test {prop: 206645}); +---- ok +-STATEMENT CREATE (t:test {prop: 422182}); +---- ok +-STATEMENT CREATE (t:test {prop: 985385}); +---- ok +-STATEMENT CREATE (t:test {prop: 758769}); +---- ok +-STATEMENT CREATE (t:test {prop: 335512}); +---- ok +-STATEMENT CREATE (t:test {prop: 495408}); +---- ok +-STATEMENT CREATE (t:test {prop: 219844}); +---- ok +-STATEMENT CREATE (t:test {prop: 321772}); +---- ok +-STATEMENT CREATE (t:test {prop: 982993}); +---- ok +-STATEMENT CREATE (t:test {prop: 68056}); +---- ok +-STATEMENT CREATE (t:test {prop: 167886}); +---- ok +-STATEMENT CREATE (t:test {prop: 163470}); +---- ok +-STATEMENT CREATE (t:test {prop: 259636}); +---- ok +-STATEMENT CREATE (t:test {prop: 930199}); +---- ok +-STATEMENT CREATE (t:test {prop: 108807}); +---- ok +-STATEMENT CREATE (t:test {prop: 900443}); +---- ok +-STATEMENT CREATE (t:test {prop: 489429}); +---- ok +-STATEMENT CREATE (t:test {prop: 581546}); +---- ok +-STATEMENT CREATE (t:test {prop: 808448}); +---- ok +-STATEMENT CREATE (t:test {prop: 614361}); +---- ok +-STATEMENT CREATE (t:test {prop: 264009}); +---- ok +-STATEMENT CREATE (t:test {prop: 268121}); +---- ok +-STATEMENT CREATE (t:test {prop: 237926}); +---- ok +-STATEMENT CREATE (t:test {prop: 373733}); +---- ok +-STATEMENT CREATE (t:test {prop: 684619}); +---- ok +-STATEMENT CREATE (t:test {prop: 902378}); +---- ok +-STATEMENT CREATE (t:test {prop: 971199}); +---- ok +-STATEMENT CREATE (t:test {prop: 124465}); +---- ok +-STATEMENT CREATE (t:test {prop: 477562}); +---- ok +-STATEMENT CREATE (t:test {prop: 572313}); +---- ok +-STATEMENT CREATE (t:test {prop: 200351}); +---- ok +-STATEMENT CREATE (t:test {prop: 840068}); +---- ok +-STATEMENT CREATE (t:test {prop: 795453}); +---- ok +-STATEMENT CREATE (t:test {prop: 327266}); +---- ok +-STATEMENT CREATE (t:test {prop: 566742}); +---- ok +-STATEMENT CREATE (t:test {prop: 212913}); +---- ok +-STATEMENT CREATE (t:test {prop: 318862}); +---- ok +-STATEMENT CREATE (t:test {prop: 27231}); +---- ok +-STATEMENT CREATE (t:test {prop: 904731}); +---- ok +-STATEMENT CREATE (t:test {prop: 60023}); +---- ok +-STATEMENT CREATE (t:test {prop: 209520}); +---- ok +-STATEMENT CREATE (t:test {prop: 141423}); +---- ok +-STATEMENT CREATE (t:test {prop: 484672}); +---- ok +-STATEMENT CREATE (t:test {prop: 419371}); +---- ok +-STATEMENT CREATE (t:test {prop: 708830}); +---- ok +-STATEMENT CREATE (t:test {prop: 745258}); +---- ok +-STATEMENT CREATE (t:test {prop: 664288}); +---- ok +-STATEMENT CREATE (t:test {prop: 380204}); +---- ok +-STATEMENT CREATE (t:test {prop: 118409}); +---- ok +-STATEMENT CREATE (t:test {prop: 437545}); +---- ok +-STATEMENT CREATE (t:test {prop: 301348}); +---- ok +-STATEMENT CREATE (t:test {prop: 809048}); +---- ok +-STATEMENT CREATE (t:test {prop: 760144}); +---- ok +-STATEMENT CREATE (t:test {prop: 884989}); +---- ok +-STATEMENT CREATE (t:test {prop: 433479}); +---- ok +-STATEMENT CREATE (t:test {prop: 742971}); +---- ok +-STATEMENT CREATE (t:test {prop: 664880}); +---- ok +-STATEMENT CREATE (t:test {prop: 717288}); +---- ok +-STATEMENT CREATE (t:test {prop: 284422}); +---- ok +-STATEMENT CREATE (t:test {prop: 1761}); +---- ok +-STATEMENT CREATE (t:test {prop: 644279}); +---- ok +-STATEMENT CREATE (t:test {prop: 306906}); +---- ok +-STATEMENT CREATE (t:test {prop: 269389}); +---- ok +-STATEMENT CREATE (t:test {prop: 669335}); +---- ok +-STATEMENT CREATE (t:test {prop: 650374}); +---- ok +-STATEMENT CREATE (t:test {prop: 674330}); +---- ok +-STATEMENT CREATE (t:test {prop: 548801}); +---- ok +-STATEMENT CREATE (t:test {prop: 811291}); +---- ok +-STATEMENT CREATE (t:test {prop: 974320}); +---- ok +-STATEMENT CREATE (t:test {prop: 315700}); +---- ok +-STATEMENT CREATE (t:test {prop: 274786}); +---- ok +-STATEMENT CREATE (t:test {prop: 173835}); +---- ok +-STATEMENT CREATE (t:test {prop: 150208}); +---- ok +-STATEMENT CREATE (t:test {prop: 747886}); +---- ok +-STATEMENT CREATE (t:test {prop: 761369}); +---- ok +-STATEMENT CREATE (t:test {prop: 690593}); +---- ok +-STATEMENT CREATE (t:test {prop: 509182}); +---- ok +-STATEMENT CREATE (t:test {prop: 719534}); +---- ok +-STATEMENT CREATE (t:test {prop: 500950}); +---- ok +-STATEMENT CREATE (t:test {prop: 929917}); +---- ok +-STATEMENT CREATE (t:test {prop: 456901}); +---- ok +-STATEMENT CREATE (t:test {prop: 766561}); +---- ok +-STATEMENT CREATE (t:test {prop: 324442}); +---- ok +-STATEMENT CREATE (t:test {prop: 430288}); +---- ok +-STATEMENT CREATE (t:test {prop: 146702}); +---- ok +-STATEMENT CREATE (t:test {prop: 995166}); +---- ok +-STATEMENT CREATE (t:test {prop: 863749}); +---- ok +-STATEMENT CREATE (t:test {prop: 479960}); +---- ok +-STATEMENT CREATE (t:test {prop: 603867}); +---- ok +-STATEMENT CREATE (t:test {prop: 2195}); +---- ok +-STATEMENT CREATE (t:test {prop: 993614}); +---- ok +-STATEMENT CREATE (t:test {prop: 340580}); +---- ok +-STATEMENT CREATE (t:test {prop: 365985}); +---- ok +-STATEMENT CREATE (t:test {prop: 269938}); +---- ok +-STATEMENT CREATE (t:test {prop: 869521}); +---- ok +-STATEMENT CREATE (t:test {prop: 557002}); +---- ok +-STATEMENT CREATE (t:test {prop: 723124}); +---- ok +-STATEMENT CREATE (t:test {prop: 278477}); +---- ok +-STATEMENT CREATE (t:test {prop: 268643}); +---- ok +-STATEMENT CREATE (t:test {prop: 713690}); +---- ok +-STATEMENT CREATE (t:test {prop: 798299}); +---- ok +-STATEMENT CREATE (t:test {prop: 71127}); +---- ok +-STATEMENT CREATE (t:test {prop: 512828}); +---- ok +-STATEMENT CREATE (t:test {prop: 750198}); +---- ok +-STATEMENT CREATE (t:test {prop: 754210}); +---- ok +-STATEMENT CREATE (t:test {prop: 496410}); +---- ok +-STATEMENT CREATE (t:test {prop: 43544}); +---- ok +-STATEMENT CREATE (t:test {prop: 179948}); +---- ok +-STATEMENT CREATE (t:test {prop: 308490}); +---- ok +-STATEMENT CREATE (t:test {prop: 147474}); +---- ok +-STATEMENT CREATE (t:test {prop: 265590}); +---- ok +-STATEMENT CREATE (t:test {prop: 810255}); +---- ok +-STATEMENT CREATE (t:test {prop: 940634}); +---- ok +-STATEMENT CREATE (t:test {prop: 540888}); +---- ok +-STATEMENT CREATE (t:test {prop: 95794}); +---- ok +-STATEMENT CREATE (t:test {prop: 881878}); +---- ok +-STATEMENT CREATE (t:test {prop: 373499}); +---- ok +-STATEMENT CREATE (t:test {prop: 791261}); +---- ok +-STATEMENT CREATE (t:test {prop: 530229}); +---- ok +-STATEMENT CREATE (t:test {prop: 552755}); +---- ok +-STATEMENT CREATE (t:test {prop: 316295}); +---- ok +-STATEMENT CREATE (t:test {prop: 151975}); +---- ok +-STATEMENT CREATE (t:test {prop: 562826}); +---- ok +-STATEMENT CREATE (t:test {prop: 771877}); +---- ok +-STATEMENT CREATE (t:test {prop: 382975}); +---- ok +-STATEMENT CREATE (t:test {prop: 440525}); +---- ok +-STATEMENT CREATE (t:test {prop: 960604}); +---- ok +-STATEMENT CREATE (t:test {prop: 575034}); +---- ok +-STATEMENT CREATE (t:test {prop: 631950}); +---- ok +-STATEMENT CREATE (t:test {prop: 782762}); +---- ok +-STATEMENT CREATE (t:test {prop: 630574}); +---- ok +-STATEMENT CREATE (t:test {prop: 760790}); +---- ok +-STATEMENT CREATE (t:test {prop: 241489}); +---- ok +-STATEMENT CREATE (t:test {prop: 614085}); +---- ok +-STATEMENT CREATE (t:test {prop: 982827}); +---- ok +-STATEMENT CREATE (t:test {prop: 384599}); +---- ok +-STATEMENT CREATE (t:test {prop: 784926}); +---- ok +-STATEMENT CREATE (t:test {prop: 704460}); +---- ok +-STATEMENT CREATE (t:test {prop: 273834}); +---- ok +-STATEMENT CREATE (t:test {prop: 332767}); +---- ok +-STATEMENT CREATE (t:test {prop: 129881}); +---- ok +-STATEMENT CREATE (t:test {prop: 384980}); +---- ok +-STATEMENT CREATE (t:test {prop: 531856}); +---- ok +-STATEMENT CREATE (t:test {prop: 506483}); +---- ok +-STATEMENT CREATE (t:test {prop: 924949}); +---- ok +-STATEMENT CREATE (t:test {prop: 669037}); +---- ok +-STATEMENT CREATE (t:test {prop: 758086}); +---- ok +-STATEMENT CREATE (t:test {prop: 471476}); +---- ok +-STATEMENT CREATE (t:test {prop: 542600}); +---- ok +-STATEMENT CREATE (t:test {prop: 561818}); +---- ok +-STATEMENT CREATE (t:test {prop: 494902}); +---- ok +-STATEMENT CREATE (t:test {prop: 325230}); +---- ok +-STATEMENT CREATE (t:test {prop: 298027}); +---- ok +-STATEMENT CREATE (t:test {prop: 546207}); +---- ok +-STATEMENT CREATE (t:test {prop: 498199}); +---- ok +-STATEMENT CREATE (t:test {prop: 874482}); +---- ok +-STATEMENT CREATE (t:test {prop: 265035}); +---- ok +-STATEMENT CREATE (t:test {prop: 89844}); +---- ok +-STATEMENT CREATE (t:test {prop: 307894}); +---- ok +-STATEMENT CREATE (t:test {prop: 256647}); +---- ok +-STATEMENT CREATE (t:test {prop: 217820}); +---- ok +-STATEMENT CREATE (t:test {prop: 810695}); +---- ok +-STATEMENT CREATE (t:test {prop: 287305}); +---- ok +-STATEMENT CREATE (t:test {prop: 127019}); +---- ok +-STATEMENT CREATE (t:test {prop: 65217}); +---- ok +-STATEMENT CREATE (t:test {prop: 680781}); +---- ok +-STATEMENT CREATE (t:test {prop: 662241}); +---- ok +-STATEMENT CREATE (t:test {prop: 300777}); +---- ok +-STATEMENT CREATE (t:test {prop: 505357}); +---- ok +-STATEMENT CREATE (t:test {prop: 507745}); +---- ok +-STATEMENT CREATE (t:test {prop: 555746}); +---- ok +-STATEMENT CREATE (t:test {prop: 8526}); +---- ok +-STATEMENT CREATE (t:test {prop: 561425}); +---- ok +-STATEMENT CREATE (t:test {prop: 595521}); +---- ok +-STATEMENT CREATE (t:test {prop: 259853}); +---- ok +-STATEMENT CREATE (t:test {prop: 357914}); +---- ok +-STATEMENT CREATE (t:test {prop: 874885}); +---- ok +-STATEMENT CREATE (t:test {prop: 292971}); +---- ok +-STATEMENT CREATE (t:test {prop: 391049}); +---- ok +-STATEMENT CREATE (t:test {prop: 889987}); +---- ok +-STATEMENT CREATE (t:test {prop: 745779}); +---- ok +-STATEMENT CREATE (t:test {prop: 824778}); +---- ok +-STATEMENT CREATE (t:test {prop: 89549}); +---- ok +-STATEMENT CREATE (t:test {prop: 687521}); +---- ok +-STATEMENT CREATE (t:test {prop: 194987}); +---- ok +-STATEMENT CREATE (t:test {prop: 755664}); +---- ok +-STATEMENT CREATE (t:test {prop: 346019}); +---- ok +-STATEMENT CREATE (t:test {prop: 323425}); +---- ok +-STATEMENT CREATE (t:test {prop: 82884}); +---- ok +-STATEMENT CREATE (t:test {prop: 281275}); +---- ok +-STATEMENT CREATE (t:test {prop: 75403}); +---- ok +-STATEMENT CREATE (t:test {prop: 169943}); +---- ok +-STATEMENT CREATE (t:test {prop: 361944}); +---- ok +-STATEMENT CREATE (t:test {prop: 572366}); +---- ok +-STATEMENT CREATE (t:test {prop: 218731}); +---- ok +-STATEMENT CREATE (t:test {prop: 614224}); +---- ok +-STATEMENT CREATE (t:test {prop: 434680}); +---- ok +-STATEMENT CREATE (t:test {prop: 389874}); +---- ok +-STATEMENT CREATE (t:test {prop: 236909}); +---- ok +-STATEMENT CREATE (t:test {prop: 560432}); +---- ok +-STATEMENT CREATE (t:test {prop: 897786}); +---- ok +-STATEMENT CREATE (t:test {prop: 922323}); +---- ok +-STATEMENT CREATE (t:test {prop: 370066}); +---- ok +-STATEMENT CREATE (t:test {prop: 484203}); +---- ok +-STATEMENT CREATE (t:test {prop: 53803}); +---- ok +-STATEMENT CREATE (t:test {prop: 630707}); +---- ok +-STATEMENT CREATE (t:test {prop: 731110}); +---- ok +-STATEMENT CREATE (t:test {prop: 260727}); +---- ok +-STATEMENT CREATE (t:test {prop: 669056}); +---- ok +-STATEMENT CREATE (t:test {prop: 904379}); +---- ok +-STATEMENT CREATE (t:test {prop: 905870}); +---- ok +-STATEMENT CREATE (t:test {prop: 991517}); +---- ok +-STATEMENT CREATE (t:test {prop: 904342}); +---- ok +-STATEMENT CREATE (t:test {prop: 425875}); +---- ok +-STATEMENT CREATE (t:test {prop: 806927}); +---- ok +-STATEMENT CREATE (t:test {prop: 48880}); +---- ok +-STATEMENT CREATE (t:test {prop: 437849}); +---- ok +-STATEMENT CREATE (t:test {prop: 332282}); +---- ok +-STATEMENT CREATE (t:test {prop: 59436}); +---- ok +-STATEMENT CREATE (t:test {prop: 737651}); +---- ok +-STATEMENT CREATE (t:test {prop: 382022}); +---- ok +-STATEMENT CREATE (t:test {prop: 333479}); +---- ok +-STATEMENT CREATE (t:test {prop: 958697}); +---- ok +-STATEMENT CREATE (t:test {prop: 89955}); +---- ok +-STATEMENT CREATE (t:test {prop: 760444}); +---- ok +-STATEMENT CREATE (t:test {prop: 204646}); +---- ok +-STATEMENT CREATE (t:test {prop: 990923}); +---- ok +-STATEMENT CREATE (t:test {prop: 746691}); +---- ok +-STATEMENT CREATE (t:test {prop: 801187}); +---- ok +-STATEMENT CREATE (t:test {prop: 753354}); +---- ok +-STATEMENT CREATE (t:test {prop: 245238}); +---- ok +-STATEMENT CREATE (t:test {prop: 750171}); +---- ok +-STATEMENT CREATE (t:test {prop: 720197}); +---- ok +-STATEMENT CREATE (t:test {prop: 434119}); +---- ok +-STATEMENT CREATE (t:test {prop: 439636}); +---- ok +-STATEMENT CREATE (t:test {prop: 96062}); +---- ok +-STATEMENT CREATE (t:test {prop: 665689}); +---- ok +-STATEMENT CREATE (t:test {prop: 299090}); +---- ok +-STATEMENT CREATE (t:test {prop: 319159}); +---- ok +-STATEMENT CREATE (t:test {prop: 34288}); +---- ok +-STATEMENT CREATE (t:test {prop: 636125}); +---- ok +-STATEMENT CREATE (t:test {prop: 457797}); +---- ok +-STATEMENT CREATE (t:test {prop: 218939}); +---- ok +-STATEMENT CREATE (t:test {prop: 614395}); +---- ok +-STATEMENT CREATE (t:test {prop: 632369}); +---- ok +-STATEMENT CREATE (t:test {prop: 797386}); +---- ok +-STATEMENT CREATE (t:test {prop: 477391}); +---- ok +-STATEMENT CREATE (t:test {prop: 236883}); +---- ok +-STATEMENT CREATE (t:test {prop: 614749}); +---- ok +-STATEMENT CREATE (t:test {prop: 907067}); +---- ok +-STATEMENT CREATE (t:test {prop: 208555}); +---- ok +-STATEMENT CREATE (t:test {prop: 808814}); +---- ok +-STATEMENT CREATE (t:test {prop: 4495}); +---- ok +-STATEMENT CREATE (t:test {prop: 606794}); +---- ok +-STATEMENT CREATE (t:test {prop: 218943}); +---- ok +-STATEMENT CREATE (t:test {prop: 483734}); +---- ok +-STATEMENT CREATE (t:test {prop: 752239}); +---- ok +-STATEMENT CREATE (t:test {prop: 788234}); +---- ok +-STATEMENT CREATE (t:test {prop: 634463}); +---- ok +-STATEMENT CREATE (t:test {prop: 326046}); +---- ok +-STATEMENT CREATE (t:test {prop: 976531}); +---- ok +-STATEMENT CREATE (t:test {prop: 628417}); +---- ok +-STATEMENT CREATE (t:test {prop: 833826}); +---- ok +-STATEMENT CREATE (t:test {prop: 620374}); +---- ok +-STATEMENT CREATE (t:test {prop: 567590}); +---- ok +-STATEMENT CREATE (t:test {prop: 604618}); +---- ok +-STATEMENT CREATE (t:test {prop: 747497}); +---- ok +-STATEMENT CREATE (t:test {prop: 486988}); +---- ok +-STATEMENT CREATE (t:test {prop: 109535}); +---- ok +-STATEMENT CREATE (t:test {prop: 496197}); +---- ok +-STATEMENT CREATE (t:test {prop: 738963}); +---- ok +-STATEMENT CREATE (t:test {prop: 273892}); +---- ok +-STATEMENT CREATE (t:test {prop: 189246}); +---- ok +-STATEMENT CREATE (t:test {prop: 232509}); +---- ok +-STATEMENT CREATE (t:test {prop: 500174}); +---- ok +-STATEMENT CREATE (t:test {prop: 581074}); +---- ok +-STATEMENT CREATE (t:test {prop: 429953}); +---- ok +-STATEMENT CREATE (t:test {prop: 260031}); +---- ok +-STATEMENT CREATE (t:test {prop: 623680}); +---- ok +-STATEMENT CREATE (t:test {prop: 886209}); +---- ok +-STATEMENT CREATE (t:test {prop: 901904}); +---- ok +-STATEMENT CREATE (t:test {prop: 596979}); +---- ok +-STATEMENT CREATE (t:test {prop: 764464}); +---- ok +-STATEMENT CREATE (t:test {prop: 475082}); +---- ok +-STATEMENT CREATE (t:test {prop: 423942}); +---- ok +-STATEMENT CREATE (t:test {prop: 269150}); +---- ok +-STATEMENT CREATE (t:test {prop: 504777}); +---- ok +-STATEMENT CREATE (t:test {prop: 17338}); +---- ok +-STATEMENT CREATE (t:test {prop: 9637}); +---- ok +-STATEMENT CREATE (t:test {prop: 300252}); +---- ok +-STATEMENT CREATE (t:test {prop: 304908}); +---- ok +-STATEMENT CREATE (t:test {prop: 878501}); +---- ok +-STATEMENT CREATE (t:test {prop: 371476}); +---- ok +-STATEMENT CREATE (t:test {prop: 573979}); +---- ok +-STATEMENT CREATE (t:test {prop: 778991}); +---- ok +-STATEMENT CREATE (t:test {prop: 960744}); +---- ok +-STATEMENT CREATE (t:test {prop: 975141}); +---- ok +-STATEMENT CREATE (t:test {prop: 850884}); +---- ok +-STATEMENT CREATE (t:test {prop: 415192}); +---- ok +-STATEMENT CREATE (t:test {prop: 495494}); +---- ok +-STATEMENT CREATE (t:test {prop: 992602}); +---- ok +-STATEMENT CREATE (t:test {prop: 793277}); +---- ok +-STATEMENT CREATE (t:test {prop: 612732}); +---- ok +-STATEMENT CREATE (t:test {prop: 105831}); +---- ok +-STATEMENT CREATE (t:test {prop: 327762}); +---- ok +-STATEMENT CREATE (t:test {prop: 645826}); +---- ok +-STATEMENT CREATE (t:test {prop: 146625}); +---- ok +-STATEMENT CREATE (t:test {prop: 354489}); +---- ok +-STATEMENT CREATE (t:test {prop: 492603}); +---- ok +-STATEMENT CREATE (t:test {prop: 725150}); +---- ok +-STATEMENT CREATE (t:test {prop: 167161}); +---- ok +-STATEMENT CREATE (t:test {prop: 394122}); +---- ok +-STATEMENT CREATE (t:test {prop: 785527}); +---- ok +-STATEMENT CREATE (t:test {prop: 187229}); +---- ok +-STATEMENT CREATE (t:test {prop: 102192}); +---- ok +-STATEMENT CREATE (t:test {prop: 49245}); +---- ok +-STATEMENT CREATE (t:test {prop: 360388}); +---- ok +-STATEMENT CREATE (t:test {prop: 769748}); +---- ok +-STATEMENT CREATE (t:test {prop: 376161}); +---- ok +-STATEMENT CREATE (t:test {prop: 908088}); +---- ok +-STATEMENT CREATE (t:test {prop: 532328}); +---- ok +-STATEMENT CREATE (t:test {prop: 370076}); +---- ok +-STATEMENT CREATE (t:test {prop: 947230}); +---- ok +-STATEMENT CREATE (t:test {prop: 632690}); +---- ok +-STATEMENT CREATE (t:test {prop: 42604}); +---- ok +-STATEMENT CREATE (t:test {prop: 326072}); +---- ok +-STATEMENT CREATE (t:test {prop: 646582}); +---- ok +-STATEMENT CREATE (t:test {prop: 51452}); +---- ok +-STATEMENT CREATE (t:test {prop: 391618}); +---- ok +-STATEMENT CREATE (t:test {prop: 755368}); +---- ok +-STATEMENT CREATE (t:test {prop: 889259}); +---- ok +-STATEMENT CREATE (t:test {prop: 552195}); +---- ok +-STATEMENT CREATE (t:test {prop: 658125}); +---- ok +-STATEMENT CREATE (t:test {prop: 286871}); +---- ok +-STATEMENT CREATE (t:test {prop: 929406}); +---- ok +-STATEMENT CREATE (t:test {prop: 311029}); +---- ok +-STATEMENT CREATE (t:test {prop: 501339}); +---- ok +-STATEMENT CREATE (t:test {prop: 853487}); +---- ok +-STATEMENT CREATE (t:test {prop: 964435}); +---- ok +-STATEMENT CREATE (t:test {prop: 594886}); +---- ok +-STATEMENT CREATE (t:test {prop: 733877}); +---- ok +-STATEMENT CREATE (t:test {prop: 219852}); +---- ok +-STATEMENT CREATE (t:test {prop: 934651}); +---- ok +-STATEMENT CREATE (t:test {prop: 819591}); +---- ok +-STATEMENT CREATE (t:test {prop: 549760}); +---- ok +-STATEMENT CREATE (t:test {prop: 138436}); +---- ok +-STATEMENT CREATE (t:test {prop: 34891}); +---- ok +-STATEMENT CREATE (t:test {prop: 467588}); +---- ok +-STATEMENT CREATE (t:test {prop: 928302}); +---- ok +-STATEMENT CREATE (t:test {prop: 487822}); +---- ok +-STATEMENT CREATE (t:test {prop: 322249}); +---- ok +-STATEMENT CREATE (t:test {prop: 623834}); +---- ok +-STATEMENT CREATE (t:test {prop: 357490}); +---- ok +-STATEMENT CREATE (t:test {prop: 61461}); +---- ok +-STATEMENT CREATE (t:test {prop: 867039}); +---- ok +-STATEMENT CREATE (t:test {prop: 990000}); +---- ok +-STATEMENT CREATE (t:test {prop: 68168}); +---- ok +-STATEMENT CREATE (t:test {prop: 100576}); +---- ok +-STATEMENT CREATE (t:test {prop: 472431}); +---- ok +-STATEMENT CREATE (t:test {prop: 645998}); +---- ok +-STATEMENT CREATE (t:test {prop: 407648}); +---- ok +-STATEMENT CREATE (t:test {prop: 34604}); +---- ok +-STATEMENT CREATE (t:test {prop: 622750}); +---- ok +-STATEMENT CREATE (t:test {prop: 950319}); +---- ok +-STATEMENT CREATE (t:test {prop: 556042}); +---- ok +-STATEMENT CREATE (t:test {prop: 144215}); +---- ok +-STATEMENT CREATE (t:test {prop: 940580}); +---- ok +-STATEMENT CREATE (t:test {prop: 428599}); +---- ok +-STATEMENT CREATE (t:test {prop: 633695}); +---- ok +-STATEMENT CREATE (t:test {prop: 938826}); +---- ok +-STATEMENT CREATE (t:test {prop: 623797}); +---- ok +-STATEMENT CREATE (t:test {prop: 574968}); +---- ok +-STATEMENT CREATE (t:test {prop: 533149}); +---- ok +-STATEMENT CREATE (t:test {prop: 579194}); +---- ok +-STATEMENT CREATE (t:test {prop: 569163}); +---- ok +-STATEMENT CREATE (t:test {prop: 280437}); +---- ok +-STATEMENT CREATE (t:test {prop: 833828}); +---- ok +-STATEMENT CREATE (t:test {prop: 618510}); +---- ok +-STATEMENT CREATE (t:test {prop: 956161}); +---- ok +-STATEMENT CREATE (t:test {prop: 197670}); +---- ok +-STATEMENT CREATE (t:test {prop: 677520}); +---- ok +-STATEMENT CREATE (t:test {prop: 259571}); +---- ok +-STATEMENT CREATE (t:test {prop: 107314}); +---- ok +-STATEMENT CREATE (t:test {prop: 9704}); +---- ok +-STATEMENT CREATE (t:test {prop: 982568}); +---- ok +-STATEMENT CREATE (t:test {prop: 162026}); +---- ok +-STATEMENT CREATE (t:test {prop: 232002}); +---- ok +-STATEMENT CREATE (t:test {prop: 900429}); +---- ok +-STATEMENT CREATE (t:test {prop: 673846}); +---- ok +-STATEMENT CREATE (t:test {prop: 795941}); +---- ok +-STATEMENT CREATE (t:test {prop: 936612}); +---- ok +-STATEMENT CREATE (t:test {prop: 959377}); +---- ok +-STATEMENT CREATE (t:test {prop: 406750}); +---- ok +-STATEMENT CREATE (t:test {prop: 776599}); +---- ok +-STATEMENT CREATE (t:test {prop: 451855}); +---- ok +-STATEMENT CREATE (t:test {prop: 640583}); +---- ok +-STATEMENT CREATE (t:test {prop: 914089}); +---- ok +-STATEMENT CREATE (t:test {prop: 432926}); +---- ok +-STATEMENT CREATE (t:test {prop: 943100}); +---- ok +-STATEMENT CREATE (t:test {prop: 961565}); +---- ok +-STATEMENT CREATE (t:test {prop: 386717}); +---- ok +-STATEMENT CREATE (t:test {prop: 497680}); +---- ok +-STATEMENT CREATE (t:test {prop: 8800}); +---- ok +-STATEMENT CREATE (t:test {prop: 385892}); +---- ok +-STATEMENT CREATE (t:test {prop: 905932}); +---- ok +-STATEMENT CREATE (t:test {prop: 362980}); +---- ok +-STATEMENT CREATE (t:test {prop: 532186}); +---- ok +-STATEMENT CREATE (t:test {prop: 228897}); +---- ok +-STATEMENT CREATE (t:test {prop: 165958}); +---- ok +-STATEMENT CREATE (t:test {prop: 570252}); +---- ok +-STATEMENT CREATE (t:test {prop: 395756}); +---- ok +-STATEMENT CREATE (t:test {prop: 661378}); +---- ok +-STATEMENT CREATE (t:test {prop: 582059}); +---- ok +-STATEMENT CREATE (t:test {prop: 971775}); +---- ok +-STATEMENT CREATE (t:test {prop: 813048}); +---- ok +-STATEMENT CREATE (t:test {prop: 768649}); +---- ok +-STATEMENT CREATE (t:test {prop: 199871}); +---- ok +-STATEMENT CREATE (t:test {prop: 128016}); +---- ok +-STATEMENT CREATE (t:test {prop: 90354}); +---- ok +-STATEMENT CREATE (t:test {prop: 100904}); +---- ok +-STATEMENT CREATE (t:test {prop: 453560}); +---- ok +-STATEMENT CREATE (t:test {prop: 108084}); +---- ok +-STATEMENT CREATE (t:test {prop: 338778}); +---- ok +-STATEMENT CREATE (t:test {prop: 585197}); +---- ok +-STATEMENT CREATE (t:test {prop: 666421}); +---- ok +-STATEMENT CREATE (t:test {prop: 550388}); +---- ok +-STATEMENT CREATE (t:test {prop: 346603}); +---- ok +-STATEMENT CREATE (t:test {prop: 327889}); +---- ok +-STATEMENT CREATE (t:test {prop: 519485}); +---- ok +-STATEMENT CREATE (t:test {prop: 141745}); +---- ok +-STATEMENT CREATE (t:test {prop: 21664}); +---- ok +-STATEMENT CREATE (t:test {prop: 834470}); +---- ok +-STATEMENT CREATE (t:test {prop: 547715}); +---- ok +-STATEMENT CREATE (t:test {prop: 586975}); +---- ok +-STATEMENT CREATE (t:test {prop: 508413}); +---- ok +-STATEMENT CREATE (t:test {prop: 194750}); +---- ok +-STATEMENT CREATE (t:test {prop: 988334}); +---- ok +-STATEMENT CREATE (t:test {prop: 151581}); +---- ok +-STATEMENT CREATE (t:test {prop: 134692}); +---- ok +-STATEMENT CREATE (t:test {prop: 543644}); +---- ok +-STATEMENT CREATE (t:test {prop: 541258}); +---- ok +-STATEMENT CREATE (t:test {prop: 371080}); +---- ok +-STATEMENT CREATE (t:test {prop: 51860}); +---- ok +-STATEMENT CREATE (t:test {prop: 906142}); +---- ok +-STATEMENT CREATE (t:test {prop: 411201}); +---- ok +-STATEMENT CREATE (t:test {prop: 144667}); +---- ok +-STATEMENT CREATE (t:test {prop: 737389}); +---- ok +-STATEMENT CREATE (t:test {prop: 125345}); +---- ok +-STATEMENT CREATE (t:test {prop: 197370}); +---- ok +-STATEMENT CREATE (t:test {prop: 553197}); +---- ok +-STATEMENT CREATE (t:test {prop: 428304}); +---- ok +-STATEMENT CREATE (t:test {prop: 219743}); +---- ok +-STATEMENT CREATE (t:test {prop: 123512}); +---- ok +-STATEMENT CREATE (t:test {prop: 461532}); +---- ok +-STATEMENT CREATE (t:test {prop: 552543}); +---- ok +-STATEMENT CREATE (t:test {prop: 191515}); +---- ok +-STATEMENT CREATE (t:test {prop: 552984}); +---- ok +-STATEMENT CREATE (t:test {prop: 397495}); +---- ok +-STATEMENT CREATE (t:test {prop: 427318}); +---- ok +-STATEMENT CREATE (t:test {prop: 567582}); +---- ok +-STATEMENT CREATE (t:test {prop: 279759}); +---- ok +-STATEMENT CREATE (t:test {prop: 240940}); +---- ok +-STATEMENT CREATE (t:test {prop: 289181}); +---- ok +-STATEMENT CREATE (t:test {prop: 814392}); +---- ok +-STATEMENT CREATE (t:test {prop: 835788}); +---- ok +-STATEMENT CREATE (t:test {prop: 634871}); +---- ok +-STATEMENT CREATE (t:test {prop: 737299}); +---- ok +-STATEMENT CREATE (t:test {prop: 839963}); +---- ok +-STATEMENT CREATE (t:test {prop: 128027}); +---- ok +-STATEMENT CREATE (t:test {prop: 38976}); +---- ok +-STATEMENT CREATE (t:test {prop: 953538}); +---- ok +-STATEMENT CREATE (t:test {prop: 38471}); +---- ok +-STATEMENT CREATE (t:test {prop: 591143}); +---- ok +-STATEMENT CREATE (t:test {prop: 921012}); +---- ok +-STATEMENT CREATE (t:test {prop: 61771}); +---- ok +-STATEMENT CREATE (t:test {prop: 857227}); +---- ok +-STATEMENT CREATE (t:test {prop: 911381}); +---- ok +-STATEMENT CREATE (t:test {prop: 224493}); +---- ok +-STATEMENT CREATE (t:test {prop: 924850}); +---- ok +-STATEMENT CREATE (t:test {prop: 471769}); +---- ok +-STATEMENT CREATE (t:test {prop: 318394}); +---- ok +-STATEMENT CREATE (t:test {prop: 816080}); +---- ok +-STATEMENT CREATE (t:test {prop: 833378}); +---- ok +-STATEMENT CREATE (t:test {prop: 706556}); +---- ok +-STATEMENT CREATE (t:test {prop: 61654}); +---- ok +-STATEMENT CREATE (t:test {prop: 441489}); +---- ok +-STATEMENT CREATE (t:test {prop: 831429}); +---- ok +-STATEMENT CREATE (t:test {prop: 591137}); +---- ok +-STATEMENT CREATE (t:test {prop: 289640}); +---- ok +-STATEMENT CREATE (t:test {prop: 346239}); +---- ok +-STATEMENT CREATE (t:test {prop: 380691}); +---- ok +-STATEMENT CREATE (t:test {prop: 754250}); +---- ok +-STATEMENT CREATE (t:test {prop: 705140}); +---- ok +-STATEMENT CREATE (t:test {prop: 943374}); +---- ok +-STATEMENT CREATE (t:test {prop: 47774}); +---- ok +-STATEMENT CREATE (t:test {prop: 468133}); +---- ok +-STATEMENT CREATE (t:test {prop: 62081}); +---- ok +-STATEMENT CREATE (t:test {prop: 622803}); +---- ok +-STATEMENT CREATE (t:test {prop: 851604}); +---- ok +-STATEMENT CREATE (t:test {prop: 29283}); +---- ok +-STATEMENT CREATE (t:test {prop: 773928}); +---- ok +-STATEMENT CREATE (t:test {prop: 544431}); +---- ok +-STATEMENT CREATE (t:test {prop: 472881}); +---- ok +-STATEMENT CREATE (t:test {prop: 292574}); +---- ok +-STATEMENT CREATE (t:test {prop: 605901}); +---- ok +-STATEMENT CREATE (t:test {prop: 547119}); +---- ok +-STATEMENT CREATE (t:test {prop: 680039}); +---- ok +-STATEMENT CREATE (t:test {prop: 344033}); +---- ok +-STATEMENT CREATE (t:test {prop: 992349}); +---- ok +-STATEMENT CREATE (t:test {prop: 385639}); +---- ok +-STATEMENT CREATE (t:test {prop: 474245}); +---- ok +-STATEMENT CREATE (t:test {prop: 547119}); +---- ok +-STATEMENT CREATE (t:test {prop: 401560}); +---- ok +-STATEMENT CREATE (t:test {prop: 448118}); +---- ok +-STATEMENT CREATE (t:test {prop: 396103}); +---- ok +-STATEMENT CREATE (t:test {prop: 993348}); +---- ok +-STATEMENT CREATE (t:test {prop: 342736}); +---- ok +-STATEMENT CREATE (t:test {prop: 960686}); +---- ok +-STATEMENT CREATE (t:test {prop: 377162}); +---- ok +-STATEMENT CREATE (t:test {prop: 506965}); +---- ok +-STATEMENT CREATE (t:test {prop: 990963}); +---- ok +-STATEMENT CREATE (t:test {prop: 180400}); +---- ok +-STATEMENT CREATE (t:test {prop: 771146}); +---- ok +-STATEMENT CREATE (t:test {prop: 233870}); +---- ok +-STATEMENT CREATE (t:test {prop: 431601}); +---- ok +-STATEMENT CREATE (t:test {prop: 817283}); +---- ok +-STATEMENT CREATE (t:test {prop: 923965}); +---- ok +-STATEMENT CREATE (t:test {prop: 90218}); +---- ok +-STATEMENT CREATE (t:test {prop: 549524}); +---- ok +-STATEMENT CREATE (t:test {prop: 752106}); +---- ok +-STATEMENT CREATE (t:test {prop: 959393}); +---- ok +-STATEMENT CREATE (t:test {prop: 775956}); +---- ok +-STATEMENT CREATE (t:test {prop: 438903}); +---- ok +-STATEMENT CREATE (t:test {prop: 222788}); +---- ok +-STATEMENT CREATE (t:test {prop: 280597}); +---- ok +-STATEMENT CREATE (t:test {prop: 59149}); +---- ok +-STATEMENT CREATE (t:test {prop: 49899}); +---- ok +-STATEMENT CREATE (t:test {prop: 396243}); +---- ok +-STATEMENT CREATE (t:test {prop: 730633}); +---- ok +-STATEMENT CREATE (t:test {prop: 835319}); +---- ok +-STATEMENT CREATE (t:test {prop: 603102}); +---- ok +-STATEMENT CREATE (t:test {prop: 11718}); +---- ok +-STATEMENT CREATE (t:test {prop: 1681}); +---- ok +-STATEMENT CREATE (t:test {prop: 936535}); +---- ok +-STATEMENT CREATE (t:test {prop: 849208}); +---- ok +-STATEMENT CREATE (t:test {prop: 398211}); +---- ok +-STATEMENT CREATE (t:test {prop: 28062}); +---- ok +-STATEMENT CREATE (t:test {prop: 691954}); +---- ok +-STATEMENT CREATE (t:test {prop: 225569}); +---- ok +-STATEMENT CREATE (t:test {prop: 735922}); +---- ok +-STATEMENT CREATE (t:test {prop: 260550}); +---- ok +-STATEMENT CREATE (t:test {prop: 886251}); +---- ok +-STATEMENT CREATE (t:test {prop: 215572}); +---- ok +-STATEMENT CREATE (t:test {prop: 22865}); +---- ok +-STATEMENT CREATE (t:test {prop: 687021}); +---- ok +-STATEMENT CREATE (t:test {prop: 84655}); +---- ok +-STATEMENT CREATE (t:test {prop: 537092}); +---- ok +-STATEMENT CREATE (t:test {prop: 531870}); +---- ok +-STATEMENT CREATE (t:test {prop: 492492}); +---- ok +-STATEMENT CREATE (t:test {prop: 469611}); +---- ok +-STATEMENT CREATE (t:test {prop: 438585}); +---- ok +-STATEMENT CREATE (t:test {prop: 404831}); +---- ok +-STATEMENT CREATE (t:test {prop: 309193}); +---- ok +-STATEMENT CREATE (t:test {prop: 254136}); +---- ok +-STATEMENT CREATE (t:test {prop: 514974}); +---- ok +-STATEMENT CREATE (t:test {prop: 207910}); +---- ok +-STATEMENT CREATE (t:test {prop: 823978}); +---- ok +-STATEMENT CREATE (t:test {prop: 981212}); +---- ok +-STATEMENT CREATE (t:test {prop: 504102}); +---- ok +-STATEMENT CREATE (t:test {prop: 292888}); +---- ok +-STATEMENT CREATE (t:test {prop: 73790}); +---- ok +-STATEMENT CREATE (t:test {prop: 179174}); +---- ok +-STATEMENT CREATE (t:test {prop: 63323}); +---- ok +-STATEMENT CREATE (t:test {prop: 110454}); +---- ok +-STATEMENT CREATE (t:test {prop: 678593}); +---- ok +-STATEMENT CREATE (t:test {prop: 438320}); +---- ok +-STATEMENT CREATE (t:test {prop: 715103}); +---- ok +-STATEMENT CREATE (t:test {prop: 345642}); +---- ok +-STATEMENT CREATE (t:test {prop: 899499}); +---- ok +-STATEMENT CREATE (t:test {prop: 754687}); +---- ok +-STATEMENT CREATE (t:test {prop: 592302}); +---- ok +-STATEMENT CREATE (t:test {prop: 538914}); +---- ok +-STATEMENT CREATE (t:test {prop: 495025}); +---- ok +-STATEMENT CREATE (t:test {prop: 768234}); +---- ok +-STATEMENT CREATE (t:test {prop: 453065}); +---- ok +-STATEMENT CREATE (t:test {prop: 357912}); +---- ok +-STATEMENT CREATE (t:test {prop: 355541}); +---- ok +-STATEMENT CREATE (t:test {prop: 273109}); +---- ok +-STATEMENT CREATE (t:test {prop: 226859}); +---- ok +-STATEMENT CREATE (t:test {prop: 597680}); +---- ok +-STATEMENT CREATE (t:test {prop: 141128}); +---- ok +-STATEMENT CREATE (t:test {prop: 951732}); +---- ok +-STATEMENT CREATE (t:test {prop: 979222}); +---- ok +-STATEMENT CREATE (t:test {prop: 896553}); +---- ok +-STATEMENT CREATE (t:test {prop: 621496}); +---- ok +-STATEMENT CREATE (t:test {prop: 338268}); +---- ok +-STATEMENT CREATE (t:test {prop: 502825}); +---- ok +-STATEMENT CREATE (t:test {prop: 709303}); +---- ok +-STATEMENT CREATE (t:test {prop: 836161}); +---- ok +-STATEMENT CREATE (t:test {prop: 134591}); +---- ok +-STATEMENT CREATE (t:test {prop: 988698}); +---- ok +-STATEMENT CREATE (t:test {prop: 503429}); +---- ok +-STATEMENT CREATE (t:test {prop: 762521}); +---- ok +-STATEMENT CREATE (t:test {prop: 889113}); +---- ok +-STATEMENT CREATE (t:test {prop: 802569}); +---- ok +-STATEMENT CREATE (t:test {prop: 506447}); +---- ok +-STATEMENT CREATE (t:test {prop: 424769}); +---- ok +-STATEMENT CREATE (t:test {prop: 15789}); +---- ok +-STATEMENT CREATE (t:test {prop: 625731}); +---- ok +-STATEMENT CREATE (t:test {prop: 458524}); +---- ok +-STATEMENT CREATE (t:test {prop: 456883}); +---- ok +-STATEMENT CREATE (t:test {prop: 814109}); +---- ok +-STATEMENT CREATE (t:test {prop: 32278}); +---- ok +-STATEMENT CREATE (t:test {prop: 876191}); +---- ok +-STATEMENT CREATE (t:test {prop: 629954}); +---- ok +-STATEMENT CREATE (t:test {prop: 388081}); +---- ok +-STATEMENT CREATE (t:test {prop: 402761}); +---- ok +-STATEMENT CREATE (t:test {prop: 266622}); +---- ok +-STATEMENT CREATE (t:test {prop: 343197}); +---- ok +-STATEMENT CREATE (t:test {prop: 535614}); +---- ok +-STATEMENT CREATE (t:test {prop: 316787}); +---- ok +-STATEMENT CREATE (t:test {prop: 269660}); +---- ok +-STATEMENT CREATE (t:test {prop: 782877}); +---- ok +-STATEMENT CREATE (t:test {prop: 564488}); +---- ok +-STATEMENT CREATE (t:test {prop: 363734}); +---- ok +-STATEMENT CREATE (t:test {prop: 402776}); +---- ok +-STATEMENT CREATE (t:test {prop: 455387}); +---- ok +-STATEMENT CREATE (t:test {prop: 2751}); +---- ok +-STATEMENT CREATE (t:test {prop: 814611}); +---- ok +-STATEMENT CREATE (t:test {prop: 449344}); +---- ok +-STATEMENT CREATE (t:test {prop: 756155}); +---- ok +-STATEMENT CREATE (t:test {prop: 319568}); +---- ok +-STATEMENT CREATE (t:test {prop: 77411}); +---- ok +-STATEMENT CREATE (t:test {prop: 688522}); +---- ok +-STATEMENT CREATE (t:test {prop: 206587}); +---- ok +-STATEMENT CREATE (t:test {prop: 918881}); +---- ok +-STATEMENT CREATE (t:test {prop: 362408}); +---- ok +-STATEMENT CREATE (t:test {prop: 783410}); +---- ok +-STATEMENT CREATE (t:test {prop: 561064}); +---- ok +-STATEMENT CREATE (t:test {prop: 256226}); +---- ok +-STATEMENT CREATE (t:test {prop: 172501}); +---- ok +-STATEMENT CREATE (t:test {prop: 890669}); +---- ok +-STATEMENT CREATE (t:test {prop: 822758}); +---- ok +-STATEMENT CREATE (t:test {prop: 513336}); +---- ok +-STATEMENT CREATE (t:test {prop: 936281}); +---- ok +-STATEMENT CREATE (t:test {prop: 722596}); +---- ok +-STATEMENT CREATE (t:test {prop: 884645}); +---- ok +-STATEMENT CREATE (t:test {prop: 644050}); +---- ok +-STATEMENT CREATE (t:test {prop: 83560}); +---- ok +-STATEMENT CREATE (t:test {prop: 460256}); +---- ok +-STATEMENT CREATE (t:test {prop: 101760}); +---- ok +-STATEMENT CREATE (t:test {prop: 480151}); +---- ok +-STATEMENT CREATE (t:test {prop: 45666}); +---- ok +-STATEMENT CREATE (t:test {prop: 184917}); +---- ok +-STATEMENT CREATE (t:test {prop: 815701}); +---- ok +-STATEMENT CREATE (t:test {prop: 311739}); +---- ok +-STATEMENT CREATE (t:test {prop: 769521}); +---- ok +-STATEMENT CREATE (t:test {prop: 124134}); +---- ok +-STATEMENT CREATE (t:test {prop: 635223}); +---- ok +-STATEMENT CREATE (t:test {prop: 378}); +---- ok +-STATEMENT CREATE (t:test {prop: 154957}); +---- ok +-STATEMENT CREATE (t:test {prop: 365727}); +---- ok +-STATEMENT CREATE (t:test {prop: 671426}); +---- ok +-STATEMENT CREATE (t:test {prop: 317796}); +---- ok +-STATEMENT CREATE (t:test {prop: 514380}); +---- ok +-STATEMENT CREATE (t:test {prop: 40964}); +---- ok +-STATEMENT CREATE (t:test {prop: 106897}); +---- ok +-STATEMENT CREATE (t:test {prop: 601735}); +---- ok +-STATEMENT CREATE (t:test {prop: 456410}); +---- ok +-STATEMENT CREATE (t:test {prop: 588998}); +---- ok +-STATEMENT CREATE (t:test {prop: 794777}); +---- ok +-STATEMENT CREATE (t:test {prop: 339570}); +---- ok +-STATEMENT CREATE (t:test {prop: 656822}); +---- ok +-STATEMENT CREATE (t:test {prop: 74262}); +---- ok +-STATEMENT CREATE (t:test {prop: 731132}); +---- ok +-STATEMENT CREATE (t:test {prop: 689383}); +---- ok +-STATEMENT CREATE (t:test {prop: 161839}); +---- ok +-STATEMENT CREATE (t:test {prop: 909772}); +---- ok +-STATEMENT CREATE (t:test {prop: 872762}); +---- ok +-STATEMENT CREATE (t:test {prop: 321770}); +---- ok +-STATEMENT CREATE (t:test {prop: 624112}); +---- ok +-STATEMENT CREATE (t:test {prop: 651859}); +---- ok +-STATEMENT CREATE (t:test {prop: 501442}); +---- ok +-STATEMENT CREATE (t:test {prop: 984634}); +---- ok +-STATEMENT CREATE (t:test {prop: 115585}); +---- ok +-STATEMENT CREATE (t:test {prop: 374948}); +---- ok +-STATEMENT CREATE (t:test {prop: 288847}); +---- ok +-STATEMENT CREATE (t:test {prop: 110679}); +---- ok +-STATEMENT CREATE (t:test {prop: 774309}); +---- ok +-STATEMENT CREATE (t:test {prop: 635700}); +---- ok +-STATEMENT CREATE (t:test {prop: 180555}); +---- ok +-STATEMENT CREATE (t:test {prop: 883016}); +---- ok +-STATEMENT CREATE (t:test {prop: 984667}); +---- ok +-STATEMENT CREATE (t:test {prop: 292551}); +---- ok +-STATEMENT CREATE (t:test {prop: 456339}); +---- ok +-STATEMENT CREATE (t:test {prop: 725924}); +---- ok +-STATEMENT CREATE (t:test {prop: 239169}); +---- ok +-STATEMENT CREATE (t:test {prop: 200059}); +---- ok +-STATEMENT CREATE (t:test {prop: 819305}); +---- ok +-STATEMENT CREATE (t:test {prop: 536802}); +---- ok +-STATEMENT CREATE (t:test {prop: 513784}); +---- ok +-STATEMENT CREATE (t:test {prop: 103420}); +---- ok +-STATEMENT CREATE (t:test {prop: 257250}); +---- ok +-STATEMENT CREATE (t:test {prop: 552941}); +---- ok +-STATEMENT CREATE (t:test {prop: 849401}); +---- ok +-STATEMENT CREATE (t:test {prop: 863298}); +---- ok +-STATEMENT CREATE (t:test {prop: 733622}); +---- ok +-STATEMENT CREATE (t:test {prop: 102679}); +---- ok +-STATEMENT CREATE (t:test {prop: 819429}); +---- ok +-STATEMENT CREATE (t:test {prop: 592156}); +---- ok +-STATEMENT CREATE (t:test {prop: 774059}); +---- ok +-STATEMENT CREATE (t:test {prop: 923741}); +---- ok +-STATEMENT CREATE (t:test {prop: 690000}); +---- ok +-STATEMENT CREATE (t:test {prop: 312330}); +---- ok +-STATEMENT CREATE (t:test {prop: 180261}); +---- ok +-STATEMENT CREATE (t:test {prop: 280335}); +---- ok +-STATEMENT CREATE (t:test {prop: 231825}); +---- ok +-STATEMENT CREATE (t:test {prop: 214521}); +---- ok +-STATEMENT CREATE (t:test {prop: 953056}); +---- ok +-STATEMENT CREATE (t:test {prop: 886631}); +---- ok +-STATEMENT CREATE (t:test {prop: 362023}); +---- ok +-STATEMENT CREATE (t:test {prop: 546904}); +---- ok +-STATEMENT CREATE (t:test {prop: 977390}); +---- ok +-STATEMENT CREATE (t:test {prop: 552702}); +---- ok +-STATEMENT CREATE (t:test {prop: 48992}); +---- ok +-STATEMENT CREATE (t:test {prop: 459186}); +---- ok +-STATEMENT CREATE (t:test {prop: 66572}); +---- ok +-STATEMENT CREATE (t:test {prop: 967790}); +---- ok +-STATEMENT CREATE (t:test {prop: 383722}); +---- ok +-STATEMENT CREATE (t:test {prop: 433878}); +---- ok +-STATEMENT CREATE (t:test {prop: 507994}); +---- ok +-STATEMENT CREATE (t:test {prop: 529602}); +---- ok +-STATEMENT CREATE (t:test {prop: 483753}); +---- ok +-STATEMENT CREATE (t:test {prop: 156403}); +---- ok +-STATEMENT CREATE (t:test {prop: 763453}); +---- ok +-STATEMENT CREATE (t:test {prop: 763329}); +---- ok +-STATEMENT CREATE (t:test {prop: 485135}); +---- ok +-STATEMENT CREATE (t:test {prop: 63394}); +---- ok +-STATEMENT CREATE (t:test {prop: 537496}); +---- ok +-STATEMENT CREATE (t:test {prop: 270467}); +---- ok +-STATEMENT CREATE (t:test {prop: 573123}); +---- ok +-STATEMENT CREATE (t:test {prop: 802663}); +---- ok +-STATEMENT CREATE (t:test {prop: 927457}); +---- ok +-STATEMENT CREATE (t:test {prop: 867590}); +---- ok +-STATEMENT CREATE (t:test {prop: 481473}); +---- ok +-STATEMENT CREATE (t:test {prop: 903179}); +---- ok +-STATEMENT CREATE (t:test {prop: 646095}); +---- ok +-STATEMENT CREATE (t:test {prop: 309230}); +---- ok +-STATEMENT CREATE (t:test {prop: 329137}); +---- ok +-STATEMENT CREATE (t:test {prop: 720698}); +---- ok +-STATEMENT CREATE (t:test {prop: 236575}); +---- ok +-STATEMENT CREATE (t:test {prop: 930558}); +---- ok +-STATEMENT CREATE (t:test {prop: 330726}); +---- ok +-STATEMENT CREATE (t:test {prop: 690949}); +---- ok +-STATEMENT CREATE (t:test {prop: 620065}); +---- ok +-STATEMENT CREATE (t:test {prop: 201960}); +---- ok +-STATEMENT CREATE (t:test {prop: 200023}); +---- ok +-STATEMENT CREATE (t:test {prop: 434381}); +---- ok +-STATEMENT CREATE (t:test {prop: 399633}); +---- ok +-STATEMENT CREATE (t:test {prop: 134244}); +---- ok +-STATEMENT CREATE (t:test {prop: 331167}); +---- ok +-STATEMENT CREATE (t:test {prop: 171184}); +---- ok +-STATEMENT CREATE (t:test {prop: 665564}); +---- ok +-STATEMENT CREATE (t:test {prop: 226659}); +---- ok +-STATEMENT CREATE (t:test {prop: 683460}); +---- ok +-STATEMENT CREATE (t:test {prop: 126896}); +---- ok +-STATEMENT CREATE (t:test {prop: 734916}); +---- ok +-STATEMENT CREATE (t:test {prop: 368338}); +---- ok +-STATEMENT CREATE (t:test {prop: 596390}); +---- ok +-STATEMENT CREATE (t:test {prop: 623492}); +---- ok +-STATEMENT CREATE (t:test {prop: 113510}); +---- ok +-STATEMENT CREATE (t:test {prop: 642098}); +---- ok +-STATEMENT CREATE (t:test {prop: 386777}); +---- ok +-STATEMENT CREATE (t:test {prop: 294101}); +---- ok +-STATEMENT CREATE (t:test {prop: 927431}); +---- ok +-STATEMENT CREATE (t:test {prop: 480005}); +---- ok +-STATEMENT CREATE (t:test {prop: 229656}); +---- ok +-STATEMENT CREATE (t:test {prop: 223336}); +---- ok +-STATEMENT CREATE (t:test {prop: 151595}); +---- ok +-STATEMENT CREATE (t:test {prop: 802029}); +---- ok +-STATEMENT CREATE (t:test {prop: 923054}); +---- ok +-STATEMENT CREATE (t:test {prop: 90088}); +---- ok +-STATEMENT CREATE (t:test {prop: 117948}); +---- ok +-STATEMENT CREATE (t:test {prop: 131381}); +---- ok +-STATEMENT CREATE (t:test {prop: 703288}); +---- ok +-STATEMENT CREATE (t:test {prop: 340244}); +---- ok +-STATEMENT CREATE (t:test {prop: 507995}); +---- ok +-STATEMENT CREATE (t:test {prop: 427400}); +---- ok +-STATEMENT CREATE (t:test {prop: 241992}); +---- ok +-STATEMENT CREATE (t:test {prop: 934140}); +---- ok +-STATEMENT CREATE (t:test {prop: 557738}); +---- ok +-STATEMENT CREATE (t:test {prop: 888936}); +---- ok +-STATEMENT CREATE (t:test {prop: 674434}); +---- ok +-STATEMENT CREATE (t:test {prop: 291032}); +---- ok +-STATEMENT CREATE (t:test {prop: 839747}); +---- ok +-STATEMENT CREATE (t:test {prop: 403388}); +---- ok +-STATEMENT CREATE (t:test {prop: 835414}); +---- ok +-STATEMENT CREATE (t:test {prop: 509706}); +---- ok +-STATEMENT CREATE (t:test {prop: 519534}); +---- ok +-STATEMENT CREATE (t:test {prop: 821916}); +---- ok +-STATEMENT CREATE (t:test {prop: 640258}); +---- ok +-STATEMENT CREATE (t:test {prop: 978640}); +---- ok +-STATEMENT CREATE (t:test {prop: 844546}); +---- ok +-STATEMENT CREATE (t:test {prop: 997220}); +---- ok +-STATEMENT CREATE (t:test {prop: 680285}); +---- ok +-STATEMENT CREATE (t:test {prop: 368433}); +---- ok +-STATEMENT CREATE (t:test {prop: 299933}); +---- ok +-STATEMENT CREATE (t:test {prop: 405884}); +---- ok +-STATEMENT CREATE (t:test {prop: 668366}); +---- ok +-STATEMENT CREATE (t:test {prop: 247824}); +---- ok +-STATEMENT CREATE (t:test {prop: 492922}); +---- ok +-STATEMENT CREATE (t:test {prop: 843915}); +---- ok +-STATEMENT CREATE (t:test {prop: 524669}); +---- ok +-STATEMENT CREATE (t:test {prop: 999765}); +---- ok +-STATEMENT CREATE (t:test {prop: 689237}); +---- ok +-STATEMENT CREATE (t:test {prop: 133746}); +---- ok +-STATEMENT CREATE (t:test {prop: 656240}); +---- ok +-STATEMENT CREATE (t:test {prop: 222414}); +---- ok +-STATEMENT CREATE (t:test {prop: 341390}); +---- ok +-STATEMENT CREATE (t:test {prop: 453644}); +---- ok +-STATEMENT CREATE (t:test {prop: 288518}); +---- ok +-STATEMENT CREATE (t:test {prop: 709258}); +---- ok +-STATEMENT CREATE (t:test {prop: 54960}); +---- ok +-STATEMENT CREATE (t:test {prop: 961755}); +---- ok +-STATEMENT CREATE (t:test {prop: 712942}); +---- ok +-STATEMENT CREATE (t:test {prop: 806465}); +---- ok +-STATEMENT CREATE (t:test {prop: 297974}); +---- ok +-STATEMENT CREATE (t:test {prop: 79040}); +---- ok +-STATEMENT CREATE (t:test {prop: 827426}); +---- ok +-STATEMENT CREATE (t:test {prop: 446898}); +---- ok +-STATEMENT CREATE (t:test {prop: 694176}); +---- ok +-STATEMENT CREATE (t:test {prop: 587857}); +---- ok +-STATEMENT CREATE (t:test {prop: 633546}); +---- ok +-STATEMENT CREATE (t:test {prop: 118749}); +---- ok +-STATEMENT CREATE (t:test {prop: 962647}); +---- ok +-STATEMENT CREATE (t:test {prop: 199409}); +---- ok +-STATEMENT CREATE (t:test {prop: 40113}); +---- ok +-STATEMENT CREATE (t:test {prop: 149233}); +---- ok +-STATEMENT CREATE (t:test {prop: 969580}); +---- ok +-STATEMENT CREATE (t:test {prop: 944275}); +---- ok +-STATEMENT CREATE (t:test {prop: 341325}); +---- ok +-STATEMENT CREATE (t:test {prop: 684730}); +---- ok +-STATEMENT CREATE (t:test {prop: 992927}); +---- ok +-STATEMENT CREATE (t:test {prop: 79009}); +---- ok +-STATEMENT CREATE (t:test {prop: 45664}); +---- ok +-STATEMENT CREATE (t:test {prop: 130077}); +---- ok +-STATEMENT CREATE (t:test {prop: 355045}); +---- ok +-STATEMENT CREATE (t:test {prop: 794437}); +---- ok +-STATEMENT CREATE (t:test {prop: 437596}); +---- ok +-STATEMENT CREATE (t:test {prop: 257261}); +---- ok +-STATEMENT CREATE (t:test {prop: 732013}); +---- ok +-STATEMENT CREATE (t:test {prop: 162854}); +---- ok +-STATEMENT CREATE (t:test {prop: 641731}); +---- ok +-STATEMENT CREATE (t:test {prop: 851097}); +---- ok +-STATEMENT CREATE (t:test {prop: 272082}); +---- ok +-STATEMENT CREATE (t:test {prop: 338786}); +---- ok +-STATEMENT CREATE (t:test {prop: 413508}); +---- ok +-STATEMENT CREATE (t:test {prop: 355958}); +---- ok +-STATEMENT CREATE (t:test {prop: 197648}); +---- ok +-STATEMENT CREATE (t:test {prop: 530011}); +---- ok +-STATEMENT CREATE (t:test {prop: 13327}); +---- ok +-STATEMENT CREATE (t:test {prop: 30321}); +---- ok +-STATEMENT CREATE (t:test {prop: 227045}); +---- ok +-STATEMENT CREATE (t:test {prop: 906913}); +---- ok +-STATEMENT CREATE (t:test {prop: 309002}); +---- ok +-STATEMENT CREATE (t:test {prop: 771040}); +---- ok +-STATEMENT CREATE (t:test {prop: 890462}); +---- ok +-STATEMENT CREATE (t:test {prop: 296472}); +---- ok +-STATEMENT CREATE (t:test {prop: 445692}); +---- ok +-STATEMENT CREATE (t:test {prop: 405288}); +---- ok +-STATEMENT CREATE (t:test {prop: 383125}); +---- ok +-STATEMENT CREATE (t:test {prop: 869396}); +---- ok +-STATEMENT CREATE (t:test {prop: 747098}); +---- ok +-STATEMENT CREATE (t:test {prop: 823017}); +---- ok +-STATEMENT CREATE (t:test {prop: 848844}); +---- ok +-STATEMENT CREATE (t:test {prop: 694750}); +---- ok +-STATEMENT CREATE (t:test {prop: 16053}); +---- ok +-STATEMENT CREATE (t:test {prop: 383077}); +---- ok +-STATEMENT CREATE (t:test {prop: 924730}); +---- ok +-STATEMENT CREATE (t:test {prop: 948421}); +---- ok +-STATEMENT CREATE (t:test {prop: 716845}); +---- ok +-STATEMENT CREATE (t:test {prop: 403054}); +---- ok +-STATEMENT CREATE (t:test {prop: 794788}); +---- ok +-STATEMENT CREATE (t:test {prop: 656155}); +---- ok +-STATEMENT CREATE (t:test {prop: 911738}); +---- ok +-STATEMENT CREATE (t:test {prop: 763639}); +---- ok +-STATEMENT CREATE (t:test {prop: 94528}); +---- ok +-STATEMENT CREATE (t:test {prop: 844306}); +---- ok +-STATEMENT CREATE (t:test {prop: 676993}); +---- ok +-STATEMENT CREATE (t:test {prop: 480795}); +---- ok +-STATEMENT CREATE (t:test {prop: 955216}); +---- ok +-STATEMENT CREATE (t:test {prop: 298807}); +---- ok +-STATEMENT CREATE (t:test {prop: 379283}); +---- ok +-STATEMENT CREATE (t:test {prop: 807643}); +---- ok +-STATEMENT CREATE (t:test {prop: 360614}); +---- ok +-STATEMENT CREATE (t:test {prop: 406617}); +---- ok +-STATEMENT CREATE (t:test {prop: 965665}); +---- ok +-STATEMENT CREATE (t:test {prop: 66322}); +---- ok +-STATEMENT CREATE (t:test {prop: 413794}); +---- ok +-STATEMENT CREATE (t:test {prop: 921396}); +---- ok +-STATEMENT CREATE (t:test {prop: 652423}); +---- ok +-STATEMENT CREATE (t:test {prop: 734060}); +---- ok +-STATEMENT CREATE (t:test {prop: 809078}); +---- ok +-STATEMENT CREATE (t:test {prop: 178408}); +---- ok +-STATEMENT CREATE (t:test {prop: 221777}); +---- ok +-STATEMENT CREATE (t:test {prop: 44190}); +---- ok +-STATEMENT CREATE (t:test {prop: 492583}); +---- ok +-STATEMENT CREATE (t:test {prop: 278543}); +---- ok +-STATEMENT CREATE (t:test {prop: 779103}); +---- ok +-STATEMENT CREATE (t:test {prop: 883889}); +---- ok +-STATEMENT CREATE (t:test {prop: 855262}); +---- ok +-STATEMENT CREATE (t:test {prop: 718846}); +---- ok +-STATEMENT CREATE (t:test {prop: 227347}); +---- ok +-STATEMENT CREATE (t:test {prop: 407706}); +---- ok +-STATEMENT CREATE (t:test {prop: 223388}); +---- ok +-STATEMENT CREATE (t:test {prop: 598146}); +---- ok +-STATEMENT CREATE (t:test {prop: 695753}); +---- ok +-STATEMENT CREATE (t:test {prop: 500385}); +---- ok +-STATEMENT CREATE (t:test {prop: 834117}); +---- ok +-STATEMENT CREATE (t:test {prop: 651757}); +---- ok +-STATEMENT CREATE (t:test {prop: 503413}); +---- ok +-STATEMENT CREATE (t:test {prop: 130746}); +---- ok +-STATEMENT CREATE (t:test {prop: 748460}); +---- ok +-STATEMENT CREATE (t:test {prop: 270047}); +---- ok +-STATEMENT CREATE (t:test {prop: 485148}); +---- ok +-STATEMENT CREATE (t:test {prop: 985655}); +---- ok +-STATEMENT CREATE (t:test {prop: 700794}); +---- ok +-STATEMENT CREATE (t:test {prop: 429787}); +---- ok +-STATEMENT CREATE (t:test {prop: 246981}); +---- ok +-STATEMENT CREATE (t:test {prop: 599027}); +---- ok +-STATEMENT CREATE (t:test {prop: 268317}); +---- ok +-STATEMENT CREATE (t:test {prop: 777325}); +---- ok +-STATEMENT CREATE (t:test {prop: 653737}); +---- ok +-STATEMENT CREATE (t:test {prop: 973515}); +---- ok +-STATEMENT CREATE (t:test {prop: 74436}); +---- ok +-STATEMENT CREATE (t:test {prop: 282177}); +---- ok +-STATEMENT CREATE (t:test {prop: 645108}); +---- ok +-STATEMENT CREATE (t:test {prop: 808164}); +---- ok +-STATEMENT CREATE (t:test {prop: 303322}); +---- ok +-STATEMENT CREATE (t:test {prop: 910839}); +---- ok +-STATEMENT CREATE (t:test {prop: 269770}); +---- ok +-STATEMENT CREATE (t:test {prop: 270285}); +---- ok +-STATEMENT CREATE (t:test {prop: 515274}); +---- ok +-STATEMENT CREATE (t:test {prop: 402835}); +---- ok +-STATEMENT CREATE (t:test {prop: 78701}); +---- ok +-STATEMENT CREATE (t:test {prop: 48723}); +---- ok +-STATEMENT CREATE (t:test {prop: 557896}); +---- ok +-STATEMENT CREATE (t:test {prop: 370746}); +---- ok +-STATEMENT CREATE (t:test {prop: 556497}); +---- ok +-STATEMENT CREATE (t:test {prop: 931991}); +---- ok +-STATEMENT CREATE (t:test {prop: 465148}); +---- ok +-STATEMENT CREATE (t:test {prop: 163928}); +---- ok +-STATEMENT CREATE (t:test {prop: 527426}); +---- ok +-STATEMENT CREATE (t:test {prop: 993146}); +---- ok +-STATEMENT CREATE (t:test {prop: 664782}); +---- ok +-STATEMENT CREATE (t:test {prop: 312287}); +---- ok +-STATEMENT CREATE (t:test {prop: 300143}); +---- ok +-STATEMENT CREATE (t:test {prop: 614411}); +---- ok +-STATEMENT CREATE (t:test {prop: 729016}); +---- ok +-STATEMENT CREATE (t:test {prop: 590414}); +---- ok +-STATEMENT CREATE (t:test {prop: 276285}); +---- ok +-STATEMENT CREATE (t:test {prop: 569164}); +---- ok +-STATEMENT CREATE (t:test {prop: 460467}); +---- ok +-STATEMENT CREATE (t:test {prop: 905480}); +---- ok +-STATEMENT CREATE (t:test {prop: 644540}); +---- ok +-STATEMENT CREATE (t:test {prop: 782157}); +---- ok +-STATEMENT CREATE (t:test {prop: 615006}); +---- ok +-STATEMENT CREATE (t:test {prop: 862503}); +---- ok +-STATEMENT CREATE (t:test {prop: 587280}); +---- ok +-STATEMENT CREATE (t:test {prop: 284826}); +---- ok +-STATEMENT CREATE (t:test {prop: 907171}); +---- ok +-STATEMENT CREATE (t:test {prop: 85366}); +---- ok +-STATEMENT CREATE (t:test {prop: 748935}); +---- ok +-STATEMENT CREATE (t:test {prop: 931163}); +---- ok +-STATEMENT CREATE (t:test {prop: 484848}); +---- ok +-STATEMENT CREATE (t:test {prop: 679741}); +---- ok +-STATEMENT CREATE (t:test {prop: 641246}); +---- ok +-STATEMENT CREATE (t:test {prop: 896936}); +---- ok +-STATEMENT CREATE (t:test {prop: 279149}); +---- ok +-STATEMENT CREATE (t:test {prop: 548945}); +---- ok +-STATEMENT CREATE (t:test {prop: 730193}); +---- ok +-STATEMENT CREATE (t:test {prop: 812891}); +---- ok +-STATEMENT CREATE (t:test {prop: 995366}); +---- ok +-STATEMENT CREATE (t:test {prop: 894777}); +---- ok +-STATEMENT CREATE (t:test {prop: 949839}); +---- ok +-STATEMENT CREATE (t:test {prop: 508948}); +---- ok +-STATEMENT CREATE (t:test {prop: 218269}); +---- ok +-STATEMENT CREATE (t:test {prop: 43838}); +---- ok +-STATEMENT CREATE (t:test {prop: 685098}); +---- ok +-STATEMENT CREATE (t:test {prop: 645858}); +---- ok +-STATEMENT CREATE (t:test {prop: 111081}); +---- ok +-STATEMENT CREATE (t:test {prop: 555637}); +---- ok +-STATEMENT CREATE (t:test {prop: 818603}); +---- ok +-STATEMENT CREATE (t:test {prop: 952990}); +---- ok +-STATEMENT CREATE (t:test {prop: 52748}); +---- ok +-STATEMENT CREATE (t:test {prop: 244754}); +---- ok +-STATEMENT CREATE (t:test {prop: 468927}); +---- ok +-STATEMENT CREATE (t:test {prop: 311356}); +---- ok +-STATEMENT CREATE (t:test {prop: 840054}); +---- ok +-STATEMENT CREATE (t:test {prop: 528081}); +---- ok +-STATEMENT CREATE (t:test {prop: 806835}); +---- ok +-STATEMENT CREATE (t:test {prop: 991633}); +---- ok +-STATEMENT CREATE (t:test {prop: 722259}); +---- ok +-STATEMENT CREATE (t:test {prop: 103184}); +---- ok +-STATEMENT CREATE (t:test {prop: 379164}); +---- ok +-STATEMENT CREATE (t:test {prop: 906309}); +---- ok +-STATEMENT CREATE (t:test {prop: 731419}); +---- ok +-STATEMENT CREATE (t:test {prop: 437281}); +---- ok +-STATEMENT CREATE (t:test {prop: 718916}); +---- ok +-STATEMENT CREATE (t:test {prop: 42214}); +---- ok +-STATEMENT CREATE (t:test {prop: 736711}); +---- ok +-STATEMENT CREATE (t:test {prop: 233901}); +---- ok +-STATEMENT CREATE (t:test {prop: 127059}); +---- ok +-STATEMENT CREATE (t:test {prop: 525828}); +---- ok +-STATEMENT CREATE (t:test {prop: 378222}); +---- ok +-STATEMENT CREATE (t:test {prop: 679843}); +---- ok +-STATEMENT CREATE (t:test {prop: 999060}); +---- ok +-STATEMENT CREATE (t:test {prop: 220150}); +---- ok +-STATEMENT CREATE (t:test {prop: 965517}); +---- ok +-STATEMENT CREATE (t:test {prop: 104453}); +---- ok +-STATEMENT CREATE (t:test {prop: 160735}); +---- ok +-STATEMENT CREATE (t:test {prop: 556902}); +---- ok +-STATEMENT CREATE (t:test {prop: 304154}); +---- ok +-STATEMENT CREATE (t:test {prop: 46682}); +---- ok +-STATEMENT CREATE (t:test {prop: 205979}); +---- ok +-STATEMENT CREATE (t:test {prop: 869336}); +---- ok +-STATEMENT CREATE (t:test {prop: 732927}); +---- ok +-STATEMENT CREATE (t:test {prop: 716753}); +---- ok +-STATEMENT CREATE (t:test {prop: 704889}); +---- ok +-STATEMENT CREATE (t:test {prop: 834056}); +---- ok +-STATEMENT CREATE (t:test {prop: 702031}); +---- ok +-STATEMENT CREATE (t:test {prop: 586760}); +---- ok +-STATEMENT CREATE (t:test {prop: 259709}); +---- ok +-STATEMENT CREATE (t:test {prop: 898654}); +---- ok +-STATEMENT CREATE (t:test {prop: 303912}); +---- ok +-STATEMENT CREATE (t:test {prop: 450521}); +---- ok +-STATEMENT CREATE (t:test {prop: 481379}); +---- ok +-STATEMENT CREATE (t:test {prop: 434530}); +---- ok +-STATEMENT CREATE (t:test {prop: 79697}); +---- ok +-STATEMENT CREATE (t:test {prop: 419917}); +---- ok +-STATEMENT CREATE (t:test {prop: 562329}); +---- ok +-STATEMENT CREATE (t:test {prop: 941615}); +---- ok +-STATEMENT CREATE (t:test {prop: 896423}); +---- ok +-STATEMENT CREATE (t:test {prop: 322924}); +---- ok +-STATEMENT CREATE (t:test {prop: 529291}); +---- ok +-STATEMENT CREATE (t:test {prop: 217587}); +---- ok +-STATEMENT CREATE (t:test {prop: 251456}); +---- ok +-STATEMENT CREATE (t:test {prop: 711008}); +---- ok +-STATEMENT CREATE (t:test {prop: 593857}); +---- ok +-STATEMENT CREATE (t:test {prop: 107943}); +---- ok +-STATEMENT CREATE (t:test {prop: 658907}); +---- ok +-STATEMENT CREATE (t:test {prop: 310413}); +---- ok +-STATEMENT CREATE (t:test {prop: 367406}); +---- ok +-STATEMENT CREATE (t:test {prop: 614204}); +---- ok +-STATEMENT CREATE (t:test {prop: 531727}); +---- ok +-STATEMENT CREATE (t:test {prop: 278832}); +---- ok +-STATEMENT CREATE (t:test {prop: 802426}); +---- ok +-STATEMENT CREATE (t:test {prop: 845681}); +---- ok +-STATEMENT CREATE (t:test {prop: 571743}); +---- ok +-STATEMENT CREATE (t:test {prop: 658166}); +---- ok +-STATEMENT CREATE (t:test {prop: 258100}); +---- ok +-STATEMENT CREATE (t:test {prop: 302202}); +---- ok +-STATEMENT CREATE (t:test {prop: 980585}); +---- ok +-STATEMENT CREATE (t:test {prop: 484537}); +---- ok +-STATEMENT CREATE (t:test {prop: 519399}); +---- ok +-STATEMENT CREATE (t:test {prop: 199908}); +---- ok +-STATEMENT CREATE (t:test {prop: 797823}); +---- ok +-STATEMENT CREATE (t:test {prop: 94283}); +---- ok +-STATEMENT CREATE (t:test {prop: 10249}); +---- ok +-STATEMENT CREATE (t:test {prop: 300542}); +---- ok +-STATEMENT CREATE (t:test {prop: 654196}); +---- ok +-STATEMENT CREATE (t:test {prop: 171127}); +---- ok +-STATEMENT CREATE (t:test {prop: 183243}); +---- ok +-STATEMENT CREATE (t:test {prop: 976080}); +---- ok +-STATEMENT CREATE (t:test {prop: 1137}); +---- ok +-STATEMENT CREATE (t:test {prop: 196600}); +---- ok +-STATEMENT CREATE (t:test {prop: 492071}); +---- ok +-STATEMENT CREATE (t:test {prop: 466564}); +---- ok +-STATEMENT CREATE (t:test {prop: 455187}); +---- ok +-STATEMENT CREATE (t:test {prop: 933706}); +---- ok +-STATEMENT CREATE (t:test {prop: 502029}); +---- ok +-STATEMENT CREATE (t:test {prop: 850228}); +---- ok +-STATEMENT CREATE (t:test {prop: 28043}); +---- ok +-STATEMENT CREATE (t:test {prop: 472066}); +---- ok +-STATEMENT CREATE (t:test {prop: 272499}); +---- ok +-STATEMENT CREATE (t:test {prop: 261414}); +---- ok +-STATEMENT CREATE (t:test {prop: 229384}); +---- ok +-STATEMENT CREATE (t:test {prop: 794331}); +---- ok +-STATEMENT CREATE (t:test {prop: 796396}); +---- ok +-STATEMENT CREATE (t:test {prop: 411551}); +---- ok +-STATEMENT CREATE (t:test {prop: 416785}); +---- ok +-STATEMENT CREATE (t:test {prop: 763713}); +---- ok +-STATEMENT CREATE (t:test {prop: 906542}); +---- ok +-STATEMENT CREATE (t:test {prop: 908013}); +---- ok +-STATEMENT CREATE (t:test {prop: 228753}); +---- ok +-STATEMENT CREATE (t:test {prop: 194325}); +---- ok +-STATEMENT CREATE (t:test {prop: 243644}); +---- ok +-STATEMENT CREATE (t:test {prop: 104894}); +---- ok +-STATEMENT CREATE (t:test {prop: 930687}); +---- ok +-STATEMENT CREATE (t:test {prop: 887224}); +---- ok +-STATEMENT CREATE (t:test {prop: 237511}); +---- ok +-STATEMENT CREATE (t:test {prop: 665101}); +---- ok +-STATEMENT CREATE (t:test {prop: 335409}); +---- ok +-STATEMENT CREATE (t:test {prop: 877542}); +---- ok +-STATEMENT CREATE (t:test {prop: 979439}); +---- ok +-STATEMENT CREATE (t:test {prop: 851125}); +---- ok +-STATEMENT CREATE (t:test {prop: 34629}); +---- ok +-STATEMENT CREATE (t:test {prop: 575704}); +---- ok +-STATEMENT CREATE (t:test {prop: 245503}); +---- ok +-STATEMENT CREATE (t:test {prop: 613599}); +---- ok +-STATEMENT CREATE (t:test {prop: 892191}); +---- ok +-STATEMENT CREATE (t:test {prop: 364929}); +---- ok +-STATEMENT CREATE (t:test {prop: 529979}); +---- ok +-STATEMENT CREATE (t:test {prop: 351868}); +---- ok +-STATEMENT CREATE (t:test {prop: 182398}); +---- ok +-STATEMENT CREATE (t:test {prop: 290169}); +---- ok +-STATEMENT CREATE (t:test {prop: 884269}); +---- ok +-STATEMENT CREATE (t:test {prop: 931715}); +---- ok +-STATEMENT CREATE (t:test {prop: 389661}); +---- ok +-STATEMENT CREATE (t:test {prop: 969038}); +---- ok +-STATEMENT CREATE (t:test {prop: 716692}); +---- ok +-STATEMENT CREATE (t:test {prop: 253572}); +---- ok +-STATEMENT CREATE (t:test {prop: 151441}); +---- ok +-STATEMENT CREATE (t:test {prop: 905500}); +---- ok +-STATEMENT CREATE (t:test {prop: 940201}); +---- ok +-STATEMENT CREATE (t:test {prop: 735211}); +---- ok +-STATEMENT CREATE (t:test {prop: 316484}); +---- ok +-STATEMENT CREATE (t:test {prop: 462899}); +---- ok +-STATEMENT CREATE (t:test {prop: 658875}); +---- ok +-STATEMENT CREATE (t:test {prop: 454514}); +---- ok +-STATEMENT CREATE (t:test {prop: 24601}); +---- ok +-STATEMENT CREATE (t:test {prop: 315524}); +---- ok +-STATEMENT CREATE (t:test {prop: 936371}); +---- ok +-STATEMENT CREATE (t:test {prop: 486647}); +---- ok +-STATEMENT CREATE (t:test {prop: 7034}); +---- ok +-STATEMENT CREATE (t:test {prop: 666847}); +---- ok +-STATEMENT CREATE (t:test {prop: 278954}); +---- ok +-STATEMENT CREATE (t:test {prop: 912881}); +---- ok +-STATEMENT CREATE (t:test {prop: 742410}); +---- ok +-STATEMENT CREATE (t:test {prop: 766313}); +---- ok +-STATEMENT CREATE (t:test {prop: 131171}); +---- ok +-STATEMENT CREATE (t:test {prop: 434834}); +---- ok +-STATEMENT CREATE (t:test {prop: 690786}); +---- ok +-STATEMENT CREATE (t:test {prop: 559181}); +---- ok +-STATEMENT CREATE (t:test {prop: 290512}); +---- ok +-STATEMENT CREATE (t:test {prop: 154897}); +---- ok +-STATEMENT CREATE (t:test {prop: 435565}); +---- ok +-STATEMENT CREATE (t:test {prop: 692775}); +---- ok +-STATEMENT CREATE (t:test {prop: 353730}); +---- ok +-STATEMENT CREATE (t:test {prop: 83193}); +---- ok +-STATEMENT CREATE (t:test {prop: 600170}); +---- ok +-STATEMENT CREATE (t:test {prop: 488772}); +---- ok +-STATEMENT CREATE (t:test {prop: 368318}); +---- ok +-STATEMENT CREATE (t:test {prop: 37490}); +---- ok +-STATEMENT CREATE (t:test {prop: 721387}); +---- ok +-STATEMENT CREATE (t:test {prop: 822049}); +---- ok +-STATEMENT CREATE (t:test {prop: 235905}); +---- ok +-STATEMENT CREATE (t:test {prop: 26681}); +---- ok +-STATEMENT CREATE (t:test {prop: 394256}); +---- ok +-STATEMENT CREATE (t:test {prop: 855983}); +---- ok +-STATEMENT CREATE (t:test {prop: 428294}); +---- ok +-STATEMENT CREATE (t:test {prop: 438943}); +---- ok +-STATEMENT CREATE (t:test {prop: 803942}); +---- ok +-STATEMENT CREATE (t:test {prop: 716594}); +---- ok +-STATEMENT CREATE (t:test {prop: 178702}); +---- ok +-STATEMENT CREATE (t:test {prop: 958197}); +---- ok +-STATEMENT CREATE (t:test {prop: 631226}); +---- ok +-STATEMENT CREATE (t:test {prop: 147619}); +---- ok +-STATEMENT CREATE (t:test {prop: 706681}); +---- ok +-STATEMENT CREATE (t:test {prop: 688111}); +---- ok +-STATEMENT CREATE (t:test {prop: 993403}); +---- ok +-STATEMENT CREATE (t:test {prop: 369240}); +---- ok +-STATEMENT CREATE (t:test {prop: 723901}); +---- ok +-STATEMENT CREATE (t:test {prop: 982477}); +---- ok +-STATEMENT CREATE (t:test {prop: 993843}); +---- ok +-STATEMENT CREATE (t:test {prop: 992903}); +---- ok +-STATEMENT CREATE (t:test {prop: 61096}); +---- ok +-STATEMENT CREATE (t:test {prop: 800681}); +---- ok +-STATEMENT CREATE (t:test {prop: 182219}); +---- ok +-STATEMENT CREATE (t:test {prop: 524687}); +---- ok +-STATEMENT CREATE (t:test {prop: 370830}); +---- ok +-STATEMENT CREATE (t:test {prop: 266442}); +---- ok +-STATEMENT CREATE (t:test {prop: 286302}); +---- ok +-STATEMENT CREATE (t:test {prop: 605010}); +---- ok +-STATEMENT CREATE (t:test {prop: 876564}); +---- ok +-STATEMENT CREATE (t:test {prop: 444555}); +---- ok +-STATEMENT CREATE (t:test {prop: 273905}); +---- ok +-STATEMENT CREATE (t:test {prop: 65051}); +---- ok +-STATEMENT CREATE (t:test {prop: 202782}); +---- ok +-STATEMENT CREATE (t:test {prop: 183470}); +---- ok +-STATEMENT CREATE (t:test {prop: 1004}); +---- ok +-STATEMENT CREATE (t:test {prop: 377000}); +---- ok +-STATEMENT CREATE (t:test {prop: 277062}); +---- ok +-STATEMENT CREATE (t:test {prop: 568541}); +---- ok +-STATEMENT CREATE (t:test {prop: 848698}); +---- ok +-STATEMENT CREATE (t:test {prop: 375432}); +---- ok +-STATEMENT CREATE (t:test {prop: 320096}); +---- ok +-STATEMENT CREATE (t:test {prop: 11364}); +---- ok +-STATEMENT CREATE (t:test {prop: 520285}); +---- ok +-STATEMENT CREATE (t:test {prop: 726047}); +---- ok +-STATEMENT CREATE (t:test {prop: 729686}); +---- ok +-STATEMENT CREATE (t:test {prop: 507585}); +---- ok +-STATEMENT CREATE (t:test {prop: 261763}); +---- ok +-STATEMENT CREATE (t:test {prop: 626518}); +---- ok +-STATEMENT CREATE (t:test {prop: 98900}); +---- ok +-STATEMENT CREATE (t:test {prop: 23800}); +---- ok +-STATEMENT CREATE (t:test {prop: 675352}); +---- ok +-STATEMENT CREATE (t:test {prop: 42506}); +---- ok +-STATEMENT CREATE (t:test {prop: 612689}); +---- ok +-STATEMENT CREATE (t:test {prop: 65782}); +---- ok +-STATEMENT CREATE (t:test {prop: 89549}); +---- ok +-STATEMENT CREATE (t:test {prop: 510044}); +---- ok +-STATEMENT CREATE (t:test {prop: 815076}); +---- ok +-STATEMENT CREATE (t:test {prop: 655960}); +---- ok +-STATEMENT CREATE (t:test {prop: 900678}); +---- ok +-STATEMENT CREATE (t:test {prop: 797257}); +---- ok +-STATEMENT CREATE (t:test {prop: 844660}); +---- ok +-STATEMENT CREATE (t:test {prop: 554300}); +---- ok +-STATEMENT CREATE (t:test {prop: 364014}); +---- ok +-STATEMENT CREATE (t:test {prop: 249365}); +---- ok +-STATEMENT CREATE (t:test {prop: 757619}); +---- ok +-STATEMENT CREATE (t:test {prop: 926194}); +---- ok +-STATEMENT CREATE (t:test {prop: 622557}); +---- ok +-STATEMENT CREATE (t:test {prop: 962230}); +---- ok +-STATEMENT CREATE (t:test {prop: 222319}); +---- ok +-STATEMENT CREATE (t:test {prop: 153757}); +---- ok +-STATEMENT CREATE (t:test {prop: 7976}); +---- ok +-STATEMENT CREATE (t:test {prop: 210663}); +---- ok +-STATEMENT CREATE (t:test {prop: 972912}); +---- ok +-STATEMENT CREATE (t:test {prop: 818607}); +---- ok +-STATEMENT CREATE (t:test {prop: 446243}); +---- ok +-STATEMENT CREATE (t:test {prop: 118491}); +---- ok +-STATEMENT CREATE (t:test {prop: 879085}); +---- ok +-STATEMENT CREATE (t:test {prop: 883642}); +---- ok +-STATEMENT CREATE (t:test {prop: 443085}); +---- ok +-STATEMENT CREATE (t:test {prop: 612533}); +---- ok +-STATEMENT CREATE (t:test {prop: 849319}); +---- ok +-STATEMENT CREATE (t:test {prop: 305545}); +---- ok +-STATEMENT CREATE (t:test {prop: 4953}); +---- ok +-STATEMENT CREATE (t:test {prop: 444815}); +---- ok +-STATEMENT CREATE (t:test {prop: 712537}); +---- ok +-STATEMENT CREATE (t:test {prop: 235133}); +---- ok +-STATEMENT CREATE (t:test {prop: 927909}); +---- ok +-STATEMENT CREATE (t:test {prop: 783819}); +---- ok +-STATEMENT CREATE (t:test {prop: 766468}); +---- ok +-STATEMENT CREATE (t:test {prop: 742359}); +---- ok +-STATEMENT CREATE (t:test {prop: 145967}); +---- ok +-STATEMENT CREATE (t:test {prop: 936738}); +---- ok +-STATEMENT CREATE (t:test {prop: 407925}); +---- ok +-STATEMENT CREATE (t:test {prop: 2802}); +---- ok +-STATEMENT CREATE (t:test {prop: 521486}); +---- ok +-STATEMENT CREATE (t:test {prop: 328909}); +---- ok +-STATEMENT CREATE (t:test {prop: 958277}); +---- ok +-STATEMENT CREATE (t:test {prop: 923034}); +---- ok +-STATEMENT CREATE (t:test {prop: 566563}); +---- ok +-STATEMENT CREATE (t:test {prop: 223003}); +---- ok +-STATEMENT CREATE (t:test {prop: 123456}); +---- ok +-STATEMENT CREATE (t:test {prop: 106869}); +---- ok +-STATEMENT CREATE (t:test {prop: 12358}); +---- ok +-STATEMENT CREATE (t:test {prop: 61100}); +---- ok +-STATEMENT CREATE (t:test {prop: 285634}); +---- ok +-STATEMENT CREATE (t:test {prop: 288751}); +---- ok +-STATEMENT CREATE (t:test {prop: 422579}); +---- ok +-STATEMENT CREATE (t:test {prop: 442491}); +---- ok +-STATEMENT CREATE (t:test {prop: 980503}); +---- ok +-STATEMENT CREATE (t:test {prop: 24166}); +---- ok +-STATEMENT CREATE (t:test {prop: 40793}); +---- ok +-STATEMENT CREATE (t:test {prop: 48019}); +---- ok +-STATEMENT CREATE (t:test {prop: 577511}); +---- ok +-STATEMENT CREATE (t:test {prop: 675101}); +---- ok +-STATEMENT CREATE (t:test {prop: 328317}); +---- ok +-STATEMENT CREATE (t:test {prop: 636578}); +---- ok +-STATEMENT CREATE (t:test {prop: 441068}); +---- ok +-STATEMENT CREATE (t:test {prop: 80624}); +---- ok +-STATEMENT CREATE (t:test {prop: 510727}); +---- ok +-STATEMENT CREATE (t:test {prop: 5303}); +---- ok +-STATEMENT CREATE (t:test {prop: 307947}); +---- ok +-STATEMENT CREATE (t:test {prop: 790271}); +---- ok +-STATEMENT CREATE (t:test {prop: 180550}); +---- ok +-STATEMENT CREATE (t:test {prop: 163072}); +---- ok +-STATEMENT CREATE (t:test {prop: 536795}); +---- ok +-STATEMENT CREATE (t:test {prop: 650288}); +---- ok +-STATEMENT CREATE (t:test {prop: 524475}); +---- ok +-STATEMENT CREATE (t:test {prop: 717488}); +---- ok +-STATEMENT CREATE (t:test {prop: 151086}); +---- ok +-STATEMENT CREATE (t:test {prop: 996850}); +---- ok +-STATEMENT CREATE (t:test {prop: 835781}); +---- ok +-STATEMENT CREATE (t:test {prop: 284519}); +---- ok +-STATEMENT CREATE (t:test {prop: 155000}); +---- ok +-STATEMENT CREATE (t:test {prop: 182989}); +---- ok +-STATEMENT CREATE (t:test {prop: 477640}); +---- ok +-STATEMENT CREATE (t:test {prop: 110265}); +---- ok +-STATEMENT CREATE (t:test {prop: 129593}); +---- ok +-STATEMENT CREATE (t:test {prop: 377401}); +---- ok +-STATEMENT CREATE (t:test {prop: 87465}); +---- ok +-STATEMENT CREATE (t:test {prop: 233803}); +---- ok +-STATEMENT CREATE (t:test {prop: 150374}); +---- ok +-STATEMENT CREATE (t:test {prop: 851602}); +---- ok +-STATEMENT CREATE (t:test {prop: 269131}); +---- ok +-STATEMENT CREATE (t:test {prop: 773572}); +---- ok +-STATEMENT CREATE (t:test {prop: 473887}); +---- ok +-STATEMENT CREATE (t:test {prop: 189190}); +---- ok +-STATEMENT CREATE (t:test {prop: 747668}); +---- ok +-STATEMENT CREATE (t:test {prop: 722811}); +---- ok +-STATEMENT CREATE (t:test {prop: 509996}); +---- ok +-STATEMENT CREATE (t:test {prop: 781738}); +---- ok +-STATEMENT CREATE (t:test {prop: 524368}); +---- ok +-STATEMENT CREATE (t:test {prop: 909836}); +---- ok +-STATEMENT CREATE (t:test {prop: 174371}); +---- ok +-STATEMENT CREATE (t:test {prop: 946953}); +---- ok +-STATEMENT CREATE (t:test {prop: 505352}); +---- ok +-STATEMENT CREATE (t:test {prop: 60771}); +---- ok +-STATEMENT CREATE (t:test {prop: 296237}); +---- ok +-STATEMENT CREATE (t:test {prop: 860772}); +---- ok +-STATEMENT CREATE (t:test {prop: 81368}); +---- ok +-STATEMENT CREATE (t:test {prop: 300869}); +---- ok +-STATEMENT CREATE (t:test {prop: 531159}); +---- ok +-STATEMENT CREATE (t:test {prop: 87196}); +---- ok +-STATEMENT CREATE (t:test {prop: 23579}); +---- ok +-STATEMENT CREATE (t:test {prop: 764321}); +---- ok +-STATEMENT CREATE (t:test {prop: 996002}); +---- ok +-STATEMENT CREATE (t:test {prop: 225832}); +---- ok +-STATEMENT CREATE (t:test {prop: 545434}); +---- ok +-STATEMENT CREATE (t:test {prop: 678405}); +---- ok +-STATEMENT CREATE (t:test {prop: 529163}); +---- ok +-STATEMENT CREATE (t:test {prop: 499039}); +---- ok +-STATEMENT CREATE (t:test {prop: 9073}); +---- ok +-STATEMENT CREATE (t:test {prop: 259705}); +---- ok +-STATEMENT CREATE (t:test {prop: 950560}); +---- ok +-STATEMENT CREATE (t:test {prop: 375828}); +---- ok +-STATEMENT CREATE (t:test {prop: 57163}); +---- ok +-STATEMENT CREATE (t:test {prop: 820917}); +---- ok +-STATEMENT CREATE (t:test {prop: 321582}); +---- ok +-STATEMENT CREATE (t:test {prop: 86851}); +---- ok +-STATEMENT CREATE (t:test {prop: 152755}); +---- ok +-STATEMENT CREATE (t:test {prop: 63447}); +---- ok +-STATEMENT CREATE (t:test {prop: 100282}); +---- ok +-STATEMENT CREATE (t:test {prop: 186001}); +---- ok +-STATEMENT CREATE (t:test {prop: 111438}); +---- ok +-STATEMENT CREATE (t:test {prop: 552731}); +---- ok +-STATEMENT CREATE (t:test {prop: 261966}); +---- ok +-STATEMENT CREATE (t:test {prop: 679043}); +---- ok +-STATEMENT CREATE (t:test {prop: 936621}); +---- ok +-STATEMENT CREATE (t:test {prop: 981323}); +---- ok +-STATEMENT CREATE (t:test {prop: 244820}); +---- ok +-STATEMENT CREATE (t:test {prop: 890135}); +---- ok +-STATEMENT CREATE (t:test {prop: 263928}); +---- ok +-STATEMENT CREATE (t:test {prop: 982793}); +---- ok +-STATEMENT CREATE (t:test {prop: 686687}); +---- ok +-STATEMENT CREATE (t:test {prop: 271797}); +---- ok +-STATEMENT CREATE (t:test {prop: 142153}); +---- ok +-STATEMENT CREATE (t:test {prop: 478431}); +---- ok +-STATEMENT CREATE (t:test {prop: 803793}); +---- ok +-STATEMENT CREATE (t:test {prop: 132104}); +---- ok +-STATEMENT CREATE (t:test {prop: 848912}); +---- ok +-STATEMENT CREATE (t:test {prop: 108106}); +---- ok +-STATEMENT CREATE (t:test {prop: 836554}); +---- ok +-STATEMENT CREATE (t:test {prop: 409419}); +---- ok +-STATEMENT CREATE (t:test {prop: 128623}); +---- ok +-STATEMENT CREATE (t:test {prop: 509498}); +---- ok +-STATEMENT CREATE (t:test {prop: 802074}); +---- ok +-STATEMENT CREATE (t:test {prop: 930192}); +---- ok +-STATEMENT CREATE (t:test {prop: 962701}); +---- ok +-STATEMENT CREATE (t:test {prop: 662407}); +---- ok +-STATEMENT CREATE (t:test {prop: 188217}); +---- ok +-STATEMENT CREATE (t:test {prop: 505128}); +---- ok +-STATEMENT CREATE (t:test {prop: 787510}); +---- ok +-STATEMENT CREATE (t:test {prop: 736606}); +---- ok +-STATEMENT CREATE (t:test {prop: 966436}); +---- ok +-STATEMENT CREATE (t:test {prop: 931852}); +---- ok +-STATEMENT CREATE (t:test {prop: 870601}); +---- ok +-STATEMENT CREATE (t:test {prop: 974889}); +---- ok +-STATEMENT CREATE (t:test {prop: 661803}); +---- ok +-STATEMENT CREATE (t:test {prop: 605729}); +---- ok +-STATEMENT CREATE (t:test {prop: 927313}); +---- ok +-STATEMENT CREATE (t:test {prop: 28283}); +---- ok +-STATEMENT CREATE (t:test {prop: 373550}); +---- ok +-STATEMENT CREATE (t:test {prop: 445119}); +---- ok +-STATEMENT CREATE (t:test {prop: 145816}); +---- ok +-STATEMENT CREATE (t:test {prop: 586825}); +---- ok +-STATEMENT CREATE (t:test {prop: 730794}); +---- ok +-STATEMENT CREATE (t:test {prop: 761407}); +---- ok +-STATEMENT CREATE (t:test {prop: 518631}); +---- ok +-STATEMENT CREATE (t:test {prop: 352978}); +---- ok +-STATEMENT CREATE (t:test {prop: 938209}); +---- ok +-STATEMENT CREATE (t:test {prop: 532104}); +---- ok +-STATEMENT CREATE (t:test {prop: 960463}); +---- ok +-STATEMENT CREATE (t:test {prop: 833288}); +---- ok +-STATEMENT CREATE (t:test {prop: 661514}); +---- ok +-STATEMENT CREATE (t:test {prop: 557267}); +---- ok +-STATEMENT CREATE (t:test {prop: 605504}); +---- ok +-STATEMENT CREATE (t:test {prop: 666709}); +---- ok +-STATEMENT CREATE (t:test {prop: 776180}); +---- ok +-STATEMENT CREATE (t:test {prop: 257868}); +---- ok +-STATEMENT CREATE (t:test {prop: 744556}); +---- ok +-STATEMENT CREATE (t:test {prop: 187293}); +---- ok +-STATEMENT CREATE (t:test {prop: 368063}); +---- ok +-STATEMENT CREATE (t:test {prop: 678277}); +---- ok +-STATEMENT CREATE (t:test {prop: 597821}); +---- ok +-STATEMENT CREATE (t:test {prop: 74647}); +---- ok +-STATEMENT CREATE (t:test {prop: 362909}); +---- ok +-STATEMENT CREATE (t:test {prop: 31839}); +---- ok +-STATEMENT CREATE (t:test {prop: 316611}); +---- ok +-STATEMENT CREATE (t:test {prop: 579518}); +---- ok +-STATEMENT CREATE (t:test {prop: 884048}); +---- ok +-STATEMENT CREATE (t:test {prop: 540016}); +---- ok +-STATEMENT CREATE (t:test {prop: 388338}); +---- ok +-STATEMENT CREATE (t:test {prop: 702128}); +---- ok +-STATEMENT CREATE (t:test {prop: 314434}); +---- ok +-STATEMENT CREATE (t:test {prop: 204689}); +---- ok +-STATEMENT CREATE (t:test {prop: 136387}); +---- ok +-STATEMENT CREATE (t:test {prop: 290528}); +---- ok +-STATEMENT CREATE (t:test {prop: 938776}); +---- ok +-STATEMENT CREATE (t:test {prop: 358585}); +---- ok +-STATEMENT CREATE (t:test {prop: 459184}); +---- ok +-STATEMENT CREATE (t:test {prop: 927309}); +---- ok +-STATEMENT CREATE (t:test {prop: 749116}); +---- ok +-STATEMENT CREATE (t:test {prop: 780}); +---- ok +-STATEMENT CREATE (t:test {prop: 124541}); +---- ok +-STATEMENT CREATE (t:test {prop: 300274}); +---- ok +-STATEMENT CREATE (t:test {prop: 55403}); +---- ok +-STATEMENT CREATE (t:test {prop: 769252}); +---- ok +-STATEMENT CREATE (t:test {prop: 130345}); +---- ok +-STATEMENT CREATE (t:test {prop: 763250}); +---- ok +-STATEMENT CREATE (t:test {prop: 158323}); +---- ok +-STATEMENT CREATE (t:test {prop: 899732}); +---- ok +-STATEMENT CREATE (t:test {prop: 836127}); +---- ok +-STATEMENT CREATE (t:test {prop: 293865}); +---- ok +-STATEMENT CREATE (t:test {prop: 56297}); +---- ok +-STATEMENT CREATE (t:test {prop: 23037}); +---- ok +-STATEMENT CREATE (t:test {prop: 381912}); +---- ok +-STATEMENT CREATE (t:test {prop: 287318}); +---- ok +-STATEMENT CREATE (t:test {prop: 18744}); +---- ok +-STATEMENT CREATE (t:test {prop: 771263}); +---- ok +-STATEMENT CREATE (t:test {prop: 948148}); +---- ok +-STATEMENT CREATE (t:test {prop: 928583}); +---- ok +-STATEMENT CREATE (t:test {prop: 851739}); +---- ok +-STATEMENT CREATE (t:test {prop: 719619}); +---- ok +-STATEMENT CREATE (t:test {prop: 71516}); +---- ok +-STATEMENT CREATE (t:test {prop: 946238}); +---- ok +-STATEMENT CREATE (t:test {prop: 420563}); +---- ok +-STATEMENT CREATE (t:test {prop: 514359}); +---- ok +-STATEMENT CREATE (t:test {prop: 560498}); +---- ok +-STATEMENT CREATE (t:test {prop: 423410}); +---- ok +-STATEMENT CREATE (t:test {prop: 250923}); +---- ok +-STATEMENT CREATE (t:test {prop: 600534}); +---- ok +-STATEMENT CREATE (t:test {prop: 427837}); +---- ok +-STATEMENT CREATE (t:test {prop: 677999}); +---- ok +-STATEMENT CREATE (t:test {prop: 257686}); +---- ok +-STATEMENT CREATE (t:test {prop: 618827}); +---- ok +-STATEMENT CREATE (t:test {prop: 536638}); +---- ok +-STATEMENT CREATE (t:test {prop: 77512}); +---- ok +-STATEMENT CREATE (t:test {prop: 12488}); +---- ok +-STATEMENT CREATE (t:test {prop: 601316}); +---- ok +-STATEMENT CREATE (t:test {prop: 894109}); +---- ok +-STATEMENT CREATE (t:test {prop: 460999}); +---- ok +-STATEMENT CREATE (t:test {prop: 347996}); +---- ok +-STATEMENT CREATE (t:test {prop: 700848}); +---- ok +-STATEMENT CREATE (t:test {prop: 16937}); +---- ok +-STATEMENT CREATE (t:test {prop: 361215}); +---- ok +-STATEMENT CREATE (t:test {prop: 103699}); +---- ok +-STATEMENT CREATE (t:test {prop: 295861}); +---- ok +-STATEMENT CREATE (t:test {prop: 741718}); +---- ok +-STATEMENT CREATE (t:test {prop: 420333}); +---- ok +-STATEMENT CREATE (t:test {prop: 902523}); +---- ok +-STATEMENT CREATE (t:test {prop: 690818}); +---- ok +-STATEMENT CREATE (t:test {prop: 229071}); +---- ok +-STATEMENT CREATE (t:test {prop: 248610}); +---- ok +-STATEMENT CREATE (t:test {prop: 435857}); +---- ok +-STATEMENT CREATE (t:test {prop: 181040}); +---- ok +-STATEMENT CREATE (t:test {prop: 81924}); +---- ok +-STATEMENT CREATE (t:test {prop: 110538}); +---- ok +-STATEMENT CREATE (t:test {prop: 201614}); +---- ok +-STATEMENT CREATE (t:test {prop: 775779}); +---- ok +-STATEMENT CREATE (t:test {prop: 628070}); +---- ok +-STATEMENT CREATE (t:test {prop: 80510}); +---- ok +-STATEMENT CREATE (t:test {prop: 112393}); +---- ok +-STATEMENT CREATE (t:test {prop: 794113}); +---- ok +-STATEMENT CREATE (t:test {prop: 116049}); +---- ok +-STATEMENT CREATE (t:test {prop: 278590}); +---- ok +-STATEMENT CREATE (t:test {prop: 143843}); +---- ok +-STATEMENT CREATE (t:test {prop: 651313}); +---- ok +-STATEMENT CREATE (t:test {prop: 368741}); +---- ok +-STATEMENT CREATE (t:test {prop: 426920}); +---- ok +-STATEMENT CREATE (t:test {prop: 159284}); +---- ok +-STATEMENT CREATE (t:test {prop: 507100}); +---- ok +-STATEMENT CREATE (t:test {prop: 975150}); +---- ok +-STATEMENT CREATE (t:test {prop: 337066}); +---- ok +-STATEMENT CREATE (t:test {prop: 404087}); +---- ok +-STATEMENT CREATE (t:test {prop: 678169}); +---- ok +-STATEMENT CREATE (t:test {prop: 372089}); +---- ok +-STATEMENT CREATE (t:test {prop: 238502}); +---- ok +-STATEMENT CREATE (t:test {prop: 993128}); +---- ok +-STATEMENT CREATE (t:test {prop: 684006}); +---- ok +-STATEMENT CREATE (t:test {prop: 346116}); +---- ok +-STATEMENT CREATE (t:test {prop: 206360}); +---- ok +-STATEMENT CREATE (t:test {prop: 402808}); +---- ok +-STATEMENT CREATE (t:test {prop: 591218}); +---- ok +-STATEMENT CREATE (t:test {prop: 54347}); +---- ok +-STATEMENT CREATE (t:test {prop: 842657}); +---- ok +-STATEMENT CREATE (t:test {prop: 939824}); +---- ok +-STATEMENT CREATE (t:test {prop: 574638}); +---- ok +-STATEMENT CREATE (t:test {prop: 976484}); +---- ok +-STATEMENT CREATE (t:test {prop: 251134}); +---- ok +-STATEMENT CREATE (t:test {prop: 534303}); +---- ok +-STATEMENT CREATE (t:test {prop: 778352}); +---- ok +-STATEMENT CREATE (t:test {prop: 782021}); +---- ok +-STATEMENT CREATE (t:test {prop: 408868}); +---- ok +-STATEMENT CREATE (t:test {prop: 571636}); +---- ok +-STATEMENT CREATE (t:test {prop: 745642}); +---- ok +-STATEMENT CREATE (t:test {prop: 975920}); +---- ok +-STATEMENT CREATE (t:test {prop: 863739}); +---- ok +-STATEMENT CREATE (t:test {prop: 762762}); +---- ok +-STATEMENT CREATE (t:test {prop: 986599}); +---- ok +-STATEMENT CREATE (t:test {prop: 137739}); +---- ok +-STATEMENT CREATE (t:test {prop: 884730}); +---- ok +-STATEMENT CREATE (t:test {prop: 970536}); +---- ok +-STATEMENT CREATE (t:test {prop: 844175}); +---- ok +-STATEMENT CREATE (t:test {prop: 440193}); +---- ok +-STATEMENT CREATE (t:test {prop: 53781}); +---- ok +-STATEMENT CREATE (t:test {prop: 633828}); +---- ok +-STATEMENT CREATE (t:test {prop: 64328}); +---- ok +-STATEMENT CREATE (t:test {prop: 498447}); +---- ok +-STATEMENT CREATE (t:test {prop: 222722}); +---- ok +-STATEMENT CREATE (t:test {prop: 285610}); +---- ok +-STATEMENT CREATE (t:test {prop: 372000}); +---- ok +-STATEMENT CREATE (t:test {prop: 624701}); +---- ok +-STATEMENT CREATE (t:test {prop: 964487}); +---- ok +-STATEMENT CREATE (t:test {prop: 456976}); +---- ok +-STATEMENT CREATE (t:test {prop: 5433}); +---- ok +-STATEMENT CREATE (t:test {prop: 35808}); +---- ok +-STATEMENT CREATE (t:test {prop: 927395}); +---- ok +-STATEMENT CREATE (t:test {prop: 262634}); +---- ok +-STATEMENT CREATE (t:test {prop: 42024}); +---- ok +-STATEMENT CREATE (t:test {prop: 560551}); +---- ok +-STATEMENT CREATE (t:test {prop: 190491}); +---- ok +-STATEMENT CREATE (t:test {prop: 20575}); +---- ok +-STATEMENT CREATE (t:test {prop: 291781}); +---- ok +-STATEMENT CREATE (t:test {prop: 767868}); +---- ok +-STATEMENT CREATE (t:test {prop: 331972}); +---- ok +-STATEMENT CREATE (t:test {prop: 599195}); +---- ok +-STATEMENT CREATE (t:test {prop: 545147}); +---- ok +-STATEMENT CREATE (t:test {prop: 522753}); +---- ok +-STATEMENT CREATE (t:test {prop: 947935}); +---- ok +-STATEMENT CREATE (t:test {prop: 332976}); +---- ok +-STATEMENT CREATE (t:test {prop: 706032}); +---- ok +-STATEMENT CREATE (t:test {prop: 880220}); +---- ok +-STATEMENT CREATE (t:test {prop: 434428}); +---- ok +-STATEMENT CREATE (t:test {prop: 705947}); +---- ok +-STATEMENT CREATE (t:test {prop: 326987}); +---- ok +-STATEMENT CREATE (t:test {prop: 931126}); +---- ok +-STATEMENT CREATE (t:test {prop: 70044}); +---- ok +-STATEMENT CREATE (t:test {prop: 859482}); +---- ok +-STATEMENT CREATE (t:test {prop: 422853}); +---- ok +-STATEMENT CREATE (t:test {prop: 331618}); +---- ok +-STATEMENT CREATE (t:test {prop: 115661}); +---- ok +-STATEMENT CREATE (t:test {prop: 468219}); +---- ok +-STATEMENT CREATE (t:test {prop: 910328}); +---- ok +-STATEMENT CREATE (t:test {prop: 500478}); +---- ok +-STATEMENT CREATE (t:test {prop: 168475}); +---- ok +-STATEMENT CREATE (t:test {prop: 235607}); +---- ok +-STATEMENT CREATE (t:test {prop: 567646}); +---- ok +-STATEMENT CREATE (t:test {prop: 376874}); +---- ok +-STATEMENT CREATE (t:test {prop: 783987}); +---- ok +-STATEMENT CREATE (t:test {prop: 465000}); +---- ok +-STATEMENT CREATE (t:test {prop: 488670}); +---- ok +-STATEMENT CREATE (t:test {prop: 85034}); +---- ok +-STATEMENT CREATE (t:test {prop: 790785}); +---- ok +-STATEMENT CREATE (t:test {prop: 106110}); +---- ok +-STATEMENT CREATE (t:test {prop: 668802}); +---- ok +-STATEMENT CREATE (t:test {prop: 745436}); +---- ok +-STATEMENT CREATE (t:test {prop: 597743}); +---- ok +-STATEMENT CREATE (t:test {prop: 197076}); +---- ok +-STATEMENT CREATE (t:test {prop: 49246}); +---- ok +-STATEMENT CREATE (t:test {prop: 344819}); +---- ok +-STATEMENT CREATE (t:test {prop: 257229}); +---- ok +-STATEMENT CREATE (t:test {prop: 473379}); +---- ok +-STATEMENT CREATE (t:test {prop: 47470}); +---- ok +-STATEMENT CREATE (t:test {prop: 195244}); +---- ok +-STATEMENT CREATE (t:test {prop: 922860}); +---- ok +-STATEMENT CREATE (t:test {prop: 341505}); +---- ok +-STATEMENT CREATE (t:test {prop: 611146}); +---- ok +-STATEMENT CREATE (t:test {prop: 704694}); +---- ok +-STATEMENT CREATE (t:test {prop: 522725}); +---- ok +-STATEMENT CREATE (t:test {prop: 662622}); +---- ok +-STATEMENT CREATE (t:test {prop: 775948}); +---- ok +-STATEMENT CREATE (t:test {prop: 925057}); +---- ok +-STATEMENT CREATE (t:test {prop: 753419}); +---- ok +-STATEMENT CREATE (t:test {prop: 572200}); +---- ok +-STATEMENT CREATE (t:test {prop: 748292}); +---- ok +-STATEMENT CREATE (t:test {prop: 284092}); +---- ok +-STATEMENT CREATE (t:test {prop: 998404}); +---- ok +-STATEMENT CREATE (t:test {prop: 779979}); +---- ok +-STATEMENT CREATE (t:test {prop: 38134}); +---- ok +-STATEMENT CREATE (t:test {prop: 646420}); +---- ok +-STATEMENT CREATE (t:test {prop: 886274}); +---- ok +-STATEMENT CREATE (t:test {prop: 703163}); +---- ok +-STATEMENT CREATE (t:test {prop: 468179}); +---- ok +-STATEMENT CREATE (t:test {prop: 283061}); +---- ok +-STATEMENT CREATE (t:test {prop: 474313}); +---- ok +-STATEMENT CREATE (t:test {prop: 11174}); +---- ok +-STATEMENT CREATE (t:test {prop: 725306}); +---- ok +-STATEMENT CREATE (t:test {prop: 262846}); +---- ok +-STATEMENT CREATE (t:test {prop: 343883}); +---- ok +-STATEMENT CREATE (t:test {prop: 991016}); +---- ok +-STATEMENT CREATE (t:test {prop: 587986}); +---- ok +-STATEMENT CREATE (t:test {prop: 614924}); +---- ok +-STATEMENT CREATE (t:test {prop: 701381}); +---- ok +-STATEMENT CREATE (t:test {prop: 302507}); +---- ok +-STATEMENT CREATE (t:test {prop: 76320}); +---- ok +-STATEMENT CREATE (t:test {prop: 840964}); +---- ok +-STATEMENT CREATE (t:test {prop: 945342}); +---- ok +-STATEMENT CREATE (t:test {prop: 508314}); +---- ok +-STATEMENT CREATE (t:test {prop: 284010}); +---- ok +-STATEMENT CREATE (t:test {prop: 848130}); +---- ok +-STATEMENT CREATE (t:test {prop: 473475}); +---- ok +-STATEMENT CREATE (t:test {prop: 289430}); +---- ok +-STATEMENT CREATE (t:test {prop: 853165}); +---- ok +-STATEMENT CREATE (t:test {prop: 303541}); +---- ok +-STATEMENT CREATE (t:test {prop: 862662}); +---- ok +-STATEMENT CREATE (t:test {prop: 428237}); +---- ok +-STATEMENT CREATE (t:test {prop: 729208}); +---- ok +-STATEMENT CREATE (t:test {prop: 893671}); +---- ok +-STATEMENT CREATE (t:test {prop: 519314}); +---- ok +-STATEMENT CREATE (t:test {prop: 456555}); +---- ok +-STATEMENT CREATE (t:test {prop: 485248}); +---- ok +-STATEMENT CREATE (t:test {prop: 963509}); +---- ok +-STATEMENT CREATE (t:test {prop: 842633}); +---- ok +-STATEMENT CREATE (t:test {prop: 571026}); +---- ok +-STATEMENT CREATE (t:test {prop: 962514}); +---- ok +-STATEMENT CREATE (t:test {prop: 176221}); +---- ok +-STATEMENT CREATE (t:test {prop: 358882}); +---- ok +-STATEMENT CREATE (t:test {prop: 746940}); +---- ok +-STATEMENT CREATE (t:test {prop: 376310}); +---- ok +-STATEMENT CREATE (t:test {prop: 528747}); +---- ok +-STATEMENT CREATE (t:test {prop: 773080}); +---- ok +-STATEMENT CREATE (t:test {prop: 174305}); +---- ok +-STATEMENT CREATE (t:test {prop: 158758}); +---- ok +-STATEMENT CREATE (t:test {prop: 646955}); +---- ok +-STATEMENT CREATE (t:test {prop: 961807}); +---- ok +-STATEMENT CREATE (t:test {prop: 214075}); +---- ok +-STATEMENT CREATE (t:test {prop: 379675}); +---- ok +-STATEMENT CREATE (t:test {prop: 573166}); +---- ok +-STATEMENT CREATE (t:test {prop: 722696}); +---- ok +-STATEMENT CREATE (t:test {prop: 589138}); +---- ok +-STATEMENT CREATE (t:test {prop: 102525}); +---- ok +-STATEMENT CREATE (t:test {prop: 657326}); +---- ok +-STATEMENT CREATE (t:test {prop: 30662}); +---- ok +-STATEMENT CREATE (t:test {prop: 591001}); +---- ok +-STATEMENT CREATE (t:test {prop: 923117}); +---- ok +-STATEMENT CREATE (t:test {prop: 272521}); +---- ok +-STATEMENT CREATE (t:test {prop: 962174}); +---- ok +-STATEMENT CREATE (t:test {prop: 451365}); +---- ok +-STATEMENT CREATE (t:test {prop: 336209}); +---- ok +-STATEMENT CREATE (t:test {prop: 989959}); +---- ok +-STATEMENT CREATE (t:test {prop: 379860}); +---- ok +-STATEMENT CREATE (t:test {prop: 412014}); +---- ok +-STATEMENT CREATE (t:test {prop: 678161}); +---- ok +-STATEMENT CREATE (t:test {prop: 146736}); +---- ok +-STATEMENT CREATE (t:test {prop: 543704}); +---- ok +-STATEMENT CREATE (t:test {prop: 307667}); +---- ok +-STATEMENT CREATE (t:test {prop: 449097}); +---- ok +-STATEMENT CREATE (t:test {prop: 521035}); +---- ok +-STATEMENT CREATE (t:test {prop: 836161}); +---- ok +-STATEMENT CREATE (t:test {prop: 308514}); +---- ok +-STATEMENT CREATE (t:test {prop: 929532}); +---- ok +-STATEMENT CREATE (t:test {prop: 684802}); +---- ok +-STATEMENT CREATE (t:test {prop: 892341}); +---- ok +-STATEMENT CREATE (t:test {prop: 945030}); +---- ok +-STATEMENT CREATE (t:test {prop: 300064}); +---- ok +-STATEMENT CREATE (t:test {prop: 476141}); +---- ok +-STATEMENT CREATE (t:test {prop: 132311}); +---- ok +-STATEMENT CREATE (t:test {prop: 741252}); +---- ok +-STATEMENT CREATE (t:test {prop: 956604}); +---- ok +-STATEMENT CREATE (t:test {prop: 954636}); +---- ok +-STATEMENT CREATE (t:test {prop: 259277}); +---- ok +-STATEMENT CREATE (t:test {prop: 513307}); +---- ok +-STATEMENT CREATE (t:test {prop: 949634}); +---- ok +-STATEMENT CREATE (t:test {prop: 29500}); +---- ok +-STATEMENT CREATE (t:test {prop: 70590}); +---- ok +-STATEMENT CREATE (t:test {prop: 513813}); +---- ok +-STATEMENT CREATE (t:test {prop: 306311}); +---- ok +-STATEMENT CREATE (t:test {prop: 312566}); +---- ok +-STATEMENT CREATE (t:test {prop: 224948}); +---- ok +-STATEMENT CREATE (t:test {prop: 542170}); +---- ok +-STATEMENT CREATE (t:test {prop: 570240}); +---- ok +-STATEMENT CREATE (t:test {prop: 548527}); +---- ok +-STATEMENT CREATE (t:test {prop: 741254}); +---- ok +-STATEMENT CREATE (t:test {prop: 266476}); +---- ok +-STATEMENT CREATE (t:test {prop: 190509}); +---- ok +-STATEMENT CREATE (t:test {prop: 858185}); +---- ok +-STATEMENT CREATE (t:test {prop: 342368}); +---- ok +-STATEMENT CREATE (t:test {prop: 566774}); +---- ok +-STATEMENT CREATE (t:test {prop: 849964}); +---- ok +-STATEMENT CREATE (t:test {prop: 231411}); +---- ok +-STATEMENT CREATE (t:test {prop: 913359}); +---- ok +-STATEMENT CREATE (t:test {prop: 416712}); +---- ok +-STATEMENT CREATE (t:test {prop: 756183}); +---- ok +-STATEMENT CREATE (t:test {prop: 556660}); +---- ok +-STATEMENT CREATE (t:test {prop: 728994}); +---- ok +-STATEMENT CREATE (t:test {prop: 474585}); +---- ok +-STATEMENT CREATE (t:test {prop: 203551}); +---- ok +-STATEMENT CREATE (t:test {prop: 326978}); +---- ok +-STATEMENT CREATE (t:test {prop: 853181}); +---- ok +-STATEMENT CREATE (t:test {prop: 157630}); +---- ok +-STATEMENT CREATE (t:test {prop: 308247}); +---- ok +-STATEMENT CREATE (t:test {prop: 301455}); +---- ok +-STATEMENT CREATE (t:test {prop: 363992}); +---- ok +-STATEMENT CREATE (t:test {prop: 661494}); +---- ok +-STATEMENT CREATE (t:test {prop: 148560}); +---- ok +-STATEMENT CREATE (t:test {prop: 824146}); +---- ok +-STATEMENT CREATE (t:test {prop: 194321}); +---- ok +-STATEMENT CREATE (t:test {prop: 470505}); +---- ok +-STATEMENT CREATE (t:test {prop: 875587}); +---- ok +-STATEMENT CREATE (t:test {prop: 399874}); +---- ok +-STATEMENT CREATE (t:test {prop: 343928}); +---- ok +-STATEMENT CREATE (t:test {prop: 581685}); +---- ok +-STATEMENT CREATE (t:test {prop: 506838}); +---- ok +-STATEMENT CREATE (t:test {prop: 576172}); +---- ok +-STATEMENT CREATE (t:test {prop: 803988}); +---- ok +-STATEMENT CREATE (t:test {prop: 586186}); +---- ok +-STATEMENT CREATE (t:test {prop: 982959}); +---- ok +-STATEMENT CREATE (t:test {prop: 536622}); +---- ok +-STATEMENT CREATE (t:test {prop: 603591}); +---- ok +-STATEMENT CREATE (t:test {prop: 451433}); +---- ok +-STATEMENT CREATE (t:test {prop: 356582}); +---- ok +-STATEMENT CREATE (t:test {prop: 645515}); +---- ok +-STATEMENT CREATE (t:test {prop: 417285}); +---- ok +-STATEMENT CREATE (t:test {prop: 303504}); +---- ok +-STATEMENT CREATE (t:test {prop: 352229}); +---- ok +-STATEMENT CREATE (t:test {prop: 379931}); +---- ok +-STATEMENT CREATE (t:test {prop: 689161}); +---- ok +-STATEMENT CREATE (t:test {prop: 828242}); +---- ok +-STATEMENT CREATE (t:test {prop: 747403}); +---- ok +-STATEMENT CREATE (t:test {prop: 875345}); +---- ok +-STATEMENT CREATE (t:test {prop: 921888}); +---- ok +-STATEMENT CREATE (t:test {prop: 345059}); +---- ok +-STATEMENT CREATE (t:test {prop: 698720}); +---- ok +-STATEMENT CREATE (t:test {prop: 223326}); +---- ok +-STATEMENT CREATE (t:test {prop: 266485}); +---- ok +-STATEMENT CREATE (t:test {prop: 541609}); +---- ok +-STATEMENT CREATE (t:test {prop: 578107}); +---- ok +-STATEMENT CREATE (t:test {prop: 365433}); +---- ok +-STATEMENT CREATE (t:test {prop: 348717}); +---- ok +-STATEMENT CREATE (t:test {prop: 310848}); +---- ok +-STATEMENT CREATE (t:test {prop: 312566}); +---- ok +-STATEMENT CREATE (t:test {prop: 121445}); +---- ok +-STATEMENT CREATE (t:test {prop: 405798}); +---- ok +-STATEMENT CREATE (t:test {prop: 486902}); +---- ok +-STATEMENT CREATE (t:test {prop: 350938}); +---- ok +-STATEMENT CREATE (t:test {prop: 412225}); +---- ok +-STATEMENT CREATE (t:test {prop: 723018}); +---- ok +-STATEMENT CREATE (t:test {prop: 350424}); +---- ok +-STATEMENT CREATE (t:test {prop: 768960}); +---- ok +-STATEMENT CREATE (t:test {prop: 743281}); +---- ok +-STATEMENT CREATE (t:test {prop: 678185}); +---- ok +-STATEMENT CREATE (t:test {prop: 282595}); +---- ok +-STATEMENT CREATE (t:test {prop: 88280}); +---- ok +-STATEMENT CREATE (t:test {prop: 357696}); +---- ok +-STATEMENT CREATE (t:test {prop: 367823}); +---- ok +-STATEMENT CREATE (t:test {prop: 737718}); +---- ok +-STATEMENT CREATE (t:test {prop: 103199}); +---- ok +-STATEMENT CREATE (t:test {prop: 117284}); +---- ok +-STATEMENT CREATE (t:test {prop: 115173}); +---- ok +-STATEMENT CREATE (t:test {prop: 384420}); +---- ok +-STATEMENT CREATE (t:test {prop: 100574}); +---- ok +-STATEMENT CREATE (t:test {prop: 64768}); +---- ok +-STATEMENT CREATE (t:test {prop: 477588}); +---- ok +-STATEMENT CREATE (t:test {prop: 298131}); +---- ok +-STATEMENT CREATE (t:test {prop: 558884}); +---- ok +-STATEMENT CREATE (t:test {prop: 835570}); +---- ok +-STATEMENT CREATE (t:test {prop: 943975}); +---- ok +-STATEMENT CREATE (t:test {prop: 922862}); +---- ok +-STATEMENT CREATE (t:test {prop: 345453}); +---- ok +-STATEMENT CREATE (t:test {prop: 218736}); +---- ok +-STATEMENT CREATE (t:test {prop: 260740}); +---- ok +-STATEMENT CREATE (t:test {prop: 394181}); +---- ok +-STATEMENT CREATE (t:test {prop: 508448}); +---- ok +-STATEMENT CREATE (t:test {prop: 305098}); +---- ok +-STATEMENT CREATE (t:test {prop: 310704}); +---- ok +-STATEMENT CREATE (t:test {prop: 380164}); +---- ok +-STATEMENT CREATE (t:test {prop: 432082}); +---- ok +-STATEMENT CREATE (t:test {prop: 221638}); +---- ok +-STATEMENT CREATE (t:test {prop: 331503}); +---- ok +-STATEMENT CREATE (t:test {prop: 643399}); +---- ok +-STATEMENT CREATE (t:test {prop: 787873}); +---- ok +-STATEMENT CREATE (t:test {prop: 263973}); +---- ok +-STATEMENT CREATE (t:test {prop: 388089}); +---- ok +-STATEMENT CREATE (t:test {prop: 28555}); +---- ok +-STATEMENT CREATE (t:test {prop: 611518}); +---- ok +-STATEMENT CREATE (t:test {prop: 485228}); +---- ok +-STATEMENT CREATE (t:test {prop: 525113}); +---- ok +-STATEMENT CREATE (t:test {prop: 57226}); +---- ok +-STATEMENT CREATE (t:test {prop: 172187}); +---- ok +-STATEMENT CREATE (t:test {prop: 765605}); +---- ok +-STATEMENT CREATE (t:test {prop: 370453}); +---- ok +-STATEMENT CREATE (t:test {prop: 155791}); +---- ok +-STATEMENT CREATE (t:test {prop: 715734}); +---- ok +-STATEMENT CREATE (t:test {prop: 957156}); +---- ok +-STATEMENT CREATE (t:test {prop: 553351}); +---- ok +-STATEMENT CREATE (t:test {prop: 708558}); +---- ok +-STATEMENT CREATE (t:test {prop: 387428}); +---- ok +-STATEMENT CREATE (t:test {prop: 659342}); +---- ok +-STATEMENT CREATE (t:test {prop: 498046}); +---- ok +-STATEMENT CREATE (t:test {prop: 641410}); +---- ok +-STATEMENT CREATE (t:test {prop: 898453}); +---- ok +-STATEMENT CREATE (t:test {prop: 681953}); +---- ok +-STATEMENT CREATE (t:test {prop: 51176}); +---- ok +-STATEMENT CREATE (t:test {prop: 150731}); +---- ok +-STATEMENT CREATE (t:test {prop: 397153}); +---- ok +-STATEMENT CREATE (t:test {prop: 615652}); +---- ok +-STATEMENT CREATE (t:test {prop: 251072}); +---- ok +-STATEMENT CREATE (t:test {prop: 817698}); +---- ok +-STATEMENT CREATE (t:test {prop: 89525}); +---- ok +-STATEMENT CREATE (t:test {prop: 520384}); +---- ok +-STATEMENT CREATE (t:test {prop: 367336}); +---- ok +-STATEMENT CREATE (t:test {prop: 600464}); +---- ok +-STATEMENT CREATE (t:test {prop: 599325}); +---- ok +-STATEMENT CREATE (t:test {prop: 230178}); +---- ok +-STATEMENT CREATE (t:test {prop: 629366}); +---- ok +-STATEMENT CREATE (t:test {prop: 32161}); +---- ok +-STATEMENT CREATE (t:test {prop: 620246}); +---- ok +-STATEMENT CREATE (t:test {prop: 644967}); +---- ok +-STATEMENT CREATE (t:test {prop: 860617}); +---- ok +-STATEMENT CREATE (t:test {prop: 103555}); +---- ok +-STATEMENT CREATE (t:test {prop: 193629}); +---- ok +-STATEMENT CREATE (t:test {prop: 42151}); +---- ok +-STATEMENT CREATE (t:test {prop: 73656}); +---- ok +-STATEMENT CREATE (t:test {prop: 378908}); +---- ok +-STATEMENT CREATE (t:test {prop: 413609}); +---- ok +-STATEMENT CREATE (t:test {prop: 454032}); +---- ok +-STATEMENT CREATE (t:test {prop: 10236}); +---- ok +-STATEMENT CREATE (t:test {prop: 492533}); +---- ok +-STATEMENT CREATE (t:test {prop: 297386}); +---- ok +-STATEMENT CREATE (t:test {prop: 968685}); +---- ok +-STATEMENT CREATE (t:test {prop: 543078}); +---- ok +-STATEMENT CREATE (t:test {prop: 638815}); +---- ok +-STATEMENT CREATE (t:test {prop: 287177}); +---- ok +-STATEMENT CREATE (t:test {prop: 948330}); +---- ok +-STATEMENT CREATE (t:test {prop: 134949}); +---- ok +-STATEMENT CREATE (t:test {prop: 459398}); +---- ok +-STATEMENT CREATE (t:test {prop: 232823}); +---- ok +-STATEMENT CREATE (t:test {prop: 6642}); +---- ok +-STATEMENT CREATE (t:test {prop: 356219}); +---- ok +-STATEMENT CREATE (t:test {prop: 171887}); +---- ok +-STATEMENT CREATE (t:test {prop: 359319}); +---- ok +-STATEMENT CREATE (t:test {prop: 954044}); +---- ok +-STATEMENT CREATE (t:test {prop: 892703}); +---- ok +-STATEMENT CREATE (t:test {prop: 724657}); +---- ok +-STATEMENT CREATE (t:test {prop: 196372}); +---- ok +-STATEMENT CREATE (t:test {prop: 620182}); +---- ok +-STATEMENT CREATE (t:test {prop: 422542}); +---- ok +-STATEMENT CREATE (t:test {prop: 11353}); +---- ok +-STATEMENT CREATE (t:test {prop: 831919}); +---- ok +-STATEMENT CREATE (t:test {prop: 157585}); +---- ok +-STATEMENT CREATE (t:test {prop: 52910}); +---- ok +-STATEMENT CREATE (t:test {prop: 835654}); +---- ok +-STATEMENT CREATE (t:test {prop: 538751}); +---- ok +-STATEMENT CREATE (t:test {prop: 887721}); +---- ok +-STATEMENT CREATE (t:test {prop: 181477}); +---- ok +-STATEMENT CREATE (t:test {prop: 385406}); +---- ok +-STATEMENT CREATE (t:test {prop: 769830}); +---- ok +-STATEMENT CREATE (t:test {prop: 702868}); +---- ok +-STATEMENT CREATE (t:test {prop: 697047}); +---- ok +-STATEMENT CREATE (t:test {prop: 831291}); +---- ok +-STATEMENT CREATE (t:test {prop: 196157}); +---- ok +-STATEMENT CREATE (t:test {prop: 47731}); +---- ok +-STATEMENT CREATE (t:test {prop: 154206}); +---- ok +-STATEMENT CREATE (t:test {prop: 387123}); +---- ok +-STATEMENT CREATE (t:test {prop: 265641}); +---- ok +-STATEMENT CREATE (t:test {prop: 204326}); +---- ok +-STATEMENT CREATE (t:test {prop: 309472}); +---- ok +-STATEMENT CREATE (t:test {prop: 84870}); +---- ok +-STATEMENT CREATE (t:test {prop: 726596}); +---- ok +-STATEMENT CREATE (t:test {prop: 206087}); +---- ok +-STATEMENT CREATE (t:test {prop: 467010}); +---- ok +-STATEMENT CREATE (t:test {prop: 669832}); +---- ok +-STATEMENT CREATE (t:test {prop: 758562}); +---- ok +-STATEMENT CREATE (t:test {prop: 850788}); +---- ok +-STATEMENT CREATE (t:test {prop: 530936}); +---- ok +-STATEMENT CREATE (t:test {prop: 484182}); +---- ok +-STATEMENT CREATE (t:test {prop: 896005}); +---- ok +-STATEMENT CREATE (t:test {prop: 323242}); +---- ok +-STATEMENT CREATE (t:test {prop: 286301}); +---- ok +-STATEMENT CREATE (t:test {prop: 26441}); +---- ok +-STATEMENT CREATE (t:test {prop: 867233}); +---- ok +-STATEMENT CREATE (t:test {prop: 685796}); +---- ok +-STATEMENT CREATE (t:test {prop: 403711}); +---- ok +-STATEMENT CREATE (t:test {prop: 836301}); +---- ok +-STATEMENT CREATE (t:test {prop: 865967}); +---- ok +-STATEMENT CREATE (t:test {prop: 821380}); +---- ok +-STATEMENT CREATE (t:test {prop: 939237}); +---- ok +-STATEMENT CREATE (t:test {prop: 14823}); +---- ok +-STATEMENT CREATE (t:test {prop: 278590}); +---- ok +-STATEMENT CREATE (t:test {prop: 977605}); +---- ok +-STATEMENT CREATE (t:test {prop: 231242}); +---- ok +-STATEMENT CREATE (t:test {prop: 127523}); +---- ok +-STATEMENT CREATE (t:test {prop: 292150}); +---- ok +-STATEMENT CREATE (t:test {prop: 870073}); +---- ok +-STATEMENT CREATE (t:test {prop: 392474}); +---- ok +-STATEMENT CREATE (t:test {prop: 889886}); +---- ok +-STATEMENT CREATE (t:test {prop: 409633}); +---- ok +-STATEMENT CREATE (t:test {prop: 224909}); +---- ok +-STATEMENT CREATE (t:test {prop: 377857}); +---- ok +-STATEMENT CREATE (t:test {prop: 799991}); +---- ok +-STATEMENT CREATE (t:test {prop: 111133}); +---- ok +-STATEMENT CREATE (t:test {prop: 422018}); +---- ok +-STATEMENT CREATE (t:test {prop: 818126}); +---- ok +-STATEMENT CREATE (t:test {prop: 644400}); +---- ok +-STATEMENT CREATE (t:test {prop: 536400}); +---- ok +-STATEMENT CREATE (t:test {prop: 819827}); +---- ok +-STATEMENT CREATE (t:test {prop: 662610}); +---- ok +-STATEMENT CREATE (t:test {prop: 870837}); +---- ok +-STATEMENT CREATE (t:test {prop: 823980}); +---- ok +-STATEMENT CREATE (t:test {prop: 285121}); +---- ok +-STATEMENT CREATE (t:test {prop: 169207}); +---- ok +-STATEMENT CREATE (t:test {prop: 772395}); +---- ok +-STATEMENT CREATE (t:test {prop: 635773}); +---- ok +-STATEMENT CREATE (t:test {prop: 973367}); +---- ok +-STATEMENT CREATE (t:test {prop: 425597}); +---- ok +-STATEMENT CREATE (t:test {prop: 765628}); +---- ok +-STATEMENT CREATE (t:test {prop: 57325}); +---- ok +-STATEMENT CREATE (t:test {prop: 216929}); +---- ok +-STATEMENT CREATE (t:test {prop: 242735}); +---- ok +-STATEMENT CREATE (t:test {prop: 451684}); +---- ok +-STATEMENT CREATE (t:test {prop: 74601}); +---- ok +-STATEMENT CREATE (t:test {prop: 651151}); +---- ok +-STATEMENT CREATE (t:test {prop: 968596}); +---- ok +-STATEMENT CREATE (t:test {prop: 650772}); +---- ok +-STATEMENT CREATE (t:test {prop: 301858}); +---- ok +-STATEMENT CREATE (t:test {prop: 181154}); +---- ok +-STATEMENT CREATE (t:test {prop: 63907}); +---- ok +-STATEMENT CREATE (t:test {prop: 260751}); +---- ok +-STATEMENT CREATE (t:test {prop: 356549}); +---- ok +-STATEMENT CREATE (t:test {prop: 717116}); +---- ok +-STATEMENT CREATE (t:test {prop: 405259}); +---- ok +-STATEMENT CREATE (t:test {prop: 404496}); +---- ok +-STATEMENT CREATE (t:test {prop: 12759}); +---- ok +-STATEMENT CREATE (t:test {prop: 86996}); +---- ok +-STATEMENT CREATE (t:test {prop: 424315}); +---- ok +-STATEMENT CREATE (t:test {prop: 568740}); +---- ok +-STATEMENT CREATE (t:test {prop: 884122}); +---- ok +-STATEMENT CREATE (t:test {prop: 268028}); +---- ok +-STATEMENT CREATE (t:test {prop: 206667}); +---- ok +-STATEMENT CREATE (t:test {prop: 403444}); +---- ok +-STATEMENT CREATE (t:test {prop: 46398}); +---- ok +-STATEMENT CREATE (t:test {prop: 409583}); +---- ok +-STATEMENT CREATE (t:test {prop: 417403}); +---- ok +-STATEMENT CREATE (t:test {prop: 505947}); +---- ok +-STATEMENT CREATE (t:test {prop: 793153}); +---- ok +-STATEMENT CREATE (t:test {prop: 714513}); +---- ok +-STATEMENT CREATE (t:test {prop: 622318}); +---- ok +-STATEMENT CREATE (t:test {prop: 940265}); +---- ok +-STATEMENT CREATE (t:test {prop: 196174}); +---- ok +-STATEMENT CREATE (t:test {prop: 782011}); +---- ok +-STATEMENT CREATE (t:test {prop: 771053}); +---- ok +-STATEMENT CREATE (t:test {prop: 693989}); +---- ok +-STATEMENT CREATE (t:test {prop: 547254}); +---- ok +-STATEMENT CREATE (t:test {prop: 959354}); +---- ok +-STATEMENT CREATE (t:test {prop: 580128}); +---- ok +-STATEMENT CREATE (t:test {prop: 704262}); +---- ok +-STATEMENT CREATE (t:test {prop: 722814}); +---- ok +-STATEMENT CREATE (t:test {prop: 177543}); +---- ok +-STATEMENT CREATE (t:test {prop: 215792}); +---- ok +-STATEMENT CREATE (t:test {prop: 107537}); +---- ok +-STATEMENT CREATE (t:test {prop: 747254}); +---- ok +-STATEMENT CREATE (t:test {prop: 187216}); +---- ok +-STATEMENT CREATE (t:test {prop: 194321}); +---- ok +-STATEMENT CREATE (t:test {prop: 731132}); +---- ok +-STATEMENT CREATE (t:test {prop: 847982}); +---- ok +-STATEMENT CREATE (t:test {prop: 718839}); +---- ok +-STATEMENT CREATE (t:test {prop: 159673}); +---- ok +-STATEMENT CREATE (t:test {prop: 164326}); +---- ok +-STATEMENT CREATE (t:test {prop: 48429}); +---- ok +-STATEMENT CREATE (t:test {prop: 908174}); +---- ok +-STATEMENT CREATE (t:test {prop: 272339}); +---- ok +-STATEMENT CREATE (t:test {prop: 129262}); +---- ok +-STATEMENT CREATE (t:test {prop: 607124}); +---- ok +-STATEMENT CREATE (t:test {prop: 67138}); +---- ok +-STATEMENT CREATE (t:test {prop: 350587}); +---- ok +-STATEMENT CREATE (t:test {prop: 975261}); +---- ok +-STATEMENT CREATE (t:test {prop: 796578}); +---- ok +-STATEMENT CREATE (t:test {prop: 603018}); +---- ok +-STATEMENT CREATE (t:test {prop: 277142}); +---- ok +-STATEMENT CREATE (t:test {prop: 561105}); +---- ok +-STATEMENT CREATE (t:test {prop: 280978}); +---- ok +-STATEMENT CREATE (t:test {prop: 53760}); +---- ok +-STATEMENT CREATE (t:test {prop: 772516}); +---- ok +-STATEMENT CREATE (t:test {prop: 933437}); +---- ok +-STATEMENT CREATE (t:test {prop: 322131}); +---- ok +-STATEMENT CREATE (t:test {prop: 327275}); +---- ok +-STATEMENT CREATE (t:test {prop: 277566}); +---- ok +-STATEMENT CREATE (t:test {prop: 364347}); +---- ok +-STATEMENT CREATE (t:test {prop: 599628}); +---- ok +-STATEMENT CREATE (t:test {prop: 114711}); +---- ok +-STATEMENT CREATE (t:test {prop: 747585}); +---- ok +-STATEMENT CREATE (t:test {prop: 889810}); +---- ok +-STATEMENT CREATE (t:test {prop: 775602}); +---- ok +-STATEMENT CREATE (t:test {prop: 519929}); +---- ok +-STATEMENT CREATE (t:test {prop: 326997}); +---- ok +-STATEMENT CREATE (t:test {prop: 206498}); +---- ok +-STATEMENT CREATE (t:test {prop: 8472}); +---- ok +-STATEMENT CREATE (t:test {prop: 714319}); +---- ok +-STATEMENT CREATE (t:test {prop: 964183}); +---- ok +-STATEMENT CREATE (t:test {prop: 963884}); +---- ok +-STATEMENT CREATE (t:test {prop: 749039}); +---- ok +-STATEMENT CREATE (t:test {prop: 275498}); +---- ok +-STATEMENT CREATE (t:test {prop: 544525}); +---- ok +-STATEMENT CREATE (t:test {prop: 511809}); +---- ok +-STATEMENT CREATE (t:test {prop: 181348}); +---- ok +-STATEMENT CREATE (t:test {prop: 561588}); +---- ok +-STATEMENT CREATE (t:test {prop: 564330}); +---- ok +-STATEMENT CREATE (t:test {prop: 127348}); +---- ok +-STATEMENT CREATE (t:test {prop: 956187}); +---- ok +-STATEMENT CREATE (t:test {prop: 141339}); +---- ok +-STATEMENT CREATE (t:test {prop: 878710}); +---- ok +-STATEMENT CREATE (t:test {prop: 753651}); +---- ok +-STATEMENT CREATE (t:test {prop: 750141}); +---- ok +-STATEMENT CREATE (t:test {prop: 632212}); +---- ok +-STATEMENT CREATE (t:test {prop: 949122}); +---- ok +-STATEMENT CREATE (t:test {prop: 284502}); +---- ok +-STATEMENT CREATE (t:test {prop: 827355}); +---- ok +-STATEMENT CREATE (t:test {prop: 756932}); +---- ok +-STATEMENT CREATE (t:test {prop: 995279}); +---- ok +-STATEMENT CREATE (t:test {prop: 955097}); +---- ok +-STATEMENT CREATE (t:test {prop: 119512}); +---- ok +-STATEMENT CREATE (t:test {prop: 743093}); +---- ok +-STATEMENT CREATE (t:test {prop: 501883}); +---- ok +-STATEMENT CREATE (t:test {prop: 544783}); +---- ok +-STATEMENT CREATE (t:test {prop: 157102}); +---- ok +-STATEMENT CREATE (t:test {prop: 205141}); +---- ok +-STATEMENT CREATE (t:test {prop: 350629}); +---- ok +-STATEMENT CREATE (t:test {prop: 871494}); +---- ok +-STATEMENT CREATE (t:test {prop: 704878}); +---- ok +-STATEMENT CREATE (t:test {prop: 538294}); +---- ok +-STATEMENT CREATE (t:test {prop: 545365}); +---- ok +-STATEMENT CREATE (t:test {prop: 62945}); +---- ok +-STATEMENT CREATE (t:test {prop: 649265}); +---- ok +-STATEMENT CREATE (t:test {prop: 602276}); +---- ok +-STATEMENT CREATE (t:test {prop: 585257}); +---- ok +-STATEMENT CREATE (t:test {prop: 335192}); +---- ok +-STATEMENT CREATE (t:test {prop: 680668}); +---- ok +-STATEMENT CREATE (t:test {prop: 516655}); +---- ok +-STATEMENT CREATE (t:test {prop: 212422}); +---- ok +-STATEMENT CREATE (t:test {prop: 469331}); +---- ok +-STATEMENT CREATE (t:test {prop: 247754}); +---- ok +-STATEMENT CREATE (t:test {prop: 279086}); +---- ok +-STATEMENT CREATE (t:test {prop: 207740}); +---- ok +-STATEMENT CREATE (t:test {prop: 107635}); +---- ok +-STATEMENT CREATE (t:test {prop: 251936}); +---- ok +-STATEMENT CREATE (t:test {prop: 40040}); +---- ok +-STATEMENT CREATE (t:test {prop: 796401}); +---- ok +-STATEMENT CREATE (t:test {prop: 232297}); +---- ok +-STATEMENT CREATE (t:test {prop: 306246}); +---- ok +-STATEMENT CREATE (t:test {prop: 124257}); +---- ok +-STATEMENT CREATE (t:test {prop: 876172}); +---- ok +-STATEMENT CREATE (t:test {prop: 618089}); +---- ok +-STATEMENT CREATE (t:test {prop: 188458}); +---- ok +-STATEMENT CREATE (t:test {prop: 72438}); +---- ok +-STATEMENT CREATE (t:test {prop: 384539}); +---- ok +-STATEMENT CREATE (t:test {prop: 546223}); +---- ok +-STATEMENT CREATE (t:test {prop: 999704}); +---- ok +-STATEMENT CREATE (t:test {prop: 708310}); +---- ok +-STATEMENT CREATE (t:test {prop: 208253}); +---- ok +-STATEMENT CREATE (t:test {prop: 854493}); +---- ok +-STATEMENT CREATE (t:test {prop: 48774}); +---- ok +-STATEMENT CREATE (t:test {prop: 60097}); +---- ok +-STATEMENT CREATE (t:test {prop: 674970}); +---- ok +-STATEMENT CREATE (t:test {prop: 384359}); +---- ok +-STATEMENT CREATE (t:test {prop: 219074}); +---- ok +-STATEMENT CREATE (t:test {prop: 2965}); +---- ok +-STATEMENT CREATE (t:test {prop: 602997}); +---- ok +-STATEMENT CREATE (t:test {prop: 989902}); +---- ok +-STATEMENT CREATE (t:test {prop: 242969}); +---- ok +-STATEMENT CREATE (t:test {prop: 498814}); +---- ok +-STATEMENT CREATE (t:test {prop: 481103}); +---- ok +-STATEMENT CREATE (t:test {prop: 233274}); +---- ok +-STATEMENT CREATE (t:test {prop: 869941}); +---- ok +-STATEMENT CREATE (t:test {prop: 372548}); +---- ok +-STATEMENT CREATE (t:test {prop: 497907}); +---- ok +-STATEMENT CREATE (t:test {prop: 507022}); +---- ok +-STATEMENT CREATE (t:test {prop: 482093}); +---- ok +-STATEMENT CREATE (t:test {prop: 561512}); +---- ok +-STATEMENT CREATE (t:test {prop: 472903}); +---- ok +-STATEMENT CREATE (t:test {prop: 384071}); +---- ok +-STATEMENT CREATE (t:test {prop: 444828}); +---- ok +-STATEMENT CREATE (t:test {prop: 764509}); +---- ok +-STATEMENT CREATE (t:test {prop: 310018}); +---- ok +-STATEMENT CREATE (t:test {prop: 289896}); +---- ok +-STATEMENT CREATE (t:test {prop: 191089}); +---- ok +-STATEMENT CREATE (t:test {prop: 42105}); +---- ok +-STATEMENT CREATE (t:test {prop: 139445}); +---- ok +-STATEMENT CREATE (t:test {prop: 585265}); +---- ok +-STATEMENT CREATE (t:test {prop: 614803}); +---- ok +-STATEMENT CREATE (t:test {prop: 338358}); +---- ok +-STATEMENT CREATE (t:test {prop: 683773}); +---- ok +-STATEMENT CREATE (t:test {prop: 129187}); +---- ok +-STATEMENT CREATE (t:test {prop: 484425}); +---- ok +-STATEMENT CREATE (t:test {prop: 311587}); +---- ok +-STATEMENT CREATE (t:test {prop: 210587}); +---- ok +-STATEMENT CREATE (t:test {prop: 908545}); +---- ok +-STATEMENT CREATE (t:test {prop: 491018}); +---- ok +-STATEMENT CREATE (t:test {prop: 268309}); +---- ok +-STATEMENT CREATE (t:test {prop: 547072}); +---- ok +-STATEMENT CREATE (t:test {prop: 239537}); +---- ok +-STATEMENT CREATE (t:test {prop: 13844}); +---- ok +-STATEMENT CREATE (t:test {prop: 765950}); +---- ok +-STATEMENT CREATE (t:test {prop: 403516}); +---- ok +-STATEMENT CREATE (t:test {prop: 284472}); +---- ok +-STATEMENT CREATE (t:test {prop: 591300}); +---- ok +-STATEMENT CREATE (t:test {prop: 537681}); +---- ok +-STATEMENT CREATE (t:test {prop: 117775}); +---- ok +-STATEMENT CREATE (t:test {prop: 166273}); +---- ok +-STATEMENT CREATE (t:test {prop: 827138}); +---- ok +-STATEMENT CREATE (t:test {prop: 655357}); +---- ok +-STATEMENT CREATE (t:test {prop: 813128}); +---- ok +-STATEMENT CREATE (t:test {prop: 174246}); +---- ok +-STATEMENT CREATE (t:test {prop: 778298}); +---- ok +-STATEMENT CREATE (t:test {prop: 146310}); +---- ok +-STATEMENT CREATE (t:test {prop: 674484}); +---- ok +-STATEMENT CREATE (t:test {prop: 257519}); +---- ok +-STATEMENT CREATE (t:test {prop: 77957}); +---- ok +-STATEMENT CREATE (t:test {prop: 958686}); +---- ok +-STATEMENT CREATE (t:test {prop: 97090}); +---- ok +-STATEMENT CREATE (t:test {prop: 555578}); +---- ok +-STATEMENT CREATE (t:test {prop: 17380}); +---- ok +-STATEMENT CREATE (t:test {prop: 487374}); +---- ok +-STATEMENT CREATE (t:test {prop: 305544}); +---- ok +-STATEMENT CREATE (t:test {prop: 64848}); +---- ok +-STATEMENT CREATE (t:test {prop: 630964}); +---- ok +-STATEMENT CREATE (t:test {prop: 73988}); +---- ok +-STATEMENT CREATE (t:test {prop: 126130}); +---- ok +-STATEMENT CREATE (t:test {prop: 780297}); +---- ok +-STATEMENT CREATE (t:test {prop: 605832}); +---- ok +-STATEMENT CREATE (t:test {prop: 817243}); +---- ok +-STATEMENT CREATE (t:test {prop: 962050}); +---- ok +-STATEMENT CREATE (t:test {prop: 327050}); +---- ok +-STATEMENT CREATE (t:test {prop: 608289}); +---- ok +-STATEMENT CREATE (t:test {prop: 540509}); +---- ok +-STATEMENT CREATE (t:test {prop: 676857}); +---- ok +-STATEMENT CREATE (t:test {prop: 107981}); +---- ok +-STATEMENT CREATE (t:test {prop: 623976}); +---- ok +-STATEMENT CREATE (t:test {prop: 878274}); +---- ok +-STATEMENT CREATE (t:test {prop: 948844}); +---- ok +-STATEMENT CREATE (t:test {prop: 659363}); +---- ok +-STATEMENT CREATE (t:test {prop: 387137}); +---- ok +-STATEMENT CREATE (t:test {prop: 347714}); +---- ok +-STATEMENT CREATE (t:test {prop: 956670}); +---- ok +-STATEMENT CREATE (t:test {prop: 918065}); +---- ok +-STATEMENT CREATE (t:test {prop: 603064}); +---- ok +-STATEMENT CREATE (t:test {prop: 367473}); +---- ok +-STATEMENT CREATE (t:test {prop: 808753}); +---- ok +-STATEMENT CREATE (t:test {prop: 784201}); +---- ok +-STATEMENT CREATE (t:test {prop: 815348}); +---- ok +-STATEMENT CREATE (t:test {prop: 800926}); +---- ok +-STATEMENT CREATE (t:test {prop: 406498}); +---- ok +-STATEMENT CREATE (t:test {prop: 145637}); +---- ok +-STATEMENT CREATE (t:test {prop: 796315}); +---- ok +-STATEMENT CREATE (t:test {prop: 792439}); +---- ok +-STATEMENT CREATE (t:test {prop: 326481}); +---- ok +-STATEMENT CREATE (t:test {prop: 838911}); +---- ok +-STATEMENT CREATE (t:test {prop: 514930}); +---- ok +-STATEMENT CREATE (t:test {prop: 435059}); +---- ok +-STATEMENT CREATE (t:test {prop: 957312}); +---- ok +-STATEMENT CREATE (t:test {prop: 948174}); +---- ok +-STATEMENT CREATE (t:test {prop: 192945}); +---- ok +-STATEMENT CREATE (t:test {prop: 104801}); +---- ok +-STATEMENT CREATE (t:test {prop: 603838}); +---- ok +-STATEMENT CREATE (t:test {prop: 320979}); +---- ok +-STATEMENT CREATE (t:test {prop: 56048}); +---- ok +-STATEMENT CREATE (t:test {prop: 748373}); +---- ok +-STATEMENT CREATE (t:test {prop: 78108}); +---- ok +-STATEMENT CREATE (t:test {prop: 680549}); +---- ok +-STATEMENT CREATE (t:test {prop: 661125}); +---- ok +-STATEMENT CREATE (t:test {prop: 891378}); +---- ok +-STATEMENT CREATE (t:test {prop: 187888}); +---- ok +-STATEMENT CREATE (t:test {prop: 708898}); +---- ok +-STATEMENT CREATE (t:test {prop: 733951}); +---- ok +-STATEMENT CREATE (t:test {prop: 436630}); +---- ok +-STATEMENT CREATE (t:test {prop: 456681}); +---- ok +-STATEMENT CREATE (t:test {prop: 103690}); +---- ok +-STATEMENT CREATE (t:test {prop: 244424}); +---- ok +-STATEMENT CREATE (t:test {prop: 267421}); +---- ok +-STATEMENT CREATE (t:test {prop: 546391}); +---- ok +-STATEMENT CREATE (t:test {prop: 793174}); +---- ok +-STATEMENT CREATE (t:test {prop: 685069}); +---- ok +-STATEMENT CREATE (t:test {prop: 891587}); +---- ok +-STATEMENT CREATE (t:test {prop: 60319}); +---- ok +-STATEMENT CREATE (t:test {prop: 318651}); +---- ok +-STATEMENT CREATE (t:test {prop: 738866}); +---- ok +-STATEMENT CREATE (t:test {prop: 649095}); +---- ok +-STATEMENT CREATE (t:test {prop: 502887}); +---- ok +-STATEMENT CREATE (t:test {prop: 581282}); +---- ok +-STATEMENT CREATE (t:test {prop: 495893}); +---- ok +-STATEMENT CREATE (t:test {prop: 156186}); +---- ok +-STATEMENT CREATE (t:test {prop: 793786}); +---- ok +-STATEMENT CREATE (t:test {prop: 412269}); +---- ok +-STATEMENT CREATE (t:test {prop: 96642}); +---- ok +-STATEMENT CREATE (t:test {prop: 860316}); +---- ok +-STATEMENT CREATE (t:test {prop: 720099}); +---- ok +-STATEMENT CREATE (t:test {prop: 360057}); +---- ok +-STATEMENT CREATE (t:test {prop: 756438}); +---- ok +-STATEMENT CREATE (t:test {prop: 322367}); +---- ok +-STATEMENT CREATE (t:test {prop: 884767}); +---- ok +-STATEMENT CREATE (t:test {prop: 268804}); +---- ok +-STATEMENT CREATE (t:test {prop: 31114}); +---- ok +-STATEMENT CREATE (t:test {prop: 782357}); +---- ok +-STATEMENT CREATE (t:test {prop: 530787}); +---- ok +-STATEMENT CREATE (t:test {prop: 375721}); +---- ok +-STATEMENT CREATE (t:test {prop: 388548}); +---- ok +-STATEMENT CREATE (t:test {prop: 489761}); +---- ok +-STATEMENT CREATE (t:test {prop: 132049}); +---- ok +-STATEMENT CREATE (t:test {prop: 873237}); +---- ok +-STATEMENT CREATE (t:test {prop: 990077}); +---- ok +-STATEMENT CREATE (t:test {prop: 528371}); +---- ok +-STATEMENT CREATE (t:test {prop: 583403}); +---- ok +-STATEMENT CREATE (t:test {prop: 721847}); +---- ok +-STATEMENT CREATE (t:test {prop: 152443}); +---- ok +-STATEMENT CREATE (t:test {prop: 753010}); +---- ok +-STATEMENT CREATE (t:test {prop: 602655}); +---- ok +-STATEMENT CREATE (t:test {prop: 469340}); +---- ok +-STATEMENT CREATE (t:test {prop: 321573}); +---- ok +-STATEMENT CREATE (t:test {prop: 882709}); +---- ok +-STATEMENT CREATE (t:test {prop: 232411}); +---- ok +-STATEMENT CREATE (t:test {prop: 392621}); +---- ok +-STATEMENT CREATE (t:test {prop: 497764}); +---- ok +-STATEMENT CREATE (t:test {prop: 518643}); +---- ok +-STATEMENT CREATE (t:test {prop: 505417}); +---- ok +-STATEMENT CREATE (t:test {prop: 20881}); +---- ok +-STATEMENT CREATE (t:test {prop: 362025}); +---- ok +-STATEMENT CREATE (t:test {prop: 221341}); +---- ok +-STATEMENT CREATE (t:test {prop: 534760}); +---- ok +-STATEMENT CREATE (t:test {prop: 428901}); +---- ok +-STATEMENT CREATE (t:test {prop: 233527}); +---- ok +-STATEMENT CREATE (t:test {prop: 489526}); +---- ok +-STATEMENT CREATE (t:test {prop: 222944}); +---- ok +-STATEMENT CREATE (t:test {prop: 110148}); +---- ok +-STATEMENT CREATE (t:test {prop: 867918}); +---- ok +-STATEMENT CREATE (t:test {prop: 603744}); +---- ok +-STATEMENT CREATE (t:test {prop: 498445}); +---- ok +-STATEMENT CREATE (t:test {prop: 369710}); +---- ok +-STATEMENT CREATE (t:test {prop: 634144}); +---- ok +-STATEMENT CREATE (t:test {prop: 478036}); +---- ok +-STATEMENT CREATE (t:test {prop: 548956}); +---- ok +-STATEMENT CREATE (t:test {prop: 757436}); +---- ok +-STATEMENT CREATE (t:test {prop: 581443}); +---- ok +-STATEMENT CREATE (t:test {prop: 53080}); +---- ok +-STATEMENT CREATE (t:test {prop: 766725}); +---- ok +-STATEMENT CREATE (t:test {prop: 271789}); +---- ok +-STATEMENT CREATE (t:test {prop: 251402}); +---- ok +-STATEMENT CREATE (t:test {prop: 801172}); +---- ok +-STATEMENT CREATE (t:test {prop: 430799}); +---- ok +-STATEMENT CREATE (t:test {prop: 380590}); +---- ok +-STATEMENT CREATE (t:test {prop: 512639}); +---- ok +-STATEMENT CREATE (t:test {prop: 676107}); +---- ok +-STATEMENT CREATE (t:test {prop: 780808}); +---- ok +-STATEMENT CREATE (t:test {prop: 36736}); +---- ok +-STATEMENT CREATE (t:test {prop: 858600}); +---- ok +-STATEMENT CREATE (t:test {prop: 227156}); +---- ok +-STATEMENT CREATE (t:test {prop: 72701}); +---- ok +-STATEMENT CREATE (t:test {prop: 208848}); +---- ok +-STATEMENT CREATE (t:test {prop: 208584}); +---- ok +-STATEMENT CREATE (t:test {prop: 230883}); +---- ok +-STATEMENT CREATE (t:test {prop: 796672}); +---- ok +-STATEMENT CREATE (t:test {prop: 410321}); +---- ok +-STATEMENT CREATE (t:test {prop: 618456}); +---- ok +-STATEMENT CREATE (t:test {prop: 890437}); +---- ok +-STATEMENT CREATE (t:test {prop: 957376}); +---- ok +-STATEMENT CREATE (t:test {prop: 18771}); +---- ok +-STATEMENT CREATE (t:test {prop: 640451}); +---- ok +-STATEMENT CREATE (t:test {prop: 695541}); +---- ok +-STATEMENT CREATE (t:test {prop: 395068}); +---- ok +-STATEMENT CREATE (t:test {prop: 660107}); +---- ok +-STATEMENT CREATE (t:test {prop: 666702}); +---- ok +-STATEMENT CREATE (t:test {prop: 869572}); +---- ok +-STATEMENT CREATE (t:test {prop: 738738}); +---- ok +-STATEMENT CREATE (t:test {prop: 208576}); +---- ok +-STATEMENT CREATE (t:test {prop: 995833}); +---- ok +-STATEMENT CREATE (t:test {prop: 694286}); +---- ok +-STATEMENT CREATE (t:test {prop: 743792}); +---- ok +-STATEMENT CREATE (t:test {prop: 956279}); +---- ok +-STATEMENT CREATE (t:test {prop: 854720}); +---- ok +-STATEMENT CREATE (t:test {prop: 182979}); +---- ok +-STATEMENT CREATE (t:test {prop: 432665}); +---- ok +-STATEMENT CREATE (t:test {prop: 872722}); +---- ok +-STATEMENT CREATE (t:test {prop: 997969}); +---- ok +-STATEMENT CREATE (t:test {prop: 476798}); +---- ok +-STATEMENT CREATE (t:test {prop: 823540}); +---- ok +-STATEMENT CREATE (t:test {prop: 971429}); +---- ok +-STATEMENT CREATE (t:test {prop: 929199}); +---- ok +-STATEMENT CREATE (t:test {prop: 159349}); +---- ok +-STATEMENT CREATE (t:test {prop: 289668}); +---- ok +-STATEMENT CREATE (t:test {prop: 642159}); +---- ok +-STATEMENT CREATE (t:test {prop: 399146}); +---- ok +-STATEMENT CREATE (t:test {prop: 877069}); +---- ok +-STATEMENT CREATE (t:test {prop: 905090}); +---- ok +-STATEMENT CREATE (t:test {prop: 487838}); +---- ok +-STATEMENT CREATE (t:test {prop: 979815}); +---- ok +-STATEMENT CREATE (t:test {prop: 412748}); +---- ok +-STATEMENT CREATE (t:test {prop: 531841}); +---- ok +-STATEMENT CREATE (t:test {prop: 690759}); +---- ok +-STATEMENT CREATE (t:test {prop: 564252}); +---- ok +-STATEMENT CREATE (t:test {prop: 445040}); +---- ok +-STATEMENT CREATE (t:test {prop: 750877}); +---- ok +-STATEMENT CREATE (t:test {prop: 205272}); +---- ok +-STATEMENT CREATE (t:test {prop: 660067}); +---- ok +-STATEMENT CREATE (t:test {prop: 455474}); +---- ok +-STATEMENT CREATE (t:test {prop: 234660}); +---- ok +-STATEMENT CREATE (t:test {prop: 127880}); +---- ok +-STATEMENT CREATE (t:test {prop: 698293}); +---- ok +-STATEMENT CREATE (t:test {prop: 6773}); +---- ok +-STATEMENT CREATE (t:test {prop: 898506}); +---- ok +-STATEMENT CREATE (t:test {prop: 949624}); +---- ok +-STATEMENT CREATE (t:test {prop: 472149}); +---- ok +-STATEMENT CREATE (t:test {prop: 977942}); +---- ok +-STATEMENT CREATE (t:test {prop: 295279}); +---- ok +-STATEMENT CREATE (t:test {prop: 126517}); +---- ok +-STATEMENT CREATE (t:test {prop: 896323}); +---- ok +-STATEMENT CREATE (t:test {prop: 35755}); +---- ok +-STATEMENT CREATE (t:test {prop: 184961}); +---- ok +-STATEMENT CREATE (t:test {prop: 391980}); +---- ok +-STATEMENT CREATE (t:test {prop: 164469}); +---- ok +-STATEMENT CREATE (t:test {prop: 95576}); +---- ok +-STATEMENT CREATE (t:test {prop: 769030}); +---- ok +-STATEMENT CREATE (t:test {prop: 413459}); +---- ok +-STATEMENT CREATE (t:test {prop: 804858}); +---- ok +-STATEMENT CREATE (t:test {prop: 801014}); +---- ok +-STATEMENT CREATE (t:test {prop: 494598}); +---- ok +-STATEMENT CREATE (t:test {prop: 616235}); +---- ok +-STATEMENT CREATE (t:test {prop: 919628}); +---- ok +-STATEMENT CREATE (t:test {prop: 571865}); +---- ok +-STATEMENT CREATE (t:test {prop: 586364}); +---- ok +-STATEMENT CREATE (t:test {prop: 328173}); +---- ok +-STATEMENT CREATE (t:test {prop: 580547}); +---- ok +-STATEMENT CREATE (t:test {prop: 829374}); +---- ok +-STATEMENT CREATE (t:test {prop: 135857}); +---- ok +-STATEMENT CREATE (t:test {prop: 586923}); +---- ok +-STATEMENT CREATE (t:test {prop: 151078}); +---- ok +-STATEMENT CREATE (t:test {prop: 614836}); +---- ok +-STATEMENT CREATE (t:test {prop: 197984}); +---- ok +-STATEMENT CREATE (t:test {prop: 668330}); +---- ok +-STATEMENT CREATE (t:test {prop: 289540}); +---- ok +-STATEMENT CREATE (t:test {prop: 579641}); +---- ok +-STATEMENT CREATE (t:test {prop: 20214}); +---- ok +-STATEMENT CREATE (t:test {prop: 308013}); +---- ok +-STATEMENT CREATE (t:test {prop: 48815}); +---- ok +-STATEMENT CREATE (t:test {prop: 92856}); +---- ok +-STATEMENT CREATE (t:test {prop: 526374}); +---- ok +-STATEMENT CREATE (t:test {prop: 403532}); +---- ok +-STATEMENT CREATE (t:test {prop: 82256}); +---- ok +-STATEMENT CREATE (t:test {prop: 347036}); +---- ok +-STATEMENT CREATE (t:test {prop: 637882}); +---- ok +-STATEMENT CREATE (t:test {prop: 720554}); +---- ok +-STATEMENT CREATE (t:test {prop: 533675}); +---- ok +-STATEMENT CREATE (t:test {prop: 404240}); +---- ok +-STATEMENT CREATE (t:test {prop: 799546}); +---- ok +-STATEMENT CREATE (t:test {prop: 248421}); +---- ok +-STATEMENT CREATE (t:test {prop: 382657}); +---- ok +-STATEMENT CREATE (t:test {prop: 453244}); +---- ok +-STATEMENT CREATE (t:test {prop: 3354}); +---- ok +-STATEMENT CREATE (t:test {prop: 575429}); +---- ok +-STATEMENT CREATE (t:test {prop: 31470}); +---- ok +-STATEMENT CREATE (t:test {prop: 925663}); +---- ok +-STATEMENT CREATE (t:test {prop: 674738}); +---- ok +-STATEMENT CREATE (t:test {prop: 242714}); +---- ok +-STATEMENT CREATE (t:test {prop: 785843}); +---- ok +-STATEMENT CREATE (t:test {prop: 147747}); +---- ok +-STATEMENT CREATE (t:test {prop: 981450}); +---- ok +-STATEMENT CREATE (t:test {prop: 576661}); +---- ok +-STATEMENT CREATE (t:test {prop: 705809}); +---- ok +-STATEMENT CREATE (t:test {prop: 394380}); +---- ok +-STATEMENT CREATE (t:test {prop: 204119}); +---- ok +-STATEMENT CREATE (t:test {prop: 291060}); +---- ok +-STATEMENT CREATE (t:test {prop: 958414}); +---- ok +-STATEMENT CREATE (t:test {prop: 552745}); +---- ok +-STATEMENT CREATE (t:test {prop: 970721}); +---- ok +-STATEMENT CREATE (t:test {prop: 591895}); +---- ok +-STATEMENT CREATE (t:test {prop: 183541}); +---- ok +-STATEMENT CREATE (t:test {prop: 916934}); +---- ok +-STATEMENT CREATE (t:test {prop: 964365}); +---- ok +-STATEMENT CREATE (t:test {prop: 200735}); +---- ok +-STATEMENT CREATE (t:test {prop: 830207}); +---- ok +-STATEMENT CREATE (t:test {prop: 900841}); +---- ok +-STATEMENT CREATE (t:test {prop: 340694}); +---- ok +-STATEMENT CREATE (t:test {prop: 966376}); +---- ok +-STATEMENT CREATE (t:test {prop: 999242}); +---- ok +-STATEMENT CREATE (t:test {prop: 740297}); +---- ok +-STATEMENT CREATE (t:test {prop: 806447}); +---- ok +-STATEMENT CREATE (t:test {prop: 573691}); +---- ok +-STATEMENT CREATE (t:test {prop: 844634}); +---- ok +-STATEMENT CREATE (t:test {prop: 755323}); +---- ok +-STATEMENT CREATE (t:test {prop: 499336}); +---- ok +-STATEMENT CREATE (t:test {prop: 344288}); +---- ok +-STATEMENT CREATE (t:test {prop: 815983}); +---- ok +-STATEMENT CREATE (t:test {prop: 49671}); +---- ok +-STATEMENT CREATE (t:test {prop: 492504}); +---- ok +-STATEMENT CREATE (t:test {prop: 599301}); +---- ok +-STATEMENT CREATE (t:test {prop: 189066}); +---- ok +-STATEMENT CREATE (t:test {prop: 403474}); +---- ok +-STATEMENT CREATE (t:test {prop: 933332}); +---- ok +-STATEMENT CREATE (t:test {prop: 780430}); +---- ok +-STATEMENT CREATE (t:test {prop: 103296}); +---- ok +-STATEMENT CREATE (t:test {prop: 204424}); +---- ok +-STATEMENT CREATE (t:test {prop: 151220}); +---- ok +-STATEMENT CREATE (t:test {prop: 138274}); +---- ok +-STATEMENT CREATE (t:test {prop: 582079}); +---- ok +-STATEMENT CREATE (t:test {prop: 963561}); +---- ok +-STATEMENT CREATE (t:test {prop: 443798}); +---- ok +-STATEMENT CREATE (t:test {prop: 352180}); +---- ok +-STATEMENT CREATE (t:test {prop: 331006}); +---- ok +-STATEMENT CREATE (t:test {prop: 303458}); +---- ok +-STATEMENT CREATE (t:test {prop: 706725}); +---- ok +-STATEMENT CREATE (t:test {prop: 25144}); +---- ok +-STATEMENT CREATE (t:test {prop: 651288}); +---- ok +-STATEMENT CREATE (t:test {prop: 794462}); +---- ok +-STATEMENT CREATE (t:test {prop: 489587}); +---- ok +-STATEMENT CREATE (t:test {prop: 503401}); +---- ok +-STATEMENT CREATE (t:test {prop: 51004}); +---- ok +-STATEMENT CREATE (t:test {prop: 539722}); +---- ok +-STATEMENT CREATE (t:test {prop: 991371}); +---- ok +-STATEMENT CREATE (t:test {prop: 388807}); +---- ok +-STATEMENT CREATE (t:test {prop: 89188}); +---- ok +-STATEMENT CREATE (t:test {prop: 111522}); +---- ok +-STATEMENT CREATE (t:test {prop: 899385}); +---- ok +-STATEMENT CREATE (t:test {prop: 24832}); +---- ok +-STATEMENT CREATE (t:test {prop: 42064}); +---- ok +-STATEMENT CREATE (t:test {prop: 292728}); +---- ok +-STATEMENT CREATE (t:test {prop: 716721}); +---- ok +-STATEMENT CREATE (t:test {prop: 437771}); +---- ok +-STATEMENT CREATE (t:test {prop: 540791}); +---- ok +-STATEMENT CREATE (t:test {prop: 976956}); +---- ok +-STATEMENT CREATE (t:test {prop: 197335}); +---- ok +-STATEMENT CREATE (t:test {prop: 610467}); +---- ok +-STATEMENT CREATE (t:test {prop: 469687}); +---- ok +-STATEMENT CREATE (t:test {prop: 565616}); +---- ok +-STATEMENT CREATE (t:test {prop: 669204}); +---- ok +-STATEMENT CREATE (t:test {prop: 2076}); +---- ok +-STATEMENT CREATE (t:test {prop: 315791}); +---- ok +-STATEMENT CREATE (t:test {prop: 739192}); +---- ok +-STATEMENT CREATE (t:test {prop: 891517}); +---- ok +-STATEMENT CREATE (t:test {prop: 315294}); +---- ok +-STATEMENT CREATE (t:test {prop: 346389}); +---- ok +-STATEMENT CREATE (t:test {prop: 552508}); +---- ok +-STATEMENT CREATE (t:test {prop: 972497}); +---- ok +-STATEMENT CREATE (t:test {prop: 26061}); +---- ok +-STATEMENT CREATE (t:test {prop: 736082}); +---- ok +-STATEMENT CREATE (t:test {prop: 143036}); +---- ok +-STATEMENT CREATE (t:test {prop: 909355}); +---- ok +-STATEMENT CREATE (t:test {prop: 434700}); +---- ok +-STATEMENT CREATE (t:test {prop: 189407}); +---- ok +-STATEMENT CREATE (t:test {prop: 510825}); +---- ok +-STATEMENT CREATE (t:test {prop: 935509}); +---- ok +-STATEMENT CREATE (t:test {prop: 6560}); +---- ok +-STATEMENT CREATE (t:test {prop: 323427}); +---- ok +-STATEMENT CREATE (t:test {prop: 153199}); +---- ok +-STATEMENT CREATE (t:test {prop: 929780}); +---- ok +-STATEMENT CREATE (t:test {prop: 366235}); +---- ok +-STATEMENT CREATE (t:test {prop: 574539}); +---- ok +-STATEMENT CREATE (t:test {prop: 847603}); +---- ok +-STATEMENT CREATE (t:test {prop: 920571}); +---- ok +-STATEMENT CREATE (t:test {prop: 167420}); +---- ok +-STATEMENT CREATE (t:test {prop: 114495}); +---- ok +-STATEMENT CREATE (t:test {prop: 688021}); +---- ok +-STATEMENT CREATE (t:test {prop: 671240}); +---- ok +-STATEMENT CREATE (t:test {prop: 300793}); +---- ok +-STATEMENT CREATE (t:test {prop: 847613}); +---- ok +-STATEMENT CREATE (t:test {prop: 991339}); +---- ok +-STATEMENT CREATE (t:test {prop: 54156}); +---- ok +-STATEMENT CREATE (t:test {prop: 978945}); +---- ok +-STATEMENT CREATE (t:test {prop: 164853}); +---- ok +-STATEMENT CREATE (t:test {prop: 278213}); +---- ok +-STATEMENT CREATE (t:test {prop: 598262}); +---- ok +-STATEMENT CREATE (t:test {prop: 697225}); +---- ok +-STATEMENT CREATE (t:test {prop: 994873}); +---- ok +-STATEMENT CREATE (t:test {prop: 181765}); +---- ok +-STATEMENT CREATE (t:test {prop: 541318}); +---- ok +-STATEMENT CREATE (t:test {prop: 596435}); +---- ok +-STATEMENT CREATE (t:test {prop: 271986}); +---- ok +-STATEMENT CREATE (t:test {prop: 650616}); +---- ok +-STATEMENT CREATE (t:test {prop: 188784}); +---- ok +-STATEMENT CREATE (t:test {prop: 76475}); +---- ok +-STATEMENT CREATE (t:test {prop: 402707}); +---- ok +-STATEMENT CREATE (t:test {prop: 835840}); +---- ok +-STATEMENT CREATE (t:test {prop: 851718}); +---- ok +-STATEMENT CREATE (t:test {prop: 3075}); +---- ok +-STATEMENT CREATE (t:test {prop: 263873}); +---- ok +-STATEMENT CREATE (t:test {prop: 22657}); +---- ok +-STATEMENT CREATE (t:test {prop: 963817}); +---- ok +-STATEMENT CREATE (t:test {prop: 724126}); +---- ok +-STATEMENT CREATE (t:test {prop: 286556}); +---- ok +-STATEMENT CREATE (t:test {prop: 799459}); +---- ok +-STATEMENT CREATE (t:test {prop: 832011}); +---- ok +-STATEMENT CREATE (t:test {prop: 538349}); +---- ok +-STATEMENT CREATE (t:test {prop: 581703}); +---- ok +-STATEMENT CREATE (t:test {prop: 294666}); +---- ok +-STATEMENT CREATE (t:test {prop: 893232}); +---- ok +-STATEMENT CREATE (t:test {prop: 578987}); +---- ok +-STATEMENT CREATE (t:test {prop: 470077}); +---- ok +-STATEMENT CREATE (t:test {prop: 534938}); +---- ok +-STATEMENT CREATE (t:test {prop: 919459}); +---- ok +-STATEMENT CREATE (t:test {prop: 895322}); +---- ok +-STATEMENT CREATE (t:test {prop: 13854}); +---- ok +-STATEMENT CREATE (t:test {prop: 266249}); +---- ok +-STATEMENT CREATE (t:test {prop: 604355}); +---- ok +-STATEMENT CREATE (t:test {prop: 368955}); +---- ok +-STATEMENT CREATE (t:test {prop: 889793}); +---- ok +-STATEMENT CREATE (t:test {prop: 66617}); +---- ok +-STATEMENT CREATE (t:test {prop: 787366}); +---- ok +-STATEMENT CREATE (t:test {prop: 596009}); +---- ok +-STATEMENT CREATE (t:test {prop: 291470}); +---- ok +-STATEMENT CREATE (t:test {prop: 552298}); +---- ok +-STATEMENT CREATE (t:test {prop: 541110}); +---- ok +-STATEMENT CREATE (t:test {prop: 142418}); +---- ok +-STATEMENT CREATE (t:test {prop: 783482}); +---- ok +-STATEMENT CREATE (t:test {prop: 191458}); +---- ok +-STATEMENT CREATE (t:test {prop: 475588}); +---- ok +-STATEMENT CREATE (t:test {prop: 300453}); +---- ok +-STATEMENT CREATE (t:test {prop: 318388}); +---- ok +-STATEMENT CREATE (t:test {prop: 509492}); +---- ok +-STATEMENT CREATE (t:test {prop: 924773}); +---- ok +-STATEMENT CREATE (t:test {prop: 183790}); +---- ok +-STATEMENT CREATE (t:test {prop: 873838}); +---- ok +-STATEMENT CREATE (t:test {prop: 83298}); +---- ok +-STATEMENT CREATE (t:test {prop: 129967}); +---- ok +-STATEMENT CREATE (t:test {prop: 260272}); +---- ok +-STATEMENT CREATE (t:test {prop: 776354}); +---- ok +-STATEMENT CREATE (t:test {prop: 558924}); +---- ok +-STATEMENT CREATE (t:test {prop: 760551}); +---- ok +-STATEMENT CREATE (t:test {prop: 688906}); +---- ok +-STATEMENT CREATE (t:test {prop: 431186}); +---- ok +-STATEMENT CREATE (t:test {prop: 382848}); +---- ok +-STATEMENT CREATE (t:test {prop: 189550}); +---- ok +-STATEMENT CREATE (t:test {prop: 905953}); +---- ok +-STATEMENT CREATE (t:test {prop: 171283}); +---- ok +-STATEMENT CREATE (t:test {prop: 798120}); +---- ok +-STATEMENT CREATE (t:test {prop: 500900}); +---- ok +-STATEMENT CREATE (t:test {prop: 378898}); +---- ok +-STATEMENT CREATE (t:test {prop: 311563}); +---- ok +-STATEMENT CREATE (t:test {prop: 734825}); +---- ok +-STATEMENT CREATE (t:test {prop: 5699}); +---- ok +-STATEMENT CREATE (t:test {prop: 209751}); +---- ok +-STATEMENT CREATE (t:test {prop: 997741}); +---- ok +-STATEMENT CREATE (t:test {prop: 791613}); +---- ok +-STATEMENT CREATE (t:test {prop: 569510}); +---- ok +-STATEMENT CREATE (t:test {prop: 571778}); +---- ok +-STATEMENT CREATE (t:test {prop: 894570}); +---- ok +-STATEMENT CREATE (t:test {prop: 346825}); +---- ok +-STATEMENT CREATE (t:test {prop: 92202}); +---- ok +-STATEMENT CREATE (t:test {prop: 271412}); +---- ok +-STATEMENT CREATE (t:test {prop: 751244}); +---- ok +-STATEMENT CREATE (t:test {prop: 38287}); +---- ok +-STATEMENT CREATE (t:test {prop: 383132}); +---- ok +-STATEMENT CREATE (t:test {prop: 872341}); +---- ok +-STATEMENT CREATE (t:test {prop: 529381}); +---- ok +-STATEMENT CREATE (t:test {prop: 230866}); +---- ok +-STATEMENT CREATE (t:test {prop: 517218}); +---- ok +-STATEMENT CREATE (t:test {prop: 706707}); +---- ok +-STATEMENT CREATE (t:test {prop: 925754}); +---- ok +-STATEMENT CREATE (t:test {prop: 479926}); +---- ok +-STATEMENT CREATE (t:test {prop: 361646}); +---- ok +-STATEMENT CREATE (t:test {prop: 718630}); +---- ok +-STATEMENT CREATE (t:test {prop: 575900}); +---- ok +-STATEMENT CREATE (t:test {prop: 118868}); +---- ok +-STATEMENT CREATE (t:test {prop: 236342}); +---- ok +-STATEMENT CREATE (t:test {prop: 821689}); +---- ok +-STATEMENT CREATE (t:test {prop: 130664}); +---- ok +-STATEMENT CREATE (t:test {prop: 435695}); +---- ok +-STATEMENT CREATE (t:test {prop: 984805}); +---- ok +-STATEMENT CREATE (t:test {prop: 335156}); +---- ok +-STATEMENT CREATE (t:test {prop: 607805}); +---- ok +-STATEMENT CREATE (t:test {prop: 61180}); +---- ok +-STATEMENT CREATE (t:test {prop: 946492}); +---- ok +-STATEMENT CREATE (t:test {prop: 211689}); +---- ok +-STATEMENT CREATE (t:test {prop: 354950}); +---- ok +-STATEMENT CREATE (t:test {prop: 80466}); +---- ok +-STATEMENT CREATE (t:test {prop: 110139}); +---- ok +-STATEMENT CREATE (t:test {prop: 591202}); +---- ok +-STATEMENT CREATE (t:test {prop: 256231}); +---- ok +-STATEMENT CREATE (t:test {prop: 66397}); +---- ok +-STATEMENT CREATE (t:test {prop: 887520}); +---- ok +-STATEMENT CREATE (t:test {prop: 728506}); +---- ok +-STATEMENT CREATE (t:test {prop: 553743}); +---- ok +-STATEMENT CREATE (t:test {prop: 348338}); +---- ok +-STATEMENT CREATE (t:test {prop: 4229}); +---- ok +-STATEMENT CREATE (t:test {prop: 880772}); +---- ok +-STATEMENT CREATE (t:test {prop: 396245}); +---- ok +-STATEMENT CREATE (t:test {prop: 378578}); +---- ok +-STATEMENT CREATE (t:test {prop: 154262}); +---- ok +-STATEMENT CREATE (t:test {prop: 638997}); +---- ok +-STATEMENT CREATE (t:test {prop: 420662}); +---- ok +-STATEMENT CREATE (t:test {prop: 39106}); +---- ok +-STATEMENT CREATE (t:test {prop: 541762}); +---- ok +-STATEMENT CREATE (t:test {prop: 696261}); +---- ok +-STATEMENT CREATE (t:test {prop: 118402}); +---- ok +-STATEMENT CREATE (t:test {prop: 529452}); +---- ok +-STATEMENT CREATE (t:test {prop: 314261}); +---- ok +-STATEMENT CREATE (t:test {prop: 80427}); +---- ok +-STATEMENT CREATE (t:test {prop: 443270}); +---- ok +-STATEMENT CREATE (t:test {prop: 324693}); +---- ok +-STATEMENT CREATE (t:test {prop: 930685}); +---- ok +-STATEMENT CREATE (t:test {prop: 563343}); +---- ok +-STATEMENT CREATE (t:test {prop: 780515}); +---- ok +-STATEMENT CREATE (t:test {prop: 786872}); +---- ok +-STATEMENT CREATE (t:test {prop: 830152}); +---- ok +-STATEMENT CREATE (t:test {prop: 610438}); +---- ok +-STATEMENT CREATE (t:test {prop: 458750}); +---- ok +-STATEMENT CREATE (t:test {prop: 870417}); +---- ok +-STATEMENT CREATE (t:test {prop: 795999}); +---- ok +-STATEMENT CREATE (t:test {prop: 334595}); +---- ok +-STATEMENT CREATE (t:test {prop: 357587}); +---- ok +-STATEMENT CREATE (t:test {prop: 35773}); +---- ok +-STATEMENT CREATE (t:test {prop: 655686}); +---- ok +-STATEMENT CREATE (t:test {prop: 117945}); +---- ok +-STATEMENT CREATE (t:test {prop: 160025}); +---- ok +-STATEMENT CREATE (t:test {prop: 751121}); +---- ok +-STATEMENT CREATE (t:test {prop: 5012}); +---- ok +-STATEMENT CREATE (t:test {prop: 521839}); +---- ok +-STATEMENT CREATE (t:test {prop: 39604}); +---- ok +-STATEMENT CREATE (t:test {prop: 365608}); +---- ok +-STATEMENT CREATE (t:test {prop: 283866}); +---- ok +-STATEMENT CREATE (t:test {prop: 750120}); +---- ok +-STATEMENT CREATE (t:test {prop: 283496}); +---- ok +-STATEMENT CREATE (t:test {prop: 236625}); +---- ok +-STATEMENT CREATE (t:test {prop: 311437}); +---- ok +-STATEMENT CREATE (t:test {prop: 805830}); +---- ok +-STATEMENT CREATE (t:test {prop: 128244}); +---- ok +-STATEMENT CREATE (t:test {prop: 317653}); +---- ok +-STATEMENT CREATE (t:test {prop: 838372}); +---- ok +-STATEMENT CREATE (t:test {prop: 169840}); +---- ok +-STATEMENT CREATE (t:test {prop: 751744}); +---- ok +-STATEMENT CREATE (t:test {prop: 83587}); +---- ok +-STATEMENT CREATE (t:test {prop: 761373}); +---- ok +-STATEMENT CREATE (t:test {prop: 559429}); +---- ok +-STATEMENT CREATE (t:test {prop: 447204}); +---- ok +-STATEMENT CREATE (t:test {prop: 587225}); +---- ok +-STATEMENT CREATE (t:test {prop: 653825}); +---- ok +-STATEMENT CREATE (t:test {prop: 975675}); +---- ok +-STATEMENT CREATE (t:test {prop: 957304}); +---- ok +-STATEMENT CREATE (t:test {prop: 412316}); +---- ok +-STATEMENT CREATE (t:test {prop: 747893}); +---- ok +-STATEMENT CREATE (t:test {prop: 172627}); +---- ok +-STATEMENT CREATE (t:test {prop: 137290}); +---- ok +-STATEMENT CREATE (t:test {prop: 170619}); +---- ok +-STATEMENT CREATE (t:test {prop: 902213}); +---- ok +-STATEMENT CREATE (t:test {prop: 165081}); +---- ok +-STATEMENT CREATE (t:test {prop: 278501}); +---- ok +-STATEMENT CREATE (t:test {prop: 908882}); +---- ok +-STATEMENT CREATE (t:test {prop: 552721}); +---- ok +-STATEMENT CREATE (t:test {prop: 229077}); +---- ok +-STATEMENT CREATE (t:test {prop: 634824}); +---- ok +-STATEMENT CREATE (t:test {prop: 674169}); +---- ok +-STATEMENT CREATE (t:test {prop: 68460}); +---- ok +-STATEMENT CREATE (t:test {prop: 774789}); +---- ok +-STATEMENT CREATE (t:test {prop: 305949}); +---- ok +-STATEMENT CREATE (t:test {prop: 516968}); +---- ok +-STATEMENT CREATE (t:test {prop: 698229}); +---- ok +-STATEMENT CREATE (t:test {prop: 50073}); +---- ok +-STATEMENT CREATE (t:test {prop: 797342}); +---- ok +-STATEMENT CREATE (t:test {prop: 497209}); +---- ok +-STATEMENT CREATE (t:test {prop: 869777}); +---- ok +-STATEMENT CREATE (t:test {prop: 539791}); +---- ok +-STATEMENT CREATE (t:test {prop: 294027}); +---- ok +-STATEMENT CREATE (t:test {prop: 988023}); +---- ok +-STATEMENT CREATE (t:test {prop: 28427}); +---- ok +-STATEMENT CREATE (t:test {prop: 38573}); +---- ok +-STATEMENT CREATE (t:test {prop: 485346}); +---- ok +-STATEMENT CREATE (t:test {prop: 817859}); +---- ok +-STATEMENT CREATE (t:test {prop: 459254}); +---- ok +-STATEMENT CREATE (t:test {prop: 477841}); +---- ok +-STATEMENT CREATE (t:test {prop: 655978}); +---- ok +-STATEMENT CREATE (t:test {prop: 900028}); +---- ok +-STATEMENT CREATE (t:test {prop: 652981}); +---- ok +-STATEMENT CREATE (t:test {prop: 267802}); +---- ok +-STATEMENT CREATE (t:test {prop: 421218}); +---- ok +-STATEMENT CREATE (t:test {prop: 94507}); +---- ok +-STATEMENT CREATE (t:test {prop: 374450}); +---- ok +-STATEMENT CREATE (t:test {prop: 156397}); +---- ok +-STATEMENT CREATE (t:test {prop: 987004}); +---- ok +-STATEMENT CREATE (t:test {prop: 355090}); +---- ok +-STATEMENT CREATE (t:test {prop: 32271}); +---- ok +-STATEMENT CREATE (t:test {prop: 550534}); +---- ok +-STATEMENT CREATE (t:test {prop: 340453}); +---- ok +-STATEMENT CREATE (t:test {prop: 892821}); +---- ok +-STATEMENT CREATE (t:test {prop: 33793}); +---- ok +-STATEMENT CREATE (t:test {prop: 976746}); +---- ok +-STATEMENT CREATE (t:test {prop: 375797}); +---- ok +-STATEMENT CREATE (t:test {prop: 498309}); +---- ok +-STATEMENT CREATE (t:test {prop: 168693}); +---- ok +-STATEMENT CREATE (t:test {prop: 973135}); +---- ok +-STATEMENT CREATE (t:test {prop: 556269}); +---- ok +-STATEMENT CREATE (t:test {prop: 167064}); +---- ok +-STATEMENT CREATE (t:test {prop: 404363}); +---- ok +-STATEMENT CREATE (t:test {prop: 248737}); +---- ok +-STATEMENT CREATE (t:test {prop: 364654}); +---- ok +-STATEMENT CREATE (t:test {prop: 107956}); +---- ok +-STATEMENT CREATE (t:test {prop: 878015}); +---- ok +-STATEMENT CREATE (t:test {prop: 458569}); +---- ok +-STATEMENT CREATE (t:test {prop: 315568}); +---- ok +-STATEMENT CREATE (t:test {prop: 756820}); +---- ok +-STATEMENT CREATE (t:test {prop: 261094}); +---- ok +-STATEMENT CREATE (t:test {prop: 236789}); +---- ok +-STATEMENT CREATE (t:test {prop: 227798}); +---- ok +-STATEMENT CREATE (t:test {prop: 612917}); +---- ok +-STATEMENT CREATE (t:test {prop: 782507}); +---- ok +-STATEMENT CREATE (t:test {prop: 52603}); +---- ok +-STATEMENT CREATE (t:test {prop: 145829}); +---- ok +-STATEMENT CREATE (t:test {prop: 465472}); +---- ok +-STATEMENT CREATE (t:test {prop: 82843}); +---- ok +-STATEMENT CREATE (t:test {prop: 177264}); +---- ok +-STATEMENT CREATE (t:test {prop: 426798}); +---- ok +-STATEMENT CREATE (t:test {prop: 623885}); +---- ok +-STATEMENT CREATE (t:test {prop: 105322}); +---- ok +-STATEMENT CREATE (t:test {prop: 876198}); +---- ok +-STATEMENT CREATE (t:test {prop: 452788}); +---- ok +-STATEMENT CREATE (t:test {prop: 181534}); +---- ok +-STATEMENT CREATE (t:test {prop: 126321}); +---- ok +-STATEMENT CREATE (t:test {prop: 463373}); +---- ok +-STATEMENT CREATE (t:test {prop: 596021}); +---- ok +-STATEMENT CREATE (t:test {prop: 578267}); +---- ok +-STATEMENT CREATE (t:test {prop: 770412}); +---- ok +-STATEMENT CREATE (t:test {prop: 62265}); +---- ok +-STATEMENT CREATE (t:test {prop: 531688}); +---- ok +-STATEMENT CREATE (t:test {prop: 803227}); +---- ok +-STATEMENT CREATE (t:test {prop: 340187}); +---- ok +-STATEMENT CREATE (t:test {prop: 252011}); +---- ok +-STATEMENT CREATE (t:test {prop: 655067}); +---- ok +-STATEMENT CREATE (t:test {prop: 433422}); +---- ok +-STATEMENT CREATE (t:test {prop: 754209}); +---- ok +-STATEMENT CREATE (t:test {prop: 58397}); +---- ok +-STATEMENT CREATE (t:test {prop: 969387}); +---- ok +-STATEMENT CREATE (t:test {prop: 143373}); +---- ok +-STATEMENT CREATE (t:test {prop: 285348}); +---- ok +-STATEMENT CREATE (t:test {prop: 453300}); +---- ok +-STATEMENT CREATE (t:test {prop: 50701}); +---- ok +-STATEMENT CREATE (t:test {prop: 450206}); +---- ok +-STATEMENT CREATE (t:test {prop: 906606}); +---- ok +-STATEMENT CREATE (t:test {prop: 918735}); +---- ok +-STATEMENT CREATE (t:test {prop: 761488}); +---- ok +-STATEMENT CREATE (t:test {prop: 220778}); +---- ok +-STATEMENT CREATE (t:test {prop: 274156}); +---- ok +-STATEMENT CREATE (t:test {prop: 951088}); +---- ok +-STATEMENT CREATE (t:test {prop: 774734}); +---- ok +-STATEMENT CREATE (t:test {prop: 527017}); +---- ok +-STATEMENT CREATE (t:test {prop: 985599}); +---- ok +-STATEMENT CREATE (t:test {prop: 136496}); +---- ok +-STATEMENT CREATE (t:test {prop: 116574}); +---- ok +-STATEMENT CREATE (t:test {prop: 407173}); +---- ok +-STATEMENT CREATE (t:test {prop: 322626}); +---- ok +-STATEMENT CREATE (t:test {prop: 826525}); +---- ok +-STATEMENT CREATE (t:test {prop: 652372}); +---- ok +-STATEMENT CREATE (t:test {prop: 438378}); +---- ok +-STATEMENT CREATE (t:test {prop: 654440}); +---- ok +-STATEMENT CREATE (t:test {prop: 253786}); +---- ok +-STATEMENT CREATE (t:test {prop: 140840}); +---- ok +-STATEMENT CREATE (t:test {prop: 669028}); +---- ok +-STATEMENT CREATE (t:test {prop: 797114}); +---- ok +-STATEMENT CREATE (t:test {prop: 818919}); +---- ok +-STATEMENT CREATE (t:test {prop: 873741}); +---- ok +-STATEMENT CREATE (t:test {prop: 321364}); +---- ok +-STATEMENT CREATE (t:test {prop: 270178}); +---- ok +-STATEMENT CREATE (t:test {prop: 806576}); +---- ok +-STATEMENT CREATE (t:test {prop: 893851}); +---- ok +-STATEMENT CREATE (t:test {prop: 306666}); +---- ok +-STATEMENT CREATE (t:test {prop: 362403}); +---- ok +-STATEMENT CREATE (t:test {prop: 759125}); +---- ok +-STATEMENT CREATE (t:test {prop: 160617}); +---- ok +-STATEMENT CREATE (t:test {prop: 125382}); +---- ok +-STATEMENT CREATE (t:test {prop: 757802}); +---- ok +-STATEMENT CREATE (t:test {prop: 22163}); +---- ok +-STATEMENT CREATE (t:test {prop: 783005}); +---- ok +-STATEMENT CREATE (t:test {prop: 241363}); +---- ok +-STATEMENT CREATE (t:test {prop: 399055}); +---- ok +-STATEMENT CREATE (t:test {prop: 471919}); +---- ok +-STATEMENT CREATE (t:test {prop: 283256}); +---- ok +-STATEMENT CREATE (t:test {prop: 360988}); +---- ok +-STATEMENT CREATE (t:test {prop: 254954}); +---- ok +-STATEMENT CREATE (t:test {prop: 179736}); +---- ok +-STATEMENT CREATE (t:test {prop: 995829}); +---- ok +-STATEMENT CREATE (t:test {prop: 634642}); +---- ok +-STATEMENT CREATE (t:test {prop: 600133}); +---- ok +-STATEMENT CREATE (t:test {prop: 615512}); +---- ok +-STATEMENT CREATE (t:test {prop: 868931}); +---- ok +-STATEMENT CREATE (t:test {prop: 835900}); +---- ok +-STATEMENT CREATE (t:test {prop: 159477}); +---- ok +-STATEMENT CREATE (t:test {prop: 365911}); +---- ok +-STATEMENT CREATE (t:test {prop: 129256}); +---- ok +-STATEMENT CREATE (t:test {prop: 768746}); +---- ok +-STATEMENT CREATE (t:test {prop: 584438}); +---- ok +-STATEMENT CREATE (t:test {prop: 548058}); +---- ok +-STATEMENT CREATE (t:test {prop: 33343}); +---- ok +-STATEMENT CREATE (t:test {prop: 700888}); +---- ok +-STATEMENT CREATE (t:test {prop: 272136}); +---- ok +-STATEMENT CREATE (t:test {prop: 382800}); +---- ok +-STATEMENT CREATE (t:test {prop: 320963}); +---- ok +-STATEMENT CREATE (t:test {prop: 437087}); +---- ok +-STATEMENT CREATE (t:test {prop: 610356}); +---- ok +-STATEMENT CREATE (t:test {prop: 837575}); +---- ok +-STATEMENT CREATE (t:test {prop: 922136}); +---- ok +-STATEMENT CREATE (t:test {prop: 204938}); +---- ok +-STATEMENT CREATE (t:test {prop: 255827}); +---- ok +-STATEMENT CREATE (t:test {prop: 335916}); +---- ok +-STATEMENT CREATE (t:test {prop: 124594}); +---- ok +-STATEMENT CREATE (t:test {prop: 571134}); +---- ok +-STATEMENT CREATE (t:test {prop: 287167}); +---- ok +-STATEMENT CREATE (t:test {prop: 850692}); +---- ok +-STATEMENT CREATE (t:test {prop: 371018}); +---- ok +-STATEMENT CREATE (t:test {prop: 97002}); +---- ok +-STATEMENT CREATE (t:test {prop: 369158}); +---- ok +-STATEMENT CREATE (t:test {prop: 929871}); +---- ok +-STATEMENT CREATE (t:test {prop: 812305}); +---- ok +-STATEMENT CREATE (t:test {prop: 64559}); +---- ok +-STATEMENT CREATE (t:test {prop: 613596}); +---- ok +-STATEMENT CREATE (t:test {prop: 460524}); +---- ok +-STATEMENT CREATE (t:test {prop: 95947}); +---- ok +-STATEMENT CREATE (t:test {prop: 864084}); +---- ok +-STATEMENT CREATE (t:test {prop: 867314}); +---- ok +-STATEMENT CREATE (t:test {prop: 573380}); +---- ok +-STATEMENT CREATE (t:test {prop: 189803}); +---- ok +-STATEMENT CREATE (t:test {prop: 973451}); +---- ok +-STATEMENT CREATE (t:test {prop: 629860}); +---- ok +-STATEMENT CREATE (t:test {prop: 390288}); +---- ok +-STATEMENT CREATE (t:test {prop: 20233}); +---- ok +-STATEMENT CREATE (t:test {prop: 843033}); +---- ok +-STATEMENT CREATE (t:test {prop: 702649}); +---- ok +-STATEMENT CREATE (t:test {prop: 699556}); +---- ok +-STATEMENT CREATE (t:test {prop: 534897}); +---- ok +-STATEMENT CREATE (t:test {prop: 366153}); +---- ok +-STATEMENT CREATE (t:test {prop: 908435}); +---- ok +-STATEMENT CREATE (t:test {prop: 324595}); +---- ok +-STATEMENT CREATE (t:test {prop: 534766}); +---- ok +-STATEMENT CREATE (t:test {prop: 67790}); +---- ok +-STATEMENT CREATE (t:test {prop: 264598}); +---- ok +-STATEMENT CREATE (t:test {prop: 542704}); +---- ok +-STATEMENT CREATE (t:test {prop: 70852}); +---- ok +-STATEMENT CREATE (t:test {prop: 613993}); +---- ok +-STATEMENT CREATE (t:test {prop: 307876}); +---- ok +-STATEMENT CREATE (t:test {prop: 143498}); +---- ok +-STATEMENT CREATE (t:test {prop: 972528}); +---- ok +-STATEMENT CREATE (t:test {prop: 696354}); +---- ok +-STATEMENT CREATE (t:test {prop: 869588}); +---- ok +-STATEMENT CREATE (t:test {prop: 360706}); +---- ok +-STATEMENT CREATE (t:test {prop: 608705}); +---- ok +-STATEMENT CREATE (t:test {prop: 264484}); +---- ok +-STATEMENT CREATE (t:test {prop: 536820}); +---- ok +-STATEMENT CREATE (t:test {prop: 526829}); +---- ok +-STATEMENT CREATE (t:test {prop: 359904}); +---- ok +-STATEMENT CREATE (t:test {prop: 442125}); +---- ok +-STATEMENT CREATE (t:test {prop: 660253}); +---- ok +-STATEMENT CREATE (t:test {prop: 726713}); +---- ok +-STATEMENT CREATE (t:test {prop: 743903}); +---- ok +-STATEMENT CREATE (t:test {prop: 871470}); +---- ok +-STATEMENT CREATE (t:test {prop: 117210}); +---- ok +-STATEMENT CREATE (t:test {prop: 424007}); +---- ok +-STATEMENT CREATE (t:test {prop: 948784}); +---- ok +-STATEMENT CREATE (t:test {prop: 402704}); +---- ok +-STATEMENT CREATE (t:test {prop: 385367}); +---- ok +-STATEMENT CREATE (t:test {prop: 908643}); +---- ok +-STATEMENT CREATE (t:test {prop: 225221}); +---- ok +-STATEMENT CREATE (t:test {prop: 105475}); +---- ok +-STATEMENT CREATE (t:test {prop: 568534}); +---- ok +-STATEMENT CREATE (t:test {prop: 408512}); +---- ok +-STATEMENT CREATE (t:test {prop: 238387}); +---- ok +-STATEMENT CREATE (t:test {prop: 179413}); +---- ok +-STATEMENT CREATE (t:test {prop: 829125}); +---- ok +-STATEMENT CREATE (t:test {prop: 418168}); +---- ok +-STATEMENT CREATE (t:test {prop: 546262}); +---- ok +-STATEMENT CREATE (t:test {prop: 760683}); +---- ok +-STATEMENT CREATE (t:test {prop: 581926}); +---- ok +-STATEMENT CREATE (t:test {prop: 494661}); +---- ok +-STATEMENT CREATE (t:test {prop: 958911}); +---- ok +-STATEMENT CREATE (t:test {prop: 572894}); +---- ok +-STATEMENT CREATE (t:test {prop: 485668}); +---- ok +-STATEMENT CREATE (t:test {prop: 793967}); +---- ok +-STATEMENT CREATE (t:test {prop: 724462}); +---- ok +-STATEMENT CREATE (t:test {prop: 500121}); +---- ok +-STATEMENT CREATE (t:test {prop: 471653}); +---- ok +-STATEMENT CREATE (t:test {prop: 866425}); +---- ok +-STATEMENT CREATE (t:test {prop: 520209}); +---- ok +-STATEMENT CREATE (t:test {prop: 933820}); +---- ok +-STATEMENT CREATE (t:test {prop: 376991}); +---- ok +-STATEMENT CREATE (t:test {prop: 476287}); +---- ok +-STATEMENT CREATE (t:test {prop: 645318}); +---- ok +-STATEMENT CREATE (t:test {prop: 297346}); +---- ok +-STATEMENT CREATE (t:test {prop: 183912}); +---- ok +-STATEMENT CREATE (t:test {prop: 767360}); +---- ok +-STATEMENT CREATE (t:test {prop: 827387}); +---- ok +-STATEMENT CREATE (t:test {prop: 395003}); +---- ok +-STATEMENT CREATE (t:test {prop: 272764}); +---- ok +-STATEMENT CREATE (t:test {prop: 750183}); +---- ok +-STATEMENT CREATE (t:test {prop: 340169}); +---- ok +-STATEMENT CREATE (t:test {prop: 630114}); +---- ok +-STATEMENT CREATE (t:test {prop: 579585}); +---- ok +-STATEMENT CREATE (t:test {prop: 757980}); +---- ok +-STATEMENT CREATE (t:test {prop: 151569}); +---- ok +-STATEMENT CREATE (t:test {prop: 248754}); +---- ok +-STATEMENT CREATE (t:test {prop: 76042}); +---- ok +-STATEMENT CREATE (t:test {prop: 563570}); +---- ok +-STATEMENT CREATE (t:test {prop: 167817}); +---- ok +-STATEMENT CREATE (t:test {prop: 663261}); +---- ok +-STATEMENT CREATE (t:test {prop: 212284}); +---- ok +-STATEMENT CREATE (t:test {prop: 547607}); +---- ok +-STATEMENT CREATE (t:test {prop: 962290}); +---- ok +-STATEMENT CREATE (t:test {prop: 913394}); +---- ok +-STATEMENT CREATE (t:test {prop: 132519}); +---- ok +-STATEMENT CREATE (t:test {prop: 432309}); +---- ok +-STATEMENT CREATE (t:test {prop: 683271}); +---- ok +-STATEMENT CREATE (t:test {prop: 992183}); +---- ok +-STATEMENT CREATE (t:test {prop: 766204}); +---- ok +-STATEMENT CREATE (t:test {prop: 223954}); +---- ok +-STATEMENT CREATE (t:test {prop: 769600}); +---- ok +-STATEMENT CREATE (t:test {prop: 208943}); +---- ok +-STATEMENT CREATE (t:test {prop: 765764}); +---- ok +-STATEMENT CREATE (t:test {prop: 926499}); +---- ok +-STATEMENT CREATE (t:test {prop: 83812}); +---- ok +-STATEMENT CREATE (t:test {prop: 136868}); +---- ok +-STATEMENT CREATE (t:test {prop: 713083}); +---- ok +-STATEMENT CREATE (t:test {prop: 782983}); +---- ok +-STATEMENT CREATE (t:test {prop: 371468}); +---- ok +-STATEMENT CREATE (t:test {prop: 834368}); +---- ok +-STATEMENT CREATE (t:test {prop: 819633}); +---- ok +-STATEMENT CREATE (t:test {prop: 813410}); +---- ok +-STATEMENT CREATE (t:test {prop: 330292}); +---- ok +-STATEMENT CREATE (t:test {prop: 843409}); +---- ok +-STATEMENT CREATE (t:test {prop: 668637}); +---- ok +-STATEMENT CREATE (t:test {prop: 450217}); +---- ok +-STATEMENT CREATE (t:test {prop: 853487}); +---- ok +-STATEMENT CREATE (t:test {prop: 718165}); +---- ok +-STATEMENT CREATE (t:test {prop: 125301}); +---- ok +-STATEMENT CREATE (t:test {prop: 660861}); +---- ok +-STATEMENT CREATE (t:test {prop: 883056}); +---- ok +-STATEMENT CREATE (t:test {prop: 18427}); +---- ok +-STATEMENT CREATE (t:test {prop: 887683}); +---- ok +-STATEMENT CREATE (t:test {prop: 543560}); +---- ok +-STATEMENT CREATE (t:test {prop: 767577}); +---- ok +-STATEMENT CREATE (t:test {prop: 449874}); +---- ok +-STATEMENT CREATE (t:test {prop: 144901}); +---- ok +-STATEMENT CREATE (t:test {prop: 698855}); +---- ok +-STATEMENT CREATE (t:test {prop: 623914}); +---- ok +-STATEMENT CREATE (t:test {prop: 88726}); +---- ok +-STATEMENT CREATE (t:test {prop: 86327}); +---- ok +-STATEMENT CREATE (t:test {prop: 123569}); +---- ok +-STATEMENT CREATE (t:test {prop: 600528}); +---- ok +-STATEMENT CREATE (t:test {prop: 751497}); +---- ok +-STATEMENT CREATE (t:test {prop: 949622}); +---- ok +-STATEMENT CREATE (t:test {prop: 69109}); +---- ok +-STATEMENT CREATE (t:test {prop: 441148}); +---- ok +-STATEMENT CREATE (t:test {prop: 548586}); +---- ok +-STATEMENT CREATE (t:test {prop: 949734}); +---- ok +-STATEMENT CREATE (t:test {prop: 560346}); +---- ok +-STATEMENT CREATE (t:test {prop: 824900}); +---- ok +-STATEMENT CREATE (t:test {prop: 851405}); +---- ok +-STATEMENT CREATE (t:test {prop: 930601}); +---- ok +-STATEMENT CREATE (t:test {prop: 461777}); +---- ok +-STATEMENT CREATE (t:test {prop: 243515}); +---- ok +-STATEMENT CREATE (t:test {prop: 214920}); +---- ok +-STATEMENT CREATE (t:test {prop: 824301}); +---- ok +-STATEMENT CREATE (t:test {prop: 343615}); +---- ok +-STATEMENT CREATE (t:test {prop: 726372}); +---- ok +-STATEMENT CREATE (t:test {prop: 95199}); +---- ok +-STATEMENT CREATE (t:test {prop: 373283}); +---- ok +-STATEMENT CREATE (t:test {prop: 775487}); +---- ok +-STATEMENT CREATE (t:test {prop: 836251}); +---- ok +-STATEMENT CREATE (t:test {prop: 72290}); +---- ok +-STATEMENT CREATE (t:test {prop: 799735}); +---- ok +-STATEMENT CREATE (t:test {prop: 664458}); +---- ok +-STATEMENT CREATE (t:test {prop: 279709}); +---- ok +-STATEMENT CREATE (t:test {prop: 470216}); +---- ok +-STATEMENT CREATE (t:test {prop: 632007}); +---- ok +-STATEMENT CREATE (t:test {prop: 674885}); +---- ok +-STATEMENT CREATE (t:test {prop: 528428}); +---- ok +-STATEMENT CREATE (t:test {prop: 156392}); +---- ok +-STATEMENT CREATE (t:test {prop: 557423}); +---- ok +-STATEMENT CREATE (t:test {prop: 837341}); +---- ok +-STATEMENT CREATE (t:test {prop: 225757}); +---- ok +-STATEMENT CREATE (t:test {prop: 600161}); +---- ok +-STATEMENT CREATE (t:test {prop: 480198}); +---- ok +-STATEMENT CREATE (t:test {prop: 757538}); +---- ok +-STATEMENT CREATE (t:test {prop: 62410}); +---- ok +-STATEMENT CREATE (t:test {prop: 310732}); +---- ok +-STATEMENT CREATE (t:test {prop: 872297}); +---- ok +-STATEMENT CREATE (t:test {prop: 286551}); +---- ok +-STATEMENT CREATE (t:test {prop: 161869}); +---- ok +-STATEMENT CREATE (t:test {prop: 371230}); +---- ok +-STATEMENT CREATE (t:test {prop: 230275}); +---- ok +-STATEMENT CREATE (t:test {prop: 428854}); +---- ok +-STATEMENT CREATE (t:test {prop: 746204}); +---- ok +-STATEMENT CREATE (t:test {prop: 84684}); +---- ok +-STATEMENT CREATE (t:test {prop: 989677}); +---- ok +-STATEMENT CREATE (t:test {prop: 261783}); +---- ok +-STATEMENT CREATE (t:test {prop: 623584}); +---- ok +-STATEMENT CREATE (t:test {prop: 582112}); +---- ok +-STATEMENT CREATE (t:test {prop: 325007}); +---- ok +-STATEMENT CREATE (t:test {prop: 683024}); +---- ok +-STATEMENT CREATE (t:test {prop: 408811}); +---- ok +-STATEMENT CREATE (t:test {prop: 98209}); +---- ok +-STATEMENT CREATE (t:test {prop: 526260}); +---- ok +-STATEMENT CREATE (t:test {prop: 17400}); +---- ok +-STATEMENT CREATE (t:test {prop: 213990}); +---- ok +-STATEMENT CREATE (t:test {prop: 800935}); +---- ok +-STATEMENT CREATE (t:test {prop: 199123}); +---- ok +-STATEMENT CREATE (t:test {prop: 667617}); +---- ok +-STATEMENT CREATE (t:test {prop: 309292}); +---- ok +-STATEMENT CREATE (t:test {prop: 329036}); +---- ok +-STATEMENT CREATE (t:test {prop: 913711}); +---- ok +-STATEMENT CREATE (t:test {prop: 162923}); +---- ok +-STATEMENT CREATE (t:test {prop: 266150}); +---- ok +-STATEMENT CREATE (t:test {prop: 451760}); +---- ok +-STATEMENT CREATE (t:test {prop: 383737}); +---- ok +-STATEMENT CREATE (t:test {prop: 990711}); +---- ok +-STATEMENT CREATE (t:test {prop: 568201}); +---- ok +-STATEMENT CREATE (t:test {prop: 160983}); +---- ok +-STATEMENT CREATE (t:test {prop: 561989}); +---- ok +-STATEMENT CREATE (t:test {prop: 229664}); +---- ok +-STATEMENT CREATE (t:test {prop: 919656}); +---- ok +-STATEMENT CREATE (t:test {prop: 476996}); +---- ok +-STATEMENT CREATE (t:test {prop: 203562}); +---- ok +-STATEMENT CREATE (t:test {prop: 226564}); +---- ok +-STATEMENT CREATE (t:test {prop: 523947}); +---- ok +-STATEMENT CREATE (t:test {prop: 844860}); +---- ok +-STATEMENT CREATE (t:test {prop: 268284}); +---- ok +-STATEMENT CREATE (t:test {prop: 459169}); +---- ok +-STATEMENT CREATE (t:test {prop: 668762}); +---- ok +-STATEMENT CREATE (t:test {prop: 290885}); +---- ok +-STATEMENT CREATE (t:test {prop: 879604}); +---- ok +-STATEMENT CREATE (t:test {prop: 649562}); +---- ok +-STATEMENT CREATE (t:test {prop: 627772}); +---- ok +-STATEMENT CREATE (t:test {prop: 95125}); +---- ok +-STATEMENT CREATE (t:test {prop: 171794}); +---- ok +-STATEMENT CREATE (t:test {prop: 718874}); +---- ok +-STATEMENT CREATE (t:test {prop: 509446}); +---- ok +-STATEMENT CREATE (t:test {prop: 21206}); +---- ok +-STATEMENT CREATE (t:test {prop: 207336}); +---- ok +-STATEMENT CREATE (t:test {prop: 272465}); +---- ok +-STATEMENT CREATE (t:test {prop: 573112}); +---- ok +-STATEMENT CREATE (t:test {prop: 835661}); +---- ok +-STATEMENT CREATE (t:test {prop: 11099}); +---- ok +-STATEMENT CREATE (t:test {prop: 364820}); +---- ok +-STATEMENT CREATE (t:test {prop: 290706}); +---- ok +-STATEMENT CREATE (t:test {prop: 903701}); +---- ok +-STATEMENT CREATE (t:test {prop: 407579}); +---- ok +-STATEMENT CREATE (t:test {prop: 773125}); +---- ok +-STATEMENT CREATE (t:test {prop: 152672}); +---- ok +-STATEMENT CREATE (t:test {prop: 722224}); +---- ok +-STATEMENT CREATE (t:test {prop: 177391}); +---- ok +-STATEMENT CREATE (t:test {prop: 20233}); +---- ok +-STATEMENT CREATE (t:test {prop: 162372}); +---- ok +-STATEMENT CREATE (t:test {prop: 236520}); +---- ok +-STATEMENT CREATE (t:test {prop: 865639}); +---- ok +-STATEMENT CREATE (t:test {prop: 53354}); +---- ok +-STATEMENT CREATE (t:test {prop: 259736}); +---- ok +-STATEMENT CREATE (t:test {prop: 65083}); +---- ok +-STATEMENT CREATE (t:test {prop: 567627}); +---- ok +-STATEMENT CREATE (t:test {prop: 679042}); +---- ok +-STATEMENT CREATE (t:test {prop: 355628}); +---- ok +-STATEMENT CREATE (t:test {prop: 17424}); +---- ok +-STATEMENT CREATE (t:test {prop: 469464}); +---- ok +-STATEMENT CREATE (t:test {prop: 650575}); +---- ok +-STATEMENT CREATE (t:test {prop: 198300}); +---- ok +-STATEMENT CREATE (t:test {prop: 324169}); +---- ok +-STATEMENT CREATE (t:test {prop: 246960}); +---- ok +-STATEMENT CREATE (t:test {prop: 772532}); +---- ok +-STATEMENT CREATE (t:test {prop: 748157}); +---- ok +-STATEMENT CREATE (t:test {prop: 993141}); +---- ok +-STATEMENT CREATE (t:test {prop: 121673}); +---- ok +-STATEMENT CREATE (t:test {prop: 686879}); +---- ok +-STATEMENT CREATE (t:test {prop: 489749}); +---- ok +-STATEMENT CREATE (t:test {prop: 591525}); +---- ok +-STATEMENT CREATE (t:test {prop: 845015}); +---- ok +-STATEMENT CREATE (t:test {prop: 819107}); +---- ok +-STATEMENT CREATE (t:test {prop: 771744}); +---- ok +-STATEMENT CREATE (t:test {prop: 812235}); +---- ok +-STATEMENT CREATE (t:test {prop: 866236}); +---- ok +-STATEMENT CREATE (t:test {prop: 972975}); +---- ok +-STATEMENT CREATE (t:test {prop: 166361}); +---- ok +-STATEMENT CREATE (t:test {prop: 829853}); +---- ok +-STATEMENT CREATE (t:test {prop: 789734}); +---- ok +-STATEMENT CREATE (t:test {prop: 112804}); +---- ok +-STATEMENT CREATE (t:test {prop: 599664}); +---- ok +-STATEMENT CREATE (t:test {prop: 640538}); +---- ok +-STATEMENT CREATE (t:test {prop: 211324}); +---- ok +-STATEMENT CREATE (t:test {prop: 941296}); +---- ok +-STATEMENT CREATE (t:test {prop: 435602}); +---- ok +-STATEMENT CREATE (t:test {prop: 486000}); +---- ok +-STATEMENT CREATE (t:test {prop: 501439}); +---- ok +-STATEMENT CREATE (t:test {prop: 194107}); +---- ok +-STATEMENT CREATE (t:test {prop: 383504}); +---- ok +-STATEMENT CREATE (t:test {prop: 19506}); +---- ok +-STATEMENT CREATE (t:test {prop: 547946}); +---- ok +-STATEMENT CREATE (t:test {prop: 455600}); +---- ok +-STATEMENT CREATE (t:test {prop: 931509}); +---- ok +-STATEMENT CREATE (t:test {prop: 391575}); +---- ok +-STATEMENT CREATE (t:test {prop: 578375}); +---- ok +-STATEMENT CREATE (t:test {prop: 557492}); +---- ok +-STATEMENT CREATE (t:test {prop: 977581}); +---- ok +-STATEMENT CREATE (t:test {prop: 429839}); +---- ok +-STATEMENT CREATE (t:test {prop: 980848}); +---- ok +-STATEMENT CREATE (t:test {prop: 356445}); +---- ok +-STATEMENT CREATE (t:test {prop: 337133}); +---- ok +-STATEMENT CREATE (t:test {prop: 517002}); +---- ok +-STATEMENT CREATE (t:test {prop: 724985}); +---- ok +-STATEMENT CREATE (t:test {prop: 793820}); +---- ok +-STATEMENT CREATE (t:test {prop: 524737}); +---- ok +-STATEMENT CREATE (t:test {prop: 827044}); +---- ok +-STATEMENT CREATE (t:test {prop: 701826}); +---- ok +-STATEMENT CREATE (t:test {prop: 132518}); +---- ok +-STATEMENT CREATE (t:test {prop: 85905}); +---- ok +-STATEMENT CREATE (t:test {prop: 311054}); +---- ok +-STATEMENT CREATE (t:test {prop: 291071}); +---- ok +-STATEMENT CREATE (t:test {prop: 104854}); +---- ok +-STATEMENT CREATE (t:test {prop: 110113}); +---- ok +-STATEMENT CREATE (t:test {prop: 771654}); +---- ok +-STATEMENT CREATE (t:test {prop: 289375}); +---- ok +-STATEMENT CREATE (t:test {prop: 746227}); +---- ok +-STATEMENT CREATE (t:test {prop: 586416}); +---- ok +-STATEMENT CREATE (t:test {prop: 407825}); +---- ok +-STATEMENT CREATE (t:test {prop: 713787}); +---- ok +-STATEMENT CREATE (t:test {prop: 180552}); +---- ok +-STATEMENT CREATE (t:test {prop: 717894}); +---- ok +-STATEMENT CREATE (t:test {prop: 730498}); +---- ok +-STATEMENT CREATE (t:test {prop: 804058}); +---- ok +-STATEMENT CREATE (t:test {prop: 940974}); +---- ok +-STATEMENT CREATE (t:test {prop: 434884}); +---- ok +-STATEMENT CREATE (t:test {prop: 716034}); +---- ok +-STATEMENT CREATE (t:test {prop: 955068}); +---- ok +-STATEMENT CREATE (t:test {prop: 265807}); +---- ok +-STATEMENT CREATE (t:test {prop: 748081}); +---- ok +-STATEMENT CREATE (t:test {prop: 156857}); +---- ok +-STATEMENT CREATE (t:test {prop: 347609}); +---- ok +-STATEMENT CREATE (t:test {prop: 869828}); +---- ok +-STATEMENT CREATE (t:test {prop: 121605}); +---- ok +-STATEMENT CREATE (t:test {prop: 127874}); +---- ok +-STATEMENT CREATE (t:test {prop: 560095}); +---- ok +-STATEMENT CREATE (t:test {prop: 385130}); +---- ok +-STATEMENT CREATE (t:test {prop: 714486}); +---- ok +-STATEMENT CREATE (t:test {prop: 727299}); +---- ok +-STATEMENT CREATE (t:test {prop: 408123}); +---- ok +-STATEMENT CREATE (t:test {prop: 421586}); +---- ok +-STATEMENT CREATE (t:test {prop: 217245}); +---- ok +-STATEMENT CREATE (t:test {prop: 82166}); +---- ok +-STATEMENT CREATE (t:test {prop: 550334}); +---- ok +-STATEMENT CREATE (t:test {prop: 728788}); +---- ok +-STATEMENT CREATE (t:test {prop: 132645}); +---- ok +-STATEMENT CREATE (t:test {prop: 328742}); +---- ok +-STATEMENT CREATE (t:test {prop: 428762}); +---- ok +-STATEMENT CREATE (t:test {prop: 624362}); +---- ok +-STATEMENT CREATE (t:test {prop: 110164}); +---- ok +-STATEMENT CREATE (t:test {prop: 629919}); +---- ok +-STATEMENT CREATE (t:test {prop: 834101}); +---- ok +-STATEMENT CREATE (t:test {prop: 983537}); +---- ok +-STATEMENT CREATE (t:test {prop: 549207}); +---- ok +-STATEMENT CREATE (t:test {prop: 971479}); +---- ok +-STATEMENT CREATE (t:test {prop: 826875}); +---- ok +-STATEMENT CREATE (t:test {prop: 705643}); +---- ok +-STATEMENT CREATE (t:test {prop: 426204}); +---- ok +-STATEMENT CREATE (t:test {prop: 360869}); +---- ok +-STATEMENT CREATE (t:test {prop: 552905}); +---- ok +-STATEMENT CREATE (t:test {prop: 400929}); +---- ok +-STATEMENT CREATE (t:test {prop: 687508}); +---- ok +-STATEMENT CREATE (t:test {prop: 513341}); +---- ok +-STATEMENT CREATE (t:test {prop: 712261}); +---- ok +-STATEMENT CREATE (t:test {prop: 987782}); +---- ok +-STATEMENT CREATE (t:test {prop: 407959}); +---- ok +-STATEMENT CREATE (t:test {prop: 962656}); +---- ok +-STATEMENT CREATE (t:test {prop: 994559}); +---- ok +-STATEMENT CREATE (t:test {prop: 722163}); +---- ok +-STATEMENT CREATE (t:test {prop: 250086}); +---- ok +-STATEMENT CREATE (t:test {prop: 174915}); +---- ok +-STATEMENT CREATE (t:test {prop: 171764}); +---- ok +-STATEMENT CREATE (t:test {prop: 36409}); +---- ok +-STATEMENT CREATE (t:test {prop: 428614}); +---- ok +-STATEMENT CREATE (t:test {prop: 327198}); +---- ok +-STATEMENT CREATE (t:test {prop: 294512}); +---- ok +-STATEMENT CREATE (t:test {prop: 330242}); +---- ok +-STATEMENT CREATE (t:test {prop: 799935}); +---- ok +-STATEMENT CREATE (t:test {prop: 749197}); +---- ok +-STATEMENT CREATE (t:test {prop: 550057}); +---- ok +-STATEMENT CREATE (t:test {prop: 90198}); +---- ok +-STATEMENT CREATE (t:test {prop: 613702}); +---- ok +-STATEMENT CREATE (t:test {prop: 670792}); +---- ok +-STATEMENT CREATE (t:test {prop: 410737}); +---- ok +-STATEMENT CREATE (t:test {prop: 326979}); +---- ok +-STATEMENT CREATE (t:test {prop: 215754}); +---- ok +-STATEMENT CREATE (t:test {prop: 751301}); +---- ok +-STATEMENT CREATE (t:test {prop: 610843}); +---- ok +-STATEMENT CREATE (t:test {prop: 498389}); +---- ok +-STATEMENT CREATE (t:test {prop: 67921}); +---- ok +-STATEMENT CREATE (t:test {prop: 339742}); +---- ok +-STATEMENT CREATE (t:test {prop: 127931}); +---- ok +-STATEMENT CREATE (t:test {prop: 868773}); +---- ok +-STATEMENT CREATE (t:test {prop: 443019}); +---- ok +-STATEMENT CREATE (t:test {prop: 446679}); +---- ok +-STATEMENT CREATE (t:test {prop: 609536}); +---- ok +-STATEMENT CREATE (t:test {prop: 904495}); +---- ok +-STATEMENT CREATE (t:test {prop: 794800}); +---- ok +-STATEMENT CREATE (t:test {prop: 620710}); +---- ok +-STATEMENT CREATE (t:test {prop: 4976}); +---- ok +-STATEMENT CREATE (t:test {prop: 778027}); +---- ok +-STATEMENT CREATE (t:test {prop: 813375}); +---- ok +-STATEMENT CREATE (t:test {prop: 320927}); +---- ok +-STATEMENT CREATE (t:test {prop: 373069}); +---- ok +-STATEMENT CREATE (t:test {prop: 884173}); +---- ok +-STATEMENT CREATE (t:test {prop: 821376}); +---- ok +-STATEMENT CREATE (t:test {prop: 547595}); +---- ok +-STATEMENT CREATE (t:test {prop: 479977}); +---- ok +-STATEMENT CREATE (t:test {prop: 973379}); +---- ok +-STATEMENT CREATE (t:test {prop: 890208}); +---- ok +-STATEMENT CREATE (t:test {prop: 483137}); +---- ok +-STATEMENT CREATE (t:test {prop: 588787}); +---- ok +-STATEMENT CREATE (t:test {prop: 936213}); +---- ok +-STATEMENT CREATE (t:test {prop: 22010}); +---- ok +-STATEMENT CREATE (t:test {prop: 39197}); +---- ok +-STATEMENT CREATE (t:test {prop: 850850}); +---- ok +-STATEMENT CREATE (t:test {prop: 535287}); +---- ok +-STATEMENT CREATE (t:test {prop: 555021}); +---- ok +-STATEMENT CREATE (t:test {prop: 951916}); +---- ok +-STATEMENT CREATE (t:test {prop: 106394}); +---- ok +-STATEMENT CREATE (t:test {prop: 761243}); +---- ok +-STATEMENT CREATE (t:test {prop: 351659}); +---- ok +-STATEMENT CREATE (t:test {prop: 505256}); +---- ok +-STATEMENT CREATE (t:test {prop: 741712}); +---- ok +-STATEMENT CREATE (t:test {prop: 157566}); +---- ok +-STATEMENT CREATE (t:test {prop: 252224}); +---- ok +-STATEMENT CREATE (t:test {prop: 788989}); +---- ok +-STATEMENT CREATE (t:test {prop: 761389}); +---- ok +-STATEMENT CREATE (t:test {prop: 636439}); +---- ok +-STATEMENT CREATE (t:test {prop: 767538}); +---- ok +-STATEMENT CREATE (t:test {prop: 739965}); +---- ok +-STATEMENT CREATE (t:test {prop: 221936}); +---- ok +-STATEMENT CREATE (t:test {prop: 242378}); +---- ok +-STATEMENT CREATE (t:test {prop: 129287}); +---- ok +-STATEMENT CREATE (t:test {prop: 994897}); +---- ok +-STATEMENT CREATE (t:test {prop: 131106}); +---- ok +-STATEMENT CREATE (t:test {prop: 551630}); +---- ok +-STATEMENT CREATE (t:test {prop: 442880}); +---- ok +-STATEMENT CREATE (t:test {prop: 114200}); +---- ok +-STATEMENT CREATE (t:test {prop: 965707}); +---- ok +-STATEMENT CREATE (t:test {prop: 425858}); +---- ok +-STATEMENT CREATE (t:test {prop: 696843}); +---- ok +-STATEMENT CREATE (t:test {prop: 652583}); +---- ok +-STATEMENT CREATE (t:test {prop: 530391}); +---- ok +-STATEMENT CREATE (t:test {prop: 874166}); +---- ok +-STATEMENT CREATE (t:test {prop: 267998}); +---- ok +-STATEMENT CREATE (t:test {prop: 837705}); +---- ok +-STATEMENT CREATE (t:test {prop: 483087}); +---- ok +-STATEMENT CREATE (t:test {prop: 198517}); +---- ok +-STATEMENT CREATE (t:test {prop: 497607}); +---- ok +-STATEMENT CREATE (t:test {prop: 410322}); +---- ok +-STATEMENT CREATE (t:test {prop: 640207}); +---- ok +-STATEMENT CREATE (t:test {prop: 643556}); +---- ok +-STATEMENT CREATE (t:test {prop: 642518}); +---- ok +-STATEMENT CREATE (t:test {prop: 884933}); +---- ok +-STATEMENT CREATE (t:test {prop: 42929}); +---- ok +-STATEMENT CREATE (t:test {prop: 590904}); +---- ok +-STATEMENT CREATE (t:test {prop: 94068}); +---- ok +-STATEMENT CREATE (t:test {prop: 170479}); +---- ok +-STATEMENT CREATE (t:test {prop: 914301}); +---- ok +-STATEMENT CREATE (t:test {prop: 636779}); +---- ok +-STATEMENT CREATE (t:test {prop: 738868}); +---- ok +-STATEMENT CREATE (t:test {prop: 394584}); +---- ok +-STATEMENT CREATE (t:test {prop: 454429}); +---- ok +-STATEMENT CREATE (t:test {prop: 183829}); +---- ok +-STATEMENT CREATE (t:test {prop: 60345}); +---- ok +-STATEMENT CREATE (t:test {prop: 260579}); +---- ok +-STATEMENT CREATE (t:test {prop: 614668}); +---- ok +-STATEMENT CREATE (t:test {prop: 893942}); +---- ok +-STATEMENT CREATE (t:test {prop: 625507}); +---- ok +-STATEMENT CREATE (t:test {prop: 226030}); +---- ok +-STATEMENT CREATE (t:test {prop: 505258}); +---- ok +-STATEMENT CREATE (t:test {prop: 953442}); +---- ok +-STATEMENT CREATE (t:test {prop: 273428}); +---- ok +-STATEMENT CREATE (t:test {prop: 173403}); +---- ok +-STATEMENT CREATE (t:test {prop: 859676}); +---- ok +-STATEMENT CREATE (t:test {prop: 810103}); +---- ok +-STATEMENT CREATE (t:test {prop: 529664}); +---- ok +-STATEMENT CREATE (t:test {prop: 718174}); +---- ok +-STATEMENT CREATE (t:test {prop: 625482}); +---- ok +-STATEMENT CREATE (t:test {prop: 942386}); +---- ok +-STATEMENT CREATE (t:test {prop: 742769}); +---- ok +-STATEMENT CREATE (t:test {prop: 177011}); +---- ok +-STATEMENT CREATE (t:test {prop: 27420}); +---- ok +-STATEMENT CREATE (t:test {prop: 351700}); +---- ok +-STATEMENT CREATE (t:test {prop: 927495}); +---- ok +-STATEMENT CREATE (t:test {prop: 686923}); +---- ok +-STATEMENT CREATE (t:test {prop: 523544}); +---- ok +-STATEMENT CREATE (t:test {prop: 131809}); +---- ok +-STATEMENT CREATE (t:test {prop: 503131}); +---- ok +-STATEMENT CREATE (t:test {prop: 610183}); +---- ok +-STATEMENT CREATE (t:test {prop: 634606}); +---- ok +-STATEMENT CREATE (t:test {prop: 116137}); +---- ok +-STATEMENT CREATE (t:test {prop: 674526}); +---- ok +-STATEMENT CREATE (t:test {prop: 409778}); +---- ok +-STATEMENT CREATE (t:test {prop: 12919}); +---- ok +-STATEMENT CREATE (t:test {prop: 306672}); +---- ok +-STATEMENT CREATE (t:test {prop: 813566}); +---- ok +-STATEMENT CREATE (t:test {prop: 129887}); +---- ok +-STATEMENT CREATE (t:test {prop: 401769}); +---- ok +-STATEMENT CREATE (t:test {prop: 123536}); +---- ok +-STATEMENT CREATE (t:test {prop: 957796}); +---- ok +-STATEMENT CREATE (t:test {prop: 76640}); +---- ok +-STATEMENT CREATE (t:test {prop: 667039}); +---- ok +-STATEMENT CREATE (t:test {prop: 850759}); +---- ok +-STATEMENT CREATE (t:test {prop: 759065}); +---- ok +-STATEMENT CREATE (t:test {prop: 696469}); +---- ok +-STATEMENT CREATE (t:test {prop: 994528}); +---- ok +-STATEMENT CREATE (t:test {prop: 486892}); +---- ok +-STATEMENT CREATE (t:test {prop: 424384}); +---- ok +-STATEMENT CREATE (t:test {prop: 698811}); +---- ok +-STATEMENT CREATE (t:test {prop: 665362}); +---- ok +-STATEMENT CREATE (t:test {prop: 572692}); +---- ok +-STATEMENT CREATE (t:test {prop: 366034}); +---- ok +-STATEMENT CREATE (t:test {prop: 987250}); +---- ok +-STATEMENT CREATE (t:test {prop: 587341}); +---- ok +-STATEMENT CREATE (t:test {prop: 373248}); +---- ok +-STATEMENT CREATE (t:test {prop: 127349}); +---- ok +-STATEMENT CREATE (t:test {prop: 735896}); +---- ok +-STATEMENT CREATE (t:test {prop: 19453}); +---- ok +-STATEMENT CREATE (t:test {prop: 954508}); +---- ok +-STATEMENT CREATE (t:test {prop: 984759}); +---- ok +-STATEMENT CREATE (t:test {prop: 80629}); +---- ok +-STATEMENT CREATE (t:test {prop: 921418}); +---- ok +-STATEMENT CREATE (t:test {prop: 497528}); +---- ok +-STATEMENT CREATE (t:test {prop: 885827}); +---- ok +-STATEMENT CREATE (t:test {prop: 179011}); +---- ok +-STATEMENT CREATE (t:test {prop: 156628}); +---- ok +-STATEMENT CREATE (t:test {prop: 838009}); +---- ok +-STATEMENT CREATE (t:test {prop: 829130}); +---- ok +-STATEMENT CREATE (t:test {prop: 770077}); +---- ok +-STATEMENT CREATE (t:test {prop: 153591}); +---- ok +-STATEMENT CREATE (t:test {prop: 558370}); +---- ok +-STATEMENT CREATE (t:test {prop: 209714}); +---- ok +-STATEMENT CREATE (t:test {prop: 780411}); +---- ok +-STATEMENT CREATE (t:test {prop: 48463}); +---- ok +-STATEMENT CREATE (t:test {prop: 483140}); +---- ok +-STATEMENT CREATE (t:test {prop: 533608}); +---- ok +-STATEMENT CREATE (t:test {prop: 914707}); +---- ok +-STATEMENT CREATE (t:test {prop: 523321}); +---- ok +-STATEMENT CREATE (t:test {prop: 961400}); +---- ok +-STATEMENT CREATE (t:test {prop: 962533}); +---- ok +-STATEMENT CREATE (t:test {prop: 698658}); +---- ok +-STATEMENT CREATE (t:test {prop: 991059}); +---- ok +-STATEMENT CREATE (t:test {prop: 969487}); +---- ok +-STATEMENT CREATE (t:test {prop: 755501}); +---- ok +-STATEMENT CREATE (t:test {prop: 164702}); +---- ok +-STATEMENT CREATE (t:test {prop: 150604}); +---- ok +-STATEMENT CREATE (t:test {prop: 830188}); +---- ok +-STATEMENT CREATE (t:test {prop: 359581}); +---- ok +-STATEMENT CREATE (t:test {prop: 152490}); +---- ok +-STATEMENT CREATE (t:test {prop: 518962}); +---- ok +-STATEMENT CREATE (t:test {prop: 900138}); +---- ok +-STATEMENT CREATE (t:test {prop: 516671}); +---- ok +-STATEMENT CREATE (t:test {prop: 948924}); +---- ok +-STATEMENT CREATE (t:test {prop: 431278}); +---- ok +-STATEMENT CREATE (t:test {prop: 532302}); +---- ok +-STATEMENT CREATE (t:test {prop: 606789}); +---- ok +-STATEMENT CREATE (t:test {prop: 619533}); +---- ok +-STATEMENT CREATE (t:test {prop: 899321}); +---- ok +-STATEMENT CREATE (t:test {prop: 665239}); +---- ok +-STATEMENT CREATE (t:test {prop: 409944}); +---- ok +-STATEMENT CREATE (t:test {prop: 728339}); +---- ok +-STATEMENT CREATE (t:test {prop: 99214}); +---- ok +-STATEMENT CREATE (t:test {prop: 8452}); +---- ok +-STATEMENT CREATE (t:test {prop: 939692}); +---- ok +-STATEMENT CREATE (t:test {prop: 814747}); +---- ok +-STATEMENT CREATE (t:test {prop: 408421}); +---- ok +-STATEMENT CREATE (t:test {prop: 286761}); +---- ok +-STATEMENT CREATE (t:test {prop: 743584}); +---- ok +-STATEMENT CREATE (t:test {prop: 747020}); +---- ok +-STATEMENT CREATE (t:test {prop: 745833}); +---- ok +-STATEMENT CREATE (t:test {prop: 572754}); +---- ok +-STATEMENT CREATE (t:test {prop: 829176}); +---- ok +-STATEMENT CREATE (t:test {prop: 70889}); +---- ok +-STATEMENT CREATE (t:test {prop: 783213}); +---- ok +-STATEMENT CREATE (t:test {prop: 369543}); +---- ok +-STATEMENT CREATE (t:test {prop: 153947}); +---- ok +-STATEMENT CREATE (t:test {prop: 979728}); +---- ok +-STATEMENT CREATE (t:test {prop: 658038}); +---- ok +-STATEMENT CREATE (t:test {prop: 873031}); +---- ok +-STATEMENT CREATE (t:test {prop: 230462}); +---- ok +-STATEMENT CREATE (t:test {prop: 644638}); +---- ok +-STATEMENT CREATE (t:test {prop: 381930}); +---- ok +-STATEMENT CREATE (t:test {prop: 448815}); +---- ok +-STATEMENT CREATE (t:test {prop: 128559}); +---- ok +-STATEMENT CREATE (t:test {prop: 606420}); +---- ok +-STATEMENT CREATE (t:test {prop: 325763}); +---- ok +-STATEMENT CREATE (t:test {prop: 696039}); +---- ok +-STATEMENT CREATE (t:test {prop: 950020}); +---- ok +-STATEMENT CREATE (t:test {prop: 779742}); +---- ok +-STATEMENT CREATE (t:test {prop: 91797}); +---- ok +-STATEMENT CREATE (t:test {prop: 74565}); +---- ok +-STATEMENT CREATE (t:test {prop: 997222}); +---- ok +-STATEMENT CREATE (t:test {prop: 691990}); +---- ok +-STATEMENT CREATE (t:test {prop: 364892}); +---- ok +-STATEMENT CREATE (t:test {prop: 499097}); +---- ok +-STATEMENT CREATE (t:test {prop: 953126}); +---- ok +-STATEMENT CREATE (t:test {prop: 302648}); +---- ok +-STATEMENT CREATE (t:test {prop: 800774}); +---- ok +-STATEMENT CREATE (t:test {prop: 513801}); +---- ok +-STATEMENT CREATE (t:test {prop: 231352}); +---- ok +-STATEMENT CREATE (t:test {prop: 770724}); +---- ok +-STATEMENT CREATE (t:test {prop: 796}); +---- ok +-STATEMENT CREATE (t:test {prop: 78128}); +---- ok +-STATEMENT CREATE (t:test {prop: 269695}); +---- ok +-STATEMENT CREATE (t:test {prop: 264841}); +---- ok +-STATEMENT CREATE (t:test {prop: 342607}); +---- ok +-STATEMENT CREATE (t:test {prop: 710443}); +---- ok +-STATEMENT CREATE (t:test {prop: 803208}); +---- ok +-STATEMENT CREATE (t:test {prop: 232967}); +---- ok +-STATEMENT CREATE (t:test {prop: 858875}); +---- ok +-STATEMENT CREATE (t:test {prop: 445270}); +---- ok +-STATEMENT CREATE (t:test {prop: 631300}); +---- ok +-STATEMENT CREATE (t:test {prop: 197427}); +---- ok +-STATEMENT CREATE (t:test {prop: 637311}); +---- ok +-STATEMENT CREATE (t:test {prop: 323167}); +---- ok +-STATEMENT CREATE (t:test {prop: 358187}); +---- ok +-STATEMENT CREATE (t:test {prop: 926561}); +---- ok +-STATEMENT CREATE (t:test {prop: 541136}); +---- ok +-STATEMENT CREATE (t:test {prop: 139293}); +---- ok +-STATEMENT CREATE (t:test {prop: 726803}); +---- ok +-STATEMENT CREATE (t:test {prop: 606235}); +---- ok +-STATEMENT CREATE (t:test {prop: 880416}); +---- ok +-STATEMENT CREATE (t:test {prop: 129602}); +---- ok +-STATEMENT CREATE (t:test {prop: 658357}); +---- ok +-STATEMENT CREATE (t:test {prop: 980132}); +---- ok +-STATEMENT CREATE (t:test {prop: 453753}); +---- ok +-STATEMENT CREATE (t:test {prop: 170199}); +---- ok +-STATEMENT CREATE (t:test {prop: 719389}); +---- ok +-STATEMENT CREATE (t:test {prop: 111793}); +---- ok +-STATEMENT CREATE (t:test {prop: 466644}); +---- ok +-STATEMENT CREATE (t:test {prop: 622451}); +---- ok +-STATEMENT CREATE (t:test {prop: 3192}); +---- ok +-STATEMENT CREATE (t:test {prop: 106313}); +---- ok +-STATEMENT CREATE (t:test {prop: 509062}); +---- ok +-STATEMENT CREATE (t:test {prop: 981620}); +---- ok +-STATEMENT CREATE (t:test {prop: 700076}); +---- ok +-STATEMENT CREATE (t:test {prop: 565655}); +---- ok +-STATEMENT CREATE (t:test {prop: 329106}); +---- ok +-STATEMENT CREATE (t:test {prop: 433230}); +---- ok +-STATEMENT CREATE (t:test {prop: 206482}); +---- ok +-STATEMENT CREATE (t:test {prop: 198629}); +---- ok +-STATEMENT CREATE (t:test {prop: 386941}); +---- ok +-STATEMENT CREATE (t:test {prop: 647476}); +---- ok +-STATEMENT CREATE (t:test {prop: 955598}); +---- ok +-STATEMENT CREATE (t:test {prop: 696213}); +---- ok +-STATEMENT CREATE (t:test {prop: 870167}); +---- ok +-STATEMENT CREATE (t:test {prop: 703352}); +---- ok +-STATEMENT CREATE (t:test {prop: 924564}); +---- ok +-STATEMENT CREATE (t:test {prop: 110812}); +---- ok +-STATEMENT CREATE (t:test {prop: 735357}); +---- ok +-STATEMENT CREATE (t:test {prop: 951362}); +---- ok +-STATEMENT CREATE (t:test {prop: 276110}); +---- ok +-STATEMENT CREATE (t:test {prop: 639026}); +---- ok +-STATEMENT CREATE (t:test {prop: 772150}); +---- ok +-STATEMENT CREATE (t:test {prop: 766660}); +---- ok +-STATEMENT CREATE (t:test {prop: 463051}); +---- ok +-STATEMENT CREATE (t:test {prop: 493918}); +---- ok +-STATEMENT CREATE (t:test {prop: 997734}); +---- ok +-STATEMENT CREATE (t:test {prop: 304897}); +---- ok +-STATEMENT CREATE (t:test {prop: 139012}); +---- ok +-STATEMENT CREATE (t:test {prop: 903504}); +---- ok +-STATEMENT CREATE (t:test {prop: 931932}); +---- ok +-STATEMENT CREATE (t:test {prop: 49489}); +---- ok +-STATEMENT CREATE (t:test {prop: 220356}); +---- ok +-STATEMENT CREATE (t:test {prop: 480077}); +---- ok +-STATEMENT CREATE (t:test {prop: 986607}); +---- ok +-STATEMENT CREATE (t:test {prop: 782083}); +---- ok +-STATEMENT CREATE (t:test {prop: 565025}); +---- ok +-STATEMENT CREATE (t:test {prop: 214796}); +---- ok +-STATEMENT CREATE (t:test {prop: 850853}); +---- ok +-STATEMENT CREATE (t:test {prop: 441260}); +---- ok +-STATEMENT CREATE (t:test {prop: 511241}); +---- ok +-STATEMENT CREATE (t:test {prop: 850658}); +---- ok +-STATEMENT CREATE (t:test {prop: 869060}); +---- ok +-STATEMENT CREATE (t:test {prop: 659171}); +---- ok +-STATEMENT CREATE (t:test {prop: 292907}); +---- ok +-STATEMENT CREATE (t:test {prop: 50027}); +---- ok +-STATEMENT CREATE (t:test {prop: 208561}); +---- ok +-STATEMENT CREATE (t:test {prop: 365742}); +---- ok +-STATEMENT CREATE (t:test {prop: 413857}); +---- ok +-STATEMENT CREATE (t:test {prop: 262739}); +---- ok +-STATEMENT CREATE (t:test {prop: 688237}); +---- ok +-STATEMENT CREATE (t:test {prop: 846357}); +---- ok +-STATEMENT CREATE (t:test {prop: 319116}); +---- ok +-STATEMENT CREATE (t:test {prop: 314012}); +---- ok +-STATEMENT CREATE (t:test {prop: 667021}); +---- ok +-STATEMENT CREATE (t:test {prop: 892365}); +---- ok +-STATEMENT CREATE (t:test {prop: 305078}); +---- ok +-STATEMENT CREATE (t:test {prop: 156225}); +---- ok +-STATEMENT CREATE (t:test {prop: 316855}); +---- ok +-STATEMENT CREATE (t:test {prop: 534921}); +---- ok +-STATEMENT CREATE (t:test {prop: 578959}); +---- ok +-STATEMENT CREATE (t:test {prop: 233970}); +---- ok +-STATEMENT CREATE (t:test {prop: 8029}); +---- ok +-STATEMENT CREATE (t:test {prop: 756289}); +---- ok +-STATEMENT CREATE (t:test {prop: 966425}); +---- ok +-STATEMENT CREATE (t:test {prop: 840447}); +---- ok +-STATEMENT CREATE (t:test {prop: 728357}); +---- ok +-STATEMENT CREATE (t:test {prop: 721598}); +---- ok +-STATEMENT CREATE (t:test {prop: 738724}); +---- ok +-STATEMENT CREATE (t:test {prop: 572790}); +---- ok +-STATEMENT CREATE (t:test {prop: 801931}); +---- ok +-STATEMENT CREATE (t:test {prop: 635109}); +---- ok +-STATEMENT CREATE (t:test {prop: 160035}); +---- ok +-STATEMENT CREATE (t:test {prop: 551154}); +---- ok +-STATEMENT CREATE (t:test {prop: 391456}); +---- ok +-STATEMENT CREATE (t:test {prop: 3789}); +---- ok +-STATEMENT CREATE (t:test {prop: 668239}); +---- ok +-STATEMENT CREATE (t:test {prop: 584345}); +---- ok +-STATEMENT CREATE (t:test {prop: 746072}); +---- ok +-STATEMENT CREATE (t:test {prop: 569798}); +---- ok +-STATEMENT CREATE (t:test {prop: 623587}); +---- ok +-STATEMENT CREATE (t:test {prop: 508593}); +---- ok +-STATEMENT CREATE (t:test {prop: 933443}); +---- ok +-STATEMENT CREATE (t:test {prop: 11445}); +---- ok +-STATEMENT CREATE (t:test {prop: 371217}); +---- ok +-STATEMENT CREATE (t:test {prop: 289465}); +---- ok +-STATEMENT CREATE (t:test {prop: 658586}); +---- ok +-STATEMENT CREATE (t:test {prop: 372267}); +---- ok +-STATEMENT CREATE (t:test {prop: 276906}); +---- ok +-STATEMENT CREATE (t:test {prop: 848763}); +---- ok +-STATEMENT CREATE (t:test {prop: 97629}); +---- ok +-STATEMENT CREATE (t:test {prop: 115490}); +---- ok +-STATEMENT CREATE (t:test {prop: 539067}); +---- ok +-STATEMENT CREATE (t:test {prop: 978171}); +---- ok +-STATEMENT CREATE (t:test {prop: 679821}); +---- ok +-STATEMENT CREATE (t:test {prop: 103794}); +---- ok +-STATEMENT CREATE (t:test {prop: 462516}); +---- ok +-STATEMENT CREATE (t:test {prop: 236561}); +---- ok +-STATEMENT CREATE (t:test {prop: 655434}); +---- ok +-STATEMENT CREATE (t:test {prop: 216269}); +---- ok +-STATEMENT CREATE (t:test {prop: 195447}); +---- ok +-STATEMENT CREATE (t:test {prop: 524245}); +---- ok +-STATEMENT CREATE (t:test {prop: 174734}); +---- ok +-STATEMENT CREATE (t:test {prop: 930858}); +---- ok +-STATEMENT CREATE (t:test {prop: 784987}); +---- ok +-STATEMENT CREATE (t:test {prop: 243295}); +---- ok +-STATEMENT CREATE (t:test {prop: 329442}); +---- ok +-STATEMENT CREATE (t:test {prop: 734498}); +---- ok +-STATEMENT CREATE (t:test {prop: 750269}); +---- ok +-STATEMENT CREATE (t:test {prop: 693270}); +---- ok +-STATEMENT CREATE (t:test {prop: 165948}); +---- ok +-STATEMENT CREATE (t:test {prop: 903552}); +---- ok +-STATEMENT CREATE (t:test {prop: 878504}); +---- ok +-STATEMENT CREATE (t:test {prop: 257854}); +---- ok +-STATEMENT CREATE (t:test {prop: 711459}); +---- ok +-STATEMENT CREATE (t:test {prop: 949778}); +---- ok +-STATEMENT CREATE (t:test {prop: 766834}); +---- ok +-STATEMENT CREATE (t:test {prop: 438792}); +---- ok +-STATEMENT CREATE (t:test {prop: 191119}); +---- ok +-STATEMENT CREATE (t:test {prop: 589222}); +---- ok +-STATEMENT CREATE (t:test {prop: 800927}); +---- ok +-STATEMENT CREATE (t:test {prop: 598447}); +---- ok +-STATEMENT CREATE (t:test {prop: 649828}); +---- ok +-STATEMENT CREATE (t:test {prop: 937593}); +---- ok +-STATEMENT CREATE (t:test {prop: 786427}); +---- ok +-STATEMENT CREATE (t:test {prop: 126617}); +---- ok +-STATEMENT CREATE (t:test {prop: 569992}); +---- ok +-STATEMENT CREATE (t:test {prop: 577794}); +---- ok +-STATEMENT CREATE (t:test {prop: 882578}); +---- ok +-STATEMENT CREATE (t:test {prop: 268515}); +---- ok +-STATEMENT CREATE (t:test {prop: 652230}); +---- ok +-STATEMENT CREATE (t:test {prop: 437965}); +---- ok +-STATEMENT CREATE (t:test {prop: 156207}); +---- ok +-STATEMENT CREATE (t:test {prop: 616198}); +---- ok +-STATEMENT CREATE (t:test {prop: 258296}); +---- ok +-STATEMENT CREATE (t:test {prop: 785379}); +---- ok +-STATEMENT CREATE (t:test {prop: 638068}); +---- ok +-STATEMENT CREATE (t:test {prop: 172542}); +---- ok +-STATEMENT CREATE (t:test {prop: 562216}); +---- ok +-STATEMENT CREATE (t:test {prop: 268246}); +---- ok +-STATEMENT CREATE (t:test {prop: 695080}); +---- ok +-STATEMENT CREATE (t:test {prop: 339600}); +---- ok +-STATEMENT CREATE (t:test {prop: 406426}); +---- ok +-STATEMENT CREATE (t:test {prop: 493337}); +---- ok +-STATEMENT CREATE (t:test {prop: 503209}); +---- ok +-STATEMENT CREATE (t:test {prop: 292027}); +---- ok +-STATEMENT CREATE (t:test {prop: 398067}); +---- ok +-STATEMENT CREATE (t:test {prop: 377136}); +---- ok +-STATEMENT CREATE (t:test {prop: 578879}); +---- ok +-STATEMENT CREATE (t:test {prop: 856467}); +---- ok +-STATEMENT CREATE (t:test {prop: 565648}); +---- ok +-STATEMENT CREATE (t:test {prop: 486885}); +---- ok +-STATEMENT CREATE (t:test {prop: 329951}); +---- ok +-STATEMENT CREATE (t:test {prop: 840550}); +---- ok +-STATEMENT CREATE (t:test {prop: 746172}); +---- ok +-STATEMENT CREATE (t:test {prop: 378526}); +---- ok +-STATEMENT CREATE (t:test {prop: 756057}); +---- ok +-STATEMENT CREATE (t:test {prop: 927917}); +---- ok +-STATEMENT CREATE (t:test {prop: 999916}); +---- ok +-STATEMENT CREATE (t:test {prop: 76668}); +---- ok +-STATEMENT CREATE (t:test {prop: 896086}); +---- ok +-STATEMENT CREATE (t:test {prop: 140004}); +---- ok +-STATEMENT CREATE (t:test {prop: 889100}); +---- ok +-STATEMENT CREATE (t:test {prop: 688990}); +---- ok +-STATEMENT CREATE (t:test {prop: 513144}); +---- ok +-STATEMENT CREATE (t:test {prop: 958831}); +---- ok +-STATEMENT CREATE (t:test {prop: 924702}); +---- ok +-STATEMENT CREATE (t:test {prop: 489701}); +---- ok +-STATEMENT CREATE (t:test {prop: 645302}); +---- ok +-STATEMENT CREATE (t:test {prop: 645036}); +---- ok +-STATEMENT CREATE (t:test {prop: 371515}); +---- ok +-STATEMENT CREATE (t:test {prop: 871610}); +---- ok +-STATEMENT CREATE (t:test {prop: 746509}); +---- ok +-STATEMENT CREATE (t:test {prop: 957400}); +---- ok +-STATEMENT CREATE (t:test {prop: 374279}); +---- ok +-STATEMENT CREATE (t:test {prop: 236794}); +---- ok +-STATEMENT CREATE (t:test {prop: 560435}); +---- ok +-STATEMENT CREATE (t:test {prop: 832076}); +---- ok +-STATEMENT CREATE (t:test {prop: 653014}); +---- ok +-STATEMENT CREATE (t:test {prop: 492656}); +---- ok +-STATEMENT CREATE (t:test {prop: 15349}); +---- ok +-STATEMENT CREATE (t:test {prop: 394704}); +---- ok +-STATEMENT CREATE (t:test {prop: 521154}); +---- ok +-STATEMENT CREATE (t:test {prop: 160445}); +---- ok +-STATEMENT CREATE (t:test {prop: 407972}); +---- ok +-STATEMENT CREATE (t:test {prop: 578500}); +---- ok +-STATEMENT CREATE (t:test {prop: 933778}); +---- ok +-STATEMENT CREATE (t:test {prop: 695618}); +---- ok +-STATEMENT CREATE (t:test {prop: 364488}); +---- ok +-STATEMENT CREATE (t:test {prop: 736845}); +---- ok +-STATEMENT CREATE (t:test {prop: 587646}); +---- ok +-STATEMENT CREATE (t:test {prop: 643077}); +---- ok +-STATEMENT CREATE (t:test {prop: 583188}); +---- ok +-STATEMENT CREATE (t:test {prop: 440329}); +---- ok +-STATEMENT CREATE (t:test {prop: 584465}); +---- ok +-STATEMENT CREATE (t:test {prop: 228426}); +---- ok +-STATEMENT CREATE (t:test {prop: 438770}); +---- ok +-STATEMENT CREATE (t:test {prop: 467974}); +---- ok +-STATEMENT CREATE (t:test {prop: 119406}); +---- ok +-STATEMENT CREATE (t:test {prop: 199210}); +---- ok +-STATEMENT CREATE (t:test {prop: 953539}); +---- ok +-STATEMENT CREATE (t:test {prop: 678537}); +---- ok +-STATEMENT CREATE (t:test {prop: 884594}); +---- ok +-STATEMENT CREATE (t:test {prop: 693228}); +---- ok +-STATEMENT CREATE (t:test {prop: 358166}); +---- ok +-STATEMENT CREATE (t:test {prop: 365020}); +---- ok +-STATEMENT CREATE (t:test {prop: 895197}); +---- ok +-STATEMENT CREATE (t:test {prop: 86431}); +---- ok +-STATEMENT CREATE (t:test {prop: 248858}); +---- ok +-STATEMENT CREATE (t:test {prop: 11697}); +---- ok +-STATEMENT CREATE (t:test {prop: 660214}); +---- ok +-STATEMENT CREATE (t:test {prop: 101664}); +---- ok +-STATEMENT CREATE (t:test {prop: 999773}); +---- ok +-STATEMENT CREATE (t:test {prop: 988088}); +---- ok +-STATEMENT CREATE (t:test {prop: 512720}); +---- ok +-STATEMENT CREATE (t:test {prop: 557561}); +---- ok +-STATEMENT CREATE (t:test {prop: 940860}); +---- ok +-STATEMENT CREATE (t:test {prop: 349774}); +---- ok +-STATEMENT CREATE (t:test {prop: 200330}); +---- ok +-STATEMENT CREATE (t:test {prop: 586630}); +---- ok +-STATEMENT CREATE (t:test {prop: 268536}); +---- ok +-STATEMENT CREATE (t:test {prop: 936880}); +---- ok +-STATEMENT CREATE (t:test {prop: 690921}); +---- ok +-STATEMENT CREATE (t:test {prop: 37917}); +---- ok +-STATEMENT CREATE (t:test {prop: 788249}); +---- ok +-STATEMENT CREATE (t:test {prop: 159779}); +---- ok +-STATEMENT CREATE (t:test {prop: 856333}); +---- ok +-STATEMENT CREATE (t:test {prop: 310983}); +---- ok +-STATEMENT CREATE (t:test {prop: 970043}); +---- ok +-STATEMENT CREATE (t:test {prop: 411001}); +---- ok +-STATEMENT CREATE (t:test {prop: 184497}); +---- ok +-STATEMENT CREATE (t:test {prop: 851410}); +---- ok +-STATEMENT CREATE (t:test {prop: 351121}); +---- ok +-STATEMENT CREATE (t:test {prop: 710044}); +---- ok +-STATEMENT CREATE (t:test {prop: 385289}); +---- ok +-STATEMENT CREATE (t:test {prop: 970247}); +---- ok +-STATEMENT CREATE (t:test {prop: 766285}); +---- ok +-STATEMENT CREATE (t:test {prop: 65783}); +---- ok +-STATEMENT CREATE (t:test {prop: 7743}); +---- ok +-STATEMENT CREATE (t:test {prop: 807540}); +---- ok +-STATEMENT CREATE (t:test {prop: 865571}); +---- ok +-STATEMENT CREATE (t:test {prop: 684534}); +---- ok +-STATEMENT CREATE (t:test {prop: 581290}); +---- ok +-STATEMENT CREATE (t:test {prop: 736570}); +---- ok +-STATEMENT CREATE (t:test {prop: 279889}); +---- ok +-STATEMENT CREATE (t:test {prop: 568406}); +---- ok +-STATEMENT CREATE (t:test {prop: 587682}); +---- ok +-STATEMENT CREATE (t:test {prop: 900897}); +---- ok +-STATEMENT CREATE (t:test {prop: 271972}); +---- ok +-STATEMENT CREATE (t:test {prop: 338171}); +---- ok +-STATEMENT CREATE (t:test {prop: 53959}); +---- ok +-STATEMENT CREATE (t:test {prop: 125125}); +---- ok +-STATEMENT CREATE (t:test {prop: 121191}); +---- ok +-STATEMENT CREATE (t:test {prop: 462685}); +---- ok +-STATEMENT CREATE (t:test {prop: 796530}); +---- ok +-STATEMENT CREATE (t:test {prop: 893377}); +---- ok +-STATEMENT CREATE (t:test {prop: 311982}); +---- ok +-STATEMENT CREATE (t:test {prop: 306567}); +---- ok +-STATEMENT CREATE (t:test {prop: 866515}); +---- ok +-STATEMENT CREATE (t:test {prop: 165633}); +---- ok +-STATEMENT CREATE (t:test {prop: 113151}); +---- ok +-STATEMENT CREATE (t:test {prop: 50969}); +---- ok +-STATEMENT CREATE (t:test {prop: 167301}); +---- ok +-STATEMENT CREATE (t:test {prop: 69305}); +---- ok +-STATEMENT CREATE (t:test {prop: 390583}); +---- ok +-STATEMENT CREATE (t:test {prop: 628188}); +---- ok +-STATEMENT CREATE (t:test {prop: 157424}); +---- ok +-STATEMENT CREATE (t:test {prop: 330831}); +---- ok +-STATEMENT CREATE (t:test {prop: 206421}); +---- ok +-STATEMENT CREATE (t:test {prop: 87973}); +---- ok +-STATEMENT CREATE (t:test {prop: 719866}); +---- ok +-STATEMENT CREATE (t:test {prop: 539357}); +---- ok +-STATEMENT CREATE (t:test {prop: 405147}); +---- ok +-STATEMENT CREATE (t:test {prop: 69264}); +---- ok +-STATEMENT CREATE (t:test {prop: 972962}); +---- ok +-STATEMENT CREATE (t:test {prop: 276579}); +---- ok +-STATEMENT CREATE (t:test {prop: 641270}); +---- ok +-STATEMENT CREATE (t:test {prop: 340207}); +---- ok +-STATEMENT CREATE (t:test {prop: 478991}); +---- ok +-STATEMENT CREATE (t:test {prop: 626745}); +---- ok +-STATEMENT CREATE (t:test {prop: 69852}); +---- ok +-STATEMENT CREATE (t:test {prop: 527536}); +---- ok +-STATEMENT CREATE (t:test {prop: 819345}); +---- ok +-STATEMENT CREATE (t:test {prop: 883015}); +---- ok +-STATEMENT CREATE (t:test {prop: 588951}); +---- ok +-STATEMENT CREATE (t:test {prop: 380308}); +---- ok +-STATEMENT CREATE (t:test {prop: 730750}); +---- ok +-STATEMENT CREATE (t:test {prop: 733984}); +---- ok +-STATEMENT CREATE (t:test {prop: 65762}); +---- ok +-STATEMENT CREATE (t:test {prop: 938625}); +---- ok +-STATEMENT CREATE (t:test {prop: 436799}); +---- ok +-STATEMENT CREATE (t:test {prop: 982366}); +---- ok +-STATEMENT CREATE (t:test {prop: 178921}); +---- ok +-STATEMENT CREATE (t:test {prop: 668505}); +---- ok +-STATEMENT CREATE (t:test {prop: 748814}); +---- ok +-STATEMENT CREATE (t:test {prop: 692259}); +---- ok +-STATEMENT CREATE (t:test {prop: 996049}); +---- ok +-STATEMENT CREATE (t:test {prop: 977792}); +---- ok +-STATEMENT CREATE (t:test {prop: 827075}); +---- ok +-STATEMENT CREATE (t:test {prop: 754360}); +---- ok +-STATEMENT CREATE (t:test {prop: 199185}); +---- ok +-STATEMENT CREATE (t:test {prop: 641218}); +---- ok +-STATEMENT CREATE (t:test {prop: 561141}); +---- ok +-STATEMENT CREATE (t:test {prop: 384017}); +---- ok +-STATEMENT CREATE (t:test {prop: 75629}); +---- ok +-STATEMENT CREATE (t:test {prop: 49745}); +---- ok +-STATEMENT CREATE (t:test {prop: 603810}); +---- ok +-STATEMENT CREATE (t:test {prop: 446153}); +---- ok +-STATEMENT CREATE (t:test {prop: 981309}); +---- ok +-STATEMENT CREATE (t:test {prop: 181242}); +---- ok +-STATEMENT CREATE (t:test {prop: 379372}); +---- ok +-STATEMENT CREATE (t:test {prop: 555979}); +---- ok +-STATEMENT CREATE (t:test {prop: 414495}); +---- ok +-STATEMENT CREATE (t:test {prop: 364927}); +---- ok +-STATEMENT CREATE (t:test {prop: 568220}); +---- ok +-STATEMENT CREATE (t:test {prop: 550116}); +---- ok +-STATEMENT CREATE (t:test {prop: 495649}); +---- ok +-STATEMENT CREATE (t:test {prop: 329395}); +---- ok +-STATEMENT CREATE (t:test {prop: 561955}); +---- ok +-STATEMENT CREATE (t:test {prop: 868102}); +---- ok +-STATEMENT CREATE (t:test {prop: 143864}); +---- ok +-STATEMENT CREATE (t:test {prop: 249129}); +---- ok +-STATEMENT CREATE (t:test {prop: 879468}); +---- ok +-STATEMENT CREATE (t:test {prop: 967969}); +---- ok +-STATEMENT CREATE (t:test {prop: 253487}); +---- ok +-STATEMENT CREATE (t:test {prop: 39762}); +---- ok +-STATEMENT CREATE (t:test {prop: 918062}); +---- ok +-STATEMENT CREATE (t:test {prop: 987236}); +---- ok +-STATEMENT CREATE (t:test {prop: 723841}); +---- ok +-STATEMENT CREATE (t:test {prop: 558386}); +---- ok +-STATEMENT CREATE (t:test {prop: 274903}); +---- ok +-STATEMENT CREATE (t:test {prop: 318861}); +---- ok +-STATEMENT CREATE (t:test {prop: 545545}); +---- ok +-STATEMENT CREATE (t:test {prop: 966818}); +---- ok +-STATEMENT CREATE (t:test {prop: 715937}); +---- ok +-STATEMENT CREATE (t:test {prop: 679218}); +---- ok +-STATEMENT CREATE (t:test {prop: 127832}); +---- ok +-STATEMENT CREATE (t:test {prop: 952650}); +---- ok +-STATEMENT CREATE (t:test {prop: 610500}); +---- ok +-STATEMENT CREATE (t:test {prop: 773827}); +---- ok +-STATEMENT CREATE (t:test {prop: 358881}); +---- ok +-STATEMENT CREATE (t:test {prop: 757179}); +---- ok +-STATEMENT CREATE (t:test {prop: 63809}); +---- ok +-STATEMENT CREATE (t:test {prop: 686183}); +---- ok +-STATEMENT CREATE (t:test {prop: 515116}); +---- ok +-STATEMENT CREATE (t:test {prop: 632537}); +---- ok +-STATEMENT CREATE (t:test {prop: 985821}); +---- ok +-STATEMENT CREATE (t:test {prop: 4286}); +---- ok +-STATEMENT CREATE (t:test {prop: 334201}); +---- ok +-STATEMENT CREATE (t:test {prop: 993601}); +---- ok +-STATEMENT CREATE (t:test {prop: 398471}); +---- ok +-STATEMENT CREATE (t:test {prop: 780671}); +---- ok +-STATEMENT CREATE (t:test {prop: 329716}); +---- ok +-STATEMENT CREATE (t:test {prop: 795359}); +---- ok +-STATEMENT CREATE (t:test {prop: 457163}); +---- ok +-STATEMENT CREATE (t:test {prop: 302714}); +---- ok +-STATEMENT CREATE (t:test {prop: 31374}); +---- ok +-STATEMENT CREATE (t:test {prop: 842213}); +---- ok +-STATEMENT CREATE (t:test {prop: 865403}); +---- ok +-STATEMENT CREATE (t:test {prop: 134808}); +---- ok +-STATEMENT CREATE (t:test {prop: 846978}); +---- ok +-STATEMENT CREATE (t:test {prop: 730666}); +---- ok +-STATEMENT CREATE (t:test {prop: 400898}); +---- ok +-STATEMENT CREATE (t:test {prop: 474718}); +---- ok +-STATEMENT CREATE (t:test {prop: 776295}); +---- ok +-STATEMENT CREATE (t:test {prop: 413429}); +---- ok +-STATEMENT CREATE (t:test {prop: 530403}); +---- ok +-STATEMENT CREATE (t:test {prop: 272590}); +---- ok +-STATEMENT CREATE (t:test {prop: 695790}); +---- ok +-STATEMENT CREATE (t:test {prop: 644720}); +---- ok +-STATEMENT CREATE (t:test {prop: 204072}); +---- ok +-STATEMENT CREATE (t:test {prop: 960962}); +---- ok +-STATEMENT CREATE (t:test {prop: 604296}); +---- ok +-STATEMENT CREATE (t:test {prop: 277078}); +---- ok +-STATEMENT CREATE (t:test {prop: 770125}); +---- ok +-STATEMENT CREATE (t:test {prop: 397804}); +---- ok +-STATEMENT CREATE (t:test {prop: 615261}); +---- ok +-STATEMENT CREATE (t:test {prop: 903314}); +---- ok +-STATEMENT CREATE (t:test {prop: 224150}); +---- ok +-STATEMENT CREATE (t:test {prop: 570675}); +---- ok +-STATEMENT CREATE (t:test {prop: 672134}); +---- ok +-STATEMENT CREATE (t:test {prop: 825128}); +---- ok +-STATEMENT CREATE (t:test {prop: 136566}); +---- ok +-STATEMENT CREATE (t:test {prop: 878508}); +---- ok +-STATEMENT CREATE (t:test {prop: 619767}); +---- ok +-STATEMENT CREATE (t:test {prop: 769743}); +---- ok +-STATEMENT CREATE (t:test {prop: 268434}); +---- ok +-STATEMENT CREATE (t:test {prop: 307021}); +---- ok +-STATEMENT CREATE (t:test {prop: 533634}); +---- ok +-STATEMENT CREATE (t:test {prop: 173584}); +---- ok +-STATEMENT CREATE (t:test {prop: 341185}); +---- ok +-STATEMENT CREATE (t:test {prop: 557119}); +---- ok +-STATEMENT CREATE (t:test {prop: 580706}); +---- ok +-STATEMENT CREATE (t:test {prop: 870249}); +---- ok +-STATEMENT CREATE (t:test {prop: 245646}); +---- ok +-STATEMENT CREATE (t:test {prop: 182524}); +---- ok +-STATEMENT CREATE (t:test {prop: 275114}); +---- ok +-STATEMENT CREATE (t:test {prop: 550458}); +---- ok +-STATEMENT CREATE (t:test {prop: 623515}); +---- ok +-STATEMENT CREATE (t:test {prop: 842986}); +---- ok +-STATEMENT CREATE (t:test {prop: 137675}); +---- ok +-STATEMENT CREATE (t:test {prop: 89188}); +---- ok +-STATEMENT CREATE (t:test {prop: 152178}); +---- ok +-STATEMENT CREATE (t:test {prop: 870899}); +---- ok +-STATEMENT CREATE (t:test {prop: 542183}); +---- ok +-STATEMENT CREATE (t:test {prop: 971662}); +---- ok +-STATEMENT CREATE (t:test {prop: 958097}); +---- ok +-STATEMENT CREATE (t:test {prop: 668545}); +---- ok +-STATEMENT CREATE (t:test {prop: 790325}); +---- ok +-STATEMENT CREATE (t:test {prop: 480534}); +---- ok +-STATEMENT CREATE (t:test {prop: 892489}); +---- ok +-STATEMENT CREATE (t:test {prop: 878189}); +---- ok +-STATEMENT CREATE (t:test {prop: 177067}); +---- ok +-STATEMENT CREATE (t:test {prop: 520970}); +---- ok +-STATEMENT CREATE (t:test {prop: 120730}); +---- ok +-STATEMENT CREATE (t:test {prop: 725540}); +---- ok +-STATEMENT CREATE (t:test {prop: 714994}); +---- ok +-STATEMENT CREATE (t:test {prop: 757678}); +---- ok +-STATEMENT CREATE (t:test {prop: 681664}); +---- ok +-STATEMENT CREATE (t:test {prop: 651393}); +---- ok +-STATEMENT CREATE (t:test {prop: 405477}); +---- ok +-STATEMENT CREATE (t:test {prop: 275065}); +---- ok +-STATEMENT CREATE (t:test {prop: 956607}); +---- ok +-STATEMENT CREATE (t:test {prop: 737284}); +---- ok +-STATEMENT CREATE (t:test {prop: 248870}); +---- ok +-STATEMENT CREATE (t:test {prop: 299765}); +---- ok +-STATEMENT CREATE (t:test {prop: 401090}); +---- ok +-STATEMENT CREATE (t:test {prop: 442072}); +---- ok +-STATEMENT CREATE (t:test {prop: 392062}); +---- ok +-STATEMENT CREATE (t:test {prop: 354698}); +---- ok +-STATEMENT CREATE (t:test {prop: 305486}); +---- ok +-STATEMENT CREATE (t:test {prop: 79183}); +---- ok +-STATEMENT CREATE (t:test {prop: 804448}); +---- ok +-STATEMENT CREATE (t:test {prop: 695239}); +---- ok +-STATEMENT CREATE (t:test {prop: 407048}); +---- ok +-STATEMENT CREATE (t:test {prop: 54293}); +---- ok +-STATEMENT CREATE (t:test {prop: 444363}); +---- ok +-STATEMENT CREATE (t:test {prop: 766125}); +---- ok +-STATEMENT CREATE (t:test {prop: 18914}); +---- ok +-STATEMENT CREATE (t:test {prop: 379675}); +---- ok +-STATEMENT CREATE (t:test {prop: 182746}); +---- ok +-STATEMENT CREATE (t:test {prop: 868703}); +---- ok +-STATEMENT CREATE (t:test {prop: 57991}); +---- ok +-STATEMENT CREATE (t:test {prop: 255050}); +---- ok +-STATEMENT CREATE (t:test {prop: 615488}); +---- ok +-STATEMENT CREATE (t:test {prop: 137545}); +---- ok +-STATEMENT CREATE (t:test {prop: 827672}); +---- ok +-STATEMENT CREATE (t:test {prop: 912507}); +---- ok +-STATEMENT CREATE (t:test {prop: 562802}); +---- ok +-STATEMENT CREATE (t:test {prop: 527916}); +---- ok +-STATEMENT CREATE (t:test {prop: 64515}); +---- ok +-STATEMENT CREATE (t:test {prop: 812889}); +---- ok +-STATEMENT CREATE (t:test {prop: 4382}); +---- ok +-STATEMENT CREATE (t:test {prop: 921241}); +---- ok +-STATEMENT CREATE (t:test {prop: 964557}); +---- ok +-STATEMENT CREATE (t:test {prop: 36251}); +---- ok +-STATEMENT CREATE (t:test {prop: 893058}); +---- ok +-STATEMENT CREATE (t:test {prop: 497326}); +---- ok +-STATEMENT CREATE (t:test {prop: 185838}); +---- ok +-STATEMENT CREATE (t:test {prop: 284225}); +---- ok +-STATEMENT CREATE (t:test {prop: 878048}); +---- ok +-STATEMENT CREATE (t:test {prop: 818797}); +---- ok +-STATEMENT CREATE (t:test {prop: 498576}); +---- ok +-STATEMENT CREATE (t:test {prop: 543056}); +---- ok +-STATEMENT CREATE (t:test {prop: 987231}); +---- ok +-STATEMENT CREATE (t:test {prop: 929561}); +---- ok +-STATEMENT CREATE (t:test {prop: 754374}); +---- ok +-STATEMENT CREATE (t:test {prop: 960431}); +---- ok +-STATEMENT CREATE (t:test {prop: 483539}); +---- ok +-STATEMENT CREATE (t:test {prop: 419056}); +---- ok +-STATEMENT CREATE (t:test {prop: 4377}); +---- ok +-STATEMENT CREATE (t:test {prop: 276399}); +---- ok +-STATEMENT CREATE (t:test {prop: 553210}); +---- ok +-STATEMENT CREATE (t:test {prop: 52332}); +---- ok +-STATEMENT CREATE (t:test {prop: 294625}); +---- ok +-STATEMENT CREATE (t:test {prop: 64802}); +---- ok +-STATEMENT CREATE (t:test {prop: 662239}); +---- ok +-STATEMENT CREATE (t:test {prop: 231538}); +---- ok +-STATEMENT CREATE (t:test {prop: 68717}); +---- ok +-STATEMENT CREATE (t:test {prop: 705338}); +---- ok +-STATEMENT CREATE (t:test {prop: 282195}); +---- ok +-STATEMENT CREATE (t:test {prop: 255642}); +---- ok +-STATEMENT CREATE (t:test {prop: 559791}); +---- ok +-STATEMENT CREATE (t:test {prop: 961460}); +---- ok +-STATEMENT CREATE (t:test {prop: 417863}); +---- ok +-STATEMENT CREATE (t:test {prop: 108188}); +---- ok +-STATEMENT CREATE (t:test {prop: 541039}); +---- ok +-STATEMENT CREATE (t:test {prop: 676960}); +---- ok +-STATEMENT CREATE (t:test {prop: 282561}); +---- ok +-STATEMENT CREATE (t:test {prop: 421596}); +---- ok +-STATEMENT CREATE (t:test {prop: 702813}); +---- ok +-STATEMENT CREATE (t:test {prop: 781955}); +---- ok +-STATEMENT CREATE (t:test {prop: 622647}); +---- ok +-STATEMENT CREATE (t:test {prop: 510373}); +---- ok +-STATEMENT CREATE (t:test {prop: 950211}); +---- ok +-STATEMENT CREATE (t:test {prop: 731976}); +---- ok +-STATEMENT CREATE (t:test {prop: 205952}); +---- ok +-STATEMENT CREATE (t:test {prop: 377785}); +---- ok +-STATEMENT CREATE (t:test {prop: 793978}); +---- ok +-STATEMENT CREATE (t:test {prop: 976991}); +---- ok +-STATEMENT CREATE (t:test {prop: 804451}); +---- ok +-STATEMENT CREATE (t:test {prop: 149490}); +---- ok +-STATEMENT CREATE (t:test {prop: 328618}); +---- ok +-STATEMENT CREATE (t:test {prop: 778575}); +---- ok +-STATEMENT CREATE (t:test {prop: 973365}); +---- ok +-STATEMENT CREATE (t:test {prop: 330983}); +---- ok +-STATEMENT CREATE (t:test {prop: 620434}); +---- ok +-STATEMENT CREATE (t:test {prop: 533433}); +---- ok +-STATEMENT CREATE (t:test {prop: 207228}); +---- ok +-STATEMENT CREATE (t:test {prop: 56512}); +---- ok +-STATEMENT CREATE (t:test {prop: 997635}); +---- ok +-STATEMENT CREATE (t:test {prop: 501703}); +---- ok +-STATEMENT CREATE (t:test {prop: 390556}); +---- ok +-STATEMENT CREATE (t:test {prop: 455852}); +---- ok +-STATEMENT CREATE (t:test {prop: 627035}); +---- ok +-STATEMENT CREATE (t:test {prop: 842821}); +---- ok +-STATEMENT CREATE (t:test {prop: 357461}); +---- ok +-STATEMENT CREATE (t:test {prop: 849556}); +---- ok +-STATEMENT CREATE (t:test {prop: 959123}); +---- ok +-STATEMENT CREATE (t:test {prop: 101321}); +---- ok +-STATEMENT CREATE (t:test {prop: 74522}); +---- ok +-STATEMENT CREATE (t:test {prop: 457589}); +---- ok +-STATEMENT CREATE (t:test {prop: 178156}); +---- ok +-STATEMENT CREATE (t:test {prop: 403808}); +---- ok +-STATEMENT CREATE (t:test {prop: 358675}); +---- ok +-STATEMENT CREATE (t:test {prop: 966672}); +---- ok +-STATEMENT CREATE (t:test {prop: 701816}); +---- ok +-STATEMENT CREATE (t:test {prop: 107235}); +---- ok +-STATEMENT CREATE (t:test {prop: 169923}); +---- ok +-STATEMENT CREATE (t:test {prop: 707341}); +---- ok +-STATEMENT CREATE (t:test {prop: 273288}); +---- ok +-STATEMENT CREATE (t:test {prop: 769232}); +---- ok +-STATEMENT CREATE (t:test {prop: 538284}); +---- ok +-STATEMENT CREATE (t:test {prop: 560265}); +---- ok +-STATEMENT CREATE (t:test {prop: 912187}); +---- ok +-STATEMENT CREATE (t:test {prop: 561538}); +---- ok +-STATEMENT CREATE (t:test {prop: 271591}); +---- ok +-STATEMENT CREATE (t:test {prop: 511326}); +---- ok +-STATEMENT CREATE (t:test {prop: 736030}); +---- ok +-STATEMENT CREATE (t:test {prop: 238414}); +---- ok +-STATEMENT CREATE (t:test {prop: 756542}); +---- ok +-STATEMENT CREATE (t:test {prop: 892108}); +---- ok +-STATEMENT CREATE (t:test {prop: 804956}); +---- ok +-STATEMENT CREATE (t:test {prop: 248480}); +---- ok +-STATEMENT CREATE (t:test {prop: 836009}); +---- ok +-STATEMENT CREATE (t:test {prop: 679403}); +---- ok +-STATEMENT CREATE (t:test {prop: 443237}); +---- ok +-STATEMENT CREATE (t:test {prop: 151793}); +---- ok +-STATEMENT CREATE (t:test {prop: 795741}); +---- ok +-STATEMENT CREATE (t:test {prop: 818111}); +---- ok +-STATEMENT CREATE (t:test {prop: 925039}); +---- ok +-STATEMENT CREATE (t:test {prop: 218589}); +---- ok +-STATEMENT CREATE (t:test {prop: 485409}); +---- ok +-STATEMENT CREATE (t:test {prop: 58487}); +---- ok +-STATEMENT CREATE (t:test {prop: 767839}); +---- ok +-STATEMENT CREATE (t:test {prop: 423643}); +---- ok +-STATEMENT CREATE (t:test {prop: 930409}); +---- ok +-STATEMENT CREATE (t:test {prop: 118915}); +---- ok +-STATEMENT CREATE (t:test {prop: 831247}); +---- ok +-STATEMENT CREATE (t:test {prop: 548100}); +---- ok +-STATEMENT CREATE (t:test {prop: 816588}); +---- ok +-STATEMENT CREATE (t:test {prop: 133145}); +---- ok +-STATEMENT CREATE (t:test {prop: 329771}); +---- ok +-STATEMENT CREATE (t:test {prop: 746525}); +---- ok +-STATEMENT CREATE (t:test {prop: 441876}); +---- ok +-STATEMENT CREATE (t:test {prop: 864833}); +---- ok +-STATEMENT CREATE (t:test {prop: 392146}); +---- ok +-STATEMENT CREATE (t:test {prop: 164566}); +---- ok +-STATEMENT CREATE (t:test {prop: 331772}); +---- ok +-STATEMENT CREATE (t:test {prop: 54303}); +---- ok +-STATEMENT CREATE (t:test {prop: 63748}); +---- ok +-STATEMENT CREATE (t:test {prop: 814200}); +---- ok +-STATEMENT CREATE (t:test {prop: 663377}); +---- ok +-STATEMENT CREATE (t:test {prop: 564017}); +---- ok +-STATEMENT CREATE (t:test {prop: 157930}); +---- ok +-STATEMENT CREATE (t:test {prop: 54099}); +---- ok +-STATEMENT CREATE (t:test {prop: 452753}); +---- ok +-STATEMENT CREATE (t:test {prop: 969058}); +---- ok +-STATEMENT CREATE (t:test {prop: 62902}); +---- ok +-STATEMENT CREATE (t:test {prop: 283747}); +---- ok +-STATEMENT CREATE (t:test {prop: 155243}); +---- ok +-STATEMENT CREATE (t:test {prop: 448361}); +---- ok +-STATEMENT CREATE (t:test {prop: 288233}); +---- ok +-STATEMENT CREATE (t:test {prop: 620560}); +---- ok +-STATEMENT CREATE (t:test {prop: 33772}); +---- ok +-STATEMENT CREATE (t:test {prop: 275952}); +---- ok +-STATEMENT CREATE (t:test {prop: 994515}); +---- ok +-STATEMENT CREATE (t:test {prop: 90851}); +---- ok +-STATEMENT CREATE (t:test {prop: 780649}); +---- ok +-STATEMENT CREATE (t:test {prop: 588839}); +---- ok +-STATEMENT CREATE (t:test {prop: 913413}); +---- ok +-STATEMENT CREATE (t:test {prop: 209530}); +---- ok +-STATEMENT CREATE (t:test {prop: 628760}); +---- ok +-STATEMENT CREATE (t:test {prop: 185237}); +---- ok +-STATEMENT CREATE (t:test {prop: 289281}); +---- ok +-STATEMENT CREATE (t:test {prop: 660870}); +---- ok +-STATEMENT CREATE (t:test {prop: 328359}); +---- ok +-STATEMENT CREATE (t:test {prop: 892221}); +---- ok +-STATEMENT CREATE (t:test {prop: 738679}); +---- ok +-STATEMENT CREATE (t:test {prop: 522663}); +---- ok +-STATEMENT CREATE (t:test {prop: 383433}); +---- ok +-STATEMENT CREATE (t:test {prop: 969654}); +---- ok +-STATEMENT CREATE (t:test {prop: 40985}); +---- ok +-STATEMENT CREATE (t:test {prop: 619871}); +---- ok +-STATEMENT CREATE (t:test {prop: 810952}); +---- ok +-STATEMENT CREATE (t:test {prop: 550385}); +---- ok +-STATEMENT CREATE (t:test {prop: 455155}); +---- ok +-STATEMENT CREATE (t:test {prop: 808103}); +---- ok +-STATEMENT CREATE (t:test {prop: 44202}); +---- ok +-STATEMENT CREATE (t:test {prop: 10640}); +---- ok +-STATEMENT CREATE (t:test {prop: 731918}); +---- ok +-STATEMENT CREATE (t:test {prop: 914977}); +---- ok +-STATEMENT CREATE (t:test {prop: 272156}); +---- ok +-STATEMENT CREATE (t:test {prop: 528264}); +---- ok +-STATEMENT CREATE (t:test {prop: 324115}); +---- ok +-STATEMENT CREATE (t:test {prop: 830288}); +---- ok +-STATEMENT CREATE (t:test {prop: 896558}); +---- ok +-STATEMENT CREATE (t:test {prop: 284870}); +---- ok +-STATEMENT CREATE (t:test {prop: 133790}); +---- ok +-STATEMENT CREATE (t:test {prop: 278614}); +---- ok +-STATEMENT CREATE (t:test {prop: 77672}); +---- ok +-STATEMENT CREATE (t:test {prop: 841261}); +---- ok +-STATEMENT CREATE (t:test {prop: 544095}); +---- ok +-STATEMENT CREATE (t:test {prop: 689848}); +---- ok +-STATEMENT CREATE (t:test {prop: 339258}); +---- ok +-STATEMENT CREATE (t:test {prop: 459857}); +---- ok +-STATEMENT CREATE (t:test {prop: 269459}); +---- ok +-STATEMENT CREATE (t:test {prop: 328923}); +---- ok +-STATEMENT CREATE (t:test {prop: 766628}); +---- ok +-STATEMENT CREATE (t:test {prop: 677768}); +---- ok +-STATEMENT CREATE (t:test {prop: 324402}); +---- ok +-STATEMENT CREATE (t:test {prop: 856228}); +---- ok +-STATEMENT CREATE (t:test {prop: 687221}); +---- ok +-STATEMENT CREATE (t:test {prop: 45943}); +---- ok +-STATEMENT CREATE (t:test {prop: 157778}); +---- ok +-STATEMENT CREATE (t:test {prop: 251746}); +---- ok +-STATEMENT CREATE (t:test {prop: 900569}); +---- ok +-STATEMENT CREATE (t:test {prop: 242763}); +---- ok +-STATEMENT CREATE (t:test {prop: 50420}); +---- ok +-STATEMENT CREATE (t:test {prop: 936117}); +---- ok +-STATEMENT CREATE (t:test {prop: 959210}); +---- ok +-STATEMENT CREATE (t:test {prop: 834988}); +---- ok +-STATEMENT CREATE (t:test {prop: 13714}); +---- ok +-STATEMENT CREATE (t:test {prop: 919830}); +---- ok +-STATEMENT CREATE (t:test {prop: 82788}); +---- ok +-STATEMENT CREATE (t:test {prop: 359114}); +---- ok +-STATEMENT CREATE (t:test {prop: 979803}); +---- ok +-STATEMENT CREATE (t:test {prop: 80384}); +---- ok +-STATEMENT CREATE (t:test {prop: 262307}); +---- ok +-STATEMENT CREATE (t:test {prop: 551957}); +---- ok +-STATEMENT CREATE (t:test {prop: 736625}); +---- ok +-STATEMENT CREATE (t:test {prop: 354765}); +---- ok +-STATEMENT CREATE (t:test {prop: 633982}); +---- ok +-STATEMENT CREATE (t:test {prop: 571258}); +---- ok +-STATEMENT CREATE (t:test {prop: 515139}); +---- ok +-STATEMENT CREATE (t:test {prop: 594556}); +---- ok +-STATEMENT CREATE (t:test {prop: 322996}); +---- ok +-STATEMENT CREATE (t:test {prop: 521577}); +---- ok +-STATEMENT CREATE (t:test {prop: 313899}); +---- ok +-STATEMENT CREATE (t:test {prop: 582090}); +---- ok +-STATEMENT CREATE (t:test {prop: 361839}); +---- ok +-STATEMENT CREATE (t:test {prop: 442825}); +---- ok +-STATEMENT CREATE (t:test {prop: 441000}); +---- ok +-STATEMENT CREATE (t:test {prop: 399331}); +---- ok +-STATEMENT CREATE (t:test {prop: 784445}); +---- ok +-STATEMENT CREATE (t:test {prop: 786067}); +---- ok +-STATEMENT CREATE (t:test {prop: 868840}); +---- ok +-STATEMENT CREATE (t:test {prop: 366990}); +---- ok +-STATEMENT CREATE (t:test {prop: 895789}); +---- ok +-STATEMENT CREATE (t:test {prop: 524712}); +---- ok +-STATEMENT CREATE (t:test {prop: 279286}); +---- ok +-STATEMENT CREATE (t:test {prop: 143194}); +---- ok +-STATEMENT CREATE (t:test {prop: 169337}); +---- ok +-STATEMENT CREATE (t:test {prop: 860691}); +---- ok +-STATEMENT CREATE (t:test {prop: 448923}); +---- ok +-STATEMENT CREATE (t:test {prop: 256769}); +---- ok +-STATEMENT CREATE (t:test {prop: 39873}); +---- ok +-STATEMENT CREATE (t:test {prop: 208170}); +---- ok +-STATEMENT CREATE (t:test {prop: 226598}); +---- ok +-STATEMENT CREATE (t:test {prop: 381053}); +---- ok +-STATEMENT CREATE (t:test {prop: 357262}); +---- ok +-STATEMENT CREATE (t:test {prop: 850660}); +---- ok +-STATEMENT CREATE (t:test {prop: 9344}); +---- ok +-STATEMENT CREATE (t:test {prop: 942232}); +---- ok +-STATEMENT CREATE (t:test {prop: 216899}); +---- ok +-STATEMENT CREATE (t:test {prop: 295935}); +---- ok +-STATEMENT CREATE (t:test {prop: 127672}); +---- ok +-STATEMENT CREATE (t:test {prop: 436220}); +---- ok +-STATEMENT CREATE (t:test {prop: 937525}); +---- ok +-STATEMENT CREATE (t:test {prop: 472668}); +---- ok +-STATEMENT CREATE (t:test {prop: 250512}); +---- ok +-STATEMENT CREATE (t:test {prop: 80622}); +---- ok +-STATEMENT CREATE (t:test {prop: 186961}); +---- ok +-STATEMENT CREATE (t:test {prop: 56135}); +---- ok +-STATEMENT CREATE (t:test {prop: 313907}); +---- ok +-STATEMENT CREATE (t:test {prop: 912242}); +---- ok +-STATEMENT CREATE (t:test {prop: 979749}); +---- ok +-STATEMENT CREATE (t:test {prop: 328942}); +---- ok +-STATEMENT CREATE (t:test {prop: 30301}); +---- ok +-STATEMENT CREATE (t:test {prop: 920549}); +---- ok +-STATEMENT CREATE (t:test {prop: 670037}); +---- ok +-STATEMENT CREATE (t:test {prop: 800698}); +---- ok +-STATEMENT CREATE (t:test {prop: 528927}); +---- ok +-STATEMENT CREATE (t:test {prop: 394794}); +---- ok +-STATEMENT CREATE (t:test {prop: 282146}); +---- ok +-STATEMENT CREATE (t:test {prop: 1203}); +---- ok +-STATEMENT CREATE (t:test {prop: 160885}); +---- ok +-STATEMENT CREATE (t:test {prop: 8516}); +---- ok +-STATEMENT CREATE (t:test {prop: 40993}); +---- ok +-STATEMENT CREATE (t:test {prop: 191541}); +---- ok +-STATEMENT CREATE (t:test {prop: 655643}); +---- ok +-STATEMENT CREATE (t:test {prop: 451317}); +---- ok +-STATEMENT CREATE (t:test {prop: 136060}); +---- ok +-STATEMENT CREATE (t:test {prop: 163448}); +---- ok +-STATEMENT CREATE (t:test {prop: 275765}); +---- ok +-STATEMENT CREATE (t:test {prop: 537302}); +---- ok +-STATEMENT CREATE (t:test {prop: 282264}); +---- ok +-STATEMENT CREATE (t:test {prop: 880294}); +---- ok +-STATEMENT CREATE (t:test {prop: 947212}); +---- ok +-STATEMENT CREATE (t:test {prop: 480114}); +---- ok +-STATEMENT CREATE (t:test {prop: 277115}); +---- ok +-STATEMENT CREATE (t:test {prop: 334709}); +---- ok +-STATEMENT CREATE (t:test {prop: 182999}); +---- ok +-STATEMENT CREATE (t:test {prop: 147077}); +---- ok +-STATEMENT CREATE (t:test {prop: 683989}); +---- ok +-STATEMENT CREATE (t:test {prop: 443467}); +---- ok +-STATEMENT CREATE (t:test {prop: 635072}); +---- ok +-STATEMENT CREATE (t:test {prop: 588189}); +---- ok +-STATEMENT CREATE (t:test {prop: 906317}); +---- ok +-STATEMENT CREATE (t:test {prop: 339619}); +---- ok +-STATEMENT CREATE (t:test {prop: 598520}); +---- ok +-STATEMENT CREATE (t:test {prop: 59021}); +---- ok +-STATEMENT CREATE (t:test {prop: 149210}); +---- ok +-STATEMENT CREATE (t:test {prop: 295451}); +---- ok +-STATEMENT CREATE (t:test {prop: 431631}); +---- ok +-STATEMENT CREATE (t:test {prop: 700915}); +---- ok +-STATEMENT CREATE (t:test {prop: 811549}); +---- ok +-STATEMENT CREATE (t:test {prop: 719542}); +---- ok +-STATEMENT CREATE (t:test {prop: 527400}); +---- ok +-STATEMENT CREATE (t:test {prop: 498667}); +---- ok +-STATEMENT CREATE (t:test {prop: 613430}); +---- ok +-STATEMENT CREATE (t:test {prop: 813731}); +---- ok +-STATEMENT CREATE (t:test {prop: 378390}); +---- ok +-STATEMENT CREATE (t:test {prop: 933020}); +---- ok +-STATEMENT CREATE (t:test {prop: 95095}); +---- ok +-STATEMENT CREATE (t:test {prop: 474626}); +---- ok +-STATEMENT CREATE (t:test {prop: 83407}); +---- ok +-STATEMENT CREATE (t:test {prop: 393761}); +---- ok +-STATEMENT CREATE (t:test {prop: 533331}); +---- ok +-STATEMENT CREATE (t:test {prop: 592066}); +---- ok +-STATEMENT CREATE (t:test {prop: 196445}); +---- ok +-STATEMENT CREATE (t:test {prop: 291381}); +---- ok +-STATEMENT CREATE (t:test {prop: 530347}); +---- ok +-STATEMENT CREATE (t:test {prop: 549822}); +---- ok +-STATEMENT CREATE (t:test {prop: 102210}); +---- ok +-STATEMENT CREATE (t:test {prop: 702725}); +---- ok +-STATEMENT CREATE (t:test {prop: 818738}); +---- ok +-STATEMENT CREATE (t:test {prop: 464082}); +---- ok +-STATEMENT CREATE (t:test {prop: 405267}); +---- ok +-STATEMENT CREATE (t:test {prop: 283334}); +---- ok +-STATEMENT CREATE (t:test {prop: 106097}); +---- ok +-STATEMENT CREATE (t:test {prop: 618136}); +---- ok +-STATEMENT CREATE (t:test {prop: 913224}); +---- ok +-STATEMENT CREATE (t:test {prop: 364848}); +---- ok +-STATEMENT CREATE (t:test {prop: 620502}); +---- ok +-STATEMENT CREATE (t:test {prop: 909755}); +---- ok +-STATEMENT CREATE (t:test {prop: 135093}); +---- ok +-STATEMENT CREATE (t:test {prop: 482415}); +---- ok +-STATEMENT CREATE (t:test {prop: 475457}); +---- ok +-STATEMENT CREATE (t:test {prop: 315411}); +---- ok +-STATEMENT CREATE (t:test {prop: 666986}); +---- ok +-STATEMENT CREATE (t:test {prop: 926615}); +---- ok +-STATEMENT CREATE (t:test {prop: 260816}); +---- ok +-STATEMENT CREATE (t:test {prop: 575664}); +---- ok +-STATEMENT CREATE (t:test {prop: 128779}); +---- ok +-STATEMENT CREATE (t:test {prop: 929030}); +---- ok +-STATEMENT CREATE (t:test {prop: 361699}); +---- ok +-STATEMENT CREATE (t:test {prop: 615884}); +---- ok +-STATEMENT CREATE (t:test {prop: 79023}); +---- ok +-STATEMENT CREATE (t:test {prop: 464609}); +---- ok +-STATEMENT CREATE (t:test {prop: 429263}); +---- ok +-STATEMENT CREATE (t:test {prop: 137255}); +---- ok +-STATEMENT CREATE (t:test {prop: 825205}); +---- ok +-STATEMENT CREATE (t:test {prop: 581490}); +---- ok +-STATEMENT CREATE (t:test {prop: 56797}); +---- ok +-STATEMENT CREATE (t:test {prop: 55099}); +---- ok +-STATEMENT CREATE (t:test {prop: 314119}); +---- ok +-STATEMENT CREATE (t:test {prop: 441418}); +---- ok +-STATEMENT CREATE (t:test {prop: 756314}); +---- ok +-STATEMENT CREATE (t:test {prop: 604985}); +---- ok +-STATEMENT CREATE (t:test {prop: 107070}); +---- ok +-STATEMENT CREATE (t:test {prop: 543755}); +---- ok +-STATEMENT CREATE (t:test {prop: 236896}); +---- ok +-STATEMENT CREATE (t:test {prop: 756950}); +---- ok +-STATEMENT CREATE (t:test {prop: 135494}); +---- ok +-STATEMENT CREATE (t:test {prop: 212180}); +---- ok +-STATEMENT CREATE (t:test {prop: 982298}); +---- ok +-STATEMENT CREATE (t:test {prop: 577953}); +---- ok +-STATEMENT CREATE (t:test {prop: 561015}); +---- ok +-STATEMENT CREATE (t:test {prop: 785518}); +---- ok +-STATEMENT CREATE (t:test {prop: 62428}); +---- ok +-STATEMENT CREATE (t:test {prop: 567387}); +---- ok +-STATEMENT CREATE (t:test {prop: 800688}); +---- ok +-STATEMENT CREATE (t:test {prop: 507144}); +---- ok +-STATEMENT CREATE (t:test {prop: 329099}); +---- ok +-STATEMENT CREATE (t:test {prop: 906703}); +---- ok +-STATEMENT CREATE (t:test {prop: 872430}); +---- ok +-STATEMENT CREATE (t:test {prop: 66802}); +---- ok +-STATEMENT CREATE (t:test {prop: 558425}); +---- ok +-STATEMENT CREATE (t:test {prop: 217135}); +---- ok +-STATEMENT CREATE (t:test {prop: 219591}); +---- ok +-STATEMENT CREATE (t:test {prop: 857720}); +---- ok +-STATEMENT CREATE (t:test {prop: 443684}); +---- ok +-STATEMENT CREATE (t:test {prop: 483061}); +---- ok +-STATEMENT CREATE (t:test {prop: 755253}); +---- ok +-STATEMENT CREATE (t:test {prop: 51360}); +---- ok +-STATEMENT CREATE (t:test {prop: 729801}); +---- ok +-STATEMENT CREATE (t:test {prop: 485182}); +---- ok +-STATEMENT CREATE (t:test {prop: 173614}); +---- ok +-STATEMENT CREATE (t:test {prop: 967196}); +---- ok +-STATEMENT CREATE (t:test {prop: 915644}); +---- ok +-STATEMENT CREATE (t:test {prop: 198012}); +---- ok +-STATEMENT CREATE (t:test {prop: 80341}); +---- ok +-STATEMENT CREATE (t:test {prop: 965973}); +---- ok +-STATEMENT CREATE (t:test {prop: 169895}); +---- ok +-STATEMENT CREATE (t:test {prop: 997664}); +---- ok +-STATEMENT CREATE (t:test {prop: 992352}); +---- ok +-STATEMENT CREATE (t:test {prop: 907505}); +---- ok +-STATEMENT CREATE (t:test {prop: 662682}); +---- ok +-STATEMENT CREATE (t:test {prop: 39893}); +---- ok +-STATEMENT CREATE (t:test {prop: 848606}); +---- ok +-STATEMENT CREATE (t:test {prop: 239209}); +---- ok +-STATEMENT CREATE (t:test {prop: 862292}); +---- ok +-STATEMENT CREATE (t:test {prop: 551511}); +---- ok +-STATEMENT CREATE (t:test {prop: 905356}); +---- ok +-STATEMENT CREATE (t:test {prop: 966167}); +---- ok +-STATEMENT CREATE (t:test {prop: 349166}); +---- ok +-STATEMENT CREATE (t:test {prop: 675997}); +---- ok +-STATEMENT CREATE (t:test {prop: 946007}); +---- ok +-STATEMENT CREATE (t:test {prop: 938840}); +---- ok +-STATEMENT CREATE (t:test {prop: 404733}); +---- ok +-STATEMENT CREATE (t:test {prop: 844643}); +---- ok +-STATEMENT CREATE (t:test {prop: 503186}); +---- ok +-STATEMENT CREATE (t:test {prop: 128436}); +---- ok +-STATEMENT CREATE (t:test {prop: 193205}); +---- ok +-STATEMENT CREATE (t:test {prop: 1187}); +---- ok +-STATEMENT CREATE (t:test {prop: 447444}); +---- ok +-STATEMENT CREATE (t:test {prop: 43876}); +---- ok +-STATEMENT CREATE (t:test {prop: 417686}); +---- ok +-STATEMENT CREATE (t:test {prop: 171183}); +---- ok +-STATEMENT CREATE (t:test {prop: 677083}); +---- ok +-STATEMENT CREATE (t:test {prop: 60991}); +---- ok +-STATEMENT CREATE (t:test {prop: 254326}); +---- ok +-STATEMENT CREATE (t:test {prop: 837740}); +---- ok +-STATEMENT CREATE (t:test {prop: 163600}); +---- ok +-STATEMENT CREATE (t:test {prop: 877179}); +---- ok +-STATEMENT CREATE (t:test {prop: 71524}); +---- ok +-STATEMENT CREATE (t:test {prop: 65772}); +---- ok +-STATEMENT CREATE (t:test {prop: 177140}); +---- ok +-STATEMENT CREATE (t:test {prop: 819997}); +---- ok +-STATEMENT CREATE (t:test {prop: 670592}); +---- ok +-STATEMENT CREATE (t:test {prop: 783889}); +---- ok +-STATEMENT CREATE (t:test {prop: 575426}); +---- ok +-STATEMENT CREATE (t:test {prop: 440614}); +---- ok +-STATEMENT CREATE (t:test {prop: 881183}); +---- ok +-STATEMENT CREATE (t:test {prop: 7468}); +---- ok +-STATEMENT CREATE (t:test {prop: 807525}); +---- ok +-STATEMENT CREATE (t:test {prop: 160483}); +---- ok +-STATEMENT CREATE (t:test {prop: 313934}); +---- ok +-STATEMENT CREATE (t:test {prop: 196918}); +---- ok +-STATEMENT CREATE (t:test {prop: 937980}); +---- ok +-STATEMENT CREATE (t:test {prop: 122643}); +---- ok +-STATEMENT CREATE (t:test {prop: 663688}); +---- ok +-STATEMENT CREATE (t:test {prop: 633878}); +---- ok +-STATEMENT CREATE (t:test {prop: 550045}); +---- ok +-STATEMENT CREATE (t:test {prop: 94402}); +---- ok +-STATEMENT CREATE (t:test {prop: 644303}); +---- ok +-STATEMENT CREATE (t:test {prop: 59639}); +---- ok +-STATEMENT CREATE (t:test {prop: 961361}); +---- ok +-STATEMENT CREATE (t:test {prop: 41424}); +---- ok +-STATEMENT CREATE (t:test {prop: 437221}); +---- ok +-STATEMENT CREATE (t:test {prop: 610119}); +---- ok +-STATEMENT CREATE (t:test {prop: 584144}); +---- ok +-STATEMENT CREATE (t:test {prop: 116817}); +---- ok +-STATEMENT CREATE (t:test {prop: 846215}); +---- ok +-STATEMENT CREATE (t:test {prop: 496989}); +---- ok +-STATEMENT CREATE (t:test {prop: 864955}); +---- ok +-STATEMENT CREATE (t:test {prop: 715114}); +---- ok +-STATEMENT CREATE (t:test {prop: 158254}); +---- ok +-STATEMENT CREATE (t:test {prop: 222826}); +---- ok +-STATEMENT CREATE (t:test {prop: 310416}); +---- ok +-STATEMENT CREATE (t:test {prop: 66629}); +---- ok +-STATEMENT CREATE (t:test {prop: 997784}); +---- ok +-STATEMENT CREATE (t:test {prop: 423546}); +---- ok +-STATEMENT CREATE (t:test {prop: 135153}); +---- ok +-STATEMENT CREATE (t:test {prop: 809081}); +---- ok +-STATEMENT CREATE (t:test {prop: 5324}); +---- ok +-STATEMENT CREATE (t:test {prop: 239767}); +---- ok +-STATEMENT CREATE (t:test {prop: 395449}); +---- ok +-STATEMENT CREATE (t:test {prop: 349842}); +---- ok +-STATEMENT CREATE (t:test {prop: 667165}); +---- ok +-STATEMENT CREATE (t:test {prop: 564806}); +---- ok +-STATEMENT CREATE (t:test {prop: 371968}); +---- ok +-STATEMENT CREATE (t:test {prop: 237053}); +---- ok +-STATEMENT CREATE (t:test {prop: 142127}); +---- ok +-STATEMENT CREATE (t:test {prop: 623016}); +---- ok +-STATEMENT CREATE (t:test {prop: 147674}); +---- ok +-STATEMENT CREATE (t:test {prop: 353521}); +---- ok +-STATEMENT CREATE (t:test {prop: 352915}); +---- ok +-STATEMENT CREATE (t:test {prop: 541235}); +---- ok +-STATEMENT CREATE (t:test {prop: 649524}); +---- ok +-STATEMENT CREATE (t:test {prop: 394327}); +---- ok +-STATEMENT CREATE (t:test {prop: 393403}); +---- ok +-STATEMENT CREATE (t:test {prop: 994429}); +---- ok +-STATEMENT CREATE (t:test {prop: 783537}); +---- ok +-STATEMENT CREATE (t:test {prop: 10025}); +---- ok +-STATEMENT CREATE (t:test {prop: 858131}); +---- ok +-STATEMENT CREATE (t:test {prop: 522438}); +---- ok +-STATEMENT CREATE (t:test {prop: 100041}); +---- ok +-STATEMENT CREATE (t:test {prop: 803461}); +---- ok +-STATEMENT CREATE (t:test {prop: 944002}); +---- ok +-STATEMENT CREATE (t:test {prop: 480775}); +---- ok +-STATEMENT CREATE (t:test {prop: 15230}); +---- ok +-STATEMENT CREATE (t:test {prop: 557430}); +---- ok +-STATEMENT CREATE (t:test {prop: 96174}); +---- ok +-STATEMENT CREATE (t:test {prop: 86022}); +---- ok +-STATEMENT CREATE (t:test {prop: 402337}); +---- ok +-STATEMENT CREATE (t:test {prop: 708180}); +---- ok +-STATEMENT CREATE (t:test {prop: 385800}); +---- ok +-STATEMENT CREATE (t:test {prop: 889472}); +---- ok +-STATEMENT CREATE (t:test {prop: 445396}); +---- ok +-STATEMENT CREATE (t:test {prop: 947216}); +---- ok +-STATEMENT CREATE (t:test {prop: 24568}); +---- ok +-STATEMENT CREATE (t:test {prop: 604126}); +---- ok +-STATEMENT CREATE (t:test {prop: 715785}); +---- ok +-STATEMENT CREATE (t:test {prop: 517512}); +---- ok +-STATEMENT CREATE (t:test {prop: 230678}); +---- ok +-STATEMENT CREATE (t:test {prop: 79667}); +---- ok +-STATEMENT CREATE (t:test {prop: 35926}); +---- ok +-STATEMENT CREATE (t:test {prop: 477322}); +---- ok +-STATEMENT CREATE (t:test {prop: 355368}); +---- ok +-STATEMENT CREATE (t:test {prop: 749446}); +---- ok +-STATEMENT CREATE (t:test {prop: 556836}); +---- ok +-STATEMENT CREATE (t:test {prop: 232341}); +---- ok +-STATEMENT CREATE (t:test {prop: 374715}); +---- ok +-STATEMENT CREATE (t:test {prop: 805103}); +---- ok +-STATEMENT CREATE (t:test {prop: 5500}); +---- ok +-STATEMENT CREATE (t:test {prop: 887967}); +---- ok +-STATEMENT CREATE (t:test {prop: 768206}); +---- ok +-STATEMENT CREATE (t:test {prop: 10066}); +---- ok +-STATEMENT CREATE (t:test {prop: 306717}); +---- ok +-STATEMENT CREATE (t:test {prop: 470323}); +---- ok +-STATEMENT CREATE (t:test {prop: 734460}); +---- ok +-STATEMENT CREATE (t:test {prop: 924983}); +---- ok +-STATEMENT CREATE (t:test {prop: 127144}); +---- ok +-STATEMENT CREATE (t:test {prop: 104047}); +---- ok +-STATEMENT CREATE (t:test {prop: 792249}); +---- ok +-STATEMENT CREATE (t:test {prop: 263404}); +---- ok +-STATEMENT CREATE (t:test {prop: 277599}); +---- ok +-STATEMENT CREATE (t:test {prop: 965770}); +---- ok +-STATEMENT CREATE (t:test {prop: 442886}); +---- ok +-STATEMENT CREATE (t:test {prop: 349963}); +---- ok +-STATEMENT CREATE (t:test {prop: 156077}); +---- ok +-STATEMENT CREATE (t:test {prop: 624971}); +---- ok +-STATEMENT CREATE (t:test {prop: 939743}); +---- ok +-STATEMENT CREATE (t:test {prop: 913488}); +---- ok +-STATEMENT CREATE (t:test {prop: 249028}); +---- ok +-STATEMENT CREATE (t:test {prop: 443040}); +---- ok +-STATEMENT CREATE (t:test {prop: 371436}); +---- ok +-STATEMENT CREATE (t:test {prop: 291466}); +---- ok +-STATEMENT CREATE (t:test {prop: 25152}); +---- ok +-STATEMENT CREATE (t:test {prop: 396648}); +---- ok +-STATEMENT CREATE (t:test {prop: 74814}); +---- ok +-STATEMENT CREATE (t:test {prop: 898604}); +---- ok +-STATEMENT CREATE (t:test {prop: 367822}); +---- ok +-STATEMENT CREATE (t:test {prop: 421116}); +---- ok +-STATEMENT CREATE (t:test {prop: 90861}); +---- ok +-STATEMENT CREATE (t:test {prop: 552260}); +---- ok +-STATEMENT CREATE (t:test {prop: 306592}); +---- ok +-STATEMENT CREATE (t:test {prop: 249186}); +---- ok +-STATEMENT CREATE (t:test {prop: 480296}); +---- ok +-STATEMENT CREATE (t:test {prop: 436015}); +---- ok +-STATEMENT CREATE (t:test {prop: 525944}); +---- ok +-STATEMENT CREATE (t:test {prop: 434242}); +---- ok +-STATEMENT CREATE (t:test {prop: 506023}); +---- ok +-STATEMENT CREATE (t:test {prop: 316835}); +---- ok +-STATEMENT CREATE (t:test {prop: 619723}); +---- ok +-STATEMENT CREATE (t:test {prop: 277446}); +---- ok +-STATEMENT CREATE (t:test {prop: 551796}); +---- ok +-STATEMENT CREATE (t:test {prop: 289691}); +---- ok +-STATEMENT CREATE (t:test {prop: 258101}); +---- ok +-STATEMENT CREATE (t:test {prop: 899767}); +---- ok +-STATEMENT CREATE (t:test {prop: 442455}); +---- ok +-STATEMENT CREATE (t:test {prop: 369453}); +---- ok +-STATEMENT CREATE (t:test {prop: 988196}); +---- ok +-STATEMENT CREATE (t:test {prop: 631179}); +---- ok +-STATEMENT CREATE (t:test {prop: 876816}); +---- ok +-STATEMENT CREATE (t:test {prop: 543841}); +---- ok +-STATEMENT CREATE (t:test {prop: 914452}); +---- ok +-STATEMENT CREATE (t:test {prop: 353847}); +---- ok +-STATEMENT CREATE (t:test {prop: 240874}); +---- ok +-STATEMENT CREATE (t:test {prop: 686283}); +---- ok +-STATEMENT CREATE (t:test {prop: 10911}); +---- ok +-STATEMENT CREATE (t:test {prop: 27594}); +---- ok +-STATEMENT CREATE (t:test {prop: 637527}); +---- ok +-STATEMENT CREATE (t:test {prop: 919112}); +---- ok +-STATEMENT CREATE (t:test {prop: 887906}); +---- ok +-STATEMENT CREATE (t:test {prop: 837937}); +---- ok +-STATEMENT CREATE (t:test {prop: 273186}); +---- ok +-STATEMENT CREATE (t:test {prop: 712313}); +---- ok +-STATEMENT CREATE (t:test {prop: 663586}); +---- ok +-STATEMENT CREATE (t:test {prop: 626363}); +---- ok +-STATEMENT CREATE (t:test {prop: 705011}); +---- ok +-STATEMENT CREATE (t:test {prop: 39274}); +---- ok +-STATEMENT CREATE (t:test {prop: 782612}); +---- ok +-STATEMENT CREATE (t:test {prop: 948974}); +---- ok +-STATEMENT CREATE (t:test {prop: 330773}); +---- ok +-STATEMENT CREATE (t:test {prop: 634245}); +---- ok +-STATEMENT CREATE (t:test {prop: 488152}); +---- ok +-STATEMENT CREATE (t:test {prop: 565608}); +---- ok +-STATEMENT CREATE (t:test {prop: 104884}); +---- ok +-STATEMENT CREATE (t:test {prop: 304718}); +---- ok +-STATEMENT CREATE (t:test {prop: 294729}); +---- ok +-STATEMENT CREATE (t:test {prop: 413059}); +---- ok +-STATEMENT CREATE (t:test {prop: 454858}); +---- ok +-STATEMENT CREATE (t:test {prop: 883765}); +---- ok +-STATEMENT CREATE (t:test {prop: 257401}); +---- ok +-STATEMENT CREATE (t:test {prop: 823353}); +---- ok +-STATEMENT CREATE (t:test {prop: 646587}); +---- ok +-STATEMENT CREATE (t:test {prop: 864161}); +---- ok +-STATEMENT CREATE (t:test {prop: 451670}); +---- ok +-STATEMENT CREATE (t:test {prop: 921618}); +---- ok +-STATEMENT CREATE (t:test {prop: 136938}); +---- ok +-STATEMENT CREATE (t:test {prop: 564986}); +---- ok +-STATEMENT CREATE (t:test {prop: 923248}); +---- ok +-STATEMENT CREATE (t:test {prop: 825987}); +---- ok +-STATEMENT CREATE (t:test {prop: 779708}); +---- ok +-STATEMENT CREATE (t:test {prop: 707009}); +---- ok +-STATEMENT CREATE (t:test {prop: 170812}); +---- ok +-STATEMENT CREATE (t:test {prop: 822187}); +---- ok +-STATEMENT CREATE (t:test {prop: 248719}); +---- ok +-STATEMENT CREATE (t:test {prop: 565302}); +---- ok +-STATEMENT CREATE (t:test {prop: 804908}); +---- ok +-STATEMENT CREATE (t:test {prop: 684298}); +---- ok +-STATEMENT CREATE (t:test {prop: 468716}); +---- ok +-STATEMENT CREATE (t:test {prop: 883384}); +---- ok +-STATEMENT CREATE (t:test {prop: 953611}); +---- ok +-STATEMENT CREATE (t:test {prop: 801503}); +---- ok +-STATEMENT CREATE (t:test {prop: 866779}); +---- ok +-STATEMENT CREATE (t:test {prop: 972954}); +---- ok +-STATEMENT CREATE (t:test {prop: 69409}); +---- ok +-STATEMENT CREATE (t:test {prop: 661058}); +---- ok +-STATEMENT CREATE (t:test {prop: 126298}); +---- ok +-STATEMENT CREATE (t:test {prop: 701204}); +---- ok +-STATEMENT CREATE (t:test {prop: 155360}); +---- ok +-STATEMENT CREATE (t:test {prop: 27939}); +---- ok +-STATEMENT CREATE (t:test {prop: 878090}); +---- ok +-STATEMENT CREATE (t:test {prop: 695907}); +---- ok +-STATEMENT CREATE (t:test {prop: 551492}); +---- ok +-STATEMENT CREATE (t:test {prop: 935417}); +---- ok +-STATEMENT CREATE (t:test {prop: 856009}); +---- ok +-STATEMENT CREATE (t:test {prop: 623929}); +---- ok +-STATEMENT CREATE (t:test {prop: 628419}); +---- ok +-STATEMENT CREATE (t:test {prop: 148618}); +---- ok +-STATEMENT CREATE (t:test {prop: 167532}); +---- ok +-STATEMENT CREATE (t:test {prop: 663961}); +---- ok +-STATEMENT CREATE (t:test {prop: 329480}); +---- ok +-STATEMENT CREATE (t:test {prop: 150811}); +---- ok +-STATEMENT CREATE (t:test {prop: 664608}); +---- ok +-STATEMENT CREATE (t:test {prop: 425602}); +---- ok +-STATEMENT CREATE (t:test {prop: 431326}); +---- ok +-STATEMENT CREATE (t:test {prop: 217996}); +---- ok +-STATEMENT CREATE (t:test {prop: 679750}); +---- ok +-STATEMENT CREATE (t:test {prop: 672772}); +---- ok +-STATEMENT CREATE (t:test {prop: 510352}); +---- ok +-STATEMENT CREATE (t:test {prop: 887155}); +---- ok +-STATEMENT CREATE (t:test {prop: 522556}); +---- ok +-STATEMENT CREATE (t:test {prop: 517773}); +---- ok +-STATEMENT CREATE (t:test {prop: 707106}); +---- ok +-STATEMENT CREATE (t:test {prop: 183905}); +---- ok +-STATEMENT CREATE (t:test {prop: 830418}); +---- ok +-STATEMENT CREATE (t:test {prop: 264184}); +---- ok +-STATEMENT CREATE (t:test {prop: 75642}); +---- ok +-STATEMENT CREATE (t:test {prop: 158345}); +---- ok +-STATEMENT CREATE (t:test {prop: 826090}); +---- ok +-STATEMENT CREATE (t:test {prop: 53203}); +---- ok +-STATEMENT CREATE (t:test {prop: 279764}); +---- ok +-STATEMENT CREATE (t:test {prop: 599579}); +---- ok +-STATEMENT CREATE (t:test {prop: 276985}); +---- ok +-STATEMENT CREATE (t:test {prop: 864896}); +---- ok +-STATEMENT CREATE (t:test {prop: 173288}); +---- ok +-STATEMENT CREATE (t:test {prop: 36100}); +---- ok +-STATEMENT CREATE (t:test {prop: 279540}); +---- ok +-STATEMENT CREATE (t:test {prop: 364667}); +---- ok +-STATEMENT CREATE (t:test {prop: 524855}); +---- ok +-STATEMENT CREATE (t:test {prop: 257979}); +---- ok +-STATEMENT CREATE (t:test {prop: 824244}); +---- ok +-STATEMENT CREATE (t:test {prop: 559877}); +---- ok +-STATEMENT CREATE (t:test {prop: 144228}); +---- ok +-STATEMENT CREATE (t:test {prop: 851618}); +---- ok +-STATEMENT CREATE (t:test {prop: 127549}); +---- ok +-STATEMENT CREATE (t:test {prop: 526554}); +---- ok +-STATEMENT CREATE (t:test {prop: 667291}); +---- ok +-STATEMENT CREATE (t:test {prop: 621470}); +---- ok +-STATEMENT CREATE (t:test {prop: 108022}); +---- ok +-STATEMENT CREATE (t:test {prop: 338715}); +---- ok +-STATEMENT CREATE (t:test {prop: 948603}); +---- ok +-STATEMENT CREATE (t:test {prop: 620917}); +---- ok +-STATEMENT CREATE (t:test {prop: 49011}); +---- ok +-STATEMENT CREATE (t:test {prop: 724736}); +---- ok +-STATEMENT CREATE (t:test {prop: 419132}); +---- ok +-STATEMENT CREATE (t:test {prop: 288031}); +---- ok +-STATEMENT CREATE (t:test {prop: 198678}); +---- ok +-STATEMENT CREATE (t:test {prop: 91220}); +---- ok +-STATEMENT CREATE (t:test {prop: 349613}); +---- ok +-STATEMENT CREATE (t:test {prop: 725591}); +---- ok +-STATEMENT CREATE (t:test {prop: 530772}); +---- ok +-STATEMENT CREATE (t:test {prop: 591822}); +---- ok +-STATEMENT CREATE (t:test {prop: 960744}); +---- ok +-STATEMENT CREATE (t:test {prop: 967891}); +---- ok +-STATEMENT CREATE (t:test {prop: 338187}); +---- ok +-STATEMENT CREATE (t:test {prop: 966181}); +---- ok +-STATEMENT CREATE (t:test {prop: 124427}); +---- ok +-STATEMENT CREATE (t:test {prop: 48942}); +---- ok +-STATEMENT CREATE (t:test {prop: 180623}); +---- ok +-STATEMENT CREATE (t:test {prop: 537536}); +---- ok +-STATEMENT CREATE (t:test {prop: 603791}); +---- ok +-STATEMENT CREATE (t:test {prop: 793167}); +---- ok +-STATEMENT CREATE (t:test {prop: 889552}); +---- ok +-STATEMENT CREATE (t:test {prop: 957908}); +---- ok +-STATEMENT CREATE (t:test {prop: 80664}); +---- ok +-STATEMENT CREATE (t:test {prop: 620374}); +---- ok +-STATEMENT CREATE (t:test {prop: 112066}); +---- ok +-STATEMENT CREATE (t:test {prop: 420270}); +---- ok +-STATEMENT CREATE (t:test {prop: 971124}); +---- ok +-STATEMENT CREATE (t:test {prop: 532581}); +---- ok +-STATEMENT CREATE (t:test {prop: 606271}); +---- ok +-STATEMENT CREATE (t:test {prop: 398544}); +---- ok +-STATEMENT CREATE (t:test {prop: 463913}); +---- ok +-STATEMENT CREATE (t:test {prop: 756463}); +---- ok +-STATEMENT CREATE (t:test {prop: 765818}); +---- ok +-STATEMENT CREATE (t:test {prop: 470133}); +---- ok +-STATEMENT CREATE (t:test {prop: 656532}); +---- ok +-STATEMENT CREATE (t:test {prop: 282433}); +---- ok +-STATEMENT CREATE (t:test {prop: 290273}); +---- ok +-STATEMENT CREATE (t:test {prop: 185429}); +---- ok +-STATEMENT CREATE (t:test {prop: 762810}); +---- ok +-STATEMENT CREATE (t:test {prop: 805397}); +---- ok +-STATEMENT CREATE (t:test {prop: 808752}); +---- ok +-STATEMENT CREATE (t:test {prop: 297604}); +---- ok +-STATEMENT CREATE (t:test {prop: 850409}); +---- ok +-STATEMENT CREATE (t:test {prop: 946733}); +---- ok +-STATEMENT CREATE (t:test {prop: 689146}); +---- ok +-STATEMENT CREATE (t:test {prop: 152873}); +---- ok +-STATEMENT CREATE (t:test {prop: 831910}); +---- ok +-STATEMENT CREATE (t:test {prop: 755255}); +---- ok +-STATEMENT CREATE (t:test {prop: 445848}); +---- ok +-STATEMENT CREATE (t:test {prop: 489944}); +---- ok +-STATEMENT CREATE (t:test {prop: 413354}); +---- ok +-STATEMENT CREATE (t:test {prop: 587406}); +---- ok +-STATEMENT CREATE (t:test {prop: 128776}); +---- ok +-STATEMENT CREATE (t:test {prop: 705954}); +---- ok +-STATEMENT CREATE (t:test {prop: 535802}); +---- ok +-STATEMENT CREATE (t:test {prop: 524721}); +---- ok +-STATEMENT CREATE (t:test {prop: 969901}); +---- ok +-STATEMENT CREATE (t:test {prop: 653405}); +---- ok +-STATEMENT CREATE (t:test {prop: 85666}); +---- ok +-STATEMENT CREATE (t:test {prop: 936005}); +---- ok +-STATEMENT CREATE (t:test {prop: 828195}); +---- ok +-STATEMENT CREATE (t:test {prop: 9026}); +---- ok +-STATEMENT CREATE (t:test {prop: 370003}); +---- ok +-STATEMENT CREATE (t:test {prop: 905336}); +---- ok +-STATEMENT CREATE (t:test {prop: 911382}); +---- ok +-STATEMENT CREATE (t:test {prop: 333157}); +---- ok +-STATEMENT CREATE (t:test {prop: 969664}); +---- ok +-STATEMENT CREATE (t:test {prop: 938396}); +---- ok +-STATEMENT CREATE (t:test {prop: 81915}); +---- ok +-STATEMENT CREATE (t:test {prop: 337138}); +---- ok +-STATEMENT CREATE (t:test {prop: 297662}); +---- ok +-STATEMENT CREATE (t:test {prop: 898350}); +---- ok +-STATEMENT CREATE (t:test {prop: 233507}); +---- ok +-STATEMENT CREATE (t:test {prop: 337548}); +---- ok +-STATEMENT CREATE (t:test {prop: 28481}); +---- ok +-STATEMENT CREATE (t:test {prop: 825971}); +---- ok +-STATEMENT CREATE (t:test {prop: 935738}); +---- ok +-STATEMENT CREATE (t:test {prop: 479095}); +---- ok +-STATEMENT CREATE (t:test {prop: 156655}); +---- ok +-STATEMENT CREATE (t:test {prop: 447130}); +---- ok +-STATEMENT CREATE (t:test {prop: 238102}); +---- ok +-STATEMENT CREATE (t:test {prop: 522907}); +---- ok +-STATEMENT CREATE (t:test {prop: 913621}); +---- ok +-STATEMENT CREATE (t:test {prop: 28027}); +---- ok +-STATEMENT CREATE (t:test {prop: 829107}); +---- ok +-STATEMENT CREATE (t:test {prop: 660678}); +---- ok +-STATEMENT CREATE (t:test {prop: 77222}); +---- ok +-STATEMENT CREATE (t:test {prop: 637879}); +---- ok +-STATEMENT CREATE (t:test {prop: 516013}); +---- ok +-STATEMENT CREATE (t:test {prop: 730340}); +---- ok +-STATEMENT CREATE (t:test {prop: 634902}); +---- ok +-STATEMENT CREATE (t:test {prop: 472497}); +---- ok +-STATEMENT CREATE (t:test {prop: 264664}); +---- ok +-STATEMENT CREATE (t:test {prop: 792190}); +---- ok +-STATEMENT CREATE (t:test {prop: 525298}); +---- ok +-STATEMENT CREATE (t:test {prop: 576861}); +---- ok +-STATEMENT CREATE (t:test {prop: 153680}); +---- ok +-STATEMENT CREATE (t:test {prop: 403722}); +---- ok +-STATEMENT CREATE (t:test {prop: 587637}); +---- ok +-STATEMENT CREATE (t:test {prop: 138366}); +---- ok +-STATEMENT CREATE (t:test {prop: 392685}); +---- ok +-STATEMENT CREATE (t:test {prop: 328420}); +---- ok +-STATEMENT CREATE (t:test {prop: 378700}); +---- ok +-STATEMENT CREATE (t:test {prop: 145425}); +---- ok +-STATEMENT CREATE (t:test {prop: 569065}); +---- ok +-STATEMENT CREATE (t:test {prop: 746558}); +---- ok +-STATEMENT CREATE (t:test {prop: 815737}); +---- ok +-STATEMENT CREATE (t:test {prop: 874755}); +---- ok +-STATEMENT CREATE (t:test {prop: 267972}); +---- ok +-STATEMENT CREATE (t:test {prop: 898635}); +---- ok +-STATEMENT CREATE (t:test {prop: 981082}); +---- ok +-STATEMENT CREATE (t:test {prop: 125680}); +---- ok +-STATEMENT CREATE (t:test {prop: 270386}); +---- ok +-STATEMENT CREATE (t:test {prop: 805762}); +---- ok +-STATEMENT CREATE (t:test {prop: 498413}); +---- ok +-STATEMENT CREATE (t:test {prop: 407375}); +---- ok +-STATEMENT CREATE (t:test {prop: 373157}); +---- ok +-STATEMENT CREATE (t:test {prop: 16370}); +---- ok +-STATEMENT CREATE (t:test {prop: 729287}); +---- ok +-STATEMENT CREATE (t:test {prop: 829570}); +---- ok +-STATEMENT CREATE (t:test {prop: 644381}); +---- ok +-STATEMENT CREATE (t:test {prop: 515351}); +---- ok +-STATEMENT CREATE (t:test {prop: 564057}); +---- ok +-STATEMENT CREATE (t:test {prop: 56987}); +---- ok +-STATEMENT CREATE (t:test {prop: 277626}); +---- ok +-STATEMENT CREATE (t:test {prop: 765395}); +---- ok +-STATEMENT CREATE (t:test {prop: 224997}); +---- ok +-STATEMENT CREATE (t:test {prop: 989916}); +---- ok +-STATEMENT CREATE (t:test {prop: 40598}); +---- ok +-STATEMENT CREATE (t:test {prop: 950712}); +---- ok +-STATEMENT CREATE (t:test {prop: 780027}); +---- ok +-STATEMENT CREATE (t:test {prop: 933336}); +---- ok +-STATEMENT CREATE (t:test {prop: 679841}); +---- ok +-STATEMENT CREATE (t:test {prop: 202955}); +---- ok +-STATEMENT CREATE (t:test {prop: 587949}); +---- ok +-STATEMENT CREATE (t:test {prop: 931835}); +---- ok +-STATEMENT CREATE (t:test {prop: 382848}); +---- ok +-STATEMENT CREATE (t:test {prop: 207304}); +---- ok +-STATEMENT CREATE (t:test {prop: 266080}); +---- ok +-STATEMENT CREATE (t:test {prop: 36132}); +---- ok +-STATEMENT CREATE (t:test {prop: 548226}); +---- ok +-STATEMENT CREATE (t:test {prop: 285597}); +---- ok +-STATEMENT CREATE (t:test {prop: 161323}); +---- ok +-STATEMENT CREATE (t:test {prop: 573711}); +---- ok +-STATEMENT CREATE (t:test {prop: 690505}); +---- ok +-STATEMENT CREATE (t:test {prop: 119956}); +---- ok +-STATEMENT CREATE (t:test {prop: 330611}); +---- ok +-STATEMENT CREATE (t:test {prop: 943669}); +---- ok +-STATEMENT CREATE (t:test {prop: 489704}); +---- ok +-STATEMENT CREATE (t:test {prop: 794946}); +---- ok +-STATEMENT CREATE (t:test {prop: 577563}); +---- ok +-STATEMENT CREATE (t:test {prop: 512300}); +---- ok +-STATEMENT CREATE (t:test {prop: 570799}); +---- ok +-STATEMENT CREATE (t:test {prop: 195906}); +---- ok +-STATEMENT CREATE (t:test {prop: 319414}); +---- ok +-STATEMENT CREATE (t:test {prop: 724702}); +---- ok +-STATEMENT CREATE (t:test {prop: 625522}); +---- ok +-STATEMENT CREATE (t:test {prop: 307766}); +---- ok +-STATEMENT CREATE (t:test {prop: 179447}); +---- ok +-STATEMENT CREATE (t:test {prop: 334245}); +---- ok +-STATEMENT CREATE (t:test {prop: 260494}); +---- ok +-STATEMENT CREATE (t:test {prop: 792524}); +---- ok +-STATEMENT CREATE (t:test {prop: 232508}); +---- ok +-STATEMENT CREATE (t:test {prop: 245971}); +---- ok +-STATEMENT CREATE (t:test {prop: 499139}); +---- ok +-STATEMENT CREATE (t:test {prop: 311007}); +---- ok +-STATEMENT CREATE (t:test {prop: 195960}); +---- ok +-STATEMENT CREATE (t:test {prop: 794317}); +---- ok +-STATEMENT CREATE (t:test {prop: 760389}); +---- ok +-STATEMENT CREATE (t:test {prop: 16392}); +---- ok +-STATEMENT CREATE (t:test {prop: 687863}); +---- ok +-STATEMENT CREATE (t:test {prop: 440770}); +---- ok +-STATEMENT CREATE (t:test {prop: 160488}); +---- ok +-STATEMENT CREATE (t:test {prop: 471704}); +---- ok +-STATEMENT CREATE (t:test {prop: 822058}); +---- ok +-STATEMENT CREATE (t:test {prop: 450933}); +---- ok +-STATEMENT CREATE (t:test {prop: 183194}); +---- ok +-STATEMENT CREATE (t:test {prop: 590748}); +---- ok +-STATEMENT CREATE (t:test {prop: 828685}); +---- ok +-STATEMENT CREATE (t:test {prop: 383426}); +---- ok +-STATEMENT MATCH (t:test) RETURN SUM(t.prop); +---- 1 +5019488576 From efdc1e4797d81a33f76374f9a62748185c373fda Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Mon, 18 Mar 2024 15:37:39 -0400 Subject: [PATCH 052/136] Refactor arithmetic functions --- .../bind_function_expression.cpp | 5 +- .../catalog_entry/rel_table_catalog_entry.cpp | 2 + .../scalar_function_catalog_entry.cpp | 4 + src/function/CMakeLists.txt | 1 + src/function/built_in_function_utils.cpp | 98 +----- src/function/function_collection.cpp | 46 +++ src/function/pattern/id_function.cpp | 1 + src/function/vector_arithmetic_functions.cpp | 303 ++++++++++++------ src/function/vector_blob_functions.cpp | 1 + src/function/vector_date_functions.cpp | 1 + src/function/vector_map_functions.cpp | 1 + src/function/vector_node_rel_functions.cpp | 2 + src/function/vector_path_functions.cpp | 1 + src/function/vector_rdf_functions.cpp | 1 + src/function/vector_timestamp_functions.cpp | 1 + src/function/vector_union_functions.cpp | 1 + src/function/vector_uuid_functions.cpp | 1 + .../binder/copy/bound_export_database.h | 1 + .../catalog_entry/function_catalog_entry.h | 2 +- .../scalar_function_catalog_entry.h | 1 + src/include/common/enums/expression_type.h | 44 --- .../arithmetic/vector_arithmetic_functions.h | 207 +++++------- .../function/blob/vector_blob_functions.h | 2 +- .../function/built_in_function_utils.h | 5 +- .../function/date/vector_date_functions.h | 2 +- src/include/function/function.h | 1 + src/include/function/function_collection.h | 19 ++ .../function/map/vector_map_functions.h | 2 +- .../function/path/vector_path_functions.h | 3 +- .../function/rdf/vector_rdf_functions.h | 2 +- src/include/function/scalar_function.h | 1 - .../schema/vector_node_rel_functions.h | 4 +- src/include/function/table/call_functions.h | 2 +- .../timestamp/vector_timestamp_functions.h | 2 +- .../function/union/vector_union_functions.h | 3 +- .../function/uuid/vector_uuid_functions.h | 2 +- src/include/main/client_context.h | 2 +- .../reader/csv/parallel_csv_reader.h | 2 +- .../persistent/reader/csv/serial_csv_reader.h | 2 +- .../persistent/reader/npy/npy_reader.h | 2 +- .../reader/parquet/parquet_reader.h | 2 +- .../operator/persistent/reader/rdf/rdf_scan.h | 2 +- .../table_scan/ftable_scan_function.h | 2 +- src/parser/transform/transform_expression.cpp | 16 +- .../operator/persistent/export_db.cpp | 1 + 45 files changed, 428 insertions(+), 378 deletions(-) create mode 100644 src/function/function_collection.cpp create mode 100644 src/include/function/function_collection.h diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index 88ebe21f242..6e7f6c191a8 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -4,6 +4,7 @@ #include "binder/expression/property_expression.h" #include "binder/expression_binder.h" #include "common/exception/binder.h" +#include "function/arithmetic/vector_arithmetic_functions.h" #include "function/rewrite_function.h" #include "function/schema/vector_label_functions.h" #include "main/client_context.h" @@ -323,12 +324,12 @@ std::shared_ptr ExpressionBinder::bindRecursiveJoinLengthFunction( children.push_back(std::move(numRelsExpression)); children.push_back( ku_dynamic_cast(*recursiveRels[0]).getLengthExpression()); - auto result = bindScalarFunctionExpression(children, ADD_FUNC_NAME); + auto result = bindScalarFunctionExpression(children, AddFunction::name); for (auto i = 1u; i < recursiveRels.size(); ++i) { children[0] = std::move(result); children[1] = ku_dynamic_cast(*recursiveRels[i]) .getLengthExpression(); - result = bindScalarFunctionExpression(children, ADD_FUNC_NAME); + result = bindScalarFunctionExpression(children, AddFunction::name); } return result; } else if (ExpressionUtil::isRecursiveRelPattern(expression)) { diff --git a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp index cf3d4a75ffd..a1198605295 100644 --- a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp @@ -1,5 +1,7 @@ #include "catalog/catalog_entry/rel_table_catalog_entry.h" +#include + #include "catalog/catalog.h" using namespace kuzu::common; diff --git a/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp b/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp index de921bda66d..e7988a2ba07 100644 --- a/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +++ b/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp @@ -5,6 +5,10 @@ namespace kuzu { namespace catalog { +ScalarFunctionCatalogEntry::ScalarFunctionCatalogEntry( + const char* name, function::function_set functionSet) + : ScalarFunctionCatalogEntry{std::string{name}, std::move(functionSet)} {} + ScalarFunctionCatalogEntry::ScalarFunctionCatalogEntry( std::string name, function::function_set functionSet) : FunctionCatalogEntry{ diff --git a/src/function/CMakeLists.txt b/src/function/CMakeLists.txt index 55368d89150..8751c231461 100644 --- a/src/function/CMakeLists.txt +++ b/src/function/CMakeLists.txt @@ -13,6 +13,7 @@ add_library(kuzu_function cast_from_string_functions.cpp comparison_functions.cpp find_function.cpp + function_collection.cpp scalar_macro_function.cpp vector_arithmetic_functions.cpp vector_boolean_functions.cpp diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 0cd5b744d0c..8f5be99ddbc 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -15,6 +15,7 @@ #include "function/cast/vector_cast_functions.h" #include "function/comparison/vector_comparison_functions.h" #include "function/date/vector_date_functions.h" +#include "function/function_collection.h" #include "function/interval/vector_interval_functions.h" #include "function/list/vector_list_functions.h" #include "function/map/vector_map_functions.h" @@ -52,11 +53,12 @@ void BuiltInFunctionsUtils::createFunctions(CatalogSet* catalogSet) { registerScalarFunctions(catalogSet); registerAggregateFunctions(catalogSet); registerTableFunctions(catalogSet); + + registerFunctions(catalogSet); } void BuiltInFunctionsUtils::registerScalarFunctions(CatalogSet* catalogSet) { registerComparisonFunctions(catalogSet); - registerArithmeticFunctions(catalogSet); registerDateFunctions(catalogSet); registerTimestampFunctions(catalogSet); registerIntervalFunctions(catalogSet); @@ -514,7 +516,7 @@ void BuiltInFunctionsUtils::validateSpecialCases(std::vector& candida const std::string& name, const std::vector& inputTypes, function::function_set& set) { // special case for add func - if (name == ADD_FUNC_NAME) { + if (name == AddFunction::name) { auto targetType0 = candidateFunctions[0]->parameterTypeIDs[0]; auto targetType1 = candidateFunctions[0]->parameterTypeIDs[1]; auto inputType0 = inputTypes[0].getLogicalTypeID(); @@ -551,89 +553,6 @@ void BuiltInFunctionsUtils::registerComparisonFunctions(CatalogSet* catalogSet) LESS_THAN_EQUALS_FUNC_NAME, LessThanEqualsFunction::getFunctionSet())); } -void BuiltInFunctionsUtils::registerArithmeticFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry( - std::make_unique(ADD_FUNC_NAME, AddFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SUBTRACT_FUNC_NAME, SubtractFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MULTIPLY_FUNC_NAME, MultiplyFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DIVIDE_FUNC_NAME, DivideFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MODULO_FUNC_NAME, ModuloFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - POWER_FUNC_NAME, PowerFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(ABS_FUNC_NAME, AbsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ACOS_FUNC_NAME, AcosFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ASIN_FUNC_NAME, AsinFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ATAN_FUNC_NAME, AtanFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ATAN2_FUNC_NAME, Atan2Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - BITWISE_XOR_FUNC_NAME, BitwiseXorFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - BITWISE_AND_FUNC_NAME, BitwiseAndFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - BITWISE_OR_FUNC_NAME, BitwiseOrFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - BITSHIFT_LEFT_FUNC_NAME, BitShiftLeftFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - BITSHIFT_RIGHT_FUNC_NAME, BitShiftRightFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CBRT_FUNC_NAME, CbrtFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CEIL_FUNC_NAME, CeilFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CEILING_FUNC_NAME, CeilFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(COS_FUNC_NAME, CosFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(COT_FUNC_NAME, CotFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DEGREES_FUNC_NAME, DegreesFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - EVEN_FUNC_NAME, EvenFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - FACTORIAL_FUNC_NAME, FactorialFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - FLOOR_FUNC_NAME, FloorFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - GAMMA_FUNC_NAME, GammaFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LGAMMA_FUNC_NAME, LgammaFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(LN_FUNC_NAME, LnFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(LOG_FUNC_NAME, LogFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LOG2_FUNC_NAME, Log2Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LOG10_FUNC_NAME, LogFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - NEGATE_FUNC_NAME, NegateFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(PI_FUNC_NAME, PiFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - POW_FUNC_NAME, PowerFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - RADIANS_FUNC_NAME, RadiansFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ROUND_FUNC_NAME, RoundFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(SIN_FUNC_NAME, SinFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SIGN_FUNC_NAME, SignFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SQRT_FUNC_NAME, SqrtFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(TAN_FUNC_NAME, TanFunction::getFunctionSet())); -} - void BuiltInFunctionsUtils::registerDateFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( DATE_PART_FUNC_NAME, DatePartFunction::getFunctionSet())); @@ -1064,6 +983,15 @@ void BuiltInFunctionsUtils::registerTableFunctions(CatalogSet* catalogSet) { READ_FTABLE_FUNC_NAME, FTableScan::getFunctionSet())); } +void BuiltInFunctionsUtils::registerFunctions(catalog::CatalogSet* catalogSet) { + auto functions = FunctionCollection::getFunctions(); + for (auto i = 0u; functions[i].name != nullptr; ++i) { + auto functionSet = functions[i].getFunctionSetFunc(); + catalogSet->createEntry(std::make_unique( + functions[i].name, std::move(functionSet))); + } +} + static std::string getFunctionMatchFailureMsg(const std::string name, const std::vector& inputTypes, const std::string& supportedInputs, bool isDistinct = false) { diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp new file mode 100644 index 00000000000..26e6fd304f7 --- /dev/null +++ b/src/function/function_collection.cpp @@ -0,0 +1,46 @@ +#include "function/function_collection.h" + +#include "function/arithmetic/vector_arithmetic_functions.h" + +namespace kuzu { +namespace function { + +#define SCALAR_FUNCTION(_PARAM) \ + { _PARAM::name, _PARAM::getFunctionSet } +#define SCALAR_FUNCTION_ALIAS(_PARAM) \ + { _PARAM::alias, _PARAM::getFunctionSet } +#define FINAL_FUNCTION \ + { nullptr, nullptr } + +FunctionCollection* FunctionCollection::getFunctions() { + static FunctionCollection functions[] = { + + // Arithmetic Functions + SCALAR_FUNCTION(AddFunction), SCALAR_FUNCTION(SubtractFunction), + SCALAR_FUNCTION(MultiplyFunction), SCALAR_FUNCTION(DivideFunction), + SCALAR_FUNCTION(ModuloFunction), SCALAR_FUNCTION(PowerFunction), + SCALAR_FUNCTION(AbsFunction), SCALAR_FUNCTION(AcosFunction), SCALAR_FUNCTION(AsinFunction), + SCALAR_FUNCTION(AtanFunction), SCALAR_FUNCTION(Atan2Function), + SCALAR_FUNCTION(BitwiseXorFunction), SCALAR_FUNCTION(BitwiseAndFunction), + SCALAR_FUNCTION(BitwiseOrFunction), SCALAR_FUNCTION(BitShiftLeftFunction), + SCALAR_FUNCTION(BitShiftRightFunction), SCALAR_FUNCTION(CbrtFunction), + SCALAR_FUNCTION(CeilFunction), SCALAR_FUNCTION_ALIAS(CeilFunction), + SCALAR_FUNCTION(CosFunction), SCALAR_FUNCTION(CotFunction), + SCALAR_FUNCTION(DegreesFunction), SCALAR_FUNCTION(EvenFunction), + SCALAR_FUNCTION(FactorialFunction), SCALAR_FUNCTION(FloorFunction), + SCALAR_FUNCTION(GammaFunction), SCALAR_FUNCTION(LgammaFunction), + SCALAR_FUNCTION(LnFunction), SCALAR_FUNCTION(LogFunction), + SCALAR_FUNCTION_ALIAS(LogFunction), SCALAR_FUNCTION(Log2Function), + SCALAR_FUNCTION(NegateFunction), SCALAR_FUNCTION(PiFunction), + SCALAR_FUNCTION_ALIAS(PowerFunction), SCALAR_FUNCTION(RadiansFunction), + SCALAR_FUNCTION(RoundFunction), SCALAR_FUNCTION(SinFunction), SCALAR_FUNCTION(SignFunction), + SCALAR_FUNCTION(SqrtFunction), SCALAR_FUNCTION(TanFunction), + + // End of array + FINAL_FUNCTION}; + + return functions; +} + +} // namespace function +} // namespace kuzu diff --git a/src/function/pattern/id_function.cpp b/src/function/pattern/id_function.cpp index 3305f047d83..2a8dc679f11 100644 --- a/src/function/pattern/id_function.cpp +++ b/src/function/pattern/id_function.cpp @@ -2,6 +2,7 @@ #include "binder/expression/node_expression.h" #include "binder/expression/rel_expression.h" #include "binder/expression_binder.h" +#include "common/cast.h" #include "function/rewrite_function.h" #include "function/schema/vector_node_rel_functions.h" diff --git a/src/function/vector_arithmetic_functions.cpp b/src/function/vector_arithmetic_functions.cpp index 2fc12f016a1..f3e8e132b29 100644 --- a/src/function/vector_arithmetic_functions.cpp +++ b/src/function/vector_arithmetic_functions.cpp @@ -1,6 +1,7 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "common/types/date_t.h" +#include "common/types/int128_t.h" #include "common/types/interval_t.h" #include "common/types/timestamp_t.h" #include "function/arithmetic/abs.h" @@ -13,6 +14,7 @@ #include "function/arithmetic/subtract.h" #include "function/list/functions/list_concat_function.h" #include "function/list/vector_list_functions.h" +#include "function/scalar_function.h" #include "function/string/functions/concat_function.h" using namespace kuzu::common; @@ -20,50 +22,167 @@ using namespace kuzu::common; namespace kuzu { namespace function { +template +static void getUnaryExecFunc(LogicalTypeID operandTypeID, scalar_func_exec_t& func) { + switch (operandTypeID) { + case LogicalTypeID::SERIAL: + case LogicalTypeID::INT64: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::INT32: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::INT16: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::INT8: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::UINT64: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::UINT32: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::UINT16: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::UINT8: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::INT128: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::DOUBLE: { + func = ScalarFunction::UnaryExecFunction; + } break; + case LogicalTypeID::FLOAT: { + func = ScalarFunction::UnaryExecFunction; + } break; + default: + KU_UNREACHABLE; + } +} + +template +static void getBinaryExecFunc(LogicalTypeID operandTypeID, scalar_func_exec_t& func) { + switch (operandTypeID) { + case LogicalTypeID::SERIAL: + case LogicalTypeID::INT64: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::INT32: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::INT16: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::INT8: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::UINT64: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::UINT32: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::UINT16: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::UINT8: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::INT128: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::DOUBLE: { + func = ScalarFunction::BinaryExecFunction; + } break; + case LogicalTypeID::FLOAT: { + func = ScalarFunction::BinaryExecFunction; + } break; + default: + KU_UNREACHABLE; + } +} + +template +static std::unique_ptr getUnaryFunction( + std::string name, LogicalTypeID operandTypeID) { + function::scalar_func_exec_t execFunc; + getUnaryExecFunc(operandTypeID, execFunc); + return std::make_unique( + std::move(name), std::vector{operandTypeID}, operandTypeID, execFunc); +} + +template +static std::unique_ptr getUnaryFunction( + std::string name, LogicalTypeID operandTypeID, LogicalTypeID resultTypeID) { + return std::make_unique(std::move(name), + std::vector{operandTypeID}, resultTypeID, + ScalarFunction::UnaryExecFunction); +} + +template +static inline std::unique_ptr getBinaryFunction( + std::string name, LogicalTypeID operandTypeID) { + function::scalar_func_exec_t execFunc; + getBinaryExecFunc(operandTypeID, execFunc); + return std::make_unique(std::move(name), + std::vector{operandTypeID, operandTypeID}, operandTypeID, execFunc); +} + +template +static inline std::unique_ptr getBinaryFunction( + std::string name, LogicalTypeID operandTypeID, LogicalTypeID resultTypeID) { + return std::make_unique(std::move(name), + std::vector{operandTypeID, operandTypeID}, resultTypeID, + ScalarFunction::BinaryExecFunction); +} + function_set AddFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getBinaryFunction(ADD_FUNC_NAME, typeID)); + result.push_back(getBinaryFunction(name, typeID)); } // list + list -> list - result.push_back(std::make_unique(ADD_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, ScalarFunction::BinaryExecListStructFunction, nullptr, ListConcatFunction::bindFunc, false /* isVarlength*/)); // string + string -> string - result.push_back(std::make_unique(ADD_FUNC_NAME, - std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::STRING, - ScalarFunction::BinaryStringExecFunction)); + ScalarFunction::BinaryStringExecFunction)); // interval + interval → interval - result.push_back(ArithmeticFunction::getBinaryFunction( - ADD_FUNC_NAME, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); + result.push_back(getBinaryFunction( + name, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); // date + int → date - result.push_back(make_unique(ADD_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::INT64}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // int + date → date - result.push_back(make_unique(ADD_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::INT64, LogicalTypeID::DATE}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // date + interval → date - result.push_back(make_unique(ADD_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::INTERVAL}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // interval + date → date - result.push_back(make_unique(ADD_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::INTERVAL, LogicalTypeID::DATE}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // timestamp + interval → timestamp - result.push_back(make_unique(ADD_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); // interval + timestamp → timestamp - result.push_back(make_unique(ADD_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::INTERVAL, LogicalTypeID::TIMESTAMP}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); @@ -73,40 +192,38 @@ function_set AddFunction::getFunctionSet() { function_set SubtractFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - ArithmeticFunction::getBinaryFunction(SUBTRACT_FUNC_NAME, typeID)); + result.push_back(getBinaryFunction(name, typeID)); } // date - date → int64 - result.push_back(ArithmeticFunction::getBinaryFunction( - SUBTRACT_FUNC_NAME, LogicalTypeID::DATE, LogicalTypeID::INT64)); + result.push_back(getBinaryFunction( + name, LogicalTypeID::DATE, LogicalTypeID::INT64)); // date - integer → date - result.push_back(make_unique(SUBTRACT_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::INT64}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // date - interval → date - result.push_back(make_unique(SUBTRACT_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::INTERVAL}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // timestamp - timestamp → interval - result.push_back(ArithmeticFunction::getBinaryFunction( - SUBTRACT_FUNC_NAME, LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL)); + result.push_back(getBinaryFunction( + name, LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL)); // timestamp - interval → timestamp - result.push_back(make_unique(SUBTRACT_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); // interval - interval → interval - result.push_back(ArithmeticFunction::getBinaryFunction( - SUBTRACT_FUNC_NAME, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); + result.push_back(getBinaryFunction( + name, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); return result; } function_set MultiplyFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - ArithmeticFunction::getBinaryFunction(MULTIPLY_FUNC_NAME, typeID)); + result.push_back(getBinaryFunction(name, typeID)); } return result; } @@ -114,10 +231,10 @@ function_set MultiplyFunction::getFunctionSet() { function_set DivideFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getBinaryFunction(DIVIDE_FUNC_NAME, typeID)); + result.push_back(getBinaryFunction(name, typeID)); } // interval / int → interval - result.push_back(make_unique(DIVIDE_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::INTERVAL, LogicalTypeID::INT64}, LogicalTypeID::INTERVAL, ScalarFunction::BinaryExecFunction)); @@ -127,7 +244,7 @@ function_set DivideFunction::getFunctionSet() { function_set ModuloFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getBinaryFunction(MODULO_FUNC_NAME, typeID)); + result.push_back(getBinaryFunction(name, typeID)); } return result; } @@ -135,15 +252,15 @@ function_set ModuloFunction::getFunctionSet() { function_set PowerFunction::getFunctionSet() { function_set result; // double ^ double -> double - result.push_back(ArithmeticFunction::getBinaryFunction( - POWER_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getBinaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set NegateFunction::getFunctionSet() { function_set result; for (auto& typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getUnaryFunction(NEGATE_FUNC_NAME, typeID)); + result.push_back(getUnaryFunction(name, typeID)); } return result; } @@ -151,7 +268,7 @@ function_set NegateFunction::getFunctionSet() { function_set AbsFunction::getFunctionSet() { function_set result; for (auto& typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getUnaryFunction(ABS_FUNC_NAME, typeID)); + result.push_back(getUnaryFunction(name, typeID)); } return result; } @@ -159,7 +276,7 @@ function_set AbsFunction::getFunctionSet() { function_set FloorFunction::getFunctionSet() { function_set result; for (auto& typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getUnaryFunction(FLOOR_FUNC_NAME, typeID)); + result.push_back(getUnaryFunction(name, typeID)); } return result; } @@ -167,159 +284,159 @@ function_set FloorFunction::getFunctionSet() { function_set CeilFunction::getFunctionSet() { function_set result; for (auto& typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(ArithmeticFunction::getUnaryFunction(CEIL_FUNC_NAME, typeID)); + result.push_back(getUnaryFunction(name, typeID)); } return result; } function_set SinFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - SIN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set CosFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - COS_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set TanFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - TAN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set CotFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - COT_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set AsinFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - ASIN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set AcosFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - ACOS_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set AtanFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - ATAN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set FactorialFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(FACTORIAL_FUNC_NAME, - std::vector{LogicalTypeID::INT64}, LogicalTypeID::INT64, - ScalarFunction::UnaryExecFunction)); + result.push_back( + make_unique(name, std::vector{LogicalTypeID::INT64}, + LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction)); return result; } function_set SqrtFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - SQRT_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set CbrtFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - CBRT_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set GammaFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - GAMMA_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set LgammaFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - LGAMMA_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set LnFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - LN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set LogFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - LOG_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set Log2Function::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - LOG2_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set DegreesFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - DEGREES_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set RadiansFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - RADIANS_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set EvenFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - EVEN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set SignFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getUnaryFunction( - SIGN_FUNC_NAME, LogicalTypeID::INT64, LogicalTypeID::INT64)); - result.push_back(ArithmeticFunction::getUnaryFunction( - SIGN_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::INT64)); - result.push_back(ArithmeticFunction::getUnaryFunction( - SIGN_FUNC_NAME, LogicalTypeID::FLOAT, LogicalTypeID::INT64)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::INT64)); + result.push_back( + getUnaryFunction(name, LogicalTypeID::FLOAT, LogicalTypeID::INT64)); return result; } function_set Atan2Function::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getBinaryFunction( - ATAN2_FUNC_NAME, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); + result.push_back( + getBinaryFunction(name, LogicalTypeID::DOUBLE, LogicalTypeID::DOUBLE)); return result; } function_set RoundFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(ROUND_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DOUBLE, LogicalTypeID::INT64}, LogicalTypeID::DOUBLE, ScalarFunction::BinaryExecFunction)); return result; @@ -327,42 +444,42 @@ function_set RoundFunction::getFunctionSet() { function_set BitwiseXorFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getBinaryFunction( - BITWISE_XOR_FUNC_NAME, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back( + getBinaryFunction(name, LogicalTypeID::INT64, LogicalTypeID::INT64)); return result; } function_set BitwiseAndFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getBinaryFunction( - BITWISE_AND_FUNC_NAME, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back( + getBinaryFunction(name, LogicalTypeID::INT64, LogicalTypeID::INT64)); return result; } function_set BitwiseOrFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getBinaryFunction( - BITWISE_OR_FUNC_NAME, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back( + getBinaryFunction(name, LogicalTypeID::INT64, LogicalTypeID::INT64)); return result; } function_set BitShiftLeftFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getBinaryFunction( - BITSHIFT_LEFT_FUNC_NAME, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back( + getBinaryFunction(name, LogicalTypeID::INT64, LogicalTypeID::INT64)); return result; } function_set BitShiftRightFunction::getFunctionSet() { function_set result; - result.push_back(ArithmeticFunction::getBinaryFunction( - BITSHIFT_RIGHT_FUNC_NAME, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back(getBinaryFunction( + name, LogicalTypeID::INT64, LogicalTypeID::INT64)); return result; } function_set PiFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(PI_FUNC_NAME, std::vector{}, + result.push_back(make_unique(name, std::vector{}, LogicalTypeID::DOUBLE, ScalarFunction::ConstExecFunction)); return result; } diff --git a/src/function/vector_blob_functions.cpp b/src/function/vector_blob_functions.cpp index 4fd40c40f04..b86dd04df9a 100644 --- a/src/function/vector_blob_functions.cpp +++ b/src/function/vector_blob_functions.cpp @@ -3,6 +3,7 @@ #include "function/blob/functions/decode_function.h" #include "function/blob/functions/encode_function.h" #include "function/blob/functions/octet_length_function.h" +#include "function/scalar_function.h" using namespace kuzu::common; diff --git a/src/function/vector_date_functions.cpp b/src/function/vector_date_functions.cpp index 4e0e8d620f9..c3fa3c12b1f 100644 --- a/src/function/vector_date_functions.cpp +++ b/src/function/vector_date_functions.cpp @@ -1,6 +1,7 @@ #include "function/date/vector_date_functions.h" #include "function/date/date_functions.h" +#include "function/scalar_function.h" using namespace kuzu::common; diff --git a/src/function/vector_map_functions.cpp b/src/function/vector_map_functions.cpp index d1fd14190e6..ce71c11b32f 100644 --- a/src/function/vector_map_functions.cpp +++ b/src/function/vector_map_functions.cpp @@ -5,6 +5,7 @@ #include "function/map/functions/map_extract_function.h" #include "function/map/functions/map_keys_function.h" #include "function/map/functions/map_values_function.h" +#include "function/scalar_function.h" using namespace kuzu::common; diff --git a/src/function/vector_node_rel_functions.cpp b/src/function/vector_node_rel_functions.cpp index 41520b8ef4c..595f195b681 100644 --- a/src/function/vector_node_rel_functions.cpp +++ b/src/function/vector_node_rel_functions.cpp @@ -1,5 +1,7 @@ #include "function/schema/vector_node_rel_functions.h" +#include "function/scalar_function.h" + using namespace kuzu::common; namespace kuzu { diff --git a/src/function/vector_path_functions.cpp b/src/function/vector_path_functions.cpp index 2077e0cb448..cf207759d13 100644 --- a/src/function/vector_path_functions.cpp +++ b/src/function/vector_path_functions.cpp @@ -4,6 +4,7 @@ #include "common/exception/binder.h" #include "common/string_format.h" #include "function/path/path_function_executor.h" +#include "function/scalar_function.h" #include "function/struct/vector_struct_functions.h" using namespace kuzu::common; diff --git a/src/function/vector_rdf_functions.cpp b/src/function/vector_rdf_functions.cpp index 7ec759c0499..e72a811050e 100644 --- a/src/function/vector_rdf_functions.cpp +++ b/src/function/vector_rdf_functions.cpp @@ -1,6 +1,7 @@ #include "function/rdf/vector_rdf_functions.h" #include "function/rdf/rdf_functions.h" +#include "function/scalar_function.h" using namespace kuzu::common; diff --git a/src/function/vector_timestamp_functions.cpp b/src/function/vector_timestamp_functions.cpp index 5f160ca8a60..601b44053a2 100644 --- a/src/function/vector_timestamp_functions.cpp +++ b/src/function/vector_timestamp_functions.cpp @@ -1,5 +1,6 @@ #include "function/timestamp/vector_timestamp_functions.h" +#include "function/scalar_function.h" #include "function/timestamp/timestamp_function.h" using namespace kuzu::common; diff --git a/src/function/vector_union_functions.cpp b/src/function/vector_union_functions.cpp index 0c9b83b5586..33b6eefabb8 100644 --- a/src/function/vector_union_functions.cpp +++ b/src/function/vector_union_functions.cpp @@ -1,5 +1,6 @@ #include "function/union/vector_union_functions.h" +#include "function/scalar_function.h" #include "function/struct/vector_struct_functions.h" #include "function/union/functions/union_tag.h" diff --git a/src/function/vector_uuid_functions.cpp b/src/function/vector_uuid_functions.cpp index b8f6cc2ef88..f441d8310f1 100644 --- a/src/function/vector_uuid_functions.cpp +++ b/src/function/vector_uuid_functions.cpp @@ -1,5 +1,6 @@ #include "function/uuid/vector_uuid_functions.h" +#include "function/scalar_function.h" #include "function/uuid/functions/gen_random_uuid.h" using namespace kuzu::common; diff --git a/src/include/binder/copy/bound_export_database.h b/src/include/binder/copy/bound_export_database.h index 62653cd3708..6336ca47aba 100644 --- a/src/include/binder/copy/bound_export_database.h +++ b/src/include/binder/copy/bound_export_database.h @@ -2,6 +2,7 @@ #include "binder/binder.h" #include "binder/bound_statement.h" #include "binder/query/bound_regular_query.h" +#include "common/copier_config/csv_reader_config.h" #include "common/copier_config/reader_config.h" namespace kuzu { diff --git a/src/include/catalog/catalog_entry/function_catalog_entry.h b/src/include/catalog/catalog_entry/function_catalog_entry.h index 8c05b914bad..603ec3c5ce3 100644 --- a/src/include/catalog/catalog_entry/function_catalog_entry.h +++ b/src/include/catalog/catalog_entry/function_catalog_entry.h @@ -1,7 +1,7 @@ #pragma once #include "catalog_entry.h" -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace catalog { diff --git a/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h b/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h index 08d7d7da731..ea5eba833c2 100644 --- a/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h +++ b/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h @@ -11,6 +11,7 @@ class ScalarFunctionCatalogEntry final : public FunctionCatalogEntry { // constructors //===--------------------------------------------------------------------===// ScalarFunctionCatalogEntry() = default; + ScalarFunctionCatalogEntry(const char* name, function::function_set functionSet); ScalarFunctionCatalogEntry(std::string name, function::function_set functionSet); //===--------------------------------------------------------------------===// diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index 3cca4be2c09..df5e032bcf0 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -105,50 +105,6 @@ const char* const GREATER_THAN_EQUALS_FUNC_NAME = "GREATER_THAN_EQUALS"; const char* const LESS_THAN_FUNC_NAME = "LESS_THAN"; const char* const LESS_THAN_EQUALS_FUNC_NAME = "LESS_THAN_EQUALS"; -// arithmetics operators -const char* const ADD_FUNC_NAME = "+"; -const char* const SUBTRACT_FUNC_NAME = "-"; -const char* const MULTIPLY_FUNC_NAME = "*"; -const char* const DIVIDE_FUNC_NAME = "/"; -const char* const MODULO_FUNC_NAME = "%"; -const char* const POWER_FUNC_NAME = "^"; - -// arithmetics functions -const char* const ABS_FUNC_NAME = "ABS"; -const char* const ACOS_FUNC_NAME = "ACOS"; -const char* const ASIN_FUNC_NAME = "ASIN"; -const char* const ATAN_FUNC_NAME = "ATAN"; -const char* const ATAN2_FUNC_NAME = "ATAN2"; -const char* const BITWISE_XOR_FUNC_NAME = "BITWISE_XOR"; -const char* const BITWISE_AND_FUNC_NAME = "BITWISE_AND"; -const char* const BITWISE_OR_FUNC_NAME = "BITWISE_OR"; -const char* const BITSHIFT_LEFT_FUNC_NAME = "BITSHIFT_LEFT"; -const char* const BITSHIFT_RIGHT_FUNC_NAME = "BITSHIFT_RIGHT"; -const char* const CBRT_FUNC_NAME = "CBRT"; -const char* const CEIL_FUNC_NAME = "CEIL"; -const char* const CEILING_FUNC_NAME = "CEILING"; -const char* const COS_FUNC_NAME = "COS"; -const char* const COT_FUNC_NAME = "COT"; -const char* const DEGREES_FUNC_NAME = "DEGREES"; -const char* const EVEN_FUNC_NAME = "EVEN"; -const char* const FACTORIAL_FUNC_NAME = "FACTORIAL"; -const char* const FLOOR_FUNC_NAME = "FLOOR"; -const char* const GAMMA_FUNC_NAME = "GAMMA"; -const char* const LGAMMA_FUNC_NAME = "LGAMMA"; -const char* const LN_FUNC_NAME = "LN"; -const char* const LOG_FUNC_NAME = "LOG"; -const char* const LOG2_FUNC_NAME = "LOG2"; -const char* const LOG10_FUNC_NAME = "LOG10"; -const char* const NEGATE_FUNC_NAME = "NEGATE"; -const char* const PI_FUNC_NAME = "PI"; -const char* const POW_FUNC_NAME = "POW"; -const char* const RADIANS_FUNC_NAME = "RADIANS"; -const char* const ROUND_FUNC_NAME = "ROUND"; -const char* const SIN_FUNC_NAME = "SIN"; -const char* const SIGN_FUNC_NAME = "SIGN"; -const char* const SQRT_FUNC_NAME = "SQRT"; -const char* const TAN_FUNC_NAME = "TAN"; - // string const char* const ARRAY_EXTRACT_FUNC_NAME = "ARRAY_EXTRACT"; const char* const CONCAT_FUNC_NAME = "CONCAT"; diff --git a/src/include/function/arithmetic/vector_arithmetic_functions.h b/src/include/function/arithmetic/vector_arithmetic_functions.h index 862f9cb7899..2de1215a51e 100644 --- a/src/include/function/arithmetic/vector_arithmetic_functions.h +++ b/src/include/function/arithmetic/vector_arithmetic_functions.h @@ -1,280 +1,235 @@ #pragma once -#include "common/types/int128_t.h" -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { -struct ArithmeticFunction { - template - static std::unique_ptr getUnaryFunction( - std::string name, common::LogicalTypeID operandTypeID) { - function::scalar_func_exec_t execFunc; - getUnaryExecFunc(operandTypeID, execFunc); - return std::make_unique(std::move(name), - std::vector{operandTypeID}, operandTypeID, execFunc); - } - - template - static std::unique_ptr getUnaryFunction( - std::string name, common::LogicalTypeID operandTypeID, common::LogicalTypeID resultTypeID) { - return std::make_unique(std::move(name), - std::vector{operandTypeID}, resultTypeID, - ScalarFunction::UnaryExecFunction); - } - - template - static inline std::unique_ptr getBinaryFunction( - std::string name, common::LogicalTypeID operandTypeID) { - function::scalar_func_exec_t execFunc; - getBinaryExecFunc(operandTypeID, execFunc); - return std::make_unique(std::move(name), - std::vector{operandTypeID, operandTypeID}, operandTypeID, - execFunc); - } - - template - static inline std::unique_ptr getBinaryFunction( - std::string name, common::LogicalTypeID operandTypeID, common::LogicalTypeID resultTypeID) { - return std::make_unique(std::move(name), - std::vector{operandTypeID, operandTypeID}, resultTypeID, - ScalarFunction::BinaryExecFunction); - } - -private: - template - static void getUnaryExecFunc(common::LogicalTypeID operandTypeID, scalar_func_exec_t& func) { - switch (operandTypeID) { - case common::LogicalTypeID::SERIAL: - case common::LogicalTypeID::INT64: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::INT32: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::INT16: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::INT8: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::UINT64: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::UINT32: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::UINT16: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::UINT8: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::INT128: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::DOUBLE: { - func = ScalarFunction::UnaryExecFunction; - } break; - case common::LogicalTypeID::FLOAT: { - func = ScalarFunction::UnaryExecFunction; - } break; - default: - KU_UNREACHABLE; - } - } - - template - static void getBinaryExecFunc(common::LogicalTypeID operandTypeID, scalar_func_exec_t& func) { - switch (operandTypeID) { - case common::LogicalTypeID::SERIAL: - case common::LogicalTypeID::INT64: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::INT32: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::INT16: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::INT8: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::UINT64: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::UINT32: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::UINT16: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::UINT8: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::INT128: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::DOUBLE: { - func = ScalarFunction::BinaryExecFunction; - } break; - case common::LogicalTypeID::FLOAT: { - func = ScalarFunction::BinaryExecFunction; - } break; - default: - KU_UNREACHABLE; - } - } -}; - struct AddFunction { + static constexpr const char* name = "+"; + static function_set getFunctionSet(); }; struct SubtractFunction { + static constexpr const char* name = "-"; + static function_set getFunctionSet(); }; struct MultiplyFunction { + static constexpr const char* name = "*"; + static function_set getFunctionSet(); }; struct DivideFunction { + static constexpr const char* name = "/"; + static function_set getFunctionSet(); }; struct ModuloFunction { + static constexpr const char* name = "%"; + static function_set getFunctionSet(); }; struct PowerFunction { + static constexpr const char* name = "^"; + + static constexpr const char* alias = "POW"; + static function_set getFunctionSet(); }; struct AbsFunction { + static constexpr const char* name = "ABS"; + static function_set getFunctionSet(); }; struct AcosFunction { + static constexpr const char* name = "ACOS"; + static function_set getFunctionSet(); }; struct AsinFunction { + static constexpr const char* name = "ASIN"; + static function_set getFunctionSet(); }; struct AtanFunction { + static constexpr const char* name = "ATAN"; + static function_set getFunctionSet(); }; struct Atan2Function { + static constexpr const char* name = "ATAN2"; + static function_set getFunctionSet(); }; struct BitwiseXorFunction { + static constexpr const char* name = "BITWISE_XOR"; + static function_set getFunctionSet(); }; struct BitwiseAndFunction { + static constexpr const char* name = "BITWISE_AND"; + static function_set getFunctionSet(); }; struct BitwiseOrFunction { + static constexpr const char* name = "BITWISE_OR"; + static function_set getFunctionSet(); }; struct BitShiftLeftFunction { + static constexpr const char* name = "BITSHIFT_LEFT"; + static function_set getFunctionSet(); }; struct BitShiftRightFunction { + static constexpr const char* name = "BITSHIFT_RIGHT"; + static function_set getFunctionSet(); }; struct CbrtFunction { + static constexpr const char* name = "CBRT"; + static function_set getFunctionSet(); }; struct CeilFunction { + static constexpr const char* name = "CEIL"; + + static constexpr const char* alias = "CEILING"; + static function_set getFunctionSet(); }; struct CosFunction { + static constexpr const char* name = "COS"; + static function_set getFunctionSet(); }; struct CotFunction { + static constexpr const char* name = "COT"; + static function_set getFunctionSet(); }; struct DegreesFunction { + static constexpr const char* name = "DEGREES"; + static function_set getFunctionSet(); }; struct EvenFunction { + static constexpr const char* name = "EVEN"; + static function_set getFunctionSet(); }; struct FactorialFunction { + static constexpr const char* name = "FACTORIAL"; + static function_set getFunctionSet(); }; struct FloorFunction { + static constexpr const char* name = "FLOOR"; + static function_set getFunctionSet(); }; struct GammaFunction { + static constexpr const char* name = "GAMMA"; + static function_set getFunctionSet(); }; struct LgammaFunction { + static constexpr const char* name = "LGAMMA"; + static function_set getFunctionSet(); }; struct LnFunction { + static constexpr const char* name = "LN"; + static function_set getFunctionSet(); }; struct LogFunction { + static constexpr const char* name = "LOG"; + + static constexpr const char* alias = "LOG10"; + static function_set getFunctionSet(); }; struct Log2Function { + static constexpr const char* name = "LOG2"; + static function_set getFunctionSet(); }; struct NegateFunction { + static constexpr const char* name = "NEGATE"; + static function_set getFunctionSet(); }; struct PiFunction { + static constexpr const char* name = "PI"; + static function_set getFunctionSet(); }; struct RadiansFunction { + static constexpr const char* name = "RADIANS"; + static function_set getFunctionSet(); }; struct RoundFunction { + static constexpr const char* name = "ROUND"; + static function_set getFunctionSet(); }; struct SinFunction { + static constexpr const char* name = "SIN"; + static function_set getFunctionSet(); }; struct SignFunction { + static constexpr const char* name = "SIGN"; + static function_set getFunctionSet(); }; struct SqrtFunction { + static constexpr const char* name = "SQRT"; + static function_set getFunctionSet(); }; struct TanFunction { + static constexpr const char* name = "TAN"; + static function_set getFunctionSet(); }; diff --git a/src/include/function/blob/vector_blob_functions.h b/src/include/function/blob/vector_blob_functions.h index 5e0b04f39ff..af72f6039e3 100644 --- a/src/include/function/blob/vector_blob_functions.h +++ b/src/include/function/blob/vector_blob_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index 647d9e776e3..afaad43eb62 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -1,7 +1,7 @@ #pragma once #include "aggregate_function.h" -#include "scalar_function.h" +#include "function.h" namespace kuzu { namespace catalog { @@ -83,7 +83,6 @@ class BuiltInFunctionsUtils { // Scalar functions. static void registerScalarFunctions(catalog::CatalogSet* catalogSet); static void registerComparisonFunctions(catalog::CatalogSet* catalogSet); - static void registerArithmeticFunctions(catalog::CatalogSet* catalogSet); static void registerDateFunctions(catalog::CatalogSet* catalogSet); static void registerTimestampFunctions(catalog::CatalogSet* catalogSet); static void registerIntervalFunctions(catalog::CatalogSet* catalogSet); @@ -111,6 +110,8 @@ class BuiltInFunctionsUtils { // Table functions. static void registerTableFunctions(catalog::CatalogSet* catalogSet); + + static void registerFunctions(catalog::CatalogSet* catalogSet); }; } // namespace function diff --git a/src/include/function/date/vector_date_functions.h b/src/include/function/date/vector_date_functions.h index d91fd453fff..5058bd31c64 100644 --- a/src/include/function/date/vector_date_functions.h +++ b/src/include/function/date/vector_date_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/function.h b/src/include/function/function.h index 6ab54329102..c7b57bd3ffa 100644 --- a/src/include/function/function.h +++ b/src/include/function/function.h @@ -15,6 +15,7 @@ struct FunctionBindData { }; struct Function; +using function_set = std::vector>; using scalar_bind_func = std::function( const binder::expression_vector&, Function* definition)>; diff --git a/src/include/function/function_collection.h b/src/include/function/function_collection.h new file mode 100644 index 00000000000..2098ad59ecd --- /dev/null +++ b/src/include/function/function_collection.h @@ -0,0 +1,19 @@ +#pragma once + +#include "function.h" + +namespace kuzu { +namespace function { + +using get_function_set_fun = std::function; + +struct FunctionCollection { + const char* name; + + get_function_set_fun getFunctionSetFunc; + + static FunctionCollection* getFunctions(); +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/map/vector_map_functions.h b/src/include/function/map/vector_map_functions.h index 8448b4e6c36..fe0484f9102 100644 --- a/src/include/function/map/vector_map_functions.h +++ b/src/include/function/map/vector_map_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/path/vector_path_functions.h b/src/include/function/path/vector_path_functions.h index 206d66d075b..1de632f85eb 100644 --- a/src/include/function/path/vector_path_functions.h +++ b/src/include/function/path/vector_path_functions.h @@ -1,6 +1,7 @@ #pragma once -#include "function/scalar_function.h" +#include "common/vector/value_vector.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/rdf/vector_rdf_functions.h b/src/include/function/rdf/vector_rdf_functions.h index e653292be6d..c7e10205f0c 100644 --- a/src/include/function/rdf/vector_rdf_functions.h +++ b/src/include/function/rdf/vector_rdf_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/scalar_function.h b/src/include/function/scalar_function.h index cde381e5f1d..9fc4b8175ff 100644 --- a/src/include/function/scalar_function.h +++ b/src/include/function/scalar_function.h @@ -21,7 +21,6 @@ using scalar_func_exec_t = std::function>&, common::SelectionVector&)>; -using function_set = std::vector>; struct ScalarFunction final : public BaseScalarFunction { diff --git a/src/include/function/schema/vector_node_rel_functions.h b/src/include/function/schema/vector_node_rel_functions.h index b6ccd51de88..ad009e995fb 100644 --- a/src/include/function/schema/vector_node_rel_functions.h +++ b/src/include/function/schema/vector_node_rel_functions.h @@ -1,6 +1,8 @@ #pragma once -#include "function/scalar_function.h" +#include "common/vector/value_vector.h" +#include "function/function.h" +#include "function/unary_function_executor.h" #include "offset_functions.h" namespace kuzu { diff --git a/src/include/function/table/call_functions.h b/src/include/function/table/call_functions.h index a28ac47037d..a7a7174bcbd 100644 --- a/src/include/function/table/call_functions.h +++ b/src/include/function/table/call_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/bind_data.h" #include "function/table_functions.h" diff --git a/src/include/function/timestamp/vector_timestamp_functions.h b/src/include/function/timestamp/vector_timestamp_functions.h index 9efd4ba90a3..5b2c0c09020 100644 --- a/src/include/function/timestamp/vector_timestamp_functions.h +++ b/src/include/function/timestamp/vector_timestamp_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/union/vector_union_functions.h b/src/include/function/union/vector_union_functions.h index c9447bd0a72..9f333019530 100644 --- a/src/include/function/union/vector_union_functions.h +++ b/src/include/function/union/vector_union_functions.h @@ -1,6 +1,7 @@ #pragma once -#include "function/scalar_function.h" +#include "common/vector/value_vector.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/function/uuid/vector_uuid_functions.h b/src/include/function/uuid/vector_uuid_functions.h index a587aaa3a4e..ce7ac3d6e30 100644 --- a/src/include/function/uuid/vector_uuid_functions.h +++ b/src/include/function/uuid/vector_uuid_functions.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index 0cf40830296..ab99d9cc997 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -10,7 +10,7 @@ #include "common/task_system/progress_bar.h" #include "common/timer.h" #include "common/types/value/value.h" -#include "function/scalar_function.h" +#include "function/function.h" #include "main/kuzu_fwd.h" #include "parser/statement.h" #include "prepared_statement.h" diff --git a/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h index 742c78d8c13..2294d26113b 100644 --- a/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h @@ -2,7 +2,7 @@ #include "base_csv_reader.h" #include "common/types/types.h" -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/bind_input.h" #include "function/table/scan_functions.h" #include "function/table_functions.h" diff --git a/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h index 072e5332d69..289d2a4007f 100644 --- a/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h @@ -1,7 +1,7 @@ #pragma once #include "base_csv_reader.h" -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/bind_input.h" #include "function/table/scan_functions.h" diff --git a/src/include/processor/operator/persistent/reader/npy/npy_reader.h b/src/include/processor/operator/persistent/reader/npy/npy_reader.h index 6a3494b27e7..dfa36cb6b51 100644 --- a/src/include/processor/operator/persistent/reader/npy/npy_reader.h +++ b/src/include/processor/operator/persistent/reader/npy/npy_reader.h @@ -5,7 +5,7 @@ #include "common/data_chunk/data_chunk.h" #include "common/types/types.h" -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/scan_functions.h" namespace kuzu { diff --git a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h index 9f6ada7b526..9665fec268c 100644 --- a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h @@ -3,7 +3,7 @@ #include "column_reader.h" #include "common/data_chunk/data_chunk.h" #include "common/types/types.h" -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/bind_input.h" #include "function/table/scan_functions.h" #include "parquet/parquet_types.h" diff --git a/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h b/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h index a9eaa214191..f55e95c6fc4 100644 --- a/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h +++ b/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/bind_data.h" #include "function/table/scan_functions.h" #include "rdf_reader.h" diff --git a/src/include/processor/operator/table_scan/ftable_scan_function.h b/src/include/processor/operator/table_scan/ftable_scan_function.h index c5fb4f4196e..393b0cfc628 100644 --- a/src/include/processor/operator/table_scan/ftable_scan_function.h +++ b/src/include/processor/operator/table_scan/ftable_scan_function.h @@ -1,6 +1,6 @@ #pragma once -#include "function/scalar_function.h" +#include "function/function.h" #include "function/table/bind_data.h" #include "processor/result/factorized_table.h" diff --git a/src/parser/transform/transform_expression.cpp b/src/parser/transform/transform_expression.cpp index cc7edbf694b..97192c200bd 100644 --- a/src/parser/transform/transform_expression.cpp +++ b/src/parser/transform/transform_expression.cpp @@ -1,3 +1,4 @@ +#include "function/arithmetic/vector_arithmetic_functions.h" #include "function/cast/functions/cast_from_string_functions.h" #include "parser/expression/parsed_case_expression.h" #include "parser/expression/parsed_function_expression.h" @@ -9,6 +10,7 @@ #include "parser/transformer.h" using namespace kuzu::common; +using namespace kuzu::function; namespace kuzu { namespace parser { @@ -122,7 +124,7 @@ std::unique_ptr Transformer::transformBitwiseOrOperatorExpress } else { auto rawName = expression->getRawName() + " | " + next->getRawName(); expression = std::make_unique( - BITWISE_OR_FUNC_NAME, std::move(expression), std::move(next), rawName); + BitwiseOrFunction::name, std::move(expression), std::move(next), rawName); } } return expression; @@ -138,7 +140,7 @@ std::unique_ptr Transformer::transformBitwiseAndOperatorExpres } else { auto rawName = expression->getRawName() + " & " + next->getRawName(); expression = std::make_unique( - BITWISE_AND_FUNC_NAME, std::move(expression), std::move(next), rawName); + BitwiseAndFunction::name, std::move(expression), std::move(next), rawName); } } return expression; @@ -157,11 +159,11 @@ std::unique_ptr Transformer::transformBitShiftOperatorExpressi expression->getRawName() + " " + bitShiftOperator + " " + next->getRawName(); if (bitShiftOperator == "<<") { expression = std::make_unique( - BITSHIFT_LEFT_FUNC_NAME, std::move(expression), std::move(next), rawName); + BitShiftLeftFunction::name, std::move(expression), std::move(next), rawName); } else { KU_ASSERT(bitShiftOperator == ">>"); expression = std::make_unique( - BITSHIFT_RIGHT_FUNC_NAME, std::move(expression), std::move(next), rawName); + BitShiftRightFunction::name, std::move(expression), std::move(next), rawName); } } } @@ -215,7 +217,7 @@ std::unique_ptr Transformer::transformPowerOfExpression( } else { auto rawName = expression->getRawName() + " ^ " + next->getRawName(); expression = std::make_unique( - POWER_FUNC_NAME, std::move(expression), std::move(next), rawName); + PowerFunction::name, std::move(expression), std::move(next), rawName); } } return expression; @@ -228,13 +230,13 @@ std::unique_ptr Transformer::transformUnaryAddSubtractOrFactor if (ctx.FACTORIAL()) { // Factorial has a higher auto raw = result->toString() + "!"; result = std::make_unique( - FACTORIAL_FUNC_NAME, std::move(result), std::move(raw)); + FactorialFunction::name, std::move(result), std::move(raw)); } if (!ctx.MINUS().empty()) { for ([[maybe_unused]] auto& _ : ctx.MINUS()) { auto raw = "-" + result->toString(); result = std::make_unique( - NEGATE_FUNC_NAME, std::move(result), std::move(raw)); + NegateFunction::name, std::move(result), std::move(raw)); } } return result; diff --git a/src/processor/operator/persistent/export_db.cpp b/src/processor/operator/persistent/export_db.cpp index 7f80a5c2496..2a3c4a5dcc8 100644 --- a/src/processor/operator/persistent/export_db.cpp +++ b/src/processor/operator/persistent/export_db.cpp @@ -7,6 +7,7 @@ #include "catalog/catalog.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" +#include "common/copier_config/csv_reader_config.h" #include "common/file_system/virtual_file_system.h" #include "common/string_utils.h" From 0ced8858a64eeeaf2da3d021cd36ad3dd7b10640 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:49:04 -0700 Subject: [PATCH 053/136] Allowed for progress bar to be configurable by CALL (#3080) I have read and agree to the CLA of the Kuzu repository. --- src/common/task_system/progress_bar.cpp | 26 +++++++++++++------ src/include/common/constants.h | 7 ----- src/include/common/task_system/progress_bar.h | 10 ++++--- src/include/main/client_config.h | 10 +++++++ src/include/main/client_context.h | 7 +++-- src/include/main/settings.h | 13 ++++++++++ src/main/client_context.cpp | 6 ++++- src/main/db_config.cpp | 3 ++- src/processor/processor.cpp | 1 + test/test_files/tinysnb/call/call.test | 12 +++++++++ tools/shell/embedded_shell.cpp | 22 ++-------------- tools/shell/include/embedded_shell.h | 2 -- tools/shell/test/test_shell_commands.py | 3 +-- 13 files changed, 74 insertions(+), 48 deletions(-) diff --git a/src/common/task_system/progress_bar.cpp b/src/common/task_system/progress_bar.cpp index 3efb778a1e6..526dde33f45 100644 --- a/src/common/task_system/progress_bar.cpp +++ b/src/common/task_system/progress_bar.cpp @@ -9,6 +9,13 @@ void ProgressBar::startProgress() { } std::lock_guard lock(progressBarLock); printProgressBar(0.0); + printing = true; +} + +void ProgressBar::endProgress() { + std::lock_guard lock(progressBarLock); + resetProgressBar(); + printing = false; } void ProgressBar::addPipeline() { @@ -23,21 +30,23 @@ void ProgressBar::finishPipeline() { return; } numPipelinesFinished++; - prevCurPipelineProgress = 0.0; + // This ensures that the progress bar is updated back to 0% after a pipeline is finished. + prevCurPipelineProgress = -0.01; updateProgress(0.0); - if (numPipelines == numPipelinesFinished) { - resetProgressBar(); - } } void ProgressBar::updateProgress(double curPipelineProgress) { + // Only update the progress bar if the progress has changed by at least 1%. if (!trackProgress || curPipelineProgress - prevCurPipelineProgress < 0.01) { return; } std::lock_guard lock(progressBarLock); prevCurPipelineProgress = curPipelineProgress; - std::cout << "\033[2A\033[2K\033[1B\033[2K\033[1A"; + if (printing) { + std::cout << "\033[2A"; + } printProgressBar(curPipelineProgress); + printing = true; } void ProgressBar::printProgressBar(double curPipelineProgress) const { @@ -55,9 +64,10 @@ void ProgressBar::printProgressBar(double curPipelineProgress) const { } void ProgressBar::resetProgressBar() { - std::lock_guard lock(progressBarLock); - std::cout << "\033[2A\033[2K\033[1B\033[2K\033[1A"; - std::cout.flush(); + if (printing) { + std::cout << "\033[2A\033[2K\033[1B\033[2K\033[1A"; + std::cout.flush(); + } numPipelines = 0; numPipelinesFinished = 0; prevCurPipelineProgress = 0.0; diff --git a/src/include/common/constants.h b/src/include/common/constants.h index 96e6091a89e..2a1674387ef 100644 --- a/src/include/common/constants.h +++ b/src/include/common/constants.h @@ -173,13 +173,6 @@ struct PlannerKnobs { static constexpr uint64_t SIP_RATIO = 5; }; -struct ClientConfigDefault { - // 0 means timeout is disabled by default. - static constexpr uint64_t TIMEOUT_IN_MS = 0; - static constexpr uint32_t VAR_LENGTH_MAX_DEPTH = 30; - static constexpr bool ENABLE_SEMI_MASK = true; -}; - struct OrderByConstants { static constexpr uint64_t NUM_BYTES_FOR_PAYLOAD_IDX = 8; static constexpr uint64_t MIN_SIZE_TO_REDUCE = common::DEFAULT_VECTOR_CAPACITY * 5; diff --git a/src/include/common/task_system/progress_bar.h b/src/include/common/task_system/progress_bar.h index bfd0050e3a5..50d65eb5fc0 100644 --- a/src/include/common/task_system/progress_bar.h +++ b/src/include/common/task_system/progress_bar.h @@ -7,19 +7,22 @@ namespace kuzu { namespace common { /** - * TODO: PUT DESCRIPTION HERE + * @brief Progress bar for tracking the progress of a pipeline. Prints the progress of each query + * pipeline and the overall progress. */ class ProgressBar { public: ProgressBar() - : numPipelines{0}, numPipelinesFinished{0}, prevCurPipelineProgress{0.0}, trackProgress{ - false} {}; + : numPipelines{0}, numPipelinesFinished{0}, prevCurPipelineProgress{0.0}, + trackProgress{false}, printing{false} {}; void addPipeline(); void finishPipeline(); + void endProgress(); + void addJobsToPipeline(int jobs); void finishJobsInPipeline(int jobs); @@ -45,6 +48,7 @@ class ProgressBar { double prevCurPipelineProgress; std::mutex progressBarLock; bool trackProgress; + bool printing; }; } // namespace common diff --git a/src/include/main/client_config.h b/src/include/main/client_config.h index b35fbe85e20..d199527b5ce 100644 --- a/src/include/main/client_config.h +++ b/src/include/main/client_config.h @@ -19,6 +19,16 @@ struct ClientConfig { uint64_t timeoutInMS; // variable length maximum depth uint32_t varLengthMaxDepth; + // If using progress bar + bool enableProgressBar; +}; + +struct ClientConfigDefault { + // 0 means timeout is disabled by default. + static constexpr uint64_t TIMEOUT_IN_MS = 0; + static constexpr uint32_t VAR_LENGTH_MAX_DEPTH = 30; + static constexpr bool ENABLE_SEMI_MASK = true; + static constexpr bool ENABLE_PROGRESS_BAR = true; }; } // namespace main diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index ab99d9cc997..0cac4297750 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -79,6 +79,9 @@ class ClientContext { transaction::Transaction* getTx() const; KUZU_API transaction::TransactionContext* getTransactionContext() const; + // Progress bar + common::ProgressBar* getProgressBar() const; + // Replace function. inline bool hasReplaceFunc() { return replaceFunc != nullptr; } inline void setReplaceFunc(replace_func_t func) { replaceFunc = func; } @@ -106,10 +109,6 @@ class ClientContext { std::unique_ptr query(std::string_view queryStatement); void runQuery(std::string query); - void setProgressBarPrinting(bool progressBarPrinting); - - common::ProgressBar* getProgressBar() const { return progressBar.get(); } - private: std::unique_ptr query( std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans = true); diff --git a/src/include/main/settings.h b/src/include/main/settings.h index a31ddd1f621..93796cca1a3 100644 --- a/src/include/main/settings.h +++ b/src/include/main/settings.h @@ -30,6 +30,19 @@ struct TimeoutSetting { } }; +struct ProgressBarSetting { + static constexpr const char* name = "progress_bar"; + static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::BOOL; + static void setContext(ClientContext* context, const common::Value& parameter) { + KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::BOOL); + context->getClientConfigUnsafe()->enableProgressBar = parameter.getValue(); + context->getProgressBar()->toggleProgressBarPrinting(parameter.getValue()); + } + static common::Value getSetting(ClientContext* context) { + return common::Value(context->getClientConfig()->enableProgressBar); + } +}; + struct VarLengthExtendMaxDepthSetting { static constexpr const char* name = "var_length_extend_max_depth"; static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::INT64; diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 1eac0c94ed6..e6a3553c6d7 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -3,7 +3,6 @@ #include #include "binder/binder.h" -#include "common/constants.h" #include "common/exception/connection.h" #include "common/exception/runtime.h" #include "common/random_engine.h" @@ -56,6 +55,7 @@ ClientContext::ClientContext(Database* database) : database{database} { config.numThreads = database->systemConfig.maxNumThreads; config.timeoutInMS = ClientConfigDefault::TIMEOUT_IN_MS; config.varLengthMaxDepth = ClientConfigDefault::VAR_LENGTH_MAX_DEPTH; + config.enableProgressBar = ClientConfigDefault::ENABLE_PROGRESS_BAR; } uint64_t ClientContext::getTimeoutRemainingInMS() const { @@ -116,6 +116,10 @@ TransactionContext* ClientContext::getTransactionContext() const { return transactionContext.get(); } +common::ProgressBar* ClientContext::getProgressBar() const { + return progressBar.get(); +} + void ClientContext::setExtensionOption(std::string name, common::Value value) { StringUtils::toLower(name); extensionOptionValues.insert_or_assign(name, std::move(value)); diff --git a/src/main/db_config.cpp b/src/main/db_config.cpp index ad567a43206..dfcfe1756ec 100644 --- a/src/main/db_config.cpp +++ b/src/main/db_config.cpp @@ -14,7 +14,8 @@ namespace main { static ConfigurationOption options[] = { // NOLINT(cert-err58-cpp): GET_CONFIGURATION(ThreadsSetting), GET_CONFIGURATION(TimeoutSetting), GET_CONFIGURATION(VarLengthExtendMaxDepthSetting), GET_CONFIGURATION(EnableSemiMaskSetting), - GET_CONFIGURATION(HomeDirectorySetting), GET_CONFIGURATION(FileSearchPathSetting)}; + GET_CONFIGURATION(HomeDirectorySetting), GET_CONFIGURATION(FileSearchPathSetting), + GET_CONFIGURATION(ProgressBarSetting)}; ConfigurationOption* DBConfig::getOptionByName(const std::string& optionName) { auto lOptionName = optionName; diff --git a/src/processor/processor.cpp b/src/processor/processor.cpp index 382aa737bef..c255bd03c66 100644 --- a/src/processor/processor.cpp +++ b/src/processor/processor.cpp @@ -27,6 +27,7 @@ std::shared_ptr QueryProcessor::execute( initTask(task.get()); context->clientContext->getProgressBar()->startProgress(); taskScheduler->scheduleTaskAndWaitOrError(task, context); + context->clientContext->getProgressBar()->endProgress(); return resultCollector->getResultFactorizedTable(); } diff --git a/test/test_files/tinysnb/call/call.test b/test/test_files/tinysnb/call/call.test index d9668f8d269..94a48988171 100644 --- a/test/test_files/tinysnb/call/call.test +++ b/test/test_files/tinysnb/call/call.test @@ -42,6 +42,18 @@ Binder exception: Upper bound of rel exceeds maximum: 10. ---- 1 354290 +-LOG SetGetProgressBar +-STATEMENT CALL progress_bar=true +---- ok +-STATEMENT CALL current_setting('progress_bar') RETURN * +---- 1 +True +-STATEMENT CALL progress_bar=false +---- ok +-STATEMENT CALL current_setting('progress_bar') RETURN * +---- 1 +False + -LOG disableSemihMaskOptimization -STATEMENT CALL enable_semi_mask=true ---- ok diff --git a/tools/shell/embedded_shell.cpp b/tools/shell/embedded_shell.cpp index 68d6ccade2f..a82dd9ff05b 100644 --- a/tools/shell/embedded_shell.cpp +++ b/tools/shell/embedded_shell.cpp @@ -51,8 +51,7 @@ struct ShellCommand { const char* QUIT = ":quit"; const char* MAX_ROWS = ":max_rows"; const char* MAX_WIDTH = ":max_width"; - const char* PROGRESS_BAR = ":progress_bar"; - const std::array commandList = {HELP, CLEAR, QUIT, MAX_ROWS, MAX_WIDTH, PROGRESS_BAR}; + const std::array commandList = {HELP, CLEAR, QUIT, MAX_ROWS, MAX_WIDTH}; } shellCommand; const char* TAB = " "; @@ -285,8 +284,6 @@ int EmbeddedShell::processShellCommands(std::string lineStr) { setMaxRows(lineStr.substr(strlen(shellCommand.MAX_ROWS))); } else if (lineStr.rfind(shellCommand.MAX_WIDTH) == 0) { setMaxWidth(lineStr.substr(strlen(shellCommand.MAX_WIDTH))); - } else if (lineStr.rfind(shellCommand.PROGRESS_BAR) == 0) { - toggleProgressBar(lineStr.substr(strlen(shellCommand.PROGRESS_BAR))); } else { printf("Error: Unknown command: \"%s\". Enter \":help\" for help\n", lineStr.c_str()); printf("Did you mean: \"%s\"?\n", findClosestCommand(lineStr).c_str()); @@ -430,20 +427,6 @@ void EmbeddedShell::setMaxWidth(const std::string& maxWidthString) { printf("maxWidth set as %d\n", parsedMaxWidth); } -void EmbeddedShell::toggleProgressBar(const std::string& state) { - std::string stateTrimmed = state; - stateTrimmed = stateTrimmed.erase(0, state.find_first_not_of(" \t\n\r\f\v")); - if (stateTrimmed == "on") { - conn->setProgressBarPrinting(true); - printf("Turned progress bar on.\n"); - } else if (stateTrimmed == "off") { - conn->setProgressBarPrinting(false); - printf("Turned progress bar off\n"); - } else { - printf("Cannot parse '%s' as progress bar state. Expect on|off.\n", stateTrimmed.c_str()); - } -} - void EmbeddedShell::printHelp() { printf("%s%s %sget command list\n", TAB, shellCommand.HELP, TAB); printf("%s%s %sclear shell\n", TAB, shellCommand.CLEAR, TAB); @@ -452,11 +435,10 @@ void EmbeddedShell::printHelp() { shellCommand.MAX_ROWS, TAB); printf("%s%s [max_width] %sset maximum width in characters for display\n", TAB, shellCommand.MAX_WIDTH, TAB); - printf("%s%s [on|off] %stoggle progress bar for queries\n", TAB, shellCommand.PROGRESS_BAR, TAB); printf("\n"); printf("%sNote: you can change and see several system configurations, such as num-threads, \n", TAB); - printf("%s%s timeout, and logging_level using Cypher CALL statements.\n", TAB, TAB); + printf("%s%s timeout, and progress_bar using Cypher CALL statements.\n", TAB, TAB); printf("%s%s e.g. CALL THREADS=5; or CALL current_setting('threads') return *;\n", TAB, TAB); printf("%s%s See: https://docs.kuzudb.com/cypher/configuration\n", TAB, TAB); } diff --git a/tools/shell/include/embedded_shell.h b/tools/shell/include/embedded_shell.h index 8aa44e6c047..7b5171f455f 100644 --- a/tools/shell/include/embedded_shell.h +++ b/tools/shell/include/embedded_shell.h @@ -32,8 +32,6 @@ class EmbeddedShell { void setMaxWidth(const std::string& maxWidthString); - void toggleProgressBar(const std::string& state); - private: std::unique_ptr database; std::unique_ptr conn; diff --git a/tools/shell/test/test_shell_commands.py b/tools/shell/test/test_shell_commands.py index f402eba89cc..ed610c2dbd5 100644 --- a/tools/shell/test/test_shell_commands.py +++ b/tools/shell/test/test_shell_commands.py @@ -11,10 +11,9 @@ def test_help(temp_db) -> None: " :quit exit from shell", " :max_rows [max_rows] set maximum number of rows for display (default: 20)", " :max_width [max_width] set maximum width in characters for display", - " :progress_bar [on|off] toggle progress bar for queries", "", " Note: you can change and see several system configurations, such as num-threads, ", - " timeout, and logging_level using Cypher CALL statements.", + " timeout, and progress_bar using Cypher CALL statements.", " e.g. CALL THREADS=5; or CALL current_setting('threads') return *;", " See: https://docs.kuzudb.com/cypher/configuration", ], From 7a3ca592c0a021988b5ebd6ba839b9fb79914d88 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Tue, 19 Mar 2024 15:13:29 -0400 Subject: [PATCH 054/136] Implement array functions --- src/function/CMakeLists.txt | 1 + src/function/function_collection.cpp | 5 +- src/function/vector_array_functions.cpp | 170 ++++++++++++++++++ src/function/vector_list_functions.cpp | 12 +- .../array/functions/array_cosine_similarity.h | 33 ++++ .../array/functions/array_cross_product.h | 24 +++ .../function/array/functions/array_distance.h | 27 +++ .../array/functions/array_inner_product.h | 23 +++ .../function/array/vector_array_functions.h | 45 +++++ .../function/list/vector_list_functions.h | 1 + .../tck/expressions/list/List1.test | 5 + test/test_files/tinysnb/function/array.test | 121 +++++++++++++ 12 files changed, 463 insertions(+), 4 deletions(-) create mode 100644 src/function/vector_array_functions.cpp create mode 100644 src/include/function/array/functions/array_cosine_similarity.h create mode 100644 src/include/function/array/functions/array_cross_product.h create mode 100644 src/include/function/array/functions/array_distance.h create mode 100644 src/include/function/array/functions/array_inner_product.h create mode 100644 src/include/function/array/vector_array_functions.h create mode 100644 test/test_files/tinysnb/function/array.test diff --git a/src/function/CMakeLists.txt b/src/function/CMakeLists.txt index 8751c231461..f782566ac1c 100644 --- a/src/function/CMakeLists.txt +++ b/src/function/CMakeLists.txt @@ -16,6 +16,7 @@ add_library(kuzu_function function_collection.cpp scalar_macro_function.cpp vector_arithmetic_functions.cpp + vector_array_functions.cpp vector_boolean_functions.cpp vector_cast_functions.cpp vector_date_functions.cpp diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 26e6fd304f7..414eb6f96f5 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -1,6 +1,7 @@ #include "function/function_collection.h" #include "function/arithmetic/vector_arithmetic_functions.h" +#include "function/array/vector_array_functions.h" namespace kuzu { namespace function { @@ -35,7 +36,9 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION_ALIAS(PowerFunction), SCALAR_FUNCTION(RadiansFunction), SCALAR_FUNCTION(RoundFunction), SCALAR_FUNCTION(SinFunction), SCALAR_FUNCTION(SignFunction), SCALAR_FUNCTION(SqrtFunction), SCALAR_FUNCTION(TanFunction), - + SCALAR_FUNCTION(ArrayValueFunction), SCALAR_FUNCTION(ArrayCrossProductFunction), + SCALAR_FUNCTION(ArrayCosineSimilarityFunction), SCALAR_FUNCTION(ArrayDistanceFunction), + SCALAR_FUNCTION(ArrayInnerProductFunction), SCALAR_FUNCTION(ArrayDotProductFunction), // End of array FINAL_FUNCTION}; diff --git a/src/function/vector_array_functions.cpp b/src/function/vector_array_functions.cpp new file mode 100644 index 00000000000..bfe77e97954 --- /dev/null +++ b/src/function/vector_array_functions.cpp @@ -0,0 +1,170 @@ +#include "function/array/vector_array_functions.h" + +#include "function/array/functions/array_cosine_similarity.h" +#include "function/array/functions/array_cross_product.h" +#include "function/array/functions/array_distance.h" +#include "function/array/functions/array_inner_product.h" +#include "function/list/vector_list_functions.h" + +using namespace kuzu::common; + +namespace kuzu { +namespace function { + +std::unique_ptr ArrayValueBindFunc( + const binder::expression_vector& arguments, Function* /*function*/) { + auto resultType = + LogicalType::ARRAY(ListCreationFunction::getChildType(arguments).copy(), arguments.size()); + return std::make_unique(std::move(resultType)); +} + +function_set ArrayValueFunction::getFunctionSet() { + function_set result; + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::ANY}, LogicalTypeID::ARRAY, + ListCreationFunction::execFunc, nullptr, ArrayValueBindFunc, true /* isVarLength */)); + return result; +} + +std::unique_ptr ArrayCrossProductBindFunc( + const binder::expression_vector& arguments, Function* function) { + auto leftType = arguments[0]->dataType; + auto rightType = arguments[1]->dataType; + if (leftType != rightType) { + throw BinderException( + stringFormat("{} requires both arrays to have the same element type and size of 3", + ArrayCrossProductFunction::name)); + } + scalar_func_exec_t execFunc; + switch (ArrayType::getChildType(&leftType)->getLogicalTypeID()) { + case LogicalTypeID::INT128: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + case LogicalTypeID::INT64: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + case LogicalTypeID::INT32: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + case LogicalTypeID::INT16: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + case LogicalTypeID::INT8: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + case LogicalTypeID::FLOAT: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + case LogicalTypeID::DOUBLE: + execFunc = ScalarFunction::BinaryExecListStructFunction>; + break; + default: + throw BinderException{ + stringFormat("{} can only be applied on array of floating points or integers", + ArrayCrossProductFunction::name)}; + } + ku_dynamic_cast(function)->execFunc = execFunc; + auto resultType = LogicalType::ARRAY( + *ArrayType::getChildType(&leftType), ArrayType::getNumElements(&leftType)); + return std::make_unique(std::move(resultType)); +} + +function_set ArrayCrossProductFunction::getFunctionSet() { + function_set result; + result.push_back(std::make_unique(name, + std::vector{ + LogicalTypeID::ARRAY, + LogicalTypeID::ARRAY, + }, + LogicalTypeID::ARRAY, nullptr, nullptr, ArrayCrossProductBindFunc, + false /* isVarLength */)); + return result; +} + +static void validateArrayFunctionParameters( + const LogicalType& leftType, const LogicalType& rightType, const std::string& functionName) { + if (leftType != rightType) { + throw BinderException( + stringFormat("{} requires both arrays to have the same element type", functionName)); + } + if (ArrayType::getChildType(&leftType)->getLogicalTypeID() != LogicalTypeID::FLOAT && + ArrayType::getChildType(&leftType)->getLogicalTypeID() != LogicalTypeID::DOUBLE) { + throw BinderException( + stringFormat("{} requires argument type of FLOAT or DOUBLE.", functionName)); + } +} + +template +static scalar_func_exec_t getBinaryArrayExecFuncSwitchResultType() { + auto execFunc = + ScalarFunction::BinaryExecListStructFunction; + return execFunc; +} + +template +scalar_func_exec_t getScalarExecFunc(LogicalType type) { + scalar_func_exec_t execFunc; + switch (ArrayType::getChildType(&type)->getLogicalTypeID()) { + case LogicalTypeID::FLOAT: + execFunc = getBinaryArrayExecFuncSwitchResultType(); + break; + case LogicalTypeID::DOUBLE: + execFunc = getBinaryArrayExecFuncSwitchResultType(); + break; + default: + KU_UNREACHABLE; + } + return execFunc; +} + +template +std::unique_ptr arrayTemplateBindFunc( + std::string functionName, const binder::expression_vector& arguments, Function* function) { + auto leftType = arguments[0]->dataType; + auto rightType = arguments[1]->dataType; + validateArrayFunctionParameters(leftType, rightType, functionName); + ku_dynamic_cast(function)->execFunc = + getScalarExecFunc(leftType); + return std::make_unique(ArrayType::getChildType(&leftType)->copy()); +} + +template +function_set templateGetFunctionSet(const std::string& functionName) { + function_set result; + result.push_back(std::make_unique(functionName, + std::vector{ + LogicalTypeID::ARRAY, + LogicalTypeID::ARRAY, + }, + LogicalTypeID::ANY, nullptr, nullptr, + std::bind(arrayTemplateBindFunc, functionName, std::placeholders::_1, + std::placeholders::_2), + false /* isVarLength */)); + return result; +} + +function_set ArrayCosineSimilarityFunction::getFunctionSet() { + return templateGetFunctionSet(name); +} + +function_set ArrayDistanceFunction::getFunctionSet() { + return templateGetFunctionSet(name); +} + +function_set ArrayInnerProductFunction::getFunctionSet() { + return templateGetFunctionSet(name); +} + +function_set ArrayDotProductFunction::getFunctionSet() { + return templateGetFunctionSet(name); +} + +} // namespace function +} // namespace kuzu diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index 35c77e8e3b0..41f3e7ffff4 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -33,7 +33,6 @@ static std::string getListFunctionIncompatibleChildrenTypeErrorMsg( void ListCreationFunction::execFunc(const std::vector>& parameters, ValueVector& result, void* /*dataPtr*/) { - KU_ASSERT(result.dataType.getLogicalTypeID() == LogicalTypeID::VAR_LIST); result.resetAuxiliaryBuffer(); for (auto selectedPos = 0u; selectedPos < result.state->selVector->selectedSize; ++selectedPos) { @@ -63,6 +62,11 @@ static LogicalType getValidLogicalType(const binder::expression_vector& expressi std::unique_ptr ListCreationFunction::bindFunc( const binder::expression_vector& arguments, Function* /*function*/) { + auto resultType = LogicalType::VAR_LIST(getChildType(arguments).copy()); + return std::make_unique(std::move(resultType)); +} + +LogicalType ListCreationFunction::getChildType(const binder::expression_vector& arguments) { // ListCreation requires all parameters to have the same type or be ANY type. The result type of // listCreation can be determined by the first non-ANY type parameter. If all parameters have // dataType ANY, then the resultType will be INT64[] (default type). @@ -82,8 +86,7 @@ std::unique_ptr ListCreationFunction::bindFunc( } } } - auto resultType = LogicalType::VAR_LIST(childType.copy()); - return std::make_unique(std::move(resultType)); + return childType; } function_set ListCreationFunction::getFunctionSet() { @@ -232,6 +235,9 @@ function_set ListExtractFunction::getFunctionSet() { LogicalTypeID::STRING, ScalarFunction::BinaryExecFunction, false /* isVarlength */)); + result.push_back(std::make_unique(LIST_EXTRACT_FUNC_NAME, + std::vector{LogicalTypeID::ARRAY, LogicalTypeID::INT64}, LogicalTypeID::ANY, + nullptr, nullptr, bindFunc, false /* isVarlength*/)); return result; } diff --git a/src/include/function/array/functions/array_cosine_similarity.h b/src/include/function/array/functions/array_cosine_similarity.h new file mode 100644 index 00000000000..3130eecaa3a --- /dev/null +++ b/src/include/function/array/functions/array_cosine_similarity.h @@ -0,0 +1,33 @@ +#pragma once + +#include "math.h" + +#include "common/vector/value_vector.h" + +namespace kuzu { +namespace function { + +struct ArrayCosineSimilarity { + template + static inline void operation(common::list_entry_t& left, common::list_entry_t& right, T& result, + common::ValueVector& leftVector, common::ValueVector& rightVector, + common::ValueVector& /*resultVector*/) { + auto leftElements = (T*)common::ListVector::getListValues(&leftVector, left); + auto rightElements = (T*)common::ListVector::getListValues(&rightVector, right); + T distance = 0; + T normLeft = 0; + T normRight = 0; + for (auto i = 0u; i < left.size; i++) { + auto x = leftElements[i]; + auto y = rightElements[i]; + distance += x * y; + normLeft += x * x; + normRight += y * y; + } + auto similarity = distance / (std::sqrt(normLeft) * std::sqrt(normRight)); + result = std::max(static_cast(-1), std::min(similarity, static_cast(1))); + } +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/array/functions/array_cross_product.h b/src/include/function/array/functions/array_cross_product.h new file mode 100644 index 00000000000..f30c1ba6340 --- /dev/null +++ b/src/include/function/array/functions/array_cross_product.h @@ -0,0 +1,24 @@ +#pragma once + +#include "common/vector/value_vector.h" + +namespace kuzu { +namespace function { + +template +struct ArrayCrossProduct { + static inline void operation(common::list_entry_t& left, common::list_entry_t& right, + common::list_entry_t& result, common::ValueVector& leftVector, + common::ValueVector& rightVector, common::ValueVector& resultVector) { + auto leftElements = (T*)common::ListVector::getListValues(&leftVector, left); + auto rightElements = (T*)common::ListVector::getListValues(&rightVector, right); + result = common::ListVector::addList(&resultVector, left.size); + auto resultElements = (T*)common::ListVector::getListValues(&resultVector, result); + resultElements[0] = leftElements[1] * rightElements[2] - leftElements[2] * rightElements[1]; + resultElements[1] = leftElements[2] * rightElements[0] - leftElements[0] * rightElements[2]; + resultElements[2] = leftElements[0] * rightElements[1] - leftElements[1] * rightElements[0]; + } +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/array/functions/array_distance.h b/src/include/function/array/functions/array_distance.h new file mode 100644 index 00000000000..1975343b336 --- /dev/null +++ b/src/include/function/array/functions/array_distance.h @@ -0,0 +1,27 @@ +#pragma once + +#include "math.h" + +#include "common/vector/value_vector.h" + +namespace kuzu { +namespace function { + +struct ArrayDistance { + template + static inline void operation(common::list_entry_t& left, common::list_entry_t& right, T& result, + common::ValueVector& leftVector, common::ValueVector& rightVector, + common::ValueVector& /*resultVector*/) { + auto leftElements = (T*)common::ListVector::getListValues(&leftVector, left); + auto rightElements = (T*)common::ListVector::getListValues(&rightVector, right); + result = 0; + for (auto i = 0u; i < left.size; i++) { + auto diff = leftElements[i] - rightElements[i]; + result += diff * diff; + } + result = std::sqrt(result); + } +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/array/functions/array_inner_product.h b/src/include/function/array/functions/array_inner_product.h new file mode 100644 index 00000000000..d1853e5cf7d --- /dev/null +++ b/src/include/function/array/functions/array_inner_product.h @@ -0,0 +1,23 @@ +#pragma once + +#include "common/vector/value_vector.h" + +namespace kuzu { +namespace function { + +struct ArrayInnerProduct { + template + static inline void operation(common::list_entry_t& left, common::list_entry_t& right, T& result, + common::ValueVector& leftVector, common::ValueVector& rightVector, + common::ValueVector& /*resultVector*/) { + auto leftElements = (T*)common::ListVector::getListValues(&leftVector, left); + auto rightElements = (T*)common::ListVector::getListValues(&rightVector, right); + result = 0; + for (auto i = 0u; i < left.size; i++) { + result += leftElements[i] * rightElements[i]; + } + } +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/array/vector_array_functions.h b/src/include/function/array/vector_array_functions.h new file mode 100644 index 00000000000..56be9a813c2 --- /dev/null +++ b/src/include/function/array/vector_array_functions.h @@ -0,0 +1,45 @@ +#pragma once + +#include "function/function.h" + +namespace kuzu { +namespace function { + +struct ArrayValueFunction { + static constexpr const char* name = "ARRAY_VALUE"; + + static function_set getFunctionSet(); +}; + +struct ArrayCrossProductFunction { + static constexpr const char* name = "ARRAY_CROSS_PRODUCT"; + + static function_set getFunctionSet(); +}; + +struct ArrayCosineSimilarityFunction { + static constexpr const char* name = "ARRAY_COSINE_SIMILARITY"; + + static function_set getFunctionSet(); +}; + +struct ArrayDistanceFunction { + static constexpr const char* name = "ARRAY_DISTANCE"; + + static function_set getFunctionSet(); +}; + +struct ArrayInnerProductFunction { + static constexpr const char* name = "ARRAY_INNER_PRODUCT"; + + static function_set getFunctionSet(); +}; + +struct ArrayDotProductFunction { + static constexpr const char* name = "ARRAY_DOT_PRODUCT"; + + static function_set getFunctionSet(); +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/list/vector_list_functions.h b/src/include/function/list/vector_list_functions.h index aa39c62e2d9..970d3f5832d 100644 --- a/src/include/function/list/vector_list_functions.h +++ b/src/include/function/list/vector_list_functions.h @@ -220,6 +220,7 @@ struct ListCreationFunction { const binder::expression_vector& arguments, Function* function); static void execFunc(const std::vector>& parameters, common::ValueVector& result, void* /*dataPtr*/ = nullptr); + static common::LogicalType getChildType(const binder::expression_vector& arguments); }; struct ListRangeFunction { diff --git a/test/test_files/tck/expressions/list/List1.test b/test/test_files/tck/expressions/list/List1.test index 9099c5684f5..b8d34f4de7c 100644 --- a/test/test_files/tck/expressions/list/List1.test +++ b/test/test_files/tck/expressions/list/List1.test @@ -106,6 +106,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],BOOL). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING +(ARRAY,INT64) -> ANY -STATEMENT WITH [1, 2, 3, 4, 5] AS list, 4.7 AS idx RETURN list[idx]; @@ -113,6 +114,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],DOUBLE). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING +(ARRAY,INT64) -> ANY -STATEMENT WITH [1, 2, 3, 4, 5] AS list, '1' AS idx RETURN list[idx]; @@ -120,6 +122,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],STRING). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING +(ARRAY,INT64) -> ANY -STATEMENT WITH [1, 2, 3, 4, 5] AS list, [1] AS idx RETURN list[idx]; @@ -127,6 +130,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],INT64[]). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING +(ARRAY,INT64) -> ANY -STATEMENT WITH [1, 2, 3, 4, 5] AS list, {x: 3} AS idx RETURN list[idx]; @@ -134,3 +138,4 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],STRUCT(x:INT64)). Supported inputs are (VAR_LIST,INT64) -> ANY (STRING,INT64) -> STRING +(ARRAY,INT64) -> ANY diff --git a/test/test_files/tinysnb/function/array.test b/test/test_files/tinysnb/function/array.test new file mode 100644 index 00000000000..5b54403acac --- /dev/null +++ b/test/test_files/tinysnb/function/array.test @@ -0,0 +1,121 @@ +-GROUP TinySnbReadTest +-DATASET CSV tinysnb + +-- + +-CASE ArrayValue + +-LOG CreateArrayValue +-STATEMENT RETURN ARRAY_VALUE(3.2, 5.4, 7.2, 32.3) +---- 1 +[3.200000,5.400000,7.200000,32.300000] + +-LOG CreateArrayValueWithNull +-STATEMENT RETURN ARRAY_VALUE(2, 7, NULL, 256, 32, NULL) +---- 1 +[2,7,,256,32,] + +-LOG CreateEmptyArray +-STATEMENT RETURN ARRAY_VALUE() +---- 1 +[] + +-LOG CreateArrayRecursively +-STATEMENT RETURN ARRAY_VALUE(ARRAY_VALUE(3,2), ARRAY_VALUE(4,7), ARRAY_VALUE(-2,3)) +---- 1 +[[3,2],[4,7],[-2,3]] + +-CASE ArrayCrossProduct +-LOG ArrayCrossProductINT128 +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE(to_int128(1), to_int128(2), to_int128(3)), ARRAY_VALUE(to_int128(4), to_int128(5), to_int128(6))) +---- 1 +[-3,6,-3] + +-LOG ArrayCrossProductINT64 +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE(to_int64(148), to_int64(176), to_int64(112)), ARRAY_VALUE(to_int64(182), to_int64(187), to_int64(190))) +---- 1 +[12496,-7736,-4356] + +-LOG ArrayCrossProductINT32 +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE(to_int32(195), to_int32(894), to_int32(539)), ARRAY_VALUE(to_int32(823), to_int32(158), to_int32(177))) +---- 1 +[73076,409082,-704952] + +-LOG ArrayCrossProductINT16 +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE(to_int16(463), to_int16(184), to_int16(189)), ARRAY_VALUE(to_int16(94), to_int16(161), to_int16(410))) +---- 1 +[-20525,24544,-8289] + +-LOG ArrayCrossProductINT8 +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE(to_int8(12), to_int8(7), to_int8(6)), ARRAY_VALUE(to_int8(3), to_int8(4), to_int8(5))) +---- 1 +[11,-42,27] + +-LOG ArrayCrossProductFLOAT +-STATEMENT RETURN round(ARRAY_CROSS_PRODUCT(ARRAY_VALUE(TO_FLOAT(3.5), TO_FLOAT(2.55), TO_FLOAT(6.2)), ARRAY_VALUE(TO_FLOAT(4.2), TO_FLOAT(7.8), TO_FLOAT(9.254)))[1],2) +---- 1 +-24.760000 + +-LOG ArrayCrossProductDOUBLE +-STATEMENT RETURN round(ARRAY_CROSS_PRODUCT(ARRAY_VALUE(TO_DOUBLE(12.62), TO_DOUBLE(7.54), TO_DOUBLE(6.13)), ARRAY_VALUE(TO_DOUBLE(3.23), TO_DOUBLE(4.56), TO_DOUBLE(5.34)))[1],2) +---- 1 +12.310000 + +-LOG ArrayCrossProductTypeError +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE('test','test1'), ARRAY_VALUE('test2', 'test3')) +---- error +Binder exception: ARRAY_CROSS_PRODUCT can only be applied on array of floating points or integers + +-LOG ArrayCrossProductInCorrectSize +-STATEMENT RETURN ARRAY_CROSS_PRODUCT(ARRAY_VALUE(32, 54, 77), ARRAY_VALUE(31, 24)) +---- error +Binder exception: ARRAY_CROSS_PRODUCT requires both arrays to have the same element type and size of 3 + +-LOG ArrayCosineSimilarity +-STATEMENT MATCH (p:person)-[e:meets]->(p1:person) return round(ARRAY_COSINE_SIMILARITY(e.location, array_value(to_float(3.4), to_float(2.7))),2) +---- 7 +0.790000 +0.880000 +0.930000 +0.930000 +0.950000 +0.950000 +0.970000 + +-LOG ArrayCosineSimilarityWrongType +-STATEMENT MATCH (p:person) return ARRAY_COSINE_SIMILARITY(p.grades, p.grades) +---- error +Binder exception: ARRAY_COSINE_SIMILARITY requires argument type of FLOAT or DOUBLE. + +-LOG ArrayDistance +-STATEMENT MATCH (p:person)-[e:meets]->(p1:person) return round(ARRAY_DISTANCE(e.location, array_value(to_float(3.4), to_float(2.7))),2) +---- 7 +1.350000 +1.600000 +1.620000 +2.530000 +4.500000 +5.750000 +6.410000 + +-LOG ArrayInnerProduct +-STATEMENT MATCH (p:person)-[e:meets]->(p1:person) return round(ARRAY_INNER_PRODUCT(e.location, array_value(to_float(3.4), to_float(2.7))),2) +---- 7 +14.870000 +15.540000 +21.180000 +24.240000 +31.780000 +35.200000 +36.150000 + +-LOG ArrayDotProduct +-STATEMENT MATCH (p:person)-[e:meets]->(p1:person) return round(ARRAY_DOT_PRODUCT(e.location, array_value(to_float(5.6), to_float(2.1))),2) +---- 7 +18.330000 +21.910000 +24.950000 +27.720000 +31.220000 +38.160000 +51.230000 From 6860af06114ea6875ad99a98de2dab71477cb0bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Wed, 20 Mar 2024 15:25:56 +0800 Subject: [PATCH 055/136] Remove underscore from the badges in README (#3094) Similar to https://github.com/duckdb/duckdb/pull/11256 --- README.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 896c9a48af6..d35790073fc 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,13 @@ # Kùzu From f69ad021a9ebed85945f419b3aff665b4710b2c3 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Wed, 20 Mar 2024 15:15:09 -0400 Subject: [PATCH 056/136] Fix python prepared statement null value --- src/main/client_context.cpp | 3 +++ tools/python_api/src_cpp/py_connection.cpp | 8 +++++--- tools/python_api/test/test_prepared_statement.py | 12 ++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 1eac0c94ed6..98f59178e07 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -344,6 +344,9 @@ void ClientContext::bindParametersNoLock(PreparedStatement* preparedStatement, throw Exception("Parameter " + name + " not found."); } auto expectParam = parameterMap.at(name); + if (value->getDataType()->getLogicalTypeID() == LogicalTypeID::ANY) { + value->setDataType(*expectParam->getDataType()); + } if (*expectParam->getDataType() != *value->getDataType()) { throw Exception("Parameter " + name + " has data type " + value->getDataType()->toString() + " but expects " + diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 3778956eeee..155fe6a11db 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -2,13 +2,13 @@ #include +#include "cached_import/py_cached_import.h" #include "common/string_format.h" +#include "common/types/uuid.h" #include "datetime.h" // from Python -#include "cached_import/py_cached_import.h" #include "main/connection.h" #include "pandas/pandas_scan.h" #include "processor/result/factorized_table.h" -#include "common/types/uuid.h" using namespace kuzu::common; using namespace kuzu; @@ -179,7 +179,9 @@ Value transformPythonValue(py::handle val) { auto time_delta = importCache->datetime.timedelta(); auto datetime_date = importCache->datetime.date(); auto uuid = importCache->uuid.UUID(); - if (py::isinstance(val)) { + if (val.is_none()) { + return Value::createNullValue(); + } else if (py::isinstance(val)) { return Value::createValue(val.cast()); } else if (py::isinstance(val)) { return Value::createValue(val.cast()); diff --git a/tools/python_api/test/test_prepared_statement.py b/tools/python_api/test/test_prepared_statement.py index dc057d13650..4a2841ee296 100644 --- a/tools/python_api/test/test_prepared_statement.py +++ b/tools/python_api/test/test_prepared_statement.py @@ -33,6 +33,18 @@ def test_read(conn_db_readonly: ConnDB) -> None: assert not result.has_next() +def test_null_value(conn_db_readonly: ConnDB) -> None: + conn, _ = conn_db_readonly + prepared_statement = conn.prepare("RETURN [4, $1, 2, $3, 4]") + assert prepared_statement.is_success() + assert prepared_statement.get_error_message() == "" + + result = conn.execute(prepared_statement, {"1": None, "3": 5}) + assert result.has_next() + assert result.get_next() == [[4, None, 2, 5, 4]] + assert not result.has_next() + + def test_write(conn_db_readwrite: ConnDB) -> None: conn, _ = conn_db_readwrite orgs = [ From 568e08edab1ac24a93928c012d937489d62b3083 Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Tue, 19 Mar 2024 15:46:20 -0400 Subject: [PATCH 057/136] Refactor string functions --- src/common/vector/value_vector.cpp | 10 ++ src/function/built_in_function_utils.cpp | 61 ------------ src/function/function_collection.cpp | 17 ++++ src/function/vector_string_functions.cpp | 99 +++++++++---------- src/include/common/enums/expression_type.h | 28 ------ src/include/common/vector/value_vector.h | 1 + .../function/built_in_function_utils.h | 1 - .../function/string/vector_string_functions.h | 80 +++++++++++---- src/parser/transform/transform_expression.cpp | 11 ++- 9 files changed, 140 insertions(+), 168 deletions(-) diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index ad00a5e4ed9..8593a19f2af 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -435,6 +435,16 @@ ku_string_t& StringVector::reserveString(ValueVector* vector, uint32_t vectorPos return dstStr; } +void StringVector::reserveString(ValueVector* vector, ku_string_t& dstStr, uint64_t length) { + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); + auto stringBuffer = + ku_dynamic_cast(vector->auxiliaryBuffer.get()); + dstStr.len = length; + if (!ku_string_t::isShortString(length)) { + dstStr.overflowPtr = reinterpret_cast(stringBuffer->allocateOverflow(length)); + } +} + void StringVector::addString(ValueVector* vector, ku_string_t& dstStr, ku_string_t& srcStr) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); auto stringBuffer = diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 8f5be99ddbc..b301fb99d1f 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -22,7 +22,6 @@ #include "function/path/vector_path_functions.h" #include "function/rdf/vector_rdf_functions.h" #include "function/schema/vector_node_rel_functions.h" -#include "function/string/vector_string_functions.h" #include "function/struct/vector_struct_functions.h" #include "function/table/call_functions.h" #include "function/timestamp/vector_timestamp_functions.h" @@ -62,7 +61,6 @@ void BuiltInFunctionsUtils::registerScalarFunctions(CatalogSet* catalogSet) { registerDateFunctions(catalogSet); registerTimestampFunctions(catalogSet); registerIntervalFunctions(catalogSet); - registerStringFunctions(catalogSet); registerCastFunctions(catalogSet); registerListFunctions(catalogSet); registerStructFunctions(catalogSet); @@ -618,65 +616,6 @@ void BuiltInFunctionsUtils::registerUUIDFunctions(CatalogSet* catalogSet) { GEN_RANDOM_UUID_FUNC_NAME, GenRandomUUIDFunction::getFunctionSet())); } -void BuiltInFunctionsUtils::registerStringFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - ARRAY_EXTRACT_FUNC_NAME, ArrayExtractFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CONCAT_FUNC_NAME, ConcatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CONTAINS_FUNC_NAME, ContainsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ENDS_WITH_FUNC_NAME, EndsWithFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LCASE_FUNC_NAME, LowerFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LEFT_FUNC_NAME, LeftFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LOWER_FUNC_NAME, LowerFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LPAD_FUNC_NAME, LpadFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LTRIM_FUNC_NAME, LtrimFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - PREFIX_FUNC_NAME, StartsWithFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REPEAT_FUNC_NAME, RepeatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REVERSE_FUNC_NAME, ReverseFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - RIGHT_FUNC_NAME, RightFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - RPAD_FUNC_NAME, RpadFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - RTRIM_FUNC_NAME, RtrimFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - STARTS_WITH_FUNC_NAME, StartsWithFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SUBSTR_FUNC_NAME, SubStrFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SUBSTRING_FUNC_NAME, SubStrFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SUFFIX_FUNC_NAME, EndsWithFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TRIM_FUNC_NAME, TrimFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - UCASE_FUNC_NAME, UpperFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - UPPER_FUNC_NAME, UpperFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REGEXP_FULL_MATCH_FUNC_NAME, RegexpFullMatchFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REGEXP_MATCHES_FUNC_NAME, RegexpMatchesFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REGEXP_REPLACE_FUNC_NAME, RegexpReplaceFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REGEXP_EXTRACT_FUNC_NAME, RegexpExtractFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - REGEXP_EXTRACT_ALL_FUNC_NAME, RegexpExtractAllFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LEVENSHTEIN_FUNC_NAME, LevenshteinFunction::getFunctionSet())); -} - void BuiltInFunctionsUtils::registerCastFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( CAST_DATE_FUNC_NAME, CastToDateFunction::getFunctionSet())); diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 414eb6f96f5..615d0cff48e 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -2,6 +2,7 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/array/vector_array_functions.h" +#include "function/string/vector_string_functions.h" namespace kuzu { namespace function { @@ -36,6 +37,22 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION_ALIAS(PowerFunction), SCALAR_FUNCTION(RadiansFunction), SCALAR_FUNCTION(RoundFunction), SCALAR_FUNCTION(SinFunction), SCALAR_FUNCTION(SignFunction), SCALAR_FUNCTION(SqrtFunction), SCALAR_FUNCTION(TanFunction), + + // String Functions + SCALAR_FUNCTION(ArrayExtractFunction), SCALAR_FUNCTION(ConcatFunction), + SCALAR_FUNCTION(ContainsFunction), SCALAR_FUNCTION(LowerFunction), + SCALAR_FUNCTION_ALIAS(LowerFunction), SCALAR_FUNCTION(LeftFunction), + SCALAR_FUNCTION(LpadFunction), SCALAR_FUNCTION(LtrimFunction), + SCALAR_FUNCTION(StartsWithFunction), SCALAR_FUNCTION_ALIAS(StartsWithFunction), + SCALAR_FUNCTION(RepeatFunction), SCALAR_FUNCTION(ReverseFunction), + SCALAR_FUNCTION(RightFunction), SCALAR_FUNCTION(RpadFunction), + SCALAR_FUNCTION(RtrimFunction), SCALAR_FUNCTION(SubStrFunction), + SCALAR_FUNCTION_ALIAS(SubStrFunction), SCALAR_FUNCTION(EndsWithFunction), + SCALAR_FUNCTION_ALIAS(EndsWithFunction), SCALAR_FUNCTION(TrimFunction), + SCALAR_FUNCTION(UpperFunction), SCALAR_FUNCTION_ALIAS(UpperFunction), + SCALAR_FUNCTION(RegexpFullMatchFunction), SCALAR_FUNCTION(RegexpMatchesFunction), + SCALAR_FUNCTION(RegexpReplaceFunction), SCALAR_FUNCTION(RegexpExtractFunction), + SCALAR_FUNCTION(RegexpExtractAllFunction), SCALAR_FUNCTION(LevenshteinFunction), SCALAR_FUNCTION(ArrayValueFunction), SCALAR_FUNCTION(ArrayCrossProductFunction), SCALAR_FUNCTION(ArrayCosineSimilarityFunction), SCALAR_FUNCTION(ArrayDistanceFunction), SCALAR_FUNCTION(ArrayInnerProductFunction), SCALAR_FUNCTION(ArrayDotProductFunction), diff --git a/src/function/vector_string_functions.cpp b/src/function/vector_string_functions.cpp index fd285f6deb6..5e9d6962768 100644 --- a/src/function/vector_string_functions.cpp +++ b/src/function/vector_string_functions.cpp @@ -23,74 +23,65 @@ using namespace kuzu::common; namespace kuzu { namespace function { -void BaseLowerUpperFunction::operation(common::ku_string_t& input, common::ku_string_t& result, - common::ValueVector& resultValueVector, bool isUpper) { +void BaseLowerUpperFunction::operation( + ku_string_t& input, ku_string_t& result, ValueVector& resultValueVector, bool isUpper) { uint32_t resultLen = getResultLen((char*)input.getData(), input.len, isUpper); result.len = resultLen; - if (resultLen <= common::ku_string_t::SHORT_STR_LENGTH) { + if (resultLen <= ku_string_t::SHORT_STR_LENGTH) { convertCase((char*)result.prefix, input.len, (char*)input.getData(), isUpper); } else { - result.overflowPtr = reinterpret_cast( - common::StringVector::getInMemOverflowBuffer(&resultValueVector) - ->allocateSpace(result.len)); + StringVector::reserveString(&resultValueVector, result, resultLen); auto buffer = reinterpret_cast(result.overflowPtr); convertCase(buffer, input.len, (char*)input.getData(), isUpper); - memcpy(result.prefix, buffer, common::ku_string_t::PREFIX_LENGTH); + memcpy(result.prefix, buffer, ku_string_t::PREFIX_LENGTH); } } -void BaseStrOperation::operation(common::ku_string_t& input, common::ku_string_t& result, - common::ValueVector& resultValueVector, uint32_t (*strOperation)(char* data, uint32_t len)) { - if (input.len <= common::ku_string_t::SHORT_STR_LENGTH) { +void BaseStrOperation::operation(ku_string_t& input, ku_string_t& result, + ValueVector& resultValueVector, uint32_t (*strOperation)(char* data, uint32_t len)) { + if (input.len <= ku_string_t::SHORT_STR_LENGTH) { memcpy(result.prefix, input.prefix, input.len); result.len = strOperation((char*)result.prefix, input.len); } else { - result.overflowPtr = reinterpret_cast( - common::StringVector::getInMemOverflowBuffer(&resultValueVector) - ->allocateSpace(input.len)); + StringVector::reserveString(&resultValueVector, result, input.len); auto buffer = reinterpret_cast(result.overflowPtr); memcpy(buffer, input.getData(), input.len); result.len = strOperation(buffer, input.len); memcpy(result.prefix, buffer, - result.len < common::ku_string_t::PREFIX_LENGTH ? result.len : - common::ku_string_t::PREFIX_LENGTH); + result.len < ku_string_t::PREFIX_LENGTH ? result.len : ku_string_t::PREFIX_LENGTH); } } void Concat::concat(const char* left, uint32_t leftLen, const char* right, uint32_t rightLen, - common::ku_string_t& result, common::ValueVector& resultValueVector) { + ku_string_t& result, ValueVector& resultValueVector) { auto len = leftLen + rightLen; - if (len <= common::ku_string_t::SHORT_STR_LENGTH /* concat result is short */) { + if (len <= ku_string_t::SHORT_STR_LENGTH /* concat result is short */) { memcpy(result.prefix, left, leftLen); memcpy(result.prefix + leftLen, right, rightLen); } else { - result.overflowPtr = reinterpret_cast( - common::StringVector::getInMemOverflowBuffer(&resultValueVector)->allocateSpace(len)); + StringVector::reserveString(&resultValueVector, result, len); auto buffer = reinterpret_cast(result.overflowPtr); memcpy(buffer, left, leftLen); memcpy(buffer + leftLen, right, rightLen); - memcpy(result.prefix, buffer, common::ku_string_t::PREFIX_LENGTH); + memcpy(result.prefix, buffer, ku_string_t::PREFIX_LENGTH); } result.len = len; } -void Repeat::operation(common::ku_string_t& left, int64_t& right, common::ku_string_t& result, - common::ValueVector& resultValueVector) { +void Repeat::operation( + ku_string_t& left, int64_t& right, ku_string_t& result, ValueVector& resultValueVector) { result.len = left.len * right; - if (result.len <= common::ku_string_t::SHORT_STR_LENGTH) { + if (result.len <= ku_string_t::SHORT_STR_LENGTH) { repeatStr((char*)result.prefix, left.getAsString(), right); } else { - result.overflowPtr = reinterpret_cast( - common::StringVector::getInMemOverflowBuffer(&resultValueVector) - ->allocateSpace(result.len)); + StringVector::reserveString(&resultValueVector, result, result.len); auto buffer = reinterpret_cast(result.overflowPtr); repeatStr(buffer, left.getAsString(), right); - memcpy(result.prefix, buffer, common::ku_string_t::PREFIX_LENGTH); + memcpy(result.prefix, buffer, ku_string_t::PREFIX_LENGTH); } } -void Reverse::operation(common::ku_string_t& input, common::ku_string_t& result, - common::ValueVector& resultValueVector) { +void Reverse::operation(ku_string_t& input, ku_string_t& result, ValueVector& resultValueVector) { bool isAscii = true; std::string inputStr = input.getAsString(); for (uint32_t i = 0; i < input.len; i++) { @@ -103,12 +94,10 @@ void Reverse::operation(common::ku_string_t& input, common::ku_string_t& result, BaseStrOperation::operation(input, result, resultValueVector, reverseStr); } else { result.len = input.len; - if (result.len > common::ku_string_t::SHORT_STR_LENGTH) { - result.overflowPtr = reinterpret_cast( - common::StringVector::getInMemOverflowBuffer(&resultValueVector) - ->allocateSpace(input.len)); + if (result.len > ku_string_t::SHORT_STR_LENGTH) { + StringVector::reserveString(&resultValueVector, result, input.len); } - auto resultBuffer = result.len <= common::ku_string_t::SHORT_STR_LENGTH ? + auto resultBuffer = result.len <= ku_string_t::SHORT_STR_LENGTH ? reinterpret_cast(result.prefix) : reinterpret_cast(result.overflowPtr); utf8proc::utf8proc_grapheme_callback( @@ -116,15 +105,15 @@ void Reverse::operation(common::ku_string_t& input, common::ku_string_t& result, memcpy(resultBuffer + input.len - end, input.getData() + start, end - start); return true; }); - if (result.len > common::ku_string_t::SHORT_STR_LENGTH) { - memcpy(result.prefix, resultBuffer, common::ku_string_t::PREFIX_LENGTH); + if (result.len > ku_string_t::SHORT_STR_LENGTH) { + memcpy(result.prefix, resultBuffer, ku_string_t::PREFIX_LENGTH); } } } function_set ArrayExtractFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(ARRAY_EXTRACT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::BinaryExecFunction, @@ -134,7 +123,7 @@ function_set ArrayExtractFunction::getFunctionSet() { function_set ConcatFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(CONCAT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::STRING, ScalarFunction::BinaryStringExecFunction, @@ -144,7 +133,7 @@ function_set ConcatFunction::getFunctionSet() { function_set ContainsFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(CONTAINS_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::BOOL, ScalarFunction::BinaryExecFunction, @@ -155,7 +144,7 @@ function_set ContainsFunction::getFunctionSet() { function_set EndsWithFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(ENDS_WITH_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::BOOL, ScalarFunction::BinaryExecFunction, @@ -166,7 +155,7 @@ function_set EndsWithFunction::getFunctionSet() { function_set LeftFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(LEFT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::BinaryStringExecFunction, @@ -176,7 +165,7 @@ function_set LeftFunction::getFunctionSet() { function_set LpadFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(LPAD_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::STRING}, LogicalTypeID::STRING, @@ -188,7 +177,7 @@ function_set LpadFunction::getFunctionSet() { function_set RepeatFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(REPEAT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::BinaryStringExecFunction, @@ -198,7 +187,7 @@ function_set RepeatFunction::getFunctionSet() { function_set RightFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(RIGHT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::BinaryStringExecFunction, @@ -208,7 +197,7 @@ function_set RightFunction::getFunctionSet() { function_set RpadFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(RPAD_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::STRING}, LogicalTypeID::STRING, @@ -220,7 +209,7 @@ function_set RpadFunction::getFunctionSet() { function_set StartsWithFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(STARTS_WITH_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::BOOL, ScalarFunction::BinaryExecFunction, @@ -231,7 +220,7 @@ function_set StartsWithFunction::getFunctionSet() { function_set SubStrFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(SUBSTRING_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::INT64}, LogicalTypeID::STRING, @@ -243,7 +232,7 @@ function_set SubStrFunction::getFunctionSet() { function_set RegexpFullMatchFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(REGEXP_FULL_MATCH_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::BOOL, ScalarFunction::BinaryExecFunction, @@ -254,7 +243,7 @@ function_set RegexpFullMatchFunction::getFunctionSet() { function_set RegexpMatchesFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(REGEXP_MATCHES_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::BOOL, ScalarFunction::BinaryExecFunction, @@ -267,7 +256,7 @@ function_set RegexpReplaceFunction::getFunctionSet() { function_set functionSet; // Todo: Implement a function with modifiers // regexp_replace(string, regex, replacement, modifiers) - functionSet.emplace_back(make_unique(REGEXP_REPLACE_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::STRING, @@ -279,13 +268,13 @@ function_set RegexpReplaceFunction::getFunctionSet() { function_set RegexpExtractFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(REGEXP_EXTRACT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::STRING, ScalarFunction::BinaryStringExecFunction, false /* isVarLength */)); - functionSet.emplace_back(make_unique(REGEXP_EXTRACT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, @@ -297,13 +286,13 @@ function_set RegexpExtractFunction::getFunctionSet() { function_set RegexpExtractAllFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(REGEXP_EXTRACT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::VAR_LIST, ScalarFunction::BinaryStringExecFunction, nullptr, bindFunc, false /* isVarLength */)); - functionSet.emplace_back(make_unique(REGEXP_EXTRACT_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::VAR_LIST, @@ -320,7 +309,7 @@ std::unique_ptr RegexpExtractAllFunction::bindFunc( function_set LevenshteinFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(LEVENSHTEIN_FUNC_NAME, + functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::INT64, ScalarFunction::BinaryExecFunction, nullptr, diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index df5e032bcf0..376afffa9a2 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -106,36 +106,8 @@ const char* const LESS_THAN_FUNC_NAME = "LESS_THAN"; const char* const LESS_THAN_EQUALS_FUNC_NAME = "LESS_THAN_EQUALS"; // string -const char* const ARRAY_EXTRACT_FUNC_NAME = "ARRAY_EXTRACT"; -const char* const CONCAT_FUNC_NAME = "CONCAT"; -const char* const CONTAINS_FUNC_NAME = "CONTAINS"; -const char* const ENDS_WITH_FUNC_NAME = "ENDS_WITH"; -const char* const LCASE_FUNC_NAME = "LCASE"; -const char* const LEFT_FUNC_NAME = "LEFT"; const char* const LENGTH_FUNC_NAME = "LENGTH"; -const char* const LOWER_FUNC_NAME = "LOWER"; -const char* const LPAD_FUNC_NAME = "LPAD"; -const char* const LTRIM_FUNC_NAME = "LTRIM"; -const char* const PREFIX_FUNC_NAME = "PREFIX"; -const char* const REPEAT_FUNC_NAME = "REPEAT"; -const char* const REVERSE_FUNC_NAME = "REVERSE"; -const char* const RIGHT_FUNC_NAME = "RIGHT"; -const char* const RPAD_FUNC_NAME = "RPAD"; -const char* const RTRIM_FUNC_NAME = "RTRIM"; -const char* const STARTS_WITH_FUNC_NAME = "STARTS_WITH"; -const char* const SUBSTR_FUNC_NAME = "SUBSTR"; -const char* const SUBSTRING_FUNC_NAME = "SUBSTRING"; -const char* const SUFFIX_FUNC_NAME = "SUFFIX"; -const char* const TRIM_FUNC_NAME = "TRIM"; -const char* const UCASE_FUNC_NAME = "UCASE"; -const char* const UPPER_FUNC_NAME = "UPPER"; -const char* const REGEXP_FULL_MATCH_FUNC_NAME = "REGEXP_FULL_MATCH"; -const char* const REGEXP_MATCHES_FUNC_NAME = "REGEXP_MATCHES"; -const char* const REGEXP_REPLACE_FUNC_NAME = "REGEXP_REPLACE"; -const char* const REGEXP_EXTRACT_FUNC_NAME = "REGEXP_EXTRACT"; -const char* const REGEXP_EXTRACT_ALL_FUNC_NAME = "REGEXP_EXTRACT_ALL"; const char* const SIZE_FUNC_NAME = "SIZE"; -const char* const LEVENSHTEIN_FUNC_NAME = "LEVENSHTEIN"; // Date functions. const char* const DATE_PART_FUNC_NAME = "DATE_PART"; diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index ad28f89e0d9..d780a2cd72e 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -123,6 +123,7 @@ class KUZU_API StringVector { // Add empty string with space reserved for the provided size // Returned value can be modified to set the string contents static ku_string_t& reserveString(ValueVector* vector, uint32_t vectorPos, uint64_t length); + static void reserveString(ValueVector* vector, ku_string_t& dstStr, uint64_t length); static void addString(ValueVector* vector, ku_string_t& dstStr, ku_string_t& srcStr); static void addString( ValueVector* vector, ku_string_t& dstStr, const char* srcStr, uint64_t length); diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index afaad43eb62..054dd8573e6 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -88,7 +88,6 @@ class BuiltInFunctionsUtils { static void registerIntervalFunctions(catalog::CatalogSet* catalogSet); static void registerBlobFunctions(catalog::CatalogSet* catalogSet); static void registerUUIDFunctions(catalog::CatalogSet* catalogSet); - static void registerStringFunctions(catalog::CatalogSet* catalogSet); static void registerCastFunctions(catalog::CatalogSet* catalogSet); static void registerListFunctions(catalog::CatalogSet* catalogSet); static void registerStructFunctions(catalog::CatalogSet* catalogSet); diff --git a/src/include/function/string/vector_string_functions.h b/src/include/function/string/vector_string_functions.h index 6eb07dc06c8..81dfc9b514a 100644 --- a/src/include/function/string/vector_string_functions.h +++ b/src/include/function/string/vector_string_functions.h @@ -26,108 +26,152 @@ struct VectorStringFunction { }; struct ArrayExtractFunction { + static constexpr const char* name = "ARRAY_EXTRACT"; + static function_set getFunctionSet(); }; struct ConcatFunction : public VectorStringFunction { + static constexpr const char* name = "CONCAT"; + static function_set getFunctionSet(); }; struct ContainsFunction : public VectorStringFunction { + static constexpr const char* name = "CONTAINS"; + static function_set getFunctionSet(); }; struct EndsWithFunction : public VectorStringFunction { + static constexpr const char* name = "ENDS_WITH"; + + static constexpr const char* alias = "SUFFIX"; + static function_set getFunctionSet(); }; struct LeftFunction : public VectorStringFunction { + static constexpr const char* name = "LEFT"; + static function_set getFunctionSet(); }; struct LowerFunction : public VectorStringFunction { - static inline function_set getFunctionSet() { - return getUnaryStrFunction(common::LOWER_FUNC_NAME); - } + static constexpr const char* name = "LOWER"; + + static constexpr const char* alias = "LCASE"; + + static inline function_set getFunctionSet() { return getUnaryStrFunction(name); } }; struct LpadFunction : public VectorStringFunction { + static constexpr const char* name = "LPAD"; + static function_set getFunctionSet(); }; struct LtrimFunction : public VectorStringFunction { - static inline function_set getFunctionSet() { - return getUnaryStrFunction(common::LTRIM_FUNC_NAME); - } + static constexpr const char* name = "LTRIM"; + + static inline function_set getFunctionSet() { return getUnaryStrFunction(name); } }; struct RepeatFunction : public VectorStringFunction { + static constexpr const char* name = "REPEAT"; + static function_set getFunctionSet(); }; struct ReverseFunction : public VectorStringFunction { - static inline function_set getFunctionSet() { - return getUnaryStrFunction(common::REVERSE_FUNC_NAME); - } + static constexpr const char* name = "REVERSE"; + + static inline function_set getFunctionSet() { return getUnaryStrFunction(name); } }; struct RightFunction : public VectorStringFunction { + static constexpr const char* name = "RIGHT"; + static function_set getFunctionSet(); }; struct RpadFunction : public VectorStringFunction { + static constexpr const char* name = "RPAD"; + static function_set getFunctionSet(); }; struct RtrimFunction : public VectorStringFunction { - static inline function_set getFunctionSet() { - return getUnaryStrFunction(common::RTRIM_FUNC_NAME); - } + static constexpr const char* name = "RTRIM"; + + static inline function_set getFunctionSet() { return getUnaryStrFunction(name); } }; struct StartsWithFunction : public VectorStringFunction { + static constexpr const char* name = "STARTS_WITH"; + + static constexpr const char* alias = "PREFIX"; + static function_set getFunctionSet(); }; struct SubStrFunction : public VectorStringFunction { + static constexpr const char* name = "SUBSTR"; + + static constexpr const char* alias = "SUBSTRING"; + static function_set getFunctionSet(); }; struct TrimFunction : public VectorStringFunction { - static inline function_set getFunctionSet() { - return getUnaryStrFunction(common::TRIM_FUNC_NAME); - } + static constexpr const char* name = "TRIM"; + + static inline function_set getFunctionSet() { return getUnaryStrFunction(name); } }; struct UpperFunction : public VectorStringFunction { - static inline function_set getFunctionSet() { - return getUnaryStrFunction(common::UPPER_FUNC_NAME); - } + static constexpr const char* name = "UPPER"; + + static constexpr const char* alias = "UCASE"; + + static inline function_set getFunctionSet() { return getUnaryStrFunction(name); } }; struct RegexpFullMatchFunction : public VectorStringFunction { + static constexpr const char* name = "REGEXP_FULL_MATCH"; + static function_set getFunctionSet(); }; struct RegexpMatchesFunction : public VectorStringFunction { + static constexpr const char* name = "REGEXP_MATCHES"; + static function_set getFunctionSet(); }; struct RegexpReplaceFunction : public VectorStringFunction { + static constexpr const char* name = "REGEXP_REPLACE"; + static function_set getFunctionSet(); }; struct RegexpExtractFunction : public VectorStringFunction { + static constexpr const char* name = "REGEXP_EXTRACT"; + static function_set getFunctionSet(); }; struct RegexpExtractAllFunction : public VectorStringFunction { + static constexpr const char* name = "REGEXP_EXTRACT_ALL"; + static function_set getFunctionSet(); static std::unique_ptr bindFunc( const binder::expression_vector& arguments, Function* function); }; struct LevenshteinFunction : public VectorStringFunction { + static constexpr const char* name = "LEVENSHTEIN"; + static function_set getFunctionSet(); }; diff --git a/src/parser/transform/transform_expression.cpp b/src/parser/transform/transform_expression.cpp index 97192c200bd..e62512ecc8f 100644 --- a/src/parser/transform/transform_expression.cpp +++ b/src/parser/transform/transform_expression.cpp @@ -1,5 +1,6 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/cast/functions/cast_from_string_functions.h" +#include "function/string/vector_string_functions.h" #include "parser/expression/parsed_case_expression.h" #include "parser/expression/parsed_function_expression.h" #include "parser/expression/parsed_literal_expression.h" @@ -272,17 +273,17 @@ std::unique_ptr Transformer::transformStringOperatorExpression auto rawExpression = propertyExpression->getRawName() + " " + ctx.getText(); auto right = transformPropertyOrLabelsExpression(*ctx.oC_PropertyOrLabelsExpression()); if (ctx.STARTS()) { - return std::make_unique( - STARTS_WITH_FUNC_NAME, std::move(propertyExpression), std::move(right), rawExpression); + return std::make_unique(StartsWithFunction::name, + std::move(propertyExpression), std::move(right), rawExpression); } else if (ctx.ENDS()) { return std::make_unique( - ENDS_WITH_FUNC_NAME, std::move(propertyExpression), std::move(right), rawExpression); + EndsWithFunction::name, std::move(propertyExpression), std::move(right), rawExpression); } else if (ctx.CONTAINS()) { return std::make_unique( - CONTAINS_FUNC_NAME, std::move(propertyExpression), std::move(right), rawExpression); + ContainsFunction::name, std::move(propertyExpression), std::move(right), rawExpression); } else { KU_ASSERT(ctx.oC_RegularExpression()); - return std::make_unique(REGEXP_FULL_MATCH_FUNC_NAME, + return std::make_unique(RegexpFullMatchFunction::name, std::move(propertyExpression), std::move(right), rawExpression); } } From 05359c7db2f5b6fbf75c912b278a6ef551e45113 Mon Sep 17 00:00:00 2001 From: Prashanth Rao <35005448+prrao87@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:01:32 -0400 Subject: [PATCH 058/136] Arrow chunk_size as keyword argument (#3084) * Fix #2998: Arrow chunk_size as keyword argument * Adaptive chunk size logic for get_as_arrow * Run formatter * Fix missing kwarg * Fix chunk sizes for arrow tests * Provide polars users the means to customize chunk_size * test small chunk_size for polars and arrow * Revert to small test chunk sizes * Rework chunk_size defaults and conditions * Fix conditional logic * Cover 0, -1, None and fixed int params for chunk_size in tests --- tools/python_api/src_py/query_result.py | 43 +++++++++++++++++++------ tools/python_api/test/test_arrow.py | 10 +++--- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/tools/python_api/src_py/query_result.py b/tools/python_api/src_py/query_result.py index f91d8c28244..861d1880047 100644 --- a/tools/python_api/src_py/query_result.py +++ b/tools/python_api/src_py/query_result.py @@ -123,10 +123,20 @@ def get_as_df(self) -> pd.DataFrame: return self._query_result.getAsDF() - def get_as_pl(self) -> pl.DataFrame: + def get_as_pl(self, chunk_size: int | None = None) -> pl.DataFrame: """ Get the query result as a Polars DataFrame. + Parameters + ---------- + chunk_size : Number of rows to include in each chunk. + None + The chunk size is adaptive and depends on the number of columns in the query result. + -1 or 0 + The entire result is returned as a single chunk. + > 0 + The chunk size is the number of elements specified. + See Also -------- get_as_df : Get the query result as a Pandas DataFrame. @@ -139,20 +149,23 @@ def get_as_pl(self) -> pl.DataFrame: """ import polars as pl - target_n_elems = 10_000_000 # adaptive chunk_size; target 10m elements per chunk - target_chunk_size = max(target_n_elems // len(self.get_column_names()), 10) - return pl.from_arrow( # type: ignore[return-value] - data=self.get_as_arrow(chunk_size=target_chunk_size), - ) + self.check_for_query_result_close() + + return pl.from_arrow(data=self.get_as_arrow(chunk_size=chunk_size)) - def get_as_arrow(self, chunk_size: int) -> pa.Table: + def get_as_arrow(self, chunk_size: int | None = None) -> pa.Table: """ Get the query result as a PyArrow Table. Parameters ---------- - chunk_size : int - Number of rows to include in each chunk. + chunk_size : Number of rows to include in each chunk. + None + The chunk size is adaptive and depends on the number of columns in the query result. + -1 or 0 + The entire result is returned as a single chunk. + > 0 + The chunk size is the number of elements specified. See Also -------- @@ -166,7 +179,17 @@ def get_as_arrow(self, chunk_size: int) -> pa.Table: """ self.check_for_query_result_close() - return self._query_result.getAsArrow(chunk_size) + if chunk_size is None: + # Adaptive chunk_size; target number of elements per chunk_size + target_chunk_size = max(1_000_000 // len(self.get_column_names()), 10) + elif chunk_size <= 0: + # No chunking: return the entire result as a single chunk + target_chunk_size = self.get_num_tuples() + else: + # Chunk size is the number of elements specified + target_chunk_size = chunk_size + + return self._query_result.getAsArrow(target_chunk_size) def get_column_data_types(self) -> list[str]: """ diff --git a/tools/python_api/test/test_arrow.py b/tools/python_api/test/test_arrow.py index 91697cdb794..8805e6ecf39 100644 --- a/tools/python_api/test/test_arrow.py +++ b/tools/python_api/test/test_arrow.py @@ -459,7 +459,7 @@ def _test_with_nulls(_conn: kuzu.Connection, return_type: str, chunk_size: int | _test_utf8_string(conn, "arrow", 3) _test_utf8_string(conn, "pl") _test_in_small_chunk_size(conn, "arrow", 4) - _test_in_small_chunk_size(conn, "pl") + _test_in_small_chunk_size(conn, "pl", 4) _test_with_nulls(conn, "arrow", 12) _test_with_nulls(conn, "pl") @@ -470,7 +470,7 @@ def test_to_arrow_complex(conn_db_readonly: ConnDB) -> None: def _test_node(_conn: kuzu.Connection) -> None: query = "MATCH (p:person) RETURN p ORDER BY p.ID" query_result = _conn.execute(query) - arrow_tbl = query_result.get_as_arrow(12) + arrow_tbl = query_result.get_as_arrow() p_col = arrow_tbl.column(0) assert p_col.to_pylist() == [ @@ -487,7 +487,7 @@ def _test_node(_conn: kuzu.Connection) -> None: def _test_node_rel(_conn: kuzu.Connection) -> None: query = "MATCH (a:person)-[e:workAt]->(b:organisation) RETURN a, e, b;" query_result = _conn.execute(query) - arrow_tbl = query_result.get_as_arrow(12) + arrow_tbl = query_result.get_as_arrow(0) assert arrow_tbl.num_columns == 3 a_col = arrow_tbl.column(0) assert len(a_col) == 3 @@ -528,7 +528,7 @@ def _test_node_rel(_conn: kuzu.Connection) -> None: def _test_marries_table(_conn: kuzu.Connection) -> None: query = "MATCH (:person)-[e:marries]->(:person) RETURN e.*" - arrow_tbl = _conn.execute(query).get_as_arrow(8) + arrow_tbl = _conn.execute(query).get_as_arrow(0) assert arrow_tbl.num_columns == 3 used_addr_col = arrow_tbl.column(0) @@ -553,5 +553,5 @@ def _test_marries_table(_conn: kuzu.Connection) -> None: def test_to_arrow1(conn_db_readonly: ConnDB) -> None: conn, db = conn_db_readonly query = "MATCH (a:person)-[e:knows]->(:person) RETURN e.summary" - arrow_tbl = conn.execute(query).get_as_arrow(8) + arrow_tbl = conn.execute(query).get_as_arrow(-1) assert arrow_tbl == [] From 3c90c16573a061b3c1d7657f4f3396cb13cd6cac Mon Sep 17 00:00:00 2001 From: Prashanth Rao <35005448+prrao87@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:01:51 -0400 Subject: [PATCH 059/136] Update rustdoc to show how to enable parallel compilation (#3099) * Update rustdoc to show parallel compilation option * Clarify verbiage --- tools/rust_api/src/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/rust_api/src/lib.rs b/tools/rust_api/src/lib.rs index 883a01432b1..0775a451f59 100644 --- a/tools/rust_api/src/lib.rs +++ b/tools/rust_api/src/lib.rs @@ -23,13 +23,15 @@ //! //! ## Safety //! -//! Generally, use of of this API is safe, however creating multiple databases in the same -//! scope is not safe. +//! Generally, use of this API is safe - however creating multiple databases in the same +//! scope is not considered safe. //! If you need to access multiple databases you will need to do so in separate processes. //! //! ## Building //! //! By default, the kuzu C++ library will be compiled from source and statically linked. +//! If the kuzu C++ library is not being built using multiple threads by default, you can set the +//! CMAKE_BUILD_PARALLEL_LEVEL environment variable to potentially speed up the build process. //! //! If you want to instead link against a pre-built version of the library, the following environment //! variables can be used to configure the build process: From f6b1d6a53e860732a4f8a1f453ad941b80c689ec Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Thu, 21 Mar 2024 14:34:50 -0400 Subject: [PATCH 060/136] Improve copy-to-parquet perf --- .../operator/persistent/copy_to_parquet.h | 14 +++++++++----- src/processor/map/map_copy_to.cpp | 5 ++++- .../operator/persistent/copy_to_parquet.cpp | 7 ++++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/include/processor/operator/persistent/copy_to_parquet.h b/src/include/processor/operator/persistent/copy_to_parquet.h index 3e801857b3a..1a79b318343 100644 --- a/src/include/processor/operator/persistent/copy_to_parquet.h +++ b/src/include/processor/operator/persistent/copy_to_parquet.h @@ -13,16 +13,18 @@ struct CopyToParquetInfo final : public CopyToInfo { kuzu_parquet::format::CompressionCodec::SNAPPY; std::unique_ptr tableSchema; std::vector> types; + DataPos countingVecPos; CopyToParquetInfo(std::unique_ptr tableSchema, std::vector> types, std::vector names, - std::vector dataPoses, std::string fileName) + std::vector dataPoses, std::string fileName, DataPos countingVecPos) : CopyToInfo{std::move(names), std::move(dataPoses), std::move(fileName)}, - tableSchema{std::move(tableSchema)}, types{std::move(types)} {} + tableSchema{std::move(tableSchema)}, types{std::move(types)}, countingVecPos{std::move( + countingVecPos)} {} - inline std::unique_ptr copy() override { - return std::make_unique( - tableSchema->copy(), common::LogicalType::copy(types), names, dataPoses, fileName); + std::unique_ptr copy() override { + return std::make_unique(tableSchema->copy(), + common::LogicalType::copy(types), names, dataPoses, fileName, countingVecPos); } }; @@ -35,8 +37,10 @@ class CopyToParquetLocalState final : public CopyToLocalState { private: std::unique_ptr ft; + uint64_t numTuplesInFT; std::vector vectorsToAppend; storage::MemoryManager* mm; + common::ValueVector* countingVec; }; class CopyToParquetSharedState final : public CopyToSharedState { diff --git a/src/processor/map/map_copy_to.cpp b/src/processor/map/map_copy_to.cpp index 58e8257f822..9e23ab1fa8b 100644 --- a/src/processor/map/map_copy_to.cpp +++ b/src/processor/map/map_copy_to.cpp @@ -18,6 +18,7 @@ std::unique_ptr getCopyToInfo(Schema* childSchema, std::string fileP case FileType::PARQUET: { auto copyToSchema = std::make_unique(); auto copyToExpressions = childSchema->getExpressionsInScope(); + auto countingVecPos = DataPos(childSchema->getExpressionPos(*copyToExpressions[0])); for (auto& copyToExpression : copyToExpressions) { auto [dataChunkPos, vectorPos] = childSchema->getExpressionPos(*copyToExpression); std::unique_ptr columnSchema; @@ -25,6 +26,7 @@ std::unique_ptr getCopyToInfo(Schema* childSchema, std::string fileP // payload is unFlat and not in the same group as keys columnSchema = std::make_unique( true /* isUnFlat */, dataChunkPos, sizeof(overflow_value_t)); + countingVecPos = DataPos(childSchema->getExpressionPos(*copyToExpression)); } else { columnSchema = std::make_unique(false /* isUnFlat */, dataChunkPos, LogicalTypeUtils::getRowLayoutSize(copyToExpression->getDataType())); @@ -32,7 +34,8 @@ std::unique_ptr getCopyToInfo(Schema* childSchema, std::string fileP copyToSchema->appendColumn(std::move(columnSchema)); } return std::make_unique(std::move(copyToSchema), std::move(columnsTypes), - std::move(columnNames), std::move(vectorsToCopyPos), std::move(filePath)); + std::move(columnNames), std::move(vectorsToCopyPos), std::move(filePath), + std::move(countingVecPos)); } case FileType::CSV: { return std::make_unique(std::move(columnNames), std::move(vectorsToCopyPos), diff --git a/src/processor/operator/persistent/copy_to_parquet.cpp b/src/processor/operator/persistent/copy_to_parquet.cpp index d74e9884b36..31795cdda8b 100644 --- a/src/processor/operator/persistent/copy_to_parquet.cpp +++ b/src/processor/operator/persistent/copy_to_parquet.cpp @@ -10,7 +10,10 @@ void CopyToParquetLocalState::init( CopyToInfo* info, storage::MemoryManager* mm, ResultSet* resultSet) { auto copyToInfo = reinterpret_cast(info); ft = std::make_unique(mm, std::move(copyToInfo->tableSchema)); + numTuplesInFT = 0; + countingVec = nullptr; vectorsToAppend.reserve(info->dataPoses.size()); + countingVec = resultSet->getValueVector(copyToInfo->countingVecPos).get(); for (auto& pos : info->dataPoses) { vectorsToAppend.push_back(resultSet->getValueVector(pos).get()); } @@ -19,8 +22,10 @@ void CopyToParquetLocalState::init( void CopyToParquetLocalState::sink(CopyToSharedState* sharedState, CopyToInfo* /*info*/) { ft->append(vectorsToAppend); - if (ft->getTotalNumFlatTuples() > StorageConstants::NODE_GROUP_SIZE) { + numTuplesInFT += countingVec->state->selVector->selectedSize; + if (numTuplesInFT > StorageConstants::NODE_GROUP_SIZE) { reinterpret_cast(sharedState)->flush(*ft); + numTuplesInFT = 0; } } From 68c28564ca12e82a68d48c9a112fa37a06efdb36 Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Tue, 19 Mar 2024 17:39:34 -0400 Subject: [PATCH 061/136] Refactor list functions --- src/function/built_in_function_utils.cpp | 70 --- src/function/function_collection.cpp | 23 + src/function/vector_array_functions.cpp | 2 + src/function/vector_list_functions.cpp | 567 ++++++++++++------ src/function/vector_map_functions.cpp | 77 ++- src/include/common/enums/expression_type.h | 35 -- .../function/array/vector_array_functions.h | 35 ++ .../function/built_in_function_utils.h | 1 - .../function/list/vector_list_functions.h | 290 ++------- src/parser/transform/transform_expression.cpp | 9 +- 10 files changed, 568 insertions(+), 541 deletions(-) diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index b301fb99d1f..839961b5119 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -62,7 +62,6 @@ void BuiltInFunctionsUtils::registerScalarFunctions(CatalogSet* catalogSet) { registerTimestampFunctions(catalogSet); registerIntervalFunctions(catalogSet); registerCastFunctions(catalogSet); - registerListFunctions(catalogSet); registerStructFunctions(catalogSet); registerMapFunctions(catalogSet); registerUnionFunctions(catalogSet); @@ -669,75 +668,6 @@ void BuiltInFunctionsUtils::registerCastFunctions(CatalogSet* catalogSet) { CAST_FUNC_NAME, CastAnyFunction::getFunctionSet())); } -void BuiltInFunctionsUtils::registerListFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - LIST_CREATION_FUNC_NAME, ListCreationFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_RANGE_FUNC_NAME, ListRangeFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SIZE_FUNC_NAME, SizeFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_EXTRACT_FUNC_NAME, ListExtractFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_ELEMENT_FUNC_NAME, ListExtractFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_CONCAT_FUNC_NAME, ListConcatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_CAT_FUNC_NAME, ListConcatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_CONCAT_FUNC_NAME, ListConcatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_CAT_FUNC_NAME, ListConcatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_APPEND_FUNC_NAME, ListAppendFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_APPEND_FUNC_NAME, ListAppendFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_PUSH_BACK_FUNC_NAME, ListAppendFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_PREPEND_FUNC_NAME, ListPrependFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_PREPEND_FUNC_NAME, ListPrependFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_PUSH_FRONT_FUNC_NAME, ListPrependFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_POSITION_FUNC_NAME, ListPositionFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_POSITION_FUNC_NAME, ListPositionFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_INDEXOF_FUNC_NAME, ListPositionFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_INDEXOF_FUNC_NAME, ListPositionFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_CONTAINS_FUNC_NAME, ListContainsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_HAS_FUNC_NAME, ListContainsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_CONTAINS_FUNC_NAME, ListContainsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_HAS_FUNC_NAME, ListContainsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_SLICE_FUNC_NAME, ListSliceFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ARRAY_SLICE_FUNC_NAME, ListSliceFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_SORT_FUNC_NAME, ListSortFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_REVERSE_SORT_FUNC_NAME, ListReverseSortFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_SUM_FUNC_NAME, ListSumFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_PRODUCT_FUNC_NAME, ListProductFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_DISTINCT_FUNC_NAME, ListDistinctFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_UNIQUE_FUNC_NAME, ListUniqueFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_ANY_VALUE_FUNC_NAME, ListAnyValueFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LIST_REVERSE_FUNC_NAME, ListReverseFunction::getFunctionSet())); -} - void BuiltInFunctionsUtils::registerStructFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( STRUCT_PACK_FUNC_NAME, StructPackFunctions::getFunctionSet())); diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 615d0cff48e..9ce91ec019e 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -2,6 +2,7 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/array/vector_array_functions.h" +#include "function/list/vector_list_functions.h" #include "function/string/vector_string_functions.h" namespace kuzu { @@ -53,9 +54,31 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION(RegexpFullMatchFunction), SCALAR_FUNCTION(RegexpMatchesFunction), SCALAR_FUNCTION(RegexpReplaceFunction), SCALAR_FUNCTION(RegexpExtractFunction), SCALAR_FUNCTION(RegexpExtractAllFunction), SCALAR_FUNCTION(LevenshteinFunction), + + // Array Functions SCALAR_FUNCTION(ArrayValueFunction), SCALAR_FUNCTION(ArrayCrossProductFunction), SCALAR_FUNCTION(ArrayCosineSimilarityFunction), SCALAR_FUNCTION(ArrayDistanceFunction), SCALAR_FUNCTION(ArrayInnerProductFunction), SCALAR_FUNCTION(ArrayDotProductFunction), + + // List functions + SCALAR_FUNCTION(ListCreationFunction), SCALAR_FUNCTION(ListRangeFunction), + SCALAR_FUNCTION(ListExtractFunction), SCALAR_FUNCTION_ALIAS(ListExtractFunction), + SCALAR_FUNCTION(ListConcatFunction), SCALAR_FUNCTION_ALIAS(ListConcatFunction), + SCALAR_FUNCTION(ArrayConcatFunction), SCALAR_FUNCTION_ALIAS(ArrayConcatFunction), + SCALAR_FUNCTION(ListAppendFunction), SCALAR_FUNCTION(ArrayAppendFunction), + SCALAR_FUNCTION_ALIAS(ArrayAppendFunction), SCALAR_FUNCTION(ListPrependFunction), + SCALAR_FUNCTION(ArrayPrependFunction), SCALAR_FUNCTION_ALIAS(ArrayPrependFunction), + SCALAR_FUNCTION(ListPositionFunction), SCALAR_FUNCTION_ALIAS(ListPositionFunction), + SCALAR_FUNCTION(ArrayPositionFunction), SCALAR_FUNCTION_ALIAS(ArrayPositionFunction), + SCALAR_FUNCTION(ListContainsFunction), SCALAR_FUNCTION_ALIAS(ListContainsFunction), + SCALAR_FUNCTION(ArrayContainsFunction), SCALAR_FUNCTION_ALIAS(ArrayContainsFunction), + SCALAR_FUNCTION(ListSliceFunction), SCALAR_FUNCTION(ArraySliceFunction), + SCALAR_FUNCTION(ListSortFunction), SCALAR_FUNCTION(ListReverseSortFunction), + SCALAR_FUNCTION(ListSumFunction), SCALAR_FUNCTION(ListProductFunction), + SCALAR_FUNCTION(ListDistinctFunction), SCALAR_FUNCTION(ListUniqueFunction), + SCALAR_FUNCTION(ListAnyValueFunction), SCALAR_FUNCTION(ListReverseFunction), + SCALAR_FUNCTION(SizeFunction), + // End of array FINAL_FUNCTION}; diff --git a/src/function/vector_array_functions.cpp b/src/function/vector_array_functions.cpp index bfe77e97954..bdd06ea7e0f 100644 --- a/src/function/vector_array_functions.cpp +++ b/src/function/vector_array_functions.cpp @@ -1,10 +1,12 @@ #include "function/array/vector_array_functions.h" +#include "common/exception/binder.h" #include "function/array/functions/array_cosine_similarity.h" #include "function/array/functions/array_cross_product.h" #include "function/array/functions/array_distance.h" #include "function/array/functions/array_inner_product.h" #include "function/list/vector_list_functions.h" +#include "function/scalar_function.h" using namespace kuzu::common; diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index 41f3e7ffff4..9648d2d260a 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -2,6 +2,8 @@ #include "common/exception/binder.h" #include "common/exception/runtime.h" +#include "common/types/int128_t.h" +#include "common/types/interval_t.h" #include "function/list/functions/list_any_value_function.h" #include "function/list/functions/list_append_function.h" #include "function/list/functions/list_concat_function.h" @@ -19,12 +21,205 @@ #include "function/list/functions/list_sort_function.h" #include "function/list/functions/list_sum_function.h" #include "function/list/functions/list_unique_function.h" +#include "function/scalar_function.h" using namespace kuzu::common; namespace kuzu { namespace function { +template +static scalar_func_exec_t getBinaryListExecFuncSwitchRight(const LogicalType& rightType) { + scalar_func_exec_t execFunc; + switch (rightType.getPhysicalType()) { + case PhysicalTypeID::BOOL: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT64: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT32: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT16: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT8: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT64: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT32: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT16: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT8: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT128: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::DOUBLE: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::FLOAT: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::STRING: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INTERVAL: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INTERNAL_ID: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::VAR_LIST: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::STRUCT: { + execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + default: { + KU_UNREACHABLE; + } + } + return execFunc; +} + +template +static scalar_func_exec_t getBinaryListExecFuncSwitchAll(const LogicalType& type) { + scalar_func_exec_t execFunc; + switch (type.getPhysicalType()) { + case PhysicalTypeID::INT64: { + execFunc = + ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT32: { + execFunc = + ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT16: { + execFunc = + ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT8: { + execFunc = + ScalarFunction::BinaryExecListStructFunction; + } break; + default: { + KU_UNREACHABLE; + } + } + return execFunc; +} + +template +static scalar_func_exec_t getTernaryListExecFuncSwitchAll(const LogicalType& type) { + scalar_func_exec_t execFunc; + switch (type.getPhysicalType()) { + case PhysicalTypeID::INT64: { + execFunc = ScalarFunction::TernaryExecListStructFunction; + } break; + case PhysicalTypeID::INT32: { + execFunc = ScalarFunction::TernaryExecListStructFunction; + } break; + case PhysicalTypeID::INT16: { + execFunc = ScalarFunction::TernaryExecListStructFunction; + } break; + case PhysicalTypeID::INT8: { + execFunc = ScalarFunction::TernaryExecListStructFunction; + } break; + default: { + KU_UNREACHABLE; + } + } + return execFunc; +} + +template +static std::unique_ptr bindFuncListAggr( + const binder::expression_vector& arguments, Function* function) { + auto scalarFunction = ku_dynamic_cast(function); + auto resultType = VarListType::getChildType(&arguments[0]->dataType); + switch (resultType->getLogicalTypeID()) { + case LogicalTypeID::SERIAL: + case LogicalTypeID::INT64: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::INT32: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::INT16: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::INT8: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::UINT64: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::UINT32: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::UINT16: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::UINT8: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::INT128: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::DOUBLE: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + case LogicalTypeID::FLOAT: { + scalarFunction->execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + } break; + default: { + throw BinderException(stringFormat("Unsupported inner data type for {}: {}", function->name, + LogicalTypeUtils::toString(resultType->getLogicalTypeID()))); + } + } + return std::make_unique(resultType->copy()); +} + static std::string getListFunctionIncompatibleChildrenTypeErrorMsg( const std::string& functionName, const LogicalType& left, const LogicalType& right) { return std::string("Cannot bind " + functionName + " with parameter type " + left.toString() + @@ -57,12 +252,12 @@ static LogicalType getValidLogicalType(const binder::expression_vector& expressi return expression->dataType; } } - return LogicalType(common::LogicalTypeID::ANY); + return LogicalType(LogicalTypeID::ANY); } -std::unique_ptr ListCreationFunction::bindFunc( +static std::unique_ptr ListCreationFunctionBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { - auto resultType = LogicalType::VAR_LIST(getChildType(arguments).copy()); + auto resultType = LogicalType::VAR_LIST(ListCreationFunction::getChildType(arguments).copy()); return std::make_unique(std::move(resultType)); } @@ -71,8 +266,8 @@ LogicalType ListCreationFunction::getChildType(const binder::expression_vector& // listCreation can be determined by the first non-ANY type parameter. If all parameters have // dataType ANY, then the resultType will be INT64[] (default type). auto childType = getValidLogicalType(arguments); - if (childType.getLogicalTypeID() == common::LogicalTypeID::ANY) { - childType = LogicalType(common::LogicalTypeID::STRING); + if (childType.getLogicalTypeID() == LogicalTypeID::ANY) { + childType = LogicalType(LogicalTypeID::STRING); } // Cast parameters with ANY dataType to resultChildType. for (auto& argument : arguments) { @@ -82,7 +277,7 @@ LogicalType ListCreationFunction::getChildType(const binder::expression_vector& argument->cast(childType); } else { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( - LIST_CREATION_FUNC_NAME, arguments[0]->getDataType(), argument->getDataType())); + name, arguments[0]->getDataType(), argument->getDataType())); } } } @@ -91,13 +286,13 @@ LogicalType ListCreationFunction::getChildType(const binder::expression_vector& function_set ListCreationFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_CREATION_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - bindFunc, true /* isVarLength */)); + ListCreationFunctionBindFunc, true /* isVarLength */)); return result; } -std::unique_ptr ListRangeFunction::bindFunc( +static std::unique_ptr ListRangeFunctionBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { KU_ASSERT(arguments[0]->dataType == arguments[1]->dataType); auto resultType = LogicalType::VAR_LIST( @@ -109,43 +304,42 @@ function_set ListRangeFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getIntegerLogicalTypeIDs()) { // start, end - result.push_back(std::make_unique(LIST_RANGE_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{typeID, typeID}, LogicalTypeID::VAR_LIST, - ListFunction::getBinaryListExecFuncSwitchAll(LogicalType{typeID}), - nullptr, bindFunc, false)); + getBinaryListExecFuncSwitchAll(LogicalType{typeID}), nullptr, + ListRangeFunctionBindFunc, false)); // start, end, step - result.push_back(std::make_unique(LIST_RANGE_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{typeID, typeID, typeID}, LogicalTypeID::VAR_LIST, - ListFunction::getTernaryListExecFuncSwitchAll(LogicalType{typeID}), - nullptr, bindFunc, false)); + getTernaryListExecFuncSwitchAll(LogicalType{typeID}), nullptr, + ListRangeFunctionBindFunc, false)); } return result; } function_set SizeFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(SIZE_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction, true /* isVarlength*/)); - result.push_back(std::make_unique(CARDINALITY_FUNC_NAME, + result.push_back(std::make_unique(alias, std::vector{LogicalTypeID::MAP}, LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction, true /* isVarlength*/)); - result.push_back(std::make_unique(SIZE_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::STRING}, LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction, true /* isVarlength*/)); return result; } template -static void BinaryExecListExtractFunction( - const std::vector>& params, common::ValueVector& result, - void* /*dataPtr*/ = nullptr) { +static void BinaryExecListExtractFunction(const std::vector>& params, + ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(params.size() == 2); BinaryFunctionExecutor::executeListExtract( *params[0], *params[1], result); } -std::unique_ptr ListExtractFunction::bindFunc( +static std::unique_ptr ListExtractFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto resultType = VarListType::getChildType(&arguments[0]->dataType); auto scalarFunction = ku_dynamic_cast(function); @@ -227,128 +421,133 @@ std::unique_ptr ListExtractFunction::bindFunc( function_set ListExtractFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_EXTRACT_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::INT64}, - LogicalTypeID::ANY, nullptr, nullptr, bindFunc, false /* isVarlength*/)); - result.push_back(std::make_unique(LIST_EXTRACT_FUNC_NAME, + LogicalTypeID::ANY, nullptr, nullptr, ListExtractFunctionBindFunc, false /* isVarlength*/)); + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::BinaryExecFunction, false /* isVarlength */)); - result.push_back(std::make_unique(LIST_EXTRACT_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::ARRAY, LogicalTypeID::INT64}, LogicalTypeID::ANY, - nullptr, nullptr, bindFunc, false /* isVarlength*/)); + nullptr, nullptr, ListExtractFunctionBindFunc, false /* isVarlength*/)); return result; } +std::unique_ptr ListConcatFunction::bindFunc( + const binder::expression_vector& arguments, Function* /*function*/) { + if (arguments[0]->getDataType() != arguments[1]->getDataType()) { + throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( + name, arguments[0]->getDataType(), arguments[1]->getDataType())); + } + return std::make_unique(arguments[0]->getDataType().copy()); +} + function_set ListConcatFunction::getFunctionSet() { function_set result; auto execFunc = ScalarFunction::BinaryExecListStructFunction; - result.push_back(std::make_unique(LIST_CONCAT_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, execFunc, nullptr, bindFunc, false /* isVarlength*/)); return result; } -std::unique_ptr ListConcatFunction::bindFunc( - const binder::expression_vector& arguments, Function* /*function*/) { - if (arguments[0]->getDataType() != arguments[1]->getDataType()) { - throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( - LIST_CONCAT_FUNC_NAME, arguments[0]->getDataType(), arguments[1]->getDataType())); - } - return std::make_unique(arguments[0]->getDataType().copy()); -} - -std::unique_ptr ListAppendFunction::bindFunc( +static std::unique_ptr ListAppendFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { if (*VarListType::getChildType(&arguments[0]->dataType) != arguments[1]->getDataType()) { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( - LIST_APPEND_FUNC_NAME, arguments[0]->getDataType(), arguments[1]->getDataType())); + ListAppendFunction::name, arguments[0]->getDataType(), arguments[1]->getDataType())); } auto resultType = arguments[0]->getDataType(); auto scalarFunction = ku_dynamic_cast(function); scalarFunction->execFunc = - ListFunction::getBinaryListExecFuncSwitchRight( - arguments[1]->getDataType()); + getBinaryListExecFuncSwitchRight(arguments[1]->getDataType()); return std::make_unique(resultType.copy()); } function_set ListAppendFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_APPEND_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, bindFunc, false /* isVarlength*/)); + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListAppendFunctionBindFunc, + false /* isVarlength*/)); return result; } -std::unique_ptr ListPrependFunction::bindFunc( +static std::unique_ptr ListPrependFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { if (arguments[0]->getDataType().getLogicalTypeID() != LogicalTypeID::ANY && arguments[1]->dataType != *VarListType::getChildType(&arguments[0]->dataType)) { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( - LIST_PREPEND_FUNC_NAME, arguments[0]->getDataType(), arguments[1]->getDataType())); + ListPrependFunction::name, arguments[0]->getDataType(), arguments[1]->getDataType())); } auto resultType = arguments[0]->getDataType(); auto scalarFunction = ku_dynamic_cast(function); scalarFunction->execFunc = - ListFunction::getBinaryListExecFuncSwitchRight( - arguments[1]->getDataType()); + getBinaryListExecFuncSwitchRight(arguments[1]->getDataType()); return std::make_unique(resultType.copy()); } function_set ListPrependFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_PREPEND_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, bindFunc, false /* isVarlength */)); + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListPrependFunctionBindFunc, + false /* isVarlength */)); return result; } +static std::unique_ptr ListPositionFunctionBindFunc( + const binder::expression_vector& arguments, Function* function) { + auto scalarFunction = ku_dynamic_cast(function); + scalarFunction->execFunc = + getBinaryListExecFuncSwitchRight(arguments[1]->getDataType()); + return std::make_unique(LogicalType::INT64()); +} + function_set ListPositionFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_POSITION_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::INT64, nullptr, nullptr, bindFunc, false /* isVarlength */)); + LogicalTypeID::INT64, nullptr, nullptr, ListPositionFunctionBindFunc, + false /* isVarlength */)); return result; } -std::unique_ptr ListPositionFunction::bindFunc( +static std::unique_ptr ListContainsFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); scalarFunction->execFunc = - ListFunction::getBinaryListExecFuncSwitchRight( - arguments[1]->getDataType()); - return std::make_unique(LogicalType::INT64()); + getBinaryListExecFuncSwitchRight(arguments[1]->getDataType()); + return std::make_unique(LogicalType::BOOL()); } function_set ListContainsFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_CONTAINS_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::BOOL, nullptr, nullptr, bindFunc, false /* isVarlength */)); + LogicalTypeID::BOOL, nullptr, nullptr, ListContainsFunctionBindFunc, + false /* isVarlength */)); return result; } -std::unique_ptr ListContainsFunction::bindFunc( - const binder::expression_vector& arguments, Function* function) { - auto scalarFunction = ku_dynamic_cast(function); - scalarFunction->execFunc = - ListFunction::getBinaryListExecFuncSwitchRight( - arguments[1]->getDataType()); - return std::make_unique(LogicalType::BOOL()); +static std::unique_ptr ListSliceFunctionBindFunc( + const binder::expression_vector& arguments, Function* /*function*/) { + return std::make_unique(arguments[0]->getDataType().copy()); } function_set ListSliceFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_SLICE_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{ LogicalTypeID::VAR_LIST, LogicalTypeID::INT64, LogicalTypeID::INT64}, LogicalTypeID::VAR_LIST, ScalarFunction::TernaryExecListStructFunction, - nullptr, bindFunc, false /* isVarlength*/)); - result.push_back(std::make_unique(LIST_SLICE_FUNC_NAME, + nullptr, ListSliceFunctionBindFunc, false /* isVarlength*/)); + result.push_back(std::make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::INT64}, LogicalTypeID::STRING, @@ -358,90 +557,89 @@ function_set ListSliceFunction::getFunctionSet() { return result; } -std::unique_ptr ListSliceFunction::bindFunc( - const binder::expression_vector& arguments, Function* /*function*/) { - return std::make_unique(arguments[0]->getDataType().copy()); -} - -function_set ListSortFunction::getFunctionSet() { - function_set result; - result.push_back(std::make_unique(LIST_SORT_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, bindFunc, false /* isVarlength*/)); - result.push_back(std::make_unique(LIST_SORT_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, bindFunc, false /* isVarlength*/)); - result.push_back(std::make_unique(LIST_SORT_FUNC_NAME, - std::vector{ - LogicalTypeID::VAR_LIST, LogicalTypeID::STRING, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, bindFunc, false /* isVarlength*/)); - return result; +template +static void getListSortExecFunction( + const binder::expression_vector& arguments, scalar_func_exec_t& func) { + if (arguments.size() == 1) { + func = ScalarFunction::UnaryExecNestedTypeFunction>; + return; + } else if (arguments.size() == 2) { + func = ScalarFunction::BinaryExecListStructFunction>; + return; + } else if (arguments.size() == 3) { + func = ScalarFunction::TernaryExecListStructFunction>; + return; + } else { + throw RuntimeException("Invalid number of arguments"); + } } -std::unique_ptr ListSortFunction::bindFunc( +static std::unique_ptr ListSortFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT32: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT16: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT8: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT64: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT32: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT16: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT8: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT128: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::DOUBLE: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::FLOAT: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::BOOL: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::STRING: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::DATE: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_MS: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_NS: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_SEC: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_TZ: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INTERVAL: { - getExecFunction(arguments, scalarFunction->execFunc); + getListSortExecFunction(arguments, scalarFunction->execFunc); } break; default: { KU_UNREACHABLE; @@ -450,100 +648,103 @@ std::unique_ptr ListSortFunction::bindFunc( return std::make_unique(arguments[0]->getDataType().copy()); } +function_set ListSortFunction::getFunctionSet() { + function_set result; + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, + nullptr, ListSortFunctionBindFunc, false /* isVarlength*/)); + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortFunctionBindFunc, + false /* isVarlength*/)); + result.push_back(std::make_unique(name, + std::vector{ + LogicalTypeID::VAR_LIST, LogicalTypeID::STRING, LogicalTypeID::STRING}, + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortFunctionBindFunc, + false /* isVarlength*/)); + return result; +} + template -void ListSortFunction::getExecFunction( +static void getListReverseSortExecFunction( const binder::expression_vector& arguments, scalar_func_exec_t& func) { if (arguments.size() == 1) { - func = ScalarFunction::UnaryExecNestedTypeFunction>; + func = ScalarFunction::UnaryExecNestedTypeFunction>; return; } else if (arguments.size() == 2) { func = ScalarFunction::BinaryExecListStructFunction>; - return; - } else if (arguments.size() == 3) { - func = ScalarFunction::TernaryExecListStructFunction>; + ListReverseSort>; return; } else { throw RuntimeException("Invalid number of arguments"); } } -function_set ListReverseSortFunction::getFunctionSet() { - function_set result; - result.push_back(std::make_unique(LIST_REVERSE_SORT_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, bindFunc, false /* isVarlength*/)); - result.push_back(std::make_unique(LIST_REVERSE_SORT_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, bindFunc, false /* isVarlength*/)); - return result; -} - -std::unique_ptr ListReverseSortFunction::bindFunc( +static std::unique_ptr ListReverseSortFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT32: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT16: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT8: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT64: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT32: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT16: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::UINT8: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INT128: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::DOUBLE: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::FLOAT: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::BOOL: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::STRING: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::DATE: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_MS: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_NS: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_SEC: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP_TZ: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::TIMESTAMP: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; case LogicalTypeID::INTERVAL: { - getExecFunction(arguments, scalarFunction->execFunc); + getListReverseSortExecFunction(arguments, scalarFunction->execFunc); } break; default: { KU_UNREACHABLE; @@ -552,47 +753,35 @@ std::unique_ptr ListReverseSortFunction::bindFunc( return std::make_unique(arguments[0]->getDataType().copy()); } -template -void ListReverseSortFunction::getExecFunction( - const binder::expression_vector& arguments, scalar_func_exec_t& func) { - if (arguments.size() == 1) { - func = ScalarFunction::UnaryExecNestedTypeFunction>; - return; - } else if (arguments.size() == 2) { - func = ScalarFunction::BinaryExecListStructFunction>; - return; - } else { - throw RuntimeException("Invalid number of arguments"); - } +function_set ListReverseSortFunction::getFunctionSet() { + function_set result; + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, + nullptr, ListReverseSortFunctionBindFunc, false /* isVarlength*/)); + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListReverseSortFunctionBindFunc, + false /* isVarlength*/)); + return result; } function_set ListSumFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_SUM_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, - ListFunction::bindFuncListAggr, false /* isVarlength*/)); + bindFuncListAggr, false /* isVarlength*/)); return result; } function_set ListProductFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_PRODUCT_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, - ListFunction::bindFuncListAggr, false /* isVarlength*/)); + bindFuncListAggr, false /* isVarlength*/)); return result; } -function_set ListDistinctFunction::getFunctionSet() { - function_set result; - result.push_back(std::make_unique(LIST_DISTINCT_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, bindFunc, false /* isVarlength*/)); - return result; -} - -std::unique_ptr ListDistinctFunction::bindFunc( +static std::unique_ptr ListDistinctFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { @@ -688,15 +877,15 @@ std::unique_ptr ListDistinctFunction::bindFunc( return std::make_unique(arguments[0]->getDataType().copy()); } -function_set ListUniqueFunction::getFunctionSet() { +function_set ListDistinctFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_UNIQUE_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, - bindFunc, false /* isVarlength*/)); + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, + nullptr, ListDistinctFunctionBindFunc, false /* isVarlength*/)); return result; } -std::unique_ptr ListUniqueFunction::bindFunc( +static std::unique_ptr ListUniqueFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { @@ -792,15 +981,15 @@ std::unique_ptr ListUniqueFunction::bindFunc( return std::make_unique(LogicalType::INT64()); } -function_set ListAnyValueFunction::getFunctionSet() { +function_set ListUniqueFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_ANY_VALUE_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::ANY, nullptr, nullptr, - bindFunc, false /* isVarlength*/)); + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, + ListUniqueFunctionBindFunc, false /* isVarlength*/)); return result; } -std::unique_ptr ListAnyValueFunction::bindFunc( +static std::unique_ptr ListAnyValueFunctionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); auto resultType = VarListType::getChildType(&arguments[0]->dataType); @@ -901,6 +1090,14 @@ std::unique_ptr ListAnyValueFunction::bindFunc( return std::make_unique(resultType->copy()); } +function_set ListAnyValueFunction::getFunctionSet() { + function_set result; + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::ANY, nullptr, nullptr, + ListAnyValueFunctionBindFunc, false /* isVarlength*/)); + return result; +} + static std::unique_ptr ListReverseBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); @@ -912,9 +1109,9 @@ static std::unique_ptr ListReverseBindFunc( function_set ListReverseFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(LIST_REVERSE_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::ANY, nullptr, nullptr, - ListReverseBindFunc, false /* isVarlength*/)); + result.push_back( + std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + LogicalTypeID::ANY, nullptr, nullptr, ListReverseBindFunc, false /* isVarlength*/)); return result; } diff --git a/src/function/vector_map_functions.cpp b/src/function/vector_map_functions.cpp index ce71c11b32f..fc3f725995d 100644 --- a/src/function/vector_map_functions.cpp +++ b/src/function/vector_map_functions.cpp @@ -1,6 +1,5 @@ #include "function/map/vector_map_functions.h" -#include "function/list/vector_list_functions.h" #include "function/map/functions/map_creation_function.h" #include "function/map/functions/map_extract_function.h" #include "function/map/functions/map_keys_function.h" @@ -50,9 +49,79 @@ std::unique_ptr MapExtractFunctions::bindFunc( const binder::expression_vector& arguments, kuzu::function::Function* function) { validateKeyType(arguments[0], arguments[1]); auto scalarFunction = ku_dynamic_cast(function); - scalarFunction->execFunc = - ListFunction::getBinaryListExecFuncSwitchRight( - arguments[1]->getDataType()); + switch (arguments[1]->getDataType().getPhysicalType()) { + case PhysicalTypeID::BOOL: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT64: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT32: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT16: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT8: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT64: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT32: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT16: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::UINT8: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INT128: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::DOUBLE: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::FLOAT: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::STRING: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INTERVAL: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::INTERNAL_ID: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::VAR_LIST: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + case PhysicalTypeID::STRUCT: { + scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; + } break; + default: { + KU_UNREACHABLE; + } + } return std::make_unique(LogicalType::VAR_LIST( std::make_unique(*MapType::getValueType(&arguments[0]->dataType)))); } diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index 376afffa9a2..a90f3eeb6f6 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -46,40 +46,6 @@ const char* const CAST_TO_UUID_FUNC_NAME = "TO_UUID"; const char* const CAST_TO_BOOL_FUNC_NAME = "TO_BOOL"; const char* const CAST_TO_INT128_FUNC_NAME = "TO_INT128"; -// list -const char* const LIST_CREATION_FUNC_NAME = "LIST_CREATION"; -const char* const LIST_RANGE_FUNC_NAME = "RANGE"; -const char* const LIST_EXTRACT_FUNC_NAME = "LIST_EXTRACT"; -const char* const LIST_ELEMENT_FUNC_NAME = "LIST_ELEMENT"; -const char* const LIST_CONCAT_FUNC_NAME = "LIST_CONCAT"; -const char* const LIST_CAT_FUNC_NAME = "LIST_CAT"; -const char* const ARRAY_CONCAT_FUNC_NAME = "ARRAY_CONCAT"; -const char* const ARRAY_CAT_FUNC_NAME = "ARRAY_CAT"; -const char* const LIST_APPEND_FUNC_NAME = "LIST_APPEND"; -const char* const ARRAY_APPEND_FUNC_NAME = "ARRAY_APPEND"; -const char* const ARRAY_PUSH_BACK_FUNC_NAME = "ARRAY_PUSH_BACK"; -const char* const LIST_PREPEND_FUNC_NAME = "LIST_PREPEND"; -const char* const ARRAY_PREPEND_FUNC_NAME = "ARRAY_PREPEND"; -const char* const ARRAY_PUSH_FRONT_FUNC_NAME = "ARRAY_PUSH_FRONT"; -const char* const LIST_POSITION_FUNC_NAME = "LIST_POSITION"; -const char* const LIST_INDEXOF_FUNC_NAME = "LIST_INDEXOF"; -const char* const ARRAY_POSITION_FUNC_NAME = "ARRAY_POSITION"; -const char* const ARRAY_INDEXOF_FUNC_NAME = "ARRAY_INDEXOF"; -const char* const LIST_CONTAINS_FUNC_NAME = "LIST_CONTAINS"; -const char* const LIST_HAS_FUNC_NAME = "LIST_HAS"; -const char* const ARRAY_CONTAINS_FUNC_NAME = "ARRAY_CONTAINS"; -const char* const ARRAY_HAS_FUNC_NAME = "ARRAY_HAS"; -const char* const LIST_SLICE_FUNC_NAME = "LIST_SLICE"; -const char* const ARRAY_SLICE_FUNC_NAME = "ARRAY_SLICE"; -const char* const LIST_SUM_FUNC_NAME = "LIST_SUM"; -const char* const LIST_PRODUCT_FUNC_NAME = "LIST_PRODUCT"; -const char* const LIST_SORT_FUNC_NAME = "LIST_SORT"; -const char* const LIST_REVERSE_SORT_FUNC_NAME = "LIST_REVERSE_SORT"; -const char* const LIST_DISTINCT_FUNC_NAME = "LIST_DISTINCT"; -const char* const LIST_UNIQUE_FUNC_NAME = "LIST_UNIQUE"; -const char* const LIST_ANY_VALUE_FUNC_NAME = "LIST_ANY_VALUE"; -const char* const LIST_REVERSE_FUNC_NAME = "LIST_REVERSE"; - // struct const char* const STRUCT_PACK_FUNC_NAME = "STRUCT_PACK"; const char* const STRUCT_EXTRACT_FUNC_NAME = "STRUCT_EXTRACT"; @@ -107,7 +73,6 @@ const char* const LESS_THAN_EQUALS_FUNC_NAME = "LESS_THAN_EQUALS"; // string const char* const LENGTH_FUNC_NAME = "LENGTH"; -const char* const SIZE_FUNC_NAME = "SIZE"; // Date functions. const char* const DATE_PART_FUNC_NAME = "DATE_PART"; diff --git a/src/include/function/array/vector_array_functions.h b/src/include/function/array/vector_array_functions.h index 56be9a813c2..3f1ef650643 100644 --- a/src/include/function/array/vector_array_functions.h +++ b/src/include/function/array/vector_array_functions.h @@ -1,6 +1,7 @@ #pragma once #include "function/function.h" +#include "function/list/vector_list_functions.h" namespace kuzu { namespace function { @@ -41,5 +42,39 @@ struct ArrayDotProductFunction { static function_set getFunctionSet(); }; +struct ArrayConcatFunction : public ListConcatFunction { + static constexpr const char* name = "ARRAY_CONCAT"; + + static constexpr const char* alias = "ARRAY_CAT"; +}; + +struct ArrayAppendFunction : public ListAppendFunction { + static constexpr const char* name = "ARRAY_APPEND"; + + static constexpr const char* alias = "ARRAY_PUSH_BACK"; +}; + +struct ArrayPrependFunction : public ListPrependFunction { + static constexpr const char* name = "ARRAY_PREPEND"; + + static constexpr const char* alias = "ARRAY_PUSH_FRONT"; +}; + +struct ArrayPositionFunction : public ListPositionFunction { + static constexpr const char* name = "ARRAY_POSITION"; + + static constexpr const char* alias = "ARRAY_INDEXOF"; +}; + +struct ArrayContainsFunction : public ListContainsFunction { + static constexpr const char* name = "ARRAY_CONTAINS"; + + static constexpr const char* alias = "ARRAY_HAS"; +}; + +struct ArraySliceFunction : public ListSliceFunction { + static constexpr const char* name = "ARRAY_SLICE"; +}; + } // namespace function } // namespace kuzu diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index 054dd8573e6..5832a647248 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -89,7 +89,6 @@ class BuiltInFunctionsUtils { static void registerBlobFunctions(catalog::CatalogSet* catalogSet); static void registerUUIDFunctions(catalog::CatalogSet* catalogSet); static void registerCastFunctions(catalog::CatalogSet* catalogSet); - static void registerListFunctions(catalog::CatalogSet* catalogSet); static void registerStructFunctions(catalog::CatalogSet* catalogSet); static void registerMapFunctions(catalog::CatalogSet* catalogSet); static void registerUnionFunctions(catalog::CatalogSet* catalogSet); diff --git a/src/include/function/list/vector_list_functions.h b/src/include/function/list/vector_list_functions.h index 970d3f5832d..576947615dd 100644 --- a/src/include/function/list/vector_list_functions.h +++ b/src/include/function/list/vector_list_functions.h @@ -1,325 +1,131 @@ #pragma once -#include "common/exception/binder.h" -#include "common/types/int128_t.h" -#include "common/types/interval_t.h" -#include "function/scalar_function.h" +#include "common/vector/value_vector.h" +#include "function/function.h" namespace kuzu { namespace function { -struct ListFunction { - template - static scalar_func_exec_t getBinaryListExecFuncSwitchRight( - const common::LogicalType& rightType) { - scalar_func_exec_t execFunc; - switch (rightType.getPhysicalType()) { - case common::PhysicalTypeID::BOOL: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT64: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT32: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT16: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT8: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::UINT64: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::UINT32: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::UINT16: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::UINT8: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT128: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::DOUBLE: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::FLOAT: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::STRING: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INTERVAL: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INTERNAL_ID: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::VAR_LIST: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::STRUCT: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - default: { - KU_UNREACHABLE; - } - } - return execFunc; - } - - template - static scalar_func_exec_t getBinaryListExecFuncSwitchAll(const common::LogicalType& type) { - scalar_func_exec_t execFunc; - switch (type.getPhysicalType()) { - case common::PhysicalTypeID::INT64: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT32: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT16: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT8: { - execFunc = ScalarFunction::BinaryExecListStructFunction; - } break; - default: { - KU_UNREACHABLE; - } - } - return execFunc; - } - - template - static scalar_func_exec_t getTernaryListExecFuncSwitchAll(const common::LogicalType& type) { - scalar_func_exec_t execFunc; - switch (type.getPhysicalType()) { - case common::PhysicalTypeID::INT64: { - execFunc = ScalarFunction::TernaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT32: { - execFunc = ScalarFunction::TernaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT16: { - execFunc = ScalarFunction::TernaryExecListStructFunction; - } break; - case common::PhysicalTypeID::INT8: { - execFunc = ScalarFunction::TernaryExecListStructFunction; - } break; - default: { - KU_UNREACHABLE; - } - } - return execFunc; - } - - template - static std::unique_ptr bindFuncListAggr( - const binder::expression_vector& arguments, Function* function) { - auto scalarFunction = common::ku_dynamic_cast(function); - auto resultType = common::VarListType::getChildType(&arguments[0]->dataType); - switch (resultType->getLogicalTypeID()) { - case common::LogicalTypeID::SERIAL: - case common::LogicalTypeID::INT64: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::INT32: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::INT16: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::INT8: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::UINT64: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::UINT32: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::UINT16: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::UINT8: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::INT128: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::DOUBLE: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - case common::LogicalTypeID::FLOAT: { - scalarFunction->execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; - } break; - default: { - throw common::BinderException( - common::stringFormat("Unsupported inner data type for {}: {}", function->name, - common::LogicalTypeUtils::toString(resultType->getLogicalTypeID()))); - } - } - return std::make_unique(resultType->copy()); - } -}; - struct ListCreationFunction { + static constexpr const char* name = "LIST_CREATION"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); static void execFunc(const std::vector>& parameters, common::ValueVector& result, void* /*dataPtr*/ = nullptr); static common::LogicalType getChildType(const binder::expression_vector& arguments); }; struct ListRangeFunction { + static constexpr const char* name = "RANGE"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct SizeFunction { + static constexpr const char* name = "SIZE"; + + static constexpr const char* alias = "CARDINALITY"; + static function_set getFunctionSet(); }; struct ListExtractFunction { + static constexpr const char* name = "LIST_EXTRACT"; + + static constexpr const char* alias = "LIST_ELEMENT"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListConcatFunction { + static constexpr const char* name = "LIST_CONCAT"; + + static constexpr const char* alias = "LIST_CAT"; + static function_set getFunctionSet(); static std::unique_ptr bindFunc( const binder::expression_vector& arguments, Function* function); }; struct ListAppendFunction { + static constexpr const char* name = "LIST_APPEND"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListPrependFunction { + static constexpr const char* name = "LIST_PREPEND"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListPositionFunction { + static constexpr const char* name = "LIST_POSITION"; + + static constexpr const char* alias = "LIST_INDEXOF"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListContainsFunction { + static constexpr const char* name = "LIST_CONTAINS"; + + static constexpr const char* alias = "LIST_HAS"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListSliceFunction { + static constexpr const char* name = "LIST_SLICE"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListSortFunction { + static constexpr const char* name = "LIST_SORT"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); - template - static void getExecFunction( - const binder::expression_vector& arguments, scalar_func_exec_t& func); }; struct ListReverseSortFunction { + static constexpr const char* name = "LIST_REVERSE_SORT"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); - template - static void getExecFunction( - const binder::expression_vector& arguments, scalar_func_exec_t& func); }; struct ListSumFunction { + static constexpr const char* name = "LIST_SUM"; + static function_set getFunctionSet(); }; struct ListProductFunction { + static constexpr const char* name = "LIST_PRODUCT"; + static function_set getFunctionSet(); }; struct ListDistinctFunction { + static constexpr const char* name = "LIST_DISTINCT"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListUniqueFunction { + static constexpr const char* name = "LIST_UNIQUE"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListAnyValueFunction { + static constexpr const char* name = "LIST_ANY_VALUE"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct ListReverseFunction { + static constexpr const char* name = "LIST_REVERSE"; + static function_set getFunctionSet(); }; diff --git a/src/parser/transform/transform_expression.cpp b/src/parser/transform/transform_expression.cpp index e62512ecc8f..7f8da14c1e3 100644 --- a/src/parser/transform/transform_expression.cpp +++ b/src/parser/transform/transform_expression.cpp @@ -1,5 +1,6 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/cast/functions/cast_from_string_functions.h" +#include "function/list/vector_list_functions.h" #include "function/string/vector_string_functions.h" #include "parser/expression/parsed_case_expression.h" #include "parser/expression/parsed_function_expression.h" @@ -293,7 +294,7 @@ std::unique_ptr Transformer::transformListOperatorExpression( auto raw = child->getRawName() + ctx.getText(); if (ctx.IN()) { // x IN y auto listContains = - std::make_unique(LIST_CONTAINS_FUNC_NAME, std::move(raw)); + std::make_unique(ListContainsFunction::name, std::move(raw)); auto right = transformPropertyOrLabelsExpression(*ctx.oC_PropertyOrLabelsExpression()); listContains->addChild(std::move(right)); listContains->addChild(std::move(child)); @@ -301,7 +302,7 @@ std::unique_ptr Transformer::transformListOperatorExpression( } if (ctx.COLON()) { // x[:] auto listSlice = - std::make_unique(LIST_SLICE_FUNC_NAME, std::move(raw)); + std::make_unique(ListSliceFunction::name, std::move(raw)); listSlice->addChild(std::move(child)); std::unique_ptr left; std::unique_ptr right; @@ -326,7 +327,7 @@ std::unique_ptr Transformer::transformListOperatorExpression( } // x[a] auto listExtract = - std::make_unique(LIST_EXTRACT_FUNC_NAME, std::move(raw)); + std::make_unique(ListExtractFunction::name, std::move(raw)); listExtract->addChild(std::move(child)); KU_ASSERT(ctx.oC_Expression().size() == 1); listExtract->addChild(transformExpression(*ctx.oC_Expression()[0])); @@ -418,7 +419,7 @@ std::unique_ptr Transformer::transformBooleanLiteral( std::unique_ptr Transformer::transformListLiteral( CypherParser::OC_ListLiteralContext& ctx) { auto listCreation = - std::make_unique(LIST_CREATION_FUNC_NAME, ctx.getText()); + std::make_unique(ListCreationFunction::name, ctx.getText()); if (ctx.oC_Expression() == nullptr) { // empty list return listCreation; } From 9effbb15f5b7a04124d949ad628303ce9637a7be Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Wed, 20 Mar 2024 17:06:44 -0400 Subject: [PATCH 062/136] Refactor cast functions --- .../bind_function_expression.cpp | 3 +- .../function_evaluator.cpp | 3 +- src/function/built_in_function_utils.cpp | 55 ------ src/function/function_collection.cpp | 16 ++ src/function/vector_cast_functions.cpp | 177 ++++++++---------- src/include/common/enums/expression_type.h | 27 --- .../function/built_in_function_utils.h | 1 - .../function/cast/vector_cast_functions.h | 50 +++++ 8 files changed, 152 insertions(+), 180 deletions(-) diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index 6e7f6c191a8..4932e41136e 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -5,6 +5,7 @@ #include "binder/expression_binder.h" #include "common/exception/binder.h" #include "function/arithmetic/vector_arithmetic_functions.h" +#include "function/cast/vector_cast_functions.h" #include "function/rewrite_function.h" #include "function/schema/vector_label_functions.h" #include "main/client_context.h" @@ -68,7 +69,7 @@ std::shared_ptr ExpressionBinder::bindScalarFunctionExpression( function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, functions)); expression_vector childrenAfterCast; std::unique_ptr bindData; - if (functionName == CAST_FUNC_NAME) { + if (functionName == CastAnyFunction::name) { bindData = function->bindFunc(children, function); if (bindData == nullptr) { return children[0]; diff --git a/src/expression_evaluator/function_evaluator.cpp b/src/expression_evaluator/function_evaluator.cpp index f6664e44d99..eeb05d502be 100644 --- a/src/expression_evaluator/function_evaluator.cpp +++ b/src/expression_evaluator/function_evaluator.cpp @@ -1,6 +1,7 @@ #include "expression_evaluator/function_evaluator.h" #include "binder/expression/function_expression.h" +#include "function/cast/vector_cast_functions.h" using namespace kuzu::common; using namespace kuzu::processor; @@ -24,7 +25,7 @@ void FunctionExpressionEvaluator::evaluate(ClientContext* clientContext) { } auto expr = ku_dynamic_cast(expression.get()); - if (expr->getFunctionName() == CAST_FUNC_NAME) { + if (expr->getFunctionName() == function::CastAnyFunction::name) { execFunc(parameters, *resultVector, expr->getBindData()); return; } diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 839961b5119..cb6feee179f 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -12,7 +12,6 @@ #include "function/aggregate_function.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/blob/vector_blob_functions.h" -#include "function/cast/vector_cast_functions.h" #include "function/comparison/vector_comparison_functions.h" #include "function/date/vector_date_functions.h" #include "function/function_collection.h" @@ -61,7 +60,6 @@ void BuiltInFunctionsUtils::registerScalarFunctions(CatalogSet* catalogSet) { registerDateFunctions(catalogSet); registerTimestampFunctions(catalogSet); registerIntervalFunctions(catalogSet); - registerCastFunctions(catalogSet); registerStructFunctions(catalogSet); registerMapFunctions(catalogSet); registerUnionFunctions(catalogSet); @@ -615,59 +613,6 @@ void BuiltInFunctionsUtils::registerUUIDFunctions(CatalogSet* catalogSet) { GEN_RANDOM_UUID_FUNC_NAME, GenRandomUUIDFunction::getFunctionSet())); } -void BuiltInFunctionsUtils::registerCastFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - CAST_DATE_FUNC_NAME, CastToDateFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_DATE_FUNC_NAME, CastToDateFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_TIMESTAMP_FUNC_NAME, CastToTimestampFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_INTERVAL_FUNC_NAME, CastToIntervalFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_INTERVAL_FUNC_NAME, CastToIntervalFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_STRING_FUNC_NAME, CastToStringFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_STRING_FUNC_NAME, CastToStringFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_BLOB_FUNC_NAME, CastToBlobFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_BLOB_FUNC_NAME, CastToBlobFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_UUID_FUNC_NAME, CastToUUIDFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_UUID_FUNC_NAME, CastToUUIDFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_DOUBLE_FUNC_NAME, CastToDoubleFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_FLOAT_FUNC_NAME, CastToFloatFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_SERIAL_FUNC_NAME, CastToSerialFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_INT64_FUNC_NAME, CastToInt64Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_INT32_FUNC_NAME, CastToInt32Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_INT16_FUNC_NAME, CastToInt16Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_INT8_FUNC_NAME, CastToInt8Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_UINT64_FUNC_NAME, CastToUInt64Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_UINT32_FUNC_NAME, CastToUInt32Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_UINT16_FUNC_NAME, CastToUInt16Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_UINT8_FUNC_NAME, CastToUInt8Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_INT128_FUNC_NAME, CastToInt128Function::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_TO_BOOL_FUNC_NAME, CastToBoolFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CAST_FUNC_NAME, CastAnyFunction::getFunctionSet())); -} - void BuiltInFunctionsUtils::registerStructFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( STRUCT_PACK_FUNC_NAME, StructPackFunctions::getFunctionSet())); diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 9ce91ec019e..0f4a78bc65e 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -2,6 +2,7 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/array/vector_array_functions.h" +#include "function/cast/vector_cast_functions.h" #include "function/list/vector_list_functions.h" #include "function/string/vector_string_functions.h" @@ -79,6 +80,21 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION(ListAnyValueFunction), SCALAR_FUNCTION(ListReverseFunction), SCALAR_FUNCTION(SizeFunction), + // Cast functions + SCALAR_FUNCTION(CastToDateFunction), SCALAR_FUNCTION_ALIAS(CastToDateFunction), + SCALAR_FUNCTION(CastToTimestampFunction), SCALAR_FUNCTION(CastToIntervalFunction), + SCALAR_FUNCTION_ALIAS(CastToIntervalFunction), SCALAR_FUNCTION(CastToStringFunction), + SCALAR_FUNCTION_ALIAS(CastToStringFunction), SCALAR_FUNCTION(CastToBlobFunction), + SCALAR_FUNCTION_ALIAS(CastToBlobFunction), SCALAR_FUNCTION(CastToUUIDFunction), + SCALAR_FUNCTION_ALIAS(CastToUUIDFunction), SCALAR_FUNCTION(CastToDoubleFunction), + SCALAR_FUNCTION(CastToFloatFunction), SCALAR_FUNCTION(CastToSerialFunction), + SCALAR_FUNCTION(CastToInt64Function), SCALAR_FUNCTION(CastToInt32Function), + SCALAR_FUNCTION(CastToInt16Function), SCALAR_FUNCTION(CastToInt8Function), + SCALAR_FUNCTION(CastToUInt64Function), SCALAR_FUNCTION(CastToUInt32Function), + SCALAR_FUNCTION(CastToUInt16Function), SCALAR_FUNCTION(CastToUInt8Function), + SCALAR_FUNCTION(CastToInt128Function), SCALAR_FUNCTION(CastToBoolFunction), + SCALAR_FUNCTION(CastAnyFunction), + // End of array FINAL_FUNCTION}; diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index 56bc1b74f13..3ceb9c403af 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -714,28 +714,28 @@ std::unique_ptr CastFunction::bindCastFunction( function_set CastToDateFunction::getFunctionSet() { function_set result; - result.push_back(CastFunction::bindCastFunction( - CAST_TO_DATE_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::DATE)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_DATE_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::DATE)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::DATE)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::DATE)); return result; } function_set CastToTimestampFunction::getFunctionSet() { function_set result; - result.push_back(CastFunction::bindCastFunction( - CAST_TO_TIMESTAMP_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::TIMESTAMP)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_TIMESTAMP_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::TIMESTAMP)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::TIMESTAMP)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::TIMESTAMP)); return result; } function_set CastToIntervalFunction::getFunctionSet() { function_set result; - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INTERVAL_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::INTERVAL)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INTERVAL_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INTERVAL)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::INTERVAL)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INTERVAL)); return result; } @@ -743,188 +743,175 @@ function_set CastToStringFunction::getFunctionSet() { function_set result; result.reserve(LogicalTypeUtils::getAllValidLogicTypes().size()); for (auto& type : LogicalTypeUtils::getAllValidLogicTypes()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_STRING_FUNC_NAME, type, LogicalTypeID::STRING)); + result.push_back(CastFunction::bindCastFunction(name, type, LogicalTypeID::STRING)); } return result; } function_set CastToBlobFunction::getFunctionSet() { function_set result; - result.push_back(CastFunction::bindCastFunction( - CAST_TO_BLOB_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::BLOB)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_BLOB_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::BLOB)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::BLOB)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::BLOB)); return result; } function_set CastToUUIDFunction::getFunctionSet() { function_set result; - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UUID_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::UUID)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::UUID)); return result; } function_set CastToBoolFunction::getFunctionSet() { function_set result; - result.push_back(CastFunction::bindCastFunction( - CAST_TO_BOOL_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::BOOL)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_BOOL_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::BOOL)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::BOOL)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::BOOL)); return result; } function_set CastToDoubleFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(CastFunction::bindCastFunction( - CAST_TO_DOUBLE_FUNC_NAME, typeID, LogicalTypeID::DOUBLE)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::DOUBLE)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_DOUBLE_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::DOUBLE)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_DOUBLE_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::DOUBLE)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::DOUBLE)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::DOUBLE)); return result; } function_set CastToFloatFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_FLOAT_FUNC_NAME, typeID, LogicalTypeID::FLOAT)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::FLOAT)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_FLOAT_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::FLOAT)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_FLOAT_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::FLOAT)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::FLOAT)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::FLOAT)); return result; } function_set CastToInt128Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT128_FUNC_NAME, typeID, LogicalTypeID::INT128)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::INT128)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT128_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::INT128)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::INT128)); return result; } function_set CastToSerialFunction::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(CastFunction::bindCastFunction( - CAST_TO_SERIAL_FUNC_NAME, typeID, LogicalTypeID::SERIAL)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::SERIAL)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_SERIAL_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::SERIAL)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_SERIAL_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::SERIAL)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::SERIAL)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::SERIAL)); return result; } function_set CastToInt64Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_INT64_FUNC_NAME, typeID, LogicalTypeID::INT64)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::INT64)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT64_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::INT64)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT64_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT64)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::INT64)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT64)); return result; } function_set CastToInt32Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_INT32_FUNC_NAME, typeID, LogicalTypeID::INT32)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::INT32)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT32_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::INT32)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT32_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT32)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::INT32)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT32)); return result; } function_set CastToInt16Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_INT16_FUNC_NAME, typeID, LogicalTypeID::INT16)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::INT16)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT16_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::INT16)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT16_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT16)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::INT16)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT16)); return result; } function_set CastToInt8Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_INT8_FUNC_NAME, typeID, LogicalTypeID::INT8)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::INT8)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT8_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::INT8)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_INT8_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT8)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::INT8)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::INT8)); return result; } function_set CastToUInt64Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT64_FUNC_NAME, typeID, LogicalTypeID::UINT64)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::UINT64)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT64_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::UINT64)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT64_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT64)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::UINT64)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT64)); return result; } function_set CastToUInt32Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT32_FUNC_NAME, typeID, LogicalTypeID::UINT32)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::UINT32)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT32_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::UINT32)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT32_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT32)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::UINT32)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT32)); return result; } function_set CastToUInt16Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT16_FUNC_NAME, typeID, LogicalTypeID::UINT16)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::UINT16)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT16_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::UINT16)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT16_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT16)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::UINT16)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT16)); return result; } function_set CastToUInt8Function::getFunctionSet() { function_set result; for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - result.push_back( - CastFunction::bindCastFunction(CAST_TO_UINT8_FUNC_NAME, typeID, LogicalTypeID::UINT8)); + result.push_back(CastFunction::bindCastFunction(name, typeID, LogicalTypeID::UINT8)); } - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT8_FUNC_NAME, LogicalTypeID::STRING, LogicalTypeID::UINT8)); - result.push_back(CastFunction::bindCastFunction( - CAST_TO_UINT8_FUNC_NAME, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT8)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::STRING, LogicalTypeID::UINT8)); + result.push_back( + CastFunction::bindCastFunction(name, LogicalTypeID::RDF_VARIANT, LogicalTypeID::UINT8)); return result; } @@ -957,7 +944,7 @@ static std::unique_ptr castBindFunc( function_set CastAnyFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(CAST_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::ANY, LogicalTypeID::STRING}, LogicalTypeID::ANY, nullptr, nullptr, castBindFunc, false)); return result; diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index a90f3eeb6f6..ea69f3bebbb 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -19,33 +19,6 @@ const char* const MIN_FUNC_NAME = "MIN"; const char* const MAX_FUNC_NAME = "MAX"; const char* const COLLECT_FUNC_NAME = "COLLECT"; -// cast -const char* const CAST_FUNC_NAME = "CAST"; -const char* const CAST_DATE_FUNC_NAME = "DATE"; -const char* const CAST_TO_DATE_FUNC_NAME = "TO_DATE"; -const char* const CAST_TO_TIMESTAMP_FUNC_NAME = "TIMESTAMP"; -const char* const CAST_INTERVAL_FUNC_NAME = "INTERVAL"; -const char* const CAST_TO_INTERVAL_FUNC_NAME = "TO_INTERVAL"; -const char* const CAST_STRING_FUNC_NAME = "STRING"; -const char* const CAST_TO_STRING_FUNC_NAME = "TO_STRING"; -const char* const CAST_TO_DOUBLE_FUNC_NAME = "TO_DOUBLE"; -const char* const CAST_TO_FLOAT_FUNC_NAME = "TO_FLOAT"; -const char* const CAST_TO_SERIAL_FUNC_NAME = "TO_SERIAL"; -const char* const CAST_TO_INT64_FUNC_NAME = "TO_INT64"; -const char* const CAST_TO_INT32_FUNC_NAME = "TO_INT32"; -const char* const CAST_TO_INT16_FUNC_NAME = "TO_INT16"; -const char* const CAST_TO_INT8_FUNC_NAME = "TO_INT8"; -const char* const CAST_TO_UINT64_FUNC_NAME = "TO_UINT64"; -const char* const CAST_TO_UINT32_FUNC_NAME = "TO_UINT32"; -const char* const CAST_TO_UINT16_FUNC_NAME = "TO_UINT16"; -const char* const CAST_TO_UINT8_FUNC_NAME = "TO_UINT8"; -const char* const CAST_BLOB_FUNC_NAME = "BLOB"; -const char* const CAST_TO_BLOB_FUNC_NAME = "TO_BLOB"; -const char* const CAST_UUID_FUNC_NAME = "UUID"; -const char* const CAST_TO_UUID_FUNC_NAME = "TO_UUID"; -const char* const CAST_TO_BOOL_FUNC_NAME = "TO_BOOL"; -const char* const CAST_TO_INT128_FUNC_NAME = "TO_INT128"; - // struct const char* const STRUCT_PACK_FUNC_NAME = "STRUCT_PACK"; const char* const STRUCT_EXTRACT_FUNC_NAME = "STRUCT_EXTRACT"; diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index 5832a647248..6611245ac7f 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -88,7 +88,6 @@ class BuiltInFunctionsUtils { static void registerIntervalFunctions(catalog::CatalogSet* catalogSet); static void registerBlobFunctions(catalog::CatalogSet* catalogSet); static void registerUUIDFunctions(catalog::CatalogSet* catalogSet); - static void registerCastFunctions(catalog::CatalogSet* catalogSet); static void registerStructFunctions(catalog::CatalogSet* catalogSet); static void registerMapFunctions(catalog::CatalogSet* catalogSet); static void registerUnionFunctions(catalog::CatalogSet* catalogSet); diff --git a/src/include/function/cast/vector_cast_functions.h b/src/include/function/cast/vector_cast_functions.h index d9bc85c27bd..1cad769ccb7 100644 --- a/src/include/function/cast/vector_cast_functions.h +++ b/src/include/function/cast/vector_cast_functions.h @@ -22,82 +22,132 @@ struct CastFunction { }; struct CastToDateFunction { + static constexpr const char* name = "TO_DATE"; + + static constexpr const char* alias = "DATE"; + static function_set getFunctionSet(); }; struct CastToTimestampFunction { + static constexpr const char* name = "TIMESTAMP"; + static function_set getFunctionSet(); }; struct CastToIntervalFunction { + static constexpr const char* name = "TO_INTERVAL"; + + static constexpr const char* alias = "INTERVAL"; + static function_set getFunctionSet(); }; struct CastToStringFunction { + static constexpr const char* name = "TO_STRING"; + + static constexpr const char* alias = "STRING"; + static function_set getFunctionSet(); }; struct CastToBlobFunction { + static constexpr const char* name = "TO_BLOB"; + + static constexpr const char* alias = "BLOB"; + static function_set getFunctionSet(); }; struct CastToUUIDFunction { + static constexpr const char* name = "TO_UUID"; + + static constexpr const char* alias = "UUID"; + static function_set getFunctionSet(); }; struct CastToBoolFunction { + static constexpr const char* name = "TO_BOOL"; + static function_set getFunctionSet(); }; struct CastToDoubleFunction { + static constexpr const char* name = "TO_DOUBLE"; + static function_set getFunctionSet(); }; struct CastToFloatFunction { + static constexpr const char* name = "TO_FLOAT"; + static function_set getFunctionSet(); }; struct CastToSerialFunction { + static constexpr const char* name = "TO_SERIAL"; + static function_set getFunctionSet(); }; struct CastToInt128Function { + static constexpr const char* name = "TO_INT128"; + static function_set getFunctionSet(); }; struct CastToInt64Function { + static constexpr const char* name = "TO_INT64"; + static function_set getFunctionSet(); }; struct CastToInt32Function { + static constexpr const char* name = "TO_INT32"; + static function_set getFunctionSet(); }; struct CastToInt16Function { + static constexpr const char* name = "TO_INT16"; + static function_set getFunctionSet(); }; struct CastToInt8Function { + static constexpr const char* name = "TO_INT8"; + static function_set getFunctionSet(); }; struct CastToUInt64Function { + static constexpr const char* name = "TO_UINT64"; + static function_set getFunctionSet(); }; struct CastToUInt32Function { + static constexpr const char* name = "TO_UINT32"; + static function_set getFunctionSet(); }; struct CastToUInt16Function { + static constexpr const char* name = "TO_UINT16"; + static function_set getFunctionSet(); }; struct CastToUInt8Function { + static constexpr const char* name = "TO_UINT8"; + static function_set getFunctionSet(); }; struct CastAnyFunction { + static constexpr const char* name = "CAST"; + static function_set getFunctionSet(); }; From f9e1b12f5a0d36b216551e41f78d6cda97291046 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Fri, 22 Mar 2024 11:12:14 +0400 Subject: [PATCH 063/136] Update `get_as_pl` (should always return a single chunk) (#3110) --- tools/python_api/src_py/query_result.py | 33 ++++++++++--------------- tools/python_api/test/test_arrow.py | 7 ++++-- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/tools/python_api/src_py/query_result.py b/tools/python_api/src_py/query_result.py index 861d1880047..7200153132f 100644 --- a/tools/python_api/src_py/query_result.py +++ b/tools/python_api/src_py/query_result.py @@ -123,20 +123,10 @@ def get_as_df(self) -> pd.DataFrame: return self._query_result.getAsDF() - def get_as_pl(self, chunk_size: int | None = None) -> pl.DataFrame: + def get_as_pl(self) -> pl.DataFrame: """ Get the query result as a Polars DataFrame. - Parameters - ---------- - chunk_size : Number of rows to include in each chunk. - None - The chunk size is adaptive and depends on the number of columns in the query result. - -1 or 0 - The entire result is returned as a single chunk. - > 0 - The chunk size is the number of elements specified. - See Also -------- get_as_df : Get the query result as a Pandas DataFrame. @@ -151,7 +141,11 @@ def get_as_pl(self, chunk_size: int | None = None) -> pl.DataFrame: self.check_for_query_result_close() - return pl.from_arrow(data=self.get_as_arrow(chunk_size=chunk_size)) + # note: polars should always export just a single chunk, + # (eg: "-1") otherwise it will just need to rechunk anyway + return pl.from_arrow( # type: ignore[return-value] + data=self.get_as_arrow(chunk_size=-1), + ) def get_as_arrow(self, chunk_size: int | None = None) -> pa.Table: """ @@ -165,7 +159,7 @@ def get_as_arrow(self, chunk_size: int | None = None) -> pa.Table: -1 or 0 The entire result is returned as a single chunk. > 0 - The chunk size is the number of elements specified. + The chunk size is the number of rows specified. See Also -------- @@ -180,16 +174,15 @@ def get_as_arrow(self, chunk_size: int | None = None) -> pa.Table: self.check_for_query_result_close() if chunk_size is None: - # Adaptive chunk_size; target number of elements per chunk_size - target_chunk_size = max(1_000_000 // len(self.get_column_names()), 10) + # Adaptive; target 10m total elements in each chunk. + # (eg: if we had 10 cols, this would result in a 1m row chunk_size). + target_n_elems = 10_000_000 + chunk_size = max(target_n_elems // len(self.get_column_names()), 10) elif chunk_size <= 0: # No chunking: return the entire result as a single chunk - target_chunk_size = self.get_num_tuples() - else: - # Chunk size is the number of elements specified - target_chunk_size = chunk_size + chunk_size = self.get_num_tuples() - return self._query_result.getAsArrow(target_chunk_size) + return self._query_result.getAsArrow(chunk_size) def get_column_data_types(self) -> list[str]: """ diff --git a/tools/python_api/test/test_arrow.py b/tools/python_api/test/test_arrow.py index 8805e6ecf39..e579c034f40 100644 --- a/tools/python_api/test/test_arrow.py +++ b/tools/python_api/test/test_arrow.py @@ -84,8 +84,11 @@ def get_result(query_result: kuzu.QueryResult, result_type: str, chunk_size: int | None) -> Any: - sz = [] if chunk_size is None else [chunk_size] - return getattr(query_result, f"get_as_{result_type}")(*sz) + sz = [] if (chunk_size is None or result_type == "pl") else [chunk_size] + res = getattr(query_result, f"get_as_{result_type}")(*sz) + if result_type == "arrow" and chunk_size: + assert res[0].num_chunks == max((len(res) // chunk_size), 1) + return res def assert_column_equals(data: Any, col_name: str, return_type: str, expected_values: list[Any]) -> None: From 3f817f25b5d3f8d4a08c745d0abc11965e4554bb Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Fri, 22 Mar 2024 14:12:47 +0400 Subject: [PATCH 064/136] Add standard Python module __version__ attr (#3111) --- tools/python_api/src_py/__init__.py | 3 ++- tools/python_api/test/test_version.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/python_api/src_py/__init__.py b/tools/python_api/src_py/__init__.py index 525dcc7f4b5..2baf11825f5 100644 --- a/tools/python_api/src_py/__init__.py +++ b/tools/python_api/src_py/__init__.py @@ -56,7 +56,7 @@ def __getattr__(name: str) -> str | int: - if name == "version": + if name in ("version", "__version__"): return Database.get_version() elif name == "storage_version": return Database.get_storage_version() @@ -75,6 +75,7 @@ def __getattr__(name: str) -> str | int: "PreparedStatement", "QueryResult", "Type", + "__version__", "storage_version", "version", ] diff --git a/tools/python_api/test/test_version.py b/tools/python_api/test/test_version.py index 05c27981dda..7ac987129f7 100644 --- a/tools/python_api/test/test_version.py +++ b/tools/python_api/test/test_version.py @@ -3,3 +3,4 @@ def test_version() -> None: assert kuzu.version != "" assert kuzu.storage_version > 0 + assert kuzu.version == kuzu.__version__ From 6d39076fc3398ceac1405b3996fb67bbae9fd656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Fri, 22 Mar 2024 19:41:55 +0800 Subject: [PATCH 065/136] Fix DuckDB build for macOS ARM and 32-bit (#3115) --- .github/workflows/build-extensions.yml | 2 +- CMakeLists.txt | 1 + extension/CMakeLists.txt | 6 +++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-extensions.yml b/.github/workflows/build-extensions.yml index d612fdcaafc..18d726ab6e6 100644 --- a/.github/workflows/build-extensions.yml +++ b/.github/workflows/build-extensions.yml @@ -108,7 +108,7 @@ jobs: - name: Install OpenSSL run: | - brew install openssl@3 + brew install openssl@3 duckdb OPENSSL_ROOT=$(readlink -f /opt/homebrew/Cellar/openssl@3/*/) echo "OPENSSL_ROOT_DIR=$OPENSSL_ROOT" >> $GITHUB_ENV diff --git a/CMakeLists.txt b/CMakeLists.txt index 79a6044af36..2df5f6d9836 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,7 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8) elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) message(STATUS "32-bit architecture detected") add_compile_definitions(__32BIT__) + set(__32BIT__ TRUE) endif() if(NOT CMAKE_BUILD_TYPE) diff --git a/extension/CMakeLists.txt b/extension/CMakeLists.txt index 8f499422e22..53043bc5896 100644 --- a/extension/CMakeLists.txt +++ b/extension/CMakeLists.txt @@ -3,7 +3,11 @@ if("httpfs" IN_LIST BUILD_EXTENSIONS) endif() if ("duckdb_scanner" IN_LIST BUILD_EXTENSIONS) - add_subdirectory(duckdb_scanner) + if(NOT __32BIT__) + # DuckDB does not officially support 32-bit builds, so we disable the + # extension for 32-bit builds + add_subdirectory(duckdb_scanner) + endif() endif() if (${BUILD_EXTENSION_TESTS}) From 6e52e223fea30141a0088da8d3d7a93af25e6852 Mon Sep 17 00:00:00 2001 From: xiyang Date: Fri, 15 Mar 2024 23:21:28 -0400 Subject: [PATCH 066/136] Add external object scan replacement --- src/binder/bind/bind_reading_clause.cpp | 9 ++ .../bind_variable_expression.cpp | 8 -- src/include/function/table/bind_input.h | 9 +- src/include/function/table/scan_replacement.h | 23 +++++ src/include/function/table_functions.h | 11 +-- src/include/main/client_context.h | 12 +-- src/include/main/connection.h | 6 +- src/main/client_context.cpp | 4 + .../src_cpp/include/pandas/pandas_scan.h | 20 +---- .../python_api/src_cpp/pandas/pandas_scan.cpp | 83 +++++++++++++------ tools/python_api/src_cpp/py_connection.cpp | 2 +- 11 files changed, 113 insertions(+), 74 deletions(-) create mode 100644 src/include/function/table/scan_replacement.h diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index 36dc3816878..e29b7bbbd42 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -161,6 +161,15 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re auto objectSource = ku_dynamic_cast(source); auto objectName = objectSource->objectName; if (objectName.find("_") == std::string::npos) { + // Bind table + for (auto& scanReplacement : clientContext->getScanReplacements()) { + auto replaceData = scanReplacement.replaceFunc(objectName); + if (replaceData == nullptr) { + continue ; // Fail to replace. + } + bindInput = replaceData->bindInput; + } + auto objectExpr = expressionBinder.bindVariableExpression(objectName); auto literalExpr = ku_dynamic_cast(objectExpr.get()); diff --git a/src/binder/bind_expression/bind_variable_expression.cpp b/src/binder/bind_expression/bind_variable_expression.cpp index ef2981fa1d5..a33fa9a76d3 100644 --- a/src/binder/bind_expression/bind_variable_expression.cpp +++ b/src/binder/bind_expression/bind_variable_expression.cpp @@ -24,14 +24,6 @@ std::shared_ptr ExpressionBinder::bindVariableExpression(const std:: if (binder->scope->contains(varName)) { return binder->scope->getExpression(varName); } - if (binder->clientContext->hasReplaceFunc()) { - auto val = Value(varName); - auto replacedVal = binder->clientContext->replaceFunc(&val); - if (replacedVal != nullptr) { - return std::make_shared( - replacedVal->copy(), binder->getUniqueExpressionName(replacedVal->toString())); - } - } throw BinderException(stringFormat("Variable {} is not in scope.", varName)); } diff --git a/src/include/function/table/bind_input.h b/src/include/function/table/bind_input.h index 85c75ce6348..13034a93a3e 100644 --- a/src/include/function/table/bind_input.h +++ b/src/include/function/table/bind_input.h @@ -16,8 +16,11 @@ struct TableFuncBindInput { std::vector inputs; TableFuncBindInput() = default; - DELETE_COPY_DEFAULT_MOVE(TableFuncBindInput); + EXPLICIT_COPY_DEFAULT_MOVE(TableFuncBindInput); virtual ~TableFuncBindInput() = default; + +private: + TableFuncBindInput(const TableFuncBindInput& other) : inputs{other.inputs} {} }; struct ScanTableFuncBindInput final : public TableFuncBindInput { @@ -27,6 +30,7 @@ struct ScanTableFuncBindInput final : public TableFuncBindInput { main::ClientContext* context; explicit ScanTableFuncBindInput(common::ReaderConfig config) : config{std::move(config)} {}; + EXPLICIT_COPY_DEFAULT_MOVE(ScanTableFuncBindInput); ScanTableFuncBindInput(common::ReaderConfig config, std::vector expectedColumnNames, std::vector expectedColumnTypes, main::ClientContext* context) @@ -35,6 +39,9 @@ struct ScanTableFuncBindInput final : public TableFuncBindInput { expectedColumnTypes{std::move(expectedColumnTypes)}, context{context} { inputs.push_back(common::Value::createValue(this->config.filePaths[0])); } + +private: + ScanTableFuncBindInput(const ScanTableFuncBindInput& other) : {} }; } // namespace function diff --git a/src/include/function/table/scan_replacement.h b/src/include/function/table/scan_replacement.h new file mode 100644 index 00000000000..a0715acd0f4 --- /dev/null +++ b/src/include/function/table/scan_replacement.h @@ -0,0 +1,23 @@ +#pragma once + +#include "function/table_functions.h" +#include "function/table/bind_input.h" + +namespace kuzu { +namespace function { + +struct ScanReplacementData { + TableFunction func; + TableFuncBindInput bindInput; +}; + +using scan_replace_func_t = std::function(const std::string&)>; + +struct ScanReplacement { + ScanReplacement(scan_replace_func_t replaceFunc) : replaceFunc{replaceFunc} {} + + scan_replace_func_t replaceFunc; +}; + +} +} diff --git a/src/include/function/table_functions.h b/src/include/function/table_functions.h index ffb4122b919..70753b49ab2 100644 --- a/src/include/function/table_functions.h +++ b/src/include/function/table_functions.h @@ -4,18 +4,9 @@ #include "function.h" namespace kuzu { -namespace catalog { -class Catalog; -} // namespace catalog -namespace common { -class ValueVector; -} namespace main { class ClientContext; } -namespace storage { -class StorageManager; -} namespace function { @@ -73,7 +64,7 @@ using table_func_init_local_t = std::function; using table_func_can_parallel_t = std::function; -struct TableFunction : public Function { +struct TableFunction final : public Function { table_func_t tableFunc; table_func_bind_t bindFunc; table_func_init_shared_t initSharedStateFunc; diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index 0cac4297750..1c6e42faf00 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -16,6 +16,7 @@ #include "prepared_statement.h" #include "query_result.h" #include "transaction/transaction_context.h" +#include "function/table/scan_replacement.h" namespace kuzu { @@ -43,8 +44,6 @@ struct ActiveQuery { void reset(); }; -using replace_func_t = std::function(common::Value*)>; - /** * @brief Contain client side configuration. We make profiler associated per query, so profiler is * not maintained in client context. @@ -83,9 +82,10 @@ class ClientContext { common::ProgressBar* getProgressBar() const; // Replace function. - inline bool hasReplaceFunc() { return replaceFunc != nullptr; } - inline void setReplaceFunc(replace_func_t func) { replaceFunc = func; } - + void addScanReplace(function::ScanReplacement scanReplacement); + const std::vector& getScanReplacements() const { + return scanReplacements; + } // Extension KUZU_API void setExtensionOption(std::string name, common::Value value); extension::ExtensionOptions* getExtensionOptions() const; @@ -151,7 +151,7 @@ class ClientContext { // Transaction context. std::unique_ptr transactionContext; // Replace external object as pointer Value; - replace_func_t replaceFunc; + std::vector scanReplacements; // Extension configurable settings. std::unordered_map extensionOptionValues; // Random generator for UUID. diff --git a/src/include/main/connection.h b/src/include/main/connection.h index 2b8c3a7f9eb..87d1afcf5bd 100644 --- a/src/include/main/connection.h +++ b/src/include/main/connection.h @@ -135,11 +135,7 @@ class Connection { commitUDFTrx(autoTrx); } - inline void setReplaceFunc(replace_func_t replaceFunc) { - clientContext->setReplaceFunc(std::move(replaceFunc)); - } - - inline ClientContext* getClientContext() { return clientContext.get(); }; + ClientContext* getClientContext() { return clientContext.get(); }; private: std::unique_ptr query( diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 41942a96a94..c4a9da1ca94 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -120,6 +120,10 @@ common::ProgressBar* ClientContext::getProgressBar() const { return progressBar.get(); } +void ClientContext::addScanReplace(function::ScanReplacement scanReplacement) { + scanReplacements.push_back(std::move(scanReplacement)); +} + void ClientContext::setExtensionOption(std::string name, common::Value value) { StringUtils::toLower(name); extensionOptionValues.insert_or_assign(name, std::move(value)); diff --git a/tools/python_api/src_cpp/include/pandas/pandas_scan.h b/tools/python_api/src_cpp/include/pandas/pandas_scan.h index 24546bfd8d6..d7243c60eaa 100644 --- a/tools/python_api/src_cpp/include/pandas/pandas_scan.h +++ b/tools/python_api/src_cpp/include/pandas/pandas_scan.h @@ -25,24 +25,6 @@ struct PandasScanSharedState : public function::BaseScanSharedState { struct PandasScanFunction { static function::function_set getFunctionSet(); - - static common::offset_t tableFunc(function::TableFuncInput& input, function::TableFuncOutput& output); - - static std::unique_ptr bindFunc(main::ClientContext* /*context*/, - function::TableFuncBindInput* input); - - static std::unique_ptr initSharedState( - function::TableFunctionInitInput& input); - - static std::unique_ptr initLocalState( - function::TableFunctionInitInput& input, function::TableFuncSharedState* state, - storage::MemoryManager* /*mm*/); - - static bool sharedStateNext(const function::TableFuncBindData* bindData, - PandasScanLocalState* localState, function::TableFuncSharedState* sharedState); - - static void pandasBackendScanSwitch(PandasColumnBindData* bindData, uint64_t count, - uint64_t offset, common::ValueVector* outputVector); }; struct PandasScanFunctionData : public function::TableFuncBindData { @@ -69,6 +51,6 @@ struct PandasScanFunctionData : public function::TableFuncBindData { } }; -std::unique_ptr replacePD(common::Value* value); +std::unique_ptr replacePD(const std::string& objectName); } // namespace kuzu diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index f9473a2a9fa..27886fc4479 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -5,6 +5,7 @@ #include "numpy/numpy_scan.h" #include "py_connection.h" #include "pybind11/pytypes.h" +#include "binder/expression/function_expression.h" using namespace kuzu::function; using namespace kuzu::common; @@ -12,15 +13,31 @@ using namespace kuzu::catalog; namespace kuzu { -function_set PandasScanFunction::getFunctionSet() { +static offset_t tableFunc(TableFuncInput&, TableFuncOutput&); +static std::unique_ptr bindFunc(main::ClientContext*, + TableFuncBindInput*); +static std::unique_ptr initSharedState( + TableFunctionInitInput&); +static std::unique_ptr initLocalState( + TableFunctionInitInput&, TableFuncSharedState*, + storage::MemoryManager*); +static bool sharedStateNext(const TableFuncBindData*, + PandasScanLocalState*, TableFuncSharedState*); +static void pandasBackendScanSwitch(PandasColumnBindData*, uint64_t, + uint64_t, ValueVector*); + +static TableFunction getFunction() { + return TableFunction(READ_PANDAS_FUNC_NAME, tableFunc, bindFunc, initSharedState, + initLocalState, std::vector{LogicalTypeID::POINTER}); +} + +function_set getFunctionSet() { function_set functionSet; - functionSet.push_back( - std::make_unique(READ_PANDAS_FUNC_NAME, tableFunc, bindFunc, initSharedState, - initLocalState, std::vector{LogicalTypeID::POINTER})); + functionSet.push_back(getFunction().copy()); return functionSet; } -std::unique_ptr PandasScanFunction::bindFunc( +std::unique_ptr bindFunc( main::ClientContext* /*context*/, TableFuncBindInput* input) { py::gil_scoped_acquire acquire; py::handle df(reinterpret_cast(input->inputs[0].getValue())); @@ -39,8 +56,8 @@ std::unique_ptr PandasScanFunction::bindFunc( std::move(returnTypes), std::move(names), df, numRows, std::move(columnBindData)); } -bool PandasScanFunction::sharedStateNext(const TableFuncBindData* /*bindData*/, - PandasScanLocalState* localState, function::TableFuncSharedState* sharedState) { +bool sharedStateNext(const TableFuncBindData* /*bindData*/, + PandasScanLocalState* localState, TableFuncSharedState* sharedState) { auto pandasSharedState = reinterpret_cast(sharedState); std::lock_guard lck{pandasSharedState->lock}; if (pandasSharedState->position >= pandasSharedState->numRows) { @@ -54,26 +71,26 @@ bool PandasScanFunction::sharedStateNext(const TableFuncBindData* /*bindData*/, return true; } -std::unique_ptr PandasScanFunction::initLocalState( - function::TableFunctionInitInput& input, function::TableFuncSharedState* sharedState, - storage::MemoryManager* /*mm*/) { +std::unique_ptr initLocalState( + TableFunctionInitInput& input, TableFuncSharedState* sharedState, + storage::MemoryManager*) { auto localState = std::make_unique(0 /* start */, 0 /* end */); sharedStateNext(input.bindData, localState.get(), sharedState); return localState; } -std::unique_ptr PandasScanFunction::initSharedState( - function::TableFunctionInitInput& input) { +std::unique_ptr initSharedState( + TableFunctionInitInput& input) { // LCOV_EXCL_START if (PyGILState_Check()) { - throw common::RuntimeException("PandasScan called but GIL was already held!"); + throw RuntimeException("PandasScan called but GIL was already held!"); } // LCOV_EXCL_STOP auto scanBindData = reinterpret_cast(input.bindData); return std::make_unique(scanBindData->numRows); } -void PandasScanFunction::pandasBackendScanSwitch( +void pandasBackendScanSwitch( PandasColumnBindData* bindData, uint64_t count, uint64_t offset, ValueVector* outputVector) { auto backend = bindData->pandasCol->getBackEnd(); switch (backend) { @@ -85,8 +102,8 @@ void PandasScanFunction::pandasBackendScanSwitch( } } -common::offset_t PandasScanFunction::tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output) { +offset_t tableFunc( + TableFuncInput& input, TableFuncOutput& output) { auto pandasScanData = reinterpret_cast(input.bindData); auto pandasLocalState = reinterpret_cast(input.localState); @@ -115,33 +132,51 @@ std::vector> PandasScanFunctionData::copyC return result; } -std::unique_ptr tryReplacePD(py::dict& dict, py::str& tableName) { - if (!dict.contains(tableName)) { +//std::unique_ptr tryReplacePD(py::dict& dict, py::str& tableName) { +// if (!dict.contains(tableName)) { +// return nullptr; +// } +// auto entry = dict[tableName]; +// if (PyConnection::isPandasDataframe(entry)) { +// return Value::createValue(reinterpret_cast(entry.ptr())).copy(); +// } else { +// throw RuntimeException{"Only pandas dataframe is supported."}; +// } +//} + + +static std::unique_ptr play(py::dict& dict, py::str& objectName) { + if (!dict.contains(objectName)) { return nullptr; } - auto entry = dict[tableName]; + auto entry = dict[objectName]; if (PyConnection::isPandasDataframe(entry)) { - return Value::createValue(reinterpret_cast(entry.ptr())).copy(); + auto scanReplacementData = std::make_unique(); + scanReplacementData->func = getFunction(); + auto bindInput = TableFuncBindInput(); + bindInput.inputs.push_back(Value::createValue(reinterpret_cast(entry.ptr()))); + scanReplacementData->bindInput = std::move(bindInput); + return scanReplacementData; } else { throw RuntimeException{"Only pandas dataframe is supported."}; } } -std::unique_ptr replacePD(common::Value* value) { - auto pyTableName = py::str(value->getValue()); +std::unique_ptr replacePD(const std::string& objectName) { + auto pyTableName = py::str(objectName); // Here we do an exhaustive search on the frame lineage. auto currentFrame = importCache->inspect.currentframe()(); while (hasattr(currentFrame, "f_locals")) { auto localDict = py::reinterpret_borrow(currentFrame.attr("f_locals")); if (localDict) { - auto result = tryReplacePD(localDict, pyTableName); + auto result = play(localDict, pyTableName); if (result) { return result; } } auto globalDict = py::reinterpret_borrow(currentFrame.attr("f_globals")); if (globalDict) { - auto result = tryReplacePD(globalDict, pyTableName); + auto result = play(globalDict, pyTableName); if (result) { return result; } diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 155fe6a11db..a7e5fec40c9 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -33,7 +33,7 @@ void PyConnection::initialize(py::handle& m) { PyConnection::PyConnection(PyDatabase* pyDatabase, uint64_t numThreads) { storageDriver = std::make_unique(pyDatabase->database.get()); conn = std::make_unique(pyDatabase->database.get()); - conn->setReplaceFunc(kuzu::replacePD); + conn->getClientContext()->addScanReplace(function::ScanReplacement(kuzu::replacePD)); if (numThreads > 0) { conn->setMaxNumThreadForExec(numThreads); } From d65c2b8c6526002b872aed84be9586d52cb57b8a Mon Sep 17 00:00:00 2001 From: xiyang Date: Mon, 18 Mar 2024 17:11:23 -0400 Subject: [PATCH 067/136] clean --- src/binder/bind/bind_copy.cpp | 2 +- src/binder/bind/bind_reading_clause.cpp | 105 ++++++++++-------- .../bind_variable_expression.cpp | 3 +- src/common/exception/message.cpp | 12 ++ .../common/copier_config/reader_config.h | 1 + src/include/common/exception/message.h | 19 ++-- src/include/function/table/bind_input.h | 9 +- src/include/function/table/scan_replacement.h | 6 +- src/include/main/client_context.h | 7 +- src/main/client_context.cpp | 12 ++ .../python_api/src_cpp/pandas/pandas_scan.cpp | 2 +- 11 files changed, 109 insertions(+), 69 deletions(-) diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index f79f7c1f36f..53816a96f50 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -37,7 +37,7 @@ std::unique_ptr Binder::bindCopyToClause(const Statement& statem columnTypes.push_back(column->getDataType()); } if (fileType != FileType::CSV && fileType != FileType::PARQUET) { - throw BinderException(ExceptionMessage::validateCopyToCSVParquetExtensionsException()); + throw BinderException("COPY TO currently only supports csv and parquet files."); } if (fileType != FileType::CSV && copyToStatement.getParsingOptionsRef().size() != 0) { throw BinderException{"Only copy to csv can have options."}; diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index e29b7bbbd42..89229162000 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -5,6 +5,7 @@ #include "binder/query/reading_clause/bound_match_clause.h" #include "binder/query/reading_clause/bound_unwind_clause.h" #include "common/exception/binder.h" +#include "common/exception/message.h" #include "common/string_format.h" #include "common/string_utils.h" #include "function/table/bind_input.h" @@ -12,6 +13,7 @@ #include "main/database.h" #include "main/database_manager.h" #include "parser/expression/parsed_function_expression.h" +#include "parser/expression/parsed_variable_expression.h" #include "parser/query/reading_clause/in_query_call_clause.h" #include "parser/query/reading_clause/load_from.h" #include "parser/query/reading_clause/match_clause.h" @@ -114,28 +116,52 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& auto expr = call.getFunctionExpression(); auto functionExpr = ku_dynamic_cast(expr); - std::vector inputValues; + // Bind parameters + std::unique_ptr replacementData; + expression_vector params; for (auto i = 0u; i < functionExpr->getNumChildren(); i++) { - auto parameter = expressionBinder.bindExpression(*functionExpr->getChild(i)); - if (parameter->expressionType != ExpressionType::LITERAL) { - throw BinderException{ - stringFormat("Cannot evaluate {} as a literal.", parameter->toString())}; + auto child = functionExpr->getChild(i); + try { + params.push_back(expressionBinder.bindExpression(*child)); + } catch (BinderException& exception) { + if (child->getExpressionType() != ExpressionType::VARIABLE) { + throw BinderException(exception.what()); // Cannot replace. Rethrow. + } + // Try replacement. + auto varExpr = ku_dynamic_cast(child); + auto var = varExpr->getVariableName(); + replacementData = clientContext->tryReplace(var); + if (replacementData == nullptr) { // Replacement fail. + throw BinderException(ExceptionMessage::variableNotInScope(var)); + } + } + } + TableFunction tableFunction; + std::unique_ptr bindData; + if (replacementData) { + tableFunction = replacementData->func; + bindData = tableFunction.bindFunc(clientContext, &replacementData->bindInput); + } else { + std::vector inputValues; + std::vector inputTypes; + for (auto& param : params) { + if (param->expressionType != ExpressionType::LITERAL) { + throw BinderException{ + stringFormat("Cannot evaluate {} as a literal.", param->toString())}; + } + auto literalExpr = + ku_dynamic_cast(param.get()); + inputTypes.push_back(literalExpr->getDataType()); + inputValues.push_back(*literalExpr->getValue()); } - auto literalExpr = - ku_dynamic_cast(parameter.get()); - inputValues.push_back(*literalExpr->getValue()); - } - std::vector inputTypes; - for (auto& val : inputValues) { - inputTypes.push_back(*val.getDataType()); - } - auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); - auto func = BuiltInFunctionsUtils::matchFunction( - functionExpr->getFunctionName(), inputTypes, functions); - auto tableFunc = ku_dynamic_cast(func); - auto bindInput = std::make_unique(); - bindInput->inputs = std::move(inputValues); - auto bindData = tableFunc->bindFunc(clientContext, bindInput.get()); + auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); + auto func = BuiltInFunctionsUtils::matchFunction( + functionExpr->getFunctionName(), inputTypes, functions); + tableFunction = *ku_dynamic_cast(func); + auto bindInput = function::TableFuncBindInput(); + bindInput.inputs = std::move(inputValues); + bindData = tableFunction.bindFunc(clientContext, &bindInput); + } expression_vector columns; for (auto i = 0u; i < bindData->columnTypes.size(); i++) { columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); @@ -143,7 +169,7 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& auto offset = expressionBinder.createVariableExpression( *LogicalType::INT64(), std::string(InternalKeyword::ROW_OFFSET)); auto boundInQueryCall = std::make_unique( - *tableFunc, std::move(bindData), std::move(columns), offset); + tableFunction, std::move(bindData), std::move(columns), offset); if (call.hasWherePredicate()) { auto wherePredicate = expressionBinder.bindExpression(*call.getWherePredicate()); boundInQueryCall->setPredicate(std::move(wherePredicate)); @@ -153,8 +179,8 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& std::unique_ptr Binder::bindLoadFrom(const ReadingClause& readingClause) { auto& loadFrom = ku_dynamic_cast(readingClause); - function::TableFunction scanFunction; - std::unique_ptr bindInput; + TableFunction scanFunction; + std::unique_ptr bindData; auto source = loadFrom.getSource(); switch (source->type) { case ScanSourceType::OBJECT: { @@ -162,23 +188,12 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re auto objectName = objectSource->objectName; if (objectName.find("_") == std::string::npos) { // Bind table - for (auto& scanReplacement : clientContext->getScanReplacements()) { - auto replaceData = scanReplacement.replaceFunc(objectName); - if (replaceData == nullptr) { - continue ; // Fail to replace. - } - bindInput = replaceData->bindInput; + auto replacementData = clientContext->tryReplace(objectName); + if (replacementData == nullptr) { + throw BinderException(ExceptionMessage::variableNotInScope(objectName)); } - - auto objectExpr = expressionBinder.bindVariableExpression(objectName); - auto literalExpr = - ku_dynamic_cast(objectExpr.get()); - auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); - auto func = BuiltInFunctionsUtils::matchFunction(READ_PANDAS_FUNC_NAME, - std::vector{objectExpr->getDataType()}, functions); - scanFunction = *ku_dynamic_cast(func); - bindInput = std::make_unique(); - bindInput->inputs.push_back(*literalExpr->getValue()); + scanFunction = replacementData->func; + bindData = scanFunction.bindFunc(clientContext, &replacementData->bindInput); } else { auto dbName = common::StringUtils::split(objectName, "_")[0]; auto attachedDB = @@ -193,7 +208,8 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re auto tableCatalogEntry = ku_dynamic_cast( attachedDB->getCatalogContent()->getTableCatalogEntry(tableID)); scanFunction = tableCatalogEntry->getScanFunction(); - bindInput = std::make_unique(); + auto bindInput = function::TableFuncBindInput(); + bindData = scanFunction.bindFunc(clientContext, &bindInput); } } break; case ScanSourceType::FILE: { @@ -222,16 +238,13 @@ std::unique_ptr Binder::bindLoadFrom(const ReadingClause& re expectedColumnTypes.push_back(*bindDataType(type)); } scanFunction = getScanFunction(readerConfig->fileType, *readerConfig); - auto bindInput_ = std::make_unique(readerConfig->copy()); - bindInput_->expectedColumnNames = std::move(expectedColumnNames); - bindInput_->expectedColumnTypes = std::move(expectedColumnTypes); - bindInput_->context = clientContext; - bindInput = std::move(bindInput_); + auto bindInput = ScanTableFuncBindInput(readerConfig->copy(), + std::move(expectedColumnNames), std::move(expectedColumnTypes), clientContext); + bindData = scanFunction.bindFunc(clientContext, &bindInput); } break; default: throw BinderException(stringFormat("LOAD FROM subquery is not supported.")); } - auto bindData = scanFunction.bindFunc(clientContext, bindInput.get()); expression_vector columns; for (auto i = 0u; i < bindData->columnTypes.size(); i++) { columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); diff --git a/src/binder/bind_expression/bind_variable_expression.cpp b/src/binder/bind_expression/bind_variable_expression.cpp index a33fa9a76d3..d80db3a5e35 100644 --- a/src/binder/bind_expression/bind_variable_expression.cpp +++ b/src/binder/bind_expression/bind_variable_expression.cpp @@ -3,6 +3,7 @@ #include "binder/expression/variable_expression.h" #include "binder/expression_binder.h" #include "common/exception/binder.h" +#include "common/exception/message.h" #include "main/client_context.h" #include "parser/expression/parsed_variable_expression.h" @@ -24,7 +25,7 @@ std::shared_ptr ExpressionBinder::bindVariableExpression(const std:: if (binder->scope->contains(varName)) { return binder->scope->getExpression(varName); } - throw BinderException(stringFormat("Variable {} is not in scope.", varName)); + throw BinderException(ExceptionMessage::variableNotInScope(varName)); } std::shared_ptr ExpressionBinder::createVariableExpression( diff --git a/src/common/exception/message.cpp b/src/common/exception/message.cpp index 94b70cd9d1d..1857f70434d 100644 --- a/src/common/exception/message.cpp +++ b/src/common/exception/message.cpp @@ -21,6 +21,14 @@ std::string ExceptionMessage::invalidPKType(const std::string& type) { type); } +std::string ExceptionMessage::nullPKException() { + return "Found NULL, which violates the non-null constraint of the primary key column."; +} + +std::string ExceptionMessage::notAllowCopyOnNonEmptyTableException() { + return "COPY commands can only be executed once on a table."; +} + std::string ExceptionMessage::overLargeStringPKValueException(uint64_t length) { return stringFormat("The maximum length of primary key strings is 262144 bytes. The input " "string's length was {}.", @@ -47,5 +55,9 @@ std::string ExceptionMessage::violateRelMultiplicityConstraint( offset, tableName, direction); } +std::string ExceptionMessage::variableNotInScope(const std::string& varName) { + return stringFormat("Variable {} is not in scope.", varName); +} + } // namespace common } // namespace kuzu diff --git a/src/include/common/copier_config/reader_config.h b/src/include/common/copier_config/reader_config.h index 1b2d187e99b..3fc5c81b76d 100644 --- a/src/include/common/copier_config/reader_config.h +++ b/src/include/common/copier_config/reader_config.h @@ -30,6 +30,7 @@ struct ReaderConfig { std::vector filePaths; std::unordered_map options; + ReaderConfig() = default; ReaderConfig(FileType fileType, std::vector filePaths) : fileType{fileType}, filePaths{std::move(filePaths)} {} EXPLICIT_COPY_DEFAULT_MOVE(ReaderConfig); diff --git a/src/include/common/exception/message.h b/src/include/common/exception/message.h index a7ef56f34ca..ad5f499a76e 100644 --- a/src/include/common/exception/message.h +++ b/src/include/common/exception/message.h @@ -6,26 +6,25 @@ namespace kuzu { namespace common { +// Add exception only if you need to throw it in multiple places. struct ExceptionMessage { + // Primary key. static std::string duplicatePKException(const std::string& pkString); static std::string nonExistentPKException(const std::string& pkString); static std::string invalidPKType(const std::string& type); - static inline std::string nullPKException() { - return "Found NULL, which violates the non-null constraint of the primary key column."; - } - static inline std::string notAllowCopyOnNonEmptyTableException() { - return "COPY commands can only be executed once on a table."; - } + static std::string nullPKException(); + // Bulk insertion. + static std::string notAllowCopyOnNonEmptyTableException(); + // Long string. static std::string overLargeStringPKValueException(uint64_t length); static std::string overLargeStringValueException(uint64_t length); + // Foreign key. static std::string violateDeleteNodeWithConnectedEdgesConstraint( const std::string& tableName, const std::string& offset, const std::string& direction); static std::string violateRelMultiplicityConstraint( const std::string& tableName, const std::string& offset, const std::string& direction); - - static inline std::string validateCopyToCSVParquetExtensionsException() { - return "COPY TO currently only supports csv and parquet files."; - } + // Binding exception + static std::string variableNotInScope(const std::string& varName); }; } // namespace common diff --git a/src/include/function/table/bind_input.h b/src/include/function/table/bind_input.h index 13034a93a3e..8de191b36dd 100644 --- a/src/include/function/table/bind_input.h +++ b/src/include/function/table/bind_input.h @@ -19,7 +19,7 @@ struct TableFuncBindInput { EXPLICIT_COPY_DEFAULT_MOVE(TableFuncBindInput); virtual ~TableFuncBindInput() = default; -private: +protected: TableFuncBindInput(const TableFuncBindInput& other) : inputs{other.inputs} {} }; @@ -30,7 +30,6 @@ struct ScanTableFuncBindInput final : public TableFuncBindInput { main::ClientContext* context; explicit ScanTableFuncBindInput(common::ReaderConfig config) : config{std::move(config)} {}; - EXPLICIT_COPY_DEFAULT_MOVE(ScanTableFuncBindInput); ScanTableFuncBindInput(common::ReaderConfig config, std::vector expectedColumnNames, std::vector expectedColumnTypes, main::ClientContext* context) @@ -39,9 +38,13 @@ struct ScanTableFuncBindInput final : public TableFuncBindInput { expectedColumnTypes{std::move(expectedColumnTypes)}, context{context} { inputs.push_back(common::Value::createValue(this->config.filePaths[0])); } + EXPLICIT_COPY_DEFAULT_MOVE(ScanTableFuncBindInput); private: - ScanTableFuncBindInput(const ScanTableFuncBindInput& other) : {} + ScanTableFuncBindInput(const ScanTableFuncBindInput& other) + : TableFuncBindInput{other}, config{other.config.copy()}, + expectedColumnNames{other.expectedColumnNames}, + expectedColumnTypes{other.expectedColumnTypes}, context{other.context} {} }; } // namespace function diff --git a/src/include/function/table/scan_replacement.h b/src/include/function/table/scan_replacement.h index a0715acd0f4..63bb4e3c5ca 100644 --- a/src/include/function/table/scan_replacement.h +++ b/src/include/function/table/scan_replacement.h @@ -1,7 +1,7 @@ #pragma once -#include "function/table_functions.h" #include "function/table/bind_input.h" +#include "function/table_functions.h" namespace kuzu { namespace function { @@ -19,5 +19,5 @@ struct ScanReplacement { scan_replace_func_t replaceFunc; }; -} -} +} // namespace function +} // namespace kuzu diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index 1c6e42faf00..fdbaf812fb4 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -11,12 +11,13 @@ #include "common/timer.h" #include "common/types/value/value.h" #include "function/function.h" +#include "function/scalar_function.h" +#include "function/table/scan_replacement.h" #include "main/kuzu_fwd.h" #include "parser/statement.h" #include "prepared_statement.h" #include "query_result.h" #include "transaction/transaction_context.h" -#include "function/table/scan_replacement.h" namespace kuzu { @@ -83,9 +84,7 @@ class ClientContext { // Replace function. void addScanReplace(function::ScanReplacement scanReplacement); - const std::vector& getScanReplacements() const { - return scanReplacements; - } + std::unique_ptr tryReplace(const std::string& objectName) const; // Extension KUZU_API void setExtensionOption(std::string name, common::Value value); extension::ExtensionOptions* getExtensionOptions() const; diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index c4a9da1ca94..7a147e50039 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -124,6 +124,18 @@ void ClientContext::addScanReplace(function::ScanReplacement scanReplacement) { scanReplacements.push_back(std::move(scanReplacement)); } +std::unique_ptr ClientContext::tryReplace( + const std::string& objectName) const { + for (auto& scanReplacement : scanReplacements) { + auto replaceData = scanReplacement.replaceFunc(objectName); + if (replaceData == nullptr) { + continue; // Fail to replace. + } + return replaceData; + } + return nullptr; +} + void ClientContext::setExtensionOption(std::string name, common::Value value) { StringUtils::toLower(name); extensionOptionValues.insert_or_assign(name, std::move(value)); diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index 27886fc4479..50cc5fa15f4 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -31,7 +31,7 @@ static TableFunction getFunction() { initLocalState, std::vector{LogicalTypeID::POINTER}); } -function_set getFunctionSet() { +function_set PandasScanFunction::getFunctionSet() { function_set functionSet; functionSet.push_back(getFunction().copy()); return functionSet; From 8f976e4f593e1a64b48978a79d2f9fb327ca75d3 Mon Sep 17 00:00:00 2001 From: xiyang Date: Mon, 18 Mar 2024 17:13:51 -0400 Subject: [PATCH 068/136] clean --- .../python_api/src_cpp/pandas/pandas_scan.cpp | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index 50cc5fa15f4..67607187a85 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -132,20 +132,7 @@ std::vector> PandasScanFunctionData::copyC return result; } -//std::unique_ptr tryReplacePD(py::dict& dict, py::str& tableName) { -// if (!dict.contains(tableName)) { -// return nullptr; -// } -// auto entry = dict[tableName]; -// if (PyConnection::isPandasDataframe(entry)) { -// return Value::createValue(reinterpret_cast(entry.ptr())).copy(); -// } else { -// throw RuntimeException{"Only pandas dataframe is supported."}; -// } -//} - - -static std::unique_ptr play(py::dict& dict, py::str& objectName) { +static std::unique_ptr tryReplacePD(py::dict& dict, py::str& objectName) { if (!dict.contains(objectName)) { return nullptr; } @@ -169,14 +156,14 @@ std::unique_ptr replacePD(const std::string& objectName) { while (hasattr(currentFrame, "f_locals")) { auto localDict = py::reinterpret_borrow(currentFrame.attr("f_locals")); if (localDict) { - auto result = play(localDict, pyTableName); + auto result = tryReplacePD(localDict, pyTableName); if (result) { return result; } } auto globalDict = py::reinterpret_borrow(currentFrame.attr("f_globals")); if (globalDict) { - auto result = play(globalDict, pyTableName); + auto result = tryReplacePD(globalDict, pyTableName); if (result) { return result; } From 23144c3acdbfcda7208a1bf70f919253884bb963 Mon Sep 17 00:00:00 2001 From: mxwli Date: Tue, 27 Feb 2024 10:14:00 -0500 Subject: [PATCH 069/136] pyarrow backend scanning for pandas formatting checks remove disabled tests more clang format fixes... py lint check clang tidy more clang tidy and py lint checks more and more clang tidy explicit pyarrow scan ctor possibly fixed tests not running? CI fixes fix pytest non portable type resolution solution apple clang test fix? add some requested changes apply backend switching remove fixed list update httpfs version & remove python-debug clang tidy fix array arithmetic on void revert extension version change apply clang-tidy fix compiler errors ... more clang-tidy fixes added requested changes clang-tidy --- CMakeLists.txt | 2 +- src/binder/bind/bind_copy.cpp | 1 - .../bind_variable_expression.cpp | 1 - src/common/arrow/CMakeLists.txt | 5 +- src/common/arrow/arrow_array_scan.cpp | 549 ++++++++++++++++++ src/common/arrow/arrow_null_mask_tree.cpp | 214 +++++++ src/common/arrow/arrow_type.cpp | 149 +++++ src/common/null_mask.cpp | 4 +- src/common/vector/value_vector.cpp | 4 +- src/include/catalog/catalog.h | 1 - src/include/common/arrow/arrow.h | 18 + src/include/common/arrow/arrow_converter.h | 8 + .../common/arrow/arrow_nullmask_tree.h | 39 ++ src/include/common/enums/expression_type.h | 1 + src/include/common/null_mask.h | 5 +- src/include/common/vector/value_vector.h | 8 +- src/include/function/table/scan_replacement.h | 2 +- src/include/main/client_context.h | 2 - tools/python_api/CMakeLists.txt | 2 + .../include/cached_import/py_cached_modules.h | 8 +- .../src_cpp/include/pyarrow/pyarrow_bind.h | 18 + .../src_cpp/include/pyarrow/pyarrow_scan.h | 61 ++ .../python_api/src_cpp/pandas/pandas_scan.cpp | 69 ++- tools/python_api/src_cpp/py_database.cpp | 1 + .../src_cpp/pyarrow/pyarrow_bind.cpp | 26 + .../src_cpp/pyarrow/pyarrow_scan.cpp | 102 ++++ tools/python_api/test/test_df_pyarrow.py | 234 ++++++++ 27 files changed, 1485 insertions(+), 49 deletions(-) create mode 100644 src/common/arrow/arrow_array_scan.cpp create mode 100644 src/common/arrow/arrow_null_mask_tree.cpp create mode 100644 src/common/arrow/arrow_type.cpp create mode 100644 src/include/common/arrow/arrow_nullmask_tree.h create mode 100644 tools/python_api/src_cpp/include/pyarrow/pyarrow_bind.h create mode 100644 tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h create mode 100644 tools/python_api/src_cpp/pyarrow/pyarrow_bind.cpp create mode 100644 tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp create mode 100644 tools/python_api/test/test_df_pyarrow.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 2df5f6d9836..82af9dfa937 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,7 +197,7 @@ endif () if(${BUILD_KUZU}) add_definitions(-DKUZU_ROOT_DIRECTORY="${PROJECT_SOURCE_DIR}") add_definitions(-DKUZU_CMAKE_VERSION="${CMAKE_PROJECT_VERSION}") -add_definitions(-DKUZU_EXTENSION_VERSION="0.2.0") +add_definitions(-DKUZU_EXTENSION_VERSION="0.2.2") include_directories(src/include) include_directories(third_party/antlr4_cypher/include) diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index 53816a96f50..3f605f5804b 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -6,7 +6,6 @@ #include "catalog/catalog_entry/rel_table_catalog_entry.h" #include "common/enums/table_type.h" #include "common/exception/binder.h" -#include "common/exception/message.h" #include "common/string_format.h" #include "function/table/bind_input.h" #include "main/client_context.h" diff --git a/src/binder/bind_expression/bind_variable_expression.cpp b/src/binder/bind_expression/bind_variable_expression.cpp index d80db3a5e35..bfb3914634e 100644 --- a/src/binder/bind_expression/bind_variable_expression.cpp +++ b/src/binder/bind_expression/bind_variable_expression.cpp @@ -1,5 +1,4 @@ #include "binder/binder.h" -#include "binder/expression/literal_expression.h" #include "binder/expression/variable_expression.h" #include "binder/expression_binder.h" #include "common/exception/binder.h" diff --git a/src/common/arrow/CMakeLists.txt b/src/common/arrow/CMakeLists.txt index c3281117ebf..34f81286f20 100644 --- a/src/common/arrow/CMakeLists.txt +++ b/src/common/arrow/CMakeLists.txt @@ -1,7 +1,10 @@ add_library(kuzu_common_arrow OBJECT + arrow_array_scan.cpp + arrow_converter.cpp + arrow_null_mask_tree.cpp arrow_row_batch.cpp - arrow_converter.cpp) + arrow_type.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/common/arrow/arrow_array_scan.cpp b/src/common/arrow/arrow_array_scan.cpp new file mode 100644 index 00000000000..556cf2a24c2 --- /dev/null +++ b/src/common/arrow/arrow_array_scan.cpp @@ -0,0 +1,549 @@ +#include "common/arrow/arrow_converter.h" +#include "common/types/interval_t.h" +#include "common/types/types.h" +#include "common/vector/value_vector.h" + +namespace kuzu { +namespace common { + +// scans are based on data specification found here +// https://arrow.apache.org/docs/format/Columnar.html + +// all offsets are measured by value, not physical size + +template +static void scanArrowArrayFixedSizePrimitive(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto arrayBuffer = (const uint8_t*)array->buffers[1]; + mask->copyToValueVector(&outputVector, dstOffset, count); + memcpy(outputVector.getData() + dstOffset * outputVector.getNumBytesPerValue(), + arrayBuffer + srcOffset * sizeof(T), count * sizeof(T)); +} + +template<> +void scanArrowArrayFixedSizePrimitive(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto arrayBuffer = (const uint8_t*)array->buffers[1]; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + outputVector.setValue( + i + dstOffset, NullMask::isNull((const uint64_t*)arrayBuffer, i + srcOffset)); + } +} + +static void scanArrowArrayDurationScaledUp(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, int64_t scaleFactor, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto arrayBuffer = ((const int64_t*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curValue = arrayBuffer[i]; + outputVector.setValue( + i + dstOffset, interval_t(0, 0, curValue * scaleFactor)); + } + } +} + +static void scanArrowArrayDurationScaledDown(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, int64_t scaleFactor, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto arrayBuffer = ((const int64_t*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curValue = arrayBuffer[i]; + outputVector.setValue( + i + dstOffset, interval_t(0, 0, curValue / scaleFactor)); + } + } +} + +static void scanArrowArrayMonthInterval(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto arrayBuffer = ((const int32_t*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curValue = arrayBuffer[i]; + outputVector.setValue(i + dstOffset, interval_t(curValue, 0, 0)); + } + } +} + +static void scanArrowArrayDayTimeInterval(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto arrayBuffer = ((const int64_t*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + int64_t curValue = arrayBuffer[i]; + int32_t day = curValue; + int64_t micros = (curValue >> (4 * sizeof(int64_t))) * 1000; + // arrow stores ms, while we store us + outputVector.setValue(i + dstOffset, interval_t(0, day, micros)); + } + } +} + +static void scanArrowArrayMonthDayNanoInterval(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto arrayBuffer = + (const int64_t*)((const uint8_t*)array->buffers[1] + srcOffset * 16); // 16 bits per value + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + int64_t curValue = arrayBuffer[2 * i]; + int32_t month = curValue; + int32_t day = curValue >> (4 * sizeof(int64_t)); + int64_t micros = arrayBuffer[2 * i + 1] / 1000; + outputVector.setValue(i + dstOffset, interval_t(month, day, micros)); + } + } +} + +template +static void scanArrowArrayBLOB(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; + auto arrayBuffer = (const uint8_t*)array->buffers[2]; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curOffset = offsets[i], nextOffset = offsets[i + 1]; + const uint8_t* data = arrayBuffer + curOffset; + auto length = nextOffset - curOffset; + BlobVector::addBlob(&outputVector, i + dstOffset, data, length); + } + } +} + +static void scanArrowArrayBLOBView(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { + auto arrayBuffer = (const uint8_t*)(array->buffers[1]); + auto valueBuffs = (const uint8_t**)(array->buffers + 2); + // BLOB value buffers begin from index 2 onwards + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curView = (const int32_t*)(arrayBuffer + (i + srcOffset) * 16); + // view structures are 16 bytes long + auto viewLength = curView[0]; + if (viewLength <= 12) { + BlobVector::addBlob( + &outputVector, i + dstOffset, (uint8_t*)(curView + 1), viewLength); + } else { + auto bufIndex = curView[2]; + auto offset = curView[3]; + BlobVector::addBlob( + &outputVector, i + dstOffset, valueBuffs[bufIndex] + offset, viewLength); + } + } + } +} + +static void scanArrowArrayFixedBLOB(const ArrowArray* array, ValueVector& outputVector, + ArrowNullMaskTree* mask, int64_t BLOBsize, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto arrayBuffer = ((const uint8_t*)array->buffers[1]) + srcOffset * BLOBsize; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + BlobVector::addBlob(&outputVector, i + dstOffset, arrayBuffer + i * BLOBsize, BLOBsize); + } + } +} + +template +static void scanArrowArrayVarList(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + ValueVector* auxiliaryBuffer = ListVector::getDataVector(&outputVector); + for (int64_t i = 0; i < count; i++) { + auto curOffset = offsets[i], nextOffset = offsets[i + 1]; + if (!mask->isNull(i)) { + auto newEntry = ListVector::addList(&outputVector, nextOffset - curOffset); + outputVector.setValue(i + dstOffset, newEntry); + } + } + ArrowConverter::fromArrowArray(schema->children[0], array->children[0], *auxiliaryBuffer, + mask->getChild(0), offsets[0], 0u, offsets[count] - offsets[0]); +} + +template +static void scanArrowArrayVarListView(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; + auto sizes = ((const offsetsT*)array->buffers[2]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + ValueVector* auxiliaryBuffer = ListVector::getDataVector(&outputVector); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curOffset = offsets[i], size = sizes[i]; + auto newEntry = ListVector::addList(&outputVector, size); + outputVector.setValue(i + dstOffset, newEntry); + ArrowNullMaskTree childTree(schema->children[0], array->children[0], srcOffset, count); + // make our own child here. precomputing through the mask tree is too complicated + ArrowConverter::fromArrowArray(schema->children[0], array->children[0], + *auxiliaryBuffer, &childTree, curOffset, newEntry.offset, newEntry.size); + } + } +} +/* +TODO manh: scan arrow fixed list +static void scanArrowArrayFixedList(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + mask->copyToValueVector(&outputVector, dstOffset, count); + int64_t numValuesInList = FixedListType::getNumValuesInList(&outputVector.dataType); + ArrowConverter::fromArrowArray(schema->children[0], array->children[0], outputVector, + mask->getChild(0), srcOffset * numValuesInList, dstOffset * numValuesInList, + count * numValuesInList); +} +*/ + +static void scanArrowArrayStruct(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + outputVector.setValue(i + dstOffset, + i + dstOffset); // struct_entry_t doesn't work for some reason + } + } + for (int64_t j = 0; j < schema->n_children; j++) { + ArrowConverter::fromArrowArray(schema->children[j], array->children[j], + *StructVector::getFieldVector(&outputVector, j).get(), mask->getChild(j), srcOffset, + dstOffset, count); + } +} + +static void scanArrowArrayDenseUnion(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto types = ((const int8_t*)array->buffers[0]) + srcOffset; + auto offsets = ((const int32_t*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curType = types[i]; + auto curOffset = offsets[i]; + UnionVector::setTagField(&outputVector, curType); + ArrowConverter::fromArrowArray(schema->children[curType], array->children[curType], + *StructVector::getFieldVector(&outputVector, curType).get(), + mask->getChild(curType), curOffset + srcOffset, i + dstOffset, 1); + // may be inefficient, since we're only scanning a single value + // should probably ask if we support dense unions (ie. is it okay to pack them) + } + } +} + +static void scanArrowArraySparseUnion(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + auto types = ((const int8_t*)array->buffers[0]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto curType = types[i]; + UnionVector::setTagField(&outputVector, curType); + } + } + // it is specified that values that aren't selected in the type buffer + // must also be semantically correct. this is why this scanning works. + // however, there is possibly room for optimization here. + // eg. nulling out unselected children + for (int8_t i = 0; i < array->n_children; i++) { + ArrowConverter::fromArrowArray(schema->children[i], array->children[i], + *UnionVector::getValVector(&outputVector, i), mask->getChild(i), srcOffset, dstOffset, + count); + } +} + +template +static void scanArrowArrayDictionaryEncoded(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + + auto values = ((const offsetsT*)array->buffers[1]) + srcOffset; + mask->copyToValueVector(&outputVector, dstOffset, count); + for (int64_t i = 0; i < count; i++) { + if (!mask->isNull(i)) { + auto dictOffseted = (*mask->getDictionary()) + values[i]; + ArrowConverter::fromArrowArray(schema->dictionary, array->dictionary, outputVector, + &dictOffseted, values[i] + array->dictionary->offset, i + dstOffset, + 1); // possibly inefficient? + } + } +} + +static void scanArrowArrayRunEndEncoded(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + + const ArrowArray* runEndArray = array->children[0]; + auto runEndBuffer = (const int32_t*)runEndArray->buffers[1]; + + // binary search run end corresponding to srcOffset + auto runEndIdx = runEndArray->offset; + { + auto L = runEndArray->offset, H = L + runEndArray->length; + while (H >= L) { + auto M = (H + L) >> 1; + if (runEndBuffer[M] < srcOffset) { + runEndIdx = M; + H = M - 1; + } else { + L = M + 1; + } + } + } + + for (int64_t i = 0; i < count; i++) { + while (i + srcOffset >= runEndBuffer[runEndIdx + 1]) { + runEndIdx++; + } + auto valuesOffseted = (*mask->getChild(1)) + runEndIdx; + ArrowConverter::fromArrowArray(schema->children[1], array->children[1], outputVector, + &valuesOffseted, runEndIdx, i + dstOffset, + 1); // there is optimization to be made here... + } +} + +void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count) { + const auto arrowType = schema->format; + if (array->dictionary != nullptr) { + switch (arrowType[0]) { + case 'c': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'C': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 's': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'S': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'i': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'I': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'l': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'L': + return scanArrowArrayDictionaryEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + default: + throw RuntimeException("Invalid Index Type: " + std::string(arrowType)); + } + } + switch (arrowType[0]) { + case 'n': + // NULL + outputVector.setAllNull(); + return; + case 'b': + // BOOL + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'c': + // INT8 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'C': + // UINT8 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 's': + // INT16 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'S': + // UINT16 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'i': + // INT32 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'I': + // UINT32 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'l': + // INT64 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'L': + // UINT64 + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'f': + // FLOAT + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'g': + // DOUBLE + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'z': + // BLOB + return scanArrowArrayBLOB(array, outputVector, mask, srcOffset, dstOffset, count); + case 'Z': + // LONG BLOB + return scanArrowArrayBLOB(array, outputVector, mask, srcOffset, dstOffset, count); + case 'u': + // STRING + return scanArrowArrayBLOB(array, outputVector, mask, srcOffset, dstOffset, count); + case 'U': + // LONG STRING + return scanArrowArrayBLOB(array, outputVector, mask, srcOffset, dstOffset, count); + case 'v': + switch (arrowType[1]) { + case 'z': + // BINARY VIEW + case 'u': + // STRING VIEW + return scanArrowArrayBLOBView(array, outputVector, mask, srcOffset, dstOffset, count); + default: + KU_UNREACHABLE; + } + case 'w': + // FIXED BLOB + return scanArrowArrayFixedBLOB( + array, outputVector, mask, std::stoi(arrowType + 2), srcOffset, dstOffset, count); + case 't': + switch (arrowType[1]) { + case 'd': + // DATE + if (arrowType[2] == 'D') { + // days since unix epoch + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + } else { + // ms since unix epoch + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + } + case 't': + // TODO pure time type + KU_UNREACHABLE; + case 's': + // TIMESTAMP + return scanArrowArrayFixedSizePrimitive( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'D': + // DURATION (KUZU INTERVAL) + switch (arrowType[2]) { + case 's': + // consider implement overflow checking here? + return scanArrowArrayDurationScaledUp( + array, outputVector, mask, 1000000, srcOffset, dstOffset, count); + case 'm': + return scanArrowArrayDurationScaledUp( + array, outputVector, mask, 1000, srcOffset, dstOffset, count); + case 'u': + return scanArrowArrayDurationScaledUp( + array, outputVector, mask, 1, srcOffset, dstOffset, count); + case 'n': + return scanArrowArrayDurationScaledDown( + array, outputVector, mask, 1000, srcOffset, dstOffset, count); + default: + KU_UNREACHABLE; + } + case 'i': + // INTERVAL + switch (arrowType[2]) { + case 'M': + return scanArrowArrayMonthInterval( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'D': + return scanArrowArrayDayTimeInterval( + array, outputVector, mask, srcOffset, dstOffset, count); + case 'n': + return scanArrowArrayMonthDayNanoInterval( + array, outputVector, mask, srcOffset, dstOffset, count); + default: + KU_UNREACHABLE; + } + default: + KU_UNREACHABLE; + } + case '+': + switch (arrowType[1]) { + case 'r': + // RUN END ENCODED + return scanArrowArrayRunEndEncoded( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'l': + // VAR_LIST + return scanArrowArrayVarList( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'L': + // LONG VAR_LIST + return scanArrowArrayVarList( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'w': + // FIXED_LIST + // TODO Manh: Array Scanning + KU_UNREACHABLE; + // return scanArrowArrayFixedList( + // schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 's': + // STRUCT + return scanArrowArrayStruct( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'm': + // MAP + // TODO maxwell; + // for some reason the columnar format specification doesn't mention maps at all + KU_UNREACHABLE; + case 'u': + if (arrowType[2] == 'd') { + // DENSE UNION + return scanArrowArrayDenseUnion( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + } else { + // SPARSE UNION + return scanArrowArraySparseUnion( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + } + case 'v': + switch (arrowType[2]) { + case 'l': + return scanArrowArrayVarListView( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + case 'L': + return scanArrowArrayVarListView( + schema, array, outputVector, mask, srcOffset, dstOffset, count); + // LONG VAR_LIST VIEW + default: + KU_UNREACHABLE; + } + default: + KU_UNREACHABLE; + } + default: + KU_UNREACHABLE; + } +} + +void ArrowConverter::fromArrowArray( + const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector) { + ArrowNullMaskTree mask(schema, array, array->offset, array->length); + return fromArrowArray(schema, array, outputVector, &mask, array->offset, 0, array->length); +} + +} // namespace common +} // namespace kuzu diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp new file mode 100644 index 00000000000..0544b253502 --- /dev/null +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -0,0 +1,214 @@ +#include + +#include "common/arrow/arrow.h" +#include "common/arrow/arrow_nullmask_tree.h" + +namespace kuzu { +namespace common { + +// scans are based on data specification found here +// https://arrow.apache.org/docs/format/Columnar.html + +// all offsets are measured by value, not physical size + +void ArrowNullMaskTree::copyToValueVector(ValueVector* vec, uint64_t dstOffset, uint64_t count) { + vec->setNullFromBits(mask->getData(), offset, dstOffset, count); +} + +ArrowNullMaskTree ArrowNullMaskTree::operator+(int64_t offset) { + // this operation is mostly a special case for dictionary/run-end encoding + ArrowNullMaskTree ret(*this); + ret.offset += offset; + return ret; +} + +bool ArrowNullMaskTree::copyFromBuffer(const void* buffer, uint64_t srcOffset, uint64_t count) { + if (buffer == nullptr) { + mask->setAllNonNull(); + return false; + } + mask->copyFromNullBits((const uint64_t*)buffer, srcOffset, 0, count, true); + return true; +} + +bool ArrowNullMaskTree::applyParentBitmap(const NullMask* parent, uint64_t count) { + if (parent == nullptr) { + return false; + } + const uint64_t* buffer = parent->data; + if (buffer != nullptr) { + for (int64_t i = 0; i < (count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); i++) { + mask->buffer[i] |= buffer[i]; + } + return true; + } + return false; +} + +template +void ArrowNullMaskTree::scanListPushDown( + const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count) { + const offsetsT* offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; + offsetsT auxiliaryLength = offsets[count] - offsets[0]; + NullMask pushDownMask((auxiliaryLength + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> + NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); + for (int64_t i = 0; i < count; i++) { + pushDownMask.setNullFromRange(offsets[i], offsets[i + 1] - offsets[i], isNull(i)); + } + children->push_back(ArrowNullMaskTree( + schema->children[0], array->children[0], offsets[0], auxiliaryLength, &pushDownMask)); +} + +void ArrowNullMaskTree::scanStructPushDown( + const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count) { + for (int64_t i = 0; i < array->n_children; i++) { + children->push_back(ArrowNullMaskTree( + schema->children[i], array->children[i], srcOffset, count, mask.get())); + } +} + +ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray* array, + uint64_t srcOffset, uint64_t count, const NullMask* parentBitmap) + : offset{0}, mask{std::make_shared( + (count + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> + NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2)}, + children(std::make_shared>()) { + if (schema->dictionary != nullptr) { + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + dictionary = std::make_shared(schema->dictionary, array->dictionary, + array->dictionary->offset, array->dictionary->length); + return; + } + const char* arrowType = schema->format; + std::vector structFields; + switch (arrowType[0]) { + case 'n': + mask->setAllNull(); + break; + case 'b': + case 'c': + case 'C': + case 's': + case 'S': + case 'i': + case 'I': + case 'l': + case 'L': + case 'f': + case 'g': + copyFromBuffer(array->buffers[0], srcOffset, count); + break; + case 'z': + case 'Z': + case 'u': + case 'U': + case 'v': + case 'w': + case 't': + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + break; + case '+': + switch (arrowType[1]) { + case 'l': + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + scanListPushDown(schema, array, srcOffset, count); + break; + case 'L': + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + scanListPushDown(schema, array, srcOffset, count); + break; + case 'w': + // TODO manh: array null resolution + KU_UNREACHABLE; + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + break; + case 's': + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + scanStructPushDown(schema, array, srcOffset, count); + break; + case 'm': + // TODO maxwell bind map types + KU_UNREACHABLE; + case 'u': { + const int8_t* types = (const int8_t*)array->buffers[0]; + if (schema->format[2] == 'd') { + const int32_t* offsets = (const int32_t*)array->buffers[1]; + std::vector countChildren(array->n_children), + lowestOffsets(array->n_children); + std::vector highestOffsets(array->n_children); + for (int64_t i = srcOffset; i < srcOffset + count; i++) { + int32_t curOffset = offsets[i]; + int32_t curType = types[i]; + if (countChildren[curType] == 0) { + lowestOffsets[curType] = curOffset; + } + highestOffsets[curType] = curOffset; + countChildren[curType]++; + } + for (int64_t i = 0; i < array->n_children; i++) { + children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], + lowestOffsets[i], highestOffsets[i] - lowestOffsets[i])); + } + for (int64_t i = srcOffset; i < srcOffset + count; i++) { + int32_t curOffset = offsets[i]; + int8_t curType = types[i]; + mask->setNull(i, children->operator[](curType).isNull(curOffset)); + } + } else { + for (int64_t i = 0; i < array->n_children; i++) { + children->push_back( + ArrowNullMaskTree(schema->children[i], array->children[i], srcOffset, count)); + } + for (int64_t i = srcOffset; i < srcOffset + count; i++) { + int8_t curType = types[i]; + mask->setNull(i, children->operator[](curType).isNull(i)); + // this isn't specified in the arrow specification, but is it valid to + // compute this using a bitwise OR? + } + } + if (parentBitmap != nullptr) { + for (int64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { + mask->buffer[i] |= parentBitmap->buffer[i]; + } + } + } break; + case 'v': + // list views *suck*, especially when trying to write code that can support + // parallelization for this, we generate child NullMaskTrees on the fly, rather than + // attempt any precomputation + if (array->buffers[0] == nullptr) { + mask->setAllNonNull(); + } else { + mask->copyFromNullBits((const uint64_t*)array->buffers[0], srcOffset, 0, count, true); + } + if (parentBitmap != nullptr) { + for (int64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { + mask->buffer[i] |= parentBitmap->buffer[i]; + } + } + break; + case 'r': + // it's better to resolve validity during the actual scanning for run-end encoded arrays + // so for this, let's just resolve child validities and move on + for (int64_t i = 0; i < array->n_children; i++) { + children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], + array->children[i]->offset, array->children[i]->length)); + } + break; + default: + KU_UNREACHABLE; + } + break; + default: + KU_UNREACHABLE; + } +} + +} // namespace common +} // namespace kuzu diff --git a/src/common/arrow/arrow_type.cpp b/src/common/arrow/arrow_type.cpp new file mode 100644 index 00000000000..dec7b047500 --- /dev/null +++ b/src/common/arrow/arrow_type.cpp @@ -0,0 +1,149 @@ +#include "common/arrow/arrow_converter.h" +#include "common/exception/not_implemented.h" +#include "common/exception/runtime.h" + +namespace kuzu { +namespace common { + +// pyarrow format string specifications can be found here +// https://arrow.apache.org/docs/format/CDataInterface.html#data-type-description-format-strings + +LogicalType ArrowConverter::fromArrowSchema(const ArrowSchema* schema) { + const char* arrowType = schema->format; + std::vector structFields; + // if we have a dictionary, then the logical type of the column is dependent upon the + // logical type of the dict + if (schema->dictionary != nullptr) { + return fromArrowSchema(schema->dictionary); + } + switch (arrowType[0]) { + case 'n': + return LogicalType(LogicalTypeID::ANY); + case 'b': + return LogicalType(LogicalTypeID::BOOL); + case 'c': + return LogicalType(LogicalTypeID::INT8); + case 'C': + return LogicalType(LogicalTypeID::UINT8); + case 's': + return LogicalType(LogicalTypeID::INT16); + case 'S': + return LogicalType(LogicalTypeID::UINT16); + case 'i': + return LogicalType(LogicalTypeID::INT32); + case 'I': + return LogicalType(LogicalTypeID::UINT32); + case 'l': + return LogicalType(LogicalTypeID::INT64); + case 'L': + return LogicalType(LogicalTypeID::UINT64); + case 'f': + return LogicalType(LogicalTypeID::FLOAT); + case 'g': + return LogicalType(LogicalTypeID::DOUBLE); + case 'z': + case 'Z': + return LogicalType(LogicalTypeID::BLOB); + case 'u': + case 'U': + return LogicalType(LogicalTypeID::STRING); + case 'v': + switch (arrowType[1]) { + case 'z': + return LogicalType(LogicalTypeID::BLOB); + case 'u': + return LogicalType(LogicalTypeID::STRING); + default: + KU_UNREACHABLE; + } + + case 'd': + throw NotImplementedException("custom bitwidth decimals are not supported"); + case 'w': + return LogicalType(LogicalTypeID::BLOB); // fixed width binary + case 't': + switch (arrowType[1]) { + case 'd': + if (arrowType[2] == 'D') { + return LogicalType(LogicalTypeID::DATE); + } else { + return LogicalType(LogicalTypeID::TIMESTAMP_MS); + } + case 't': + // TODO implement pure time type + throw NotImplementedException("Pure time types are not supported"); + case 's': + // TODO maxwell: timezone support + switch (arrowType[2]) { + case 's': + return LogicalType(LogicalTypeID::TIMESTAMP_SEC); + case 'm': + return LogicalType(LogicalTypeID::TIMESTAMP_MS); + case 'u': + return LogicalType(LogicalTypeID::TIMESTAMP); + case 'n': + return LogicalType(LogicalTypeID::TIMESTAMP_NS); + default: + KU_UNREACHABLE; + } + case 'D': + // duration + case 'i': + // interval + return LogicalType(LogicalTypeID::INTERVAL); + default: + KU_UNREACHABLE; + } + case '+': + KU_ASSERT(schema->n_children > 0); + switch (arrowType[1]) { + // complex types need a complementary ExtraTypeInfo object + case 'l': + case 'L': + return *LogicalType::VAR_LIST( + std::make_unique(fromArrowSchema(schema->children[0]))); + case 'w': + throw RuntimeException("Fixed list is currently WIP."); + // TODO Manh: Array Binding + // return *LogicalType::FIXED_LIST( + // std::make_unique(fromArrowSchema(schema->children[0])), + // std::stoi(arrowType+3)); + case 's': + for (int64_t i = 0; i < schema->n_children; i++) { + structFields.emplace_back(std::string(schema->children[i]->name), + std::make_unique(fromArrowSchema(schema->children[i]))); + } + return *LogicalType::STRUCT(std::move(structFields)); + case 'm': + // TODO maxwell bind map types + throw NotImplementedException("Scanning Arrow Map types is not supported"); + case 'u': + throw RuntimeException("Unions are currently WIP."); + for (int64_t i = 0; i < schema->n_children; i++) { + structFields.emplace_back(std::string(schema->children[i]->name), + std::make_unique(fromArrowSchema(schema->children[i]))); + } + return *LogicalType::UNION(std::move(structFields)); + case 'v': + switch (arrowType[2]) { + case 'l': + case 'L': + return *LogicalType::VAR_LIST( + std::make_unique(fromArrowSchema(schema->children[0]))); + default: + KU_UNREACHABLE; + } + case 'r': + // logical type corresponds to second child + return fromArrowSchema(schema->children[1]); + default: + KU_UNREACHABLE; + } + default: + KU_UNREACHABLE; + } + // refer to arrow_converted.cpp:65 +} + +} // namespace common +} // namespace kuzu diff --git a/src/common/null_mask.cpp b/src/common/null_mask.cpp index d611c6d3a6d..4a9d82ea3d8 100644 --- a/src/common/null_mask.cpp +++ b/src/common/null_mask.cpp @@ -88,8 +88,8 @@ void NullMask::resize(uint64_t capacity) { } bool NullMask::copyFromNullBits(const uint64_t* srcNullEntries, uint64_t srcOffset, - uint64_t dstOffset, uint64_t numBitsToCopy) { - if (copyNullMask(srcNullEntries, srcOffset, this->data, dstOffset, numBitsToCopy)) { + uint64_t dstOffset, uint64_t numBitsToCopy, bool invert) { + if (copyNullMask(srcNullEntries, srcOffset, this->data, dstOffset, numBitsToCopy, invert)) { this->mayContainNulls = true; return true; } diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index 8593a19f2af..6ec432c9c40 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -59,8 +59,8 @@ bool ValueVector::discardNull(ValueVector& vector) { } bool ValueVector::setNullFromBits(const uint64_t* srcNullEntries, uint64_t srcOffset, - uint64_t dstOffset, uint64_t numBitsToCopy) { - return nullMask->copyFromNullBits(srcNullEntries, srcOffset, dstOffset, numBitsToCopy); + uint64_t dstOffset, uint64_t numBitsToCopy, bool invert) { + return nullMask->copyFromNullBits(srcNullEntries, srcOffset, dstOffset, numBitsToCopy, invert); } template diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index f65178f529f..27f0cd6a08e 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -4,7 +4,6 @@ #include "catalog/catalog_entry/table_catalog_entry.h" #include "catalog_content.h" -#include "function/table_functions.h" namespace kuzu { namespace storage { diff --git a/src/include/common/arrow/arrow.h b/src/include/common/arrow/arrow.h index ba480455bb2..160cfd099bd 100644 --- a/src/include/common/arrow/arrow.h +++ b/src/include/common/arrow/arrow.h @@ -54,3 +54,21 @@ struct ArrowArray { #ifdef __cplusplus } #endif + +struct ArrowSchemaWrapper : public ArrowSchema { + ArrowSchemaWrapper() { release = nullptr; } + ~ArrowSchemaWrapper() { + if (release) { + release(this); + } + } +}; + +struct ArrowArrayWrapper : public ArrowArray { + ArrowArrayWrapper() { release = nullptr; } + ~ArrowArrayWrapper() { + if (release) { + release(this); + } + } +}; diff --git a/src/include/common/arrow/arrow_converter.h b/src/include/common/arrow/arrow_converter.h index 6ec50ee25d5..2d68d245b52 100644 --- a/src/include/common/arrow/arrow_converter.h +++ b/src/include/common/arrow/arrow_converter.h @@ -4,6 +4,7 @@ #include #include "common/arrow/arrow.h" +#include "common/arrow/arrow_nullmask_tree.h" #include "main/query_result.h" struct ArrowSchema; @@ -26,6 +27,13 @@ struct ArrowConverter { static void toArrowArray( main::QueryResult& queryResult, ArrowArray* out_array, std::int64_t chunkSize); + static common::LogicalType fromArrowSchema(const ArrowSchema* schema); + static void fromArrowArray(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, + uint64_t count); + static void fromArrowArray( + const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector); + private: static void initializeChild(ArrowSchema& child, const std::string& name = ""); static void setArrowFormatForStruct( diff --git a/src/include/common/arrow/arrow_nullmask_tree.h b/src/include/common/arrow/arrow_nullmask_tree.h new file mode 100644 index 00000000000..b3494b9ca80 --- /dev/null +++ b/src/include/common/arrow/arrow_nullmask_tree.h @@ -0,0 +1,39 @@ +#pragma once + +#include "common/arrow/arrow.h" +#include "common/null_mask.h" +#include "common/vector/value_vector.h" + +namespace kuzu { +namespace common { + +class ArrowNullMaskTree { +public: + ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, + uint64_t count, const NullMask* parentMask = nullptr); + + void copyToValueVector(ValueVector* vec, uint64_t dstOffset, uint64_t count); + bool isNull(int64_t idx) { return mask->isNull(idx + offset); } + ArrowNullMaskTree* getChild(int idx) { return &(*children)[idx]; } + ArrowNullMaskTree* getDictionary() { return dictionary.get(); } + ArrowNullMaskTree operator+(int64_t offset); + +private: + bool copyFromBuffer(const void* buffer, uint64_t srcOffset, uint64_t count); + bool applyParentBitmap(const NullMask* buffer, uint64_t count); + + template + void scanListPushDown( + const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count); + + void scanStructPushDown( + const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count); + + int64_t offset; + std::shared_ptr mask; + std::shared_ptr> children; + std::shared_ptr dictionary; +}; + +} // namespace common +} // namespace kuzu diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index ea69f3bebbb..c81d0181a55 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -122,6 +122,7 @@ const char* const IN_MEM_READ_RDF_LITERAL_FUNC_NAME = "IN_MEM_READ_RDF_LITERAL"; const char* const IN_MEM_READ_RDF_RESOURCE_TRIPLE_FUNC_NAME = "IN_MEM_READ_RDF_RESOURCE_TRIPLE"; const char* const IN_MEM_READ_RDF_LITERAL_TRIPLE_FUNC_NAME = "IN_MEM_READ_RDF_LITERAL_TRIPLE"; const char* const READ_PANDAS_FUNC_NAME = "READ_PANDAS"; +const char* const READ_PYARROW_FUNC_NAME = "READ_PYARROW"; const char* const READ_FTABLE_FUNC_NAME = "READ_FTABLE"; enum class ExpressionType : uint8_t { diff --git a/src/include/common/null_mask.h b/src/include/common/null_mask.h index 0f6c31e1826..9246c7cfddf 100644 --- a/src/include/common/null_mask.h +++ b/src/include/common/null_mask.h @@ -9,6 +9,8 @@ namespace kuzu { namespace common { +class ArrowNullMaskTree; + constexpr uint64_t NULL_BITMASKS_WITH_SINGLE_ONE[64] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, @@ -66,6 +68,7 @@ const uint64_t NULL_HIGH_MASKS[65] = {0x0, 0x8000000000000000, 0xc00000000000000 0xfffffffffffffffe, 0xffffffffffffffff}; class NullMask { + friend class ArrowNullMaskTree; public: static constexpr uint64_t NO_NULL_ENTRY = 0; @@ -133,7 +136,7 @@ class NullMask { uint64_t* dstNullEntries, uint64_t dstOffset, uint64_t numBitsToCopy, bool invert = false); bool copyFromNullBits(const uint64_t* srcNullEntries, uint64_t srcOffset, uint64_t dstOffset, - uint64_t numBitsToCopy); + uint64_t numBitsToCopy, bool invert = false); // Sets the given number of bits to null (if isNull is true) or non-null (if isNull is false), // starting at the offset diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index d780a2cd72e..a18e4eba843 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -51,13 +51,17 @@ class KUZU_API ValueVector { } bool setNullFromBits(const uint64_t* srcNullEntries, uint64_t srcOffset, uint64_t dstOffset, - uint64_t numBitsToCopy); + uint64_t numBitsToCopy, bool invert = false); uint32_t getNumBytesPerValue() const { return numBytesPerValue; } // TODO(Guodong): Rename this to getValueRef template - inline T& getValue(uint32_t pos) const { + const T& getValue(uint32_t pos) const { + return ((T*)valueBuffer.get())[pos]; + } + template + T& getValue(uint32_t pos) { return ((T*)valueBuffer.get())[pos]; } template diff --git a/src/include/function/table/scan_replacement.h b/src/include/function/table/scan_replacement.h index 63bb4e3c5ca..075a7731822 100644 --- a/src/include/function/table/scan_replacement.h +++ b/src/include/function/table/scan_replacement.h @@ -14,7 +14,7 @@ struct ScanReplacementData { using scan_replace_func_t = std::function(const std::string&)>; struct ScanReplacement { - ScanReplacement(scan_replace_func_t replaceFunc) : replaceFunc{replaceFunc} {} + explicit ScanReplacement(scan_replace_func_t replaceFunc) : replaceFunc{replaceFunc} {} scan_replace_func_t replaceFunc; }; diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index fdbaf812fb4..f21fc699ce2 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -11,7 +10,6 @@ #include "common/timer.h" #include "common/types/value/value.h" #include "function/function.h" -#include "function/scalar_function.h" #include "function/table/scan_replacement.h" #include "main/kuzu_fwd.h" #include "parser/statement.h" diff --git a/tools/python_api/CMakeLists.txt b/tools/python_api/CMakeLists.txt index 1319a8c43cb..aa0fb52fcc3 100644 --- a/tools/python_api/CMakeLists.txt +++ b/tools/python_api/CMakeLists.txt @@ -17,6 +17,8 @@ pybind11_add_module(_kuzu src_cpp/py_query_result.cpp src_cpp/py_query_result_converter.cpp src_cpp/py_conversion.cpp + src_cpp/pyarrow/pyarrow_bind.cpp + src_cpp/pyarrow/pyarrow_scan.cpp src_cpp/pandas/pandas_bind.cpp src_cpp/pandas/pandas_scan.cpp src_cpp/pandas/pandas_analyzer.cpp diff --git a/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h b/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h index 6bc374df4c4..28146a0cba6 100644 --- a/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h +++ b/tools/python_api/src_cpp/include/cached_import/py_cached_modules.h @@ -66,9 +66,10 @@ class PandasCachedItem : public PythonCachedItem { }; public: - PandasCachedItem() : PythonCachedItem("pandas"), core(this), DataFrame(this), NA("NA", this), - NaT("NaT", this) {} + PandasCachedItem() : PythonCachedItem("pandas"), ArrowDtype("ArrowDtype", this), core(this), DataFrame(this), + NA("NA", this), NaT("NaT", this) {} + PythonCachedItem ArrowDtype; CoreCachedItem core; DataFrameCachedItem DataFrame; PythonCachedItem NA; @@ -96,9 +97,10 @@ class PyarrowCachedItem : public PythonCachedItem { class TableCachedItem : public PythonCachedItem { public: explicit TableCachedItem(PythonCachedItem* parent): PythonCachedItem("Table", parent), - from_batches("from_batches", this) {} + from_batches("from_batches", this), from_pandas("from_pandas", this) {} PythonCachedItem from_batches; + PythonCachedItem from_pandas; }; class LibCachedItem : public PythonCachedItem { diff --git a/tools/python_api/src_cpp/include/pyarrow/pyarrow_bind.h b/tools/python_api/src_cpp/include/pyarrow/pyarrow_bind.h new file mode 100644 index 00000000000..98f64e240a0 --- /dev/null +++ b/tools/python_api/src_cpp/include/pyarrow/pyarrow_bind.h @@ -0,0 +1,18 @@ +#pragma once + +#include "common/arrow/arrow_converter.h" +#include "py_object_container.h" +#include "pybind_include.h" + +namespace kuzu { + +namespace main { +class ClientContext; +} + +struct Pyarrow { + static std::shared_ptr bind(py::handle tableToBind, + std::vector& returnTypes, std::vector& names); +}; + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h new file mode 100644 index 00000000000..237c8c38259 --- /dev/null +++ b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h @@ -0,0 +1,61 @@ +#pragma once + +#include "common/arrow/arrow.h" +#include "function/scalar_function.h" +#include "function/table/bind_data.h" +#include "function/table/scan_functions.h" +#include "function/table_functions.h" +#include "pyarrow_bind.h" +#include "pybind_include.h" + +namespace kuzu { + +struct PyArrowTableScanLocalState final : public function::TableFuncLocalState { + ArrowArrayWrapper* arrowArray; + + explicit PyArrowTableScanLocalState(ArrowArrayWrapper* arrowArray) : arrowArray{arrowArray} {} +}; + +struct PyArrowTableScanSharedState final : public function::BaseScanSharedState { + std::vector> chunks; + uint64_t currentChunk; + std::mutex lock; + + PyArrowTableScanSharedState( + uint64_t numRows, std::vector>&& chunks) + : BaseScanSharedState{numRows}, chunks{std::move(chunks)}, currentChunk{0} {} + + ArrowArrayWrapper* getNextChunk(); +}; + +struct PyArrowTableScanFunctionData final : public function::TableFuncBindData { + std::shared_ptr schema; + std::unique_ptr table; + uint64_t numRows; + + PyArrowTableScanFunctionData(std::vector columnTypes, + std::shared_ptr schema, std::vector columnNames, + py::object table, uint64_t numRows) + : TableFuncBindData{std::move(columnTypes), std::move(columnNames)}, + schema{std::move(schema)}, table{std::make_unique(table)}, numRows{numRows} {} + + ~PyArrowTableScanFunctionData() override { + py::gil_scoped_acquire acquire; + table.reset(); + } + + std::unique_ptr copy() const override { + py::gil_scoped_acquire acquire; + // the schema is considered immutable so copying it by copying the shared_ptr is fine. + return std::make_unique( + columnTypes, schema, columnNames, *table, numRows); + } +}; + +struct PyArrowTableScanFunction { + static function::function_set getFunctionSet(); + + static function::TableFunction getFunction(); +}; + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index 67607187a85..f432ab2093a 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -1,5 +1,6 @@ #include "pandas/pandas_scan.h" +#include "pyarrow/pyarrow_scan.h" #include "function/table/bind_input.h" #include "cached_import/py_cached_import.h" #include "numpy/numpy_scan.h" @@ -13,31 +14,7 @@ using namespace kuzu::catalog; namespace kuzu { -static offset_t tableFunc(TableFuncInput&, TableFuncOutput&); -static std::unique_ptr bindFunc(main::ClientContext*, - TableFuncBindInput*); -static std::unique_ptr initSharedState( - TableFunctionInitInput&); -static std::unique_ptr initLocalState( - TableFunctionInitInput&, TableFuncSharedState*, - storage::MemoryManager*); -static bool sharedStateNext(const TableFuncBindData*, - PandasScanLocalState*, TableFuncSharedState*); -static void pandasBackendScanSwitch(PandasColumnBindData*, uint64_t, - uint64_t, ValueVector*); - -static TableFunction getFunction() { - return TableFunction(READ_PANDAS_FUNC_NAME, tableFunc, bindFunc, initSharedState, - initLocalState, std::vector{LogicalTypeID::POINTER}); -} - -function_set PandasScanFunction::getFunctionSet() { - function_set functionSet; - functionSet.push_back(getFunction().copy()); - return functionSet; -} - -std::unique_ptr bindFunc( +std::unique_ptr bindFunc( main::ClientContext* /*context*/, TableFuncBindInput* input) { py::gil_scoped_acquire acquire; py::handle df(reinterpret_cast(input->inputs[0].getValue())); @@ -71,16 +48,16 @@ bool sharedStateNext(const TableFuncBindData* /*bindData*/, return true; } -std::unique_ptr initLocalState( - TableFunctionInitInput& input, TableFuncSharedState* sharedState, - storage::MemoryManager*) { +std::unique_ptr initLocalState( + function::TableFunctionInitInput& input, function::TableFuncSharedState* sharedState, + storage::MemoryManager* /*mm*/) { auto localState = std::make_unique(0 /* start */, 0 /* end */); sharedStateNext(input.bindData, localState.get(), sharedState); return localState; } -std::unique_ptr initSharedState( - TableFunctionInitInput& input) { +std::unique_ptr initSharedState( + function::TableFunctionInitInput& input) { // LCOV_EXCL_START if (PyGILState_Check()) { throw RuntimeException("PandasScan called but GIL was already held!"); @@ -132,6 +109,32 @@ std::vector> PandasScanFunctionData::copyC return result; } +static TableFunction getFunction() { + return TableFunction(READ_PANDAS_FUNC_NAME, tableFunc, bindFunc, initSharedState, + initLocalState, std::vector{LogicalTypeID::POINTER}); +} + +function_set PandasScanFunction::getFunctionSet() { + function_set functionSet; + functionSet.push_back(getFunction().copy()); + return functionSet; +} + +static bool isPyArrowBacked(const py::handle &df) { + py::list dtypes = df.attr("dtypes"); + if (dtypes.empty()) { + return false; + } + + auto arrow_dtype = importCache->pandas.ArrowDtype(); + for (auto &dtype : dtypes) { + if (py::isinstance(dtype, arrow_dtype)) { + return true; + } + } + return false; +} + static std::unique_ptr tryReplacePD(py::dict& dict, py::str& objectName) { if (!dict.contains(objectName)) { return nullptr; @@ -139,7 +142,11 @@ static std::unique_ptr tryReplacePD(py::dict& dict, py::str auto entry = dict[objectName]; if (PyConnection::isPandasDataframe(entry)) { auto scanReplacementData = std::make_unique(); - scanReplacementData->func = getFunction(); + if (isPyArrowBacked(entry)) { + scanReplacementData->func = PyArrowTableScanFunction::getFunction(); + } else { + scanReplacementData->func = getFunction(); + } auto bindInput = TableFuncBindInput(); bindInput.inputs.push_back(Value::createValue(reinterpret_cast(entry.ptr()))); scanReplacementData->bindInput = std::move(bindInput); diff --git a/tools/python_api/src_cpp/py_database.cpp b/tools/python_api/src_cpp/py_database.cpp index b2ed26c506f..d7ecc9acedb 100644 --- a/tools/python_api/src_cpp/py_database.cpp +++ b/tools/python_api/src_cpp/py_database.cpp @@ -2,6 +2,7 @@ #include "include/cached_import/py_cached_import.h" #include "pandas/pandas_scan.h" +#include "pyarrow/pyarrow_scan.h" #include diff --git a/tools/python_api/src_cpp/pyarrow/pyarrow_bind.cpp b/tools/python_api/src_cpp/pyarrow/pyarrow_bind.cpp new file mode 100644 index 00000000000..9bcaf40e06d --- /dev/null +++ b/tools/python_api/src_cpp/pyarrow/pyarrow_bind.cpp @@ -0,0 +1,26 @@ +#include "pyarrow/pyarrow_bind.h" + +#include "cached_import/py_cached_import.h" +#include "common/arrow/arrow.h" +#include "common/arrow/arrow_converter.h" + +namespace kuzu { + +std::shared_ptr Pyarrow::bind(py::handle tableToBind, + std::vector& returnTypes, std::vector& names) { + + std::shared_ptr schema = std::make_shared(); + auto pyschema = tableToBind.attr("schema"); + auto exportSchemaToC = pyschema.attr("_export_to_c"); + exportSchemaToC(reinterpret_cast(schema.get())); + + for (int64_t i = 0; i < schema->n_children; i++) { + ArrowSchema* child = schema->children[i]; + names.emplace_back(child->name); + returnTypes.push_back(common::ArrowConverter::fromArrowSchema(child)); + } + + return schema; +} + +} // namespace kuzu diff --git a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp new file mode 100644 index 00000000000..e9739ea65aa --- /dev/null +++ b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp @@ -0,0 +1,102 @@ +#include "pyarrow/pyarrow_scan.h" + +#include "cached_import/py_cached_import.h" +#include "common/arrow/arrow_converter.h" +#include "function/table/bind_input.h" +#include "py_connection.h" +#include "pybind11/pytypes.h" + +using namespace kuzu::function; +using namespace kuzu::common; +using namespace kuzu::catalog; + +namespace kuzu { + +static std::unique_ptr bindFunc( + main::ClientContext* /*context*/, TableFuncBindInput* input) { + + py::gil_scoped_acquire acquire; + py::object table(py::reinterpret_steal( + reinterpret_cast(input->inputs[0].getValue()))); + if (py::isinstance(table, importCache->pandas.DataFrame())) { + table = importCache->pyarrow.lib.Table.from_pandas()(table); + } + std::vector returnTypes; + std::vector names; + if (py::isinstance(table)) { + KU_UNREACHABLE; + } + auto numRows = py::len(table); + auto schema = Pyarrow::bind(table, returnTypes, names); + return std::make_unique( + std::move(returnTypes), std::move(schema), std::move(names), table, numRows); +} + +ArrowArrayWrapper* PyArrowTableScanSharedState::getNextChunk() { + std::lock_guard lck{lock}; + if (currentChunk == chunks.size()) { + return nullptr; + } + return chunks[currentChunk++].get(); +} + +static std::unique_ptr initSharedState( + function::TableFunctionInitInput& input) { + + py::gil_scoped_acquire acquire; + PyArrowTableScanFunctionData* bindData = + dynamic_cast(input.bindData); + py::list batches = bindData->table->attr("to_batches")(DEFAULT_VECTOR_CAPACITY); + std::vector> arrowArrayBatches; + + for (auto& i : batches) { + arrowArrayBatches.push_back(std::make_shared()); + i.attr("_export_to_c")(reinterpret_cast(arrowArrayBatches.back().get())); + } + + return std::make_unique( + bindData->numRows, std::move(arrowArrayBatches)); +} + +static std::unique_ptr initLocalState( + function::TableFunctionInitInput& /*input*/, function::TableFuncSharedState* sharedState, + storage::MemoryManager* /*mm*/) { + + PyArrowTableScanSharedState* pyArrowShared = + dynamic_cast(sharedState); + return std::make_unique(pyArrowShared->getNextChunk()); +} + +static common::offset_t tableFunc( + function::TableFuncInput& input, function::TableFuncOutput& output) { + + auto arrowScanData = dynamic_cast(input.bindData); + auto arrowLocalState = dynamic_cast(input.localState); + auto arrowSharedState = dynamic_cast(input.sharedState); + if (arrowLocalState->arrowArray == nullptr) { + return 0; + } + for (auto i = 0u; i < arrowScanData->columnTypes.size(); i++) { + common::ArrowConverter::fromArrowArray(arrowScanData->schema->children[i], + arrowLocalState->arrowArray->children[i], *output.dataChunk.getValueVector(i)); + } + auto len = arrowLocalState->arrowArray->length; + arrowLocalState->arrowArray = arrowSharedState->getNextChunk(); + return len; +} + +function::function_set PyArrowTableScanFunction::getFunctionSet() { + + function_set functionSet; + functionSet.push_back( + std::make_unique(READ_PYARROW_FUNC_NAME, tableFunc, bindFunc, + initSharedState, initLocalState, std::vector{LogicalTypeID::POINTER})); + return functionSet; +} + +TableFunction PyArrowTableScanFunction::getFunction() { + return TableFunction(READ_PYARROW_FUNC_NAME, tableFunc, bindFunc, initSharedState, + initLocalState, std::vector{LogicalTypeID::POINTER}); +} + +} // namespace kuzu diff --git a/tools/python_api/test/test_df_pyarrow.py b/tools/python_api/test/test_df_pyarrow.py new file mode 100644 index 00000000000..b88db4616b1 --- /dev/null +++ b/tools/python_api/test/test_df_pyarrow.py @@ -0,0 +1,234 @@ +import pandas as pd, pyarrow as pa +import pytz +import struct, random, math +from datetime import datetime, timedelta +from pandas.arrays import ArrowExtensionArray as arrowtopd +import pytest +import kuzu +from type_aliases import ConnDB +from pathlib import Path + +def generate_primitive(dtype): + if (random.randrange(0, 5) == 0): + return None + if (dtype.startswith("bool")): + return random.randrange(0, 1) == 1 + if (dtype.startswith("int32")): + return random.randrange(-2147483648, 2147483648) + if (dtype.startswith("int64")): + return random.randrange(-9223372036854775808, 9223372036854775808) + if (dtype.startswith("uint64")): + return random.randrange(0, 18446744073709551616) + if (dtype.startswith("float32")): + random_bits = random.getrandbits(32) + random_bytes = struct.pack(' None: + db = kuzu.Database(tmp_path) + conn = kuzu.Connection(db) + establish_connection = (conn, db) + # stress tests primitive reading + sfs = [100, 2048, 4000, 9000, 16000] + threads = [1, 2, 5, 10] + for sf in sfs: + for thread in threads: + pyarrow_test_helper(establish_connection, sf, thread) + +def test_pyarrow_time(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + col1 = pa.array([1000123, 2000123, 3000123], type=pa.duration('s')) + col2 = pa.array([1000123000000, 2000123000000, 3000123000000], type=pa.duration('us')) + col3 = pa.array([1000123000000000, 2000123000000000, 3000123000000000], type=pa.duration('ns')) + col4 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.timestamp('s')) + col5 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.timestamp('s')) + col6 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.timestamp('ms')) + col7 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.timestamp('us')) + col8 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.timestamp('ns')) + col9 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.date32()) + col10 = pa.array([datetime(2012, 1, 20), datetime(2000, 12, 2), datetime(1987, 5, 27)], + type=pa.date64()) + # not implemented by pandas + # col11 = pa.array([(1, 2, 3), (4, 5, -6), (100, 200, 1000000000)], type=pa.month_day_nano_interval()) + # for some reason, pyarrow doesnt support the direct creation of pure month or pure datetime + # intervals, so that will remain untested for now + df = pd.DataFrame({ + 'col1': arrowtopd(col1), + 'col2': arrowtopd(col2), + 'col3': arrowtopd(col3), + 'col4': arrowtopd(col4), + 'col5': arrowtopd(col5), + 'col6': arrowtopd(col6), + 'col7': arrowtopd(col7), + 'col8': arrowtopd(col8), + 'col9': arrowtopd(col9), + 'col10': arrowtopd(col10) + #'col11': arrowtopd(col11) + }) + result = conn.execute('CALL READ_PANDAS(df) RETURN *').get_as_df() + for colname in ['col1', 'col2', 'col3']: + for expected, actual in zip(df[colname], result[colname]): + tmp1 = expected if type(expected) is timedelta else expected.to_pytimedelta() + tmp2 = actual if type(actual) is timedelta else actual.to_pytimedelta() + assert tmp1 == tmp2 + for colname in ['col4', 'col5', 'col6', 'col7', 'col8']: + for expected, actual in zip(df[colname], result[colname]): + tmp1 = expected if type(expected) is datetime else expected.to_pydatetime() + tmp2 = actual if type(actual) is datetime else actual.to_pydatetime() + assert tmp1 == tmp2 + for colname in ['col9', 'col10']: + for expected, actual in zip(df[colname], result[colname]): + assert datetime.combine(expected, datetime.min.time()) == actual.to_pydatetime() + +def generate_blob(length): + if (random.randint(0, 5) == 0): + return None + return random.getrandbits(8*length).to_bytes(length, 'little') + +def test_pyarrow_blob(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + # blobs, blob views, and fixed size blobs + random.seed(100) + index = pa.array(range(16000), type=pa.int64()) + col1 = pa.array([generate_blob(random.randint(10, 100)) for i in range(16000)], + type=pa.binary()) + col2 = pa.array([generate_blob(random.randint(10, 100)) for i in range(16000)], + type=pa.large_binary()) + col3 = pa.array([generate_blob(32) for i in range(16000)], + type=pa.binary(32)) + col4 = col1.view(pa.binary()) + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1' : arrowtopd(col1), + 'col2' : arrowtopd(col2), + 'col3' : arrowtopd(col3), + 'col4' : arrowtopd(col4) + }).sort_values(by=['index']) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index').get_as_df() + for colname in ['col1', 'col2', 'col3', 'col4']: + for expected, actual in zip(df[colname], result[colname]): + if is_null(expected) or is_null(actual): + assert is_null(expected) + assert is_null(actual) + else: + if bytes(expected) != bytes(actual): + print(expected) + print(actual) + print(df[colname]) + print(result[colname]) + print(colname) + assert bytes(expected) == bytes(actual) + +def generate_string(length): + if (random.randint(0, 5) == 0): + return None + return ''.join([random.choice('1234567890-=qwertyuiop[]\\asdfghjkl;\'zxcvbnm,./') + for i in range(length)]) + +def test_pyarrow_string(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + # blobs, blob views, and fixed size blobs + random.seed(100) + index = pa.array(range(16000), type=pa.int64()) + col1 = pa.array([generate_string(random.randint(10, 100)) for i in range(16000)], + type=pa.string()) + col2 = pa.array([generate_string(random.randint(10, 100)) for i in range(16000)], + type=pa.large_string()) + col3 = col1.view(pa.string()) + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1' : arrowtopd(col1), + 'col2' : arrowtopd(col2), + 'col3' : arrowtopd(col3), + }).sort_values(by=['index']) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index').get_as_df() + for colname in ['col1', 'col2', 'col3']: + for expected, actual in zip(df[colname], result[colname]): + if is_null(expected) or is_null(actual): + assert is_null(expected) + assert is_null(actual) + else: + assert str(expected) == str(actual) + +def test_pyarrow_dict(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + random.seed(100) + index = pa.array(range(2000), type=pa.int64()) + col1 = pa.array([random.randint(0, 1) for i in range(2000)], type=pa.int32()).dictionary_encode() + col2 = pa.array([random.randint(-20, 20) / 10 for i in range(2000)], type=pa.float64()).dictionary_encode() + #it seems arrow hasn't implemented dictionary encoding for nested types + #col3 = pa.array([ + # [generate_string(random.randint(10, 100)) for x in range(random.randint(10, 100))] + # for i in range(3000) + #], type=pa.list_(pa.string())).dictionary_encode() + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1' : arrowtopd(col1), + 'col2' : arrowtopd(col2) + }) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index').get_as_df() + for colname in ['col1', 'col2']: + for expected, actual in zip(df[colname], result[colname]): + assert expected == actual From f0507b072a003a4ffef5de72ac056e9546dc52aa Mon Sep 17 00:00:00 2001 From: mxwli Date: Thu, 21 Mar 2024 16:46:00 -0400 Subject: [PATCH 070/136] CLANG-TIDY --- src/common/arrow/arrow_null_mask_tree.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp index 0544b253502..da90fb19e20 100644 --- a/src/common/arrow/arrow_null_mask_tree.cpp +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -162,8 +162,8 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray } } else { for (int64_t i = 0; i < array->n_children; i++) { - children->push_back( - ArrowNullMaskTree(schema->children[i], array->children[i], srcOffset, count)); + children->push_back(ArrowNullMaskTree( + schema->children[i], array->children[i], srcOffset, count)); } for (int64_t i = srcOffset; i < srcOffset + count; i++) { int8_t curType = types[i]; @@ -185,7 +185,8 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray if (array->buffers[0] == nullptr) { mask->setAllNonNull(); } else { - mask->copyFromNullBits((const uint64_t*)array->buffers[0], srcOffset, 0, count, true); + mask->copyFromNullBits( + (const uint64_t*)array->buffers[0], srcOffset, 0, count, true); } if (parentBitmap != nullptr) { for (int64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { From b97aab5364da405d54d293e1c5ef549827d3d768 Mon Sep 17 00:00:00 2001 From: mxwli Date: Thu, 21 Mar 2024 16:55:16 -0400 Subject: [PATCH 071/136] clang fix ... thanks clang --- src/common/arrow/arrow_array_scan.cpp | 34 +++++++++++------------ src/common/arrow/arrow_null_mask_tree.cpp | 22 +++++++-------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/common/arrow/arrow_array_scan.cpp b/src/common/arrow/arrow_array_scan.cpp index 556cf2a24c2..693c38ef28e 100644 --- a/src/common/arrow/arrow_array_scan.cpp +++ b/src/common/arrow/arrow_array_scan.cpp @@ -25,7 +25,7 @@ void scanArrowArrayFixedSizePrimitive(const ArrowArray* array, ValueVector ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { auto arrayBuffer = (const uint8_t*)array->buffers[1]; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { outputVector.setValue( i + dstOffset, NullMask::isNull((const uint64_t*)arrayBuffer, i + srcOffset)); } @@ -36,7 +36,7 @@ static void scanArrowArrayDurationScaledUp(const ArrowArray* array, ValueVector& uint64_t count) { auto arrayBuffer = ((const int64_t*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curValue = arrayBuffer[i]; outputVector.setValue( @@ -50,7 +50,7 @@ static void scanArrowArrayDurationScaledDown(const ArrowArray* array, ValueVecto uint64_t count) { auto arrayBuffer = ((const int64_t*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curValue = arrayBuffer[i]; outputVector.setValue( @@ -63,7 +63,7 @@ static void scanArrowArrayMonthInterval(const ArrowArray* array, ValueVector& ou ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { auto arrayBuffer = ((const int32_t*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curValue = arrayBuffer[i]; outputVector.setValue(i + dstOffset, interval_t(curValue, 0, 0)); @@ -75,7 +75,7 @@ static void scanArrowArrayDayTimeInterval(const ArrowArray* array, ValueVector& ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { auto arrayBuffer = ((const int64_t*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { int64_t curValue = arrayBuffer[i]; int32_t day = curValue; @@ -91,7 +91,7 @@ static void scanArrowArrayMonthDayNanoInterval(const ArrowArray* array, ValueVec auto arrayBuffer = (const int64_t*)((const uint8_t*)array->buffers[1] + srcOffset * 16); // 16 bits per value mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { int64_t curValue = arrayBuffer[2 * i]; int32_t month = curValue; @@ -108,7 +108,7 @@ static void scanArrowArrayBLOB(const ArrowArray* array, ValueVector& outputVecto auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; auto arrayBuffer = (const uint8_t*)array->buffers[2]; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curOffset = offsets[i], nextOffset = offsets[i + 1]; const uint8_t* data = arrayBuffer + curOffset; @@ -124,7 +124,7 @@ static void scanArrowArrayBLOBView(const ArrowArray* array, ValueVector& outputV auto valueBuffs = (const uint8_t**)(array->buffers + 2); // BLOB value buffers begin from index 2 onwards mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curView = (const int32_t*)(arrayBuffer + (i + srcOffset) * 16); // view structures are 16 bytes long @@ -147,7 +147,7 @@ static void scanArrowArrayFixedBLOB(const ArrowArray* array, ValueVector& output uint64_t count) { auto arrayBuffer = ((const uint8_t*)array->buffers[1]) + srcOffset * BLOBsize; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { BlobVector::addBlob(&outputVector, i + dstOffset, arrayBuffer + i * BLOBsize, BLOBsize); } @@ -161,7 +161,7 @@ static void scanArrowArrayVarList(const ArrowSchema* schema, const ArrowArray* a auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); ValueVector* auxiliaryBuffer = ListVector::getDataVector(&outputVector); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { auto curOffset = offsets[i], nextOffset = offsets[i + 1]; if (!mask->isNull(i)) { auto newEntry = ListVector::addList(&outputVector, nextOffset - curOffset); @@ -180,7 +180,7 @@ static void scanArrowArrayVarListView(const ArrowSchema* schema, const ArrowArra auto sizes = ((const offsetsT*)array->buffers[2]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); ValueVector* auxiliaryBuffer = ListVector::getDataVector(&outputVector); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curOffset = offsets[i], size = sizes[i]; auto newEntry = ListVector::addList(&outputVector, size); @@ -209,7 +209,7 @@ static void scanArrowArrayStruct(const ArrowSchema* schema, const ArrowArray* ar ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { outputVector.setValue(i + dstOffset, i + dstOffset); // struct_entry_t doesn't work for some reason @@ -228,7 +228,7 @@ static void scanArrowArrayDenseUnion(const ArrowSchema* schema, const ArrowArray auto types = ((const int8_t*)array->buffers[0]) + srcOffset; auto offsets = ((const int32_t*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curType = types[i]; auto curOffset = offsets[i]; @@ -247,7 +247,7 @@ static void scanArrowArraySparseUnion(const ArrowSchema* schema, const ArrowArra uint64_t count) { auto types = ((const int8_t*)array->buffers[0]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curType = types[i]; UnionVector::setTagField(&outputVector, curType); @@ -271,7 +271,7 @@ static void scanArrowArrayDictionaryEncoded(const ArrowSchema* schema, const Arr auto values = ((const offsetsT*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto dictOffseted = (*mask->getDictionary()) + values[i]; ArrowConverter::fromArrowArray(schema->dictionary, array->dictionary, outputVector, @@ -286,7 +286,7 @@ static void scanArrowArrayRunEndEncoded(const ArrowSchema* schema, const ArrowAr uint64_t count) { const ArrowArray* runEndArray = array->children[0]; - auto runEndBuffer = (const int32_t*)runEndArray->buffers[1]; + auto runEndBuffer = (const uint32_t*)runEndArray->buffers[1]; // binary search run end corresponding to srcOffset auto runEndIdx = runEndArray->offset; @@ -303,7 +303,7 @@ static void scanArrowArrayRunEndEncoded(const ArrowSchema* schema, const ArrowAr } } - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { while (i + srcOffset >= runEndBuffer[runEndIdx + 1]) { runEndIdx++; } diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp index da90fb19e20..0a9573a37c0 100644 --- a/src/common/arrow/arrow_null_mask_tree.cpp +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -37,7 +37,7 @@ bool ArrowNullMaskTree::applyParentBitmap(const NullMask* parent, uint64_t count } const uint64_t* buffer = parent->data; if (buffer != nullptr) { - for (int64_t i = 0; i < (count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); i++) { + for (uint64_t i = 0; i < (count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); i++) { mask->buffer[i] |= buffer[i]; } return true; @@ -52,7 +52,7 @@ void ArrowNullMaskTree::scanListPushDown( offsetsT auxiliaryLength = offsets[count] - offsets[0]; NullMask pushDownMask((auxiliaryLength + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); - for (int64_t i = 0; i < count; i++) { + for (uint64_t i = 0; i < count; i++) { pushDownMask.setNullFromRange(offsets[i], offsets[i + 1] - offsets[i], isNull(i)); } children->push_back(ArrowNullMaskTree( @@ -61,7 +61,7 @@ void ArrowNullMaskTree::scanListPushDown( void ArrowNullMaskTree::scanStructPushDown( const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count) { - for (int64_t i = 0; i < array->n_children; i++) { + for (uint64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree( schema->children[i], array->children[i], srcOffset, count, mask.get())); } @@ -142,7 +142,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray std::vector countChildren(array->n_children), lowestOffsets(array->n_children); std::vector highestOffsets(array->n_children); - for (int64_t i = srcOffset; i < srcOffset + count; i++) { + for (auto i = srcOffset; i < srcOffset + count; i++) { int32_t curOffset = offsets[i]; int32_t curType = types[i]; if (countChildren[curType] == 0) { @@ -151,21 +151,21 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray highestOffsets[curType] = curOffset; countChildren[curType]++; } - for (int64_t i = 0; i < array->n_children; i++) { + for (uint64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], lowestOffsets[i], highestOffsets[i] - lowestOffsets[i])); } - for (int64_t i = srcOffset; i < srcOffset + count; i++) { + for (auto i = srcOffset; i < srcOffset + count; i++) { int32_t curOffset = offsets[i]; int8_t curType = types[i]; mask->setNull(i, children->operator[](curType).isNull(curOffset)); } } else { - for (int64_t i = 0; i < array->n_children; i++) { + for (uint64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree( schema->children[i], array->children[i], srcOffset, count)); } - for (int64_t i = srcOffset; i < srcOffset + count; i++) { + for (auto i = srcOffset; i < srcOffset + count; i++) { int8_t curType = types[i]; mask->setNull(i, children->operator[](curType).isNull(i)); // this isn't specified in the arrow specification, but is it valid to @@ -173,7 +173,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray } } if (parentBitmap != nullptr) { - for (int64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { + for (uint64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { mask->buffer[i] |= parentBitmap->buffer[i]; } } @@ -189,7 +189,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray (const uint64_t*)array->buffers[0], srcOffset, 0, count, true); } if (parentBitmap != nullptr) { - for (int64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { + for (uint64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { mask->buffer[i] |= parentBitmap->buffer[i]; } } @@ -197,7 +197,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray case 'r': // it's better to resolve validity during the actual scanning for run-end encoded arrays // so for this, let's just resolve child validities and move on - for (int64_t i = 0; i < array->n_children; i++) { + for (uint64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], array->children[i]->offset, array->children[i]->length)); } From cb4d757dc7ba5f04d012ec833b35dec5957f6d72 Mon Sep 17 00:00:00 2001 From: mxwli Date: Thu, 21 Mar 2024 16:59:17 -0400 Subject: [PATCH 072/136] clang --- src/common/arrow/arrow_null_mask_tree.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp index 0a9573a37c0..c8b3033602a 100644 --- a/src/common/arrow/arrow_null_mask_tree.cpp +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -61,7 +61,7 @@ void ArrowNullMaskTree::scanListPushDown( void ArrowNullMaskTree::scanStructPushDown( const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count) { - for (uint64_t i = 0; i < array->n_children; i++) { + for (int64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree( schema->children[i], array->children[i], srcOffset, count, mask.get())); } @@ -151,7 +151,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray highestOffsets[curType] = curOffset; countChildren[curType]++; } - for (uint64_t i = 0; i < array->n_children; i++) { + for (int64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], lowestOffsets[i], highestOffsets[i] - lowestOffsets[i])); } @@ -161,7 +161,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray mask->setNull(i, children->operator[](curType).isNull(curOffset)); } } else { - for (uint64_t i = 0; i < array->n_children; i++) { + for (int64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree( schema->children[i], array->children[i], srcOffset, count)); } @@ -197,7 +197,7 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray case 'r': // it's better to resolve validity during the actual scanning for run-end encoded arrays // so for this, let's just resolve child validities and move on - for (uint64_t i = 0; i < array->n_children; i++) { + for (int64_t i = 0; i < array->n_children; i++) { children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], array->children[i]->offset, array->children[i]->length)); } From 003a706bd3d339976b49203411ed6eb4bf0649ef Mon Sep 17 00:00:00 2001 From: andyfeng Date: Fri, 22 Mar 2024 13:52:36 -0400 Subject: [PATCH 073/136] Add pull request template (#3118) --- .github/docs/pull_request_template.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/docs/pull_request_template.md diff --git a/.github/docs/pull_request_template.md b/.github/docs/pull_request_template.md new file mode 100644 index 00000000000..4515ddf65b9 --- /dev/null +++ b/.github/docs/pull_request_template.md @@ -0,0 +1,16 @@ +## Description + +Describe the changes that this PR introduces. Link any relevant # (issue) or # (pull request). + +## Types of changes + +- [ ] Bug fix +- [ ] New feature +- [ ] Breaking change +- [ ] Documentation Update + +## Checklist + +- [ ] I have changed storage version if on disk format has changed. +- [ ] I have requested a review from a maintainer. +- [ ] I have updated the documentation (if needed). From 8f37501e238e02e597c0085c9fc5e5d230444990 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Fri, 22 Mar 2024 12:04:11 -0700 Subject: [PATCH 074/136] Added customizable delay before displaying progress bar (#3092) I have read and agree to the CLA of the Kuzu repository. --- CMakeLists.txt | 2 +- src/common/task_system/progress_bar.cpp | 28 ++++++++++++++++--- src/include/common/task_system/progress_bar.h | 14 ++++++++-- src/include/main/client_config.h | 3 ++ src/include/main/settings.h | 13 +++++++++ src/main/client_context.cpp | 1 + src/main/db_config.cpp | 2 +- test/test_files/tinysnb/call/call.test | 12 ++++++++ 8 files changed, 67 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82af9dfa937..066d4c52baa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,7 +197,7 @@ endif () if(${BUILD_KUZU}) add_definitions(-DKUZU_ROOT_DIRECTORY="${PROJECT_SOURCE_DIR}") add_definitions(-DKUZU_CMAKE_VERSION="${CMAKE_PROJECT_VERSION}") -add_definitions(-DKUZU_EXTENSION_VERSION="0.2.2") +add_definitions(-DKUZU_EXTENSION_VERSION="0.2.3") include_directories(src/include) include_directories(third_party/antlr4_cypher/include) diff --git a/src/common/task_system/progress_bar.cpp b/src/common/task_system/progress_bar.cpp index 526dde33f45..0c53154903d 100644 --- a/src/common/task_system/progress_bar.cpp +++ b/src/common/task_system/progress_bar.cpp @@ -8,14 +8,14 @@ void ProgressBar::startProgress() { return; } std::lock_guard lock(progressBarLock); + queryTimer->start(); printProgressBar(0.0); - printing = true; } void ProgressBar::endProgress() { std::lock_guard lock(progressBarLock); resetProgressBar(); - printing = false; + queryTimer = std::make_unique(true); } void ProgressBar::addPipeline() { @@ -46,10 +46,13 @@ void ProgressBar::updateProgress(double curPipelineProgress) { std::cout << "\033[2A"; } printProgressBar(curPipelineProgress); - printing = true; } -void ProgressBar::printProgressBar(double curPipelineProgress) const { +void ProgressBar::printProgressBar(double curPipelineProgress) { + if (!shouldPrintProgress()) { + return; + } + printing = true; float pipelineProgress = 0.0; if (numPipelines > 0) { pipelineProgress = (float)numPipelinesFinished / (float)numPipelines; @@ -71,11 +74,28 @@ void ProgressBar::resetProgressBar() { numPipelines = 0; numPipelinesFinished = 0; prevCurPipelineProgress = 0.0; + printing = false; + if (queryTimer->isStarted) { + queryTimer->stop(); + } +} + +bool ProgressBar::shouldPrintProgress() const { + if (queryTimer->isStarted) { + queryTimer->stop(); + } + bool shouldPrint = queryTimer->getElapsedTimeMS() > showProgressAfter; + queryTimer->start(); + return shouldPrint; } void ProgressBar::toggleProgressBarPrinting(bool enable) { trackProgress = enable; } +void ProgressBar::setShowProgressAfter(uint64_t time) { + showProgressAfter = time; +} + } // namespace common } // namespace kuzu diff --git a/src/include/common/task_system/progress_bar.h b/src/include/common/task_system/progress_bar.h index 50d65eb5fc0..abd01f393b2 100644 --- a/src/include/common/task_system/progress_bar.h +++ b/src/include/common/task_system/progress_bar.h @@ -1,8 +1,11 @@ #pragma once #include +#include #include +#include "common/metric.h" + namespace kuzu { namespace common { @@ -15,7 +18,8 @@ class ProgressBar { public: ProgressBar() : numPipelines{0}, numPipelinesFinished{0}, prevCurPipelineProgress{0.0}, - trackProgress{false}, printing{false} {}; + trackProgress{false}, printing{false}, queryTimer{std::make_unique(true)}, + showProgressAfter{1000} {}; void addPipeline(); @@ -31,6 +35,8 @@ class ProgressBar { void toggleProgressBarPrinting(bool enable); + void setShowProgressAfter(uint64_t showProgressAfter); + void updateProgress(double curPipelineProgress); private: @@ -38,10 +44,12 @@ class ProgressBar { inline void setDefaultFont() const { std::cerr << "\033[0m"; } - void printProgressBar(double curPipelineProgress) const; + void printProgressBar(double curPipelineProgress); void resetProgressBar(); + bool shouldPrintProgress() const; + private: uint32_t numPipelines; uint32_t numPipelinesFinished; @@ -49,6 +57,8 @@ class ProgressBar { std::mutex progressBarLock; bool trackProgress; bool printing; + std::unique_ptr queryTimer; + uint64_t showProgressAfter; }; } // namespace common diff --git a/src/include/main/client_config.h b/src/include/main/client_config.h index d199527b5ce..f929b82b56d 100644 --- a/src/include/main/client_config.h +++ b/src/include/main/client_config.h @@ -21,6 +21,8 @@ struct ClientConfig { uint32_t varLengthMaxDepth; // If using progress bar bool enableProgressBar; + // time before displaying progress bar + uint64_t showProgressAfter; }; struct ClientConfigDefault { @@ -29,6 +31,7 @@ struct ClientConfigDefault { static constexpr uint32_t VAR_LENGTH_MAX_DEPTH = 30; static constexpr bool ENABLE_SEMI_MASK = true; static constexpr bool ENABLE_PROGRESS_BAR = true; + static constexpr uint64_t SHOW_PROGRESS_AFTER = 1000; }; } // namespace main diff --git a/src/include/main/settings.h b/src/include/main/settings.h index 93796cca1a3..3223d984fd5 100644 --- a/src/include/main/settings.h +++ b/src/include/main/settings.h @@ -43,6 +43,19 @@ struct ProgressBarSetting { } }; +struct ProgressBarTimerSetting { + static constexpr const char* name = "progress_bar_time"; + static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::INT64; + static void setContext(ClientContext* context, const common::Value& parameter) { + KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::INT64); + context->getClientConfigUnsafe()->showProgressAfter = parameter.getValue(); + context->getProgressBar()->setShowProgressAfter(parameter.getValue()); + } + static common::Value getSetting(ClientContext* context) { + return common::Value(context->getClientConfig()->showProgressAfter); + } +}; + struct VarLengthExtendMaxDepthSetting { static constexpr const char* name = "var_length_extend_max_depth"; static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::INT64; diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 7a147e50039..d14e3814a80 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -56,6 +56,7 @@ ClientContext::ClientContext(Database* database) : database{database} { config.timeoutInMS = ClientConfigDefault::TIMEOUT_IN_MS; config.varLengthMaxDepth = ClientConfigDefault::VAR_LENGTH_MAX_DEPTH; config.enableProgressBar = ClientConfigDefault::ENABLE_PROGRESS_BAR; + config.showProgressAfter = ClientConfigDefault::SHOW_PROGRESS_AFTER; } uint64_t ClientContext::getTimeoutRemainingInMS() const { diff --git a/src/main/db_config.cpp b/src/main/db_config.cpp index dfcfe1756ec..6e9f43f71ac 100644 --- a/src/main/db_config.cpp +++ b/src/main/db_config.cpp @@ -15,7 +15,7 @@ static ConfigurationOption options[] = { // NOLINT(cert-err58-cpp): GET_CONFIGURATION(ThreadsSetting), GET_CONFIGURATION(TimeoutSetting), GET_CONFIGURATION(VarLengthExtendMaxDepthSetting), GET_CONFIGURATION(EnableSemiMaskSetting), GET_CONFIGURATION(HomeDirectorySetting), GET_CONFIGURATION(FileSearchPathSetting), - GET_CONFIGURATION(ProgressBarSetting)}; + GET_CONFIGURATION(ProgressBarSetting), GET_CONFIGURATION(ProgressBarTimerSetting)}; ConfigurationOption* DBConfig::getOptionByName(const std::string& optionName) { auto lOptionName = optionName; diff --git a/test/test_files/tinysnb/call/call.test b/test/test_files/tinysnb/call/call.test index 94a48988171..c316cc12974 100644 --- a/test/test_files/tinysnb/call/call.test +++ b/test/test_files/tinysnb/call/call.test @@ -54,6 +54,18 @@ True ---- 1 False +-LOG SetGetProgressBarTime +-STATEMENT CALL progress_bar_time=4000 +---- ok +-STATEMENT CALL current_setting('progress_bar_time') RETURN * +---- 1 +4000 +-STATEMENT CALL progress_bar_time=0 +---- ok +-STATEMENT CALL current_setting('progress_bar_time') RETURN * +---- 1 +0 + -LOG disableSemihMaskOptimization -STATEMENT CALL enable_semi_mask=true ---- ok From c8e4d5b56553e8b4e4d078a951fe7edf1212808d Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Fri, 22 Mar 2024 15:54:47 -0400 Subject: [PATCH 075/136] Hash index cleanup (#3088) * Make HashIndex use only one template parameter * Store key and value explicitly in hash index slots --- CMakeLists.txt | 2 +- src/include/common/type_utils.h | 3 +- src/include/storage/index/hash_index.h | 111 ++++++------ .../storage/index/hash_index_builder.h | 6 +- src/include/storage/index/hash_index_header.h | 7 +- src/include/storage/index/hash_index_slot.h | 10 +- src/include/storage/index/hash_index_utils.h | 11 +- src/storage/index/hash_index.cpp | 160 +++++++++--------- src/storage/index/hash_index_builder.cpp | 26 ++- 9 files changed, 162 insertions(+), 174 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 066d4c52baa..27a4553f1ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.15) -project(Kuzu VERSION 0.3.2.2 LANGUAGES CXX C) +project(Kuzu VERSION 0.3.2.3 LANGUAGES CXX C) find_package(Threads REQUIRED) diff --git a/src/include/common/type_utils.h b/src/include/common/type_utils.h index 7996d7a8ec4..2f9fb7b2bf4 100644 --- a/src/include/common/type_utils.h +++ b/src/include/common/type_utils.h @@ -75,7 +75,8 @@ class TypeUtils { return common::PhysicalTypeID::INT128; } else if constexpr (std::is_same_v) { return common::PhysicalTypeID::INTERVAL; - } else if constexpr (std::same_as || std::same_as) { + } else if constexpr (std::same_as || std::same_as || + std::same_as) { return common::PhysicalTypeID::STRING; } else { KU_UNREACHABLE; diff --git a/src/include/storage/index/hash_index.h b/src/include/storage/index/hash_index.h index a06f2ce8eae..8d9f11ead39 100644 --- a/src/include/storage/index/hash_index.h +++ b/src/include/storage/index/hash_index.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "common/type_utils.h" #include "common/types/ku_string.h" #include "common/types/types.h" @@ -13,7 +15,7 @@ namespace kuzu { namespace storage { -template +template class HashIndexLocalStorage; class OnDiskHashIndex { @@ -46,7 +48,7 @@ class OnDiskHashIndex { // // T is the key type used to access values // S is the stored type, which is usually the same as T, with the exception of strings -template +template class HashIndex final : public OnDiskHashIndex { public: @@ -57,9 +59,11 @@ class HashIndex final : public OnDiskHashIndex { ~HashIndex() override; public: - bool lookupInternal(transaction::Transaction* transaction, T key, common::offset_t& result); - void deleteInternal(T key) const; - bool insertInternal(T key, common::offset_t value); + using Key = + typename std::conditional, std::string_view, T>::type; + bool lookupInternal(transaction::Transaction* transaction, Key key, common::offset_t& result); + void deleteInternal(Key key) const; + bool insertInternal(Key key, common::offset_t value); void prepareCommit() override; void prepareRollback() override; @@ -69,27 +73,27 @@ class HashIndex final : public OnDiskHashIndex { private: bool lookupInPersistentIndex( - transaction::TransactionType trxType, T key, common::offset_t& result); + transaction::TransactionType trxType, Key key, common::offset_t& result); // The following two functions are only used in prepareCommit, and are not thread-safe. - void insertIntoPersistentIndex(T key, common::offset_t value); - void deleteFromPersistentIndex(T key); + void insertIntoPersistentIndex(Key key, common::offset_t value); + void deleteFromPersistentIndex(Key key); - entry_pos_t findMatchedEntryInSlot(transaction::TransactionType trxType, const Slot& slot, - T key, uint8_t fingerprint) const; + entry_pos_t findMatchedEntryInSlot(transaction::TransactionType trxType, const Slot& slot, + Key key, uint8_t fingerprint) const; - inline void updateSlot(const SlotInfo& slotInfo, const Slot& slot) { + inline void updateSlot(const SlotInfo& slotInfo, const Slot& slot) { slotInfo.slotType == SlotType::PRIMARY ? pSlots->update(slotInfo.slotId, slot) : oSlots->update(slotInfo.slotId, slot); } - inline Slot getSlot(transaction::TransactionType trxType, const SlotInfo& slotInfo) { + inline Slot getSlot(transaction::TransactionType trxType, const SlotInfo& slotInfo) { return slotInfo.slotType == SlotType::PRIMARY ? pSlots->get(slotInfo.slotId, trxType) : oSlots->get(slotInfo.slotId, trxType); } - inline uint32_t appendPSlot() { return pSlots->pushBack(Slot{}); } + inline uint32_t appendPSlot() { return pSlots->pushBack(Slot{}); } - inline uint64_t appendOverflowSlot(Slot&& newSlot) { return oSlots->pushBack(newSlot); } + inline uint64_t appendOverflowSlot(Slot&& newSlot) { return oSlots->pushBack(newSlot); } inline void splitSlot(HashIndexHeader& header) { appendPSlot(); @@ -99,32 +103,31 @@ class HashIndex final : public OnDiskHashIndex { void rehashSlots(HashIndexHeader& header); inline bool equals( - transaction::TransactionType /*trxType*/, T keyToLookup, const S& keyInEntry) const { + transaction::TransactionType /*trxType*/, Key keyToLookup, const T& keyInEntry) const { return keyToLookup == keyInEntry; } template void copyAndUpdateSlotHeader( - Slot& slot, entry_pos_t entryPos, K key, common::offset_t value, uint8_t fingerprint) { + Slot& slot, entry_pos_t entryPos, K key, common::offset_t value, uint8_t fingerprint) { if constexpr (isCopyEntry) { - memcpy( - slot.entries[entryPos].data, &key, this->indexHeaderForWriteTrx->numBytesPerEntry); + slot.entries[entryPos].copyFrom((uint8_t*)&key); } else { - insert(key, slot.entries[entryPos].data, value); + insert(key, slot.entries[entryPos], value); } slot.header.setEntryValid(entryPos, fingerprint); } - inline void insert(T key, uint8_t* entry, common::offset_t offset) { - memcpy(entry, &key, sizeof(T)); - memcpy(entry + sizeof(T), &offset, sizeof(common::offset_t)); + inline void insert(Key key, SlotEntry& entry, common::offset_t offset) { + entry.key = key; + entry.value = offset; } - inline common::hash_t hashStored(transaction::TransactionType /*trxType*/, const S& key) const { + inline common::hash_t hashStored(transaction::TransactionType /*trxType*/, const T& key) const { return HashIndexUtils::hash(key); } struct SlotIterator { SlotInfo slotInfo; - Slot slot; + Slot slot; }; SlotIterator getSlotIterator(slot_id_t slotId, transaction::TransactionType trxType) { @@ -142,20 +145,20 @@ class HashIndex final : public OnDiskHashIndex { return false; } - std::vector>> getChainedSlots(slot_id_t pSlotId); + std::vector>> getChainedSlots(slot_id_t pSlotId); template - void copyKVOrEntryToSlot(const SlotInfo& slotInfo, Slot& slot, K key, common::offset_t value, + void copyKVOrEntryToSlot(const SlotInfo& slotInfo, Slot& slot, K key, common::offset_t value, uint8_t fingerprint) { - if (slot.header.numEntries() == getSlotCapacity()) { + if (slot.header.numEntries() == getSlotCapacity()) { // Allocate a new oSlot, insert the entry to the new oSlot, and update slot's // nextOvfSlotId. - Slot newSlot; + Slot newSlot; auto entryPos = 0u; // Always insert to the first entry when there is a new slot. copyAndUpdateSlotHeader(newSlot, entryPos, key, value, fingerprint); slot.header.nextOvfSlotId = appendOverflowSlot(std::move(newSlot)); } else { - for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { + for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (!slot.header.isEntryValid(entryPos)) { copyAndUpdateSlotHeader( slot, entryPos, key, value, fingerprint); @@ -166,34 +169,33 @@ class HashIndex final : public OnDiskHashIndex { updateSlot(slotInfo, slot); } - void copyEntryToSlot(slot_id_t slotId, const S& entry, uint8_t fingerprint); + void copyEntryToSlot(slot_id_t slotId, const T& entry, uint8_t fingerprint); private: // Local Storage for strings stores an std::string, but still takes std::string_view as keys to // avoid unnecessary copying - using LocalStorageType = - typename std::conditional::value, std::string, T>::type; + using LocalStorageType = typename std::conditional::value, + std::string, T>::type; DBFileIDAndName dbFileIDAndName; BufferManager& bm; WAL* wal; std::shared_ptr fileHandle; std::unique_ptr> headerArray; - std::unique_ptr>> pSlots; - std::unique_ptr>> oSlots; + std::unique_ptr>> pSlots; + std::unique_ptr>> oSlots; OverflowFileHandle* overflowFileHandle; - std::unique_ptr> localStorage; + std::unique_ptr> localStorage; std::unique_ptr indexHeaderForReadTrx; std::unique_ptr indexHeaderForWriteTrx; }; template<> -common::hash_t HashIndex::hashStored( +common::hash_t HashIndex::hashStored( transaction::TransactionType trxType, const common::ku_string_t& key) const; template<> -inline bool HashIndex::equals( - transaction::TransactionType trxType, std::string_view keyToLookup, - const common::ku_string_t& keyInEntry) const; +inline bool HashIndex::equals(transaction::TransactionType trxType, + std::string_view keyToLookup, const common::ku_string_t& keyInEntry) const; class PrimaryKeyIndex { public: @@ -203,9 +205,13 @@ class PrimaryKeyIndex { ~PrimaryKeyIndex(); - template - inline HashIndex* getTypedHashIndex(T key) { - return common::ku_dynamic_cast*>( + template + using HashIndexType = + typename std::conditional || std::same_as, + common::ku_string_t, T>::type; + template + inline HashIndex>* getTypedHashIndex(T key) { + return common::ku_dynamic_cast>*>( hashIndices[HashIndexUtils::getHashIndexPosition(key)].get()); } @@ -213,13 +219,7 @@ class PrimaryKeyIndex { transaction::Transaction* trx, common::ku_string_t key, common::offset_t& result) { return lookup(trx, key.getAsStringView(), result); } - inline bool lookup( - transaction::Transaction* trx, std::string_view key, common::offset_t& result) { - KU_ASSERT(keyDataTypeID == common::PhysicalTypeID::STRING); - return getTypedHashIndex(key)->lookupInternal( - trx, key, result); - } - template + template inline bool lookup(transaction::Transaction* trx, T key, common::offset_t& result) { KU_ASSERT(keyDataTypeID == common::TypeUtils::getPhysicalTypeIDForType()); return getTypedHashIndex(key)->lookupInternal(trx, key, result); @@ -231,12 +231,7 @@ class PrimaryKeyIndex { inline bool insert(common::ku_string_t key, common::offset_t value) { return insert(key.getAsStringView(), value); } - inline bool insert(std::string_view key, common::offset_t value) { - KU_ASSERT(keyDataTypeID == common::PhysicalTypeID::STRING); - return getTypedHashIndex(key)->insertInternal( - key, value); - } - template + template inline bool insert(T key, common::offset_t value) { KU_ASSERT(keyDataTypeID == common::TypeUtils::getPhysicalTypeIDForType()); return getTypedHashIndex(key)->insertInternal(key, value); @@ -244,11 +239,7 @@ class PrimaryKeyIndex { bool insert(common::ValueVector* keyVector, uint64_t vectorPos, common::offset_t value); inline void delete_(common::ku_string_t key) { return delete_(key.getAsStringView()); } - inline void delete_(std::string_view key) { - KU_ASSERT(keyDataTypeID == common::PhysicalTypeID::STRING); - return getTypedHashIndex(key)->deleteInternal(key); - } - template + template inline void delete_(T key) { KU_ASSERT(keyDataTypeID == common::TypeUtils::getPhysicalTypeIDForType()); return getTypedHashIndex(key)->deleteInternal(key); diff --git a/src/include/storage/index/hash_index_builder.h b/src/include/storage/index/hash_index_builder.h index 766bc400f47..c498942309f 100644 --- a/src/include/storage/index/hash_index_builder.h +++ b/src/include/storage/index/hash_index_builder.h @@ -101,9 +101,9 @@ class HashIndexBuilder final : public InMemHashIndex { inline void insert( Key key, Slot* slot, uint8_t entryPos, common::offset_t value, uint8_t fingerprint) { - auto entry = slot->entries[entryPos].data; - memcpy(entry, &key, sizeof(T)); - memcpy(entry + sizeof(T), &value, sizeof(common::offset_t)); + auto& entry = slot->entries[entryPos]; + entry.key = key; + entry.value = value; slot->header.setEntryValid(entryPos, fingerprint); KU_ASSERT(HashIndexUtils::getFingerprintForHash(HashIndexUtils::hash(key)) == fingerprint); } diff --git a/src/include/storage/index/hash_index_header.h b/src/include/storage/index/hash_index_header.h index 110aac62e0e..69d6f003db9 100644 --- a/src/include/storage/index/hash_index_header.h +++ b/src/include/storage/index/hash_index_header.h @@ -2,7 +2,6 @@ #include "common/types/types.h" #include "hash_index_slot.h" -#include "storage/storage_utils.h" namespace kuzu { namespace storage { @@ -11,9 +10,7 @@ class HashIndexHeader { public: explicit HashIndexHeader(common::PhysicalTypeID keyDataTypeID) : currentLevel{1}, levelHashMask{1}, higherLevelHashMask{3}, nextSplitSlotId{0}, - numEntries{0}, numBytesPerKey{storage::StorageUtils::getDataTypeSize(keyDataTypeID)}, - numBytesPerEntry{(uint32_t)(numBytesPerKey + sizeof(common::offset_t))}, - keyDataTypeID{keyDataTypeID} {} + numEntries{0}, keyDataTypeID{keyDataTypeID} {} // Used for element initialization in disk array only. HashIndexHeader() : HashIndexHeader(common::PhysicalTypeID::STRING) {} @@ -38,8 +35,6 @@ class HashIndexHeader { uint64_t higherLevelHashMask; slot_id_t nextSplitSlotId; uint64_t numEntries; - uint32_t numBytesPerKey; - uint32_t numBytesPerEntry; common::PhysicalTypeID keyDataTypeID; }; diff --git a/src/include/storage/index/hash_index_slot.h b/src/include/storage/index/hash_index_slot.h index 456520e6e75..313cde8671f 100644 --- a/src/include/storage/index/hash_index_slot.h +++ b/src/include/storage/index/hash_index_slot.h @@ -49,7 +49,15 @@ class SlotHeader { template struct SlotEntry { - uint8_t data[sizeof(T) + sizeof(common::offset_t)]; + T key; + common::offset_t value; + + inline uint8_t* data() const { return (uint8_t*)&key; } + + // otherEntry must be a pointer to the beginning of another slot's key field + inline void copyFrom(const uint8_t* otherEntry) { + memcpy(data(), otherEntry, sizeof(SlotEntry)); + } }; template diff --git a/src/include/storage/index/hash_index_utils.h b/src/include/storage/index/hash_index_utils.h index 24a1bd8f2c0..ff901d36af5 100644 --- a/src/include/storage/index/hash_index_utils.h +++ b/src/include/storage/index/hash_index_utils.h @@ -1,22 +1,15 @@ #pragma once +#include + #include "common/types/ku_string.h" #include "common/types/types.h" #include "function/hash/hash_functions.h" #include "storage/index/hash_index_header.h" -#include "storage/storage_utils.h" namespace kuzu { namespace storage { -// NOLINTBEGIN(cert-err58-cpp): This is the best way to get the datatype size because it avoids -// refactoring. -static const uint32_t NUM_BYTES_FOR_INT64_KEY = - storage::StorageUtils::getDataTypeSize(common::LogicalType{common::LogicalTypeID::INT64}); -static const uint32_t NUM_BYTES_FOR_STRING_KEY = - storage::StorageUtils::getDataTypeSize(common::LogicalType{common::LogicalTypeID::STRING}); -// NOLINTEND(cert-err58-cpp) - const uint64_t NUM_HASH_INDEXES_LOG2 = 8; const uint64_t NUM_HASH_INDEXES = 1 << NUM_HASH_INDEXES_LOG2; diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp index 6e3911217e8..ce9fbd6c1b2 100644 --- a/src/storage/index/hash_index.cpp +++ b/src/storage/index/hash_index.cpp @@ -10,6 +10,7 @@ #include "common/types/types.h" #include "common/vector/value_vector.h" #include "storage/index/hash_index_header.h" +#include "storage/index/hash_index_slot.h" #include "storage/index/hash_index_utils.h" #include "transaction/transaction.h" @@ -25,14 +26,15 @@ enum class HashIndexLocalLookupState : uint8_t { KEY_FOUND, KEY_DELETED, KEY_NOT // all newly inserted entries, and the other (localDeletionIndex) is to keep track of newly deleted // entries (not available in localInsertionIndex). We assume that in a transaction, the insertions // and deletions are very small, thus they can be kept in memory. -template +template class HashIndexLocalStorage { public: + using Key = typename std::conditional, std::string_view, T>::type; // Currently, we assume that reads(lookup) and writes(delete/insert) of the local storage will // never happen concurrently. Thus, lookup requires no local storage lock. Writes are // coordinated to execute in serial with the help of the localStorageMutex. This is a // simplification to the lock scheme, but can be relaxed later if necessary. - HashIndexLocalLookupState lookup(T key, common::offset_t& result) { + HashIndexLocalLookupState lookup(Key key, common::offset_t& result) { if (localDeletions.contains(key)) { return HashIndexLocalLookupState::KEY_DELETED; } @@ -45,16 +47,16 @@ class HashIndexLocalStorage { } } - void deleteKey(T key) { + void deleteKey(Key key) { auto iter = localInsertions.find(key); if (iter != localInsertions.end()) { localInsertions.erase(iter); } else { - localDeletions.insert(static_cast(key)); + localDeletions.insert(static_cast(key)); } } - bool insert(T key, common::offset_t value) { + bool insert(Key key, common::offset_t value) { auto iter = localDeletions.find(key); if (iter != localDeletions.end()) { localDeletions.erase(iter); @@ -62,7 +64,7 @@ class HashIndexLocalStorage { if (localInsertions.contains(key)) { return false; } - localInsertions[static_cast(key)] = value; + localInsertions[static_cast(key)] = value; return true; } @@ -86,14 +88,14 @@ class HashIndexLocalStorage { private: // When the storage type is string, allow the key type to be string_view with a custom hash // function - using hash_function = typename std::conditional::value, - common::StringUtils::string_hash, std::hash>::type; - std::unordered_map> localInsertions; - std::unordered_set> localDeletions; + using hash_function = typename std::conditional::value, + common::StringUtils::string_hash, std::hash>::type; + std::unordered_map> localInsertions; + std::unordered_set> localDeletions; }; -template -HashIndex::HashIndex(const DBFileIDAndName& dbFileIDAndName, +template +HashIndex::HashIndex(const DBFileIDAndName& dbFileIDAndName, const std::shared_ptr& fileHandle, OverflowFileHandle* overflowFileHandle, uint64_t indexPos, BufferManager& bufferManager, WAL* wal) : dbFileIDAndName{dbFileIDAndName}, bm{bufferManager}, wal{wal}, fileHandle(fileHandle), @@ -106,15 +108,15 @@ HashIndex::HashIndex(const DBFileIDAndName& dbFileIDAndName, headerArray->get(INDEX_HEADER_IDX_IN_ARRAY, TransactionType::READ_ONLY)); this->indexHeaderForWriteTrx = std::make_unique(*indexHeaderForReadTrx); KU_ASSERT( - this->indexHeaderForReadTrx->keyDataTypeID == TypeUtils::getPhysicalTypeIDForType()); - pSlots = std::make_unique>>(*fileHandle, dbFileIDAndName.dbFileID, + this->indexHeaderForReadTrx->keyDataTypeID == TypeUtils::getPhysicalTypeIDForType()); + pSlots = std::make_unique>>(*fileHandle, dbFileIDAndName.dbFileID, NUM_HEADER_PAGES * indexPos + P_SLOTS_HEADER_PAGE_IDX, &bm, wal, Transaction::getDummyReadOnlyTrx().get()); - oSlots = std::make_unique>>(*fileHandle, dbFileIDAndName.dbFileID, + oSlots = std::make_unique>>(*fileHandle, dbFileIDAndName.dbFileID, NUM_HEADER_PAGES * indexPos + O_SLOTS_HEADER_PAGE_IDX, &bm, wal, Transaction::getDummyReadOnlyTrx().get()); // Initialize functions. - localStorage = std::make_unique>(); + localStorage = std::make_unique>(); } // For read transactions, local storage is skipped, lookups are performed on the persistent @@ -125,8 +127,8 @@ HashIndex::HashIndex(const DBFileIDAndName& dbFileIDAndName, // - the key has been marked as deleted in the local storage, return false; // - the key is neither deleted nor found in the local storage, lookup in the persistent // storage. -template -bool HashIndex::lookupInternal(Transaction* transaction, T key, offset_t& result) { +template +bool HashIndex::lookupInternal(Transaction* transaction, Key key, offset_t& result) { if (transaction->isReadOnly()) { return lookupInPersistentIndex(transaction->getType(), key, result); } else { @@ -145,8 +147,8 @@ bool HashIndex::lookupInternal(Transaction* transaction, T key, offset_t& // For deletions, we don't check if the deleted keys exist or not. Thus, we don't need to check // in the persistent storage and directly delete keys in the local storage. -template -void HashIndex::deleteInternal(T key) const { +template +void HashIndex::deleteInternal(Key key) const { localStorage->deleteKey(key); } @@ -156,8 +158,8 @@ void HashIndex::deleteInternal(T key) const { // - the key doesn't exist in the local storage, check if the key exists in the persistent // index, if // so, return false, else insert the key to the local storage. -template -bool HashIndex::insertInternal(T key, offset_t value) { +template +bool HashIndex::insertInternal(Key key, offset_t value) { offset_t tmpResult; auto localLookupState = localStorage->lookup(key, tmpResult); if (localLookupState == HashIndexLocalLookupState::KEY_FOUND) { @@ -170,8 +172,8 @@ bool HashIndex::insertInternal(T key, offset_t value) { return localStorage->insert(key, value); } -template -bool HashIndex::lookupInPersistentIndex(TransactionType trxType, T key, offset_t& result) { +template +bool HashIndex::lookupInPersistentIndex(TransactionType trxType, Key key, offset_t& result) { auto& header = trxType == TransactionType::READ_ONLY ? *this->indexHeaderForReadTrx : *this->indexHeaderForWriteTrx; auto hashValue = HashIndexUtils::hash(key); @@ -181,19 +183,19 @@ bool HashIndex::lookupInPersistentIndex(TransactionType trxType, T key, of do { auto entryPos = findMatchedEntryInSlot(trxType, iter.slot, key, fingerprint); if (entryPos != SlotHeader::INVALID_ENTRY_POS) { - result = *(common::offset_t*)(iter.slot.entries[entryPos].data + header.numBytesPerKey); + result = iter.slot.entries[entryPos].value; return true; } } while (nextChainedSlot(trxType, iter)); return false; } -template -void HashIndex::insertIntoPersistentIndex(T key, offset_t value) { +template +void HashIndex::insertIntoPersistentIndex(Key key, offset_t value) { auto& header = *this->indexHeaderForWriteTrx; slot_id_t numRequiredEntries = HashIndexUtils::getNumRequiredEntries(header.numEntries, 1); while (numRequiredEntries > - pSlots->getNumElements(TransactionType::WRITE) * getSlotCapacity()) { + pSlots->getNumElements(TransactionType::WRITE) * getSlotCapacity()) { this->splitSlot(header); } auto hashValue = HashIndexUtils::hash(key); @@ -201,16 +203,16 @@ void HashIndex::insertIntoPersistentIndex(T key, offset_t value) { auto iter = getSlotIterator( HashIndexUtils::getPrimarySlotIdForHash(header, hashValue), TransactionType::WRITE); // Find a slot with free entries - while (iter.slot.header.numEntries() == getSlotCapacity() && + while (iter.slot.header.numEntries() == getSlotCapacity() && nextChainedSlot(TransactionType::WRITE, iter)) ; - copyKVOrEntryToSlot( + copyKVOrEntryToSlot( iter.slotInfo, iter.slot, key, value, fingerprint); header.numEntries++; } -template -void HashIndex::deleteFromPersistentIndex(T key) { +template +void HashIndex::deleteFromPersistentIndex(Key key) { auto trxType = TransactionType::WRITE; auto header = *this->indexHeaderForWriteTrx; auto hashValue = HashIndexUtils::hash(key); @@ -228,7 +230,7 @@ void HashIndex::deleteFromPersistentIndex(T key) { } template<> -inline common::hash_t HashIndex::hashStored( +inline common::hash_t HashIndex::hashStored( transaction::TransactionType /*trxType*/, const ku_string_t& key) const { common::hash_t hash; auto str = overflowFileHandle->readString(TransactionType::WRITE, key); @@ -236,39 +238,40 @@ inline common::hash_t HashIndex::hashStored( return hash; } -template -entry_pos_t HashIndex::findMatchedEntryInSlot( - TransactionType trxType, const Slot& slot, T key, uint8_t fingerprint) const { - for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { +template +entry_pos_t HashIndex::findMatchedEntryInSlot( + TransactionType trxType, const Slot& slot, Key key, uint8_t fingerprint) const { + for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (slot.header.isEntryValid(entryPos) && slot.header.fingerprints[entryPos] == fingerprint && - equals(trxType, key, *(S*)slot.entries[entryPos].data)) { + equals(trxType, key, slot.entries[entryPos].key)) { return entryPos; } } return SlotHeader::INVALID_ENTRY_POS; } -template -void HashIndex::prepareCommit() { +template +void HashIndex::prepareCommit() { if (localStorage->hasUpdates()) { wal->addToUpdatedTables(dbFileIDAndName.dbFileID.nodeIndexID.tableID); localStorage->applyLocalChanges( - [this](T key) -> void { this->deleteFromPersistentIndex(key); }, - [this](T key, offset_t value) -> void { this->insertIntoPersistentIndex(key, value); }); + [this](Key key) -> void { this->deleteFromPersistentIndex(key); }, + [this]( + Key key, offset_t value) -> void { this->insertIntoPersistentIndex(key, value); }); headerArray->update(INDEX_HEADER_IDX_IN_ARRAY, *indexHeaderForWriteTrx); } } -template -void HashIndex::prepareRollback() { +template +void HashIndex::prepareRollback() { if (localStorage->hasUpdates()) { wal->addToUpdatedTables(dbFileIDAndName.dbFileID.nodeIndexID.tableID); } } -template -void HashIndex::checkpointInMemory() { +template +void HashIndex::checkpointInMemory() { if (!localStorage->hasUpdates()) { return; } @@ -277,13 +280,13 @@ void HashIndex::checkpointInMemory() { pSlots->checkpointInMemoryIfNecessary(); oSlots->checkpointInMemoryIfNecessary(); localStorage->clear(); - if constexpr (std::same_as) { + if constexpr (std::same_as) { overflowFileHandle->checkpointInMemory(); } } -template -void HashIndex::rollbackInMemory() { +template +void HashIndex::rollbackInMemory() { if (!localStorage->hasUpdates()) { return; } @@ -295,7 +298,7 @@ void HashIndex::rollbackInMemory() { } template<> -inline bool HashIndex::equals(transaction::TransactionType trxType, +inline bool HashIndex::equals(transaction::TransactionType trxType, std::string_view keyToLookup, const ku_string_t& keyInEntry) const { if (HashIndexUtils::areStringPrefixAndLenEqual(keyToLookup, keyInEntry)) { auto entryKeyString = overflowFileHandle->readString(trxType, keyInEntry); @@ -305,36 +308,35 @@ inline bool HashIndex::equals(transaction::Transa } template<> -inline void HashIndex::insert( - std::string_view key, uint8_t* entry, common::offset_t offset) { - auto kuString = overflowFileHandle->writeString(key); - memcpy(entry, &kuString, NUM_BYTES_FOR_STRING_KEY); - memcpy(entry + NUM_BYTES_FOR_STRING_KEY, &offset, sizeof(common::offset_t)); +inline void HashIndex::insert( + std::string_view key, SlotEntry& entry, common::offset_t offset) { + entry.key = overflowFileHandle->writeString(key); + entry.value = offset; } -template -void HashIndex::rehashSlots(HashIndexHeader& header) { +template +void HashIndex::rehashSlots(HashIndexHeader& header) { auto slotsToSplit = getChainedSlots(header.nextSplitSlotId); for (auto& [slotInfo, slot] : slotsToSplit) { auto slotHeader = slot.header; slot.header.reset(); updateSlot(slotInfo, slot); - for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { + for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (!slotHeader.isEntryValid(entryPos)) { continue; // Skip invalid entries. } - auto key = (S*)slot.entries[entryPos].data; - hash_t hash = this->hashStored(TransactionType::WRITE, *key); + const auto& key = slot.entries[entryPos].key; + hash_t hash = this->hashStored(TransactionType::WRITE, key); auto fingerprint = HashIndexUtils::getFingerprintForHash(hash); auto newSlotId = hash & header.higherLevelHashMask; - copyEntryToSlot(newSlotId, *key, fingerprint); + copyEntryToSlot(newSlotId, key, fingerprint); } } } -template -std::vector>> HashIndex::getChainedSlots(slot_id_t pSlotId) { - std::vector>> slots; +template +std::vector>> HashIndex::getChainedSlots(slot_id_t pSlotId) { + std::vector>> slots; SlotInfo slotInfo{pSlotId, SlotType::PRIMARY}; while (slotInfo.slotType == SlotType::PRIMARY || slotInfo.slotId != 0) { auto slot = getSlot(TransactionType::WRITE, slotInfo); @@ -345,22 +347,22 @@ std::vector>> HashIndex::getChainedSlots(slot_ return slots; } -template -void HashIndex::copyEntryToSlot(slot_id_t slotId, const S& entry, uint8_t fingerprint) { +template +void HashIndex::copyEntryToSlot(slot_id_t slotId, const T& entry, uint8_t fingerprint) { auto iter = getSlotIterator(slotId, TransactionType::WRITE); do { - if (iter.slot.header.numEntries() < getSlotCapacity()) { + if (iter.slot.header.numEntries() < getSlotCapacity()) { // Found a slot with empty space. break; } } while (nextChainedSlot(TransactionType::WRITE, iter)); - copyKVOrEntryToSlot( + copyKVOrEntryToSlot( iter.slotInfo, iter.slot, entry, UINT32_MAX, fingerprint); updateSlot(iter.slotInfo, iter.slot); } -template -HashIndex::~HashIndex() = default; +template +HashIndex::~HashIndex() = default; template class HashIndex; template class HashIndex; @@ -373,7 +375,7 @@ template class HashIndex; template class HashIndex; template class HashIndex; template class HashIndex; -template class HashIndex; +template class HashIndex; PrimaryKeyIndex::PrimaryKeyIndex(const DBFileIDAndName& dbFileIDAndName, bool readOnly, common::PhysicalTypeID keyDataType, BufferManager& bufferManager, WAL* wal, @@ -390,21 +392,21 @@ PrimaryKeyIndex::PrimaryKeyIndex(const DBFileIDAndName& dbFileIDAndName, bool re } hashIndices.reserve(NUM_HASH_INDEXES); - TypeUtils::visit(keyDataTypeID, [&](T) { - if constexpr (std::is_same_v) { + TypeUtils::visit( + keyDataTypeID, + [&](ku_string_t) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { - hashIndices.push_back(std::make_unique>( + hashIndices.push_back(std::make_unique>( dbFileIDAndName, fileHandle, overflowFile->addHandle(), i, bufferManager, wal)); } - } else if constexpr (HashablePrimitive) { + }, + [&](T) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { hashIndices.push_back(std::make_unique>( dbFileIDAndName, fileHandle, nullptr, i, bufferManager, wal)); } - } else { - KU_UNREACHABLE; - } - }); + }, + [&](auto) { KU_UNREACHABLE; }); } bool PrimaryKeyIndex::lookup(Transaction* trx, common::ValueVector* keyVector, uint64_t vectorPos, diff --git a/src/storage/index/hash_index_builder.cpp b/src/storage/index/hash_index_builder.cpp index c5c8425b723..ec9fbad7a78 100644 --- a/src/storage/index/hash_index_builder.cpp +++ b/src/storage/index/hash_index_builder.cpp @@ -62,9 +62,8 @@ void HashIndexBuilder::copy(const uint8_t* oldEntry, slot_id_t newSlotId, uin if (!iter.slot->header.isEntryValid(newEntryPos)) { // The original slot was marked as unused, but // copying to the original slot is unnecessary and will cause undefined behaviour - if (oldEntry != iter.slot->entries[newEntryPos].data) { - memcpy(iter.slot->entries[newEntryPos].data, oldEntry, - this->indexHeader->numBytesPerEntry); + if (oldEntry != iter.slot->entries[newEntryPos].data()) { + iter.slot->entries[newEntryPos].copyFrom(oldEntry); } iter.slot->header.setEntryValid(newEntryPos, fingerprint); return; @@ -76,7 +75,7 @@ void HashIndexBuilder::copy(const uint8_t* oldEntry, slot_id_t newSlotId, uin iter.slot->header.nextOvfSlotId = newOvfSlotId; auto newOvfSlot = getSlot(SlotInfo{newOvfSlotId, SlotType::OVF}); auto newEntryPos = 0u; // Always insert to the first entry when there is a new slot. - memcpy(newOvfSlot->entries[newEntryPos].data, oldEntry, this->indexHeader->numBytesPerEntry); + newOvfSlot->entries[newEntryPos].copyFrom(oldEntry); newOvfSlot->header.setEntryValid(newEntryPos, fingerprint); } @@ -97,11 +96,11 @@ void HashIndexBuilder::splitSlot(HashIndexHeader& header) { if (!slotHeader.isEntryValid(entryPos)) { continue; // Skip invalid entries. } - const auto* data = (iter.slot->entries[entryPos].data); - hash_t hash = this->hashStored(*reinterpret_cast(data)); + const auto& entry = iter.slot->entries[entryPos]; + hash_t hash = this->hashStored(entry.key); auto fingerprint = HashIndexUtils::getFingerprintForHash(hash); auto newSlotId = hash & header.higherLevelHashMask; - copy(data, newSlotId, fingerprint); + copy(entry.data(), newSlotId, fingerprint); } } while (nextChainedSlot(iter)); @@ -146,7 +145,7 @@ bool HashIndexBuilder::appendInternal(Key key, common::offset_t value, common this->indexHeader->numEntries++; return true; } else if (iter.slot->header.fingerprints[entryPos] == fingerprint && - equals(key, *(T*)iter.slot->entries[entryPos].data)) { + equals(key, iter.slot->entries[entryPos].key)) { // Value already exists return false; } @@ -168,10 +167,9 @@ bool HashIndexBuilder::lookup(Key key, offset_t& result) { for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (iter.slot->header.isEntryValid(entryPos) && iter.slot->header.fingerprints[entryPos] == fingerprint && - equals(key, *(T*)iter.slot->entries[entryPos].data)) { + equals(key, iter.slot->entries[entryPos].key)) { // Value already exists - result = *(common::offset_t*)(iter.slot->entries[entryPos].data + - this->indexHeader->numBytesPerKey); + result = iter.slot->entries[entryPos].value; return true; } } @@ -226,9 +224,9 @@ inline void HashIndexBuilder::insertToNewOvfSlot( template<> void HashIndexBuilder::insert(std::string_view key, Slot* slot, uint8_t entryPos, offset_t offset, uint8_t fingerprint) { - auto entry = slot->entries[entryPos].data; - *(ku_string_t*)entry = overflowFileHandle->writeString(key); - memcpy(entry + NUM_BYTES_FOR_STRING_KEY, &offset, sizeof(common::offset_t)); + auto& entry = slot->entries[entryPos]; + entry.key = overflowFileHandle->writeString(key); + entry.value = offset; slot->header.setEntryValid(entryPos, fingerprint); } From 167bb879d08303f282d0197e2c94ca74437c3bb8 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Fri, 22 Mar 2024 17:00:35 -0400 Subject: [PATCH 076/136] Fix launch database using homedir (#3108) --- CMakeLists.txt | 2 +- src/common/file_system/file_system.cpp | 5 +++++ src/common/file_system/local_file_system.cpp | 18 ++++++++++++------ src/common/file_system/virtual_file_system.cpp | 5 +++++ src/include/common/file_system/file_system.h | 2 ++ .../common/file_system/local_file_system.h | 2 ++ .../common/file_system/virtual_file_system.h | 2 ++ src/main/database.cpp | 8 +++++++- test/c_api/database_test.cpp | 7 +++++++ 9 files changed, 43 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 27a4553f1ad..7cc3baa58ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,7 +197,7 @@ endif () if(${BUILD_KUZU}) add_definitions(-DKUZU_ROOT_DIRECTORY="${PROJECT_SOURCE_DIR}") add_definitions(-DKUZU_CMAKE_VERSION="${CMAKE_PROJECT_VERSION}") -add_definitions(-DKUZU_EXTENSION_VERSION="0.2.3") +add_definitions(-DKUZU_EXTENSION_VERSION="0.2.4") include_directories(src/include) include_directories(third_party/antlr4_cypher/include) diff --git a/src/common/file_system/file_system.cpp b/src/common/file_system/file_system.cpp index bc595b94d8c..989ea54c731 100644 --- a/src/common/file_system/file_system.cpp +++ b/src/common/file_system/file_system.cpp @@ -23,6 +23,11 @@ bool FileSystem::fileOrPathExists(const std::string& /*path*/) const { KU_UNREACHABLE; } +std::string FileSystem::expandPath( + main::ClientContext* /*context*/, const std::string& path) const { + return path; +} + std::string FileSystem::joinPath(const std::string& base, const std::string& part) { return (std::filesystem::path{base} / part).string(); } diff --git a/src/common/file_system/local_file_system.cpp b/src/common/file_system/local_file_system.cpp index 71ff32ff9a0..61bf453ac59 100644 --- a/src/common/file_system/local_file_system.cpp +++ b/src/common/file_system/local_file_system.cpp @@ -41,12 +41,7 @@ LocalFileInfo::~LocalFileInfo() { std::unique_ptr LocalFileSystem::openFile( const std::string& path, int flags, main::ClientContext* context, FileLockType lock_type) { - auto fullPath = path; - if (path.starts_with('~')) { - fullPath = - context->getCurrentSetting(main::HomeDirectorySetting::name).getValue() + - fullPath.substr(1); - } + auto fullPath = expandPath(context, path); #if defined(_WIN32) auto dwDesiredAccess = 0ul; auto dwCreationDisposition = (flags & O_CREAT) ? OPEN_ALWAYS : OPEN_EXISTING; @@ -194,6 +189,17 @@ bool LocalFileSystem::fileOrPathExists(const std::string& path) const { return std::filesystem::exists(path); } +std::string LocalFileSystem::expandPath( + main::ClientContext* context, const std::string& path) const { + auto fullPath = path; + if (path.starts_with('~')) { + fullPath = + context->getCurrentSetting(main::HomeDirectorySetting::name).getValue() + + fullPath.substr(1); + } + return fullPath; +} + void LocalFileSystem::readFromFile( FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const { auto localFileInfo = ku_dynamic_cast(fileInfo); diff --git a/src/common/file_system/virtual_file_system.cpp b/src/common/file_system/virtual_file_system.cpp index d54bbc7cf40..bc461a3943f 100644 --- a/src/common/file_system/virtual_file_system.cpp +++ b/src/common/file_system/virtual_file_system.cpp @@ -41,6 +41,11 @@ bool VirtualFileSystem::fileOrPathExists(const std::string& path) const { return findFileSystem(path)->fileOrPathExists(path); } +std::string VirtualFileSystem::expandPath( + main::ClientContext* context, const std::string& path) const { + return findFileSystem(path)->expandPath(context, path); +} + void VirtualFileSystem::readFromFile( FileInfo* /*fileInfo*/, void* /*buffer*/, uint64_t /*numBytes*/, uint64_t /*position*/) const { KU_UNREACHABLE; diff --git a/src/include/common/file_system/file_system.h b/src/include/common/file_system/file_system.h index 8e7860a1349..0562f4e9b05 100644 --- a/src/include/common/file_system/file_system.h +++ b/src/include/common/file_system/file_system.h @@ -37,6 +37,8 @@ class KUZU_API FileSystem { virtual bool fileOrPathExists(const std::string& path) const; + virtual std::string expandPath(main::ClientContext* context, const std::string& path) const; + static std::string joinPath(const std::string& base, const std::string& part); static std::string getFileExtension(const std::filesystem::path& path); diff --git a/src/include/common/file_system/local_file_system.h b/src/include/common/file_system/local_file_system.h index c29f7b577de..60db5628026 100644 --- a/src/include/common/file_system/local_file_system.h +++ b/src/include/common/file_system/local_file_system.h @@ -44,6 +44,8 @@ class LocalFileSystem final : public FileSystem { bool fileOrPathExists(const std::string& path) const override; + std::string expandPath(main::ClientContext* context, const std::string& path) const override; + protected: void readFromFile( FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const override; diff --git a/src/include/common/file_system/virtual_file_system.h b/src/include/common/file_system/virtual_file_system.h index 851380e6e7c..2cc61a928f6 100644 --- a/src/include/common/file_system/virtual_file_system.h +++ b/src/include/common/file_system/virtual_file_system.h @@ -30,6 +30,8 @@ class VirtualFileSystem final : public FileSystem { bool fileOrPathExists(const std::string& path) const override; + std::string expandPath(main::ClientContext* context, const std::string& path) const override; + protected: void readFromFile( FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const override; diff --git a/src/main/database.cpp b/src/main/database.cpp index 931065f11e3..7a34406fa37 100644 --- a/src/main/database.cpp +++ b/src/main/database.cpp @@ -1,5 +1,6 @@ #include "main/database.h" +#include "common/random_engine.h" #include "main/database_manager.h" #if defined(_WIN32) @@ -72,10 +73,15 @@ static void getLockFileFlagsAndType(bool readOnly, bool createNew, int& flags, F } Database::Database(std::string_view databasePath, SystemConfig systemConfig) - : databasePath{databasePath}, systemConfig{systemConfig} { + : systemConfig{systemConfig} { initLoggers(); logger = LoggerUtils::getLogger(LoggerConstants::LoggerEnum::DATABASE); vfs = std::make_unique(); + // To expand a path with home directory(~), we have to pass in a dummy clientContext which + // handles the home directory expansion. + auto clientContext = ClientContext(this); + auto dbPathStr = std::string(databasePath); + this->databasePath = vfs->expandPath(&clientContext, dbPathStr); bufferManager = std::make_unique( this->systemConfig.bufferPoolSize, this->systemConfig.maxDBSize); memoryManager = std::make_unique(bufferManager.get(), vfs.get()); diff --git a/test/c_api/database_test.cpp b/test/c_api/database_test.cpp index 5424e03fdaf..805a384b736 100644 --- a/test/c_api/database_test.cpp +++ b/test/c_api/database_test.cpp @@ -58,3 +58,10 @@ TEST_F(CApiDatabaseTest, CreationInvalidPath) { auto database = kuzu_database_init(databasePathCStr, kuzu_default_system_config()); ASSERT_EQ(database, nullptr); } + +TEST_F(CApiDatabaseTest, CreationHomeDir) { + auto databasePathCStr = (char*)"~/ku_test.db"; + auto database = kuzu_database_init(databasePathCStr, kuzu_default_system_config()); + ASSERT_NE(database, nullptr); + kuzu_database_destroy(database); +} From 7ec590ad2d37ec4e7416441035b3d21ac789945f Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Fri, 22 Mar 2024 17:21:48 -0400 Subject: [PATCH 077/136] remove dummy transactions (#3106) remove dummy transactions --- src/binder/bind/bind_updating_clause.cpp | 2 +- src/binder/binder.cpp | 2 +- src/binder/bound_statement_rewriter.cpp | 6 +-- .../query/query_graph_label_analyzer.cpp | 7 ++-- src/function/table/call/storage_info.cpp | 2 +- src/include/binder/bound_statement_rewriter.h | 4 +- .../binder/query/query_graph_label_analyzer.h | 6 ++- .../match_clause_pattern_label_rewriter.h | 5 ++- src/include/main/client_context.h | 4 +- .../join_order/cardinality_estimator.h | 16 ++++---- src/include/planner/planner.h | 5 ++- .../storage/stats/nodes_store_statistics.h | 9 +---- src/main/client_context.cpp | 6 +-- src/main/storage_driver.cpp | 2 +- .../join_order/cardinality_estimator.cpp | 33 ++++++++-------- src/planner/plan/append_extend.cpp | 39 +++++++++++-------- src/planner/plan/plan_join_order.cpp | 2 +- src/planner/planner.cpp | 4 +- src/processor/map/map_ddl.cpp | 4 +- src/processor/map/map_delete.cpp | 28 ++++++------- src/processor/map/map_extend.cpp | 20 +++++----- src/processor/map/map_insert.cpp | 4 +- src/processor/map/map_recursive_extend.cpp | 3 +- src/processor/map/map_scan_node_property.cpp | 9 ++--- src/processor/map/map_set.cpp | 9 ++--- src/storage/stats/nodes_store_statistics.cpp | 16 ++------ test/graph_test/graph_test.cpp | 2 +- 27 files changed, 125 insertions(+), 124 deletions(-) diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index 46d0a12248a..76ad735c770 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -96,7 +96,7 @@ std::vector Binder::bindInsertInfos( const QueryGraphCollection& queryGraphCollection, const expression_set& nodeRelScope_) { auto nodeRelScope = nodeRelScope_; std::vector result; - auto analyzer = QueryGraphLabelAnalyzer(*clientContext->getCatalog()); + auto analyzer = QueryGraphLabelAnalyzer(*clientContext->getCatalog(), *clientContext); for (auto i = 0u; i < queryGraphCollection.getNumQueryGraphs(); ++i) { auto queryGraph = queryGraphCollection.getQueryGraph(i); // Ensure query graph does not violate declared schema. diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index e5c85438f95..64367cc1245 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -71,7 +71,7 @@ std::unique_ptr Binder::bind(const Statement& statement) { KU_UNREACHABLE; } } - BoundStatementRewriter::rewrite(*boundStatement, *clientContext->getCatalog()); + BoundStatementRewriter::rewrite(*boundStatement, *clientContext->getCatalog(), *clientContext); return boundStatement; } diff --git a/src/binder/bound_statement_rewriter.cpp b/src/binder/bound_statement_rewriter.cpp index 39595982077..57a2ac913f0 100644 --- a/src/binder/bound_statement_rewriter.cpp +++ b/src/binder/bound_statement_rewriter.cpp @@ -7,12 +7,12 @@ namespace kuzu { namespace binder { -void BoundStatementRewriter::rewrite( - BoundStatement& boundStatement, const catalog::Catalog& catalog) { +void BoundStatementRewriter::rewrite(BoundStatement& boundStatement, + const catalog::Catalog& catalog, const main::ClientContext& clientContext) { auto withClauseProjectionRewriter = WithClauseProjectionRewriter(); withClauseProjectionRewriter.visitUnsafe(boundStatement); - auto matchClausePatternLabelRewriter = MatchClausePatternLabelRewriter(catalog); + auto matchClausePatternLabelRewriter = MatchClausePatternLabelRewriter(catalog, clientContext); matchClausePatternLabelRewriter.visit(boundStatement); auto defaultTypeSolver = DefaultTypeSolver(); diff --git a/src/binder/query/query_graph_label_analyzer.cpp b/src/binder/query/query_graph_label_analyzer.cpp index 8634df148b9..ff533ebd9e4 100644 --- a/src/binder/query/query_graph_label_analyzer.cpp +++ b/src/binder/query/query_graph_label_analyzer.cpp @@ -4,7 +4,6 @@ #include "common/cast.h" #include "common/exception/binder.h" #include "common/string_format.h" -#include "transaction/transaction.h" using namespace kuzu::common; using namespace kuzu::catalog; @@ -32,7 +31,7 @@ void QueryGraphLabelAnalyzer::pruneNode(const QueryGraph& graph, NodeExpression& std::unordered_set candidateNamesSet; auto isSrcConnect = *queryRel->getSrcNode() == node; auto isDstConnect = *queryRel->getDstNode() == node; - auto tx = &DUMMY_READ_TRANSACTION; + auto tx = clientContext.getTx(); if (queryRel->getDirectionType() == RelDirectionType::BOTH) { if (isSrcConnect || isDstConnect) { for (auto relTableID : queryRel->getTableIDs()) { @@ -109,7 +108,7 @@ void QueryGraphLabelAnalyzer::pruneRel(RelExpression& rel) { } for (auto& relTableID : rel.getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(&DUMMY_READ_TRANSACTION, relTableID)); + catalog.getTableCatalogEntry(clientContext.getTx(), relTableID)); auto srcTableID = relTableSchema->getSrcTableID(); auto dstTableID = relTableSchema->getDstTableID(); if (!boundTableIDSet.contains(srcTableID) || !boundTableIDSet.contains(dstTableID)) { @@ -122,7 +121,7 @@ void QueryGraphLabelAnalyzer::pruneRel(RelExpression& rel) { auto dstTableIDSet = rel.getDstNode()->getTableIDsSet(); for (auto& relTableID : rel.getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(&DUMMY_READ_TRANSACTION, relTableID)); + catalog.getTableCatalogEntry(clientContext.getTx(), relTableID)); auto srcTableID = relTableSchema->getSrcTableID(); auto dstTableID = relTableSchema->getDstTableID(); if (!srcTableIDSet.contains(srcTableID) || !dstTableIDSet.contains(dstTableID)) { diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index 2fdf75fb6ac..b5024f60579 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -144,7 +144,7 @@ static void appendColumnChunkStorageInfo(node_group_idx_t nodeGroupIdx, static void appendStorageInfoForColumn(StorageInfoLocalState* localState, std::string tableType, const Column* column, DataChunk& outputChunk, ClientContext* context) { - auto numNodeGroups = column->getNumNodeGroups(&transaction::DUMMY_READ_TRANSACTION); + auto numNodeGroups = column->getNumNodeGroups(context->getTx()); for (auto nodeGroupIdx = 0u; nodeGroupIdx < numNodeGroups; nodeGroupIdx++) { if (outputChunk.state->selVector->selectedSize == DEFAULT_VECTOR_CAPACITY) { localState->dataChunkCollection->append(outputChunk); diff --git a/src/include/binder/bound_statement_rewriter.h b/src/include/binder/bound_statement_rewriter.h index cd95d91f58f..564696beebc 100644 --- a/src/include/binder/bound_statement_rewriter.h +++ b/src/include/binder/bound_statement_rewriter.h @@ -9,7 +9,9 @@ namespace binder { // Perform semantic rewrite over bound statement. class BoundStatementRewriter { public: - static void rewrite(BoundStatement& boundStatement, const catalog::Catalog& catalog); + // TODO(Jiamin): remove catalog + static void rewrite(BoundStatement& boundStatement, const catalog::Catalog& catalog, + const main::ClientContext& clientContext); }; } // namespace binder diff --git a/src/include/binder/query/query_graph_label_analyzer.h b/src/include/binder/query/query_graph_label_analyzer.h index 71b5754e703..f0478026855 100644 --- a/src/include/binder/query/query_graph_label_analyzer.h +++ b/src/include/binder/query/query_graph_label_analyzer.h @@ -8,7 +8,10 @@ namespace binder { class QueryGraphLabelAnalyzer { public: - explicit QueryGraphLabelAnalyzer(const catalog::Catalog& catalog) : catalog{catalog} {} + // TODO(Jiamin): remove catalog + explicit QueryGraphLabelAnalyzer( + const catalog::Catalog& catalog, const main::ClientContext& clientContext) + : catalog{catalog}, clientContext{clientContext} {} void pruneLabel(const QueryGraph& graph); @@ -18,6 +21,7 @@ class QueryGraphLabelAnalyzer { private: const catalog::Catalog& catalog; + const main::ClientContext& clientContext; }; } // namespace binder diff --git a/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h b/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h index 7ac99537e2a..c718ad7ec43 100644 --- a/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h +++ b/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h @@ -8,7 +8,10 @@ namespace binder { class MatchClausePatternLabelRewriter : public BoundStatementVisitor { public: - explicit MatchClausePatternLabelRewriter(const catalog::Catalog& catalog) : analyzer{catalog} {} + // TODO(Jiamin): remove catalog + explicit MatchClausePatternLabelRewriter( + const catalog::Catalog& catalog, const main::ClientContext& clientContext) + : analyzer{catalog, clientContext} {} void visitMatch(const BoundReadingClause& readingClause) final; diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index f21fc699ce2..5cdb5c891d7 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -93,9 +93,9 @@ class ClientContext { // Database component getters. KUZU_API Database* getDatabase() const { return database; } - storage::StorageManager* getStorageManager(); + storage::StorageManager* getStorageManager() const; KUZU_API storage::MemoryManager* getMemoryManager(); - catalog::Catalog* getCatalog(); + catalog::Catalog* getCatalog() const; common::VirtualFileSystem* getVFSUnsafe() const; common::RandomEngine* getRandomEngine(); diff --git a/src/include/planner/join_order/cardinality_estimator.h b/src/include/planner/join_order/cardinality_estimator.h index 97f1a7b6ce8..918bfbe68fb 100644 --- a/src/include/planner/join_order/cardinality_estimator.h +++ b/src/include/planner/join_order/cardinality_estimator.h @@ -17,9 +17,9 @@ class CardinalityEstimator { DELETE_COPY_DEFAULT_MOVE(CardinalityEstimator); // TODO(Xiyang): revisit this init at some point. Maybe we should init while enumerating. - void initNodeIDDom(const binder::QueryGraph& queryGraph); - void addNodeIDDom( - const binder::Expression& nodeID, const std::vector& tableIDs); + void initNodeIDDom(const binder::QueryGraph& queryGraph, transaction::Transaction* transaction); + void addNodeIDDom(const binder::Expression& nodeID, + const std::vector& tableIDs, transaction::Transaction* transaction); uint64_t estimateScanNode(LogicalOperator* op); uint64_t estimateHashJoin(const binder::expression_vector& joinKeys, @@ -30,8 +30,8 @@ class CardinalityEstimator { uint64_t estimateFlatten(const LogicalPlan& childPlan, f_group_pos groupPosToFlatten); uint64_t estimateFilter(const LogicalPlan& childPlan, const binder::Expression& predicate); - double getExtensionRate( - const binder::RelExpression& rel, const binder::NodeExpression& boundNode); + double getExtensionRate(const binder::RelExpression& rel, + const binder::NodeExpression& boundNode, transaction::Transaction* transaction); private: inline uint64_t atLeastOne(uint64_t x) { return x == 0 ? 1 : x; } @@ -40,9 +40,11 @@ class CardinalityEstimator { KU_ASSERT(nodeIDName2dom.contains(nodeIDName)); return nodeIDName2dom.at(nodeIDName); } - uint64_t getNumNodes(const std::vector& tableIDs); + uint64_t getNumNodes( + const std::vector& tableIDs, transaction::Transaction* transaction); - uint64_t getNumRels(const std::vector& tableIDs); + uint64_t getNumRels( + const std::vector& tableIDs, transaction::Transaction* transaction); private: const storage::NodesStoreStatsAndDeletedIDs* nodesStatistics; diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index 3cd39fece6c..047ef0aa694 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -32,7 +32,9 @@ struct LogicalSetPropertyInfo; class Planner { public: - Planner(catalog::Catalog* catalog, storage::StorageManager* storageManager); + // TODO(Jiamin): Remove catalog and storageManager + Planner(catalog::Catalog* catalog, storage::StorageManager* storageManager, + main::ClientContext* clientContext); DELETE_COPY_AND_MOVE(Planner); std::unique_ptr getBestPlan(const binder::BoundStatement& statement); @@ -281,6 +283,7 @@ class Planner { private: catalog::Catalog* catalog; + main::ClientContext* clientContext; storage::StorageManager* storageManager; binder::expression_vector propertiesToScan; CardinalityEstimator cardinalityEstimator; diff --git a/src/include/storage/stats/nodes_store_statistics.h b/src/include/storage/stats/nodes_store_statistics.h index 5c01b3fd901..0b4dfc60ba2 100644 --- a/src/include/storage/stats/nodes_store_statistics.h +++ b/src/include/storage/stats/nodes_store_statistics.h @@ -4,7 +4,6 @@ #include "storage/stats/node_table_statistics.h" #include "storage/stats/table_statistics_collection.h" #include "storage/storage_utils.h" -#include "transaction/transaction.h" namespace kuzu { namespace storage { @@ -27,8 +26,8 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { } inline NodeTableStatsAndDeletedIDs* getNodeStatisticsAndDeletedIDs( - common::table_id_t tableID) const { - return getNodeTableStats(transaction::TransactionType::READ_ONLY, tableID); + transaction::Transaction* transaction, common::table_id_t tableID) const { + return getNodeTableStats(transaction->getType(), tableID); } static inline void saveInitialNodesStatisticsAndDeletedIDsToFile( @@ -71,10 +70,6 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { getNodeTableStats(transaction::TransactionType::WRITE, tableID)->deleteNode(nodeOffset); } - // This function is only used by storageManager to construct relsStore during start-up, so - // we can just safely return the maxNodeOffsetPerTable for readOnlyVersion. - std::map getMaxNodeOffsetPerTable() const; - void setDeletedNodeOffsetsForMorsel(transaction::Transaction* transaction, const std::shared_ptr& nodeOffsetVector, common::table_id_t tableID); diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index d14e3814a80..6b68b9e0e47 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -150,7 +150,7 @@ std::string ClientContext::getExtensionDir() const { return common::stringFormat("{}/.kuzu/extension", config.homeDirectory); } -storage::StorageManager* ClientContext::getStorageManager() { +storage::StorageManager* ClientContext::getStorageManager() const { return database->storageManager.get(); } @@ -158,7 +158,7 @@ storage::MemoryManager* ClientContext::getMemoryManager() { return database->memoryManager.get(); } -catalog::Catalog* ClientContext::getCatalog() { +catalog::Catalog* ClientContext::getCatalog() const { return database->catalog.get(); } @@ -295,7 +295,7 @@ std::unique_ptr ClientContext::prepareNoLock( preparedStatement->statementResult = std::make_unique(boundStatement->getStatementResult()->copy()); // planning - auto planner = Planner(database->catalog.get(), database->storageManager.get()); + auto planner = Planner(database->catalog.get(), database->storageManager.get(), this); std::vector> plans; if (enumerateAllPlans) { plans = planner.getAllPlans(*boundStatement); diff --git a/src/main/storage_driver.cpp b/src/main/storage_driver.cpp index fd13a87f327..819758cd8e4 100644 --- a/src/main/storage_driver.cpp +++ b/src/main/storage_driver.cpp @@ -47,7 +47,7 @@ uint64_t StorageDriver::getNumNodes(const std::string& nodeName) { auto nodeTableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, nodeName); auto nodeStatistics = storageManager->getNodesStatisticsAndDeletedIDs()->getNodeStatisticsAndDeletedIDs( - nodeTableID); + &DUMMY_READ_TRANSACTION, nodeTableID); return nodeStatistics->getNumTuples(); } diff --git a/src/planner/join_order/cardinality_estimator.cpp b/src/planner/join_order/cardinality_estimator.cpp index d6035e22694..6f2abb5d6dd 100644 --- a/src/planner/join_order/cardinality_estimator.cpp +++ b/src/planner/join_order/cardinality_estimator.cpp @@ -6,29 +6,30 @@ using namespace kuzu::binder; using namespace kuzu::common; +using namespace kuzu::transaction; namespace kuzu { namespace planner { -void CardinalityEstimator::initNodeIDDom(const QueryGraph& queryGraph) { +void CardinalityEstimator::initNodeIDDom(const QueryGraph& queryGraph, Transaction* transaction) { for (auto i = 0u; i < queryGraph.getNumQueryNodes(); ++i) { auto node = queryGraph.getQueryNode(i).get(); - addNodeIDDom(*node->getInternalID(), node->getTableIDs()); + addNodeIDDom(*node->getInternalID(), node->getTableIDs(), transaction); } for (auto i = 0u; i < queryGraph.getNumQueryRels(); ++i) { auto rel = queryGraph.getQueryRel(i); if (QueryRelTypeUtils::isRecursive(rel->getRelType())) { auto node = rel->getRecursiveInfo()->node.get(); - addNodeIDDom(*node->getInternalID(), node->getTableIDs()); + addNodeIDDom(*node->getInternalID(), node->getTableIDs(), transaction); } } } -void CardinalityEstimator::addNodeIDDom( - const binder::Expression& nodeID, const std::vector& tableIDs) { +void CardinalityEstimator::addNodeIDDom(const binder::Expression& nodeID, + const std::vector& tableIDs, Transaction* transaction) { auto key = nodeID.getUniqueName(); if (!nodeIDName2dom.contains(key)) { - nodeIDName2dom.insert({key, getNumNodes(tableIDs)}); + nodeIDName2dom.insert({key, getNumNodes(tableIDs, transaction)}); } } @@ -102,29 +103,29 @@ uint64_t CardinalityEstimator::estimateFilter( } } -uint64_t CardinalityEstimator::getNumNodes(const std::vector& tableIDs) { +uint64_t CardinalityEstimator::getNumNodes( + const std::vector& tableIDs, Transaction* transaction) { auto numNodes = 0u; for (auto& tableID : tableIDs) { - numNodes += nodesStatistics->getNodeStatisticsAndDeletedIDs(tableID)->getNumTuples(); + numNodes += + nodesStatistics->getNodeStatisticsAndDeletedIDs(transaction, tableID)->getNumTuples(); } return atLeastOne(numNodes); } -uint64_t CardinalityEstimator::getNumRels(const std::vector& tableIDs) { +uint64_t CardinalityEstimator::getNumRels( + const std::vector& tableIDs, Transaction* transaction) { auto numRels = 0u; for (auto tableID : tableIDs) { - numRels += - relsStatistics - ->getRelStatistics(tableID, transaction::Transaction::getDummyReadOnlyTrx().get()) - ->getNumTuples(); + numRels += relsStatistics->getRelStatistics(tableID, transaction)->getNumTuples(); } return atLeastOne(numRels); } double CardinalityEstimator::getExtensionRate( - const RelExpression& rel, const NodeExpression& boundNode) { - auto numBoundNodes = (double)getNumNodes(boundNode.getTableIDs()); - auto numRels = (double)getNumRels(rel.getTableIDs()); + const RelExpression& rel, const NodeExpression& boundNode, Transaction* transaction) { + auto numBoundNodes = (double)getNumNodes(boundNode.getTableIDs(), transaction); + auto numRels = (double)getNumRels(rel.getTableIDs(), transaction); auto oneHopExtensionRate = numRels / numBoundNodes; switch (rel.getRelType()) { case QueryRelType::NON_RECURSIVE: { diff --git a/src/planner/plan/append_extend.cpp b/src/planner/plan/append_extend.cpp index 9a17a5d64e6..06b80947072 100644 --- a/src/planner/plan/append_extend.cpp +++ b/src/planner/plan/append_extend.cpp @@ -11,7 +11,6 @@ #include "planner/operator/extend/logical_recursive_extend.h" #include "planner/operator/logical_node_label_filter.h" #include "planner/planner.h" -#include "transaction/transaction.h" using namespace kuzu::common; using namespace kuzu::binder; @@ -22,7 +21,7 @@ namespace kuzu { namespace planner { static bool extendHasAtMostOneNbrGuarantee(RelExpression& rel, NodeExpression& boundNode, - ExtendDirection direction, const catalog::Catalog& catalog) { + ExtendDirection direction, const main::ClientContext& clientContext) { if (boundNode.isMultiLabeled()) { return false; } @@ -33,17 +32,19 @@ static bool extendHasAtMostOneNbrGuarantee(RelExpression& rel, NodeExpression& b return false; } auto relDirection = ExtendDirectionUtils::getRelDataDirection(direction); + auto catalog = clientContext.getCatalog(); auto relTableEntry = ku_dynamic_cast( - catalog.getTableCatalogEntry(&DUMMY_READ_TRANSACTION, rel.getSingleTableID())); + catalog->getTableCatalogEntry(clientContext.getTx(), rel.getSingleTableID())); return relTableEntry->isSingleMultiplicity(relDirection); } -static std::unordered_set getBoundNodeTableIDSet( - const RelExpression& rel, ExtendDirection extendDirection, const catalog::Catalog& catalog) { +static std::unordered_set getBoundNodeTableIDSet(const RelExpression& rel, + ExtendDirection extendDirection, const main::ClientContext& clientContext) { std::unordered_set result; + auto catalog = clientContext.getCatalog(); for (auto tableID : rel.getTableIDs()) { auto relTableEntry = ku_dynamic_cast( - catalog.getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID)); + catalog->getTableCatalogEntry(clientContext.getTx(), tableID)); switch (extendDirection) { case ExtendDirection::FWD: { result.insert(relTableEntry->getBoundTableID(RelDataDirection::FWD)); @@ -62,12 +63,13 @@ static std::unordered_set getBoundNodeTableIDSet( return result; } -static std::unordered_set getNbrNodeTableIDSet( - const RelExpression& rel, ExtendDirection extendDirection, const catalog::Catalog& catalog) { +static std::unordered_set getNbrNodeTableIDSet(const RelExpression& rel, + ExtendDirection extendDirection, const main::ClientContext& clientContext) { std::unordered_set result; + auto catalog = clientContext.getCatalog(); for (auto tableID : rel.getTableIDs()) { auto relTableEntry = ku_dynamic_cast( - catalog.getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID)); + catalog->getTableCatalogEntry(clientContext.getTx(), tableID)); switch (extendDirection) { case ExtendDirection::FWD: { result.insert(relTableEntry->getNbrTableID(RelDataDirection::FWD)); @@ -101,12 +103,13 @@ void Planner::appendNonRecursiveExtend(const std::shared_ptr& bo ExtendDirection direction, const expression_vector& properties, LogicalPlan& plan) { // Filter bound node label if we know some incoming nodes won't have any outgoing rel. This // cannot be done at binding time because the pruning is affected by extend direction. - auto boundNodeTableIDSet = getBoundNodeTableIDSet(*rel, direction, *catalog); + auto boundNodeTableIDSet = getBoundNodeTableIDSet(*rel, direction, *clientContext); if (boundNode->getNumTableIDs() > boundNodeTableIDSet.size()) { appendNodeLabelFilter(boundNode->getInternalID(), boundNodeTableIDSet, plan); } // Check for each bound node, can we extend to more than 1 nbr node. - auto hasAtMostOneNbr = extendHasAtMostOneNbrGuarantee(*rel, *boundNode, direction, *catalog); + auto hasAtMostOneNbr = + extendHasAtMostOneNbrGuarantee(*rel, *boundNode, direction, *clientContext); auto properties_ = properties; auto iri = getIRIProperty(properties); if (iri != nullptr) { @@ -123,11 +126,12 @@ void Planner::appendNonRecursiveExtend(const std::shared_ptr& bo extend->computeFactorizedSchema(); // Update cost & cardinality. Note that extend does not change cardinality. plan.setCost(CostModel::computeExtendCost(plan)); - auto extensionRate = cardinalityEstimator.getExtensionRate(*rel, *boundNode); + auto extensionRate = + cardinalityEstimator.getExtensionRate(*rel, *boundNode, clientContext->getTx()); auto group = extend->getSchema()->getGroup(nbrNode->getInternalID()); group->setMultiplier(extensionRate); plan.setLastOperator(std::move(extend)); - auto nbrNodeTableIDSet = getNbrNodeTableIDSet(*rel, direction, *catalog); + auto nbrNodeTableIDSet = getNbrNodeTableIDSet(*rel, direction, *clientContext); if (nbrNodeTableIDSet.size() > nbrNode->getNumTableIDs()) { appendNodeLabelFilter(nbrNode->getInternalID(), nbrNode->getTableIDsSet(), plan); } @@ -136,7 +140,8 @@ void Planner::appendNonRecursiveExtend(const std::shared_ptr& bo auto rdfInfo = rel->getRdfPredicateInfo(); // Append hash join for remaining properties auto tmpPlan = std::make_unique(); - cardinalityEstimator.addNodeIDDom(*rdfInfo->predicateID, rdfInfo->resourceTableIDs); + cardinalityEstimator.addNodeIDDom( + *rdfInfo->predicateID, rdfInfo->resourceTableIDs, clientContext->getTx()); appendScanInternalID(rdfInfo->predicateID, rdfInfo->resourceTableIDs, *tmpPlan); appendScanNodeProperties( rdfInfo->predicateID, rdfInfo->resourceTableIDs, expression_vector{iri}, *tmpPlan); @@ -194,10 +199,12 @@ void Planner::appendRecursiveExtend(const std::shared_ptr& bound } plan.setLastOperator(std::move(pathPropertyProbe)); // Update cost - auto extensionRate = cardinalityEstimator.getExtensionRate(*rel, *boundNode); + auto extensionRate = + cardinalityEstimator.getExtensionRate(*rel, *boundNode, clientContext->getTx()); plan.setCost(CostModel::computeRecursiveExtendCost(rel->getUpperBound(), extensionRate, plan)); // Update cardinality - auto hasAtMostOneNbr = extendHasAtMostOneNbrGuarantee(*rel, *boundNode, direction, *catalog); + auto hasAtMostOneNbr = + extendHasAtMostOneNbrGuarantee(*rel, *boundNode, direction, *clientContext); if (!hasAtMostOneNbr) { auto group = plan.getSchema()->getGroup(nbrNode->getInternalID()); group->setMultiplier(extensionRate); diff --git a/src/planner/plan/plan_join_order.cpp b/src/planner/plan/plan_join_order.cpp index 846f23905dd..c6e66725ed3 100644 --- a/src/planner/plan/plan_join_order.cpp +++ b/src/planner/plan/plan_join_order.cpp @@ -136,7 +136,7 @@ std::vector> Planner::enumerateQueryGraph(SubqueryT const expression_vector& correlatedExpressions, const QueryGraph& queryGraph, expression_vector& predicates) { context.init(&queryGraph, predicates); - cardinalityEstimator.initNodeIDDom(queryGraph); + cardinalityEstimator.initNodeIDDom(queryGraph, clientContext->getTx()); planBaseTableScans(subqueryType, correlatedExpressions); context.currentLevel++; while (context.currentLevel < context.maxLevel) { diff --git a/src/planner/planner.cpp b/src/planner/planner.cpp index f3c36b237be..459a0a1cbbf 100644 --- a/src/planner/planner.cpp +++ b/src/planner/planner.cpp @@ -11,7 +11,9 @@ using namespace kuzu::storage; namespace kuzu { namespace planner { -Planner::Planner(Catalog* catalog, StorageManager* storageManager) : catalog{catalog} { +Planner::Planner( + Catalog* catalog, StorageManager* storageManager, main::ClientContext* clientContext) + : catalog{catalog}, clientContext{clientContext} { auto nStats = storageManager->getNodesStatisticsAndDeletedIDs(); auto rStats = storageManager->getRelsStatistics(); cardinalityEstimator = CardinalityEstimator(nStats, rStats); diff --git a/src/processor/map/map_ddl.cpp b/src/processor/map/map_ddl.cpp index d6d1155abfd..86488617b07 100644 --- a/src/processor/map/map_ddl.cpp +++ b/src/processor/map/map_ddl.cpp @@ -12,7 +12,6 @@ #include "processor/operator/ddl/rename_property.h" #include "processor/operator/ddl/rename_table.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -116,8 +115,7 @@ std::unique_ptr PlanMapper::mapAddProperty(LogicalOperator* lo auto extraInfo = reinterpret_cast(info->extraInfo.get()); auto expressionEvaluator = ExpressionMapper::getEvaluator(extraInfo->defaultValue, alter->getSchema()); - auto tableSchema = - catalog->getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, info->tableID); + auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), info->tableID); switch (tableSchema->getTableType()) { case TableType::NODE: return std::make_unique(catalog, info->tableID, extraInfo->propertyName, diff --git a/src/processor/map/map_delete.cpp b/src/processor/map/map_delete.cpp index 42db1351a21..be19146804c 100644 --- a/src/processor/map/map_delete.cpp +++ b/src/processor/map/map_delete.cpp @@ -1,7 +1,6 @@ #include "planner/operator/persistent/logical_delete.h" #include "processor/operator/persistent/delete.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::catalog; @@ -12,28 +11,29 @@ using namespace kuzu::storage; namespace kuzu { namespace processor { -static std::unique_ptr getNodeDeleteExecutor(Catalog* catalog, - StorageManager& storageManager, LogicalDeleteNodeInfo* info, const Schema& inSchema) { +static std::unique_ptr getNodeDeleteExecutor( + LogicalDeleteNodeInfo* info, const Schema& inSchema, main::ClientContext* clientContext) { auto nodeIDPos = DataPos(inSchema.getExpressionPos(*info->node->getInternalID())); + auto storageManager = clientContext->getStorageManager(); + auto catalog = clientContext->getCatalog(); if (info->node->isMultiLabeled()) { std::unordered_map tableIDToTableMap; std::unordered_map> tableIDToFwdRelTablesMap; std::unordered_map> tableIDToBwdRelTablesMap; for (auto tableID : info->node->getTableIDs()) { - auto tableEntry = - catalog->getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, tableID); + auto tableEntry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); auto nodeTableEntry = ku_dynamic_cast(tableEntry); - auto table = storageManager.getNodeTable(tableID); + auto table = storageManager->getNodeTable(tableID); auto fwdRelTableIDs = nodeTableEntry->getFwdRelTableIDSet(); auto bwdRelTableIDs = nodeTableEntry->getBwdRelTableIDSet(); std::unordered_set fwdRelTables; std::unordered_set bwdRelTables; for (auto relTableID : fwdRelTableIDs) { - fwdRelTables.insert(storageManager.getRelTable(relTableID)); + fwdRelTables.insert(storageManager->getRelTable(relTableID)); } for (auto relTableID : bwdRelTableIDs) { - bwdRelTables.insert(storageManager.getRelTable(relTableID)); + bwdRelTables.insert(storageManager->getRelTable(relTableID)); } tableIDToTableMap.insert({tableID, table}); tableIDToFwdRelTablesMap[tableID] = fwdRelTables; @@ -43,9 +43,9 @@ static std::unique_ptr getNodeDeleteExecutor(Catalog* catalo std::move(tableIDToFwdRelTablesMap), std::move(tableIDToBwdRelTablesMap), info->deleteType, nodeIDPos); } else { - auto table = storageManager.getNodeTable(info->node->getSingleTableID()); - auto tableEntry = catalog->getTableCatalogEntry( - &transaction::DUMMY_READ_TRANSACTION, info->node->getSingleTableID()); + auto table = storageManager->getNodeTable(info->node->getSingleTableID()); + auto tableEntry = + catalog->getTableCatalogEntry(clientContext->getTx(), info->node->getSingleTableID()); auto nodeTableEntry = ku_dynamic_cast(tableEntry); auto fwdRelTableIDs = nodeTableEntry->getFwdRelTableIDSet(); @@ -53,10 +53,10 @@ static std::unique_ptr getNodeDeleteExecutor(Catalog* catalo std::unordered_set fwdRelTables; std::unordered_set bwdRelTables; for (auto tableID : fwdRelTableIDs) { - fwdRelTables.insert(storageManager.getRelTable(tableID)); + fwdRelTables.insert(storageManager->getRelTable(tableID)); } for (auto tableID : bwdRelTableIDs) { - bwdRelTables.insert(storageManager.getRelTable(tableID)); + bwdRelTables.insert(storageManager->getRelTable(tableID)); } return std::make_unique( table, std::move(fwdRelTables), std::move(bwdRelTables), info->deleteType, nodeIDPos); @@ -69,7 +69,7 @@ std::unique_ptr PlanMapper::mapDeleteNode(LogicalOperator* log auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); std::vector> executors; for (auto deleteInfo : logicalDeleteNode->getInfos()) { - executors.push_back(getNodeDeleteExecutor(catalog, storageManager, deleteInfo, *inSchema)); + executors.push_back(getNodeDeleteExecutor(deleteInfo, *inSchema, clientContext)); } return std::make_unique(std::move(executors), std::move(prevOperator), getOperatorID(), logicalDeleteNode->getExpressionsForPrinting()); diff --git a/src/processor/map/map_extend.cpp b/src/processor/map/map_extend.cpp index e95fab1af13..93422aadf40 100644 --- a/src/processor/map/map_extend.cpp +++ b/src/processor/map/map_extend.cpp @@ -3,7 +3,6 @@ #include "processor/operator/scan/scan_multi_rel_tables.h" #include "processor/operator/scan/scan_rel_table.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -15,10 +14,10 @@ namespace kuzu { namespace processor { static std::unique_ptr getRelTableScanInfo(TableCatalogEntry* tableCatalogEntry, - RelDataDirection direction, StorageManager& storageManager, + RelDataDirection direction, StorageManager* storageManager, const expression_vector& properties) { auto relTableID = tableCatalogEntry->getTableID(); - auto relTable = storageManager.getRelTable(relTableID); + auto relTable = storageManager->getRelTable(relTableID); std::vector columnIDs; for (auto& property : properties) { auto propertyExpression = ku_dynamic_cast(property.get()); @@ -32,11 +31,13 @@ static std::unique_ptr getRelTableScanInfo(TableCatalogEntry* static std::unique_ptr populateRelTableCollectionScanner( table_id_t boundNodeTableID, const RelExpression& rel, ExtendDirection extendDirection, - const expression_vector& properties, StorageManager& storageManager, const Catalog& catalog) { + const expression_vector& properties, const main::ClientContext& clientContext) { std::vector> scanInfos; + auto catalog = clientContext.getCatalog(); + auto storageManager = clientContext.getStorageManager(); for (auto relTableID : rel.getTableIDs()) { auto relTableEntry = ku_dynamic_cast( - catalog.getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, relTableID)); + catalog->getTableCatalogEntry(clientContext.getTx(), relTableID)); switch (extendDirection) { case ExtendDirection::FWD: { if (relTableEntry->getBoundTableID(RelDataDirection::FWD) == boundNodeTableID) { @@ -101,18 +102,17 @@ std::unique_ptr PlanMapper::mapExtend(LogicalOperator* logical if (!rel->isMultiLabeled() && !boundNode->isMultiLabeled() && extendDirection != ExtendDirection::BOTH) { auto relTableEntry = ku_dynamic_cast( - catalog->getTableCatalogEntry( - &transaction::DUMMY_READ_TRANSACTION, rel->getSingleTableID())); + catalog->getTableCatalogEntry(clientContext->getTx(), rel->getSingleTableID())); auto relDataDirection = ExtendDirectionUtils::getRelDataDirection(extendDirection); auto scanInfo = getRelTableScanInfo( - relTableEntry, relDataDirection, storageManager, extend->getProperties()); + relTableEntry, relDataDirection, &storageManager, extend->getProperties()); return std::make_unique(std::move(scanInfo), inNodeVectorPos, outVectorsPos, std::move(prevOperator), getOperatorID(), extend->getExpressionsForPrinting()); } else { // map to generic extend std::unordered_map> scanners; for (auto boundNodeTableID : boundNode->getTableIDs()) { - auto scanner = populateRelTableCollectionScanner(boundNodeTableID, *rel, - extendDirection, extend->getProperties(), storageManager, *catalog); + auto scanner = populateRelTableCollectionScanner( + boundNodeTableID, *rel, extendDirection, extend->getProperties(), *clientContext); if (scanner != nullptr) { scanners.insert({boundNodeTableID, std::move(scanner)}); } diff --git a/src/processor/map/map_insert.cpp b/src/processor/map/map_insert.cpp index b63a37feaf0..d778eb402f0 100644 --- a/src/processor/map/map_insert.cpp +++ b/src/processor/map/map_insert.cpp @@ -3,7 +3,6 @@ #include "planner/operator/persistent/logical_insert.h" #include "processor/operator/persistent/insert.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::evaluator; using namespace kuzu::planner; @@ -35,8 +34,7 @@ std::unique_ptr PlanMapper::getNodeInsertExecutor( auto table = storageManager.getNodeTable(nodeTableID); std::unordered_set fwdRelTablesToInit; std::unordered_set bwdRelTablesToInit; - auto tableCatalogEntry = - catalog->getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, nodeTableID); + auto tableCatalogEntry = catalog->getTableCatalogEntry(clientContext->getTx(), nodeTableID); auto nodeTableSchema = ku_dynamic_cast(tableCatalogEntry); auto fwdRelTableIDs = nodeTableSchema->getFwdRelTableIDSet(); diff --git a/src/processor/map/map_recursive_extend.cpp b/src/processor/map/map_recursive_extend.cpp index 4f14e3b5253..803ca6a4f3b 100644 --- a/src/processor/map/map_recursive_extend.cpp +++ b/src/processor/map/map_recursive_extend.cpp @@ -1,7 +1,6 @@ #include "planner/operator/extend/logical_recursive_extend.h" #include "processor/operator/recursive_extend/recursive_join.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::planner; @@ -49,7 +48,7 @@ std::unique_ptr PlanMapper::mapRecursiveExtend( pathPos = DataPos(outSchema->getExpressionPos(*rel)); } std::unordered_map tableIDToName; - for (auto& entry : catalog->getTableEntries(&transaction::DUMMY_READ_TRANSACTION)) { + for (auto& entry : catalog->getTableEntries(clientContext->getTx())) { tableIDToName.insert({entry->getTableID(), entry->getName()}); } auto dataInfo = std::make_unique(boundNodeIDPos, nbrNodeIDPos, diff --git a/src/processor/map/map_scan_node_property.cpp b/src/processor/map/map_scan_node_property.cpp index 238e0999125..046acef262d 100644 --- a/src/processor/map/map_scan_node_property.cpp +++ b/src/processor/map/map_scan_node_property.cpp @@ -2,7 +2,6 @@ #include "planner/operator/scan/logical_scan_node_property.h" #include "processor/operator/scan/scan_multi_node_tables.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -32,9 +31,8 @@ std::unique_ptr PlanMapper::mapScanNodeProperty( if (!property->hasPropertyID(tableID)) { columns.push_back(UINT32_MAX); } else { - columns.push_back( - catalog->getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, tableID) - ->getColumnID(property->getPropertyID(tableID))); + columns.push_back(catalog->getTableCatalogEntry(clientContext->getTx(), tableID) + ->getColumnID(property->getPropertyID(tableID))); } } tables.insert({tableID, std::make_unique( @@ -45,8 +43,7 @@ std::unique_ptr PlanMapper::mapScanNodeProperty( scanProperty.getExpressionsForPrinting()); } else { auto tableID = tableIDs[0]; - auto tableSchema = - catalog->getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, tableID); + auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); std::vector columnIDs; for (auto& expression : scanProperty.getProperties()) { auto property = static_pointer_cast(expression); diff --git a/src/processor/map/map_set.cpp b/src/processor/map/map_set.cpp index 722c0d84c34..d919577c396 100644 --- a/src/processor/map/map_set.cpp +++ b/src/processor/map/map_set.cpp @@ -3,7 +3,6 @@ #include "planner/operator/persistent/logical_set.h" #include "processor/operator/persistent/set.h" #include "processor/plan_mapper.h" -#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -32,7 +31,7 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( } auto propertyID = property->getPropertyID(tableID); auto table = storageManager.getNodeTable(tableID); - auto columnID = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID) + auto columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); tableIDToSetInfo.insert({tableID, NodeSetInfo{table, columnID}}); } @@ -44,7 +43,7 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( auto columnID = INVALID_COLUMN_ID; if (property->hasPropertyID(tableID)) { auto propertyID = property->getPropertyID(tableID); - columnID = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID) + columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); } return std::make_unique( @@ -85,7 +84,7 @@ std::unique_ptr PlanMapper::getRelSetExecutor( } auto table = storageManager.getRelTable(tableID); auto propertyID = property->getPropertyID(tableID); - auto columnID = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID) + auto columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); tableIDToTableAndColumnID.insert({tableID, std::make_pair(table, columnID)}); } @@ -97,7 +96,7 @@ std::unique_ptr PlanMapper::getRelSetExecutor( auto columnID = common::INVALID_COLUMN_ID; if (property->hasPropertyID(tableID)) { auto propertyID = property->getPropertyID(tableID); - columnID = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID) + columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); } return std::make_unique( diff --git a/src/storage/stats/nodes_store_statistics.cpp b/src/storage/stats/nodes_store_statistics.cpp index 1a96ad360f2..e1d791a7714 100644 --- a/src/storage/stats/nodes_store_statistics.cpp +++ b/src/storage/stats/nodes_store_statistics.cpp @@ -9,25 +9,16 @@ offset_t NodesStoreStatsAndDeletedIDs::getMaxNodeOffset( transaction::Transaction* transaction, table_id_t tableID) { KU_ASSERT(transaction); if (transaction->getType() == transaction::TransactionType::READ_ONLY) { - return getNodeStatisticsAndDeletedIDs(tableID)->getMaxNodeOffset(); + return getNodeStatisticsAndDeletedIDs(transaction, tableID)->getMaxNodeOffset(); } else { std::unique_lock xLck{mtx}; return readWriteVersion == nullptr ? - getNodeStatisticsAndDeletedIDs(tableID)->getMaxNodeOffset() : + getNodeStatisticsAndDeletedIDs(transaction, tableID)->getMaxNodeOffset() : getNodeTableStats(transaction::TransactionType::WRITE, tableID) ->getMaxNodeOffset(); } } -std::map NodesStoreStatsAndDeletedIDs::getMaxNodeOffsetPerTable() const { - std::map retVal; - for (auto& tableIDStatistics : readOnlyVersion->tableStatisticPerTable) { - retVal[tableIDStatistics.first] = - getNodeStatisticsAndDeletedIDs(tableIDStatistics.first)->getMaxNodeOffset(); - } - return retVal; -} - void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( transaction::Transaction* transaction, const std::shared_ptr& nodeOffsetVector, table_id_t tableID) { @@ -41,7 +32,8 @@ void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( // pipeline that performs an add/delete node. lock_t lck{mtx}; (transaction->isReadOnly() || readWriteVersion == nullptr) ? - getNodeStatisticsAndDeletedIDs(tableID)->setDeletedNodeOffsetsForMorsel(nodeOffsetVector) : + getNodeStatisticsAndDeletedIDs(transaction, tableID) + ->setDeletedNodeOffsetsForMorsel(nodeOffsetVector) : ((NodeTableStatsAndDeletedIDs*)readWriteVersion->tableStatisticPerTable[tableID].get()) ->setDeletedNodeOffsetsForMorsel(nodeOffsetVector); } diff --git a/test/graph_test/graph_test.cpp b/test/graph_test/graph_test.cpp index 7f389184555..bcf635c68d5 100644 --- a/test/graph_test/graph_test.cpp +++ b/test/graph_test/graph_test.cpp @@ -26,7 +26,7 @@ void PrivateGraphTest::validateQueryBestPlanJoinOrder( ASSERT_EQ(statement.size(), 1); auto parsedQuery = (parser::RegularQuery*)statement[0].get(); auto boundQuery = Binder(conn->clientContext.get()).bind(*parsedQuery); - auto planner = Planner(catalog, getStorageManager(*database)); + auto planner = Planner(catalog, getStorageManager(*database), conn->clientContext.get()); auto plan = planner.getBestPlan(*boundQuery); ASSERT_STREQ(LogicalPlanUtil::encodeJoin(*plan).c_str(), expectedJoinOrder.c_str()); } From 9247fd29c827404d21018523ed7cc4bb4ec82a3d Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Fri, 22 Mar 2024 17:22:12 -0400 Subject: [PATCH 078/136] fix import database path (#3063) fix import database path --- src/binder/bind/bind_import_database.cpp | 29 ++++++++++++++++--- .../node_table_catalog_entry.cpp | 9 ++---- .../catalog_entry/rel_table_catalog_entry.cpp | 12 ++++---- src/catalog/property.cpp | 5 ++-- src/function/scalar_macro_function.cpp | 9 ++---- src/include/catalog/property.h | 3 +- .../common/copier_config/csv_reader_config.h | 15 +++------- .../operator/persistent/export_db.cpp | 6 ++-- 8 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/binder/bind/bind_import_database.cpp b/src/binder/bind/bind_import_database.cpp index f6bc6ce8d6d..f8038c55476 100644 --- a/src/binder/bind/bind_import_database.cpp +++ b/src/binder/bind/bind_import_database.cpp @@ -2,8 +2,11 @@ #include "binder/binder.h" #include "binder/copy/bound_import_database.h" +#include "common/copier_config/csv_reader_config.h" #include "common/exception/binder.h" #include "common/file_system/virtual_file_system.h" +#include "parser/copy.h" +#include "parser/parser.h" #include "parser/port_db.h" using namespace kuzu::common; @@ -12,7 +15,7 @@ using namespace kuzu::parser; namespace kuzu { namespace binder { -std::string getFilePath( +static std::string getQueryFromFile( common::VirtualFileSystem* vfs, const std::string boundFilePath, const std::string fileName) { auto filePath = vfs->joinPath(boundFilePath, fileName); if (!vfs->fileOrPathExists(filePath)) { @@ -37,9 +40,27 @@ std::unique_ptr Binder::bindImportDatabaseClause(const Statement throw BinderException(stringFormat("Directory {} does not exist.", boundFilePath)); } std::string finalQueryStatements; - finalQueryStatements += getFilePath(fs, boundFilePath, ImportDBConstants::SCHEMA_NAME); - finalQueryStatements += getFilePath(fs, boundFilePath, ImportDBConstants::COPY_NAME); - finalQueryStatements += getFilePath(fs, boundFilePath, ImportDBConstants::MACRO_NAME); + finalQueryStatements += getQueryFromFile(fs, boundFilePath, ImportDBConstants::SCHEMA_NAME); + // replace the path in copy from statement with the bound path + auto copyQuery = getQueryFromFile(fs, boundFilePath, ImportDBConstants::COPY_NAME); + auto parsedStatements = Parser::parseQuery(copyQuery); + for (auto& parsedStatement : parsedStatements) { + KU_ASSERT(parsedStatement->getStatementType() == StatementType::COPY_FROM); + auto copyFromStatement = + ku_dynamic_cast(parsedStatement.get()); + KU_ASSERT(copyFromStatement->getSource()->type == common::ScanSourceType::FILE); + auto filePaths = ku_dynamic_cast( + copyFromStatement->getSource()) + ->filePaths; + KU_ASSERT(filePaths.size() == 1); + auto copyFilePath = boundFilePath + "/" + filePaths[0]; + auto csvConfig = CSVReaderConfig::construct( + bindParsingOptions(copyFromStatement->getParsingOptionsRef())); + auto csvQuery = stringFormat("COPY {} FROM \"{}\" {};", copyFromStatement->getTableName(), + copyFilePath, csvConfig.option.toCypher()); + finalQueryStatements += csvQuery; + } + finalQueryStatements += getQueryFromFile(fs, boundFilePath, ImportDBConstants::MACRO_NAME); return std::make_unique(boundFilePath, finalQueryStatements); } } // namespace binder diff --git a/src/catalog/catalog_entry/node_table_catalog_entry.cpp b/src/catalog/catalog_entry/node_table_catalog_entry.cpp index 451bcb128e4..296838dae03 100644 --- a/src/catalog/catalog_entry/node_table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/node_table_catalog_entry.cpp @@ -1,7 +1,5 @@ #include "catalog/catalog_entry/node_table_catalog_entry.h" -#include - namespace kuzu { namespace catalog { @@ -44,11 +42,8 @@ std::unique_ptr NodeTableCatalogEntry::copy() const { } std::string NodeTableCatalogEntry::toCypher(main::ClientContext* /*clientContext*/) const { - std::stringstream ss; - ss << "CREATE NODE TABLE " << getName() << "("; - Property::toCypher(getPropertiesRef(), ss); - ss << " PRIMARY KEY(" << getPrimaryKey()->getName() << "));"; - return ss.str(); + return common::stringFormat("CREATE NODE TABLE {} ({} PRIMARY KEY({}));", getName(), + Property::toCypher(getPropertiesRef()), getPrimaryKey()->getName()); } } // namespace catalog diff --git a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp index a1198605295..b08a91c780a 100644 --- a/src/catalog/catalog_entry/rel_table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/rel_table_catalog_entry.cpp @@ -83,12 +83,12 @@ std::string RelTableCatalogEntry::toCypher(main::ClientContext* clientContext) c auto catalog = clientContext->getCatalog(); auto srcTableName = catalog->getTableName(clientContext->getTx(), srcTableID); auto dstTableName = catalog->getTableName(clientContext->getTx(), dstTableID); - ss << "CREATE REL TABLE " << getName() << "( FROM " << srcTableName << " TO " << dstTableName - << ", "; - Property::toCypher(getPropertiesRef(), ss); - auto srcMultiStr = srcMultiplicity == RelMultiplicity::MANY ? "MANY" : "ONE"; - auto dstMultiStr = dstMultiplicity == RelMultiplicity::MANY ? "MANY" : "ONE"; - ss << srcMultiStr << "_" << dstMultiStr << ");"; + auto srcMultiStr = srcMultiplicity == common::RelMultiplicity::MANY ? "MANY" : "ONE"; + auto dstMultiStr = dstMultiplicity == common::RelMultiplicity::MANY ? "MANY" : "ONE"; + std::string tableInfo = + stringFormat("CREATE REL TABLE {} (FROM {} TO {}, ", getName(), srcTableName, dstTableName); + ss << tableInfo << Property::toCypher(getPropertiesRef()) << srcMultiStr << "_" << dstMultiStr + << ");"; return ss.str(); } diff --git a/src/catalog/property.cpp b/src/catalog/property.cpp index 2dabd86f2f1..f3da2ab0c88 100644 --- a/src/catalog/property.cpp +++ b/src/catalog/property.cpp @@ -29,8 +29,8 @@ Property Property::deserialize(Deserializer& deserializer) { return Property(name, std::move(dataType), propertyID, tableID); } -void Property::toCypher( - const std::vector& properties, std::stringstream& ss) { +std::string Property::toCypher(const std::vector& properties) { + std::stringstream ss; for (auto& prop : properties) { if (prop.getDataType()->getPhysicalType() == PhysicalTypeID::INTERNAL_ID) { continue; @@ -42,6 +42,7 @@ void Property::toCypher( } ss << prop.getName() << " " << propStr << ","; } + return ss.str(); } } // namespace catalog diff --git a/src/function/scalar_macro_function.cpp b/src/function/scalar_macro_function.cpp index 61f82d62318..b2fed1e81bf 100644 --- a/src/function/scalar_macro_function.cpp +++ b/src/function/scalar_macro_function.cpp @@ -1,9 +1,8 @@ #include "function/scalar_macro_function.h" -#include - #include "common/serializer/deserializer.h" #include "common/serializer/serializer.h" +#include "common/string_format.h" #include "common/string_utils.h" using namespace kuzu::common; @@ -59,7 +58,6 @@ std::unique_ptr ScalarMacroFunction::deserialize(Deserializ } std::string ScalarMacroFunction::toCypher(const std::string& name) const { - std::stringstream ss; std::vector paramStrings; for (auto& param : positionalArgs) { paramStrings.push_back(param); @@ -67,9 +65,8 @@ std::string ScalarMacroFunction::toCypher(const std::string& name) const { for (auto& defaultParam : defaultArgs) { paramStrings.push_back(defaultParam.first + ":=" + defaultParam.second->toString()); } - ss << "CREATE MACRO " << name << "(" << StringUtils::join(paramStrings, ",") << ") AS " - << expression->toString(); - return ss.str(); + return stringFormat("CREATE MACRO {} ({}) AS {}", name, StringUtils::join(paramStrings, ","), + expression->toString()); } } // namespace function } // namespace kuzu diff --git a/src/include/catalog/property.h b/src/include/catalog/property.h index 5ed9ef52c7d..4a92105fb3b 100644 --- a/src/include/catalog/property.h +++ b/src/include/catalog/property.h @@ -35,8 +35,7 @@ class Property { void serialize(common::Serializer& serializer) const; static Property deserialize(common::Deserializer& deserializer); - static void toCypher( - const std::vector& properties, std::stringstream& ss); + static std::string toCypher(const std::vector& properties); private: Property(const Property& other) diff --git a/src/include/common/copier_config/csv_reader_config.h b/src/include/common/copier_config/csv_reader_config.h index 29496b212c4..60c34b2331d 100644 --- a/src/include/common/copier_config/csv_reader_config.h +++ b/src/include/common/copier_config/csv_reader_config.h @@ -1,7 +1,5 @@ #pragma once -#include - #include "common/constants.h" #include "common/copy_constructors.h" #include "common/types/value/value.h" @@ -23,16 +21,11 @@ struct CSVOption { hasHeader{CopyConstants::DEFAULT_CSV_HAS_HEADER} {} EXPLICIT_COPY_DEFAULT_MOVE(CSVOption); + // TODO: COPY FROM and COPY TO should support transform special options, like '\'. std::string toCypher() const { - std::stringstream ss; - ss << " (escape = '\\" << escapeChar << "' , delim = '" << delimiter << "' , quote = '\\" - << quoteChar << "', header="; - if (hasHeader) { - ss << "true);"; - } else { - ss << "false);"; - } - return ss.str(); + std::string header = hasHeader ? "true" : "false"; + return stringFormat("(escape ='\\{}', delim ='{}', quote='\\{}', header={})", escapeChar, + delimiter, quoteChar, header); } private: diff --git a/src/processor/operator/persistent/export_db.cpp b/src/processor/operator/persistent/export_db.cpp index 2a3c4a5dcc8..17a513a2c80 100644 --- a/src/processor/operator/persistent/export_db.cpp +++ b/src/processor/operator/persistent/export_db.cpp @@ -29,13 +29,11 @@ static void writeStringStreamToFile( static void writeCopyStatement( stringstream& ss, std::string tableName, ReaderConfig* boundFileInfo) { - ss << "COPY "; - ss << tableName << " FROM \"" << boundFileInfo->filePaths[0] << "/" << tableName; auto fileTypeStr = FileTypeUtils::toString(boundFileInfo->fileType); StringUtils::toLower(fileTypeStr); - ss << "." << fileTypeStr; auto csvConfig = common::CSVReaderConfig::construct(boundFileInfo->options); - ss << "\"" << csvConfig.option.toCypher() << std::endl; + ss << stringFormat("COPY {} FROM \"{}.{}\" {};\n", tableName, tableName, fileTypeStr, + csvConfig.option.toCypher()); } std::string getSchemaCypher(main::ClientContext* clientContext, transaction::Transaction* tx) { From f9bc0c6d6fe1510633cfce63d34cf90895a1c551 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Sat, 23 Mar 2024 12:24:16 +0800 Subject: [PATCH 079/136] enable compression for INTERNAL_ID (#3116) --- src/include/storage/compression/compression.h | 1 + src/include/storage/store/column.h | 2 +- src/processor/map/map_copy_from.cpp | 6 +-- src/processor/operator/partitioner.cpp | 6 +-- .../operator/persistent/rel_batch_insert.cpp | 4 +- src/storage/compression/compression.cpp | 15 ++++++-- src/storage/store/column.cpp | 6 +-- src/storage/store/column_chunk.cpp | 37 +++++++++++++++---- src/storage/store/string_column_chunk.cpp | 2 +- src/storage/store/struct_column_chunk.cpp | 3 +- src/storage/store/var_list_column_chunk.cpp | 2 +- 11 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/include/storage/compression/compression.h b/src/include/storage/compression/compression.h index 56dd94c37e5..915135e912f 100644 --- a/src/include/storage/compression/compression.h +++ b/src/include/storage/compression/compression.h @@ -19,6 +19,7 @@ struct PageCursor; // Returns the size of the data type in bytes uint32_t getDataTypeSizeInChunk(const common::LogicalType& dataType); +uint32_t getDataTypeSizeInChunk(const common::PhysicalTypeID& dataType); // Compression type is written to the data header both so we can usually catch issues when we // decompress uncompressed data by mistake, and to allow for runtime-configurable compression. diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index a1f23cd0bbb..0683d1308d2 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -224,7 +224,7 @@ class InternalIDColumn : public Column { public: InternalIDColumn(std::string name, const MetadataDAHInfo& metaDAHeaderInfo, BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, - transaction::Transaction* transaction, RWPropertyStats stats); + transaction::Transaction* transaction, RWPropertyStats stats, bool enableCompression); inline void scan(transaction::Transaction* transaction, common::ValueVector* nodeIDVector, common::ValueVector* resultVector) override { diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index 7376f6ab5b0..a2682063503 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -60,9 +60,9 @@ static void getRelColumnNamesInCopyOrder(TableCatalogEntry* tableEntry, columnNames.emplace_back(InternalKeyword::SRC_OFFSET); columnNames.emplace_back(InternalKeyword::DST_OFFSET); columnNames.emplace_back(InternalKeyword::ROW_OFFSET); - columnTypes.emplace_back(LogicalType(LogicalTypeID::INT64)); - columnTypes.emplace_back(LogicalType(LogicalTypeID::INT64)); - columnTypes.emplace_back(LogicalType(LogicalTypeID::INT64)); + columnTypes.emplace_back(LogicalType(LogicalTypeID::INTERNAL_ID)); + columnTypes.emplace_back(LogicalType(LogicalTypeID::INTERNAL_ID)); + columnTypes.emplace_back(LogicalType(LogicalTypeID::INTERNAL_ID)); auto& properties = tableEntry->getPropertiesRef(); for (auto i = 1u; i < properties.size(); ++i) { // skip internal ID columnNames.push_back(properties[i].getName()); diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 868480410ee..51a38c4817f 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -166,9 +166,9 @@ void Partitioner::copyDataToPartitions(partition_idx_t partitioningIdx, DataChun partition.chunks.emplace_back(); partition.chunks.back().reserve(chunkToCopyFrom.getNumValueVectors()); for (auto j = 0u; j < chunkToCopyFrom.getNumValueVectors(); j++) { - partition.chunks.back().emplace_back(ColumnChunkFactory::createColumnChunk( - chunkToCopyFrom.getValueVector(j)->dataType, false /*enableCompression*/, - Partitioner::CHUNK_SIZE)); + partition.chunks.back().emplace_back( + ColumnChunkFactory::createColumnChunk(infos[partitioningIdx]->columnTypes[j], + false /*enableCompression*/, Partitioner::CHUNK_SIZE)); } } KU_ASSERT(partition.chunks.back().size() == chunkToCopyFrom.getNumValueVectors()); diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index f96d4bcd85d..9473ef2052b 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -136,7 +136,7 @@ std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(ChunkedC } void RelBatchInsert::setOffsetToWithinNodeGroup(ColumnChunk& chunk, offset_t startOffset) { - KU_ASSERT(chunk.getDataType().getPhysicalType() == PhysicalTypeID::INT64); + KU_ASSERT(chunk.getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); auto offsets = (offset_t*)chunk.getData(); for (auto i = 0u; i < chunk.getNumValues(); i++) { offsets[i] -= startOffset; @@ -145,7 +145,7 @@ void RelBatchInsert::setOffsetToWithinNodeGroup(ColumnChunk& chunk, offset_t sta void RelBatchInsert::setOffsetFromCSROffsets( ColumnChunk* nodeOffsetChunk, ColumnChunk* csrOffsetChunk) { - KU_ASSERT(nodeOffsetChunk->getDataType().getPhysicalType() == PhysicalTypeID::INT64); + KU_ASSERT(nodeOffsetChunk->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); for (auto i = 0u; i < nodeOffsetChunk->getNumValues(); i++) { auto nodeOffset = nodeOffsetChunk->getValue(i); auto csrOffset = csrOffsetChunk->getValue(nodeOffset); diff --git a/src/storage/compression/compression.cpp b/src/storage/compression/compression.cpp index 63beec19171..4b2952320b4 100644 --- a/src/storage/compression/compression.cpp +++ b/src/storage/compression/compression.cpp @@ -22,7 +22,11 @@ uint32_t getDataTypeSizeInChunk(const common::LogicalType& dataType) { if (dataType.getLogicalTypeID() == LogicalTypeID::SERIAL) { return 0; } - switch (dataType.getPhysicalType()) { + return getDataTypeSizeInChunk(dataType.getPhysicalType()); +} + +uint32_t getDataTypeSizeInChunk(const common::PhysicalTypeID& dataType) { + switch (dataType) { case PhysicalTypeID::STRUCT: { return 0; } @@ -34,7 +38,7 @@ uint32_t getDataTypeSizeInChunk(const common::LogicalType& dataType) { return sizeof(offset_t); } default: { - auto size = StorageUtils::getDataTypeSize(dataType); + auto size = PhysicalTypeUtils::getFixedTypeSize(dataType); KU_ASSERT(size <= BufferPoolConstants::PAGE_4KB_SIZE); return size; } @@ -66,7 +70,7 @@ bool CompressionMetadata::canUpdateInPlace( switch (compression) { case CompressionType::CONSTANT: { // Value can be updated in place only if it is identical to the value already stored. - auto size = PhysicalTypeUtils::getFixedTypeSize(physicalType); + auto size = getDataTypeSizeInChunk(physicalType); return memcmp(data + pos * size, this->data.data(), size) == 0; } case CompressionType::BOOLEAN_BITPACKING: @@ -95,6 +99,7 @@ bool CompressionMetadata::canUpdateInPlace( return IntegerBitpacking::canUpdateInPlace( value, BitpackHeader::readHeader(this->data)); } + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: { auto value = reinterpret_cast(data)[pos]; @@ -150,6 +155,7 @@ uint64_t CompressionMetadata::numValues(uint64_t pageSize, const LogicalType& da return IntegerBitpacking::numValues(pageSize, BitpackHeader::readHeader(data)); case PhysicalTypeID::INT8: return IntegerBitpacking::numValues(pageSize, BitpackHeader::readHeader(data)); + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: return IntegerBitpacking::numValues( @@ -629,6 +635,7 @@ void ReadCompressedValuesFromPageToVector::operator()(const uint8_t* frame, Page return IntegerBitpacking().decompressFromPage(frame, pageCursor.elemPosInPage, resultVector->getData(), posInVector, numValuesToRead, metadata); } + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: { return IntegerBitpacking().decompressFromPage(frame, pageCursor.elemPosInPage, @@ -689,6 +696,7 @@ void ReadCompressedValuesFromPage::operator()(const uint8_t* frame, PageCursor& return IntegerBitpacking().decompressFromPage(frame, pageCursor.elemPosInPage, result, startPosInResult, numValuesToRead, metadata); } + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: { return IntegerBitpacking().decompressFromPage(frame, pageCursor.elemPosInPage, @@ -750,6 +758,7 @@ void WriteCompressedValuesToPage::operator()(uint8_t* frame, uint16_t posInFrame return IntegerBitpacking().setValuesFromUncompressed( data, dataOffset, frame, posInFrame, numValues, metadata); } + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: { return IntegerBitpacking().setValuesFromUncompressed( diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index b5587f7f4be..7d5a453f691 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -206,9 +206,9 @@ class SerialColumn final : public Column { InternalIDColumn::InternalIDColumn(std::string name, const MetadataDAHInfo& metaDAHeaderInfo, BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, - transaction::Transaction* transaction, RWPropertyStats stats) + transaction::Transaction* transaction, RWPropertyStats stats, bool enableCompression) : Column{name, *LogicalType::INTERNAL_ID(), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, - wal, transaction, stats, false /*enableCompression*/}, + wal, transaction, stats, enableCompression}, commonTableID{INVALID_TABLE_ID} {} void InternalIDColumn::populateCommonTableID(ValueVector* resultVector) const { @@ -914,7 +914,7 @@ std::unique_ptr ColumnFactory::createColumn(std::string name, LogicalTyp } case LogicalTypeID::INTERNAL_ID: { return std::make_unique(name, metaDAHeaderInfo, dataFH, metadataFH, - bufferManager, wal, transaction, propertyStatistics); + bufferManager, wal, transaction, propertyStatistics, enableCompression); } case LogicalTypeID::BLOB: case LogicalTypeID::STRING: { diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 2d44a553d06..ef82e5c6b12 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -125,6 +125,7 @@ static std::shared_ptr getCompression( case PhysicalTypeID::INT8: { return std::make_shared>(); } + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: { return std::make_shared>(); @@ -181,6 +182,7 @@ void ColumnChunk::initializeFunction() { case PhysicalTypeID::INT32: case PhysicalTypeID::INT16: case PhysicalTypeID::INT8: + case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::VAR_LIST: case PhysicalTypeID::UINT64: case PhysicalTypeID::UINT32: @@ -239,7 +241,7 @@ void ColumnChunk::lookup( void ColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity multiplicity) { KU_ASSERT(chunk->dataType.getPhysicalType() == dataType.getPhysicalType() && - dstOffsets->dataType.getPhysicalType() == PhysicalTypeID::INT64 && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto dstOffset = dstOffsets->getValue(i); @@ -453,7 +455,7 @@ void BoolColumnChunk::lookup( void BoolColumnChunk::write( ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL && - dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto dstOffset = dstOffsets->getValue(i); @@ -525,18 +527,28 @@ void NullColumnChunk::append( class InternalIDColumnChunk final : public ColumnChunk { public: // Physically, we only materialize offset of INTERNAL_ID, which is same as UINT64, - explicit InternalIDColumnChunk(uint64_t capacity) - : ColumnChunk(*LogicalType::INT64(), capacity, false /*enableCompression*/), + explicit InternalIDColumnChunk(uint64_t capacity, bool enableCompression) + : ColumnChunk(*LogicalType::INTERNAL_ID(), capacity, enableCompression), commonTableID{INVALID_TABLE_ID} {} void append(ValueVector* vector, common::SelectionVector& selVector) override { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); - copyVectorToBuffer(vector, numValues, selVector); + switch (vector->dataType.getPhysicalType()) { + case PhysicalTypeID::INTERNAL_ID: { + copyVectorToBuffer(vector, numValues, selVector); + } break; + case PhysicalTypeID::INT64: { + copyInt64VectorToBuffer(vector, numValues, selVector); + } break; + default: { + KU_UNREACHABLE; + } + } numValues += selVector.selectedSize; } void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk, common::SelectionVector& selVector) override { + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); auto relIDsInVector = (internalID_t*)vector->getData(); if (commonTableID == INVALID_TABLE_ID) { commonTableID = relIDsInVector[selVector.selectedPositions[0]].tableID; @@ -550,6 +562,17 @@ class InternalIDColumnChunk final : public ColumnChunk { } } + void copyInt64VectorToBuffer( + ValueVector* vector, offset_t startPosInChunk, common::SelectionVector& selVector) { + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INT64); + for (auto i = 0u; i < selVector.selectedSize; i++) { + auto pos = selVector.selectedPositions[i]; + nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); + memcpy(buffer.get() + (startPosInChunk + i) * numBytesPerValue, + &vector->getValue(pos), numBytesPerValue); + } + } + void lookup( offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const override { KU_ASSERT(offsetInChunk < capacity); @@ -609,7 +632,7 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( } // Physically, we only materialize offset of INTERNAL_ID, which is same as INT64, case PhysicalTypeID::INTERNAL_ID: { - return std::make_unique(capacity); + return std::make_unique(capacity, enableCompression); } case PhysicalTypeID::STRING: { return std::make_unique( diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index 1684460e043..d9d4f0be0d4 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -82,7 +82,7 @@ void StringColumnChunk::write( void StringColumnChunk::write( ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRING && - dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); for (auto i = 0u; i < chunk->getNumValues(); i++) { auto offsetInChunk = dstOffsets->getValue(i); diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index 7c52b7fe621..319a6ff6b43 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -94,7 +94,8 @@ void StructColumnChunk::write( void StructColumnChunk::write( ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity multiplicity) { - KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT); + KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto offsetInChunk = dstOffsets->getValue(i); KU_ASSERT(offsetInChunk < capacity); diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index e7893e31ff7..597dca2c94c 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -122,12 +122,12 @@ void VarListColumnChunk::lookup( void VarListColumnChunk::write( ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { + KU_ASSERT(dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); needFinalize = true; if (!indicesColumnChunk) { initializeIndices(); } KU_ASSERT(chunk->getDataType().getPhysicalType() == dataType.getPhysicalType() && - dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INT64 && chunk->getNumValues() == dstOffsets->getNumValues()); auto currentIndex = numValues; append(chunk, 0, chunk->getNumValues()); From e60e8cdc2ee64fa0d7ccc89575a81935acaa6354 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Sat, 23 Mar 2024 21:40:03 +0800 Subject: [PATCH 080/136] close 1646 (#3122) --- scripts/parquet/csv_to_parquet.py | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 scripts/parquet/csv_to_parquet.py diff --git a/scripts/parquet/csv_to_parquet.py b/scripts/parquet/csv_to_parquet.py deleted file mode 100644 index af3779d38be..00000000000 --- a/scripts/parquet/csv_to_parquet.py +++ /dev/null @@ -1,14 +0,0 @@ -from pyarrow import csv -import pyarrow.parquet as pq - -csv_files = ['dummy.csv'] -has_header = True -# CSV: -# has header? autogenerate_column_names=False -# no header? autogenerate_column_names=True -read_options = csv.ReadOptions(autogenerate_column_names=not has_header) -parse_options = csv.ParseOptions(delimiter=",") -for csv_file in csv_files: - table = csv.read_csv(csv_file, read_options=read_options, - parse_options=parse_options) - pq.write_table(table, csv_file.replace('.csv', '.parquet')) From 365815b7f4d11121d4cf285c2c10e403fed62e72 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Sat, 23 Mar 2024 21:40:22 +0800 Subject: [PATCH 081/136] Refactor Partitioner to use ChunkedNodeGroupCollection (#3123) --- src/include/processor/operator/partitioner.h | 21 +++----- .../operator/persistent/index_builder.h | 5 +- .../operator/persistent/node_batch_insert.h | 2 +- .../operator/persistent/rel_batch_insert.h | 20 ++++---- .../storage/local_storage/local_table.h | 16 +++--- .../{node_group.h => chunked_node_group.h} | 35 ++----------- .../store/chunked_node_group_collection.h | 40 +++++++++++++++ src/include/storage/store/column_chunk.h | 1 + src/include/storage/store/node_table.h | 2 +- src/include/storage/store/rel_table_data.h | 2 +- src/include/storage/store/table_data.h | 2 +- src/processor/operator/partitioner.cpp | 39 ++++++--------- .../operator/persistent/index_builder.cpp | 19 +++---- .../operator/persistent/node_batch_insert.cpp | 2 +- .../operator/persistent/rel_batch_insert.cpp | 50 +++++++++---------- src/storage/local_storage/local_table.cpp | 13 +++-- src/storage/store/CMakeLists.txt | 3 +- ...{node_group.cpp => chunked_node_group.cpp} | 24 +++------ .../store/chunked_node_group_collection.cpp | 50 +++++++++++++++++++ src/storage/store/node_table_data.cpp | 4 +- src/storage/store/rel_table_data.cpp | 2 +- 21 files changed, 191 insertions(+), 161 deletions(-) rename src/include/storage/store/{node_group.h => chunked_node_group.h} (76%) create mode 100644 src/include/storage/store/chunked_node_group_collection.h rename src/storage/store/{node_group.cpp => chunked_node_group.cpp} (87%) create mode 100644 src/storage/store/chunked_node_group_collection.cpp diff --git a/src/include/processor/operator/partitioner.h b/src/include/processor/operator/partitioner.h index 19a327ee33a..98173c035ba 100644 --- a/src/include/processor/operator/partitioner.h +++ b/src/include/processor/operator/partitioner.h @@ -1,7 +1,7 @@ #pragma once #include "processor/operator/sink.h" -#include "storage/store/column_chunk.h" +#include "storage/store/chunked_node_group_collection.h" namespace kuzu { namespace storage { @@ -20,14 +20,7 @@ struct PartitionerFunctions { // partitioning methods. For example, copy of rel tables require partitioning on both FWD and BWD // direction. Each partitioning method corresponds to a PartitioningState. struct PartitioningBuffer { - using ColumnChunkCollection = std::vector>; - struct Partition { - // One chunk for each column, grouped into a list - // so that groups from different threads can be quickly merged without copying - // E.g. [(a,b,c), (a,b,c)] where a is a chunk for column a, b for column b, etc. - std::vector chunks; - }; - std::vector partitions; + std::vector partitions; void merge(std::unique_ptr localPartitioningStates); }; @@ -35,6 +28,7 @@ struct PartitioningBuffer { // NOTE: Currently, Partitioner is tightly coupled with RelBatchInsert. We should generalize it // later when necessary. Here, each partition is essentially a node group. struct BatchInsertSharedState; +struct PartitioningInfo; struct PartitionerSharedState { std::mutex mtx; storage::MemoryManager* mm; @@ -51,12 +45,12 @@ struct PartitionerSharedState { explicit PartitionerSharedState(storage::MemoryManager* mm) : mm{mm} {} - void initialize(); + void initialize(std::vector>& infos); common::partition_idx_t getNextPartition(common::vector_idx_t partitioningIdx); void resetState(); void merge(std::vector> localPartitioningStates); - inline PartitioningBuffer::Partition& getPartitionBuffer( + inline storage::ChunkedNodeGroupCollection& getPartitionBuffer( common::vector_idx_t partitioningIdx, common::partition_idx_t partitionIdx) { KU_ASSERT(partitioningIdx < partitioningBuffers.size()); KU_ASSERT(partitionIdx < partitioningBuffers[partitioningIdx]->partitions.size()); @@ -107,7 +101,7 @@ class Partitioner : public Sink { std::unique_ptr clone() final; - static void initializePartitioningStates( + static void initializePartitioningStates(std::vector>& infos, std::vector>& partitioningBuffers, std::vector numPartitions); @@ -121,9 +115,6 @@ class Partitioner : public Sink { common::partition_idx_t partitioningIdx, common::DataChunk chunkToCopyFrom); private: - // Same size as a value vector. Each thread will allocate a chunk for each node group, - // so this should be kept relatively small to avoid allocating more memory than is needed - static const uint64_t CHUNK_SIZE = 2048; std::vector> infos; std::shared_ptr sharedState; std::unique_ptr localState; diff --git a/src/include/processor/operator/persistent/index_builder.h b/src/include/processor/operator/persistent/index_builder.h index 12b5c5222de..74a7eff5dbf 100644 --- a/src/include/processor/operator/persistent/index_builder.h +++ b/src/include/processor/operator/persistent/index_builder.h @@ -151,7 +151,7 @@ class IndexBuilder { IndexBuilder clone() { return IndexBuilder(sharedState); } void insert( - storage::ColumnChunk* chunk, common::offset_t nodeOffset, common::offset_t numNodes); + const storage::ColumnChunk& chunk, common::offset_t nodeOffset, common::offset_t numNodes); ProducerToken getProducerToken() const { return ProducerToken(sharedState); } @@ -159,7 +159,8 @@ class IndexBuilder { void finalize(ExecutionContext* context); private: - void checkNonNullConstraint(storage::NullColumnChunk* nullChunk, common::offset_t numNodes); + void checkNonNullConstraint( + const storage::NullColumnChunk& nullChunk, common::offset_t numNodes); std::shared_ptr sharedState; IndexBuilderLocalBuffers localBuffers; diff --git a/src/include/processor/operator/persistent/node_batch_insert.h b/src/include/processor/operator/persistent/node_batch_insert.h index bfcaea3de8c..2aaebc147d1 100644 --- a/src/include/processor/operator/persistent/node_batch_insert.h +++ b/src/include/processor/operator/persistent/node_batch_insert.h @@ -4,7 +4,7 @@ #include "processor/operator/call/in_query_call.h" #include "processor/operator/persistent/batch_insert.h" #include "processor/operator/persistent/index_builder.h" -#include "storage/store/node_group.h" +#include "storage/store/chunked_node_group.h" #include "storage/store/node_table.h" namespace kuzu { diff --git a/src/include/processor/operator/persistent/rel_batch_insert.h b/src/include/processor/operator/persistent/rel_batch_insert.h index 387bfffaed9..cc772f28794 100644 --- a/src/include/processor/operator/persistent/rel_batch_insert.h +++ b/src/include/processor/operator/persistent/rel_batch_insert.h @@ -3,8 +3,8 @@ #include "common/enums/rel_direction.h" #include "processor/operator/partitioner.h" #include "processor/operator/persistent/batch_insert.h" +#include "storage/store/chunked_node_group.h" #include "storage/store/column_chunk.h" -#include "storage/store/node_group.h" namespace kuzu { namespace processor { @@ -12,18 +12,18 @@ namespace processor { struct RelBatchInsertInfo final : public BatchInsertInfo { common::RelDataDirection direction; uint64_t partitioningIdx; - common::vector_idx_t offsetVectorIdx; + common::column_id_t offsetColumnID; std::vector columnTypes; RelBatchInsertInfo(catalog::TableCatalogEntry* tableEntry, bool compressionEnabled, common::RelDataDirection direction, uint64_t partitioningIdx, - common::vector_idx_t offsetVectorIdx, std::vector columnTypes) + common::column_id_t offsetColumnID, std::vector columnTypes) : BatchInsertInfo{tableEntry, compressionEnabled}, direction{direction}, - partitioningIdx{partitioningIdx}, offsetVectorIdx{offsetVectorIdx}, columnTypes{std::move( - columnTypes)} {} + partitioningIdx{partitioningIdx}, offsetColumnID{offsetColumnID}, columnTypes{std::move( + columnTypes)} {} RelBatchInsertInfo(const RelBatchInsertInfo& other) : BatchInsertInfo{other.tableEntry, other.compressionEnabled}, direction{other.direction}, - partitioningIdx{other.partitioningIdx}, offsetVectorIdx{other.offsetVectorIdx}, + partitioningIdx{other.partitioningIdx}, offsetColumnID{other.offsetColumnID}, columnTypes{common::LogicalType::copy(other.columnTypes)} {} inline std::unique_ptr copy() const override { @@ -60,20 +60,20 @@ class RelBatchInsert final : public BatchInsert { } private: - void prepareCSRNodeGroup(PartitioningBuffer::Partition& partition, - common::offset_t startNodeOffset, common::vector_idx_t offsetVectorIdx, + void prepareCSRNodeGroup(storage::ChunkedNodeGroupCollection& partition, + common::offset_t startNodeOffset, common::column_id_t offsetColumnID, common::offset_t numNodes); static common::length_t getGapSize(common::length_t length); static std::vector populateStartCSROffsetsAndLengths( storage::ChunkedCSRHeader& csrHeader, common::offset_t numNodes, - PartitioningBuffer::Partition& partition, common::vector_idx_t offsetVectorIdx); + storage::ChunkedNodeGroupCollection& partition, common::column_id_t offsetColumnID); static void populateEndCSROffsets( storage::ChunkedCSRHeader& csrHeader, std::vector& gaps); static void setOffsetToWithinNodeGroup( storage::ColumnChunk& chunk, common::offset_t startOffset); static void setOffsetFromCSROffsets( - storage::ColumnChunk* nodeOffsetChunk, storage::ColumnChunk* csrOffsetChunk); + storage::ColumnChunk& nodeOffsetChunk, storage::ColumnChunk& csrOffsetChunk); // We only check rel multiplcity constraint (MANY_ONE, ONE_ONE) for now. std::optional checkRelMultiplicityConstraint( diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index 6608a2641ba..0bd931a7306 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -5,7 +5,7 @@ #include "common/enums/rel_multiplicity.h" #include "common/enums/table_type.h" #include "common/vector/value_vector.h" -#include "storage/store/node_group.h" +#include "storage/store/chunked_node_group_collection.h" namespace kuzu { namespace storage { @@ -22,16 +22,14 @@ using ChunkCollection = std::vector; class LocalChunkedGroupCollection { public: - static constexpr uint64_t CHUNK_CAPACITY = 2048; - explicit LocalChunkedGroupCollection(std::vector dataTypes) - : dataTypes{std::move(dataTypes)}, numRows{0} {} + : dataTypes{std::move(dataTypes)}, chunkedGroups{this->dataTypes}, numRows{0} {} DELETE_COPY_DEFAULT_MOVE(LocalChunkedGroupCollection); static inline std::pair getChunkIdxAndOffsetInChunk( common::row_idx_t rowIdx) { - return std::make_pair(rowIdx / LocalChunkedGroupCollection::CHUNK_CAPACITY, - rowIdx % LocalChunkedGroupCollection::CHUNK_CAPACITY); + return std::make_pair(rowIdx / ChunkedNodeGroupCollection::CHUNK_CAPACITY, + rowIdx % ChunkedNodeGroupCollection::CHUNK_CAPACITY); } inline common::row_idx_t getRowIdxFromOffset(common::offset_t offset) { @@ -82,7 +80,7 @@ class LocalChunkedGroupCollection { inline ChunkCollection getLocalChunk(common::column_id_t columnID) { ChunkCollection localChunkCollection; for (auto& chunkedGroup : chunkedGroups.getChunkedGroups()) { - localChunkCollection.push_back(chunkedGroup->getColumnChunkUnsafe(columnID)); + localChunkCollection.push_back(&chunkedGroup->getColumnChunkUnsafe(columnID)); } return localChunkCollection; } @@ -91,10 +89,10 @@ class LocalChunkedGroupCollection { common::row_idx_t append(std::vector vectors); private: - ChunkedNodeGroupCollection chunkedGroups; + std::vector dataTypes; + storage::ChunkedNodeGroupCollection chunkedGroups; // The offset here can either be nodeOffset ( for node table) or relOffset (for rel table). offset_to_row_idx_t offsetToRowIdx; - std::vector dataTypes; common::row_idx_t numRows; // Only used for rel tables. Should be moved out later. diff --git a/src/include/storage/store/node_group.h b/src/include/storage/store/chunked_node_group.h similarity index 76% rename from src/include/storage/store/node_group.h rename to src/include/storage/store/chunked_node_group.h index 35645ab9184..2cac9cc916e 100644 --- a/src/include/storage/store/node_group.h +++ b/src/include/storage/store/chunked_node_group.h @@ -23,14 +23,11 @@ class ChunkedNodeGroup { KU_ASSERT(columnID < chunks.size()); return *chunks[columnID]; } - inline ColumnChunk* getColumnChunkUnsafe(common::column_id_t columnID) { - KU_ASSERT(columnID < chunks.size()); - return chunks[columnID].get(); - } - inline const ColumnChunk& getColumnChunk(common::column_id_t columnID) { + inline ColumnChunk& getColumnChunkUnsafe(common::column_id_t columnID) { KU_ASSERT(columnID < chunks.size()); return *chunks[columnID]; } + inline std::vector>& getColumnChunksUnsafe() { return chunks; } inline bool isFull() const { return numRows == common::StorageConstants::NODE_GROUP_SIZE; } void resetToEmpty(); @@ -39,7 +36,7 @@ class ChunkedNodeGroup { void resizeChunks(uint64_t newSize); uint64_t append(const std::vector& columnVectors, - common::DataChunkState* columnState, uint64_t numValuesToAppend); + common::SelectionVector& selVector, uint64_t numValuesToAppend); common::offset_t append(ChunkedNodeGroup* other, common::offset_t offsetInOtherNodeGroup); void write(std::vector>& data, common::vector_idx_t offsetVector); @@ -98,32 +95,6 @@ class ChunkedCSRNodeGroup : public ChunkedNodeGroup { ChunkedCSRHeader csrHeader; }; -class ChunkedNodeGroupCollection { -public: - ChunkedNodeGroupCollection() {} - - inline const std::vector>& getChunkedGroups() const { - return chunkedGroups; - } - inline const ChunkedNodeGroup* getChunkedGroup(uint64_t groupIdx) const { - KU_ASSERT(groupIdx < chunkedGroups.size()); - return chunkedGroups[groupIdx].get(); - } - inline ChunkedNodeGroup* getChunkedGroupUnsafe(uint64_t groupIdx) { - KU_ASSERT(groupIdx < chunkedGroups.size()); - return chunkedGroups[groupIdx].get(); - } - inline uint64_t getNumChunks() const { return chunkedGroups.size(); } - void append(std::unique_ptr chunkedGroup); - -private: - // Assert that all chunked node groups have the same num columns and same data types. - bool sanityCheckForAppend(); - -private: - std::vector> chunkedGroups; -}; - struct NodeGroupFactory { static inline std::unique_ptr createNodeGroup( common::ColumnDataFormat dataFormat, const std::vector& columnTypes, diff --git a/src/include/storage/store/chunked_node_group_collection.h b/src/include/storage/store/chunked_node_group_collection.h new file mode 100644 index 00000000000..9573a80fef7 --- /dev/null +++ b/src/include/storage/store/chunked_node_group_collection.h @@ -0,0 +1,40 @@ +#pragma once + +#include "storage/store/chunked_node_group.h" + +namespace kuzu { +namespace storage { + +class ChunkedNodeGroupCollection { +public: + static constexpr uint64_t CHUNK_CAPACITY = 2048; + + explicit ChunkedNodeGroupCollection(std::vector types) + : types{std::move(types)} {} + DELETE_COPY_DEFAULT_MOVE(ChunkedNodeGroupCollection); + + inline const std::vector>& getChunkedGroups() const { + return chunkedGroups; + } + inline const ChunkedNodeGroup* getChunkedGroup(uint64_t groupIdx) const { + KU_ASSERT(groupIdx < chunkedGroups.size()); + return chunkedGroups[groupIdx].get(); + } + inline ChunkedNodeGroup* getChunkedGroupUnsafe(uint64_t groupIdx) { + KU_ASSERT(groupIdx < chunkedGroups.size()); + return chunkedGroups[groupIdx].get(); + } + inline uint64_t getNumChunks() const { return chunkedGroups.size(); } + + void append( + const std::vector& vectors, const common::SelectionVector& selVector); + void append(std::unique_ptr chunkedGroup); + void merge(ChunkedNodeGroupCollection& chunkedGroupCollection); + +private: + std::vector types; + std::vector> chunkedGroups; +}; + +} // namespace storage +} // namespace kuzu diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index 8eecf3857f6..ac1495ccf70 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -48,6 +48,7 @@ class ColumnChunk { } inline NullColumnChunk* getNullChunk() { return nullChunk.get(); } + inline const NullColumnChunk& getNullChunk() const { return *nullChunk; } inline common::LogicalType& getDataType() { return dataType; } inline const common::LogicalType& getDataType() const { return dataType; } diff --git a/src/include/storage/store/node_table.h b/src/include/storage/store/node_table.h index 320bb11b588..2fa42152626 100644 --- a/src/include/storage/store/node_table.h +++ b/src/include/storage/store/node_table.h @@ -6,7 +6,7 @@ #include "common/cast.h" #include "storage/index/hash_index.h" #include "storage/stats/nodes_store_statistics.h" -#include "storage/store/node_group.h" +#include "storage/store/chunked_node_group.h" #include "storage/store/node_table_data.h" #include "storage/store/table.h" diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index 2ddb88e0439..5815bd97a1a 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -1,7 +1,7 @@ #pragma once #include "common/enums/rel_direction.h" -#include "storage/store/node_group.h" +#include "storage/store/chunked_node_group.h" #include "storage/store/table_data.h" namespace kuzu { diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index 10beea3fa5a..1263c3baf8b 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -1,7 +1,7 @@ #pragma once +#include "storage/store/chunked_node_group.h" #include "storage/store/column.h" -#include "storage/store/node_group.h" namespace kuzu { namespace storage { diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 51a38c4817f..35838ec8af1 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -3,7 +3,6 @@ #include "common/constants.h" #include "common/data_chunk/sel_vector.h" #include "processor/execution_context.h" -#include "storage/store/column_chunk.h" #include "storage/store/node_table.h" using namespace kuzu::common; @@ -37,7 +36,7 @@ static partition_idx_t getNumPartitions(offset_t maxOffset) { return (maxOffset + StorageConstants::NODE_GROUP_SIZE) / StorageConstants::NODE_GROUP_SIZE; } -void PartitionerSharedState::initialize() { +void PartitionerSharedState::initialize(std::vector>& infos) { maxNodeOffsets.resize(2); maxNodeOffsets[0] = srcNodeTable->getMaxNodeOffset(transaction::Transaction::getDummyWriteTrx().get()); @@ -46,7 +45,7 @@ void PartitionerSharedState::initialize() { numPartitions.resize(2); numPartitions[0] = getNumPartitions(maxNodeOffsets[0]); numPartitions[1] = getNumPartitions(maxNodeOffsets[1]); - Partitioner::initializePartitioningStates(partitioningBuffers, numPartitions); + Partitioner::initializePartitioningStates(infos, partitioningBuffers, numPartitions); } partition_idx_t PartitionerSharedState::getNextPartition(vector_idx_t partitioningIdx) { @@ -77,11 +76,7 @@ void PartitioningBuffer::merge(std::unique_ptr localPartitio for (auto partitionIdx = 0u; partitionIdx < partitions.size(); partitionIdx++) { auto& sharedPartition = partitions[partitionIdx]; auto& localPartition = localPartitioningState->partitions[partitionIdx]; - sharedPartition.chunks.reserve( - sharedPartition.chunks.size() + localPartition.chunks.size()); - for (auto j = 0u; j < localPartition.chunks.size(); j++) { - sharedPartition.chunks.push_back(std::move(localPartition.chunks[j])); - } + sharedPartition.merge(localPartition); } } @@ -96,12 +91,13 @@ Partitioner::Partitioner(std::unique_ptr resultSetDescripto } void Partitioner::initGlobalStateInternal(ExecutionContext* /*context*/) { - sharedState->initialize(); + sharedState->initialize(infos); } void Partitioner::initLocalStateInternal(ResultSet* /*resultSet*/, ExecutionContext* /*context*/) { localState = std::make_unique(); - initializePartitioningStates(localState->partitioningBuffers, sharedState->numPartitions); + initializePartitioningStates( + infos, localState->partitioningBuffers, sharedState->numPartitions); } DataChunk Partitioner::constructDataChunk(const std::vector& columnPositions, @@ -122,6 +118,7 @@ DataChunk Partitioner::constructDataChunk(const std::vector& columnPosi } void Partitioner::initializePartitioningStates( + std::vector>& infos, std::vector>& partitioningBuffers, std::vector numPartitions) { partitioningBuffers.resize(numPartitions.size()); @@ -130,7 +127,7 @@ void Partitioner::initializePartitioningStates( auto partitioningBuffer = std::make_unique(); partitioningBuffer->partitions.reserve(numPartition); for (auto i = 0u; i < numPartition; i++) { - partitioningBuffer->partitions.emplace_back(); + partitioningBuffer->partitions.emplace_back(infos[partitioningIdx]->columnTypes); } partitioningBuffers[partitioningIdx] = std::move(partitioningBuffer); } @@ -152,6 +149,11 @@ void Partitioner::executeInternal(ExecutionContext* context) { } void Partitioner::copyDataToPartitions(partition_idx_t partitioningIdx, DataChunk chunkToCopyFrom) { + std::vector vectorsToAppend; + vectorsToAppend.reserve(chunkToCopyFrom.getNumValueVectors()); + for (auto j = 0u; j < chunkToCopyFrom.getNumValueVectors(); j++) { + vectorsToAppend.push_back(chunkToCopyFrom.getValueVector(j).get()); + } SelectionVector selVector(1); selVector.resetSelectorToValuePosBufferWithSize(1); for (auto i = 0u; i < chunkToCopyFrom.state->selVector->selectedSize; i++) { @@ -161,21 +163,8 @@ void Partitioner::copyDataToPartitions(partition_idx_t partitioningIdx, DataChun partitionIdx < localState->getPartitioningBuffer(partitioningIdx)->partitions.size()); auto& partition = localState->getPartitioningBuffer(partitioningIdx)->partitions[partitionIdx]; - if (partition.chunks.empty() || partition.chunks.back()[0]->getNumValues() + 1 > - partition.chunks.back()[0]->getCapacity()) { - partition.chunks.emplace_back(); - partition.chunks.back().reserve(chunkToCopyFrom.getNumValueVectors()); - for (auto j = 0u; j < chunkToCopyFrom.getNumValueVectors(); j++) { - partition.chunks.back().emplace_back( - ColumnChunkFactory::createColumnChunk(infos[partitioningIdx]->columnTypes[j], - false /*enableCompression*/, Partitioner::CHUNK_SIZE)); - } - } - KU_ASSERT(partition.chunks.back().size() == chunkToCopyFrom.getNumValueVectors()); selVector.selectedPositions[0] = posToCopyFrom; - for (auto j = 0u; j < chunkToCopyFrom.getNumValueVectors(); j++) { - partition.chunks.back()[j]->append(chunkToCopyFrom.getValueVector(j).get(), selVector); - } + partition.append(vectorsToAppend, selVector); } } diff --git a/src/processor/operator/persistent/index_builder.cpp b/src/processor/operator/persistent/index_builder.cpp index acb0c313dfb..82deb37588c 100644 --- a/src/processor/operator/persistent/index_builder.cpp +++ b/src/processor/operator/persistent/index_builder.cpp @@ -89,26 +89,27 @@ void IndexBuilderSharedState::quitProducer() { } } -void IndexBuilder::insert(ColumnChunk* chunk, offset_t nodeOffset, offset_t numNodes) { - checkNonNullConstraint(chunk->getNullChunk(), numNodes); +void IndexBuilder::insert(const ColumnChunk& chunk, offset_t nodeOffset, offset_t numNodes) { + checkNonNullConstraint(chunk.getNullChunk(), numNodes); TypeUtils::visit( - chunk->getDataType().getPhysicalType(), + chunk.getDataType().getPhysicalType(), [&](T) { for (auto i = 0u; i < numNodes; i++) { - auto value = chunk->getValue(i); + auto value = chunk.getValue(i); localBuffers.insert(value, nodeOffset + i); } }, [&](ku_string_t) { - auto stringColumnChunk = ku_dynamic_cast(chunk); + auto& stringColumnChunk = + ku_dynamic_cast(chunk); for (auto i = 0u; i < numNodes; i++) { - auto value = stringColumnChunk->getValue(i); + auto value = stringColumnChunk.getValue(i); localBuffers.insert(std::move(value), nodeOffset + i); } }, [&](auto) { - throw CopyException(ExceptionMessage::invalidPKType(chunk->getDataType().toString())); + throw CopyException(ExceptionMessage::invalidPKType(chunk.getDataType().toString())); }); } @@ -129,9 +130,9 @@ void IndexBuilder::finalize(ExecutionContext* /*context*/) { sharedState->flush(); } -void IndexBuilder::checkNonNullConstraint(NullColumnChunk* nullChunk, offset_t numNodes) { +void IndexBuilder::checkNonNullConstraint(const NullColumnChunk& nullChunk, offset_t numNodes) { for (auto i = 0u; i < numNodes; i++) { - if (nullChunk->isNull(i)) { + if (nullChunk.isNull(i)) { throw CopyException(ExceptionMessage::nullPKException()); } } diff --git a/src/processor/operator/persistent/node_batch_insert.cpp b/src/processor/operator/persistent/node_batch_insert.cpp index e9a3e57f034..3aa0d722406 100644 --- a/src/processor/operator/persistent/node_batch_insert.cpp +++ b/src/processor/operator/persistent/node_batch_insert.cpp @@ -158,7 +158,7 @@ void NodeBatchInsert::copyToNodeGroup() { while (numAppendedTuples < numTuplesToAppend) { auto numAppendedTuplesInNodeGroup = nodeLocalState->nodeGroup->append(nodeLocalState->columnVectors, - nodeLocalState->columnState, numTuplesToAppend - numAppendedTuples); + *nodeLocalState->columnState->selVector, numTuplesToAppend - numAppendedTuples); numAppendedTuples += numAppendedTuplesInNodeGroup; if (nodeLocalState->nodeGroup->isFull()) { node_group_idx_t nodeGroupIdx; diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index 9473ef2052b..6113407e144 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -3,7 +3,6 @@ #include "common/exception/copy.h" #include "common/exception/message.h" #include "common/string_format.h" -#include "processor/operator/partitioner.h" #include "processor/result/factorized_table.h" #include "storage/store/column_chunk.h" #include "storage/store/rel_table.h" @@ -42,17 +41,18 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { auto& partitioningBuffer = partitionerSharedState->getPartitionBuffer( relInfo->partitioningIdx, relLocalState->nodeGroupIdx); auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(relLocalState->nodeGroupIdx); - for (auto& columns : partitioningBuffer.chunks) { - setOffsetToWithinNodeGroup(*columns[relInfo->offsetVectorIdx], startNodeOffset); + for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { + setOffsetToWithinNodeGroup( + chunkedGroup->getColumnChunkUnsafe(relInfo->offsetColumnID), startNodeOffset); } // Calculate num of source nodes in this node group. // This will be used to set the num of values of the node group. auto numNodes = std::min(StorageConstants::NODE_GROUP_SIZE, partitionerSharedState->maxNodeOffsets[relInfo->partitioningIdx] - startNodeOffset + 1); - prepareCSRNodeGroup( - partitioningBuffer, startNodeOffset, relInfo->offsetVectorIdx, numNodes); - for (auto& chunk : partitioningBuffer.chunks) { - localState->nodeGroup->write(chunk, relInfo->offsetVectorIdx); + prepareCSRNodeGroup(partitioningBuffer, startNodeOffset, relInfo->offsetColumnID, numNodes); + for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { + localState->nodeGroup->write( + chunkedGroup->getColumnChunksUnsafe(), relInfo->offsetColumnID); } localState->nodeGroup->finalize(relLocalState->nodeGroupIdx); // Flush node group to table. @@ -62,15 +62,15 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { } } -void RelBatchInsert::prepareCSRNodeGroup(PartitioningBuffer::Partition& partition, - common::offset_t startNodeOffset, vector_idx_t offsetVectorIdx, offset_t numNodes) { +void RelBatchInsert::prepareCSRNodeGroup(ChunkedNodeGroupCollection& partition, + common::offset_t startNodeOffset, column_id_t offsetColumnID, offset_t numNodes) { auto relInfo = ku_dynamic_cast(info.get()); auto csrNodeGroup = ku_dynamic_cast(localState->nodeGroup.get()); auto& csrHeader = csrNodeGroup->getCSRHeader(); csrHeader.setNumValues(numNodes); // Populate start csr offsets and lengths for each node. - auto gaps = populateStartCSROffsetsAndLengths(csrHeader, numNodes, partition, offsetVectorIdx); + auto gaps = populateStartCSROffsetsAndLengths(csrHeader, numNodes, partition, offsetColumnID); auto invalid = checkRelMultiplicityConstraint(csrHeader); if (invalid.has_value()) { throw CopyException(ExceptionMessage::violateRelMultiplicityConstraint( @@ -81,9 +81,9 @@ void RelBatchInsert::prepareCSRNodeGroup(PartitioningBuffer::Partition& partitio offset_t csrChunkCapacity = csrHeader.getEndCSROffset(numNodes - 1) + csrHeader.getCSRLength(numNodes - 1); localState->nodeGroup->resizeChunks(csrChunkCapacity); - for (auto& dataChunk : partition.chunks) { - auto offsetChunk = dataChunk[offsetVectorIdx].get(); - setOffsetFromCSROffsets(offsetChunk, csrHeader.offset.get()); + for (auto& chunkedGroup : partition.getChunkedGroups()) { + auto& offsetChunk = chunkedGroup->getColumnChunkUnsafe(offsetColumnID); + setOffsetFromCSROffsets(offsetChunk, *csrHeader.offset); } populateEndCSROffsets(csrHeader, gaps); } @@ -106,7 +106,7 @@ length_t RelBatchInsert::getGapSize(length_t length) { } std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(ChunkedCSRHeader& csrHeader, - offset_t numNodes, PartitioningBuffer::Partition& partition, vector_idx_t offsetVectorIdx) { + offset_t numNodes, ChunkedNodeGroupCollection& partition, column_id_t offsetColumnID) { KU_ASSERT(numNodes == csrHeader.length->getNumValues() && numNodes == csrHeader.offset->getNumValues()); std::vector gaps; @@ -115,10 +115,10 @@ std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(ChunkedC auto csrLengths = (length_t*)csrHeader.length->getData(); std::fill(csrLengths, csrLengths + numNodes, 0); // Calculate length for each node. Store the num of tuples of node i at csrLengths[i]. - for (auto& chunk : partition.chunks) { - auto& offsetChunk = chunk[offsetVectorIdx]; - for (auto i = 0u; i < offsetChunk->getNumValues(); i++) { - auto nodeOffset = offsetChunk->getValue(i); + for (auto& chunkedGroup : partition.getChunkedGroups()) { + auto& offsetChunk = chunkedGroup->getColumnChunk(offsetColumnID); + for (auto i = 0u; i < offsetChunk.getNumValues(); i++) { + auto nodeOffset = offsetChunk.getValue(i); KU_ASSERT(nodeOffset < numNodes); csrLengths[nodeOffset]++; } @@ -144,13 +144,13 @@ void RelBatchInsert::setOffsetToWithinNodeGroup(ColumnChunk& chunk, offset_t sta } void RelBatchInsert::setOffsetFromCSROffsets( - ColumnChunk* nodeOffsetChunk, ColumnChunk* csrOffsetChunk) { - KU_ASSERT(nodeOffsetChunk->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); - for (auto i = 0u; i < nodeOffsetChunk->getNumValues(); i++) { - auto nodeOffset = nodeOffsetChunk->getValue(i); - auto csrOffset = csrOffsetChunk->getValue(nodeOffset); - nodeOffsetChunk->setValue(csrOffset, i); - csrOffsetChunk->setValue(csrOffset + 1, nodeOffset); + ColumnChunk& nodeOffsetChunk, ColumnChunk& csrOffsetChunk) { + KU_ASSERT(nodeOffsetChunk.getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); + for (auto i = 0u; i < nodeOffsetChunk.getNumValues(); i++) { + auto nodeOffset = nodeOffsetChunk.getValue(i); + auto csrOffset = csrOffsetChunk.getValue(nodeOffset); + nodeOffsetChunk.setValue(csrOffset, i); + csrOffsetChunk.setValue(csrOffset + 1, nodeOffset); } } diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index d07cf36bca9..2c5a35f562b 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -3,7 +3,6 @@ #include "storage/local_storage/local_node_table.h" #include "storage/local_storage/local_rel_table.h" #include "storage/store/column.h" -#include "storage/store/node_group.h" using namespace kuzu::common; @@ -56,9 +55,9 @@ void LocalChunkedGroupCollection::update( KU_ASSERT(offsetToRowIdx.contains(offset)); auto rowIdx = offsetToRowIdx.at(offset); auto [chunkIdx, offsetInChunk] = getChunkIdxAndOffsetInChunk(rowIdx); - auto chunk = chunkedGroups.getChunkedGroupUnsafe(chunkIdx)->getColumnChunkUnsafe(columnID); - chunk->write( - propertyVector, propertyVector->state->selVector->selectedPositions[0], offsetInChunk); + auto& chunk = chunkedGroups.getChunkedGroupUnsafe(chunkIdx)->getColumnChunkUnsafe(columnID); + auto pos = propertyVector->state->selVector->selectedPositions[0]; + chunk.write(propertyVector, pos, offsetInChunk); } void LocalChunkedGroupCollection::remove(offset_t srcNodeOffset, offset_t relOffset) { @@ -76,14 +75,14 @@ row_idx_t LocalChunkedGroupCollection::append(std::vector vectors) KU_ASSERT(vectors.size() == dataTypes.size()); if (chunkedGroups.getNumChunks() == 0 || chunkedGroups.getChunkedGroup(chunkedGroups.getNumChunks() - 1)->getNumRows() == - CHUNK_CAPACITY) { + ChunkedNodeGroupCollection::CHUNK_CAPACITY) { chunkedGroups.append(std::make_unique( - dataTypes, false /*enableCompression*/, CHUNK_CAPACITY)); + dataTypes, false /*enableCompression*/, ChunkedNodeGroupCollection::CHUNK_CAPACITY)); } auto lastChunkGroup = chunkedGroups.getChunkedGroupUnsafe(chunkedGroups.getNumChunks() - 1); for (auto i = 0u; i < vectors.size(); i++) { KU_ASSERT(vectors[i]->state->selVector->selectedSize == 1); - lastChunkGroup->getColumnChunkUnsafe(i)->append(vectors[i], *vectors[i]->state->selVector); + lastChunkGroup->getColumnChunkUnsafe(i).append(vectors[i], *vectors[i]->state->selVector); } lastChunkGroup->setNumValues(lastChunkGroup->getNumRows() + 1); return numRows++; diff --git a/src/storage/store/CMakeLists.txt b/src/storage/store/CMakeLists.txt index 2c579e8276e..62de9fd2314 100644 --- a/src/storage/store/CMakeLists.txt +++ b/src/storage/store/CMakeLists.txt @@ -1,10 +1,11 @@ add_library(kuzu_storage_store OBJECT + chunked_node_group.cpp + chunked_node_group_collection.cpp column.cpp column_chunk.cpp dictionary_chunk.cpp dictionary_column.cpp - node_group.cpp node_table.cpp node_table_data.cpp null_column.cpp diff --git a/src/storage/store/node_group.cpp b/src/storage/store/chunked_node_group.cpp similarity index 87% rename from src/storage/store/node_group.cpp rename to src/storage/store/chunked_node_group.cpp index 9ddaf8f784b..4d08b7fefe7 100644 --- a/src/storage/store/node_group.cpp +++ b/src/storage/store/chunked_node_group.cpp @@ -1,4 +1,4 @@ -#include "storage/store/node_group.h" +#include "storage/store/chunked_node_group.h" #include "common/assert.h" #include "common/constants.h" @@ -94,12 +94,12 @@ void ChunkedNodeGroup::resizeChunks(uint64_t newSize) { } uint64_t ChunkedNodeGroup::append(const std::vector& columnVectors, - DataChunkState* columnState, uint64_t numValuesToAppend) { + SelectionVector& selVector, uint64_t numValuesToAppend) { auto numValuesToAppendInChunk = std::min(numValuesToAppend, StorageConstants::NODE_GROUP_SIZE - numRows); auto serialSkip = 0u; - auto originalSize = columnState->selVector->selectedSize; - columnState->selVector->selectedSize = numValuesToAppendInChunk; + auto originalSize = selVector.selectedSize; + selVector.selectedSize = numValuesToAppendInChunk; for (auto i = 0u; i < chunks.size(); i++) { auto chunk = chunks[i].get(); if (chunk->getDataType().getLogicalTypeID() == common::LogicalTypeID::SERIAL) { @@ -109,10 +109,9 @@ uint64_t ChunkedNodeGroup::append(const std::vector& columnVectors } KU_ASSERT((i - serialSkip) < columnVectors.size()); auto columnVector = columnVectors[i - serialSkip]; - KU_ASSERT(chunk->getDataType() == columnVector->dataType); - chunk->append(columnVector, *columnVector->state->selVector); + chunk->append(columnVector, selVector); } - columnState->selVector->selectedSize = originalSize; + selVector.selectedSize = originalSize; numRows += numValuesToAppendInChunk; return numValuesToAppendInChunk; } @@ -153,17 +152,6 @@ void ChunkedNodeGroup::finalize(uint64_t nodeGroupIdx_) { } } -void ChunkedNodeGroupCollection::append(std::unique_ptr chunkedGroup) { - if (chunkedGroups.size() > 1) { - KU_ASSERT(chunkedGroup->getNumColumns() == chunkedGroups[0]->getNumColumns()); - for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { - KU_ASSERT(chunkedGroup->getColumnChunk(i).getDataType() == - chunkedGroups[0]->getColumnChunk(i).getDataType()); - } - } - chunkedGroups.push_back(std::move(chunkedGroup)); -} - ChunkedCSRHeader::ChunkedCSRHeader(bool enableCompression, uint64_t capacity) { offset = ColumnChunkFactory::createColumnChunk(*LogicalType::UINT64(), enableCompression, capacity); diff --git a/src/storage/store/chunked_node_group_collection.cpp b/src/storage/store/chunked_node_group_collection.cpp new file mode 100644 index 00000000000..b9119f04b92 --- /dev/null +++ b/src/storage/store/chunked_node_group_collection.cpp @@ -0,0 +1,50 @@ +#include "storage/store/chunked_node_group_collection.h" + +using namespace kuzu::common; + +namespace kuzu { +namespace storage { + +void ChunkedNodeGroupCollection::append( + const std::vector& vectors, const SelectionVector& selVector) { + if (chunkedGroups.empty()) { + chunkedGroups.push_back( + std::make_unique(types, false /*enableCompression*/, CHUNK_CAPACITY)); + } + auto numRowsToAppend = selVector.selectedSize; + row_idx_t numRowsAppended = 0; + SelectionVector tmpSelVector(numRowsToAppend); + while (numRowsAppended < numRowsToAppend) { + auto& lastChunkedGroup = chunkedGroups.back(); + auto numRowsToAppendInGroup = std::min(numRowsToAppend - numRowsAppended, + static_cast(CHUNK_CAPACITY - lastChunkedGroup->getNumRows())); + tmpSelVector.resetSelectorToValuePosBufferWithSize(numRowsToAppendInGroup); + for (auto i = 0u; i < numRowsToAppendInGroup; i++) { + tmpSelVector.selectedPositions[i] = selVector.selectedPositions[numRowsAppended + i]; + } + lastChunkedGroup->append(vectors, tmpSelVector, numRowsToAppendInGroup); + if (lastChunkedGroup->getNumRows() == CHUNK_CAPACITY) { + chunkedGroups.push_back(std::make_unique( + types, false /*enableCompression*/, CHUNK_CAPACITY)); + } + numRowsAppended += numRowsToAppendInGroup; + } +} + +void ChunkedNodeGroupCollection::append(std::unique_ptr chunkedGroup) { + KU_ASSERT(chunkedGroup->getNumColumns() == types.size()); + for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { + KU_ASSERT(chunkedGroup->getColumnChunk(i).getDataType() == types[i]); + } + chunkedGroups.push_back(std::move(chunkedGroup)); +} + +void ChunkedNodeGroupCollection::merge(ChunkedNodeGroupCollection& chunkedGroupCollection) { + chunkedGroups.reserve(chunkedGroups.size() + chunkedGroupCollection.getNumChunks()); + for (auto& chunkedGroup : chunkedGroupCollection.chunkedGroups) { + append(std::move(chunkedGroup)); + } +} + +} // namespace storage +} // namespace kuzu diff --git a/src/storage/store/node_table_data.cpp b/src/storage/store/node_table_data.cpp index 4df1b9ad59c..aea7577412e 100644 --- a/src/storage/store/node_table_data.cpp +++ b/src/storage/store/node_table_data.cpp @@ -99,9 +99,9 @@ void NodeTableData::lookup(Transaction* transaction, TableReadState& readState, void NodeTableData::append(ChunkedNodeGroup* nodeGroup) { for (auto columnID = 0u; columnID < columns.size(); columnID++) { - auto columnChunk = nodeGroup->getColumnChunkUnsafe(columnID); + auto& columnChunk = nodeGroup->getColumnChunkUnsafe(columnID); KU_ASSERT(columnID < columns.size()); - columns[columnID]->append(columnChunk, nodeGroup->getNodeGroupIdx()); + columns[columnID]->append(&columnChunk, nodeGroup->getNodeGroupIdx()); } } diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index feb03ae34ee..adbc76bf1aa 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -307,7 +307,7 @@ void RelTableData::append(ChunkedNodeGroup* nodeGroup) { csrHeaderColumns.append(csrNodeGroup->getCSRHeader(), nodeGroup->getNodeGroupIdx()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { getColumn(columnID)->append( - nodeGroup->getColumnChunkUnsafe(columnID), nodeGroup->getNodeGroupIdx()); + &nodeGroup->getColumnChunkUnsafe(columnID), nodeGroup->getNodeGroupIdx()); } } From 3a6bd7e7c1da75b4968aa00a5c765ea56d6cad7c Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Sat, 23 Mar 2024 09:40:48 -0400 Subject: [PATCH 082/136] Replace with client context (#3121) --- src/binder/bind/bind_updating_clause.cpp | 2 +- src/binder/binder.cpp | 2 +- src/binder/bound_statement_rewriter.cpp | 6 +-- .../query/query_graph_label_analyzer.cpp | 21 +++++---- src/include/binder/bound_statement_rewriter.h | 6 +-- .../binder/query/query_graph_label_analyzer.h | 8 ++-- .../match_clause_pattern_label_rewriter.h | 6 +-- src/include/planner/planner.h | 6 +-- .../operator/ddl/add_node_property.h | 13 +++--- .../processor/operator/ddl/add_property.h | 13 +++--- .../processor/operator/ddl/add_rel_property.h | 13 +++--- .../operator/ddl/create_node_table.h | 12 +++-- .../processor/operator/ddl/create_rdf_graph.h | 9 ++-- .../processor/operator/ddl/create_rel_table.h | 12 +++-- .../operator/ddl/create_rel_table_group.h | 12 +++-- src/include/processor/operator/ddl/ddl.h | 8 ++-- .../processor/operator/ddl/drop_property.h | 14 +++--- .../processor/operator/ddl/drop_table.h | 8 ++-- .../processor/operator/ddl/rename_property.h | 18 ++++---- .../processor/operator/ddl/rename_table.h | 15 ++++--- src/include/processor/plan_mapper.h | 14 ++---- src/main/client_context.cpp | 6 +-- src/planner/planner.cpp | 8 ++-- .../map/create_factorized_table_scan.cpp | 3 +- src/processor/map/create_result_collector.cpp | 3 +- src/processor/map/map_comment_on.cpp | 3 +- src/processor/map/map_copy_from.cpp | 23 +++++----- src/processor/map/map_copy_to.cpp | 3 +- src/processor/map/map_create_macro.cpp | 4 +- src/processor/map/map_ddl.cpp | 44 +++++++++---------- src/processor/map/map_delete.cpp | 4 +- src/processor/map/map_dummy_scan.cpp | 1 + src/processor/map/map_explain.cpp | 4 +- src/processor/map/map_extend.cpp | 8 ++-- src/processor/map/map_hash_join.cpp | 4 +- src/processor/map/map_index_scan_node.cpp | 6 ++- src/processor/map/map_insert.cpp | 18 +++++--- src/processor/map/map_intersect.cpp | 4 +- src/processor/map/map_path_property_probe.cpp | 8 ++-- src/processor/map/map_recursive_extend.cpp | 5 ++- src/processor/map/map_scan_node.cpp | 3 +- src/processor/map/map_scan_node_property.cpp | 12 +++-- src/processor/map/map_set.cpp | 13 ++++-- src/processor/map/plan_mapper.cpp | 5 ++- .../operator/ddl/add_node_property.cpp | 9 +++- .../operator/ddl/add_rel_property.cpp | 9 +++- .../operator/ddl/create_node_table.cpp | 2 + .../operator/ddl/create_rdf_graph.cpp | 1 + .../operator/ddl/create_rel_table.cpp | 2 + .../operator/ddl/create_rel_table_group.cpp | 2 + src/processor/operator/ddl/drop_property.cpp | 8 +++- src/processor/operator/ddl/drop_table.cpp | 5 ++- test/copy/e2e_copy_transaction_test.cpp | 8 ++-- test/ddl/e2e_ddl_test.cpp | 5 ++- test/graph_test/graph_test.cpp | 3 +- 55 files changed, 241 insertions(+), 223 deletions(-) diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index 76ad735c770..c8248ca0d16 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -96,7 +96,7 @@ std::vector Binder::bindInsertInfos( const QueryGraphCollection& queryGraphCollection, const expression_set& nodeRelScope_) { auto nodeRelScope = nodeRelScope_; std::vector result; - auto analyzer = QueryGraphLabelAnalyzer(*clientContext->getCatalog(), *clientContext); + auto analyzer = QueryGraphLabelAnalyzer(*clientContext); for (auto i = 0u; i < queryGraphCollection.getNumQueryGraphs(); ++i) { auto queryGraph = queryGraphCollection.getQueryGraph(i); // Ensure query graph does not violate declared schema. diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 64367cc1245..be764c123d0 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -71,7 +71,7 @@ std::unique_ptr Binder::bind(const Statement& statement) { KU_UNREACHABLE; } } - BoundStatementRewriter::rewrite(*boundStatement, *clientContext->getCatalog(), *clientContext); + BoundStatementRewriter::rewrite(*boundStatement, *clientContext); return boundStatement; } diff --git a/src/binder/bound_statement_rewriter.cpp b/src/binder/bound_statement_rewriter.cpp index 57a2ac913f0..f09ac4bb4d5 100644 --- a/src/binder/bound_statement_rewriter.cpp +++ b/src/binder/bound_statement_rewriter.cpp @@ -7,12 +7,12 @@ namespace kuzu { namespace binder { -void BoundStatementRewriter::rewrite(BoundStatement& boundStatement, - const catalog::Catalog& catalog, const main::ClientContext& clientContext) { +void BoundStatementRewriter::rewrite( + BoundStatement& boundStatement, const main::ClientContext& clientContext) { auto withClauseProjectionRewriter = WithClauseProjectionRewriter(); withClauseProjectionRewriter.visitUnsafe(boundStatement); - auto matchClausePatternLabelRewriter = MatchClausePatternLabelRewriter(catalog, clientContext); + auto matchClausePatternLabelRewriter = MatchClausePatternLabelRewriter(clientContext); matchClausePatternLabelRewriter.visit(boundStatement); auto defaultTypeSolver = DefaultTypeSolver(); diff --git a/src/binder/query/query_graph_label_analyzer.cpp b/src/binder/query/query_graph_label_analyzer.cpp index ff533ebd9e4..27cbc59ffe7 100644 --- a/src/binder/query/query_graph_label_analyzer.cpp +++ b/src/binder/query/query_graph_label_analyzer.cpp @@ -1,5 +1,6 @@ #include "binder/query/query_graph_label_analyzer.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" #include "common/cast.h" #include "common/exception/binder.h" @@ -22,6 +23,7 @@ void QueryGraphLabelAnalyzer::pruneLabel(const QueryGraph& graph) { } void QueryGraphLabelAnalyzer::pruneNode(const QueryGraph& graph, NodeExpression& node) { + auto catalog = clientContext.getCatalog(); for (auto i = 0u; i < graph.getNumQueryRels(); ++i) { auto queryRel = graph.getQueryRel(i); if (queryRel->isRecursive()) { @@ -36,13 +38,13 @@ void QueryGraphLabelAnalyzer::pruneNode(const QueryGraph& graph, NodeExpression& if (isSrcConnect || isDstConnect) { for (auto relTableID : queryRel->getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(tx, relTableID)); + catalog->getTableCatalogEntry(tx, relTableID)); auto srcTableID = relTableSchema->getSrcTableID(); auto dstTableID = relTableSchema->getDstTableID(); candidates.insert(srcTableID); candidates.insert(dstTableID); - auto srcTableSchema = catalog.getTableCatalogEntry(tx, srcTableID); - auto dstTableSchema = catalog.getTableCatalogEntry(tx, dstTableID); + auto srcTableSchema = catalog->getTableCatalogEntry(tx, srcTableID); + auto dstTableSchema = catalog->getTableCatalogEntry(tx, dstTableID); candidateNamesSet.insert(srcTableSchema->getName()); candidateNamesSet.insert(dstTableSchema->getName()); } @@ -51,19 +53,19 @@ void QueryGraphLabelAnalyzer::pruneNode(const QueryGraph& graph, NodeExpression& if (isSrcConnect) { for (auto relTableID : queryRel->getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(tx, relTableID)); + catalog->getTableCatalogEntry(tx, relTableID)); auto srcTableID = relTableSchema->getSrcTableID(); candidates.insert(srcTableID); - auto srcTableSchema = catalog.getTableCatalogEntry(tx, srcTableID); + auto srcTableSchema = catalog->getTableCatalogEntry(tx, srcTableID); candidateNamesSet.insert(srcTableSchema->getName()); } } else if (isDstConnect) { for (auto relTableID : queryRel->getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(tx, relTableID)); + catalog->getTableCatalogEntry(tx, relTableID)); auto dstTableID = relTableSchema->getDstTableID(); candidates.insert(dstTableID); - auto dstTableSchema = catalog.getTableCatalogEntry(tx, dstTableID); + auto dstTableSchema = catalog->getTableCatalogEntry(tx, dstTableID); candidateNamesSet.insert(dstTableSchema->getName()); } } @@ -94,6 +96,7 @@ void QueryGraphLabelAnalyzer::pruneNode(const QueryGraph& graph, NodeExpression& } void QueryGraphLabelAnalyzer::pruneRel(RelExpression& rel) { + auto catalog = clientContext.getCatalog(); if (rel.isRecursive()) { return; } @@ -108,7 +111,7 @@ void QueryGraphLabelAnalyzer::pruneRel(RelExpression& rel) { } for (auto& relTableID : rel.getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext.getTx(), relTableID)); + catalog->getTableCatalogEntry(clientContext.getTx(), relTableID)); auto srcTableID = relTableSchema->getSrcTableID(); auto dstTableID = relTableSchema->getDstTableID(); if (!boundTableIDSet.contains(srcTableID) || !boundTableIDSet.contains(dstTableID)) { @@ -121,7 +124,7 @@ void QueryGraphLabelAnalyzer::pruneRel(RelExpression& rel) { auto dstTableIDSet = rel.getDstNode()->getTableIDsSet(); for (auto& relTableID : rel.getTableIDs()) { auto relTableSchema = ku_dynamic_cast( - catalog.getTableCatalogEntry(clientContext.getTx(), relTableID)); + catalog->getTableCatalogEntry(clientContext.getTx(), relTableID)); auto srcTableID = relTableSchema->getSrcTableID(); auto dstTableID = relTableSchema->getDstTableID(); if (!srcTableIDSet.contains(srcTableID) || !dstTableIDSet.contains(dstTableID)) { diff --git a/src/include/binder/bound_statement_rewriter.h b/src/include/binder/bound_statement_rewriter.h index 564696beebc..49ceb5e9daa 100644 --- a/src/include/binder/bound_statement_rewriter.h +++ b/src/include/binder/bound_statement_rewriter.h @@ -1,7 +1,7 @@ #pragma once #include "bound_statement.h" -#include "catalog/catalog.h" +#include "main/client_context.h" namespace kuzu { namespace binder { @@ -9,9 +9,7 @@ namespace binder { // Perform semantic rewrite over bound statement. class BoundStatementRewriter { public: - // TODO(Jiamin): remove catalog - static void rewrite(BoundStatement& boundStatement, const catalog::Catalog& catalog, - const main::ClientContext& clientContext); + static void rewrite(BoundStatement& boundStatement, const main::ClientContext& clientContext); }; } // namespace binder diff --git a/src/include/binder/query/query_graph_label_analyzer.h b/src/include/binder/query/query_graph_label_analyzer.h index f0478026855..02b080d351e 100644 --- a/src/include/binder/query/query_graph_label_analyzer.h +++ b/src/include/binder/query/query_graph_label_analyzer.h @@ -1,6 +1,6 @@ #pragma once -#include "catalog/catalog.h" +#include "main/client_context.h" #include "query_graph.h" namespace kuzu { @@ -9,9 +9,8 @@ namespace binder { class QueryGraphLabelAnalyzer { public: // TODO(Jiamin): remove catalog - explicit QueryGraphLabelAnalyzer( - const catalog::Catalog& catalog, const main::ClientContext& clientContext) - : catalog{catalog}, clientContext{clientContext} {} + explicit QueryGraphLabelAnalyzer(const main::ClientContext& clientContext) + : clientContext{clientContext} {} void pruneLabel(const QueryGraph& graph); @@ -20,7 +19,6 @@ class QueryGraphLabelAnalyzer { void pruneRel(RelExpression& rel); private: - const catalog::Catalog& catalog; const main::ClientContext& clientContext; }; diff --git a/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h b/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h index c718ad7ec43..ad06d9684da 100644 --- a/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h +++ b/src/include/binder/rewriter/match_clause_pattern_label_rewriter.h @@ -8,10 +8,8 @@ namespace binder { class MatchClausePatternLabelRewriter : public BoundStatementVisitor { public: - // TODO(Jiamin): remove catalog - explicit MatchClausePatternLabelRewriter( - const catalog::Catalog& catalog, const main::ClientContext& clientContext) - : analyzer{catalog, clientContext} {} + explicit MatchClausePatternLabelRewriter(const main::ClientContext& clientContext) + : analyzer{clientContext} {} void visitMatch(const BoundReadingClause& readingClause) final; diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index 047ef0aa694..df62cd059a8 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -32,9 +32,7 @@ struct LogicalSetPropertyInfo; class Planner { public: - // TODO(Jiamin): Remove catalog and storageManager - Planner(catalog::Catalog* catalog, storage::StorageManager* storageManager, - main::ClientContext* clientContext); + explicit Planner(main::ClientContext* clientContext); DELETE_COPY_AND_MOVE(Planner); std::unique_ptr getBestPlan(const binder::BoundStatement& statement); @@ -282,9 +280,7 @@ class Planner { void exitContext(JoinOrderEnumeratorContext prevContext); private: - catalog::Catalog* catalog; main::ClientContext* clientContext; - storage::StorageManager* storageManager; binder::expression_vector propertiesToScan; CardinalityEstimator cardinalityEstimator; JoinOrderEnumeratorContext context; diff --git a/src/include/processor/operator/ddl/add_node_property.h b/src/include/processor/operator/ddl/add_node_property.h index 1f93a2d3cf4..e8c09e08b41 100644 --- a/src/include/processor/operator/ddl/add_node_property.h +++ b/src/include/processor/operator/ddl/add_node_property.h @@ -7,19 +7,18 @@ namespace processor { class AddNodeProperty final : public AddProperty { public: - AddNodeProperty(catalog::Catalog* catalog, common::table_id_t tableID, std::string propertyName, + AddNodeProperty(common::table_id_t tableID, std::string propertyName, std::unique_ptr dataType, std::unique_ptr defaultValueEvaluator, - storage::StorageManager& storageManager, const DataPos& outputPos, uint32_t id, - const std::string& paramsString) - : AddProperty{catalog, tableID, std::move(propertyName), std::move(dataType), - std::move(defaultValueEvaluator), storageManager, outputPos, id, paramsString} {} + const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : AddProperty{tableID, std::move(propertyName), std::move(dataType), + std::move(defaultValueEvaluator), outputPos, id, paramsString} {} void executeDDLInternal(ExecutionContext* context) final; std::unique_ptr clone() override { - return make_unique(catalog, tableID, propertyName, dataType->copy(), - defaultValueEvaluator->clone(), storageManager, outputPos, id, paramsString); + return make_unique(tableID, propertyName, dataType->copy(), + defaultValueEvaluator->clone(), outputPos, id, paramsString); } }; diff --git a/src/include/processor/operator/ddl/add_property.h b/src/include/processor/operator/ddl/add_property.h index 00e8b4865e7..469cca98f23 100644 --- a/src/include/processor/operator/ddl/add_property.h +++ b/src/include/processor/operator/ddl/add_property.h @@ -2,21 +2,19 @@ #include "ddl.h" #include "expression_evaluator/expression_evaluator.h" -#include "storage/storage_manager.h" namespace kuzu { namespace processor { class AddProperty : public DDL { public: - AddProperty(catalog::Catalog* catalog, common::table_id_t tableID, std::string propertyName, + AddProperty(common::table_id_t tableID, std::string propertyName, std::unique_ptr dataType, std::unique_ptr defaultValueEvaluator, - storage::StorageManager& storageManager, const DataPos& outputPos, uint32_t id, - const std::string& paramsString) - : DDL{PhysicalOperatorType::ADD_PROPERTY, catalog, outputPos, id, paramsString}, - tableID{tableID}, propertyName{std::move(propertyName)}, dataType{std::move(dataType)}, - defaultValueEvaluator{std::move(defaultValueEvaluator)}, storageManager{storageManager} {} + const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::ADD_PROPERTY, outputPos, id, paramsString}, tableID{tableID}, + propertyName{std::move(propertyName)}, dataType{std::move(dataType)}, + defaultValueEvaluator{std::move(defaultValueEvaluator)} {} void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override { DDL::initLocalStateInternal(resultSet, context); @@ -35,7 +33,6 @@ class AddProperty : public DDL { std::string propertyName; std::unique_ptr dataType; std::unique_ptr defaultValueEvaluator; - storage::StorageManager& storageManager; }; } // namespace processor diff --git a/src/include/processor/operator/ddl/add_rel_property.h b/src/include/processor/operator/ddl/add_rel_property.h index fd9c4e0641e..80e18a346e6 100644 --- a/src/include/processor/operator/ddl/add_rel_property.h +++ b/src/include/processor/operator/ddl/add_rel_property.h @@ -7,19 +7,18 @@ namespace processor { class AddRelProperty final : public AddProperty { public: - AddRelProperty(catalog::Catalog* catalog, common::table_id_t tableID, std::string propertyName, + AddRelProperty(common::table_id_t tableID, std::string propertyName, std::unique_ptr dataType, std::unique_ptr expressionEvaluator, - storage::StorageManager& storageManager, const DataPos& outputPos, uint32_t id, - const std::string& paramsString) - : AddProperty(catalog, tableID, std::move(propertyName), std::move(dataType), - std::move(expressionEvaluator), storageManager, outputPos, id, paramsString) {} + const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : AddProperty(tableID, std::move(propertyName), std::move(dataType), + std::move(expressionEvaluator), outputPos, id, paramsString) {} void executeDDLInternal(ExecutionContext* context) override; std::unique_ptr clone() override { - return make_unique(catalog, tableID, propertyName, dataType->copy(), - defaultValueEvaluator->clone(), storageManager, outputPos, id, paramsString); + return make_unique(tableID, propertyName, dataType->copy(), + defaultValueEvaluator->clone(), outputPos, id, paramsString); } }; diff --git a/src/include/processor/operator/ddl/create_node_table.h b/src/include/processor/operator/ddl/create_node_table.h index b45323ee2cb..09d14169760 100644 --- a/src/include/processor/operator/ddl/create_node_table.h +++ b/src/include/processor/operator/ddl/create_node_table.h @@ -1,5 +1,6 @@ #pragma once +#include "binder/ddl/bound_create_table_info.h" #include "processor/operator/ddl/ddl.h" namespace kuzu { @@ -7,23 +8,20 @@ namespace processor { class CreateNodeTable : public DDL { public: - CreateNodeTable(catalog::Catalog* catalog, storage::StorageManager* storageManager, - binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, + CreateNodeTable(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_NODE_TABLE, catalog, outputPos, id, paramsString}, - storageManager{storageManager}, info{std::move(info)} {} + : DDL{PhysicalOperatorType::CREATE_NODE_TABLE, outputPos, id, paramsString}, info{std::move( + info)} {} void executeDDLInternal(ExecutionContext* context) final; std::string getOutputMsg() final; std::unique_ptr clone() final { - return std::make_unique( - catalog, storageManager, info.copy(), outputPos, id, paramsString); + return std::make_unique(info.copy(), outputPos, id, paramsString); } private: - storage::StorageManager* storageManager; binder::BoundCreateTableInfo info; }; diff --git a/src/include/processor/operator/ddl/create_rdf_graph.h b/src/include/processor/operator/ddl/create_rdf_graph.h index 3321475ae29..2596df63eb8 100644 --- a/src/include/processor/operator/ddl/create_rdf_graph.h +++ b/src/include/processor/operator/ddl/create_rdf_graph.h @@ -8,10 +8,9 @@ namespace processor { class CreateRdfGraph final : public DDL { public: - CreateRdfGraph(catalog::Catalog* catalog, storage::StorageManager* storageManager, - binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, - const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_RDF_GRAPH, catalog, outputPos, id, paramsString}, + CreateRdfGraph(storage::StorageManager* storageManager, binder::BoundCreateTableInfo info, + const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::CREATE_RDF_GRAPH, outputPos, id, paramsString}, storageManager{storageManager}, nodesStatistics{storageManager->getNodesStatisticsAndDeletedIDs()}, relsStatistics{storageManager->getRelsStatistics()}, info{std::move(info)} {} @@ -22,7 +21,7 @@ class CreateRdfGraph final : public DDL { inline std::unique_ptr clone() override { return std::make_unique( - catalog, storageManager, info.copy(), outputPos, id, paramsString); + storageManager, info.copy(), outputPos, id, paramsString); } private: diff --git a/src/include/processor/operator/ddl/create_rel_table.h b/src/include/processor/operator/ddl/create_rel_table.h index 24d8da1dd3f..9a338d65722 100644 --- a/src/include/processor/operator/ddl/create_rel_table.h +++ b/src/include/processor/operator/ddl/create_rel_table.h @@ -1,5 +1,6 @@ #pragma once +#include "binder/ddl/bound_create_table_info.h" #include "processor/operator/ddl/ddl.h" namespace kuzu { @@ -7,23 +8,20 @@ namespace processor { class CreateRelTable final : public DDL { public: - CreateRelTable(catalog::Catalog* catalog, storage::StorageManager* storageManager, - binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, + CreateRelTable(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_REL_TABLE, catalog, outputPos, id, paramsString}, - storageManager{storageManager}, info{std::move(info)} {} + : DDL{PhysicalOperatorType::CREATE_REL_TABLE, outputPos, id, paramsString}, info{std::move( + info)} {} void executeDDLInternal(ExecutionContext* context) override; std::string getOutputMsg() override; std::unique_ptr clone() override { - return make_unique( - catalog, storageManager, info.copy(), outputPos, id, paramsString); + return make_unique(info.copy(), outputPos, id, paramsString); } private: - storage::StorageManager* storageManager; binder::BoundCreateTableInfo info; }; diff --git a/src/include/processor/operator/ddl/create_rel_table_group.h b/src/include/processor/operator/ddl/create_rel_table_group.h index 6789ed9536d..869e7e8c81a 100644 --- a/src/include/processor/operator/ddl/create_rel_table_group.h +++ b/src/include/processor/operator/ddl/create_rel_table_group.h @@ -1,5 +1,6 @@ #pragma once +#include "binder/ddl/bound_create_table_info.h" #include "processor/operator/ddl/ddl.h" namespace kuzu { @@ -7,23 +8,20 @@ namespace processor { class CreateRelTableGroup : public DDL { public: - CreateRelTableGroup(catalog::Catalog* catalog, storage::StorageManager* storageManager, - binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, + CreateRelTableGroup(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_REL_TABLE, catalog, outputPos, id, paramsString}, - storageManager{storageManager}, info{std::move(info)} {} + : DDL{PhysicalOperatorType::CREATE_REL_TABLE, outputPos, id, paramsString}, info{std::move( + info)} {} void executeDDLInternal(ExecutionContext* context) override; std::string getOutputMsg() override; std::unique_ptr clone() override { - return make_unique( - catalog, storageManager, info.copy(), outputPos, id, paramsString); + return make_unique(info.copy(), outputPos, id, paramsString); } private: - storage::StorageManager* storageManager; binder::BoundCreateTableInfo info; }; diff --git a/src/include/processor/operator/ddl/ddl.h b/src/include/processor/operator/ddl/ddl.h index 345d0af395e..85ab5ee965b 100644 --- a/src/include/processor/operator/ddl/ddl.h +++ b/src/include/processor/operator/ddl/ddl.h @@ -1,6 +1,5 @@ #pragma once -#include "catalog/catalog.h" #include "processor/operator/physical_operator.h" namespace kuzu { @@ -8,9 +7,9 @@ namespace processor { class DDL : public PhysicalOperator { public: - DDL(PhysicalOperatorType operatorType, catalog::Catalog* catalog, const DataPos& outputPos, - uint32_t id, const std::string& paramsString) - : PhysicalOperator{operatorType, id, paramsString}, catalog{catalog}, outputPos{outputPos}, + DDL(PhysicalOperatorType operatorType, const DataPos& outputPos, uint32_t id, + const std::string& paramsString) + : PhysicalOperator{operatorType, id, paramsString}, outputPos{outputPos}, outputVector{nullptr}, hasExecuted{false} {} bool isSource() const final { return true; } @@ -25,7 +24,6 @@ class DDL : public PhysicalOperator { virtual void executeDDLInternal(ExecutionContext* context) = 0; protected: - catalog::Catalog* catalog; DataPos outputPos; common::ValueVector* outputVector; diff --git a/src/include/processor/operator/ddl/drop_property.h b/src/include/processor/operator/ddl/drop_property.h index 13d88308be9..93947d95fbd 100644 --- a/src/include/processor/operator/ddl/drop_property.h +++ b/src/include/processor/operator/ddl/drop_property.h @@ -1,30 +1,26 @@ #pragma once #include "ddl.h" -#include "storage/storage_manager.h" namespace kuzu { namespace processor { class DropProperty : public DDL { public: - DropProperty(catalog::Catalog* catalog, common::table_id_t tableID, - common::property_id_t propertyID, const DataPos& outputPos, - storage::StorageManager& storageManager, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::DROP_PROPERTY, catalog, outputPos, id, paramsString}, - storageManager{storageManager}, tableID{tableID}, propertyID{propertyID} {} + DropProperty(common::table_id_t tableID, common::property_id_t propertyID, + const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::DROP_PROPERTY, outputPos, id, paramsString}, tableID{tableID}, + propertyID{propertyID} {} void executeDDLInternal(ExecutionContext* context) final; std::string getOutputMsg() final { return {"Drop succeed."}; } std::unique_ptr clone() override { - return make_unique( - catalog, tableID, propertyID, outputPos, storageManager, id, paramsString); + return make_unique(tableID, propertyID, outputPos, id, paramsString); } protected: - storage::StorageManager& storageManager; common::table_id_t tableID; common::property_id_t propertyID; }; diff --git a/src/include/processor/operator/ddl/drop_table.h b/src/include/processor/operator/ddl/drop_table.h index 76df09d0d6c..0a7c1c2367f 100644 --- a/src/include/processor/operator/ddl/drop_table.h +++ b/src/include/processor/operator/ddl/drop_table.h @@ -7,9 +7,9 @@ namespace processor { class DropTable : public DDL { public: - DropTable(catalog::Catalog* catalog, std::string tableName, common::table_id_t tableID, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::DROP_TABLE, catalog, outputPos, id, paramsString}, + DropTable(std::string tableName, common::table_id_t tableID, const DataPos& outputPos, + uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::DROP_TABLE, outputPos, id, paramsString}, tableName{std::move(tableName)}, tableID{tableID} {} void executeDDLInternal(ExecutionContext* context) override; @@ -17,7 +17,7 @@ class DropTable : public DDL { std::string getOutputMsg() override; std::unique_ptr clone() override { - return make_unique(catalog, tableName, tableID, outputPos, id, paramsString); + return make_unique(tableName, tableID, outputPos, id, paramsString); } protected: diff --git a/src/include/processor/operator/ddl/rename_property.h b/src/include/processor/operator/ddl/rename_property.h index ac3ad075ca4..324a84e90e4 100644 --- a/src/include/processor/operator/ddl/rename_property.h +++ b/src/include/processor/operator/ddl/rename_property.h @@ -1,5 +1,6 @@ #pragma once +#include "catalog/catalog.h" #include "ddl.h" namespace kuzu { @@ -7,21 +8,20 @@ namespace processor { class RenameProperty : public DDL { public: - RenameProperty(catalog::Catalog* catalog, common::table_id_t tableID, - common::property_id_t propertyID, std::string newName, const DataPos& outputPos, - uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::RENAME_PROPERTY, catalog, outputPos, id, paramsString}, - tableID{tableID}, propertyID{propertyID}, newName{std::move(newName)} {} - - void executeDDLInternal(ExecutionContext* /*context*/) override { - catalog->renameProperty(tableID, propertyID, newName); + RenameProperty(common::table_id_t tableID, common::property_id_t propertyID, + std::string newName, const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::RENAME_PROPERTY, outputPos, id, paramsString}, tableID{tableID}, + propertyID{propertyID}, newName{std::move(newName)} {} + + void executeDDLInternal(ExecutionContext* context) override { + context->clientContext->getCatalog()->renameProperty(tableID, propertyID, newName); } std::string getOutputMsg() override { return "Property renamed"; } std::unique_ptr clone() override { return make_unique( - catalog, tableID, propertyID, newName, outputPos, id, paramsString); + tableID, propertyID, newName, outputPos, id, paramsString); } protected: diff --git a/src/include/processor/operator/ddl/rename_table.h b/src/include/processor/operator/ddl/rename_table.h index 42b0b2b1ecb..77f96493de2 100644 --- a/src/include/processor/operator/ddl/rename_table.h +++ b/src/include/processor/operator/ddl/rename_table.h @@ -1,5 +1,6 @@ #pragma once +#include "catalog/catalog.h" #include "ddl.h" namespace kuzu { @@ -7,19 +8,19 @@ namespace processor { class RenameTable final : public DDL { public: - RenameTable(catalog::Catalog* catalog, common::table_id_t tableID, std::string newName, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::RENAME_TABLE, catalog, outputPos, id, paramsString}, - tableID{tableID}, newName{std::move(newName)} {} + RenameTable(common::table_id_t tableID, std::string newName, const DataPos& outputPos, + uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::RENAME_TABLE, outputPos, id, paramsString}, tableID{tableID}, + newName{std::move(newName)} {} - void executeDDLInternal(ExecutionContext* /*context*/) override { - catalog->renameTable(tableID, newName); + void executeDDLInternal(ExecutionContext* context) override { + context->clientContext->getCatalog()->renameTable(tableID, newName); } std::string getOutputMsg() override { return "Table renamed"; } std::unique_ptr clone() override { - return make_unique(catalog, tableID, newName, outputPos, id, paramsString); + return make_unique(tableID, newName, outputPos, id, paramsString); } protected: diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index 7044677c126..8a0ef472f97 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -6,7 +6,6 @@ #include "planner/operator/logical_plan.h" #include "processor/operator/result_collector.h" #include "processor/physical_plan.h" -#include "storage/storage_manager.h" namespace kuzu { namespace main { @@ -33,10 +32,8 @@ struct PartitionerSharedState; class PlanMapper { public: // Create plan mapper with default mapper context. - PlanMapper(storage::StorageManager& storageManager, storage::MemoryManager* memoryManager, - catalog::Catalog* catalog, main::ClientContext* clientContext) - : storageManager{storageManager}, memoryManager{memoryManager}, expressionMapper{}, - catalog{catalog}, clientContext{clientContext}, physicalOperatorID{0} {} + explicit PlanMapper(main::ClientContext* clientContext) + : expressionMapper{}, clientContext{clientContext}, physicalOperatorID{0} {} std::unique_ptr mapLogicalPlanToPhysical( planner::LogicalPlan* logicalPlan, const binder::expression_vector& expressionsToCollect); @@ -173,13 +170,13 @@ class PlanMapper { const planner::LogicalInsertInfo* info, const planner::Schema& inSchema, const planner::Schema& outSchema) const; std::unique_ptr getRelInsertExecutor(const planner::LogicalInsertInfo* info, - const planner::Schema& inSchema, const planner::Schema& outSchema); + const planner::Schema& inSchema, const planner::Schema& outSchema) const; std::unique_ptr getNodeSetExecutor( planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const; std::unique_ptr getRelSetExecutor( planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const; - std::shared_ptr getSingleStringColumnFTable(); + std::shared_ptr getSingleStringColumnFTable() const; inline uint32_t getOperatorID() { return physicalOperatorID++; } @@ -194,10 +191,7 @@ class PlanMapper { } public: - storage::StorageManager& storageManager; - storage::MemoryManager* memoryManager; ExpressionMapper expressionMapper; - catalog::Catalog* catalog; main::ClientContext* clientContext; private: diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 6b68b9e0e47..a5d4986730a 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -17,6 +17,7 @@ #include "planner/planner.h" #include "processor/plan_mapper.h" #include "processor/processor.h" +#include "storage/storage_manager.h" #include "transaction/transaction_context.h" #if defined(_WIN32) @@ -295,7 +296,7 @@ std::unique_ptr ClientContext::prepareNoLock( preparedStatement->statementResult = std::make_unique(boundStatement->getStatementResult()->copy()); // planning - auto planner = Planner(database->catalog.get(), database->storageManager.get(), this); + auto planner = Planner(this); std::vector> plans; if (enumerateAllPlans) { plans = planner.getAllPlans(*boundStatement); @@ -395,8 +396,7 @@ std::unique_ptr ClientContext::executeAndAutoCommitIfNecessaryNoLoc } this->resetActiveQuery(); this->startTimer(); - auto mapper = PlanMapper( - *database->storageManager, database->memoryManager.get(), database->catalog.get(), this); + auto mapper = PlanMapper(this); std::unique_ptr physicalPlan; if (preparedStatement->isSuccess()) { try { diff --git a/src/planner/planner.cpp b/src/planner/planner.cpp index 459a0a1cbbf..40ad354ff8f 100644 --- a/src/planner/planner.cpp +++ b/src/planner/planner.cpp @@ -11,11 +11,9 @@ using namespace kuzu::storage; namespace kuzu { namespace planner { -Planner::Planner( - Catalog* catalog, StorageManager* storageManager, main::ClientContext* clientContext) - : catalog{catalog}, clientContext{clientContext} { - auto nStats = storageManager->getNodesStatisticsAndDeletedIDs(); - auto rStats = storageManager->getRelsStatistics(); +Planner::Planner(main::ClientContext* clientContext) : clientContext{clientContext} { + auto nStats = clientContext->getStorageManager()->getNodesStatisticsAndDeletedIDs(); + auto rStats = clientContext->getStorageManager()->getRelsStatistics(); cardinalityEstimator = CardinalityEstimator(nStats, rStats); context = JoinOrderEnumeratorContext(); } diff --git a/src/processor/map/create_factorized_table_scan.cpp b/src/processor/map/create_factorized_table_scan.cpp index 102e7dcfe77..2e135b27782 100644 --- a/src/processor/map/create_factorized_table_scan.cpp +++ b/src/processor/map/create_factorized_table_scan.cpp @@ -1,6 +1,7 @@ #include #include "binder/expression/expression_util.h" +#include "catalog/catalog.h" #include "processor/operator/call/in_query_call.h" #include "processor/operator/table_scan/ftable_scan_function.h" #include "processor/plan_mapper.h" @@ -25,7 +26,7 @@ std::unique_ptr PlanMapper::createFTableScan(const expression_ auto bindData = std::make_unique(table, std::move(colIndices), maxMorselSize); auto function = function::BuiltInFunctionsUtils::matchFunction( - READ_FTABLE_FUNC_NAME, catalog->getFunctions(clientContext->getTx())); + READ_FTABLE_FUNC_NAME, clientContext->getCatalog()->getFunctions(clientContext->getTx())); auto info = InQueryCallInfo(); info.function = *ku_dynamic_cast(function); info.bindData = std::move(bindData); diff --git a/src/processor/map/create_result_collector.cpp b/src/processor/map/create_result_collector.cpp index 8dd58eb0f9d..685fedc4d3e 100644 --- a/src/processor/map/create_result_collector.cpp +++ b/src/processor/map/create_result_collector.cpp @@ -26,7 +26,8 @@ std::unique_ptr PlanMapper::createResultCollector(AccumulateTyp tableSchema->appendColumn(std::move(columnSchema)); payloadsPos.push_back(dataPos); } - auto table = std::make_shared(memoryManager, tableSchema->copy()); + auto table = + std::make_shared(clientContext->getMemoryManager(), tableSchema->copy()); auto sharedState = std::make_shared(std::move(table)); auto info = std::make_unique(accumulateType, std::move(tableSchema), payloadsPos); diff --git a/src/processor/map/map_comment_on.cpp b/src/processor/map/map_comment_on.cpp index 57fa65e372f..dea444f97e3 100644 --- a/src/processor/map/map_comment_on.cpp +++ b/src/processor/map/map_comment_on.cpp @@ -16,7 +16,8 @@ std::unique_ptr PlanMapper::mapCommentOn( auto outputExpression = logicalCommentOn->getOutputExpression(); auto outputPos = DataPos(outSchema->getExpressionPos(*outputExpression)); auto commentOnInfo = std::make_unique(logicalCommentOn->getTableID(), - logicalCommentOn->getTableName(), logicalCommentOn->getComment(), outputPos, catalog); + logicalCommentOn->getTableName(), logicalCommentOn->getComment(), outputPos, + clientContext->getCatalog()); return std::make_unique( std::move(commentOnInfo), getOperatorID(), logicalCommentOn->getExpressionsForPrinting()); } diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index a2682063503..35a1e79cc93 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -9,6 +9,7 @@ #include "processor/operator/persistent/node_batch_insert.h" #include "processor/operator/persistent/rel_batch_insert.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::binder; using namespace kuzu::catalog; @@ -95,6 +96,7 @@ static std::vector getColumnDataPositions(const std::vector PlanMapper::mapCopyNodeFrom(LogicalOperator* logicalOperator) { + auto storageManager = clientContext->getStorageManager(); auto copyFrom = ku_dynamic_cast(logicalOperator); auto copyFromInfo = copyFrom->getInfo(); auto outFSchema = copyFrom->getSchema(); @@ -102,9 +104,9 @@ std::unique_ptr PlanMapper::mapCopyNodeFrom(LogicalOperator* l ku_dynamic_cast(copyFromInfo->tableEntry); // Map reader. auto prevOperator = mapOperator(copyFrom->getChild(0).get()); - auto nodeTable = storageManager.getNodeTable(nodeTableEntry->getTableID()); + auto nodeTable = storageManager->getNodeTable(nodeTableEntry->getTableID()); auto sharedState = std::make_shared( - nodeTable, getSingleStringColumnFTable(), storageManager.getWAL()); + nodeTable, getSingleStringColumnFTable(), storageManager->getWAL()); if (prevOperator->getOperatorType() == PhysicalOperatorType::IN_QUERY_CALL) { auto inQueryCall = ku_dynamic_cast(prevOperator.get()); sharedState->readerSharedState = inQueryCall->getSharedState(); @@ -133,7 +135,7 @@ std::unique_ptr PlanMapper::mapCopyNodeFrom(LogicalOperator* l getColumnDataPositions(columnNamesExcludingSerial, inputColumns, *outFSchema); auto containsSerial = nodeTableEntry->containPropertyType(*LogicalType::SERIAL()); auto info = - std::make_unique(nodeTableEntry, storageManager.compressionEnabled(), + std::make_unique(nodeTableEntry, storageManager->compressionEnabled(), std::move(columnPositions), containsSerial, std::move(columnTypes)); return std::make_unique(std::move(info), sharedState, std::make_unique(copyFrom->getSchema()), std::move(prevOperator), @@ -157,7 +159,7 @@ std::unique_ptr PlanMapper::mapPartitioner(LogicalOperator* lo infos.push_back(std::make_unique(keyPos, columnPositions, std::move(columnTypes), PartitionerFunctions::partitionRelData)); } - auto sharedState = std::make_shared(memoryManager); + auto sharedState = std::make_shared(clientContext->getMemoryManager()); return std::make_unique(std::make_unique(outFSchema), std::move(infos), std::move(sharedState), std::move(prevOperator), getOperatorID(), logicalPartitioner->getExpressionsForPrinting()); @@ -172,8 +174,8 @@ std::unique_ptr PlanMapper::createCopyRel( auto partitioningIdx = direction == RelDataDirection::FWD ? 0 : 1; auto offsetVectorIdx = direction == RelDataDirection::FWD ? 0 : 1; auto relBatchInsertInfo = std::make_unique(copyFromInfo->tableEntry, - storageManager.compressionEnabled(), direction, partitioningIdx, offsetVectorIdx, - std::move(columnTypes)); + clientContext->getStorageManager()->compressionEnabled(), direction, partitioningIdx, + offsetVectorIdx, std::move(columnTypes)); return std::make_unique(std::move(relBatchInsertInfo), std::move(partitionerSharedState), std::move(sharedState), std::make_unique(outFSchema), getOperatorID(), @@ -188,10 +190,11 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator auto prevOperator = mapOperator(copyFrom->getChild(0).get()); KU_ASSERT(prevOperator->getOperatorType() == PhysicalOperatorType::PARTITIONER); auto partitionerSharedState = dynamic_cast(prevOperator.get())->getSharedState(); + auto storageManager = clientContext->getStorageManager(); partitionerSharedState->srcNodeTable = - storageManager.getNodeTable(relTableEntry->getSrcTableID()); + storageManager->getNodeTable(relTableEntry->getSrcTableID()); partitionerSharedState->dstNodeTable = - storageManager.getNodeTable(relTableEntry->getDstTableID()); + storageManager->getNodeTable(relTableEntry->getDstTableID()); // TODO(Xiyang): Move binding of column types to binder. std::vector columnTypes; columnTypes.push_back(*LogicalType::INTERNAL_ID()); // NBR_ID COLUMN. @@ -199,8 +202,8 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator columnTypes.push_back(*property.getDataType()->copy()); } auto batchInsertSharedState = std::make_shared( - storageManager.getRelTable(relTableEntry->getTableID()), getSingleStringColumnFTable(), - storageManager.getWAL()); + storageManager->getRelTable(relTableEntry->getTableID()), getSingleStringColumnFTable(), + storageManager->getWAL()); auto copyRelFWD = createCopyRel(partitionerSharedState, batchInsertSharedState, copyFrom, RelDataDirection::FWD, LogicalType::copy(columnTypes)); auto copyRelBWD = createCopyRel(partitionerSharedState, batchInsertSharedState, copyFrom, diff --git a/src/processor/map/map_copy_to.cpp b/src/processor/map/map_copy_to.cpp index 9e23ab1fa8b..d00628fc3ff 100644 --- a/src/processor/map/map_copy_to.cpp +++ b/src/processor/map/map_copy_to.cpp @@ -88,7 +88,8 @@ std::unique_ptr PlanMapper::mapCopyTo(LogicalOperator* logical } std::shared_ptr fTable; auto ftTableSchema = std::make_unique(); - fTable = std::make_shared(memoryManager, std::move(ftTableSchema)); + fTable = std::make_shared( + clientContext->getMemoryManager(), std::move(ftTableSchema)); return createEmptyFTableScan(fTable, 0, std::move(copyTo)); } diff --git a/src/processor/map/map_create_macro.cpp b/src/processor/map/map_create_macro.cpp index 1e36a59ca8b..4bb5e20bcf2 100644 --- a/src/processor/map/map_create_macro.cpp +++ b/src/processor/map/map_create_macro.cpp @@ -13,8 +13,8 @@ std::unique_ptr PlanMapper::mapCreateMacro( auto outSchema = logicalCreateMacro->getSchema(); auto outputExpression = logicalCreateMacro->getOutputExpression(); auto outputPos = DataPos(outSchema->getExpressionPos(*outputExpression)); - auto createMacroInfo = std::make_unique( - logicalCreateMacro->getMacroName(), logicalCreateMacro->getMacro(), outputPos, catalog); + auto createMacroInfo = std::make_unique(logicalCreateMacro->getMacroName(), + logicalCreateMacro->getMacro(), outputPos, clientContext->getCatalog()); return std::make_unique(PhysicalOperatorType::CREATE_MACRO, std::move(createMacroInfo), getOperatorID(), logicalCreateMacro->getExpressionsForPrinting()); diff --git a/src/processor/map/map_ddl.cpp b/src/processor/map/map_ddl.cpp index 86488617b07..c94f957cf3b 100644 --- a/src/processor/map/map_ddl.cpp +++ b/src/processor/map/map_ddl.cpp @@ -48,36 +48,33 @@ std::unique_ptr PlanMapper::mapCreateTable(LogicalOperator* lo std::unique_ptr PlanMapper::mapCreateNodeTable(LogicalOperator* logicalOperator) { auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(catalog, &storageManager, - createTable->getInfo()->copy(), getOutputPos(createTable), getOperatorID(), - createTable->getExpressionsForPrinting()); + return std::make_unique(createTable->getInfo()->copy(), + getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapCreateRelTable(LogicalOperator* logicalOperator) { auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(catalog, &storageManager, - createTable->getInfo()->copy(), getOutputPos(createTable), getOperatorID(), - createTable->getExpressionsForPrinting()); + return std::make_unique(createTable->getInfo()->copy(), + getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapCreateRelTableGroup( LogicalOperator* logicalOperator) { auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(catalog, &storageManager, - createTable->getInfo()->copy(), getOutputPos(createTable), getOperatorID(), - createTable->getExpressionsForPrinting()); + return std::make_unique(createTable->getInfo()->copy(), + getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapCreateRdfGraph(LogicalOperator* logicalOperator) { auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(catalog, &storageManager, + return std::make_unique(clientContext->getStorageManager(), createTable->getInfo()->copy(), getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapDropTable(LogicalOperator* logicalOperator) { auto dropTable = (LogicalDropTable*)logicalOperator; - return std::make_unique(catalog, dropTable->getTableName(), dropTable->getTableID(), + return std::make_unique(dropTable->getTableName(), dropTable->getTableID(), getOutputPos(dropTable), getOperatorID(), dropTable->getExpressionsForPrinting()); } @@ -105,8 +102,8 @@ std::unique_ptr PlanMapper::mapRenameTable(LogicalOperator* lo auto alter = reinterpret_cast(logicalOperator); auto info = alter->getInfo(); auto extraInfo = reinterpret_cast(info->extraInfo.get()); - return std::make_unique(catalog, info->tableID, extraInfo->newName, - getOutputPos(alter), getOperatorID(), alter->getExpressionsForPrinting()); + return std::make_unique(info->tableID, extraInfo->newName, getOutputPos(alter), + getOperatorID(), alter->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapAddProperty(LogicalOperator* logicalOperator) { @@ -115,16 +112,17 @@ std::unique_ptr PlanMapper::mapAddProperty(LogicalOperator* lo auto extraInfo = reinterpret_cast(info->extraInfo.get()); auto expressionEvaluator = ExpressionMapper::getEvaluator(extraInfo->defaultValue, alter->getSchema()); - auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), info->tableID); + auto tableSchema = + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), info->tableID); switch (tableSchema->getTableType()) { case TableType::NODE: - return std::make_unique(catalog, info->tableID, extraInfo->propertyName, - extraInfo->dataType.copy(), std::move(expressionEvaluator), storageManager, - getOutputPos(alter), getOperatorID(), alter->getExpressionsForPrinting()); + return std::make_unique(info->tableID, extraInfo->propertyName, + extraInfo->dataType.copy(), std::move(expressionEvaluator), getOutputPos(alter), + getOperatorID(), alter->getExpressionsForPrinting()); case TableType::REL: - return std::make_unique(catalog, info->tableID, extraInfo->propertyName, - extraInfo->dataType.copy(), std::move(expressionEvaluator), storageManager, - getOutputPos(alter), getOperatorID(), alter->getExpressionsForPrinting()); + return std::make_unique(info->tableID, extraInfo->propertyName, + extraInfo->dataType.copy(), std::move(expressionEvaluator), getOutputPos(alter), + getOperatorID(), alter->getExpressionsForPrinting()); default: KU_UNREACHABLE; } @@ -134,15 +132,15 @@ std::unique_ptr PlanMapper::mapDropProperty(LogicalOperator* l auto alter = reinterpret_cast(logicalOperator); auto info = alter->getInfo(); auto extraInfo = reinterpret_cast(info->extraInfo.get()); - return std::make_unique(catalog, info->tableID, extraInfo->propertyID, - getOutputPos(alter), storageManager, getOperatorID(), alter->getExpressionsForPrinting()); + return std::make_unique(info->tableID, extraInfo->propertyID, getOutputPos(alter), + getOperatorID(), alter->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapRenameProperty(LogicalOperator* logicalOperator) { auto alter = reinterpret_cast(logicalOperator); auto info = alter->getInfo(); auto extraInfo = reinterpret_cast(info->extraInfo.get()); - return std::make_unique(catalog, info->tableID, extraInfo->propertyID, + return std::make_unique(info->tableID, extraInfo->propertyID, extraInfo->newName, getOutputPos(alter), getOperatorID(), alter->getExpressionsForPrinting()); } diff --git a/src/processor/map/map_delete.cpp b/src/processor/map/map_delete.cpp index be19146804c..4f4c4fbc873 100644 --- a/src/processor/map/map_delete.cpp +++ b/src/processor/map/map_delete.cpp @@ -1,6 +1,7 @@ #include "planner/operator/persistent/logical_delete.h" #include "processor/operator/persistent/delete.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::binder; using namespace kuzu::catalog; @@ -102,7 +103,8 @@ std::unique_ptr PlanMapper::mapDeleteRel(LogicalOperator* logi auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); std::vector> Executors; for (auto& rel : logicalDeleteRel->getRelsRef()) { - Executors.push_back(getRelDeleteExecutor(storageManager, *rel, *inSchema)); + Executors.push_back( + getRelDeleteExecutor(*clientContext->getStorageManager(), *rel, *inSchema)); } return std::make_unique(std::move(Executors), std::move(prevOperator), getOperatorID(), logicalOperator->getExpressionsForPrinting()); diff --git a/src/processor/map/map_dummy_scan.cpp b/src/processor/map/map_dummy_scan.cpp index 1b48be28496..3cd85ae07b0 100644 --- a/src/processor/map/map_dummy_scan.cpp +++ b/src/processor/map/map_dummy_scan.cpp @@ -18,6 +18,7 @@ std::unique_ptr PlanMapper::mapDummyScan(LogicalOperator* /*lo std::make_unique(false, 0 /* all expressions are in the same datachunk */, LogicalTypeUtils::getRowLayoutSize(expression->dataType))); auto expressionEvaluator = ExpressionMapper::getEvaluator(expression, inSchema.get()); + auto memoryManager = clientContext->getMemoryManager(); // expression can be evaluated statically and does not require an actual resultset to init expressionEvaluator->init(ResultSet(0) /* dummy resultset */, memoryManager); expressionEvaluator->evaluate(clientContext); diff --git a/src/processor/map/map_explain.cpp b/src/processor/map/map_explain.cpp index 0f7a08807ef..d7232f060ff 100644 --- a/src/processor/map/map_explain.cpp +++ b/src/processor/map/map_explain.cpp @@ -30,8 +30,8 @@ std::unique_ptr PlanMapper::mapExplain(LogicalOperator* logica auto planPrinter = std::make_unique(physicalPlanToExplain.get(), profiler.get()); auto explainStr = planPrinter->printPlanToOstream().str(); - auto factorizedTable = - FactorizedTableUtils::getFactorizedTableForOutputMsg(explainStr, memoryManager); + auto factorizedTable = FactorizedTableUtils::getFactorizedTableForOutputMsg( + explainStr, clientContext->getMemoryManager()); return createFTableScanAligned(expression_vector{outputExpression}, outSchema, factorizedTable, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */); } diff --git a/src/processor/map/map_extend.cpp b/src/processor/map/map_extend.cpp index 93422aadf40..3d5a99bb4a9 100644 --- a/src/processor/map/map_extend.cpp +++ b/src/processor/map/map_extend.cpp @@ -3,6 +3,7 @@ #include "processor/operator/scan/scan_multi_rel_tables.h" #include "processor/operator/scan/scan_rel_table.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -102,10 +103,11 @@ std::unique_ptr PlanMapper::mapExtend(LogicalOperator* logical if (!rel->isMultiLabeled() && !boundNode->isMultiLabeled() && extendDirection != ExtendDirection::BOTH) { auto relTableEntry = ku_dynamic_cast( - catalog->getTableCatalogEntry(clientContext->getTx(), rel->getSingleTableID())); + clientContext->getCatalog()->getTableCatalogEntry( + clientContext->getTx(), rel->getSingleTableID())); auto relDataDirection = ExtendDirectionUtils::getRelDataDirection(extendDirection); - auto scanInfo = getRelTableScanInfo( - relTableEntry, relDataDirection, &storageManager, extend->getProperties()); + auto scanInfo = getRelTableScanInfo(relTableEntry, relDataDirection, + clientContext->getStorageManager(), extend->getProperties()); return std::make_unique(std::move(scanInfo), inNodeVectorPos, outVectorsPos, std::move(prevOperator), getOperatorID(), extend->getExpressionsForPrinting()); } else { // map to generic extend diff --git a/src/processor/map/map_hash_join.cpp b/src/processor/map/map_hash_join.cpp index 669c4d8ee09..e662b24b104 100644 --- a/src/processor/map/map_hash_join.cpp +++ b/src/processor/map/map_hash_join.cpp @@ -81,8 +81,8 @@ std::unique_ptr PlanMapper::mapHashJoin(LogicalOperator* logic ExpressionUtil::excludeExpressions(hashJoin->getExpressionsToMaterialize(), probeKeys); // Create build auto buildInfo = createHashBuildInfo(*buildSchema, buildKeys, payloads); - auto globalHashTable = std::make_unique( - *memoryManager, LogicalType::copy(buildKeyTypes), buildInfo->getTableSchema()->copy()); + auto globalHashTable = std::make_unique(*clientContext->getMemoryManager(), + LogicalType::copy(buildKeyTypes), buildInfo->getTableSchema()->copy()); auto sharedState = std::make_shared(std::move(globalHashTable)); auto hashJoinBuild = make_unique(std::make_unique(buildSchema), sharedState, diff --git a/src/processor/map/map_index_scan_node.cpp b/src/processor/map/map_index_scan_node.cpp index 88b43e0b231..bb8d2d9a3e4 100644 --- a/src/processor/map/map_index_scan_node.cpp +++ b/src/processor/map/map_index_scan_node.cpp @@ -2,6 +2,7 @@ #include "processor/operator/index_lookup.h" #include "processor/operator/index_scan.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::planner; @@ -15,11 +16,12 @@ std::unique_ptr PlanMapper::mapIndexScan( auto outSchema = logicalIndexScan->getSchema(); auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); // TODO(Xiyang): potentially we should merge IndexScan and IndexLook + auto storageManager = clientContext->getStorageManager(); if (logicalIndexScan->getNumInfos() > 1) { std::vector> indexLookupInfos; for (auto i = 0u; i < logicalIndexScan->getNumInfos(); ++i) { auto info = logicalIndexScan->getInfo(i); - auto storageIndex = storageManager.getNodeTable(info->nodeTableID)->getPKIndex(); + auto storageIndex = storageManager->getNodeTable(info->nodeTableID)->getPKIndex(); auto offsetPos = DataPos(outSchema->getExpressionPos(*info->offset)); auto keyPos = DataPos(outSchema->getExpressionPos(*info->key)); indexLookupInfos.push_back(std::make_unique( @@ -29,7 +31,7 @@ std::unique_ptr PlanMapper::mapIndexScan( getOperatorID(), logicalIndexScan->getExpressionsForPrinting()); } else { auto info = logicalIndexScan->getInfo(0); - auto nodeTable = storageManager.getNodeTable(info->nodeTableID); + auto nodeTable = storageManager->getNodeTable(info->nodeTableID); auto evaluator = ExpressionMapper::getEvaluator(info->key, inSchema); auto outDataPos = DataPos(outSchema->getExpressionPos(*info->offset)); return make_unique(nodeTable->getTableID(), nodeTable->getPKIndex(), diff --git a/src/processor/map/map_insert.cpp b/src/processor/map/map_insert.cpp index d778eb402f0..1942050eb43 100644 --- a/src/processor/map/map_insert.cpp +++ b/src/processor/map/map_insert.cpp @@ -3,6 +3,7 @@ #include "planner/operator/persistent/logical_insert.h" #include "processor/operator/persistent/insert.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::evaluator; using namespace kuzu::planner; @@ -29,21 +30,23 @@ static std::vector populateReturnVectorsPos( std::unique_ptr PlanMapper::getNodeInsertExecutor( const LogicalInsertInfo* info, const Schema& inSchema, const Schema& outSchema) const { + auto storageManager = clientContext->getStorageManager(); auto node = ku_dynamic_cast(info->pattern.get()); auto nodeTableID = node->getSingleTableID(); - auto table = storageManager.getNodeTable(nodeTableID); + auto table = storageManager->getNodeTable(nodeTableID); std::unordered_set fwdRelTablesToInit; std::unordered_set bwdRelTablesToInit; - auto tableCatalogEntry = catalog->getTableCatalogEntry(clientContext->getTx(), nodeTableID); + auto tableCatalogEntry = + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), nodeTableID); auto nodeTableSchema = ku_dynamic_cast(tableCatalogEntry); auto fwdRelTableIDs = nodeTableSchema->getFwdRelTableIDSet(); auto bwdRelTableIDs = nodeTableSchema->getBwdRelTableIDSet(); for (auto relTableID : fwdRelTableIDs) { - fwdRelTablesToInit.insert(storageManager.getRelTable(relTableID)); + fwdRelTablesToInit.insert(storageManager->getRelTable(relTableID)); } for (auto relTableID : bwdRelTableIDs) { - bwdRelTablesToInit.insert(storageManager.getRelTable(relTableID)); + bwdRelTablesToInit.insert(storageManager->getRelTable(relTableID)); } auto nodeIDPos = DataPos(outSchema.getExpressionPos(*node->getInternalID())); auto returnVectorsPos = populateReturnVectorsPos(*info, outSchema); @@ -59,10 +62,11 @@ std::unique_ptr PlanMapper::getNodeInsertExecutor( std::unique_ptr PlanMapper::getRelInsertExecutor( const planner::LogicalInsertInfo* info, const planner::Schema& inSchema, - const planner::Schema& outSchema) { + const planner::Schema& outSchema) const { + auto storageManager = clientContext->getStorageManager(); auto rel = ku_dynamic_cast(info->pattern.get()); auto relTableID = rel->getSingleTableID(); - auto table = storageManager.getRelTable(relTableID); + auto table = storageManager->getRelTable(relTableID); auto srcNode = rel->getSrcNode(); auto dstNode = rel->getDstNode(); auto srcNodePos = DataPos(inSchema.getExpressionPos(*srcNode->getInternalID())); @@ -73,7 +77,7 @@ std::unique_ptr PlanMapper::getRelInsertExecutor( for (auto& expr : info->columnDataExprs) { evaluators.push_back(ExpressionMapper::getEvaluator(expr, &outSchema)); } - return std::make_unique(storageManager.getRelsStatistics(), table, + return std::make_unique(storageManager->getRelsStatistics(), table, srcNodePos, dstNodePos, std::move(returnVectorsPos), std::move(evaluators)); } diff --git a/src/processor/map/map_intersect.cpp b/src/processor/map/map_intersect.cpp index a2910833747..a59f2c27b69 100644 --- a/src/processor/map/map_intersect.cpp +++ b/src/processor/map/map_intersect.cpp @@ -29,8 +29,8 @@ std::unique_ptr PlanMapper::mapIntersect(LogicalOperator* logi auto payloadExpressions = binder::ExpressionUtil::excludeExpressions(buildSchema->getExpressionsInScope(), keys); auto buildInfo = createHashBuildInfo(*buildSchema, keys, payloadExpressions); - auto globalHashTable = std::make_unique( - *memoryManager, LogicalType::copy(keyTypes), buildInfo->getTableSchema()->copy()); + auto globalHashTable = std::make_unique(*clientContext->getMemoryManager(), + LogicalType::copy(keyTypes), buildInfo->getTableSchema()->copy()); auto sharedState = std::make_shared(std::move(globalHashTable)); sharedStates.push_back(sharedState); children[i] = make_unique( diff --git a/src/processor/map/map_path_property_probe.cpp b/src/processor/map/map_path_property_probe.cpp index 66ef428332f..e5f6c4a68b5 100644 --- a/src/processor/map/map_path_property_probe.cpp +++ b/src/processor/map/map_path_property_probe.cpp @@ -57,8 +57,8 @@ std::unique_ptr PlanMapper::mapPathPropertyProbe( auto nodePayloads = ExpressionUtil::excludeExpressions(nodeBuildSchema->getExpressionsInScope(), nodeKeys); auto nodeBuildInfo = createHashBuildInfo(*nodeBuildSchema, nodeKeys, nodePayloads); - auto nodeHashTable = std::make_unique( - *memoryManager, std::move(nodeKeyTypes), nodeBuildInfo->getTableSchema()->copy()); + auto nodeHashTable = std::make_unique(*clientContext->getMemoryManager(), + std::move(nodeKeyTypes), nodeBuildInfo->getTableSchema()->copy()); nodeBuildSharedState = std::make_shared(std::move(nodeHashTable)); nodeBuild = make_unique( std::make_unique(nodeBuildSchema), nodeBuildSharedState, @@ -84,8 +84,8 @@ std::unique_ptr PlanMapper::mapPathPropertyProbe( auto relPayloads = ExpressionUtil::excludeExpressions(relBuildSchema->getExpressionsInScope(), relKeys); auto relBuildInfo = createHashBuildInfo(*relBuildSchema, relKeys, relPayloads); - auto relHashTable = std::make_unique( - *memoryManager, std::move(relKeyTypes), relBuildInfo->getTableSchema()->copy()); + auto relHashTable = std::make_unique(*clientContext->getMemoryManager(), + std::move(relKeyTypes), relBuildInfo->getTableSchema()->copy()); relBuildSharedState = std::make_shared(std::move(relHashTable)); relBuild = std::make_unique( std::make_unique(relBuildSchema), relBuildSharedState, diff --git a/src/processor/map/map_recursive_extend.cpp b/src/processor/map/map_recursive_extend.cpp index 803ca6a4f3b..e6a54ea432e 100644 --- a/src/processor/map/map_recursive_extend.cpp +++ b/src/processor/map/map_recursive_extend.cpp @@ -1,6 +1,7 @@ #include "planner/operator/extend/logical_recursive_extend.h" #include "processor/operator/recursive_extend/recursive_join.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::binder; using namespace kuzu::planner; @@ -42,13 +43,13 @@ std::unique_ptr PlanMapper::mapRecursiveExtend( auto boundNodeIDPos = DataPos(inSchema->getExpressionPos(*boundNode->getInternalID())); auto nbrNodeIDPos = DataPos(outSchema->getExpressionPos(*nbrNode->getInternalID())); auto lengthPos = DataPos(outSchema->getExpressionPos(*lengthExpression)); - auto sharedState = createSharedState(*nbrNode, storageManager); + auto sharedState = createSharedState(*nbrNode, *clientContext->getStorageManager()); auto pathPos = DataPos(); if (extend->getJoinType() == planner::RecursiveJoinType::TRACK_PATH) { pathPos = DataPos(outSchema->getExpressionPos(*rel)); } std::unordered_map tableIDToName; - for (auto& entry : catalog->getTableEntries(clientContext->getTx())) { + for (auto& entry : clientContext->getCatalog()->getTableEntries(clientContext->getTx())) { tableIDToName.insert({entry->getTableID(), entry->getName()}); } auto dataInfo = std::make_unique(boundNodeIDPos, nbrNodeIDPos, diff --git a/src/processor/map/map_scan_node.cpp b/src/processor/map/map_scan_node.cpp index 982e6c7f4fa..860f32ea6e2 100644 --- a/src/processor/map/map_scan_node.cpp +++ b/src/processor/map/map_scan_node.cpp @@ -2,6 +2,7 @@ #include "planner/operator/scan/logical_scan_internal_id.h" #include "processor/operator/scan_node_id.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::planner; @@ -14,7 +15,7 @@ std::unique_ptr PlanMapper::mapScanInternalID(LogicalOperator* auto dataPos = DataPos(outSchema->getExpressionPos(*scan->getInternalID())); auto sharedState = std::make_shared(); for (auto& tableID : scan->getTableIDs()) { - auto nodeTable = storageManager.getNodeTable(tableID); + auto nodeTable = clientContext->getStorageManager()->getNodeTable(tableID); sharedState->addTableState(nodeTable); } return std::make_unique( diff --git a/src/processor/map/map_scan_node_property.cpp b/src/processor/map/map_scan_node_property.cpp index 046acef262d..80382f243de 100644 --- a/src/processor/map/map_scan_node_property.cpp +++ b/src/processor/map/map_scan_node_property.cpp @@ -2,6 +2,7 @@ #include "planner/operator/scan/logical_scan_node_property.h" #include "processor/operator/scan/scan_multi_node_tables.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -31,19 +32,22 @@ std::unique_ptr PlanMapper::mapScanNodeProperty( if (!property->hasPropertyID(tableID)) { columns.push_back(UINT32_MAX); } else { - columns.push_back(catalog->getTableCatalogEntry(clientContext->getTx(), tableID) + columns.push_back(clientContext->getCatalog() + ->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(property->getPropertyID(tableID))); } } tables.insert({tableID, std::make_unique( - storageManager.getNodeTable(tableID), std::move(columns))}); + clientContext->getStorageManager()->getNodeTable(tableID), + std::move(columns))}); } return std::make_unique(inputNodeIDVectorPos, std::move(outVectorsPos), std::move(tables), std::move(prevOperator), getOperatorID(), scanProperty.getExpressionsForPrinting()); } else { auto tableID = tableIDs[0]; - auto tableSchema = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); + auto tableSchema = + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), tableID); std::vector columnIDs; for (auto& expression : scanProperty.getProperties()) { auto property = static_pointer_cast(expression); @@ -54,7 +58,7 @@ std::unique_ptr PlanMapper::mapScanNodeProperty( } } auto info = std::make_unique( - storageManager.getNodeTable(tableID), std::move(columnIDs)); + clientContext->getStorageManager()->getNodeTable(tableID), std::move(columnIDs)); return std::make_unique(std::move(info), inputNodeIDVectorPos, std::move(outVectorsPos), std::move(prevOperator), getOperatorID(), scanProperty.getExpressionsForPrinting()); diff --git a/src/processor/map/map_set.cpp b/src/processor/map/map_set.cpp index d919577c396..5044fdd0f9a 100644 --- a/src/processor/map/map_set.cpp +++ b/src/processor/map/map_set.cpp @@ -3,6 +3,7 @@ #include "planner/operator/persistent/logical_set.h" #include "processor/operator/persistent/set.h" #include "processor/plan_mapper.h" +#include "storage/storage_manager.h" using namespace kuzu::binder; using namespace kuzu::common; @@ -15,6 +16,8 @@ namespace processor { std::unique_ptr PlanMapper::getNodeSetExecutor( planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const { + auto storageManager = clientContext->getStorageManager(); + auto catalog = clientContext->getCatalog(); auto node = (NodeExpression*)info->nodeOrRel.get(); auto nodeIDPos = DataPos(inSchema.getExpressionPos(*node->getInternalID())); auto property = (PropertyExpression*)info->setItem.first.get(); @@ -30,7 +33,7 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( continue; } auto propertyID = property->getPropertyID(tableID); - auto table = storageManager.getNodeTable(tableID); + auto table = storageManager->getNodeTable(tableID); auto columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); tableIDToSetInfo.insert({tableID, NodeSetInfo{table, columnID}}); @@ -39,7 +42,7 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( std::move(tableIDToSetInfo), nodeIDPos, propertyPos, std::move(evaluator)); } else { auto tableID = node->getSingleTableID(); - auto table = storageManager.getNodeTable(tableID); + auto table = storageManager->getNodeTable(tableID); auto columnID = INVALID_COLUMN_ID; if (property->hasPropertyID(tableID)) { auto propertyID = property->getPropertyID(tableID); @@ -65,6 +68,8 @@ std::unique_ptr PlanMapper::mapSetNodeProperty(LogicalOperator std::unique_ptr PlanMapper::getRelSetExecutor( planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const { + auto storageManager = clientContext->getStorageManager(); + auto catalog = clientContext->getCatalog(); auto rel = (RelExpression*)info->nodeOrRel.get(); auto srcNodePos = DataPos(inSchema.getExpressionPos(*rel->getSrcNode()->getInternalID())); auto dstNodePos = DataPos(inSchema.getExpressionPos(*rel->getDstNode()->getInternalID())); @@ -82,7 +87,7 @@ std::unique_ptr PlanMapper::getRelSetExecutor( if (!property->hasPropertyID(tableID)) { continue; } - auto table = storageManager.getRelTable(tableID); + auto table = storageManager->getRelTable(tableID); auto propertyID = property->getPropertyID(tableID); auto columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); @@ -92,7 +97,7 @@ std::unique_ptr PlanMapper::getRelSetExecutor( srcNodePos, dstNodePos, relIDPos, propertyPos, std::move(evaluator)); } else { auto tableID = rel->getSingleTableID(); - auto table = storageManager.getRelTable(tableID); + auto table = storageManager->getRelTable(tableID); auto columnID = common::INVALID_COLUMN_ID; if (property->hasPropertyID(tableID)) { auto propertyID = property->getPropertyID(tableID); diff --git a/src/processor/map/plan_mapper.cpp b/src/processor/map/plan_mapper.cpp index fa978480494..cd52ed24967 100644 --- a/src/processor/map/plan_mapper.cpp +++ b/src/processor/map/plan_mapper.cpp @@ -196,12 +196,13 @@ std::vector PlanMapper::getExpressionsDataPos( return result; } -std::shared_ptr PlanMapper::getSingleStringColumnFTable() { +std::shared_ptr PlanMapper::getSingleStringColumnFTable() const { auto ftTableSchema = std::make_unique(); ftTableSchema->appendColumn( std::make_unique(false /* flat */, 0 /* dataChunkPos */, LogicalTypeUtils::getRowLayoutSize(LogicalType{LogicalTypeID::STRING}))); - return std::make_shared(memoryManager, std::move(ftTableSchema)); + return std::make_shared( + clientContext->getMemoryManager(), std::move(ftTableSchema)); } } // namespace processor diff --git a/src/processor/operator/ddl/add_node_property.cpp b/src/processor/operator/ddl/add_node_property.cpp index d8ea5ad4bd2..1857df56a30 100644 --- a/src/processor/operator/ddl/add_node_property.cpp +++ b/src/processor/operator/ddl/add_node_property.cpp @@ -1,16 +1,21 @@ #include "processor/operator/ddl/add_node_property.h" +#include "catalog/catalog.h" +#include "storage/storage_manager.h" + namespace kuzu { namespace processor { void AddNodeProperty::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto storageManager = context->clientContext->getStorageManager(); catalog->addNodeProperty(tableID, propertyName, std::move(dataType)); auto schema = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); auto addedPropID = schema->getPropertyID(propertyName); auto addedProp = schema->getProperty(addedPropID); - storageManager.getNodeTable(tableID)->addColumn( + storageManager->getNodeTable(tableID)->addColumn( context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); - storageManager.getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); + storageManager->getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); } } // namespace processor diff --git a/src/processor/operator/ddl/add_rel_property.cpp b/src/processor/operator/ddl/add_rel_property.cpp index f0eacecf4e8..80341e02e80 100644 --- a/src/processor/operator/ddl/add_rel_property.cpp +++ b/src/processor/operator/ddl/add_rel_property.cpp @@ -1,5 +1,8 @@ #include "processor/operator/ddl/add_rel_property.h" +#include "catalog/catalog.h" +#include "storage/storage_manager.h" + using namespace kuzu::catalog; using namespace kuzu::storage; using namespace kuzu::common; @@ -8,13 +11,15 @@ namespace kuzu { namespace processor { void AddRelProperty::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto storageManager = context->clientContext->getStorageManager(); catalog->addRelProperty(tableID, propertyName, dataType->copy()); auto tableSchema = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); auto addedPropertyID = tableSchema->getPropertyID(propertyName); auto addedProp = tableSchema->getProperty(addedPropertyID); - storageManager.getRelTable(tableID)->addColumn( + storageManager->getRelTable(tableID)->addColumn( context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); - storageManager.getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); + storageManager->getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); } } // namespace processor diff --git a/src/processor/operator/ddl/create_node_table.cpp b/src/processor/operator/ddl/create_node_table.cpp index 074b31dcf98..80cffe8ab14 100644 --- a/src/processor/operator/ddl/create_node_table.cpp +++ b/src/processor/operator/ddl/create_node_table.cpp @@ -11,6 +11,8 @@ namespace kuzu { namespace processor { void CreateNodeTable::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto storageManager = context->clientContext->getStorageManager(); auto newTableID = catalog->addNodeTableSchema(info); auto newNodeTableEntry = ku_dynamic_cast( catalog->getTableCatalogEntry(context->clientContext->getTx(), newTableID)); diff --git a/src/processor/operator/ddl/create_rdf_graph.cpp b/src/processor/operator/ddl/create_rdf_graph.cpp index 844f07d40ae..fc934ab92d1 100644 --- a/src/processor/operator/ddl/create_rdf_graph.cpp +++ b/src/processor/operator/ddl/create_rdf_graph.cpp @@ -14,6 +14,7 @@ using namespace kuzu::common; void CreateRdfGraph::executeDDLInternal(ExecutionContext* context) { auto tx = context->clientContext->getTx(); + auto catalog = context->clientContext->getCatalog(); auto newRdfGraphID = catalog->addRdfGraphSchema(info); auto rdfGraphEntry = common::ku_dynamic_cast( catalog->getTableCatalogEntry(tx, newRdfGraphID)); diff --git a/src/processor/operator/ddl/create_rel_table.cpp b/src/processor/operator/ddl/create_rel_table.cpp index 9217f88692f..b19f8eacf3a 100644 --- a/src/processor/operator/ddl/create_rel_table.cpp +++ b/src/processor/operator/ddl/create_rel_table.cpp @@ -12,6 +12,8 @@ namespace kuzu { namespace processor { void CreateRelTable::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto storageManager = context->clientContext->getStorageManager(); auto newTableID = catalog->addRelTableSchema(info); auto newRelTableEntry = ku_dynamic_cast( catalog->getTableCatalogEntry(context->clientContext->getTx(), newTableID)); diff --git a/src/processor/operator/ddl/create_rel_table_group.cpp b/src/processor/operator/ddl/create_rel_table_group.cpp index 55cac558302..082b583243b 100644 --- a/src/processor/operator/ddl/create_rel_table_group.cpp +++ b/src/processor/operator/ddl/create_rel_table_group.cpp @@ -12,6 +12,8 @@ namespace kuzu { namespace processor { void CreateRelTableGroup::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto storageManager = context->clientContext->getStorageManager(); auto newRelTableGroupID = catalog->addRelTableGroupSchema(info); auto tx = context->clientContext->getTx(); auto newRelGroupEntry = ku_dynamic_cast( diff --git a/src/processor/operator/ddl/drop_property.cpp b/src/processor/operator/ddl/drop_property.cpp index d0f8cbe73cf..68a8a7c2a00 100644 --- a/src/processor/operator/ddl/drop_property.cpp +++ b/src/processor/operator/ddl/drop_property.cpp @@ -1,17 +1,21 @@ #include "processor/operator/ddl/drop_property.h" +#include "storage/storage_manager.h" + namespace kuzu { namespace processor { void DropProperty::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto storageManager = context->clientContext->getStorageManager(); auto tableEntry = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); auto columnID = tableEntry->getColumnID(propertyID); catalog->dropProperty(tableID, propertyID); if (tableEntry->getTableType() == common::TableType::NODE) { - auto nodesStats = storageManager.getNodesStatisticsAndDeletedIDs(); + auto nodesStats = storageManager->getNodesStatisticsAndDeletedIDs(); nodesStats->removeMetadataDAHInfo(tableID, columnID); } else { - auto relsStats = storageManager.getRelsStatistics(); + auto relsStats = storageManager->getRelsStatistics(); relsStats->removeMetadataDAHInfo(tableID, columnID); } } diff --git a/src/processor/operator/ddl/drop_table.cpp b/src/processor/operator/ddl/drop_table.cpp index 67d9919c3ba..71196bfc00a 100644 --- a/src/processor/operator/ddl/drop_table.cpp +++ b/src/processor/operator/ddl/drop_table.cpp @@ -1,5 +1,6 @@ #include "processor/operator/ddl/drop_table.h" +#include "catalog/catalog.h" #include "common/string_format.h" using namespace kuzu::catalog; @@ -8,8 +9,8 @@ using namespace kuzu::common; namespace kuzu { namespace processor { -void DropTable::executeDDLInternal(ExecutionContext* /*context*/) { - catalog->dropTableSchema(tableID); +void DropTable::executeDDLInternal(ExecutionContext* context) { + context->clientContext->getCatalog()->dropTableSchema(tableID); } std::string DropTable::getOutputMsg() { diff --git a/test/copy/e2e_copy_transaction_test.cpp b/test/copy/e2e_copy_transaction_test.cpp index 7510cef2662..e5dfb11f45d 100644 --- a/test/copy/e2e_copy_transaction_test.cpp +++ b/test/copy/e2e_copy_transaction_test.cpp @@ -1,9 +1,11 @@ #include #include "binder/bound_statement_result.h" +#include "catalog/catalog.h" #include "graph_test/graph_test.h" #include "processor/plan_mapper.h" #include "processor/processor.h" +#include "storage/storage_manager.h" #include "transaction/transaction.h" using namespace kuzu::catalog; @@ -68,8 +70,7 @@ class TinySnbCopyCSVTransactionTest : public EmptyDBTest { if (!preparedStatement->success) { ASSERT_TRUE(false) << preparedStatement->errMsg; } - auto mapper = PlanMapper(*getStorageManager(*database), getMemoryManager(*database), - getCatalog(*database), conn->getClientContext()); + auto mapper = PlanMapper(conn->getClientContext()); auto physicalPlan = mapper.mapLogicalPlanToPhysical(preparedStatement->logicalPlans[0].get(), preparedStatement->statementResult->getColumns()); @@ -138,8 +139,7 @@ class TinySnbCopyCSVTransactionTest : public EmptyDBTest { conn->query(copyPersonTableCMD); conn->query(createKnowsTableCMD); auto preparedStatement = conn->prepare(copyKnowsTableCMD); - auto mapper = PlanMapper(*getStorageManager(*database), getMemoryManager(*database), - getCatalog(*database), conn->getClientContext()); + auto mapper = PlanMapper(conn->getClientContext()); auto physicalPlan = mapper.mapLogicalPlanToPhysical(preparedStatement->logicalPlans[0].get(), preparedStatement->statementResult->getColumns()); diff --git a/test/ddl/e2e_ddl_test.cpp b/test/ddl/e2e_ddl_test.cpp index c976a540361..02b21b5cde5 100644 --- a/test/ddl/e2e_ddl_test.cpp +++ b/test/ddl/e2e_ddl_test.cpp @@ -1,8 +1,10 @@ #include "binder/bound_statement_result.h" +#include "catalog/catalog.h" #include "common/string_format.h" #include "graph_test/graph_test.h" #include "processor/plan_mapper.h" #include "processor/processor.h" +#include "storage/storage_manager.h" using namespace kuzu::catalog; using namespace kuzu::common; @@ -168,8 +170,7 @@ class TinySnbDDLTest : public DBTest { void executeQueryWithoutCommit(std::string query) { auto preparedStatement = conn->prepare(query); - auto mapper = PlanMapper(*getStorageManager(*database), getMemoryManager(*database), - getCatalog(*database), conn->getClientContext()); + auto mapper = PlanMapper(conn->getClientContext()); auto physicalPlan = mapper.mapLogicalPlanToPhysical(preparedStatement->logicalPlans[0].get(), preparedStatement->statementResult->getColumns()); diff --git a/test/graph_test/graph_test.cpp b/test/graph_test/graph_test.cpp index bcf635c68d5..7eaa935a165 100644 --- a/test/graph_test/graph_test.cpp +++ b/test/graph_test/graph_test.cpp @@ -21,12 +21,11 @@ namespace testing { void PrivateGraphTest::validateQueryBestPlanJoinOrder( std::string query, std::string expectedJoinOrder) { - auto catalog = getCatalog(*database); auto statement = parser::Parser::parseQuery(query); ASSERT_EQ(statement.size(), 1); auto parsedQuery = (parser::RegularQuery*)statement[0].get(); auto boundQuery = Binder(conn->clientContext.get()).bind(*parsedQuery); - auto planner = Planner(catalog, getStorageManager(*database), conn->clientContext.get()); + auto planner = Planner(conn->clientContext.get()); auto plan = planner.getBestPlan(*boundQuery); ASSERT_STREQ(LogicalPlanUtil::encodeJoin(*plan).c_str(), expectedJoinOrder.c_str()); } From 599b80f138ad0262d6dedbcc54643af37e3ebc55 Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Sun, 24 Mar 2024 00:19:03 -0400 Subject: [PATCH 083/136] Rework var list storage layout (#3093) --- CMakeLists.txt | 2 +- src/common/vector/auxiliary_buffer.cpp | 2 +- src/include/common/types/types.h | 7 +- src/include/common/vector/auxiliary_buffer.h | 2 +- src/include/storage/store/column.h | 1 + src/include/storage/store/column_chunk.h | 1 + src/include/storage/store/var_list_column.h | 93 +++-- .../storage/store/var_list_column_chunk.h | 51 ++- src/processor/operator/unwind.cpp | 5 +- .../stats/table_statistics_collection.cpp | 2 + src/storage/store/column.cpp | 3 +- src/storage/store/column_chunk.cpp | 1 + src/storage/store/var_list_column.cpp | 328 ++++++++++++++---- src/storage/store/var_list_column_chunk.cpp | 253 ++++++++++---- test/test_files/issue/issue4.test | 25 ++ 15 files changed, 545 insertions(+), 231 deletions(-) create mode 100644 test/test_files/issue/issue4.test diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cc3baa58ee..ef4a8b5e37d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.15) -project(Kuzu VERSION 0.3.2.3 LANGUAGES CXX C) +project(Kuzu VERSION 0.3.2.4 LANGUAGES CXX C) find_package(Threads REQUIRED) diff --git a/src/common/vector/auxiliary_buffer.cpp b/src/common/vector/auxiliary_buffer.cpp index 27e0bc91c37..20c4a47fd07 100644 --- a/src/common/vector/auxiliary_buffer.cpp +++ b/src/common/vector/auxiliary_buffer.cpp @@ -19,7 +19,7 @@ ListAuxiliaryBuffer::ListAuxiliaryBuffer( : capacity{DEFAULT_VECTOR_CAPACITY}, size{0}, dataVector{std::make_shared( dataVectorType, memoryManager)} {} -list_entry_t ListAuxiliaryBuffer::addList(uint64_t listSize) { +list_entry_t ListAuxiliaryBuffer::addList(list_size_t listSize) { auto listEntry = list_entry_t{size, listSize}; bool needResizeDataVector = size + listSize > capacity; while (size + listSize > capacity) { diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 6f4b202fcda..94167124eb4 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -46,6 +46,7 @@ constexpr node_group_idx_t INVALID_NODE_GROUP_IDX = UINT64_MAX; using partition_idx_t = uint64_t; constexpr partition_idx_t INVALID_PARTITION_IDX = UINT64_MAX; using length_t = uint64_t; +using list_size_t = uint32_t; // System representation for a variable-sized overflow value. struct overflow_value_t { @@ -57,10 +58,10 @@ struct overflow_value_t { struct list_entry_t { common::offset_t offset; - uint64_t size; + list_size_t size; - list_entry_t() : offset{INVALID_OFFSET}, size{UINT64_MAX} {} - list_entry_t(common::offset_t offset, uint64_t size) : offset{offset}, size{size} {} + list_entry_t() : offset{INVALID_OFFSET}, size{UINT32_MAX} {} + list_entry_t(common::offset_t offset, list_size_t size) : offset{offset}, size{size} {} }; struct struct_entry_t { diff --git a/src/include/common/vector/auxiliary_buffer.h b/src/include/common/vector/auxiliary_buffer.h index bac0a4002e9..476b1d009a4 100644 --- a/src/include/common/vector/auxiliary_buffer.h +++ b/src/include/common/vector/auxiliary_buffer.h @@ -73,7 +73,7 @@ class ListAuxiliaryBuffer : public AuxiliaryBuffer { ValueVector* getDataVector() const { return dataVector.get(); } std::shared_ptr getSharedDataVector() const { return dataVector; } - list_entry_t addList(uint64_t listSize); + list_entry_t addList(list_size_t listSize); uint64_t getSize() const { return size; } diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index 0683d1308d2..4a8493c4387 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -32,6 +32,7 @@ class Column { friend class StringColumn; friend class VarListLocalColumn; friend class StructColumn; + friend class VarListColumn; public: struct ReadState { diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index ac1495ccf70..c9674ae6db5 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -93,6 +93,7 @@ class ColumnChunk { template void setValue(T val, common::offset_t pos) { + KU_ASSERT(pos < capacity); ((T*)buffer.get())[pos] = val; if (pos >= numValues) { numValues = pos + 1; diff --git a/src/include/storage/store/var_list_column.h b/src/include/storage/store/var_list_column.h index 8fdef63e785..43d8e1b753b 100644 --- a/src/include/storage/store/var_list_column.h +++ b/src/include/storage/store/var_list_column.h @@ -1,43 +1,45 @@ #pragma once #include "column.h" +#include "var_list_column_chunk.h" -// List is a nested data type which is stored as two chunks: +// List is a nested data type which is stored as three chunks: // 1. Offset column (type: INT64). Using offset to partition the data column into multiple lists. -// 2. Data column. Stores the actual data of the list. +// 2. Size column. Stores the size of each list. +// 3. Data column. Stores the actual data of the list. // Similar to other data types, nulls are stored in the null column. // Example layout for list of INT64: // Four lists: [4,7,8,12], null, [2, 3], [] // Offset column: [4, 4, 6, 6] +// Size column: [4, 0, 2, 0] // data column: [4, 7, 8, 12, 2, 3] -// When reading the data, we firstly read the offset column and utilize the offset column to find -// the data column partitions. -// 1st list(offset 4): Since it is the first element, the start offset is a constant 0, and the end -// offset is 4. Its data is stored at position 0-4 in the data column. -// 2nd list(offset 4): By reading the null column, we know that the 2nd list is null. So we don't -// need to read from the data column. -// 3rd list(offset 6): The start offset is 4(by looking up the offset for the 2nd list), and the end -// offset is 6. Its data is stored at position 4-6 in the data column. -// 4th list(offset 6): The start offset is 6(by looking up the offset for the 3rd list), and the end -// offset is 6. Its data is stored at position 6-6 in the data column (empty list). +// When updating the data, we first append the data to the data column, and then update the offset +// and size accordingly. Besides offset column, we introduce an extra size column here to enable +// in-place updates of a list column. In a list column chunk, offsets of lists are not always sorted +// after updates. This is good for writes, but it introduces extra overheads for scans, as lists can +// be scattered, and scans have to be broken into multiple small reads. To achieve a balance between +// reads and writes, during updates, we rewrite the whole var list column chunk in ascending order +// when the offsets are not sorted in ascending order and the size of data column chunk is larger +// than half of its capacity. namespace kuzu { namespace storage { -struct ListOffsetInfoInStorage { - common::offset_t prevNodeListOffset; - std::vector> offsetVectors; +struct ListOffsetSizeInfo { + common::offset_t numTotal; + std::unique_ptr offsetColumnChunk; + std::unique_ptr sizeColumnChunk; - ListOffsetInfoInStorage(common::offset_t prevNodeListOffset, - std::vector> offsetVectors) - : prevNodeListOffset{prevNodeListOffset}, offsetVectors{std::move(offsetVectors)} {} + ListOffsetSizeInfo(common::offset_t numTotal, std::unique_ptr offsetColumnChunk, + std::unique_ptr sizeColumnChunk) + : numTotal{numTotal}, offsetColumnChunk{std::move(offsetColumnChunk)}, + sizeColumnChunk{std::move(sizeColumnChunk)} {} - common::offset_t getListOffset(uint64_t nodePos) const; + common::list_size_t getListSize(uint64_t pos) const; + common::offset_t getListEndOffset(uint64_t pos) const; + common::offset_t getListStartOffset(uint64_t pos) const; - inline uint64_t getListLength(uint64_t nodePos) const { - KU_ASSERT(getListOffset(nodePos + 1) >= getListOffset(nodePos)); - return getListOffset(nodePos + 1) - getListOffset(nodePos); - } + bool isOffsetSortedAscending(uint64_t startPos, uint64_t endPos) const; }; class VarListColumn : public Column { @@ -69,45 +71,38 @@ class VarListColumn : public Column { void append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) override; private: - inline common::offset_t readListOffsetInStorage(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, common::offset_t offsetInNodeGroup) { - return offsetInNodeGroup == 0 ? - 0 : - readOffset(transaction, nodeGroupIdx, offsetInNodeGroup - 1); - } - void scanUnfiltered(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::ValueVector* resultVector, - const ListOffsetInfoInStorage& listOffsetInfoInStorage); + const ListOffsetSizeInfo& listOffsetInfoInStorage); void scanFiltered(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, - common::ValueVector* offsetVector, const ListOffsetInfoInStorage& listOffsetInfoInStorage); - - inline bool canCommitInPlace(transaction::Transaction*, common::node_group_idx_t, - const ChunkCollection&, const offset_to_row_idx_t&, const ChunkCollection&, - const offset_to_row_idx_t&) override { - // Always perform out-of-place commit for VAR_LIST columns. - return false; - } - inline bool canCommitInPlace(transaction::Transaction* /*transaction*/, - common::node_group_idx_t /*nodeGroupIdx*/, - const std::vector& /*dstOffsets*/, ColumnChunk* /*chunk*/, - common::offset_t /*startOffset*/) override { - // Always perform out-of-place commit for VAR_LIST columns. - return false; - } + common::ValueVector* offsetVector, const ListOffsetSizeInfo& listOffsetInfoInStorage); void checkpointInMemory() final; void rollbackInMemory() final; common::offset_t readOffset(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::offset_t offsetInNodeGroup); - ListOffsetInfoInStorage getListOffsetInfoInStorage(transaction::Transaction* transaction, + + common::list_size_t readSize(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, common::offset_t offsetInNodeGroup); + + ListOffsetSizeInfo getListOffsetSizeInfo(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::offset_t startOffsetInNodeGroup, - common::offset_t endOffsetInNodeGroup, - const std::shared_ptr& state); + common::offset_t endOffsetInNodeGroup); + + void prepareCommitForChunk(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, + const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, + const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override; + void prepareCommitForChunk(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, + ColumnChunk* chunk, common::offset_t startSrcOffset) override; private: + std::unique_ptr sizeColumn; std::unique_ptr dataColumn; + // TODO(Guodong): This should be moved to table states. + std::unique_ptr tmpDataColumnChunk; }; } // namespace storage diff --git a/src/include/storage/store/var_list_column_chunk.h b/src/include/storage/store/var_list_column_chunk.h index 3790334cdba..edbb62a87bb 100644 --- a/src/include/storage/store/var_list_column_chunk.h +++ b/src/include/storage/store/var_list_column_chunk.h @@ -35,8 +35,15 @@ class VarListColumnChunk final : public ColumnChunk { return varListDataColumnChunk->dataColumnChunk.get(); } + inline ColumnChunk* getSizeColumnChunk() const { return sizeColumnChunk.get(); } + void resetToEmpty() override; + inline void setNumValues(uint64_t numValues_) override { + ColumnChunk::setNumValues(numValues_); + sizeColumnChunk->setNumValues(numValues_); + } + void append(common::ValueVector* vector, common::SelectionVector& selVector) final; void lookup(common::offset_t offsetInChunk, common::ValueVector& output, @@ -56,12 +63,23 @@ class VarListColumnChunk final : public ColumnChunk { varListDataColumnChunk->resizeBuffer(numValues); } - void finalize() override; - - inline common::offset_t getListOffset(common::offset_t offset) const { - return offset == 0 ? 0 : getValue(offset - 1); + inline void resize(uint64_t newCapacity) override { + ColumnChunk::resize(newCapacity); + sizeColumnChunk->resize(newCapacity); } + common::offset_t getListStartOffset(common::offset_t offset) const; + + common::offset_t getListEndOffset(common::offset_t offset) const; + + common::list_size_t getListSize(common::offset_t offset) const; + + void resetOffset(); + void resetFromOtherChunk(VarListColumnChunk* other); + void finalize() override; + bool isOffsetsConsecutiveAndSortedAscending(uint64_t startPos, uint64_t endPos) const; + bool sanityCheck() override; + protected: void copyListValues(const common::list_entry_t& entry, common::ValueVector* dataVector); @@ -69,32 +87,13 @@ class VarListColumnChunk final : public ColumnChunk { void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) override; - inline void initializeIndices() { - indicesColumnChunk = ColumnChunkFactory::createColumnChunk( - *common::LogicalType::INT64(), false /*enableCompression*/, capacity); - indicesColumnChunk->getNullChunk()->resetToAllNull(); - for (auto i = 0u; i < numValues; i++) { - indicesColumnChunk->setValue(i, i); - indicesColumnChunk->getNullChunk()->setNull(i, nullChunk->isNull(i)); - } - indicesColumnChunk->setNumValues(numValues); - } - inline uint64_t getListLen(common::offset_t offset) const { - return getListOffset(offset + 1) - getListOffset(offset); - } - - void resetFromOtherChunk(VarListColumnChunk* other); void appendNullList(); protected: + std::unique_ptr sizeColumnChunk; std::unique_ptr varListDataColumnChunk; - // The following is needed to write var list to random positions in the column chunk. - // We first append var list to the end of the column chunk. Then use indicesColumnChunk to track - // where each var list data is inside the column chunk. - // `needFinalize` is set to true whenever `write` is called. - // During `finalize`, the whole column chunk will be re-written according to indices. - bool needFinalize; - std::unique_ptr indicesColumnChunk; + // we use checkOffsetSortedAsc flag to indicate that we do not trigger random write + bool checkOffsetSortedAsc; }; } // namespace storage diff --git a/src/processor/operator/unwind.cpp b/src/processor/operator/unwind.cpp index cd3b60fa638..0697672b0e2 100644 --- a/src/processor/operator/unwind.cpp +++ b/src/processor/operator/unwind.cpp @@ -24,7 +24,8 @@ void Unwind::copyTuplesToOutVector(uint64_t startPos, uint64_t endPos) const { bool Unwind::getNextTuplesInternal(ExecutionContext* context) { if (hasMoreToRead()) { - auto totalElementsCopy = std::min(DEFAULT_VECTOR_CAPACITY, listEntry.size - startIndex); + auto totalElementsCopy = + std::min(DEFAULT_VECTOR_CAPACITY, (uint64_t)listEntry.size - startIndex); copyTuplesToOutVector(startIndex, (totalElementsCopy + startIndex)); startIndex += totalElementsCopy; outValueVector->state->initOriginalAndSelectedSize(totalElementsCopy); @@ -42,7 +43,7 @@ bool Unwind::getNextTuplesInternal(ExecutionContext* context) { } listEntry = expressionEvaluator->resultVector->getValue(pos); startIndex = 0; - auto totalElementsCopy = std::min(DEFAULT_VECTOR_CAPACITY, listEntry.size); + auto totalElementsCopy = std::min(DEFAULT_VECTOR_CAPACITY, (uint64_t)listEntry.size); copyTuplesToOutVector(0, totalElementsCopy); startIndex += totalElementsCopy; outValueVector->state->initOriginalAndSelectedSize(startIndex); diff --git a/src/storage/stats/table_statistics_collection.cpp b/src/storage/stats/table_statistics_collection.cpp index f423066e746..965765d6f8d 100644 --- a/src/storage/stats/table_statistics_collection.cpp +++ b/src/storage/stats/table_statistics_collection.cpp @@ -97,6 +97,8 @@ std::unique_ptr TablesStatistics::createMetadataDAHInfo( } } break; case PhysicalTypeID::VAR_LIST: { + metadataDAHInfo->childrenInfos.push_back( + createMetadataDAHInfo(*LogicalType::UINT32(), metadataFH, bm, wal)); metadataDAHInfo->childrenInfos.push_back( createMetadataDAHInfo(*VarListType::getChildType(&dataType), metadataFH, bm, wal)); } break; diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 7d5a453f691..8d2e29d389a 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -792,7 +792,8 @@ void Column::commitColumnChunkOutOfPlace(Transaction* transaction, node_group_id auto chunkMeta = getMetadata(nodeGroupIdx, transaction->getType()); // TODO(Guodong): Should consider caching the scanned column chunk to avoid redundant // scans in the same transaction. - auto columnChunk = getEmptyChunkForCommit(chunkMeta.numValues + dstOffsets.size()); + auto columnChunk = + getEmptyChunkForCommit(1.5 * std::bit_ceil(chunkMeta.numValues + dstOffsets.size())); scan(transaction, nodeGroupIdx, columnChunk.get()); for (auto i = 0u; i < dstOffsets.size(); i++) { columnChunk->write(chunk, srcOffset + i, dstOffsets[i], 1 /* numValues */); diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index ef82e5c6b12..637e33e7232 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -223,6 +223,7 @@ void ColumnChunk::append( KU_ASSERT(nullChunk->getNumValues() == getNumValues()); nullChunk->append(other->nullChunk.get(), startPosInOtherChunk, numValuesToAppend); } + KU_ASSERT(numValues + numValuesToAppend <= capacity); memcpy(buffer.get() + numValues * numBytesPerValue, other->buffer.get() + startPosInOtherChunk * numBytesPerValue, numValuesToAppend * numBytesPerValue); diff --git a/src/storage/store/var_list_column.cpp b/src/storage/store/var_list_column.cpp index a10cf48aa16..bacf684d3b6 100644 --- a/src/storage/store/var_list_column.cpp +++ b/src/storage/store/var_list_column.cpp @@ -11,13 +11,40 @@ using namespace kuzu::transaction; namespace kuzu { namespace storage { -offset_t ListOffsetInfoInStorage::getListOffset(uint64_t nodePos) const { - if (nodePos == 0) { - return prevNodeListOffset; - } else { - auto offsetVector = offsetVectors[(nodePos - 1) / DEFAULT_VECTOR_CAPACITY].get(); - return offsetVector->getValue((nodePos - 1) % DEFAULT_VECTOR_CAPACITY); +offset_t ListOffsetSizeInfo::getListStartOffset(uint64_t pos) const { + if (numTotal == 0) { + return 0; + } + return pos == numTotal ? getListEndOffset(pos - 1) : getListEndOffset(pos) - getListSize(pos); +} + +offset_t ListOffsetSizeInfo::getListEndOffset(uint64_t pos) const { + if (numTotal == 0) { + return 0; + } + KU_ASSERT(pos < offsetColumnChunk->getNumValues()); + return offsetColumnChunk->getValue(pos); +} + +list_size_t ListOffsetSizeInfo::getListSize(uint64_t pos) const { + if (numTotal == 0) { + return 0; + } + KU_ASSERT(pos < sizeColumnChunk->getNumValues()); + return sizeColumnChunk->getValue(pos); +} + +bool ListOffsetSizeInfo::isOffsetSortedAscending(uint64_t startPos, uint64_t endPos) const { + offset_t prevEndOffset = getListStartOffset(startPos); + for (auto i = startPos; i < endPos; i++) { + offset_t currentEndOffset = getListEndOffset(i); + auto size = getListSize(i); + prevEndOffset += size; + if (currentEndOffset != prevEndOffset) { + return false; + } } + return true; } VarListColumn::VarListColumn(std::string name, LogicalType dataType, @@ -26,36 +53,55 @@ VarListColumn::VarListColumn(std::string name, LogicalType dataType, RWPropertyStats propertyStatistics, bool enableCompression) : Column{name, std::move(dataType), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression, true /* requireNullColumn */} { + auto sizeColName = StorageUtils::getColumnName(name, StorageUtils::ColumnType::OFFSET, ""); auto dataColName = StorageUtils::getColumnName(name, StorageUtils::ColumnType::DATA, ""); + sizeColumn = ColumnFactory::createColumn(sizeColName, *LogicalType::UINT32(), + *metaDAHeaderInfo.childrenInfos[0], dataFH, metadataFH, bufferManager, wal, transaction, + propertyStatistics, enableCompression); dataColumn = ColumnFactory::createColumn(dataColName, - *VarListType::getChildType(&this->dataType)->copy(), *metaDAHeaderInfo.childrenInfos[0], + *VarListType::getChildType(&this->dataType)->copy(), *metaDAHeaderInfo.childrenInfos[1], dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); + tmpDataColumnChunk = + std::make_unique(ColumnChunkFactory::createColumnChunk( + *VarListType::getChildType(&this->dataType)->copy(), enableCompression, 0)); } void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t startOffsetInGroup, offset_t endOffsetInGroup, ValueVector* resultVector, uint64_t offsetInVector) { - // TODO(Ziyi): the current scan function requires two dynamic allocation of vectors which may be - // a bottleneck of the scan performance. We need to further optimize this. nullColumn->scan(transaction, nodeGroupIdx, startOffsetInGroup, endOffsetInGroup, resultVector, offsetInVector); - auto listOffsetInfoInStorage = getListOffsetInfoInStorage( - transaction, nodeGroupIdx, startOffsetInGroup, endOffsetInGroup, resultVector->state); + auto listOffsetInfoInStorage = + getListOffsetSizeInfo(transaction, nodeGroupIdx, startOffsetInGroup, endOffsetInGroup); offset_t listOffsetInVector = offsetInVector == 0 ? 0 : resultVector->getValue(offsetInVector - 1).offset + resultVector->getValue(offsetInVector - 1).size; auto offsetToWriteListData = listOffsetInVector; auto numValues = endOffsetInGroup - startOffsetInGroup; + KU_ASSERT(numValues >= 0); for (auto i = 0u; i < numValues; i++) { - auto length = listOffsetInfoInStorage.getListLength(i); - resultVector->setValue(i + offsetInVector, list_entry_t{listOffsetInVector, length}); - listOffsetInVector += length; + list_size_t size = listOffsetInfoInStorage.getListSize(i); + resultVector->setValue(i + offsetInVector, list_entry_t{listOffsetInVector, size}); + listOffsetInVector += size; } ListVector::resizeDataVector(resultVector, listOffsetInVector); - dataColumn->scan(transaction, nodeGroupIdx, listOffsetInfoInStorage.getListOffset(0), - listOffsetInfoInStorage.getListOffset(numValues), ListVector::getDataVector(resultVector), - offsetToWriteListData); + auto dataVector = ListVector::getDataVector(resultVector); + bool isOffsetSortedAscending = listOffsetInfoInStorage.isOffsetSortedAscending(0, numValues); + if (isOffsetSortedAscending) { + dataColumn->scan(transaction, nodeGroupIdx, listOffsetInfoInStorage.getListStartOffset(0), + listOffsetInfoInStorage.getListStartOffset(numValues), dataVector, + offsetToWriteListData); + } else { + for (auto i = 0u; i < numValues; i++) { + offset_t startOffset = listOffsetInfoInStorage.getListStartOffset(i); + offset_t appendSize = listOffsetInfoInStorage.getListSize(i); + KU_ASSERT(appendSize >= 0); + dataColumn->scan(transaction, nodeGroupIdx, startOffset, startOffset + appendSize, + dataVector, offsetToWriteListData); + offsetToWriteListData += appendSize; + } + } } void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -63,15 +109,47 @@ void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx if (nodeGroupIdx >= metadataDA->getNumElements(transaction->getType())) { columnChunk->setNumValues(0); } else { - Column::scan(transaction, nodeGroupIdx, columnChunk, startOffset, endOffset); - // TODO: FIX-ME. auto varListColumnChunk = ku_dynamic_cast(columnChunk); - auto startVarListOffset = varListColumnChunk->getListOffset(0); - auto endVarListOffset = varListColumnChunk->getListOffset(columnChunk->getNumValues()); - auto numElements = endVarListOffset - startVarListOffset + 1; - varListColumnChunk->resizeDataColumnChunk(std::bit_ceil(numElements)); - dataColumn->scan(transaction, nodeGroupIdx, varListColumnChunk->getDataColumnChunk(), - startVarListOffset, endVarListOffset); + Column::scan(transaction, nodeGroupIdx, columnChunk, startOffset, endOffset); + auto sizeColumnChunk = varListColumnChunk->getSizeColumnChunk(); + sizeColumn->scan(transaction, nodeGroupIdx, sizeColumnChunk, startOffset, endOffset); + auto resizeNumValues = varListColumnChunk->getDataColumnChunk()->getNumValues(); + bool isOffsetSortedAscending = true; + offset_t prevOffset = varListColumnChunk->getListStartOffset(0); + for (auto i = 0u; i < columnChunk->getNumValues(); i++) { + auto currentEndOffset = varListColumnChunk->getListEndOffset(i); + auto appendSize = varListColumnChunk->getListSize(i); + prevOffset += appendSize; + if (currentEndOffset != prevOffset) { + isOffsetSortedAscending = false; + } + resizeNumValues += appendSize; + } + if (isOffsetSortedAscending) { + varListColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); + offset_t startVarListOffset = varListColumnChunk->getListStartOffset(0); + offset_t endVarListOffset = + varListColumnChunk->getListStartOffset(columnChunk->getNumValues()); + dataColumn->scan(transaction, nodeGroupIdx, varListColumnChunk->getDataColumnChunk(), + startVarListOffset, endVarListOffset); + varListColumnChunk->resetOffset(); + } else { + varListColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); + tmpDataColumnChunk->resizeBuffer(std::bit_ceil(resizeNumValues)); + auto dataVarListColumnChunk = varListColumnChunk->getDataColumnChunk(); + for (auto i = 0u; i < columnChunk->getNumValues(); i++) { + offset_t startVarListOffset = varListColumnChunk->getListStartOffset(i); + offset_t endVarListOffset = varListColumnChunk->getListEndOffset(i); + dataColumn->scan(transaction, nodeGroupIdx, + tmpDataColumnChunk->dataColumnChunk.get(), startVarListOffset, + endVarListOffset); + KU_ASSERT(endVarListOffset - startVarListOffset == + tmpDataColumnChunk->dataColumnChunk->getNumValues()); + dataVarListColumnChunk->append(tmpDataColumnChunk->dataColumnChunk.get(), 0, + tmpDataColumnChunk->dataColumnChunk->getNumValues()); + } + varListColumnChunk->resetOffset(); + } } } @@ -82,13 +160,13 @@ void VarListColumn::scanInternal( auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(startNodeOffset); auto startNodeOffsetInGroup = startNodeOffset - StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); - auto listOffsetInfoInStorage = - getListOffsetInfoInStorage(transaction, nodeGroupIdx, startNodeOffsetInGroup, - startNodeOffsetInGroup + nodeIDVector->state->getOriginalSize(), resultVector->state); + KU_ASSERT(resultVector->state); + auto listOffsetSizeInfo = getListOffsetSizeInfo(transaction, nodeGroupIdx, + startNodeOffsetInGroup, startNodeOffsetInGroup + nodeIDVector->state->getOriginalSize()); if (resultVector->state->selVector->isUnfiltered()) { - scanUnfiltered(transaction, nodeGroupIdx, resultVector, listOffsetInfoInStorage); + scanUnfiltered(transaction, nodeGroupIdx, resultVector, listOffsetSizeInfo); } else { - scanFiltered(transaction, nodeGroupIdx, resultVector, listOffsetInfoInStorage); + scanFiltered(transaction, nodeGroupIdx, resultVector, listOffsetSizeInfo); } } @@ -96,68 +174,88 @@ void VarListColumn::lookupValue(Transaction* transaction, offset_t nodeOffset, ValueVector* resultVector, uint32_t posInVector) { auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(nodeOffset); auto nodeOffsetInGroup = nodeOffset - StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); - auto listOffset = readListOffsetInStorage(transaction, nodeGroupIdx, nodeOffsetInGroup); - auto length = readListOffsetInStorage(transaction, nodeGroupIdx, nodeOffsetInGroup + 1) - - readListOffsetInStorage(transaction, nodeGroupIdx, nodeOffsetInGroup); + auto listEndOffset = readOffset(transaction, nodeGroupIdx, nodeOffsetInGroup); + auto size = readSize(transaction, nodeGroupIdx, nodeOffsetInGroup); + auto listStartOffset = listEndOffset - size; auto offsetInVector = posInVector == 0 ? 0 : resultVector->getValue(posInVector - 1); - resultVector->setValue(posInVector, list_entry_t{offsetInVector, length}); - ListVector::resizeDataVector(resultVector, offsetInVector + length); - dataColumn->scan(transaction, StorageUtils::getNodeGroupIdx(nodeOffset), listOffset, - listOffset + length, ListVector::getDataVector(resultVector), offsetInVector); + resultVector->setValue(posInVector, list_entry_t{offsetInVector, size}); + ListVector::resizeDataVector(resultVector, offsetInVector + size); + auto dataVector = ListVector::getDataVector(resultVector); + dataColumn->scan(transaction, StorageUtils::getNodeGroupIdx(nodeOffset), listStartOffset, + listEndOffset, dataVector, offsetInVector); } void VarListColumn::append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) { KU_ASSERT(columnChunk->getDataType().getPhysicalType() == dataType.getPhysicalType()); - Column::append(columnChunk, nodeGroupIdx); - auto dataColumnChunk = - ku_dynamic_cast(columnChunk)->getDataColumnChunk(); + auto varListColumnChunk = ku_dynamic_cast(columnChunk); + Column::append(varListColumnChunk, nodeGroupIdx); + auto sizeColumnChunk = varListColumnChunk->getSizeColumnChunk(); + sizeColumn->append(sizeColumnChunk, nodeGroupIdx); + auto dataColumnChunk = varListColumnChunk->getDataColumnChunk(); dataColumn->append(dataColumnChunk, nodeGroupIdx); } void VarListColumn::scanUnfiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx, - ValueVector* resultVector, const ListOffsetInfoInStorage& listOffsetInfoInStorage) { + ValueVector* resultVector, const ListOffsetSizeInfo& listOffsetInfoInStorage) { auto numValuesToScan = resultVector->state->selVector->selectedSize; offset_t offsetInVector = 0; for (auto i = 0u; i < numValuesToScan; i++) { - auto listLen = listOffsetInfoInStorage.getListLength(i); + auto listLen = listOffsetInfoInStorage.getListSize(i); resultVector->setValue(i, list_entry_t{offsetInVector, listLen}); offsetInVector += listLen; } ListVector::resizeDataVector(resultVector, offsetInVector); - auto startListOffsetInStorage = listOffsetInfoInStorage.getListOffset(0); - auto endListOffsetInStorage = listOffsetInfoInStorage.getListOffset(numValuesToScan); - dataColumn->scan(transaction, nodeGroupIdx, startListOffsetInStorage, endListOffsetInStorage, - ListVector::getDataVector(resultVector), 0 /* offsetInVector */); + auto dataVector = ListVector::getDataVector(resultVector); + offsetInVector = 0; + bool checkOffsetOrder = listOffsetInfoInStorage.isOffsetSortedAscending(0, numValuesToScan); + if (checkOffsetOrder) { + auto startListOffsetInStorage = listOffsetInfoInStorage.getListStartOffset(0); + numValuesToScan = numValuesToScan == 0 ? 0 : numValuesToScan - 1; + auto endListOffsetInStorage = listOffsetInfoInStorage.getListEndOffset(numValuesToScan); + dataColumn->scan(transaction, nodeGroupIdx, startListOffsetInStorage, + endListOffsetInStorage, dataVector, 0 /* offsetInVector */); + } else { + for (auto i = 0u; i < numValuesToScan; i++) { + auto startListOffsetInStorage = listOffsetInfoInStorage.getListStartOffset(i); + auto appendSize = listOffsetInfoInStorage.getListSize(i); + dataColumn->scan(transaction, nodeGroupIdx, startListOffsetInStorage, + startListOffsetInStorage + appendSize, dataVector, offsetInVector); + offsetInVector += appendSize; + } + } } void VarListColumn::scanFiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx, - ValueVector* resultVector, const ListOffsetInfoInStorage& listOffsetInfoInStorage) { + ValueVector* resultVector, const ListOffsetSizeInfo& listOffsetSizeInfo) { offset_t listOffset = 0; for (auto i = 0u; i < resultVector->state->selVector->selectedSize; i++) { auto pos = resultVector->state->selVector->selectedPositions[i]; - auto listLen = listOffsetInfoInStorage.getListLength(pos); - resultVector->setValue(pos, list_entry_t{(offset_t)listOffset, (uint64_t)listLen}); - listOffset += listLen; + auto listSize = listOffsetSizeInfo.getListSize(pos); + resultVector->setValue(pos, list_entry_t{(offset_t)listOffset, listSize}); + listOffset += listSize; } ListVector::resizeDataVector(resultVector, listOffset); listOffset = 0; for (auto i = 0u; i < resultVector->state->selVector->selectedSize; i++) { auto pos = resultVector->state->selVector->selectedPositions[i]; - auto startOffsetInStorageToScan = listOffsetInfoInStorage.getListOffset(pos); - auto endOffsetInStorageToScan = listOffsetInfoInStorage.getListOffset(pos + 1); + auto startOffsetInStorageToScan = listOffsetSizeInfo.getListStartOffset(pos); + auto appendSize = listOffsetSizeInfo.getListSize(pos); + auto dataVector = ListVector::getDataVector(resultVector); dataColumn->scan(transaction, nodeGroupIdx, startOffsetInStorageToScan, - endOffsetInStorageToScan, ListVector::getDataVector(resultVector), listOffset); + startOffsetInStorageToScan + appendSize, dataVector, listOffset); listOffset += resultVector->getValue(pos).size; } } void VarListColumn::checkpointInMemory() { Column::checkpointInMemory(); + sizeColumn->checkpointInMemory(); dataColumn->checkpointInMemory(); } void VarListColumn::rollbackInMemory() { Column::rollbackInMemory(); + sizeColumn->rollbackInMemory(); dataColumn->rollbackInMemory(); } @@ -175,29 +273,111 @@ offset_t VarListColumn::readOffset( return value; } -ListOffsetInfoInStorage VarListColumn::getListOffsetInfoInStorage(Transaction* transaction, - node_group_idx_t nodeGroupIdx, offset_t startOffsetInNodeGroup, offset_t endOffsetInNodeGroup, - const std::shared_ptr& state) { +list_size_t VarListColumn::readSize( + Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t offsetInNodeGroup) { + auto chunkMeta = sizeColumn->getMetadataDA()->get(nodeGroupIdx, transaction->getType()); + auto pageCursor = PageUtils::getPageCursorForPos(offsetInNodeGroup, + chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)); + pageCursor.pageIdx += chunkMeta.pageIdx; + offset_t value; + readFromPage(transaction, pageCursor.pageIdx, [&](uint8_t* frame) -> void { + readToPageFunc(frame, pageCursor, (uint8_t*)&value, 0 /* posInVector */, + 1 /* numValuesToRead */, chunkMeta.compMeta); + }); + return value; +} + +ListOffsetSizeInfo VarListColumn::getListOffsetSizeInfo(Transaction* transaction, + node_group_idx_t nodeGroupIdx, offset_t startOffsetInNodeGroup, offset_t endOffsetInNodeGroup) { auto numOffsetsToRead = endOffsetInNodeGroup - startOffsetInNodeGroup; - auto numOffsetVectors = numOffsetsToRead / DEFAULT_VECTOR_CAPACITY + - (numOffsetsToRead % DEFAULT_VECTOR_CAPACITY ? 1 : 0); - std::vector> offsetVectors; - offsetVectors.reserve(numOffsetVectors); - uint64_t numOffsetsRead = 0; - for (auto i = 0u; i < numOffsetVectors; i++) { - auto offsetVector = std::make_unique(LogicalTypeID::INT64); - auto numOffsetsToReadInCurBatch = - std::min(numOffsetsToRead - numOffsetsRead, DEFAULT_VECTOR_CAPACITY); - offsetVector->setState(state); - Column::scan(transaction, nodeGroupIdx, startOffsetInNodeGroup + numOffsetsRead, - startOffsetInNodeGroup + numOffsetsRead + numOffsetsToReadInCurBatch, - offsetVector.get(), 0 /* offsetInVector */); - offsetVectors.push_back(std::move(offsetVector)); - numOffsetsRead += numOffsetsToReadInCurBatch; + auto offsetColumnChunk = ColumnChunkFactory::createColumnChunk( + *common::LogicalType::INT64(), enableCompression, numOffsetsToRead); + auto sizeColumnChunk = ColumnChunkFactory::createColumnChunk( + *common::LogicalType::UINT32(), enableCompression, numOffsetsToRead); + Column::scan(transaction, nodeGroupIdx, offsetColumnChunk.get(), startOffsetInNodeGroup, + endOffsetInNodeGroup); + sizeColumn->scan(transaction, nodeGroupIdx, sizeColumnChunk.get(), startOffsetInNodeGroup, + endOffsetInNodeGroup); + return {numOffsetsToRead, std::move(offsetColumnChunk), std::move(sizeColumnChunk)}; +} + +void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, + const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, + const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, + const offset_set_t& deleteInfo) { + auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); + auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; + if (isNewNodeGroup) { + commitLocalChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, localInsertChunks, + insertInfo, localUpdateChunks, updateInfo, deleteInfo); + } else { + auto columnChunk = getEmptyChunkForCommit(updateInfo.size() + insertInfo.size()); + std::vector dstOffsets; + for (auto& [offsetInDstChunk, rowIdx] : updateInfo) { + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localUpdateChunk = localUpdateChunks[chunkIdx]; + dstOffsets.push_back(offsetInDstChunk); + columnChunk->append(localUpdateChunk, offsetInLocalChunk, 1); + } + for (auto& [offsetInDstChunk, rowIdx] : insertInfo) { + auto [chunkIdx, offsetInLocalChunk] = + LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); + auto localInsertChunk = localInsertChunks[chunkIdx]; + dstOffsets.push_back(offsetInDstChunk); + columnChunk->append(localInsertChunk, offsetInLocalChunk, 1); + } + prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, columnChunk.get(), 0); + } +} + +void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, + const std::vector& dstOffsets, ColumnChunk* chunk, offset_t startSrcOffset) { + auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); + auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; + if (isNewNodeGroup) { + commitColumnChunkOutOfPlace( + transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, startSrcOffset); + } else { + // we separate the commit into three parts: offset chunk commit, size column chunk commit, + // data column chunk + auto varListChunk = ku_dynamic_cast(chunk); + sizeColumn->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, + varListChunk->getSizeColumnChunk(), startSrcOffset); + auto dataColumnSize = + dataColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues; + auto dataColumnChunk = varListChunk->getDataColumnChunk(); + auto numListsToAppend = std::min(chunk->getNumValues(), (uint64_t)dstOffsets.size()); + auto dataSize = 0u; + auto startVarListOffset = varListChunk->getListStartOffset(startSrcOffset); + std::vector dstOffsetsInDataColumn; + for (auto i = 0u; i < numListsToAppend; i++) { + for (auto j = 0u; j < varListChunk->getListSize(startSrcOffset + i); j++) { + dstOffsetsInDataColumn.push_back(dataColumnSize + dataSize++); + } + } + dataColumn->prepareCommitForChunk( + transaction, nodeGroupIdx, dstOffsetsInDataColumn, dataColumnChunk, startVarListOffset); + // we need to update the offset since we do not do in-place list data update but append data + // in the end of list data column we need to plus to original data column size to get the + // new offset + // TODO(Jiamin): A better way is to store the offset in a offset column, just like size + // column. Then we can reuse prepareCommitForChunk interface for offset column. + auto offsetChunkMeta = getMetadata(nodeGroupIdx, transaction->getType()); + auto offsetColumnChunk = ColumnChunkFactory::createColumnChunk(*dataType.copy(), + enableCompression, 1.5 * std::bit_ceil(offsetChunkMeta.numValues + dstOffsets.size())); + Column::scan(transaction, nodeGroupIdx, offsetColumnChunk.get()); + for (auto i = 0u; i < numListsToAppend; i++) { + auto listEndOffset = varListChunk->getListEndOffset(startSrcOffset + i); + auto isNull = varListChunk->getNullChunk()->isNull(startSrcOffset + i); + offsetColumnChunk->setValue(dataColumnSize + listEndOffset, dstOffsets[i]); + offsetColumnChunk->getNullChunk()->setNull(dstOffsets[i], isNull); + } + auto offsetListChunk = + ku_dynamic_cast(offsetColumnChunk.get()); + offsetListChunk->getSizeColumnChunk()->setNumValues(offsetColumnChunk->getNumValues()); + Column::append(offsetColumnChunk.get(), nodeGroupIdx); } - auto prevNodeListOffsetInStorage = - readListOffsetInStorage(transaction, nodeGroupIdx, startOffsetInNodeGroup); - return {prevNodeListOffsetInStorage, std::move(offsetVectors)}; } } // namespace storage diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index 597dca2c94c..527efc28abe 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -27,35 +27,78 @@ void VarListDataColumnChunk::resizeBuffer(uint64_t numValues) { VarListColumnChunk::VarListColumnChunk( LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) - : ColumnChunk{std::move(dataType), capacity, enableCompression, true /* hasNullChunk */}, - needFinalize{false} { + : ColumnChunk{std::move(dataType), capacity, enableCompression, true /* hasNullChunk */} { + sizeColumnChunk = ColumnChunkFactory::createColumnChunk( + *common::LogicalType::UINT32(), enableCompression, capacity); varListDataColumnChunk = std::make_unique( ColumnChunkFactory::createColumnChunk(*VarListType::getChildType(&this->dataType)->copy(), enableCompression, 0 /* capacity */, inMemory)); + checkOffsetSortedAsc = false; KU_ASSERT(this->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); } +bool VarListColumnChunk::isOffsetsConsecutiveAndSortedAscending( + uint64_t startPos, uint64_t endPos) const { + offset_t prevEndOffset = getListStartOffset(startPos); + for (auto i = startPos; i < endPos; i++) { + offset_t currentEndOffset = getListEndOffset(i); + auto size = getListSize(i); + prevEndOffset += size; + if (currentEndOffset != prevEndOffset) { + return false; + } + } + return true; +} + +offset_t VarListColumnChunk::getListStartOffset(offset_t offset) const { + if (numValues == 0) + return 0; + return offset == numValues ? getListEndOffset(offset - 1) : + getListEndOffset(offset) - getListSize(offset); +} + +offset_t VarListColumnChunk::getListEndOffset(offset_t offset) const { + if (numValues == 0) + return 0; + KU_ASSERT(offset < numValues); + return getValue(offset); +} + +list_size_t VarListColumnChunk::getListSize(common::offset_t offset) const { + if (numValues == 0) + return 0; + KU_ASSERT(offset < sizeColumnChunk->getNumValues()); + return sizeColumnChunk->getValue(offset); +} + void VarListColumnChunk::append( ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { - nullChunk->append(other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); + checkOffsetSortedAsc = true; auto otherListChunk = ku_dynamic_cast(other); - auto offsetInDataChunkToAppend = varListDataColumnChunk->getNumValues(); - KU_ASSERT(numValues + numValuesToAppend <= capacity); + nullChunk->append(other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); + sizeColumnChunk->getNullChunk()->append( + other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); + offset_t offsetInDataChunkToAppend = varListDataColumnChunk->getNumValues(); for (auto i = 0u; i < numValuesToAppend; i++) { - offsetInDataChunkToAppend += otherListChunk->getListLen(startPosInOtherChunk + i); - setValue(offsetInDataChunkToAppend, numValues); + auto appendSize = otherListChunk->getListSize(startPosInOtherChunk + i); + sizeColumnChunk->setValue(appendSize, numValues); + offsetInDataChunkToAppend += appendSize; + setValue(offsetInDataChunkToAppend, numValues); } - auto startOffset = otherListChunk->getListOffset(startPosInOtherChunk); - auto endOffset = otherListChunk->getListOffset(startPosInOtherChunk + numValuesToAppend); - KU_ASSERT(endOffset >= startOffset); varListDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); - varListDataColumnChunk->dataColumnChunk->append( - otherListChunk->varListDataColumnChunk->dataColumnChunk.get(), startOffset, - endOffset - startOffset); + for (auto i = 0u; i < numValuesToAppend; i++) { + auto startOffset = otherListChunk->getListStartOffset(startPosInOtherChunk + i); + auto appendSize = otherListChunk->getListSize(startPosInOtherChunk + i); + varListDataColumnChunk->dataColumnChunk->append( + otherListChunk->varListDataColumnChunk->dataColumnChunk.get(), startOffset, appendSize); + } + sanityCheck(); } void VarListColumnChunk::resetToEmpty() { ColumnChunk::resetToEmpty(); + sizeColumnChunk->resetToEmpty(); varListDataColumnChunk = std::make_unique( ColumnChunkFactory::createColumnChunk(*VarListType::getChildType(&this->dataType)->copy(), enableCompression, 0 /* capacity */)); @@ -70,11 +113,13 @@ void VarListColumnChunk::append(ValueVector* vector, SelectionVector& selVector) if (capacity < newCapacity) { resize(newCapacity); } - auto nextListOffsetInChunk = getListOffset(numValues); + offset_t nextListOffsetInChunk = varListDataColumnChunk->getNumValues(); auto offsetBufferToWrite = (offset_t*)(buffer.get()); for (auto i = 0u; i < selVector.selectedSize; i++) { auto pos = selVector.selectedPositions[i]; - uint64_t listLen = vector->isNull(pos) ? 0 : vector->getValue(pos).size; + auto listLen = vector->isNull(pos) ? 0 : vector->getValue(pos).size; + sizeColumnChunk->setValue(listLen, numValues + i); + sizeColumnChunk->getNullChunk()->setNull(numValues + i, vector->isNull(pos)); nullChunk->setNull(numValues + i, vector->isNull(pos)); nextListOffsetInChunk += listLen; offsetBufferToWrite[numValues + i] = nextListOffsetInChunk; @@ -91,11 +136,14 @@ void VarListColumnChunk::append(ValueVector* vector, SelectionVector& selVector) copyListValues(vector->getValue(pos), dataVector); } numValues += numToAppend; + sanityCheck(); } void VarListColumnChunk::appendNullList() { - auto nextListOffsetInChunk = getListOffset(numValues); + offset_t nextListOffsetInChunk = varListDataColumnChunk->getNumValues(); auto offsetBufferToWrite = (offset_t*)(buffer.get()); + sizeColumnChunk->setValue(0, numValues); + sizeColumnChunk->getNullChunk()->setNull(numValues, true); offsetBufferToWrite[numValues] = nextListOffsetInChunk; nullChunk->setNull(numValues, true); numValues++; @@ -109,83 +157,102 @@ void VarListColumnChunk::lookup( return; } auto startOffset = offsetInChunk == 0 ? 0 : getValue(offsetInChunk - 1); - auto endOffset = getValue(offsetInChunk); - auto listLen = endOffset - startOffset; + auto listSize = getListSize(offsetInChunk); auto dataVector = ListVector::getDataVector(&output); auto currentListDataSize = ListVector::getDataVectorSize(&output); - ListVector::resizeDataVector(&output, currentListDataSize + listLen); + ListVector::resizeDataVector(&output, currentListDataSize + listSize); // TODO(Guodong): Should add `scan` interface and use `scan` here. - for (auto i = 0u; i < listLen; i++) { + for (auto i = 0u; i < listSize; i++) { varListDataColumnChunk->dataColumnChunk->lookup(startOffset + i, *dataVector, i); } } void VarListColumnChunk::write( ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { - KU_ASSERT(dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); - needFinalize = true; - if (!indicesColumnChunk) { - initializeIndices(); - } KU_ASSERT(chunk->getDataType().getPhysicalType() == dataType.getPhysicalType() && + dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); - auto currentIndex = numValues; - append(chunk, 0, chunk->getNumValues()); + checkOffsetSortedAsc = true; + offset_t currentIndex = varListDataColumnChunk->getNumValues(); + auto otherListChunk = ku_dynamic_cast(chunk); + varListDataColumnChunk->resizeBuffer(varListDataColumnChunk->getNumValues() + + otherListChunk->varListDataColumnChunk->getNumValues()); + varListDataColumnChunk->dataColumnChunk->append( + otherListChunk->varListDataColumnChunk->dataColumnChunk.get(), 0, + otherListChunk->varListDataColumnChunk->getNumValues()); + offset_t maxDstOffset = 0; for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto posInChunk = dstOffsets->getValue(i); - KU_ASSERT(posInChunk < capacity); - indicesColumnChunk->setValue(currentIndex++, posInChunk); - indicesColumnChunk->getNullChunk()->setNull(posInChunk, false); - if (indicesColumnChunk->getNumValues() <= posInChunk) { - indicesColumnChunk->setNumValues(posInChunk + 1); + if (posInChunk > maxDstOffset) { + maxDstOffset = posInChunk; } } - KU_ASSERT(currentIndex == numValues && - indicesColumnChunk->getNumValues() <= indicesColumnChunk->getCapacity()); + while (maxDstOffset >= numValues) { + appendNullList(); + } + for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { + auto posInChunk = dstOffsets->getValue(i); + auto appendSize = otherListChunk->getListSize(i); + currentIndex += appendSize; + setValue(currentIndex, posInChunk); + nullChunk->setNull(posInChunk, otherListChunk->nullChunk->isNull(i)); + sizeColumnChunk->setValue(appendSize, posInChunk); + sizeColumnChunk->getNullChunk()->setNull(posInChunk, otherListChunk->nullChunk->isNull(i)); + } + sanityCheck(); } void VarListColumnChunk::write( ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { - needFinalize = true; - if (!indicesColumnChunk) { - initializeIndices(); + checkOffsetSortedAsc = true; + auto selVector = std::make_unique(1); + selVector->resetSelectorToValuePosBuffer(); + selVector->selectedPositions[0] = offsetInVector; + auto appendSize = + vector->isNull(offsetInVector) ? 0 : vector->getValue(offsetInVector).size; + varListDataColumnChunk->resizeBuffer(varListDataColumnChunk->getNumValues() + appendSize); + auto dataVector = ListVector::getDataVector(vector); + dataVector->setState(std::make_unique()); + dataVector->state->selVector->resetSelectorToValuePosBuffer(); + copyListValues(vector->getValue(offsetInVector), dataVector); + while (offsetInChunk >= numValues) { + appendNullList(); } - auto currentIndex = numValues; - append(vector, *vector->state->selVector); - KU_ASSERT(offsetInChunk < capacity); - indicesColumnChunk->setValue(currentIndex, offsetInChunk); - indicesColumnChunk->getNullChunk()->setNull(offsetInChunk, vector->isNull(offsetInVector)); - if (indicesColumnChunk->getNumValues() <= offsetInChunk) { - indicesColumnChunk->setNumValues(offsetInChunk + 1); + auto isNull = vector->isNull(offsetInVector); + nullChunk->setNull(offsetInChunk, isNull); + sizeColumnChunk->getNullChunk()->setNull(offsetInChunk, isNull); + if (!isNull) { + sizeColumnChunk->setValue(appendSize, offsetInChunk); + setValue(varListDataColumnChunk->getNumValues(), offsetInChunk); } + sanityCheck(); } void VarListColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { KU_ASSERT(srcChunk->getDataType().getPhysicalType() == PhysicalTypeID::VAR_LIST); - needFinalize = true; - if (!indicesColumnChunk) { - initializeIndices(); - } - nullChunk->write(srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); + checkOffsetSortedAsc = true; auto srcListChunk = ku_dynamic_cast(srcChunk); auto offsetInDataChunkToAppend = varListDataColumnChunk->getNumValues(); - auto currentIndex = numValues; for (auto i = 0u; i < numValuesToCopy; i++) { - offsetInDataChunkToAppend += srcListChunk->getListLen(srcOffsetInChunk + i); - setValue(offsetInDataChunkToAppend, currentIndex + i); - indicesColumnChunk->setValue(currentIndex + i, dstOffsetInChunk + i); - indicesColumnChunk->getNullChunk()->setNull(dstOffsetInChunk + i, false); + auto appendSize = srcListChunk->getListSize(srcOffsetInChunk + i); + offsetInDataChunkToAppend += appendSize; + sizeColumnChunk->setValue(appendSize, dstOffsetInChunk + i); + setValue(offsetInDataChunkToAppend, dstOffsetInChunk + i); + nullChunk->setNull( + dstOffsetInChunk + i, srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); + sizeColumnChunk->getNullChunk()->setNull( + dstOffsetInChunk + i, srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); } varListDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); - auto startOffsetInSrcChunk = srcListChunk->getListOffset(srcOffsetInChunk); - auto endOffsetInSrcChunk = srcListChunk->getListOffset(srcOffsetInChunk + numValuesToCopy); - varListDataColumnChunk->dataColumnChunk->append( - srcListChunk->varListDataColumnChunk->dataColumnChunk.get(), startOffsetInSrcChunk, - endOffsetInSrcChunk - startOffsetInSrcChunk); - if (indicesColumnChunk->getNumValues() < dstOffsetInChunk + numValuesToCopy) { - indicesColumnChunk->setNumValues(dstOffsetInChunk + numValuesToCopy + 1); + for (auto i = 0u; i < numValuesToCopy; i++) { + auto startOffsetInSrcChunk = srcListChunk->getListStartOffset(srcOffsetInChunk + i); + auto appendSize = srcListChunk->getListSize(srcOffsetInChunk + i); + varListDataColumnChunk->dataColumnChunk->append( + srcListChunk->varListDataColumnChunk->dataColumnChunk.get(), startOffsetInSrcChunk, + appendSize); } + sanityCheck(); } void VarListColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, @@ -214,35 +281,75 @@ void VarListColumnChunk::copyListValues(const list_entry_t& entry, ValueVector* } } -void VarListColumnChunk::finalize() { - if (!needFinalize) { - return; +void VarListColumnChunk::resetOffset() { + offset_t nextListOffsetReset = 0; + for (auto i = 0u; i < numValues; i++) { + auto listSize = getListSize(i); + nextListOffsetReset += uint64_t(listSize); + setValue(nextListOffsetReset, i); + sizeColumnChunk->setValue(listSize, i); } +} + +void VarListColumnChunk::finalize() { + // rewrite the column chunk for better scanning performance auto newColumnChunk = ColumnChunkFactory::createColumnChunk( std::move(*dataType.copy()), enableCompression, capacity); - auto totalListLen = getListOffset(numValues) + 1; + uint64_t totalListLen = varListDataColumnChunk->getNumValues(); + uint64_t resizeThreshold = varListDataColumnChunk->capacity / 2; + // if the list is not very long, we do not need to rewrite + if (totalListLen < resizeThreshold) { + return; + } + // if we do not trigger random write, we do not need to rewrite + if (!checkOffsetSortedAsc) { + return; + } + // if the list is in ascending order, we do not need to rewrite + if (isOffsetsConsecutiveAndSortedAscending(0, numValues)) { + return; + } auto newVarListChunk = ku_dynamic_cast(newColumnChunk.get()); + newVarListChunk->resize(numValues); newVarListChunk->getDataColumnChunk()->resize(totalListLen); - for (auto i = 0u; i < indicesColumnChunk->getNumValues(); i++) { - if (indicesColumnChunk->getNullChunk()->isNull(i)) { + auto dataColumnChunk = newVarListChunk->getDataColumnChunk(); + newVarListChunk->varListDataColumnChunk->resizeBuffer(totalListLen); + offset_t offsetInChunk = 0; + offset_t currentIndex = 0; + for (auto i = 0u; i < numValues; i++) { + if (nullChunk->isNull(i)) { newVarListChunk->appendNullList(); } else { - auto index = indicesColumnChunk->getValue(i); - newColumnChunk->append(this, index, 1); + auto startOffset = getListStartOffset(i); + auto listSize = getListSize(i); + dataColumnChunk->append( + varListDataColumnChunk->dataColumnChunk.get(), startOffset, listSize); + offsetInChunk += listSize; + newVarListChunk->getNullChunk()->setNull(currentIndex, false); + newVarListChunk->sizeColumnChunk->getNullChunk()->setNull(currentIndex, false); + newVarListChunk->sizeColumnChunk->setValue(listSize, currentIndex); + newVarListChunk->setValue(offsetInChunk, currentIndex); } + currentIndex++; } + newVarListChunk->sanityCheck(); // Move offsets, null, data from newVarListChunk to this column chunk. And release indices. resetFromOtherChunk(newVarListChunk); } - void VarListColumnChunk::resetFromOtherChunk(VarListColumnChunk* other) { buffer = std::move(other->buffer); nullChunk = std::move(other->nullChunk); + sizeColumnChunk = std::move(other->sizeColumnChunk); varListDataColumnChunk = std::move(other->varListDataColumnChunk); numValues = other->numValues; - // Reset indices and needFinalize. - indicesColumnChunk.reset(); - needFinalize = false; + checkOffsetSortedAsc = false; +} + +bool VarListColumnChunk::sanityCheck() { + KU_ASSERT(ColumnChunk::sanityCheck()); + KU_ASSERT(sizeColumnChunk->sanityCheck()); + KU_ASSERT(getDataColumnChunk()->sanityCheck()); + return sizeColumnChunk->getNumValues() == numValues; } } // namespace storage diff --git a/test/test_files/issue/issue4.test b/test/test_files/issue/issue4.test new file mode 100644 index 00000000000..f27f8e8a9be --- /dev/null +++ b/test/test_files/issue/issue4.test @@ -0,0 +1,25 @@ +-GROUP IssueTest +-DATASET CSV empty + +-- + +-CASE 3083 +-STATEMENT CREATE NODE TABLE test ( prop0 STRING, prop1 STRING[], prop2 STRING, prop3 INT64, prop4 STRING, PRIMARY KEY(prop4) ) +---- ok +-STATEMENT MERGE (n:test { prop4: "efwb2143d10ccfw" }) SET n.prop0 = "efwoj23", n.prop1 = ["eee", "wefwhiihifwe23343", "dmkwlenfwef232323"], n.prop2 = "NOT eee IS NULL AND dmkwlenfwef232323 < '2023-01-10T00:00:00-05:00' AND dmkwlenfwef232323 >= '2022-01-01T00:00:00-05:00'", n.prop3 = 5 RETURN n.prop4 +---- ok +-STATEMENT MERGE (n:test { prop4: "sdnweh2382933228" }) SET n.prop0 = "efwoj23", n.prop1 = ["customer_name", "wefwhiihifwe23343", "dmkwlenfwef232323"], n.prop2 = "NOT customer_name IS NULL AND NOT dmkwlenfwef232323 IS NULL" RETURN n.prop4 +---- ok +-STATEMENT MERGE (n:test { prop4: "sdnjb232*23ksfew" }) SET n.prop0 = "fw", n.prop1 = ["wefwhiihifwe23343", "dmkwlenfwef232323"], n.prop2 = "wefwhiihifwe23343 > 5" RETURN n.prop4 +---- ok +-STATEMENT MERGE (n:test { prop4: "dsnfjwne*&232" }) SET n.prop0 = "tweee" RETURN n.prop4 +---- ok +-STATEMENT MERGE (n:test { prop4: "nsdwew*232njfds^" }) SET n.prop0 = "fw" RETURN n.prop4 +---- ok +-STATEMENT MERGE (n:test { prop4: "nsdwew*232njfds^" }) SET n.prop0 = "fw" RETURN n.prop4 +---- ok +-STATEMENT MERGE (n:test { prop4: "fwsdmwfnw&" }) SET n.prop0 = "sds" RETURN n.prop4 +---- ok +-STATEMENT MATCH (n:test) WHERE n.prop4 = "efwb2143d10ccfw" RETURN n.prop1 +---- 1 +[eee,wefwhiihifwe23343,dmkwlenfwef232323] From 3ce064d5f1d9e7392f44c730ea975e718a731b85 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Sun, 24 Mar 2024 15:13:11 -0400 Subject: [PATCH 084/136] Fix 3127 (#3130) --- src/common/types/uuid.cpp | 7 +++++-- test/test_files/tinysnb/function/list.test | 4 ++-- test/test_files/tinysnb/function/uuid.test | 8 ++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/common/types/uuid.cpp b/src/common/types/uuid.cpp index eaad41fb329..0ab63269e6b 100644 --- a/src/common/types/uuid.cpp +++ b/src/common/types/uuid.cpp @@ -1,5 +1,6 @@ #include "common/types/uuid.h" +#include "common/exception/conversion.h" #include "common/random_engine.h" namespace kuzu { @@ -44,7 +45,7 @@ bool UUID::fromString(std::string str, int128_t& result) { result.low = 0; result.high = 0; uint32_t count = 0; - for (uint32_t i = numBrackets; i < str.size() - numBrackets; ++i) { + for (auto i = numBrackets; i < str.size() - numBrackets; ++i) { if (str[i] == '-') { continue; } @@ -65,7 +66,9 @@ bool UUID::fromString(std::string str, int128_t& result) { int128_t UUID::fromString(std::string str) { int128_t result; - fromString(str, result); + if (!fromString(str, result)) { + throw ConversionException("Invalid UUID: " + str); + } return result; } diff --git a/test/test_files/tinysnb/function/list.test b/test/test_files/tinysnb/function/list.test index ebb76b551a7..2a09e64c1a7 100644 --- a/test/test_files/tinysnb/function/list.test +++ b/test/test_files/tinysnb/function/list.test @@ -26,13 +26,13 @@ list_reverse(cast([interval('1 days'), interval('2 days'), interval('3 days')], 'INTERVAL[]')), list_reverse(['long string 1', 'long string 2']), list_reverse(cast(['long string 1', 'long string 2'], 'BLOB[]')), - list_reverse(cast(['123', '345'], 'UUID[]')), + list_reverse(cast(['47c256ed-b2c4-40a0-8135-98d9c25329f7', '374a9e4a-632e-47b5-9e3d-d37b08b7980b'], 'UUID[]')), list_reverse([[1,2,3], [5,6], [7,8,9]]), list_reverse([map([1,2,3], [11,22,33]), map([5,6], [55,66])]), list_reverse([{a:1, b:2}, {c:3, d:4}]), list_reverse([union_value(a:=1), union_value(a:=2)]); ---- 1 -[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3.100000,2.100000,1.100000]|[3.100000,2.100000,1.100000]|[2020-01-03,2020-01-02,2020-01-01]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00+00,2020-01-02 00:00:00+00,2020-01-01 00:00:00+00]|[3 days,2 days,1 day]|[long string 2,long string 1]|[long string 2,long string 1]|[00000000-0000-0345-0000-000000000000,00000000-0000-0123-0000-000000000000]|[[7,8,9],[5,6],[1,2,3]]|[{5=55, 6=66},{1=11, 2=22, 3=33}]|[{a: 3, b: 4},{a: 1, b: 2}]|[2,1] +[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3,2,1]|[3.100000,2.100000,1.100000]|[3.100000,2.100000,1.100000]|[2020-01-03,2020-01-02,2020-01-01]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00,2020-01-02 00:00:00,2020-01-01 00:00:00]|[2020-01-03 00:00:00+00,2020-01-02 00:00:00+00,2020-01-01 00:00:00+00]|[3 days,2 days,1 day]|[long string 2,long string 1]|[long string 2,long string 1]|[374a9e4a-632e-47b5-9e3d-d37b08b7980b,47c256ed-b2c4-40a0-8135-98d9c25329f7]|[[7,8,9],[5,6],[1,2,3]]|[{5=55, 6=66},{1=11, 2=22, 3=33}]|[{a: 3, b: 4},{a: 1, b: 2}]|[2,1] -STATEMENT MATCH p = (a:person)-[:knows*1]->(b:person) WHERE a.ID=0 RETURN list_reverse(nodes(p)), list_reverse(rels(p)), list_reverse(properties(nodes(p), 'fName')) ; ---- 3 diff --git a/test/test_files/tinysnb/function/uuid.test b/test/test_files/tinysnb/function/uuid.test index 548bec415f7..faf235a3c92 100644 --- a/test/test_files/tinysnb/function/uuid.test +++ b/test/test_files/tinysnb/function/uuid.test @@ -96,3 +96,11 @@ ffffffff-ffff-ffff-ffff-ffffffffffff -STATEMENT MATCH (a:Person) RETURN collect(a.u) ---- 1 [a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11,47183823-2574-4bfd-b411-99ed177d3e43,10203040-5060-7080-0102-030405060708,a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12,47183823-2574-4bfd-b411-99ed177d3e43,10203040-5060-7080-0102-030405060708,00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000001,00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000000,80000000-0000-0000-8fff-ffffffffffff,80000000-0000-0000-ffff-ffffffffffff,8fffffff-ffff-ffff-0000-000000000000,8fffffff-ffff-ffff-8000-000000000000,8fffffff-ffff-ffff-8fff-ffffffffffff,8fffffff-ffff-ffff-ffff-ffffffffffff,ffffffff-ffff-ffff-ffff-ffffffffffff] + +-STATEMENT RETURN UUID("11111111111111111"); +---- error +Conversion exception: Invalid UUID: 11111111111111111 + +-STATEMENT RETURN UUID("0"); +---- error +Conversion exception: Invalid UUID: 0 From 3813eed8fbf99f88b6cb5bf315924595197869e7 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Sun, 24 Mar 2024 19:57:19 -0400 Subject: [PATCH 085/136] Fix issue-3129 (#3131) --- .../operator/hash_join/join_hash_table.cpp | 12 ++++++------ test/test_files/issue/issue2.test | 13 +++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/processor/operator/hash_join/join_hash_table.cpp b/src/processor/operator/hash_join/join_hash_table.cpp index 9e7a61a370e..c17457b94f2 100644 --- a/src/processor/operator/hash_join/join_hash_table.cpp +++ b/src/processor/operator/hash_join/join_hash_table.cpp @@ -245,22 +245,22 @@ void JoinHashTable::getHashFunction(PhysicalTypeID physicalTypeID, hash_function } break; case PhysicalTypeID::INT8: { func = hashEntry; - } + } break; case PhysicalTypeID::UINT64: { func = hashEntry; - } + } break; case PhysicalTypeID::UINT32: { func = hashEntry; - } + } break; case PhysicalTypeID::UINT16: { func = hashEntry; - } + } break; case PhysicalTypeID::UINT8: { func = hashEntry; - } + } break; case PhysicalTypeID::INT128: { func = hashEntry; - } + } break; case PhysicalTypeID::DOUBLE: { func = hashEntry; } break; diff --git a/test/test_files/issue/issue2.test b/test/test_files/issue/issue2.test index fa51eba6ca1..934031e9121 100644 --- a/test/test_files/issue/issue2.test +++ b/test/test_files/issue/issue2.test @@ -3,6 +3,19 @@ -- +-CASE 3129 +-STATEMENT CREATE NODE TABLE V (id UUID, PRIMARY KEY(id)); +---- ok +-STATEMENT CREATE REL TABLE E (FROM V TO V); +---- ok +-STATEMENT CREATE (v1:V {id: UUID('11111111-1111-1111-1111-111111111111')})-[:E]->(v2:V {id: UUID('22222222-2222-2222-2222-222222222222')}); +---- ok +-STATEMENT MATCH (v:V {id: UUID('11111111-1111-1111-1111-111111111111')}) + OPTIONAL MATCH (v)-[:E]->(v1:V) + RETURN v1.id +---- 1 +22222222-2222-2222-2222-222222222222 + -CASE 3055 -STATEMENT CREATE NODE TABLE test ( id STRING, prop1 STRING, prop2 INT64, prop3 STRING, prop4 STRING, PRIMARY KEY(id) ) ---- ok From 53ef58e8682b9988319f8b957fb6f4e2b5d3b16a Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Mon, 25 Mar 2024 12:03:54 -0400 Subject: [PATCH 086/136] Refactor scalar function registration (#3119) Refactor comparison functions Refactor date functions Refactor timestamp functions Refactor interval functions Refactor blob functions Refactor UUID functions Refactor struct functions Refactor map functions Refactor union functions --- .../bind_property_expression.cpp | 3 +- src/binder/expression_visitor.cpp | 3 +- src/common/expression_type.cpp | 15 +- src/function/built_in_function_utils.cpp | 131 +----------------- src/function/function_collection.cpp | 50 +++++++ src/function/pattern/id_function.cpp | 3 +- src/function/vector_blob_functions.cpp | 12 +- src/function/vector_date_functions.cpp | 40 +++--- src/function/vector_map_functions.cpp | 57 ++++---- src/function/vector_struct_functions.cpp | 73 +++++----- src/function/vector_timestamp_functions.cpp | 6 +- src/function/vector_union_functions.cpp | 30 ++-- src/function/vector_uuid_functions.cpp | 5 +- src/include/common/enums/expression_type.h | 60 -------- .../function/blob/vector_blob_functions.h | 6 + .../function/built_in_function_utils.h | 9 -- .../comparison/vector_comparison_functions.h | 40 ++++-- .../function/date/vector_date_functions.h | 20 +++ .../interval/vector_interval_functions.h | 52 ++++--- .../function/map/vector_map_functions.h | 18 +-- .../function/struct/vector_struct_functions.h | 11 +- .../timestamp/vector_timestamp_functions.h | 6 + .../function/union/vector_union_functions.h | 14 +- .../function/uuid/vector_uuid_functions.h | 2 + src/parser/transform/transform_expression.cpp | 3 +- 25 files changed, 294 insertions(+), 375 deletions(-) diff --git a/src/binder/bind_expression/bind_property_expression.cpp b/src/binder/bind_expression/bind_property_expression.cpp index e52303dfe12..631e3453842 100644 --- a/src/binder/bind_expression/bind_property_expression.cpp +++ b/src/binder/bind_expression/bind_property_expression.cpp @@ -6,6 +6,7 @@ #include "common/cast.h" #include "common/exception/binder.h" #include "common/string_format.h" +#include "function/struct/vector_struct_functions.h" #include "parser/expression/parsed_property_expression.h" using namespace kuzu::common; @@ -103,7 +104,7 @@ std::shared_ptr ExpressionBinder::bindStructPropertyExpression( std::shared_ptr child, const std::string& propertyName) { auto children = expression_vector{std::move(child), createStringLiteralExpression(propertyName)}; - return bindScalarFunctionExpression(children, STRUCT_EXTRACT_FUNC_NAME); + return bindScalarFunctionExpression(children, function::StructExtractFunctions::name); } } // namespace binder diff --git a/src/binder/expression_visitor.cpp b/src/binder/expression_visitor.cpp index 837b83c8300..1ed04359fb6 100644 --- a/src/binder/expression_visitor.cpp +++ b/src/binder/expression_visitor.cpp @@ -7,6 +7,7 @@ #include "binder/expression/rel_expression.h" #include "binder/expression/subquery_expression.h" #include "common/cast.h" +#include "function/uuid/vector_uuid_functions.h" using namespace kuzu::common; @@ -107,7 +108,7 @@ bool ExpressionVisitor::isRandom(const Expression& expression) { return false; } auto& funcExpr = ku_dynamic_cast(expression); - if (funcExpr.getFunctionName() == GEN_RANDOM_UUID_FUNC_NAME) { + if (funcExpr.getFunctionName() == function::GenRandomUUIDFunction::name) { return true; } for (auto& child : ExpressionChildrenCollector::collectChildren(expression)) { diff --git a/src/common/expression_type.cpp b/src/common/expression_type.cpp index e24bb21c4ec..4e33b2e1574 100644 --- a/src/common/expression_type.cpp +++ b/src/common/expression_type.cpp @@ -1,6 +1,9 @@ #include "common/enums/expression_type.h" #include "common/assert.h" +#include "function/comparison/vector_comparison_functions.h" + +using namespace kuzu::function; namespace kuzu { namespace common { @@ -54,17 +57,17 @@ std::string expressionTypeToString(ExpressionType type) { case ExpressionType::NOT: return "NOT"; case ExpressionType::EQUALS: - return EQUALS_FUNC_NAME; + return EqualsFunction::name; case ExpressionType::NOT_EQUALS: - return NOT_EQUALS_FUNC_NAME; + return NotEqualsFunction::name; case ExpressionType::GREATER_THAN: - return GREATER_THAN_FUNC_NAME; + return GreaterThanFunction::name; case ExpressionType::GREATER_THAN_EQUALS: - return GREATER_THAN_EQUALS_FUNC_NAME; + return GreaterThanEqualsFunction::name; case ExpressionType::LESS_THAN: - return LESS_THAN_FUNC_NAME; + return LessThanFunction::name; case ExpressionType::LESS_THAN_EQUALS: - return LESS_THAN_EQUALS_FUNC_NAME; + return LessThanEqualsFunction::name; case ExpressionType::IS_NULL: return "IS_NULL"; case ExpressionType::IS_NOT_NULL: diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index cb6feee179f..aed466bc1c9 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -11,21 +11,12 @@ #include "function/aggregate/count_star.h" #include "function/aggregate_function.h" #include "function/arithmetic/vector_arithmetic_functions.h" -#include "function/blob/vector_blob_functions.h" -#include "function/comparison/vector_comparison_functions.h" -#include "function/date/vector_date_functions.h" #include "function/function_collection.h" -#include "function/interval/vector_interval_functions.h" -#include "function/list/vector_list_functions.h" -#include "function/map/vector_map_functions.h" #include "function/path/vector_path_functions.h" #include "function/rdf/vector_rdf_functions.h" +#include "function/scalar_function.h" #include "function/schema/vector_node_rel_functions.h" -#include "function/struct/vector_struct_functions.h" #include "function/table/call_functions.h" -#include "function/timestamp/vector_timestamp_functions.h" -#include "function/union/vector_union_functions.h" -#include "function/uuid/vector_uuid_functions.h" #include "processor/operator/persistent/reader/csv/parallel_csv_reader.h" #include "processor/operator/persistent/reader/csv/serial_csv_reader.h" #include "processor/operator/persistent/reader/npy/npy_reader.h" @@ -56,17 +47,8 @@ void BuiltInFunctionsUtils::createFunctions(CatalogSet* catalogSet) { } void BuiltInFunctionsUtils::registerScalarFunctions(CatalogSet* catalogSet) { - registerComparisonFunctions(catalogSet); - registerDateFunctions(catalogSet); - registerTimestampFunctions(catalogSet); - registerIntervalFunctions(catalogSet); - registerStructFunctions(catalogSet); - registerMapFunctions(catalogSet); - registerUnionFunctions(catalogSet); registerNodeRelFunctions(catalogSet); registerPathFunctions(catalogSet); - registerBlobFunctions(catalogSet); - registerUUIDFunctions(catalogSet); registerRdfFunctions(catalogSet); } @@ -533,117 +515,6 @@ void BuiltInFunctionsUtils::validateSpecialCases(std::vector& candida } } -void BuiltInFunctionsUtils::registerComparisonFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - EQUALS_FUNC_NAME, EqualsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - NOT_EQUALS_FUNC_NAME, NotEqualsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - GREATER_THAN_FUNC_NAME, GreaterThanFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - GREATER_THAN_EQUALS_FUNC_NAME, GreaterThanEqualsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LESS_THAN_FUNC_NAME, LessThanFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LESS_THAN_EQUALS_FUNC_NAME, LessThanEqualsFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerDateFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - DATE_PART_FUNC_NAME, DatePartFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DATEPART_FUNC_NAME, DatePartFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DATE_TRUNC_FUNC_NAME, DateTruncFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DATETRUNC_FUNC_NAME, DateTruncFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DAYNAME_FUNC_NAME, DayNameFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - GREATEST_FUNC_NAME, GreatestFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LAST_DAY_FUNC_NAME, LastDayFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - LEAST_FUNC_NAME, LeastFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MAKE_DATE_FUNC_NAME, MakeDateFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MONTHNAME_FUNC_NAME, MonthNameFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerTimestampFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - CENTURY_FUNC_NAME, CenturyFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - EPOCH_MS_FUNC_NAME, EpochMsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_TIMESTAMP_FUNC_NAME, ToTimestampFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerIntervalFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - TO_YEARS_FUNC_NAME, ToYearsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_MONTHS_FUNC_NAME, ToMonthsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_DAYS_FUNC_NAME, ToDaysFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_HOURS_FUNC_NAME, ToHoursFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_MINUTES_FUNC_NAME, ToMinutesFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_SECONDS_FUNC_NAME, ToSecondsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_MILLISECONDS_FUNC_NAME, ToMillisecondsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TO_MICROSECONDS_FUNC_NAME, ToMicrosecondsFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerBlobFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - OCTET_LENGTH_FUNC_NAME, OctetLengthFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ENCODE_FUNC_NAME, EncodeFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DECODE_FUNC_NAME, DecodeFunctions::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerUUIDFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - GEN_RANDOM_UUID_FUNC_NAME, GenRandomUUIDFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerStructFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - STRUCT_PACK_FUNC_NAME, StructPackFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - STRUCT_EXTRACT_FUNC_NAME, StructExtractFunctions::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerMapFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - MAP_CREATION_FUNC_NAME, MapCreationFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MAP_EXTRACT_FUNC_NAME, MapExtractFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - ELEMENT_AT_FUNC_NAME, MapExtractFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - CARDINALITY_FUNC_NAME, SizeFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MAP_KEYS_FUNC_NAME, MapKeysFunctions::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - MAP_VALUES_FUNC_NAME, MapValuesFunctions::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerUnionFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - UNION_VALUE_FUNC_NAME, UnionValueFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - UNION_TAG_FUNC_NAME, UnionTagFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - UNION_EXTRACT_FUNC_NAME, UnionExtractFunction::getFunctionSet())); -} - void BuiltInFunctionsUtils::registerNodeRelFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( OFFSET_FUNC_NAME, OffsetFunction::getFunctionSet())); diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 0f4a78bc65e..4fc4b135121 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -2,9 +2,18 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/array/vector_array_functions.h" +#include "function/blob/vector_blob_functions.h" #include "function/cast/vector_cast_functions.h" +#include "function/comparison/vector_comparison_functions.h" +#include "function/date/vector_date_functions.h" +#include "function/interval/vector_interval_functions.h" #include "function/list/vector_list_functions.h" +#include "function/map/vector_map_functions.h" #include "function/string/vector_string_functions.h" +#include "function/struct/vector_struct_functions.h" +#include "function/timestamp/vector_timestamp_functions.h" +#include "function/union/vector_union_functions.h" +#include "function/uuid/vector_uuid_functions.h" namespace kuzu { namespace function { @@ -95,6 +104,47 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION(CastToInt128Function), SCALAR_FUNCTION(CastToBoolFunction), SCALAR_FUNCTION(CastAnyFunction), + // Comparison functions + SCALAR_FUNCTION(EqualsFunction), SCALAR_FUNCTION(NotEqualsFunction), + SCALAR_FUNCTION(GreaterThanFunction), SCALAR_FUNCTION(GreaterThanEqualsFunction), + SCALAR_FUNCTION(LessThanFunction), SCALAR_FUNCTION(LessThanEqualsFunction), + + // Date functions + SCALAR_FUNCTION(DatePartFunction), SCALAR_FUNCTION_ALIAS(DatePartFunction), + SCALAR_FUNCTION(DateTruncFunction), SCALAR_FUNCTION_ALIAS(DateTruncFunction), + SCALAR_FUNCTION(DayNameFunction), SCALAR_FUNCTION(GreatestFunction), + SCALAR_FUNCTION(LastDayFunction), SCALAR_FUNCTION(LeastFunction), + SCALAR_FUNCTION(MakeDateFunction), SCALAR_FUNCTION(MonthNameFunction), + + // Timestamp functions + SCALAR_FUNCTION(CenturyFunction), SCALAR_FUNCTION(EpochMsFunction), + SCALAR_FUNCTION(ToTimestampFunction), + + // Interval functions + SCALAR_FUNCTION(ToYearsFunction), SCALAR_FUNCTION(ToMonthsFunction), + SCALAR_FUNCTION(ToDaysFunction), SCALAR_FUNCTION(ToHoursFunction), + SCALAR_FUNCTION(ToMinutesFunction), SCALAR_FUNCTION(ToSecondsFunction), + SCALAR_FUNCTION(ToMillisecondsFunction), SCALAR_FUNCTION(ToMicrosecondsFunction), + + // Blob functions + SCALAR_FUNCTION(OctetLengthFunctions), SCALAR_FUNCTION(EncodeFunctions), + SCALAR_FUNCTION(DecodeFunctions), + + // UUID functions + SCALAR_FUNCTION(GenRandomUUIDFunction), + + // Struct functions + SCALAR_FUNCTION(StructPackFunctions), SCALAR_FUNCTION(StructExtractFunctions), + + // Map functions + SCALAR_FUNCTION(MapCreationFunctions), SCALAR_FUNCTION(MapExtractFunctions), + SCALAR_FUNCTION_ALIAS(MapExtractFunctions), SCALAR_FUNCTION_ALIAS(SizeFunction), + SCALAR_FUNCTION(MapKeysFunctions), SCALAR_FUNCTION(MapValuesFunctions), + + // Union functions + SCALAR_FUNCTION(UnionValueFunction), SCALAR_FUNCTION(UnionTagFunction), + SCALAR_FUNCTION(UnionExtractFunction), + // End of array FINAL_FUNCTION}; diff --git a/src/function/pattern/id_function.cpp b/src/function/pattern/id_function.cpp index 2a8dc679f11..a0513134358 100644 --- a/src/function/pattern/id_function.cpp +++ b/src/function/pattern/id_function.cpp @@ -5,6 +5,7 @@ #include "common/cast.h" #include "function/rewrite_function.h" #include "function/schema/vector_node_rel_functions.h" +#include "function/struct/vector_struct_functions.h" using namespace kuzu::common; using namespace kuzu::binder; @@ -28,7 +29,7 @@ static std::shared_ptr rewriteFunc( auto key = Value(LogicalType::STRING(), InternalKeyword::ID); auto keyExpr = binder->createLiteralExpression(key.copy()); auto newParams = expression_vector{params[0], keyExpr}; - return binder->bindScalarFunctionExpression(newParams, STRUCT_EXTRACT_FUNC_NAME); + return binder->bindScalarFunctionExpression(newParams, StructExtractFunctions::name); } function_set IDFunction::getFunctionSet() { diff --git a/src/function/vector_blob_functions.cpp b/src/function/vector_blob_functions.cpp index b86dd04df9a..ecc64a5d792 100644 --- a/src/function/vector_blob_functions.cpp +++ b/src/function/vector_blob_functions.cpp @@ -12,16 +12,16 @@ namespace function { function_set OctetLengthFunctions::getFunctionSet() { function_set definitions; - definitions.push_back(make_unique(OCTET_LENGTH_FUNC_NAME, - std::vector{LogicalTypeID::BLOB}, LogicalTypeID::INT64, - ScalarFunction::UnaryExecFunction, nullptr, nullptr, nullptr, - false /* isVarLength */)); + definitions.push_back( + make_unique(name, std::vector{LogicalTypeID::BLOB}, + LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction, + nullptr, nullptr, nullptr, false /* isVarLength */)); return definitions; } function_set EncodeFunctions::getFunctionSet() { function_set definitions; - definitions.push_back(make_unique(ENCODE_FUNC_NAME, + definitions.push_back(make_unique(name, std::vector{LogicalTypeID::STRING}, LogicalTypeID::BLOB, ScalarFunction::UnaryStringExecFunction, nullptr, false /* isVarLength */)); @@ -30,7 +30,7 @@ function_set EncodeFunctions::getFunctionSet() { function_set DecodeFunctions::getFunctionSet() { function_set definitions; - definitions.push_back(make_unique(DECODE_FUNC_NAME, + definitions.push_back(make_unique(name, std::vector{LogicalTypeID::BLOB}, LogicalTypeID::STRING, ScalarFunction::UnaryStringExecFunction, nullptr, false /* isVarLength */)); diff --git a/src/function/vector_date_functions.cpp b/src/function/vector_date_functions.cpp index c3fa3c12b1f..1b8397521c2 100644 --- a/src/function/vector_date_functions.cpp +++ b/src/function/vector_date_functions.cpp @@ -10,15 +10,15 @@ namespace function { function_set DatePartFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(DATE_PART_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::DATE}, LogicalTypeID::INT64, ScalarFunction::BinaryExecFunction)); - result.push_back(make_unique(DATE_PART_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::TIMESTAMP}, LogicalTypeID::INT64, ScalarFunction::BinaryExecFunction)); - result.push_back(make_unique(DATE_PART_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INTERVAL}, LogicalTypeID::INT64, ScalarFunction::BinaryExecFunction)); @@ -27,10 +27,10 @@ function_set DatePartFunction::getFunctionSet() { function_set DateTruncFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(DATE_TRUNC_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::DATE}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); - result.push_back(make_unique(DATE_TRUNC_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::TIMESTAMP}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); @@ -39,10 +39,10 @@ function_set DateTruncFunction::getFunctionSet() { function_set DayNameFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(DAYNAME_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE}, LogicalTypeID::STRING, ScalarFunction::UnaryExecFunction)); - result.push_back(make_unique(DAYNAME_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP}, LogicalTypeID::STRING, ScalarFunction::UnaryExecFunction)); return result; @@ -50,10 +50,10 @@ function_set DayNameFunction::getFunctionSet() { function_set GreatestFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(GREATEST_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::DATE}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); - result.push_back(make_unique(GREATEST_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP, LogicalTypeID::TIMESTAMP}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); @@ -62,21 +62,21 @@ function_set GreatestFunction::getFunctionSet() { function_set LastDayFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(LAST_DAY_FUNC_NAME, - std::vector{LogicalTypeID::DATE}, LogicalTypeID::DATE, - ScalarFunction::UnaryExecFunction)); - result.push_back(make_unique(LAST_DAY_FUNC_NAME, - std::vector{LogicalTypeID::TIMESTAMP}, LogicalTypeID::DATE, - ScalarFunction::UnaryExecFunction)); + result.push_back( + make_unique(name, std::vector{LogicalTypeID::DATE}, + LogicalTypeID::DATE, ScalarFunction::UnaryExecFunction)); + result.push_back( + make_unique(name, std::vector{LogicalTypeID::TIMESTAMP}, + LogicalTypeID::DATE, ScalarFunction::UnaryExecFunction)); return result; } function_set LeastFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(LEAST_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::DATE}, LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); - result.push_back(make_unique(LEAST_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP, LogicalTypeID::TIMESTAMP}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); @@ -85,7 +85,7 @@ function_set LeastFunction::getFunctionSet() { function_set MakeDateFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(MAKE_DATE_FUNC_NAME, + result.push_back(make_unique(name, std::vector{ LogicalTypeID::INT64, LogicalTypeID::INT64, LogicalTypeID::INT64}, LogicalTypeID::DATE, @@ -95,10 +95,10 @@ function_set MakeDateFunction::getFunctionSet() { function_set MonthNameFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(MONTHNAME_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE}, LogicalTypeID::STRING, ScalarFunction::UnaryExecFunction)); - result.push_back(make_unique(MONTHNAME_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP}, LogicalTypeID::STRING, ScalarFunction::UnaryExecFunction)); return result; diff --git a/src/function/vector_map_functions.cpp b/src/function/vector_map_functions.cpp index fc3f725995d..f1dbf0bceb7 100644 --- a/src/function/vector_map_functions.cpp +++ b/src/function/vector_map_functions.cpp @@ -11,17 +11,7 @@ using namespace kuzu::common; namespace kuzu { namespace function { -function_set MapCreationFunctions::getFunctionSet() { - auto execFunc = ScalarFunction::BinaryExecListStructFunction; - function_set functionSet; - functionSet.push_back(make_unique(MAP_CREATION_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, - LogicalTypeID::MAP, execFunc, nullptr, bindFunc, false /* isVarLength */)); - return functionSet; -} - -std::unique_ptr MapCreationFunctions::bindFunc( +static std::unique_ptr MapCreationFunctionsBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { auto keyType = VarListType::getChildType(&arguments[0]->dataType); auto valueType = VarListType::getChildType(&arguments[1]->dataType); @@ -29,11 +19,14 @@ std::unique_ptr MapCreationFunctions::bindFunc( return std::make_unique(std::move(resultType)); } -function_set MapExtractFunctions::getFunctionSet() { +function_set MapCreationFunctions::getFunctionSet() { + auto execFunc = ScalarFunction::BinaryExecListStructFunction; function_set functionSet; - functionSet.push_back(make_unique(MAP_EXTRACT_FUNC_NAME, - std::vector{LogicalTypeID::MAP, LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, - nullptr, nullptr, bindFunc, false /* isVarLength */)); + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, + LogicalTypeID::MAP, execFunc, nullptr, MapCreationFunctionsBindFunc, + false /* isVarLength */)); return functionSet; } @@ -45,7 +38,7 @@ static void validateKeyType(const std::shared_ptr& mapExpres } } -std::unique_ptr MapExtractFunctions::bindFunc( +static std::unique_ptr MapExtractFunctionsBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* function) { validateKeyType(arguments[0], arguments[1]); auto scalarFunction = ku_dynamic_cast(function); @@ -126,37 +119,45 @@ std::unique_ptr MapExtractFunctions::bindFunc( std::make_unique(*MapType::getValueType(&arguments[0]->dataType)))); } -function_set MapKeysFunctions::getFunctionSet() { - auto execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; +function_set MapExtractFunctions::getFunctionSet() { function_set functionSet; - functionSet.push_back(make_unique(MAP_KEYS_FUNC_NAME, - std::vector{LogicalTypeID::MAP}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - bindFunc, false /* isVarLength */)); + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::MAP, LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, + nullptr, nullptr, MapExtractFunctionsBindFunc, false /* isVarLength */)); return functionSet; } -std::unique_ptr MapKeysFunctions::bindFunc( +static std::unique_ptr MapKeysFunctionsBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { return std::make_unique(LogicalType::VAR_LIST( std::make_unique(*MapType::getKeyType(&arguments[0]->dataType)))); } -function_set MapValuesFunctions::getFunctionSet() { +function_set MapKeysFunctions::getFunctionSet() { auto execFunc = - ScalarFunction::UnaryExecNestedTypeFunction; + ScalarFunction::UnaryExecNestedTypeFunction; function_set functionSet; - functionSet.push_back(make_unique(MAP_VALUES_FUNC_NAME, + functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::MAP}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - bindFunc, false /* isVarLength */)); + MapKeysFunctionsBindFunc, false /* isVarLength */)); return functionSet; } -std::unique_ptr MapValuesFunctions::bindFunc( +static std::unique_ptr MapValuesFunctionsBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { return std::make_unique(LogicalType::VAR_LIST( std::make_unique(*MapType::getValueType(&arguments[0]->dataType)))); } +function_set MapValuesFunctions::getFunctionSet() { + auto execFunc = + ScalarFunction::UnaryExecNestedTypeFunction; + function_set functionSet; + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::MAP}, LogicalTypeID::VAR_LIST, execFunc, nullptr, + MapValuesFunctionsBindFunc, false /* isVarLength */)); + return functionSet; +} + } // namespace function } // namespace kuzu diff --git a/src/function/vector_struct_functions.cpp b/src/function/vector_struct_functions.cpp index 81052f3065f..6fc3de61b7a 100644 --- a/src/function/vector_struct_functions.cpp +++ b/src/function/vector_struct_functions.cpp @@ -4,22 +4,14 @@ #include "binder/expression_binder.h" #include "common/exception/binder.h" #include "common/string_format.h" -#include "function/function.h" +#include "function/scalar_function.h" using namespace kuzu::common; namespace kuzu { namespace function { -function_set StructPackFunctions::getFunctionSet() { - function_set functions; - functions.push_back(make_unique(STRUCT_PACK_FUNC_NAME, - std::vector{LogicalTypeID::ANY}, LogicalTypeID::STRUCT, execFunc, nullptr, - compileFunc, bindFunc, true /* isVarLength */)); - return functions; -} - -std::unique_ptr StructPackFunctions::bindFunc( +static std::unique_ptr StructPackFunctionsBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { std::vector fields; for (auto& argument : arguments) { @@ -32,20 +24,6 @@ std::unique_ptr StructPackFunctions::bindFunc( return std::make_unique(std::move(resultType)); } -void StructPackFunctions::execFunc(const std::vector>& parameters, - ValueVector& result, void* /*dataPtr*/) { - for (auto i = 0u; i < parameters.size(); i++) { - auto& parameter = parameters[i]; - if (parameter->state == result.state) { - continue; - } - // If the parameter's state is inconsistent with the result's state, we need to copy the - // parameter's value to the corresponding child vector. - copyParameterValueToStructFieldVector( - parameter.get(), StructVector::getFieldVector(&result, i).get(), result.state.get()); - } -} - void StructPackFunctions::compileFunc(FunctionBindData* /*bindData*/, const std::vector>& parameters, std::shared_ptr& result) { @@ -60,7 +38,7 @@ void StructPackFunctions::compileFunc(FunctionBindData* /*bindData*/, } } -void StructPackFunctions::copyParameterValueToStructFieldVector( +static void copyParameterValueToStructFieldVector( const ValueVector* parameter, ValueVector* structField, DataChunkState* structVectorState) { // If the parameter is unFlat, then its state must be consistent with the result's state. // Thus, we don't need to copy values to structFieldVector. @@ -77,20 +55,26 @@ void StructPackFunctions::copyParameterValueToStructFieldVector( } } -function_set StructExtractFunctions::getFunctionSet() { - function_set functions; - auto inputTypeIDs = - std::vector{LogicalTypeID::STRUCT, LogicalTypeID::NODE, LogicalTypeID::REL}; - for (auto inputTypeID : inputTypeIDs) { - functions.push_back(getFunction(inputTypeID)); +void StructPackFunctions::execFunc(const std::vector>& parameters, + ValueVector& result, void* /*dataPtr*/) { + for (auto i = 0u; i < parameters.size(); i++) { + auto& parameter = parameters[i]; + if (parameter->state == result.state) { + continue; + } + // If the parameter's state is inconsistent with the result's state, we need to copy the + // parameter's value to the corresponding child vector. + copyParameterValueToStructFieldVector( + parameter.get(), StructVector::getFieldVector(&result, i).get(), result.state.get()); } - return functions; } -std::unique_ptr StructExtractFunctions::getFunction(LogicalTypeID logicalTypeID) { - return std::make_unique(STRUCT_EXTRACT_FUNC_NAME, - std::vector{logicalTypeID, LogicalTypeID::STRING}, LogicalTypeID::ANY, - nullptr, nullptr, compileFunc, bindFunc, false /* isVarLength */); +function_set StructPackFunctions::getFunctionSet() { + function_set functions; + functions.push_back(make_unique(name, + std::vector{LogicalTypeID::ANY}, LogicalTypeID::STRUCT, execFunc, nullptr, + compileFunc, StructPackFunctionsBindFunc, true /* isVarLength */)); + return functions; } std::unique_ptr StructExtractFunctions::bindFunc( @@ -117,5 +101,22 @@ void StructExtractFunctions::compileFunc(FunctionBindData* bindData, result->state = parameters[0]->state; } +static std::unique_ptr getStructExtractFunction(LogicalTypeID logicalTypeID) { + return std::make_unique(StructExtractFunctions::name, + std::vector{logicalTypeID, LogicalTypeID::STRING}, LogicalTypeID::ANY, + nullptr, nullptr, StructExtractFunctions::compileFunc, StructExtractFunctions::bindFunc, + false /* isVarLength */); +} + +function_set StructExtractFunctions::getFunctionSet() { + function_set functions; + auto inputTypeIDs = + std::vector{LogicalTypeID::STRUCT, LogicalTypeID::NODE, LogicalTypeID::REL}; + for (auto inputTypeID : inputTypeIDs) { + functions.push_back(getStructExtractFunction(inputTypeID)); + } + return functions; +} + } // namespace function } // namespace kuzu diff --git a/src/function/vector_timestamp_functions.cpp b/src/function/vector_timestamp_functions.cpp index 601b44053a2..5a135aa28cf 100644 --- a/src/function/vector_timestamp_functions.cpp +++ b/src/function/vector_timestamp_functions.cpp @@ -10,7 +10,7 @@ namespace function { function_set CenturyFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(CENTURY_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP}, LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction)); return result; @@ -18,7 +18,7 @@ function_set CenturyFunction::getFunctionSet() { function_set EpochMsFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(EPOCH_MS_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::INT64}, LogicalTypeID::TIMESTAMP, ScalarFunction::UnaryExecFunction)); return result; @@ -26,7 +26,7 @@ function_set EpochMsFunction::getFunctionSet() { function_set ToTimestampFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(TO_TIMESTAMP_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::DOUBLE}, LogicalTypeID::TIMESTAMP, ScalarFunction::UnaryExecFunction)); return result; diff --git a/src/function/vector_union_functions.cpp b/src/function/vector_union_functions.cpp index 33b6eefabb8..202bc9aa192 100644 --- a/src/function/vector_union_functions.cpp +++ b/src/function/vector_union_functions.cpp @@ -9,15 +9,7 @@ using namespace kuzu::common; namespace kuzu { namespace function { -function_set UnionValueFunction::getFunctionSet() { - function_set functionSet; - functionSet.push_back(make_unique(UNION_VALUE_FUNC_NAME, - std::vector{LogicalTypeID::ANY}, LogicalTypeID::UNION, execFunc, nullptr, - compileFunc, bindFunc, false /* isVarLength */)); - return functionSet; -} - -std::unique_ptr UnionValueFunction::bindFunc( +static std::unique_ptr UnionValueFunctionBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { KU_ASSERT(arguments.size() == 1); std::vector fields; @@ -32,12 +24,13 @@ std::unique_ptr UnionValueFunction::bindFunc( return std::make_unique(std::move(resultType)); } -void UnionValueFunction::execFunc(const std::vector>& /*parameters*/, - ValueVector& result, void* /*dataPtr*/) { +static void UnionValueFunctionExecFunc( + const std::vector>& /*parameters*/, ValueVector& result, + void* /*dataPtr*/) { UnionVector::setTagField(&result, UnionType::TAG_FIELD_IDX); } -void UnionValueFunction::compileFunc(FunctionBindData* /*bindData*/, +static void UnionValueFunctionCompileFunc(FunctionBindData* /*bindData*/, const std::vector>& parameters, std::shared_ptr& result) { KU_ASSERT(parameters.size() == 1); @@ -46,9 +39,18 @@ void UnionValueFunction::compileFunc(FunctionBindData* /*bindData*/, UnionVector::referenceVector(result.get(), UnionType::TAG_FIELD_IDX, parameters[0]); } +function_set UnionValueFunction::getFunctionSet() { + function_set functionSet; + functionSet.push_back( + make_unique(name, std::vector{LogicalTypeID::ANY}, + LogicalTypeID::UNION, UnionValueFunctionExecFunc, nullptr, + UnionValueFunctionCompileFunc, UnionValueFunctionBindFunc, false /* isVarLength */)); + return functionSet; +} + function_set UnionTagFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(make_unique(UNION_TAG_FUNC_NAME, + functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::UNION}, LogicalTypeID::STRING, ScalarFunction::UnaryExecNestedTypeFunction, nullptr, nullptr, false /* isVarLength */)); @@ -57,7 +59,7 @@ function_set UnionTagFunction::getFunctionSet() { function_set UnionExtractFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(make_unique(UNION_EXTRACT_FUNC_NAME, + functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::UNION, LogicalTypeID::STRING}, LogicalTypeID::ANY, nullptr, nullptr, StructExtractFunctions::compileFunc, StructExtractFunctions::bindFunc, false /* isVarLength */)); diff --git a/src/function/vector_uuid_functions.cpp b/src/function/vector_uuid_functions.cpp index f441d8310f1..e4bb0a22cbc 100644 --- a/src/function/vector_uuid_functions.cpp +++ b/src/function/vector_uuid_functions.cpp @@ -10,9 +10,8 @@ namespace function { function_set GenRandomUUIDFunction::getFunctionSet() { function_set definitions; - definitions.push_back( - make_unique(GEN_RANDOM_UUID_FUNC_NAME, std::vector{}, - LogicalTypeID::UUID, ScalarFunction::PoniterExecFunction)); + definitions.push_back(make_unique(name, std::vector{}, + LogicalTypeID::UUID, ScalarFunction::PoniterExecFunction)); return definitions; } diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index c81d0181a55..2ea8b0fe9bc 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -19,61 +19,9 @@ const char* const MIN_FUNC_NAME = "MIN"; const char* const MAX_FUNC_NAME = "MAX"; const char* const COLLECT_FUNC_NAME = "COLLECT"; -// struct -const char* const STRUCT_PACK_FUNC_NAME = "STRUCT_PACK"; -const char* const STRUCT_EXTRACT_FUNC_NAME = "STRUCT_EXTRACT"; - -// map -const char* const MAP_CREATION_FUNC_NAME = "MAP"; -const char* const MAP_EXTRACT_FUNC_NAME = "MAP_EXTRACT"; -const char* const ELEMENT_AT_FUNC_NAME = "ELEMENT_AT"; // alias of MAP_EXTRACT -const char* const CARDINALITY_FUNC_NAME = "CARDINALITY"; -const char* const MAP_KEYS_FUNC_NAME = "MAP_KEYS"; -const char* const MAP_VALUES_FUNC_NAME = "MAP_VALUES"; - -// union -const char* const UNION_VALUE_FUNC_NAME = "UNION_VALUE"; -const char* const UNION_TAG_FUNC_NAME = "UNION_TAG"; -const char* const UNION_EXTRACT_FUNC_NAME = "UNION_EXTRACT"; - -// comparison -const char* const EQUALS_FUNC_NAME = "EQUALS"; -const char* const NOT_EQUALS_FUNC_NAME = "NOT_EQUALS"; -const char* const GREATER_THAN_FUNC_NAME = "GREATER_THAN"; -const char* const GREATER_THAN_EQUALS_FUNC_NAME = "GREATER_THAN_EQUALS"; -const char* const LESS_THAN_FUNC_NAME = "LESS_THAN"; -const char* const LESS_THAN_EQUALS_FUNC_NAME = "LESS_THAN_EQUALS"; - // string const char* const LENGTH_FUNC_NAME = "LENGTH"; -// Date functions. -const char* const DATE_PART_FUNC_NAME = "DATE_PART"; -const char* const DATEPART_FUNC_NAME = "DATEPART"; -const char* const DATE_TRUNC_FUNC_NAME = "DATE_TRUNC"; -const char* const DATETRUNC_FUNC_NAME = "DATETRUNC"; -const char* const DAYNAME_FUNC_NAME = "DAYNAME"; -const char* const GREATEST_FUNC_NAME = "GREATEST"; -const char* const LAST_DAY_FUNC_NAME = "LAST_DAY"; -const char* const LEAST_FUNC_NAME = "LEAST"; -const char* const MAKE_DATE_FUNC_NAME = "MAKE_DATE"; -const char* const MONTHNAME_FUNC_NAME = "MONTHNAME"; - -// Timestamp functions. -const char* const CENTURY_FUNC_NAME = "CENTURY"; -const char* const EPOCH_MS_FUNC_NAME = "EPOCH_MS"; -const char* const TO_TIMESTAMP_FUNC_NAME = "TO_TIMESTAMP"; - -// Interval functions. -const char* const TO_YEARS_FUNC_NAME = "TO_YEARS"; -const char* const TO_MONTHS_FUNC_NAME = "TO_MONTHS"; -const char* const TO_DAYS_FUNC_NAME = "TO_DAYS"; -const char* const TO_HOURS_FUNC_NAME = "TO_HOURS"; -const char* const TO_MINUTES_FUNC_NAME = "TO_MINUTES"; -const char* const TO_SECONDS_FUNC_NAME = "TO_SECONDS"; -const char* const TO_MILLISECONDS_FUNC_NAME = "TO_MILLISECONDS"; -const char* const TO_MICROSECONDS_FUNC_NAME = "TO_MICROSECONDS"; - // Node/Rel functions. const char* const ID_FUNC_NAME = "ID"; const char* const LABEL_FUNC_NAME = "LABEL"; @@ -88,14 +36,6 @@ const char* const PROPERTIES_FUNC_NAME = "PROPERTIES"; const char* const IS_TRAIL_FUNC_NAME = "IS_TRAIL"; const char* const IS_ACYCLIC_FUNC_NAME = "IS_ACYCLIC"; -// Blob functions -const char* const OCTET_LENGTH_FUNC_NAME = "OCTET_LENGTH"; -const char* const ENCODE_FUNC_NAME = "ENCODE"; -const char* const DECODE_FUNC_NAME = "DECODE"; - -// UUID functions -const char* const GEN_RANDOM_UUID_FUNC_NAME = "GEN_RANDOM_UUID"; - // RDF functions const char* const TYPE_FUNC_NAME = "TYPE"; const char* const VALIDATE_PREDICATE_FUNC_NAME = "VALIDATE_PREDICATE"; diff --git a/src/include/function/blob/vector_blob_functions.h b/src/include/function/blob/vector_blob_functions.h index af72f6039e3..6c252b476e4 100644 --- a/src/include/function/blob/vector_blob_functions.h +++ b/src/include/function/blob/vector_blob_functions.h @@ -6,14 +6,20 @@ namespace kuzu { namespace function { struct OctetLengthFunctions { + static constexpr const char* name = "OCTET_LENGTH"; + static function_set getFunctionSet(); }; struct EncodeFunctions { + static constexpr const char* name = "ENCODE"; + static function_set getFunctionSet(); }; struct DecodeFunctions { + static constexpr const char* name = "DECODE"; + static function_set getFunctionSet(); }; diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index 6611245ac7f..4959de43681 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -82,15 +82,6 @@ class BuiltInFunctionsUtils { // Scalar functions. static void registerScalarFunctions(catalog::CatalogSet* catalogSet); - static void registerComparisonFunctions(catalog::CatalogSet* catalogSet); - static void registerDateFunctions(catalog::CatalogSet* catalogSet); - static void registerTimestampFunctions(catalog::CatalogSet* catalogSet); - static void registerIntervalFunctions(catalog::CatalogSet* catalogSet); - static void registerBlobFunctions(catalog::CatalogSet* catalogSet); - static void registerUUIDFunctions(catalog::CatalogSet* catalogSet); - static void registerStructFunctions(catalog::CatalogSet* catalogSet); - static void registerMapFunctions(catalog::CatalogSet* catalogSet); - static void registerUnionFunctions(catalog::CatalogSet* catalogSet); static void registerNodeRelFunctions(catalog::CatalogSet* catalogSet); static void registerPathFunctions(catalog::CatalogSet* catalogSet); static void registerRdfFunctions(catalog::CatalogSet* catalogSet); diff --git a/src/include/function/comparison/vector_comparison_functions.h b/src/include/function/comparison/vector_comparison_functions.h index 5b39b939188..3d056821361 100644 --- a/src/include/function/comparison/vector_comparison_functions.h +++ b/src/include/function/comparison/vector_comparison_functions.h @@ -46,7 +46,7 @@ struct ComparisonFunction { } template - static inline std::unique_ptr getFunction( + static std::unique_ptr getFunction( const std::string& name, common::LogicalTypeID leftType, common::LogicalTypeID rightType) { auto leftPhysical = common::LogicalType::getPhysicalType(leftType); auto rightPhysical = common::LogicalType::getPhysicalType(rightType); @@ -196,40 +196,50 @@ struct ComparisonFunction { }; struct EqualsFunction { - static inline function_set getFunctionSet() { - return ComparisonFunction::getFunctionSet(common::EQUALS_FUNC_NAME); + static constexpr const char* name = "EQUALS"; + + static function_set getFunctionSet() { + return ComparisonFunction::getFunctionSet(name); } }; struct NotEqualsFunction { - static inline function_set getFunctionSet() { - return ComparisonFunction::getFunctionSet(common::NOT_EQUALS_FUNC_NAME); + static constexpr const char* name = "NOT_EQUALS"; + + static function_set getFunctionSet() { + return ComparisonFunction::getFunctionSet(name); } }; struct GreaterThanFunction { - static inline function_set getFunctionSet() { - return ComparisonFunction::getFunctionSet(common::GREATER_THAN_FUNC_NAME); + static constexpr const char* name = "GREATER_THAN"; + + static function_set getFunctionSet() { + return ComparisonFunction::getFunctionSet(name); } }; struct GreaterThanEqualsFunction { - static inline function_set getFunctionSet() { - return ComparisonFunction::getFunctionSet( - common::GREATER_THAN_EQUALS_FUNC_NAME); + static constexpr const char* name = "GREATER_THAN_EQUALS"; + + static function_set getFunctionSet() { + return ComparisonFunction::getFunctionSet(name); } }; struct LessThanFunction { - static inline function_set getFunctionSet() { - return ComparisonFunction::getFunctionSet(common::LESS_THAN_FUNC_NAME); + static constexpr const char* name = "LESS_THAN"; + + static function_set getFunctionSet() { + return ComparisonFunction::getFunctionSet(name); } }; struct LessThanEqualsFunction { - static inline function_set getFunctionSet() { - return ComparisonFunction::getFunctionSet( - common::LESS_THAN_EQUALS_FUNC_NAME); + static constexpr const char* name = "LESS_THAN_EQUALS"; + + static function_set getFunctionSet() { + return ComparisonFunction::getFunctionSet(name); } }; diff --git a/src/include/function/date/vector_date_functions.h b/src/include/function/date/vector_date_functions.h index 5058bd31c64..2c95881e6c6 100644 --- a/src/include/function/date/vector_date_functions.h +++ b/src/include/function/date/vector_date_functions.h @@ -6,34 +6,54 @@ namespace kuzu { namespace function { struct DatePartFunction { + static constexpr const char* name = "DATE_PART"; + + static constexpr const char* alias = "DATEPART"; + static function_set getFunctionSet(); }; struct DateTruncFunction { + static constexpr const char* name = "DATE_TRUNC"; + + static constexpr const char* alias = "DATETRUNC"; + static function_set getFunctionSet(); }; struct DayNameFunction { + static constexpr const char* name = "DAYNAME"; + static function_set getFunctionSet(); }; struct GreatestFunction { + static constexpr const char* name = "GREATEST"; + static function_set getFunctionSet(); }; struct LastDayFunction { + static constexpr const char* name = "LAST_DAY"; + static function_set getFunctionSet(); }; struct LeastFunction { + static constexpr const char* name = "LEAST"; + static function_set getFunctionSet(); }; struct MakeDateFunction { + static constexpr const char* name = "MAKE_DATE"; + static function_set getFunctionSet(); }; struct MonthNameFunction { + static constexpr const char* name = "MONTHNAME"; + static function_set getFunctionSet(); }; diff --git a/src/include/function/interval/vector_interval_functions.h b/src/include/function/interval/vector_interval_functions.h index f107f87f5bf..fdeef159f7e 100644 --- a/src/include/function/interval/vector_interval_functions.h +++ b/src/include/function/interval/vector_interval_functions.h @@ -9,7 +9,7 @@ namespace function { struct IntervalFunction { public: template - static inline function_set getUnaryIntervalFunction(std::string funcName) { + static function_set getUnaryIntervalFunction(std::string funcName) { function_set result; result.push_back(std::make_unique(funcName, std::vector{common::LogicalTypeID::INT64}, @@ -20,52 +20,66 @@ struct IntervalFunction { }; struct ToYearsFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction(common::TO_YEARS_FUNC_NAME); + static constexpr const char* name = "TO_YEARS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToMonthsFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction(common::TO_MONTHS_FUNC_NAME); + static constexpr const char* name = "TO_MONTHS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToDaysFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction(common::TO_DAYS_FUNC_NAME); + static constexpr const char* name = "TO_DAYS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToHoursFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction(common::TO_HOURS_FUNC_NAME); + static constexpr const char* name = "TO_HOURS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToMinutesFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction(common::TO_MINUTES_FUNC_NAME); + static constexpr const char* name = "TO_MINUTES"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToSecondsFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction(common::TO_SECONDS_FUNC_NAME); + static constexpr const char* name = "TO_SECONDS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToMillisecondsFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction( - common::TO_MILLISECONDS_FUNC_NAME); + static constexpr const char* name = "TO_MILLISECONDS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; struct ToMicrosecondsFunction { - static inline function_set getFunctionSet() { - return IntervalFunction::getUnaryIntervalFunction( - common::TO_MICROSECONDS_FUNC_NAME); + static constexpr const char* name = "TO_MICROSECONDS"; + + static function_set getFunctionSet() { + return IntervalFunction::getUnaryIntervalFunction(name); } }; diff --git a/src/include/function/map/vector_map_functions.h b/src/include/function/map/vector_map_functions.h index fe0484f9102..da996786518 100644 --- a/src/include/function/map/vector_map_functions.h +++ b/src/include/function/map/vector_map_functions.h @@ -6,27 +6,29 @@ namespace kuzu { namespace function { struct MapCreationFunctions { + static constexpr const char* name = "MAP"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct MapExtractFunctions { + static constexpr const char* name = "MAP_EXTRACT"; + + static constexpr const char* alias = "ELEMENT_AT"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct MapKeysFunctions { + static constexpr const char* name = "MAP_KEYS"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct MapValuesFunctions { + static constexpr const char* name = "MAP_VALUES"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; } // namespace function diff --git a/src/include/function/struct/vector_struct_functions.h b/src/include/function/struct/vector_struct_functions.h index 4b41287d381..39f8a23a82c 100644 --- a/src/include/function/struct/vector_struct_functions.h +++ b/src/include/function/struct/vector_struct_functions.h @@ -1,23 +1,21 @@ #pragma once #include "common/vector/value_vector.h" -#include "function/scalar_function.h" +#include "function/function.h" namespace kuzu { namespace function { struct StructPackFunctions { + static constexpr const char* name = "STRUCT_PACK"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); static void execFunc(const std::vector>& parameters, common::ValueVector& result, void* /*dataPtr*/ = nullptr); static void compileFunc(FunctionBindData* bindData, const std::vector>& parameters, std::shared_ptr& result); - static void copyParameterValueToStructFieldVector(const common::ValueVector* parameter, - common::ValueVector* structField, common::DataChunkState* structVectorState); }; struct StructExtractBindData : public FunctionBindData { @@ -29,8 +27,9 @@ struct StructExtractBindData : public FunctionBindData { }; struct StructExtractFunctions { + static constexpr const char* name = "STRUCT_EXTRACT"; + static function_set getFunctionSet(); - static std::unique_ptr getFunction(common::LogicalTypeID logicalTypeID); static std::unique_ptr bindFunc( const binder::expression_vector& arguments, Function* function); diff --git a/src/include/function/timestamp/vector_timestamp_functions.h b/src/include/function/timestamp/vector_timestamp_functions.h index 5b2c0c09020..40732003084 100644 --- a/src/include/function/timestamp/vector_timestamp_functions.h +++ b/src/include/function/timestamp/vector_timestamp_functions.h @@ -6,14 +6,20 @@ namespace kuzu { namespace function { struct CenturyFunction { + static constexpr const char* name = "CENTURY"; + static function_set getFunctionSet(); }; struct EpochMsFunction { + static constexpr const char* name = "EPOCH_MS"; + static function_set getFunctionSet(); }; struct ToTimestampFunction { + static constexpr const char* name = "TO_TIMESTAMP"; + static function_set getFunctionSet(); }; diff --git a/src/include/function/union/vector_union_functions.h b/src/include/function/union/vector_union_functions.h index 9f333019530..ac1fb6c7c86 100644 --- a/src/include/function/union/vector_union_functions.h +++ b/src/include/function/union/vector_union_functions.h @@ -1,27 +1,25 @@ #pragma once -#include "common/vector/value_vector.h" #include "function/function.h" namespace kuzu { namespace function { struct UnionValueFunction { + static constexpr const char* name = "UNION_VALUE"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); - static void execFunc(const std::vector>& parameters, - common::ValueVector& result, void* /*dataPtr*/ = nullptr); - static void compileFunc(FunctionBindData* bindData, - const std::vector>& parameters, - std::shared_ptr& result); }; struct UnionTagFunction { + static constexpr const char* name = "UNION_TAG"; + static function_set getFunctionSet(); }; struct UnionExtractFunction { + static constexpr const char* name = "UNION_EXTRACT"; + static function_set getFunctionSet(); }; diff --git a/src/include/function/uuid/vector_uuid_functions.h b/src/include/function/uuid/vector_uuid_functions.h index ce7ac3d6e30..5cd7587dfc8 100644 --- a/src/include/function/uuid/vector_uuid_functions.h +++ b/src/include/function/uuid/vector_uuid_functions.h @@ -6,6 +6,8 @@ namespace kuzu { namespace function { struct GenRandomUUIDFunction { + static constexpr const char* name = "GEN_RANDOM_UUID"; + static function_set getFunctionSet(); }; diff --git a/src/parser/transform/transform_expression.cpp b/src/parser/transform/transform_expression.cpp index 7f8da14c1e3..929814e462f 100644 --- a/src/parser/transform/transform_expression.cpp +++ b/src/parser/transform/transform_expression.cpp @@ -2,6 +2,7 @@ #include "function/cast/functions/cast_from_string_functions.h" #include "function/list/vector_list_functions.h" #include "function/string/vector_string_functions.h" +#include "function/struct/vector_struct_functions.h" #include "parser/expression/parsed_case_expression.h" #include "parser/expression/parsed_function_expression.h" #include "parser/expression/parsed_literal_expression.h" @@ -439,7 +440,7 @@ std::unique_ptr Transformer::transformListLiteral( std::unique_ptr Transformer::transformStructLiteral( CypherParser::KU_StructLiteralContext& ctx) { auto structPack = - std::make_unique(STRUCT_PACK_FUNC_NAME, ctx.getText()); + std::make_unique(StructPackFunctions::name, ctx.getText()); for (auto& structField : ctx.kU_StructField()) { auto structExpr = transformExpression(*structField->oC_Expression()); std::string alias; From b208d154834b23537a4f01d0667497d6e94b639a Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Tue, 26 Mar 2024 00:37:59 +0800 Subject: [PATCH 087/136] Support multiple COPY statements on rel tables (#2989) multi copy rel; add test on nested types; fix struct numValues --- CMakeLists.txt | 2 +- dataset/tinysnb/copy.cypher | 2 + dataset/tinysnb/eKnows.csv | 8 -- dataset/tinysnb/eKnows_2.csv | 8 ++ .../data_chunk/data_chunk_collection.cpp | 1 + src/include/common/types/types.h | 2 + src/include/main/client_config.h | 3 + src/include/main/settings.h | 12 ++ src/include/processor/operator/partitioner.h | 9 +- .../operator/persistent/batch_insert.h | 2 +- .../operator/persistent/rel_batch_insert.h | 20 ++- .../storage/local_storage/local_node_table.h | 4 +- .../storage/local_storage/local_table.h | 14 +- .../storage/stats/nodes_store_statistics.h | 7 +- .../storage/stats/rels_store_statistics.h | 4 +- .../stats/table_statistics_collection.h | 14 +- .../storage/store/chunked_node_group.h | 16 ++- .../store/chunked_node_group_collection.h | 18 ++- src/include/storage/store/column_chunk.h | 6 +- src/include/storage/store/rel_table.h | 12 ++ src/include/storage/store/rel_table_data.h | 9 +- .../storage/store/string_column_chunk.h | 2 +- .../storage/store/struct_column_chunk.h | 2 +- src/include/storage/store/table.h | 8 +- src/include/storage/store/table_data.h | 1 + src/include/storage/store/var_list_column.h | 3 - .../storage/store/var_list_column_chunk.h | 2 +- src/main/client_context.cpp | 1 + src/main/db_config.cpp | 3 +- src/processor/map/map_copy_from.cpp | 25 +++- .../operator/persistent/batch_insert.cpp | 2 +- .../operator/persistent/node_batch_insert.cpp | 2 +- .../operator/persistent/rel_batch_insert.cpp | 133 ++++++++++++------ src/processor/operator/scan_node_id.cpp | 2 +- src/storage/local_storage/local_table.cpp | 29 +++- src/storage/stats/nodes_store_statistics.cpp | 8 ++ src/storage/stats/rels_store_statistics.cpp | 23 +-- src/storage/store/chunked_node_group.cpp | 26 ++-- .../store/chunked_node_group_collection.cpp | 10 +- src/storage/store/column_chunk.cpp | 12 +- src/storage/store/rel_table.cpp | 6 +- src/storage/store/rel_table_data.cpp | 8 ++ src/storage/store/string_column_chunk.cpp | 2 +- src/storage/store/struct_column.cpp | 14 ++ src/storage/store/struct_column_chunk.cpp | 2 +- src/storage/store/var_list_column.cpp | 8 +- src/storage/store/var_list_column_chunk.cpp | 2 +- test/copy/e2e_copy_transaction_test.cpp | 18 +-- test/test_files/copy/copy_transaction.test | 4 + .../exceptions/copy/auto_commit.test | 2 +- .../nested_types.test} | 83 +++++++++-- 51 files changed, 421 insertions(+), 195 deletions(-) create mode 100644 dataset/tinysnb/eKnows_2.csv rename test/test_files/tinysnb/{union/union.test => nested_types/nested_types.test} (53%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ef4a8b5e37d..81a7440e8cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,7 +197,7 @@ endif () if(${BUILD_KUZU}) add_definitions(-DKUZU_ROOT_DIRECTORY="${PROJECT_SOURCE_DIR}") add_definitions(-DKUZU_CMAKE_VERSION="${CMAKE_PROJECT_VERSION}") -add_definitions(-DKUZU_EXTENSION_VERSION="0.2.4") +add_definitions(-DKUZU_EXTENSION_VERSION="0.2.5") include_directories(src/include) include_directories(third_party/antlr4_cypher/include) diff --git a/dataset/tinysnb/copy.cypher b/dataset/tinysnb/copy.cypher index f918361f5cb..1e852119b3c 100644 --- a/dataset/tinysnb/copy.cypher +++ b/dataset/tinysnb/copy.cypher @@ -1,7 +1,9 @@ +CALL ENABLE_MULTI_COPY=true COPY person FROM "dataset/tinysnb/vPerson.csv" (HeaDER=true, deLim=','); COPY organisation FROM "dataset/tinysnb/vOrganisation.csv"; COPY movies FROM "dataset/tinysnb/vMovies.csv"; COPY knows FROM "dataset/tinysnb/eKnows.csv"; +COPY knows FROM "dataset/tinysnb/eKnows_2.csv"; COPY studyAt FROM "dataset/tinysnb/eStudyAt.csv" (HeaDER=true); COPY workAt FROM "dataset/tinysnb/eWorkAt.csv"; COPY meets FROM "dataset/tinysnb/eMeets.csv"; diff --git a/dataset/tinysnb/eKnows.csv b/dataset/tinysnb/eKnows.csv index 471e63a0c2d..4d9278b3061 100644 --- a/dataset/tinysnb/eKnows.csv +++ b/dataset/tinysnb/eKnows.csv @@ -4,11 +4,3 @@ 2,0,2021-06-30,1946-08-25 19:07:22,10 years 5 months 13 hours 24 us,"[2huh9y89fsfw23,23nsihufhw723]","{locations:['paris'], transfer: {day: 2000-01-01, amount: [20, 5000]}}",4, 2,3,1950-05-14,1946-08-25 19:07:22,23 minutes,"[fwehu9h9832wewew,23u9h989sdfsss]","{locations:['paris'], transfer: {day: 2011-05-01, amount: [2000, 5340]}}","cool stuff found", 2,5,1950-05-14,2012-12-11 20:07:22,20 years 30 days 48 hours,"[fwh9y81232uisuiehuf,ewnuihxy8dyf232]","{locations:['vancouver'], transfer: {day: 2020-01-01, amount: [120, 50]}}","matthew perry", -3,0,2021-06-30,2002-07-31 11:42:53.12342,30 hours 40 days,"[fnioh8323aeweae34d,osd89e2ejshuih12]","{locations:['london','toronto'], transfer: {day: 2012-11-21, amount: [223, 5230]}}",10, -3,2,1950-05-14,2007-02-12 12:11:42.123,28 minutes 30 milliseconds,"[fwh983-sdjisdfji,ioh89y32r2huir]","{locations:['paris','beijing'], transfer: {day: 2011-03-11, amount: [2323, 50]}}",1, -3,5,2000-01-01,1998-10-02 13:09:22.423,300 milliseconds,"[psh989823oaaioe,nuiuah1nosndfisf]","{locations:[], transfer: {day: 1980-11-21, amount: [20, 5]}}",2, -5,0,2021-06-30,1936-11-02 11:02:01,480us,"[fwewe]","{locations:['shanghai','nanjing'], transfer: {day: 1998-11-12, amount: [22, 53240]}}",15, -5,2,1950-05-14,1982-11-11 13:12:05.123,23 minutes,"[fewh9182912e3,h9y8y89soidfsf,nuhudf78w78efw,hioshe0f9023sdsd]","{locations:['paris'], transfer: {day: 2000-01-01, amount: [20, 5000]}}","happy new year", -5,3,2000-01-01,1999-04-21 15:12:11.42,48 hours 52 milliseconds,"[23h9sdslnfowhu2932,shuhf98922323sf]","{locations:['paris'], transfer: {day: 2000-01-01, amount: [20, 5000]}}",4, -7,8,1905-12-12,2025-01-01 11:22:33.52,47 minutes 58 seconds,"[ahu2333333333333,12weeeeeeeeeeeeeeeeee]","{locations:['toronto','thisisalongcityname'], transfer: {day: 1930-11-22, amount: [18, 323]}}",8, -7,9,1905-12-12,2020-03-01 12:11:41.6552,47 minutes 58 seconds,"[peweeeeeeeeeeeeeeeee,kowje9w0eweeeeeeeee]","{locations:['waterloo'], transfer: {day: 2000-01-01, amount: [1000, 5000]}}",10, diff --git a/dataset/tinysnb/eKnows_2.csv b/dataset/tinysnb/eKnows_2.csv new file mode 100644 index 00000000000..5b023bcf814 --- /dev/null +++ b/dataset/tinysnb/eKnows_2.csv @@ -0,0 +1,8 @@ +3,0,2021-06-30,2002-07-31 11:42:53.12342,30 hours 40 days,"[fnioh8323aeweae34d,osd89e2ejshuih12]","{locations:['london','toronto'], transfer: {day: 2012-11-21, amount: [223, 5230]}}",10, +3,2,1950-05-14,2007-02-12 12:11:42.123,28 minutes 30 milliseconds,"[fwh983-sdjisdfji,ioh89y32r2huir]","{locations:['paris','beijing'], transfer: {day: 2011-03-11, amount: [2323, 50]}}",1, +3,5,2000-01-01,1998-10-02 13:09:22.423,300 milliseconds,"[psh989823oaaioe,nuiuah1nosndfisf]","{locations:[], transfer: {day: 1980-11-21, amount: [20, 5]}}",2, +5,0,2021-06-30,1936-11-02 11:02:01,480us,"[fwewe]","{locations:['shanghai','nanjing'], transfer: {day: 1998-11-12, amount: [22, 53240]}}",15, +5,2,1950-05-14,1982-11-11 13:12:05.123,23 minutes,"[fewh9182912e3,h9y8y89soidfsf,nuhudf78w78efw,hioshe0f9023sdsd]","{locations:['paris'], transfer: {day: 2000-01-01, amount: [20, 5000]}}","happy new year", +5,3,2000-01-01,1999-04-21 15:12:11.42,48 hours 52 milliseconds,"[23h9sdslnfowhu2932,shuhf98922323sf]","{locations:['paris'], transfer: {day: 2000-01-01, amount: [20, 5000]}}",4, +7,8,1905-12-12,2025-01-01 11:22:33.52,47 minutes 58 seconds,"[ahu2333333333333,12weeeeeeeeeeeeeeeeee]","{locations:['toronto','thisisalongcityname'], transfer: {day: 1930-11-22, amount: [18, 323]}}",8, +7,9,1905-12-12,2020-03-01 12:11:41.6552,47 minutes 58 seconds,"[peweeeeeeeeeeeeeeeee,kowje9w0eweeeeeeeee]","{locations:['waterloo'], transfer: {day: 2000-01-01, amount: [1000, 5000]}}",10, diff --git a/src/common/data_chunk/data_chunk_collection.cpp b/src/common/data_chunk/data_chunk_collection.cpp index be9d1824b87..1b0cf723831 100644 --- a/src/common/data_chunk/data_chunk_collection.cpp +++ b/src/common/data_chunk/data_chunk_collection.cpp @@ -41,6 +41,7 @@ void DataChunkCollection::merge(DataChunk chunk) { } void DataChunkCollection::initTypes(DataChunk& chunk) { + types.clear(); types.reserve(chunk.getNumValueVectors()); for (auto vectorIdx = 0u; vectorIdx < chunk.getNumValueVectors(); vectorIdx++) { types.push_back(chunk.getValueVector(vectorIdx)->dataType); diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 94167124eb4..a2fabdb67a6 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -428,7 +428,9 @@ class LogicalType { std::unique_ptr extraTypeInfo; }; +// TODO: Should remove `logical_types_t`. using logical_types_t = std::vector>; +using logical_type_vec_t = std::vector; struct VarListType { static inline LogicalType* getChildType(const LogicalType* type) { diff --git a/src/include/main/client_config.h b/src/include/main/client_config.h index f929b82b56d..774ba916a92 100644 --- a/src/include/main/client_config.h +++ b/src/include/main/client_config.h @@ -23,6 +23,8 @@ struct ClientConfig { bool enableProgressBar; // time before displaying progress bar uint64_t showProgressAfter; + // If multi copy is enabled + bool enableMultiCopy; }; struct ClientConfigDefault { @@ -32,6 +34,7 @@ struct ClientConfigDefault { static constexpr bool ENABLE_SEMI_MASK = true; static constexpr bool ENABLE_PROGRESS_BAR = true; static constexpr uint64_t SHOW_PROGRESS_AFTER = 1000; + static constexpr bool ENABLE_MULTI_COPY = false; }; } // namespace main diff --git a/src/include/main/settings.h b/src/include/main/settings.h index 3223d984fd5..41f25c83bf9 100644 --- a/src/include/main/settings.h +++ b/src/include/main/settings.h @@ -104,5 +104,17 @@ struct FileSearchPathSetting { } }; +struct EnableMultiCopySetting { + static constexpr const char* name = "enable_multi_copy"; + static constexpr const common::LogicalTypeID inputType = common::LogicalTypeID::BOOL; + static void setContext(ClientContext* context, const common::Value& parameter) { + KU_ASSERT(parameter.getDataType()->getLogicalTypeID() == common::LogicalTypeID::BOOL); + context->getClientConfigUnsafe()->enableMultiCopy = parameter.getValue(); + } + static common::Value getSetting(ClientContext* context) { + return common::Value(context->getClientConfig()->enableMultiCopy); + } +}; + } // namespace main } // namespace kuzu diff --git a/src/include/processor/operator/partitioner.h b/src/include/processor/operator/partitioner.h index 98173c035ba..4f94803a1c9 100644 --- a/src/include/processor/operator/partitioner.h +++ b/src/include/processor/operator/partitioner.h @@ -30,8 +30,8 @@ struct PartitioningBuffer { struct BatchInsertSharedState; struct PartitioningInfo; struct PartitionerSharedState { + std::vector columnTypes; std::mutex mtx; - storage::MemoryManager* mm; storage::NodeTable* srcNodeTable; storage::NodeTable* dstNodeTable; @@ -43,15 +43,16 @@ struct PartitionerSharedState { // In copy rdf, we need to access num nodes before it is available in statistics. std::vector> nodeBatchInsertSharedStates; - explicit PartitionerSharedState(storage::MemoryManager* mm) : mm{mm} {} + explicit PartitionerSharedState(std::vector columnTypes) + : columnTypes{std::move(columnTypes)} {} void initialize(std::vector>& infos); common::partition_idx_t getNextPartition(common::vector_idx_t partitioningIdx); void resetState(); void merge(std::vector> localPartitioningStates); - inline storage::ChunkedNodeGroupCollection& getPartitionBuffer( - common::vector_idx_t partitioningIdx, common::partition_idx_t partitionIdx) { + inline const storage::ChunkedNodeGroupCollection& getPartitionBuffer( + common::vector_idx_t partitioningIdx, common::partition_idx_t partitionIdx) const { KU_ASSERT(partitioningIdx < partitioningBuffers.size()); KU_ASSERT(partitionIdx < partitioningBuffers[partitioningIdx]->partitions.size()); return partitioningBuffers[partitioningIdx]->partitions[partitionIdx]; diff --git a/src/include/processor/operator/persistent/batch_insert.h b/src/include/processor/operator/persistent/batch_insert.h index e23158690e6..1fcb5548d50 100644 --- a/src/include/processor/operator/persistent/batch_insert.h +++ b/src/include/processor/operator/persistent/batch_insert.h @@ -48,7 +48,7 @@ struct BatchInsertSharedState { wal->logCopyTableRecord(table->getTableID()); wal->flushAllPages(); } - inline void setNumTuplesForTable() { table->setNumTuples(getNumRows()); } + inline void updateNumTuplesForTable() { table->updateNumTuplesByValue(getNumRows()); } }; struct BatchInsertLocalState { diff --git a/src/include/processor/operator/persistent/rel_batch_insert.h b/src/include/processor/operator/persistent/rel_batch_insert.h index cc772f28794..80cf1845e3d 100644 --- a/src/include/processor/operator/persistent/rel_batch_insert.h +++ b/src/include/processor/operator/persistent/rel_batch_insert.h @@ -60,14 +60,21 @@ class RelBatchInsert final : public BatchInsert { } private: - void prepareCSRNodeGroup(storage::ChunkedNodeGroupCollection& partition, - common::offset_t startNodeOffset, common::column_id_t offsetColumnID, - common::offset_t numNodes); + static void appendNewNodeGroup(const RelBatchInsertInfo& relInfo, + RelBatchInsertLocalState& localState, BatchInsertSharedState& sharedState, + const PartitionerSharedState& partitionerSharedState); + static void mergeNodeGroup(ExecutionContext* context, const RelBatchInsertInfo& relInfo, + RelBatchInsertLocalState& localState, BatchInsertSharedState& sharedState, + const PartitionerSharedState& partitionerSharedState); + + static void prepareCSRNodeGroup(const storage::ChunkedNodeGroupCollection& partition, + common::offset_t startNodeOffset, const RelBatchInsertInfo& relInfo, + RelBatchInsertLocalState& localState, common::offset_t numNodes); static common::length_t getGapSize(common::length_t length); static std::vector populateStartCSROffsetsAndLengths( storage::ChunkedCSRHeader& csrHeader, common::offset_t numNodes, - storage::ChunkedNodeGroupCollection& partition, common::column_id_t offsetColumnID); + const storage::ChunkedNodeGroupCollection& partition, common::column_id_t offsetColumnID); static void populateEndCSROffsets( storage::ChunkedCSRHeader& csrHeader, std::vector& gaps); static void setOffsetToWithinNodeGroup( @@ -75,9 +82,8 @@ class RelBatchInsert final : public BatchInsert { static void setOffsetFromCSROffsets( storage::ColumnChunk& nodeOffsetChunk, storage::ColumnChunk& csrOffsetChunk); - // We only check rel multiplcity constraint (MANY_ONE, ONE_ONE) for now. - std::optional checkRelMultiplicityConstraint( - const storage::ChunkedCSRHeader& csrHeader); + static std::optional checkRelMultiplicityConstraint( + const storage::ChunkedCSRHeader& csrHeader, const RelBatchInsertInfo& relInfo); private: std::shared_ptr partitionerSharedState; diff --git a/src/include/storage/local_storage/local_node_table.h b/src/include/storage/local_storage/local_node_table.h index c13ca3dcc33..e36f0a12acd 100644 --- a/src/include/storage/local_storage/local_node_table.h +++ b/src/include/storage/local_storage/local_node_table.h @@ -27,10 +27,10 @@ class LocalNodeNG final : public LocalNodeGroup { bool delete_( common::ValueVector* nodeIDVector, common::ValueVector* /*extraVector*/ = nullptr) override; - inline const offset_to_row_idx_t& getInsertInfoRef() { + inline const offset_to_row_idx_t& getInsertInfoRef() const { return insertChunks.getOffsetToRowIdx(); } - inline const offset_to_row_idx_t& getUpdateInfoRef(common::column_id_t columnID) { + inline const offset_to_row_idx_t& getUpdateInfoRef(common::column_id_t columnID) const { return getUpdateChunks(columnID).getOffsetToRowIdx(); } }; diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index 0bd931a7306..0cd71678dd0 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -32,11 +32,12 @@ class LocalChunkedGroupCollection { rowIdx % ChunkedNodeGroupCollection::CHUNK_CAPACITY); } - inline common::row_idx_t getRowIdxFromOffset(common::offset_t offset) { + inline common::row_idx_t getRowIdxFromOffset(common::offset_t offset) const { KU_ASSERT(offsetToRowIdx.contains(offset)); return offsetToRowIdx.at(offset); } - inline std::vector& getRelOffsetsFromSrcOffset(common::offset_t srcOffset) { + inline const std::vector& getRelOffsetsFromSrcOffset( + common::offset_t srcOffset) const { KU_ASSERT(srcNodeOffsetToRelOffsets.contains(srcOffset)); return srcNodeOffsetToRelOffsets.at(srcOffset); } @@ -52,6 +53,9 @@ class LocalChunkedGroupCollection { } inline const offset_to_row_idx_t& getOffsetToRowIdx() const { return offsetToRowIdx; } + void appendChunkedGroup( + ColumnChunk* srcOffsetChunk, std::unique_ptr chunkedGroup); + bool isEmpty() const { return offsetToRowIdx.empty() && srcNodeOffsetToRelOffsets.empty(); } void readValueAtRowIdx(common::row_idx_t rowIdx, common::column_id_t columnID, common::ValueVector* outputVector, common::sel_t posInOutputVector) const; @@ -90,7 +94,7 @@ class LocalChunkedGroupCollection { private: std::vector dataTypes; - storage::ChunkedNodeGroupCollection chunkedGroups; + ChunkedNodeGroupCollection chunkedGroups; // The offset here can either be nodeOffset ( for node table) or relOffset (for rel table). offset_to_row_idx_t offsetToRowIdx; common::row_idx_t numRows; @@ -149,6 +153,10 @@ class LocalNodeGroup { common::column_id_t columnID, common::ValueVector* propertyVector) = 0; virtual bool delete_(common::ValueVector* IDVector, common::ValueVector* extraVector) = 0; + const LocalChunkedGroupCollection& getUpdateChunks(common::column_id_t columnID) const { + KU_ASSERT(columnID < updateChunks.size()); + return updateChunks[columnID]; + } LocalChunkedGroupCollection& getUpdateChunks(common::column_id_t columnID) { KU_ASSERT(columnID < updateChunks.size()); return updateChunks[columnID]; diff --git a/src/include/storage/stats/nodes_store_statistics.h b/src/include/storage/stats/nodes_store_statistics.h index 0b4dfc60ba2..ca064a49502 100644 --- a/src/include/storage/stats/nodes_store_statistics.h +++ b/src/include/storage/stats/nodes_store_statistics.h @@ -36,12 +36,7 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { directory, common::FileVersionType::ORIGINAL, transaction::TransactionType::READ_ONLY); } - inline void setNumTuplesForTable(common::table_id_t tableID, uint64_t numTuples) override { - initTableStatisticsForWriteTrx(); - KU_ASSERT(readWriteVersion && readWriteVersion->tableStatisticPerTable.contains(tableID)); - setToUpdated(); - getNodeTableStats(transaction::TransactionType::WRITE, tableID)->setNumTuples(numTuples); - } + void updateNumTuplesByValue(common::table_id_t tableID, int64_t value) override; common::offset_t getMaxNodeOffset( transaction::Transaction* transaction, common::table_id_t tableID); diff --git a/src/include/storage/stats/rels_store_statistics.h b/src/include/storage/stats/rels_store_statistics.h index d4faab037cb..7da2cc25ab2 100644 --- a/src/include/storage/stats/rels_store_statistics.h +++ b/src/include/storage/stats/rels_store_statistics.h @@ -35,9 +35,7 @@ class RelsStoreStats : public TablesStatistics { return (RelTableStats*)tableStatisticPerTable[tableID].get(); } - void setNumTuplesForTable(common::table_id_t relTableID, uint64_t numRels) override; - - void updateNumRelsByValue(common::table_id_t relTableID, int64_t value); + void updateNumTuplesByValue(common::table_id_t relTableID, int64_t value) override; common::offset_t getNextRelOffset( transaction::Transaction* transaction, common::table_id_t tableID); diff --git a/src/include/storage/stats/table_statistics_collection.h b/src/include/storage/stats/table_statistics_collection.h index d2c3d0dd8d7..0db3498eda9 100644 --- a/src/include/storage/stats/table_statistics_collection.h +++ b/src/include/storage/stats/table_statistics_collection.h @@ -21,7 +21,8 @@ class TablesStatistics { virtual ~TablesStatistics() = default; - virtual void setNumTuplesForTable(common::table_id_t tableID, uint64_t numTuples) = 0; + // Return the num of tuples before update. + virtual void updateNumTuplesByValue(common::table_id_t tableID, int64_t value) = 0; inline void writeTablesStatisticsFileForWALRecord(const std::string& directory) { saveToFile( @@ -54,8 +55,15 @@ class TablesStatistics { readOnlyVersion->tableStatisticPerTable.erase(tableID); } - inline uint64_t getNumTuplesForTable(common::table_id_t tableID) { - return readOnlyVersion->tableStatisticPerTable[tableID]->getNumTuples(); + inline uint64_t getNumTuplesForTable( + transaction::Transaction* transaction, common::table_id_t tableID) { + if (transaction->isWriteTransaction()) { + initTableStatisticsForWriteTrx(); + KU_ASSERT(readWriteVersion->tableStatisticPerTable.contains(tableID)); + return readWriteVersion->tableStatisticPerTable.at(tableID)->getNumTuples(); + } + KU_ASSERT(readOnlyVersion->tableStatisticPerTable.contains(tableID)); + return readOnlyVersion->tableStatisticPerTable.at(tableID)->getNumTuples(); } PropertyStatistics& getPropertyStatisticsForTable(const transaction::Transaction& transaction, diff --git a/src/include/storage/store/chunked_node_group.h b/src/include/storage/store/chunked_node_group.h index 2cac9cc916e..e1b640a27d4 100644 --- a/src/include/storage/store/chunked_node_group.h +++ b/src/include/storage/store/chunked_node_group.h @@ -11,13 +11,15 @@ class Column; class ChunkedNodeGroup { public: + explicit ChunkedNodeGroup(std::vector> chunks) + : chunks{std::move(chunks)} {} ChunkedNodeGroup(const std::vector& columnTypes, bool enableCompression, uint64_t capacity); ChunkedNodeGroup(const std::vector>& columns, bool enableCompression); + DELETE_COPY_DEFAULT_MOVE(ChunkedNodeGroup); virtual ~ChunkedNodeGroup() = default; inline uint64_t getNodeGroupIdx() const { return nodeGroupIdx; } - inline common::row_idx_t getNumRows() const { return numRows; } inline common::vector_idx_t getNumColumns() const { return chunks.size(); } inline const ColumnChunk& getColumnChunk(common::column_id_t columnID) const { KU_ASSERT(columnID < chunks.size()); @@ -32,18 +34,21 @@ class ChunkedNodeGroup { void resetToEmpty(); void setAllNull(); - void setNumValues(common::offset_t numValues); + void setNumRows(common::offset_t numRows); + inline common::row_idx_t getNumRows() const { return numRows; } void resizeChunks(uint64_t newSize); uint64_t append(const std::vector& columnVectors, common::SelectionVector& selVector, uint64_t numValuesToAppend); common::offset_t append(ChunkedNodeGroup* other, common::offset_t offsetInOtherNodeGroup); - void write(std::vector>& data, common::vector_idx_t offsetVector); + void write( + const std::vector>& data, common::column_id_t offsetColumnID); + void write(const ChunkedNodeGroup& data, common::column_id_t offsetColumnID); void finalize(uint64_t nodeGroupIdx_); virtual inline void writeToColumnChunk(common::vector_idx_t chunkIdx, - common::vector_idx_t vectorIdx, std::vector>& data, + common::vector_idx_t vectorIdx, const std::vector>& data, ColumnChunk& offsetChunk) { chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, common::RelMultiplicity::ONE); } @@ -82,12 +87,13 @@ class ChunkedCSRNodeGroup : public ChunkedNodeGroup { public: ChunkedCSRNodeGroup( const std::vector& columnTypes, bool enableCompression); + DELETE_COPY_DEFAULT_MOVE(ChunkedCSRNodeGroup); ChunkedCSRHeader& getCSRHeader() { return csrHeader; } const ChunkedCSRHeader& getCSRHeader() const { return csrHeader; } inline void writeToColumnChunk(common::vector_idx_t chunkIdx, common::vector_idx_t vectorIdx, - std::vector>& data, ColumnChunk& offsetChunk) override { + const std::vector>& data, ColumnChunk& offsetChunk) override { chunks[chunkIdx]->write(data[vectorIdx].get(), &offsetChunk, common::RelMultiplicity::MANY); } diff --git a/src/include/storage/store/chunked_node_group_collection.h b/src/include/storage/store/chunked_node_group_collection.h index 9573a80fef7..29bb45ae728 100644 --- a/src/include/storage/store/chunked_node_group_collection.h +++ b/src/include/storage/store/chunked_node_group_collection.h @@ -13,23 +13,31 @@ class ChunkedNodeGroupCollection { : types{std::move(types)} {} DELETE_COPY_DEFAULT_MOVE(ChunkedNodeGroupCollection); + static std::pair getChunkIdxAndOffsetInChunk( + common::row_idx_t rowIdx) { + return std::make_pair(rowIdx / CHUNK_CAPACITY, rowIdx % CHUNK_CAPACITY); + } + inline const std::vector>& getChunkedGroups() const { return chunkedGroups; } - inline const ChunkedNodeGroup* getChunkedGroup(uint64_t groupIdx) const { + inline const ChunkedNodeGroup* getChunkedGroup(common::node_group_idx_t groupIdx) const { KU_ASSERT(groupIdx < chunkedGroups.size()); return chunkedGroups[groupIdx].get(); } - inline ChunkedNodeGroup* getChunkedGroupUnsafe(uint64_t groupIdx) { + inline ChunkedNodeGroup* getChunkedGroupUnsafe(common::node_group_idx_t groupIdx) { KU_ASSERT(groupIdx < chunkedGroups.size()); return chunkedGroups[groupIdx].get(); } - inline uint64_t getNumChunks() const { return chunkedGroups.size(); } void append( const std::vector& vectors, const common::SelectionVector& selVector); - void append(std::unique_ptr chunkedGroup); - void merge(ChunkedNodeGroupCollection& chunkedGroupCollection); + + void merge(std::unique_ptr chunkedGroup); + void merge(ChunkedNodeGroupCollection& other); + + inline uint64_t getNumChunkedGroups() const { return chunkedGroups.size(); } + inline void clear() { chunkedGroups.clear(); } private: std::vector types; diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index c9674ae6db5..534e34d88e2 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -57,7 +57,7 @@ class ColumnChunk { // Note that the startPageIdx is not known, so it will always be common::INVALID_PAGE_IDX virtual ColumnChunkMetadata getMetadataToFlush() const; - virtual void append(common::ValueVector* vector, common::SelectionVector& selVector); + virtual void append(common::ValueVector* vector, const common::SelectionVector& selVector); virtual void append( ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend); @@ -120,7 +120,7 @@ class ColumnChunk { common::offset_t getOffsetInBuffer(common::offset_t pos) const; virtual void copyVectorToBuffer(common::ValueVector* vector, common::offset_t startPosInChunk, - common::SelectionVector& selVector); + const common::SelectionVector& selVector); private: uint64_t getBufferSize(uint64_t capacity_) const; @@ -161,7 +161,7 @@ class BoolColumnChunk : public ColumnChunk { // Booleans are always bitpacked, but this can also enable constant compression enableCompression, hasNullChunk) {} - void append(common::ValueVector* vector, common::SelectionVector& sel) final; + void append(common::ValueVector* vector, const common::SelectionVector& sel) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) override; diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index 903b91810d8..a078ddf1a21 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -70,12 +70,24 @@ class RelTable final : public Table { return direction == common::RelDataDirection::FWD ? fwdRelTableData->getColumn(columnID) : bwdRelTableData->getColumn(columnID); } + inline const std::vector>& getColumns( + common::RelDataDirection direction) const { + return direction == common::RelDataDirection::FWD ? fwdRelTableData->getColumns() : + bwdRelTableData->getColumns(); + } inline void append(ChunkedNodeGroup* nodeGroup, common::RelDataDirection direction) { direction == common::RelDataDirection::FWD ? fwdRelTableData->append(nodeGroup) : bwdRelTableData->append(nodeGroup); } + inline bool isNewNodeGroup(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, common::RelDataDirection direction) { + return direction == common::RelDataDirection::FWD ? + fwdRelTableData->isNewNodeGroup(transaction, nodeGroupIdx) : + bwdRelTableData->isNewNodeGroup(transaction, nodeGroupIdx); + } + void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) override; void prepareRollback(LocalTableData* localTable) override; void checkpointInMemory() override; diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index 5815bd97a1a..f4dfe259aa1 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -161,9 +161,15 @@ class RelTableData final : public TableData { inline Column* getCSROffsetColumn() const { return csrHeaderColumns.offset.get(); } inline Column* getCSRLengthColumn() const { return csrHeaderColumns.length.get(); } + bool isNewNodeGroup( + transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx) const; + void prepareLocalTableToCommit( transaction::Transaction* transaction, LocalTableData* localTable) override; + void prepareCommitNodeGroup(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, LocalRelNG* localRelNG); + void checkpointInMemory() override; void rollbackInMemory() override; @@ -184,9 +190,6 @@ class RelTableData final : public TableData { const std::vector& sizeChangesPerSegment, PackedCSRRegion& region); double getHighDensity(uint64_t level) const; - void prepareCommitNodeGroup(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, LocalRelNG* localRelNG); - void updateCSRHeader(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, PersistentState& persistentState, LocalState& localState); diff --git a/src/include/storage/store/string_column_chunk.h b/src/include/storage/store/string_column_chunk.h index 88ad3028727..949bfd7c837 100644 --- a/src/include/storage/store/string_column_chunk.h +++ b/src/include/storage/store/string_column_chunk.h @@ -15,7 +15,7 @@ class StringColumnChunk final : public ColumnChunk { common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); void resetToEmpty() final; - void append(common::ValueVector* vector, common::SelectionVector& selVector) final; + void append(common::ValueVector* vector, const common::SelectionVector& selVector) final; void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) override; diff --git a/src/include/storage/store/struct_column_chunk.h b/src/include/storage/store/struct_column_chunk.h index 20c157b88bc..75802f50d29 100644 --- a/src/include/storage/store/struct_column_chunk.h +++ b/src/include/storage/store/struct_column_chunk.h @@ -23,7 +23,7 @@ class StructColumnChunk final : public ColumnChunk { protected: void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final; - void append(common::ValueVector* vector, common::SelectionVector& selVector) final; + void append(common::ValueVector* vector, const common::SelectionVector& selVector) final; void lookup(common::offset_t offsetInChunk, common::ValueVector& output, common::sel_t posInOutputVector) const override; diff --git a/src/include/storage/store/table.h b/src/include/storage/store/table.h index be35656ad5c..8711e928f01 100644 --- a/src/include/storage/store/table.h +++ b/src/include/storage/store/table.h @@ -21,11 +21,11 @@ class Table { inline common::TableType getTableType() const { return tableType; } inline common::table_id_t getTableID() const { return tableID; } - inline common::row_idx_t getNumTuples() const { - return tablesStatistics->getNumTuplesForTable(tableID); + inline common::row_idx_t getNumTuples(transaction::Transaction* transaction) const { + return tablesStatistics->getNumTuplesForTable(transaction, tableID); } - inline void setNumTuples(uint64_t numTuples) { - tablesStatistics->setNumTuplesForTable(tableID, numTuples); + inline void updateNumTuplesByValue(uint64_t numTuples) { + tablesStatistics->updateNumTuplesByValue(tableID, numTuples); } virtual void read(transaction::Transaction* transaction, TableReadState& readState, diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index 1263c3baf8b..533ba81e946 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -39,6 +39,7 @@ class TableData { KU_ASSERT(columnID < columns.size() && columnID != common::INVALID_COLUMN_ID); return columns[columnID].get(); } + inline const std::vector>& getColumns() const { return columns; } virtual void prepareLocalTableToCommit( transaction::Transaction* transaction, LocalTableData* localTable) = 0; diff --git a/src/include/storage/store/var_list_column.h b/src/include/storage/store/var_list_column.h index 43d8e1b753b..1dc3eb05f6e 100644 --- a/src/include/storage/store/var_list_column.h +++ b/src/include/storage/store/var_list_column.h @@ -1,7 +1,6 @@ #pragma once #include "column.h" -#include "var_list_column_chunk.h" // List is a nested data type which is stored as three chunks: // 1. Offset column (type: INT64). Using offset to partition the data column into multiple lists. @@ -101,8 +100,6 @@ class VarListColumn : public Column { private: std::unique_ptr sizeColumn; std::unique_ptr dataColumn; - // TODO(Guodong): This should be moved to table states. - std::unique_ptr tmpDataColumnChunk; }; } // namespace storage diff --git a/src/include/storage/store/var_list_column_chunk.h b/src/include/storage/store/var_list_column_chunk.h index edbb62a87bb..992ca00bbc8 100644 --- a/src/include/storage/store/var_list_column_chunk.h +++ b/src/include/storage/store/var_list_column_chunk.h @@ -44,7 +44,7 @@ class VarListColumnChunk final : public ColumnChunk { sizeColumnChunk->setNumValues(numValues_); } - void append(common::ValueVector* vector, common::SelectionVector& selVector) final; + void append(common::ValueVector* vector, const common::SelectionVector& selVector) final; void lookup(common::offset_t offsetInChunk, common::ValueVector& output, common::sel_t posInOutputVector) const override; diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index a5d4986730a..2fbba58f515 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -58,6 +58,7 @@ ClientContext::ClientContext(Database* database) : database{database} { config.varLengthMaxDepth = ClientConfigDefault::VAR_LENGTH_MAX_DEPTH; config.enableProgressBar = ClientConfigDefault::ENABLE_PROGRESS_BAR; config.showProgressAfter = ClientConfigDefault::SHOW_PROGRESS_AFTER; + config.enableMultiCopy = ClientConfigDefault::ENABLE_MULTI_COPY; } uint64_t ClientContext::getTimeoutRemainingInMS() const { diff --git a/src/main/db_config.cpp b/src/main/db_config.cpp index 6e9f43f71ac..6a1b1fb7df2 100644 --- a/src/main/db_config.cpp +++ b/src/main/db_config.cpp @@ -15,7 +15,8 @@ static ConfigurationOption options[] = { // NOLINT(cert-err58-cpp): GET_CONFIGURATION(ThreadsSetting), GET_CONFIGURATION(TimeoutSetting), GET_CONFIGURATION(VarLengthExtendMaxDepthSetting), GET_CONFIGURATION(EnableSemiMaskSetting), GET_CONFIGURATION(HomeDirectorySetting), GET_CONFIGURATION(FileSearchPathSetting), - GET_CONFIGURATION(ProgressBarSetting), GET_CONFIGURATION(ProgressBarTimerSetting)}; + GET_CONFIGURATION(ProgressBarSetting), GET_CONFIGURATION(ProgressBarTimerSetting), + GET_CONFIGURATION(EnableMultiCopySetting)}; ConfigurationOption* DBConfig::getOptionByName(const std::string& optionName) { auto lOptionName = optionName; diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index 35a1e79cc93..7d9e8a30ace 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -159,7 +159,11 @@ std::unique_ptr PlanMapper::mapPartitioner(LogicalOperator* lo infos.push_back(std::make_unique(keyPos, columnPositions, std::move(columnTypes), PartitionerFunctions::partitionRelData)); } - auto sharedState = std::make_shared(clientContext->getMemoryManager()); + std::vector columnTypes; + for (auto& info : infos) { + columnTypes.push_back(info->columnTypes); + } + auto sharedState = std::make_shared(std::move(columnTypes)); return std::make_unique(std::make_unique(outFSchema), std::move(infos), std::move(sharedState), std::move(prevOperator), getOperatorID(), logicalPartitioner->getExpressionsForPrinting()); @@ -187,14 +191,22 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator auto copyFromInfo = copyFrom->getInfo(); auto relTableEntry = ku_dynamic_cast(copyFromInfo->tableEntry); - auto prevOperator = mapOperator(copyFrom->getChild(0).get()); - KU_ASSERT(prevOperator->getOperatorType() == PhysicalOperatorType::PARTITIONER); - auto partitionerSharedState = dynamic_cast(prevOperator.get())->getSharedState(); + auto partitioner = mapOperator(copyFrom->getChild(0).get()); + KU_ASSERT(partitioner->getOperatorType() == PhysicalOperatorType::PARTITIONER); + auto partitionerSharedState = dynamic_cast(partitioner.get())->getSharedState(); auto storageManager = clientContext->getStorageManager(); partitionerSharedState->srcNodeTable = storageManager->getNodeTable(relTableEntry->getSrcTableID()); partitionerSharedState->dstNodeTable = storageManager->getNodeTable(relTableEntry->getDstTableID()); + // TODO(Guodong/Xiyang): This is a temp hack to set rel offset. + KU_ASSERT(partitioner->getChild(0)->getChild(0)->getOperatorType() == + PhysicalOperatorType::IN_QUERY_CALL); + auto scanFile = + ku_dynamic_cast(partitioner->getChild(0)->getChild(0)); + auto relTable = storageManager->getRelTable(relTableEntry->getTableID()); + scanFile->getSharedState()->nextRowIdx = + relTable->getNumTuples(&transaction::DUMMY_WRITE_TRANSACTION); // TODO(Xiyang): Move binding of column types to binder. std::vector columnTypes; columnTypes.push_back(*LogicalType::INTERNAL_ID()); // NBR_ID COLUMN. @@ -202,8 +214,7 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator columnTypes.push_back(*property.getDataType()->copy()); } auto batchInsertSharedState = std::make_shared( - storageManager->getRelTable(relTableEntry->getTableID()), getSingleStringColumnFTable(), - storageManager->getWAL()); + relTable, getSingleStringColumnFTable(), storageManager->getWAL()); auto copyRelFWD = createCopyRel(partitionerSharedState, batchInsertSharedState, copyFrom, RelDataDirection::FWD, LogicalType::copy(columnTypes)); auto copyRelBWD = createCopyRel(partitionerSharedState, batchInsertSharedState, copyFrom, @@ -211,7 +222,7 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator physical_op_vector_t result; result.push_back(std::move(copyRelBWD)); result.push_back(std::move(copyRelFWD)); - result.push_back(std::move(prevOperator)); + result.push_back(std::move(partitioner)); return result; } diff --git a/src/processor/operator/persistent/batch_insert.cpp b/src/processor/operator/persistent/batch_insert.cpp index 37e36cd3453..1511e42769a 100644 --- a/src/processor/operator/persistent/batch_insert.cpp +++ b/src/processor/operator/persistent/batch_insert.cpp @@ -9,7 +9,7 @@ namespace kuzu { namespace processor { void BatchInsert::checkIfTableIsEmpty() { - if (sharedState->table->getNumTuples() != 0) { + if (sharedState->table->getNumTuples(&transaction::DUMMY_READ_TRANSACTION) != 0) { throw CopyException(ExceptionMessage::notAllowCopyOnNonEmptyTableException()); } } diff --git a/src/processor/operator/persistent/node_batch_insert.cpp b/src/processor/operator/persistent/node_batch_insert.cpp index 3aa0d722406..b84eb5b844c 100644 --- a/src/processor/operator/persistent/node_batch_insert.cpp +++ b/src/processor/operator/persistent/node_batch_insert.cpp @@ -176,7 +176,7 @@ void NodeBatchInsert::finalize(ExecutionContext* context) { auto nodeSharedState = ku_dynamic_cast(sharedState.get()); nodeSharedState->calculateNumTuples(); - nodeSharedState->setNumTuplesForTable(); + nodeSharedState->updateNumTuplesForTable(); if (nodeSharedState->sharedNodeGroup) { auto nodeGroupIdx = nodeSharedState->getNextNodeGroupIdx(); auto nodeTable = ku_dynamic_cast(nodeSharedState->table); diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index 6113407e144..0f483a8f742 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -4,6 +4,7 @@ #include "common/exception/message.h" #include "common/string_format.h" #include "processor/result/factorized_table.h" +#include "storage/local_storage/local_rel_table.h" #include "storage/store/column_chunk.h" #include "storage/store/rel_table.h" @@ -13,8 +14,10 @@ using namespace kuzu::storage; namespace kuzu { namespace processor { -void RelBatchInsert::initGlobalStateInternal(ExecutionContext* /*context*/) { - checkIfTableIsEmpty(); +void RelBatchInsert::initGlobalStateInternal(ExecutionContext* context) { + if (!context->clientContext->getClientConfig()->enableMultiCopy) { + checkIfTableIsEmpty(); + } sharedState->logBatchInsertWALRecord(); } @@ -26,7 +29,7 @@ void RelBatchInsert::initLocalStateInternal( ColumnDataFormat::CSR, relInfo->columnTypes, relInfo->compressionEnabled); } -void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { +void RelBatchInsert::executeInternal(ExecutionContext* context) { auto relInfo = ku_dynamic_cast(info.get()); auto relTable = ku_dynamic_cast(sharedState->table); auto relLocalState = @@ -38,56 +41,80 @@ void RelBatchInsert::executeInternal(ExecutionContext* /*context*/) { // No more partitions left in the partitioning buffer. break; } - auto& partitioningBuffer = partitionerSharedState->getPartitionBuffer( - relInfo->partitioningIdx, relLocalState->nodeGroupIdx); - auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(relLocalState->nodeGroupIdx); - for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { - setOffsetToWithinNodeGroup( - chunkedGroup->getColumnChunkUnsafe(relInfo->offsetColumnID), startNodeOffset); - } - // Calculate num of source nodes in this node group. - // This will be used to set the num of values of the node group. - auto numNodes = std::min(StorageConstants::NODE_GROUP_SIZE, - partitionerSharedState->maxNodeOffsets[relInfo->partitioningIdx] - startNodeOffset + 1); - prepareCSRNodeGroup(partitioningBuffer, startNodeOffset, relInfo->offsetColumnID, numNodes); - for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { - localState->nodeGroup->write( - chunkedGroup->getColumnChunksUnsafe(), relInfo->offsetColumnID); + if (relTable->isNewNodeGroup( + context->clientContext->getTx(), relLocalState->nodeGroupIdx, relInfo->direction)) { + appendNewNodeGroup(*relInfo, *relLocalState, *sharedState, *partitionerSharedState); + } else { + mergeNodeGroup( + context, *relInfo, *relLocalState, *sharedState, *partitionerSharedState); } - localState->nodeGroup->finalize(relLocalState->nodeGroupIdx); - // Flush node group to table. - relTable->append(localState->nodeGroup.get(), relInfo->direction); - sharedState->incrementNumRows(localState->nodeGroup->getNumRows()); - localState->nodeGroup->resetToEmpty(); } } -void RelBatchInsert::prepareCSRNodeGroup(ChunkedNodeGroupCollection& partition, - common::offset_t startNodeOffset, column_id_t offsetColumnID, offset_t numNodes) { - auto relInfo = ku_dynamic_cast(info.get()); +void RelBatchInsert::prepareCSRNodeGroup(const ChunkedNodeGroupCollection& partition, + offset_t startNodeOffset, const RelBatchInsertInfo& relInfo, + RelBatchInsertLocalState& localState, offset_t numNodes) { auto csrNodeGroup = - ku_dynamic_cast(localState->nodeGroup.get()); + ku_dynamic_cast(localState.nodeGroup.get()); auto& csrHeader = csrNodeGroup->getCSRHeader(); csrHeader.setNumValues(numNodes); // Populate start csr offsets and lengths for each node. - auto gaps = populateStartCSROffsetsAndLengths(csrHeader, numNodes, partition, offsetColumnID); - auto invalid = checkRelMultiplicityConstraint(csrHeader); + auto gaps = + populateStartCSROffsetsAndLengths(csrHeader, numNodes, partition, relInfo.offsetColumnID); + auto invalid = checkRelMultiplicityConstraint(csrHeader, relInfo); if (invalid.has_value()) { throw CopyException(ExceptionMessage::violateRelMultiplicityConstraint( - info->tableEntry->getName(), std::to_string(invalid.value() + startNodeOffset), - RelDataDirectionUtils::relDirectionToString(relInfo->direction))); + relInfo.tableEntry->getName(), std::to_string(invalid.value() + startNodeOffset), + RelDataDirectionUtils::relDirectionToString(relInfo.direction))); } // Resize csr data column chunks. offset_t csrChunkCapacity = csrHeader.getEndCSROffset(numNodes - 1) + csrHeader.getCSRLength(numNodes - 1); - localState->nodeGroup->resizeChunks(csrChunkCapacity); + localState.nodeGroup->resizeChunks(csrChunkCapacity); for (auto& chunkedGroup : partition.getChunkedGroups()) { - auto& offsetChunk = chunkedGroup->getColumnChunkUnsafe(offsetColumnID); + auto& offsetChunk = chunkedGroup->getColumnChunkUnsafe(relInfo.offsetColumnID); setOffsetFromCSROffsets(offsetChunk, *csrHeader.offset); } populateEndCSROffsets(csrHeader, gaps); } +void RelBatchInsert::mergeNodeGroup(ExecutionContext* context, const RelBatchInsertInfo& relInfo, + RelBatchInsertLocalState& localState, BatchInsertSharedState& sharedState, + const PartitionerSharedState& partitionerSharedState) { + auto relTable = ku_dynamic_cast(sharedState.table); + auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(localState.nodeGroupIdx); + auto multiplicity = + ku_dynamic_cast( + relInfo.tableEntry) + ->getMultiplicity(relInfo.direction); + auto localNG = + std::make_unique(nodeGroupStartOffset, relInfo.columnTypes, multiplicity); + auto& partition = + partitionerSharedState.getPartitionBuffer(relInfo.partitioningIdx, localState.nodeGroupIdx); + auto& insertChunks = localNG->getInsesrtChunks(); + auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(localState.nodeGroupIdx); + auto numRels = 0u; + for (auto& chunkedGroup : partition.getChunkedGroups()) { + auto& offsetChunk = chunkedGroup->getColumnChunkUnsafe(relInfo.offsetColumnID); + numRels += chunkedGroup->getNumRows(); + setOffsetToWithinNodeGroup(offsetChunk, startNodeOffset); + std::vector> chunksToAppend; + for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { + if (i == relInfo.offsetColumnID) { + // Skip the offset vector. + continue; + } + chunksToAppend.push_back(std::move(chunkedGroup->getColumnChunksUnsafe()[i])); + } + auto chunkedGroupToAppend = std::make_unique(std::move(chunksToAppend)); + insertChunks.appendChunkedGroup(&offsetChunk, std::move(chunkedGroupToAppend)); + } + relTable->getDirectedTableData(relInfo.direction) + ->prepareCommitNodeGroup( + context->clientContext->getTx(), localState.nodeGroupIdx, localNG.get()); + sharedState.incrementNumRows(numRels); +} + void RelBatchInsert::populateEndCSROffsets( ChunkedCSRHeader& csrHeader, std::vector& gaps) { auto csrOffsets = (offset_t*)csrHeader.offset->getData(); @@ -106,7 +133,7 @@ length_t RelBatchInsert::getGapSize(length_t length) { } std::vector RelBatchInsert::populateStartCSROffsetsAndLengths(ChunkedCSRHeader& csrHeader, - offset_t numNodes, ChunkedNodeGroupCollection& partition, column_id_t offsetColumnID) { + offset_t numNodes, const ChunkedNodeGroupCollection& partition, column_id_t offsetColumnID) { KU_ASSERT(numNodes == csrHeader.length->getNumValues() && numNodes == csrHeader.offset->getNumValues()); std::vector gaps; @@ -154,13 +181,39 @@ void RelBatchInsert::setOffsetFromCSROffsets( } } -std::optional RelBatchInsert::checkRelMultiplicityConstraint( - const storage::ChunkedCSRHeader& csrHeader) { - auto relInfo = ku_dynamic_cast(info.get()); +void RelBatchInsert::appendNewNodeGroup(const RelBatchInsertInfo& relInfo, + RelBatchInsertLocalState& localState, BatchInsertSharedState& sharedState, + const PartitionerSharedState& partitionerSharedState) { + auto nodeGroupIdx = localState.nodeGroupIdx; + auto& partitioningBuffer = + partitionerSharedState.getPartitionBuffer(relInfo.partitioningIdx, localState.nodeGroupIdx); + auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); + for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { + setOffsetToWithinNodeGroup( + chunkedGroup->getColumnChunkUnsafe(relInfo.offsetColumnID), startNodeOffset); + } + // Calculate num of source nodes in this node group. + // This will be used to set the num of values of the node group. + auto numNodes = std::min(StorageConstants::NODE_GROUP_SIZE, + partitionerSharedState.maxNodeOffsets[relInfo.partitioningIdx] - startNodeOffset + 1); + prepareCSRNodeGroup(partitioningBuffer, startNodeOffset, relInfo, localState, numNodes); + for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { + localState.nodeGroup->write(*chunkedGroup, relInfo.offsetColumnID); + } + localState.nodeGroup->finalize(nodeGroupIdx); + // Flush node group to table. + auto relTable = ku_dynamic_cast(sharedState.table); + relTable->append(localState.nodeGroup.get(), relInfo.direction); + sharedState.incrementNumRows(localState.nodeGroup->getNumRows()); + localState.nodeGroup->resetToEmpty(); +} + +std::optional RelBatchInsert::checkRelMultiplicityConstraint( + const storage::ChunkedCSRHeader& csrHeader, const RelBatchInsertInfo& relInfo) { auto relTableEntry = ku_dynamic_cast( - info->tableEntry); - if (!relTableEntry->isSingleMultiplicity(relInfo->direction)) { + relInfo.tableEntry); + if (!relTableEntry->isSingleMultiplicity(relInfo.direction)) { return std::nullopt; } for (auto i = 0u; i < csrHeader.length->getNumValues(); i++) { @@ -176,7 +229,7 @@ void RelBatchInsert::finalize(ExecutionContext* context) { if (relInfo->direction == RelDataDirection::BWD) { KU_ASSERT( relInfo->partitioningIdx == partitionerSharedState->partitioningBuffers.size() - 1); - sharedState->setNumTuplesForTable(); + sharedState->updateNumTuplesForTable(); auto outputMsg = stringFormat("{} number of tuples has been copied to table {}.", sharedState->getNumRows(), info->tableEntry->getName()); FactorizedTableUtils::appendStringToTable( diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index fda369511ad..8c7fa823966 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -30,7 +30,7 @@ void ScanNodeIDSharedState::initialize(transaction::Transaction* transaction) { for (auto& tableState : tableStates) { KU_ASSERT(tableState->getSemiMask()->getNumMasks() == numMask); tableState->initializeMaxOffset(transaction); - numNodes += tableState->getTable()->getNumTuples(); + numNodes += tableState->getTable()->getNumTuples(transaction); } (void)numMask; // For clang-tidy: used for assert. numNodesScanned = 0; diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index 2c5a35f562b..c507cbe0e4a 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -33,6 +33,24 @@ bool LocalNodeGroup::hasUpdatesOrDeletions() const { return false; } +void LocalChunkedGroupCollection::appendChunkedGroup( + ColumnChunk* srcOffsetChunk, std::unique_ptr chunkedGroup) { + KU_ASSERT(chunkedGroup->getNumColumns() == dataTypes.size()); + for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { + KU_ASSERT(chunkedGroup->getColumnChunk(i).getDataType() == dataTypes[i]); + } + auto rowIdx = chunkedGroups.getNumChunkedGroups() * ChunkedNodeGroupCollection::CHUNK_CAPACITY; + auto& relOffsetChunk = chunkedGroup->getColumnChunk(REL_ID_COLUMN_ID); + for (auto i = 0u; i < srcOffsetChunk->getNumValues(); i++) { + auto relOffset = relOffsetChunk.getValue(i); + KU_ASSERT(!offsetToRowIdx.contains(relOffset)); + offsetToRowIdx[relOffset] = rowIdx++; + auto srcOffset = srcOffsetChunk->getValue(i); + srcNodeOffsetToRelOffsets[srcOffset].push_back(relOffset); + } + chunkedGroups.merge(std::move(chunkedGroup)); +} + void LocalChunkedGroupCollection::readValueAtRowIdx(row_idx_t rowIdx, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) const { auto [chunkIdx, offsetInChunk] = getChunkIdxAndOffsetInChunk(rowIdx); @@ -73,18 +91,19 @@ void LocalChunkedGroupCollection::remove(offset_t srcNodeOffset, offset_t relOff row_idx_t LocalChunkedGroupCollection::append(std::vector vectors) { KU_ASSERT(vectors.size() == dataTypes.size()); - if (chunkedGroups.getNumChunks() == 0 || - chunkedGroups.getChunkedGroup(chunkedGroups.getNumChunks() - 1)->getNumRows() == + if (chunkedGroups.getNumChunkedGroups() == 0 || + chunkedGroups.getChunkedGroup(chunkedGroups.getNumChunkedGroups() - 1)->getNumRows() == ChunkedNodeGroupCollection::CHUNK_CAPACITY) { - chunkedGroups.append(std::make_unique( + chunkedGroups.merge(std::make_unique( dataTypes, false /*enableCompression*/, ChunkedNodeGroupCollection::CHUNK_CAPACITY)); } - auto lastChunkGroup = chunkedGroups.getChunkedGroupUnsafe(chunkedGroups.getNumChunks() - 1); + auto lastChunkGroup = + chunkedGroups.getChunkedGroupUnsafe(chunkedGroups.getNumChunkedGroups() - 1); for (auto i = 0u; i < vectors.size(); i++) { KU_ASSERT(vectors[i]->state->selVector->selectedSize == 1); lastChunkGroup->getColumnChunkUnsafe(i).append(vectors[i], *vectors[i]->state->selVector); } - lastChunkGroup->setNumValues(lastChunkGroup->getNumRows() + 1); + lastChunkGroup->setNumRows(lastChunkGroup->getNumRows() + 1); return numRows++; } diff --git a/src/storage/stats/nodes_store_statistics.cpp b/src/storage/stats/nodes_store_statistics.cpp index e1d791a7714..a5bae6b3818 100644 --- a/src/storage/stats/nodes_store_statistics.cpp +++ b/src/storage/stats/nodes_store_statistics.cpp @@ -19,6 +19,14 @@ offset_t NodesStoreStatsAndDeletedIDs::getMaxNodeOffset( } } +void NodesStoreStatsAndDeletedIDs::updateNumTuplesByValue(table_id_t tableID, int64_t value) { + initTableStatisticsForWriteTrx(); + KU_ASSERT(readWriteVersion && readWriteVersion->tableStatisticPerTable.contains(tableID)); + setToUpdated(); + auto tableStats = getNodeTableStats(transaction::TransactionType::WRITE, tableID); + tableStats->setNumTuples(tableStats->getNumTuples() + value); +} + void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( transaction::Transaction* transaction, const std::shared_ptr& nodeOffsetVector, table_id_t tableID) { diff --git a/src/storage/stats/rels_store_statistics.cpp b/src/storage/stats/rels_store_statistics.cpp index 6f74d6ba857..13173545e40 100644 --- a/src/storage/stats/rels_store_statistics.cpp +++ b/src/storage/stats/rels_store_statistics.cpp @@ -16,18 +16,7 @@ RelsStoreStats::RelsStoreStats( readFromFile(); } -// We should only call this function after we call setNumRelsPerDirectionBoundTableID. -void RelsStoreStats::setNumTuplesForTable(table_id_t relTableID, uint64_t numRels) { - std::unique_lock lck{mtx}; - initTableStatisticsForWriteTrxNoLock(); - KU_ASSERT(readWriteVersion && readWriteVersion->tableStatisticPerTable.contains(relTableID)); - setToUpdated(); - auto relStatistics = (RelTableStats*)readWriteVersion->tableStatisticPerTable[relTableID].get(); - increaseNextRelOffset(relTableID, numRels - relStatistics->getNumTuples()); - relStatistics->setNumTuples(numRels); -} - -void RelsStoreStats::updateNumRelsByValue(table_id_t relTableID, int64_t value) { +void RelsStoreStats::updateNumTuplesByValue(table_id_t relTableID, int64_t value) { std::unique_lock lck{mtx}; initTableStatisticsForWriteTrxNoLock(); KU_ASSERT(readWriteVersion && readWriteVersion->tableStatisticPerTable.contains(relTableID)); @@ -36,16 +25,14 @@ void RelsStoreStats::updateNumRelsByValue(table_id_t relTableID, int64_t value) auto numRelsBeforeUpdate = relStatistics->getNumTuples(); (void)numRelsBeforeUpdate; // Avoid unused variable warning. KU_ASSERT(!(numRelsBeforeUpdate == 0 && value < 0)); - auto numRelsAfterUpdate = relStatistics->getNumTuples() + value; - relStatistics->setNumTuples(numRelsAfterUpdate); + relStatistics->setNumTuples(numRelsBeforeUpdate + value); // Update the nextRelID only when we are inserting rels. if (value > 0) { increaseNextRelOffset(relTableID, value); } } -offset_t RelsStoreStats::getNextRelOffset( - transaction::Transaction* transaction, table_id_t tableID) { +offset_t RelsStoreStats::getNextRelOffset(Transaction* transaction, table_id_t tableID) { std::unique_lock lck{mtx}; auto& tableStatisticContent = (transaction->isReadOnly() || readWriteVersion == nullptr) ? readOnlyVersion : @@ -94,8 +81,8 @@ MetadataDAHInfo* RelsStoreStats::getCSRLengthMetadataDAHInfo( return tableStats->getCSRLengthMetadataDAHInfo(direction); } -MetadataDAHInfo* RelsStoreStats::getColumnMetadataDAHInfo(transaction::Transaction* transaction, - common::table_id_t tableID, common::column_id_t columnID, common::RelDataDirection direction) { +MetadataDAHInfo* RelsStoreStats::getColumnMetadataDAHInfo(Transaction* transaction, + table_id_t tableID, column_id_t columnID, RelDataDirection direction) { if (transaction->isWriteTransaction()) { initTableStatisticsForWriteTrx(); } diff --git a/src/storage/store/chunked_node_group.cpp b/src/storage/store/chunked_node_group.cpp index 4d08b7fefe7..4f5f3ce4dc4 100644 --- a/src/storage/store/chunked_node_group.cpp +++ b/src/storage/store/chunked_node_group.cpp @@ -80,11 +80,11 @@ void ChunkedNodeGroup::setAllNull() { } } -void ChunkedNodeGroup::setNumValues(common::offset_t numValues) { +void ChunkedNodeGroup::setNumRows(common::offset_t numRows_) { for (auto& chunk : chunks) { - chunk->setNumValues(numValues); + chunk->setNumValues(numRows_); } - numRows = numValues; + numRows = numRows_; } void ChunkedNodeGroup::resizeChunks(uint64_t newSize) { @@ -128,23 +128,27 @@ offset_t ChunkedNodeGroup::append(ChunkedNodeGroup* other, offset_t offsetInOthe } void ChunkedNodeGroup::write( - std::vector>& data, vector_idx_t offsetVectorIdx) { + const std::vector>& data, column_id_t offsetColumnID) { KU_ASSERT(data.size() == chunks.size() + 1); - auto& offsetChunk = data[offsetVectorIdx]; - vector_idx_t vectorIdx = 0, chunkIdx = 0; + auto& offsetChunk = data[offsetColumnID]; + column_id_t columnID = 0, chunkIdx = 0; for (auto i = 0u; i < data.size(); i++) { - if (i == offsetVectorIdx) { - vectorIdx++; + if (i == offsetColumnID) { + columnID++; continue; } - KU_ASSERT(vectorIdx < data.size()); - writeToColumnChunk(chunkIdx, vectorIdx, data, *offsetChunk); + KU_ASSERT(columnID < data.size()); + writeToColumnChunk(chunkIdx, columnID, data, *offsetChunk); chunkIdx++; - vectorIdx++; + columnID++; } numRows += offsetChunk->getNumValues(); } +void ChunkedNodeGroup::write(const ChunkedNodeGroup& data, column_id_t offsetColumnID) { + write(data.chunks, offsetColumnID); +} + void ChunkedNodeGroup::finalize(uint64_t nodeGroupIdx_) { nodeGroupIdx = nodeGroupIdx_; for (auto i = 0u; i < chunks.size(); i++) { diff --git a/src/storage/store/chunked_node_group_collection.cpp b/src/storage/store/chunked_node_group_collection.cpp index b9119f04b92..d118217f426 100644 --- a/src/storage/store/chunked_node_group_collection.cpp +++ b/src/storage/store/chunked_node_group_collection.cpp @@ -31,7 +31,7 @@ void ChunkedNodeGroupCollection::append( } } -void ChunkedNodeGroupCollection::append(std::unique_ptr chunkedGroup) { +void ChunkedNodeGroupCollection::merge(std::unique_ptr chunkedGroup) { KU_ASSERT(chunkedGroup->getNumColumns() == types.size()); for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { KU_ASSERT(chunkedGroup->getColumnChunk(i).getDataType() == types[i]); @@ -39,10 +39,10 @@ void ChunkedNodeGroupCollection::append(std::unique_ptr chunke chunkedGroups.push_back(std::move(chunkedGroup)); } -void ChunkedNodeGroupCollection::merge(ChunkedNodeGroupCollection& chunkedGroupCollection) { - chunkedGroups.reserve(chunkedGroups.size() + chunkedGroupCollection.getNumChunks()); - for (auto& chunkedGroup : chunkedGroupCollection.chunkedGroups) { - append(std::move(chunkedGroup)); +void ChunkedNodeGroupCollection::merge(ChunkedNodeGroupCollection& other) { + chunkedGroups.reserve(chunkedGroups.size() + other.chunkedGroups.size()); + for (auto& chunkedGroup : other.chunkedGroups) { + merge(std::move(chunkedGroup)); } } diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 637e33e7232..a3785c1869e 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -210,7 +210,7 @@ void ColumnChunk::resetToEmpty() { numValues = 0; } -void ColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { +void ColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { KU_ASSERT(vector->dataType.getPhysicalType() == dataType.getPhysicalType()); copyVectorToBuffer(vector, numValues, selVector); numValues += selVector.selectedSize; @@ -347,7 +347,7 @@ offset_t ColumnChunk::getOffsetInBuffer(offset_t pos) const { } void ColumnChunk::copyVectorToBuffer( - ValueVector* vector, offset_t startPosInChunk, SelectionVector& selVector) { + ValueVector* vector, offset_t startPosInChunk, const SelectionVector& selVector) { auto bufferToWrite = buffer.get() + startPosInChunk * numBytesPerValue; KU_ASSERT(startPosInChunk + selVector.selectedSize <= capacity); auto vectorDataToWriteFrom = vector->getData(); @@ -423,7 +423,7 @@ uint64_t ColumnChunk::getBufferSize(uint64_t capacity_) const { } } -void BoolColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { +void BoolColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::BOOL); for (auto i = 0u; i < selVector.selectedSize; i++) { auto pos = selVector.selectedPositions[i]; @@ -532,7 +532,7 @@ class InternalIDColumnChunk final : public ColumnChunk { : ColumnChunk(*LogicalType::INTERNAL_ID(), capacity, enableCompression), commonTableID{INVALID_TABLE_ID} {} - void append(ValueVector* vector, common::SelectionVector& selVector) override { + void append(ValueVector* vector, const common::SelectionVector& selVector) override { switch (vector->dataType.getPhysicalType()) { case PhysicalTypeID::INTERNAL_ID: { copyVectorToBuffer(vector, numValues, selVector); @@ -548,7 +548,7 @@ class InternalIDColumnChunk final : public ColumnChunk { } void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk, - common::SelectionVector& selVector) override { + const common::SelectionVector& selVector) override { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); auto relIDsInVector = (internalID_t*)vector->getData(); if (commonTableID == INVALID_TABLE_ID) { @@ -564,7 +564,7 @@ class InternalIDColumnChunk final : public ColumnChunk { } void copyInt64VectorToBuffer( - ValueVector* vector, offset_t startPosInChunk, common::SelectionVector& selVector) { + ValueVector* vector, offset_t startPosInChunk, const common::SelectionVector& selVector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INT64); for (auto i = 0u; i < selVector.selectedSize; i++) { auto pos = selVector.selectedPositions[i]; diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index 48c1be3023c..507459c2c5f 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -41,7 +41,7 @@ void RelTable::insert(Transaction* transaction, ValueVector* srcNodeIDVector, fwdRelTableData->insert(transaction, srcNodeIDVector, dstNodeIDVector, propertyVectors); bwdRelTableData->insert(transaction, dstNodeIDVector, srcNodeIDVector, propertyVectors); auto relsStats = ku_dynamic_cast(tablesStatistics); - relsStats->updateNumRelsByValue(tableID, 1); + relsStats->updateNumTuplesByValue(tableID, 1); } void RelTable::update(transaction::Transaction* transaction, column_id_t columnID, @@ -58,7 +58,7 @@ void RelTable::delete_(Transaction* transaction, ValueVector* srcNodeIDVector, KU_ASSERT(fwdDeleted == bwdDeleted); if (fwdDeleted && bwdDeleted) { auto relsStats = ku_dynamic_cast(tablesStatistics); - relsStats->updateNumRelsByValue(tableID, -1); + relsStats->updateNumTuplesByValue(tableID, -1); } } @@ -75,7 +75,7 @@ void RelTable::detachDelete(Transaction* transaction, RelDataDirection direction row_idx_t numRelsDeleted = detachDeleteForCSRRels(transaction, tableData, reverseTableData, srcNodeIDVector, relDataReadState.get(), deleteState); auto relsStats = ku_dynamic_cast(tablesStatistics); - relsStats->updateNumRelsByValue(tableID, -numRelsDeleted); + relsStats->updateNumTuplesByValue(tableID, -numRelsDeleted); } void RelTable::checkIfNodeHasRels( diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index adbc76bf1aa..501d07a3659 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -360,6 +360,14 @@ offset_t RelTableData::findCSROffsetInRegion( return posInCSRList + persistentState.leftCSROffset; } +bool RelTableData::isNewNodeGroup(Transaction* transaction, node_group_idx_t nodeGroupIdx) const { + if (nodeGroupIdx >= getNumNodeGroups(transaction) || + getNbrIDColumn()->getMetadata(nodeGroupIdx, transaction->getType()).numValues == 0) { + return true; + } + return false; +} + void RelTableData::prepareLocalTableToCommit(Transaction* transaction, LocalTableData* localTable) { auto localRelTableData = ku_dynamic_cast(localTable); for (auto& [nodeGroupIdx, nodeGroup] : localRelTableData->nodeGroups) { diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index d9d4f0be0d4..1f5cc2eab5c 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -21,7 +21,7 @@ void StringColumnChunk::resetToEmpty() { dictionaryChunk->resetToEmpty(); } -void StringColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { +void StringColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { for (auto i = 0u; i < selVector.selectedSize; i++) { // index is stored in main chunk, data is stored in the data chunk auto pos = selVector.selectedPositions[i]; diff --git a/src/storage/store/struct_column.cpp b/src/storage/store/struct_column.cpp index e1fd4ac181d..fe15f12d81b 100644 --- a/src/storage/store/struct_column.cpp +++ b/src/storage/store/struct_column.cpp @@ -165,6 +165,13 @@ void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_id getNullChunkCollection(localInsertChunk), insertInfo, getNullChunkCollection(localUpdateChunk), updateInfo, deleteInfo); } + auto chunkMeta = metadataDA->get(nodeGroupIdx, transaction->getType()); + if (nullColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues != + chunkMeta.numValues) { + chunkMeta.numValues = + nullColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues; + metadataDA->update(nodeGroupIdx, chunkMeta); + } // Update each child column separately for (auto i = 0u; i < childColumns.size(); i++) { const auto& childColumn = childColumns[i]; @@ -195,6 +202,13 @@ void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_id nullColumn->commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk->getNullChunk(), srcOffset); } + auto chunkMeta = metadataDA->get(nodeGroupIdx, transaction->getType()); + if (nullColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues != + chunkMeta.numValues) { + chunkMeta.numValues = + nullColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues; + metadataDA->update(nodeGroupIdx, chunkMeta); + } // Update each child column separately for (auto i = 0u; i < childColumns.size(); i++) { const auto& childColumn = childColumns[i]; diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index 319a6ff6b43..718dc4aaa74 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -42,7 +42,7 @@ void StructColumnChunk::append( numValues += numValuesToAppend; } -void StructColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { +void StructColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { auto numFields = StructType::getNumFields(&dataType); for (auto i = 0u; i < numFields; i++) { childChunks[i]->append(StructVector::getFieldVector(vector, i).get(), selVector); diff --git a/src/storage/store/var_list_column.cpp b/src/storage/store/var_list_column.cpp index bacf684d3b6..b53fb8898eb 100644 --- a/src/storage/store/var_list_column.cpp +++ b/src/storage/store/var_list_column.cpp @@ -61,9 +61,6 @@ VarListColumn::VarListColumn(std::string name, LogicalType dataType, dataColumn = ColumnFactory::createColumn(dataColName, *VarListType::getChildType(&this->dataType)->copy(), *metaDAHeaderInfo.childrenInfos[1], dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); - tmpDataColumnChunk = - std::make_unique(ColumnChunkFactory::createColumnChunk( - *VarListType::getChildType(&this->dataType)->copy(), enableCompression, 0)); } void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -135,7 +132,10 @@ void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx varListColumnChunk->resetOffset(); } else { varListColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); - tmpDataColumnChunk->resizeBuffer(std::bit_ceil(resizeNumValues)); + auto tmpDataColumnChunk = + std::make_unique(ColumnChunkFactory::createColumnChunk( + *VarListType::getChildType(&this->dataType)->copy(), enableCompression, + std::bit_ceil(resizeNumValues))); auto dataVarListColumnChunk = varListColumnChunk->getDataColumnChunk(); for (auto i = 0u; i < columnChunk->getNumValues(); i++) { offset_t startVarListOffset = varListColumnChunk->getListStartOffset(i); diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index 527efc28abe..b2cb6df8d56 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -104,7 +104,7 @@ void VarListColumnChunk::resetToEmpty() { enableCompression, 0 /* capacity */)); } -void VarListColumnChunk::append(ValueVector* vector, SelectionVector& selVector) { +void VarListColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { auto numToAppend = selVector.selectedSize; auto newCapacity = capacity; while (numValues + numToAppend >= newCapacity) { diff --git a/test/copy/e2e_copy_transaction_test.cpp b/test/copy/e2e_copy_transaction_test.cpp index e5dfb11f45d..14451a01f10 100644 --- a/test/copy/e2e_copy_transaction_test.cpp +++ b/test/copy/e2e_copy_transaction_test.cpp @@ -92,20 +92,12 @@ class TinySnbCopyCSVTransactionTest : public EmptyDBTest { void validateTinysnbKnowsDateProperty() { std::multiset> expectedResult = { - Date::fromCString("1905-12-12", strlen("1905-12-12")), - Date::fromCString("1905-12-12", strlen("1905-12-12")), - Date::fromCString("1950-05-14", strlen("1950-05-14")), - Date::fromCString("1950-05-14", strlen("1950-05-14")), - Date::fromCString("1950-05-14", strlen("1950-05-14")), - Date::fromCString("1950-05-14", strlen("1950-05-14")), - Date::fromCString("2000-01-01", strlen("2000-01-01")), - Date::fromCString("2000-01-01", strlen("2000-01-01")), - Date::fromCString("2021-06-30", strlen("2021-06-30")), Date::fromCString("2021-06-30", strlen("2021-06-30")), Date::fromCString("2021-06-30", strlen("2021-06-30")), Date::fromCString("2021-06-30", strlen("2021-06-30")), Date::fromCString("2021-06-30", strlen("2021-06-30")), - Date::fromCString("2021-06-30", strlen("2021-06-30"))}; + Date::fromCString("1950-05-14", strlen("1950-05-14")), + Date::fromCString("1950-05-14", strlen("1950-05-14"))}; std::multiset> actualResult; auto queryResult = conn->query("match (:person)-[e:knows]->(:person) return e.date"); while (queryResult->hasNext()) { @@ -119,19 +111,19 @@ class TinySnbCopyCSVTransactionTest : public EmptyDBTest { auto dummyWriteTrx = transaction::Transaction::getDummyWriteTrx(); ASSERT_EQ(getStorageManager(*database)->getRelsStatistics()->getNextRelOffset( dummyWriteTrx.get(), tableID), - 14); + 6); } void validateDatabaseStateAfterCheckPointCopyRel(table_id_t knowsTableID) { validateTinysnbKnowsDateProperty(); auto relsStatistics = getStorageManager(*database)->getRelsStatistics(); auto dummyWriteTrx = transaction::Transaction::getDummyWriteTrx(); - ASSERT_EQ(relsStatistics->getNextRelOffset(dummyWriteTrx.get(), knowsTableID), 14); + ASSERT_EQ(relsStatistics->getNextRelOffset(dummyWriteTrx.get(), knowsTableID), 6); ASSERT_EQ(relsStatistics->getReadOnlyVersion()->tableStatisticPerTable.size(), 1); auto knowsRelStatistics = (RelTableStats*)relsStatistics->getReadOnlyVersion() ->tableStatisticPerTable.at(knowsTableID) .get(); - ASSERT_EQ(knowsRelStatistics->getNumTuples(), 14); + ASSERT_EQ(knowsRelStatistics->getNumTuples(), 6); } void copyRelCSVCommitAndRecoveryTest(TransactionTestType transactionTestType) { diff --git a/test/test_files/copy/copy_transaction.test b/test/test_files/copy/copy_transaction.test index 54660994273..2b6eb3a8b51 100644 --- a/test/test_files/copy/copy_transaction.test +++ b/test/test_files/copy/copy_transaction.test @@ -43,8 +43,12 @@ notes UNION(firstmet DATE, type INT16, comment STRING), someMap MAP(STRING, STRING), MANY_MANY); ---- ok +-STATEMENT CALL ENABLE_MULTI_COPY=true; +---- ok -STATEMENT COPY knows FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/eKnows.csv" ---- ok +-STATEMENT COPY knows FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/eKnows_2.csv" +---- ok -STATEMENT match (:person)-[e:knows]->(:person) return e.date ---- 14 1905-12-12 diff --git a/test/test_files/exceptions/copy/auto_commit.test b/test/test_files/exceptions/copy/auto_commit.test index 67d7a13c0f8..0a967a772fa 100644 --- a/test/test_files/exceptions/copy/auto_commit.test +++ b/test/test_files/exceptions/copy/auto_commit.test @@ -22,4 +22,4 @@ DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please c ---- ok -STATEMENT COPY knows FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/eKnows.csv" ---- 1 -14 number of tuples has been copied to table knows. +6 number of tuples has been copied to table knows. diff --git a/test/test_files/tinysnb/union/union.test b/test/test_files/tinysnb/nested_types/nested_types.test similarity index 53% rename from test/test_files/tinysnb/union/union.test rename to test/test_files/tinysnb/nested_types/nested_types.test index 1521a3791a0..b660f0223af 100644 --- a/test/test_files/tinysnb/union/union.test +++ b/test/test_files/tinysnb/nested_types/nested_types.test @@ -1,10 +1,7 @@ -GROUP TinySnbReadTest -DATASET CSV tinysnb - -- - -CASE Union - -LOG UnionAllTwoQueriesTest -STATEMENT MATCH (p:person) RETURN p.age UNION ALL MATCH (p1:person) RETURN p1.age -PARALLELISM 8 @@ -25,7 +22,6 @@ 45 83 83 - -LOG UnionAllMultipleQueriesTest -STATEMENT MATCH (p:person) RETURN p.age UNION ALL MATCH (p1:person) RETURN p1.age UNION ALL MATCH (p2:person) RETURN p2.age -PARALLELISM 2 @@ -54,7 +50,6 @@ 83 83 83 - -LOG UnionAllMultipleColumnsTest -STATEMENT MATCH (p:person) RETURN p.age, p.eyeSight UNION ALL MATCH (p1:person) RETURN p1.age, p1.eyeSight -PARALLELISM 3 @@ -75,7 +70,6 @@ 45|5.000000 83|4.900000 83|4.900000 - -LOG UnionTwoQueriesTest -STATEMENT MATCH (a:person) RETURN a.age UNION MATCH (p:person) RETURN p.age ---- 7 @@ -86,7 +80,6 @@ 40 45 83 - # If an expression to union has different flat/unflat state in different single queries, we need to flatten that # expression in all the single queries. -LOG UnionAllFlatAndUnFlatColTest @@ -135,7 +128,6 @@ 45 45 45 - -LOG UnionAllWithTest -STATEMENT MATCH (a:person)-[:knows]->(b:person) with b return b.age + 3 UNION ALL MATCH (a:person)-[e:knows]->(b:person) with a RETURN a.age -ENUMERATE @@ -168,7 +160,6 @@ 48 48 48 - -LOG UnionAllThreeHopsTest -STATEMENT MATCH (a:person)-[e1:knows]->(b:person)-[e2:knows]->(c:person)-[e3:knows]->(d:person) RETURN a.fName order by d.age desc, c.age asc, b.age asc, a.age desc limit 10 UNION ALL MATCH (p:person) RETURN p.fName -ENUMERATE @@ -191,7 +182,77 @@ Elizabeth Farooq Greg Hubert Blaine Wolfeschlegelsteinhausenbergerdorff - - -STATEMENT MATCH (a) RETURN a.* UNION ALL MATCH (b) RETURN b.* ---- ok + +-CASE RelVarList +-STATEMENT MATCH (a:person)-[r:knows]->(b:person) RETURN r.comments +---- 14 +[rnme,m8sihsdnf2990nfiwf] +[njnojppo9u0jkmf,fjiojioh9h9h89hph] +[ioji232,jifhe8w99u43434] +[2huh9y89fsfw23,23nsihufhw723] +[fwehu9h9832wewew,23u9h989sdfsss] +[fwh9y81232uisuiehuf,ewnuihxy8dyf232] +[fnioh8323aeweae34d,osd89e2ejshuih12] +[fwh983-sdjisdfji,ioh89y32r2huir] +[psh989823oaaioe,nuiuah1nosndfisf] +[fwewe] +[fewh9182912e3,h9y8y89soidfsf,nuhudf78w78efw,hioshe0f9023sdsd] +[23h9sdslnfowhu2932,shuhf98922323sf] +[ahu2333333333333,12weeeeeeeeeeeeeeeeee] +[peweeeeeeeeeeeeeeeee,kowje9w0eweeeeeeeee] + +-CASE RelStruct +-STATEMENT MATCH (a:person)-[r:knows]->(b:person) RETURN r.summary +---- 14 +{locations: , transfer: } +{locations: ['london','toronto'], transfer: {day: 2012-11-21, amount: [223,5230]}} +{locations: ['toronto','waterloo'], transfer: {day: 2021-01-02, amount: [100,200]}} +{locations: ['shanghai'], transfer: {day: 1990-09-10, amount: [10]}} +{locations: ['paris'], transfer: {day: 2000-01-01, amount: [20,5000]}} +{locations: ['paris'], transfer: {day: 2011-05-01, amount: [2000,5340]}} +{locations: ['vancouver'], transfer: {day: 2020-01-01, amount: [120,50]}} +{locations: ['paris','beijing'], transfer: {day: 2011-03-11, amount: [2323,50]}} +{locations: [], transfer: {day: 1980-11-21, amount: [20,5]}} +{locations: ['shanghai','nanjing'], transfer: {day: 1998-11-12, amount: [22,53240]}} +{locations: ['paris'], transfer: {day: 2000-01-01, amount: [20,5000]}} +{locations: ['paris'], transfer: {day: 2000-01-01, amount: [20,5000]}} +{locations: ['toronto','thisisalongcityname'], transfer: {day: 1930-11-22, amount: [18,323]}} +{locations: ['waterloo'], transfer: {day: 2000-01-01, amount: [1000,5000]}} + +-CASE RelMap +-STATEMENT MATCH (a:person)-[r:knows]->(b:person) RETURN r.someMap +---- 14 +{a=b} +{c=d, e=f, 1=2} + + + + + + + + + + + + + +-CASE RelUnion +-STATEMENT MATCH (a:person)-[r:knows]->(b:person) RETURN r.notes +---- 14 +1 +1 +10 +10 +15 +2 +2020-10-10 +4 +4 +8 +nice weather +cool stuff found +matthew perry +happy new year From ad31f022ab2d1bcdb2954ceea0b4d30605827927 Mon Sep 17 00:00:00 2001 From: Neeraj Date: Mon, 25 Mar 2024 22:13:09 +0530 Subject: [PATCH 088/136] initialize readfds via FD_ZERO before use (#3132) There is a genuine issue of using readfds without being initialized in `linenoise.cpp` line 1372. `kuzu_shell.exe` crashes in my build each time with the following callstack: ``` kuzu_shell.exe;void failwithmessage( void * retaddr = 000000F2014FC170, int crttype = 1024, int errnum = -1751163576, const char* msg = 000002DDE1230150) Ln 213;7FF6972CF9EE kuzu_shell.exe;void _RTC_UninitUse( const char* varname = 000084C200000010) Ln 362;7FF6972CFB84 kuzu_shell.exe;b8 pastedInput( int ifd = 0) Ln 1372;7FF696062D31 kuzu_shell.exe;int linenoiseEdit( int stdin_fd = 0, int stdout_fd = 1, char * buf = 000000F2014FCB70, u64 buflen = 4096, const char* prompt = 00007FF69753BF00) Ln 1767;7FF696063F6F kuzu_shell.exe;int linenoiseRaw( char * buf = 000000F2014FCB70, u64 buflen = 4096, const char* prompt = 00007FF69753BF00) Ln 2082;7FF696064C54 kuzu_shell.exe;char * linenoise( const char* prompt = 00007FF69753BF00) Ln 2153;7FF69605EF74 kuzu_shell.exe;kuzu::main::EmbeddedShell::run() Ln 334;7FF696023E72 kuzu_shell.exe;int main( int argc = 2, char * * argv = 000002DDE123DB30) Ln 77;7FF69606E11E kuzu_shell.exe;int invoke_main() Ln 79;7FF6972D0249 kuzu_shell.exe;int __scrt_common_main_seh() Ln 288;7FF6972D012E kuzu_shell.exe;int __scrt_common_main() Ln 331;7FF6972CFFEE kuzu_shell.exe;unsigned long mainCRTStartup( void * __formal = 000000F201215000) Ln 17;7FF6972D02DE kernel32.dll;;7FFA5915257D ntdll.dll;;7FFA59FAAA58 ``` Simpler fix: ```diff diff --git a/tools/shell/linenoise.cpp b/tools/shell/linenoise.cpp index dcd32d6d..a01fe0c4 100644 --- a/tools/shell/linenoise.cpp +++ b/tools/shell/linenoise.cpp @@ -1369,6 +1369,7 @@ static void searchNext(linenoiseState* l) { bool pastedInput(int ifd) { #ifdef _WIN32 fd_set readfds; + FD_ZERO(&readfds); FD_SET(ifd, &readfds); int isPasted = select(0, &readfds, NULL, NULL, NULL); return (isPasted != 0 && isPasted != SOCKET_ERROR); ``` --- tools/shell/linenoise.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/shell/linenoise.cpp b/tools/shell/linenoise.cpp index dcd32d6d535..daf472a194d 100644 --- a/tools/shell/linenoise.cpp +++ b/tools/shell/linenoise.cpp @@ -1369,6 +1369,7 @@ static void searchNext(linenoiseState* l) { bool pastedInput(int ifd) { #ifdef _WIN32 fd_set readfds; + FD_ZERO(&readfds); FD_SET(ifd, &readfds); int isPasted = select(0, &readfds, NULL, NULL, NULL); return (isPasted != 0 && isPasted != SOCKET_ERROR); From a8b15dc44c7ff64ff30b6b95db10b6b2ec2cb327 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Tue, 26 Mar 2024 01:32:30 +0800 Subject: [PATCH 089/136] table scan/update/insert/delete state (#3072) --- src/catalog/catalog_content.cpp | 2 +- src/function/table/call/storage_info.cpp | 5 +- .../operator/persistent/insert_executor.h | 6 +- .../operator/scan/scan_multi_node_tables.h | 5 +- .../operator/scan/scan_multi_rel_tables.h | 5 +- .../processor/operator/scan/scan_node_table.h | 3 +- .../processor/operator/scan/scan_rel_table.h | 15 +- .../storage/local_storage/local_node_table.h | 18 ++ .../storage/local_storage/local_rel_table.h | 33 ++-- .../storage/local_storage/local_storage.h | 22 +-- .../storage/local_storage/local_table.h | 31 ++-- src/include/storage/storage_manager.h | 15 +- ...{storage_info.h => storage_version_info.h} | 0 src/include/storage/store/node_table.h | 81 ++++++--- src/include/storage/store/node_table_data.h | 23 +-- src/include/storage/store/rel_table.h | 94 +++++++--- src/include/storage/store/rel_table_data.h | 21 +-- src/include/storage/store/table.h | 48 ++++- src/include/storage/store/table_data.h | 12 +- src/include/transaction/transaction.h | 8 +- src/include/transaction/transaction_context.h | 6 +- src/include/transaction/transaction_manager.h | 7 +- src/main/client_context.cpp | 2 +- src/main/storage_driver.cpp | 5 +- src/main/version.cpp | 2 +- src/processor/map/map_copy_from.cpp | 12 +- src/processor/map/map_delete.cpp | 26 +-- src/processor/map/map_extend.cpp | 2 +- src/processor/map/map_index_scan_node.cpp | 8 +- src/processor/map/map_insert.cpp | 10 +- src/processor/map/map_recursive_extend.cpp | 3 +- src/processor/map/map_scan_node.cpp | 3 +- src/processor/map/map_scan_node_property.cpp | 7 +- src/processor/map/map_set.cpp | 16 +- .../operator/ddl/add_node_property.cpp | 2 +- .../operator/ddl/add_rel_property.cpp | 2 +- .../operator/persistent/delete_executor.cpp | 16 +- .../operator/persistent/insert_executor.cpp | 28 ++- .../operator/persistent/rel_batch_insert.cpp | 7 +- .../operator/persistent/set_executor.cpp | 22 ++- .../operator/scan/scan_multi_node_tables.cpp | 7 +- .../operator/scan/scan_multi_rel_tables.cpp | 14 +- .../operator/scan/scan_node_table.cpp | 4 +- .../operator/scan/scan_rel_table.cpp | 4 +- src/processor/operator/scan/scan_table.cpp | 4 +- src/storage/CMakeLists.txt | 2 +- .../local_storage/local_node_table.cpp | 44 +++++ src/storage/local_storage/local_rel_table.cpp | 73 +++++++- src/storage/local_storage/local_storage.cpp | 54 +++--- src/storage/local_storage/local_table.cpp | 45 ----- src/storage/storage_manager.cpp | 13 +- ...rage_info.cpp => storage_version_info.cpp} | 2 +- src/storage/store/node_table.cpp | 170 ++++++++++-------- src/storage/store/node_table_data.cpp | 57 ++---- src/storage/store/rel_table.cpp | 76 ++++---- src/storage/store/rel_table_data.cpp | 91 ++++------ src/storage/wal_replayer.cpp | 35 +--- src/transaction/transaction_context.cpp | 18 +- src/transaction/transaction_manager.cpp | 13 +- test/transaction/transaction_manager_test.cpp | 27 +-- tools/rust_api/include/kuzu_rs.h | 2 +- 61 files changed, 810 insertions(+), 578 deletions(-) rename src/include/storage/{storage_info.h => storage_version_info.h} (100%) rename src/storage/{storage_info.cpp => storage_version_info.cpp} (94%) diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index c687e12fb16..201ccaf838b 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -17,8 +17,8 @@ #include "common/serializer/deserializer.h" #include "common/serializer/serializer.h" #include "common/string_format.h" -#include "storage/storage_info.h" #include "storage/storage_utils.h" +#include "storage/storage_version_info.h" using namespace kuzu::binder; using namespace kuzu::common; diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index b5024f60579..792253c5eb2 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -3,6 +3,7 @@ #include "function/table/bind_input.h" #include "function/table/call_functions.h" #include "storage/storage_manager.h" +#include "storage/store/node_table.h" #include "storage/store/string_column.h" #include "storage/store/struct_column.h" #include "storage/store/var_list_column.h" @@ -218,9 +219,7 @@ static std::unique_ptr bindFunc( auto tableID = catalog->getTableID(context->getTx(), tableName); auto tableEntry = catalog->getTableCatalogEntry(context->getTx(), tableID); auto storageManager = context->getStorageManager(); - auto table = tableEntry->getTableType() == TableType::NODE ? - reinterpret_cast(storageManager->getNodeTable(tableID)) : - reinterpret_cast(storageManager->getRelTable(tableID)); + auto table = storageManager->getTable(tableID); return std::make_unique( std::move(columnTypes), std::move(columnNames), tableEntry, table, context); } diff --git a/src/include/processor/operator/persistent/insert_executor.h b/src/include/processor/operator/persistent/insert_executor.h index 37164743dff..85f9f9f6196 100644 --- a/src/include/processor/operator/persistent/insert_executor.h +++ b/src/include/processor/operator/persistent/insert_executor.h @@ -9,7 +9,6 @@ namespace kuzu { namespace processor { -// TODO(Guodong): the following class should be moved to storage. class NodeInsertExecutor { public: NodeInsertExecutor(storage::NodeTable* table, @@ -32,6 +31,9 @@ class NodeInsertExecutor { private: NodeInsertExecutor(const NodeInsertExecutor& other); + bool checkConfict(transaction::Transaction* transaction); + void writeResult(); + private: // Node table to insert. storage::NodeTable* table; @@ -70,6 +72,8 @@ class RelInsertExecutor { private: RelInsertExecutor(const RelInsertExecutor& other); + void writeResult(); + private: storage::RelsStoreStats* relsStatistics; storage::RelTable* table; diff --git a/src/include/processor/operator/scan/scan_multi_node_tables.h b/src/include/processor/operator/scan/scan_multi_node_tables.h index 09919e8aeb6..5fdc10c9e14 100644 --- a/src/include/processor/operator/scan/scan_multi_node_tables.h +++ b/src/include/processor/operator/scan/scan_multi_node_tables.h @@ -17,8 +17,9 @@ class ScanMultiNodeTables : public ScanTable { inline void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override { ScanTable::initLocalStateInternal(resultSet, context); - for (auto& [tableID, _] : tables) { - readStates[tableID] = std::make_unique(); + for (auto& [tableID, scanInfo] : tables) { + readStates[tableID] = std::make_unique( + *inVector, scanInfo->columnIDs, outVectors); } } bool getNextTuplesInternal(ExecutionContext* context) override; diff --git a/src/include/processor/operator/scan/scan_multi_rel_tables.h b/src/include/processor/operator/scan/scan_multi_rel_tables.h index 1e6f98c3b6b..4de085f3c9a 100644 --- a/src/include/processor/operator/scan/scan_multi_rel_tables.h +++ b/src/include/processor/operator/scan/scan_multi_rel_tables.h @@ -15,7 +15,8 @@ class RelTableCollectionScanner { nextTableIdx = 0; } - void init(); + void init( + common::ValueVector* inVector, const std::vector& outputVectors); bool scan(common::ValueVector* inVector, const std::vector& outputVectors, transaction::Transaction* transaction); @@ -23,7 +24,7 @@ class RelTableCollectionScanner { private: std::vector> scanInfos; - std::vector> readStates; + std::vector> readStates; uint32_t currentTableIdx = UINT32_MAX; uint32_t nextTableIdx = 0; }; diff --git a/src/include/processor/operator/scan/scan_node_table.h b/src/include/processor/operator/scan/scan_node_table.h index 9edf6fbc5fb..099ed5364fd 100644 --- a/src/include/processor/operator/scan/scan_node_table.h +++ b/src/include/processor/operator/scan/scan_node_table.h @@ -33,7 +33,8 @@ class ScanSingleNodeTable : public ScanTable { inline void initLocalStateInternal( ResultSet* resultSet, ExecutionContext* executionContext) final { ScanTable::initLocalStateInternal(resultSet, executionContext); - readState = std::make_unique(); + readState = + std::make_unique(*inVector, info->columnIDs, outVectors); } bool getNextTuplesInternal(ExecutionContext* context) override; diff --git a/src/include/processor/operator/scan/scan_rel_table.h b/src/include/processor/operator/scan/scan_rel_table.h index 42ae44b76d6..17a0ceb8ed4 100644 --- a/src/include/processor/operator/scan/scan_rel_table.h +++ b/src/include/processor/operator/scan/scan_rel_table.h @@ -28,11 +28,18 @@ class ScanRelTable : public ScanTable { std::vector outVectorsPos, std::unique_ptr child, uint32_t id, const std::string& paramsString) : ScanRelTable{PhysicalOperatorType::SCAN_REL_TABLE, std::move(info), inVectorPos, - std::move(outVectorsPos), std::move(child), id, paramsString} { - scanState = std::make_unique(); - } + std::move(outVectorsPos), std::move(child), id, paramsString} {} ~ScanRelTable() override = default; + inline void initLocalStateInternal( + ResultSet* resultSet, ExecutionContext* executionContext) override { + ScanTable::initLocalStateInternal(resultSet, executionContext); + if (info) { + scanState = std::make_unique( + *inVector, info->columnIDs, outVectors, info->direction); + } + } + bool getNextTuplesInternal(ExecutionContext* context) override; inline std::unique_ptr clone() override { @@ -50,7 +57,7 @@ class ScanRelTable : public ScanTable { protected: std::unique_ptr info; - std::unique_ptr scanState; + std::unique_ptr scanState; }; } // namespace processor diff --git a/src/include/storage/local_storage/local_node_table.h b/src/include/storage/local_storage/local_node_table.h index e36f0a12acd..5d683480f37 100644 --- a/src/include/storage/local_storage/local_node_table.h +++ b/src/include/storage/local_storage/local_node_table.h @@ -50,5 +50,23 @@ class LocalNodeTableData final : public LocalTableData { LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) override; }; +class LocalNodeTable final : public LocalTable { +public: + explicit LocalNodeTable(Table& table); + + bool insert(TableInsertState& insertState) override; + bool update(TableUpdateState& updateState) override; + bool delete_(TableDeleteState& deleteState) override; + + void scan(TableReadState& state) override; + void lookup(TableReadState& state) override; + + LocalNodeTableData* getTableData() { + KU_ASSERT(localTableDataCollection.size() == 1); + return common::ku_dynamic_cast( + localTableDataCollection[0].get()); + } +}; + } // namespace storage } // namespace kuzu diff --git a/src/include/storage/local_storage/local_rel_table.h b/src/include/storage/local_storage/local_rel_table.h index 8e91853bb60..c8b7dd2e9ea 100644 --- a/src/include/storage/local_storage/local_rel_table.h +++ b/src/include/storage/local_storage/local_rel_table.h @@ -1,7 +1,7 @@ #pragma once #include "common/copy_constructors.h" -#include "common/enums/rel_multiplicity.h" +#include "common/enums/rel_direction.h" #include "common/vector/value_vector.h" #include "storage/local_storage/local_table.h" @@ -15,8 +15,7 @@ class LocalRelNG final : public LocalNodeGroup { friend class RelTableData; public: - LocalRelNG(common::offset_t nodeGroupStartOffset, std::vector dataTypes, - common::RelMultiplicity multiplicity); + LocalRelNG(common::offset_t nodeGroupStartOffset, std::vector dataTypes); DELETE_COPY_DEFAULT_MOVE(LocalRelNG); common::row_idx_t scanCSR(common::offset_t srcOffset, common::offset_t posToReadForOffset, @@ -46,24 +45,36 @@ class LocalRelNG final : public LocalNodeGroup { void applyCSRUpdates(common::column_id_t columnID, common::ValueVector* relIDVector, common::ValueVector* outputVector); void applyCSRDeletions(common::offset_t srcOffsetInChunk, common::ValueVector* relIDVector); - -private: - common::RelMultiplicity multiplicity; }; class LocalRelTableData final : public LocalTableData { friend class RelTableData; public: - LocalRelTableData( - common::RelMultiplicity multiplicity, std::vector dataTypes) - : LocalTableData{std::move(dataTypes)}, multiplicity{multiplicity} {} + explicit LocalRelTableData(std::vector dataTypes) + : LocalTableData{std::move(dataTypes)} {} private: LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector) override; +}; -private: - common::RelMultiplicity multiplicity; +class LocalRelTable final : public LocalTable { +public: + explicit LocalRelTable(Table& table); + + bool insert(TableInsertState& insertState) override; + bool update(TableUpdateState& updateState) override; + bool delete_(TableDeleteState& deleteState) override; + + void scan(TableReadState& state) override; + void lookup(TableReadState& state) override; + + LocalRelTableData* getTableData(common::RelDataDirection direction) { + KU_ASSERT(localTableDataCollection.size() == 2); + return common::ku_dynamic_cast( + direction == common::RelDataDirection::FWD ? localTableDataCollection[0].get() : + localTableDataCollection[1].get()); + } }; } // namespace storage diff --git a/src/include/storage/local_storage/local_storage.h b/src/include/storage/local_storage/local_storage.h index 539c4f9306a..2b31309fb61 100644 --- a/src/include/storage/local_storage/local_storage.h +++ b/src/include/storage/local_storage/local_storage.h @@ -6,6 +6,9 @@ #include "storage/local_storage/local_table.h" namespace kuzu { +namespace main { +class ClientContext; +} // namespace main namespace storage { // Data structures in LocalStorage are not thread-safe. @@ -14,20 +17,19 @@ namespace storage { // thread-safe. class LocalStorage { public: - explicit LocalStorage() {} + enum class NotExistAction { CREATE, RETURN_NULL }; + + explicit LocalStorage(main::ClientContext& clientContext) : clientContext{clientContext} {} DELETE_COPY_AND_MOVE(LocalStorage); - // This function will create the local table data if not exists. - LocalTableData* getOrCreateLocalTableData(common::table_id_t tableID, - const std::vector>& columns, - common::TableType tableType = common::TableType::NODE, common::vector_idx_t dataIdx = 0, - common::RelMultiplicity multiplicity = common::RelMultiplicity::MANY); - LocalTable* getLocalTable(common::table_id_t tableID); - // This function will return nullptr if the local table does not exist. - LocalTableData* getLocalTableData(common::table_id_t tableID, common::vector_idx_t dataIdx = 0); - std::unordered_set getTableIDsWithUpdates(); + LocalTable* getLocalTable( + common::table_id_t tableID, NotExistAction action = NotExistAction::RETURN_NULL); + + void prepareCommit(); + void prepareRollback(); private: + main::ClientContext& clientContext; std::unordered_map> tables; }; diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index 0cd71678dd0..39bd2defeb7 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -2,8 +2,6 @@ #include -#include "common/enums/rel_multiplicity.h" -#include "common/enums/table_type.h" #include "common/vector/value_vector.h" #include "storage/store/chunked_node_group_collection.h" @@ -198,20 +196,29 @@ class LocalTableData { std::unordered_map> nodeGroups; }; -class Column; +struct TableInsertState; +struct TableUpdateState; +struct TableDeleteState; +struct TableReadState; +class Table; class LocalTable { public: - explicit LocalTable(common::TableType tableType) : tableType{tableType} {}; + virtual ~LocalTable() = default; - LocalTableData* getOrCreateLocalTableData(const std::vector>& columns, - common::vector_idx_t dataIdx, common::RelMultiplicity multiplicity); - inline LocalTableData* getLocalTableData(common::vector_idx_t dataIdx) { - KU_ASSERT(dataIdx < localTableDataCollection.size()); - return localTableDataCollection[dataIdx].get(); - } + virtual bool insert(TableInsertState& insertState) = 0; + virtual bool update(TableUpdateState& updateState) = 0; + virtual bool delete_(TableDeleteState& deleteState) = 0; -private: - common::TableType tableType; + virtual void scan(TableReadState& state) = 0; + virtual void lookup(TableReadState& state) = 0; + + inline void clear() { localTableDataCollection.clear(); } + +protected: + explicit LocalTable(Table& table) : table{table} {} + +protected: + Table& table; // For a node table, it should only contain one LocalTableData, while a rel table should contain // two, one for each direction. std::vector> localTableDataCollection; diff --git a/src/include/storage/storage_manager.h b/src/include/storage/storage_manager.h index 1e912987ea4..a65bb490537 100644 --- a/src/include/storage/storage_manager.h +++ b/src/include/storage/storage_manager.h @@ -4,7 +4,6 @@ #include "storage/index/hash_index.h" #include "storage/stats/nodes_store_statistics.h" #include "storage/stats/rels_store_statistics.h" -#include "storage/store/node_table.h" #include "storage/store/rel_table.h" #include "storage/wal/wal.h" @@ -27,17 +26,9 @@ class StorageManager { PrimaryKeyIndex* getPKIndex(common::table_id_t tableID); - inline NodeTable* getNodeTable(common::table_id_t tableID) const { - KU_ASSERT(tables.contains(tableID) && - tables.at(tableID)->getTableType() == common::TableType::NODE); - auto table = common::ku_dynamic_cast(tables.at(tableID).get()); - return table; - } - inline RelTable* getRelTable(common::table_id_t tableID) const { - KU_ASSERT(tables.contains(tableID) && - tables.at(tableID)->getTableType() == common::TableType::REL); - auto table = common::ku_dynamic_cast(tables.at(tableID).get()); - return table; + inline Table* getTable(common::table_id_t tableID) const { + KU_ASSERT(tables.contains(tableID)); + return tables.at(tableID).get(); } inline WAL* getWAL() const { return wal; } diff --git a/src/include/storage/storage_info.h b/src/include/storage/storage_version_info.h similarity index 100% rename from src/include/storage/storage_info.h rename to src/include/storage/storage_version_info.h diff --git a/src/include/storage/store/node_table.h b/src/include/storage/store/node_table.h index 2fa42152626..d24b7d82e62 100644 --- a/src/include/storage/store/node_table.h +++ b/src/include/storage/store/node_table.h @@ -11,11 +11,35 @@ #include "storage/store/table.h" namespace kuzu { -namespace catalog { -class NodeTableSchema; -} namespace storage { +struct NodeTableInsertState : public TableInsertState { + common::ValueVector& nodeIDVector; + const common::ValueVector& pkVector; + + NodeTableInsertState(common::ValueVector& nodeIDVector, const common::ValueVector& pkVector, + const std::vector& propertyVectors) + : TableInsertState{std::move(propertyVectors)}, nodeIDVector{nodeIDVector}, pkVector{ + pkVector} {} +}; + +struct NodeTableUpdateState : public TableUpdateState { + const common::ValueVector& nodeIDVector; + + NodeTableUpdateState(common::column_id_t columnID, const common::ValueVector& nodeIDVector, + const common::ValueVector& propertyVector) + : TableUpdateState{columnID, propertyVector}, nodeIDVector{nodeIDVector} {} +}; + +struct NodeTableDeleteState : public TableDeleteState { + const common::ValueVector& nodeIDVector; + common::ValueVector& pkVector; + + explicit NodeTableDeleteState( + const common::ValueVector& nodeIDVector, common::ValueVector& pkVector) + : nodeIDVector{nodeIDVector}, pkVector{pkVector} {} +}; + class NodeTable final : public Table { public: NodeTable(BMFileHandle* dataFH, BMFileHandle* metadataFH, @@ -39,52 +63,53 @@ class NodeTable final : public Table { } inline void initializeReadState(transaction::Transaction* transaction, - std::vector columnIDs, common::ValueVector* inNodeIDVector, - TableReadState* readState) { + std::vector columnIDs, const common::ValueVector& inNodeIDVector, + TableReadState& readState) { tableData->initializeReadState( - transaction, std::move(columnIDs), inNodeIDVector, readState); + transaction, std::move(columnIDs), inNodeIDVector, *readState.dataReadState); } - void read(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* nodeIDVector, - const std::vector& outputVectors) override; + void read(transaction::Transaction* transaction, TableReadState& readState) override; // Return the max node offset during insertions. - common::offset_t validateUniquenessConstraint( - transaction::Transaction* tx, const std::vector& propertyVectors); - common::offset_t insert(transaction::Transaction* tx, common::ValueVector* nodeIDVector, + common::offset_t validateUniquenessConstraint(transaction::Transaction* transaction, const std::vector& propertyVectors); - void update(transaction::Transaction* transaction, common::column_id_t columnID, - common::ValueVector* nodeIDVector, common::ValueVector* propertyVector); - void delete_(transaction::Transaction* transaction, common::ValueVector* nodeIDVector, - common::ValueVector* pkVector); - inline void append(ChunkedNodeGroup* nodeGroup) { tableData->append(nodeGroup); } - inline common::column_id_t getNumColumns() const { return tableData->getNumColumns(); } - inline Column* getColumn(common::column_id_t columnID) { - return tableData->getColumn(columnID); + void insert(transaction::Transaction* transaction, TableInsertState& insertState) override; + void update(transaction::Transaction* transaction, TableUpdateState& updateState) override; + void delete_(transaction::Transaction* transaction, TableDeleteState& deleteState) override; + + void addColumn(transaction::Transaction* transaction, const catalog::Property& property, + common::ValueVector* defaultValueVector) override; + inline void dropColumn(common::column_id_t columnID) override { + tableData->dropColumn(columnID); } + inline common::column_id_t getPKColumnID() const { return pkColumnID; } inline PrimaryKeyIndex* getPKIndex() const { return pkIndex.get(); } inline NodesStoreStatsAndDeletedIDs* getNodeStatisticsAndDeletedIDs() const { return common::ku_dynamic_cast( tablesStatistics); } - - void addColumn(transaction::Transaction* transaction, const catalog::Property& property, - common::ValueVector* defaultValueVector) override; - inline void dropColumn(common::column_id_t columnID) override { - tableData->dropColumn(columnID); + inline common::column_id_t getNumColumns() const { return tableData->getNumColumns(); } + inline Column* getColumn(common::column_id_t columnID) { + return tableData->getColumn(columnID); } + inline void append(ChunkedNodeGroup* nodeGroup) { tableData->append(nodeGroup); } + void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) override; - void prepareRollback(LocalTableData* localTable) override; + void prepareRollback(LocalTable* localTable) override; void checkpointInMemory() override; void rollbackInMemory() override; private: void updatePK(transaction::Transaction* transaction, common::column_id_t columnID, - common::ValueVector* nodeIDVector, common::ValueVector* pkVector); - void insertPK(common::ValueVector* nodeIDVector, common::ValueVector* primaryKeyVector); + const common::ValueVector& nodeIDVector, const common::ValueVector& pkVector); + void insertPK( + const common::ValueVector& nodeIDVector, const common::ValueVector& primaryKeyVector); + + void scan(transaction::Transaction* transaction, TableReadState& readState); + void lookup(transaction::Transaction* transaction, TableReadState& readState); private: std::unique_ptr tableData; diff --git a/src/include/storage/store/node_table_data.h b/src/include/storage/store/node_table_data.h index e283e7cc376..5686af1b82a 100644 --- a/src/include/storage/store/node_table_data.h +++ b/src/include/storage/store/node_table_data.h @@ -16,25 +16,18 @@ class NodeTableData final : public TableData { // This interface is node table specific, as rel table requires also relDataDirection. inline virtual void initializeReadState(transaction::Transaction* /*transaction*/, - std::vector columnIDs, common::ValueVector* /*inNodeIDVector*/, - TableReadState* readState) { - readState->columnIDs = std::move(columnIDs); + std::vector columnIDs, const common::ValueVector& /*inNodeIDVector*/, + TableDataReadState& readState) { + readState.columnIDs = columnIDs; } - void scan(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* nodeIDVector, + + void scan(transaction::Transaction* transaction, TableDataReadState& readState, + const common::ValueVector& nodeIDVector, const std::vector& outputVectors) override; - void lookup(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* nodeIDVector, + void lookup(transaction::Transaction* transaction, TableDataReadState& readState, + const common::ValueVector& nodeIDVector, const std::vector& outputVectors) override; - // These interfaces are node table specific, as rel table requires also relIDVector. - // insert/update/delete_ keeps changes inside the local storage. - void insert(transaction::Transaction* transaction, common::ValueVector* nodeIDVector, - const std::vector& propertyVectors); - void update(transaction::Transaction* transaction, common::column_id_t columnID, - common::ValueVector* nodeIDVector, common::ValueVector* propertyVector); - void delete_(transaction::Transaction* transaction, common::ValueVector* nodeIDVector); - // Flush the nodeGroup to disk and update metadataDAs. void append(ChunkedNodeGroup* nodeGroup) override; diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index a078ddf1a21..1d2994d1aca 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -1,13 +1,64 @@ #pragma once #include "catalog/catalog_entry/rel_table_catalog_entry.h" -#include "storage/stats/rel_table_statistics.h" #include "storage/store/rel_table_data.h" #include "storage/store/table.h" namespace kuzu { namespace storage { +struct RelTableReadState : public TableReadState { + common::RelDataDirection direction; + + RelTableReadState(const common::ValueVector& nodeIDVector, + const std::vector& columnIDs, + const std::vector& outputVectors, common::RelDataDirection direction) + : TableReadState{nodeIDVector, columnIDs, outputVectors}, direction{direction} { + dataReadState = std::make_unique(); + } + + bool hasMoreToRead(transaction::Transaction* transaction) const { + auto relDataReadState = + common::ku_dynamic_cast(dataReadState.get()); + return relDataReadState->hasMoreToRead(transaction); + } +}; + +struct RelTableInsertState : public TableInsertState { + const common::ValueVector& srcNodeIDVector; + const common::ValueVector& dstNodeIDVector; + + RelTableInsertState(const common::ValueVector& srcNodeIDVector, + const common::ValueVector& dstNodeIDVector, + const std::vector& propertyVectors) + : TableInsertState{std::move(propertyVectors)}, srcNodeIDVector{srcNodeIDVector}, + dstNodeIDVector{dstNodeIDVector} {} +}; + +struct RelTableUpdateState : public TableUpdateState { + const common::ValueVector& srcNodeIDVector; + const common::ValueVector& dstNodeIDVector; + const common::ValueVector& relIDVector; + + RelTableUpdateState(common::column_id_t columnID, const common::ValueVector& srcNodeIDVector, + const common::ValueVector& dstNodeIDVector, const common::ValueVector& relIDVector, + const common::ValueVector& propertyVector) + : TableUpdateState{columnID, propertyVector}, srcNodeIDVector{srcNodeIDVector}, + dstNodeIDVector{dstNodeIDVector}, relIDVector{relIDVector} {} +}; + +struct RelTableDeleteState : public TableDeleteState { + const common::ValueVector& srcNodeIDVector; + const common::ValueVector& dstNodeIDVector; + const common::ValueVector& relIDVector; + + RelTableDeleteState(const common::ValueVector& srcNodeIDVector, + const common::ValueVector& dstNodeIDVector, const common::ValueVector& relIDVector) + : srcNodeIDVector{srcNodeIDVector}, dstNodeIDVector{dstNodeIDVector}, relIDVector{ + relIDVector} {} +}; + +// TODO(Guodong): Should move inside RelTableDeleteState. struct RelDetachDeleteState { std::unique_ptr dstNodeIDVector; std::unique_ptr relIDVector; @@ -24,25 +75,24 @@ class RelTable final : public Table { inline void initializeReadState(transaction::Transaction* transaction, common::RelDataDirection direction, const std::vector& columnIDs, - common::ValueVector* inNodeIDVector, RelDataReadState* readState) { + const common::ValueVector& inNodeIDVector, RelTableReadState& readState) { + if (!readState.dataReadState) { + readState.dataReadState = std::make_unique(); + } return direction == common::RelDataDirection::FWD ? - fwdRelTableData->initializeReadState( - transaction, columnIDs, inNodeIDVector, readState) : - bwdRelTableData->initializeReadState( - transaction, columnIDs, inNodeIDVector, readState); + fwdRelTableData->initializeReadState(transaction, columnIDs, inNodeIDVector, + common::ku_dynamic_cast( + *readState.dataReadState)) : + bwdRelTableData->initializeReadState(transaction, columnIDs, inNodeIDVector, + common::ku_dynamic_cast( + *readState.dataReadState)); } - void read(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* inNodeIDVector, - const std::vector& outputVectors) override; - - void insert(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, - common::ValueVector* dstNodeIDVector, - const std::vector& propertyVectors); - void update(transaction::Transaction* transaction, common::column_id_t columnID, - common::ValueVector* srcNodeIDVector, common::ValueVector* dstNodeIDVector, - common::ValueVector* relIDVector, common::ValueVector* propertyVector); - void delete_(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, - common::ValueVector* dstNodeIDVector, common::ValueVector* relIDVector); + void read(transaction::Transaction* transaction, TableReadState& readState) override; + + void insert(transaction::Transaction* transaction, TableInsertState& insertState) override; + void update(transaction::Transaction* transaction, TableUpdateState& updateState) override; + void delete_(transaction::Transaction* transaction, TableDeleteState& deleteState) override; + void detachDelete(transaction::Transaction* transaction, common::RelDataDirection direction, common::ValueVector* srcNodeIDVector, RelDetachDeleteState* deleteState); void checkIfNodeHasRels(transaction::Transaction* transaction, @@ -89,7 +139,7 @@ class RelTable final : public Table { } void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) override; - void prepareRollback(LocalTableData* localTable) override; + void prepareRollback(LocalTable* localTable) override; void checkpointInMemory() override; void rollbackInMemory() override; @@ -99,13 +149,11 @@ class RelTable final : public Table { } private: - void scan(transaction::Transaction* transaction, RelDataReadState& scanState, - common::ValueVector* inNodeIDVector, - const std::vector& outputVectors); + void scan(transaction::Transaction* transaction, RelTableReadState& scanState); common::row_idx_t detachDeleteForCSRRels(transaction::Transaction* transaction, RelTableData* tableData, RelTableData* reverseTableData, - common::ValueVector* srcNodeIDVector, RelDataReadState* relDataReadState, + common::ValueVector* srcNodeIDVector, RelTableReadState* relDataReadState, RelDetachDeleteState* deleteState); private: diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index f4dfe259aa1..c8b48385d17 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -10,7 +10,7 @@ namespace storage { using density_range_t = std::pair; class LocalRelNG; -struct RelDataReadState : public TableReadState { +struct RelDataReadState : public TableDataReadState { common::RelDataDirection direction; common::offset_t startNodeOffset; common::offset_t numNodes; @@ -133,21 +133,16 @@ class RelTableData final : public TableData { common::RelDataDirection direction, bool enableCompression); void initializeReadState(transaction::Transaction* transaction, - std::vector columnIDs, common::ValueVector* inNodeIDVector, - RelDataReadState* readState); - void scan(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* inNodeIDVector, + std::vector columnIDs, const common::ValueVector& inNodeIDVector, + RelDataReadState& readState); + void scan(transaction::Transaction* transaction, TableDataReadState& readState, + const common::ValueVector& inNodeIDVector, const std::vector& outputVectors) override; - void lookup(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* inNodeIDVector, + void lookup(transaction::Transaction* transaction, TableDataReadState& readState, + const common::ValueVector& inNodeIDVector, const std::vector& outputVectors) override; - void insert(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, - common::ValueVector* dstNodeIDVector, - const std::vector& propertyVectors); - void update(transaction::Transaction* transaction, common::column_id_t columnID, - common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, - common::ValueVector* propertyVector); + // TODO: Should be removed. This is used by detachDelete for now. bool delete_(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); diff --git a/src/include/storage/store/table.h b/src/include/storage/store/table.h index 8711e928f01..c5d9ad4dadf 100644 --- a/src/include/storage/store/table.h +++ b/src/include/storage/store/table.h @@ -7,8 +7,44 @@ namespace kuzu { namespace storage { -class LocalTable; +struct TableReadState { + const common::ValueVector& nodeIDVector; + std::vector columnIDs; + const std::vector& outputVectors; + std::unique_ptr dataReadState; + + TableReadState(const common::ValueVector& nodeIDVector, + const std::vector& columnIDs, + const std::vector& outputVectors) + : nodeIDVector{nodeIDVector}, columnIDs{std::move(columnIDs)}, outputVectors{ + outputVectors} { + dataReadState = std::make_unique(); + } + virtual ~TableReadState() = default; +}; + +struct TableInsertState { + const std::vector& propertyVectors; + + explicit TableInsertState(const std::vector& propertyVectors) + : propertyVectors{propertyVectors} {} + virtual ~TableInsertState() = default; +}; +struct TableUpdateState { + common::column_id_t columnID; + const common::ValueVector& propertyVector; + + TableUpdateState(common::column_id_t columnID, const common::ValueVector& propertyVector) + : columnID{columnID}, propertyVector{propertyVector} {} + virtual ~TableUpdateState() = default; +}; + +struct TableDeleteState { + virtual ~TableDeleteState() = default; +}; + +class LocalTable; class Table { public: Table(catalog::TableCatalogEntry* tableEntry, TablesStatistics* tablesStatistics, @@ -28,16 +64,18 @@ class Table { tablesStatistics->updateNumTuplesByValue(tableID, numTuples); } - virtual void read(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* inNodeIDVector, - const std::vector& outputVectors) = 0; + virtual void read(transaction::Transaction* transaction, TableReadState& readState) = 0; + + virtual void insert(transaction::Transaction* transaction, TableInsertState& insertState) = 0; + virtual void update(transaction::Transaction* transaction, TableUpdateState& updateState) = 0; + virtual void delete_(transaction::Transaction* transaction, TableDeleteState& deleteState) = 0; virtual void addColumn(transaction::Transaction* transaction, const catalog::Property& property, common::ValueVector* defaultValueVector) = 0; virtual void dropColumn(common::column_id_t columnID) = 0; virtual void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) = 0; - virtual void prepareRollback(LocalTableData* localTable) = 0; + virtual void prepareRollback(LocalTable* localTable) = 0; virtual void checkpointInMemory() = 0; virtual void rollbackInMemory() = 0; diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index 533ba81e946..ac0606bd864 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -6,8 +6,8 @@ namespace kuzu { namespace storage { -struct TableReadState { - virtual ~TableReadState() = default; +struct TableDataReadState { + virtual ~TableDataReadState() = default; std::vector columnIDs; }; @@ -17,11 +17,11 @@ class TableData { public: virtual ~TableData() = default; - virtual void scan(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* nodeIDVector, + virtual void scan(transaction::Transaction* transaction, TableDataReadState& readState, + const common::ValueVector& nodeIDVector, const std::vector& outputVectors) = 0; - virtual void lookup(transaction::Transaction* transaction, TableReadState& readState, - common::ValueVector* nodeIDVector, + virtual void lookup(transaction::Transaction* transaction, TableDataReadState& readState, + const common::ValueVector& nodeIDVector, const std::vector& outputVectors) = 0; virtual void append(ChunkedNodeGroup* nodeGroup) = 0; diff --git a/src/include/transaction/transaction.h b/src/include/transaction/transaction.h index f23bd14f09a..6ad1ab41411 100644 --- a/src/include/transaction/transaction.h +++ b/src/include/transaction/transaction.h @@ -5,6 +5,9 @@ #include "storage/local_storage/local_storage.h" namespace kuzu { +namespace main { +class ClientContext; +} // namespace main namespace storage { class LocalStorage; } // namespace storage @@ -18,9 +21,10 @@ class Transaction { friend class TransactionManager; public: - Transaction(TransactionType transactionType, uint64_t transactionID) + Transaction( + main::ClientContext& clientContext, TransactionType transactionType, uint64_t transactionID) : type{transactionType}, ID{transactionID} { - localStorage = std::make_unique(); + localStorage = std::make_unique(clientContext); } constexpr explicit Transaction(TransactionType transactionType) noexcept diff --git a/src/include/transaction/transaction_context.h b/src/include/transaction/transaction_context.h index 4d3f367e11a..05f1549e44e 100644 --- a/src/include/transaction/transaction_context.h +++ b/src/include/transaction/transaction_context.h @@ -4,7 +4,7 @@ namespace kuzu { namespace main { -class Database; +class ClientContext; } namespace transaction { @@ -29,7 +29,7 @@ enum class TransactionMode : uint8_t { AUTO = 0, MANUAL = 1 }; class TransactionContext { public: - explicit TransactionContext(main::Database* database); + explicit TransactionContext(main::ClientContext& clientContext); ~TransactionContext(); inline bool isAutoTransaction() const { return mode == TransactionMode::AUTO; } @@ -57,7 +57,7 @@ class TransactionContext { private: std::mutex mtx; - main::Database* database; + main::ClientContext& clientContext; TransactionMode mode; std::unique_ptr activeTransaction; }; diff --git a/src/include/transaction/transaction_manager.h b/src/include/transaction/transaction_manager.h index 99dc0941c97..7e04f66e050 100644 --- a/src/include/transaction/transaction_manager.h +++ b/src/include/transaction/transaction_manager.h @@ -10,6 +10,9 @@ using lock_t = std::unique_lock; namespace kuzu { +namespace main { +class ClientContext; +} // namespace main namespace transaction { class TransactionManager { @@ -17,8 +20,8 @@ class TransactionManager { public: explicit TransactionManager(storage::WAL& wal) : wal{wal}, activeWriteTransactionID{INT64_MAX}, lastTransactionID{0}, lastCommitID{0} {}; - std::unique_ptr beginWriteTransaction(); - std::unique_ptr beginReadOnlyTransaction(); + std::unique_ptr beginWriteTransaction(main::ClientContext& clientContext); + std::unique_ptr beginReadOnlyTransaction(main::ClientContext& clientContext); void commit(Transaction* transaction); void commitButKeepActiveWriteTransaction(Transaction* transaction); void manuallyClearActiveWriteTransaction(Transaction* transaction); diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 2fbba58f515..6a809f69cd5 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -44,7 +44,7 @@ void ActiveQuery::reset() { ClientContext::ClientContext(Database* database) : database{database} { progressBar = std::make_unique(); - transactionContext = std::make_unique(database); + transactionContext = std::make_unique(*this); randomEngine = std::make_unique(); #if defined(_WIN32) config.homeDirectory = getEnvVariable("USERPROFILE"); diff --git a/src/main/storage_driver.cpp b/src/main/storage_driver.cpp index 819758cd8e4..b6930a49319 100644 --- a/src/main/storage_driver.cpp +++ b/src/main/storage_driver.cpp @@ -6,6 +6,7 @@ #include "common/vector/value_vector.h" #include "storage/storage_manager.h" #include "storage/storage_utils.h" +#include "storage/store/node_table.h" using namespace kuzu::common; using namespace kuzu::transaction; @@ -23,7 +24,7 @@ void StorageDriver::scan(const std::string& nodeName, const std::string& propert auto nodeTableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, nodeName); auto propertyID = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, nodeTableID) ->getPropertyID(propertyName); - auto nodeTable = storageManager->getNodeTable(nodeTableID); + auto nodeTable = ku_dynamic_cast(storageManager->getTable(nodeTableID)); auto column = nodeTable->getColumn(propertyID); auto current_buffer = result; std::vector threads; @@ -35,6 +36,8 @@ void StorageDriver::scan(const std::string& nodeName, const std::string& propert threads.emplace_back(&StorageDriver::scanColumn, this, dummyReadOnlyTransaction.get(), column, offsets, sizeToRead, current_buffer); offsets += sizeToRead; + // TODO(Guodong/Xiyang/Chang): StorageDriver should figure numBytesPerValue from logicalType + // and not rely on Column to provide this information. current_buffer += sizeToRead * column->getNumBytesPerValue(); sizeLeft -= sizeToRead; } diff --git a/src/main/version.cpp b/src/main/version.cpp index 440a0c2db23..18212896d19 100644 --- a/src/main/version.cpp +++ b/src/main/version.cpp @@ -1,6 +1,6 @@ #include "main/version.h" -#include "storage/storage_info.h" +#include "storage/storage_version_info.h" namespace kuzu { namespace main { diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index 7d9e8a30ace..506669cadec 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -104,7 +104,7 @@ std::unique_ptr PlanMapper::mapCopyNodeFrom(LogicalOperator* l ku_dynamic_cast(copyFromInfo->tableEntry); // Map reader. auto prevOperator = mapOperator(copyFrom->getChild(0).get()); - auto nodeTable = storageManager->getNodeTable(nodeTableEntry->getTableID()); + auto nodeTable = storageManager->getTable(nodeTableEntry->getTableID()); auto sharedState = std::make_shared( nodeTable, getSingleStringColumnFTable(), storageManager->getWAL()); if (prevOperator->getOperatorType() == PhysicalOperatorType::IN_QUERY_CALL) { @@ -195,16 +195,16 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator KU_ASSERT(partitioner->getOperatorType() == PhysicalOperatorType::PARTITIONER); auto partitionerSharedState = dynamic_cast(partitioner.get())->getSharedState(); auto storageManager = clientContext->getStorageManager(); - partitionerSharedState->srcNodeTable = - storageManager->getNodeTable(relTableEntry->getSrcTableID()); - partitionerSharedState->dstNodeTable = - storageManager->getNodeTable(relTableEntry->getDstTableID()); + partitionerSharedState->srcNodeTable = ku_dynamic_cast( + storageManager->getTable(relTableEntry->getSrcTableID())); + partitionerSharedState->dstNodeTable = ku_dynamic_cast( + storageManager->getTable(relTableEntry->getDstTableID())); // TODO(Guodong/Xiyang): This is a temp hack to set rel offset. KU_ASSERT(partitioner->getChild(0)->getChild(0)->getOperatorType() == PhysicalOperatorType::IN_QUERY_CALL); auto scanFile = ku_dynamic_cast(partitioner->getChild(0)->getChild(0)); - auto relTable = storageManager->getRelTable(relTableEntry->getTableID()); + auto relTable = storageManager->getTable(relTableEntry->getTableID()); scanFile->getSharedState()->nextRowIdx = relTable->getNumTuples(&transaction::DUMMY_WRITE_TRANSACTION); // TODO(Xiyang): Move binding of column types to binder. diff --git a/src/processor/map/map_delete.cpp b/src/processor/map/map_delete.cpp index 4f4c4fbc873..de7ac9bf8f8 100644 --- a/src/processor/map/map_delete.cpp +++ b/src/processor/map/map_delete.cpp @@ -25,16 +25,18 @@ static std::unique_ptr getNodeDeleteExecutor( auto tableEntry = catalog->getTableCatalogEntry(clientContext->getTx(), tableID); auto nodeTableEntry = ku_dynamic_cast(tableEntry); - auto table = storageManager->getNodeTable(tableID); + auto table = ku_dynamic_cast(storageManager->getTable(tableID)); auto fwdRelTableIDs = nodeTableEntry->getFwdRelTableIDSet(); auto bwdRelTableIDs = nodeTableEntry->getBwdRelTableIDSet(); std::unordered_set fwdRelTables; std::unordered_set bwdRelTables; for (auto relTableID : fwdRelTableIDs) { - fwdRelTables.insert(storageManager->getRelTable(relTableID)); + fwdRelTables.insert( + ku_dynamic_cast(storageManager->getTable(relTableID))); } for (auto relTableID : bwdRelTableIDs) { - bwdRelTables.insert(storageManager->getRelTable(relTableID)); + bwdRelTables.insert( + ku_dynamic_cast(storageManager->getTable(relTableID))); } tableIDToTableMap.insert({tableID, table}); tableIDToFwdRelTablesMap[tableID] = fwdRelTables; @@ -44,9 +46,10 @@ static std::unique_ptr getNodeDeleteExecutor( std::move(tableIDToFwdRelTablesMap), std::move(tableIDToBwdRelTablesMap), info->deleteType, nodeIDPos); } else { - auto table = storageManager->getNodeTable(info->node->getSingleTableID()); - auto tableEntry = - catalog->getTableCatalogEntry(clientContext->getTx(), info->node->getSingleTableID()); + auto table = ku_dynamic_cast( + storageManager->getTable(info->node->getSingleTableID())); + auto tableEntry = catalog->getTableCatalogEntry( + &transaction::DUMMY_READ_TRANSACTION, info->node->getSingleTableID()); auto nodeTableEntry = ku_dynamic_cast(tableEntry); auto fwdRelTableIDs = nodeTableEntry->getFwdRelTableIDSet(); @@ -54,10 +57,12 @@ static std::unique_ptr getNodeDeleteExecutor( std::unordered_set fwdRelTables; std::unordered_set bwdRelTables; for (auto tableID : fwdRelTableIDs) { - fwdRelTables.insert(storageManager->getRelTable(tableID)); + fwdRelTables.insert( + ku_dynamic_cast(storageManager->getTable(tableID))); } for (auto tableID : bwdRelTableIDs) { - bwdRelTables.insert(storageManager->getRelTable(tableID)); + bwdRelTables.insert( + ku_dynamic_cast(storageManager->getTable(tableID))); } return std::make_unique( table, std::move(fwdRelTables), std::move(bwdRelTables), info->deleteType, nodeIDPos); @@ -85,13 +90,14 @@ static std::unique_ptr getRelDeleteExecutor( if (rel.isMultiLabeled()) { std::unordered_map tableIDToTableMap; for (auto tableID : rel.getTableIDs()) { - auto table = storageManager.getRelTable(tableID); + auto table = ku_dynamic_cast(storageManager.getTable(tableID)); tableIDToTableMap.insert({tableID, table}); } return std::make_unique( std::move(tableIDToTableMap), srcNodePos, dstNodePos, relIDPos); } else { - auto table = storageManager.getRelTable(rel.getSingleTableID()); + auto table = + ku_dynamic_cast(storageManager.getTable(rel.getSingleTableID())); return std::make_unique( table, srcNodePos, dstNodePos, relIDPos); } diff --git a/src/processor/map/map_extend.cpp b/src/processor/map/map_extend.cpp index 3d5a99bb4a9..a80b6c091c7 100644 --- a/src/processor/map/map_extend.cpp +++ b/src/processor/map/map_extend.cpp @@ -18,7 +18,7 @@ static std::unique_ptr getRelTableScanInfo(TableCatalogEntry* RelDataDirection direction, StorageManager* storageManager, const expression_vector& properties) { auto relTableID = tableCatalogEntry->getTableID(); - auto relTable = storageManager->getRelTable(relTableID); + auto relTable = ku_dynamic_cast(storageManager->getTable(relTableID)); std::vector columnIDs; for (auto& property : properties) { auto propertyExpression = ku_dynamic_cast(property.get()); diff --git a/src/processor/map/map_index_scan_node.cpp b/src/processor/map/map_index_scan_node.cpp index bb8d2d9a3e4..96d12085878 100644 --- a/src/processor/map/map_index_scan_node.cpp +++ b/src/processor/map/map_index_scan_node.cpp @@ -3,6 +3,7 @@ #include "processor/operator/index_scan.h" #include "processor/plan_mapper.h" #include "storage/storage_manager.h" +#include "storage/store/node_table.h" using namespace kuzu::planner; @@ -21,7 +22,9 @@ std::unique_ptr PlanMapper::mapIndexScan( std::vector> indexLookupInfos; for (auto i = 0u; i < logicalIndexScan->getNumInfos(); ++i) { auto info = logicalIndexScan->getInfo(i); - auto storageIndex = storageManager->getNodeTable(info->nodeTableID)->getPKIndex(); + auto storageIndex = common::ku_dynamic_cast( + storageManager->getTable(info->nodeTableID)) + ->getPKIndex(); auto offsetPos = DataPos(outSchema->getExpressionPos(*info->offset)); auto keyPos = DataPos(outSchema->getExpressionPos(*info->key)); indexLookupInfos.push_back(std::make_unique( @@ -31,7 +34,8 @@ std::unique_ptr PlanMapper::mapIndexScan( getOperatorID(), logicalIndexScan->getExpressionsForPrinting()); } else { auto info = logicalIndexScan->getInfo(0); - auto nodeTable = storageManager->getNodeTable(info->nodeTableID); + auto nodeTable = common::ku_dynamic_cast( + storageManager->getTable(info->nodeTableID)); auto evaluator = ExpressionMapper::getEvaluator(info->key, inSchema); auto outDataPos = DataPos(outSchema->getExpressionPos(*info->offset)); return make_unique(nodeTable->getTableID(), nodeTable->getPKIndex(), diff --git a/src/processor/map/map_insert.cpp b/src/processor/map/map_insert.cpp index 1942050eb43..8b46256d1e3 100644 --- a/src/processor/map/map_insert.cpp +++ b/src/processor/map/map_insert.cpp @@ -33,7 +33,7 @@ std::unique_ptr PlanMapper::getNodeInsertExecutor( auto storageManager = clientContext->getStorageManager(); auto node = ku_dynamic_cast(info->pattern.get()); auto nodeTableID = node->getSingleTableID(); - auto table = storageManager->getNodeTable(nodeTableID); + auto table = ku_dynamic_cast(storageManager->getTable(nodeTableID)); std::unordered_set fwdRelTablesToInit; std::unordered_set bwdRelTablesToInit; auto tableCatalogEntry = @@ -43,10 +43,12 @@ std::unique_ptr PlanMapper::getNodeInsertExecutor( auto fwdRelTableIDs = nodeTableSchema->getFwdRelTableIDSet(); auto bwdRelTableIDs = nodeTableSchema->getBwdRelTableIDSet(); for (auto relTableID : fwdRelTableIDs) { - fwdRelTablesToInit.insert(storageManager->getRelTable(relTableID)); + fwdRelTablesToInit.insert( + ku_dynamic_cast(storageManager->getTable(relTableID))); } for (auto relTableID : bwdRelTableIDs) { - bwdRelTablesToInit.insert(storageManager->getRelTable(relTableID)); + bwdRelTablesToInit.insert( + ku_dynamic_cast(storageManager->getTable(relTableID))); } auto nodeIDPos = DataPos(outSchema.getExpressionPos(*node->getInternalID())); auto returnVectorsPos = populateReturnVectorsPos(*info, outSchema); @@ -66,7 +68,7 @@ std::unique_ptr PlanMapper::getRelInsertExecutor( auto storageManager = clientContext->getStorageManager(); auto rel = ku_dynamic_cast(info->pattern.get()); auto relTableID = rel->getSingleTableID(); - auto table = storageManager->getRelTable(relTableID); + auto table = ku_dynamic_cast(storageManager->getTable(relTableID)); auto srcNode = rel->getSrcNode(); auto dstNode = rel->getDstNode(); auto srcNodePos = DataPos(inSchema.getExpressionPos(*srcNode->getInternalID())); diff --git a/src/processor/map/map_recursive_extend.cpp b/src/processor/map/map_recursive_extend.cpp index e6a54ea432e..135823c696e 100644 --- a/src/processor/map/map_recursive_extend.cpp +++ b/src/processor/map/map_recursive_extend.cpp @@ -13,7 +13,8 @@ static std::shared_ptr createSharedState( const binder::NodeExpression& nbrNode, const storage::StorageManager& storageManager) { std::vector> semiMasks; for (auto tableID : nbrNode.getTableIDs()) { - auto nodeTable = storageManager.getNodeTable(tableID); + auto nodeTable = common::ku_dynamic_cast( + storageManager.getTable(tableID)); semiMasks.push_back(std::make_unique(nodeTable)); } return std::make_shared(std::move(semiMasks)); diff --git a/src/processor/map/map_scan_node.cpp b/src/processor/map/map_scan_node.cpp index 860f32ea6e2..ab304ef15c4 100644 --- a/src/processor/map/map_scan_node.cpp +++ b/src/processor/map/map_scan_node.cpp @@ -15,7 +15,8 @@ std::unique_ptr PlanMapper::mapScanInternalID(LogicalOperator* auto dataPos = DataPos(outSchema->getExpressionPos(*scan->getInternalID())); auto sharedState = std::make_shared(); for (auto& tableID : scan->getTableIDs()) { - auto nodeTable = clientContext->getStorageManager()->getNodeTable(tableID); + auto nodeTable = common::ku_dynamic_cast( + clientContext->getStorageManager()->getTable(tableID)); sharedState->addTableState(nodeTable); } return std::make_unique( diff --git a/src/processor/map/map_scan_node_property.cpp b/src/processor/map/map_scan_node_property.cpp index 80382f243de..bc8f3d7f4dc 100644 --- a/src/processor/map/map_scan_node_property.cpp +++ b/src/processor/map/map_scan_node_property.cpp @@ -38,7 +38,8 @@ std::unique_ptr PlanMapper::mapScanNodeProperty( } } tables.insert({tableID, std::make_unique( - clientContext->getStorageManager()->getNodeTable(tableID), + ku_dynamic_cast( + clientContext->getStorageManager()->getTable(tableID)), std::move(columns))}); } return std::make_unique(inputNodeIDVectorPos, std::move(outVectorsPos), @@ -58,7 +59,9 @@ std::unique_ptr PlanMapper::mapScanNodeProperty( } } auto info = std::make_unique( - clientContext->getStorageManager()->getNodeTable(tableID), std::move(columnIDs)); + ku_dynamic_cast( + clientContext->getStorageManager()->getTable(tableID)), + std::move(columnIDs)); return std::make_unique(std::move(info), inputNodeIDVectorPos, std::move(outVectorsPos), std::move(prevOperator), getOperatorID(), scanProperty.getExpressionsForPrinting()); diff --git a/src/processor/map/map_set.cpp b/src/processor/map/map_set.cpp index 5044fdd0f9a..f27d5d17ea7 100644 --- a/src/processor/map/map_set.cpp +++ b/src/processor/map/map_set.cpp @@ -4,12 +4,15 @@ #include "processor/operator/persistent/set.h" #include "processor/plan_mapper.h" #include "storage/storage_manager.h" +#include "storage/store/table.h" +#include "transaction/transaction.h" using namespace kuzu::binder; using namespace kuzu::common; using namespace kuzu::planner; using namespace kuzu::evaluator; using namespace kuzu::transaction; +using namespace kuzu::storage; namespace kuzu { namespace processor { @@ -33,8 +36,8 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( continue; } auto propertyID = property->getPropertyID(tableID); - auto table = storageManager->getNodeTable(tableID); - auto columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) + auto table = ku_dynamic_cast(storageManager->getTable(tableID)); + auto columnID = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID) ->getColumnID(propertyID); tableIDToSetInfo.insert({tableID, NodeSetInfo{table, columnID}}); } @@ -42,7 +45,7 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( std::move(tableIDToSetInfo), nodeIDPos, propertyPos, std::move(evaluator)); } else { auto tableID = node->getSingleTableID(); - auto table = storageManager->getNodeTable(tableID); + auto table = ku_dynamic_cast(storageManager->getTable(tableID)); auto columnID = INVALID_COLUMN_ID; if (property->hasPropertyID(tableID)) { auto propertyID = property->getPropertyID(tableID); @@ -81,13 +84,12 @@ std::unique_ptr PlanMapper::getRelSetExecutor( } auto evaluator = ExpressionMapper::getEvaluator(info->setItem.second, &inSchema); if (rel->isMultiLabeled()) { - std::unordered_map> - tableIDToTableAndColumnID; + std::unordered_map> tableIDToTableAndColumnID; for (auto tableID : rel->getTableIDs()) { if (!property->hasPropertyID(tableID)) { continue; } - auto table = storageManager->getRelTable(tableID); + auto table = ku_dynamic_cast(storageManager->getTable(tableID)); auto propertyID = property->getPropertyID(tableID); auto columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); @@ -97,7 +99,7 @@ std::unique_ptr PlanMapper::getRelSetExecutor( srcNodePos, dstNodePos, relIDPos, propertyPos, std::move(evaluator)); } else { auto tableID = rel->getSingleTableID(); - auto table = storageManager->getRelTable(tableID); + auto table = ku_dynamic_cast(storageManager->getTable(tableID)); auto columnID = common::INVALID_COLUMN_ID; if (property->hasPropertyID(tableID)) { auto propertyID = property->getPropertyID(tableID); diff --git a/src/processor/operator/ddl/add_node_property.cpp b/src/processor/operator/ddl/add_node_property.cpp index 1857df56a30..1bee0b5197b 100644 --- a/src/processor/operator/ddl/add_node_property.cpp +++ b/src/processor/operator/ddl/add_node_property.cpp @@ -13,7 +13,7 @@ void AddNodeProperty::executeDDLInternal(ExecutionContext* context) { auto schema = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); auto addedPropID = schema->getPropertyID(propertyName); auto addedProp = schema->getProperty(addedPropID); - storageManager->getNodeTable(tableID)->addColumn( + storageManager->getTable(tableID)->addColumn( context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); storageManager->getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); } diff --git a/src/processor/operator/ddl/add_rel_property.cpp b/src/processor/operator/ddl/add_rel_property.cpp index 80341e02e80..334a4f80da0 100644 --- a/src/processor/operator/ddl/add_rel_property.cpp +++ b/src/processor/operator/ddl/add_rel_property.cpp @@ -17,7 +17,7 @@ void AddRelProperty::executeDDLInternal(ExecutionContext* context) { auto tableSchema = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); auto addedPropertyID = tableSchema->getPropertyID(propertyName); auto addedProp = tableSchema->getProperty(addedPropertyID); - storageManager->getRelTable(tableID)->addColumn( + storageManager->getTable(tableID)->addColumn( context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); storageManager->getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); } diff --git a/src/processor/operator/persistent/delete_executor.cpp b/src/processor/operator/persistent/delete_executor.cpp index 5cdf314dba1..fcf6050146a 100644 --- a/src/processor/operator/persistent/delete_executor.cpp +++ b/src/processor/operator/persistent/delete_executor.cpp @@ -53,7 +53,8 @@ void SingleLabelNodeDeleteExecutor::delete_(ExecutionContext* context) { deleteFromRelTable(context, deleteType, RelDataDirection::BWD, relTable, nodeIDVector, detachDeleteState.get()); } - table->delete_(context->clientContext->getTx(), nodeIDVector, pkVector.get()); + auto deleteState = std::make_unique(*nodeIDVector, *pkVector); + table->delete_(context->clientContext->getTx(), *deleteState); } void MultiLabelNodeDeleteExecutor::init(ResultSet* resultSet, ExecutionContext* context) { @@ -91,8 +92,9 @@ void MultiLabelNodeDeleteExecutor::delete_(ExecutionContext* context) { deleteFromRelTable(context, deleteType, RelDataDirection::BWD, relTable, nodeIDVector, detachDeleteState.get()); } - table->delete_( - context->clientContext->getTx(), nodeIDVector, pkVectors.at(nodeID.tableID).get()); + auto deleteState = std::make_unique( + *nodeIDVector, *pkVectors.at(nodeID.tableID)); + table->delete_(context->clientContext->getTx(), *deleteState); } void RelDeleteExecutor::init(ResultSet* resultSet, ExecutionContext* /*context*/) { @@ -102,7 +104,9 @@ void RelDeleteExecutor::init(ResultSet* resultSet, ExecutionContext* /*context*/ } void SingleLabelRelDeleteExecutor::delete_(ExecutionContext* context) { - table->delete_(context->clientContext->getTx(), srcNodeIDVector, dstNodeIDVector, relIDVector); + auto deleteState = std::make_unique( + *srcNodeIDVector, *dstNodeIDVector, *relIDVector); + table->delete_(context->clientContext->getTx(), *deleteState); } void MultiLabelRelDeleteExecutor::delete_(ExecutionContext* context) { @@ -111,7 +115,9 @@ void MultiLabelRelDeleteExecutor::delete_(ExecutionContext* context) { auto relID = relIDVector->getValue(pos); KU_ASSERT(tableIDToTableMap.contains(relID.tableID)); auto table = tableIDToTableMap.at(relID.tableID); - table->delete_(context->clientContext->getTx(), srcNodeIDVector, dstNodeIDVector, relIDVector); + auto deleteState = std::make_unique( + *srcNodeIDVector, *dstNodeIDVector, *relIDVector); + table->delete_(context->clientContext->getTx(), *deleteState); } } // namespace processor diff --git a/src/processor/operator/persistent/insert_executor.cpp b/src/processor/operator/persistent/insert_executor.cpp index cdccf52dd5f..65e6b25a398 100644 --- a/src/processor/operator/persistent/insert_executor.cpp +++ b/src/processor/operator/persistent/insert_executor.cpp @@ -50,17 +50,31 @@ void NodeInsertExecutor::insert(Transaction* tx, ExecutionContext* context) { evaluator->evaluate(context->clientContext); } KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); + if (checkConfict(tx)) { + return; + } + // TODO: Move pkVector pos to info. + auto nodeInsertState = std::make_unique( + *nodeIDVector, *columnDataVectors[table->getPKColumnID()], columnDataVectors); + table->insert(tx, *nodeInsertState); + writeResult(); +} + +bool NodeInsertExecutor::checkConfict(Transaction* transaction) { if (conflictAction == ConflictAction::ON_CONFLICT_DO_NOTHING) { - auto off = table->validateUniquenessConstraint(tx, columnDataVectors); + auto off = table->validateUniquenessConstraint(transaction, columnDataVectors); if (off != INVALID_OFFSET) { // Conflict. Skip insertion. auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[0]; nodeIDVector->setNull(nodeIDPos, false); nodeIDVector->setValue(nodeIDPos, {off, table->getTableID()}); - return; + return true; } } - table->insert(tx, nodeIDVector, columnDataVectors); + return false; +} + +void NodeInsertExecutor::writeResult() { for (auto i = 0u; i < columnVectors.size(); ++i) { auto columnVector = columnVectors[i]; auto dataVector = columnDataVectors[i]; @@ -129,7 +143,13 @@ void RelInsertExecutor::insert(transaction::Transaction* tx, ExecutionContext* c for (auto i = 1u; i < columnDataEvaluators.size(); ++i) { columnDataEvaluators[i]->evaluate(context->clientContext); } - table->insert(tx, srcNodeIDVector, dstNodeIDVector, columnDataVectors); + auto insertState = std::make_unique( + *srcNodeIDVector, *dstNodeIDVector, columnDataVectors); + table->insert(tx, *insertState); + writeResult(); +} + +void RelInsertExecutor::writeResult() { for (auto i = 0u; i < columnVectors.size(); ++i) { auto columnVector = columnVectors[i]; auto dataVector = columnDataVectors[i]; diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index 0f483a8f742..d439cdc86e0 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -83,12 +83,7 @@ void RelBatchInsert::mergeNodeGroup(ExecutionContext* context, const RelBatchIns const PartitionerSharedState& partitionerSharedState) { auto relTable = ku_dynamic_cast(sharedState.table); auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(localState.nodeGroupIdx); - auto multiplicity = - ku_dynamic_cast( - relInfo.tableEntry) - ->getMultiplicity(relInfo.direction); - auto localNG = - std::make_unique(nodeGroupStartOffset, relInfo.columnTypes, multiplicity); + auto localNG = std::make_unique(nodeGroupStartOffset, relInfo.columnTypes); auto& partition = partitionerSharedState.getPartitionBuffer(relInfo.partitioningIdx, localState.nodeGroupIdx); auto& insertChunks = localNG->getInsesrtChunks(); diff --git a/src/processor/operator/persistent/set_executor.cpp b/src/processor/operator/persistent/set_executor.cpp index 67bd22ab82f..0d85229238b 100644 --- a/src/processor/operator/persistent/set_executor.cpp +++ b/src/processor/operator/persistent/set_executor.cpp @@ -51,8 +51,9 @@ void SingleLabelNodeSetExecutor::set(ExecutionContext* context) { KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); auto lhsPos = nodeIDVector->state->selVector->selectedPositions[0]; auto rhsPos = rhsVector->state->selVector->selectedPositions[0]; - setInfo.table->update( - context->clientContext->getTx(), setInfo.columnID, nodeIDVector, rhsVector); + auto updateState = std::make_unique( + setInfo.columnID, *nodeIDVector, *rhsVector); + setInfo.table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { writeToPropertyVector(nodeIDVector, lhsVector, lhsPos, rhsVector, rhsPos); } @@ -72,8 +73,9 @@ void MultiLabelNodeSetExecutor::set(ExecutionContext* context) { } auto rhsPos = rhsVector->state->selVector->selectedPositions[0]; auto& setInfo = tableIDToSetInfo.at(nodeID.tableID); - setInfo.table->update( - context->clientContext->getTx(), setInfo.columnID, nodeIDVector, rhsVector); + auto updateState = std::make_unique( + setInfo.columnID, *nodeIDVector, *rhsVector); + setInfo.table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { KU_ASSERT(lhsVector->state->selVector->selectedSize == 1); writeToPropertyVector(nodeIDVector, lhsVector, lhsPos, rhsVector, rhsPos); @@ -120,8 +122,9 @@ void SingleLabelRelSetExecutor::set(ExecutionContext* context) { return; } evaluator->evaluate(context->clientContext); - table->update(context->clientContext->getTx(), columnID, srcNodeIDVector, dstNodeIDVector, - relIDVector, rhsVector); + auto updateState = std::make_unique( + columnID, *srcNodeIDVector, *dstNodeIDVector, *relIDVector, *rhsVector); + table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { writeToPropertyVector(relIDVector, lhsVector, rhsVector); } @@ -138,9 +141,10 @@ void MultiLabelRelSetExecutor::set(ExecutionContext* context) { } return; } - auto [table, propertyID] = tableIDToTableAndColumnID.at(relID.tableID); - table->update(context->clientContext->getTx(), propertyID, srcNodeIDVector, dstNodeIDVector, - relIDVector, rhsVector); + auto [table, columnID] = tableIDToTableAndColumnID.at(relID.tableID); + auto updateState = std::make_unique( + columnID, *srcNodeIDVector, *dstNodeIDVector, *relIDVector, *rhsVector); + table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { writeToPropertyVector(relIDVector, lhsVector, rhsVector); } diff --git a/src/processor/operator/scan/scan_multi_node_tables.cpp b/src/processor/operator/scan/scan_multi_node_tables.cpp index 115853de4b7..555f0bf8fd8 100644 --- a/src/processor/operator/scan/scan_multi_node_tables.cpp +++ b/src/processor/operator/scan/scan_multi_node_tables.cpp @@ -13,10 +13,9 @@ bool ScanMultiNodeTables::getNextTuplesInternal(ExecutionContext* context) { inVector->getValue(inVector->state->selVector->selectedPositions[0]).tableID; KU_ASSERT(readStates.contains(tableID) && tables.contains(tableID)); auto scanTableInfo = tables.at(tableID).get(); - scanTableInfo->table->initializeReadState(context->clientContext->getTx(), - scanTableInfo->columnIDs, inVector, readStates[tableID].get()); - scanTableInfo->table->read( - context->clientContext->getTx(), *readStates.at(tableID), inVector, outVectors); + scanTableInfo->table->initializeReadState( + context->clientContext->getTx(), scanTableInfo->columnIDs, *inVector, *readStates[tableID]); + scanTableInfo->table->read(context->clientContext->getTx(), *readStates.at(tableID)); return true; } diff --git a/src/processor/operator/scan/scan_multi_rel_tables.cpp b/src/processor/operator/scan/scan_multi_rel_tables.cpp index ac2b3e04487..09be6645911 100644 --- a/src/processor/operator/scan/scan_multi_rel_tables.cpp +++ b/src/processor/operator/scan/scan_multi_rel_tables.cpp @@ -7,10 +7,13 @@ using namespace kuzu::transaction; namespace kuzu { namespace processor { -void RelTableCollectionScanner::init() { +void RelTableCollectionScanner::init( + ValueVector* inVector, const std::vector& outputVectors) { readStates.resize(scanInfos.size()); for (auto i = 0u; i < scanInfos.size(); i++) { - readStates[i] = std::make_unique(); + auto scanInfo = scanInfos[i].get(); + readStates[i] = std::make_unique( + *inVector, scanInfo->columnIDs, outputVectors, scanInfo->direction); } } @@ -19,8 +22,7 @@ bool RelTableCollectionScanner::scan(ValueVector* inVector, while (true) { if (readStates[currentTableIdx]->hasMoreToRead(transaction)) { auto scanInfo = scanInfos[currentTableIdx].get(); - scanInfo->table->read( - transaction, *readStates[currentTableIdx], inVector, outputVectors); + scanInfo->table->read(transaction, *readStates[currentTableIdx]); if (outputVectors[0]->state->selVector->selectedSize > 0) { return true; } @@ -31,7 +33,7 @@ bool RelTableCollectionScanner::scan(ValueVector* inVector, } auto scanInfo = scanInfos[currentTableIdx].get(); scanInfo->table->initializeReadState(transaction, scanInfo->direction, - scanInfo->columnIDs, inVector, readStates[currentTableIdx].get()); + scanInfo->columnIDs, *inVector, *readStates[currentTableIdx]); nextTableIdx++; } } @@ -49,7 +51,7 @@ std::unique_ptr RelTableCollectionScanner::clone() co void ScanMultiRelTable::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { ScanRelTable::initLocalStateInternal(resultSet, context); for (auto& [_, scanner] : scannerPerNodeTable) { - scanner->init(); + scanner->init(inVector, outVectors); } currentScanner = nullptr; } diff --git a/src/processor/operator/scan/scan_node_table.cpp b/src/processor/operator/scan/scan_node_table.cpp index 747dc856e89..6f2f1f2308f 100644 --- a/src/processor/operator/scan/scan_node_table.cpp +++ b/src/processor/operator/scan/scan_node_table.cpp @@ -13,8 +13,8 @@ bool ScanSingleNodeTable::getNextTuplesInternal(ExecutionContext* context) { outputVector->resetAuxiliaryBuffer(); } info->table->initializeReadState( - context->clientContext->getTx(), info->columnIDs, inVector, readState.get()); - info->table->read(context->clientContext->getTx(), *readState, inVector, outVectors); + context->clientContext->getTx(), info->columnIDs, *inVector, *readState); + info->table->read(context->clientContext->getTx(), *readState); return true; } diff --git a/src/processor/operator/scan/scan_rel_table.cpp b/src/processor/operator/scan/scan_rel_table.cpp index 426baa0cbbc..7f6b8b67987 100644 --- a/src/processor/operator/scan/scan_rel_table.cpp +++ b/src/processor/operator/scan/scan_rel_table.cpp @@ -6,14 +6,14 @@ namespace processor { bool ScanRelTable::getNextTuplesInternal(ExecutionContext* context) { while (true) { if (scanState->hasMoreToRead(context->clientContext->getTx())) { - info->table->read(context->clientContext->getTx(), *scanState, inVector, outVectors); + info->table->read(context->clientContext->getTx(), *scanState); return true; } if (!children[0]->getNextTuple(context)) { return false; } info->table->initializeReadState(context->clientContext->getTx(), info->direction, - info->columnIDs, inVector, scanState.get()); + info->columnIDs, *inVector, *scanState); } } diff --git a/src/processor/operator/scan/scan_table.cpp b/src/processor/operator/scan/scan_table.cpp index 58d26f89b51..438ef3ee1f5 100644 --- a/src/processor/operator/scan/scan_table.cpp +++ b/src/processor/operator/scan/scan_table.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace processor { -void ScanTable::initLocalStateInternal(kuzu::processor::ResultSet* resultSet, - kuzu::processor::ExecutionContext* /*executionContext*/) { +void ScanTable::initLocalStateInternal( + ResultSet* resultSet, ExecutionContext* /*executionContext*/) { inVector = resultSet->getValueVector(inVectorPos).get(); outVectors.reserve(outVectorsPos.size()); for (auto& pos : outVectorsPos) { diff --git a/src/storage/CMakeLists.txt b/src/storage/CMakeLists.txt index b155d4b2656..e45057a8af7 100644 --- a/src/storage/CMakeLists.txt +++ b/src/storage/CMakeLists.txt @@ -10,9 +10,9 @@ add_subdirectory(wal) add_library(kuzu_storage OBJECT file_handle.cpp - storage_info.cpp storage_manager.cpp storage_utils.cpp + storage_version_info.cpp wal_replayer.cpp wal_replayer_utils.cpp) diff --git a/src/storage/local_storage/local_node_table.cpp b/src/storage/local_storage/local_node_table.cpp index 6b97a823e3b..b367e3eb444 100644 --- a/src/storage/local_storage/local_node_table.cpp +++ b/src/storage/local_storage/local_node_table.cpp @@ -2,6 +2,7 @@ #include "common/cast.h" #include "storage/storage_utils.h" +#include "storage/store/node_table.h" using namespace kuzu::common; @@ -133,5 +134,48 @@ LocalNodeGroup* LocalNodeTableData::getOrCreateLocalNodeGroup(common::ValueVecto return nodeGroups.at(nodeGroupIdx).get(); } +LocalNodeTable::LocalNodeTable(Table& table) : LocalTable{table} { + auto& nodeTable = ku_dynamic_cast(table); + std::vector types; + types.reserve(nodeTable.getNumColumns()); + for (auto i = 0u; i < nodeTable.getNumColumns(); i++) { + types.push_back(nodeTable.getColumn(i)->getDataType()); + } + localTableDataCollection.push_back(std::make_unique(types)); +} + +bool LocalNodeTable::insert(TableInsertState& state) { + auto& insertState = ku_dynamic_cast(state); + return localTableDataCollection[0]->insert( + {&insertState.nodeIDVector}, insertState.propertyVectors); +} + +bool LocalNodeTable::update(TableUpdateState& state) { + auto& updateState = ku_dynamic_cast(state); + return localTableDataCollection[0]->update( + {const_cast(&updateState.nodeIDVector)}, updateState.columnID, + const_cast(&updateState.propertyVector)); +} + +bool LocalNodeTable::delete_(TableDeleteState& deleteState) { + auto& deleteState_ = ku_dynamic_cast(deleteState); + return localTableDataCollection[0]->delete_( + const_cast(&deleteState_.nodeIDVector), nullptr); +} + +void LocalNodeTable::scan(TableReadState& state) { + auto localTableData = + ku_dynamic_cast(localTableDataCollection[0].get()); + localTableData->scan( + const_cast(&state.nodeIDVector), state.columnIDs, state.outputVectors); +} + +void LocalNodeTable::lookup(TableReadState& state) { + auto localTableData = + ku_dynamic_cast(localTableDataCollection[0].get()); + localTableData->lookup( + const_cast(&state.nodeIDVector), state.columnIDs, state.outputVectors); +} + } // namespace storage } // namespace kuzu diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index be00019977c..08e4f1248be 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -1,15 +1,15 @@ #include "storage/local_storage/local_rel_table.h" #include "storage/storage_utils.h" +#include "storage/store/rel_table.h" using namespace kuzu::common; namespace kuzu { namespace storage { -LocalRelNG::LocalRelNG( - offset_t nodeGroupStartOffset, std::vector dataTypes, RelMultiplicity multiplicity) - : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes)}, multiplicity{multiplicity} {} +LocalRelNG::LocalRelNG(offset_t nodeGroupStartOffset, std::vector dataTypes) + : LocalNodeGroup{nodeGroupStartOffset, std::move(dataTypes)} {} row_idx_t LocalRelNG::scanCSR(offset_t srcOffsetInChunk, offset_t posToReadForOffset, const std::vector& columnIDs, const std::vector& outputVectors) { @@ -200,11 +200,74 @@ LocalNodeGroup* LocalRelTableData::getOrCreateLocalNodeGroup(ValueVector* nodeID auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(nodeOffset); if (!nodeGroups.contains(nodeGroupIdx)) { auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); - nodeGroups[nodeGroupIdx] = - std::make_unique(nodeGroupStartOffset, dataTypes, multiplicity); + nodeGroups[nodeGroupIdx] = std::make_unique(nodeGroupStartOffset, dataTypes); } return nodeGroups.at(nodeGroupIdx).get(); } +LocalRelTable::LocalRelTable(Table& table) : LocalTable{table} { + auto& relTable = ku_dynamic_cast(table); + std::vector types; + types.reserve(relTable.getNumColumns()); + for (auto i = 0u; i < relTable.getNumColumns(); i++) { + types.push_back(relTable.getColumn(i, RelDataDirection::FWD)->getDataType()); + } + // FWD and BWD local rel table data. + localTableDataCollection.push_back(std::make_unique(types)); + localTableDataCollection.push_back(std::make_unique(types)); +} + +bool LocalRelTable::insert(TableInsertState& state) { + auto& insertState = ku_dynamic_cast(state); + auto fwdIDVectors = + std::vector{const_cast(&insertState.srcNodeIDVector), + const_cast(&insertState.dstNodeIDVector)}; + auto bwdIDVectors = + std::vector{const_cast(&insertState.dstNodeIDVector), + const_cast(&insertState.srcNodeIDVector)}; + auto fwdInserted = + getTableData(RelDataDirection::FWD)->insert(fwdIDVectors, insertState.propertyVectors); + auto bwdInserted = + getTableData(RelDataDirection::BWD)->insert(bwdIDVectors, insertState.propertyVectors); + KU_ASSERT(fwdInserted == bwdInserted); + return fwdInserted && bwdInserted; +} + +bool LocalRelTable::update(TableUpdateState& updateState) { + auto& state = ku_dynamic_cast(updateState); + auto fwdIDVectors = std::vector{const_cast(&state.srcNodeIDVector), + const_cast(&state.relIDVector)}; + auto bwdIDVectors = std::vector{const_cast(&state.dstNodeIDVector), + const_cast(&state.relIDVector)}; + auto fwdUpdated = + getTableData(RelDataDirection::FWD) + ->update(fwdIDVectors, state.columnID, const_cast(&state.propertyVector)); + auto bwdUpdated = + getTableData(RelDataDirection::BWD) + ->update(bwdIDVectors, state.columnID, const_cast(&state.propertyVector)); + KU_ASSERT(fwdUpdated == bwdUpdated); + return fwdUpdated && bwdUpdated; +} + +bool LocalRelTable::delete_(TableDeleteState& deleteState) { + auto& state = ku_dynamic_cast(deleteState); + auto fwdDeleted = getTableData(RelDataDirection::FWD) + ->delete_(const_cast(&state.srcNodeIDVector), + const_cast(&state.relIDVector)); + auto bwdDeleted = getTableData(RelDataDirection::BWD) + ->delete_(const_cast(&state.dstNodeIDVector), + const_cast(&state.relIDVector)); + KU_ASSERT(fwdDeleted == bwdDeleted); + return fwdDeleted && bwdDeleted; +} + +void LocalRelTable::scan(TableReadState&) { + KU_UNREACHABLE; +} + +void LocalRelTable::lookup(TableReadState&) { + KU_UNREACHABLE; +} + } // namespace storage } // namespace kuzu diff --git a/src/storage/local_storage/local_storage.cpp b/src/storage/local_storage/local_storage.cpp index ca644b36f1a..788298050fb 100644 --- a/src/storage/local_storage/local_storage.cpp +++ b/src/storage/local_storage/local_storage.cpp @@ -1,7 +1,10 @@ #include "storage/local_storage/local_storage.h" +#include "storage/local_storage/local_node_table.h" +#include "storage/local_storage/local_rel_table.h" #include "storage/local_storage/local_table.h" -#include "storage/store/column.h" +#include "storage/storage_manager.h" +#include "storage/store/table.h" using namespace kuzu::common; using namespace kuzu::transaction; @@ -9,35 +12,44 @@ using namespace kuzu::transaction; namespace kuzu { namespace storage { -LocalTableData* LocalStorage::getOrCreateLocalTableData(common::table_id_t tableID, - const std::vector>& columns, TableType tableType, - common::vector_idx_t dataIdx, RelMultiplicity multiplicity) { +LocalTable* LocalStorage::getLocalTable(table_id_t tableID, NotExistAction action) { if (!tables.contains(tableID)) { - tables[tableID] = std::make_unique(tableType); - } - return tables.at(tableID)->getOrCreateLocalTableData(columns, dataIdx, multiplicity); -} - -LocalTable* LocalStorage::getLocalTable(table_id_t tableID) { - if (!tables.contains(tableID)) { - return nullptr; + switch (action) { + case NotExistAction::CREATE: { + auto table = clientContext.getStorageManager()->getTable(tableID); + switch (table->getTableType()) { + case TableType::NODE: { + tables[tableID] = std::make_unique(*table); + } break; + case TableType::REL: { + tables[tableID] = std::make_unique(*table); + } break; + default: + KU_UNREACHABLE; + } + } break; + case NotExistAction::RETURN_NULL: { + return nullptr; + } + default: + KU_UNREACHABLE; + } } return tables.at(tableID).get(); } -LocalTableData* LocalStorage::getLocalTableData(table_id_t tableID, vector_idx_t dataIdx) { - if (!tables.contains(tableID)) { - return nullptr; +void LocalStorage::prepareCommit() { + for (auto& [tableID, localTable] : tables) { + auto table = clientContext.getStorageManager()->getTable(tableID); + table->prepareCommit(clientContext.getTx(), localTable.get()); } - return tables.at(tableID)->getLocalTableData(dataIdx); } -std::unordered_set LocalStorage::getTableIDsWithUpdates() { - std::unordered_set tableSetToUpdate; - for (auto& [tableID, _] : tables) { - tableSetToUpdate.insert(tableID); +void LocalStorage::prepareRollback() { + for (auto& [tableID, localTable] : tables) { + auto table = clientContext.getStorageManager()->getTable(tableID); + table->prepareRollback(localTable.get()); } - return tableSetToUpdate; } } // namespace storage diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index c507cbe0e4a..98b2596e4a9 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -1,9 +1,5 @@ #include "storage/local_storage/local_table.h" -#include "storage/local_storage/local_node_table.h" -#include "storage/local_storage/local_rel_table.h" -#include "storage/store/column.h" - using namespace kuzu::common; namespace kuzu { @@ -126,46 +122,5 @@ bool LocalTableData::delete_(ValueVector* nodeIDVector, ValueVector* extraVector return localNodeGroup->delete_(nodeIDVector, extraVector); } -LocalTableData* LocalTable::getOrCreateLocalTableData( - const std::vector>& columns, vector_idx_t dataIdx, - RelMultiplicity multiplicity) { - if (localTableDataCollection.empty()) { - std::vector dataTypes; - dataTypes.reserve(columns.size()); - for (auto& column : columns) { - dataTypes.push_back(column->getDataType()); - } - switch (tableType) { - case TableType::NODE: { - localTableDataCollection.reserve(1); - localTableDataCollection.push_back( - std::make_unique(std::move(dataTypes))); - } break; - case TableType::REL: { - KU_ASSERT(dataIdx < 2); - localTableDataCollection.resize(2); - localTableDataCollection[dataIdx] = - std::make_unique(multiplicity, std::move(dataTypes)); - } break; - default: { - KU_UNREACHABLE; - } - } - } - KU_ASSERT(dataIdx < localTableDataCollection.size()); - if (!localTableDataCollection[dataIdx]) { - KU_ASSERT(tableType == TableType::REL); - std::vector dataTypes; - dataTypes.reserve(columns.size()); - for (auto& column : columns) { - dataTypes.push_back(column->getDataType()); - } - localTableDataCollection[dataIdx] = - std::make_unique(multiplicity, std::move(dataTypes)); - } - KU_ASSERT(localTableDataCollection[dataIdx] != nullptr); - return localTableDataCollection[dataIdx].get(); -} - } // namespace storage } // namespace kuzu diff --git a/src/storage/storage_manager.cpp b/src/storage/storage_manager.cpp index f70ba829d79..5b2f52d949c 100644 --- a/src/storage/storage_manager.cpp +++ b/src/storage/storage_manager.cpp @@ -2,6 +2,7 @@ #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "storage/stats/nodes_store_statistics.h" +#include "storage/store/node_table.h" #include "storage/wal_replayer.h" #include "storage/wal_replayer_utils.h" @@ -125,11 +126,7 @@ void StorageManager::dropTable(table_id_t tableID) { } void StorageManager::prepareCommit(transaction::Transaction* transaction) { - auto localStorage = transaction->getLocalStorage(); - for (auto tableID : localStorage->getTableIDsWithUpdates()) { - KU_ASSERT(tables.contains(tableID)); - tables.at(tableID)->prepareCommit(transaction, localStorage->getLocalTable(tableID)); - } + transaction->getLocalStorage()->prepareCommit(); if (nodesStatisticsAndDeletedIDs->hasUpdates()) { wal->logTableStatisticsRecord(true /* isNodeTable */); nodesStatisticsAndDeletedIDs->writeTablesStatisticsFileForWALRecord(wal->getDirectory()); @@ -147,11 +144,7 @@ void StorageManager::prepareRollback(transaction::Transaction* transaction) { if (relsStatistics->hasUpdates()) { wal->logTableStatisticsRecord(false /* isNodeTable */); } - auto localStorage = transaction->getLocalStorage(); - for (auto tableID : localStorage->getTableIDsWithUpdates()) { - KU_ASSERT(tables.contains(tableID)); - tables.at(tableID)->prepareRollback(localStorage->getLocalTableData(tableID)); - } + transaction->getLocalStorage()->prepareRollback(); } void StorageManager::checkpointInMemory() { diff --git a/src/storage/storage_info.cpp b/src/storage/storage_version_info.cpp similarity index 94% rename from src/storage/storage_info.cpp rename to src/storage/storage_version_info.cpp index c033027d6a2..34d54be3b76 100644 --- a/src/storage/storage_info.cpp +++ b/src/storage/storage_version_info.cpp @@ -1,4 +1,4 @@ -#include "storage/storage_info.h" +#include "storage/storage_version_info.h" namespace kuzu { namespace storage { diff --git a/src/storage/store/node_table.cpp b/src/storage/store/node_table.cpp index 4fe71968168..577ece2c99c 100644 --- a/src/storage/store/node_table.cpp +++ b/src/storage/store/node_table.cpp @@ -5,6 +5,7 @@ #include "common/exception/runtime.h" #include "common/types/ku_string.h" #include "common/types/types.h" +#include "storage/local_storage/local_node_table.h" #include "storage/store/node_table_data.h" #include "transaction/transaction.h" @@ -16,7 +17,7 @@ namespace kuzu { namespace storage { NodeTable::NodeTable(BMFileHandle* dataFH, BMFileHandle* metadataFH, - catalog::NodeTableCatalogEntry* nodeTableEntry, + NodeTableCatalogEntry* nodeTableEntry, NodesStoreStatsAndDeletedIDs* nodesStatisticsAndDeletedIDs, MemoryManager* memoryManager, WAL* wal, bool readOnly, bool enableCompression, VirtualFileSystem* vfs) : Table{nodeTableEntry, nodesStatisticsAndDeletedIDs, memoryManager, wal}, @@ -27,7 +28,7 @@ NodeTable::NodeTable(BMFileHandle* dataFH, BMFileHandle* metadataFH, } void NodeTable::initializePKIndex( - catalog::NodeTableCatalogEntry* nodeTableEntry, bool readOnly, VirtualFileSystem* vfs) { + NodeTableCatalogEntry* nodeTableEntry, bool readOnly, VirtualFileSystem* vfs) { if (nodeTableEntry->getPrimaryKey()->getDataType()->getLogicalTypeID() != LogicalTypeID::SERIAL) { pkIndex = std::make_unique( @@ -37,87 +38,109 @@ void NodeTable::initializePKIndex( } } -void NodeTable::read(Transaction* transaction, TableReadState& readState, ValueVector* nodeIDVector, - const std::vector& outputVectors) { - if (nodeIDVector->isSequential()) { - tableData->scan(transaction, readState, nodeIDVector, outputVectors); +void NodeTable::read(Transaction* transaction, TableReadState& readState) { + if (readState.nodeIDVector.isSequential()) { + scan(transaction, readState); } else { - tableData->lookup(transaction, readState, nodeIDVector, outputVectors); + lookup(transaction, readState); } } -common::offset_t NodeTable::validateUniquenessConstraint( - Transaction* tx, const std::vector& propertyVectors) { +void NodeTable::scan(Transaction* transaction, TableReadState& readState) { + tableData->scan( + transaction, *readState.dataReadState, readState.nodeIDVector, readState.outputVectors); + if (transaction->isWriteTransaction()) { + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID); + if (localTable) { + localTable->scan(readState); + } + } +} + +void NodeTable::lookup(Transaction* transaction, TableReadState& readState) { + tableData->lookup( + transaction, *readState.dataReadState, readState.nodeIDVector, readState.outputVectors); + if (transaction->isWriteTransaction()) { + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID); + if (localTable) { + localTable->lookup(readState); + } + } +} + +offset_t NodeTable::validateUniquenessConstraint( + Transaction* tx, const std::vector& propertyVectors) { if (pkIndex == nullptr) { return INVALID_OFFSET; } auto pkVector = propertyVectors[pkColumnID]; KU_ASSERT(pkVector->state->selVector->selectedSize == 1); auto pkVectorPos = pkVector->state->selVector->selectedPositions[0]; - common::offset_t offset; + offset_t offset; if (pkIndex->lookup(tx, propertyVectors[pkColumnID], pkVectorPos, offset)) { return offset; } return INVALID_OFFSET; } -offset_t NodeTable::insert(Transaction* transaction, ValueVector* nodeIDVector, - const std::vector& propertyVectors) { - auto maxNodeOffset = 0u; - for (auto i = 0u; i < nodeIDVector->state->selVector->selectedSize; i++) { - auto pos = nodeIDVector->state->selVector->selectedPositions[i]; - auto offset = - ku_dynamic_cast(tablesStatistics) - ->addNode(tableID); - if (offset > maxNodeOffset) { - maxNodeOffset = offset; - } - nodeIDVector->setValue(pos, nodeID_t{offset, tableID}); - nodeIDVector->setNull(pos, false); - } +void NodeTable::insert(Transaction* transaction, TableInsertState& insertState) { + auto nodesStats = + ku_dynamic_cast(tablesStatistics); + auto& nodeInsertState = ku_dynamic_cast(insertState); + KU_ASSERT(nodeInsertState.nodeIDVector.state->selVector->selectedSize == 1); + auto pos = nodeInsertState.nodeIDVector.state->selVector->selectedPositions[0]; + auto offset = nodesStats->addNode(tableID); + nodeInsertState.nodeIDVector.setValue(pos, nodeID_t{offset, tableID}); + nodeInsertState.nodeIDVector.setNull(pos, false); if (pkIndex) { - insertPK(nodeIDVector, propertyVectors[pkColumnID]); + insertPK(nodeInsertState.nodeIDVector, nodeInsertState.pkVector); } - tableData->insert(transaction, nodeIDVector, propertyVectors); - return maxNodeOffset; + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + localTable->insert(insertState); } -void NodeTable::update(transaction::Transaction* transaction, common::column_id_t columnID, - common::ValueVector* nodeIDVector, common::ValueVector* propertyVector) { +void NodeTable::update(Transaction* transaction, TableUpdateState& updateState) { // NOTE: We assume all input all flatten now. This is to simplify the implementation. // We should optimize this to take unflat input later. - KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1 && - propertyVector->state->selVector->selectedSize == 1); - if (columnID == pkColumnID && pkIndex) { - updatePK(transaction, columnID, nodeIDVector, propertyVector); + auto& nodeUpdateState = ku_dynamic_cast(updateState); + KU_ASSERT(nodeUpdateState.nodeIDVector.state->selVector->selectedSize == 1 && + nodeUpdateState.propertyVector.state->selVector->selectedSize == 1); + if (nodeUpdateState.columnID == pkColumnID && pkIndex) { + updatePK(transaction, updateState.columnID, nodeUpdateState.nodeIDVector, + updateState.propertyVector); } - tableData->update(transaction, columnID, nodeIDVector, propertyVector); + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + localTable->update(updateState); } -void NodeTable::delete_( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* pkVector) { - auto readState = std::make_unique(); - tableData->initializeReadState(transaction, {pkColumnID}, nodeIDVector, readState.get()); - read(transaction, *readState, nodeIDVector, {pkVector}); - if (pkIndex) { - pkIndex->delete_(pkVector); +void NodeTable::delete_(Transaction* transaction, TableDeleteState& deleteState) { + auto& nodeDeleteState = ku_dynamic_cast(deleteState); + KU_ASSERT(nodeDeleteState.nodeIDVector.state->selVector->selectedSize == 1); + auto pos = nodeDeleteState.nodeIDVector.state->selVector->selectedPositions[0]; + if (nodeDeleteState.nodeIDVector.isNull(pos)) { + return; } - // TODO(Guodong): We actually have flatten the input here. But the code is left unchanged for - // now, so we can remove the flattenAll logic later. - for (auto i = 0u; i < nodeIDVector->state->selVector->selectedSize; i++) { - auto pos = nodeIDVector->state->selVector->selectedPositions[i]; - if (nodeIDVector->isNull(pos)) { - continue; - } - auto nodeOffset = nodeIDVector->readNodeOffset(pos); - ku_dynamic_cast(tablesStatistics) - ->deleteNode(tableID, nodeOffset); + auto pkColumnIDs = {pkColumnID}; + auto pkVectors = std::vector{&nodeDeleteState.pkVector}; + auto readState = + std::make_unique(nodeDeleteState.nodeIDVector, pkColumnIDs, pkVectors); + initializeReadState(transaction, pkColumnIDs, nodeDeleteState.nodeIDVector, *readState); + read(transaction, *readState); + if (pkIndex) { + pkIndex->delete_(&nodeDeleteState.pkVector); } - tableData->delete_(transaction, nodeIDVector); + auto nodeOffset = nodeDeleteState.nodeIDVector.readNodeOffset(pos); + ku_dynamic_cast(tablesStatistics) + ->deleteNode(tableID, nodeOffset); + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + localTable->delete_(deleteState); } -void NodeTable::addColumn(transaction::Transaction* transaction, const catalog::Property& property, - common::ValueVector* defaultValueVector) { +void NodeTable::addColumn( + Transaction* transaction, const Property& property, ValueVector* defaultValueVector) { auto nodesStats = ku_dynamic_cast(tablesStatistics); nodesStats->setPropertyStatisticsForTable(tableID, property.getPropertyID(), @@ -135,11 +158,12 @@ void NodeTable::prepareCommit(Transaction* transaction, LocalTable* localTable) if (pkIndex) { pkIndex->prepareCommit(); } - tableData->prepareLocalTableToCommit(transaction, localTable->getLocalTableData(0)); + auto localNodeTable = ku_dynamic_cast(localTable); + tableData->prepareLocalTableToCommit(transaction, localNodeTable->getTableData()); wal->addToUpdatedTables(tableID); } -void NodeTable::prepareRollback(LocalTableData* localTable) { +void NodeTable::prepareRollback(LocalTable* localTable) { if (pkIndex) { pkIndex->prepareRollback(); } @@ -161,34 +185,36 @@ void NodeTable::rollbackInMemory() { } void NodeTable::updatePK(Transaction* transaction, column_id_t columnID, - common::ValueVector* keyVector, common::ValueVector* payloadVector) { + const ValueVector& nodeIDVector, const ValueVector& payloadVector) { auto pkVector = std::make_unique(getColumn(pkColumnID)->getDataType(), memoryManager); - pkVector->state = keyVector->state; - auto readState = std::make_unique(); - initializeReadState(transaction, {columnID}, keyVector, readState.get()); - read(transaction, *readState, keyVector, {pkVector.get()}); + pkVector->state = nodeIDVector.state; + auto outputVectors = std::vector{pkVector.get()}; + auto columnIDs = {columnID}; + auto readState = std::make_unique(nodeIDVector, columnIDs, outputVectors); + initializeReadState(transaction, columnIDs, nodeIDVector, *readState); + read(transaction, *readState); pkIndex->delete_(pkVector.get()); - insertPK(keyVector, payloadVector); + insertPK(nodeIDVector, payloadVector); } -void NodeTable::insertPK(ValueVector* nodeIDVector, ValueVector* primaryKeyVector) { - for (auto i = 0u; i < nodeIDVector->state->selVector->selectedSize; i++) { - auto nodeIDPos = nodeIDVector->state->selVector->selectedPositions[i]; - auto offset = nodeIDVector->readNodeOffset(nodeIDPos); - auto pkPos = primaryKeyVector->state->selVector->selectedPositions[i]; - if (primaryKeyVector->isNull(pkPos)) { +void NodeTable::insertPK(const ValueVector& nodeIDVector, const ValueVector& primaryKeyVector) { + for (auto i = 0u; i < nodeIDVector.state->selVector->selectedSize; i++) { + auto nodeIDPos = nodeIDVector.state->selVector->selectedPositions[i]; + auto offset = nodeIDVector.readNodeOffset(nodeIDPos); + auto pkPos = primaryKeyVector.state->selVector->selectedPositions[i]; + if (primaryKeyVector.isNull(pkPos)) { throw RuntimeException(ExceptionMessage::nullPKException()); } - if (!pkIndex->insert(primaryKeyVector, pkPos, offset)) { + if (!pkIndex->insert(const_cast(&primaryKeyVector), pkPos, offset)) { std::string pkStr; TypeUtils::visit( - primaryKeyVector->dataType.getPhysicalType(), + primaryKeyVector.dataType.getPhysicalType(), [&](ku_string_t) { - pkStr = primaryKeyVector->getValue(pkPos).getAsString(); + pkStr = primaryKeyVector.getValue(pkPos).getAsString(); }, [&]( - T) { pkStr = TypeUtils::toString(primaryKeyVector->getValue(pkPos)); }); + T) { pkStr = TypeUtils::toString(primaryKeyVector.getValue(pkPos)); }); throw RuntimeException(ExceptionMessage::duplicatePKException(pkStr)); } } diff --git a/src/storage/store/node_table_data.cpp b/src/storage/store/node_table_data.cpp index aea7577412e..45ffb39c2e5 100644 --- a/src/storage/store/node_table_data.cpp +++ b/src/storage/store/node_table_data.cpp @@ -31,68 +31,31 @@ NodeTableData::NodeTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, } } -void NodeTableData::scan(Transaction* transaction, TableReadState& readState, - ValueVector* nodeIDVector, const std::vector& outputVectors) { - KU_ASSERT(readState.columnIDs.size() == outputVectors.size() && !nodeIDVector->state->isFlat()); +void NodeTableData::scan(Transaction* transaction, TableDataReadState& readState, + const ValueVector& nodeIDVector, const std::vector& outputVectors) { + KU_ASSERT(readState.columnIDs.size() == outputVectors.size() && !nodeIDVector.state->isFlat()); for (auto i = 0u; i < readState.columnIDs.size(); i++) { if (readState.columnIDs[i] == INVALID_COLUMN_ID) { outputVectors[i]->setAllNull(); } else { KU_ASSERT(readState.columnIDs[i] < columns.size()); - columns[readState.columnIDs[i]]->scan(transaction, nodeIDVector, outputVectors[i]); + columns[readState.columnIDs[i]]->scan( + transaction, const_cast(&nodeIDVector), outputVectors[i]); } } - if (transaction->isWriteTransaction()) { - auto localTableData = transaction->getLocalStorage()->getLocalTableData(tableID); - if (localTableData) { - auto localNodeTableData = - ku_dynamic_cast(localTableData); - localNodeTableData->scan(nodeIDVector, readState.columnIDs, outputVectors); - } - } -} - -void NodeTableData::insert(Transaction* transaction, ValueVector* nodeIDVector, - const std::vector& propertyVectors) { - // We assume that offsets are given in the ascending order, thus lastOffset is the max one. - KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); - auto localTableData = - transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns); - localTableData->insert({nodeIDVector}, propertyVectors); -} - -void NodeTableData::update(Transaction* transaction, column_id_t columnID, - ValueVector* nodeIDVector, ValueVector* propertyVector) { - KU_ASSERT(columnID < columns.size()); - auto localTableData = - transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns); - localTableData->update({nodeIDVector}, columnID, propertyVector); -} - -void NodeTableData::delete_(Transaction* transaction, ValueVector* nodeIDVector) { - auto localTableData = - transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns); - localTableData->delete_(nodeIDVector); } -void NodeTableData::lookup(Transaction* transaction, TableReadState& readState, - ValueVector* nodeIDVector, const std::vector& outputVectors) { - auto pos = nodeIDVector->state->selVector->selectedPositions[0]; +void NodeTableData::lookup(Transaction* transaction, TableDataReadState& readState, + const ValueVector& nodeIDVector, const std::vector& outputVectors) { + auto pos = nodeIDVector.state->selVector->selectedPositions[0]; for (auto i = 0u; i < readState.columnIDs.size(); i++) { auto columnID = readState.columnIDs[i]; if (columnID == INVALID_COLUMN_ID) { outputVectors[i]->setNull(pos, true); } else { KU_ASSERT(readState.columnIDs[i] < columns.size()); - columns[readState.columnIDs[i]]->lookup(transaction, nodeIDVector, outputVectors[i]); - } - } - if (transaction->isWriteTransaction()) { - auto localTableData = transaction->getLocalStorage()->getLocalTableData(tableID); - if (localTableData) { - auto localRelTableData = - ku_dynamic_cast(localTableData); - localRelTableData->lookup(nodeIDVector, readState.columnIDs, outputVectors); + columns[readState.columnIDs[i]]->lookup( + transaction, const_cast(&nodeIDVector), outputVectors[i]); } } } diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index 507459c2c5f..32e86f0f77b 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -2,6 +2,7 @@ #include "common/cast.h" #include "common/exception/message.h" +#include "storage/local_storage/local_rel_table.h" #include "storage/stats/rels_store_statistics.h" #include "storage/store/rel_table_data.h" @@ -30,33 +31,30 @@ RelTable::RelTable(BMFileHandle* dataFH, BMFileHandle* metadataFH, RelsStoreStat relTableEntry, relsStoreStats, RelDataDirection::BWD, enableCompression); } -void RelTable::read(Transaction* transaction, TableReadState& readState, - ValueVector* inNodeIDVector, const std::vector& outputVectors) { - auto& relReadState = ku_dynamic_cast(readState); - scan(transaction, relReadState, inNodeIDVector, outputVectors); +void RelTable::read(Transaction* transaction, TableReadState& readState) { + auto& relReadState = ku_dynamic_cast(readState); + scan(transaction, relReadState); } -void RelTable::insert(Transaction* transaction, ValueVector* srcNodeIDVector, - ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { - fwdRelTableData->insert(transaction, srcNodeIDVector, dstNodeIDVector, propertyVectors); - bwdRelTableData->insert(transaction, dstNodeIDVector, srcNodeIDVector, propertyVectors); - auto relsStats = ku_dynamic_cast(tablesStatistics); - relsStats->updateNumTuplesByValue(tableID, 1); +void RelTable::insert(Transaction* transaction, TableInsertState& insertState) { + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + if (localTable->insert(insertState)) { + auto relsStats = ku_dynamic_cast(tablesStatistics); + relsStats->updateNumTuplesByValue(tableID, 1); + } } -void RelTable::update(transaction::Transaction* transaction, column_id_t columnID, - ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, ValueVector* relIDVector, - ValueVector* propertyVector) { - fwdRelTableData->update(transaction, columnID, srcNodeIDVector, relIDVector, propertyVector); - bwdRelTableData->update(transaction, columnID, dstNodeIDVector, relIDVector, propertyVector); +void RelTable::update(Transaction* transaction, TableUpdateState& updateState) { + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + localTable->update(updateState); } -void RelTable::delete_(Transaction* transaction, ValueVector* srcNodeIDVector, - ValueVector* dstNodeIDVector, ValueVector* relIDVector) { - auto fwdDeleted = fwdRelTableData->delete_(transaction, srcNodeIDVector, relIDVector); - auto bwdDeleted = bwdRelTableData->delete_(transaction, dstNodeIDVector, relIDVector); - KU_ASSERT(fwdDeleted == bwdDeleted); - if (fwdDeleted && bwdDeleted) { +void RelTable::delete_(Transaction* transaction, TableDeleteState& deleteState) { + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + if (localTable->delete_(deleteState)) { auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->updateNumTuplesByValue(tableID, -1); } @@ -69,11 +67,14 @@ void RelTable::detachDelete(Transaction* transaction, RelDataDirection direction direction == RelDataDirection::FWD ? fwdRelTableData.get() : bwdRelTableData.get(); auto reverseTableData = direction == RelDataDirection::FWD ? bwdRelTableData.get() : fwdRelTableData.get(); - auto relDataReadState = std::make_unique(); - initializeReadState( - transaction, direction, {REL_ID_COLUMN_ID}, srcNodeIDVector, relDataReadState.get()); - row_idx_t numRelsDeleted = detachDeleteForCSRRels(transaction, tableData, reverseTableData, - srcNodeIDVector, relDataReadState.get(), deleteState); + std::vector relIDColumns = {REL_ID_COLUMN_ID}; + auto relIDVectors = std::vector{ + deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()}; + auto relReadState = std::make_unique( + *srcNodeIDVector, relIDColumns, relIDVectors, direction); + initializeReadState(transaction, direction, relIDColumns, *srcNodeIDVector, *relReadState); + row_idx_t numRelsDeleted = detachDeleteForCSRRels( + transaction, tableData, reverseTableData, srcNodeIDVector, relReadState.get(), deleteState); auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->updateNumTuplesByValue(tableID, -numRelsDeleted); } @@ -93,14 +94,14 @@ void RelTable::checkIfNodeHasRels( } } +// TODO(Guodong): Rework detach delete to go through local storage. row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableData* tableData, RelTableData* reverseTableData, ValueVector* srcNodeIDVector, - RelDataReadState* relDataReadState, RelDetachDeleteState* deleteState) { + RelTableReadState* relDataReadState, RelDetachDeleteState* deleteState) { row_idx_t numRelsDeleted = 0; auto tempState = deleteState->dstNodeIDVector->state.get(); while (relDataReadState->hasMoreToRead(transaction)) { - scan(transaction, *relDataReadState, srcNodeIDVector, - {deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()}); + scan(transaction, *relDataReadState); auto numRelsScanned = tempState->selVector->selectedSize; tempState->selVector->resetSelectorToValuePosBufferWithSize(1); for (auto i = 0u; i < numRelsScanned; i++) { @@ -117,10 +118,10 @@ row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableDat return numRelsDeleted; } -void RelTable::scan(Transaction* transaction, RelDataReadState& scanState, - ValueVector* inNodeIDVector, const std::vector& outputVectors) { +void RelTable::scan(Transaction* transaction, RelTableReadState& scanState) { auto tableData = getDirectedTableData(scanState.direction); - tableData->scan(transaction, scanState, inNodeIDVector, outputVectors); + tableData->scan( + transaction, *scanState.dataReadState, scanState.nodeIDVector, scanState.outputVectors); } void RelTable::addColumn( @@ -148,12 +149,15 @@ void RelTable::addColumn( void RelTable::prepareCommit(Transaction* transaction, LocalTable* localTable) { wal->addToUpdatedTables(tableID); - fwdRelTableData->prepareLocalTableToCommit(transaction, localTable->getLocalTableData(0)); - bwdRelTableData->prepareLocalTableToCommit(transaction, localTable->getLocalTableData(1)); + auto localRelTable = ku_dynamic_cast(localTable); + fwdRelTableData->prepareLocalTableToCommit( + transaction, localRelTable->getTableData(RelDataDirection::FWD)); + bwdRelTableData->prepareLocalTableToCommit( + transaction, localRelTable->getTableData(RelDataDirection::BWD)); } -void RelTable::prepareRollback(LocalTableData* localTableData) { - localTableData->clear(); +void RelTable::prepareRollback(LocalTable* localTable) { + localTable->clear(); } void RelTable::checkpointInMemory() { diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 501d07a3659..43b5e29f944 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -174,39 +174,39 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, } void RelTableData::initializeReadState(Transaction* transaction, std::vector columnIDs, - ValueVector* inNodeIDVector, RelDataReadState* readState) { - readState->direction = direction; - readState->columnIDs.clear(); - readState->columnIDs.push_back(NBR_ID_COLUMN_ID); - readState->columnIDs.insert(readState->columnIDs.end(), columnIDs.begin(), columnIDs.end()); + const ValueVector& inNodeIDVector, RelDataReadState& readState) { + readState.direction = direction; + readState.columnIDs.clear(); + readState.columnIDs.push_back(NBR_ID_COLUMN_ID); + readState.columnIDs.insert(readState.columnIDs.end(), columnIDs.begin(), columnIDs.end()); // Reset to read from persistent storage. - readState->readFromLocalStorage = false; + readState.readFromLocalStorage = false; auto nodeOffset = - inNodeIDVector->readNodeOffset(inNodeIDVector->state->selVector->selectedPositions[0]); + inNodeIDVector.readNodeOffset(inNodeIDVector.state->selVector->selectedPositions[0]); auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(nodeOffset); auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); // Reset to read from beginning for the csr of the new node offset. - readState->posInCurrentCSR = 0; - if (readState->isOutOfRange(nodeOffset)) { + readState.posInCurrentCSR = 0; + if (readState.isOutOfRange(nodeOffset)) { // Scan csr offsets and populate csr list entries for the new node group. - readState->startNodeOffset = startNodeOffset; - csrHeaderColumns.scan(transaction, nodeGroupIdx, readState->csrHeaderChunks); - KU_ASSERT(readState->csrHeaderChunks.offset->getNumValues() == - readState->csrHeaderChunks.length->getNumValues()); - readState->numNodes = readState->csrHeaderChunks.offset->getNumValues(); - readState->populateCSRListEntries(); + readState.startNodeOffset = startNodeOffset; + csrHeaderColumns.scan(transaction, nodeGroupIdx, readState.csrHeaderChunks); + KU_ASSERT(readState.csrHeaderChunks.offset->getNumValues() == + readState.csrHeaderChunks.length->getNumValues()); + readState.numNodes = readState.csrHeaderChunks.offset->getNumValues(); + readState.populateCSRListEntries(); if (transaction->isWriteTransaction()) { - readState->localNodeGroup = getLocalNodeGroup(transaction, nodeGroupIdx); + readState.localNodeGroup = getLocalNodeGroup(transaction, nodeGroupIdx); } } - if (nodeOffset != readState->currentNodeOffset) { - readState->currentNodeOffset = nodeOffset; + if (nodeOffset != readState.currentNodeOffset) { + readState.currentNodeOffset = nodeOffset; } } -void RelTableData::scan(Transaction* transaction, TableReadState& readState, - ValueVector* inNodeIDVector, const std::vector& outputVectors) { - auto& relReadState = ku_dynamic_cast(readState); +void RelTableData::scan(Transaction* transaction, TableDataReadState& readState, + const ValueVector& inNodeIDVector, const std::vector& outputVectors) { + auto& relReadState = ku_dynamic_cast(readState); if (relReadState.readFromLocalStorage) { auto offsetInChunk = relReadState.currentNodeOffset - relReadState.startNodeOffset; KU_ASSERT(relReadState.localNodeGroup); @@ -236,7 +236,7 @@ void RelTableData::scan(Transaction* transaction, TableReadState& readState, } if (transaction->isWriteTransaction() && relReadState.localNodeGroup) { auto nodeOffset = - inNodeIDVector->readNodeOffset(inNodeIDVector->state->selVector->selectedPositions[0]); + inNodeIDVector.readNodeOffset(inNodeIDVector.state->selVector->selectedPositions[0]); KU_ASSERT(relIDVectorIdx != INVALID_VECTOR_IDX); auto relIDVector = outputVectors[relIDVectorIdx]; relReadState.localNodeGroup->applyLocalChangesToScannedVectors( @@ -245,34 +245,17 @@ void RelTableData::scan(Transaction* transaction, TableReadState& readState, } } -void RelTableData::lookup(Transaction* /*transaction*/, TableReadState& /*readState*/, - ValueVector* /*inNodeIDVector*/, const std::vector& /*outputVectors*/) { +void RelTableData::lookup(Transaction* /*transaction*/, TableDataReadState& /*readState*/, + const ValueVector& /*inNodeIDVector*/, const std::vector& /*outputVectors*/) { KU_ASSERT(false); } -void RelTableData::insert(Transaction* transaction, ValueVector* srcNodeIDVector, - ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { - auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( - tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); - auto checkPersistent = - localTableData->insert({srcNodeIDVector, dstNodeIDVector}, propertyVectors); - if (checkPersistent && multiplicity == RelMultiplicity::ONE) { - checkRelMultiplicityConstraint(transaction, srcNodeIDVector); - } -} - -void RelTableData::update(Transaction* transaction, column_id_t columnID, - ValueVector* srcNodeIDVector, ValueVector* relIDVector, ValueVector* propertyVector) { - KU_ASSERT(columnID < columns.size() && columnID != REL_ID_COLUMN_ID); - auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( - tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); - localTableData->update({srcNodeIDVector, relIDVector}, columnID, propertyVector); -} - bool RelTableData::delete_( Transaction* transaction, ValueVector* srcNodeIDVector, ValueVector* relIDVector) { - auto localTableData = transaction->getLocalStorage()->getOrCreateLocalTableData( - tableID, columns, TableType::REL, getDataIdxFromDirection(direction), multiplicity); + auto localTable = transaction->getLocalStorage()->getLocalTable( + tableID, LocalStorage::NotExistAction::CREATE); + auto localRelTable = ku_dynamic_cast(localTable); + auto localTableData = localRelTable->getTableData(direction); return localTableData->delete_(srcNodeIDVector, relIDVector); } @@ -972,16 +955,16 @@ void RelTableData::prepareCommitNodeGroup( LocalRelNG* RelTableData::getLocalNodeGroup( Transaction* transaction, node_group_idx_t nodeGroupIdx) { - auto localTableData = transaction->getLocalStorage()->getLocalTableData( - tableID, getDataIdxFromDirection(direction)); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID); + if (!localTable) { + return nullptr; + } + auto localRelTable = ku_dynamic_cast(localTable); + auto localTableData = localRelTable->getTableData(direction); LocalRelNG* localNodeGroup = nullptr; - if (localTableData) { - auto localRelTableData = - ku_dynamic_cast(localTableData); - if (localRelTableData->nodeGroups.contains(nodeGroupIdx)) { - localNodeGroup = ku_dynamic_cast( - localRelTableData->nodeGroups.at(nodeGroupIdx).get()); - } + if (localTableData->nodeGroups.contains(nodeGroupIdx)) { + localNodeGroup = ku_dynamic_cast( + localTableData->nodeGroups.at(nodeGroupIdx).get()); } return localNodeGroup; } diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index 740863dca76..c3639f2293c 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -4,6 +4,7 @@ #include "common/exception/storage.h" #include "storage/storage_manager.h" #include "storage/storage_utils.h" +#include "storage/store/node_table.h" #include "storage/wal_replayer_utils.h" #include "transaction/transaction.h" @@ -201,8 +202,9 @@ void WALReplayer::replayCopyTableRecord(const WALRecord& walRecord) { if (catalogEntry->getType() == CatalogEntryType::NODE_TABLE_ENTRY) { auto nodeTableEntry = ku_dynamic_cast(catalogEntry); - storageManager->getNodeTable(tableID)->initializePKIndex( - nodeTableEntry, false /* readOnly */, vfs); + auto nodeTable = + ku_dynamic_cast(storageManager->getTable(tableID)); + nodeTable->initializePKIndex(nodeTableEntry, false /* readOnly */, vfs); } } else { // RECOVERY. @@ -272,21 +274,8 @@ void WALReplayer::replayDropPropertyRecord(const WALRecord& walRecord) { auto propertyID = walRecord.dropPropertyRecord.propertyID; if (!isRecovering) { auto tableEntry = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID); - switch (tableEntry->getTableType()) { - case TableType::NODE: { - storageManager->getNodeTable(tableID)->dropColumn( - tableEntry->getColumnID(propertyID)); - // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. - } break; - case TableType::REL: { - storageManager->getRelTable(tableID)->dropColumn( - tableEntry->getColumnID(propertyID)); - // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. - } break; - default: { - KU_UNREACHABLE; - } - } + storageManager->getTable(tableID)->dropColumn(tableEntry->getColumnID(propertyID)); + // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. } else { if (!wal->isLastLoggedRecordCommit()) { // Nothing to undo. @@ -304,17 +293,7 @@ void WALReplayer::replayAddPropertyRecord(const WALRecord& walRecord) { auto propertyID = walRecord.addPropertyRecord.propertyID; if (!isCheckpoint) { auto tableEntry = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID); - switch (tableEntry->getTableType()) { - case TableType::NODE: { - storageManager->getNodeTable(tableID)->dropColumn(tableEntry->getColumnID(propertyID)); - } break; - case TableType::REL: { - storageManager->getRelTable(tableID)->dropColumn(tableEntry->getColumnID(propertyID)); - } break; - default: { - KU_UNREACHABLE; - } - } + storageManager->getTable(tableID)->dropColumn(tableEntry->getColumnID(propertyID)); } } diff --git a/src/transaction/transaction_context.cpp b/src/transaction/transaction_context.cpp index 395496c4f5c..8f57607b8e6 100644 --- a/src/transaction/transaction_context.cpp +++ b/src/transaction/transaction_context.cpp @@ -2,6 +2,7 @@ #include "common/exception/connection.h" #include "common/exception/transaction_manager.h" +#include "main/client_context.h" #include "main/database.h" #include "transaction/transaction_manager.h" @@ -10,12 +11,12 @@ using namespace kuzu::common; namespace kuzu { namespace transaction { -TransactionContext::TransactionContext(main::Database* database) - : database{database}, mode{TransactionMode::AUTO} {} +TransactionContext::TransactionContext(main::ClientContext& clientContext) + : clientContext{clientContext}, mode{TransactionMode::AUTO} {} TransactionContext::~TransactionContext() { if (activeTransaction) { - database->transactionManager->rollback(activeTransaction.get()); + clientContext.getDatabase()->transactionManager->rollback(activeTransaction.get()); } } @@ -73,7 +74,7 @@ void TransactionContext::commitInternal(bool skipCheckPointing) { if (!hasActiveTransaction()) { return; } - database->commit(activeTransaction.get(), skipCheckPointing); + clientContext.getDatabase()->commit(activeTransaction.get(), skipCheckPointing); activeTransaction.reset(); mode = TransactionMode::AUTO; } @@ -82,7 +83,7 @@ void TransactionContext::rollbackInternal(bool skipCheckPointing) { if (!hasActiveTransaction()) { return; } - database->rollback(activeTransaction.get(), skipCheckPointing); + clientContext.getDatabase()->rollback(activeTransaction.get(), skipCheckPointing); activeTransaction.reset(); mode = TransactionMode::AUTO; } @@ -97,10 +98,13 @@ void TransactionContext::beginTransactionInternal(TransactionType transactionTyp } switch (transactionType) { case TransactionType::READ_ONLY: { - activeTransaction = database->transactionManager->beginReadOnlyTransaction(); + activeTransaction = + clientContext.getDatabase()->transactionManager->beginReadOnlyTransaction( + clientContext); } break; case TransactionType::WRITE: { - activeTransaction = database->transactionManager->beginWriteTransaction(); + activeTransaction = + clientContext.getDatabase()->transactionManager->beginWriteTransaction(clientContext); } break; default: KU_UNREACHABLE; diff --git a/src/transaction/transaction_manager.cpp b/src/transaction/transaction_manager.cpp index dbf654c405e..bcc53b19bf7 100644 --- a/src/transaction/transaction_manager.cpp +++ b/src/transaction/transaction_manager.cpp @@ -9,7 +9,8 @@ using namespace kuzu::common; namespace kuzu { namespace transaction { -std::unique_ptr TransactionManager::beginWriteTransaction() { +std::unique_ptr TransactionManager::beginWriteTransaction( + main::ClientContext& clientContext) { // We obtain the lock for starting new transactions. In case this cannot be obtained this // ensures calls to other public functions is not restricted. lock_t newTransactionLck{mtxForStartingNewTransactions}; @@ -19,18 +20,20 @@ std::unique_ptr TransactionManager::beginWriteTransaction() { "Cannot start a new write transaction in the system. Only one write transaction at a " "time is allowed in the system."); } - auto transaction = std::make_unique(TransactionType::WRITE, ++lastTransactionID); + auto transaction = + std::make_unique(clientContext, TransactionType::WRITE, ++lastTransactionID); activeWriteTransactionID = lastTransactionID; return transaction; } -std::unique_ptr TransactionManager::beginReadOnlyTransaction() { +std::unique_ptr TransactionManager::beginReadOnlyTransaction( + main::ClientContext& clientContext) { // We obtain the lock for starting new transactions. In case this cannot be obtained this // ensures calls to other public functions is not restricted. lock_t newTransactionLck{mtxForStartingNewTransactions}; lock_t publicFunctionLck{mtxForSerializingPublicFunctionCalls}; - auto transaction = - std::make_unique(TransactionType::READ_ONLY, ++lastTransactionID); + auto transaction = std::make_unique( + clientContext, TransactionType::READ_ONLY, ++lastTransactionID); activeReadOnlyTransactionIDs.insert(transaction->getID()); return transaction; } diff --git a/test/transaction/transaction_manager_test.cpp b/test/transaction/transaction_manager_test.cpp index 7207dd3c919..941132f5d29 100644 --- a/test/transaction/transaction_manager_test.cpp +++ b/test/transaction/transaction_manager_test.cpp @@ -27,9 +27,10 @@ class TransactionManagerTest : public EmptyDBTest { public: void runTwoCommitRollback(TransactionType type, bool firstIsCommit, bool secondIsCommit) { - std::unique_ptr trx = TransactionType::WRITE == type ? - transactionManager->beginWriteTransaction() : - transactionManager->beginReadOnlyTransaction(); + std::unique_ptr trx = + TransactionType::WRITE == type ? + transactionManager->beginWriteTransaction(*getClientContext(*conn)) : + transactionManager->beginReadOnlyTransaction(*getClientContext(*conn)); if (firstIsCommit) { transactionManager->commit(trx.get()); } else { @@ -51,9 +52,10 @@ class TransactionManagerTest : public EmptyDBTest { }; TEST_F(TransactionManagerTest, MultipleWriteTransactionsErrors) { - std::unique_ptr trx1 = transactionManager->beginWriteTransaction(); + std::unique_ptr trx1 = + transactionManager->beginWriteTransaction(*getClientContext(*conn)); try { - transactionManager->beginWriteTransaction(); + transactionManager->beginWriteTransaction(*getClientContext(*conn)); FAIL(); } catch (TransactionManagerException& e) {} } @@ -96,9 +98,12 @@ TEST_F(TransactionManagerTest, BasicOneWriteMultipleReadOnlyTransactions) { // before and after commits or rollbacks under concurrent transactions. Specifically we test: // that transaction IDs increase incrementally, the states of activeReadOnlyTransactionIDs set, // and activeWriteTransactionID. - std::unique_ptr trx1 = transactionManager->beginReadOnlyTransaction(); - std::unique_ptr trx2 = transactionManager->beginWriteTransaction(); - std::unique_ptr trx3 = transactionManager->beginReadOnlyTransaction(); + std::unique_ptr trx1 = + transactionManager->beginReadOnlyTransaction(*getClientContext(*conn)); + std::unique_ptr trx2 = + transactionManager->beginWriteTransaction(*getClientContext(*conn)); + std::unique_ptr trx3 = + transactionManager->beginReadOnlyTransaction(*getClientContext(*conn)); ASSERT_EQ(TransactionType::READ_ONLY, trx1->getType()); ASSERT_EQ(TransactionType::WRITE, trx2->getType()); ASSERT_EQ(TransactionType::READ_ONLY, trx3->getType()); @@ -120,8 +125,10 @@ TEST_F(TransactionManagerTest, BasicOneWriteMultipleReadOnlyTransactions) { ASSERT_EQ( expectedReadOnlyTransactionSet, transactionManager->getActiveReadOnlyTransactionIDs()); - std::unique_ptr trx4 = transactionManager->beginWriteTransaction(); - std::unique_ptr trx5 = transactionManager->beginReadOnlyTransaction(); + std::unique_ptr trx4 = + transactionManager->beginWriteTransaction(*getClientContext(*conn)); + std::unique_ptr trx5 = + transactionManager->beginReadOnlyTransaction(*getClientContext(*conn)); ASSERT_EQ(trx3->getID() + 1, trx4->getID()); ASSERT_EQ(trx4->getID() + 1, trx5->getID()); ASSERT_EQ(trx4->getID(), transactionManager->getActiveWriteTransactionID()); diff --git a/tools/rust_api/include/kuzu_rs.h b/tools/rust_api/include/kuzu_rs.h index 9d2b04a7950..8cfca801b5e 100644 --- a/tools/rust_api/include/kuzu_rs.h +++ b/tools/rust_api/include/kuzu_rs.h @@ -11,7 +11,7 @@ #include "common/types/value/rel.h" #include "common/types/value/value.h" #include "main/kuzu.h" -#include "storage/storage_info.h" +#include "storage/storage_version_info.h" #else #include #endif From 4d21128a72eb7f763b29a876dbe8a969b9f1d312 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Mon, 25 Mar 2024 16:03:14 -0400 Subject: [PATCH 090/136] Support read after update (#3126) --- src/binder/bind/bind_query.cpp | 1 - src/binder/binder.cpp | 12 ------ src/include/binder/binder.h | 4 -- .../planner/operator/logical_operator.h | 30 +++++++-------- src/include/planner/operator/logical_plan.h | 28 ++++++-------- src/include/planner/planner.h | 6 +-- src/planner/operator/logical_operator.cpp | 26 +++++++++++++ src/planner/operator/logical_plan.cpp | 12 ++++++ src/planner/plan/append_cross_product.cpp | 10 ++--- src/planner/plan/append_extend.cpp | 3 +- src/planner/plan/append_join.cpp | 8 ++-- src/planner/plan/plan_join_order.cpp | 11 +++--- src/planner/plan/plan_read.cpp | 4 +- src/planner/plan/plan_subquery.cpp | 37 ++++++++++++++----- .../exceptions/binder/binder_error.test | 8 ---- .../update_node/create_read_tinysnb.test | 25 +++++++++++++ .../update_node/delete_tinysnb.test | 5 +++ test/test_files/update_node/set_read.test | 9 +++++ .../update_rel/create_read_tinysnb.test | 12 ++++++ .../test_files/update_rel/delete_tinysnb.test | 14 +++++++ .../update_rel/set_read_tinysnb.test | 10 +++++ 21 files changed, 187 insertions(+), 88 deletions(-) diff --git a/src/binder/bind/bind_query.cpp b/src/binder/bind/bind_query.cpp index 12beed581bc..9873a8fc54e 100644 --- a/src/binder/bind/bind_query.cpp +++ b/src/binder/bind/bind_query.cpp @@ -53,7 +53,6 @@ std::unique_ptr Binder::bindQuery(const RegularQuery& regular auto boundRegularQuery = std::make_unique( regularQuery.getIsUnionAll(), normalizedSingleQueries[0].getStatementResult()->copy()); for (auto& normalizedSingleQuery : normalizedSingleQueries) { - validateReadNotFollowUpdate(normalizedSingleQuery); boundRegularQuery->addSingleQuery(std::move(normalizedSingleQuery)); } validateIsAllUnionOrUnionAll(*boundRegularQuery); diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index be764c123d0..e3ec0be181a 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -153,18 +153,6 @@ void Binder::validateOrderByFollowedBySkipOrLimitInWithClause( } } -void Binder::validateReadNotFollowUpdate(const NormalizedSingleQuery& singleQuery) { - bool hasSeenUpdateClause = false; - for (auto i = 0u; i < singleQuery.getNumQueryParts(); ++i) { - auto normalizedQueryPart = singleQuery.getQueryPart(i); - if (hasSeenUpdateClause && normalizedQueryPart->hasReadingClause()) { - throw BinderException( - "Read after update is not supported. Try query with multiple statements."); - } - hasSeenUpdateClause |= normalizedQueryPart->hasUpdatingClause(); - } -} - void Binder::validateTableType(table_id_t tableID, TableType expectedTableType) { auto tableEntry = clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), tableID); diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index bc45de246bf..8cf55fab538 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -273,10 +273,6 @@ class Binder { static void validateOrderByFollowedBySkipOrLimitInWithClause( const BoundProjectionBody& boundProjectionBody); - // We don't support read after write for simplicity. User should instead querying through - // multiple statement. - static void validateReadNotFollowUpdate(const NormalizedSingleQuery& singleQuery); - void validateTableType(common::table_id_t tableID, common::TableType expectedTableType); void validateTableExist(const std::string& tableName); diff --git a/src/include/planner/operator/logical_operator.h b/src/include/planner/operator/logical_operator.h index 6bcbf104e64..4c65a8ea540 100644 --- a/src/include/planner/operator/logical_operator.h +++ b/src/include/planner/operator/logical_operator.h @@ -58,9 +58,9 @@ enum class LogicalOperatorType : uint8_t { IMPORT_DATABASE, }; -class LogicalOperatorUtils { -public: +struct LogicalOperatorUtils { static std::string logicalOperatorTypeToString(LogicalOperatorType type); + static bool isUpdate(LogicalOperatorType type); }; class LogicalOperator; @@ -68,35 +68,33 @@ using logical_op_vector_t = std::vector>; class LogicalOperator { public: - // Leaf operator. explicit LogicalOperator(LogicalOperatorType operatorType) : operatorType{operatorType} {} - // Unary operator. explicit LogicalOperator( LogicalOperatorType operatorType, std::shared_ptr child); - // Binary operator. explicit LogicalOperator(LogicalOperatorType operatorType, std::shared_ptr left, std::shared_ptr right); explicit LogicalOperator(LogicalOperatorType operatorType, const logical_op_vector_t& children); virtual ~LogicalOperator() = default; - inline uint32_t getNumChildren() const { return children.size(); } - - inline std::shared_ptr getChild(uint64_t idx) const { return children[idx]; } - inline std::vector> getChildren() const { return children; } - inline void setChild(uint64_t idx, std::shared_ptr child) { + uint32_t getNumChildren() const { return children.size(); } + std::shared_ptr getChild(uint64_t idx) const { return children[idx]; } + std::vector> getChildren() const { return children; } + void setChild(uint64_t idx, std::shared_ptr child) { children[idx] = std::move(child); } - inline void setChildren(logical_op_vector_t children_) { children = std::move(children_); } - inline LogicalOperatorType getOperatorType() const { return operatorType; } + // Operator type. + LogicalOperatorType getOperatorType() const { return operatorType; } + bool hasUpdateRecursive(); - inline Schema* getSchema() const { return schema.get(); } + // Schema + Schema* getSchema() const { return schema.get(); } virtual void computeFactorizedSchema() = 0; virtual void computeFlatSchema() = 0; + // Printing. virtual std::string getExpressionsForPrinting() const = 0; - // Print the sub-plan rooted at this operator. virtual std::string toString(uint64_t depth = 0) const; @@ -105,8 +103,8 @@ class LogicalOperator { static logical_op_vector_t copy(const logical_op_vector_t& ops); protected: - inline void createEmptySchema() { schema = std::make_unique(); } - inline void copyChildSchema(uint32_t idx) { schema = children[idx]->getSchema()->copy(); } + void createEmptySchema() { schema = std::make_unique(); } + void copyChildSchema(uint32_t idx) { schema = children[idx]->getSchema()->copy(); } protected: LogicalOperatorType operatorType; diff --git a/src/include/planner/operator/logical_plan.h b/src/include/planner/operator/logical_plan.h index 8948e01382e..40ae4c15a15 100644 --- a/src/include/planner/operator/logical_plan.h +++ b/src/include/planner/operator/logical_plan.h @@ -1,6 +1,5 @@ #pragma once -#include "logical_explain.h" #include "logical_operator.h" namespace kuzu { @@ -13,28 +12,23 @@ class LogicalPlan { public: LogicalPlan() : estCardinality{1}, cost{0} {} - inline void setLastOperator(std::shared_ptr op) { - lastOperator = std::move(op); - } + void setLastOperator(std::shared_ptr op) { lastOperator = std::move(op); } - inline bool isEmpty() const { return lastOperator == nullptr; } + bool isEmpty() const { return lastOperator == nullptr; } - inline std::shared_ptr getLastOperator() const { return lastOperator; } - inline Schema* getSchema() const { return lastOperator->getSchema(); } + std::shared_ptr getLastOperator() const { return lastOperator; } + Schema* getSchema() const { return lastOperator->getSchema(); } - inline void setCardinality(uint64_t cardinality) { estCardinality = cardinality; } - inline uint64_t getCardinality() const { return estCardinality; } + void setCardinality(uint64_t cardinality) { estCardinality = cardinality; } + uint64_t getCardinality() const { return estCardinality; } - inline void setCost(uint64_t cost_) { cost = cost_; } - inline uint64_t getCost() const { return cost; } + void setCost(uint64_t cost_) { cost = cost_; } + uint64_t getCost() const { return cost; } - inline std::string toString() const { return lastOperator->toString(); } + std::string toString() const { return lastOperator->toString(); } - inline bool isProfile() const { - return lastOperator->getOperatorType() == LogicalOperatorType::EXPLAIN && - reinterpret_cast(lastOperator.get())->getExplainType() == - common::ExplainType::PROFILE; - } + bool isProfile() const; + bool hasUpdate() const; std::unique_ptr shallowCopy() const; diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index df62cd059a8..594b78359f9 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -225,7 +225,7 @@ class Planner { // Append Join operators void appendHashJoin(const binder::expression_vector& joinNodeIDs, common::JoinType joinType, - LogicalPlan& probePlan, LogicalPlan& buildPlan); + LogicalPlan& probePlan, LogicalPlan& buildPlan, LogicalPlan& resultPlan); void appendMarkJoin(const binder::expression_vector& joinNodeIDs, const std::shared_ptr& mark, LogicalPlan& probePlan, LogicalPlan& buildPlan); @@ -233,8 +233,8 @@ class Planner { binder::expression_vector& boundNodeIDs, LogicalPlan& probePlan, std::vector>& buildPlans); - void appendCrossProduct( - common::AccumulateType accumulateType, LogicalPlan& probePlan, LogicalPlan& buildPlan); + void appendCrossProduct(common::AccumulateType accumulateType, const LogicalPlan& probePlan, + const LogicalPlan& buildPlan, LogicalPlan& resultPlan); // Append accumulate void appendAccumulate(common::AccumulateType accumulateType, LogicalPlan& plan); diff --git a/src/planner/operator/logical_operator.cpp b/src/planner/operator/logical_operator.cpp index b2d60c56884..2544e9a1756 100644 --- a/src/planner/operator/logical_operator.cpp +++ b/src/planner/operator/logical_operator.cpp @@ -108,6 +108,20 @@ std::string LogicalOperatorUtils::logicalOperatorTypeToString(LogicalOperatorTyp } } +bool LogicalOperatorUtils::isUpdate(LogicalOperatorType type) { + switch (type) { + case LogicalOperatorType::INSERT: + case LogicalOperatorType::DELETE_NODE: + case LogicalOperatorType::DELETE_REL: + case LogicalOperatorType::SET_NODE_PROPERTY: + case LogicalOperatorType::SET_REL_PROPERTY: + case LogicalOperatorType::MERGE: + return true; + default: + return false; + } +} + LogicalOperator::LogicalOperator( LogicalOperatorType operatorType, std::shared_ptr child) : operatorType{operatorType} { @@ -129,6 +143,18 @@ LogicalOperator::LogicalOperator( } } +bool LogicalOperator::hasUpdateRecursive() { + if (LogicalOperatorUtils::isUpdate(operatorType)) { + return true; + } + for (auto& child : children) { + if (child->hasUpdateRecursive()) { + return true; + } + } + return false; +} + std::string LogicalOperator::toString(uint64_t depth) const { auto padding = std::string(depth * 4, ' '); std::string result = padding; diff --git a/src/planner/operator/logical_plan.cpp b/src/planner/operator/logical_plan.cpp index 7a20fa88316..cbce3288054 100644 --- a/src/planner/operator/logical_plan.cpp +++ b/src/planner/operator/logical_plan.cpp @@ -1,8 +1,20 @@ #include "planner/operator/logical_plan.h" +#include "planner/operator/logical_explain.h" + namespace kuzu { namespace planner { +bool LogicalPlan::isProfile() const { + return lastOperator->getOperatorType() == LogicalOperatorType::EXPLAIN && + reinterpret_cast(lastOperator.get())->getExplainType() == + common::ExplainType::PROFILE; +} + +bool LogicalPlan::hasUpdate() const { + return lastOperator->hasUpdateRecursive(); +} + std::unique_ptr LogicalPlan::shallowCopy() const { auto plan = std::make_unique(); plan->lastOperator = lastOperator; // shallow copy sub-plan diff --git a/src/planner/plan/append_cross_product.cpp b/src/planner/plan/append_cross_product.cpp index 80c7758c6f5..5482a79d871 100644 --- a/src/planner/plan/append_cross_product.cpp +++ b/src/planner/plan/append_cross_product.cpp @@ -6,16 +6,16 @@ using namespace kuzu::common; namespace kuzu { namespace planner { -void Planner::appendCrossProduct( - AccumulateType accumulateType, LogicalPlan& probePlan, LogicalPlan& buildPlan) { +void Planner::appendCrossProduct(AccumulateType accumulateType, const LogicalPlan& probePlan, + const LogicalPlan& buildPlan, LogicalPlan& resultPlan) { auto crossProduct = make_shared( accumulateType, probePlan.getLastOperator(), buildPlan.getLastOperator()); crossProduct->computeFactorizedSchema(); // update cost - probePlan.setCost(probePlan.getCardinality() + buildPlan.getCardinality()); + resultPlan.setCost(probePlan.getCardinality() + buildPlan.getCardinality()); // update cardinality - probePlan.setCardinality(cardinalityEstimator.estimateCrossProduct(probePlan, buildPlan)); - probePlan.setLastOperator(std::move(crossProduct)); + resultPlan.setCardinality(cardinalityEstimator.estimateCrossProduct(probePlan, buildPlan)); + resultPlan.setLastOperator(std::move(crossProduct)); } } // namespace planner diff --git a/src/planner/plan/append_extend.cpp b/src/planner/plan/append_extend.cpp index 06b80947072..e41d7353165 100644 --- a/src/planner/plan/append_extend.cpp +++ b/src/planner/plan/append_extend.cpp @@ -145,7 +145,8 @@ void Planner::appendNonRecursiveExtend(const std::shared_ptr& bo appendScanInternalID(rdfInfo->predicateID, rdfInfo->resourceTableIDs, *tmpPlan); appendScanNodeProperties( rdfInfo->predicateID, rdfInfo->resourceTableIDs, expression_vector{iri}, *tmpPlan); - appendHashJoin(expression_vector{rdfInfo->predicateID}, JoinType::INNER, plan, *tmpPlan); + appendHashJoin( + expression_vector{rdfInfo->predicateID}, JoinType::INNER, plan, *tmpPlan, plan); } } diff --git a/src/planner/plan/append_join.cpp b/src/planner/plan/append_join.cpp index b071e3d2bdb..498d6b335c9 100644 --- a/src/planner/plan/append_join.cpp +++ b/src/planner/plan/append_join.cpp @@ -9,7 +9,7 @@ namespace kuzu { namespace planner { void Planner::appendHashJoin(const binder::expression_vector& joinNodeIDs, JoinType joinType, - LogicalPlan& probePlan, LogicalPlan& buildPlan) { + LogicalPlan& probePlan, LogicalPlan& buildPlan, LogicalPlan& resultPlan) { std::vector joinConditions; for (auto& joinNodeID : joinNodeIDs) { joinConditions.emplace_back(joinNodeID, joinNodeID); @@ -32,11 +32,11 @@ void Planner::appendHashJoin(const binder::expression_vector& joinNodeIDs, JoinT hashJoin->setSIP(SidewaysInfoPassing::PROHIBIT_BUILD_TO_PROBE); } // Update cost - probePlan.setCost(CostModel::computeHashJoinCost(joinNodeIDs, probePlan, buildPlan)); + resultPlan.setCost(CostModel::computeHashJoinCost(joinNodeIDs, probePlan, buildPlan)); // Update cardinality - probePlan.setCardinality( + resultPlan.setCardinality( cardinalityEstimator.estimateHashJoin(joinNodeIDs, probePlan, buildPlan)); - probePlan.setLastOperator(std::move(hashJoin)); + resultPlan.setLastOperator(std::move(hashJoin)); } void Planner::appendMarkJoin(const binder::expression_vector& joinNodeIDs, diff --git a/src/planner/plan/plan_join_order.cpp b/src/planner/plan/plan_join_order.cpp index c6e66725ed3..9ad0633231a 100644 --- a/src/planner/plan/plan_join_order.cpp +++ b/src/planner/plan/plan_join_order.cpp @@ -561,8 +561,8 @@ void Planner::planInnerHashJoin(const SubqueryGraph& subgraph, const SubqueryGra if (CostModel::computeHashJoinCost(joinNodeIDs, *leftPlan, *rightPlan) < maxCost) { auto leftPlanProbeCopy = leftPlan->shallowCopy(); auto rightPlanBuildCopy = rightPlan->shallowCopy(); - appendHashJoin( - joinNodeIDs, JoinType::INNER, *leftPlanProbeCopy, *rightPlanBuildCopy); + appendHashJoin(joinNodeIDs, JoinType::INNER, *leftPlanProbeCopy, + *rightPlanBuildCopy, *leftPlanProbeCopy); appendFilters(predicates, *leftPlanProbeCopy); context.addPlan(newSubgraph, std::move(leftPlanProbeCopy)); } @@ -571,8 +571,8 @@ void Planner::planInnerHashJoin(const SubqueryGraph& subgraph, const SubqueryGra CostModel::computeHashJoinCost(joinNodeIDs, *rightPlan, *leftPlan) < maxCost) { auto leftPlanBuildCopy = leftPlan->shallowCopy(); auto rightPlanProbeCopy = rightPlan->shallowCopy(); - appendHashJoin( - joinNodeIDs, JoinType::INNER, *rightPlanProbeCopy, *leftPlanBuildCopy); + appendHashJoin(joinNodeIDs, JoinType::INNER, *rightPlanProbeCopy, + *leftPlanBuildCopy, *rightPlanProbeCopy); appendFilters(predicates, *rightPlanProbeCopy); context.addPlan(newSubgraph, std::move(rightPlanProbeCopy)); } @@ -588,7 +588,8 @@ std::vector> Planner::planCrossProduct( for (auto& rightPlan : rightPlans) { auto leftPlanCopy = leftPlan->shallowCopy(); auto rightPlanCopy = rightPlan->shallowCopy(); - appendCrossProduct(AccumulateType::REGULAR, *leftPlanCopy, *rightPlanCopy); + appendCrossProduct( + AccumulateType::REGULAR, *leftPlanCopy, *rightPlanCopy, *leftPlanCopy); result.push_back(std::move(leftPlanCopy)); } } diff --git a/src/planner/plan/plan_read.cpp b/src/planner/plan/plan_read.cpp index 01e106e7e07..a366e1c5d72 100644 --- a/src/planner/plan/plan_read.cpp +++ b/src/planner/plan/plan_read.cpp @@ -103,7 +103,7 @@ void Planner::planInQueryCall( if (!predicatesToPushDown.empty()) { appendFilters(predicatesToPushDown, *tmpPlan); } - appendCrossProduct(AccumulateType::REGULAR, *plan, *tmpPlan); + appendCrossProduct(AccumulateType::REGULAR, *plan, *tmpPlan, *plan); } else { appendInQueryCall(*readingClause, *plan); if (!predicatesToPushDown.empty()) { @@ -139,7 +139,7 @@ void Planner::planLoadFrom( if (!predicatesToPushDown.empty()) { appendFilters(predicatesToPushDown, *tmpPlan); } - appendCrossProduct(AccumulateType::REGULAR, *plan, *tmpPlan); + appendCrossProduct(AccumulateType::REGULAR, *plan, *tmpPlan, *plan); } else { appendScanFile(loadFrom->getInfo(), *plan); if (!predicatesToPushDown.empty()) { diff --git a/src/planner/plan/plan_subquery.cpp b/src/planner/plan/plan_subquery.cpp index 90c28fdaa62..416324af5e9 100644 --- a/src/planner/plan/plan_subquery.cpp +++ b/src/planner/plan/plan_subquery.cpp @@ -39,7 +39,11 @@ void Planner::planOptionalMatch(const QueryGraphCollection& queryGraphCollection if (correlatedExpressions.empty()) { // No join condition, apply cross product. auto rightPlan = planQueryGraphCollection(queryGraphCollection, predicates); - appendCrossProduct(AccumulateType::OPTIONAL_, leftPlan, *rightPlan); + if (leftPlan.hasUpdate()) { + appendCrossProduct(AccumulateType::OPTIONAL_, *rightPlan, leftPlan, leftPlan); + } else { + appendCrossProduct(AccumulateType::OPTIONAL_, leftPlan, *rightPlan, leftPlan); + } return; } bool isInternalIDCorrelated = ExpressionUtil::isExpressionsWithDataType( @@ -57,7 +61,11 @@ void Planner::planOptionalMatch(const QueryGraphCollection& queryGraphCollection correlatedExpressions, leftPlan.getCardinality(), queryGraphCollection, predicates); appendAccumulate(AccumulateType::REGULAR, correlatedExpressions, leftPlan); } - appendHashJoin(correlatedExpressions, JoinType::LEFT, leftPlan, *rightPlan); + if (leftPlan.hasUpdate()) { + throw RuntimeException(stringFormat("Optional match after update is not supported. Missing " + "right outer join implementation.")); + } + appendHashJoin(correlatedExpressions, JoinType::LEFT, leftPlan, *rightPlan, leftPlan); } void Planner::planRegularMatch(const QueryGraphCollection& queryGraphCollection, @@ -76,18 +84,26 @@ void Planner::planRegularMatch(const QueryGraphCollection& queryGraphCollection, } auto joinNodeIDs = ExpressionUtil::getExpressionsWithDataType( correlatedExpressions, LogicalTypeID::INTERNAL_ID); - std::unique_ptr rightPlan; if (joinNodeIDs.empty()) { - rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::NONE, correlatedExpressions, - leftPlan.getCardinality(), queryGraphCollection, predicatesToPushDown); - appendCrossProduct(AccumulateType::REGULAR, leftPlan, *rightPlan); + auto rightPlan = + planQueryGraphCollectionInNewContext(SubqueryType::NONE, correlatedExpressions, + leftPlan.getCardinality(), queryGraphCollection, predicatesToPushDown); + if (leftPlan.hasUpdate()) { + appendCrossProduct(AccumulateType::REGULAR, *rightPlan, leftPlan, leftPlan); + } else { + appendCrossProduct(AccumulateType::REGULAR, leftPlan, *rightPlan, leftPlan); + } } else { // TODO(Xiyang): there is a question regarding if we want to plan as a correlated subquery // Multi-part query is actually CTE and CTE can be considered as a subquery but does not // scan from outer. - rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::INTERNAL_ID_CORRELATED, + auto rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::INTERNAL_ID_CORRELATED, joinNodeIDs, leftPlan.getCardinality(), queryGraphCollection, predicatesToPushDown); - appendHashJoin(joinNodeIDs, JoinType::INNER, leftPlan, *rightPlan); + if (leftPlan.hasUpdate()) { + appendHashJoin(joinNodeIDs, JoinType::INNER, *rightPlan, leftPlan, leftPlan); + } else { + appendHashJoin(joinNodeIDs, JoinType::INNER, leftPlan, *rightPlan, leftPlan); + } } for (auto& predicate : predicatesToPullUp) { appendFilter(predicate, leftPlan); @@ -116,7 +132,7 @@ void Planner::planSubquery(const std::shared_ptr& expression, Logica default: KU_UNREACHABLE; } - appendCrossProduct(AccumulateType::REGULAR, outerPlan, *innerPlan); + appendCrossProduct(AccumulateType::REGULAR, outerPlan, *innerPlan, outerPlan); } else { auto isInternalIDCorrelated = ExpressionUtil::isExpressionsWithDataType(correlatedExprs, LogicalTypeID::INTERNAL_ID); @@ -137,7 +153,8 @@ void Planner::planSubquery(const std::shared_ptr& expression, Logica case common::SubqueryType::COUNT: { appendAggregate( correlatedExprs, expression_vector{subquery->getProjectionExpr()}, *innerPlan); - appendHashJoin(correlatedExprs, common::JoinType::COUNT, outerPlan, *innerPlan); + appendHashJoin( + correlatedExprs, common::JoinType::COUNT, outerPlan, *innerPlan, outerPlan); } break; default: KU_UNREACHABLE; diff --git a/test/test_files/exceptions/binder/binder_error.test b/test/test_files/exceptions/binder/binder_error.test index c6f3e8c2d6c..b9381ee22c8 100644 --- a/test/test_files/exceptions/binder/binder_error.test +++ b/test/test_files/exceptions/binder/binder_error.test @@ -241,14 +241,6 @@ Binder exception: p1.age has data type INT64 but (STRING) was expected. ---- error Binder exception: Union and union all can not be used together. --LOG ReadAfterUpdate --STATEMENT MATCH (a:person) SET a.age = 35 WITH a MATCH (a)-[:knows]->(b:person) RETURN a.age ----- error -Binder exception: Read after update is not supported. Try query with multiple statements. --STATEMENT MATCH (a:person) WHERE a.age = 35 DELETE a WITH a MATCH (a)-[:knows]->(b:person) RETURN a.age ----- error -Binder exception: Read after update is not supported. Try query with multiple statements. - -LOG SetDataTypeMisMatch -STATEMENT MATCH (a:person) SET a.age = 'hh' ---- error diff --git a/test/test_files/update_node/create_read_tinysnb.test b/test/test_files/update_node/create_read_tinysnb.test index 52453a173dd..d97bfc34a9d 100644 --- a/test/test_files/update_node/create_read_tinysnb.test +++ b/test/test_files/update_node/create_read_tinysnb.test @@ -4,6 +4,19 @@ -- -CASE CreateNodeRead1 +-STATEMENT CREATE (a:person {ID:91, fName:'dummy'}) WITH a MATCH (b:person) WHERE b.ID > 9 RETURN a.ID, a.fName, b.ID, b.fName; +---- 2 +91|dummy|10|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff +91|dummy|91|dummy +-STATEMENT CREATE (a:person {ID:93, fName:'dummy'}) WITH a MATCH (b:person) WHERE b.ID = a.ID - 90 RETURN a.ID, a.fName, b.ID, b.fName; +---- 1 +93|dummy|3|Carol +-STATEMENT MATCH (a:person) WHERE a.ID < 3 CREATE (b:person {ID:a.ID+100, fName:a.fName}) WITH a, b MATCH (c:person) WHERE c.ID > 99 RETURN a.ID, a.fName, b.ID, b.fName, c.ID, c.fName; +---- 4 +0|Alice|100|Alice|100|Alice +0|Alice|100|Alice|102|Bob +2|Bob|102|Bob|100|Alice +2|Bob|102|Bob|102|Bob -STATEMENT CREATE (a:person {ID:80, isWorker:true,age:22,eyeSight:1.1}) RETURN a.ID, a.age, a.fName, a.eyeSight; ---- 1 80|22||1.100000 @@ -11,6 +24,18 @@ ---- 1 {_ID: 1:3, _LABEL: organisation, ID: 0, name: test}| + +-CASE OptionalMatchAfterInsert +-STATEMENT CREATE (a:person {ID:200, fName:'test'}) WITH a OPTIONAL MATCH (b:person) RETURN COUNT(*); +---- 1 +9 +-STATEMENT CREATE (a:person {ID:201, fName:'test'}) WITH a OPTIONAL MATCH (b:person) WHERE b.ID > a.ID RETURN COUNT(b); +---- error +Runtime exception: Optional match after update is not supported. Missing right outer join implementation. +-STATEMENT CREATE (a:person {ID:202, fName:'test'}) WITH a OPTIONAL MATCH (a)-[]->(b) RETURN COUNT(*); +---- error +Runtime exception: Optional match after update is not supported. Missing right outer join implementation. + -CASE CreateNodeRead2 -STATEMENT MATCH (a:person) WHERE a.ID < 3 CREATE (b:person {ID: a.ID + 11, fName: 'new', age:a.age * 2}) RETURN a.ID, a.fName, a.age, b.ID, b.fName, b.age diff --git a/test/test_files/update_node/delete_tinysnb.test b/test/test_files/update_node/delete_tinysnb.test index b20d4dc7930..b4de091397a 100644 --- a/test/test_files/update_node/delete_tinysnb.test +++ b/test/test_files/update_node/delete_tinysnb.test @@ -13,6 +13,11 @@ -STATEMENT MATCH (a:person) WHERE a.ID = 101 RETURN a.ID, a.fName, a.age ---- 1 101|| +-STATEMENT MATCH (a:person) WHERE a.ID = 0 DETACH DELETE a WITH a MATCH (b:person) WHERE b.ID < 6 RETURN a.ID, b.ID; +---- 3 +0|2 +0|3 +0|5 -CASE MixedDeleteInsertTest -STATEMENT CREATE (a:organisation {ID:30, mark:3.3}) diff --git a/test/test_files/update_node/set_read.test b/test/test_files/update_node/set_read.test index fcf4277d9c2..fd4ca398bb3 100644 --- a/test/test_files/update_node/set_read.test +++ b/test/test_files/update_node/set_read.test @@ -19,6 +19,15 @@ -STATEMENT MATCH (a:person) WHERE a.ID=0 RETURN a.age, a.gender, a.fName ---- 1 70|1| +-STATEMENT MATCH (a:person) WHERE a.ID=0 SET a.fName = 'XX' WITH a MATCH (b:person) WHERE b.ID < 6 RETURN a.ID, a.fName, b.ID, b.fName; +---- 4 +0|XX|0|XX +0|XX|2|Bob +0|XX|3|Carol +0|XX|5|Dan +-STATEMENT MATCH (a:person) WHERE a.ID=2 SET a.fName = 'BB' WITH a MATCH (b:person) WHERE b.ID=a.ID RETURN a.ID, a.fName, b.ID, b.fName; +---- 1 +2|BB|2|BB -CASE SetReadTest2 -STATEMENT CREATE NODE TABLE play(ID INT64, name STRING, PRIMARY KEY(ID)); diff --git a/test/test_files/update_rel/create_read_tinysnb.test b/test/test_files/update_rel/create_read_tinysnb.test index 6ba899b6b5e..4d9fe9dd754 100644 --- a/test/test_files/update_rel/create_read_tinysnb.test +++ b/test/test_files/update_rel/create_read_tinysnb.test @@ -18,6 +18,18 @@ (0:0)-{_LABEL: knows, _ID: 3:0, date: 2021-06-30, meetTime: 1986-10-21 21:08:31.521, validInterval: 10 years 5 months 13:00:00.000024, comments: [rnme,m8sihsdnf2990nfiwf], summary: {locations: ['toronto','waterloo'], transfer: {day: 2021-01-02, amount: [100,200]}}, notes: 1, someMap: {a=b}}->(0:1) (0:0)-{_LABEL: knows, _ID: 3:14, date: 2023-03-03}->(0:1) (0:0)-{_LABEL: knows, _ID: 3:15, date: 2023-04-04}->(0:1) +-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 2 CREATE (a)-[e:knows {date:date('2024-01-01')}]-(b) WITH a MATCH (a)-[e:knows]->(b) RETURN a.fName, e.date, b.fName; +---- 6 +Alice|2021-06-30|Bob +Alice|2021-06-30|Carol +Alice|2021-06-30|Dan +Alice|2023-03-03|Bob +Alice|2023-04-04|Bob +Alice|2024-01-01|Bob +-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 2 CREATE (a)-[e:knows {date:date('2023-12-20')}]-(b) WITH a, e MATCH (a)-[e2:knows]->(b) WHERE e.date<=e2.date RETURN a.fName, e.date, e2.date, b.fName; +---- 2 +Alice|2023-12-20|2023-12-20|Bob +Alice|2023-12-20|2024-01-01|Bob -CASE CreateRelRead2 -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID = 0 CREATE (a)-[f:knows {date:date('2023-04-04')}]->(b) RETURN f; diff --git a/test/test_files/update_rel/delete_tinysnb.test b/test/test_files/update_rel/delete_tinysnb.test index afb7e44c240..acec18d8748 100644 --- a/test/test_files/update_rel/delete_tinysnb.test +++ b/test/test_files/update_rel/delete_tinysnb.test @@ -14,6 +14,20 @@ -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID=0 RETURN COUNT(*) ---- 1 2 +-STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID=2 AND b.ID = 0 DELETE e WITH e MATCH (a:person)-[e2:knows]->(b:person) RETURN e.date, a.fName, e2.date, b.fName; +---- 12 +2021-06-30|Alice|2021-06-30|Bob +2021-06-30|Alice|2021-06-30|Dan +2021-06-30|Bob|1950-05-14|Carol +2021-06-30|Bob|1950-05-14|Dan +2021-06-30|Carol|1950-05-14|Bob +2021-06-30|Carol|2000-01-01|Dan +2021-06-30|Carol|2021-06-30|Alice +2021-06-30|Dan|1950-05-14|Bob +2021-06-30|Dan|2000-01-01|Carol +2021-06-30|Dan|2021-06-30|Alice +2021-06-30|Elizabeth|1905-12-12|Farooq +2021-06-30|Elizabeth|1905-12-12|Greg -CASE DeleteFromKnows2 -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID=0 AND b.ID>=3 DELETE e diff --git a/test/test_files/update_rel/set_read_tinysnb.test b/test/test_files/update_rel/set_read_tinysnb.test index c4f8680b08c..660f182264b 100644 --- a/test/test_files/update_rel/set_read_tinysnb.test +++ b/test/test_files/update_rel/set_read_tinysnb.test @@ -18,6 +18,16 @@ -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID=0 AND b.ID=5 RETURN e.date; ---- 1 +-STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID=0 AND b.ID=5 SET e.date=date('1999-01-02') WITH e MATCH (x:person)-[e2:knows]->(y:person) WHERE e2.date <= e.date RETURN e.date, x.fName, e2.date, y.fName; +---- 7 +1999-01-02|Alice|1999-01-02|Dan +1999-01-02|Bob|1950-05-14|Carol +1999-01-02|Bob|1950-05-14|Dan +1999-01-02|Carol|1950-05-14|Bob +1999-01-02|Dan|1950-05-14|Bob +1999-01-02|Elizabeth|1905-12-12|Farooq +1999-01-02|Elizabeth|1905-12-12|Greg + -CASE SetReadTest2 -STATEMENT CREATE REL TABLE play(FROM person TO person, date DATE, year INT64); ---- ok From 80b3e9466c61249f0a630c74fd29bd1062e7404a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Tue, 26 Mar 2024 21:07:32 +0800 Subject: [PATCH 091/136] Factor out benchmark workflow and enable manual trigger for it (#3144) --- .github/workflows/benchmark-workflow.yml | 20 ++++++++++++++++++++ .github/workflows/ci-workflow.yml | 13 +------------ 2 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/benchmark-workflow.yml diff --git a/.github/workflows/benchmark-workflow.yml b/.github/workflows/benchmark-workflow.yml new file mode 100644 index 00000000000..427e0fd64e8 --- /dev/null +++ b/.github/workflows/benchmark-workflow.yml @@ -0,0 +1,20 @@ +name: Benchmark +on: + workflow_dispatch: + workflow_call: + +jobs: + benchmark: + name: benchmark + env: + NUM_THREADS: 30 + GEN: ninja + runs-on: kuzu-self-hosted-benchmarking + steps: + - uses: actions/checkout@v3 + + - name: Build + run: make benchmark LTO=1 + + - name: Benchmark + run: python3 benchmark/benchmark_runner.py --dataset ldbc-sf100 --thread 10 diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 0d5ff02938e..ed5dfe206b1 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -377,18 +377,7 @@ jobs: benchmark: name: benchmark needs: [gcc-build-test, clang-build-test] - env: - NUM_THREADS: 30 - GEN: ninja - runs-on: kuzu-self-hosted-benchmarking - steps: - - uses: actions/checkout@v3 - - - name: Build - run: make benchmark LTO=1 - - - name: Benchmark - run: python3 benchmark/benchmark_runner.py --dataset ldbc-sf100 --thread 10 + uses: ./.github/workflows/benchmark-workflow.yml macos-clang-tidy: name: macos clang tidy & clangd diagnostics check From 3237e6fdbc6e7701c00478bdf73c5820579ce78d Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Tue, 26 Mar 2024 10:32:00 -0400 Subject: [PATCH 092/136] Implement postgres-scanner (#3139) Implement postgres-scanner --- .github/workflows/ci-workflow.yml | 38 +++ Makefile | 10 +- extension/CMakeLists.txt | 4 + extension/duckdb_scanner/CMakeLists.txt | 6 - .../duckdb_scanner/src/duckdb_catalog.cpp | 113 +++++++- extension/duckdb_scanner/src/duckdb_scan.cpp | 17 +- .../duckdb_scanner/src/duckdb_storage.cpp | 76 +----- .../src/include/duckdb_catalog.h | 34 ++- .../duckdb_scanner/src/include/duckdb_scan.h | 7 +- .../src/include/duckdb_scanner_extension.h | 2 +- .../src/include/duckdb_storage.h | 2 +- extension/postgres_scanner/CMakeLists.txt | 58 +++++ .../src/include/postgres_catalog.h | 50 ++++ .../src/include/postgres_scanner_extension.h | 15 ++ .../src/include/postgres_storage.h | 17 ++ .../postgres_scanner/src/postgres_catalog.cpp | 46 ++++ .../src/postgres_scanner_extension.cpp | 27 ++ .../postgres_scanner/src/postgres_storage.cpp | 40 +++ .../test/test_files/create_test_db.sql | 241 ++++++++++++++++++ .../test/test_files/postgres_scanner.test | 49 ++++ src/include/catalog/catalog_content.h | 2 + 21 files changed, 746 insertions(+), 108 deletions(-) create mode 100644 extension/postgres_scanner/CMakeLists.txt create mode 100644 extension/postgres_scanner/src/include/postgres_catalog.h create mode 100644 extension/postgres_scanner/src/include/postgres_scanner_extension.h create mode 100644 extension/postgres_scanner/src/include/postgres_storage.h create mode 100644 extension/postgres_scanner/src/postgres_catalog.cpp create mode 100644 extension/postgres_scanner/src/postgres_scanner_extension.cpp create mode 100644 extension/postgres_scanner/src/postgres_storage.cpp create mode 100644 extension/postgres_scanner/test/test_files/create_test_db.sql create mode 100644 extension/postgres_scanner/test/test_files/postgres_scanner.test diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index ed5dfe206b1..3a95184de93 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -46,6 +46,15 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + - name: Ensure Python dependencies run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -179,6 +188,15 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + - name: Ensure Python dependencies run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -225,10 +243,20 @@ jobs: AWS_S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + PG_HOST: ${{ secrets.PG_HOST }} RUN_ID: "$(hostname)-$([Math]::Floor((Get-Date).TimeOfDay.TotalSeconds))" steps: - uses: actions/checkout@v3 + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + - name: Ensure Python dependencies run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -419,10 +447,20 @@ jobs: AWS_S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + PG_HOST: ${{ secrets.PG_HOST }} RUN_ID: "$(hostname)-$(date +%s)" steps: - uses: actions/checkout@v3 + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + - name: Ensure Python dependencies run: | pip3 install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu diff --git a/Makefile b/Makefile index e00fbcb71f8..1eeae88d6a6 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ allconfig: $(call config-cmake-release, \ -DBUILD_BENCHMARK=TRUE \ -DBUILD_EXAMPLES=TRUE \ - -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner;postgres_scanner" \ -DBUILD_JAVA=TRUE \ -DBUILD_NODEJS=TRUE \ -DBUILD_PYTHON=TRUE \ @@ -79,7 +79,7 @@ alldebug: $(call run-cmake-debug, \ -DBUILD_BENCHMARK=TRUE \ -DBUILD_EXAMPLES=TRUE \ - -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner;postgres_scanner" \ -DBUILD_JAVA=TRUE \ -DBUILD_NODEJS=TRUE \ -DBUILD_PYTHON=TRUE \ @@ -156,7 +156,7 @@ example: extension-test: $(call run-cmake-release, \ - -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner;postgres_scanner" \ -DBUILD_EXTENSION_TESTS=TRUE \ ) ctest --test-dir build/release/extension --output-on-failure -j ${TEST_JOBS} @@ -164,13 +164,13 @@ extension-test: extension-debug: $(call run-cmake-debug, \ - -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner;postgres_scanner" \ -DBUILD_KUZU=FALSE \ ) extension-release: $(call run-cmake-release, \ - -DBUILD_EXTENSIONS="httpfs;duckdb_scanner" \ + -DBUILD_EXTENSIONS="httpfs;duckdb_scanner;postgres_scanner" \ -DBUILD_KUZU=FALSE \ ) diff --git a/extension/CMakeLists.txt b/extension/CMakeLists.txt index 53043bc5896..0f362842346 100644 --- a/extension/CMakeLists.txt +++ b/extension/CMakeLists.txt @@ -10,6 +10,10 @@ if ("duckdb_scanner" IN_LIST BUILD_EXTENSIONS) endif() endif() +if ("postgres_scanner" IN_LIST BUILD_EXTENSIONS) + add_subdirectory(postgres_scanner) +endif() + if (${BUILD_EXTENSION_TESTS}) add_definitions(-DTEST_FILES_DIR="extension") add_subdirectory(${CMAKE_SOURCE_DIR}/test/gtest ${CMAKE_CURRENT_BINARY_DIR}/test/gtest EXCLUDE_FROM_ALL) diff --git a/extension/duckdb_scanner/CMakeLists.txt b/extension/duckdb_scanner/CMakeLists.txt index 8adca714d24..0d1279f5996 100644 --- a/extension/duckdb_scanner/CMakeLists.txt +++ b/extension/duckdb_scanner/CMakeLists.txt @@ -14,12 +14,6 @@ add_library(duckdb_scanner src/duckdb_catalog.cpp src/duckdb_table_catalog_entry.cpp) -set_target_properties(duckdb_scanner PROPERTIES - OUTPUT_NAME duckdb_scanner - PREFIX "lib" - SUFFIX ".kuzu_extension" -) - set_target_properties(duckdb_scanner PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" diff --git a/extension/duckdb_scanner/src/duckdb_catalog.cpp b/extension/duckdb_scanner/src/duckdb_catalog.cpp index 1bf5cb263fc..8fa2d4919d9 100644 --- a/extension/duckdb_scanner/src/duckdb_catalog.cpp +++ b/extension/duckdb_scanner/src/duckdb_catalog.cpp @@ -1,28 +1,127 @@ #include "duckdb_catalog.h" +#include "common/exception/binder.h" +#include "duckdb_type_converter.h" + namespace kuzu { namespace duckdb_scanner { -common::table_id_t DuckDBCatalogContent::createForeignTable( - const binder::BoundCreateTableInfo& info) { - auto tableID = assignNextTableID(); +void DuckDBCatalogContent::init( + const std::string& dbPath, const std::string& catalogName, main::ClientContext* context) { + auto con = getConnection(dbPath); + auto query = common::stringFormat( + "select table_name from information_schema.tables where table_catalog = '{}' and " + "table_schema = '{}';", + catalogName, getDefaultSchemaName()); + auto result = con.Query(query); + std::unique_ptr resultChunk; + try { + resultChunk = result->Fetch(); + } catch (std::exception& e) { throw common::BinderException(e.what()); } + if (resultChunk->size() == 0) { + return; + } + common::ValueVector tableNamesVector{ + *common::LogicalType::STRING(), context->getMemoryManager()}; + duckdb_scanner::duckdb_conversion_func_t conversionFunc; + duckdb_scanner::getDuckDBVectorConversionFunc(common::PhysicalTypeID::STRING, conversionFunc); + conversionFunc(resultChunk->data[0], tableNamesVector, resultChunk->size()); + for (auto i = 0u; i < resultChunk->size(); i++) { + auto tableName = tableNamesVector.getValue(i).getAsString(); + createForeignTable(con, tableName, dbPath, catalogName); + } +} + +static std::string getQuery(const binder::BoundCreateTableInfo& info) { auto extraInfo = common::ku_dynamic_cast(info.extraInfo.get()); + return common::stringFormat( + "SELECT * FROM {}.{}.{}", extraInfo->catalogName, extraInfo->schemaName, info.tableName); +} + +void DuckDBCatalogContent::createForeignTable(duckdb::Connection& con, const std::string& tableName, + const std::string& dbPath, const std::string& catalogName) { + auto tableID = assignNextTableID(); + auto info = bindCreateTableInfo(con, tableName, dbPath, catalogName); + if (info == nullptr) { + return; + } + auto extraInfo = common::ku_dynamic_cast(info->extraInfo.get()); std::vector columnTypes; std::vector columnNames; for (auto& propertyInfo : extraInfo->propertyInfos) { columnNames.push_back(propertyInfo.name); columnTypes.push_back(propertyInfo.type); } - DuckDBScanBindData bindData(common::stringFormat("SELECT * FROM {}", info.tableName), - extraInfo->dbPath, std::move(columnTypes), std::move(columnNames)); + DuckDBScanBindData bindData(getQuery(*info), std::move(columnTypes), std::move(columnNames), + std::bind(&DuckDBCatalogContent::getConnection, this, dbPath)); auto tableEntry = std::make_unique( - info.tableName, tableID, getScanFunction(std::move(bindData))); + info->tableName, tableID, getScanFunction(std::move(bindData))); for (auto& propertyInfo : extraInfo->propertyInfos) { tableEntry->addProperty(propertyInfo.name, propertyInfo.type.copy()); } tables->createEntry(std::move(tableEntry)); - return tableID; +} + +static bool getTableInfo(duckdb::Connection& con, const std::string& tableName, + const std::string& schemaName, const std::string& catalogName, + std::vector& columnTypes, std::vector& columnNames) { + auto query = + common::stringFormat("select data_type,column_name from information_schema.columns where " + "table_name = '{}' and table_schema = '{}' and table_catalog = '{}';", + tableName, schemaName, catalogName); + auto result = con.Query(query); + if (result->RowCount() == 0) { + return false; + } + columnTypes.reserve(result->RowCount()); + columnNames.reserve(result->RowCount()); + for (auto i = 0u; i < result->RowCount(); i++) { + try { + columnTypes.push_back(DuckDBTypeConverter::convertDuckDBType( + result->GetValue(0, i).GetValue())); + } catch (common::BinderException& e) { return false; } + columnNames.push_back(result->GetValue(1, i).GetValue()); + } + return true; +} + +bool DuckDBCatalogContent::bindPropertyInfos(duckdb::Connection& con, const std::string& tableName, + const std::string& catalogName, std::vector& propertyInfos) { + std::vector columnTypes; + std::vector columnNames; + if (!getTableInfo( + con, tableName, getDefaultSchemaName(), catalogName, columnTypes, columnNames)) { + return false; + } + for (auto i = 0u; i < columnNames.size(); i++) { + auto propertyInfo = binder::PropertyInfo(columnNames[i], columnTypes[i]); + propertyInfos.push_back(std::move(propertyInfo)); + } + return true; +} + +std::unique_ptr DuckDBCatalogContent::bindCreateTableInfo( + duckdb::Connection& con, const std::string& tableName, const std::string& dbPath, + const std::string& catalogName) { + std::vector propertyInfos; + if (!bindPropertyInfos(con, tableName, catalogName, propertyInfos)) { + return nullptr; + } + return std::make_unique(common::TableType::FOREIGN, tableName, + std::make_unique( + dbPath, catalogName, getDefaultSchemaName(), std::move(propertyInfos))); +} + +std::string DuckDBCatalogContent::getDefaultSchemaName() const { + return "main"; +} + +duckdb::Connection DuckDBCatalogContent::getConnection(const std::string& dbPath) const { + duckdb::DuckDB db(dbPath); + duckdb::Connection con(db); + return con; } } // namespace duckdb_scanner diff --git a/extension/duckdb_scanner/src/duckdb_scan.cpp b/extension/duckdb_scanner/src/duckdb_scan.cpp index 95b0aa7ee9b..403d81216dd 100644 --- a/extension/duckdb_scanner/src/duckdb_scan.cpp +++ b/extension/duckdb_scanner/src/duckdb_scan.cpp @@ -1,6 +1,5 @@ #include "duckdb_scan.h" -#include "common/exception/binder.h" #include "common/types/types.h" #include "function/table/bind_input.h" @@ -13,10 +12,11 @@ namespace duckdb_scanner { void getDuckDBVectorConversionFunc( PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func); -DuckDBScanBindData::DuckDBScanBindData(std::string query, std::string dbPath, - std::vector columnTypes, std::vector columnNames) +DuckDBScanBindData::DuckDBScanBindData(std::string query, + std::vector columnTypes, std::vector columnNames, + init_duckdb_conn_t initDuckDBConn) : TableFuncBindData{std::move(columnTypes), std::move(columnNames)}, query{std::move(query)}, - dbPath{std::move(dbPath)} { + initDuckDBConn{std::move(initDuckDBConn)} { conversionFunctions.resize(this->columnTypes.size()); for (auto i = 0u; i < this->columnTypes.size(); i++) { getDuckDBVectorConversionFunc( @@ -25,7 +25,7 @@ DuckDBScanBindData::DuckDBScanBindData(std::string query, std::string dbPath, } std::unique_ptr DuckDBScanBindData::copy() const { - return std::make_unique(query, dbPath, columnTypes, columnNames); + return std::make_unique(query, columnTypes, columnNames, initDuckDBConn); } DuckDBScanSharedState::DuckDBScanSharedState(std::unique_ptr queryResult) @@ -52,9 +52,12 @@ struct DuckDBScanFunction { std::unique_ptr DuckDBScanFunction::initSharedState( function::TableFunctionInitInput& input) { auto scanBindData = reinterpret_cast(input.bindData); - auto db = duckdb::DuckDB(scanBindData->dbPath); - auto conn = duckdb::Connection(db); + auto conn = scanBindData->initDuckDBConn(); auto result = conn.SendQuery(scanBindData->query); + if (result->HasError()) { + throw common::RuntimeException( + common::stringFormat("Failed to execute query: {} in duckdb.", result->GetError())); + } return std::make_unique(std::move(result)); } diff --git a/extension/duckdb_scanner/src/duckdb_storage.cpp b/extension/duckdb_scanner/src/duckdb_storage.cpp index b3413d63834..642eab9c09f 100644 --- a/extension/duckdb_scanner/src/duckdb_storage.cpp +++ b/extension/duckdb_scanner/src/duckdb_storage.cpp @@ -10,73 +10,6 @@ namespace kuzu { namespace duckdb_scanner { -static bool getTableInfo(duckdb::Connection& con, std::string tableName, - std::vector& columnTypes, std::vector& columnNames) { - auto result = con.Query( - common::stringFormat("select data_type,column_name from information_schema.columns where " - "table_name = '{}' and table_schema='main';", - tableName)); - if (result->RowCount() == 0) { - return false; - } - columnTypes.reserve(result->RowCount()); - columnNames.reserve(result->RowCount()); - for (auto i = 0u; i < result->RowCount(); i++) { - try { - columnTypes.push_back(DuckDBTypeConverter::convertDuckDBType( - result->GetValue(0, i).GetValue())); - } catch (common::BinderException& e) { return false; } - columnNames.push_back(result->GetValue(1, i).GetValue()); - } - return true; -} - -std::unique_ptr getCreateTableInfo( - duckdb::Connection& con, std::string tableName, std::string dbPath) { - std::vector columnTypes; - std::vector columnNames; - if (!getTableInfo(con, tableName, columnTypes, columnNames)) { - return nullptr; - } - std::vector propertyInfos; - for (auto i = 0u; i < columnNames.size(); i++) { - auto propertyInfo = binder::PropertyInfo(columnNames[i], columnTypes[i]); - propertyInfos.push_back(std::move(propertyInfo)); - } - return std::make_unique(common::TableType::FOREIGN, tableName, - std::make_unique( - std::move(dbPath), std::move(propertyInfos))); -} - -std::unique_ptr createCatalog( - std::string dbPath, main::ClientContext* context) { - duckdb::DuckDB db(dbPath); - duckdb::Connection con(db); - auto query = "select table_name from information_schema.tables where table_schema = 'main';"; - auto result = con.SendQuery(query); - std::unique_ptr resultChunk; - try { - resultChunk = result->Fetch(); - } catch (std::exception& e) { return 0; } - if (resultChunk == nullptr) { - return 0; - } - auto tableNamesVector = std::make_unique( - common::LogicalTypeID::STRING, context->getMemoryManager()); - duckdb_conversion_func_t conversionFunc; - getDuckDBVectorConversionFunc(common::PhysicalTypeID::STRING, conversionFunc); - conversionFunc(resultChunk->data[0], *tableNamesVector, resultChunk->size()); - std::unique_ptr catalogContent = std::make_unique(); - for (auto i = 0u; i < resultChunk->size(); i++) { - auto tableName = tableNamesVector->getValue(i).getAsString(); - auto createTableInfo = getCreateTableInfo(con, tableName, dbPath); - if (createTableInfo != nullptr) { - catalogContent->createForeignTable(*createTableInfo); - } - } - return catalogContent; -} - std::unique_ptr attachDuckDB( std::string dbName, std::string dbPath, main::ClientContext* clientContext) { if (dbName == "") { @@ -87,17 +20,16 @@ std::unique_ptr attachDuckDB( dbName = dbPath; } } - return std::make_unique(dbName, createCatalog(dbPath, clientContext)); + auto duckdbCatalog = std::make_unique(); + duckdbCatalog->init(dbPath, dbName, clientContext); + return std::make_unique(dbName, std::move(duckdbCatalog)); } DuckDBStorageExtension::DuckDBStorageExtension() : StorageExtension{attachDuckDB} {} bool DuckDBStorageExtension::canHandleDB(std::string dbType) const { common::StringUtils::toUpper(dbType); - if (dbType == "DUCKDB") { - return true; - } - return false; + return dbType == "DUCKDB"; } } // namespace duckdb_scanner diff --git a/extension/duckdb_scanner/src/include/duckdb_catalog.h b/extension/duckdb_scanner/src/include/duckdb_catalog.h index 8ba6c0a3dd7..407e33e92e1 100644 --- a/extension/duckdb_scanner/src/include/duckdb_catalog.h +++ b/extension/duckdb_scanner/src/include/duckdb_catalog.h @@ -8,14 +8,18 @@ namespace kuzu { namespace duckdb_scanner { -struct BoundExtraCreateDuckDBTableInfo final : public binder::BoundExtraCreateTableInfo { +struct BoundExtraCreateDuckDBTableInfo : public binder::BoundExtraCreateTableInfo { std::string dbPath; + std::string catalogName; + std::string schemaName; - BoundExtraCreateDuckDBTableInfo( - std::string dbPath, std::vector propertyInfos) - : BoundExtraCreateTableInfo{std::move(propertyInfos)}, dbPath{std::move(dbPath)} {} + BoundExtraCreateDuckDBTableInfo(std::string dbPath, std::string catalogName, + std::string schemaName, std::vector propertyInfos) + : BoundExtraCreateTableInfo{std::move(propertyInfos)}, dbPath{std::move(dbPath)}, + catalogName{std::move(catalogName)}, schemaName{std::move(schemaName)} {} BoundExtraCreateDuckDBTableInfo(const BoundExtraCreateDuckDBTableInfo& other) - : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, dbPath{other.dbPath} {} + : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, dbPath{other.dbPath}, + catalogName{other.catalogName}, schemaName{other.schemaName} {} std::unique_ptr copy() const override { return std::make_unique(*this); @@ -26,7 +30,25 @@ class DuckDBCatalogContent : public catalog::CatalogContent { public: DuckDBCatalogContent() : catalog::CatalogContent{nullptr /* vfs */} {} - common::table_id_t createForeignTable(const binder::BoundCreateTableInfo& info); + virtual void init( + const std::string& dbPath, const std::string& catalogName, main::ClientContext* context); + +protected: + bool bindPropertyInfos(duckdb::Connection& con, const std::string& tableName, + const std::string& catalogName, std::vector& propertyInfos); + +private: + virtual std::unique_ptr bindCreateTableInfo( + duckdb::Connection& con, const std::string& tableName, const std::string& dbPath, + const std::string& catalogName); + + virtual std::string getDefaultSchemaName() const; + + virtual duckdb::Connection getConnection(const std::string& dbPath) const; + +private: + void createForeignTable(duckdb::Connection& con, const std::string& tableName, + const std::string& dbPath, const std::string& catalogName); }; } // namespace duckdb_scanner diff --git a/extension/duckdb_scanner/src/include/duckdb_scan.h b/extension/duckdb_scanner/src/include/duckdb_scan.h index a783dfeb453..fe422737da5 100644 --- a/extension/duckdb_scanner/src/include/duckdb_scan.h +++ b/extension/duckdb_scanner/src/include/duckdb_scan.h @@ -18,16 +18,17 @@ namespace duckdb_scanner { using duckdb_conversion_func_t = std::function; +using init_duckdb_conn_t = std::function; struct DuckDBScanBindData : public function::TableFuncBindData { - explicit DuckDBScanBindData(std::string query, std::string dbPath, - std::vector columnTypes, std::vector columnNames); + explicit DuckDBScanBindData(std::string query, std::vector columnTypes, + std::vector columnNames, init_duckdb_conn_t initDuckDBConn); std::unique_ptr copy() const override; std::string query; - std::string dbPath; std::vector conversionFunctions; + init_duckdb_conn_t initDuckDBConn; }; struct DuckDBScanSharedState : public function::TableFuncSharedState { diff --git a/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h b/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h index cd34256028e..2911768f0cc 100644 --- a/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h +++ b/extension/duckdb_scanner/src/include/duckdb_scanner_extension.h @@ -6,7 +6,7 @@ namespace kuzu { namespace duckdb_scanner { -class DuckDBScannerExtension : public extension::Extension { +class DuckDBScannerExtension final : public extension::Extension { public: static void load(main::ClientContext* context); }; diff --git a/extension/duckdb_scanner/src/include/duckdb_storage.h b/extension/duckdb_scanner/src/include/duckdb_storage.h index 1d19662beba..aed030ba93f 100644 --- a/extension/duckdb_scanner/src/include/duckdb_storage.h +++ b/extension/duckdb_scanner/src/include/duckdb_storage.h @@ -6,7 +6,7 @@ namespace kuzu { namespace duckdb_scanner { -class DuckDBStorageExtension : public storage::StorageExtension { +class DuckDBStorageExtension final : public storage::StorageExtension { public: DuckDBStorageExtension(); diff --git a/extension/postgres_scanner/CMakeLists.txt b/extension/postgres_scanner/CMakeLists.txt new file mode 100644 index 00000000000..a8d3e658755 --- /dev/null +++ b/extension/postgres_scanner/CMakeLists.txt @@ -0,0 +1,58 @@ +find_package(DuckDB REQUIRED) + +add_library(postgres_scanner + SHARED + ../duckdb_scanner/src/duckdb_scan.cpp + ../duckdb_scanner/src/duckdb_catalog.cpp + ../duckdb_scanner/src/duckdb_table_catalog_entry.cpp + ../duckdb_scanner/src/duckdb_type_converter.cpp + src/postgres_scanner_extension.cpp + src/postgres_storage.cpp + src/postgres_catalog.cpp) + +include_directories( + src/include + ../duckdb_scanner/src/include + ${DuckDB_INCLUDE_DIRS} + ${PROJECT_SOURCE_DIR}/src/include) + +set_target_properties(postgres_scanner PROPERTIES + OUTPUT_NAME postgres_scanner + PREFIX "lib" + SUFFIX ".kuzu_extension" +) + +set_target_properties(postgres_scanner + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" +) + +target_link_libraries(postgres_scanner + PRIVATE + ${DuckDB_LIBRARIES}) + +if (WIN32) + # On windows, there is no dynamic lookup available, so it's not + # possible to generically look for symbols on library load. There are + # two main alternatives to statically linking kuzu, neither of which is + # appealing: + # 1. Link against the shared library. This works well assuming + # the DLL is locatable, but this assumption isn't valid for users + # of kuzu_shell.exe. + # 2. Link against the executable (kuzu_shell.exe). This is + # strange but works well for kuzu_shell.exe. However, it forces + # users who are embedding kuzu in their application to recompile + # the extension _and_ export the symbols for the extension to + # locate on load. + # We choose the simplest option. Windows isn't known + # for its small libraries anyways... + # Future work could make it possible to embed extension into kuzu, + # which would help fix this problem. + target_link_libraries(postgres_scanner PRIVATE kuzu) +endif() + +if (APPLE) + set_target_properties(postgres_scanner PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +endif () diff --git a/extension/postgres_scanner/src/include/postgres_catalog.h b/extension/postgres_scanner/src/include/postgres_catalog.h new file mode 100644 index 00000000000..9437d9d31d6 --- /dev/null +++ b/extension/postgres_scanner/src/include/postgres_catalog.h @@ -0,0 +1,50 @@ +#pragma once + +#include "duckdb_catalog.h" + +namespace kuzu { +namespace postgres_scanner { + +struct BoundExtraCreatePostgresTableInfo final + : public duckdb_scanner::BoundExtraCreateDuckDBTableInfo { + std::string pgConnectionStr; + + BoundExtraCreatePostgresTableInfo(std::string pgConnectionStr, std::string dbPath, + std::string catalogName, std::string schemaName, + std::vector propertyInfos) + : BoundExtraCreateDuckDBTableInfo{std::move(dbPath), std::move(catalogName), + std::move(schemaName), std::move(propertyInfos)}, + pgConnectionStr{std::move(pgConnectionStr)} {} + BoundExtraCreatePostgresTableInfo(const BoundExtraCreatePostgresTableInfo& other) + : BoundExtraCreateDuckDBTableInfo{other.dbPath, other.catalogName, other.schemaName, + copyVector(other.propertyInfos)}, + pgConnectionStr{other.pgConnectionStr} {} + + std::unique_ptr copy() const override { + return std::make_unique(*this); + } +}; + +class PostgresCatalogContent final : public duckdb_scanner::DuckDBCatalogContent { +public: + PostgresCatalogContent() : duckdb_scanner::DuckDBCatalogContent{} {} + + void init(const std::string& dbPath, const std::string& catalogName, + main::ClientContext* context) override; + +private: + std::unique_ptr bindCreateTableInfo(duckdb::Connection& con, + const std::string& tableName, const std::string& dbPath, + const std::string& /*catalogName*/) override; + + std::string getDefaultSchemaName() const override; + + duckdb::Connection getConnection(const std::string& dbPath) const override; + +private: + static constexpr char DEFAULT_CATALOG_NAME[] = "pg"; + static constexpr char DEFAULT_SCHEMA_NAME[] = "public"; +}; + +} // namespace postgres_scanner +} // namespace kuzu diff --git a/extension/postgres_scanner/src/include/postgres_scanner_extension.h b/extension/postgres_scanner/src/include/postgres_scanner_extension.h new file mode 100644 index 00000000000..aae2733d5ed --- /dev/null +++ b/extension/postgres_scanner/src/include/postgres_scanner_extension.h @@ -0,0 +1,15 @@ +#pragma once + +#include "extension/extension.h" +#include "main/database.h" + +namespace kuzu { +namespace postgres_scanner { + +class PostgresScannerExtension final : public extension::Extension { +public: + static void load(main::ClientContext* context); +}; + +} // namespace postgres_scanner +} // namespace kuzu diff --git a/extension/postgres_scanner/src/include/postgres_storage.h b/extension/postgres_scanner/src/include/postgres_storage.h new file mode 100644 index 00000000000..bf0f14b0556 --- /dev/null +++ b/extension/postgres_scanner/src/include/postgres_storage.h @@ -0,0 +1,17 @@ +#pragma once + +#include "common/string_utils.h" +#include "storage/storage_extension.h" + +namespace kuzu { +namespace postgres_scanner { + +class PostgresStorageExtension final : public storage::StorageExtension { +public: + PostgresStorageExtension(); + + bool canHandleDB(std::string dbType) const override; +}; + +} // namespace postgres_scanner +} // namespace kuzu diff --git a/extension/postgres_scanner/src/postgres_catalog.cpp b/extension/postgres_scanner/src/postgres_catalog.cpp new file mode 100644 index 00000000000..91f559080b5 --- /dev/null +++ b/extension/postgres_scanner/src/postgres_catalog.cpp @@ -0,0 +1,46 @@ +#include "postgres_catalog.h" + +#include "common/exception/binder.h" +#include "postgres_storage.h" + +namespace kuzu { +namespace postgres_scanner { + +void PostgresCatalogContent::init( + const std::string& dbPath, const std::string& /*catalogName*/, main::ClientContext* context) { + duckdb_scanner::DuckDBCatalogContent::init(dbPath, DEFAULT_CATALOG_NAME, context); +} + +std::string PostgresCatalogContent::getDefaultSchemaName() const { + return DEFAULT_SCHEMA_NAME; +} + +std::unique_ptr PostgresCatalogContent::bindCreateTableInfo( + duckdb::Connection& con, const std::string& tableName, const std::string& dbPath, + const std::string& /*catalogName*/) { + std::vector propertyInfos; + if (!bindPropertyInfos(con, tableName, DEFAULT_CATALOG_NAME, propertyInfos)) { + return nullptr; + } + auto extraCreatePostgresTableInfo = std::make_unique(dbPath, + "" /* dbPath */, DEFAULT_CATALOG_NAME, getDefaultSchemaName(), std::move(propertyInfos)); + return std::make_unique( + common::TableType::FOREIGN, tableName, std::move(extraCreatePostgresTableInfo)); +} + +duckdb::Connection PostgresCatalogContent::getConnection(const std::string& dbPath) const { + duckdb::DuckDB db(nullptr); + duckdb::Connection con(db); + con.Query("install postgres;"); + con.Query("load postgres;"); + auto result = con.Query( + common::stringFormat("attach '{}' as {} (TYPE postgres);", dbPath, DEFAULT_CATALOG_NAME)); + if (result->HasError()) { + throw common::BinderException(common::stringFormat( + "Failed to attach postgres database due to: {}", result->GetError())); + } + return con; +} + +} // namespace postgres_scanner +} // namespace kuzu diff --git a/extension/postgres_scanner/src/postgres_scanner_extension.cpp b/extension/postgres_scanner/src/postgres_scanner_extension.cpp new file mode 100644 index 00000000000..d5ac7337075 --- /dev/null +++ b/extension/postgres_scanner/src/postgres_scanner_extension.cpp @@ -0,0 +1,27 @@ +#include "postgres_scanner_extension.h" + +#include "postgres_storage.h" + +namespace kuzu { +namespace postgres_scanner { + +void PostgresScannerExtension::load(main::ClientContext* context) { + auto db = context->getDatabase(); + db->registerStorageExtension("postgres", std::make_unique()); +} + +} // namespace postgres_scanner +} // namespace kuzu + +extern "C" { +// Because we link against the static library on windows, we implicitly inherit KUZU_STATIC_DEFINE, +// which cancels out any exporting, so we can't use KUZU_API. +#if defined(_WIN32) +#define INIT_EXPORT __declspec(dllexport) +#else +#define INIT_EXPORT __attribute__((visibility("default"))) +#endif +INIT_EXPORT void init(kuzu::main::ClientContext* context) { + kuzu::postgres_scanner::PostgresScannerExtension::load(context); +} +} diff --git a/extension/postgres_scanner/src/postgres_storage.cpp b/extension/postgres_scanner/src/postgres_storage.cpp new file mode 100644 index 00000000000..e31118a4172 --- /dev/null +++ b/extension/postgres_scanner/src/postgres_storage.cpp @@ -0,0 +1,40 @@ +#include "postgres_storage.h" + +#include + +#include "catalog/catalog_entry/table_catalog_entry.h" +#include "duckdb_type_converter.h" +#include "postgres_catalog.h" + +namespace kuzu { +namespace postgres_scanner { + +std::string extractDBName(const std::string& connectionInfo) { + std::regex pattern("dbname=([^ ]+)"); + std::smatch match; + if (std::regex_search(connectionInfo, match, pattern)) { + return match.str(1); + } + throw common::RuntimeException{"Invalid postgresql connection string."}; +} + +std::unique_ptr attachPostgres( + std::string dbName, std::string dbPath, main::ClientContext* clientContext) { + auto catalogName = extractDBName(dbPath); + if (dbName == "") { + dbName = catalogName; + } + auto postgresCatalog = std::make_unique(); + postgresCatalog->init(dbPath, catalogName, clientContext); + return std::make_unique(dbName, std::move(postgresCatalog)); +} + +PostgresStorageExtension::PostgresStorageExtension() : StorageExtension{attachPostgres} {} + +bool PostgresStorageExtension::canHandleDB(std::string dbType) const { + common::StringUtils::toUpper(dbType); + return dbType == "POSTGRES"; +} + +} // namespace postgres_scanner +} // namespace kuzu diff --git a/extension/postgres_scanner/test/test_files/create_test_db.sql b/extension/postgres_scanner/test/test_files/create_test_db.sql new file mode 100644 index 00000000000..e2ecbc11aff --- /dev/null +++ b/extension/postgres_scanner/test/test_files/create_test_db.sql @@ -0,0 +1,241 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.10 (Homebrew) +-- Dumped by pg_dump version 14.10 (Homebrew) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: audience_type; Type: TYPE; Schema: public; Owner: ci +-- + +CREATE TYPE public.audience_type AS ( + key character varying, + value bigint +); + + +ALTER TYPE public.audience_type OWNER TO ci; + +-- +-- Name: description_type; Type: TYPE; Schema: public; Owner: ci +-- + +CREATE TYPE public.description_type AS ( + rating double precision, + stars bigint, + views bigint, + release timestamp without time zone, + release_ns timestamp without time zone, + release_ms timestamp without time zone, + release_sec timestamp without time zone, + release_tz timestamp with time zone, + film date, + u8 smallint, + u16 smallint, + u32 integer, + u64 bigint, + hugedata numeric +); + + +ALTER TYPE public.description_type OWNER TO ci; + +-- +-- Name: mood; Type: TYPE; Schema: public; Owner: ci +-- + +CREATE TYPE public.mood AS ENUM ( + 'sad', + 'ok', + 'happy' +); + + +ALTER TYPE public.mood OWNER TO ci; + +-- +-- Name: state_type; Type: TYPE; Schema: public; Owner: ci +-- + +CREATE TYPE public.state_type AS ( + revenue smallint, + location character varying[] +); + + +ALTER TYPE public.state_type OWNER TO ci; + +-- +-- Name: stock_type; Type: TYPE; Schema: public; Owner: ci +-- + +CREATE TYPE public.stock_type AS ( + price bigint[], + volume bigint +); + + +ALTER TYPE public.stock_type OWNER TO ci; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: movies; Type: TABLE; Schema: public; Owner: ci +-- + +CREATE TABLE public.movies ( + name character varying NOT NULL, + length integer, + note character varying, + description public.description_type, + content bytea, + audience public.audience_type[] +); + + +ALTER TABLE public.movies OWNER TO ci; + +-- +-- Name: organisation; Type: TABLE; Schema: public; Owner: ci +-- + +CREATE TABLE public.organisation ( + id bigint NOT NULL, + name character varying, + orgcode bigint, + mark double precision, + score bigint, + history interval, + licensevalidinterval interval, + rating double precision, + state public.state_type, + stock public.stock_type, + info character varying +); + + +ALTER TABLE public.organisation OWNER TO ci; + +-- +-- Name: person; Type: TABLE; Schema: public; Owner: ci +-- + +CREATE TABLE public.person ( + id bigint NOT NULL, + fname character varying, + gender bigint, + isstudent boolean, + isworker boolean, + age bigint, + eyesight double precision, + birthdate date, + registertime timestamp without time zone, + lastjobduration interval, + workedhours bigint[], + usednames character varying[], + height double precision, + u uuid +); + + +ALTER TABLE public.person OWNER TO ci; + +-- +-- Name: persontest; Type: TABLE; Schema: public; Owner: ci +-- + +CREATE TABLE public.persontest ( + id integer +); + + +ALTER TABLE public.persontest OWNER TO ci; + +-- +-- Data for Name: movies; Type: TABLE DATA; Schema: public; Owner: ci +-- + +COPY public.movies (name, length, note, description, content, audience) FROM stdin; +Sóló cón tu párejâ 126 this is a very very good movie (5.3,2,152,"2011-08-20 11:25:30","2011-08-20 11:25:30","2011-08-20 11:25:30","2011-08-20 11:25:30","2011-08-20 11:25:30+08",2012-05-11,220,20,1,180,1844674407370955161811111111) \\x5c7841415c784142696e746572657374696e675c783042 {"(audience1,52)","(audience53,42)"} +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie 2544 the movie is very very good (7,10,982,"2018-11-13 13:33:11","2018-11-13 13:33:11","2018-11-13 13:33:11","2018-11-13 13:33:11","2018-11-13 13:33:11+08",2014-09-12,12,120,55,1,-1844674407370955161511) \\x5c7841425c784344 {"(audience1,33)"} +Roma 298 the movie is very interesting and funny (1223,100,10003,"2011-02-11 16:44:22","2011-02-11 16:44:22","2011-02-11 16:44:22","2011-02-11 16:44:22","2011-02-11 16:44:22+08",2013-02-22,1,15,200,4,-15) \\x707572652061736369692063686172616374657273 {} +\. + + +-- +-- Data for Name: organisation; Type: TABLE DATA; Schema: public; Owner: ci +-- + +COPY public.organisation (id, name, orgcode, mark, score, history, licensevalidinterval, rating, state, stock, info) FROM stdin; +1 ABFsUni 325 3.7 -2 10 years 5 mons 13:00:00.000024 3 years 5 days 1 (138,"{toronto,""montr,eal""}") ("{96,56}",1000) 3.12 +4 CsWork 934 4.1 -100 2 years 4 days 10:00:00 26 years 52 days 48:00:00 0.78 (152,"{""vanco,uver north area""}") ("{15,78,671}",432) abcd +6 DEsWork 824 4.1 7 2 years 04:34:00.000022 82:00:00.1 0.52 (558,"{""very long city name"",""new york""}") ({22},99) 2023-12-15 +\. + + +-- +-- Data for Name: person; Type: TABLE DATA; Schema: public; Owner: ci +-- + +COPY public.person (id, fname, gender, isstudent, isworker, age, eyesight, birthdate, registertime, lastjobduration, workedhours, usednames, height, u) FROM stdin; +0 Alice 1 t f 35 5 1900-01-01 2011-08-20 11:25:30 3 years 2 days 13:02:00 {10,5} {Aida} 1.731 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 +2 Bob 2 t f 30 5.1 1900-01-01 2008-11-03 15:25:30.000526 10 years 5 mons 13:00:00.000024 {12,8} {Bobby} 0.99 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12 +3 Carol 1 f t 45 5 1940-06-22 1911-08-20 02:32:21 48:24:11 {4,5} {Carmen,Fred} 1 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13 +5 Dan 2 f t 20 4.8 1950-07-23 2031-11-30 12:25:30 10 years 5 mons 13:00:00.000024 {1,9} {Wolfeschlegelstein,Daniel} 1.3 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14 +7 Elizabeth 1 f t 20 4.7 1980-10-26 1976-12-23 11:21:42 48:24:11 {2} {Ein} 1.463 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15 +8 Farooq 2 t f 25 4.5 1980-10-26 1972-07-31 13:22:30.678559 00:18:00.024 {3,4,5,6,7} {Fesdwe} 1.51 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16 +9 Greg 2 f f 40 4.9 1980-10-26 1976-12-23 11:21:42 10 years 5 mons 13:00:00.000024 {1} {Grad} 1.6 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17 +10 Hubert Blaine Wolfeschlegelsteinhausenbergerdorff 2 f t 83 4.9 1990-11-27 2023-02-21 13:25:30 3 years 2 days 13:02:00 {10,11,12,3,4,5,6,7} {Ad,De,Hi,Kye,Orlan} 1.323 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18 +\. + + +-- +-- Data for Name: persontest; Type: TABLE DATA; Schema: public; Owner: ci +-- + +COPY public.persontest (id) FROM stdin; +\. + + +-- +-- Name: movies movies_pkey; Type: CONSTRAINT; Schema: public; Owner: ci +-- + +ALTER TABLE ONLY public.movies + ADD CONSTRAINT movies_pkey PRIMARY KEY (name); + + +-- +-- Name: organisation organisation_pkey; Type: CONSTRAINT; Schema: public; Owner: ci +-- + +ALTER TABLE ONLY public.organisation + ADD CONSTRAINT organisation_pkey PRIMARY KEY (id); + + +-- +-- Name: person person_pkey; Type: CONSTRAINT; Schema: public; Owner: ci +-- + +ALTER TABLE ONLY public.person + ADD CONSTRAINT person_pkey PRIMARY KEY (id); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/extension/postgres_scanner/test/test_files/postgres_scanner.test b/extension/postgres_scanner/test/test_files/postgres_scanner.test new file mode 100644 index 00000000000..bd8fc2fc8f2 --- /dev/null +++ b/extension/postgres_scanner/test/test_files/postgres_scanner.test @@ -0,0 +1,49 @@ +-GROUP PostgresScanner +-DATASET CSV empty + +-- + +-CASE ScanPostgresTable +-STATEMENT load extension "${KUZU_ROOT_DIRECTORY}/extension/postgres_scanner/build/libpostgres_scanner.kuzu_extension" +---- ok +-STATEMENT ATTACH 'dbname=pgscan user=ci host=localhost' as tinysnb (dbtype 'POSTGRES'); +---- ok +-STATEMENT LOAD FROM tinysnb_person RETURN *; +---- 8 +0|Alice|1|True|False|35|5.000000|1900-01-01|2011-08-20 11:25:30|3 years 2 days 13:02:00|[10,5]|[Aida]|1.731000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 +10|Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|2|False|True|83|4.900000|1990-11-27|2023-02-21 13:25:30|3 years 2 days 13:02:00|[10,11,12,3,4,5,6,7]|[Ad,De,Hi,Kye,Orlan]|1.323000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18 +2|Bob|2|True|False|30|5.100000|1900-01-01|2008-11-03 15:25:30.000526|10 years 5 months 13:00:00.000024|[12,8]|[Bobby]|0.990000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12 +3|Carol|1|False|True|45|5.000000|1940-06-22|1911-08-20 02:32:21|48:24:11|[4,5]|[Carmen,Fred]|1.000000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13 +5|Dan|2|False|True|20|4.800000|1950-07-23|2031-11-30 12:25:30|10 years 5 months 13:00:00.000024|[1,9]|[Wolfeschlegelstein,Daniel]|1.300000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14 +7|Elizabeth|1|False|True|20|4.700000|1980-10-26|1976-12-23 11:21:42|48:24:11|[2]|[Ein]|1.463000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15 +8|Farooq|2|True|False|25|4.500000|1980-10-26|1972-07-31 13:22:30.678559|00:18:00.024|[3,4,5,6,7]|[Fesdwe]|1.510000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16 +9|Greg|2|False|False|40|4.900000|1980-10-26|1976-12-23 11:21:42|10 years 5 months 13:00:00.000024|[1]|[Grad]|1.600000|a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17 +-STATEMENT LOAD FROM tinysnb_organisation RETURN *; +---- 3 +1|ABFsUni|325|3.700000|-2|10 years 5 months 13:00:00.000024|3 years 5 days|1.000000|{revenue: 138, "location": [toronto,montr,eal]}|{price: [96,56], volume: 1000}|3.12 +4|CsWork|934|4.100000|-100|2 years 4 days 10:00:00|26 years 52 days 48:00:00|0.780000|{revenue: 152, "location": [vanco,uver north area]}|{price: [15,78,671], volume: 432}|abcd +6|DEsWork|824|4.100000|7|2 years 04:34:00.000022|82:00:00.1|0.520000|{revenue: 558, "location": [very long city name,new york]}|{price: [22], volume: 99}|2023-12-15 +-STATEMENT LOAD FROM tinysnb_movies RETURN *; +---- 3 +Roma|298|the movie is very interesting and funny|{rating: 1223.000000, stars: 100, "views": 10003, "release": 2011-02-11 16:44:22, release_ns: 2011-02-11 16:44:22, release_ms: 2011-02-11 16:44:22, release_sec: 2011-02-11 16:44:22, release_tz: 2011-02-11 08:44:22+00, film: 2013-02-22, u8: 1, u16: 15, u32: 200, u64: 4, hugedata: -15.000000}|pure ascii characters|[] +Sóló cón tu párejâ|126|this is a very very good movie|{rating: 5.300000, stars: 2, "views": 152, "release": 2011-08-20 11:25:30, release_ns: 2011-08-20 11:25:30, release_ms: 2011-08-20 11:25:30, release_sec: 2011-08-20 11:25:30, release_tz: 2011-08-20 03:25:30+00, film: 2012-05-11, u8: 220, u16: 20, u32: 1, u64: 180, hugedata: 1844674407370955161600000000.000000}|\x5CxAA\x5CxABinteresting\x5Cx0B|[{"key": audience1, "value": 52},{"key": audience53, "value": 42}] +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie|2544|the movie is very very good|{rating: 7.000000, stars: 10, "views": 982, "release": 2018-11-13 13:33:11, release_ns: 2018-11-13 13:33:11, release_ms: 2018-11-13 13:33:11, release_sec: 2018-11-13 13:33:11, release_tz: 2018-11-13 05:33:11+00, film: 2014-09-12, u8: 12, u16: 120, u32: 55, u64: 1, hugedata: -1844674407370954899456.000000}|\x5CxAB\x5CxCD|[{"key": audience1, "value": 33}] +-STATEMENT LOAD FROM tinysnb_person1 RETURN *; +---- error +Catalog exception: Table: person1 does not exist. +-STATEMENT LOAD FROM tinysnb1_person RETURN *; +---- error +Binder exception: No database named tinysnb1 has been attached. +-STATEMENT ATTACH 'dbname=pgscan user=ci host=localhost' (dbtype 'POSTGRES'); +---- ok +-STATEMENT LOAD FROM pgscan_movies RETURN count(*); +---- 1 +3 +-STATEMENT LOAD FROM pgscan_movies where length > 2500 RETURN name; +---- 1 +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie +-LOG IncorrectConnectionStr +-STATEMENT ATTACH 'dbname=test2132131 user=ci host=127.0.0.1' as tinysnb (dbtype 'POSTGRES'); +---- error +Binder exception: Failed to attach postgres database due to: IO Error: Unable to connect to Postgres at dbname=test2132131 user=ci host=127.0.0.1: connection to server at "127.0.0.1", port 5432 failed: Connection refused + Is the server running on that host and accepting TCP/IP connections? diff --git a/src/include/catalog/catalog_content.h b/src/include/catalog/catalog_content.h index a1ffe6ad0bf..10c45e302c1 100644 --- a/src/include/catalog/catalog_content.h +++ b/src/include/catalog/catalog_content.h @@ -20,6 +20,8 @@ class CatalogContent { public: KUZU_API explicit CatalogContent(common::VirtualFileSystem* vfs); + virtual ~CatalogContent() = default; + CatalogContent(const std::string& directory, common::VirtualFileSystem* vfs); CatalogContent(std::unique_ptr tables, From de72fc9345117936bd36e71069c466b57c9ae8db Mon Sep 17 00:00:00 2001 From: Maxwell <49460053+mxwli@users.noreply.github.com> Date: Tue, 26 Mar 2024 11:17:54 -0400 Subject: [PATCH 093/136] Python List and Map Parameter Support (#3090) * 3054 feature request clang-format and python lint find lowest bitwidth add requested changes CI checks add additional coverage fix casting function more coverage * fix test typo --- .../bind_comparison_expression.cpp | 25 ++- tools/python_api/src_cpp/py_connection.cpp | 182 ++++++++++++++++-- tools/python_api/test/test_parameter.py | 81 ++++++++ 3 files changed, 273 insertions(+), 15 deletions(-) diff --git a/src/binder/bind_expression/bind_comparison_expression.cpp b/src/binder/bind_expression/bind_comparison_expression.cpp index 53bd63a21f9..fb2086a08b6 100644 --- a/src/binder/bind_expression/bind_comparison_expression.cpp +++ b/src/binder/bind_expression/bind_comparison_expression.cpp @@ -1,6 +1,7 @@ #include "binder/binder.h" #include "binder/expression/function_expression.h" #include "binder/expression_binder.h" +#include "common/exception/binder.h" #include "main/client_context.h" using namespace kuzu::common; @@ -31,8 +32,28 @@ std::shared_ptr ExpressionBinder::bindComparisonExpression( function::BuiltInFunctionsUtils::matchFunction(functionName, childrenTypes, functions)); expression_vector childrenAfterCast; for (auto i = 0u; i < children.size(); ++i) { - childrenAfterCast.push_back( - implicitCastIfNecessary(children[i], function->parameterTypeIDs[i])); + if (LogicalTypeUtils::isNested(function->parameterTypeIDs[i]) && + children[i]->dataType.getLogicalTypeID() == LogicalTypeID::ANY) { + // try matching the type to any other children + bool foundValidChild = false; + for (auto j = 0u; !foundValidChild && j < children.size(); ++j) { + if (children[j]->dataType.getLogicalTypeID() == function->parameterTypeIDs[i]) { + childrenAfterCast.push_back( + implicitCastIfNecessary(children[i], children[j]->dataType)); + foundValidChild = true; + } + } + // LCOV_EXCL_START + if (!foundValidChild) { + throw common::BinderException( + stringFormat("Cannot resolve recursive data type for expression {}.", + children[i]->toString())); + } + // LCOV_EXCL_STOP + } else { + childrenAfterCast.push_back( + implicitCastIfNecessary(children[i], function->parameterTypeIDs[i])); + } } auto bindData = std::make_unique( std::make_unique(function->returnTypeID)); diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index a7e5fec40c9..98da99a8907 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -2,10 +2,12 @@ #include +#include "common/constants.h" #include "cached_import/py_cached_import.h" #include "common/string_format.h" #include "common/types/uuid.h" #include "datetime.h" // from Python +#include "function/built_in_function_utils.h" #include "main/connection.h" #include "pandas/pandas_scan.h" #include "processor/result/factorized_table.h" @@ -157,7 +159,7 @@ bool PyConnection::isPandasDataframe(const py::object& object) { static Value transformPythonValue(py::handle val); -std::unordered_map> transformPythonParameters( +static std::unordered_map> transformPythonParameters( const py::dict& params, Connection* conn) { std::unordered_map> result; for (auto& [key, value] : params) { @@ -174,22 +176,135 @@ std::unordered_map> transformPythonParameter return result; } -Value transformPythonValue(py::handle val) { +static bool canCastPyLogicalType(const LogicalType& from, const LogicalType& to) { + // the input of this function is restricted to the output of pyLogicalType + if (from.getLogicalTypeID() == LogicalTypeID::MAP) { + if (to.getLogicalTypeID() != LogicalTypeID::MAP) { + return false; + } + auto fromKeyType = MapType::getKeyType(&from), fromValueType = MapType::getValueType(&to); + auto toKeyType = MapType::getKeyType(&to), toValueType = MapType::getValueType(&to); + return + (canCastPyLogicalType(*fromKeyType, *toKeyType) || + canCastPyLogicalType(*toKeyType, *fromKeyType)) && + (canCastPyLogicalType(*fromValueType, *toValueType) || + canCastPyLogicalType(*toValueType, *fromValueType)); + } else if (from.getLogicalTypeID() == LogicalTypeID::VAR_LIST) { + if (to.getLogicalTypeID() != LogicalTypeID::VAR_LIST) { + return false; + } + return canCastPyLogicalType( + *VarListType::getChildType(&from), *VarListType::getChildType(&to)); + } else if (from.getLogicalTypeID() == LogicalTypeID::ANY || + from.getLogicalTypeID() == to.getLogicalTypeID()) { + return true; + } else { + auto castCost = function::BuiltInFunctionsUtils::getCastCost( + from.getLogicalTypeID(), to.getLogicalTypeID()); + return castCost != UNDEFINED_CAST_COST; + } + return false; +} + +static std::unique_ptr castPyLogicalType(const LogicalType& from, const LogicalType& to) { + // assumes from can cast to to + if (from.getLogicalTypeID() == LogicalTypeID::MAP) { + auto fromKeyType = MapType::getKeyType(&from), fromValueType = MapType::getValueType(&to); + auto toKeyType = MapType::getKeyType(&to), toValueType = MapType::getValueType(&to); + auto outputKeyType = canCastPyLogicalType(*fromKeyType, *toKeyType) ? toKeyType : fromKeyType; + auto outputValueType = canCastPyLogicalType(*fromValueType, *toValueType) ? toValueType : fromValueType; + return LogicalType::MAP( + std::make_unique(*outputKeyType), std::make_unique(*outputValueType)); + } + return std::make_unique(to); +} + +static void tryConvertPyLogicalType(LogicalType& from, LogicalType& to) { + if (canCastPyLogicalType(from, to)) { + from = *castPyLogicalType(from, to); + } else if (canCastPyLogicalType(to, from)) { + from = *castPyLogicalType(to, from); + } else { + throw RuntimeException(stringFormat( + "Cannot convert Python object to Kuzu value : {} is incompatible with {}", + from.toString(), to.toString())); + } +} + +static std::unique_ptr pyLogicalType(py::handle val) { auto datetime_datetime = importCache->datetime.datetime(); auto time_delta = importCache->datetime.timedelta(); auto datetime_date = importCache->datetime.date(); auto uuid = importCache->uuid.UUID(); if (val.is_none()) { - return Value::createNullValue(); + return LogicalType::ANY(); } else if (py::isinstance(val)) { - return Value::createValue(val.cast()); + return LogicalType::BOOL(); } else if (py::isinstance(val)) { - return Value::createValue(val.cast()); + return LogicalType::INT64(); } else if (py::isinstance(val)) { - return Value::createValue(val.cast()); + return LogicalType::DOUBLE(); } else if (py::isinstance(val)) { - return Value::createValue(val.cast()); + return LogicalType::STRING(); } else if (py::isinstance(val, datetime_datetime)) { + return LogicalType::TIMESTAMP(); + } else if (py::isinstance(val, datetime_date)) { + return LogicalType::DATE(); + } else if (py::isinstance(val, time_delta)) { + return LogicalType::INTERVAL(); + } else if (py::isinstance(val, uuid)) { + return LogicalType::UUID(); + } else if (py::isinstance(val)) { + py::list lst = py::reinterpret_borrow(val); + auto childType = LogicalType::ANY(); + if (py::len(lst) == 0) { + childType = LogicalType::STRING(); + } + for (auto child : lst) { + auto curChildType = pyLogicalType(child); + tryConvertPyLogicalType(*childType, *curChildType); + } + return LogicalType::VAR_LIST(std::move(childType)); + } else if (py::isinstance(val)) { + py::dict dict = py::reinterpret_borrow(val); + auto childKeyType = LogicalType::ANY(), childValueType = LogicalType::ANY(); + if (py::len(dict) == 0) { + childKeyType = LogicalType::STRING(); + childValueType = LogicalType::STRING(); + } + for (auto child : dict) { + auto curChildKeyType = pyLogicalType(child.first), + curChildValueType = pyLogicalType(child.second); + tryConvertPyLogicalType(*childKeyType, *curChildKeyType); + tryConvertPyLogicalType(*childValueType, *curChildValueType); + } + return LogicalType::MAP(std::move(childKeyType), std::move(childValueType)); + } else { + // LCOV_EXCL_START + throw common::RuntimeException( + "Unknown parameter type " + py::str(val.get_type()).cast()); + // LCOV_EXCL_STOP + } +} + +static Value transformPythonValueAs(py::handle val, const LogicalType* type) { + // ignore the type of the actual python object, just directly cast + switch (type->getLogicalTypeID()) { + case LogicalTypeID::ANY: + return Value::createNullValue(); + case LogicalTypeID::BOOL: + return Value::createValue(val.cast()); + case LogicalTypeID::INT64: + return Value::createValue(val.cast()); + case LogicalTypeID::DOUBLE: + return Value::createValue(val.cast()); + case LogicalTypeID::STRING: + if (py::isinstance(val)) { + return Value::createValue(val.cast()); + } else { + return Value::createValue(py::str(val)); + } + case LogicalTypeID::TIMESTAMP: { auto ptr = val.ptr(); auto year = PyDateTime_GET_YEAR(ptr); auto month = PyDateTime_GET_MONTH(ptr); @@ -201,13 +316,15 @@ Value transformPythonValue(py::handle val) { auto date = Date::fromDate(year, month, day); auto time = Time::fromTime(hour, minute, second, micros); return Value::createValue(Timestamp::fromDateTime(date, time)); - } else if (py::isinstance(val, datetime_date)) { + } + case LogicalTypeID::DATE: { auto ptr = val.ptr(); auto year = PyDateTime_GET_YEAR(ptr); auto month = PyDateTime_GET_MONTH(ptr); auto day = PyDateTime_GET_DAY(ptr); return Value::createValue(Date::fromDate(year, month, day)); - } else if (py::isinstance(val, time_delta)) { + } + case LogicalTypeID::INTERVAL: { auto ptr = val.ptr(); auto days = PyDateTime_DELTA_GET_DAYS(ptr); auto seconds = PyDateTime_DELTA_GET_SECONDS(ptr); @@ -217,14 +334,53 @@ Value transformPythonValue(py::handle val) { Interval::addition(interval, seconds, "seconds"); Interval::addition(interval, microseconds, "microseconds"); return Value::createValue(interval); - } else if (py::isinstance(val, uuid)) { + } + case LogicalTypeID::UUID: { auto strVal = py::str(val).cast(); auto uuidVal = UUID::fromString(strVal); ku_uuid_t uuidToAppend; uuidToAppend.value = uuidVal; return Value{uuidToAppend}; - } else { - throw std::runtime_error( - "Unknown parameter type " + py::str(val.get_type()).cast()); } + case LogicalTypeID::VAR_LIST: { + py::list lst = py::reinterpret_borrow(val); + std::vector> children; + for (auto child : lst) { + children.push_back(std::make_unique( + transformPythonValueAs(child, VarListType::getChildType(type)))); + } + return Value(std::make_unique(*type), std::move(children)); + } + case LogicalTypeID::MAP: { + py::dict dict = py::reinterpret_borrow(val); + std::vector> children; + auto childKeyType = MapType::getKeyType(type), + childValueType = MapType::getValueType(type); + for (auto child : dict) { + // type construction is inefficient, we have to create duplicates because it asks for + // a unique ptr + std::vector fields; + fields.emplace_back( + InternalKeyword::MAP_KEY, std::make_unique(*childKeyType)); + fields.emplace_back( + InternalKeyword::MAP_VALUE, std::make_unique(*childValueType)); + std::vector> structValues; + structValues.push_back(std::make_unique(transformPythonValueAs(child.first, childKeyType))); + structValues.push_back(std::make_unique(transformPythonValueAs(child.second, childValueType))); + children.push_back(std::make_unique( + LogicalType::STRUCT(std::move(fields)), + std::move(structValues))); + } + return Value(std::make_unique(*type), std::move(children)); + } + // LCOV_EXCL_START + default: + KU_UNREACHABLE; + // LCOV_EXCL_STOP + } +} + +Value transformPythonValue(py::handle val) { + auto type = pyLogicalType(val); + return transformPythonValueAs(val, type.get()); } diff --git a/tools/python_api/test/test_parameter.py b/tools/python_api/test/test_parameter.py index 9a0452a6349..f389297eb33 100644 --- a/tools/python_api/test/test_parameter.py +++ b/tools/python_api/test/test_parameter.py @@ -4,6 +4,11 @@ import pytest from type_aliases import ConnDB +from typing import TYPE_CHECKING +# required by python-lint +if TYPE_CHECKING: + from pathlib import Path +import kuzu def test_bool_param(conn_db_readonly: ConnDB) -> None: @@ -64,6 +69,75 @@ def test_timestamp_param(conn_db_readonly: ConnDB) -> None: assert not result.has_next() result.close() +def test_int64_list_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly + result = conn.execute( + "MATCH (a:person {workedHours: $1}) RETURN COUNT(*);", + {"1": [3, 4, 5, 6, 7]}) + assert result.has_next() + assert result.get_next() == [1] + assert not result.has_next() + result.close() + +def test_int64_list_list_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly + result = conn.execute( + "MATCH (a:person) WHERE a.courseScoresPerTerm = $1 OR a.courseScoresPerTerm = $2 RETURN COUNT(*);", + {"1": [[8, 10]], "2": [[7, 4], [8, 8], [9]]}) + assert result.has_next() + assert result.get_next() == [2] + assert not result.has_next() + result.close() + +def test_string_list_param(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly + result = conn.execute( + "MATCH (a:person {usedNames: $1}) RETURN COUNT(*);", + {"1": ["Carmen", "Fred"]}) + assert result.has_next() + assert result.get_next() == [1] + assert not result.has_next() + result = conn.execute( + "MATCH (a:person {usedNames: $1}) RETURN COUNT(*);", + {"1": []}) # empty list is string + result.close() + +def test_map_param(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) + conn = kuzu.Connection(db) + conn.execute("CREATE NODE TABLE tab(id int64, mp MAP(double, int64), mp2 MAP(int64, double), mp3 MAP(string, string), mp4 MAP(string, string), primary key(id))") + result = conn.execute( + "MERGE (t:tab {id: 0, mp: $1, mp2: $2, mp3: $3, mp4: $4}) RETURN t.*", + {"1": {1.0: 5, 2: 3, 2.2: -1}, + "2": {5: -0.5, 4: 0, 0: 2.2}, + "3": {'a': 1, 'b': '2', 'c': '3'}, + "4": {}}) + assert result.has_next() + assert result.get_next() == [0, {1.0: 5, 2.0: 3, 2.2: -1}, {5: -0.5, 4: -0.0, 0: 2.2}, {'a': '1', 'b': '2', 'c': '3'}, {}] + assert not result.has_next() + result.close() + +def test_general_list_param(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) + conn = kuzu.Connection(db) + conn.execute( + "CREATE NODE TABLE tab(id int64, lst1 BOOL[], lst2 DOUBLE[], lst3 TIMESTAMP[], lst4 DATE[], lst5 INTERVAL[], lst6 STRING[], PRIMARY KEY(id))") + lst1 = [True, False] + lst2 = [1.0, 2.0] + lst3 = [datetime.datetime(2019, 11, 12, 11, 25, 30), datetime.datetime(1987, 2, 15, 3, 0, 2)] + lst4 = [datetime.date(2019, 11, 12), datetime.date(1987, 2, 15)] + lst5 = [lst3[0] - lst3[1]] + lst6 = [1, 'a', 'b'] + lst6ToString = ['1', 'a', 'b'] + result = conn.execute( + "MERGE (t:tab {id: 0, lst1: $1, lst2: $2, lst3: $3, lst4: $4, lst5: $5, lst6: $6}) RETURN t.*", + { + "1": lst1, "2": lst2, "3": lst3, "4": lst4, "5": lst5, "6": lst6 + }) + assert result.has_next() + assert result.get_next() == [0, lst1, lst2, lst3, lst4, lst5, lst6ToString] + assert not result.has_next() + result.close() def test_param_error1(conn_db_readonly: ConnDB) -> None: conn, db = conn_db_readonly @@ -81,3 +155,10 @@ def test_param_error3(conn_db_readonly: ConnDB) -> None: conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Parameters must be a dict"): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", [("asd", 1, 1)]) + + +def test_param_error4(conn_db_readonly: ConnDB) -> None: + conn, db = conn_db_readonly + with pytest.raises(RuntimeError, match="Runtime exception: Cannot convert Python object to Kuzu value : INT64 is incompatible with TIMESTAMP"): + conn.execute("MATCH (a:person {workedHours: $1}) RETURN COUNT(*);", {'1': [1, 2, datetime.datetime(2023, 3, 25)]}) + From a85f4fe16fa83aa3183666da6c37f5d7b9d4ec2c Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Tue, 26 Mar 2024 15:14:39 -0400 Subject: [PATCH 094/136] Cache DiskArray write header in-memory (#3109) * Cache DiskArray write header in-memory * Replace InMemDiskArray with BaseDiskArray --- .../storage/storage_structure/disk_array.h | 94 +++------- src/include/storage/store/column.h | 1 + src/include/storage/store/dictionary_column.h | 1 + src/include/storage/store/node_table.h | 1 + src/include/storage/store/rel_table.h | 1 + src/include/storage/store/rel_table_data.h | 1 + src/include/storage/store/string_column.h | 1 + src/include/storage/store/struct_column.h | 1 + src/include/storage/store/table.h | 2 + src/include/storage/store/table_data.h | 1 + src/include/storage/store/var_list_column.h | 1 + src/storage/index/hash_index.cpp | 3 + src/storage/storage_manager.cpp | 8 + src/storage/storage_structure/disk_array.cpp | 160 +++++------------- src/storage/store/column.cpp | 8 + src/storage/store/dictionary_column.cpp | 5 + src/storage/store/node_table.cpp | 8 + src/storage/store/rel_table.cpp | 6 + src/storage/store/rel_table_data.cpp | 6 + src/storage/store/string_column.cpp | 6 + src/storage/store/struct_column.cpp | 7 + src/storage/store/table_data.cpp | 6 + src/storage/store/var_list_column.cpp | 6 + 23 files changed, 148 insertions(+), 186 deletions(-) diff --git a/src/include/storage/storage_structure/disk_array.h b/src/include/storage/storage_structure/disk_array.h index 8b32e8b48c2..2bc07eb9093 100644 --- a/src/include/storage/storage_structure/disk_array.h +++ b/src/include/storage/storage_structure/disk_array.h @@ -33,6 +33,8 @@ struct DiskArrayHeader { void readFromFile(FileHandle& fileHandle, uint64_t headerPageIdx); + bool operator==(const DiskArrayHeader& other) const = default; + // We do not need to store numElementsPerPageLog2, elementPageOffsetMask, and numArrayPages or // save them on disk as they are functions of elementSize and numElements but we // nonetheless store them (and save them to disk) for simplicity. @@ -133,12 +135,18 @@ class BaseDiskArrayInternal { checkpointOrRollbackInMemoryIfNecessaryNoLock(false /* is rollback */); } + virtual void prepareCommit(); + protected: uint64_t pushBackNoLock(std::span val); - uint64_t getNumElementsNoLock(transaction::TransactionType trxType); + inline uint64_t getNumElementsNoLock(transaction::TransactionType trxType) { + return getDiskArrayHeader(trxType).numElements; + } - uint64_t getNumAPsNoLock(transaction::TransactionType trxType); + inline uint64_t getNumAPsNoLock(transaction::TransactionType trxType) { + return getDiskArrayHeader(trxType).numAPs; + } void setNextPIPPageIDxOfPIPNoLock(DiskArrayHeader* updatedDiskArrayHeader, uint64_t pipIdxOfPreviousPIP, common::page_idx_t nextPIPPageIdx); @@ -169,8 +177,13 @@ class BaseDiskArrayInternal { bool checkOutOfBoundAccess(transaction::TransactionType trxType, uint64_t idx); bool hasPIPUpdatesNoLock(uint64_t pipIdx); - uint64_t readUInt64HeaderFieldNoLock( - transaction::TransactionType trxType, std::function readOp); + inline const DiskArrayHeader& getDiskArrayHeader(transaction::TransactionType trxType) { + if (trxType == transaction::TransactionType::READ_ONLY) { + return header; + } else { + return headerForWriteTrx; + } + } // Returns the apPageIdx of the AP with idx apIdx and a bool indicating whether the apPageIdx is // a newly inserted page. @@ -184,6 +197,7 @@ class BaseDiskArrayInternal { FileHandle& fileHandle; DBFileID dbFileID; common::page_idx_t headerPageIdx; + DiskArrayHeader headerForWriteTrx; bool hasTransactionalUpdates; BufferManager* bufferManager; WAL* wal; @@ -234,6 +248,7 @@ class BaseDiskArray { inline void checkpointInMemoryIfNecessary() { diskArray.checkpointInMemoryIfNecessary(); } inline void rollbackInMemoryIfNecessary() { diskArray.rollbackInMemoryIfNecessary(); } + inline void prepareCommit() { diskArray.prepareCommit(); } private: BaseDiskArrayInternal diskArray; @@ -271,77 +286,20 @@ class BaseInMemDiskArray : public BaseDiskArrayInternal { std::vector> inMemArrayPages; }; -/** - * Stores an array of type U's page by page in memory, using OS memory and not the buffer manager. - * Designed currently to be used by lists headers and metadata, where we want to avoid using - * pins/unpins when accessing data through the buffer manager. - */ -class InMemDiskArrayInternal : public BaseInMemDiskArray { -public: - InMemDiskArrayInternal(FileHandle& fileHandle, DBFileID dbFileID, - common::page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, - transaction::Transaction* transaction); - - static inline common::page_idx_t addDAHPageToFile( - BMFileHandle& fileHandle, BufferManager* bufferManager, WAL* wal, size_t size) { - DiskArrayHeader daHeader(size); - return DBFileUtils::insertNewPage(fileHandle, DBFileID{DBFileType::METADATA}, - *bufferManager, *wal, - [&](uint8_t* frame) -> void { memcpy(frame, &daHeader, sizeof(DiskArrayHeader)); }); - } - - inline void checkpointInMemoryIfNecessary() override { - std::unique_lock xlock{this->diskArraySharedMtx}; - checkpointOrRollbackInMemoryIfNecessaryNoLock(true /* is checkpoint */); - } - inline void rollbackInMemoryIfNecessary() override { - std::unique_lock xlock{this->diskArraySharedMtx}; - checkpointOrRollbackInMemoryIfNecessaryNoLock(false /* is rollback */); - } - -private: - void checkpointOrRollbackInMemoryIfNecessaryNoLock(bool isCheckpoint) override; -}; - template -class InMemDiskArray { +class InMemDiskArray : public BaseDiskArray { public: + // Used when loading from file InMemDiskArray(FileHandle& fileHandle, DBFileID dbFileID, common::page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction) - : diskArray(fileHandle, dbFileID, headerPageIdx, bufferManager, wal, transaction) {} - - inline U& operator[](uint64_t idx) { return *(U*)diskArray[idx]; } - + : BaseDiskArray(fileHandle, dbFileID, headerPageIdx, bufferManager, wal, transaction) {} static inline common::page_idx_t addDAHPageToFile( BMFileHandle& fileHandle, BufferManager* bufferManager, WAL* wal) { - return InMemDiskArrayInternal::addDAHPageToFile(fileHandle, bufferManager, wal, sizeof(U)); - } - - // Note: This function is to be used only by the WRITE trx. - inline void update(uint64_t idx, U val) { diskArray.update(idx, getSpan(val)); } - - inline U get(uint64_t idx, transaction::TransactionType trxType) { - U val; - diskArray.get(idx, trxType, getSpan(val)); - return val; - } - - // Note: Currently, this function doesn't support shrinking the size of the array. - inline uint64_t resize(uint64_t newNumElements) { - U defaultVal; - return diskArray.resize(newNumElements, getSpan(defaultVal)); - } - - inline uint64_t getNumElements( - transaction::TransactionType trxType = transaction::TransactionType::READ_ONLY) { - return diskArray.getNumElements(trxType); + DiskArrayHeader daHeader(sizeof(U)); + return DBFileUtils::insertNewPage(fileHandle, DBFileID{DBFileType::METADATA}, + *bufferManager, *wal, + [&](uint8_t* frame) -> void { memcpy(frame, &daHeader, sizeof(DiskArrayHeader)); }); } - - inline void checkpointInMemoryIfNecessary() { diskArray.checkpointInMemoryIfNecessary(); } - inline void rollbackInMemoryIfNecessary() { diskArray.rollbackInMemoryIfNecessary(); } - -private: - InMemDiskArrayInternal diskArray; }; class InMemDiskArrayBuilderInternal : public BaseInMemDiskArray { diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index 4a8493c4387..657ba8bd933 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -75,6 +75,7 @@ class Column { Column* getNullColumn(); + virtual void prepareCommit(); virtual void prepareCommitForChunk(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, diff --git a/src/include/storage/store/dictionary_column.h b/src/include/storage/store/dictionary_column.h index a9bc94386cb..d667d5c54d4 100644 --- a/src/include/storage/store/dictionary_column.h +++ b/src/include/storage/store/dictionary_column.h @@ -32,6 +32,7 @@ class DictionaryColumn { uint64_t getNumValuesInOffsets( transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx); + void prepareCommit(); void checkpointInMemory(); void rollbackInMemory(); diff --git a/src/include/storage/store/node_table.h b/src/include/storage/store/node_table.h index d24b7d82e62..08ec3f877a4 100644 --- a/src/include/storage/store/node_table.h +++ b/src/include/storage/store/node_table.h @@ -98,6 +98,7 @@ class NodeTable final : public Table { inline void append(ChunkedNodeGroup* nodeGroup) { tableData->append(nodeGroup); } void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) override; + void prepareCommit() override; void prepareRollback(LocalTable* localTable) override; void checkpointInMemory() override; void rollbackInMemory() override; diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index 1d2994d1aca..13bc233a988 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -139,6 +139,7 @@ class RelTable final : public Table { } void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) override; + void prepareCommit() override; void prepareRollback(LocalTable* localTable) override; void checkpointInMemory() override; void rollbackInMemory() override; diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index c8b48385d17..131d351cba5 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -165,6 +165,7 @@ class RelTableData final : public TableData { void prepareCommitNodeGroup(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, LocalRelNG* localRelNG); + void prepareCommit() override; void checkpointInMemory() override; void rollbackInMemory() override; diff --git a/src/include/storage/store/string_column.h b/src/include/storage/store/string_column.h index 3edf4f51328..986cdc92bb3 100644 --- a/src/include/storage/store/string_column.h +++ b/src/include/storage/store/string_column.h @@ -28,6 +28,7 @@ class StringColumn final : public Column { void write(common::node_group_idx_t nodeGroupIdx, common::offset_t offsetInChunk, ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues) override; + void prepareCommit() override; void checkpointInMemory() override; void rollbackInMemory() override; diff --git a/src/include/storage/store/struct_column.h b/src/include/storage/store/struct_column.h index 5827275afa0..acafb82b298 100644 --- a/src/include/storage/store/struct_column.h +++ b/src/include/storage/store/struct_column.h @@ -23,6 +23,7 @@ class StructColumn final : public Column { void checkpointInMemory() override; void rollbackInMemory() override; + void prepareCommit() override; inline Column* getChild(common::vector_idx_t childIdx) { KU_ASSERT(childIdx < childColumns.size()); diff --git a/src/include/storage/store/table.h b/src/include/storage/store/table.h index c5d9ad4dadf..6b0a0f925a2 100644 --- a/src/include/storage/store/table.h +++ b/src/include/storage/store/table.h @@ -75,6 +75,8 @@ class Table { virtual void dropColumn(common::column_id_t columnID) = 0; virtual void prepareCommit(transaction::Transaction* transaction, LocalTable* localTable) = 0; + // For metadata-only updates + virtual void prepareCommit() = 0; virtual void prepareRollback(LocalTable* localTable) = 0; virtual void checkpointInMemory() = 0; virtual void rollbackInMemory() = 0; diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index ac0606bd864..65ad23b1aa1 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -45,6 +45,7 @@ class TableData { transaction::Transaction* transaction, LocalTableData* localTable) = 0; virtual void checkpointInMemory(); virtual void rollbackInMemory(); + virtual void prepareCommit(); virtual common::node_group_idx_t getNumNodeGroups( transaction::Transaction* transaction) const = 0; diff --git a/src/include/storage/store/var_list_column.h b/src/include/storage/store/var_list_column.h index 1dc3eb05f6e..641ef601728 100644 --- a/src/include/storage/store/var_list_column.h +++ b/src/include/storage/store/var_list_column.h @@ -76,6 +76,7 @@ class VarListColumn : public Column { void scanFiltered(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::ValueVector* offsetVector, const ListOffsetSizeInfo& listOffsetInfoInStorage); + void prepareCommit() final; void checkpointInMemory() final; void rollbackInMemory() final; diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp index ce9fbd6c1b2..0489eb6a9ab 100644 --- a/src/storage/index/hash_index.cpp +++ b/src/storage/index/hash_index.cpp @@ -260,6 +260,9 @@ void HashIndex::prepareCommit() { [this]( Key key, offset_t value) -> void { this->insertIntoPersistentIndex(key, value); }); headerArray->update(INDEX_HEADER_IDX_IN_ARRAY, *indexHeaderForWriteTrx); + headerArray->prepareCommit(); + pSlots->prepareCommit(); + oSlots->prepareCommit(); } } diff --git a/src/storage/storage_manager.cpp b/src/storage/storage_manager.cpp index 5b2f52d949c..9398c970204 100644 --- a/src/storage/storage_manager.cpp +++ b/src/storage/storage_manager.cpp @@ -127,6 +127,14 @@ void StorageManager::dropTable(table_id_t tableID) { void StorageManager::prepareCommit(transaction::Transaction* transaction) { transaction->getLocalStorage()->prepareCommit(); + // Tables which are created but not inserted into may have pending writes + // which need to be flushed (specifically, the metadata disk array header) + // TODO(bmwinger): wal->getUpdatedTables isn't the ideal place to store this information + for (auto tableID : wal->getUpdatedTables()) { + if (transaction->getLocalStorage()->getLocalTable(tableID) == nullptr) { + getTable(tableID)->prepareCommit(); + } + } if (nodesStatisticsAndDeletedIDs->hasUpdates()) { wal->logTableStatisticsRecord(true /* isNodeTable */); nodesStatisticsAndDeletedIDs->writeTablesStatisticsFileForWALRecord(wal->getDirectory()); diff --git a/src/storage/storage_structure/disk_array.cpp b/src/storage/storage_structure/disk_array.cpp index ca30441d9d2..3fba2e01ab9 100644 --- a/src/storage/storage_structure/disk_array.cpp +++ b/src/storage/storage_structure/disk_array.cpp @@ -3,6 +3,9 @@ #include "common/cast.h" #include "common/string_format.h" #include "common/utils.h" +#include "storage/buffer_manager/bm_file_handle.h" +#include "storage/file_handle.h" +#include "storage/storage_structure/db_file_utils.h" using namespace kuzu::common; using namespace kuzu::transaction; @@ -33,7 +36,8 @@ PIPWrapper::PIPWrapper(FileHandle& fileHandle, page_idx_t pipPageIdx) : pipPageI BaseDiskArrayInternal::BaseDiskArrayInternal( FileHandle& fileHandle, page_idx_t headerPageIdx, uint64_t elementSize) : header{elementSize}, fileHandle{fileHandle}, headerPageIdx{headerPageIdx}, - hasTransactionalUpdates{false}, bufferManager{nullptr}, wal{nullptr} {} + headerForWriteTrx{header}, hasTransactionalUpdates{false}, + bufferManager{nullptr}, wal{nullptr} {} BaseDiskArrayInternal::BaseDiskArrayInternal(FileHandle& fileHandle, DBFileID dbFileID, page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, @@ -45,6 +49,7 @@ BaseDiskArrayInternal::BaseDiskArrayInternal(FileHandle& fileHandle, DBFileID db transaction->getType()); bufferManager->optimisticRead(*fileHandleToPin, pageIdxToPin, [&](uint8_t* frame) -> void { memcpy(&header, frame, sizeof(DiskArrayHeader)); }); + headerForWriteTrx = header; if (this->header.firstPIPPageIdx != DBFileUtils::NULL_PAGE_IDX) { pips.emplace_back(fileHandle, header.firstPIPPageIdx); while (pips[pips.size() - 1].pipContents.nextPipPageIdx != DBFileUtils::NULL_PAGE_IDX) { @@ -58,11 +63,6 @@ uint64_t BaseDiskArrayInternal::getNumElements(TransactionType trxType) { return getNumElementsNoLock(trxType); } -uint64_t BaseDiskArrayInternal::getNumElementsNoLock(TransactionType trxType) { - return readUInt64HeaderFieldNoLock(trxType, - [](DiskArrayHeader* diskArrayHeader) -> uint64_t { return diskArrayHeader->numElements; }); -} - bool BaseDiskArrayInternal::checkOutOfBoundAccess(TransactionType trxType, uint64_t idx) { auto currentNumElements = getNumElementsNoLock(trxType); if (idx >= currentNumElements) { @@ -135,30 +135,19 @@ uint64_t BaseDiskArrayInternal::resize(uint64_t newNumElements, std::span val) { - uint64_t elementIdx; - DBFileUtils::updatePage((BMFileHandle&)(fileHandle), dbFileID, headerPageIdx, - false /* not inserting a new page */, *bufferManager, *wal, - [this, &val, &elementIdx](uint8_t* frame) -> void { - auto updatedDiskArrayHeader = ((DiskArrayHeader*)frame); - elementIdx = updatedDiskArrayHeader->numElements; - auto apCursor = getAPIdxAndOffsetInAP(elementIdx); - auto [apPageIdx, isNewlyAdded] = getAPPageIdxAndAddAPToPIPIfNecessaryForWriteTrxNoLock( - (DiskArrayHeader*)frame, apCursor.pageIdx); - // Now do the push back. - DBFileUtils::updatePage((BMFileHandle&)(fileHandle), dbFileID, apPageIdx, isNewlyAdded, - *bufferManager, *wal, [&apCursor, &val](uint8_t* frame) -> void { - memcpy(frame + apCursor.elemPosInPage, val.data(), val.size()); - }); - updatedDiskArrayHeader->numElements++; + uint64_t elementIdx = headerForWriteTrx.numElements; + auto apCursor = getAPIdxAndOffsetInAP(elementIdx); + auto [apPageIdx, isNewlyAdded] = + getAPPageIdxAndAddAPToPIPIfNecessaryForWriteTrxNoLock(&headerForWriteTrx, apCursor.pageIdx); + // Now do the push back. + DBFileUtils::updatePage((BMFileHandle&)(fileHandle), dbFileID, apPageIdx, isNewlyAdded, + *bufferManager, *wal, [&apCursor, &val](uint8_t* frame) -> void { + memcpy(frame + apCursor.elemPosInPage, val.data(), val.size()); }); + headerForWriteTrx.numElements++; return elementIdx; } -uint64_t BaseDiskArrayInternal::getNumAPsNoLock(TransactionType trxType) { - return readUInt64HeaderFieldNoLock(trxType, - [](DiskArrayHeader* diskArrayHeader) -> uint64_t { return diskArrayHeader->numAPs; }); -} - void BaseDiskArrayInternal::setNextPIPPageIDxOfPIPNoLock(DiskArrayHeader* updatedDiskArrayHeader, uint64_t pipIdxOfPreviousPIP, page_idx_t nextPIPPageIdx) { // This happens if the first pip is being inserted, in which case we need to change the header. @@ -197,11 +186,19 @@ page_idx_t BaseDiskArrayInternal::getAPPageIdxNoLock(page_idx_t apIdx, Transacti } else { page_idx_t retVal; page_idx_t pageIdxOfUpdatedPip = getUpdatedPageIdxOfPipNoLock(pipIdx); - ((BMFileHandle&)fileHandle).acquireWALPageIdxLock(pageIdxOfUpdatedPip); - DBFileUtils::readWALVersionOfPage((BMFileHandle&)fileHandle, pageIdxOfUpdatedPip, - *bufferManager, *wal, [&retVal, &offsetInPIP](const uint8_t* frame) -> void { - retVal = ((PIP*)frame)->pageIdxs[offsetInPIP]; - }); + if (ku_dynamic_cast(fileHandle) + .hasWALPageVersionNoWALPageIdxLock(pageIdxOfUpdatedPip)) { + ((BMFileHandle&)fileHandle).acquireWALPageIdxLock(pageIdxOfUpdatedPip); + DBFileUtils::readWALVersionOfPage((BMFileHandle&)fileHandle, pageIdxOfUpdatedPip, + *bufferManager, *wal, [&retVal, &offsetInPIP](const uint8_t* frame) -> void { + retVal = ((PIP*)frame)->pageIdxs[offsetInPIP]; + }); + } else { + bufferManager->optimisticRead((BMFileHandle&)fileHandle, pageIdxOfUpdatedPip, + [&retVal, &offsetInPIP](const uint8_t* frame) -> void { + retVal = ((PIP*)frame)->pageIdxs[offsetInPIP]; + }); + } return retVal; } } @@ -223,10 +220,10 @@ void BaseDiskArrayInternal::checkpointOrRollbackInMemoryIfNecessaryNoLock(bool i if (!hasTransactionalUpdates) { return; } - // Note: We update the header regardless (even if it has not changed). We can optimize this - // by adding logic that keep track of whether the header has been updated. if (isCheckpoint) { - header.readFromFile(this->fileHandle, headerPageIdx); + header = headerForWriteTrx; + } else { + headerForWriteTrx = header; } clearWALPageVersionAndRemovePageFromFrameIfNecessary(headerPageIdx); for (uint64_t pipIdxOfUpdatedPIP : pipUpdates.updatedPipIdxs) { @@ -254,6 +251,17 @@ void BaseDiskArrayInternal::checkpointOrRollbackInMemoryIfNecessaryNoLock(bool i hasTransactionalUpdates = false; } +void BaseDiskArrayInternal::prepareCommit() { + // Update header if it has changed + if (headerForWriteTrx != header) { + DBFileUtils::updatePage((BMFileHandle&)(fileHandle), dbFileID, headerPageIdx, + false /* not inserting a new page */, *bufferManager, *wal, + [&](uint8_t* frame) -> void { + memcpy(frame, &headerForWriteTrx, sizeof(headerForWriteTrx)); + }); + } +} + bool BaseDiskArrayInternal::hasPIPUpdatesNoLock(uint64_t pipIdx) { // This is a request to a pipIdx > pips.size(). Since pips.size() is the original number of pips // we started with before the write transaction is updated, we return true, i.e., this PIP is @@ -264,24 +272,6 @@ bool BaseDiskArrayInternal::hasPIPUpdatesNoLock(uint64_t pipIdx) { return pipUpdates.updatedPipIdxs.contains(pipIdx); } -uint64_t BaseDiskArrayInternal::readUInt64HeaderFieldNoLock( - TransactionType trxType, std::function readOp) { - // TODO(Guodong): Fix the casting here, which can be incorrect for HashIndexBuilder. - auto bmFileHandle = reinterpret_cast(&fileHandle); - if ((trxType == TransactionType::READ_ONLY) || - !bmFileHandle->hasWALPageVersionNoWALPageIdxLock(headerPageIdx)) { - return readOp(&this->header); - } else { - uint64_t retVal; - ((BMFileHandle&)fileHandle).acquireWALPageIdxLock(headerPageIdx); - DBFileUtils::readWALVersionOfPage((BMFileHandle&)fileHandle, headerPageIdx, *bufferManager, - *wal, [&retVal, &readOp](uint8_t* frame) -> void { - retVal = readOp((DiskArrayHeader*)frame); - }); - return retVal; - } -} - std::pair BaseDiskArrayInternal::getAPPageIdxAndAddAPToPIPIfNecessaryForWriteTrxNoLock( DiskArrayHeader* updatedDiskArrayHeader, page_idx_t apIdx) { @@ -367,72 +357,6 @@ void BaseInMemDiskArray::readArrayPageFromFile(uint64_t apIdx, page_idx_t apPage reinterpret_cast(this->inMemArrayPages[apIdx].get()), apPageIdx); } -InMemDiskArrayInternal::InMemDiskArrayInternal(FileHandle& fileHandle, DBFileID dbFileID, - page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, - transaction::Transaction* transaction) - : BaseInMemDiskArray(fileHandle, dbFileID, headerPageIdx, bufferManager, wal, transaction) {} - -void InMemDiskArrayInternal::checkpointOrRollbackInMemoryIfNecessaryNoLock(bool isCheckpoint) { - if (!this->hasTransactionalUpdates) { - return; - } - uint64_t numOldAPs = this->getNumAPsNoLock(TransactionType::READ_ONLY); - for (uint64_t apIdx = 0; apIdx < numOldAPs; ++apIdx) { - uint64_t apPageIdx = this->getAPPageIdxNoLock(apIdx, TransactionType::READ_ONLY); - if (ku_dynamic_cast(this->fileHandle) - .hasWALPageVersionNoWALPageIdxLock(apPageIdx)) { - // Note we can directly read the new image from disk because the WALReplayer checkpoints - // the disk image of the page before calling - // InMemDiskArray::checkpointInMemoryIfNecessary. - if (isCheckpoint) { - this->readArrayPageFromFile(apIdx, apPageIdx); - } - this->clearWALPageVersionAndRemovePageFromFrameIfNecessary(apPageIdx); - } - } - uint64_t newNumAPs = this->getNumAPsNoLock(TransactionType::WRITE); - // When rolling back, unlike removing new PIPs in - // BaseDiskArray::checkpointOrRollbackInMemoryIfNecessaryNoLock when rolling back, we cannot - // directly truncate each page. Instead we need to keep track of the minimum apPageIdx we - // saw that we want to truncate to first. Then we call - // BaseDiskArray::checkpointOrRollbackInMemoryIfNecessaryNoLock, which can do its own - // truncation due to newly added PIPs. Then finally we truncate. The reason is this: suppose - // we added a new apIdx=1 with pageIdx 20 in the fileHandle, which suppose caused a new PIP - // to be inserted with pageIdx 21, and we further added one more new apIdx=2 with - // pageIdx 22. Now this function will loop through the newly added apIdxs, so apIdx=1 and 2 - // in that order. If we directly truncate to the pageIdx of apIdx=1, which is 20, then we - // will remove 21 and 22. But then we will loop through apIdx=2 and we need to convert it to - // its pageIdx to clear its updated WAL version. But that requires reading the newly added - // PIP's WAL version, which had pageIdx 22 but no longer exists. That would lead to a seg - // fault somewhere. So we do not truncate these in order not to accidentally remove newly - // added PIPs, which we would need if we kept calling removePageIdxAndTruncateIfNecessary - // for each newly added array pages. - page_idx_t minNewAPPageIdxToTruncateTo = INVALID_PAGE_IDX; - for (uint64_t apIdx = this->header.numAPs; apIdx < newNumAPs; apIdx++) { - page_idx_t apPageIdx = this->getAPPageIdxNoLock(apIdx, TransactionType::WRITE); - if (isCheckpoint) { - this->addInMemoryArrayPageAndReadFromFile(apPageIdx); - } - this->clearWALPageVersionAndRemovePageFromFrameIfNecessary(apPageIdx); - if (!isCheckpoint) { - minNewAPPageIdxToTruncateTo = std::min(minNewAPPageIdxToTruncateTo, apPageIdx); - } - } - - // TODO(Semih): Currently we do not support truncating DiskArrays. When we support that, we - // need to implement the logic to truncate InMemArrayPages as well. - // Note that the base class call sets hasTransactionalUpdates to false. - if (isCheckpoint) { - BaseDiskArrayInternal::checkpointOrRollbackInMemoryIfNecessaryNoLock( - true /* is checkpoint */); - } else { - BaseDiskArrayInternal::checkpointOrRollbackInMemoryIfNecessaryNoLock( - false /* is rollback */); - ((BMFileHandle&)this->fileHandle) - .removePageIdxAndTruncateIfNecessary(minNewAPPageIdxToTruncateTo); - } -} - InMemDiskArrayBuilderInternal::InMemDiskArrayBuilderInternal(FileHandle& fileHandle, page_idx_t headerPageIdx, uint64_t numElements, size_t elementSize, bool setToZero) : BaseInMemDiskArray(fileHandle, headerPageIdx, elementSize) { diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 8d2e29d389a..ff954fdc97e 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -581,6 +581,13 @@ Column::ReadState Column::getReadState( return {metadata, metadata.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)}; } +void Column::prepareCommit() { + metadataDA->prepareCommit(); + if (nullColumn) { + nullColumn->prepareCommit(); + } +} + void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, @@ -629,6 +636,7 @@ void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t no void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, offset_t startSrcOffset) { + metadataDA->prepareCommit(); auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; if (isNewNodeGroup) { diff --git a/src/storage/store/dictionary_column.cpp b/src/storage/store/dictionary_column.cpp index 108706bb4b3..0e252868206 100644 --- a/src/storage/store/dictionary_column.cpp +++ b/src/storage/store/dictionary_column.cpp @@ -106,6 +106,11 @@ string_index_t DictionaryColumn::append(node_group_idx_t nodeGroupIdx, std::stri nodeGroupIdx, reinterpret_cast(&startOffset), 1 /*numValues*/); } +void DictionaryColumn::prepareCommit() { + dataColumn->prepareCommit(); + offsetColumn->prepareCommit(); +} + void DictionaryColumn::checkpointInMemory() { dataColumn->checkpointInMemory(); offsetColumn->checkpointInMemory(); diff --git a/src/storage/store/node_table.cpp b/src/storage/store/node_table.cpp index 577ece2c99c..a6d1b1d6a73 100644 --- a/src/storage/store/node_table.cpp +++ b/src/storage/store/node_table.cpp @@ -160,9 +160,17 @@ void NodeTable::prepareCommit(Transaction* transaction, LocalTable* localTable) } auto localNodeTable = ku_dynamic_cast(localTable); tableData->prepareLocalTableToCommit(transaction, localNodeTable->getTableData()); + tableData->prepareCommit(); wal->addToUpdatedTables(tableID); } +void NodeTable::prepareCommit() { + if (pkIndex) { + pkIndex->prepareCommit(); + } + tableData->prepareCommit(); +} + void NodeTable::prepareRollback(LocalTable* localTable) { if (pkIndex) { pkIndex->prepareRollback(); diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index 32e86f0f77b..655de52aaac 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -154,12 +154,18 @@ void RelTable::prepareCommit(Transaction* transaction, LocalTable* localTable) { transaction, localRelTable->getTableData(RelDataDirection::FWD)); bwdRelTableData->prepareLocalTableToCommit( transaction, localRelTable->getTableData(RelDataDirection::BWD)); + prepareCommit(); } void RelTable::prepareRollback(LocalTable* localTable) { localTable->clear(); } +void RelTable::prepareCommit() { + fwdRelTableData->prepareCommit(); + bwdRelTableData->prepareCommit(); +} + void RelTable::checkpointInMemory() { fwdRelTableData->checkpointInMemory(); bwdRelTableData->checkpointInMemory(); diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 43b5e29f944..ed2d11cf7e0 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -969,6 +969,12 @@ LocalRelNG* RelTableData::getLocalNodeGroup( return localNodeGroup; } +void RelTableData::prepareCommit() { + csrHeaderColumns.offset->prepareCommit(); + csrHeaderColumns.length->prepareCommit(); + TableData::prepareCommit(); +} + void RelTableData::checkpointInMemory() { csrHeaderColumns.offset->checkpointInMemory(); csrHeaderColumns.length->checkpointInMemory(); diff --git a/src/storage/store/string_column.cpp b/src/storage/store/string_column.cpp index 88d630cd909..f4346710e38 100644 --- a/src/storage/store/string_column.cpp +++ b/src/storage/store/string_column.cpp @@ -1,5 +1,6 @@ #include "storage/store/string_column.h" +#include "storage/store/column.h" #include "storage/store/null_column.h" #include "storage/store/string_column_chunk.h" @@ -237,6 +238,11 @@ bool StringColumn::canIndexCommitInPlace(Transaction* transaction, node_group_id return true; } +void StringColumn::prepareCommit() { + Column::prepareCommit(); + dictionary.prepareCommit(); +} + void StringColumn::checkpointInMemory() { Column::checkpointInMemory(); dictionary.checkpointInMemory(); diff --git a/src/storage/store/struct_column.cpp b/src/storage/store/struct_column.cpp index fe15f12d81b..f942e9b5aa5 100644 --- a/src/storage/store/struct_column.cpp +++ b/src/storage/store/struct_column.cpp @@ -125,6 +125,13 @@ void StructColumn::rollbackInMemory() { } } +void StructColumn::prepareCommit() { + Column::prepareCommit(); + for (const auto& childColumn : childColumns) { + childColumn->prepareCommit(); + } +} + bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { diff --git a/src/storage/store/table_data.cpp b/src/storage/store/table_data.cpp index a7bdc0b7dca..c38d43ea1f1 100644 --- a/src/storage/store/table_data.cpp +++ b/src/storage/store/table_data.cpp @@ -19,6 +19,12 @@ void TableData::addColumn(Transaction* transaction, const std::string& colNamePr columns.push_back(std::move(column)); } +void TableData::prepareCommit() { + for (auto& column : columns) { + column->prepareCommit(); + } +} + void TableData::checkpointInMemory() { for (auto& column : columns) { column->checkpointInMemory(); diff --git a/src/storage/store/var_list_column.cpp b/src/storage/store/var_list_column.cpp index b53fb8898eb..9fe70cc89c5 100644 --- a/src/storage/store/var_list_column.cpp +++ b/src/storage/store/var_list_column.cpp @@ -247,6 +247,12 @@ void VarListColumn::scanFiltered(Transaction* transaction, node_group_idx_t node } } +void VarListColumn::prepareCommit() { + Column::prepareCommit(); + sizeColumn->prepareCommit(); + dataColumn->prepareCommit(); +} + void VarListColumn::checkpointInMemory() { Column::checkpointInMemory(); sizeColumn->checkpointInMemory(); From fc3b4a7d6b5755261e65160bdae302bfa3eb9f16 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Tue, 26 Mar 2024 16:25:29 -0400 Subject: [PATCH 095/136] Fix postgres scanner issues (#3148) --- .../duckdb_scanner/src/duckdb_catalog.cpp | 7 +++--- extension/duckdb_scanner/src/duckdb_scan.cpp | 2 +- .../src/include/duckdb_catalog.h | 3 ++- .../duckdb_scanner/src/include/duckdb_scan.h | 2 +- .../src/include/postgres_catalog.h | 3 ++- .../postgres_scanner/src/postgres_catalog.cpp | 23 +++++++++++-------- .../test/test_files/postgres_scanner.test | 11 +++++---- src/planner/operator/logical_operator.cpp | 4 ++++ 8 files changed, 34 insertions(+), 21 deletions(-) diff --git a/extension/duckdb_scanner/src/duckdb_catalog.cpp b/extension/duckdb_scanner/src/duckdb_catalog.cpp index 8fa2d4919d9..54f464ddd6b 100644 --- a/extension/duckdb_scanner/src/duckdb_catalog.cpp +++ b/extension/duckdb_scanner/src/duckdb_catalog.cpp @@ -8,7 +8,7 @@ namespace duckdb_scanner { void DuckDBCatalogContent::init( const std::string& dbPath, const std::string& catalogName, main::ClientContext* context) { - auto con = getConnection(dbPath); + auto [db, con] = getConnection(dbPath); auto query = common::stringFormat( "select table_name from information_schema.tables where table_catalog = '{}' and " "table_schema = '{}';", @@ -118,10 +118,11 @@ std::string DuckDBCatalogContent::getDefaultSchemaName() const { return "main"; } -duckdb::Connection DuckDBCatalogContent::getConnection(const std::string& dbPath) const { +std::pair DuckDBCatalogContent::getConnection( + const std::string& dbPath) const { duckdb::DuckDB db(dbPath); duckdb::Connection con(db); - return con; + return std::make_pair(std::move(db), std::move(con)); } } // namespace duckdb_scanner diff --git a/extension/duckdb_scanner/src/duckdb_scan.cpp b/extension/duckdb_scanner/src/duckdb_scan.cpp index 403d81216dd..5c248dade5c 100644 --- a/extension/duckdb_scanner/src/duckdb_scan.cpp +++ b/extension/duckdb_scanner/src/duckdb_scan.cpp @@ -52,7 +52,7 @@ struct DuckDBScanFunction { std::unique_ptr DuckDBScanFunction::initSharedState( function::TableFunctionInitInput& input) { auto scanBindData = reinterpret_cast(input.bindData); - auto conn = scanBindData->initDuckDBConn(); + auto [db, conn] = scanBindData->initDuckDBConn(); auto result = conn.SendQuery(scanBindData->query); if (result->HasError()) { throw common::RuntimeException( diff --git a/extension/duckdb_scanner/src/include/duckdb_catalog.h b/extension/duckdb_scanner/src/include/duckdb_catalog.h index 407e33e92e1..0c210722335 100644 --- a/extension/duckdb_scanner/src/include/duckdb_catalog.h +++ b/extension/duckdb_scanner/src/include/duckdb_catalog.h @@ -44,7 +44,8 @@ class DuckDBCatalogContent : public catalog::CatalogContent { virtual std::string getDefaultSchemaName() const; - virtual duckdb::Connection getConnection(const std::string& dbPath) const; + virtual std::pair getConnection( + const std::string& dbPath) const; private: void createForeignTable(duckdb::Connection& con, const std::string& tableName, diff --git a/extension/duckdb_scanner/src/include/duckdb_scan.h b/extension/duckdb_scanner/src/include/duckdb_scan.h index fe422737da5..cb435bab4fe 100644 --- a/extension/duckdb_scanner/src/include/duckdb_scan.h +++ b/extension/duckdb_scanner/src/include/duckdb_scan.h @@ -18,7 +18,7 @@ namespace duckdb_scanner { using duckdb_conversion_func_t = std::function; -using init_duckdb_conn_t = std::function; +using init_duckdb_conn_t = std::function()>; struct DuckDBScanBindData : public function::TableFuncBindData { explicit DuckDBScanBindData(std::string query, std::vector columnTypes, diff --git a/extension/postgres_scanner/src/include/postgres_catalog.h b/extension/postgres_scanner/src/include/postgres_catalog.h index 9437d9d31d6..a1e137dec90 100644 --- a/extension/postgres_scanner/src/include/postgres_catalog.h +++ b/extension/postgres_scanner/src/include/postgres_catalog.h @@ -39,7 +39,8 @@ class PostgresCatalogContent final : public duckdb_scanner::DuckDBCatalogContent std::string getDefaultSchemaName() const override; - duckdb::Connection getConnection(const std::string& dbPath) const override; + std::pair getConnection( + const std::string& dbPath) const override; private: static constexpr char DEFAULT_CATALOG_NAME[] = "pg"; diff --git a/extension/postgres_scanner/src/postgres_catalog.cpp b/extension/postgres_scanner/src/postgres_catalog.cpp index 91f559080b5..978748235ca 100644 --- a/extension/postgres_scanner/src/postgres_catalog.cpp +++ b/extension/postgres_scanner/src/postgres_catalog.cpp @@ -28,18 +28,23 @@ std::unique_ptr PostgresCatalogContent::bindCreate common::TableType::FOREIGN, tableName, std::move(extraCreatePostgresTableInfo)); } -duckdb::Connection PostgresCatalogContent::getConnection(const std::string& dbPath) const { +static void executeQueryAndCheckErrMsg(duckdb::Connection& con, std::string query) { + auto result = con.Query(query); + if (result->HasError()) { + throw common::RuntimeException(common::stringFormat( + "Failed to execute query {}, due to: {}", query, result->GetError())); + } +} + +std::pair PostgresCatalogContent::getConnection( + const std::string& dbPath) const { duckdb::DuckDB db(nullptr); duckdb::Connection con(db); - con.Query("install postgres;"); - con.Query("load postgres;"); - auto result = con.Query( + executeQueryAndCheckErrMsg(con, "install postgres;"); + executeQueryAndCheckErrMsg(con, "load postgres;"); + executeQueryAndCheckErrMsg(con, common::stringFormat("attach '{}' as {} (TYPE postgres);", dbPath, DEFAULT_CATALOG_NAME)); - if (result->HasError()) { - throw common::BinderException(common::stringFormat( - "Failed to attach postgres database due to: {}", result->GetError())); - } - return con; + return std::make_pair(std::move(db), std::move(con)); } } // namespace postgres_scanner diff --git a/extension/postgres_scanner/test/test_files/postgres_scanner.test b/extension/postgres_scanner/test/test_files/postgres_scanner.test index bd8fc2fc8f2..76ee4b0dc64 100644 --- a/extension/postgres_scanner/test/test_files/postgres_scanner.test +++ b/extension/postgres_scanner/test/test_files/postgres_scanner.test @@ -42,8 +42,9 @@ Binder exception: No database named tinysnb1 has been attached. -STATEMENT LOAD FROM pgscan_movies where length > 2500 RETURN name; ---- 1 The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie --LOG IncorrectConnectionStr --STATEMENT ATTACH 'dbname=test2132131 user=ci host=127.0.0.1' as tinysnb (dbtype 'POSTGRES'); ----- error -Binder exception: Failed to attach postgres database due to: IO Error: Unable to connect to Postgres at dbname=test2132131 user=ci host=127.0.0.1: connection to server at "127.0.0.1", port 5432 failed: Connection refused - Is the server running on that host and accepting TCP/IP connections? +# TODO(Ziyi): the error message is dependent on platforms. We have to implement regex in testing framework to handle this. +#-LOG IncorrectConnectionStr +#-STATEMENT ATTACH 'dbname=test2132131 user=ci host=127.0.0.1' as tinysnb (dbtype 'POSTGRES'); +#---- error +#Binder exception: Failed to attach postgres database due to: IO Error: Unable to connect to Postgres at dbname=test2132131 user=ci host=127.0.0.1: connection to server at "127.0.0.1", port 5432 failed: Connection refused +# Is the server running on that host and accepting TCP/IP connections? diff --git a/src/planner/operator/logical_operator.cpp b/src/planner/operator/logical_operator.cpp index 2544e9a1756..fca71e61f0c 100644 --- a/src/planner/operator/logical_operator.cpp +++ b/src/planner/operator/logical_operator.cpp @@ -7,6 +7,8 @@ namespace planner { std::string LogicalOperatorUtils::logicalOperatorTypeToString(LogicalOperatorType type) { switch (type) { + case LogicalOperatorType::ATTACH_DATABASE: + return "ATTACH_DATABASE"; case LogicalOperatorType::ACCUMULATE: return "ACCUMULATE"; case LogicalOperatorType::AGGREGATE: @@ -29,6 +31,8 @@ std::string LogicalOperatorUtils::logicalOperatorTypeToString(LogicalOperatorTyp return "DELETE_NODE"; case LogicalOperatorType::DELETE_REL: return "DELETE_REL"; + case LogicalOperatorType::DETACH_DATABASE: + return "DETACH_DATABASE"; case LogicalOperatorType::DISTINCT: return "DISTINCT"; case LogicalOperatorType::DROP_TABLE: From c1f68cde5c0757801485d99403f90acdf72f4a6e Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Tue, 26 Mar 2024 16:50:32 -0400 Subject: [PATCH 096/136] Refactor path functions and RDF functions (#3134) Refactor node/rel functions Refactor path functions Refactor RDF functions --- src/binder/bind/bind_updating_clause.cpp | 3 +- .../bind_function_expression.cpp | 15 ++-- src/catalog/catalog_content.cpp | 6 +- src/catalog/catalog_entry/CMakeLists.txt | 1 - .../scalar_function_catalog_entry.cpp | 22 ----- src/function/built_in_function_utils.cpp | 43 +--------- src/function/function_collection.cpp | 22 ++++- src/function/pattern/id_function.cpp | 1 + src/function/vector_list_functions.cpp | 80 +++++++++---------- src/function/vector_map_functions.cpp | 21 +++-- src/function/vector_node_rel_functions.cpp | 15 +++- src/function/vector_path_functions.cpp | 76 +++++++++--------- src/function/vector_rdf_functions.cpp | 4 +- src/function/vector_struct_functions.cpp | 4 +- src/function/vector_union_functions.cpp | 16 ++-- .../scalar_function_catalog_entry.h | 24 ------ src/include/common/enums/expression_type.h | 21 ----- .../function/built_in_function_utils.h | 6 -- src/include/function/function_collection.h | 7 +- .../function/path/vector_path_functions.h | 34 ++++---- .../function/rdf/vector_rdf_functions.h | 4 + .../function/schema/vector_label_functions.h | 2 + .../schema/vector_node_rel_functions.h | 20 +++-- 23 files changed, 183 insertions(+), 264 deletions(-) delete mode 100644 src/catalog/catalog_entry/scalar_function_catalog_entry.cpp delete mode 100644 src/include/catalog/catalog_entry/scalar_function_catalog_entry.h diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index c8248ca0d16..2e34094660b 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -12,6 +12,7 @@ #include "common/exception/binder.h" #include "common/keyword/rdf_keyword.h" #include "common/string_format.h" +#include "function/rdf/vector_rdf_functions.h" #include "main/client_context.h" #include "parser/query/updating_clause/delete_clause.h" #include "parser/query/updating_clause/insert_clause.h" @@ -208,7 +209,7 @@ void Binder::bindInsertRel( rel->getVariableName(), std::vector{resourceTableID}); auto iriData = rel->getPropertyDataExpr(std::string(rdf::IRI)); iriData = expressionBinder.bindScalarFunctionExpression( - expression_vector{std::move(iriData)}, VALIDATE_PREDICATE_FUNC_NAME); + expression_vector{std::move(iriData)}, function::ValidatePredicateFunction::name); pNode->addPropertyDataExpr(std::string(rdf::IRI), std::move(iriData)); bindInsertNode(pNode, infos); auto nodeInsertInfo = &infos[infos.size() - 1]; diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index 4932e41136e..3e349a47d15 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -6,8 +6,10 @@ #include "common/exception/binder.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/cast/vector_cast_functions.h" +#include "function/path/vector_path_functions.h" #include "function/rewrite_function.h" #include "function/schema/vector_label_functions.h" +#include "function/schema/vector_node_rel_functions.h" #include "main/client_context.h" #include "parser/expression/parsed_function_expression.h" #include "parser/parsed_expression_visitor.h" @@ -189,19 +191,19 @@ std::shared_ptr ExpressionBinder::bindMacroExpression( // ENDNODE(a) | a._dst std::shared_ptr ExpressionBinder::rewriteFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName) { - if (functionName == LABEL_FUNC_NAME) { + if (functionName == LabelFunction::name) { auto child = bindExpression(*parsedExpression.getChild(0)); validateExpectedDataType( *child, std::vector{LogicalTypeID::NODE, LogicalTypeID::REL}); return bindLabelFunction(*child); - } else if (functionName == LENGTH_FUNC_NAME) { + } else if (functionName == LengthFunction::name) { auto child = bindExpression(*parsedExpression.getChild(0)); return bindRecursiveJoinLengthFunction(*child); - } else if (functionName == START_NODE_FUNC_NAME) { + } else if (functionName == StartNodeFunction::name) { auto child = bindExpression(*parsedExpression.getChild(0)); validateExpectedDataType(*child, std::vector{LogicalTypeID::REL}); return bindStartNodeExpression(*child); - } else if (functionName == END_NODE_FUNC_NAME) { + } else if (functionName == EndNodeFunction::name) { auto child = bindExpression(*parsedExpression.getChild(0)); validateExpectedDataType(*child, std::vector{LogicalTypeID::REL}); return bindEndNodeExpression(*child); @@ -285,8 +287,9 @@ std::shared_ptr ExpressionBinder::bindLabelFunction(const Expression } auto execFunc = function::LabelFunction::execFunction; auto bindData = std::make_unique(LogicalType::STRING()); - auto uniqueExpressionName = ScalarFunctionExpression::getUniqueName(LABEL_FUNC_NAME, children); - return std::make_shared(LABEL_FUNC_NAME, ExpressionType::FUNCTION, + auto uniqueExpressionName = + ScalarFunctionExpression::getUniqueName(LabelFunction::name, children); + return std::make_shared(LabelFunction::name, ExpressionType::FUNCTION, std::move(bindData), std::move(children), execFunc, nullptr, uniqueExpressionName); } diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index 201ccaf838b..b6ed6f70e1b 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -3,11 +3,11 @@ #include #include "binder/ddl/bound_create_table_info.h" +#include "catalog/catalog_entry/function_catalog_entry.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "catalog/catalog_entry/rel_group_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" -#include "catalog/catalog_entry/scalar_function_catalog_entry.h" #include "catalog/catalog_entry/scalar_macro_catalog_entry.h" #include "common/cast.h" #include "common/exception/catalog.h" @@ -209,8 +209,8 @@ void CatalogContent::addFunction(std::string name, function::function_set defini if (functions->containsEntry(name)) { throw CatalogException{common::stringFormat("function {} already exists.", name)}; } - functions->createEntry( - std::make_unique(std::move(name), std::move(definitions))); + functions->createEntry(std::make_unique( + CatalogEntryType::SCALAR_FUNCTION_ENTRY, std::move(name), std::move(definitions))); } function::ScalarMacroFunction* CatalogContent::getScalarMacroFunction( diff --git a/src/catalog/catalog_entry/CMakeLists.txt b/src/catalog/catalog_entry/CMakeLists.txt index 52560c84ecc..2b577e3070e 100644 --- a/src/catalog/catalog_entry/CMakeLists.txt +++ b/src/catalog/catalog_entry/CMakeLists.txt @@ -9,7 +9,6 @@ add_library(kuzu_catalog_entry rel_group_catalog_entry.cpp rdf_graph_catalog_entry.cpp scalar_macro_catalog_entry.cpp - scalar_function_catalog_entry.cpp table_function_catalog_entry.cpp) set(ALL_OBJECT_FILES diff --git a/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp b/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp deleted file mode 100644 index e7988a2ba07..00000000000 --- a/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "catalog/catalog_entry/scalar_function_catalog_entry.h" - -#include "common/utils.h" - -namespace kuzu { -namespace catalog { - -ScalarFunctionCatalogEntry::ScalarFunctionCatalogEntry( - const char* name, function::function_set functionSet) - : ScalarFunctionCatalogEntry{std::string{name}, std::move(functionSet)} {} - -ScalarFunctionCatalogEntry::ScalarFunctionCatalogEntry( - std::string name, function::function_set functionSet) - : FunctionCatalogEntry{ - CatalogEntryType::SCALAR_FUNCTION_ENTRY, std::move(name), std::move(functionSet)} {} - -std::unique_ptr ScalarFunctionCatalogEntry::copy() const { - return std::make_unique(getName(), common::copyVector(functionSet)); -} - -} // namespace catalog -} // namespace kuzu diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index aed466bc1c9..5d4fcf78683 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -1,7 +1,6 @@ #include "function/built_in_function_utils.h" #include "catalog/catalog_entry/aggregate_function_catalog_entry.h" -#include "catalog/catalog_entry/scalar_function_catalog_entry.h" #include "catalog/catalog_entry/table_function_catalog_entry.h" #include "catalog/catalog_set.h" #include "common/exception/binder.h" @@ -12,10 +11,7 @@ #include "function/aggregate_function.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/function_collection.h" -#include "function/path/vector_path_functions.h" -#include "function/rdf/vector_rdf_functions.h" #include "function/scalar_function.h" -#include "function/schema/vector_node_rel_functions.h" #include "function/table/call_functions.h" #include "processor/operator/persistent/reader/csv/parallel_csv_reader.h" #include "processor/operator/persistent/reader/csv/serial_csv_reader.h" @@ -39,19 +35,12 @@ static void validateNonEmptyCandidateFunctions(std::vector& candidate function::function_set& set); void BuiltInFunctionsUtils::createFunctions(CatalogSet* catalogSet) { - registerScalarFunctions(catalogSet); registerAggregateFunctions(catalogSet); registerTableFunctions(catalogSet); registerFunctions(catalogSet); } -void BuiltInFunctionsUtils::registerScalarFunctions(CatalogSet* catalogSet) { - registerNodeRelFunctions(catalogSet); - registerPathFunctions(catalogSet); - registerRdfFunctions(catalogSet); -} - void BuiltInFunctionsUtils::registerAggregateFunctions(CatalogSet* catalogSet) { registerCountStar(catalogSet); registerCount(catalogSet); @@ -515,34 +504,6 @@ void BuiltInFunctionsUtils::validateSpecialCases(std::vector& candida } } -void BuiltInFunctionsUtils::registerNodeRelFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - OFFSET_FUNC_NAME, OffsetFunction::getFunctionSet())); - catalogSet->createEntry( - std::make_unique(catalog::CatalogEntryType::REWRITE_FUNCTION_ENTRY, - ID_FUNC_NAME, IDFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerPathFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - NODES_FUNC_NAME, NodesFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - RELS_FUNC_NAME, RelsFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - PROPERTIES_FUNC_NAME, PropertiesFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - IS_TRAIL_FUNC_NAME, IsTrailFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - IS_ACYCLIC_FUNC_NAME, IsACyclicFunction::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerRdfFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - TYPE_FUNC_NAME, RDFTypeFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - VALIDATE_PREDICATE_FUNC_NAME, ValidatePredicateFunction::getFunctionSet())); -} - void BuiltInFunctionsUtils::registerCountStar(CatalogSet* catalogSet) { function_set functionSet; functionSet.push_back(std::make_unique(COUNT_STAR_FUNC_NAME, @@ -672,8 +633,8 @@ void BuiltInFunctionsUtils::registerFunctions(catalog::CatalogSet* catalogSet) { auto functions = FunctionCollection::getFunctions(); for (auto i = 0u; functions[i].name != nullptr; ++i) { auto functionSet = functions[i].getFunctionSetFunc(); - catalogSet->createEntry(std::make_unique( - functions[i].name, std::move(functionSet))); + catalogSet->createEntry(std::make_unique( + functions[i].catalogEntryType, functions[i].name, std::move(functionSet))); } } diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 4fc4b135121..f08fb74dddc 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -9,6 +9,9 @@ #include "function/interval/vector_interval_functions.h" #include "function/list/vector_list_functions.h" #include "function/map/vector_map_functions.h" +#include "function/path/vector_path_functions.h" +#include "function/rdf/vector_rdf_functions.h" +#include "function/schema/vector_node_rel_functions.h" #include "function/string/vector_string_functions.h" #include "function/struct/vector_struct_functions.h" #include "function/timestamp/vector_timestamp_functions.h" @@ -19,11 +22,13 @@ namespace kuzu { namespace function { #define SCALAR_FUNCTION(_PARAM) \ - { _PARAM::name, _PARAM::getFunctionSet } + { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::SCALAR_FUNCTION_ENTRY } #define SCALAR_FUNCTION_ALIAS(_PARAM) \ - { _PARAM::alias, _PARAM::getFunctionSet } + { _PARAM::getFunctionSet, _PARAM::alias, CatalogEntryType::SCALAR_FUNCTION_ENTRY } +#define REWRITE_FUNCTION(_PARAM) \ + { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::REWRITE_FUNCTION_ENTRY } #define FINAL_FUNCTION \ - { nullptr, nullptr } + { nullptr, nullptr, CatalogEntryType::SCALAR_FUNCTION_ENTRY } FunctionCollection* FunctionCollection::getFunctions() { static FunctionCollection functions[] = { @@ -145,6 +150,17 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION(UnionValueFunction), SCALAR_FUNCTION(UnionTagFunction), SCALAR_FUNCTION(UnionExtractFunction), + // Node/rel functions + SCALAR_FUNCTION(OffsetFunction), REWRITE_FUNCTION(IDFunction), + + // Path functions + SCALAR_FUNCTION(NodesFunction), SCALAR_FUNCTION(RelsFunction), + SCALAR_FUNCTION(PropertiesFunction), SCALAR_FUNCTION(IsTrailFunction), + SCALAR_FUNCTION(IsACyclicFunction), + + // Rdf functions + SCALAR_FUNCTION(RDFTypeFunction), SCALAR_FUNCTION(ValidatePredicateFunction), + // End of array FINAL_FUNCTION}; diff --git a/src/function/pattern/id_function.cpp b/src/function/pattern/id_function.cpp index a0513134358..8f05ef35d47 100644 --- a/src/function/pattern/id_function.cpp +++ b/src/function/pattern/id_function.cpp @@ -3,6 +3,7 @@ #include "binder/expression/rel_expression.h" #include "binder/expression_binder.h" #include "common/cast.h" +#include "common/types/value/value.h" #include "function/rewrite_function.h" #include "function/schema/vector_node_rel_functions.h" #include "function/struct/vector_struct_functions.h" diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index 9648d2d260a..ae384a65777 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -255,7 +255,7 @@ static LogicalType getValidLogicalType(const binder::expression_vector& expressi return LogicalType(LogicalTypeID::ANY); } -static std::unique_ptr ListCreationFunctionBindFunc( +static std::unique_ptr ListCreationBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { auto resultType = LogicalType::VAR_LIST(ListCreationFunction::getChildType(arguments).copy()); return std::make_unique(std::move(resultType)); @@ -288,11 +288,11 @@ function_set ListCreationFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - ListCreationFunctionBindFunc, true /* isVarLength */)); + ListCreationBindFunc, true /* isVarLength */)); return result; } -static std::unique_ptr ListRangeFunctionBindFunc( +static std::unique_ptr ListRangeBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { KU_ASSERT(arguments[0]->dataType == arguments[1]->dataType); auto resultType = LogicalType::VAR_LIST( @@ -307,12 +307,12 @@ function_set ListRangeFunction::getFunctionSet() { result.push_back(std::make_unique(name, std::vector{typeID, typeID}, LogicalTypeID::VAR_LIST, getBinaryListExecFuncSwitchAll(LogicalType{typeID}), nullptr, - ListRangeFunctionBindFunc, false)); + ListRangeBindFunc, false)); // start, end, step result.push_back(std::make_unique(name, std::vector{typeID, typeID, typeID}, LogicalTypeID::VAR_LIST, getTernaryListExecFuncSwitchAll(LogicalType{typeID}), nullptr, - ListRangeFunctionBindFunc, false)); + ListRangeBindFunc, false)); } return result; } @@ -339,7 +339,7 @@ static void BinaryExecListExtractFunction(const std::vector ListExtractFunctionBindFunc( +static std::unique_ptr ListExtractBindFunc( const binder::expression_vector& arguments, Function* function) { auto resultType = VarListType::getChildType(&arguments[0]->dataType); auto scalarFunction = ku_dynamic_cast(function); @@ -423,7 +423,7 @@ function_set ListExtractFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::INT64}, - LogicalTypeID::ANY, nullptr, nullptr, ListExtractFunctionBindFunc, false /* isVarlength*/)); + LogicalTypeID::ANY, nullptr, nullptr, ListExtractBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, @@ -431,7 +431,7 @@ function_set ListExtractFunction::getFunctionSet() { false /* isVarlength */)); result.push_back(std::make_unique(name, std::vector{LogicalTypeID::ARRAY, LogicalTypeID::INT64}, LogicalTypeID::ANY, - nullptr, nullptr, ListExtractFunctionBindFunc, false /* isVarlength*/)); + nullptr, nullptr, ListExtractBindFunc, false /* isVarlength*/)); return result; } @@ -454,7 +454,7 @@ function_set ListConcatFunction::getFunctionSet() { return result; } -static std::unique_ptr ListAppendFunctionBindFunc( +static std::unique_ptr ListAppendBindFunc( const binder::expression_vector& arguments, Function* function) { if (*VarListType::getChildType(&arguments[0]->dataType) != arguments[1]->getDataType()) { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( @@ -471,12 +471,11 @@ function_set ListAppendFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListAppendFunctionBindFunc, - false /* isVarlength*/)); + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListAppendBindFunc, false /* isVarlength*/)); return result; } -static std::unique_ptr ListPrependFunctionBindFunc( +static std::unique_ptr ListPrependBindFunc( const binder::expression_vector& arguments, Function* function) { if (arguments[0]->getDataType().getLogicalTypeID() != LogicalTypeID::ANY && arguments[1]->dataType != *VarListType::getChildType(&arguments[0]->dataType)) { @@ -494,12 +493,11 @@ function_set ListPrependFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListPrependFunctionBindFunc, - false /* isVarlength */)); + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListPrependBindFunc, false /* isVarlength */)); return result; } -static std::unique_ptr ListPositionFunctionBindFunc( +static std::unique_ptr ListPositionBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); scalarFunction->execFunc = @@ -511,12 +509,11 @@ function_set ListPositionFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::INT64, nullptr, nullptr, ListPositionFunctionBindFunc, - false /* isVarlength */)); + LogicalTypeID::INT64, nullptr, nullptr, ListPositionBindFunc, false /* isVarlength */)); return result; } -static std::unique_ptr ListContainsFunctionBindFunc( +static std::unique_ptr ListContainsBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); scalarFunction->execFunc = @@ -528,12 +525,11 @@ function_set ListContainsFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::BOOL, nullptr, nullptr, ListContainsFunctionBindFunc, - false /* isVarlength */)); + LogicalTypeID::BOOL, nullptr, nullptr, ListContainsBindFunc, false /* isVarlength */)); return result; } -static std::unique_ptr ListSliceFunctionBindFunc( +static std::unique_ptr ListSliceBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { return std::make_unique(arguments[0]->getDataType().copy()); } @@ -546,7 +542,7 @@ function_set ListSliceFunction::getFunctionSet() { LogicalTypeID::VAR_LIST, ScalarFunction::TernaryExecListStructFunction, - nullptr, ListSliceFunctionBindFunc, false /* isVarlength*/)); + nullptr, ListSliceBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::INT64}, @@ -576,7 +572,7 @@ static void getListSortExecFunction( } } -static std::unique_ptr ListSortFunctionBindFunc( +static std::unique_ptr ListSortBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { @@ -650,18 +646,16 @@ static std::unique_ptr ListSortFunctionBindFunc( function_set ListSortFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, ListSortFunctionBindFunc, false /* isVarlength*/)); + result.push_back( + std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortFunctionBindFunc, - false /* isVarlength*/)); + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{ LogicalTypeID::VAR_LIST, LogicalTypeID::STRING, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortFunctionBindFunc, - false /* isVarlength*/)); + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); return result; } @@ -681,7 +675,7 @@ static void getListReverseSortExecFunction( } } -static std::unique_ptr ListReverseSortFunctionBindFunc( +static std::unique_ptr ListReverseSortBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { @@ -757,10 +751,10 @@ function_set ListReverseSortFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, ListReverseSortFunctionBindFunc, false /* isVarlength*/)); + nullptr, ListReverseSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListReverseSortFunctionBindFunc, + LogicalTypeID::VAR_LIST, nullptr, nullptr, ListReverseSortBindFunc, false /* isVarlength*/)); return result; } @@ -781,7 +775,7 @@ function_set ListProductFunction::getFunctionSet() { return result; } -static std::unique_ptr ListDistinctFunctionBindFunc( +static std::unique_ptr ListDistinctBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { @@ -881,11 +875,11 @@ function_set ListDistinctFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, ListDistinctFunctionBindFunc, false /* isVarlength*/)); + nullptr, ListDistinctBindFunc, false /* isVarlength*/)); return result; } -static std::unique_ptr ListUniqueFunctionBindFunc( +static std::unique_ptr ListUniqueBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { @@ -983,13 +977,13 @@ static std::unique_ptr ListUniqueFunctionBindFunc( function_set ListUniqueFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, - ListUniqueFunctionBindFunc, false /* isVarlength*/)); + result.push_back( + std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + LogicalTypeID::INT64, nullptr, nullptr, ListUniqueBindFunc, false /* isVarlength*/)); return result; } -static std::unique_ptr ListAnyValueFunctionBindFunc( +static std::unique_ptr ListAnyValueBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); auto resultType = VarListType::getChildType(&arguments[0]->dataType); @@ -1092,9 +1086,9 @@ static std::unique_ptr ListAnyValueFunctionBindFunc( function_set ListAnyValueFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::ANY, nullptr, nullptr, - ListAnyValueFunctionBindFunc, false /* isVarlength*/)); + result.push_back( + std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + LogicalTypeID::ANY, nullptr, nullptr, ListAnyValueBindFunc, false /* isVarlength*/)); return result; } diff --git a/src/function/vector_map_functions.cpp b/src/function/vector_map_functions.cpp index f1dbf0bceb7..5e60733464d 100644 --- a/src/function/vector_map_functions.cpp +++ b/src/function/vector_map_functions.cpp @@ -11,7 +11,7 @@ using namespace kuzu::common; namespace kuzu { namespace function { -static std::unique_ptr MapCreationFunctionsBindFunc( +static std::unique_ptr MapCreationBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { auto keyType = VarListType::getChildType(&arguments[0]->dataType); auto valueType = VarListType::getChildType(&arguments[1]->dataType); @@ -25,8 +25,7 @@ function_set MapCreationFunctions::getFunctionSet() { function_set functionSet; functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, - LogicalTypeID::MAP, execFunc, nullptr, MapCreationFunctionsBindFunc, - false /* isVarLength */)); + LogicalTypeID::MAP, execFunc, nullptr, MapCreationBindFunc, false /* isVarLength */)); return functionSet; } @@ -38,7 +37,7 @@ static void validateKeyType(const std::shared_ptr& mapExpres } } -static std::unique_ptr MapExtractFunctionsBindFunc( +static std::unique_ptr MapExtractBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* function) { validateKeyType(arguments[0], arguments[1]); auto scalarFunction = ku_dynamic_cast(function); @@ -123,11 +122,11 @@ function_set MapExtractFunctions::getFunctionSet() { function_set functionSet; functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::MAP, LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, - nullptr, nullptr, MapExtractFunctionsBindFunc, false /* isVarLength */)); + nullptr, nullptr, MapExtractBindFunc, false /* isVarLength */)); return functionSet; } -static std::unique_ptr MapKeysFunctionsBindFunc( +static std::unique_ptr MapKeysBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { return std::make_unique(LogicalType::VAR_LIST( std::make_unique(*MapType::getKeyType(&arguments[0]->dataType)))); @@ -137,13 +136,13 @@ function_set MapKeysFunctions::getFunctionSet() { auto execFunc = ScalarFunction::UnaryExecNestedTypeFunction; function_set functionSet; - functionSet.push_back(make_unique(name, - std::vector{LogicalTypeID::MAP}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - MapKeysFunctionsBindFunc, false /* isVarLength */)); + functionSet.push_back( + make_unique(name, std::vector{LogicalTypeID::MAP}, + LogicalTypeID::VAR_LIST, execFunc, nullptr, MapKeysBindFunc, false /* isVarLength */)); return functionSet; } -static std::unique_ptr MapValuesFunctionsBindFunc( +static std::unique_ptr MapValuesBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { return std::make_unique(LogicalType::VAR_LIST( std::make_unique(*MapType::getValueType(&arguments[0]->dataType)))); @@ -155,7 +154,7 @@ function_set MapValuesFunctions::getFunctionSet() { function_set functionSet; functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::MAP}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - MapValuesFunctionsBindFunc, false /* isVarLength */)); + MapValuesBindFunc, false /* isVarLength */)); return functionSet; } diff --git a/src/function/vector_node_rel_functions.cpp b/src/function/vector_node_rel_functions.cpp index 595f195b681..dc223395731 100644 --- a/src/function/vector_node_rel_functions.cpp +++ b/src/function/vector_node_rel_functions.cpp @@ -1,17 +1,26 @@ #include "function/schema/vector_node_rel_functions.h" +#include "common/vector/value_vector.h" #include "function/scalar_function.h" +#include "function/schema/offset_functions.h" +#include "function/unary_function_executor.h" using namespace kuzu::common; namespace kuzu { namespace function { +static void OffsetExecFunc(const std::vector>& params, + ValueVector& result, void* /*dataPtr*/ = nullptr) { + KU_ASSERT(params.size() == 1); + UnaryFunctionExecutor::execute(*params[0], result); +} + function_set OffsetFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(make_unique(OFFSET_FUNC_NAME, - std::vector{LogicalTypeID::INTERNAL_ID}, LogicalTypeID::INT64, - OffsetFunction::execFunction)); + functionSet.push_back( + make_unique(name, std::vector{LogicalTypeID::INTERNAL_ID}, + LogicalTypeID::INT64, OffsetExecFunc)); return functionSet; } diff --git a/src/function/vector_path_functions.cpp b/src/function/vector_path_functions.cpp index cf207759d13..242a4e83aa4 100644 --- a/src/function/vector_path_functions.cpp +++ b/src/function/vector_path_functions.cpp @@ -3,6 +3,7 @@ #include "binder/expression/literal_expression.h" #include "common/exception/binder.h" #include "common/string_format.h" +#include "common/vector/value_vector.h" #include "function/path/path_function_executor.h" #include "function/scalar_function.h" #include "function/struct/vector_struct_functions.h" @@ -12,15 +13,7 @@ using namespace kuzu::common; namespace kuzu { namespace function { -function_set NodesFunction::getFunctionSet() { - function_set functionSet; - functionSet.push_back(make_unique(NODES_FUNC_NAME, - std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::ANY, nullptr, - nullptr, StructExtractFunctions::compileFunc, bindFunc, false /* isVarLength */)); - return functionSet; -} - -std::unique_ptr NodesFunction::bindFunc( +static std::unique_ptr NodesBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { auto structType = arguments[0]->getDataType(); auto fieldIdx = StructType::getFieldIdx(&structType, InternalKeyword::NODES); @@ -28,15 +21,15 @@ std::unique_ptr NodesFunction::bindFunc( StructType::getFieldTypes(&structType)[fieldIdx]->copy(), fieldIdx); } -function_set RelsFunction::getFunctionSet() { +function_set NodesFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(make_unique(RELS_FUNC_NAME, + functionSet.push_back(make_unique(name, std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::ANY, nullptr, - nullptr, StructExtractFunctions::compileFunc, bindFunc, false /* isVarLength */)); + nullptr, StructExtractFunctions::compileFunc, NodesBindFunc, false /* isVarLength */)); return functionSet; } -std::unique_ptr RelsFunction::bindFunc( +static std::unique_ptr RelsBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { auto structType = arguments[0]->getDataType(); auto fieldIdx = StructType::getFieldIdx(&structType, InternalKeyword::RELS); @@ -44,19 +37,19 @@ std::unique_ptr RelsFunction::bindFunc( StructType::getFieldTypes(&structType)[fieldIdx]->copy(), fieldIdx); } -function_set PropertiesFunction::getFunctionSet() { - function_set functions; - functions.push_back(make_unique(PROPERTIES_FUNC_NAME, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::ANY, execFunc, nullptr, compileFunc, bindFunc, false /* isVarLength */)); - return functions; +function_set RelsFunction::getFunctionSet() { + function_set functionSet; + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::ANY, nullptr, + nullptr, StructExtractFunctions::compileFunc, RelsBindFunc, false /* isVarLength */)); + return functionSet; } -std::unique_ptr PropertiesFunction::bindFunc( +static std::unique_ptr PropertiesBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { if (arguments[1]->expressionType != ExpressionType::LITERAL) { throw BinderException(stringFormat( - "Expected literal input as the second argument for {}().", PROPERTIES_FUNC_NAME)); + "Expected literal input as the second argument for {}().", PropertiesFunction::name)); } auto key = ((binder::LiteralExpression&)*arguments[1]).getValue()->getValue(); auto listType = arguments[0]->getDataType(); @@ -77,7 +70,7 @@ std::unique_ptr PropertiesFunction::bindFunc( return std::make_unique(std::move(returnType), fieldIdx); } -void PropertiesFunction::compileFunc(FunctionBindData* bindData, +static void PropertiesCompileFunc(FunctionBindData* bindData, const std::vector>& parameters, std::shared_ptr& result) { KU_ASSERT(parameters[0]->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); @@ -87,7 +80,7 @@ void PropertiesFunction::compileFunc(FunctionBindData* bindData, ListVector::setDataVector(result.get(), fieldVector); } -void PropertiesFunction::execFunc(const std::vector>& parameters, +static void PropertiesExecFunc(const std::vector>& parameters, ValueVector& result, void* /*dataPtr*/) { if (parameters[0]->state->isFlat()) { auto inputPos = parameters[0]->state->selVector->selectedPositions[0]; @@ -115,41 +108,50 @@ void PropertiesFunction::execFunc(const std::vector } } -function_set IsTrailFunction::getFunctionSet() { - function_set functionSet; - functionSet.push_back(make_unique(IS_TRAIL_FUNC_NAME, - std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::BOOL, execFunc, - selectFunc, nullptr, nullptr, false /* isVarLength */)); - return functionSet; +function_set PropertiesFunction::getFunctionSet() { + function_set functions; + functions.push_back(make_unique(name, + std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, + LogicalTypeID::ANY, PropertiesExecFunc, nullptr, PropertiesCompileFunc, PropertiesBindFunc, + false /* isVarLength */)); + return functions; } -void IsTrailFunction::execFunc(const std::vector>& parameters, +static void IsTrailExecFunc(const std::vector>& parameters, ValueVector& result, void* /*dataPtr*/) { UnaryPathExecutor::executeRelIDs(*parameters[0], result); } -bool IsTrailFunction::selectFunc( +static bool IsTrailSelectFunc( const std::vector>& parameters, SelectionVector& selectionVector) { return UnaryPathExecutor::selectRelIDs(*parameters[0], selectionVector); } -function_set IsACyclicFunction::getFunctionSet() { +function_set IsTrailFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(make_unique(IS_ACYCLIC_FUNC_NAME, - std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::BOOL, execFunc, - selectFunc, nullptr, nullptr, false /* isVarLength */)); + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::BOOL, + IsTrailExecFunc, IsTrailSelectFunc, nullptr, nullptr, false /* isVarLength */)); return functionSet; } -void IsACyclicFunction::execFunc(const std::vector>& parameters, +static void IsACyclicExecFunc(const std::vector>& parameters, ValueVector& result, void* /*dataPtr*/) { UnaryPathExecutor::executeNodeIDs(*parameters[0], result); } -bool IsACyclicFunction::selectFunc( +static bool IsACyclicSelectFunc( const std::vector>& parameters, SelectionVector& selectionVector) { return UnaryPathExecutor::selectNodeIDs(*parameters[0], selectionVector); } +function_set IsACyclicFunction::getFunctionSet() { + function_set functionSet; + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::RECURSIVE_REL}, LogicalTypeID::BOOL, + IsACyclicExecFunc, IsACyclicSelectFunc, nullptr, nullptr, false /* isVarLength */)); + return functionSet; +} + } // namespace function } // namespace kuzu diff --git a/src/function/vector_rdf_functions.cpp b/src/function/vector_rdf_functions.cpp index e72a811050e..81446fff0eb 100644 --- a/src/function/vector_rdf_functions.cpp +++ b/src/function/vector_rdf_functions.cpp @@ -10,7 +10,7 @@ namespace function { function_set RDFTypeFunction::getFunctionSet() { function_set result; - result.push_back(make_unique(TYPE_FUNC_NAME, + result.push_back(make_unique(name, std::vector{LogicalTypeID::RDF_VARIANT}, LogicalTypeID::STRING, ScalarFunction::UnaryExecNestedTypeFunction)); return result; @@ -18,7 +18,7 @@ function_set RDFTypeFunction::getFunctionSet() { function_set ValidatePredicateFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(VALIDATE_PREDICATE_FUNC_NAME, + result.push_back(std::make_unique(name, std::vector{LogicalTypeID::STRING}, LogicalTypeID::STRING, ScalarFunction::UnaryStringExecFunction)); return result; diff --git a/src/function/vector_struct_functions.cpp b/src/function/vector_struct_functions.cpp index 6fc3de61b7a..a778df7fb37 100644 --- a/src/function/vector_struct_functions.cpp +++ b/src/function/vector_struct_functions.cpp @@ -11,7 +11,7 @@ using namespace kuzu::common; namespace kuzu { namespace function { -static std::unique_ptr StructPackFunctionsBindFunc( +static std::unique_ptr StructPackBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { std::vector fields; for (auto& argument : arguments) { @@ -73,7 +73,7 @@ function_set StructPackFunctions::getFunctionSet() { function_set functions; functions.push_back(make_unique(name, std::vector{LogicalTypeID::ANY}, LogicalTypeID::STRUCT, execFunc, nullptr, - compileFunc, StructPackFunctionsBindFunc, true /* isVarLength */)); + compileFunc, StructPackBindFunc, true /* isVarLength */)); return functions; } diff --git a/src/function/vector_union_functions.cpp b/src/function/vector_union_functions.cpp index 202bc9aa192..df2e26b6d3b 100644 --- a/src/function/vector_union_functions.cpp +++ b/src/function/vector_union_functions.cpp @@ -9,7 +9,7 @@ using namespace kuzu::common; namespace kuzu { namespace function { -static std::unique_ptr UnionValueFunctionBindFunc( +static std::unique_ptr UnionValueBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { KU_ASSERT(arguments.size() == 1); std::vector fields; @@ -24,13 +24,12 @@ static std::unique_ptr UnionValueFunctionBindFunc( return std::make_unique(std::move(resultType)); } -static void UnionValueFunctionExecFunc( - const std::vector>& /*parameters*/, ValueVector& result, - void* /*dataPtr*/) { +static void UnionValueExecFunc(const std::vector>& /*parameters*/, + ValueVector& result, void* /*dataPtr*/) { UnionVector::setTagField(&result, UnionType::TAG_FIELD_IDX); } -static void UnionValueFunctionCompileFunc(FunctionBindData* /*bindData*/, +static void UnionValueCompileFunc(FunctionBindData* /*bindData*/, const std::vector>& parameters, std::shared_ptr& result) { KU_ASSERT(parameters.size() == 1); @@ -41,10 +40,9 @@ static void UnionValueFunctionCompileFunc(FunctionBindData* /*bindData*/, function_set UnionValueFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back( - make_unique(name, std::vector{LogicalTypeID::ANY}, - LogicalTypeID::UNION, UnionValueFunctionExecFunc, nullptr, - UnionValueFunctionCompileFunc, UnionValueFunctionBindFunc, false /* isVarLength */)); + functionSet.push_back(make_unique(name, + std::vector{LogicalTypeID::ANY}, LogicalTypeID::UNION, UnionValueExecFunc, + nullptr, UnionValueCompileFunc, UnionValueBindFunc, false /* isVarLength */)); return functionSet; } diff --git a/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h b/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h deleted file mode 100644 index ea5eba833c2..00000000000 --- a/src/include/catalog/catalog_entry/scalar_function_catalog_entry.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "function_catalog_entry.h" - -namespace kuzu { -namespace catalog { - -class ScalarFunctionCatalogEntry final : public FunctionCatalogEntry { -public: - //===--------------------------------------------------------------------===// - // constructors - //===--------------------------------------------------------------------===// - ScalarFunctionCatalogEntry() = default; - ScalarFunctionCatalogEntry(const char* name, function::function_set functionSet); - ScalarFunctionCatalogEntry(std::string name, function::function_set functionSet); - - //===--------------------------------------------------------------------===// - // serialization & deserialization - //===--------------------------------------------------------------------===// - std::unique_ptr copy() const override; -}; - -} // namespace catalog -} // namespace kuzu diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index 2ea8b0fe9bc..b9ec8fe4362 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -19,27 +19,6 @@ const char* const MIN_FUNC_NAME = "MIN"; const char* const MAX_FUNC_NAME = "MAX"; const char* const COLLECT_FUNC_NAME = "COLLECT"; -// string -const char* const LENGTH_FUNC_NAME = "LENGTH"; - -// Node/Rel functions. -const char* const ID_FUNC_NAME = "ID"; -const char* const LABEL_FUNC_NAME = "LABEL"; -const char* const OFFSET_FUNC_NAME = "OFFSET"; -const char* const START_NODE_FUNC_NAME = "START_NODE"; -const char* const END_NODE_FUNC_NAME = "END_NODE"; - -// Path functions -const char* const NODES_FUNC_NAME = "NODES"; -const char* const RELS_FUNC_NAME = "RELS"; -const char* const PROPERTIES_FUNC_NAME = "PROPERTIES"; -const char* const IS_TRAIL_FUNC_NAME = "IS_TRAIL"; -const char* const IS_ACYCLIC_FUNC_NAME = "IS_ACYCLIC"; - -// RDF functions -const char* const TYPE_FUNC_NAME = "TYPE"; -const char* const VALIDATE_PREDICATE_FUNC_NAME = "VALIDATE_PREDICATE"; - // Table functions const char* const TABLE_INFO_FUNC_NAME = "TABLE_INFO"; const char* const DB_VERSION_FUNC_NAME = "DB_VERSION"; diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index 4959de43681..e3b419223b4 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -80,12 +80,6 @@ class BuiltInFunctionsUtils { const std::string& name, const std::vector& inputTypes, function::function_set& set); - // Scalar functions. - static void registerScalarFunctions(catalog::CatalogSet* catalogSet); - static void registerNodeRelFunctions(catalog::CatalogSet* catalogSet); - static void registerPathFunctions(catalog::CatalogSet* catalogSet); - static void registerRdfFunctions(catalog::CatalogSet* catalogSet); - // Aggregate functions. static void registerAggregateFunctions(catalog::CatalogSet* catalogSet); static void registerCountStar(catalog::CatalogSet* catalogSet); diff --git a/src/include/function/function_collection.h b/src/include/function/function_collection.h index 2098ad59ecd..21c337bf62f 100644 --- a/src/include/function/function_collection.h +++ b/src/include/function/function_collection.h @@ -1,16 +1,21 @@ #pragma once +#include "catalog/catalog_entry/catalog_entry_type.h" #include "function.h" +using namespace kuzu::catalog; + namespace kuzu { namespace function { using get_function_set_fun = std::function; struct FunctionCollection { + get_function_set_fun getFunctionSetFunc; + const char* name; - get_function_set_fun getFunctionSetFunc; + CatalogEntryType catalogEntryType; static FunctionCollection* getFunctions(); }; diff --git a/src/include/function/path/vector_path_functions.h b/src/include/function/path/vector_path_functions.h index 1de632f85eb..051b493d17e 100644 --- a/src/include/function/path/vector_path_functions.h +++ b/src/include/function/path/vector_path_functions.h @@ -1,21 +1,20 @@ #pragma once -#include "common/vector/value_vector.h" #include "function/function.h" namespace kuzu { namespace function { struct NodesFunction { + static constexpr const char* name = "NODES"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct RelsFunction { + static constexpr const char* name = "RELS"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); }; struct PropertiesBindData : public FunctionBindData { @@ -26,30 +25,25 @@ struct PropertiesBindData : public FunctionBindData { }; struct PropertiesFunction { + static constexpr const char* name = "PROPERTIES"; + static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); - static void compileFunc(FunctionBindData* bindData, - const std::vector>& parameters, - std::shared_ptr& result); - static void execFunc(const std::vector>& parameters, - common::ValueVector& result, void* /*dataPtr*/ = nullptr); }; struct IsTrailFunction { + static constexpr const char* name = "IS_TRAIL"; + static function_set getFunctionSet(); - static void execFunc(const std::vector>& parameters, - common::ValueVector& result, void* /*dataPtr*/ = nullptr); - static bool selectFunc(const std::vector>& parameters, - common::SelectionVector& selectionVector); }; struct IsACyclicFunction { + static constexpr const char* name = "IS_ACYCLIC"; + static function_set getFunctionSet(); - static void execFunc(const std::vector>& parameters, - common::ValueVector& result, void* /*dataPtr*/ = nullptr); - static bool selectFunc(const std::vector>& parameters, - common::SelectionVector& selectionVector); +}; + +struct LengthFunction { + static constexpr const char* name = "LENGTH"; }; } // namespace function diff --git a/src/include/function/rdf/vector_rdf_functions.h b/src/include/function/rdf/vector_rdf_functions.h index c7e10205f0c..016cec9c4c4 100644 --- a/src/include/function/rdf/vector_rdf_functions.h +++ b/src/include/function/rdf/vector_rdf_functions.h @@ -6,10 +6,14 @@ namespace kuzu { namespace function { struct RDFTypeFunction { + static constexpr const char* name = "TYPE"; + static function_set getFunctionSet(); }; struct ValidatePredicateFunction { + static constexpr const char* name = "VALIDATE_PREDICATE"; + static function_set getFunctionSet(); }; diff --git a/src/include/function/schema/vector_label_functions.h b/src/include/function/schema/vector_label_functions.h index 27742d23d27..5152ab1d615 100644 --- a/src/include/function/schema/vector_label_functions.h +++ b/src/include/function/schema/vector_label_functions.h @@ -7,6 +7,8 @@ namespace kuzu { namespace function { struct LabelFunction { + static constexpr const char* name = "LABEL"; + static void execFunction(const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(params.size() == 2); diff --git a/src/include/function/schema/vector_node_rel_functions.h b/src/include/function/schema/vector_node_rel_functions.h index ad009e995fb..454ff89843d 100644 --- a/src/include/function/schema/vector_node_rel_functions.h +++ b/src/include/function/schema/vector_node_rel_functions.h @@ -1,25 +1,29 @@ #pragma once -#include "common/vector/value_vector.h" #include "function/function.h" -#include "function/unary_function_executor.h" -#include "offset_functions.h" namespace kuzu { namespace function { struct OffsetFunction { + static constexpr const char* name = "OFFSET"; + static function_set getFunctionSet(); - static void execFunction(const std::vector>& params, - common::ValueVector& result, void* /*dataPtr*/ = nullptr) { - KU_ASSERT(params.size() == 1); - UnaryFunctionExecutor::execute(*params[0], result); - } }; struct IDFunction { + static constexpr const char* name = "ID"; + static function_set getFunctionSet(); }; +struct StartNodeFunction { + static constexpr const char* name = "START_NODE"; +}; + +struct EndNodeFunction { + static constexpr const char* name = "END_NODE"; +}; + } // namespace function } // namespace kuzu From 9ea80ecd70394166be58ee81c7bdefe85baea2b8 Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Wed, 27 Mar 2024 01:49:46 -0400 Subject: [PATCH 097/136] Refactor aggregate functions (#3136) --- .../bind_subquery_expression.cpp | 7 +- src/catalog/catalog_entry/CMakeLists.txt | 1 - .../aggregate_function_catalog_entry.cpp | 19 ---- src/function/aggregate/CMakeLists.txt | 4 +- src/function/aggregate/collect.cpp | 99 +++++++++++++++++++ src/function/aggregate/count.cpp | 11 +++ src/function/aggregate/count_star.cpp | 33 +++++++ src/function/aggregate_function.cpp | 45 ++++++++- src/function/built_in_function_utils.cpp | 96 ------------------ src/function/function_collection.cpp | 11 +++ .../aggregate_function_catalog_entry.h | 24 ----- src/include/common/enums/expression_type.h | 8 -- src/include/function/aggregate/collect.h | 75 +++----------- src/include/function/aggregate/count.h | 3 + src/include/function/aggregate/count_star.h | 17 +--- src/include/function/aggregate_function.h | 24 +++++ .../function/built_in_function_utils.h | 10 -- src/parser/transform/transform_expression.cpp | 3 +- 18 files changed, 249 insertions(+), 241 deletions(-) delete mode 100644 src/catalog/catalog_entry/aggregate_function_catalog_entry.cpp create mode 100644 src/function/aggregate/collect.cpp create mode 100644 src/function/aggregate/count_star.cpp delete mode 100644 src/include/catalog/catalog_entry/aggregate_function_catalog_entry.h diff --git a/src/binder/bind_expression/bind_subquery_expression.cpp b/src/binder/bind_expression/bind_subquery_expression.cpp index f564a93d5bd..a9a5db1aa20 100644 --- a/src/binder/bind_expression/bind_subquery_expression.cpp +++ b/src/binder/bind_expression/bind_subquery_expression.cpp @@ -3,6 +3,7 @@ #include "binder/expression/subquery_expression.h" #include "binder/expression_binder.h" #include "common/types/value/value.h" +#include "function/aggregate/count_star.h" #include "parser/expression/parsed_subquery_expression.h" using namespace kuzu::parser; @@ -33,12 +34,12 @@ std::shared_ptr ExpressionBinder::bindSubqueryExpression( // Bind projection auto functions = context->getCatalog()->getFunctions(context->getTx()); auto function = BuiltInFunctionsUtils::matchAggregateFunction( - COUNT_STAR_FUNC_NAME, std::vector{}, false, functions); + CountStarFunction::name, std::vector{}, false, functions); auto bindData = std::make_unique(std::make_unique(function->returnTypeID)); - auto countStarExpr = std::make_shared(COUNT_STAR_FUNC_NAME, + auto countStarExpr = std::make_shared(CountStarFunction::name, std::move(bindData), expression_vector{}, function->clone(), - binder->getUniqueExpressionName(COUNT_STAR_FUNC_NAME)); + binder->getUniqueExpressionName(CountStarFunction::name)); boundSubqueryExpr->setCountStarExpr(countStarExpr); std::shared_ptr projectionExpr; switch (subqueryType) { diff --git a/src/catalog/catalog_entry/CMakeLists.txt b/src/catalog/catalog_entry/CMakeLists.txt index 2b577e3070e..752366cbfbd 100644 --- a/src/catalog/catalog_entry/CMakeLists.txt +++ b/src/catalog/catalog_entry/CMakeLists.txt @@ -1,6 +1,5 @@ add_library(kuzu_catalog_entry OBJECT - aggregate_function_catalog_entry.cpp catalog_entry.cpp function_catalog_entry.cpp table_catalog_entry.cpp diff --git a/src/catalog/catalog_entry/aggregate_function_catalog_entry.cpp b/src/catalog/catalog_entry/aggregate_function_catalog_entry.cpp deleted file mode 100644 index 157e9d2e03e..00000000000 --- a/src/catalog/catalog_entry/aggregate_function_catalog_entry.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "catalog/catalog_entry/aggregate_function_catalog_entry.h" - -#include "common/utils.h" - -namespace kuzu { -namespace catalog { - -AggregateFunctionCatalogEntry::AggregateFunctionCatalogEntry( - std::string name, function::function_set functionSet) - : FunctionCatalogEntry{ - CatalogEntryType::AGGREGATE_FUNCTION_ENTRY, std::move(name), std::move(functionSet)} {} - -std::unique_ptr AggregateFunctionCatalogEntry::copy() const { - return std::make_unique( - getName(), common::copyVector(functionSet)); -} - -} // namespace catalog -} // namespace kuzu diff --git a/src/function/aggregate/CMakeLists.txt b/src/function/aggregate/CMakeLists.txt index 23afd10af8e..5345162fe71 100644 --- a/src/function/aggregate/CMakeLists.txt +++ b/src/function/aggregate/CMakeLists.txt @@ -1,6 +1,8 @@ add_library(kuzu_function_aggregate OBJECT - count.cpp) + count.cpp + count_star.cpp + collect.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/function/aggregate/collect.cpp b/src/function/aggregate/collect.cpp new file mode 100644 index 00000000000..d08295d0b26 --- /dev/null +++ b/src/function/aggregate/collect.cpp @@ -0,0 +1,99 @@ +#include "function/aggregate/collect.h" + +#include "storage/storage_utils.h" + +using namespace kuzu::binder; +using namespace kuzu::common; +using namespace kuzu::storage; +using namespace kuzu::processor; + +namespace kuzu { +namespace function { + +std::unique_ptr CollectFunction::initialize() { + return std::make_unique(); +} + +void CollectFunction::updateAll( + uint8_t* state_, ValueVector* input, uint64_t multiplicity, MemoryManager* memoryManager) { + KU_ASSERT(!input->state->isFlat()); + auto state = reinterpret_cast(state_); + if (input->hasNoNullsGuarantee()) { + for (auto i = 0u; i < input->state->selVector->selectedSize; ++i) { + auto pos = input->state->selVector->selectedPositions[i]; + updateSingleValue(state, input, pos, multiplicity, memoryManager); + } + } else { + for (auto i = 0u; i < input->state->selVector->selectedSize; ++i) { + auto pos = input->state->selVector->selectedPositions[i]; + if (!input->isNull(pos)) { + updateSingleValue(state, input, pos, multiplicity, memoryManager); + } + } + } +} + +void CollectFunction::updatePos(uint8_t* state_, ValueVector* input, uint64_t multiplicity, + uint32_t pos, MemoryManager* memoryManager) { + auto state = reinterpret_cast(state_); + updateSingleValue(state, input, pos, multiplicity, memoryManager); +} + +void CollectFunction::initCollectStateIfNecessary( + CollectState* state, MemoryManager* memoryManager, LogicalType& dataType) { + if (state->factorizedTable == nullptr) { + auto tableSchema = std::make_unique(); + tableSchema->appendColumn(std::make_unique( + false /* isUnflat */, 0 /* dataChunkPos */, StorageUtils::getDataTypeSize(dataType))); + state->factorizedTable = + std::make_unique(memoryManager, std::move(tableSchema)); + } +} + +void CollectFunction::updateSingleValue(CollectState* state, ValueVector* input, uint32_t pos, + uint64_t multiplicity, MemoryManager* memoryManager) { + initCollectStateIfNecessary(state, memoryManager, input->dataType); + for (auto i = 0u; i < multiplicity; ++i) { + auto tuple = state->factorizedTable->appendEmptyTuple(); + state->isNull = false; + input->copyToRowData(pos, tuple, state->factorizedTable->getInMemOverflowBuffer()); + } +} + +void CollectFunction::combine( + uint8_t* state_, uint8_t* otherState_, MemoryManager* /*memoryManager*/) { + auto otherState = reinterpret_cast(otherState_); + if (otherState->isNull) { + return; + } + auto state = reinterpret_cast(state_); + if (state->isNull) { + state->factorizedTable = std::move(otherState->factorizedTable); + state->isNull = false; + } else { + state->factorizedTable->merge(*otherState->factorizedTable); + } + otherState->factorizedTable.reset(); +} + +std::unique_ptr CollectFunction::bindFunc( + const expression_vector& arguments, Function* definition) { + KU_ASSERT(arguments.size() == 1); + auto aggFuncDefinition = reinterpret_cast(definition); + aggFuncDefinition->parameterTypeIDs[0] = arguments[0]->dataType.getLogicalTypeID(); + auto returnType = LogicalType::VAR_LIST(std::make_unique(arguments[0]->dataType)); + return std::make_unique(std::move(returnType)); +} + +function_set CollectFunction::getFunctionSet() { + function_set result; + for (auto isDistinct : std::vector{true, false}) { + result.push_back(std::make_unique(name, + std::vector{LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, initialize, + updateAll, updatePos, combine, finalize, isDistinct, bindFunc)); + } + return result; +} + +} // namespace function +} // namespace kuzu diff --git a/src/function/aggregate/count.cpp b/src/function/aggregate/count.cpp index 5658b7e3589..c0bd5d2c164 100644 --- a/src/function/aggregate/count.cpp +++ b/src/function/aggregate/count.cpp @@ -39,5 +39,16 @@ void CountFunction::paramRewriteFunc(binder::expression_vector& arguments) { } } +function_set CountFunction::getFunctionSet() { + function_set result; + for (auto& type : LogicalTypeUtils::getAllValidLogicTypes()) { + for (auto isDistinct : std::vector{true, false}) { + result.push_back(AggregateFunctionUtil::getAggFunc( + name, type, LogicalTypeID::INT64, isDistinct, paramRewriteFunc)); + } + } + return result; +} + } // namespace function } // namespace kuzu diff --git a/src/function/aggregate/count_star.cpp b/src/function/aggregate/count_star.cpp new file mode 100644 index 00000000000..bafeba7cc74 --- /dev/null +++ b/src/function/aggregate/count_star.cpp @@ -0,0 +1,33 @@ +#include "function/aggregate/count_star.h" + +using namespace kuzu::common; +using namespace kuzu::storage; + +namespace kuzu { +namespace function { + +void CountStarFunction::updateAll( + uint8_t* state_, ValueVector* input, uint64_t multiplicity, MemoryManager* /*memoryManager*/) { + auto state = reinterpret_cast(state_); + KU_ASSERT(input == nullptr); + (void)input; + state->count += multiplicity; +} + +void CountStarFunction::updatePos(uint8_t* state_, ValueVector* input, uint64_t multiplicity, + uint32_t /*pos*/, MemoryManager* /*memoryManager*/) { + auto state = reinterpret_cast(state_); + KU_ASSERT(input == nullptr); + (void)input; + state->count += multiplicity; +} + +function_set CountStarFunction::getFunctionSet() { + function_set result; + result.push_back(std::make_unique(name, std::vector{}, + LogicalTypeID::INT64, initialize, updateAll, updatePos, combine, finalize, false)); + return result; +} + +} // namespace function +} // namespace kuzu diff --git a/src/function/aggregate_function.cpp b/src/function/aggregate_function.cpp index 850a9ae0392..ac44742b25c 100644 --- a/src/function/aggregate_function.cpp +++ b/src/function/aggregate_function.cpp @@ -82,13 +82,13 @@ std::unique_ptr AggregateFunctionUtil::getAvgFunc(std::string std::unique_ptr AggregateFunctionUtil::getMinFunc( LogicalTypeID inputType, bool isDistinct) { return AggregateFunctionUtil::getMinMaxFunction( - MIN_FUNC_NAME, inputType, inputType, isDistinct); + AggregateMinFunction::name, inputType, inputType, isDistinct); } std::unique_ptr AggregateFunctionUtil::getMaxFunc( LogicalTypeID inputType, bool isDistinct) { return AggregateFunctionUtil::getMinMaxFunction( - MAX_FUNC_NAME, inputType, inputType, isDistinct); + AggregateMaxFunction::name, inputType, inputType, isDistinct); } template @@ -185,5 +185,46 @@ std::unique_ptr AggregateFunctionUtil::getMinMaxFunction(std: } } +function_set AggregateSumFunction::getFunctionSet() { + function_set result; + for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { + for (auto isDistinct : std::vector{true, false}) { + result.push_back(AggregateFunctionUtil::getSumFunc(name, typeID, typeID, isDistinct)); + } + } + return result; +} + +function_set AggregateAvgFunction::getFunctionSet() { + function_set result; + for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { + for (auto isDistinct : std::vector{true, false}) { + result.push_back( + AggregateFunctionUtil::getAvgFunc(name, typeID, LogicalTypeID::DOUBLE, isDistinct)); + } + } + return result; +} + +function_set AggregateMinFunction::getFunctionSet() { + function_set result; + for (auto& type : LogicalTypeUtils::getAllValidComparableLogicalTypes()) { + for (auto isDistinct : std::vector{true, false}) { + result.push_back(AggregateFunctionUtil::getMinFunc(type, isDistinct)); + } + } + return result; +} + +function_set AggregateMaxFunction::getFunctionSet() { + function_set result; + for (auto& type : LogicalTypeUtils::getAllValidComparableLogicalTypes()) { + for (auto isDistinct : std::vector{true, false}) { + result.push_back(AggregateFunctionUtil::getMaxFunc(type, isDistinct)); + } + } + return result; +} + } // namespace function } // namespace kuzu diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index 5d4fcf78683..b2db1038a94 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -1,13 +1,9 @@ #include "function/built_in_function_utils.h" -#include "catalog/catalog_entry/aggregate_function_catalog_entry.h" #include "catalog/catalog_entry/table_function_catalog_entry.h" #include "catalog/catalog_set.h" #include "common/exception/binder.h" #include "common/exception/catalog.h" -#include "function/aggregate/collect.h" -#include "function/aggregate/count.h" -#include "function/aggregate/count_star.h" #include "function/aggregate_function.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/function_collection.h" @@ -35,22 +31,11 @@ static void validateNonEmptyCandidateFunctions(std::vector& candidate function::function_set& set); void BuiltInFunctionsUtils::createFunctions(CatalogSet* catalogSet) { - registerAggregateFunctions(catalogSet); registerTableFunctions(catalogSet); registerFunctions(catalogSet); } -void BuiltInFunctionsUtils::registerAggregateFunctions(CatalogSet* catalogSet) { - registerCountStar(catalogSet); - registerCount(catalogSet); - registerSum(catalogSet); - registerAvg(catalogSet); - registerMin(catalogSet); - registerMax(catalogSet); - registerCollect(catalogSet); -} - Function* BuiltInFunctionsUtils::matchFunction(const std::string& name, CatalogSet* catalogSet) { return matchFunction(name, std::vector{}, catalogSet); } @@ -504,87 +489,6 @@ void BuiltInFunctionsUtils::validateSpecialCases(std::vector& candida } } -void BuiltInFunctionsUtils::registerCountStar(CatalogSet* catalogSet) { - function_set functionSet; - functionSet.push_back(std::make_unique(COUNT_STAR_FUNC_NAME, - std::vector{}, LogicalTypeID::INT64, CountStarFunction::initialize, - CountStarFunction::updateAll, CountStarFunction::updatePos, CountStarFunction::combine, - CountStarFunction::finalize, false)); - catalogSet->createEntry(std::make_unique( - COUNT_STAR_FUNC_NAME, std::move(functionSet))); -} - -void BuiltInFunctionsUtils::registerCount(CatalogSet* catalogSet) { - function_set functionSet; - for (auto& type : LogicalTypeUtils::getAllValidLogicTypes()) { - for (auto isDistinct : std::vector{true, false}) { - functionSet.push_back(AggregateFunctionUtil::getAggFunc(COUNT_FUNC_NAME, - type, LogicalTypeID::INT64, isDistinct, CountFunction::paramRewriteFunc)); - } - } - catalogSet->createEntry( - std::make_unique(COUNT_FUNC_NAME, std::move(functionSet))); -} - -void BuiltInFunctionsUtils::registerSum(CatalogSet* catalogSet) { - function_set functionSet; - for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - for (auto isDistinct : std::vector{true, false}) { - functionSet.push_back( - AggregateFunctionUtil::getSumFunc(SUM_FUNC_NAME, typeID, typeID, isDistinct)); - } - } - catalogSet->createEntry( - std::make_unique(SUM_FUNC_NAME, std::move(functionSet))); -} - -void BuiltInFunctionsUtils::registerAvg(CatalogSet* catalogSet) { - function_set functionSet; - for (auto typeID : LogicalTypeUtils::getNumericalLogicalTypeIDs()) { - for (auto isDistinct : std::vector{true, false}) { - functionSet.push_back(AggregateFunctionUtil::getAvgFunc( - AVG_FUNC_NAME, typeID, LogicalTypeID::DOUBLE, isDistinct)); - } - } - catalogSet->createEntry( - std::make_unique(AVG_FUNC_NAME, std::move(functionSet))); -} - -void BuiltInFunctionsUtils::registerMin(CatalogSet* catalogSet) { - function_set functionSet; - for (auto& type : LogicalTypeUtils::getAllValidComparableLogicalTypes()) { - for (auto isDistinct : std::vector{true, false}) { - functionSet.push_back(AggregateFunctionUtil::getMinFunc(type, isDistinct)); - } - } - catalogSet->createEntry( - std::make_unique(MIN_FUNC_NAME, std::move(functionSet))); -} - -void BuiltInFunctionsUtils::registerMax(CatalogSet* catalogSet) { - function_set functionSet; - for (auto& type : LogicalTypeUtils::getAllValidComparableLogicalTypes()) { - for (auto isDistinct : std::vector{true, false}) { - functionSet.push_back(AggregateFunctionUtil::getMaxFunc(type, isDistinct)); - } - } - catalogSet->createEntry( - std::make_unique(MAX_FUNC_NAME, std::move(functionSet))); -} - -void BuiltInFunctionsUtils::registerCollect(CatalogSet* catalogSet) { - function_set functionSet; - for (auto isDistinct : std::vector{true, false}) { - functionSet.push_back(std::make_unique(COLLECT_FUNC_NAME, - std::vector{common::LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, - CollectFunction::initialize, CollectFunction::updateAll, CollectFunction::updatePos, - CollectFunction::combine, CollectFunction::finalize, isDistinct, - CollectFunction::bindFunc)); - } - catalogSet->createEntry( - std::make_unique(COLLECT_FUNC_NAME, std::move(functionSet))); -} - void BuiltInFunctionsUtils::registerTableFunctions(CatalogSet* catalogSet) { catalogSet->createEntry(std::make_unique( CURRENT_SETTING_FUNC_NAME, CurrentSettingFunction::getFunctionSet())); diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index f08fb74dddc..9ed8ba2c689 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -1,5 +1,8 @@ #include "function/function_collection.h" +#include "function/aggregate/collect.h" +#include "function/aggregate/count.h" +#include "function/aggregate/count_star.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/array/vector_array_functions.h" #include "function/blob/vector_blob_functions.h" @@ -27,6 +30,8 @@ namespace function { { _PARAM::getFunctionSet, _PARAM::alias, CatalogEntryType::SCALAR_FUNCTION_ENTRY } #define REWRITE_FUNCTION(_PARAM) \ { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::REWRITE_FUNCTION_ENTRY } +#define AGGREGATE_FUNCTION(_PARAM) \ + { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::AGGREGATE_FUNCTION_ENTRY } #define FINAL_FUNCTION \ { nullptr, nullptr, CatalogEntryType::SCALAR_FUNCTION_ENTRY } @@ -161,6 +166,12 @@ FunctionCollection* FunctionCollection::getFunctions() { // Rdf functions SCALAR_FUNCTION(RDFTypeFunction), SCALAR_FUNCTION(ValidatePredicateFunction), + // Aggregate functions + AGGREGATE_FUNCTION(CountStarFunction), AGGREGATE_FUNCTION(CountFunction), + AGGREGATE_FUNCTION(AggregateSumFunction), AGGREGATE_FUNCTION(AggregateAvgFunction), + AGGREGATE_FUNCTION(AggregateMinFunction), AGGREGATE_FUNCTION(AggregateMaxFunction), + AGGREGATE_FUNCTION(CollectFunction), + // End of array FINAL_FUNCTION}; diff --git a/src/include/catalog/catalog_entry/aggregate_function_catalog_entry.h b/src/include/catalog/catalog_entry/aggregate_function_catalog_entry.h deleted file mode 100644 index 16a29abb67f..00000000000 --- a/src/include/catalog/catalog_entry/aggregate_function_catalog_entry.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "catalog_entry.h" -#include "function_catalog_entry.h" - -namespace kuzu { -namespace catalog { - -class AggregateFunctionCatalogEntry : public FunctionCatalogEntry { -public: - //===--------------------------------------------------------------------===// - // constructors - //===--------------------------------------------------------------------===// - AggregateFunctionCatalogEntry() = default; - AggregateFunctionCatalogEntry(std::string name, function::function_set functionSet); - - //===--------------------------------------------------------------------===// - // serialization & deserialization - //===--------------------------------------------------------------------===// - std::unique_ptr copy() const override; -}; - -} // namespace catalog -} // namespace kuzu diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index b9ec8fe4362..115df910e3e 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -10,14 +10,6 @@ namespace common { * Function name is a temporary identifier used for binder because grammar does not parse built in * functions. After binding, expression type should replace function name and used as identifier. */ -// aggregate -const char* const COUNT_STAR_FUNC_NAME = "COUNT_STAR"; -const char* const COUNT_FUNC_NAME = "COUNT"; -const char* const SUM_FUNC_NAME = "SUM"; -const char* const AVG_FUNC_NAME = "AVG"; -const char* const MIN_FUNC_NAME = "MIN"; -const char* const MAX_FUNC_NAME = "MAX"; -const char* const COLLECT_FUNC_NAME = "COLLECT"; // Table functions const char* const TABLE_INFO_FUNC_NAME = "TABLE_INFO"; diff --git a/src/include/function/aggregate/collect.h b/src/include/function/aggregate/collect.h index 1474c0968cd..42f026c4a28 100644 --- a/src/include/function/aggregate/collect.h +++ b/src/include/function/aggregate/collect.h @@ -2,12 +2,12 @@ #include "function/aggregate_function.h" #include "processor/result/factorized_table.h" -#include "storage/storage_utils.h" namespace kuzu { namespace function { struct CollectFunction { + static constexpr const char* name = "COLLECT"; struct CollectState : public AggregateState { CollectState() : factorizedTable{nullptr} {} @@ -30,82 +30,29 @@ struct CollectFunction { std::unique_ptr factorizedTable; }; - static std::unique_ptr initialize() { return std::make_unique(); } + static std::unique_ptr initialize(); static void updateAll(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, - storage::MemoryManager* memoryManager) { - KU_ASSERT(!input->state->isFlat()); - auto state = reinterpret_cast(state_); - if (input->hasNoNullsGuarantee()) { - for (auto i = 0u; i < input->state->selVector->selectedSize; ++i) { - auto pos = input->state->selVector->selectedPositions[i]; - updateSingleValue(state, input, pos, multiplicity, memoryManager); - } - } else { - for (auto i = 0u; i < input->state->selVector->selectedSize; ++i) { - auto pos = input->state->selVector->selectedPositions[i]; - if (!input->isNull(pos)) { - updateSingleValue(state, input, pos, multiplicity, memoryManager); - } - } - } - } + storage::MemoryManager* memoryManager); - static inline void updatePos(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, - uint32_t pos, storage::MemoryManager* memoryManager) { - auto state = reinterpret_cast(state_); - updateSingleValue(state, input, pos, multiplicity, memoryManager); - } + static void updatePos(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, + uint32_t pos, storage::MemoryManager* memoryManager); static void initCollectStateIfNecessary( - CollectState* state, storage::MemoryManager* memoryManager, common::LogicalType& dataType) { - if (state->factorizedTable == nullptr) { - auto tableSchema = std::make_unique(); - tableSchema->appendColumn( - std::make_unique(false /* isUnflat */, - 0 /* dataChunkPos */, storage::StorageUtils::getDataTypeSize(dataType))); - state->factorizedTable = - std::make_unique(memoryManager, std::move(tableSchema)); - } - } + CollectState* state, storage::MemoryManager* memoryManager, common::LogicalType& dataType); static void updateSingleValue(CollectState* state, common::ValueVector* input, uint32_t pos, - uint64_t multiplicity, storage::MemoryManager* memoryManager) { - initCollectStateIfNecessary(state, memoryManager, input->dataType); - for (auto i = 0u; i < multiplicity; ++i) { - auto tuple = state->factorizedTable->appendEmptyTuple(); - state->isNull = false; - input->copyToRowData(pos, tuple, state->factorizedTable->getInMemOverflowBuffer()); - } - } + uint64_t multiplicity, storage::MemoryManager* memoryManager); static void combine( - uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* /*memoryManager*/) { - auto otherState = reinterpret_cast(otherState_); - if (otherState->isNull) { - return; - } - auto state = reinterpret_cast(state_); - if (state->isNull) { - state->factorizedTable = std::move(otherState->factorizedTable); - state->isNull = false; - } else { - state->factorizedTable->merge(*otherState->factorizedTable); - } - otherState->factorizedTable.reset(); - } + uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* /*memoryManager*/); static void finalize(uint8_t* /*state_*/) {} static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* definition) { - KU_ASSERT(arguments.size() == 1); - auto aggFuncDefinition = reinterpret_cast(definition); - aggFuncDefinition->parameterTypeIDs[0] = arguments[0]->dataType.getLogicalTypeID(); - auto returnType = common::LogicalType::VAR_LIST( - std::make_unique(arguments[0]->dataType)); - return std::make_unique(std::move(returnType)); - } + const binder::expression_vector& arguments, Function* definition); + + static function_set getFunctionSet(); }; } // namespace function diff --git a/src/include/function/aggregate/count.h b/src/include/function/aggregate/count.h index 30d7c8d9ad8..e8aaf9839e1 100644 --- a/src/include/function/aggregate/count.h +++ b/src/include/function/aggregate/count.h @@ -6,6 +6,7 @@ namespace kuzu { namespace function { struct CountFunction : public BaseCountFunction { + static constexpr const char* name = "COUNT"; static void updateAll(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, storage::MemoryManager* memoryManager); @@ -17,6 +18,8 @@ struct CountFunction : public BaseCountFunction { } static void paramRewriteFunc(binder::expression_vector& arguments); + + static function_set getFunctionSet(); }; } // namespace function diff --git a/src/include/function/aggregate/count_star.h b/src/include/function/aggregate/count_star.h index 4612b26bb61..b45959dff79 100644 --- a/src/include/function/aggregate/count_star.h +++ b/src/include/function/aggregate/count_star.h @@ -6,22 +6,15 @@ namespace kuzu { namespace function { struct CountStarFunction : public BaseCountFunction { + static constexpr const char* name = "COUNT_STAR"; static void updateAll(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, - storage::MemoryManager* /*memoryManager*/) { - auto state = reinterpret_cast(state_); - KU_ASSERT(input == nullptr); - (void)input; - state->count += multiplicity; - } + storage::MemoryManager* /*memoryManager*/); static void updatePos(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, - uint32_t /*pos*/, storage::MemoryManager* /*memoryManager*/) { - auto state = reinterpret_cast(state_); - KU_ASSERT(input == nullptr); - (void)input; - state->count += multiplicity; - } + uint32_t /*pos*/, storage::MemoryManager* /*memoryManager*/); + + static function_set getFunctionSet(); }; } // namespace function diff --git a/src/include/function/aggregate_function.h b/src/include/function/aggregate_function.h index ebd939f9815..57f29142273 100644 --- a/src/include/function/aggregate_function.h +++ b/src/include/function/aggregate_function.h @@ -131,5 +131,29 @@ class AggregateFunctionUtil { common::LogicalTypeID inputType, common::LogicalTypeID resultType, bool isDistinct); }; +struct AggregateSumFunction { + static constexpr const char* name = "SUM"; + + static function_set getFunctionSet(); +}; + +struct AggregateAvgFunction { + static constexpr const char* name = "AVG"; + + static function_set getFunctionSet(); +}; + +struct AggregateMinFunction { + static constexpr const char* name = "MIN"; + + static function_set getFunctionSet(); +}; + +struct AggregateMaxFunction { + static constexpr const char* name = "MAX"; + + static function_set getFunctionSet(); +}; + } // namespace function } // namespace kuzu diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index e3b419223b4..3f0c75dcbb2 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -80,16 +80,6 @@ class BuiltInFunctionsUtils { const std::string& name, const std::vector& inputTypes, function::function_set& set); - // Aggregate functions. - static void registerAggregateFunctions(catalog::CatalogSet* catalogSet); - static void registerCountStar(catalog::CatalogSet* catalogSet); - static void registerCount(catalog::CatalogSet* catalogSet); - static void registerSum(catalog::CatalogSet* catalogSet); - static void registerAvg(catalog::CatalogSet* catalogSet); - static void registerMin(catalog::CatalogSet* catalogSet); - static void registerMax(catalog::CatalogSet* catalogSet); - static void registerCollect(catalog::CatalogSet* catalogSet); - // Table functions. static void registerTableFunctions(catalog::CatalogSet* catalogSet); diff --git a/src/parser/transform/transform_expression.cpp b/src/parser/transform/transform_expression.cpp index 929814e462f..d11f276c3c1 100644 --- a/src/parser/transform/transform_expression.cpp +++ b/src/parser/transform/transform_expression.cpp @@ -1,3 +1,4 @@ +#include "function/aggregate/count_star.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/cast/functions/cast_from_string_functions.h" #include "function/list/vector_list_functions.h" @@ -470,7 +471,7 @@ std::unique_ptr Transformer::transformParenthesizedExpression( std::unique_ptr Transformer::transformFunctionInvocation( CypherParser::OC_FunctionInvocationContext& ctx) { if (ctx.STAR()) { - return std::make_unique(COUNT_STAR_FUNC_NAME, ctx.getText()); + return std::make_unique(CountStarFunction::name, ctx.getText()); } std::string functionName; if (ctx.COUNT()) { From 73ed1ea479e6df3a4899c9633d9dbfdf884a7853 Mon Sep 17 00:00:00 2001 From: Maxwell <49460053+mxwli@users.noreply.github.com> Date: Wed, 27 Mar 2024 13:49:07 -0400 Subject: [PATCH 098/136] Pandas Pyarrow Backend Bugfix and Tests (#3152) * add more test coverage & fixes to pyarrow * formatting fixes * clang-tidy * clang fix * add missing GIL acquire --- src/common/arrow/arrow_array_scan.cpp | 12 ++- src/common/arrow/arrow_null_mask_tree.cpp | 13 +-- src/common/vector/auxiliary_buffer.cpp | 2 +- .../src_cpp/include/pyarrow/pyarrow_scan.h | 11 +-- .../python_api/src_cpp/pandas/pandas_scan.cpp | 1 + .../src_cpp/pyarrow/pyarrow_scan.cpp | 6 +- tools/python_api/test/test_df_pyarrow.py | 87 ++++++++++++++++++- 7 files changed, 108 insertions(+), 24 deletions(-) diff --git a/src/common/arrow/arrow_array_scan.cpp b/src/common/arrow/arrow_array_scan.cpp index 693c38ef28e..475e7ab5b03 100644 --- a/src/common/arrow/arrow_array_scan.cpp +++ b/src/common/arrow/arrow_array_scan.cpp @@ -160,16 +160,20 @@ static void scanArrowArrayVarList(const ArrowSchema* schema, const ArrowArray* a uint64_t count) { auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; mask->copyToValueVector(&outputVector, dstOffset, count); - ValueVector* auxiliaryBuffer = ListVector::getDataVector(&outputVector); + uint64_t auxDstPosition = 0; for (uint64_t i = 0; i < count; i++) { auto curOffset = offsets[i], nextOffset = offsets[i + 1]; if (!mask->isNull(i)) { auto newEntry = ListVector::addList(&outputVector, nextOffset - curOffset); outputVector.setValue(i + dstOffset, newEntry); + if (i == 0) { + auxDstPosition = newEntry.offset; + } } } + ValueVector* auxiliaryBuffer = ListVector::getDataVector(&outputVector); ArrowConverter::fromArrowArray(schema->children[0], array->children[0], *auxiliaryBuffer, - mask->getChild(0), offsets[0], 0u, offsets[count] - offsets[0]); + mask->getChild(0), offsets[0], auxDstPosition, offsets[count] - offsets[0]); } template @@ -259,8 +263,8 @@ static void scanArrowArraySparseUnion(const ArrowSchema* schema, const ArrowArra // eg. nulling out unselected children for (int8_t i = 0; i < array->n_children; i++) { ArrowConverter::fromArrowArray(schema->children[i], array->children[i], - *UnionVector::getValVector(&outputVector, i), mask->getChild(i), srcOffset, dstOffset, - count); + *StructVector::getFieldVector(&outputVector, i), mask->getChild(i), srcOffset, + dstOffset, count); } } diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp index c8b3033602a..ab10be19ae4 100644 --- a/src/common/arrow/arrow_null_mask_tree.cpp +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -53,7 +53,8 @@ void ArrowNullMaskTree::scanListPushDown( NullMask pushDownMask((auxiliaryLength + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); for (uint64_t i = 0; i < count; i++) { - pushDownMask.setNullFromRange(offsets[i], offsets[i + 1] - offsets[i], isNull(i)); + pushDownMask.setNullFromRange( + offsets[i] - offsets[0], offsets[i + 1] - offsets[i], isNull(i)); } children->push_back(ArrowNullMaskTree( schema->children[0], array->children[0], offsets[0], auxiliaryLength, &pushDownMask)); @@ -155,9 +156,9 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], lowestOffsets[i], highestOffsets[i] - lowestOffsets[i])); } - for (auto i = srcOffset; i < srcOffset + count; i++) { - int32_t curOffset = offsets[i]; - int8_t curType = types[i]; + for (auto i = 0u; i < count; i++) { + int32_t curOffset = offsets[i + srcOffset]; + int8_t curType = types[i + srcOffset]; mask->setNull(i, children->operator[](curType).isNull(curOffset)); } } else { @@ -165,8 +166,8 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray children->push_back(ArrowNullMaskTree( schema->children[i], array->children[i], srcOffset, count)); } - for (auto i = srcOffset; i < srcOffset + count; i++) { - int8_t curType = types[i]; + for (auto i = 0u; i < count; i++) { + int8_t curType = types[i + srcOffset]; mask->setNull(i, children->operator[](curType).isNull(i)); // this isn't specified in the arrow specification, but is it valid to // compute this using a bitwise OR? diff --git a/src/common/vector/auxiliary_buffer.cpp b/src/common/vector/auxiliary_buffer.cpp index 20c4a47fd07..4904a50b27c 100644 --- a/src/common/vector/auxiliary_buffer.cpp +++ b/src/common/vector/auxiliary_buffer.cpp @@ -52,7 +52,7 @@ void ListAuxiliaryBuffer::resizeDataVector(ValueVector* dataVector) { auto buffer = std::make_unique(capacity * dataVector->getNumBytesPerValue()); memcpy(buffer.get(), dataVector->valueBuffer.get(), size * dataVector->getNumBytesPerValue()); dataVector->valueBuffer = std::move(buffer); - dataVector->nullMask->resize(capacity); + dataVector->nullMask->resize(capacity); // note: allocating 64 times what is needed // If the dataVector is a struct vector, we need to resize its field vectors. if (dataVector->dataType.getPhysicalType() == PhysicalTypeID::STRUCT) { resizeStructDataVector(dataVector); diff --git a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h index 237c8c38259..a1463d39baf 100644 --- a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h +++ b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h @@ -30,19 +30,16 @@ struct PyArrowTableScanSharedState final : public function::BaseScanSharedState struct PyArrowTableScanFunctionData final : public function::TableFuncBindData { std::shared_ptr schema; - std::unique_ptr table; + py::object table; uint64_t numRows; PyArrowTableScanFunctionData(std::vector columnTypes, std::shared_ptr schema, std::vector columnNames, - py::object table, uint64_t numRows) + py::handle table, uint64_t numRows) : TableFuncBindData{std::move(columnTypes), std::move(columnNames)}, - schema{std::move(schema)}, table{std::make_unique(table)}, numRows{numRows} {} + schema{std::move(schema)}, table{py::reinterpret_borrow(table)}, numRows{numRows} {} - ~PyArrowTableScanFunctionData() override { - py::gil_scoped_acquire acquire; - table.reset(); - } + ~PyArrowTableScanFunctionData() override {} std::unique_ptr copy() const override { py::gil_scoped_acquire acquire; diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index f432ab2093a..054d38711ad 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -159,6 +159,7 @@ static std::unique_ptr tryReplacePD(py::dict& dict, py::str std::unique_ptr replacePD(const std::string& objectName) { auto pyTableName = py::str(objectName); // Here we do an exhaustive search on the frame lineage. + py::gil_scoped_acquire acquire; auto currentFrame = importCache->inspect.currentframe()(); while (hasattr(currentFrame, "f_locals")) { auto localDict = py::reinterpret_borrow(currentFrame.attr("f_locals")); diff --git a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp index e9739ea65aa..853be429cce 100644 --- a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp +++ b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp @@ -16,7 +16,7 @@ static std::unique_ptr bindFunc( main::ClientContext* /*context*/, TableFuncBindInput* input) { py::gil_scoped_acquire acquire; - py::object table(py::reinterpret_steal( + py::object table(py::reinterpret_borrow( reinterpret_cast(input->inputs[0].getValue()))); if (py::isinstance(table, importCache->pandas.DataFrame())) { table = importCache->pyarrow.lib.Table.from_pandas()(table); @@ -29,7 +29,7 @@ static std::unique_ptr bindFunc( auto numRows = py::len(table); auto schema = Pyarrow::bind(table, returnTypes, names); return std::make_unique( - std::move(returnTypes), std::move(schema), std::move(names), table, numRows); + std::move(returnTypes), std::move(schema), std::move(names), std::move(table), numRows); } ArrowArrayWrapper* PyArrowTableScanSharedState::getNextChunk() { @@ -46,7 +46,7 @@ static std::unique_ptr initSharedState( py::gil_scoped_acquire acquire; PyArrowTableScanFunctionData* bindData = dynamic_cast(input.bindData); - py::list batches = bindData->table->attr("to_batches")(DEFAULT_VECTOR_CAPACITY); + py::list batches = bindData->table.attr("to_batches")(DEFAULT_VECTOR_CAPACITY); std::vector> arrowArrayBatches; for (auto& i : batches) { diff --git a/tools/python_api/test/test_df_pyarrow.py b/tools/python_api/test/test_df_pyarrow.py index b88db4616b1..d5b1a899269 100644 --- a/tools/python_api/test/test_df_pyarrow.py +++ b/tools/python_api/test/test_df_pyarrow.py @@ -14,11 +14,11 @@ def generate_primitive(dtype): if (dtype.startswith("bool")): return random.randrange(0, 1) == 1 if (dtype.startswith("int32")): - return random.randrange(-2147483648, 2147483648) + return random.randrange(-2147483648, 2147483647) if (dtype.startswith("int64")): - return random.randrange(-9223372036854775808, 9223372036854775808) + return random.randrange(-9223372036854775808, 9223372036854775807) if (dtype.startswith("uint64")): - return random.randrange(0, 18446744073709551616) + return random.randrange(0, 18446744073709551615) if (dtype.startswith("float32")): random_bits = random.getrandbits(32) random_bytes = struct.pack(' None: for colname in ['col1', 'col2']: for expected, actual in zip(df[colname], result[colname]): assert expected == actual + +def test_pyarrow_list(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + random.seed(100) + datalength = 50 + childlength = 5 + index = pa.array(range(datalength)) + col1 = pa.array( + [[generate_primitive('int32[pyarrow]') for x in range(random.randint(1, childlength))] if random.randint(0, 5) == 0 else None for i in range(datalength)]) + col2 = pa.array( + [[[generate_primitive('int32[pyarrow]') for x in range(random.randint(1, childlength))] for y in range(1, childlength)] if random.randint(0, 5) == 0 else None for i in range(datalength)]) + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1': arrowtopd(col1), + 'col2': arrowtopd(col2) + }) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index') + idx = 0 + while result.has_next(): + assert idx < len(index) + nxt = result.get_next() + proc = [idx, col1[idx].as_py(), col2[idx].as_py()] + assert proc == nxt + idx += 1 + + assert idx == len(index) + +def test_pyarrow_struct(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + random.seed(100) + datalength = 4096 + index = pa.array(range(datalength)) + col1_plaindata = [{ + 'a': generate_primitive('int32[pyarrow]'), + 'b': { 'c': generate_string(10) } if random.randint(0, 5) != 0 else None + } if random.randint(0, 5) != 0 else None for i in range(datalength)] + col1 = pa.array(col1_plaindata, pa.struct([ + ('a', pa.int32()), + ('b', pa.struct([('c', pa.string())])) + ])) + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1': arrowtopd(col1) + }) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index') + idx = 0 + while result.has_next(): + assert idx < len(index) + nxt = result.get_next() + expected = [idx, col1[idx].as_py()] + assert expected == nxt + idx += 1 + + assert idx == len(index) + +def test_pyarrow_union(conn_db_readonly : ConnDB) -> None: + pytest.skip("unions are not very well supported by kuzu in general") + conn, db = conn_db_readonly + random.seed(100) + datalength = 4096 + index = pa.array(range(datalength)) + type_codes = pa.array([random.randint(0, 2) for i in range(datalength)], type=pa.int8()) + arr1 = pa.array([generate_primitive('int32[pyarrow]') for i in range(datalength)], type=pa.int32()) + arr2 = pa.array([generate_string(random.randint(1, 10)) for i in range(datalength)]) + arr3 = pa.array([[generate_primitive('float32[pyarrow]') for i in range(10)] for j in range(datalength)]) + col1 = pa.UnionArray.from_sparse(type_codes, [arr1, arr2, arr3]) + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1': arrowtopd(col1) + }) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index') + idx = 0 + while result.has_next(): + assert idx < len(index) + nxt = result.get_next() + expected = [idx, col1[idx].as_py()] + assert expected == nxt + idx += 1 + + assert idx == len(index) + From 677d35ea7031568eea1b3e11b5f261201d2ce512 Mon Sep 17 00:00:00 2001 From: Maxwell <49460053+mxwli@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:11:00 -0400 Subject: [PATCH 099/136] List Auxiliary Buffer NullMask Fix (#3156) * initial commit * apply clang format fix --- src/common/vector/auxiliary_buffer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/vector/auxiliary_buffer.cpp b/src/common/vector/auxiliary_buffer.cpp index 4904a50b27c..a31d6f3ca1e 100644 --- a/src/common/vector/auxiliary_buffer.cpp +++ b/src/common/vector/auxiliary_buffer.cpp @@ -52,7 +52,8 @@ void ListAuxiliaryBuffer::resizeDataVector(ValueVector* dataVector) { auto buffer = std::make_unique(capacity * dataVector->getNumBytesPerValue()); memcpy(buffer.get(), dataVector->valueBuffer.get(), size * dataVector->getNumBytesPerValue()); dataVector->valueBuffer = std::move(buffer); - dataVector->nullMask->resize(capacity); // note: allocating 64 times what is needed + dataVector->nullMask->resize((capacity + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> + NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); // If the dataVector is a struct vector, we need to resize its field vectors. if (dataVector->dataType.getPhysicalType() == PhysicalTypeID::STRUCT) { resizeStructDataVector(dataVector); From c7478994b07810d932ecc6760f0f5e3f81025995 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Wed, 27 Mar 2024 17:24:36 -0400 Subject: [PATCH 100/136] Add support to compute hash on list of struct (#3157) --- src/function/vector_hash_functions.cpp | 92 ++++++++++++++++------ src/include/common/types/types.h | 3 + src/include/function/hash/hash_functions.h | 26 ------ test/test_files/tinysnb/agg/hash.test | 27 +++++++ 4 files changed, 100 insertions(+), 48 deletions(-) diff --git a/src/function/vector_hash_functions.cpp b/src/function/vector_hash_functions.cpp index 602698db777..ceff3de1691 100644 --- a/src/function/vector_hash_functions.cpp +++ b/src/function/vector_hash_functions.cpp @@ -7,6 +7,74 @@ using namespace kuzu::common; namespace kuzu { namespace function { +static std::unique_ptr computeDataVecHash(ValueVector* operand) { + auto hashVector = std::make_unique(*LogicalType::VAR_LIST(LogicalType::HASH())); + auto numValuesInDataVec = ListVector::getDataVectorSize(operand); + ListVector::resizeDataVector(hashVector.get(), numValuesInDataVec); + auto selectionState = std::make_shared(); + selectionState->selVector->resetSelectorToValuePosBuffer(); + ListVector::getDataVector(operand)->setState(selectionState); + auto numValuesComputed = 0u; + while (numValuesComputed < numValuesInDataVec) { + for (auto i = 0u; i < DEFAULT_VECTOR_CAPACITY; i++) { + selectionState->selVector->selectedPositions[i] = numValuesComputed; + numValuesComputed++; + } + VectorHashFunction::computeHash( + ListVector::getDataVector(operand), ListVector::getDataVector(hashVector.get())); + } + return hashVector; +} + +static void finalizeDataVecHash(ValueVector* operand, ValueVector* result, ValueVector* hashVec) { + for (auto i = 0u; i < result->state->getNumSelectedValues(); i++) { + auto pos = operand->state->selVector->selectedPositions[i]; + auto entry = operand->getValue(pos); + if (operand->isNull(pos)) { + result->setValue(pos, NULL_HASH); + } else { + auto hashValue = NULL_HASH; + for (auto j = 0u; j < entry.size; j++) { + hashValue = combineHashScalar(hashValue, + ListVector::getDataVector(hashVec)->getValue(entry.offset + j)); + } + result->setValue(pos, hashValue); + } + } +} + +static void computeListVectorHash(ValueVector* operand, ValueVector* result) { + auto dataVecHash = computeDataVecHash(operand); + finalizeDataVecHash(operand, result, dataVecHash.get()); +} + +static void computeStructVecHash(ValueVector* operand, ValueVector* result) { + switch (operand->dataType.getLogicalTypeID()) { + case LogicalTypeID::NODE: { + KU_ASSERT(0 == common::StructType::getFieldIdx(&operand->dataType, InternalKeyword::ID)); + UnaryHashFunctionExecutor::execute( + *StructVector::getFieldVector(operand, 0), *result); + } break; + case LogicalTypeID::REL: { + KU_ASSERT(3 == StructType::getFieldIdx(&operand->dataType, InternalKeyword::ID)); + UnaryHashFunctionExecutor::execute( + *StructVector::getFieldVector(operand, 3), *result); + } break; + case LogicalTypeID::STRUCT: { + VectorHashFunction::computeHash( + StructVector::getFieldVector(operand, 0 /* idx */).get(), result); + auto tmpHashVector = std::make_unique(LogicalTypeID::INT64); + for (auto i = 1u; i < StructType::getNumFields(&operand->dataType); i++) { + auto fieldVector = StructVector::getFieldVector(operand, i); + VectorHashFunction::computeHash(fieldVector.get(), tmpHashVector.get()); + VectorHashFunction::combineHash(tmpHashVector.get(), result, result); + } + } break; + default: + KU_UNREACHABLE; + } +} + void VectorHashFunction::computeHash(ValueVector* operand, ValueVector* result) { result->state = operand->state; KU_ASSERT(result->dataType.getLogicalTypeID() == LogicalTypeID::INT64); @@ -57,30 +125,10 @@ void VectorHashFunction::computeHash(ValueVector* operand, ValueVector* result) UnaryHashFunctionExecutor::execute(*operand, *result); } break; case PhysicalTypeID::STRUCT: { - if (operand->dataType.getLogicalTypeID() == LogicalTypeID::NODE) { - KU_ASSERT( - 0 == common::StructType::getFieldIdx(&operand->dataType, InternalKeyword::ID)); - UnaryHashFunctionExecutor::execute( - *StructVector::getFieldVector(operand, 0), *result); - } else if (operand->dataType.getLogicalTypeID() == LogicalTypeID::REL) { - KU_ASSERT(3 == StructType::getFieldIdx(&operand->dataType, InternalKeyword::ID)); - UnaryHashFunctionExecutor::execute( - *StructVector::getFieldVector(operand, 3), *result); - } else { - VectorHashFunction::computeHash( - StructVector::getFieldVector(operand, 0 /* idx */).get(), result); - auto tmpHashVector = std::make_unique(LogicalTypeID::INT64); - for (auto i = 1u; i < StructType::getNumFields(&operand->dataType); i++) { - auto fieldVector = StructVector::getFieldVector(operand, i); - VectorHashFunction::computeHash(fieldVector.get(), tmpHashVector.get()); - VectorHashFunction::combineHash(tmpHashVector.get(), result, result); - } - } + computeStructVecHash(operand, result); } break; case PhysicalTypeID::VAR_LIST: { - // TODO(Ziyi): We should pass in the selection state here, and do vectorized hash - // computation. - UnaryHashFunctionExecutor::execute(*operand, *result); + computeListVectorHash(operand, result); } break; // LCOV_EXCL_START default: { diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index a2fabdb67a6..1164afde567 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -309,6 +309,9 @@ class LogicalType { static std::unique_ptr BOOL() { return std::make_unique(LogicalTypeID::BOOL); } + static std::unique_ptr HASH() { + return std::make_unique(LogicalTypeID::INT64); + } static std::unique_ptr INT64() { return std::make_unique(LogicalTypeID::INT64); } diff --git a/src/include/function/hash/hash_functions.h b/src/include/function/hash/hash_functions.h index 9cfd61f3944..cfa32f9b897 100644 --- a/src/include/function/hash/hash_functions.h +++ b/src/include/function/hash/hash_functions.h @@ -189,32 +189,6 @@ inline void Hash::operation( combineHashScalar(murmurhash64(key.days), murmurhash64(key.micros))); } -template<> -inline void Hash::operation( - const common::list_entry_t& key, common::hash_t& result, common::ValueVector* keyVector) { - auto dataVector = common::ListVector::getDataVector(keyVector); - result = NULL_HASH; - common::hash_t tmpResult; - for (auto i = 0u; i < key.size; i++) { - auto pos = key.offset + i; - if (dataVector->isNull(pos)) { - result = combineHashScalar(result, NULL_HASH); - } else { - common::TypeUtils::visit( - dataVector->dataType.getPhysicalType(), - [&]( - T) { operation(dataVector->getValue(pos), tmpResult, dataVector); }, - [&](common::struct_entry_t) { - // LCOV_EXCL_START - throw common::RuntimeException{"Hash on list of struct is not supported yet."}; - // LCOV_EXCL_STOP - }, - [](auto) { KU_UNREACHABLE; }); - result = combineHashScalar(result, tmpResult); - } - } -} - template<> inline void Hash::operation(const std::unordered_set& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { diff --git a/test/test_files/tinysnb/agg/hash.test b/test/test_files/tinysnb/agg/hash.test index 34721c83a4f..0a6ad618abd 100644 --- a/test/test_files/tinysnb/agg/hash.test +++ b/test/test_files/tinysnb/agg/hash.test @@ -546,3 +546,30 @@ True|2 {rating: 7.000000, stars: 10, views: 982, release: 2018-11-13 13:33:11, release_ns: 2018-11-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2018-11-13 13:33:11, release_tz: 2018-11-13 13:33:11.123456+00, film: 2014-09-12, u8: 12, u16: 120, u32: 55, u64: 1, hugedata: -1844674407370955161511}|2 {rating: 1223.000000, stars: 100, views: 10003, release: 2011-02-11 16:44:22, release_ns: 2011-02-11 16:44:22.123456, release_ms: 2011-02-11 16:44:22.123, release_sec: 2011-02-11 16:44:22, release_tz: 2011-02-11 16:44:22.123456+00, film: 2013-02-22, u8: 1, u16: 15, u32: 200, u64: 4, hugedata: -15}|2 {rating: 55.000000, stars: 2, views: 88, release: 2022-01-22 00:00:00, release_ns: 2025-01-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2011-01-11 00:00:00, release_tz: 2011-11-11 00:00:00+00, film: 2022-01-11, u8: 3, u16: 22, u32: 22, u64: 56, hugedata: 999999}|1 + +-LOG HashOnListOfStruct +-STATEMENT CREATE (:organisation {ID: 22}) +---- ok +-STATEMENT MATCH (o:organisation) RETURN [o.state], count(*) +---- 5 +[{revenue: 138, location: ['toronto','montr,eal'], stock: {price: [96,56], volume: 1000}}]|2 +[{revenue: 152, location: ["vanco,uver north area"], stock: {price: [15,78,671], volume: 432}}]|1 +[{revenue: 55, location: ['toronto'], stock: {price: [22,33], volume: 28}}]|1 +[{revenue: 558, location: ['very long city name','new york'], stock: {price: [22], volume: 99}}]|2 +[]|1 +-STATEMENT MATCH (m:movies) RETURN [m.description], count(*) +---- 4 +[{rating: 5.300000, stars: 2, views: 152, release: 2011-08-20 11:25:30, release_ns: 2011-08-20 11:25:30.123456, release_ms: 2011-08-20 11:25:30.123, release_sec: 2011-08-20 11:25:30, release_tz: 2011-08-20 11:25:30.123456+00, film: 2012-05-11, u8: 220, u16: 20, u32: 1, u64: 180, hugedata: 1844674407370955161811111111}]|1 +[{rating: 7.000000, stars: 10, views: 982, release: 2018-11-13 13:33:11, release_ns: 2018-11-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2018-11-13 13:33:11, release_tz: 2018-11-13 13:33:11.123456+00, film: 2014-09-12, u8: 12, u16: 120, u32: 55, u64: 1, hugedata: -1844674407370955161511}]|2 +[{rating: 1223.000000, stars: 100, views: 10003, release: 2011-02-11 16:44:22, release_ns: 2011-02-11 16:44:22.123456, release_ms: 2011-02-11 16:44:22.123, release_sec: 2011-02-11 16:44:22, release_tz: 2011-02-11 16:44:22.123456+00, film: 2013-02-22, u8: 1, u16: 15, u32: 200, u64: 4, hugedata: -15}]|2 +[{rating: 55.000000, stars: 2, views: 88, release: 2022-01-22 00:00:00, release_ns: 2025-01-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2011-01-11 00:00:00, release_tz: 2011-11-11 00:00:00+00, film: 2022-01-11, u8: 3, u16: 22, u32: 22, u64: 56, hugedata: 999999}]|1 +-STATEMENT MATCH (o:organisation) RETURN distinct [o.state]; +---- 5 +[{revenue: 138, location: ['toronto','montr,eal'], stock: {price: [96,56], volume: 1000}}] +[{revenue: 152, location: ["vanco,uver north area"], stock: {price: [15,78,671], volume: 432}}] +[{revenue: 55, location: ['toronto'], stock: {price: [22,33], volume: 28}}] +[{revenue: 558, location: ['very long city name','new york'], stock: {price: [22], volume: 99}}] +[] +-STATEMENT MATCH (p:person) return distinct collect(p); +---- 1 +[{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11},{_ID: 0:1, _LABEL: person, ID: 2, fName: Bob, gender: 2, isStudent: True, isWorker: False, age: 30, eyeSight: 5.100000, birthdate: 1900-01-01, registerTime: 2008-11-03 15:25:30.000526, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [12,8], usedNames: [Bobby], courseScoresPerTerm: [[8,9],[9,10]], grades: [98,42,93,88], height: 0.990000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12},{_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13},{_ID: 0:3, _LABEL: person, ID: 5, fName: Dan, gender: 2, isStudent: False, isWorker: True, age: 20, eyeSight: 4.800000, birthdate: 1950-07-23, registerTime: 2031-11-30 12:25:30, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1,9], usedNames: [Wolfeschlegelstein,Daniel], courseScoresPerTerm: [[7,4],[8,8],[9]], grades: [76,88,99,89], height: 1.300000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14},{_ID: 0:4, _LABEL: person, ID: 7, fName: Elizabeth, gender: 1, isStudent: False, isWorker: True, age: 20, eyeSight: 4.700000, birthdate: 1980-10-26, registerTime: 1976-12-23 11:21:42, lastJobDuration: 48:24:11, workedHours: [2], usedNames: [Ein], courseScoresPerTerm: [[6],[7],[8]], grades: [96,59,65,88], height: 1.463000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15},{_ID: 0:5, _LABEL: person, ID: 8, fName: Farooq, gender: 2, isStudent: True, isWorker: False, age: 25, eyeSight: 4.500000, birthdate: 1980-10-26, registerTime: 1972-07-31 13:22:30.678559, lastJobDuration: 00:18:00.024, workedHours: [3,4,5,6,7], usedNames: [Fesdwe], courseScoresPerTerm: [[8]], grades: [80,78,34,83], height: 1.510000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16},{_ID: 0:6, _LABEL: person, ID: 9, fName: Greg, gender: 2, isStudent: False, isWorker: False, age: 40, eyeSight: 4.900000, birthdate: 1980-10-26, registerTime: 1976-12-23 04:41:42, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1], usedNames: [Grad], courseScoresPerTerm: [[10]], grades: [43,83,67,43], height: 1.600000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17},{_ID: 0:7, _LABEL: person, ID: 10, fName: Hubert Blaine Wolfeschlegelsteinhausenbergerdorff, gender: 2, isStudent: False, isWorker: True, age: 83, eyeSight: 4.900000, birthdate: 1990-11-27, registerTime: 2023-02-21 13:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,11,12,3,4,5,6,7], usedNames: [Ad,De,Hi,Kye,Orlan], courseScoresPerTerm: [[7],[10],[6,7]], grades: [77,64,100,54], height: 1.323000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18}] From 015bf23788b8d2f50fe5197054157ed1cd0c588a Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Wed, 27 Mar 2024 23:05:28 -0400 Subject: [PATCH 101/136] Prepare Statement Improvement (#3140) Prepare Statement Improvement --- src/include/binder/binder.h | 5 + .../binder/expression/parameter_expression.h | 4 +- src/include/main/client_context.h | 20 +++- src/include/main/connection.h | 7 +- src/include/main/prepared_statement.h | 2 + src/include/parser/parser.h | 2 +- src/include/parser/statement.h | 9 ++ src/include/parser/transformer.h | 2 +- src/main/client_context.cpp | 97 +++++++++++-------- src/main/connection.cpp | 7 +- src/parser/parser.cpp | 2 +- src/parser/transformer.cpp | 4 +- test/copy/e2e_copy_transaction_test.cpp | 4 +- test/ddl/e2e_ddl_test.cpp | 2 +- test/main/prepare_test.cpp | 71 +++++++++++--- test/test_runner/test_runner.cpp | 8 +- tools/nodejs_api/test/test_parameter.js | 97 ++++++++++--------- tools/python_api/test/test_parameter.py | 21 ++++ tools/rust_api/src/connection.rs | 25 ----- 19 files changed, 234 insertions(+), 155 deletions(-) diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index 8cf55fab538..85373b29248 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -87,6 +87,11 @@ class Binder { std::unique_ptr bind(const parser::Statement& statement); + void setInputParameters( + std::unordered_map> parameters) { + expressionBinder.parameterMap = parameters; + } + inline std::unordered_map> getParameterMap() { return expressionBinder.parameterMap; } diff --git a/src/include/binder/expression/parameter_expression.h b/src/include/binder/expression/parameter_expression.h index 12598a63d45..1d8c53f81bb 100644 --- a/src/include/binder/expression/parameter_expression.h +++ b/src/include/binder/expression/parameter_expression.h @@ -10,8 +10,8 @@ class ParameterExpression : public Expression { public: explicit ParameterExpression( const std::string& parameterName, std::shared_ptr value) - : Expression{common::ExpressionType::PARAMETER, - common::LogicalType(common::LogicalTypeID::ANY), createUniqueName(parameterName)}, + : Expression{common::ExpressionType::PARAMETER, common::LogicalType(*value->getDataType()), + createUniqueName(parameterName)}, parameterName(parameterName), value{std::move(value)} {} void cast(const common::LogicalType& type) override; diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index 5cdb5c891d7..ec7517f6dca 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -106,6 +106,11 @@ class ClientContext { std::unique_ptr query(std::string_view queryStatement); void runQuery(std::string query); + // TODO(Jiamin): should remove after supporting ddl in manual tx + std::unique_ptr prepareTest(std::string_view query); + // only use for test framework + std::vector> parseQuery(std::string_view query); + private: std::unique_ptr query( std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans = true); @@ -114,10 +119,15 @@ class ClientContext { std::unique_ptr preparedStatementWithError(std::string_view errMsg); - std::vector> parseQuery(std::string_view query); - - std::unique_ptr prepareNoLock(parser::Statement* parsedStatement, - bool enumerateAllPlans = false, std::string_view joinOrder = std::string_view()); + // when we do prepare, we will start a transaction for the query + // when we execute after prepare in a same context, we set requireNewTx to false and will not + // commit the transaction in prepare when we only prepare a query statement, we set requireNewTx + // to true and will commit the transaction in prepare + std::unique_ptr prepareNoLock( + std::shared_ptr parsedStatement, bool enumerateAllPlans = false, + std::string_view joinOrder = std::string_view(), bool requireNewTx = true, + std::optional>> inputParams = + std::nullopt); template std::unique_ptr executeWithParams(PreparedStatement* preparedStatement, @@ -133,7 +143,7 @@ class ClientContext { const std::unordered_map>& inputParams); std::unique_ptr executeAndAutoCommitIfNecessaryNoLock( - PreparedStatement* preparedStatement, uint32_t planIdx = 0u); + PreparedStatement* preparedStatement, uint32_t planIdx = 0u, bool requiredNexTx = true); void addScalarFunction(std::string name, function::function_set definitions); diff --git a/src/include/main/connection.h b/src/include/main/connection.h index 87d1afcf5bd..d0d5c477183 100644 --- a/src/include/main/connection.h +++ b/src/include/main/connection.h @@ -145,10 +145,9 @@ class Connection { std::unique_ptr preparedStatementWithError(std::string_view errMsg); - std::vector> parseQuery(std::string_view query); - - std::unique_ptr prepareNoLock(parser::Statement* parsedStatement, - bool enumerateAllPlans = false, std::string_view joinOrder = std::string_view()); + std::unique_ptr prepareNoLock( + std::shared_ptr parsedStatement, bool enumerateAllPlans = false, + std::string_view joinOrder = std::string_view()); template std::unique_ptr executeWithParams(PreparedStatement* preparedStatement, diff --git a/src/include/main/prepared_statement.h b/src/include/main/prepared_statement.h index 22d4c9f952e..20ad0974b39 100644 --- a/src/include/main/prepared_statement.h +++ b/src/include/main/prepared_statement.h @@ -7,6 +7,7 @@ #include "common/api.h" #include "kuzu_fwd.h" +#include "parser/statement.h" #include "query_summary.h" namespace kuzu { @@ -62,6 +63,7 @@ class PreparedStatement { std::unordered_map> parameterMap; std::unique_ptr statementResult; std::vector> logicalPlans; + std::shared_ptr parsedStatement; }; } // namespace main diff --git a/src/include/parser/parser.h b/src/include/parser/parser.h index 5ca9ef9ba8b..a6bed351df1 100644 --- a/src/include/parser/parser.h +++ b/src/include/parser/parser.h @@ -12,7 +12,7 @@ namespace parser { class Parser { public: - static std::vector> parseQuery(std::string_view query); + static std::vector> parseQuery(std::string_view query); }; } // namespace parser diff --git a/src/include/parser/statement.h b/src/include/parser/statement.h index 3cb56749f57..45e3d1bb633 100644 --- a/src/include/parser/statement.h +++ b/src/include/parser/statement.h @@ -13,6 +13,15 @@ class Statement { inline common::StatementType getStatementType() const { return statementType; } + inline bool requireTx() { + switch (statementType) { + case common::StatementType::TRANSACTION: + return false; + default: + return true; + } + } + private: common::StatementType statementType; }; diff --git a/src/include/parser/transformer.h b/src/include/parser/transformer.h index ce5ccd92522..392af7a358f 100644 --- a/src/include/parser/transformer.h +++ b/src/include/parser/transformer.h @@ -31,7 +31,7 @@ class Transformer { public: explicit Transformer(CypherParser::Ku_StatementsContext& root) : root{root} {} - std::vector> transform(); + std::vector> transform(); private: std::unique_ptr transformStatement(CypherParser::OC_StatementContext& ctx); diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 6a809f69cd5..1315025e15f 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -190,11 +190,28 @@ std::string ClientContext::getEnvVariable(const std::string& name) { } std::unique_ptr ClientContext::prepare(std::string_view query) { + auto preparedStatement = std::unique_ptr(); + if (query.empty()) { + return preparedStatementWithError("Connection Exception: Query is empty."); + } + std::unique_lock lck{mtx}; + auto parsedStatements = std::vector>(); + try { + parsedStatements = Parser::parseQuery(query); + } catch (std::exception& exception) { return preparedStatementWithError(exception.what()); } + if (parsedStatements.size() > 1) { + return preparedStatementWithError( + "Connection Exception: We do not support prepare multiple statements."); + } + return prepareNoLock(parsedStatements[0]); +} + +std::unique_ptr ClientContext::prepareTest(std::string_view query) { auto preparedStatement = std::unique_ptr(); std::unique_lock lck{mtx}; - auto parsedStatements = std::vector>(); + auto parsedStatements = std::vector>(); try { - parsedStatements = parseQuery(query); + parsedStatements = Parser::parseQuery(query); } catch (std::exception& exception) { return preparedStatementWithError(exception.what()); } if (parsedStatements.size() > 1) { return preparedStatementWithError( @@ -203,7 +220,8 @@ std::unique_ptr ClientContext::prepare(std::string_view query if (parsedStatements.empty()) { return preparedStatementWithError("Connection Exception: Query is empty."); } - return prepareNoLock(parsedStatements[0].get()); + return prepareNoLock( + parsedStatements[0], false /* enumerate all plans */, "", false /*requireNewTx*/); } std::unique_ptr ClientContext::query(std::string_view queryStatement) { @@ -213,20 +231,20 @@ std::unique_ptr ClientContext::query(std::string_view queryStatemen std::unique_ptr ClientContext::query( std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans) { lock_t lck{mtx}; - // parsing - auto parsedStatements = std::vector>(); - try { - parsedStatements = parseQuery(query); - } catch (std::exception& exception) { return queryResultWithError(exception.what()); } - if (parsedStatements.empty()) { + if (query.empty()) { return queryResultWithError("Connection Exception: Query is empty."); } + auto parsedStatements = std::vector>(); + try { + parsedStatements = Parser::parseQuery(query); + } catch (std::exception& exception) { return queryResultWithError(exception.what()); } std::unique_ptr queryResult; QueryResult* lastResult = nullptr; for (auto& statement : parsedStatements) { - auto preparedStatement = prepareNoLock( - statement.get(), enumerateAllPlans /* enumerate all plans */, encodedJoin); - auto currentQueryResult = executeAndAutoCommitIfNecessaryNoLock(preparedStatement.get()); + auto preparedStatement = prepareNoLock(statement, + enumerateAllPlans /* enumerate all plans */, encodedJoin, false /*requireNewTx*/); + auto currentQueryResult = executeAndAutoCommitIfNecessaryNoLock( + preparedStatement.get(), 0u, false /*requiredNexTx*/); if (!lastResult) { // first result of the query queryResult = std::move(currentQueryResult); @@ -256,7 +274,9 @@ std::unique_ptr ClientContext::preparedStatementWithError( } std::unique_ptr ClientContext::prepareNoLock( - Statement* parsedStatement, bool enumerateAllPlans, std::string_view encodedJoin) { + std::shared_ptr parsedStatement, bool enumerateAllPlans, + std::string_view encodedJoin, bool requireNewTx, + std::optional>> inputParams) { auto preparedStatement = std::make_unique(); auto compilingTimer = TimeMetric(true /* enable */); compilingTimer.start(); @@ -267,18 +287,8 @@ std::unique_ptr ClientContext::prepareNoLock( if (database->systemConfig.readOnly && !preparedStatement->isReadOnly()) { throw ConnectionException("Cannot execute write operations in a read-only database!"); } - } catch (std::exception& exception) { - preparedStatement->success = false; - preparedStatement->errMsg = exception.what(); - compilingTimer.stop(); - preparedStatement->preparedSummary.compilingTime = compilingTimer.getElapsedTimeMS(); - return preparedStatement; - } - std::unique_ptr executionContext; - std::unique_ptr logicalPlan; - try { - // parsing - if (parsedStatement->getStatementType() != StatementType::TRANSACTION) { + preparedStatement->parsedStatement = parsedStatement; + if (parsedStatement->requireTx()) { if (transactionContext->isAutoTransaction()) { transactionContext->beginAutoTransaction(preparedStatement->readOnly); } else { @@ -292,6 +302,9 @@ std::unique_ptr ClientContext::prepareNoLock( } // binding auto binder = Binder(this); + if (inputParams) { + binder.setInputParameters(*inputParams); + } auto boundStatement = binder.bind(*parsedStatement); preparedStatement->parameterMap = binder.getParameterMap(); preparedStatement->statementResult = @@ -323,6 +336,9 @@ std::unique_ptr ClientContext::prepareNoLock( } else { preparedStatement->logicalPlans = std::move(plans); } + if (transactionContext->isAutoTransaction() && requireNewTx) { + this->transactionContext->commit(); + } } catch (std::exception& exception) { preparedStatement->success = false; preparedStatement->errMsg = exception.what(); @@ -333,8 +349,8 @@ std::unique_ptr ClientContext::prepareNoLock( return preparedStatement; } -std::vector> ClientContext::parseQuery(std::string_view query) { - std::vector> statements; +std::vector> ClientContext::parseQuery(std::string_view query) { + std::vector> statements; if (query.empty()) { return statements; } @@ -356,7 +372,11 @@ std::unique_ptr ClientContext::executeWithParams(PreparedStatement* std::string errMsg = exception.what(); return queryResultWithError(errMsg); } - return executeAndAutoCommitIfNecessaryNoLock(preparedStatement); + // rebind + KU_ASSERT(preparedStatement->parsedStatement != nullptr); + auto rebindPreparedStatement = prepareNoLock( + preparedStatement->parsedStatement, false, "", false, preparedStatement->parameterMap); + return executeAndAutoCommitIfNecessaryNoLock(rebindPreparedStatement.get(), 0u, false); } void ClientContext::bindParametersNoLock(PreparedStatement* preparedStatement, @@ -367,14 +387,6 @@ void ClientContext::bindParametersNoLock(PreparedStatement* preparedStatement, throw Exception("Parameter " + name + " not found."); } auto expectParam = parameterMap.at(name); - if (value->getDataType()->getLogicalTypeID() == LogicalTypeID::ANY) { - value->setDataType(*expectParam->getDataType()); - } - if (*expectParam->getDataType() != *value->getDataType()) { - throw Exception("Parameter " + name + " has data type " + - value->getDataType()->toString() + " but expects " + - expectParam->getDataType()->toString() + "."); - } // The much more natural `parameterMap.at(name) = std::move(v)` fails. // The reason is that other parts of the code rely on the existing Value object to be // modified in-place, not replaced in this map. @@ -383,12 +395,11 @@ void ClientContext::bindParametersNoLock(PreparedStatement* preparedStatement, } std::unique_ptr ClientContext::executeAndAutoCommitIfNecessaryNoLock( - PreparedStatement* preparedStatement, uint32_t planIdx) { + PreparedStatement* preparedStatement, uint32_t planIdx, bool requiredNexTx) { if (!preparedStatement->isSuccess()) { return queryResultWithError(preparedStatement->errMsg); } - if (preparedStatement->preparedSummary.statementType != common::StatementType::TRANSACTION && - this->getTx() == nullptr) { + if (preparedStatement->parsedStatement->requireTx() && requiredNexTx && getTx() == nullptr) { this->transactionContext->beginAutoTransaction(preparedStatement->isReadOnly()); if (!preparedStatement->readOnly) { database->catalog->initCatalogContentForWriteTrxIfNecessary(); @@ -470,18 +481,18 @@ void ClientContext::runQuery(std::string query) { if (transactionContext->hasActiveTransaction()) { transactionContext->commit(); } - auto parsedStatements = std::vector>(); + auto parsedStatements = std::vector>(); try { - parsedStatements = parseQuery(query); + parsedStatements = Parser::parseQuery(query); } catch (std::exception& exception) { throw ConnectionException(exception.what()); } if (parsedStatements.empty()) { throw ConnectionException("Connection Exception: Query is empty."); } try { for (auto& statement : parsedStatements) { - auto preparedStatement = prepareNoLock(statement.get()); + auto preparedStatement = prepareNoLock(statement, false, "", false); auto currentQueryResult = - executeAndAutoCommitIfNecessaryNoLock(preparedStatement.get()); + executeAndAutoCommitIfNecessaryNoLock(preparedStatement.get(), 0u, false); if (!currentQueryResult->isSuccess()) { throw ConnectionException(currentQueryResult->errMsg); } diff --git a/src/main/connection.cpp b/src/main/connection.cpp index 320a363cc58..0c9c4674670 100644 --- a/src/main/connection.cpp +++ b/src/main/connection.cpp @@ -53,14 +53,11 @@ std::unique_ptr Connection::preparedStatementWithError(std::s } std::unique_ptr Connection::prepareNoLock( - Statement* parsedStatement, bool enumerateAllPlans, std::string_view encodedJoin) { + std::shared_ptr parsedStatement, bool enumerateAllPlans, + std::string_view encodedJoin) { return clientContext->prepareNoLock(parsedStatement, enumerateAllPlans, encodedJoin); } -std::vector> Connection::parseQuery(std::string_view query) { - return clientContext->parseQuery(query); -} - void Connection::interrupt() { clientContext->interrupt(); } diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index d0fab07a1f7..ed9f50773e6 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -16,7 +16,7 @@ using namespace antlr4; namespace kuzu { namespace parser { -std::vector> Parser::parseQuery(std::string_view query) { +std::vector> Parser::parseQuery(std::string_view query) { auto inputStream = ANTLRInputStream(query); auto parserErrorListener = ParserErrorListener(); diff --git a/src/parser/transformer.cpp b/src/parser/transformer.cpp index 2d3d63a3648..dafcfcad7bd 100644 --- a/src/parser/transformer.cpp +++ b/src/parser/transformer.cpp @@ -10,8 +10,8 @@ using namespace kuzu::common; namespace kuzu { namespace parser { -std::vector> Transformer::transform() { - std::vector> statements; +std::vector> Transformer::transform() { + std::vector> statements; for (auto& oc_Statement : root.oC_Cypher()) { auto statement = transformStatement(*oc_Statement->oC_Statement()); if (oc_Statement->oC_AnyCypherOption()) { diff --git a/test/copy/e2e_copy_transaction_test.cpp b/test/copy/e2e_copy_transaction_test.cpp index 14451a01f10..34a286ffd93 100644 --- a/test/copy/e2e_copy_transaction_test.cpp +++ b/test/copy/e2e_copy_transaction_test.cpp @@ -66,7 +66,7 @@ class TinySnbCopyCSVTransactionTest : public EmptyDBTest { void copyNodeCSVCommitAndRecoveryTest(TransactionTestType transactionTestType) { conn->query(createPersonTableCMD); - auto preparedStatement = conn->prepare(copyPersonTableCMD); + auto preparedStatement = conn->getClientContext()->prepareTest(copyPersonTableCMD); if (!preparedStatement->success) { ASSERT_TRUE(false) << preparedStatement->errMsg; } @@ -130,7 +130,7 @@ class TinySnbCopyCSVTransactionTest : public EmptyDBTest { conn->query(createPersonTableCMD); conn->query(copyPersonTableCMD); conn->query(createKnowsTableCMD); - auto preparedStatement = conn->prepare(copyKnowsTableCMD); + auto preparedStatement = conn->getClientContext()->prepareTest(copyKnowsTableCMD); auto mapper = PlanMapper(conn->getClientContext()); auto physicalPlan = mapper.mapLogicalPlanToPhysical(preparedStatement->logicalPlans[0].get(), diff --git a/test/ddl/e2e_ddl_test.cpp b/test/ddl/e2e_ddl_test.cpp index 02b21b5cde5..5cfce9ddd67 100644 --- a/test/ddl/e2e_ddl_test.cpp +++ b/test/ddl/e2e_ddl_test.cpp @@ -169,7 +169,7 @@ class TinySnbDDLTest : public DBTest { } void executeQueryWithoutCommit(std::string query) { - auto preparedStatement = conn->prepare(query); + auto preparedStatement = conn->getClientContext()->prepareTest(query); auto mapper = PlanMapper(conn->getClientContext()); auto physicalPlan = mapper.mapLogicalPlanToPhysical(preparedStatement->logicalPlans[0].get(), diff --git a/test/main/prepare_test.cpp b/test/main/prepare_test.cpp index d393233934e..3aa3902d45b 100644 --- a/test/main/prepare_test.cpp +++ b/test/main/prepare_test.cpp @@ -7,6 +7,48 @@ static void checkTuple(kuzu::processor::FlatTuple* tuple, const std::string& gro ASSERT_STREQ(tuple->toString().c_str(), groundTruth.c_str()); } +TEST_F(ApiTest, issueTest1) { + conn->query("CREATE NODE TABLE T(id SERIAL, name STRING, PRIMARY KEY(id));"); + conn->query("CREATE (t:T {name: \"foo\"});"); + auto preparedStatement = conn->prepare("MATCH (t:T {id: $p}) return t.name;"); + auto result = conn->execute(preparedStatement.get(), std::make_pair(std::string("p"), 0)); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "foo\n"); + ASSERT_FALSE(result->hasNext()); +} + +TEST_F(ApiTest, issueTest2) { + conn->query("CREATE NODE TABLE NodeOne(id INT64, name STRING, PRIMARY KEY(id));"); + conn->query("CREATE NODE TABLE NodeTwo(id INT64, name STRING, PRIMARY KEY(id));"); + conn->query("CREATE Rel TABLE RelA(from NodeOne to NodeOne);"); + conn->query("CREATE Rel TABLE RelB(from NodeTwo to NodeOne, name String);"); + conn->query("CREATE (t: NodeOne {id:1, name: \"Alice\"});"); + conn->query("CREATE (t: NodeOne {id:2, name: \"Jack\"});"); + conn->query("CREATE (t: NodeTwo {id:3, name: \"Bob\"});"); + auto preparedStatement = conn->prepare("MATCH (a:NodeOne { id: $a_id })," + "(b:NodeTwo { id: $b_id })," + "(c: NodeOne{ id: $c_id } )" + " MERGE" + " (a)-[:RelA]->(c)," + " (b)-[r:RelB { name: $my_param }]->(c)" + " return r.name;"); + auto result = conn->execute(preparedStatement.get(), std::make_pair(std::string("a_id"), 1), + std::make_pair(std::string("b_id"), 3), std::make_pair(std::string("c_id"), 2), + std::make_pair(std::string("my_param"), "friend")); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "friend\n"); + ASSERT_FALSE(result->hasNext()); +} + +TEST_F(ApiTest, issueTest) { + auto preparedStatement = conn->prepare("RETURN $1 + 1;"); + auto result = + conn->execute(preparedStatement.get(), std::make_pair(std::string("1"), (int8_t)1)); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "2\n"); + ASSERT_FALSE(result->hasNext()); +} + TEST_F(ApiTest, MultiParamsPrepare) { auto preparedStatement = conn->prepare( "MATCH (a:person) WHERE a.fName STARTS WITH $n OR a.fName CONTAINS $xx RETURN COUNT(*)"); @@ -96,9 +138,8 @@ TEST_F(ApiTest, PrepareDefaultParam) { ASSERT_FALSE(result->hasNext()); preparedStatement = conn->prepare("RETURN size($1)"); result = conn->execute(preparedStatement.get(), std::make_pair(std::string("1"), 1)); - ASSERT_FALSE(result->isSuccess()); - ASSERT_STREQ( - result->getErrorMessage().c_str(), "Parameter 1 has data type INT32 but expects STRING."); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "1\n"); } TEST_F(ApiTest, PrepareDefaultListParam) { @@ -109,8 +150,8 @@ TEST_F(ApiTest, PrepareDefaultListParam) { checkTuple(result->getNext().get(), "[1,1]\n"); result = conn->execute(preparedStatement.get(), std::make_pair(std::string("1"), "as")); ASSERT_FALSE(result->isSuccess()); - ASSERT_STREQ( - result->getErrorMessage().c_str(), "Parameter 1 has data type STRING but expects INT64."); + ASSERT_STREQ(result->getErrorMessage().c_str(), + "Binder exception: Cannot bind LIST_CREATION with parameter type INT64 and STRING."); preparedStatement = conn->prepare("RETURN [$1]"); result = conn->execute(preparedStatement.get(), std::make_pair(std::string("1"), "as")); ASSERT_TRUE(result->hasNext()); @@ -127,9 +168,9 @@ TEST_F(ApiTest, PrepareDefaultStructParam) { ASSERT_TRUE(result->hasNext()); checkTuple(result->getNext().get(), "{a: 10}\n"); result = conn->execute(preparedStatement.get(), std::make_pair(std::string("1"), 1)); - ASSERT_FALSE(result->isSuccess()); - ASSERT_STREQ( - result->getErrorMessage().c_str(), "Parameter 1 has data type INT32 but expects STRING."); + ASSERT_TRUE(result->isSuccess()); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "{a: 1}\n"); } TEST_F(ApiTest, PrepareDefaultMapParam) { @@ -170,9 +211,8 @@ TEST_F(ApiTest, ParamTypeError) { conn->prepare("MATCH (a:person) WHERE a.fName STARTS WITH $n RETURN COUNT(*)"); auto result = conn->execute(preparedStatement.get(), std::make_pair(std::string("n"), (int64_t)36)); - ASSERT_FALSE(result->isSuccess()); - ASSERT_STREQ( - "Parameter n has data type INT64 but expects STRING.", result->getErrorMessage().c_str()); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "0\n"); } TEST_F(ApiTest, MultipleExecutionOfPreparedStatement) { @@ -185,3 +225,12 @@ TEST_F(ApiTest, MultipleExecutionOfPreparedStatement) { groundTruth = std::vector{"2|Bob"}; ASSERT_EQ(groundTruth, TestHelper::convertResultToString(*result)); } + +TEST_F(ApiTest, issueTest4) { + auto preparedStatement = conn->prepare("RETURN CAST($1, 'STRING')"); + auto result = conn->execute( + preparedStatement.get(), std::make_pair(std::string("1"), int128_t(-123456789))); + ASSERT_TRUE(result->hasNext()); + checkTuple(result->getNext().get(), "-123456789\n"); + ASSERT_FALSE(result->hasNext()); +} diff --git a/test/test_runner/test_runner.cpp b/test/test_runner/test_runner.cpp index 0f110434235..a9d47a02ae5 100644 --- a/test/test_runner/test_runner.cpp +++ b/test/test_runner/test_runner.cpp @@ -46,9 +46,9 @@ bool TestRunner::testStatement( replaceEnv(statement->query, "AWS_S3_ACCESS_KEY_ID"); replaceEnv(statement->query, "AWS_S3_SECRET_ACCESS_KEY"); replaceEnv(statement->query, "RUN_ID"); - auto parsedStatements = std::vector>(); + auto parsedStatements = std::vector>(); try { - parsedStatements = conn.parseQuery(statement->query); + parsedStatements = conn.getClientContext()->parseQuery(statement->query); } catch (std::exception& exception) { auto errorPreparedStatement = conn.preparedStatementWithError(exception.what()); return checkLogicalPlan(errorPreparedStatement, statement, conn, 0); @@ -63,9 +63,9 @@ bool TestRunner::testStatement( } auto parsedStatement = std::move(parsedStatements[0]); if (statement->encodedJoin.empty()) { - preparedStatement = conn.prepareNoLock(parsedStatement.get(), statement->enumerate); + preparedStatement = conn.prepareNoLock(parsedStatement, statement->enumerate); } else { - preparedStatement = conn.prepareNoLock(parsedStatement.get(), true, statement->encodedJoin); + preparedStatement = conn.prepareNoLock(parsedStatement, true, statement->encodedJoin); } // Check for wrong statements if (!statement->expectedError && !statement->expectedErrorRegex && diff --git a/tools/nodejs_api/test/test_parameter.js b/tools/nodejs_api/test/test_parameter.js index d8ebd9b5f8b..afba5b5b146 100644 --- a/tools/nodejs_api/test/test_parameter.js +++ b/tools/nodejs_api/test/test_parameter.js @@ -266,54 +266,55 @@ describe("UINT8", function () { }); }); -describe("INT128", function () { - it("should transform single-word positive BigInt as INT128 parameter", async function () { - const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); - const queryResult = await conn.execute(preparedStatement, { - 1: BigInt("123456789"), - }); - const result = await queryResult.getAll(); - assert.equal(result[0]["CAST($1, STRING)"], "123456789"); - }); - - it("should transform single-word negative BigInt as INT128 parameter", async function () { - const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); - const queryResult = await conn.execute(preparedStatement, { - 1: BigInt("-123456789"), - }); - const result = await queryResult.getAll(); - assert.equal(result[0]["CAST($1, STRING)"], "-123456789"); - }); - - it("should transform two-word positive BigInt as INT128 parameter", async function () { - const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); - const queryResult = await conn.execute(preparedStatement, { - 1: BigInt("18446744073709551610"), - }); - const result = await queryResult.getAll(); - assert.equal(result[0]["CAST($1, STRING)"], "18446744073709551610"); - }); - - it("should transform two-word negative BigInt as INT128 parameter", async function () { - const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); - const queryResult = await conn.execute(preparedStatement, { - 1: BigInt("-18446744073709551610"), - }); - const result = await queryResult.getAll(); - assert.equal(result[0]["CAST($1, STRING)"], "-18446744073709551610"); - }); - - it("should reject other type as INT128 parameter", async function () { - const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); - try { - await conn.execute(preparedStatement, { - 1: "123456789", - }); - } catch (e) { - assert.equal(e.message, "Expected a BigInt for parameter 1."); - } - }); -}); +//TODO(Chang): fix me +// describe("INT128", function () { +// it("should transform single-word positive BigInt as INT128 parameter", async function () { +// const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); +// const queryResult = await conn.execute(preparedStatement, { +// 1: BigInt("123456789"), +// }); +// const result = await queryResult.getAll(); +// assert.equal(result[0]["CAST($1, STRING)"], "123456789"); +// }); +// +// it("should transform single-word negative BigInt as INT128 parameter", async function () { +// const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); +// const queryResult = await conn.execute(preparedStatement, { +// 1: BigInt("-123456789"), +// }); +// const result = await queryResult.getAll(); +// assert.equal(result[0]["CAST($1, STRING)"], "-123456789"); +// }); +// +// it("should transform two-word positive BigInt as INT128 parameter", async function () { +// const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); +// const queryResult = await conn.execute(preparedStatement, { +// 1: BigInt("18446744073709551610"), +// }); +// const result = await queryResult.getAll(); +// assert.equal(result[0]["CAST($1, STRING)"], "18446744073709551610"); +// }); +// +// it("should transform two-word negative BigInt as INT128 parameter", async function () { +// const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); +// const queryResult = await conn.execute(preparedStatement, { +// 1: BigInt("-18446744073709551610"), +// }); +// const result = await queryResult.getAll(); +// assert.equal(result[0]["CAST($1, STRING)"], "-18446744073709551610"); +// }); +// +// it("should reject other type as INT128 parameter", async function () { +// const preparedStatement = await conn.prepare("RETURN CAST($1, 'STRING')"); +// try { +// await conn.execute(preparedStatement, { +// 1: "123456789", +// }); +// } catch (e) { +// assert.equal(e.message, "Expected a BigInt for parameter 1."); +// } +// }); +// }); describe("DOUBLE", function () { it("should transform number as DOUBLE parameter", async function () { diff --git a/tools/python_api/test/test_parameter.py b/tools/python_api/test/test_parameter.py index f389297eb33..d13d68febcc 100644 --- a/tools/python_api/test/test_parameter.py +++ b/tools/python_api/test/test_parameter.py @@ -156,6 +156,27 @@ def test_param_error3(conn_db_readonly: ConnDB) -> None: with pytest.raises(RuntimeError, match="Parameters must be a dict"): conn.execute("MATCH (a:person) WHERE a.registerTime = $1 RETURN COUNT(*);", [("asd", 1, 1)]) +def test_param(conn_db_readwrite: ConnDB) -> None: + conn, db = conn_db_readwrite + conn.execute("CREATE NODE TABLE NodeOne(id INT64, name STRING, PRIMARY KEY(id));"); + conn.execute("CREATE NODE TABLE NodeTwo(id INT64, name STRING, PRIMARY KEY(id));"); + conn.execute("CREATE Rel TABLE RelA(from NodeOne to NodeOne);"); + conn.execute("CREATE Rel TABLE RelB(from NodeTwo to NodeOne, id int64, name String);"); + conn.execute("CREATE (t: NodeOne {id:1, name: \"Alice\"});"); + conn.execute("CREATE (t: NodeOne {id:2, name: \"Jack\"});"); + conn.execute("CREATE (t: NodeTwo {id:3, name: \"Bob\"});"); + result = conn.execute( + "MATCH (a:NodeOne { id: $a_id })," + "(b:NodeTwo { id: $b_id })," + "(c: NodeOne{ id: $c_id } )" + " MERGE" + " (a)-[:RelA]->(c)," + " (b)-[r:RelB { id: 2, name: $my_param }]->(c)" + " return r.*;", {"a_id": 1, "b_id": 3, "c_id": 2, "my_param": None} + ) + assert result.has_next() + assert result.get_next() == [2, None] + result.close() def test_param_error4(conn_db_readonly: ConnDB) -> None: conn, db = conn_db_readonly diff --git a/tools/rust_api/src/connection.rs b/tools/rust_api/src/connection.rs index a10394fe226..68bae150e07 100644 --- a/tools/rust_api/src/connection.rs +++ b/tools/rust_api/src/connection.rs @@ -258,31 +258,6 @@ Invalid input : expected rule oC_SingleQuery (line: 1, o Ok(()) } - #[test] - fn test_params_invalid_type() -> Result<()> { - let temp_dir = tempfile::tempdir()?; - let db = Database::new(temp_dir.path(), SystemConfig::default())?; - let conn = Connection::new(&db)?; - conn.query("CREATE NODE TABLE Person(name STRING, age INT16, PRIMARY KEY(name));")?; - conn.query("CREATE (:Person {name: 'Alice', age: 25});")?; - conn.query("CREATE (:Person {name: 'Bob', age: 30});")?; - - let mut statement = conn.prepare("MATCH (a:Person) WHERE a.age = $age RETURN a.name;")?; - let result: Error = conn - .execute( - &mut statement, - vec![("age", Value::String("25".to_string()))], - ) - .expect_err("Age should be an int16!") - .into(); - assert_eq!( - result.to_string(), - "Query execution failed: Parameter age has data type STRING but expects INT16." - ); - temp_dir.close()?; - Ok(()) - } - #[test] fn test_multithreaded_single_conn() -> Result<()> { let temp_dir = tempfile::tempdir()?; From 6c82aadd44a3e0470bf9fb073afb110ed98a6df0 Mon Sep 17 00:00:00 2001 From: Maxwell <49460053+mxwli@users.noreply.github.com> Date: Wed, 27 Mar 2024 23:51:41 -0400 Subject: [PATCH 102/136] resolve weird ANY resolution (#3160) --- tools/python_api/src_cpp/py_connection.cpp | 37 +++++++++++---------- tools/python_api/test/test_parameter.py | 38 ++++++++++++++++++---- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 98da99a8907..37f206a4976 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -178,7 +178,12 @@ static std::unordered_map> transformPythonPa static bool canCastPyLogicalType(const LogicalType& from, const LogicalType& to) { // the input of this function is restricted to the output of pyLogicalType - if (from.getLogicalTypeID() == LogicalTypeID::MAP) { + if (from.getLogicalTypeID() == LogicalTypeID::ANY || + from.getLogicalTypeID() == to.getLogicalTypeID()) { + return true; + } else if (to.getLogicalTypeID() == LogicalTypeID::ANY) { + return false; + } else if (from.getLogicalTypeID() == LogicalTypeID::MAP) { if (to.getLogicalTypeID() != LogicalTypeID::MAP) { return false; } @@ -195,9 +200,6 @@ static bool canCastPyLogicalType(const LogicalType& from, const LogicalType& to) } return canCastPyLogicalType( *VarListType::getChildType(&from), *VarListType::getChildType(&to)); - } else if (from.getLogicalTypeID() == LogicalTypeID::ANY || - from.getLogicalTypeID() == to.getLogicalTypeID()) { - return true; } else { auto castCost = function::BuiltInFunctionsUtils::getCastCost( from.getLogicalTypeID(), to.getLogicalTypeID()); @@ -206,24 +208,27 @@ static bool canCastPyLogicalType(const LogicalType& from, const LogicalType& to) return false; } +static void tryConvertPyLogicalType(LogicalType& from, LogicalType& to); + static std::unique_ptr castPyLogicalType(const LogicalType& from, const LogicalType& to) { // assumes from can cast to to if (from.getLogicalTypeID() == LogicalTypeID::MAP) { - auto fromKeyType = MapType::getKeyType(&from), fromValueType = MapType::getValueType(&to); + auto fromKeyType = MapType::getKeyType(&from), fromValueType = MapType::getValueType(&from); auto toKeyType = MapType::getKeyType(&to), toValueType = MapType::getValueType(&to); - auto outputKeyType = canCastPyLogicalType(*fromKeyType, *toKeyType) ? toKeyType : fromKeyType; - auto outputValueType = canCastPyLogicalType(*fromValueType, *toValueType) ? toValueType : fromValueType; - return LogicalType::MAP( - std::make_unique(*outputKeyType), std::make_unique(*outputValueType)); + auto outputKeyType = canCastPyLogicalType(*fromKeyType, *toKeyType) ? + castPyLogicalType(*fromKeyType, *toKeyType) : castPyLogicalType(*toKeyType, *fromKeyType); + auto outputValueType = canCastPyLogicalType(*fromValueType, *toValueType) ? + castPyLogicalType(*fromValueType, *toValueType) : castPyLogicalType(*toValueType, *fromValueType); + return LogicalType::MAP(std::move(outputKeyType), std::move(outputValueType)); } return std::make_unique(to); } -static void tryConvertPyLogicalType(LogicalType& from, LogicalType& to) { +void tryConvertPyLogicalType(LogicalType& from, LogicalType& to) { if (canCastPyLogicalType(from, to)) { from = *castPyLogicalType(from, to); } else if (canCastPyLogicalType(to, from)) { - from = *castPyLogicalType(to, from); + to = *castPyLogicalType(to, from); } else { throw RuntimeException(stringFormat( "Cannot convert Python object to Kuzu value : {} is incompatible with {}", @@ -257,9 +262,6 @@ static std::unique_ptr pyLogicalType(py::handle val) { } else if (py::isinstance(val)) { py::list lst = py::reinterpret_borrow(val); auto childType = LogicalType::ANY(); - if (py::len(lst) == 0) { - childType = LogicalType::STRING(); - } for (auto child : lst) { auto curChildType = pyLogicalType(child); tryConvertPyLogicalType(*childType, *curChildType); @@ -268,10 +270,6 @@ static std::unique_ptr pyLogicalType(py::handle val) { } else if (py::isinstance(val)) { py::dict dict = py::reinterpret_borrow(val); auto childKeyType = LogicalType::ANY(), childValueType = LogicalType::ANY(); - if (py::len(dict) == 0) { - childKeyType = LogicalType::STRING(); - childValueType = LogicalType::STRING(); - } for (auto child : dict) { auto curChildKeyType = pyLogicalType(child.first), curChildValueType = pyLogicalType(child.second); @@ -289,6 +287,9 @@ static std::unique_ptr pyLogicalType(py::handle val) { static Value transformPythonValueAs(py::handle val, const LogicalType* type) { // ignore the type of the actual python object, just directly cast + if (val.is_none()) { + return Value::createNullValue(*type); + } switch (type->getLogicalTypeID()) { case LogicalTypeID::ANY: return Value::createNullValue(); diff --git a/tools/python_api/test/test_parameter.py b/tools/python_api/test/test_parameter.py index d13d68febcc..fa8b0876d0a 100644 --- a/tools/python_api/test/test_parameter.py +++ b/tools/python_api/test/test_parameter.py @@ -97,23 +97,20 @@ def test_string_list_param(conn_db_readonly: ConnDB) -> None: assert result.has_next() assert result.get_next() == [1] assert not result.has_next() - result = conn.execute( - "MATCH (a:person {usedNames: $1}) RETURN COUNT(*);", - {"1": []}) # empty list is string result.close() def test_map_param(tmp_path: Path) -> None: db = kuzu.Database(tmp_path) conn = kuzu.Connection(db) - conn.execute("CREATE NODE TABLE tab(id int64, mp MAP(double, int64), mp2 MAP(int64, double), mp3 MAP(string, string), mp4 MAP(string, string), primary key(id))") + conn.execute("CREATE NODE TABLE tab(id int64, mp MAP(double, int64), mp2 MAP(int64, double), mp3 MAP(string, string), mp4 MAP(string, string)[], primary key(id))") result = conn.execute( "MERGE (t:tab {id: 0, mp: $1, mp2: $2, mp3: $3, mp4: $4}) RETURN t.*", {"1": {1.0: 5, 2: 3, 2.2: -1}, "2": {5: -0.5, 4: 0, 0: 2.2}, "3": {'a': 1, 'b': '2', 'c': '3'}, - "4": {}}) + "4": [{}, {'a': 'b'}]}) assert result.has_next() - assert result.get_next() == [0, {1.0: 5, 2.0: 3, 2.2: -1}, {5: -0.5, 4: -0.0, 0: 2.2}, {'a': '1', 'b': '2', 'c': '3'}, {}] + assert result.get_next() == [0, {1.0: 5, 2.0: 3, 2.2: -1}, {5: -0.5, 4: -0.0, 0: 2.2}, {'a': '1', 'b': '2', 'c': '3'}, [{}, {'a': 'b'}]] assert not result.has_next() result.close() @@ -139,6 +136,35 @@ def test_general_list_param(tmp_path: Path) -> None: assert not result.has_next() result.close() +def test_null_resolution(tmp_path: Path) -> None: + db = kuzu.Database(tmp_path) + conn = kuzu.Connection(db) + conn.execute( + "CREATE NODE TABLE tab(id SERIAL, lst1 INT64[], mp1 MAP(STRING, STRING), nest MAP(STRING, MAP(STRING, INT64))[], PRIMARY KEY(id))") + lst1 = [1, 2, 3, None] + mp1 = {'a': 'x', 'b': 'y', 'c': 'z', 'o': None} + nest = [{'a': {'foo' : 1, 'bar' : 2}}, {1: {}}] + result = conn.execute( + "MERGE (t:tab {lst1: $1, mp1: $2, nest: $3}) RETURN t.*", + {'1': lst1, '2': mp1, '3': nest}) + assert result.has_next() + assert result.get_next() == [0, lst1, mp1, [{'a': {'foo' : 1, 'bar' : 2}}, {'1': {}}]] + assert not result.has_next() + result.close() + +# def test_param_empty(tmp_path: Path) -> None: +# db = kuzu.Database(tmp_path) +# conn = kuzu.Connection(db) +# lst = [[]] +# result = conn.execute("CREATE NODE TABLE tab(id SERIAL, lst INT64[][], PRIMARY KEY(id))") +# result = conn.execute( +# "MERGE (t:tab {lst: $1}) RETURN t.*", +# {'1': lst}) +# assert result.has_next() +# assert result.get_next == [0, lst] +# assert not result.has_next() +# result.close() + def test_param_error1(conn_db_readonly: ConnDB) -> None: conn, db = conn_db_readonly with pytest.raises(RuntimeError, match="Parameter name must be of type string but got "): From 20bde3a0d1a560db9ae60a995fd63cb7191581fb Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Thu, 28 Mar 2024 00:01:20 -0400 Subject: [PATCH 103/136] fix export test (#3164) --- test/test_files/copy/export_import_db.test | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_files/copy/export_import_db.test b/test/test_files/copy/export_import_db.test index e4690ab4d93..23b2d1275ca 100644 --- a/test/test_files/copy/export_import_db.test +++ b/test/test_files/copy/export_import_db.test @@ -44,10 +44,10 @@ Binder exception: Directory ${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db2 already exists. -CASE ExportImportDatabaseWithPARQUET --STATEMENT Export Database "${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db3" (format='parquet') +-STATEMENT Export Database "${KUZU_EXPORT_DB_DIRECTORY}_case4/demo-db3" (format='parquet') ---- ok --IMPORT_DATABASE "${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db3" --STATEMENT IMPORT DATABASE "${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db3" +-IMPORT_DATABASE "${KUZU_EXPORT_DB_DIRECTORY}_case4/demo-db3" +-STATEMENT IMPORT DATABASE "${KUZU_EXPORT_DB_DIRECTORY}_case4/demo-db3" ---- ok -STATEMENT MATCH (u:User) WHERE u.name = 'Adam' SET u.age = 50 ---- ok From 956b3e3284ccce65080546f20d1910ec8ce365d6 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Thu, 28 Mar 2024 00:33:42 -0400 Subject: [PATCH 104/136] Implement initcap/concat functions (#3161) --- src/function/base_lower_upper_operation.cpp | 33 +++++---- src/function/function_collection.cpp | 1 + src/function/vector_arithmetic_functions.cpp | 5 +- src/function/vector_string_functions.cpp | 69 +++++++++++++------ src/include/common/types/ku_string.h | 4 ++ .../functions/base_lower_upper_function.h | 2 + .../string/functions/concat_function.h | 35 ---------- .../string/functions/initcap_function.h | 19 +++++ .../function/string/vector_string_functions.h | 9 +++ test/main/udf_test.cpp | 20 +++++- test/test_files/tinysnb/function/string.test | 42 +++++++++++ 11 files changed, 162 insertions(+), 77 deletions(-) delete mode 100644 src/include/function/string/functions/concat_function.h create mode 100644 src/include/function/string/functions/initcap_function.h diff --git a/src/function/base_lower_upper_operation.cpp b/src/function/base_lower_upper_operation.cpp index 5c1aec00894..42b78028b68 100644 --- a/src/function/base_lower_upper_operation.cpp +++ b/src/function/base_lower_upper_operation.cpp @@ -39,22 +39,27 @@ uint32_t BaseLowerUpperFunction::getResultLen(char* inputStr, uint32_t inputLen, return outputLength; } +uint64_t BaseLowerUpperFunction::convertCharCase( + char* result, const char* input, int32_t charPos, bool toUpper) { + if (input[charPos] & 0x80) { + int size = 0u, newSize = 0u; + auto codepoint = utf8proc_codepoint(input + charPos, size); + KU_ASSERT(codepoint >= 0); // Validity ensured by getResultLen. + int convertedCodepoint = + toUpper ? utf8proc_toupper(codepoint) : utf8proc_tolower(codepoint); + utf8proc_codepoint_to_utf8(convertedCodepoint, newSize, result); + return size; + } else { + *result = toUpper ? toupper(input[charPos]) : tolower(input[charPos]); + return 1; + } +} + void BaseLowerUpperFunction::convertCase(char* result, uint32_t len, char* input, bool toUpper) { for (auto i = 0u; i < len;) { - if (input[i] & 0x80) { - int size = 0, newSize = 0; - int codepoint = utf8proc_codepoint(input + i, size); - KU_ASSERT(codepoint >= 0); // Validity ensured by getResultLen. - int convertedCodepoint = - toUpper ? utf8proc_toupper(codepoint) : utf8proc_tolower(codepoint); - utf8proc_codepoint_to_utf8(convertedCodepoint, newSize, result); - result += newSize; - i += size; - } else { - *result = toUpper ? toupper(input[i]) : tolower(input[i]); - i++; - result++; - } + auto charWidth = convertCharCase(result, input, i, toUpper); + i += charWidth; + result += charWidth; } } diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index 9ed8ba2c689..ffaad9d5daa 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -74,6 +74,7 @@ FunctionCollection* FunctionCollection::getFunctions() { SCALAR_FUNCTION(RegexpFullMatchFunction), SCALAR_FUNCTION(RegexpMatchesFunction), SCALAR_FUNCTION(RegexpReplaceFunction), SCALAR_FUNCTION(RegexpExtractFunction), SCALAR_FUNCTION(RegexpExtractAllFunction), SCALAR_FUNCTION(LevenshteinFunction), + SCALAR_FUNCTION(InitcapFunction), // Array Functions SCALAR_FUNCTION(ArrayValueFunction), SCALAR_FUNCTION(ArrayCrossProductFunction), diff --git a/src/function/vector_arithmetic_functions.cpp b/src/function/vector_arithmetic_functions.cpp index f3e8e132b29..c90e614c96f 100644 --- a/src/function/vector_arithmetic_functions.cpp +++ b/src/function/vector_arithmetic_functions.cpp @@ -15,7 +15,7 @@ #include "function/list/functions/list_concat_function.h" #include "function/list/vector_list_functions.h" #include "function/scalar_function.h" -#include "function/string/functions/concat_function.h" +#include "function/string/vector_string_functions.h" using namespace kuzu::common; @@ -155,8 +155,7 @@ function_set AddFunction::getFunctionSet() { // string + string -> string result.push_back(std::make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, - LogicalTypeID::STRING, - ScalarFunction::BinaryStringExecFunction)); + LogicalTypeID::STRING, ConcatFunction::execFunc)); // interval + interval → interval result.push_back(getBinaryFunction( name, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); diff --git a/src/function/vector_string_functions.cpp b/src/function/vector_string_functions.cpp index 5e9d6962768..4e44b326ed4 100644 --- a/src/function/vector_string_functions.cpp +++ b/src/function/vector_string_functions.cpp @@ -1,9 +1,9 @@ #include "function/string/vector_string_functions.h" #include "function/string/functions/array_extract_function.h" -#include "function/string/functions/concat_function.h" #include "function/string/functions/contains_function.h" #include "function/string/functions/ends_with_function.h" +#include "function/string/functions/initcap_function.h" #include "function/string/functions/left_operation.h" #include "function/string/functions/levenshtein_function.h" #include "function/string/functions/lpad_function.h" @@ -52,22 +52,6 @@ void BaseStrOperation::operation(ku_string_t& input, ku_string_t& result, } } -void Concat::concat(const char* left, uint32_t leftLen, const char* right, uint32_t rightLen, - ku_string_t& result, ValueVector& resultValueVector) { - auto len = leftLen + rightLen; - if (len <= ku_string_t::SHORT_STR_LENGTH /* concat result is short */) { - memcpy(result.prefix, left, leftLen); - memcpy(result.prefix + leftLen, right, rightLen); - } else { - StringVector::reserveString(&resultValueVector, result, len); - auto buffer = reinterpret_cast(result.overflowPtr); - memcpy(buffer, left, leftLen); - memcpy(buffer + leftLen, right, rightLen); - memcpy(result.prefix, buffer, ku_string_t::PREFIX_LENGTH); - } - result.len = len; -} - void Repeat::operation( ku_string_t& left, int64_t& right, ku_string_t& result, ValueVector& resultValueVector) { result.len = left.len * right; @@ -121,13 +105,45 @@ function_set ArrayExtractFunction::getFunctionSet() { return functionSet; } +void ConcatFunction::execFunc(const std::vector>& parameters, + ValueVector& result, void* /*dataPtr*/) { + result.resetAuxiliaryBuffer(); + for (auto selectedPos = 0u; selectedPos < result.state->selVector->selectedSize; + ++selectedPos) { + auto pos = result.state->selVector->selectedPositions[selectedPos]; + auto strLen = 0u; + for (auto i = 0u; i < parameters.size(); i++) { + const auto& parameter = parameters[i]; + auto paramPos = parameter->state->isFlat() ? + parameter->state->selVector->selectedPositions[0] : + pos; + strLen += parameter->getValue(paramPos).len; + } + auto& resultStr = result.getValue(pos); + StringVector::reserveString(&result, resultStr, strLen); + auto dstData = strLen <= ku_string_t::SHORT_STR_LENGTH ? + resultStr.prefix : + reinterpret_cast(resultStr.overflowPtr); + for (auto i = 0u; i < parameters.size(); i++) { + const auto& parameter = parameters[i]; + auto paramPos = parameter->state->isFlat() ? + parameter->state->selVector->selectedPositions[0] : + pos; + auto srcStr = parameter->getValue(paramPos); + memcpy(dstData, srcStr.getData(), srcStr.len); + dstData += srcStr.len; + } + if (strLen > ku_string_t::SHORT_STR_LENGTH) { + memcpy(resultStr.prefix, resultStr.getData(), ku_string_t::PREFIX_LENGTH); + } + } +} + function_set ConcatFunction::getFunctionSet() { function_set functionSet; - functionSet.emplace_back(make_unique(name, - std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, - LogicalTypeID::STRING, - ScalarFunction::BinaryStringExecFunction, - false /* isVarLength */)); + functionSet.emplace_back( + make_unique(name, std::vector{LogicalTypeID::STRING}, + LogicalTypeID::STRING, execFunc, true /* isVarLength */)); return functionSet; } @@ -317,5 +333,14 @@ function_set LevenshteinFunction::getFunctionSet() { return functionSet; } +function_set InitcapFunction::getFunctionSet() { + function_set functionSet; + functionSet.emplace_back(make_unique(name, + std::vector{LogicalTypeID::STRING}, LogicalTypeID::STRING, + ScalarFunction::UnaryStringExecFunction, nullptr, + nullptr, false /* isVarLength */)); + return functionSet; +} + } // namespace function } // namespace kuzu diff --git a/src/include/common/types/ku_string.h b/src/include/common/types/ku_string.h index 7bc58a48e32..72594d3d5a4 100644 --- a/src/include/common/types/ku_string.h +++ b/src/include/common/types/ku_string.h @@ -31,6 +31,10 @@ struct KUZU_API ku_string_t { return isShortString(len) ? prefix : reinterpret_cast(overflowPtr); } + uint8_t* getDataUnsafe() { + return isShortString(len) ? prefix : reinterpret_cast(overflowPtr); + } + // These functions do *NOT* allocate/resize the overflow buffer, it only copies the content and // set the length. void set(const std::string& value); diff --git a/src/include/function/string/functions/base_lower_upper_function.h b/src/include/function/string/functions/base_lower_upper_function.h index a26df11aad2..e5b38af7389 100644 --- a/src/include/function/string/functions/base_lower_upper_function.h +++ b/src/include/function/string/functions/base_lower_upper_function.h @@ -12,6 +12,8 @@ struct BaseLowerUpperFunction { KUZU_API static void operation(common::ku_string_t& input, common::ku_string_t& result, common::ValueVector& resultValueVector, bool isUpper); + static uint64_t convertCharCase(char* result, const char* input, int32_t charPos, bool toUpper); + private: static uint32_t getResultLen(char* inputStr, uint32_t inputLen, bool isUpper); static void convertCase(char* result, uint32_t len, char* input, bool toUpper); diff --git a/src/include/function/string/functions/concat_function.h b/src/include/function/string/functions/concat_function.h deleted file mode 100644 index 337f83fe9d0..00000000000 --- a/src/include/function/string/functions/concat_function.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "common/api.h" -#include "common/types/ku_string.h" -#include "common/vector/value_vector.h" - -namespace kuzu { -namespace function { - -struct Concat { - template - static inline void operation( - A& /*left*/, B& /*right*/, R& /*result*/, common::ValueVector& /*valueVector*/) { - KU_UNREACHABLE; - } - - KUZU_API static void concat(const char* left, uint32_t leftLen, const char* right, - uint32_t rightLen, common::ku_string_t& result, common::ValueVector& resultValueVector); -}; - -template<> -inline void Concat::operation(common::ku_string_t& left, common::ku_string_t& right, - common::ku_string_t& result, common::ValueVector& resultValueVector) { - concat((const char*)left.getData(), left.len, (const char*)right.getData(), right.len, result, - resultValueVector); -} - -template<> -inline void Concat::operation(std::string& left, std::string& right, common::ku_string_t& result, - common::ValueVector& resultValueVector) { - concat(left.c_str(), left.length(), right.c_str(), right.length(), result, resultValueVector); -} - -} // namespace function -} // namespace kuzu diff --git a/src/include/function/string/functions/initcap_function.h b/src/include/function/string/functions/initcap_function.h new file mode 100644 index 00000000000..3d9b443b3fd --- /dev/null +++ b/src/include/function/string/functions/initcap_function.h @@ -0,0 +1,19 @@ +#pragma once + +#include "base_lower_upper_function.h" +#include "lower_function.h" + +namespace kuzu { +namespace function { + +struct Initcap { + static void operation(common::ku_string_t& operand, common::ku_string_t& result, + common::ValueVector& resultVector) { + Lower::operation(operand, result, resultVector); + BaseLowerUpperFunction::convertCharCase(reinterpret_cast(result.getDataUnsafe()), + reinterpret_cast(result.getData()), 0 /* charPos */, true /* toUpper */); + } +}; + +} // namespace function +} // namespace kuzu diff --git a/src/include/function/string/vector_string_functions.h b/src/include/function/string/vector_string_functions.h index 81dfc9b514a..d19d98076d1 100644 --- a/src/include/function/string/vector_string_functions.h +++ b/src/include/function/string/vector_string_functions.h @@ -34,6 +34,9 @@ struct ArrayExtractFunction { struct ConcatFunction : public VectorStringFunction { static constexpr const char* name = "CONCAT"; + static void execFunc(const std::vector>& parameters, + common::ValueVector& result, void* /*dataPtr*/); + static function_set getFunctionSet(); }; @@ -175,5 +178,11 @@ struct LevenshteinFunction : public VectorStringFunction { static function_set getFunctionSet(); }; +struct InitcapFunction : public VectorStringFunction { + static constexpr const char* name = "INITCAP"; + + static function_set getFunctionSet(); +}; + } // namespace function } // namespace kuzu diff --git a/test/main/udf_test.cpp b/test/main/udf_test.cpp index b29d15391fd..e2e7e8a2db1 100644 --- a/test/main/udf_test.cpp +++ b/test/main/udf_test.cpp @@ -1,4 +1,3 @@ -#include "function/string/functions/concat_function.h" #include "main_test_helper/main_test_helper.h" using namespace kuzu::common; @@ -294,14 +293,29 @@ TEST_F(ApiTest, vectorizedBinaryAddDate) { sortAndCheckTestResults(actualResult, expectedResult); } +static void concat(const ku_string_t& left, const ku_string_t& right, ku_string_t& result, + ValueVector& resultValueVector) { + result.len = left.len + right.len; + if (result.len <= ku_string_t::SHORT_STR_LENGTH /* concat result is short */) { + memcpy(result.prefix, left.getData(), left.len); + memcpy(result.prefix + left.len, right.getData(), right.len); + } else { + StringVector::reserveString(&resultValueVector, result, result.len); + auto buffer = reinterpret_cast(result.overflowPtr); + memcpy(buffer, left.getData(), left.len); + memcpy(buffer + left.len, right.getData(), right.len); + memcpy(result.prefix, buffer, ku_string_t::PREFIX_LENGTH); + } +} + struct ConditionalConcat { static inline void operation( ku_string_t& a, bool& b, ku_string_t& c, ku_string_t& result, ValueVector& resultVector) { // Concat a,c if b is true, otherwise concat c,a. if (b) { - function::Concat::operation(a, c, result, resultVector); + concat(a, c, result, resultVector); } else { - function::Concat::operation(c, a, result, resultVector); + concat(c, a, result, resultVector); } } }; diff --git a/test/test_files/tinysnb/function/string.test b/test/test_files/tinysnb/function/string.test index f52449f78e2..39e87705a8f 100644 --- a/test/test_files/tinysnb/function/string.test +++ b/test/test_files/tinysnb/function/string.test @@ -627,3 +627,45 @@ hellolongstringtest -STATEMENT return levenshtein('horse', 'ros'); ---- 1 3 + +-LOG ConcatMultipleStrings +-STATEMENT match (p:person) return concat("name: ", p.fName, ' ,age: ', "5"); +---- 8 +name: Alice ,age: 5 +name: Bob ,age: 5 +name: Carol ,age: 5 +name: Dan ,age: 5 +name: Elizabeth ,age: 5 +name: Farooq ,age: 5 +name: Greg ,age: 5 +name: Hubert Blaine Wolfeschlegelsteinhausenbergerdorff ,age: 5 +-STATEMENT match (p:person)-[:knows]->(p1:person) return concat("From: ", p.fName, ', To: ', p1.fName); +---- 14 +From: Alice, To: Bob +From: Alice, To: Carol +From: Alice, To: Dan +From: Bob, To: Alice +From: Bob, To: Carol +From: Bob, To: Dan +From: Carol, To: Alice +From: Carol, To: Bob +From: Carol, To: Dan +From: Dan, To: Alice +From: Dan, To: Bob +From: Dan, To: Carol +From: Elizabeth, To: Farooq +From: Elizabeth, To: Greg + +-LOG InitCapStrings +-STATEMENT match (o:organisation) return initcap(o.name); +---- 3 +Abfsuni +Cswork +Deswork + +-LOG InitCapUTF8String +-STATEMENT match (m:movies) return initcap(m.name); +---- 3 +Sóló cón tu párejâ +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie +Roma From 2ec13b2f2ea4e08f89d100baeb9f40a6f502e6e9 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Thu, 28 Mar 2024 05:26:35 -0400 Subject: [PATCH 105/136] Fix issue 3070: Support extend from unwind node (#3153) --- src/binder/CMakeLists.txt | 1 + src/binder/bind/bind_graph_pattern.cpp | 55 +++++++++----- src/binder/bind/bind_projection_clause.cpp | 20 ++--- src/binder/bind/bind_query.cpp | 2 +- src/binder/bind/bind_reading_clause.cpp | 17 +++-- src/binder/bind/bind_updating_clause.cpp | 39 ++++++---- .../bind_function_expression.cpp | 18 ++--- .../bind_property_expression.cpp | 7 ++ .../bind_variable_expression.cpp | 4 +- src/binder/binder.cpp | 12 +-- src/binder/binder_scope.cpp | 18 +++++ src/binder/expression_binder.cpp | 8 ++ src/binder/query/query_graph.cpp | 27 +++++-- src/include/binder/binder.h | 51 ++----------- src/include/binder/binder_scope.h | 66 ++++++++++++++++ .../binder/expression/node_expression.h | 4 +- src/include/binder/expression_binder.h | 4 +- src/include/binder/query/query_graph.h | 3 + .../reading_clause/bound_unwind_clause.h | 12 ++- src/include/common/types/types.h | 1 + .../query/reading_clause/unwind_clause.h | 6 +- src/include/planner/operator/logical_unwind.h | 26 +++---- src/include/processor/operator/unwind.h | 13 ++-- .../projection_push_down_optimizer.cpp | 2 +- src/planner/operator/logical_unwind.cpp | 15 +++- src/planner/plan/append_unwind.cpp | 10 ++- src/planner/plan/plan_subquery.cpp | 2 +- src/processor/map/map_unwind.cpp | 13 ++-- src/processor/operator/scan_node_id.cpp | 3 +- src/processor/operator/unwind.cpp | 11 +++ test/test_files/issue/issue.test | 1 - test/test_files/tinysnb/unwind/unwind.test | 4 +- .../tinysnb/unwind/unwind_list_node.test | 75 +++++++++++++++++++ 33 files changed, 385 insertions(+), 165 deletions(-) create mode 100644 src/binder/binder_scope.cpp create mode 100644 src/include/binder/binder_scope.h create mode 100644 test/test_files/tinysnb/unwind/unwind_list_node.test diff --git a/src/binder/CMakeLists.txt b/src/binder/CMakeLists.txt index 5cc5bd577e8..3b767103224 100644 --- a/src/binder/CMakeLists.txt +++ b/src/binder/CMakeLists.txt @@ -8,6 +8,7 @@ add_subdirectory(visitor) add_library(kuzu_binder OBJECT binder.cpp + binder_scope.cpp bound_statement_result.cpp bound_statement_rewriter.cpp bound_statement_visitor.cpp diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index 0343ba490e3..839e9388188 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -56,7 +56,7 @@ QueryGraph Binder::bindPatternElement(const PatternElement& patternElement) { if (patternElement.hasPathName()) { auto pathName = patternElement.getPathName(); auto pathExpression = createPath(pathName, nodeAndRels); - scope->addExpression(pathName, pathExpression); + scope.addExpression(pathName, pathExpression); } return queryGraph; } @@ -172,8 +172,8 @@ std::shared_ptr Binder::bindQueryRel(const RelPattern& relPattern const std::shared_ptr& leftNode, const std::shared_ptr& rightNode, QueryGraph& queryGraph) { auto parsedName = relPattern.getVariableName(); - if (scope->contains(parsedName)) { - auto prevVariable = scope->getExpression(parsedName); + if (scope.contains(parsedName)) { + auto prevVariable = scope.getExpression(parsedName); auto expectedDataType = QueryRelTypeUtils::isRecursive(relPattern.getRelType()) ? LogicalTypeID::RECURSIVE_REL : LogicalTypeID::REL; @@ -224,7 +224,7 @@ std::shared_ptr Binder::bindQueryRel(const RelPattern& relPattern } queryRel->setAlias(parsedName); if (!parsedName.empty()) { - scope->addExpression(parsedName, queryRel); + scope.addExpression(parsedName, queryRel); } queryGraph.addQueryRel(queryRel); return queryRel; @@ -336,11 +336,11 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel } auto recursivePatternInfo = relPattern.getRecursiveInfo(); auto prevScope = saveScope(); - scope->clear(); + scope.clear(); // Bind intermediate node. auto node = createQueryNode(recursivePatternInfo->nodeName, std::vector{nodeTableIDs.begin(), nodeTableIDs.end()}); - scope->addExpression(node->toString(), node); + scope.addExpression(node->toString(), node); std::vector nodeFields; nodeFields.emplace_back(InternalKeyword::ID, node->getInternalID()->getDataType().copy()); nodeFields.emplace_back( @@ -363,7 +363,7 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel // Bind intermediate rel auto rel = createNonRecursiveQueryRel( recursivePatternInfo->relName, tableIDs, nullptr, nullptr, directionType); - scope->addExpression(rel->toString(), rel); + scope.addExpression(rel->toString(), rel); expression_vector relProjectionList; if (!recursivePatternInfo->hasProjection) { for (auto& expression : rel->getPropertyExprsRef()) { @@ -493,27 +493,42 @@ void Binder::bindQueryRelProperties(RelExpression& rel) { } } +static std::unique_ptr createInternalNodeIDExpression(const NodeExpression& node) { + std::unordered_map propertyIDPerTable; + for (auto tableID : node.getTableIDs()) { + propertyIDPerTable.insert({tableID, INVALID_PROPERTY_ID}); + } + return std::make_unique(*LogicalType::INTERNAL_ID(), InternalKeyword::ID, + node.getUniqueName(), node.getVariableName(), std::move(propertyIDPerTable), + false /* isPrimaryKey */); +} + std::shared_ptr Binder::bindQueryNode( const NodePattern& nodePattern, QueryGraph& queryGraph) { auto parsedName = nodePattern.getVariableName(); std::shared_ptr queryNode; - if (scope->contains(parsedName)) { // bind to node in scope - auto prevVariable = scope->getExpression(parsedName); + if (scope.contains(parsedName)) { // bind to node in scope + auto prevVariable = scope.getExpression(parsedName); if (!ExpressionUtil::isNodePattern(*prevVariable)) { - throw BinderException(stringFormat("Cannot bind {} as node pattern.", parsedName)); - } - queryNode = static_pointer_cast(prevVariable); - // E.g. MATCH (a:person) MATCH (a:organisation) - // We bind to a single node with both labels - if (!nodePattern.getTableNames().empty()) { - auto otherTableIDs = bindTableIDs(nodePattern.getTableNames(), true); - auto otherNodeTableIDs = getNodeTableIDs(otherTableIDs); - queryNode->addTableIDs(otherNodeTableIDs); + if (!scope.hasNodeReplacement(parsedName)) { + throw BinderException(stringFormat("Cannot bind {} as node pattern.", parsedName)); + } + queryNode = scope.getNodeReplacement(parsedName); + queryNode->addPropertyDataExpr(InternalKeyword::ID, queryNode->getInternalID()); + } else { + queryNode = std::static_pointer_cast(prevVariable); + // E.g. MATCH (a:person) MATCH (a:organisation) + // We bind to a single node with both labels + if (!nodePattern.getTableNames().empty()) { + auto otherTableIDs = bindTableIDs(nodePattern.getTableNames(), true); + auto otherNodeTableIDs = getNodeTableIDs(otherTableIDs); + queryNode->addTableIDs(otherNodeTableIDs); + } } } else { queryNode = createQueryNode(nodePattern); if (!parsedName.empty()) { - scope->addExpression(parsedName, queryNode); + scope.addExpression(parsedName, queryNode); } } for (auto& [propertyName, rhs] : nodePattern.getPropertyKeyVals()) { @@ -540,7 +555,7 @@ std::shared_ptr Binder::createQueryNode( std::vector fieldNames; std::vector> fieldTypes; // Bind internal expressions - queryNode->setInternalID(expressionBinder.createInternalNodeIDExpression(*queryNode)); + queryNode->setInternalID(createInternalNodeIDExpression(*queryNode)); queryNode->setLabelExpression(expressionBinder.bindLabelFunction(*queryNode)); fieldNames.emplace_back(InternalKeyword::ID); fieldNames.emplace_back(InternalKeyword::LABEL); diff --git a/src/binder/bind/bind_projection_clause.cpp b/src/binder/bind/bind_projection_clause.cpp index 5bb71c68b94..a23cc05009f 100644 --- a/src/binder/bind/bind_projection_clause.cpp +++ b/src/binder/bind/bind_projection_clause.cpp @@ -54,7 +54,7 @@ BoundWithClause Binder::bindWithClause(const WithClause& withClause) { auto boundProjectionBody = bindProjectionBody(*projectionBody, rewriteProjectionInWithClause(projectionExpressions)); validateOrderByFollowedBySkipOrLimitInWithClause(boundProjectionBody); - scope->clear(); + scope.clear(); addExpressionsToScope(projectionExpressions); auto boundWithClause = BoundWithClause(std::move(boundProjectionBody)); if (withClause.hasWhereExpression()) { @@ -76,8 +76,8 @@ BoundReturnClause Binder::bindReturnClause(const ReturnClause& returnClause) { } static bool isAggregateExpression( - const std::shared_ptr& expression, BinderScope* scope) { - if (expression->hasAlias() && scope->contains(expression->getAlias())) { + const std::shared_ptr& expression, const BinderScope& scope) { + if (expression->hasAlias() && scope.contains(expression->getAlias())) { return false; } if (expression->expressionType == ExpressionType::AGGREGATE_FUNCTION) { @@ -92,9 +92,9 @@ static bool isAggregateExpression( } static expression_vector getAggregateExpressions( - const std::shared_ptr& expression, BinderScope* scope) { + const std::shared_ptr& expression, const BinderScope& scope) { expression_vector result; - if (expression->hasAlias() && scope->contains(expression->getAlias())) { + if (expression->hasAlias() && scope.contains(expression->getAlias())) { return result; } if (expression->expressionType == ExpressionType::AGGREGATE_FUNCTION) { @@ -117,8 +117,8 @@ BoundProjectionBody Binder::bindProjectionBody( expression_vector groupByExpressions; expression_vector aggregateExpressions; for (auto& expression : projectionExpressions) { - if (isAggregateExpression(expression, scope.get())) { - for (auto& agg : getAggregateExpressions(expression, scope.get())) { + if (isAggregateExpression(expression, scope)) { + for (auto& agg : getAggregateExpressions(expression, scope)) { aggregateExpressions.push_back(agg); } } else { @@ -186,11 +186,11 @@ expression_vector Binder::bindProjectionExpressions( for (auto& expression : projectionExpressions) { if (expression->getExpressionType() == ExpressionType::STAR) { // Rewrite star expression as all expression in scope. - if (scope->empty()) { + if (scope.empty()) { throw BinderException( "RETURN or WITH * is not allowed when there are no variables in scope."); } - for (auto& expr : scope->getExpressions()) { + for (auto& expr : scope.getExpressions()) { result.push_back(expr); } } else if (expression->getExpressionType() == ExpressionType::PROPERTY) { @@ -258,7 +258,7 @@ void Binder::addExpressionsToScope(const expression_vector& projectionExpression for (auto& expression : projectionExpressions) { // In RETURN clause, if expression is not aliased, its input name will serve its alias. auto alias = expression->hasAlias() ? expression->getAlias() : expression->toString(); - scope->addExpression(alias, expression); + scope.addExpression(alias, expression); } } diff --git a/src/binder/bind/bind_query.cpp b/src/binder/bind/bind_query.cpp index 9873a8fc54e..586477bcf30 100644 --- a/src/binder/bind/bind_query.cpp +++ b/src/binder/bind/bind_query.cpp @@ -45,7 +45,7 @@ std::unique_ptr Binder::bindQuery(const RegularQuery& regular for (auto i = 0u; i < regularQuery.getNumSingleQueries(); i++) { // Don't clear scope within bindSingleQuery() yet because it is also used for subquery // binding. - scope->clear(); + scope.clear(); normalizedSingleQueries.push_back(bindSingleQuery(*regularQuery.getSingleQuery(i))); } validateUnionColumnsOfTheSameType(normalizedSingleQueries); diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index 89229162000..2ea4508c7f0 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -104,11 +104,18 @@ void Binder::rewriteMatchPattern(BoundGraphPattern& boundGraphPattern) { std::unique_ptr Binder::bindUnwindClause(const ReadingClause& readingClause) { auto& unwindClause = ku_dynamic_cast(readingClause); auto boundExpression = expressionBinder.bindExpression(*unwindClause.getExpression()); - boundExpression = - ExpressionBinder::implicitCastIfNecessary(boundExpression, LogicalTypeID::VAR_LIST); - auto aliasExpression = createVariable( - unwindClause.getAlias(), *VarListType::getChildType(&boundExpression->dataType)); - return make_unique(std::move(boundExpression), std::move(aliasExpression)); + ExpressionBinder::validateDataType(*boundExpression, LogicalTypeID::VAR_LIST); + auto aliasName = unwindClause.getAlias(); + auto alias = createVariable(aliasName, *VarListType::getChildType(&boundExpression->dataType)); + std::shared_ptr idExpr = nullptr; + if (scope.hasMemorizedTableIDs(boundExpression->getAlias())) { + auto tableIDs = scope.getMemorizedTableIDs(boundExpression->getAlias()); + auto node = createQueryNode(aliasName, tableIDs); + idExpr = node->getInternalID(); + scope.addNodeReplacement(node); + } + return make_unique( + std::move(boundExpression), std::move(alias), std::move(idExpr)); } std::unique_ptr Binder::bindInQueryCall(const ReadingClause& readingClause) { diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index 2e34094660b..6a9ed375bde 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -46,12 +46,16 @@ std::unique_ptr Binder::bindUpdatingClause( } } -static expression_set populateNodeRelScope(const BinderScope& scope) { - expression_set result; +static std::unordered_set populatePatternsScope(const BinderScope& scope) { + std::unordered_set result; for (auto& expression : scope.getExpressions()) { if (ExpressionUtil::isNodePattern(*expression) || ExpressionUtil::isRelPattern(*expression)) { - result.insert(expression); + result.insert(expression->toString()); + } else if (expression->expressionType == ExpressionType::VARIABLE) { + if (scope.hasNodeReplacement(expression->toString())) { + result.insert(expression->toString()); + } } } return result; @@ -60,21 +64,21 @@ static expression_set populateNodeRelScope(const BinderScope& scope) { std::unique_ptr Binder::bindInsertClause( const UpdatingClause& updatingClause) { auto& insertClause = (InsertClause&)updatingClause; - auto nodeRelScope = populateNodeRelScope(*scope); + auto patternsScope = populatePatternsScope(scope); // bindGraphPattern will update scope. auto boundGraphPattern = bindGraphPattern(insertClause.getPatternElementsRef()); - auto insertInfos = bindInsertInfos(boundGraphPattern.queryGraphCollection, nodeRelScope); + auto insertInfos = bindInsertInfos(boundGraphPattern.queryGraphCollection, patternsScope); return std::make_unique(std::move(insertInfos)); } std::unique_ptr Binder::bindMergeClause( const parser::UpdatingClause& updatingClause) { auto& mergeClause = (MergeClause&)updatingClause; - auto nodeRelScope = populateNodeRelScope(*scope); + auto patternsScope = populatePatternsScope(scope); // bindGraphPattern will update scope. auto boundGraphPattern = bindGraphPattern(mergeClause.getPatternElementsRef()); rewriteMatchPattern(boundGraphPattern); - auto createInfos = bindInsertInfos(boundGraphPattern.queryGraphCollection, nodeRelScope); + auto createInfos = bindInsertInfos(boundGraphPattern.queryGraphCollection, patternsScope); auto boundMergeClause = std::make_unique(std::move(boundGraphPattern.queryGraphCollection), std::move(boundGraphPattern.where), std::move(createInfos)); @@ -94,8 +98,9 @@ std::unique_ptr Binder::bindMergeClause( } std::vector Binder::bindInsertInfos( - const QueryGraphCollection& queryGraphCollection, const expression_set& nodeRelScope_) { - auto nodeRelScope = nodeRelScope_; + const QueryGraphCollection& queryGraphCollection, + const std::unordered_set& patternsInScope_) { + auto patternsInScope = patternsInScope_; std::vector result; auto analyzer = QueryGraphLabelAnalyzer(*clientContext); for (auto i = 0u; i < queryGraphCollection.getNumQueryGraphs(); ++i) { @@ -104,18 +109,26 @@ std::vector Binder::bindInsertInfos( analyzer.pruneLabel(*queryGraph); for (auto j = 0u; j < queryGraph->getNumQueryNodes(); ++j) { auto node = queryGraph->getQueryNode(j); - if (nodeRelScope.contains(node)) { + if (node->getVariableName().empty()) { // Always create anonymous node. + bindInsertNode(node, result); + continue; + } + if (patternsInScope.contains(node->getVariableName())) { continue; } - nodeRelScope.insert(node); + patternsInScope.insert(node->getVariableName()); bindInsertNode(node, result); } for (auto j = 0u; j < queryGraph->getNumQueryRels(); ++j) { auto rel = queryGraph->getQueryRel(j); - if (nodeRelScope.contains(rel)) { + if (rel->getVariableName().empty()) { // Always create anonymous rel. + bindInsertRel(rel, result); + continue; + } + if (patternsInScope.contains(rel->getVariableName())) { continue; } - nodeRelScope.insert(rel); + patternsInScope.insert(rel->getVariableName()); bindInsertRel(rel, result); } } diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index 3e349a47d15..af4a41e9615 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -4,6 +4,7 @@ #include "binder/expression/property_expression.h" #include "binder/expression_binder.h" #include "common/exception/binder.h" +#include "function/aggregate/collect.h" #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/cast/vector_cast_functions.h" #include "function/path/vector_path_functions.h" @@ -140,6 +141,11 @@ std::shared_ptr ExpressionBinder::bindAggregateFunctionExpression( if (function->paramRewriteFunc) { function->paramRewriteFunc(children); } + if (functionName == CollectFunction::name && parsedExpression.hasAlias() && + children[0]->getDataType().getLogicalTypeID() == LogicalTypeID::NODE) { + auto node = ku_dynamic_cast(children[0].get()); + binder->scope.memorizeTableIDs(parsedExpression.getAlias(), node->getTableIDs()); + } auto uniqueExpressionName = AggregateFunctionExpression::getUniqueName(function->name, children, function->isDistinct); if (children.empty()) { @@ -211,18 +217,6 @@ std::shared_ptr ExpressionBinder::rewriteFunctionExpression( return nullptr; } -std::unique_ptr ExpressionBinder::createInternalNodeIDExpression( - const Expression& expression) { - auto& node = (NodeExpression&)expression; - std::unordered_map propertyIDPerTable; - for (auto tableID : node.getTableIDs()) { - propertyIDPerTable.insert({tableID, INVALID_PROPERTY_ID}); - } - return std::make_unique(LogicalType(LogicalTypeID::INTERNAL_ID), - InternalKeyword::ID, node.getUniqueName(), node.getVariableName(), - std::move(propertyIDPerTable), false /* isPrimaryKey */); -} - std::shared_ptr ExpressionBinder::bindStartNodeExpression( const Expression& expression) { auto& rel = (RelExpression&)expression; diff --git a/src/binder/bind_expression/bind_property_expression.cpp b/src/binder/bind_expression/bind_property_expression.cpp index 631e3453842..5aa1fc53ecd 100644 --- a/src/binder/bind_expression/bind_property_expression.cpp +++ b/src/binder/bind_expression/bind_property_expression.cpp @@ -93,6 +93,13 @@ std::shared_ptr ExpressionBinder::bindPropertyExpression( std::shared_ptr ExpressionBinder::bindNodeOrRelPropertyExpression( const Expression& child, const std::string& propertyName) { auto& nodeOrRel = ku_dynamic_cast(child); + // TODO(Xiyang): we should be able to remove l97-l100 after removing propertyDataExprs from node + // & rel expression. + if (propertyName == InternalKeyword::ID && + child.dataType.getLogicalTypeID() == common::LogicalTypeID::NODE) { + auto& node = ku_dynamic_cast(child); + return node.getInternalID(); + } if (!nodeOrRel.hasPropertyExpression(propertyName)) { throw BinderException( "Cannot find property " + propertyName + " for " + child.toString() + "."); diff --git a/src/binder/bind_expression/bind_variable_expression.cpp b/src/binder/bind_expression/bind_variable_expression.cpp index bfb3914634e..a4bf60bbb2a 100644 --- a/src/binder/bind_expression/bind_variable_expression.cpp +++ b/src/binder/bind_expression/bind_variable_expression.cpp @@ -21,8 +21,8 @@ std::shared_ptr ExpressionBinder::bindVariableExpression( } std::shared_ptr ExpressionBinder::bindVariableExpression(const std::string& varName) { - if (binder->scope->contains(varName)) { - return binder->scope->getExpression(varName); + if (binder->scope.contains(varName)) { + return binder->scope.getExpression(varName); } throw BinderException(ExceptionMessage::variableNotInScope(varName)); } diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index e3ec0be181a..60069fa1661 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -101,12 +101,12 @@ std::shared_ptr Binder::createVariable( std::shared_ptr Binder::createVariable( const std::string& name, const LogicalType& dataType) { - if (scope->contains(name)) { + if (scope.contains(name)) { throw BinderException("Variable " + name + " already exists."); } auto expression = expressionBinder.createVariableExpression(dataType, name); expression->setAlias(name); - scope->addExpression(name, expression); + scope.addExpression(name, expression); return expression; } @@ -182,12 +182,12 @@ bool Binder::isReservedPropertyName(const std::string& name) { return false; } -std::unique_ptr Binder::saveScope() { - return scope->copy(); +BinderScope Binder::saveScope() { + return scope.copy(); } -void Binder::restoreScope(std::unique_ptr prevVariableScope) { - scope = std::move(prevVariableScope); +void Binder::restoreScope(BinderScope prevScope) { + scope = std::move(prevScope); } function::TableFunction Binder::getScanFunction(FileType fileType, const ReaderConfig& config) { diff --git a/src/binder/binder_scope.cpp b/src/binder/binder_scope.cpp new file mode 100644 index 00000000000..40775243247 --- /dev/null +++ b/src/binder/binder_scope.cpp @@ -0,0 +1,18 @@ +#include "binder/binder_scope.h" + +namespace kuzu { +namespace binder { + +void BinderScope::addExpression( + const std::string& varName, std::shared_ptr expression) { + nameToExprIdx.insert({varName, expressions.size()}); + expressions.push_back(std::move(expression)); +} + +void BinderScope::clear() { + expressions.clear(); + nameToExprIdx.clear(); +} + +} // namespace binder +} // namespace kuzu diff --git a/src/binder/expression_binder.cpp b/src/binder/expression_binder.cpp index d70cd229434..c870f2a9aa0 100644 --- a/src/binder/expression_binder.cpp +++ b/src/binder/expression_binder.cpp @@ -143,6 +143,14 @@ void ExpressionBinder::validateDataType(const Expression& expr, const LogicalTyp } } +void ExpressionBinder::validateDataType(const Expression& expr, LogicalTypeID expectedTypeID) { + if (expr.getDataType().getLogicalTypeID() != expectedTypeID) { + throw BinderException( + stringFormat("{} has data type {} but {} was expected.", expr.toString(), + expr.getDataType().toString(), LogicalTypeUtils::toString(expectedTypeID))); + } +} + void ExpressionBinder::validateAggregationExpressionIsNotNested(const Expression& expression) { if (expression.getNumChildren() == 0) { return; diff --git a/src/binder/query/query_graph.cpp b/src/binder/query/query_graph.cpp index 7134df63cbd..1bf255ca7c8 100644 --- a/src/binder/query/query_graph.cpp +++ b/src/binder/query/query_graph.cpp @@ -215,13 +215,25 @@ void QueryGraphCollection::addAndMergeQueryGraphIfConnected(QueryGraph queryGrap } void QueryGraphCollection::finalize() { - auto baseGraph = std::move(queryGraphs[0]); + common::idx_t baseGraphIdx = 0; + while (true) { + auto prevNumGraphs = queryGraphs.size(); + queryGraphs = mergeGraphs(baseGraphIdx++); + if (queryGraphs.size() == prevNumGraphs || baseGraphIdx == queryGraphs.size()) { + return; + } + } +} + +std::vector QueryGraphCollection::mergeGraphs(common::idx_t baseGraphIdx) { + KU_ASSERT(baseGraphIdx < queryGraphs.size()); + auto baseGraph = std::move(queryGraphs[baseGraphIdx]); std::unordered_set mergedGraphIndices; - mergedGraphIndices.insert(0); + mergedGraphIndices.insert(baseGraphIdx); while (true) { // find graph to merge common::vector_idx_t graphToMergeIdx = common::INVALID_VECTOR_IDX; - for (auto i = 1u; i < queryGraphs.size(); ++i) { + for (auto i = 0u; i < queryGraphs.size(); ++i) { if (mergedGraphIndices.contains(i)) { // graph has been merged. continue; } @@ -238,14 +250,17 @@ void QueryGraphCollection::finalize() { mergedGraphIndices.insert(graphToMergeIdx); } std::vector finalGraphs; - finalGraphs.push_back(std::move(baseGraph)); - for (auto i = 1u; i < queryGraphs.size(); ++i) { + for (auto i = 0u; i < queryGraphs.size(); ++i) { + if (i == baseGraphIdx) { + finalGraphs.push_back(baseGraph); + continue; + } if (mergedGraphIndices.contains(i)) { continue; } finalGraphs.push_back(std::move(queryGraphs[i])); } - queryGraphs = std::move(finalGraphs); + return finalGraphs; } std::vector> QueryGraphCollection::getQueryNodes() const { diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index 85373b29248..f63d932fb97 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -2,6 +2,7 @@ #include "binder/query/bound_regular_query.h" #include "binder/query/query_graph.h" +#include "binder_scope.h" #include "catalog/catalog.h" #include "common/copier_config/reader_config.h" #include "expression_binder.h" @@ -40,50 +41,14 @@ struct ExportedTableData; // BinderScope keeps track of expressions in scope and their aliases. We maintain the order of // expressions in -class BinderScope { -public: - BinderScope() = default; - BinderScope(expression_vector expressions, - std::unordered_map varNameToIdx) - : expressions{std::move(expressions)}, varNameToIdx{std::move(varNameToIdx)} {} - - inline bool empty() const { return expressions.empty(); } - inline bool contains(const std::string& varName) const { - return varNameToIdx.contains(varName); - } - inline std::shared_ptr getExpression(const std::string& varName) const { - return expressions[varNameToIdx.at(varName)]; - } - inline expression_vector getExpressions() const { return expressions; } - inline void addExpression(const std::string& varName, std::shared_ptr expression) { - varNameToIdx.insert({varName, expressions.size()}); - expressions.push_back(std::move(expression)); - } - inline void removeExpression(const std::string& name) { - auto idx = varNameToIdx.at(name); - varNameToIdx.erase(name); - expressions[idx] = nullptr; - } - inline void clear() { - expressions.clear(); - varNameToIdx.clear(); - } - inline std::unique_ptr copy() { - return std::make_unique(expressions, varNameToIdx); - } - -private: - expression_vector expressions; - std::unordered_map varNameToIdx; -}; class Binder { friend class ExpressionBinder; public: explicit Binder(main::ClientContext* clientContext) - : lastExpressionId{0}, scope{std::make_unique()}, - expressionBinder{this, clientContext}, clientContext{clientContext} {} + : lastExpressionId{0}, scope{}, expressionBinder{this, clientContext}, clientContext{ + clientContext} {} std::unique_ptr bind(const parser::Statement& statement); @@ -203,8 +168,8 @@ class Binder { std::unique_ptr bindDeleteClause( const parser::UpdatingClause& updatingClause); - std::vector bindInsertInfos( - const QueryGraphCollection& queryGraphCollection, const expression_set& nodeRelScope_); + std::vector bindInsertInfos(const QueryGraphCollection& queryGraphCollection, + const std::unordered_set& patternsInScope); void bindInsertNode(std::shared_ptr node, std::vector& infos); void bindInsertRel(std::shared_ptr rel, std::vector& infos); expression_vector bindInsertColumnDataExprs( @@ -285,15 +250,15 @@ class Binder { std::string getUniqueExpressionName(const std::string& name); static bool isReservedPropertyName(const std::string& name); - std::unique_ptr saveScope(); - void restoreScope(std::unique_ptr prevVariableScope); + BinderScope saveScope(); + void restoreScope(BinderScope prevScope); function::TableFunction getScanFunction( common::FileType fileType, const common::ReaderConfig& config); private: uint32_t lastExpressionId; - std::unique_ptr scope; + BinderScope scope; ExpressionBinder expressionBinder; main::ClientContext* clientContext; }; diff --git a/src/include/binder/binder_scope.h b/src/include/binder/binder_scope.h new file mode 100644 index 00000000000..fea0e02c408 --- /dev/null +++ b/src/include/binder/binder_scope.h @@ -0,0 +1,66 @@ +#pragma once + +#include "binder/expression/expression.h" +#include "binder/expression/node_expression.h" + +namespace kuzu { +namespace binder { + +class BinderScope { +public: + BinderScope() = default; + EXPLICIT_COPY_DEFAULT_MOVE(BinderScope); + + bool empty() const { return expressions.empty(); } + bool contains(const std::string& varName) const { return nameToExprIdx.contains(varName); } + std::shared_ptr getExpression(const std::string& varName) const { + KU_ASSERT(nameToExprIdx.contains(varName)); + return expressions[nameToExprIdx.at(varName)]; + } + expression_vector getExpressions() const { return expressions; } + void addExpression(const std::string& varName, std::shared_ptr expression); + + void memorizeTableIDs(const std::string& name, std::vector tableIDs) { + memorizedNodeNameToTableIDs.insert({name, tableIDs}); + } + bool hasMemorizedTableIDs(const std::string& name) const { + return memorizedNodeNameToTableIDs.contains(name); + } + std::vector getMemorizedTableIDs(const std::string& name) { + KU_ASSERT(memorizedNodeNameToTableIDs.contains(name)); + return memorizedNodeNameToTableIDs.at(name); + } + + void addNodeReplacement(std::shared_ptr node) { + nodeReplacement.insert({node->getVariableName(), node}); + } + bool hasNodeReplacement(const std::string& name) const { + return nodeReplacement.contains(name); + } + std::shared_ptr getNodeReplacement(const std::string& name) const { + KU_ASSERT(hasNodeReplacement(name)); + return nodeReplacement.at(name); + } + + void clear(); + +private: + BinderScope(const BinderScope& other) + : expressions{other.expressions}, nameToExprIdx{other.nameToExprIdx}, + memorizedNodeNameToTableIDs{other.memorizedNodeNameToTableIDs} {} + +private: + // Expressions in scope. Order should be preserved. + expression_vector expressions; + std::unordered_map nameToExprIdx; + // A node might be popped out of scope. But we may need to retain its table ID information. + // E.g. MATCH (a:person) WITH collect(a) AS list_a UNWIND list_a AS new_a MATCH (new_a)-[]->() + // It will be more performant if we can retain the information that new_a has label person. + std::unordered_map> memorizedNodeNameToTableIDs; + // A node pattern may not always be bound as a node expression, e.g. in the above query, + // (new_a) is bound as a variable rather than node expression. + std::unordered_map> nodeReplacement; +}; + +} // namespace binder +} // namespace kuzu diff --git a/src/include/binder/expression/node_expression.h b/src/include/binder/expression/node_expression.h index b5b05886bd6..d2d86520499 100644 --- a/src/include/binder/expression/node_expression.h +++ b/src/include/binder/expression/node_expression.h @@ -12,10 +12,10 @@ class NodeExpression : public NodeOrRelExpression { : NodeOrRelExpression{std::move(dataType), std::move(uniqueName), std::move(variableName), std::move(tableIDs)} {} - inline void setInternalID(std::unique_ptr expression) { + void setInternalID(std::unique_ptr expression) { internalID = std::move(expression); } - inline std::shared_ptr getInternalID() const { + std::shared_ptr getInternalID() const { KU_ASSERT(internalID != nullptr); return internalID->copy(); } diff --git a/src/include/binder/expression_binder.h b/src/include/binder/expression_binder.h index 8d4567ef1ee..0af8d19b701 100644 --- a/src/include/binder/expression_binder.h +++ b/src/include/binder/expression_binder.h @@ -33,7 +33,10 @@ class ExpressionBinder { } static void validateExpectedDataType( const Expression& expression, const std::vector& targets); + // Validate data type. static void validateDataType(const Expression& expr, const common::LogicalType& expectedType); + // Validate recursive data type top level (used when child type is unknown). + static void validateDataType(const Expression& expr, common::LogicalTypeID expectedTypeID); // TODO(Xiyang): move to an expression rewriter std::shared_ptr foldExpression(const std::shared_ptr& expression); @@ -83,7 +86,6 @@ class ExpressionBinder { std::shared_ptr rewriteFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName); - std::unique_ptr createInternalNodeIDExpression(const Expression& node); std::shared_ptr bindStartNodeExpression(const Expression& expression); std::shared_ptr bindEndNodeExpression(const Expression& expression); std::shared_ptr bindLabelFunction(const Expression& expression); diff --git a/src/include/binder/query/query_graph.h b/src/include/binder/query/query_graph.h index 258dc0056c3..25ed8d10176 100644 --- a/src/include/binder/query/query_graph.h +++ b/src/include/binder/query/query_graph.h @@ -149,6 +149,9 @@ class QueryGraphCollection { std::vector> getQueryNodes() const; std::vector> getQueryRels() const; +private: + std::vector mergeGraphs(common::idx_t baseGraphIdx); + private: std::vector queryGraphs; }; diff --git a/src/include/binder/query/reading_clause/bound_unwind_clause.h b/src/include/binder/query/reading_clause/bound_unwind_clause.h index 98e1032767d..882f39edfad 100644 --- a/src/include/binder/query/reading_clause/bound_unwind_clause.h +++ b/src/include/binder/query/reading_clause/bound_unwind_clause.h @@ -8,16 +8,20 @@ namespace binder { class BoundUnwindClause : public BoundReadingClause { public: - BoundUnwindClause(std::shared_ptr inExpr, std::shared_ptr outExpr) + BoundUnwindClause(std::shared_ptr inExpr, std::shared_ptr outExpr, + std::shared_ptr idExpr) : BoundReadingClause{common::ClauseType::UNWIND}, inExpr{std::move(inExpr)}, - outExpr{std::move(outExpr)} {} + outExpr{std::move(outExpr)}, idExpr{std::move(idExpr)} {} - inline std::shared_ptr getInExpr() const { return inExpr; } - inline std::shared_ptr getOutExpr() const { return outExpr; } + std::shared_ptr getInExpr() const { return inExpr; } + std::shared_ptr getOutExpr() const { return outExpr; } + std::shared_ptr getIDExpr() const { return idExpr; } private: std::shared_ptr inExpr; std::shared_ptr outExpr; + std::shared_ptr idExpr; }; + } // namespace binder } // namespace kuzu diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 1164afde567..76b8448db8f 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -32,6 +32,7 @@ constexpr property_id_t INVALID_PROPERTY_ID = UINT32_MAX; using column_id_t = property_id_t; constexpr column_id_t INVALID_COLUMN_ID = INVALID_PROPERTY_ID; using vector_idx_t = uint32_t; +using idx_t = uint32_t; constexpr vector_idx_t INVALID_VECTOR_IDX = UINT32_MAX; using block_idx_t = uint64_t; constexpr block_idx_t INVALID_BLOCK_IDX = UINT64_MAX; diff --git a/src/include/parser/query/reading_clause/unwind_clause.h b/src/include/parser/query/reading_clause/unwind_clause.h index c3554cc94cb..10fcba0d997 100644 --- a/src/include/parser/query/reading_clause/unwind_clause.h +++ b/src/include/parser/query/reading_clause/unwind_clause.h @@ -8,13 +8,13 @@ namespace parser { class UnwindClause : public ReadingClause { public: - explicit UnwindClause(std::unique_ptr expression, std::string listAlias) + UnwindClause(std::unique_ptr expression, std::string listAlias) : ReadingClause{common::ClauseType::UNWIND}, expression{std::move(expression)}, alias{std::move(listAlias)} {} - inline const ParsedExpression* getExpression() const { return expression.get(); } + const ParsedExpression* getExpression() const { return expression.get(); } - inline std::string getAlias() const { return alias; } + std::string getAlias() const { return alias; } private: std::unique_ptr expression; diff --git a/src/include/planner/operator/logical_unwind.h b/src/include/planner/operator/logical_unwind.h index 34a9b3d8a5e..ce3387caa6c 100644 --- a/src/include/planner/operator/logical_unwind.h +++ b/src/include/planner/operator/logical_unwind.h @@ -7,32 +7,32 @@ namespace planner { class LogicalUnwind : public LogicalOperator { public: - LogicalUnwind(std::shared_ptr expression, - std::shared_ptr aliasExpression, + LogicalUnwind(std::shared_ptr inExpr, + std::shared_ptr outExpr, std::shared_ptr idExpr, std::shared_ptr childOperator) : LogicalOperator{LogicalOperatorType::UNWIND, std::move(childOperator)}, - expression{std::move(expression)}, aliasExpression{std::move(aliasExpression)} {} + inExpr{std::move(inExpr)}, outExpr{std::move(outExpr)}, idExpr{std::move(idExpr)} {} f_group_pos_set getGroupsPosToFlatten(); void computeFactorizedSchema() override; void computeFlatSchema() override; - inline std::shared_ptr getExpression() { return expression; } + std::shared_ptr getInExpr() const { return inExpr; } + std::shared_ptr getOutExpr() const { return outExpr; } + bool hasIDExpr() const { return idExpr != nullptr; } + std::shared_ptr getIDExpr() const { return idExpr; } - inline std::shared_ptr getAliasExpression() { return aliasExpression; } + std::string getExpressionsForPrinting() const override { return inExpr->toString(); } - inline std::string getExpressionsForPrinting() const override { - return expression->getUniqueName(); - } - - inline std::unique_ptr copy() override { - return make_unique(expression, aliasExpression, children[0]->copy()); + std::unique_ptr copy() override { + return make_unique(inExpr, outExpr, idExpr, children[0]->copy()); } private: - std::shared_ptr expression; - std::shared_ptr aliasExpression; + std::shared_ptr inExpr; + std::shared_ptr outExpr; + std::shared_ptr idExpr; }; } // namespace planner diff --git a/src/include/processor/operator/unwind.h b/src/include/processor/operator/unwind.h index 091a1d0172a..52eef58e54a 100644 --- a/src/include/processor/operator/unwind.h +++ b/src/include/processor/operator/unwind.h @@ -9,19 +9,19 @@ namespace processor { class Unwind : public PhysicalOperator { public: - Unwind(common::LogicalType outDataType, DataPos outDataPos, + Unwind(DataPos outDataPos, DataPos idPos, std::unique_ptr expressionEvaluator, std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::UNWIND, std::move(child), id, paramsString}, - outDataType{std::move(outDataType)}, outDataPos{outDataPos}, - expressionEvaluator{std::move(expressionEvaluator)}, startIndex{0u} {} + outDataPos{outDataPos}, + idPos(idPos), expressionEvaluator{std::move(expressionEvaluator)}, startIndex{0u} {} bool getNextTuplesInternal(ExecutionContext* context) override; void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; - inline std::unique_ptr clone() override { - return make_unique(outDataType, outDataPos, expressionEvaluator->clone(), + std::unique_ptr clone() override { + return make_unique(outDataPos, idPos, expressionEvaluator->clone(), children[0]->clone(), id, paramsString); } @@ -29,11 +29,12 @@ class Unwind : public PhysicalOperator { bool hasMoreToRead() const; void copyTuplesToOutVector(uint64_t startPos, uint64_t endPos) const; - common::LogicalType outDataType; DataPos outDataPos; + DataPos idPos; std::unique_ptr expressionEvaluator; std::shared_ptr outValueVector; + common::ValueVector* idVector = nullptr; uint32_t startIndex; common::list_entry_t listEntry; }; diff --git a/src/optimizer/projection_push_down_optimizer.cpp b/src/optimizer/projection_push_down_optimizer.cpp index 1519ca7f3e5..b6ca4f855af 100644 --- a/src/optimizer/projection_push_down_optimizer.cpp +++ b/src/optimizer/projection_push_down_optimizer.cpp @@ -156,7 +156,7 @@ void ProjectionPushDownOptimizer::visitOrderBy(planner::LogicalOperator* op) { void ProjectionPushDownOptimizer::visitUnwind(planner::LogicalOperator* op) { auto unwind = (LogicalUnwind*)op; - collectExpressionsInUse(unwind->getExpression()); + collectExpressionsInUse(unwind->getInExpr()); } void ProjectionPushDownOptimizer::visitInsert(planner::LogicalOperator* op) { diff --git a/src/planner/operator/logical_unwind.cpp b/src/planner/operator/logical_unwind.cpp index 303c6ae65c8..24e0c29d1cf 100644 --- a/src/planner/operator/logical_unwind.cpp +++ b/src/planner/operator/logical_unwind.cpp @@ -2,24 +2,33 @@ #include "planner/operator/factorization/flatten_resolver.h" +using namespace kuzu::binder; +using namespace kuzu::common; + namespace kuzu { namespace planner { f_group_pos_set LogicalUnwind::getGroupsPosToFlatten() { auto childSchema = children[0]->getSchema(); - auto dependentGroupsPos = childSchema->getDependentGroupsPos(expression); + auto dependentGroupsPos = childSchema->getDependentGroupsPos(inExpr); return factorization::FlattenAll::getGroupsPosToFlatten(dependentGroupsPos, childSchema); } void LogicalUnwind::computeFactorizedSchema() { copyChildSchema(0); auto groupPos = schema->createGroup(); - schema->insertToGroupAndScope(aliasExpression, groupPos); + schema->insertToGroupAndScope(outExpr, groupPos); + if (hasIDExpr()) { + schema->insertToGroupAndScope(idExpr, groupPos); + } } void LogicalUnwind::computeFlatSchema() { copyChildSchema(0); - schema->insertToGroupAndScope(aliasExpression, 0); + schema->insertToGroupAndScope(outExpr, 0); + if (hasIDExpr()) { + schema->insertToGroupAndScope(idExpr, 0); + } } } // namespace planner diff --git a/src/planner/plan/append_unwind.cpp b/src/planner/plan/append_unwind.cpp index 5a740392d4d..f3517ec77db 100644 --- a/src/planner/plan/append_unwind.cpp +++ b/src/planner/plan/append_unwind.cpp @@ -3,14 +3,16 @@ #include "planner/planner.h" using namespace kuzu::binder; +using namespace kuzu::common; namespace kuzu { namespace planner { -void Planner::appendUnwind(const BoundReadingClause& boundReadingClause, LogicalPlan& plan) { - auto& boundUnwindClause = (BoundUnwindClause&)boundReadingClause; - auto unwind = make_shared( - boundUnwindClause.getInExpr(), boundUnwindClause.getOutExpr(), plan.getLastOperator()); +void Planner::appendUnwind(const BoundReadingClause& readingClause, LogicalPlan& plan) { + auto& unwindClause = + ku_dynamic_cast(readingClause); + auto unwind = make_shared(unwindClause.getInExpr(), unwindClause.getOutExpr(), + unwindClause.getIDExpr(), plan.getLastOperator()); appendFlattens(unwind->getGroupsPosToFlatten(), plan); unwind->setChild(0, plan.getLastOperator()); unwind->computeFactorizedSchema(); diff --git a/src/planner/plan/plan_subquery.cpp b/src/planner/plan/plan_subquery.cpp index 416324af5e9..a81e6c1a9d0 100644 --- a/src/planner/plan/plan_subquery.cpp +++ b/src/planner/plan/plan_subquery.cpp @@ -22,7 +22,7 @@ static expression_vector getCorrelatedExpressions(const QueryGraphCollection& co result.push_back(node->getInternalID()); } } - return result; + return ExpressionUtil::removeDuplication(result); } void Planner::planOptionalMatch(const QueryGraphCollection& queryGraphCollection, diff --git a/src/processor/map/map_unwind.cpp b/src/processor/map/map_unwind.cpp index 1a6d5ebaa7b..8ab3a89fc85 100644 --- a/src/processor/map/map_unwind.cpp +++ b/src/processor/map/map_unwind.cpp @@ -14,11 +14,14 @@ std::unique_ptr PlanMapper::mapUnwind(LogicalOperator* logical auto outSchema = unwind->getSchema(); auto inSchema = unwind->getChild(0)->getSchema(); auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); - auto dataPos = DataPos(outSchema->getExpressionPos(*unwind->getAliasExpression())); - auto expressionEvaluator = ExpressionMapper::getEvaluator(unwind->getExpression(), inSchema); - return std::make_unique(*VarListType::getChildType(&unwind->getExpression()->dataType), - dataPos, std::move(expressionEvaluator), std::move(prevOperator), getOperatorID(), - unwind->getExpressionsForPrinting()); + auto dataPos = DataPos(outSchema->getExpressionPos(*unwind->getOutExpr())); + auto expressionEvaluator = ExpressionMapper::getEvaluator(unwind->getInExpr(), inSchema); + DataPos idPos; + if (unwind->hasIDExpr()) { + idPos = getDataPos(*unwind->getIDExpr(), *outSchema); + } + return std::make_unique(dataPos, idPos, std::move(expressionEvaluator), + std::move(prevOperator), getOperatorID(), unwind->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index 8c7fa823966..aed9f85d891 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -1,6 +1,7 @@ #include "processor/operator/scan_node_id.h" using namespace kuzu::common; +using namespace kuzu::transaction; namespace kuzu { namespace processor { @@ -24,7 +25,7 @@ std::pair NodeTableScanState::getNextRangeToRead() { return std::make_pair(startOffset, startOffset + range); } -void ScanNodeIDSharedState::initialize(transaction::Transaction* transaction) { +void ScanNodeIDSharedState::initialize(Transaction* transaction) { auto numMask = tableStates[0]->getSemiMask()->getNumMasks(); numNodes = 0; for (auto& tableState : tableStates) { diff --git a/src/processor/operator/unwind.cpp b/src/processor/operator/unwind.cpp index 0697672b0e2..fdc61e2f79d 100644 --- a/src/processor/operator/unwind.cpp +++ b/src/processor/operator/unwind.cpp @@ -8,6 +8,9 @@ namespace processor { void Unwind::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { expressionEvaluator->init(*resultSet, context->clientContext->getMemoryManager()); outValueVector = resultSet->getValueVector(outDataPos); + if (idPos.isValid()) { + idVector = resultSet->getValueVector(idPos).get(); + } } bool Unwind::hasMoreToRead() const { @@ -20,6 +23,14 @@ void Unwind::copyTuplesToOutVector(uint64_t startPos, uint64_t endPos) const { for (auto i = 0u; i < endPos - startPos; i++) { outValueVector->copyFromVectorData(i, listDataVector, listPos++); } + if (idVector != nullptr) { + KU_ASSERT(listDataVector->dataType.getLogicalTypeID() == common::LogicalTypeID::NODE); + auto idFieldVector = StructVector::getFieldVector(listDataVector, 0); + listPos = listEntry.offset + startPos; + for (auto i = 0u; i < endPos - startPos; i++) { + idVector->copyFromVectorData(i, idFieldVector.get(), listPos++); + } + } } bool Unwind::getNextTuplesInternal(ExecutionContext* context) { diff --git a/test/test_files/issue/issue.test b/test/test_files/issue/issue.test index 4efb7beaaf3..442184261f9 100644 --- a/test/test_files/issue/issue.test +++ b/test/test_files/issue/issue.test @@ -233,7 +233,6 @@ True|True|True [t2,t22] [t3] - -CASE 2587 -STATEMENT CREATE NODE TABLE T (id STRING, descr STRING, PRIMARY KEY (id)); ---- ok diff --git a/test/test_files/tinysnb/unwind/unwind.test b/test/test_files/tinysnb/unwind/unwind.test index a71c54fd679..75c30785856 100644 --- a/test/test_files/tinysnb/unwind/unwind.test +++ b/test/test_files/tinysnb/unwind/unwind.test @@ -17,10 +17,10 @@ Binder exception: Cannot set expression n with type VARIABLE. Expect node or rel Binder exception: Cannot delete expression n with type VARIABLE. Expect node or rel pattern. -STATEMENT UNWIND 1 AS a RETURN a; ---- error -Binder exception: Expression 1 has data type INT64 but expected VAR_LIST. Implicit cast is not supported. +Binder exception: 1 has data type INT64 but VAR_LIST was expected. -STATEMENT MATCH p = (a:person)-[e:knows*1..2]->(b:person) UNWIND p AS x RETURN x; ---- error -Binder exception: Expression p has data type RECURSIVE_REL but expected VAR_LIST. Implicit cast is not supported. +Binder exception: p has data type RECURSIVE_REL but VAR_LIST was expected. -STATEMENT MATCH p = (a:person)-[e:knows*1..1]->(b:person) UNWIND nodes(p) AS x RETURN x.fName, COUNT(*); ---- 7 Alice|6 diff --git a/test/test_files/tinysnb/unwind/unwind_list_node.test b/test/test_files/tinysnb/unwind/unwind_list_node.test new file mode 100644 index 00000000000..7b70ab2b1c1 --- /dev/null +++ b/test/test_files/tinysnb/unwind/unwind_list_node.test @@ -0,0 +1,75 @@ +-GROUP TinySnbReadTest +-DATASET CSV tinysnb + +-- + +-CASE UnwindListOfNodes + +-STATEMENT MATCH (a:person) WHERE a.ID < 4 WITH collect(a) AS list_a UNWIND list_a AS a RETURN a.fName; +---- 3 +Alice +Bob +Carol + +-STATEMENT MATCH (a:person) WHERE a.ID < 4 WITH collect(a) AS list_a UNWIND list_a AS a MATCH (a)-[:knows]->(b:person) RETURN a.fName, b.fName +---- 9 +Alice|Bob +Alice|Carol +Alice|Dan +Bob|Alice +Bob|Carol +Bob|Dan +Carol|Alice +Carol|Bob +Carol|Dan + +-STATEMENT CREATE NODE TABLE PPT (id UUID, type STRING, PRIMARY KEY(id)); +---- ok +-STATEMENT CREATE NODE TABLE PPI (id SERIAL, task_id UUID, di STRING, name STRING, PRIMARY KEY(id)); +---- ok +-STATEMENT CREATE REL TABLE PPHT (FROM PPT TO PPI); +---- ok +-STATEMENT CREATE REL TABLE PPPI (FROM person TO PPI); +---- ok +-STATEMENT CREATE REL TABLE OPPI (FROM organisation TO PPI); +---- ok +-STATEMENT MATCH (a:person)-[e:knows]->(b:person)-[:studyAt]->(o:organisation) + WHERE a.ID =0 AND b.ID = 2 + WITH + a, o, collect(b) AS list_b + WITH + *, gen_random_uuid() AS task_id + CREATE (:PPT { + id: task_id, + type: 'p_install' + })-[:PPHT]->(t:PPI { + task_id: task_id, + di: o.name, + name: a.fName + }), + (a)-[:PPPI]->(t), + (o)-[:OPPI]->(t) + WITH t, list_b + UNWIND list_b AS b + CREATE (b)-[e:PPPI]->(t) + RETURN t.di, t.name, b.fName; +---- 1 +ABFsUni|Alice|Bob +# Check update result +-STATEMENT MATCH (a:PPT) RETURN a.type; +---- 1 +p_install +-STATEMENT MATCH (a:PPI) RETURN a.di, a.name; +---- 1 +ABFsUni|Alice +-STATEMENT MATCH (a:PPT)-[:PPHT]->(t:PPI) RETURN a.type, t.di, t.name; +---- 1 +p_install|ABFsUni|Alice +-STATEMENT MATCH (a:person)-[:PPPI]->(t:PPI)<-[:OPPI]-(b:organisation) RETURN a.fName, b.name; +---- 2 +Alice|ABFsUni +Bob|ABFsUni + +-STATEMENT MATCH p = (a:person)-[:knows]->(b:person) UNWIND nodes(p) AS n MATCH (n)-[]->() RETURN COUNT(*); +---- error +Binder exception: Cannot bind n as node pattern. From 08fd18052f6dfc7feafe783f1d4725dd7366600f Mon Sep 17 00:00:00 2001 From: Maxwell <49460053+mxwli@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:59:27 -0400 Subject: [PATCH 106/136] Add Pyarrow Map Scanning (#3158) * add map scanning * clang format and python lint * changed decimal error message --- src/common/arrow/arrow_array_scan.cpp | 5 ++--- src/common/arrow/arrow_null_mask_tree.cpp | 6 ++++-- src/common/arrow/arrow_type.cpp | 7 ++++--- tools/python_api/test/test_df_pyarrow.py | 25 +++++++++++++++++++++++ 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/common/arrow/arrow_array_scan.cpp b/src/common/arrow/arrow_array_scan.cpp index 475e7ab5b03..93c0bc96ec4 100644 --- a/src/common/arrow/arrow_array_scan.cpp +++ b/src/common/arrow/arrow_array_scan.cpp @@ -510,9 +510,8 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'm': // MAP - // TODO maxwell; - // for some reason the columnar format specification doesn't mention maps at all - KU_UNREACHABLE; + return scanArrowArrayVarList( + schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'u': if (arrowType[2] == 'd') { // DENSE UNION diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp index ab10be19ae4..5d236dbab74 100644 --- a/src/common/arrow/arrow_null_mask_tree.cpp +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -134,8 +134,10 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray scanStructPushDown(schema, array, srcOffset, count); break; case 'm': - // TODO maxwell bind map types - KU_UNREACHABLE; + copyFromBuffer(array->buffers[0], srcOffset, count); + applyParentBitmap(parentBitmap, count); + scanListPushDown(schema, array, srcOffset, count); + break; case 'u': { const int8_t* types = (const int8_t*)array->buffers[0]; if (schema->format[2] == 'd') { diff --git a/src/common/arrow/arrow_type.cpp b/src/common/arrow/arrow_type.cpp index dec7b047500..a530e3c0362 100644 --- a/src/common/arrow/arrow_type.cpp +++ b/src/common/arrow/arrow_type.cpp @@ -58,7 +58,7 @@ LogicalType ArrowConverter::fromArrowSchema(const ArrowSchema* schema) { } case 'd': - throw NotImplementedException("custom bitwidth decimals are not supported"); + throw NotImplementedException("Decimals are not supported"); case 'w': return LogicalType(LogicalTypeID::BLOB); // fixed width binary case 't': @@ -115,8 +115,9 @@ LogicalType ArrowConverter::fromArrowSchema(const ArrowSchema* schema) { } return *LogicalType::STRUCT(std::move(structFields)); case 'm': - // TODO maxwell bind map types - throw NotImplementedException("Scanning Arrow Map types is not supported"); + return *LogicalType::MAP( + std::make_unique(fromArrowSchema(schema->children[0]->children[0])), + std::make_unique(fromArrowSchema(schema->children[0]->children[1]))); case 'u': throw RuntimeException("Unions are currently WIP."); for (int64_t i = 0; i < schema->n_children; i++) { diff --git a/tools/python_api/test/test_df_pyarrow.py b/tools/python_api/test/test_df_pyarrow.py index d5b1a899269..4feca497638 100644 --- a/tools/python_api/test/test_df_pyarrow.py +++ b/tools/python_api/test/test_df_pyarrow.py @@ -313,3 +313,28 @@ def test_pyarrow_union(conn_db_readonly : ConnDB) -> None: assert idx == len(index) +def test_pyarrow_map(conn_db_readonly : ConnDB) -> None: + conn, db = conn_db_readonly + random.seed(100) + datalength = 4096 + index = pa.array(range(datalength)) + keySet = range(100) + valueSet = 'abcdefghijklmnopqrstuvwxyz' + col1 = pa.array([ + {str(key) : ''.join(random.sample(valueSet, random.randint(0, len(valueSet)))) + for key in random.sample(keySet, random.randint(1, len(keySet)))} + if random.randint(0, 5) != 0 else None for i in range(datalength)], + type=pa.map_(pa.string(), pa.string())) + df = pd.DataFrame({ + 'index': arrowtopd(index), + 'col1': arrowtopd(col1)}) + result = conn.execute('CALL READ_PANDAS(df) RETURN * ORDER BY index') + idx = 0 + while result.has_next(): + assert idx < len(index) + nxt = result.get_next() + expected = [idx, None if col1[idx].as_py() is None else dict(col1[idx].as_py())] + assert expected == nxt + idx += 1 + + assert idx == len(index) From 293b4e6648a83dff09b06175dad2eb5b2d232bc0 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Thu, 28 Mar 2024 17:31:28 -0400 Subject: [PATCH 107/136] Fix export database regression (#3171) --- src/binder/bind/bind_export_database.cpp | 7 ------- src/processor/map/map_port_db.cpp | 12 ++++++++++++ test/main/prepare_test.cpp | 7 +++++++ test/test_files/copy/export_import_db.test | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/binder/bind/bind_export_database.cpp b/src/binder/bind/bind_export_database.cpp index b8bd885385d..052c3e58883 100644 --- a/src/binder/bind/bind_export_database.cpp +++ b/src/binder/bind/bind_export_database.cpp @@ -3,7 +3,6 @@ #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" #include "common/exception/binder.h" -#include "common/file_system/virtual_file_system.h" #include "common/string_utils.h" #include "main/client_context.h" #include "parser/parser.h" @@ -93,12 +92,6 @@ std::unique_ptr Binder::bindExportDatabaseClause(const Statement if (fileType != FileType::CSV && parsedOptions.size() != 0) { throw BinderException{"Only export to csv can have options."}; } - auto fs = clientContext->getVFSUnsafe(); - if (!fs->fileOrPathExists(boundFilePath)) { - fs->createDir(boundFilePath); - } else { - throw BinderException(stringFormat("Directory {} already exists.", boundFilePath)); - } return std::make_unique( boundFilePath, fileType, std::move(exportData), std::move(parsedOptions)); } diff --git a/src/processor/map/map_port_db.cpp b/src/processor/map/map_port_db.cpp index 83909ec25ac..9a9aec8f8e9 100644 --- a/src/processor/map/map_port_db.cpp +++ b/src/processor/map/map_port_db.cpp @@ -1,3 +1,4 @@ +#include "common/file_system/virtual_file_system.h" #include "planner/operator/persistent/logical_export_db.h" #include "planner/operator/persistent/logical_import_db.h" #include "processor/operator/persistent/export_db.h" @@ -20,6 +21,17 @@ std::unique_ptr PlanMapper::mapExportDatabase( auto childPhysicalOperator = mapOperator(childCopyTo.get()); children.push_back(std::move(childPhysicalOperator)); } + // Ideally we should create directory inside operator but ExportDatabase is executed before + // CopyTo which requires the directory to exist. So we create directory in mapper inside. + auto fs = clientContext->getVFSUnsafe(); + auto boundFileInfo = exportDatabase->getBoundFileInfo(); + KU_ASSERT(boundFileInfo->filePaths.size() == 1); + auto filePath = boundFileInfo->filePaths[0]; + if (!fs->fileOrPathExists(filePath)) { + fs->createDir(filePath); + } else { + throw RuntimeException(stringFormat("Directory {} already exists.", filePath)); + } std::unique_ptr resultSetDescriptor; return std::make_unique(exportDatabase->getBoundFileInfo()->copy(), getOperatorID(), exportDatabase->getExpressionsForPrinting(), std::move(children)); diff --git a/test/main/prepare_test.cpp b/test/main/prepare_test.cpp index 3aa3902d45b..5a38ddafb52 100644 --- a/test/main/prepare_test.cpp +++ b/test/main/prepare_test.cpp @@ -234,3 +234,10 @@ TEST_F(ApiTest, issueTest4) { checkTuple(result->getNext().get(), "-123456789\n"); ASSERT_FALSE(result->hasNext()); } + +TEST_F(ApiTest, PrepareExport) { + auto newDBPath = databasePath + "/newdb"; + auto preparedStatement = conn->prepare("EXPORT DATABASE '" + newDBPath + '\''); + auto result = conn->execute(preparedStatement.get()); + ASSERT_TRUE(result->isSuccess()); +} diff --git a/test/test_files/copy/export_import_db.test b/test/test_files/copy/export_import_db.test index 23b2d1275ca..86a97d9aa73 100644 --- a/test/test_files/copy/export_import_db.test +++ b/test/test_files/copy/export_import_db.test @@ -41,7 +41,7 @@ 50 -STATEMENT Export Database "${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db2" (format='csv', header=true) ---- error -Binder exception: Directory ${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db2 already exists. +Runtime exception: Directory ${KUZU_EXPORT_DB_DIRECTORY}_case2/demo-db2 already exists. -CASE ExportImportDatabaseWithPARQUET -STATEMENT Export Database "${KUZU_EXPORT_DB_DIRECTORY}_case4/demo-db3" (format='parquet') From 37b58bb6c8640203b9ce5103e09b4e79f3fa85b2 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Thu, 28 Mar 2024 18:54:04 -0400 Subject: [PATCH 108/136] Fix hash aggregate edge case (#3172) --- .../operator/aggregate/aggregate_hash_table.cpp | 4 ++-- test/test_files/tinysnb/agg/hash.test | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/processor/operator/aggregate/aggregate_hash_table.cpp b/src/processor/operator/aggregate/aggregate_hash_table.cpp index 32b9eb39c16..0111f7b2359 100644 --- a/src/processor/operator/aggregate/aggregate_hash_table.cpp +++ b/src/processor/operator/aggregate/aggregate_hash_table.cpp @@ -880,7 +880,7 @@ void AggregateHashTable::updateFlatKeyUnFlatAggVectorState( for (auto i = 0u; i < aggVecSelectedSize; i++) { if (!aggVector->isNull(i)) { aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[0]->entry + aggStateOffset, aggVector, + hashSlotsToUpdateAggState[groupByKeyPos]->entry + aggStateOffset, aggVector, multiplicity, i, &memoryManager); } } @@ -889,7 +889,7 @@ void AggregateHashTable::updateFlatKeyUnFlatAggVectorState( auto pos = aggVector->state->selVector->selectedPositions[i]; if (!aggVector->isNull(pos)) { aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[0]->entry + aggStateOffset, aggVector, + hashSlotsToUpdateAggState[groupByKeyPos]->entry + aggStateOffset, aggVector, multiplicity, pos, &memoryManager); } } diff --git a/test/test_files/tinysnb/agg/hash.test b/test/test_files/tinysnb/agg/hash.test index 0a6ad618abd..c795470e8e4 100644 --- a/test/test_files/tinysnb/agg/hash.test +++ b/test/test_files/tinysnb/agg/hash.test @@ -5,6 +5,16 @@ -CASE AggHash +-STATEMENT MATCH (a:person) OPTIONAL MATCH (a)-[:knows]->(b:person) WHERE b.ID > 3 WITH a.fName AS n, COLLECT(b) AS b_list RETURN n, size(b_list) +---- 8 +Alice|1 +Bob|1 +Carol|1 +Dan| +Elizabeth|2 +Farooq| +Greg| +Hubert Blaine Wolfeschlegelsteinhausenbergerdorff| -STATEMENT MATCH (a:person)-[r:knows]->(b:person) WHERE a.ID=0 RETURN r, COUNT(*) -ENUMERATE ---- 3 From 20e5cbbd1e80417b14d942a6380c60c50ffa36f3 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:20:32 -0700 Subject: [PATCH 109/136] Added progress for in_query_call operators (#3120) I have read and agree to the CLA of the Kuzu repository. --- src/common/task_system/progress_bar.cpp | 10 +++- src/include/function/table/scan_functions.h | 3 +- src/include/function/table_functions.h | 8 +++ .../processor/operator/call/in_query_call.h | 2 + .../persistent/reader/csv/base_csv_reader.h | 5 +- .../reader/csv/parallel_csv_reader.h | 3 +- .../persistent/reader/csv/serial_csv_reader.h | 3 +- .../reader/parquet/parquet_reader.h | 2 + src/processor/operator/call/in_query_call.cpp | 4 ++ .../persistent/reader/csv/base_csv_reader.cpp | 4 ++ .../reader/csv/parallel_csv_reader.cpp | 43 +++++++++++---- .../reader/csv/serial_csv_reader.cpp | 34 +++++++++--- .../reader/parquet/parquet_reader.cpp | 55 ++++++++++++++----- .../src_cpp/include/pandas/pandas_scan.h | 4 +- .../python_api/src_cpp/pandas/pandas_scan.cpp | 21 +++++-- .../src_cpp/pyarrow/pyarrow_scan.cpp | 13 ++++- 16 files changed, 169 insertions(+), 45 deletions(-) diff --git a/src/common/task_system/progress_bar.cpp b/src/common/task_system/progress_bar.cpp index 0c53154903d..e571a8a58c2 100644 --- a/src/common/task_system/progress_bar.cpp +++ b/src/common/task_system/progress_bar.cpp @@ -30,17 +30,23 @@ void ProgressBar::finishPipeline() { return; } numPipelinesFinished++; + if (printing) { + std::cout << "\033[1A\033[2K\033[1B"; + } // This ensures that the progress bar is updated back to 0% after a pipeline is finished. prevCurPipelineProgress = -0.01; updateProgress(0.0); } void ProgressBar::updateProgress(double curPipelineProgress) { - // Only update the progress bar if the progress has changed by at least 1%. - if (!trackProgress || curPipelineProgress - prevCurPipelineProgress < 0.01) { + if (!trackProgress) { return; } std::lock_guard lock(progressBarLock); + // Only update the progress bar if the progress has changed by at least 1%. + if (curPipelineProgress - prevCurPipelineProgress < 0.01) { + return; + } prevCurPipelineProgress = curPipelineProgress; if (printing) { std::cout << "\033[2A"; diff --git a/src/include/function/table/scan_functions.h b/src/include/function/table/scan_functions.h index 253037dbea8..9c1baf9008f 100644 --- a/src/include/function/table/scan_functions.h +++ b/src/include/function/table/scan_functions.h @@ -30,10 +30,11 @@ struct ScanSharedState : public BaseScanSharedState { struct ScanFileSharedState : public ScanSharedState { main::ClientContext* context; + uint64_t totalSize; ScanFileSharedState( common::ReaderConfig readerConfig, uint64_t numRows, main::ClientContext* context) - : ScanSharedState{std::move(readerConfig), numRows}, context{context} {} + : ScanSharedState{std::move(readerConfig), numRows}, context{context}, totalSize{0} {} }; } // namespace function diff --git a/src/include/function/table_functions.h b/src/include/function/table_functions.h index 70753b49ab2..052cad076a3 100644 --- a/src/include/function/table_functions.h +++ b/src/include/function/table_functions.h @@ -63,6 +63,7 @@ using table_func_init_shared_t = using table_func_init_local_t = std::function( TableFunctionInitInput&, TableFuncSharedState*, storage::MemoryManager*)>; using table_func_can_parallel_t = std::function; +using table_func_progress_t = std::function; struct TableFunction final : public Function { table_func_t tableFunc; @@ -70,6 +71,7 @@ struct TableFunction final : public Function { table_func_init_shared_t initSharedStateFunc; table_func_init_local_t initLocalStateFunc; table_func_can_parallel_t canParallelFunc = [] { return true; }; + table_func_progress_t progressFunc = [](TableFuncSharedState* /*sharedState*/) { return 0.0; }; TableFunction() : Function{}, tableFunc{nullptr}, bindFunc{nullptr}, initSharedStateFunc{nullptr}, @@ -80,6 +82,12 @@ struct TableFunction final : public Function { : Function{FunctionType::TABLE, std::move(name), std::move(inputTypes)}, tableFunc{tableFunc}, bindFunc{bindFunc}, initSharedStateFunc{initSharedFunc}, initLocalStateFunc{initLocalFunc} {} + TableFunction(std::string name, table_func_t tableFunc, table_func_bind_t bindFunc, + table_func_init_shared_t initSharedFunc, table_func_init_local_t initLocalFunc, + table_func_progress_t progressFunc, std::vector inputTypes) + : Function{FunctionType::TABLE, std::move(name), std::move(inputTypes)}, + tableFunc{tableFunc}, bindFunc{bindFunc}, initSharedStateFunc{initSharedFunc}, + initLocalStateFunc{initLocalFunc}, progressFunc{progressFunc} {} inline std::string signatureToString() const override { return common::LogicalTypeUtils::toString(parameterTypeIDs); diff --git a/src/include/processor/operator/call/in_query_call.h b/src/include/processor/operator/call/in_query_call.h index 24179e1ebd8..e533223361d 100644 --- a/src/include/processor/operator/call/in_query_call.h +++ b/src/include/processor/operator/call/in_query_call.h @@ -74,6 +74,8 @@ class InQueryCall : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) override; + double getProgress(ExecutionContext* context) const override; + std::unique_ptr clone() override { return std::make_unique(info.copy(), sharedState, id, paramsString); } diff --git a/src/include/processor/operator/persistent/reader/csv/base_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/base_csv_reader.h index 9a904781730..59ff9933f88 100644 --- a/src/include/processor/operator/persistent/reader/csv/base_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/base_csv_reader.h @@ -26,6 +26,9 @@ class BaseCSVReader { uint64_t countRows(); bool isEOF() const; + uint64_t getFileSize(); + // Get the file offset of the current buffer position. + uint64_t getFileOffset() const; protected: template @@ -56,8 +59,6 @@ class BaseCSVReader { inline bool isNewLine(char c) { return c == '\n' || c == '\r'; } - // Get the file offset of the current buffer position. - uint64_t getFileOffset() const; uint64_t getLineNumber(); protected: diff --git a/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h index 2294d26113b..90709b2c208 100644 --- a/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h @@ -39,11 +39,12 @@ struct ParallelCSVScanSharedState final : public function::ScanFileSharedState { explicit ParallelCSVScanSharedState(common::ReaderConfig readerConfig, uint64_t numRows, uint64_t numColumns, main::ClientContext* context, common::CSVReaderConfig csvReaderConfig) : ScanFileSharedState{std::move(readerConfig), numRows, context}, numColumns{numColumns}, - csvReaderConfig{std::move(csvReaderConfig)} {} + numBlocksReadByFiles{0}, csvReaderConfig{std::move(csvReaderConfig)} {} void setFileComplete(uint64_t completedFileIdx); uint64_t numColumns; + uint64_t numBlocksReadByFiles = 0; common::CSVReaderConfig csvReaderConfig; }; diff --git a/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h index 289d2a4007f..78f1f26684e 100644 --- a/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h @@ -25,12 +25,13 @@ class SerialCSVReader final : public BaseCSVReader { struct SerialCSVScanSharedState final : public function::ScanFileSharedState { std::unique_ptr reader; uint64_t numColumns; + uint64_t totalReadSizeByFile; common::CSVReaderConfig csvReaderConfig; SerialCSVScanSharedState(common::ReaderConfig readerConfig, uint64_t numRows, uint64_t numColumns, common::CSVReaderConfig csvReaderConfig, main::ClientContext* context) : ScanFileSharedState{std::move(readerConfig), numRows, context}, numColumns{numColumns}, - csvReaderConfig{std::move(csvReaderConfig)} { + totalReadSizeByFile{0}, csvReaderConfig{std::move(csvReaderConfig)} { initReader(context); } diff --git a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h index 9665fec268c..bfe624de117 100644 --- a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h @@ -95,6 +95,8 @@ struct ParquetScanSharedState final : public function::ScanFileSharedState { const common::ReaderConfig readerConfig, uint64_t numRows, main::ClientContext* context); std::vector> readers; + uint64_t totalRowsGroups; + uint64_t numBlocksReadByFiles; }; struct ParquetScanLocalState final : public function::TableFuncLocalState { diff --git a/src/processor/operator/call/in_query_call.cpp b/src/processor/operator/call/in_query_call.cpp index d3ddd81ce69..fb93471f560 100644 --- a/src/processor/operator/call/in_query_call.cpp +++ b/src/processor/operator/call/in_query_call.cpp @@ -65,5 +65,9 @@ bool InQueryCall::getNextTuplesInternal(ExecutionContext*) { return numTuplesScanned != 0; } +double InQueryCall::getProgress(ExecutionContext* /*context*/) const { + return info.function.progressFunc(sharedState->funcState.get()); +} + } // namespace processor } // namespace kuzu diff --git a/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp index 59e74991257..3e961821c74 100644 --- a/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp @@ -114,6 +114,10 @@ bool BaseCSVReader::isEOF() const { return getFileOffset() >= fileInfo->getFileSize(); } +uint64_t BaseCSVReader::getFileSize() { + return fileInfo->getFileSize(); +} + template void BaseCSVReader::addValue(Driver& driver, uint64_t rowNum, column_id_t columnIdx, std::string_view strVal, std::vector& escapePositions) { diff --git a/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp index 4a11ad40d78..1071ad77a4d 100644 --- a/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp @@ -109,6 +109,7 @@ bool ParallelCSVReader::finishedBlock() const { void ParallelCSVScanSharedState::setFileComplete(uint64_t completedFileIdx) { std::lock_guard guard{lock}; if (completedFileIdx == fileIdx) { + numBlocksReadByFiles += blockIdx; blockIdx = 0; fileIdx++; } @@ -116,8 +117,10 @@ void ParallelCSVScanSharedState::setFileComplete(uint64_t completedFileIdx) { static offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output) { auto& outputChunk = output.dataChunk; - auto parallelCSVLocalState = reinterpret_cast(input.localState); - auto parallelCSVSharedState = reinterpret_cast(input.sharedState); + auto parallelCSVLocalState = + ku_dynamic_cast(input.localState); + auto parallelCSVSharedState = + ku_dynamic_cast(input.sharedState); do { if (parallelCSVLocalState->reader != nullptr && parallelCSVLocalState->reader->hasMoreToRead()) { @@ -152,7 +155,7 @@ static offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output) { static std::unique_ptr bindFunc( main::ClientContext* /*context*/, TableFuncBindInput* input) { - auto scanInput = reinterpret_cast(input); + auto scanInput = ku_dynamic_cast(input); std::vector detectedColumnNames; std::vector detectedColumnTypes; SerialCSVScan::bindColumns(scanInput, detectedColumnNames, detectedColumnTypes); @@ -165,28 +168,48 @@ static std::unique_ptr bindFunc( } static std::unique_ptr initSharedState(TableFunctionInitInput& input) { - auto bindData = reinterpret_cast(input.bindData); + auto bindData = ku_dynamic_cast(input.bindData); auto csvConfig = CSVReaderConfig::construct(bindData->config.options); row_idx_t numRows = 0; - return std::make_unique(bindData->config.copy(), numRows, - bindData->columnNames.size(), bindData->context, csvConfig.copy()); + auto sharedState = std::make_unique(bindData->config.copy(), + numRows, bindData->columnNames.size(), bindData->context, csvConfig.copy()); + for (auto filePath : sharedState->readerConfig.filePaths) { + auto reader = std::make_unique(filePath, + sharedState->csvReaderConfig.option.copy(), sharedState->numColumns, + sharedState->context); + sharedState->totalSize += reader->getFileSize(); + } + return sharedState; } static std::unique_ptr initLocalState(TableFunctionInitInput& /*input*/, TableFuncSharedState* state, storage::MemoryManager* /*mm*/) { auto localState = std::make_unique(); - auto sharedState = reinterpret_cast(state); + auto sharedState = ku_dynamic_cast(state); localState->reader = std::make_unique(sharedState->readerConfig.filePaths[0], sharedState->csvReaderConfig.option.copy(), sharedState->numColumns, sharedState->context); localState->fileIdx = 0; return localState; } +static double progressFunc(TableFuncSharedState* sharedState) { + auto state = ku_dynamic_cast(sharedState); + if (state->fileIdx >= state->readerConfig.getNumFiles()) { + return 1.0; + } + if (state->totalSize == 0) { + return 0.0; + } + uint64_t totalReadSize = + (state->numBlocksReadByFiles + state->blockIdx) * CopyConstants::PARALLEL_BLOCK_SIZE; + return static_cast(totalReadSize) / state->totalSize; +} + function_set ParallelCSVScan::getFunctionSet() { function_set functionSet; - functionSet.push_back( - std::make_unique(READ_CSV_PARALLEL_FUNC_NAME, tableFunc, bindFunc, - initSharedState, initLocalState, std::vector{LogicalTypeID::STRING})); + functionSet.push_back(std::make_unique(READ_CSV_PARALLEL_FUNC_NAME, tableFunc, + bindFunc, initSharedState, initLocalState, progressFunc, + std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp index 1bfa025e91a..74cdc5a9fa0 100644 --- a/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp @@ -55,6 +55,7 @@ void SerialCSVScanSharedState::read(DataChunk& outputChunk) { if (numRows > 0) { return; } + totalReadSizeByFile += reader->getFileSize(); fileIdx++; initReader(context); } while (true); @@ -68,7 +69,8 @@ void SerialCSVScanSharedState::initReader(main::ClientContext* context) { } static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output) { - auto serialCSVScanSharedState = reinterpret_cast(input.sharedState); + auto serialCSVScanSharedState = + ku_dynamic_cast(input.sharedState); serialCSVScanSharedState->read(output.dataChunk); return output.dataChunk.state->selVector->selectedSize; } @@ -99,7 +101,7 @@ void SerialCSVScan::bindColumns(const ScanTableFuncBindInput* bindInput, static std::unique_ptr bindFunc( main::ClientContext* /*context*/, TableFuncBindInput* input) { - auto scanInput = reinterpret_cast(input); + auto scanInput = ku_dynamic_cast(input); std::vector detectedColumnNames; std::vector detectedColumnTypes; SerialCSVScan::bindColumns(scanInput, detectedColumnNames, detectedColumnTypes); @@ -112,11 +114,18 @@ static std::unique_ptr bindFunc( } static std::unique_ptr initSharedState(TableFunctionInitInput& input) { - auto bindData = reinterpret_cast(input.bindData); + auto bindData = ku_dynamic_cast(input.bindData); auto csvConfig = CSVReaderConfig::construct(bindData->config.options); row_idx_t numRows = 0; - return std::make_unique(bindData->config.copy(), numRows, + auto sharedState = std::make_unique(bindData->config.copy(), numRows, bindData->columnNames.size(), csvConfig.copy(), bindData->context); + for (auto filePath : sharedState->readerConfig.filePaths) { + auto reader = + std::make_unique(filePath, sharedState->csvReaderConfig.option.copy(), + sharedState->numColumns, sharedState->context); + sharedState->totalSize += reader->getFileSize(); + } + return sharedState; } static std::unique_ptr initLocalState(TableFunctionInitInput& /*input*/, @@ -124,11 +133,22 @@ static std::unique_ptr initLocalState(TableFunctionInitInpu return std::make_unique(); } +static double progressFunc(TableFuncSharedState* sharedState) { + auto state = ku_dynamic_cast(sharedState); + if (state->totalSize == 0) { + return 0.0; + } else if (state->fileIdx >= state->readerConfig.getNumFiles()) { + return 1.0; + } + uint64_t totalReadSize = state->totalReadSizeByFile + state->reader->getFileOffset(); + return static_cast(totalReadSize) / state->totalSize; +} + function_set SerialCSVScan::getFunctionSet() { function_set functionSet; - functionSet.push_back( - std::make_unique(READ_CSV_SERIAL_FUNC_NAME, tableFunc, bindFunc, - initSharedState, initLocalState, std::vector{LogicalTypeID::STRING})); + functionSet.push_back(std::make_unique(READ_CSV_SERIAL_FUNC_NAME, tableFunc, + bindFunc, initSharedState, initLocalState, progressFunc, + std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp index 76f2e3cd4d8..ab92d893949 100644 --- a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp @@ -52,7 +52,8 @@ bool ParquetReader::scanInternal(ParquetReaderScanState& state, DataChunk& resul state.groupOffset = 0; auto& trans = - reinterpret_cast(*state.thriftFileProto->getTransport()); + ku_dynamic_cast( + *state.thriftFileProto->getTransport()); trans.ClearPrefetch(); state.currentGroupPrefetched = false; @@ -67,7 +68,8 @@ bool ParquetReader::scanInternal(ParquetReaderScanState& state, DataChunk& resul auto fileColIdx = colIdx; - auto rootReader = reinterpret_cast(state.rootReader.get()); + auto rootReader = + ku_dynamic_cast(state.rootReader.get()); toScanCompressedBytes += rootReader->getChildReader(fileColIdx)->getTotalCompressedSize(); } @@ -99,7 +101,8 @@ bool ParquetReader::scanInternal(ParquetReaderScanState& state, DataChunk& resul // Prefetch column-wise. for (auto colIdx = 0u; colIdx < result.getNumValueVectors(); colIdx++) { auto fileColIdx = colIdx; - auto rootReader = reinterpret_cast(state.rootReader.get()); + auto rootReader = + ku_dynamic_cast(state.rootReader.get()); rootReader->getChildReader(fileColIdx) ->registerPrefetch(trans, true /* lazy fetch */); @@ -136,7 +139,7 @@ bool ParquetReader::scanInternal(ParquetReaderScanState& state, DataChunk& resul auto definePtr = (uint8_t*)state.defineBuf.ptr; auto repeatPtr = (uint8_t*)state.repeatBuf.ptr; - auto rootReader = reinterpret_cast(state.rootReader.get()); + auto rootReader = ku_dynamic_cast(state.rootReader.get()); for (auto colIdx = 0u; colIdx < result.getNumValueVectors(); colIdx++) { auto fileColIdx = colIdx; @@ -168,7 +171,9 @@ void ParquetReader::scan(processor::ParquetReaderScanState& state, DataChunk& re void ParquetReader::initMetadata() { auto fileInfo = context->getVFSUnsafe()->openFile(filePath, O_RDONLY, context); auto proto = createThriftProtocol(fileInfo.get(), false); - auto& transport = reinterpret_cast(*proto->getTransport()); + auto& transport = + ku_dynamic_cast( + *proto->getTransport()); auto fileSize = transport.GetSize(); // LCOV_EXCL_START if (fileSize < 12) { @@ -563,6 +568,12 @@ ParquetScanSharedState::ParquetScanSharedState( : ScanFileSharedState{std::move(readerConfig), numRows, context} { readers.push_back( std::make_unique(this->readerConfig.filePaths[fileIdx], context)); + totalRowsGroups = 0; + for (auto i = fileIdx; i < this->readerConfig.getNumFiles(); i++) { + auto reader = std::make_unique(this->readerConfig.filePaths[i], context); + totalRowsGroups += reader->getNumRowsGroups(); + } + numBlocksReadByFiles = 0; } static bool parquetSharedStateNext( @@ -579,6 +590,8 @@ static bool parquetSharedStateNext( sharedState.blockIdx++; return true; } else { + sharedState.numBlocksReadByFiles += + sharedState.readers[sharedState.fileIdx]->getNumRowsGroups(); sharedState.blockIdx = 0; sharedState.fileIdx++; if (sharedState.fileIdx >= sharedState.readerConfig.getNumFiles()) { @@ -596,8 +609,10 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output if (input.localState == nullptr) { return 0; } - auto parquetScanLocalState = reinterpret_cast(input.localState); - auto parquetScanSharedState = reinterpret_cast(input.sharedState); + auto parquetScanLocalState = + ku_dynamic_cast(input.localState); + auto parquetScanSharedState = + ku_dynamic_cast(input.sharedState); do { parquetScanLocalState->reader->scan(*parquetScanLocalState->state, outputChunk); if (outputChunk.state->selVector->selectedSize > 0) { @@ -635,7 +650,8 @@ static void bindColumns(const ScanTableFuncBindInput* bindInput, static std::unique_ptr bindFunc( main::ClientContext* /*context*/, function::TableFuncBindInput* input) { - auto scanInput = reinterpret_cast(input); + auto scanInput = + ku_dynamic_cast(input); std::vector detectedColumnNames; std::vector detectedColumnTypes; bindColumns(scanInput, detectedColumnNames, detectedColumnTypes); @@ -653,7 +669,7 @@ static std::unique_ptr bindFunc( static std::unique_ptr initSharedState( TableFunctionInitInput& input) { - auto parquetScanBindData = reinterpret_cast(input.bindData); + auto parquetScanBindData = ku_dynamic_cast(input.bindData); row_idx_t numRows = 0; for (const auto& path : parquetScanBindData->config.filePaths) { auto reader = std::make_unique(path, parquetScanBindData->context); @@ -666,7 +682,8 @@ static std::unique_ptr initSharedState( static std::unique_ptr initLocalState( TableFunctionInitInput& /*input*/, TableFuncSharedState* state, storage::MemoryManager* /*mm*/) { - auto parquetScanSharedState = reinterpret_cast(state); + auto parquetScanSharedState = + ku_dynamic_cast(state); auto localState = std::make_unique(); if (!parquetSharedStateNext(*localState, *parquetScanSharedState)) { return nullptr; @@ -674,11 +691,23 @@ static std::unique_ptr initLocalState( return localState; } +static double progressFunc(TableFuncSharedState* sharedState) { + auto state = ku_dynamic_cast(sharedState); + if (state->fileIdx >= state->readerConfig.getNumFiles()) { + return 1.0; + } + if (state->totalRowsGroups == 0) { + return 0.0; + } + uint64_t totalReadSize = state->numBlocksReadByFiles + state->blockIdx; + return static_cast(totalReadSize) / state->totalRowsGroups; +} + function_set ParquetScanFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back( - std::make_unique(READ_PARQUET_FUNC_NAME, tableFunc, bindFunc, - initSharedState, initLocalState, std::vector{LogicalTypeID::STRING})); + functionSet.push_back(std::make_unique(READ_PARQUET_FUNC_NAME, tableFunc, + bindFunc, initSharedState, initLocalState, progressFunc, + std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/tools/python_api/src_cpp/include/pandas/pandas_scan.h b/tools/python_api/src_cpp/include/pandas/pandas_scan.h index d7243c60eaa..681f80f6b90 100644 --- a/tools/python_api/src_cpp/include/pandas/pandas_scan.h +++ b/tools/python_api/src_cpp/include/pandas/pandas_scan.h @@ -17,10 +17,12 @@ struct PandasScanLocalState : public function::TableFuncLocalState { }; struct PandasScanSharedState : public function::BaseScanSharedState { - explicit PandasScanSharedState(uint64_t numRows) : BaseScanSharedState{numRows}, position{0} {} + explicit PandasScanSharedState(uint64_t numRows) + : BaseScanSharedState{numRows}, position{0}, numReadRows{0} {} std::mutex lock; uint64_t position; + uint64_t numReadRows; }; struct PandasScanFunction { diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index 054d38711ad..6be70a4e665 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -35,7 +35,7 @@ std::unique_ptr bindFunc( bool sharedStateNext(const TableFuncBindData* /*bindData*/, PandasScanLocalState* localState, TableFuncSharedState* sharedState) { - auto pandasSharedState = reinterpret_cast(sharedState); + auto pandasSharedState = ku_dynamic_cast(sharedState); std::lock_guard lck{pandasSharedState->lock}; if (pandasSharedState->position >= pandasSharedState->numRows) { return false; @@ -63,7 +63,7 @@ std::unique_ptr initSharedState( throw RuntimeException("PandasScan called but GIL was already held!"); } // LCOV_EXCL_STOP - auto scanBindData = reinterpret_cast(input.bindData); + auto scanBindData = ku_dynamic_cast(input.bindData); return std::make_unique(scanBindData->numRows); } @@ -81,8 +81,9 @@ void pandasBackendScanSwitch( offset_t tableFunc( TableFuncInput& input, TableFuncOutput& output) { - auto pandasScanData = reinterpret_cast(input.bindData); - auto pandasLocalState = reinterpret_cast(input.localState); + auto pandasScanData = ku_dynamic_cast(input.bindData); + auto pandasLocalState = ku_dynamic_cast(input.localState); + auto pandasSharedState = ku_dynamic_cast(input.sharedState); if (pandasLocalState->start >= pandasLocalState->end) { if (!sharedStateNext(input.bindData, pandasLocalState, input.sharedState)) { @@ -97,6 +98,7 @@ offset_t tableFunc( } output.dataChunk.state->selVector->selectedSize = numValuesToOutput; pandasLocalState->start += numValuesToOutput; + pandasSharedState->numReadRows += numValuesToOutput; return numValuesToOutput; } @@ -109,9 +111,18 @@ std::vector> PandasScanFunctionData::copyC return result; } +static double progressFunc(TableFuncSharedState* sharedState) { + auto pandasSharedState = ku_dynamic_cast(sharedState); + if (pandasSharedState->numRows == 0) { + return 0.0; + } + return static_cast(pandasSharedState->numReadRows) / + pandasSharedState->numRows; +} + static TableFunction getFunction() { return TableFunction(READ_PANDAS_FUNC_NAME, tableFunc, bindFunc, initSharedState, - initLocalState, std::vector{LogicalTypeID::POINTER}); + initLocalState, progressFunc, std::vector{LogicalTypeID::POINTER}); } function_set PandasScanFunction::getFunctionSet() { diff --git a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp index 853be429cce..9cfdc986309 100644 --- a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp +++ b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp @@ -85,18 +85,27 @@ static common::offset_t tableFunc( return len; } +double progressFunc(function::TableFuncSharedState* sharedState) { + PyArrowTableScanSharedState* state = + ku_dynamic_cast(sharedState); + if (state->chunks.size() == 0) { + return 0.0; + } + return static_cast(state->currentChunk) / state->chunks.size(); +} + function::function_set PyArrowTableScanFunction::getFunctionSet() { function_set functionSet; functionSet.push_back( std::make_unique(READ_PYARROW_FUNC_NAME, tableFunc, bindFunc, - initSharedState, initLocalState, std::vector{LogicalTypeID::POINTER})); + initSharedState, initLocalState, progressFunc, std::vector{LogicalTypeID::POINTER})); return functionSet; } TableFunction PyArrowTableScanFunction::getFunction() { return TableFunction(READ_PYARROW_FUNC_NAME, tableFunc, bindFunc, initSharedState, - initLocalState, std::vector{LogicalTypeID::POINTER}); + initLocalState, progressFunc, std::vector{LogicalTypeID::POINTER}); } } // namespace kuzu From cf71770aaaecbfd0028e751d74f75e6bbf46aee8 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Thu, 28 Mar 2024 18:38:07 -0700 Subject: [PATCH 110/136] Fixed shell incorrect command seg fault (#3173) I have read and agree to the CLA of the Kuzu repository. --- tools/shell/embedded_shell.cpp | 7 +------ tools/shell/test/test_shell_commands.py | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/tools/shell/embedded_shell.cpp b/tools/shell/embedded_shell.cpp index a82dd9ff05b..36676b666c4 100644 --- a/tools/shell/embedded_shell.cpp +++ b/tools/shell/embedded_shell.cpp @@ -20,11 +20,6 @@ #include "common/task_system/progress_bar.h" -// TODO: REMOVE -#ifdef _WIN32 -#include -#endif - using namespace kuzu::common; using namespace kuzu::utf8proc; @@ -51,7 +46,7 @@ struct ShellCommand { const char* QUIT = ":quit"; const char* MAX_ROWS = ":max_rows"; const char* MAX_WIDTH = ":max_width"; - const std::array commandList = {HELP, CLEAR, QUIT, MAX_ROWS, MAX_WIDTH}; + const std::array commandList = {HELP, CLEAR, QUIT, MAX_ROWS, MAX_WIDTH}; } shellCommand; const char* TAB = " "; diff --git a/tools/shell/test/test_shell_commands.py b/tools/shell/test/test_shell_commands.py index ed610c2dbd5..c7bd10c7185 100644 --- a/tools/shell/test/test_shell_commands.py +++ b/tools/shell/test/test_shell_commands.py @@ -125,15 +125,16 @@ def test_max_width(temp_db, csv_path) -> None: result.check_not_stdout("| ... |") result.check_stdout("(1 column)") - def test_bad_command(temp_db) -> None: - test = ShellTest().add_argument(temp_db).statement(":maxrows").statement(":quiy").statement("clearr;") - result = test.run() - result.check_stdout( - 'Error: Unknown command: ":maxrows". Enter ":help" for help', - ) - result.check_stdout('Did you mean: ":max_rows"?') - result.check_stdout('Error: Unknown command: ":quiy". Enter ":help" for help') - result.check_stdout('Did you mean: ":quit"?') - result.check_stdout( - 'Error: "clearr;" is not a valid Cypher query. Did you mean to issue a CLI command, e.g., ":clear"?', - ) + +def test_bad_command(temp_db) -> None: + test = ShellTest().add_argument(temp_db).statement(":maxrows").statement(":quiy").statement("clearr;") + result = test.run() + result.check_stdout( + 'Error: Unknown command: ":maxrows". Enter ":help" for help', + ) + result.check_stdout('Did you mean: ":max_rows"?') + result.check_stdout('Error: Unknown command: ":quiy". Enter ":help" for help') + result.check_stdout('Did you mean: ":quit"?') + result.check_stdout( + 'Error: "clearr;" is not a valid Cypher query. Did you mean to issue a CLI command, e.g., ":clear"?', + ) From fb8f4c7f394fc35ad044c8beb64cdfe9cafc6439 Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Thu, 28 Mar 2024 22:03:49 -0400 Subject: [PATCH 111/136] Cache files when replaying WAL (#3137) --- src/include/storage/wal/wal_record.h | 14 ++++++++++++++ src/include/storage/wal_replayer.h | 6 ++++-- src/storage/wal_replayer.cpp | 24 ++++++++++++++++++------ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/include/storage/wal/wal_record.h b/src/include/storage/wal/wal_record.h index 018f55c9bf9..9948717d2c8 100644 --- a/src/include/storage/wal/wal_record.h +++ b/src/include/storage/wal/wal_record.h @@ -3,6 +3,7 @@ #include "common/enums/table_type.h" #include "common/types/internal_id_t.h" #include "common/types/types.h" +#include "function/hash/hash_functions.h" namespace kuzu { namespace storage { @@ -234,3 +235,16 @@ struct WALRecord { } // namespace storage } // namespace kuzu + +namespace std { +template<> +struct hash { + size_t operator()(const kuzu::storage::DBFileID& fileId) const { + auto dbFileTypeHash = std::hash()(static_cast(fileId.dbFileType)); + auto isOverflowHash = std::hash()(fileId.isOverflow); + auto nodeIndexIDHash = std::hash()(fileId.nodeIndexID.tableID); + return kuzu::function::combineHashScalar( + dbFileTypeHash, kuzu::function::combineHashScalar(isOverflowHash, nodeIndexIDHash)); + } +}; +} // namespace std diff --git a/src/include/storage/wal_replayer.h b/src/include/storage/wal_replayer.h index 2c7fb789982..fb5479d5745 100644 --- a/src/include/storage/wal_replayer.h +++ b/src/include/storage/wal_replayer.h @@ -27,8 +27,10 @@ class WALReplayer { private: void init(); - void replayWALRecord(WALRecord& walRecord); - void replayPageUpdateOrInsertRecord(const WALRecord& walRecord); + void replayWALRecord(WALRecord& walRecord, + std::unordered_map>& fileCache); + void replayPageUpdateOrInsertRecord(const WALRecord& walRecord, + std::unordered_map>& fileCache); void replayTableStatisticsRecord(const WALRecord& walRecord); void replayCatalogRecord(); void replayCreateTableRecord(const WALRecord& walRecord); diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index c3639f2293c..e5895fd558e 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -1,10 +1,14 @@ #include "storage/wal_replayer.h" +#include + #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "common/exception/storage.h" +#include "common/file_system/file_info.h" #include "storage/storage_manager.h" #include "storage/storage_utils.h" #include "storage/store/node_table.h" +#include "storage/wal/wal_record.h" #include "storage/wal_replayer_utils.h" #include "transaction/transaction.h" @@ -42,9 +46,10 @@ void WALReplayer::replay() { if (!wal->isEmptyWAL()) { auto walIterator = wal->getIterator(); WALRecord walRecord; + std::unordered_map> fileCache; while (walIterator->hasNextRecord()) { walIterator->getNextRecord(walRecord); - replayWALRecord(walRecord); + replayWALRecord(walRecord, fileCache); } } // We next perform an in-memory checkpointing or rolling back of node/relTables. @@ -57,10 +62,11 @@ void WALReplayer::replay() { } } -void WALReplayer::replayWALRecord(WALRecord& walRecord) { +void WALReplayer::replayWALRecord( + WALRecord& walRecord, std::unordered_map>& fileCache) { switch (walRecord.recordType) { case WALRecordType::PAGE_UPDATE_OR_INSERT_RECORD: { - replayPageUpdateOrInsertRecord(walRecord); + replayPageUpdateOrInsertRecord(walRecord, fileCache); } break; case WALRecordType::TABLE_STATISTICS_RECORD: { replayTableStatisticsRecord(walRecord); @@ -95,12 +101,18 @@ void WALReplayer::replayWALRecord(WALRecord& walRecord) { } } -void WALReplayer::replayPageUpdateOrInsertRecord(const WALRecord& walRecord) { +void WALReplayer::replayPageUpdateOrInsertRecord(const WALRecord& walRecord, + std::unordered_map>& fileCache) { // 1. As the first step we copy over the page on disk, regardless of if we are recovering // (and checkpointing) or checkpointing while during regular execution. auto dbFileID = walRecord.pageInsertOrUpdateRecord.dbFileID; - std::unique_ptr fileInfoOfDBFile = - StorageUtils::getFileInfoForReadWrite(wal->getDirectory(), dbFileID, vfs); + auto entry = fileCache.find(dbFileID); + if (entry == fileCache.end()) { + fileCache.insert(std::make_pair( + dbFileID, StorageUtils::getFileInfoForReadWrite(wal->getDirectory(), dbFileID, vfs))); + entry = fileCache.find(dbFileID); + } + auto& fileInfoOfDBFile = entry->second; if (isCheckpoint) { if (!wal->isLastLoggedRecordCommit()) { // Nothing to undo. From f80a6ebda0bbe1fac41ea7622e86f035fa2e6cd5 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Fri, 29 Mar 2024 10:56:35 -0400 Subject: [PATCH 112/136] Support join hash table on aggregate types (#3174) --- src/binder/expression/expression_util.cpp | 6 +- .../binder/expression/expression_util.h | 2 +- src/include/common/type_utils.h | 3 +- src/include/common/types/types.h | 7 + src/include/function/hash/hash_functions.h | 6 - .../operator/aggregate/aggregate_hash_table.h | 25 +- .../processor/operator/base_hash_table.h | 48 ---- .../operator/hash_join/join_hash_table.h | 45 ++-- .../operator/intersect/intersect_build.h | 2 +- .../processor/result/base_hash_table.h | 48 ++++ src/processor/map/map_hash_join.cpp | 6 +- src/processor/map/map_intersect.cpp | 3 +- .../aggregate/aggregate_hash_table.cpp | 231 ++---------------- .../operator/aggregate/hash_aggregate.cpp | 2 + .../operator/hash_join/hash_join_build.cpp | 4 +- .../operator/hash_join/hash_join_probe.cpp | 2 +- .../operator/hash_join/join_hash_table.cpp | 164 ++----------- src/processor/result/CMakeLists.txt | 1 + src/processor/result/base_hash_table.cpp | 171 +++++++++++++ .../tinysnb/generic_hash_join/basic.test | 33 +++ 20 files changed, 335 insertions(+), 474 deletions(-) delete mode 100644 src/include/processor/operator/base_hash_table.h create mode 100644 src/include/processor/result/base_hash_table.h create mode 100644 src/processor/result/base_hash_table.cpp diff --git a/src/binder/expression/expression_util.cpp b/src/binder/expression/expression_util.cpp index 920d0ddb5aa..78c7ed9cdec 100644 --- a/src/binder/expression/expression_util.cpp +++ b/src/binder/expression/expression_util.cpp @@ -87,12 +87,12 @@ expression_vector ExpressionUtil::excludeExpressions( return result; } -std::vector> ExpressionUtil::getDataTypes( +logical_type_vec_t ExpressionUtil::getDataTypes( const kuzu::binder::expression_vector& expressions) { - std::vector> result; + std::vector result; result.reserve(expressions.size()); for (auto& expression : expressions) { - result.push_back(expression->getDataType().copy()); + result.push_back(*expression->getDataType().copy()); } return result; } diff --git a/src/include/binder/expression/expression_util.h b/src/include/binder/expression/expression_util.h index d011185218a..3060f771538 100644 --- a/src/include/binder/expression/expression_util.h +++ b/src/include/binder/expression/expression_util.h @@ -25,7 +25,7 @@ struct ExpressionUtil { static expression_vector excludeExpressions( const expression_vector& expressions, const expression_vector& expressionsToExclude); - static common::logical_types_t getDataTypes(const expression_vector& expressions); + static common::logical_type_vec_t getDataTypes(const expression_vector& expressions); static expression_vector removeDuplication(const expression_vector& expressions); diff --git a/src/include/common/type_utils.h b/src/include/common/type_utils.h index 2f9fb7b2bf4..0c50619c500 100644 --- a/src/include/common/type_utils.h +++ b/src/include/common/type_utils.h @@ -232,10 +232,11 @@ class TypeUtils { return func(ku_string_t()); case PhysicalTypeID::VAR_LIST: return func(list_entry_t()); + case PhysicalTypeID::STRUCT: + return func(struct_entry_t()); /* NOLINTEND(bugprone-branch-clone)*/ case PhysicalTypeID::ANY: case PhysicalTypeID::POINTER: - case PhysicalTypeID::STRUCT: // Unsupported type KU_UNREACHABLE; } diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 76b8448db8f..7377701cd02 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -8,6 +8,7 @@ #include "common/api.h" #include "common/assert.h" #include "common/types/internal_id_t.h" +#include "common/types/interval_t.h" namespace kuzu { namespace processor { @@ -89,6 +90,12 @@ concept IndexHashable = ((std::integral && !std::is_same_v) || std:: std::is_same_v || std::is_same_v || std::same_as); +template +concept HashableTypes = (std::integral || std::floating_point || + std::is_same_v || std::is_same_v || + std::is_same_v || std::is_same_v || + std::is_same_v || std::is_same_v); + enum class KUZU_API LogicalTypeID : uint8_t { ANY = 0, NODE = 10, diff --git a/src/include/function/hash/hash_functions.h b/src/include/function/hash/hash_functions.h index cfa32f9b897..2812d747ddd 100644 --- a/src/include/function/hash/hash_functions.h +++ b/src/include/function/hash/hash_functions.h @@ -15,12 +15,6 @@ namespace kuzu { namespace function { -template -concept HashableTypes = (std::integral || std::floating_point || - std::is_same_v || - std::is_same_v || - std::is_same_v); - constexpr const uint64_t NULL_HASH = UINT64_MAX; inline common::hash_t murmurhash64(uint64_t x) { diff --git a/src/include/processor/operator/aggregate/aggregate_hash_table.h b/src/include/processor/operator/aggregate/aggregate_hash_table.h index fb39e8f7147..017c5a74b96 100644 --- a/src/include/processor/operator/aggregate/aggregate_hash_table.h +++ b/src/include/processor/operator/aggregate/aggregate_hash_table.h @@ -2,7 +2,7 @@ #include "aggregate_input.h" #include "function/aggregate_function.h" -#include "processor/operator/base_hash_table.h" +#include "processor/result/base_hash_table.h" #include "storage/buffer_manager/memory_manager.h" namespace kuzu { @@ -31,7 +31,6 @@ struct HashSlot { * */ class AggregateHashTable; -using compare_function_t = std::function; using update_agg_function_t = std::function&, const std::vector&, std::unique_ptr&, @@ -41,7 +40,7 @@ class AggregateHashTable : public BaseHashTable { public: // Used by distinct aggregate hash table only. AggregateHashTable(storage::MemoryManager& memoryManager, - const std::vector& keysDataTypes, + const common::logical_type_vec_t& keysDataTypes, const std::vector>& aggregateFunctions, uint64_t numEntriesToAllocate) : AggregateHashTable(memoryManager, keysDataTypes, std::vector(), @@ -53,13 +52,13 @@ class AggregateHashTable : public BaseHashTable { const std::vector>& aggregateFunctions, uint64_t numEntriesToAllocate); - inline uint8_t* getEntry(uint64_t idx) { return factorizedTable->getTuple(idx); } + uint8_t* getEntry(uint64_t idx) { return factorizedTable->getTuple(idx); } - inline FactorizedTable* getFactorizedTable() { return factorizedTable.get(); } + FactorizedTable* getFactorizedTable() { return factorizedTable.get(); } - inline uint64_t getNumEntries() const { return factorizedTable->getNumTuples(); } + uint64_t getNumEntries() const { return factorizedTable->getNumTuples(); } - inline void append(const std::vector& flatKeyVectors, + void append(const std::vector& flatKeyVectors, const std::vector& unFlatKeyVectors, common::DataChunkState* leadingState, const std::vector>& aggregateInputs, @@ -87,9 +86,6 @@ class AggregateHashTable : public BaseHashTable { void resize(uint64_t newSize); - static void getCompareEntryWithKeysFunc( - const common::LogicalType& logicalType, compare_function_t& func); - private: void initializeFT( const std::vector>& aggregateFunctions); @@ -128,11 +124,6 @@ class AggregateHashTable : public BaseHashTable { const std::vector& dependentKeyVectors, common::DataChunkState* leadingState); - void computeAndCombineVecHash( - const std::vector& unFlatKeyVectors, uint32_t startVecIdx); - void computeVectorHashes(const std::vector& flatKeyVectors, - const std::vector& unFlatKeyVectors); - void updateDistinctAggState(const std::vector& flatKeyVectors, const std::vector& unFlatKeyVectors, std::unique_ptr& aggregateFunction, @@ -215,7 +206,6 @@ class AggregateHashTable : public BaseHashTable { common::ValueVector* aggVector, uint64_t multiplicity, uint32_t aggStateOffset); private: - std::vector keyDataTypes; std::vector dependentKeyDataTypes; std::vector> aggregateFunctions; @@ -227,11 +217,8 @@ class AggregateHashTable : public BaseHashTable { uint32_t aggStateColIdxInFT; uint32_t numBytesForKeys = 0; uint32_t numBytesForDependentKeys = 0; - std::vector compareFuncs; std::vector updateAggFuncs; // Temporary arrays to hold intermediate results. - std::shared_ptr hashState; - std::unique_ptr hashVector; std::unique_ptr hashSlotsToUpdateAggState; std::unique_ptr tmpValueIdxes; std::unique_ptr entryIdxesToInitialize; diff --git a/src/include/processor/operator/base_hash_table.h b/src/include/processor/operator/base_hash_table.h deleted file mode 100644 index 4699b32eab6..00000000000 --- a/src/include/processor/operator/base_hash_table.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include - -#include "common/utils.h" -#include "processor/result/factorized_table.h" -#include "storage/buffer_manager/memory_manager.h" - -namespace kuzu { -namespace processor { - -class BaseHashTable { -public: - explicit BaseHashTable(storage::MemoryManager& memoryManager) - : maxNumHashSlots{0}, bitmask{0}, numSlotsPerBlockLog2{0}, slotIdxInBlockMask{0}, - memoryManager{memoryManager} {} - - virtual ~BaseHashTable() = default; - -protected: - inline void setMaxNumHashSlots(uint64_t newSize) { - maxNumHashSlots = newSize; - bitmask = maxNumHashSlots - 1; - } - - inline void initSlotConstant(uint64_t numSlotsPerBlock_) { - KU_ASSERT(numSlotsPerBlock_ == common::nextPowerOfTwo(numSlotsPerBlock_)); - numSlotsPerBlock = numSlotsPerBlock_; - numSlotsPerBlockLog2 = std::log2(numSlotsPerBlock); - slotIdxInBlockMask = - common::BitmaskUtils::all1sMaskForLeastSignificantBits(numSlotsPerBlockLog2); - } - - inline uint64_t getSlotIdxForHash(common::hash_t hash) const { return hash & bitmask; } - -protected: - uint64_t maxNumHashSlots; - uint64_t bitmask; - uint64_t numSlotsPerBlock; - uint64_t numSlotsPerBlockLog2; - uint64_t slotIdxInBlockMask; - std::vector> hashSlotsBlocks; - storage::MemoryManager& memoryManager; - std::unique_ptr factorizedTable; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/hash_join/join_hash_table.h b/src/include/processor/operator/hash_join/join_hash_table.h index e31510a9081..a069fa4911c 100644 --- a/src/include/processor/operator/hash_join/join_hash_table.h +++ b/src/include/processor/operator/hash_join/join_hash_table.h @@ -1,21 +1,14 @@ #pragma once -#include - -#include "processor/operator/base_hash_table.h" +#include "processor/result/base_hash_table.h" #include "storage/buffer_manager/memory_manager.h" namespace kuzu { namespace processor { class JoinHashTable : public BaseHashTable { - using hash_function_t = std::function; - using compare_function_t = - std::function; - public: - JoinHashTable(storage::MemoryManager& memoryManager, - std::vector> keyTypes, + JoinHashTable(storage::MemoryManager& memoryManager, common::logical_type_vec_t keyTypes, std::unique_ptr tableSchema); void appendVectors(const std::vector& keyVectors, @@ -40,42 +33,38 @@ class JoinHashTable : public BaseHashTable { common::sel_t matchUnFlatKey(common::ValueVector* keyVector, uint8_t** probedTuples, uint8_t** matchedTuples, common::SelectionVector* matchedTuplesSelVector); - inline void lookup(std::vector& vectors, - std::vector& colIdxesToScan, uint8_t** tuplesToRead, uint64_t startPos, - uint64_t numTuplesToRead) { + void lookup(std::vector& vectors, std::vector& colIdxesToScan, + uint8_t** tuplesToRead, uint64_t startPos, uint64_t numTuplesToRead) { factorizedTable->lookup(vectors, colIdxesToScan, tuplesToRead, startPos, numTuplesToRead); } - inline void merge(JoinHashTable& other) { factorizedTable->merge(*other.factorizedTable); } - inline uint64_t getNumTuples() { return factorizedTable->getNumTuples(); } - inline uint8_t** getPrevTuple(const uint8_t* tuple) const { + void merge(JoinHashTable& other) { factorizedTable->merge(*other.factorizedTable); } + uint64_t getNumTuples() { return factorizedTable->getNumTuples(); } + uint8_t** getPrevTuple(const uint8_t* tuple) const { return (uint8_t**)(tuple + prevPtrColOffset); } - inline uint8_t* getTupleForHash(common::hash_t hash) { + uint8_t* getTupleForHash(common::hash_t hash) { auto slotIdx = getSlotIdxForHash(hash); return ((uint8_t**)(hashSlotsBlocks[slotIdx >> numSlotsPerBlockLog2] ->getData()))[slotIdx & slotIdxInBlockMask]; } - inline FactorizedTable* getFactorizedTable() { return factorizedTable.get(); } - inline const FactorizedTableSchema* getTableSchema() { - return factorizedTable->getTableSchema(); - } + FactorizedTable* getFactorizedTable() { return factorizedTable.get(); } + const FactorizedTableSchema* getTableSchema() { return factorizedTable->getTableSchema(); } private: - uint8_t** findHashSlot(uint8_t* tuple) const; + uint8_t** findHashSlot(const uint8_t* tuple) const; // This function returns the pointer that previously stored in the same slot. uint8_t* insertEntry(uint8_t* tuple) const; bool compareFlatKeys(const std::vector& keyVectors, const uint8_t* tuple); - void initFunctions(); - void getHashFunction(common::PhysicalTypeID physicalTypeID, hash_function_t& func); - void getCompareFunction(common::PhysicalTypeID physicalTypeID, compare_function_t& func); + // Join hash table assumes all keys to be flat. + void computeVectorHashes(std::vector keyVectors); -private: - std::vector> keyTypes; - std::vector entryHashFunctions; - std::vector entryCompareFunctions; + common::offset_t getHashValueColOffset() const; +private: + static constexpr uint64_t PREV_PTR_COL_IDX = 1; + static constexpr uint64_t HASH_COL_IDX = 2; const FactorizedTableSchema* tableSchema; uint64_t prevPtrColOffset; }; diff --git a/src/include/processor/operator/intersect/intersect_build.h b/src/include/processor/operator/intersect/intersect_build.h index 8f43e7b176e..16baeba5280 100644 --- a/src/include/processor/operator/intersect/intersect_build.h +++ b/src/include/processor/operator/intersect/intersect_build.h @@ -18,7 +18,7 @@ class IntersectBuild : public HashJoinBuild { children[0]->clone(), id, paramsString); } - inline void appendVectors() final { + void appendVectors() final { KU_ASSERT(keyVectors.size() == 1); hashTable->appendVectorWithSorting(keyVectors[0], payloadVectors); } diff --git a/src/include/processor/result/base_hash_table.h b/src/include/processor/result/base_hash_table.h new file mode 100644 index 00000000000..9472530b3ff --- /dev/null +++ b/src/include/processor/result/base_hash_table.h @@ -0,0 +1,48 @@ +#pragma once + +#include "common/types/types.h" +#include "processor/result/factorized_table.h" +#include "storage/buffer_manager/memory_manager.h" + +namespace kuzu { +namespace processor { + +using compare_function_t = std::function; + +class BaseHashTable { +public: + BaseHashTable(storage::MemoryManager& memoryManager, common::logical_type_vec_t keyTypes); + + virtual ~BaseHashTable() = default; + +protected: + uint64_t getSlotIdxForHash(common::hash_t hash) const { return hash & bitmask; } + void setMaxNumHashSlots(uint64_t newSize); + void computeAndCombineVecHash( + const std::vector& unFlatKeyVectors, uint32_t startVecIdx); + void computeVectorHashes(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors); + void initSlotConstant(uint64_t numSlotsPerBlock_); + +private: + void initCompareFuncs(); + void initTmpHashVector(); + +protected: + uint64_t maxNumHashSlots; + uint64_t bitmask; + uint64_t numSlotsPerBlock; + uint64_t numSlotsPerBlockLog2; + uint64_t slotIdxInBlockMask; + std::vector> hashSlotsBlocks; + storage::MemoryManager& memoryManager; + std::unique_ptr factorizedTable; + std::vector compareEntryFuncs; + common::logical_type_vec_t keyTypes; + // Temporary arrays to hold intermediate results for appending. + std::shared_ptr hashState; + std::unique_ptr hashVector; +}; + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/map/map_hash_join.cpp b/src/processor/map/map_hash_join.cpp index e662b24b104..d6c9a18de4f 100644 --- a/src/processor/map/map_hash_join.cpp +++ b/src/processor/map/map_hash_join.cpp @@ -47,9 +47,11 @@ std::unique_ptr PlanMapper::createHashBuildInfo( tableSchema->appendColumn(std::move(columnSchema)); payloadsPos.push_back(pos); } - auto pointerType = LogicalType(LogicalTypeID::INT64); + auto hashValueColumn = std::make_unique(false /* isUnFlat */, + INVALID_DATA_CHUNK_POS, LogicalTypeUtils::getRowLayoutSize(*LogicalType::HASH())); + tableSchema->appendColumn(std::move(hashValueColumn)); auto pointerColumn = std::make_unique(false /* isUnFlat */, - INVALID_DATA_CHUNK_POS, LogicalTypeUtils::getRowLayoutSize(pointerType)); + INVALID_DATA_CHUNK_POS, LogicalTypeUtils::getRowLayoutSize(*LogicalType::INT64())); tableSchema->appendColumn(std::move(pointerColumn)); return std::make_unique( std::move(keysPos), std::move(fStateTypes), std::move(payloadsPos), std::move(tableSchema)); diff --git a/src/processor/map/map_intersect.cpp b/src/processor/map/map_intersect.cpp index a59f2c27b69..2c1b5a7cb83 100644 --- a/src/processor/map/map_intersect.cpp +++ b/src/processor/map/map_intersect.cpp @@ -23,14 +23,13 @@ std::unique_ptr PlanMapper::mapIntersect(LogicalOperator* logi for (auto i = 1u; i < logicalIntersect->getNumChildren(); i++) { auto keyNodeID = logicalIntersect->getKeyNodeID(i - 1); auto keys = expression_vector{keyNodeID}; - auto keyTypes = ExpressionUtil::getDataTypes(keys); auto buildSchema = logicalIntersect->getChild(i)->getSchema(); auto buildPrevOperator = mapOperator(logicalIntersect->getChild(i).get()); auto payloadExpressions = binder::ExpressionUtil::excludeExpressions(buildSchema->getExpressionsInScope(), keys); auto buildInfo = createHashBuildInfo(*buildSchema, keys, payloadExpressions); auto globalHashTable = std::make_unique(*clientContext->getMemoryManager(), - LogicalType::copy(keyTypes), buildInfo->getTableSchema()->copy()); + ExpressionUtil::getDataTypes(keys), buildInfo->getTableSchema()->copy()); auto sharedState = std::make_shared(std::move(globalHashTable)); sharedStates.push_back(sharedState); children[i] = make_unique( diff --git a/src/processor/operator/aggregate/aggregate_hash_table.cpp b/src/processor/operator/aggregate/aggregate_hash_table.cpp index 0111f7b2359..1b29edc6e4a 100644 --- a/src/processor/operator/aggregate/aggregate_hash_table.cpp +++ b/src/processor/operator/aggregate/aggregate_hash_table.cpp @@ -1,8 +1,6 @@ #include "processor/operator/aggregate/aggregate_hash_table.h" -#include "common/null_buffer.h" #include "common/utils.h" -#include "function/comparison/comparison_functions.h" #include "function/hash/vector_hash_functions.h" using namespace kuzu::common; @@ -16,12 +14,12 @@ AggregateHashTable::AggregateHashTable(MemoryManager& memoryManager, std::vector keyDataTypes, std::vector dependentKeyDataTypes, const std::vector>& aggregateFunctions, uint64_t numEntriesToAllocate) - : BaseHashTable{memoryManager}, keyDataTypes{std::move(keyDataTypes)}, - dependentKeyDataTypes{std::move(dependentKeyDataTypes)} { + : BaseHashTable{memoryManager, std::move(keyDataTypes)}, dependentKeyDataTypes{ + std::move(dependentKeyDataTypes)} { initializeFT(aggregateFunctions); initializeHashTable(numEntriesToAllocate); distinctHashTables = AggregateHashTableUtils::createDistinctHashTables( - memoryManager, this->keyDataTypes, this->aggregateFunctions); + memoryManager, this->keyTypes, this->aggregateFunctions); initializeTmpVectors(); } @@ -68,13 +66,13 @@ bool AggregateHashTable::isAggregateValueDistinctForGroupByKeys( void AggregateHashTable::merge(AggregateHashTable& other) { std::shared_ptr vectorsToScanState = std::make_shared(); - std::vector vectorsToScan(keyDataTypes.size() + dependentKeyDataTypes.size()); - std::vector groupByHashVectors(keyDataTypes.size()); + std::vector vectorsToScan(keyTypes.size() + dependentKeyDataTypes.size()); + std::vector groupByHashVectors(keyTypes.size()); std::vector groupByNonHashVectors(dependentKeyDataTypes.size()); - std::vector> hashKeyVectors(keyDataTypes.size()); + std::vector> hashKeyVectors(keyTypes.size()); std::vector> nonHashKeyVectors(groupByNonHashVectors.size()); - for (auto i = 0u; i < keyDataTypes.size(); i++) { - auto hashKeyVec = std::make_unique(keyDataTypes[i], &memoryManager); + for (auto i = 0u; i < keyTypes.size(); i++) { + auto hashKeyVec = std::make_unique(keyTypes[i], &memoryManager); hashKeyVec->state = vectorsToScanState; vectorsToScan[i] = hashKeyVec.get(); groupByHashVectors[i] = hashKeyVec.get(); @@ -84,7 +82,7 @@ void AggregateHashTable::merge(AggregateHashTable& other) { auto nonHashKeyVec = std::make_unique(dependentKeyDataTypes[i], &memoryManager); nonHashKeyVec->state = vectorsToScanState; - vectorsToScan[i + keyDataTypes.size()] = nonHashKeyVec.get(); + vectorsToScan[i + keyTypes.size()] = nonHashKeyVec.get(); groupByNonHashVectors[i] = nonHashKeyVec.get(); nonHashKeyVectors[i] = std::move(nonHashKeyVec); } @@ -133,21 +131,16 @@ void AggregateHashTable::initializeFT( auto isUnflat = false; auto dataChunkPos = 0u; std::unique_ptr tableSchema = std::make_unique(); - aggStateColIdxInFT = keyDataTypes.size() + dependentKeyDataTypes.size(); - compareFuncs.resize(keyDataTypes.size()); - auto colIdx = 0u; - for (auto& dataType : keyDataTypes) { + aggStateColIdxInFT = keyTypes.size() + dependentKeyDataTypes.size(); + for (auto& dataType : keyTypes) { auto size = LogicalTypeUtils::getRowLayoutSize(dataType); tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); - getCompareEntryWithKeysFunc(dataType, compareFuncs[colIdx]); numBytesForKeys += size; - colIdx++; } for (auto& dataType : dependentKeyDataTypes) { auto size = LogicalTypeUtils::getRowLayoutSize(dataType); tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); numBytesForDependentKeys += size; - colIdx++; } aggStateColOffsetInFT = numBytesForKeys + numBytesForDependentKeys; @@ -182,10 +175,6 @@ void AggregateHashTable::initializeHashTable(uint64_t numEntriesToAllocate) { } void AggregateHashTable::initializeTmpVectors() { - hashState = std::make_shared(); - hashState->setToFlat(); - hashVector = std::make_unique(LogicalTypeID::INT64, &memoryManager); - hashVector->state = hashState; hashSlotsToUpdateAggState = std::make_unique(DEFAULT_VECTOR_CAPACITY); tmpValueIdxes = std::make_unique(DEFAULT_VECTOR_CAPACITY); entryIdxesToInitialize = std::make_unique(DEFAULT_VECTOR_CAPACITY); @@ -369,33 +358,6 @@ void AggregateHashTable::findHashSlots(const std::vector& flatKeyV } } -void AggregateHashTable::computeAndCombineVecHash( - const std::vector& unFlatKeyVectors, uint32_t startVecIdx) { - for (; startVecIdx < unFlatKeyVectors.size(); startVecIdx++) { - auto keyVector = unFlatKeyVectors[startVecIdx]; - auto tmpHashResultVector = - std::make_unique(LogicalTypeID::INT64, &memoryManager); - auto tmpHashCombineResultVector = - std::make_unique(LogicalTypeID::INT64, &memoryManager); - VectorHashFunction::computeHash(keyVector, tmpHashResultVector.get()); - VectorHashFunction::combineHash( - hashVector.get(), tmpHashResultVector.get(), tmpHashCombineResultVector.get()); - hashVector = std::move(tmpHashCombineResultVector); - } -} - -void AggregateHashTable::computeVectorHashes(const std::vector& flatKeyVectors, - const std::vector& unFlatKeyVectors) { - if (!flatKeyVectors.empty()) { - VectorHashFunction::computeHash(flatKeyVectors[0], hashVector.get()); - computeAndCombineVecHash(flatKeyVectors, 1 /* startVecIdx */); - computeAndCombineVecHash(unFlatKeyVectors, 0 /* startVecIdx */); - } else { - VectorHashFunction::computeHash(unFlatKeyVectors[0], hashVector.get()); - computeAndCombineVecHash(unFlatKeyVectors, 1 /* startVecIdx */); - } -} - void AggregateHashTable::updateDistinctAggState(const std::vector& flatKeyVectors, const std::vector& /*unFlatKeyVectors*/, std::unique_ptr& aggregateFunction, ValueVector* aggregateVector, @@ -477,7 +439,7 @@ bool AggregateHashTable::matchFlatGroupByKeys( } else if (isKeyVectorNull != isEntryKeyNull) { return false; } - if (!compareFuncs[i]( + if (!compareEntryFuncs[i]( keyVector, pos, entry + factorizedTable->getTableSchema()->getColOffset(i))) { return false; } @@ -494,7 +456,7 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( if (factorizedTable->hasNoNullGuarantee(colIdx)) { for (auto i = 0u; i < numMayMatches; i++) { auto idx = mayMatchIdxes[i]; - if (compareFuncs[colIdx]( + if (compareEntryFuncs[colIdx]( vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { @@ -512,7 +474,7 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( noMatchIdxes[numNoMatches++] = idx; continue; } - if (compareFuncs[colIdx]( + if (compareEntryFuncs[colIdx]( vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { @@ -536,7 +498,7 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( continue; } - if (compareFuncs[colIdx]( + if (compareEntryFuncs[colIdx]( vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { @@ -567,7 +529,8 @@ uint64_t AggregateHashTable::matchFlatVecWithFTColumn( noMatchIdxes[numNoMatches++] = idx; continue; } - if (compareFuncs[colIdx](vector, pos, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + if (compareEntryFuncs[colIdx]( + vector, pos, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { noMatchIdxes[numNoMatches++] = idx; @@ -630,166 +593,6 @@ void AggregateHashTable::resizeHashTableIfNecessary(uint32_t maxNumDistinctHashK } } -template -static bool compareEntry(common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { - uint8_t result; - auto key = vector->getData() + vectorPos * vector->getNumBytesPerValue(); - function::Equals::operation( - *(T*)key, *(T*)entry, result, nullptr /* leftVector */, nullptr /* rightVector */); - return result != 0; -} - -template<> -bool compareEntry( - common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { - auto dataVector = ListVector::getDataVector(vector); - auto listToCompare = vector->getValue(vectorPos); - auto listEntry = reinterpret_cast(entry); - auto entryNullBytes = reinterpret_cast(listEntry->overflowPtr); - auto entryValues = entryNullBytes + NullBuffer::getNumBytesForNullValues(listEntry->size); - auto rowLayoutSize = LogicalTypeUtils::getRowLayoutSize(dataVector->dataType); - compare_function_t compareFunc; - AggregateHashTable::getCompareEntryWithKeysFunc(dataVector->dataType, compareFunc); - if (listToCompare.size != listEntry->size) { - return false; - } - for (auto i = 0u; i < listEntry->size; i++) { - if (!compareFunc(dataVector, listToCompare.offset + i, entryValues)) { - return false; - } - entryValues += rowLayoutSize; - } - return true; -} - -template<> -bool compareEntry( - common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { - auto numFields = StructType::getNumFields(&vector->dataType); - auto entryToCompare = entry + NullBuffer::getNumBytesForNullValues(numFields); - for (auto i = 0u; i < numFields; i++) { - auto isNullInEntry = NullBuffer::isNull(entry, i); - auto fieldVector = StructVector::getFieldVector(vector, i); - compare_function_t compareFunc; - AggregateHashTable::getCompareEntryWithKeysFunc(fieldVector->dataType, compareFunc); - // Firstly check null on left and right side. - if (isNullInEntry != fieldVector->isNull(vectorPos)) { - return false; - } - // If both not null, compare the value. - if (!isNullInEntry && !compareFunc(fieldVector.get(), vectorPos, entryToCompare)) { - return false; - } - entryToCompare += LogicalTypeUtils::getRowLayoutSize(fieldVector->dataType); - } - return true; -} - -static bool compareNodeEntry( - common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { - KU_ASSERT(0 == common::StructType::getFieldIdx(&vector->dataType, common::InternalKeyword::ID)); - auto idVector = common::StructVector::getFieldVector(vector, 0).get(); - return compareEntry(idVector, vectorPos, - entry + common::NullBuffer::getNumBytesForNullValues( - common::StructType::getNumFields(&vector->dataType))); -} - -static bool compareRelEntry(common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { - KU_ASSERT(3 == common::StructType::getFieldIdx(&vector->dataType, common::InternalKeyword::ID)); - auto idVector = common::StructVector::getFieldVector(vector, 3).get(); - return compareEntry(idVector, vectorPos, - entry + sizeof(common::internalID_t) * 2 + sizeof(common::ku_string_t) + - common::NullBuffer::getNumBytesForNullValues( - common::StructType::getNumFields(&vector->dataType))); -} - -void AggregateHashTable::getCompareEntryWithKeysFunc( - const LogicalType& logicalType, compare_function_t& func) { - switch (logicalType.getPhysicalType()) { - case PhysicalTypeID::INTERNAL_ID: { - func = compareEntry; - return; - } - case PhysicalTypeID::BOOL: { - func = compareEntry; - return; - } - case PhysicalTypeID::INT64: { - func = compareEntry; - return; - } - case PhysicalTypeID::INT32: { - func = compareEntry; - return; - } - case PhysicalTypeID::INT16: { - func = compareEntry; - return; - } - case PhysicalTypeID::INT8: { - func = compareEntry; - return; - } - case PhysicalTypeID::UINT64: { - func = compareEntry; - return; - } - case PhysicalTypeID::UINT32: { - func = compareEntry; - return; - } - case PhysicalTypeID::UINT16: { - func = compareEntry; - return; - } - case PhysicalTypeID::UINT8: { - func = compareEntry; - return; - } - case PhysicalTypeID::INT128: { - func = compareEntry; - return; - } - case PhysicalTypeID::DOUBLE: { - func = compareEntry; - return; - } - case PhysicalTypeID::FLOAT: { - func = compareEntry; - return; - } - case PhysicalTypeID::STRING: { - func = compareEntry; - return; - } - case PhysicalTypeID::INTERVAL: { - func = compareEntry; - return; - } - case PhysicalTypeID::STRUCT: { - if (logicalType.getLogicalTypeID() == LogicalTypeID::NODE) { - func = compareNodeEntry; - return; - } else if (logicalType.getLogicalTypeID() == LogicalTypeID::REL) { - func = compareRelEntry; - return; - } else { - func = compareEntry; - return; - } - } - case PhysicalTypeID::VAR_LIST: { - func = compareEntry; - return; - } - default: { - throw RuntimeException( - "Cannot compare data type " + - PhysicalTypeUtils::physicalTypeToString(logicalType.getPhysicalType())); - } - } -} - void AggregateHashTable::updateNullAggVectorState(const std::vector& flatKeyVectors, const std::vector& unFlatKeyVectors, std::unique_ptr& aggregateFunction, uint64_t multiplicity, diff --git a/src/processor/operator/aggregate/hash_aggregate.cpp b/src/processor/operator/aggregate/hash_aggregate.cpp index 3fa4647fae0..1fc641d76f2 100644 --- a/src/processor/operator/aggregate/hash_aggregate.cpp +++ b/src/processor/operator/aggregate/hash_aggregate.cpp @@ -1,5 +1,7 @@ #include "processor/operator/aggregate/hash_aggregate.h" +#include "common/utils.h" + using namespace kuzu::common; using namespace kuzu::function; using namespace kuzu::storage; diff --git a/src/processor/operator/hash_join/hash_join_build.cpp b/src/processor/operator/hash_join/hash_join_build.cpp index 14dfd163b73..3749a3fce65 100644 --- a/src/processor/operator/hash_join/hash_join_build.cpp +++ b/src/processor/operator/hash_join/hash_join_build.cpp @@ -12,10 +12,10 @@ void HashJoinSharedState::mergeLocalHashTable(JoinHashTable& localHashTable) { } void HashJoinBuild::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { - std::vector> keyTypes; + std::vector keyTypes; for (auto i = 0u; i < info->keysPos.size(); ++i) { auto vector = resultSet->getValueVector(info->keysPos[i]).get(); - keyTypes.push_back(vector->dataType.copy()); + keyTypes.push_back(*vector->dataType.copy()); if (info->fStateTypes[i] == common::FStateType::UNFLAT) { setKeyState(vector->state.get()); } diff --git a/src/processor/operator/hash_join/hash_join_probe.cpp b/src/processor/operator/hash_join/hash_join_probe.cpp index 76b0e10f314..8305582885b 100644 --- a/src/processor/operator/hash_join/hash_join_probe.cpp +++ b/src/processor/operator/hash_join/hash_join_probe.cpp @@ -18,7 +18,7 @@ void HashJoinProbe::initLocalStateInternal(ResultSet* resultSet, ExecutionContex } // We only need to read nonKeys from the factorizedTable. Key columns are always kept as first k // columns in the factorizedTable, so we skip the first k columns. - KU_ASSERT(probeDataInfo.keysDataPos.size() + probeDataInfo.getNumPayloads() + 1 == + KU_ASSERT(probeDataInfo.keysDataPos.size() + probeDataInfo.getNumPayloads() + 2 == sharedState->getHashTable()->getTableSchema()->getNumColumns()); columnIdxsToReadFrom.resize(probeDataInfo.getNumPayloads()); iota( diff --git a/src/processor/operator/hash_join/join_hash_table.cpp b/src/processor/operator/hash_join/join_hash_table.cpp index c17457b94f2..e50e7a48aa1 100644 --- a/src/processor/operator/hash_join/join_hash_table.cpp +++ b/src/processor/operator/hash_join/join_hash_table.cpp @@ -1,6 +1,6 @@ #include "processor/operator/hash_join/join_hash_table.h" -#include "function/comparison/comparison_functions.h" +#include "common/utils.h" #include "function/hash/vector_hash_functions.h" using namespace kuzu::common; @@ -10,26 +10,15 @@ using namespace kuzu::function; namespace kuzu { namespace processor { -JoinHashTable::JoinHashTable(MemoryManager& memoryManager, - std::vector> keyTypes, +JoinHashTable::JoinHashTable(MemoryManager& memoryManager, logical_type_vec_t keyTypes, std::unique_ptr tableSchema) - : BaseHashTable{memoryManager}, keyTypes{std::move(keyTypes)} { + : BaseHashTable{memoryManager, std::move(keyTypes)} { auto numSlotsPerBlock = BufferPoolConstants::PAGE_256KB_SIZE / sizeof(uint8_t*); initSlotConstant(numSlotsPerBlock); // Prev pointer is always the last column in the table. - prevPtrColOffset = tableSchema->getColOffset(tableSchema->getNumColumns() - 1); + prevPtrColOffset = tableSchema->getColOffset(tableSchema->getNumColumns() - PREV_PTR_COL_IDX); factorizedTable = std::make_unique(&memoryManager, std::move(tableSchema)); this->tableSchema = factorizedTable->getTableSchema(); - initFunctions(); -} - -void JoinHashTable::initFunctions() { - entryHashFunctions.resize(keyTypes.size()); - entryCompareFunctions.resize(keyTypes.size()); - for (auto i = 0u; i < keyTypes.size(); ++i) { - getHashFunction(keyTypes[i]->getPhysicalType(), entryHashFunctions[i]); - getCompareFunction(keyTypes[i]->getPhysicalType(), entryCompareFunctions[i]); - } } static bool discardNullFromKeys(const std::vector& vectors) { @@ -48,6 +37,7 @@ void JoinHashTable::appendVectors(const std::vector& keyVectors, discardNullFromKeys(keyVectors); auto numTuplesToAppend = keyState->selVector->selectedSize; auto appendInfos = factorizedTable->allocateFlatTupleBlocks(numTuplesToAppend); + computeVectorHashes(keyVectors); auto colIdx = 0u; for (auto& vector : keyVectors) { appendVector(vector, appendInfos, colIdx++); @@ -55,6 +45,7 @@ void JoinHashTable::appendVectors(const std::vector& keyVectors, for (auto& vector : payloadVectors) { appendVector(vector, appendInfos, colIdx++); } + appendVector(hashVector.get(), appendInfos, colIdx); factorizedTable->numTuples += numTuplesToAppend; } @@ -96,10 +87,13 @@ void JoinHashTable::appendVectorWithSorting( auto appendInfos = factorizedTable->allocateFlatTupleBlocks(numTuplesToAppend); KU_ASSERT(appendInfos.size() == 1); auto colIdx = 0u; + std::vector keyVectors = {keyVector}; + computeVectorHashes(keyVectors); factorizedTable->copyVectorToColumn(*keyVector, appendInfos[0], numTuplesToAppend, colIdx++); for (auto& vector : payloadVectors) { factorizedTable->copyVectorToColumn(*vector, appendInfos[0], numTuplesToAppend, colIdx++); } + factorizedTable->copyVectorToColumn(*hashVector, appendInfos[0], numTuplesToAppend, colIdx); if (!payloadsState->isFlat()) { payloadsState->selVector->resetSelectorToUnselected(); } @@ -170,8 +164,7 @@ sel_t JoinHashTable::matchUnFlatKey(ValueVector* keyVector, uint8_t** probedTupl auto pos = keyVector->state->selVector->selectedPositions[i]; while (probedTuples[i]) { auto currentTuple = probedTuples[i]; - uint8_t entryCompareResult = false; - entryCompareFunctions[0](*keyVector, pos, currentTuple, entryCompareResult); + auto entryCompareResult = compareEntryFuncs[0](keyVector, pos, currentTuple); if (entryCompareResult) { matchedTuples[numMatchedTuples] = currentTuple; matchedTuplesSelVector->selectedPositions[numMatchedTuples] = pos; @@ -184,16 +177,8 @@ sel_t JoinHashTable::matchUnFlatKey(ValueVector* keyVector, uint8_t** probedTupl return numMatchedTuples; } -uint8_t** JoinHashTable::findHashSlot(uint8_t* tuple) const { - auto idx = 0u; - hash_t hash; - entryHashFunctions[idx++](tuple, hash); - hash_t tmpHash; - while (idx < keyTypes.size()) { - entryHashFunctions[idx](tuple + tableSchema->getColOffset(idx), tmpHash); - function::CombineHash::operation(hash, tmpHash, hash); - idx++; - } +uint8_t** JoinHashTable::findHashSlot(const uint8_t* tuple) const { + auto hash = *(hash_t*)(tuple + getHashValueColOffset()); auto slotIdx = getSlotIdxForHash(hash); return (uint8_t**)(hashSlotsBlocks[slotIdx >> numSlotsPerBlockLog2]->getData() + (slotIdx & slotIdxInBlockMask) * sizeof(uint8_t*)); @@ -208,12 +193,11 @@ uint8_t* JoinHashTable::insertEntry(uint8_t* tuple) const { bool JoinHashTable::compareFlatKeys( const std::vector& keyVectors, const uint8_t* tuple) { - uint8_t equal = false; for (auto i = 0u; i < keyVectors.size(); i++) { auto keyVector = keyVectors[i]; KU_ASSERT(keyVector->state->selVector->selectedSize == 1); auto pos = keyVector->state->selVector->selectedPositions[0]; - entryCompareFunctions[i](*keyVector, pos, tuple + tableSchema->getColOffset(i), equal); + auto equal = compareEntryFuncs[i](keyVector, pos, tuple + tableSchema->getColOffset(i)); if (!equal) { return false; } @@ -221,125 +205,13 @@ bool JoinHashTable::compareFlatKeys( return true; } -template -static void hashEntry(const uint8_t* entry, hash_t& result) { - Hash::operation(*(T*)entry, result); -} - -void JoinHashTable::getHashFunction(PhysicalTypeID physicalTypeID, hash_function_t& func) { - switch (physicalTypeID) { - case PhysicalTypeID::INTERNAL_ID: { - func = hashEntry; - } break; - case PhysicalTypeID::BOOL: { - func = hashEntry; - } break; - case PhysicalTypeID::INT64: { - func = hashEntry; - } break; - case PhysicalTypeID::INT32: { - func = hashEntry; - } break; - case PhysicalTypeID::INT16: { - func = hashEntry; - } break; - case PhysicalTypeID::INT8: { - func = hashEntry; - } break; - case PhysicalTypeID::UINT64: { - func = hashEntry; - } break; - case PhysicalTypeID::UINT32: { - func = hashEntry; - } break; - case PhysicalTypeID::UINT16: { - func = hashEntry; - } break; - case PhysicalTypeID::UINT8: { - func = hashEntry; - } break; - case PhysicalTypeID::INT128: { - func = hashEntry; - } break; - case PhysicalTypeID::DOUBLE: { - func = hashEntry; - } break; - case PhysicalTypeID::FLOAT: { - func = hashEntry; - } break; - case PhysicalTypeID::STRING: { - func = hashEntry; - } break; - case PhysicalTypeID::INTERVAL: { - func = hashEntry; - } break; - default: { - throw RuntimeException("Join hash table cannot hash data type " + - PhysicalTypeUtils::physicalTypeToString(physicalTypeID)); - } - } -} - -template -static void compareEntry( - const ValueVector& vector, uint32_t pos, const uint8_t* entry, uint8_t& result) { - Equals::operation(vector.getValue(pos), *(T*)entry, result, nullptr /* leftVector */, - nullptr /* rightVector */); +void JoinHashTable::computeVectorHashes(std::vector keyVectors) { + std::vector dummyUnFlatKeyVectors; + BaseHashTable::computeVectorHashes(keyVectors, dummyUnFlatKeyVectors); } -void JoinHashTable::getCompareFunction( - PhysicalTypeID physicalTypeID, JoinHashTable::compare_function_t& func) { - switch (physicalTypeID) { - case PhysicalTypeID::INTERNAL_ID: { - func = compareEntry; - } break; - case PhysicalTypeID::BOOL: { - func = compareEntry; - } break; - case PhysicalTypeID::INT64: { - func = compareEntry; - } break; - case PhysicalTypeID::INT32: { - func = compareEntry; - } break; - case PhysicalTypeID::INT16: { - func = compareEntry; - } break; - case PhysicalTypeID::INT8: { - func = compareEntry; - } - case PhysicalTypeID::UINT64: { - func = compareEntry; - } - case PhysicalTypeID::UINT32: { - func = compareEntry; - } - case PhysicalTypeID::UINT16: { - func = compareEntry; - } - case PhysicalTypeID::UINT8: { - func = compareEntry; - } - case PhysicalTypeID::INT128: { - func = compareEntry; - } - case PhysicalTypeID::DOUBLE: { - func = compareEntry; - } break; - case PhysicalTypeID::FLOAT: { - func = compareEntry; - } break; - case PhysicalTypeID::STRING: { - func = compareEntry; - } break; - case PhysicalTypeID::INTERVAL: { - func = compareEntry; - } break; - default: { - throw RuntimeException("Join hash table cannot compare data type " + - PhysicalTypeUtils::physicalTypeToString(physicalTypeID)); - } - } +offset_t JoinHashTable::getHashValueColOffset() const { + return tableSchema->getColOffset(tableSchema->getNumColumns() - HASH_COL_IDX); } } // namespace processor diff --git a/src/processor/result/CMakeLists.txt b/src/processor/result/CMakeLists.txt index bc19b447128..cfcc402ea2f 100644 --- a/src/processor/result/CMakeLists.txt +++ b/src/processor/result/CMakeLists.txt @@ -1,5 +1,6 @@ add_library(kuzu_processor_result OBJECT + base_hash_table.cpp factorized_table.cpp flat_tuple.cpp result_set.cpp diff --git a/src/processor/result/base_hash_table.cpp b/src/processor/result/base_hash_table.cpp new file mode 100644 index 00000000000..c6665c9b896 --- /dev/null +++ b/src/processor/result/base_hash_table.cpp @@ -0,0 +1,171 @@ +#include "processor/result/base_hash_table.h" + +#include "math.h" + +#include "common/null_buffer.h" +#include "common/utils.h" +#include "function/comparison/comparison_functions.h" +#include "function/hash/vector_hash_functions.h" + +using namespace kuzu::common; +using namespace kuzu::function; + +namespace kuzu { +namespace processor { + +BaseHashTable::BaseHashTable(storage::MemoryManager& memoryManager, logical_type_vec_t keyTypes) + : maxNumHashSlots{0}, bitmask{0}, numSlotsPerBlockLog2{0}, slotIdxInBlockMask{0}, + memoryManager{memoryManager}, keyTypes{std::move(keyTypes)} { + initCompareFuncs(); + initTmpHashVector(); +} + +void BaseHashTable::setMaxNumHashSlots(uint64_t newSize) { + maxNumHashSlots = newSize; + bitmask = maxNumHashSlots - 1; +} + +void BaseHashTable::computeAndCombineVecHash( + const std::vector& unFlatKeyVectors, uint32_t startVecIdx) { + for (; startVecIdx < unFlatKeyVectors.size(); startVecIdx++) { + auto keyVector = unFlatKeyVectors[startVecIdx]; + auto tmpHashResultVector = + std::make_unique(LogicalTypeID::INT64, &memoryManager); + auto tmpHashCombineResultVector = + std::make_unique(LogicalTypeID::INT64, &memoryManager); + VectorHashFunction::computeHash(keyVector, tmpHashResultVector.get()); + VectorHashFunction::combineHash( + hashVector.get(), tmpHashResultVector.get(), tmpHashCombineResultVector.get()); + hashVector = std::move(tmpHashCombineResultVector); + } +} + +void BaseHashTable::computeVectorHashes(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors) { + if (!flatKeyVectors.empty()) { + VectorHashFunction::computeHash(flatKeyVectors[0], hashVector.get()); + computeAndCombineVecHash(flatKeyVectors, 1 /* startVecIdx */); + computeAndCombineVecHash(unFlatKeyVectors, 0 /* startVecIdx */); + } else { + VectorHashFunction::computeHash(unFlatKeyVectors[0], hashVector.get()); + computeAndCombineVecHash(unFlatKeyVectors, 1 /* startVecIdx */); + } +} + +template +static bool compareEntry(common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { + uint8_t result; + auto key = vector->getData() + vectorPos * vector->getNumBytesPerValue(); + function::Equals::operation( + *(T*)key, *(T*)entry, result, nullptr /* leftVector */, nullptr /* rightVector */); + return result != 0; +} + +static compare_function_t getCompareEntryFunc(PhysicalTypeID type); + +template<> +[[maybe_unused]] bool compareEntry( + common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { + auto dataVector = ListVector::getDataVector(vector); + auto listToCompare = vector->getValue(vectorPos); + auto listEntry = reinterpret_cast(entry); + auto entryNullBytes = reinterpret_cast(listEntry->overflowPtr); + auto entryValues = entryNullBytes + NullBuffer::getNumBytesForNullValues(listEntry->size); + auto rowLayoutSize = LogicalTypeUtils::getRowLayoutSize(dataVector->dataType); + compare_function_t compareFunc = getCompareEntryFunc(dataVector->dataType.getPhysicalType()); + if (listToCompare.size != listEntry->size) { + return false; + } + for (auto i = 0u; i < listEntry->size; i++) { + if (!compareFunc(dataVector, listToCompare.offset + i, entryValues)) { + return false; + } + entryValues += rowLayoutSize; + } + return true; +} + +static bool compareNodeEntry( + common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { + KU_ASSERT(0 == common::StructType::getFieldIdx(&vector->dataType, common::InternalKeyword::ID)); + auto idVector = common::StructVector::getFieldVector(vector, 0).get(); + return compareEntry(idVector, vectorPos, + entry + common::NullBuffer::getNumBytesForNullValues( + common::StructType::getNumFields(&vector->dataType))); +} + +static bool compareRelEntry(common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { + KU_ASSERT(3 == common::StructType::getFieldIdx(&vector->dataType, common::InternalKeyword::ID)); + auto idVector = common::StructVector::getFieldVector(vector, 3).get(); + return compareEntry(idVector, vectorPos, + entry + sizeof(common::internalID_t) * 2 + sizeof(common::ku_string_t) + + common::NullBuffer::getNumBytesForNullValues( + common::StructType::getNumFields(&vector->dataType))); +} + +template<> +[[maybe_unused]] bool compareEntry( + common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { + switch (vector->dataType.getLogicalTypeID()) { + case LogicalTypeID::NODE: { + return compareNodeEntry(vector, vectorPos, entry); + } + case LogicalTypeID::REL: { + return compareRelEntry(vector, vectorPos, entry); + } + case LogicalTypeID::STRUCT: { + auto numFields = StructType::getNumFields(&vector->dataType); + auto entryToCompare = entry + NullBuffer::getNumBytesForNullValues(numFields); + for (auto i = 0u; i < numFields; i++) { + auto isNullInEntry = NullBuffer::isNull(entry, i); + auto fieldVector = StructVector::getFieldVector(vector, i); + compare_function_t compareFunc = + getCompareEntryFunc(fieldVector->dataType.getPhysicalType()); + // Firstly check null on left and right side. + if (isNullInEntry != fieldVector->isNull(vectorPos)) { + return false; + } + // If both not null, compare the value. + if (!isNullInEntry && !compareFunc(fieldVector.get(), vectorPos, entryToCompare)) { + return false; + } + entryToCompare += LogicalTypeUtils::getRowLayoutSize(fieldVector->dataType); + } + return true; + } + default: + KU_UNREACHABLE; + } +} + +static compare_function_t getCompareEntryFunc(PhysicalTypeID type) { + compare_function_t func; + TypeUtils::visit( + type, [&](T) { func = compareEntry; }, [](auto) { KU_UNREACHABLE; }); + return func; +} + +void BaseHashTable::initSlotConstant(uint64_t numSlotsPerBlock_) { + KU_ASSERT(numSlotsPerBlock_ == common::nextPowerOfTwo(numSlotsPerBlock_)); + numSlotsPerBlock = numSlotsPerBlock_; + numSlotsPerBlockLog2 = std::log2(numSlotsPerBlock); + slotIdxInBlockMask = + common::BitmaskUtils::all1sMaskForLeastSignificantBits(numSlotsPerBlockLog2); +} + +void BaseHashTable::initCompareFuncs() { + compareEntryFuncs.reserve(keyTypes.size()); + for (auto i = 0u; i < keyTypes.size(); ++i) { + compareEntryFuncs.push_back(getCompareEntryFunc(keyTypes[i].getPhysicalType())); + } +} + +void BaseHashTable::initTmpHashVector() { + hashState = std::make_shared(); + hashState->setToFlat(); + hashVector = std::make_unique(*LogicalType::HASH(), &memoryManager); + hashVector->state = hashState; +} + +} // namespace processor +} // namespace kuzu diff --git a/test/test_files/tinysnb/generic_hash_join/basic.test b/test/test_files/tinysnb/generic_hash_join/basic.test index ecdd6debce5..2164a780b9f 100644 --- a/test/test_files/tinysnb/generic_hash_join/basic.test +++ b/test/test_files/tinysnb/generic_hash_join/basic.test @@ -57,4 +57,37 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff|Hubert Blaine Wolfeschlegelste {rating: 5.300000, stars: 2, views: 152, release: 2011-08-20 11:25:30, release_ns: 2011-08-20 11:25:30.123456, release_ms: 2011-08-20 11:25:30.123, release_sec: 2011-08-20 11:25:30, release_tz: 2011-08-20 11:25:30.123456+00, film: 2012-05-11, u8: 220, u16: 20, u32: 1, u64: 180, hugedata: 1844674407370955161811111111}|{rating: 5.300000, stars: 2, views: 152, release: 2011-08-20 11:25:30, release_ns: 2011-08-20 11:25:30.123456, release_ms: 2011-08-20 11:25:30.123, release_sec: 2011-08-20 11:25:30, release_tz: 2011-08-20 11:25:30.123456+00, film: 2012-05-11, u8: 220, u16: 20, u32: 1, u64: 180, hugedata: 1844674407370955161811111111} {rating: 7.000000, stars: 10, views: 982, release: 2018-11-13 13:33:11, release_ns: 2018-11-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2018-11-13 13:33:11, release_tz: 2018-11-13 13:33:11.123456+00, film: 2014-09-12, u8: 12, u16: 120, u32: 55, u64: 1, hugedata: -1844674407370955161511}|{rating: 7.000000, stars: 10, views: 982, release: 2018-11-13 13:33:11, release_ns: 2018-11-13 13:33:11.123456, release_ms: 2018-11-13 13:33:11.123, release_sec: 2018-11-13 13:33:11, release_tz: 2018-11-13 13:33:11.123456+00, film: 2014-09-12, u8: 12, u16: 120, u32: 55, u64: 1, hugedata: -1844674407370955161511} +-STATEMENT MATCH (a:person), (b:person) WHERE a.workedHours = b.workedHours RETURN a.ID, b.ID +---- 8 +0|0 +10|10 +2|2 +3|3 +5|5 +7|7 +8|8 +9|9 +-STATEMENT MATCH (a:person), (b:person) WHERE a.courseScoresPerTerm = b.courseScoresPerTerm AND a.ID = b.ID RETURN SUM(a.ID) +---- 1 +44 + +-STATEMENT MATCH (a:person), (b:person) WHERE a.grades = b.grades AND a.ID = 2 RETURN a.age +---- 1 +30 + +-STATEMENT MATCH (a:person), (b:person) WHERE a.u = b.u AND a.ID = 0 RETURN a.ID +---- 1 +0 + +-STATEMENT MATCH (o:organisation), (o1:organisation) WHERE o.state = o1.state RETURN o.name +---- 3 +ABFsUni +CsWork +DEsWork + +-STATEMENT MATCH (v1:movies), (v2:movies) WHERE v1.audience = v2.audience RETURN v1.name +---- 3 +Roma +Sóló cón tu párejâ +The 😂😃🧘🏻‍♂️🌍🌦️🍞🚗 movie From fa528c127f0d85add4c47f87382d2a934e6dd184 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Sat, 30 Mar 2024 02:49:51 -0400 Subject: [PATCH 113/136] Fix delete then scan bug (#3176) --- .../storage/stats/node_table_statistics.h | 7 +-- .../storage/stats/nodes_store_statistics.h | 4 +- .../stats/table_statistics_collection.h | 10 +++++ src/include/storage/store/node_table.h | 10 +++-- src/processor/operator/scan_node_id.cpp | 18 ++++---- src/storage/stats/node_table_statistics.cpp | 43 +++++++++---------- src/storage/stats/nodes_store_statistics.cpp | 19 +++++--- .../update_node/delete_tinysnb.test | 7 ++- 8 files changed, 69 insertions(+), 49 deletions(-) diff --git a/src/include/storage/stats/node_table_statistics.h b/src/include/storage/stats/node_table_statistics.h index 520e0a5c3d8..a50fa3d3fa4 100644 --- a/src/include/storage/stats/node_table_statistics.h +++ b/src/include/storage/stats/node_table_statistics.h @@ -36,11 +36,8 @@ class NodeTableStatsAndDeletedIDs : public TableStatistics { void deleteNode(common::offset_t nodeOffset); - // This function assumes that it is being called right after ScanNodeID has obtained a - // morsel and that the nodeID structs in nodeOffsetVector.values have consecutive node - // offsets and the same tableID. - void setDeletedNodeOffsetsForMorsel( - const std::shared_ptr& nodeOffsetVector); + // This function assumes nodeIDVector have consecutive node offsets and the same tableID. + void setDeletedNodeOffsetsForMorsel(common::ValueVector* nodeIDVector) const; void setNumTuples(uint64_t numTuples) override; diff --git a/src/include/storage/stats/nodes_store_statistics.h b/src/include/storage/stats/nodes_store_statistics.h index ca064a49502..d96f47d07f9 100644 --- a/src/include/storage/stats/nodes_store_statistics.h +++ b/src/include/storage/stats/nodes_store_statistics.h @@ -65,8 +65,8 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { getNodeTableStats(transaction::TransactionType::WRITE, tableID)->deleteNode(nodeOffset); } - void setDeletedNodeOffsetsForMorsel(transaction::Transaction* transaction, - const std::shared_ptr& nodeOffsetVector, common::table_id_t tableID); + void setDeletedNodeOffsetsForMorsel(transaction::Transaction* tx, + common::ValueVector* nodeIDVector, common::table_id_t tableID); void addNodeStatisticsAndDeletedIDs(catalog::NodeTableCatalogEntry* nodeTableEntry); diff --git a/src/include/storage/stats/table_statistics_collection.h b/src/include/storage/stats/table_statistics_collection.h index 0db3498eda9..f80eee113e8 100644 --- a/src/include/storage/stats/table_statistics_collection.h +++ b/src/include/storage/stats/table_statistics_collection.h @@ -11,6 +11,11 @@ namespace storage { struct TablesStatisticsContent { std::unordered_map> tableStatisticPerTable; + + const TableStatistics* getTableStat(common::table_id_t tableID) const { + KU_ASSERT(tableStatisticPerTable.contains(tableID)); + return tableStatisticPerTable.at(tableID).get(); + } }; class WAL; @@ -87,6 +92,11 @@ class TablesStatistics { virtual std::string getTableStatisticsFilePath( const std::string& directory, common::FileVersionType dbFileType) = 0; + const TablesStatisticsContent* getVersion(transaction::TransactionType type) const { + return type == transaction::TransactionType::READ_ONLY ? readOnlyVersion.get() : + readWriteVersion.get(); + } + void readFromFile(); void readFromFile(common::FileVersionType dbFileType); diff --git a/src/include/storage/store/node_table.h b/src/include/storage/store/node_table.h index 08ec3f877a4..c93eccc09f1 100644 --- a/src/include/storage/store/node_table.h +++ b/src/include/storage/store/node_table.h @@ -55,11 +55,13 @@ class NodeTable final : public Table { tablesStatistics); return nodesStats->getMaxNodeOffset(transaction, tableID); } - inline void setSelVectorForDeletedOffsets( - transaction::Transaction* trx, std::shared_ptr& vector) const { + void setSelVectorForDeletedOffsets( + transaction::Transaction* trx, common::ValueVector* vector) const { KU_ASSERT(vector->isSequential()); - common::ku_dynamic_cast(tablesStatistics) - ->setDeletedNodeOffsetsForMorsel(trx, vector, tableID); + auto nodeStateCollection = + common::ku_dynamic_cast( + tablesStatistics); + nodeStateCollection->setDeletedNodeOffsetsForMorsel(trx, vector, tableID); } inline void initializeReadState(transaction::Transaction* transaction, diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index aed9f85d891..8185109425f 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -68,6 +68,7 @@ bool ScanNodeID::getNextTuplesInternal(ExecutionContext* context) { if (state == nullptr) { return false; } + outValueVector->state->selVector->resetSelectorToUnselected(); auto nodeIDValues = (nodeID_t*)(outValueVector->getData()); auto size = endOffset - startOffset; for (auto i = 0u; i < size; ++i) { @@ -83,24 +84,25 @@ bool ScanNodeID::getNextTuplesInternal(ExecutionContext* context) { void ScanNodeID::setSelVector(ExecutionContext* context, NodeTableScanState* tableState, offset_t startOffset, offset_t endOffset) { + // Apply changes to the selVector from nodes metadata. + tableState->getTable()->setSelVectorForDeletedOffsets( + context->clientContext->getTx(), outValueVector.get()); if (tableState->isSemiMaskEnabled()) { - outValueVector->state->selVector->resetSelectorToValuePosBuffer(); + auto selectedBuffer = outValueVector->state->selVector->getSelectedPositionsBuffer(); + sel_t prevSelectedSize = outValueVector->state->selVector->selectedSize; // Fill selected positions based on node mask for nodes between the given startOffset and // endOffset. If the node is masked (i.e., valid for read), then it is set to the selected // positions. Finally, we update the selectedSize for selVector. sel_t numSelectedValues = 0; for (auto i = 0u; i < (endOffset - startOffset); i++) { - outValueVector->state->selVector->selectedPositions[numSelectedValues] = i; + selectedBuffer[numSelectedValues] = i; numSelectedValues += tableState->getSemiMask()->isNodeMasked(i + startOffset); } outValueVector->state->selVector->selectedSize = numSelectedValues; - } else { - // By default, the selected positions is set to the const incremental pos array. - outValueVector->state->selVector->resetSelectorToUnselected(); + if (prevSelectedSize != numSelectedValues) { + outValueVector->state->selVector->resetSelectorToValuePosBuffer(); + } } - // Apply changes to the selVector from nodes metadata. - tableState->getTable()->setSelVectorForDeletedOffsets( - context->clientContext->getTx(), outValueVector); } double ScanNodeID::getProgress(ExecutionContext* /*context*/) const { diff --git a/src/storage/stats/node_table_statistics.cpp b/src/storage/stats/node_table_statistics.cpp index 07f01751c27..e890fb92d42 100644 --- a/src/storage/stats/node_table_statistics.cpp +++ b/src/storage/stats/node_table_statistics.cpp @@ -104,33 +104,32 @@ void NodeTableStatsAndDeletedIDs::deleteNode(offset_t nodeOffset) { // Note: this function will always be called right after scanNodeID, so we have the guarantee // that the nodeOffsetVector is always unselected. -void NodeTableStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( - const std::shared_ptr& nodeOffsetVector) { - auto morselIdxAndOffset = StorageUtils::getQuotientRemainder( - nodeOffsetVector->readNodeOffset(0), DEFAULT_VECTOR_CAPACITY); - if (hasDeletedNodesPerMorsel[morselIdxAndOffset.first]) { - auto deletedNodeOffsets = deletedNodeOffsetsPerMorsel[morselIdxAndOffset.first]; - uint64_t morselBeginOffset = morselIdxAndOffset.first * DEFAULT_VECTOR_CAPACITY; - nodeOffsetVector->state->selVector->resetSelectorToValuePosBuffer(); +void NodeTableStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel(ValueVector* nodeIDVector) const { + auto [morselIdx, _] = StorageUtils::getQuotientRemainder( + nodeIDVector->readNodeOffset(0), DEFAULT_VECTOR_CAPACITY); + if (hasDeletedNodesPerMorsel[morselIdx]) { + auto& deletedNodeOffsets = deletedNodeOffsetsPerMorsel.at(morselIdx); + uint64_t morselBeginOffset = morselIdx * DEFAULT_VECTOR_CAPACITY; + auto originalSize = nodeIDVector->state->getOriginalSize(); auto itr = deletedNodeOffsets.begin(); - sel_t nextDeletedNodeOffset = *itr - morselBeginOffset; - uint64_t nextSelectedPosition = 0; - for (auto pos = 0u; pos < nodeOffsetVector->state->getOriginalSize(); ++pos) { - if (pos == nextDeletedNodeOffset) { + common::sel_t numSelectedValue = 0; + auto selectedBuffer = nodeIDVector->state->selVector->getSelectedPositionsBuffer(); + KU_ASSERT(nodeIDVector->state->selVector->isUnfiltered()); + for (auto pos = 0u; pos < nodeIDVector->state->getOriginalSize(); ++pos) { + if (itr == deletedNodeOffsets.end()) { // no more deleted offset to check. + selectedBuffer[numSelectedValue++] = pos; + continue; + } + if (pos + morselBeginOffset == *itr) { // node has been deleted. itr++; - if (itr == deletedNodeOffsets.end()) { - nextDeletedNodeOffset = UINT16_MAX; - // We do not break because we need to keep setting the positions after - // the last deletedNodeOffset. - continue; - } - nextDeletedNodeOffset = *itr - morselBeginOffset; continue; } - nodeOffsetVector->state->selVector->selectedPositions[nextSelectedPosition++] = pos; + selectedBuffer[numSelectedValue++] = pos; + } + if (numSelectedValue != originalSize) { + nodeIDVector->state->selVector->resetSelectorToValuePosBuffer(); } - nodeOffsetVector->state->selVector->selectedSize = - nodeOffsetVector->state->getOriginalSize() - deletedNodeOffsets.size(); + nodeIDVector->state->selVector->selectedSize = numSelectedValue; } } diff --git a/src/storage/stats/nodes_store_statistics.cpp b/src/storage/stats/nodes_store_statistics.cpp index a5bae6b3818..30075acb48f 100644 --- a/src/storage/stats/nodes_store_statistics.cpp +++ b/src/storage/stats/nodes_store_statistics.cpp @@ -1,6 +1,7 @@ #include "storage/stats/nodes_store_statistics.h" using namespace kuzu::common; +using namespace kuzu::transaction; namespace kuzu { namespace storage { @@ -28,8 +29,7 @@ void NodesStoreStatsAndDeletedIDs::updateNumTuplesByValue(table_id_t tableID, in } void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( - transaction::Transaction* transaction, const std::shared_ptr& nodeOffsetVector, - table_id_t tableID) { + transaction::Transaction* tx, ValueVector* nodeIDVector, table_id_t tableID) { // NOTE: We can remove the lock under the following assumptions, that should currently hold: // 1) During the phases when nodeStatisticsAndDeletedIDsPerTableForReadOnlyTrx change, which // is during checkpointing, this function, which is called during scans, cannot be called. @@ -39,11 +39,16 @@ void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( // query where scans/reads happen in a write transaction cannot run concurrently with the // pipeline that performs an add/delete node. lock_t lck{mtx}; - (transaction->isReadOnly() || readWriteVersion == nullptr) ? - getNodeStatisticsAndDeletedIDs(transaction, tableID) - ->setDeletedNodeOffsetsForMorsel(nodeOffsetVector) : - ((NodeTableStatsAndDeletedIDs*)readWriteVersion->tableStatisticPerTable[tableID].get()) - ->setDeletedNodeOffsetsForMorsel(nodeOffsetVector); + const TablesStatisticsContent* content; + if (tx->isReadOnly() || readWriteVersion == nullptr) { + content = getVersion(TransactionType::READ_ONLY); + } else { + content = getVersion(TransactionType::WRITE); + } + auto tableStat = content->getTableStat(tableID); + auto nodeStat = + ku_dynamic_cast(tableStat); + nodeStat->setDeletedNodeOffsetsForMorsel(nodeIDVector); } void NodesStoreStatsAndDeletedIDs::addNodeStatisticsAndDeletedIDs( diff --git a/test/test_files/update_node/delete_tinysnb.test b/test/test_files/update_node/delete_tinysnb.test index b4de091397a..2b6c9846428 100644 --- a/test/test_files/update_node/delete_tinysnb.test +++ b/test/test_files/update_node/delete_tinysnb.test @@ -73,7 +73,6 @@ 9 10 - -CASE OptionalDelete -STATEMENT OPTIONAL MATCH (a:person) WHERE a.ID > 100 DELETE a; ---- ok @@ -115,3 +114,9 @@ Runtime exception: Node(nodeOffset: 2) has connected edges in table workAt in th -STATEMENT MATCH (a:person) RETURN COUNT(*) ---- 1 8 + +-CASE DeleteNodeWithSemiMaskBug +-STATEMENT MATCH (a) WHERE a.ID = 0 OR a.ID = 3 OR a.ID= 5 DETACH DELETE a; +---- ok +-STATEMENT MATCH (a:person)-[:knows]->(b:person) WHERE b.ID = 2 RETURN a.fName, b.fName; +---- 0 From 4e406a16166fea0776a5024104383f2e385d7f14 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Sun, 31 Mar 2024 01:46:58 -0400 Subject: [PATCH 114/136] Refactor sel vector interface (#3177) --- src/common/data_chunk/data_chunk_state.cpp | 2 +- src/common/vector/value_vector.cpp | 5 +++-- src/expression_evaluator/case_evaluator.cpp | 4 ++-- .../function_evaluator.cpp | 2 +- .../reference_evaluator.cpp | 2 +- src/function/table/call/storage_info.cpp | 2 +- src/function/vector_hash_functions.cpp | 2 +- src/include/common/data_chunk/sel_vector.h | 22 ++++++++----------- .../function/binary_function_executor.h | 6 ++--- .../boolean/boolean_function_executor.h | 8 +++---- .../function/null/null_function_executor.h | 4 ++-- .../function/path/path_function_executor.h | 2 +- .../operator/hash_join/hash_join_probe.h | 2 +- src/processor/operator/filter.cpp | 6 ++--- src/processor/operator/filtering_operator.cpp | 6 ++--- src/processor/operator/flatten.cpp | 2 +- .../operator/hash_join/hash_join_probe.cpp | 7 +++--- .../operator/hash_join/join_hash_table.cpp | 14 +++++++----- src/processor/operator/index_scan.cpp | 5 +++-- .../operator/intersect/intersect.cpp | 22 ++++++++++--------- src/processor/operator/order_by/top_k.cpp | 9 ++++---- src/processor/operator/partitioner.cpp | 2 +- src/processor/operator/scan_node_id.cpp | 8 +++---- src/processor/operator/skip.cpp | 8 +++---- src/storage/local_storage/local_rel_table.cpp | 6 ++--- src/storage/stats/node_table_statistics.cpp | 4 ++-- .../store/chunked_node_group_collection.cpp | 5 +++-- src/storage/store/column_chunk.cpp | 9 +++++--- src/storage/store/rel_table.cpp | 4 ++-- src/storage/store/rel_table_data.cpp | 2 +- src/storage/store/var_list_column_chunk.cpp | 8 ++++--- 31 files changed, 98 insertions(+), 92 deletions(-) diff --git a/src/common/data_chunk/data_chunk_state.cpp b/src/common/data_chunk/data_chunk_state.cpp index af5c739c7b1..8faecbccbe6 100644 --- a/src/common/data_chunk/data_chunk_state.cpp +++ b/src/common/data_chunk/data_chunk_state.cpp @@ -14,7 +14,7 @@ void DataChunkState::slice(offset_t offset) { // NOTE: this operation has performance penalty. Ideally we should directly modify selVector // instead of creating a new one. auto slicedSelVector = std::make_unique(DEFAULT_VECTOR_CAPACITY); - slicedSelVector->resetSelectorToValuePosBufferWithSize(selVector->selectedSize - offset); + slicedSelVector->setToFiltered(selVector->selectedSize - offset); for (auto i = 0u; i < slicedSelVector->selectedSize; i++) { slicedSelVector->selectedPositions[i] = selVector->selectedPositions[i + offset]; } diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index 6ec432c9c40..9b69223dc35 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -41,11 +41,12 @@ bool ValueVector::discardNull(ValueVector& vector) { } else { auto selectedPos = 0u; if (vector.state->selVector->isUnfiltered()) { - vector.state->selVector->resetSelectorToValuePosBuffer(); + auto buffer = vector.state->selVector->getMultableBuffer(); for (auto i = 0u; i < vector.state->selVector->selectedSize; i++) { - vector.state->selVector->selectedPositions[selectedPos] = i; + buffer[selectedPos] = i; selectedPos += !vector.isNull(i); } + vector.state->selVector->setToFiltered(); } else { for (auto i = 0u; i < vector.state->selVector->selectedSize; i++) { auto pos = vector.state->selVector->selectedPositions[i]; diff --git a/src/expression_evaluator/case_evaluator.cpp b/src/expression_evaluator/case_evaluator.cpp index 24c622d28ac..11b731b6a49 100644 --- a/src/expression_evaluator/case_evaluator.cpp +++ b/src/expression_evaluator/case_evaluator.cpp @@ -12,7 +12,7 @@ void CaseAlternativeEvaluator::init(const ResultSet& resultSet, MemoryManager* m whenEvaluator->init(resultSet, memoryManager); thenEvaluator->init(resultSet, memoryManager); whenSelVector = std::make_unique(DEFAULT_VECTOR_CAPACITY); - whenSelVector->resetSelectorToValuePosBuffer(); + whenSelVector->setToFiltered(); } void CaseExpressionEvaluator::init(const ResultSet& resultSet, MemoryManager* memoryManager) { @@ -51,7 +51,7 @@ bool CaseExpressionEvaluator::select(SelectionVector& selVector, ClientContext* evaluate(clientContext); KU_ASSERT(resultVector->state->selVector->selectedSize == selVector.selectedSize); auto numSelectedValues = 0u; - auto selectedPosBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPosBuffer = selVector.getMultableBuffer(); for (auto i = 0u; i < selVector.selectedSize; ++i) { auto selVectorPos = selVector.selectedPositions[i]; auto resultVectorPos = resultVector->state->selVector->selectedPositions[i]; diff --git a/src/expression_evaluator/function_evaluator.cpp b/src/expression_evaluator/function_evaluator.cpp index eeb05d502be..42f6f7bb20c 100644 --- a/src/expression_evaluator/function_evaluator.cpp +++ b/src/expression_evaluator/function_evaluator.cpp @@ -47,7 +47,7 @@ bool FunctionExpressionEvaluator::select( auto numSelectedValues = 0u; for (auto i = 0u; i < resultVector->state->selVector->selectedSize; ++i) { auto pos = resultVector->state->selVector->selectedPositions[i]; - auto selectedPosBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPosBuffer = selVector.getMultableBuffer(); selectedPosBuffer[numSelectedValues] = pos; numSelectedValues += resultVector->getValue(pos); } diff --git a/src/expression_evaluator/reference_evaluator.cpp b/src/expression_evaluator/reference_evaluator.cpp index 6b863a5a621..6066782285d 100644 --- a/src/expression_evaluator/reference_evaluator.cpp +++ b/src/expression_evaluator/reference_evaluator.cpp @@ -14,7 +14,7 @@ inline static bool isTrue(ValueVector& vector, uint64_t pos) { bool ReferenceExpressionEvaluator::select( SelectionVector& selVector, ClientContext* /*clientContext*/) { uint64_t numSelectedValues = 0; - auto selectedBuffer = resultVector->state->selVector->getSelectedPositionsBuffer(); + auto selectedBuffer = resultVector->state->selVector->getMultableBuffer(); if (resultVector->state->selVector->isUnfiltered()) { for (auto i = 0u; i < resultVector->state->selVector->selectedSize; i++) { selectedBuffer[numSelectedValues] = i; diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index 792253c5eb2..dba3109a326 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -175,7 +175,7 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output outputVector->copyFromVectorData(i, localVector.get(), i); } } - dataChunk.state->selVector->resetSelectorToUnselectedWithSize(numValuesToOutput); + dataChunk.state->selVector->setToUnfiltered(numValuesToOutput); localState->currChunkIdx++; return numValuesToOutput; } diff --git a/src/function/vector_hash_functions.cpp b/src/function/vector_hash_functions.cpp index ceff3de1691..f619690184d 100644 --- a/src/function/vector_hash_functions.cpp +++ b/src/function/vector_hash_functions.cpp @@ -12,7 +12,7 @@ static std::unique_ptr computeDataVecHash(ValueVector* operand) { auto numValuesInDataVec = ListVector::getDataVectorSize(operand); ListVector::resizeDataVector(hashVector.get(), numValuesInDataVec); auto selectionState = std::make_shared(); - selectionState->selVector->resetSelectorToValuePosBuffer(); + selectionState->selVector->setToFiltered(); ListVector::getDataVector(operand)->setState(selectionState); auto numValuesComputed = 0u; while (numValuesComputed < numValuesInDataVec) { diff --git a/src/include/common/data_chunk/sel_vector.h b/src/include/common/data_chunk/sel_vector.h index 9b386d4bd70..78517b20d14 100644 --- a/src/include/common/data_chunk/sel_vector.h +++ b/src/include/common/data_chunk/sel_vector.h @@ -11,27 +11,23 @@ class SelectionVector { public: explicit SelectionVector(sel_t capacity) : selectedSize{0} { selectedPositionsBuffer = std::make_unique(capacity); - resetSelectorToUnselected(); + setToUnfiltered(); } - inline bool isUnfiltered() const { - return selectedPositions == (sel_t*)&INCREMENTAL_SELECTED_POS; - } - inline void resetSelectorToUnselected() { - selectedPositions = (sel_t*)&INCREMENTAL_SELECTED_POS; - } - inline void resetSelectorToUnselectedWithSize(sel_t size) { + bool isUnfiltered() const { return selectedPositions == (sel_t*)&INCREMENTAL_SELECTED_POS; } + void setToUnfiltered() { selectedPositions = (sel_t*)&INCREMENTAL_SELECTED_POS; } + void setToUnfiltered(sel_t size) { selectedPositions = (sel_t*)&INCREMENTAL_SELECTED_POS; selectedSize = size; } - inline void resetSelectorToValuePosBuffer() { - selectedPositions = selectedPositionsBuffer.get(); - } - inline void resetSelectorToValuePosBufferWithSize(sel_t size) { + + // Set to filtered is not very accurate. It sets selectedPositions to a mutable array. + void setToFiltered() { selectedPositions = selectedPositionsBuffer.get(); } + void setToFiltered(sel_t size) { selectedPositions = selectedPositionsBuffer.get(); selectedSize = size; } - inline sel_t* getSelectedPositionsBuffer() { return selectedPositionsBuffer.get(); } + sel_t* getMultableBuffer() { return selectedPositionsBuffer.get(); } KUZU_API static const sel_t INCREMENTAL_SELECTED_POS[DEFAULT_VECTOR_CAPACITY]; diff --git a/src/include/function/binary_function_executor.h b/src/include/function/binary_function_executor.h index b3399910ee4..3b04943d083 100644 --- a/src/include/function/binary_function_executor.h +++ b/src/include/function/binary_function_executor.h @@ -325,7 +325,7 @@ struct BinaryFunctionExecutor { common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { auto lPos = left.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.isNull(lPos)) { return numSelectedValues; } else if (right.hasNoNullsGuarantee()) { @@ -368,7 +368,7 @@ struct BinaryFunctionExecutor { common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { auto rPos = right.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (right.isNull(rPos)) { return numSelectedValues; } else if (left.hasNoNullsGuarantee()) { @@ -411,7 +411,7 @@ struct BinaryFunctionExecutor { static bool selectBothUnFlat( common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.hasNoNullsGuarantee() && right.hasNoNullsGuarantee()) { if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; i++) { diff --git a/src/include/function/boolean/boolean_function_executor.h b/src/include/function/boolean/boolean_function_executor.h index 2b79d6f8eab..6b1a68cde73 100644 --- a/src/include/function/boolean/boolean_function_executor.h +++ b/src/include/function/boolean/boolean_function_executor.h @@ -170,7 +170,7 @@ struct BinaryBooleanFunctionExecutor { common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { auto lPos = left.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (right.state->selVector->isUnfiltered()) { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { selectOnValue( @@ -192,7 +192,7 @@ struct BinaryBooleanFunctionExecutor { common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { auto rPos = right.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { selectOnValue( @@ -213,7 +213,7 @@ struct BinaryBooleanFunctionExecutor { static bool selectBothUnFlat( common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { selectOnValue( @@ -303,7 +303,7 @@ struct UnaryBooleanOperationExecutor { return resultValue == true; } else { uint64_t numSelectedValues = 0; - auto selectedPositionBuffer = selVector.getSelectedPositionsBuffer(); + auto selectedPositionBuffer = selVector.getMultableBuffer(); if (operand.state->selVector->isUnfiltered()) { for (auto i = 0ul; i < operand.state->selVector->selectedSize; i++) { selectOnValue(operand, i, numSelectedValues, selectedPositionBuffer); diff --git a/src/include/function/null/null_function_executor.h b/src/include/function/null/null_function_executor.h index 3a8b5ef9746..008ed41c2f2 100644 --- a/src/include/function/null/null_function_executor.h +++ b/src/include/function/null/null_function_executor.h @@ -40,10 +40,10 @@ struct NullOperationExecutor { return resultValue == true; } else { uint64_t numSelectedValues = 0; - auto selectedPositionsBuffer = selVector.getSelectedPositionsBuffer(); + auto buffer = selVector.getMultableBuffer(); for (auto i = 0ul; i < operand.state->selVector->selectedSize; i++) { auto pos = operand.state->selVector->selectedPositions[i]; - selectOnValue(operand, pos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(operand, pos, numSelectedValues, buffer); } selVector.selectedSize = numSelectedValues; return numSelectedValues > 0; diff --git a/src/include/function/path/path_function_executor.h b/src/include/function/path/path_function_executor.h index 61af150bbd9..435d6d39f19 100644 --- a/src/include/function/path/path_function_executor.h +++ b/src/include/function/path/path_function_executor.h @@ -99,7 +99,7 @@ struct UnaryPathExecutor { common::StructVector::getFieldVector(listDataVector, fieldIdx).get(); std::unordered_set internalIDSet; auto numSelectedValues = 0u; - auto buffer = selectionVector.getSelectedPositionsBuffer(); + auto buffer = selectionVector.getMultableBuffer(); if (inputSelVector.isUnfiltered()) { for (auto i = 0u; i < inputSelVector.selectedSize; ++i) { auto& listEntry = listVector.getValue(i); diff --git a/src/include/processor/operator/hash_join/hash_join_probe.h b/src/include/processor/operator/hash_join/hash_join_probe.h index f2d3b311450..d59c9b7bed5 100644 --- a/src/include/processor/operator/hash_join/hash_join_probe.h +++ b/src/include/processor/operator/hash_join/hash_join_probe.h @@ -15,7 +15,7 @@ struct ProbeState { probedTuples = std::make_unique(common::DEFAULT_VECTOR_CAPACITY); matchedSelVector = std::make_unique(common::DEFAULT_VECTOR_CAPACITY); - matchedSelVector->resetSelectorToValuePosBuffer(); + matchedSelVector->setToFiltered(); } // Each key corresponds to a pointer with the same hash value from the ht directory. diff --git a/src/processor/operator/filter.cpp b/src/processor/operator/filter.cpp index 6e420dddfde..ef8ec8d2337 100644 --- a/src/processor/operator/filter.cpp +++ b/src/processor/operator/filter.cpp @@ -23,7 +23,7 @@ bool Filter::getNextTuplesInternal(ExecutionContext* context) { *dataChunkToSelect->state->selVector, context->clientContext); if (!dataChunkToSelect->state->isFlat() && dataChunkToSelect->state->selVector->isUnfiltered()) { - dataChunkToSelect->state->selVector->resetSelectorToValuePosBuffer(); + dataChunkToSelect->state->selVector->setToFiltered(); } } while (!hasAtLeastOneSelectedValue); metrics->numOutputTuple.increase(dataChunkToSelect->state->selVector->selectedSize); @@ -44,14 +44,14 @@ bool NodeLabelFiler::getNextTuplesInternal(ExecutionContext* context) { } saveSelVector(nodeIDVector->state->selVector); numSelectValue = 0; - auto buffer = nodeIDVector->state->selVector->getSelectedPositionsBuffer(); + auto buffer = nodeIDVector->state->selVector->getMultableBuffer(); for (auto i = 0u; i < nodeIDVector->state->selVector->selectedSize; ++i) { auto pos = nodeIDVector->state->selVector->selectedPositions[i]; buffer[numSelectValue] = pos; numSelectValue += info->nodeLabelSet.contains(nodeIDVector->getValue(pos).tableID); } - nodeIDVector->state->selVector->resetSelectorToValuePosBuffer(); + nodeIDVector->state->selVector->setToFiltered(); } while (numSelectValue == 0); nodeIDVector->state->selVector->selectedSize = numSelectValue; metrics->numOutputTuple.increase(nodeIDVector->state->selVector->selectedSize); diff --git a/src/processor/operator/filtering_operator.cpp b/src/processor/operator/filtering_operator.cpp index 2d541bce55c..0f72df0a9c7 100644 --- a/src/processor/operator/filtering_operator.cpp +++ b/src/processor/operator/filtering_operator.cpp @@ -23,11 +23,11 @@ void SelVectorOverWriter::saveSelVector(std::shared_ptr& selVec void SelVectorOverWriter::resetToCurrentSelVector(std::shared_ptr& selVector) { currentSelVector->selectedSize = selVector->selectedSize; if (selVector->isUnfiltered()) { - currentSelVector->resetSelectorToUnselected(); + currentSelVector->setToUnfiltered(); } else { - memcpy(currentSelVector->getSelectedPositionsBuffer(), selVector->selectedPositions, + memcpy(currentSelVector->getMultableBuffer(), selVector->selectedPositions, selVector->selectedSize * sizeof(sel_t)); - currentSelVector->resetSelectorToValuePosBuffer(); + currentSelVector->setToFiltered(); } selVector = currentSelVector; } diff --git a/src/processor/operator/flatten.cpp b/src/processor/operator/flatten.cpp index cb1948dc75e..c815e785ecf 100644 --- a/src/processor/operator/flatten.cpp +++ b/src/processor/operator/flatten.cpp @@ -7,7 +7,7 @@ namespace processor { void Flatten::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* /*context*/) { dataChunkState = resultSet->dataChunks[dataChunkToFlattenPos]->state.get(); - currentSelVector->resetSelectorToValuePosBufferWithSize(1 /* size */); + currentSelVector->setToFiltered(1 /* size */); localState = std::make_unique(); } diff --git a/src/processor/operator/hash_join/hash_join_probe.cpp b/src/processor/operator/hash_join/hash_join_probe.cpp index 8305582885b..7e8c4f5dcca 100644 --- a/src/processor/operator/hash_join/hash_join_probe.cpp +++ b/src/processor/operator/hash_join/hash_join_probe.cpp @@ -92,12 +92,11 @@ uint64_t HashJoinProbe::getInnerJoinResultForUnFlatKey() { auto keySelVector = keyVectors[0]->state->selVector.get(); if (keySelVector->selectedSize != numTuplesToRead) { // Some keys have no matched tuple. So we modify selected position. - auto keySelectedBuffer = keySelVector->getSelectedPositionsBuffer(); + auto buffer = keySelVector->getMultableBuffer(); for (auto i = 0u; i < numTuplesToRead; i++) { - keySelectedBuffer[i] = probeState->matchedSelVector->selectedPositions[i]; + buffer[i] = probeState->matchedSelVector->selectedPositions[i]; } - keySelVector->selectedSize = numTuplesToRead; - keySelVector->resetSelectorToValuePosBuffer(); + keySelVector->setToFiltered(numTuplesToRead); } sharedState->getHashTable()->lookup(vectorsToReadInto, columnIdxsToReadFrom, probeState->matchedTuples.get(), probeState->nextMatchedTupleIdx, numTuplesToRead); diff --git a/src/processor/operator/hash_join/join_hash_table.cpp b/src/processor/operator/hash_join/join_hash_table.cpp index e50e7a48aa1..92cffcef76c 100644 --- a/src/processor/operator/hash_join/join_hash_table.cpp +++ b/src/processor/operator/hash_join/join_hash_table.cpp @@ -61,12 +61,12 @@ void JoinHashTable::appendVector( static void sortSelectedPos(ValueVector* nodeIDVector) { auto selVector = nodeIDVector->state->selVector.get(); auto size = selVector->selectedSize; - auto selectedPos = selVector->getSelectedPositionsBuffer(); + auto buffer = selVector->getMultableBuffer(); if (selVector->isUnfiltered()) { - memcpy(selectedPos, &SelectionVector::INCREMENTAL_SELECTED_POS, size * sizeof(sel_t)); - selVector->resetSelectorToValuePosBuffer(); + memcpy(buffer, &SelectionVector::INCREMENTAL_SELECTED_POS, size * sizeof(sel_t)); + selVector->setToFiltered(); } - std::sort(selectedPos, selectedPos + size, [nodeIDVector](sel_t left, sel_t right) { + std::sort(buffer, buffer + size, [nodeIDVector](sel_t left, sel_t right) { return nodeIDVector->getValue(left) < nodeIDVector->getValue(right); }); } @@ -80,7 +80,7 @@ void JoinHashTable::appendVectorWithSorting( auto payloadNodeIDVector = payloadVectors[0]; auto payloadsState = payloadNodeIDVector->state.get(); if (!payloadsState->isFlat()) { - // Sorting is only needed when the payload is unflat (a list of values). + // Sorting is only needed when the payload is unFlat (a list of values). sortSelectedPos(payloadNodeIDVector); } // A single appendInfo will return from `allocateFlatTupleBlocks` when numTuplesToAppend is 1. @@ -95,7 +95,9 @@ void JoinHashTable::appendVectorWithSorting( } factorizedTable->copyVectorToColumn(*hashVector, appendInfos[0], numTuplesToAppend, colIdx); if (!payloadsState->isFlat()) { - payloadsState->selVector->resetSelectorToUnselected(); + // TODO(Xiyang): I can no longer recall why I set to un-filtered but this is probably wrong. + // We should set back to the un-sorted state. + payloadsState->selVector->setToUnfiltered(); } factorizedTable->numTuples += numTuplesToAppend; } diff --git a/src/processor/operator/index_scan.cpp b/src/processor/operator/index_scan.cpp index 28e04f66c2f..c4b0a44f0a5 100644 --- a/src/processor/operator/index_scan.cpp +++ b/src/processor/operator/index_scan.cpp @@ -20,12 +20,13 @@ bool IndexScan::getNextTuplesInternal(ExecutionContext* context) { } saveSelVector(outVector->state->selVector); numSelectedValues = 0u; + auto buffer = outVector->state->selVector->getMultableBuffer(); for (auto i = 0u; i < indexVector->state->selVector->selectedSize; ++i) { auto pos = indexVector->state->selVector->selectedPositions[i]; if (indexVector->isNull(pos)) { continue; } - outVector->state->selVector->getSelectedPositionsBuffer()[numSelectedValues] = pos; + buffer[numSelectedValues] = pos; offset_t nodeOffset = INVALID_OFFSET; numSelectedValues += pkIndex->lookup(context->clientContext->getTx(), indexVector, pos, nodeOffset); @@ -33,7 +34,7 @@ bool IndexScan::getNextTuplesInternal(ExecutionContext* context) { outVector->setValue(pos, nodeID); } if (!outVector->state->isFlat() && outVector->state->selVector->isUnfiltered()) { - outVector->state->selVector->resetSelectorToValuePosBuffer(); + outVector->state->selVector->setToFiltered(); } } while (numSelectedValues == 0); outVector->state->selVector->selectedSize = numSelectedValues; diff --git a/src/processor/operator/intersect/intersect.cpp b/src/processor/operator/intersect/intersect.cpp index 59f7b52ca00..9bae12ce504 100644 --- a/src/processor/operator/intersect/intersect.cpp +++ b/src/processor/operator/intersect/intersect.cpp @@ -55,6 +55,8 @@ void Intersect::probeHTs() { void Intersect::twoWayIntersect(nodeID_t* leftNodeIDs, SelectionVector& lSelVector, nodeID_t* rightNodeIDs, SelectionVector& rSelVector) { KU_ASSERT(lSelVector.selectedSize <= rSelVector.selectedSize); + auto leftPositionBuffer = lSelVector.getMultableBuffer(); + auto rightPositionBuffer = rSelVector.getMultableBuffer(); sel_t leftPosition = 0, rightPosition = 0; uint64_t outputValuePosition = 0; while (leftPosition < lSelVector.selectedSize && rightPosition < rSelVector.selectedSize) { @@ -65,16 +67,16 @@ void Intersect::twoWayIntersect(nodeID_t* leftNodeIDs, SelectionVector& lSelVect } else if (leftNodeID.offset > rightNodeID.offset) { rightPosition++; } else { - lSelVector.getSelectedPositionsBuffer()[outputValuePosition] = leftPosition; - rSelVector.getSelectedPositionsBuffer()[outputValuePosition] = rightPosition; + leftPositionBuffer[outputValuePosition] = leftPosition; + rightPositionBuffer[outputValuePosition] = rightPosition; leftNodeIDs[outputValuePosition] = leftNodeID; leftPosition++; rightPosition++; outputValuePosition++; } } - lSelVector.resetSelectorToValuePosBufferWithSize(outputValuePosition); - rSelVector.resetSelectorToValuePosBufferWithSize(outputValuePosition); + lSelVector.setToFiltered(outputValuePosition); + rSelVector.setToFiltered(outputValuePosition); } static std::vector fetchListsToIntersectFromTuples( @@ -110,9 +112,10 @@ static void sliceSelVectors( for (auto selVec : selVectorsToSlice) { for (auto i = 0u; i < slicer.selectedSize; i++) { auto pos = slicer.selectedPositions[i]; - selVec->getSelectedPositionsBuffer()[i] = selVec->selectedPositions[pos]; + auto buffer = selVec->getMultableBuffer(); + buffer[i] = selVec->selectedPositions[pos]; } - selVec->resetSelectorToValuePosBufferWithSize(slicer.selectedSize); + selVec->setToFiltered(slicer.selectedSize); } } @@ -127,17 +130,16 @@ void Intersect::intersectLists(const std::vector& listsToInter SelectionVector lSelVector(listsToIntersect[0].numElements); lSelVector.selectedSize = listsToIntersect[0].numElements; std::vector selVectorsForIntersectedLists; - intersectSelVectors[0]->resetSelectorToUnselectedWithSize(listsToIntersect[0].numElements); + intersectSelVectors[0]->setToUnfiltered(listsToIntersect[0].numElements); selVectorsForIntersectedLists.push_back(intersectSelVectors[0].get()); for (auto i = 0u; i < listsToIntersect.size() - 1; i++) { - intersectSelVectors[i + 1]->resetSelectorToUnselectedWithSize( - listsToIntersect[i + 1].numElements); + intersectSelVectors[i + 1]->setToUnfiltered(listsToIntersect[i + 1].numElements); twoWayIntersect((nodeID_t*)outKeyVector->getData(), lSelVector, (nodeID_t*)listsToIntersect[i + 1].value, *intersectSelVectors[i + 1]); // Here we need to slice all selVectors that have been previously intersected, as all these // lists need to be selected synchronously to read payloads correctly. sliceSelVectors(selVectorsForIntersectedLists, lSelVector); - lSelVector.resetSelectorToUnselected(); + lSelVector.setToUnfiltered(); selVectorsForIntersectedLists.push_back(intersectSelVectors[i + 1].get()); } outKeyVector->state->selVector->selectedSize = lSelVector.selectedSize; diff --git a/src/processor/operator/order_by/top_k.cpp b/src/processor/operator/order_by/top_k.cpp index c323f308419..381e5937464 100644 --- a/src/processor/operator/order_by/top_k.cpp +++ b/src/processor/operator/order_by/top_k.cpp @@ -211,9 +211,8 @@ bool TopKBuffer::compareBoundaryValue(const std::vector& k bool TopKBuffer::compareFlatKeys( vector_idx_t vectorIdxToCompare, std::vector keyVectors) { - std::shared_ptr selVector = - std::make_shared(common::DEFAULT_VECTOR_CAPACITY); - selVector->resetSelectorToValuePosBuffer(); + auto selVector = std::make_shared(common::DEFAULT_VECTOR_CAPACITY); + selVector->setToFiltered(); auto compareResult = compareFuncs[vectorIdxToCompare]( *keyVectors[vectorIdxToCompare], *boundaryVecs[vectorIdxToCompare], *selVector); if (vectorIdxToCompare == keyVectors.size() - 1) { @@ -230,13 +229,13 @@ void TopKBuffer::compareUnflatKeys( vector_idx_t vectorIdxToCompare, std::vector keyVectors) { auto compareSelVector = std::make_shared(common::DEFAULT_VECTOR_CAPACITY); - compareSelVector->resetSelectorToValuePosBuffer(); + compareSelVector->setToFiltered(); compareFuncs[vectorIdxToCompare]( *keyVectors[vectorIdxToCompare], *boundaryVecs[vectorIdxToCompare], *compareSelVector); if (vectorIdxToCompare != keyVectors.size() - 1) { auto equalsSelVector = std::make_shared(common::DEFAULT_VECTOR_CAPACITY); - equalsSelVector->resetSelectorToValuePosBuffer(); + equalsSelVector->setToFiltered(); if (equalsFuncs[vectorIdxToCompare](*keyVectors[vectorIdxToCompare], *boundaryVecs[vectorIdxToCompare], *equalsSelVector)) { keyVectors[vectorIdxToCompare]->state->selVector = equalsSelVector; diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 35838ec8af1..6a7605bc1a0 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -155,7 +155,7 @@ void Partitioner::copyDataToPartitions(partition_idx_t partitioningIdx, DataChun vectorsToAppend.push_back(chunkToCopyFrom.getValueVector(j).get()); } SelectionVector selVector(1); - selVector.resetSelectorToValuePosBufferWithSize(1); + selVector.setToFiltered(1); for (auto i = 0u; i < chunkToCopyFrom.state->selVector->selectedSize; i++) { auto posToCopyFrom = chunkToCopyFrom.state->selVector->selectedPositions[i]; auto partitionIdx = partitionIdxes->getValue(posToCopyFrom); diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index 8185109425f..60f7d2f7013 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -68,7 +68,7 @@ bool ScanNodeID::getNextTuplesInternal(ExecutionContext* context) { if (state == nullptr) { return false; } - outValueVector->state->selVector->resetSelectorToUnselected(); + outValueVector->state->selVector->setToUnfiltered(); auto nodeIDValues = (nodeID_t*)(outValueVector->getData()); auto size = endOffset - startOffset; for (auto i = 0u; i < size; ++i) { @@ -88,19 +88,19 @@ void ScanNodeID::setSelVector(ExecutionContext* context, NodeTableScanState* tab tableState->getTable()->setSelVectorForDeletedOffsets( context->clientContext->getTx(), outValueVector.get()); if (tableState->isSemiMaskEnabled()) { - auto selectedBuffer = outValueVector->state->selVector->getSelectedPositionsBuffer(); + auto buffer = outValueVector->state->selVector->getMultableBuffer(); sel_t prevSelectedSize = outValueVector->state->selVector->selectedSize; // Fill selected positions based on node mask for nodes between the given startOffset and // endOffset. If the node is masked (i.e., valid for read), then it is set to the selected // positions. Finally, we update the selectedSize for selVector. sel_t numSelectedValues = 0; for (auto i = 0u; i < (endOffset - startOffset); i++) { - selectedBuffer[numSelectedValues] = i; + buffer[numSelectedValues] = i; numSelectedValues += tableState->getSemiMask()->isNodeMasked(i + startOffset); } outValueVector->state->selVector->selectedSize = numSelectedValues; if (prevSelectedSize != numSelectedValues) { - outValueVector->state->selVector->resetSelectorToValuePosBuffer(); + outValueVector->state->selVector->setToFiltered(); } } } diff --git a/src/processor/operator/skip.cpp b/src/processor/operator/skip.cpp index a389c541dfb..6d381ebb07b 100644 --- a/src/processor/operator/skip.cpp +++ b/src/processor/operator/skip.cpp @@ -28,17 +28,17 @@ bool Skip::getNextTuplesInternal(ExecutionContext* context) { // If all dataChunks are flat, numTupleAvailable = 1 which means numTupleSkippedBefore = // skipNumber. So execution is handled in above if statement. KU_ASSERT(!dataChunkToSelect->state->isFlat()); - auto selectedPosBuffer = dataChunkToSelect->state->selVector->getSelectedPositionsBuffer(); + auto buffer = dataChunkToSelect->state->selVector->getMultableBuffer(); if (dataChunkToSelect->state->selVector->isUnfiltered()) { for (uint64_t i = numTupleToSkipInCurrentResultSet; i < dataChunkToSelect->state->selVector->selectedSize; ++i) { - selectedPosBuffer[i - numTupleToSkipInCurrentResultSet] = i; + buffer[i - numTupleToSkipInCurrentResultSet] = i; } - dataChunkToSelect->state->selVector->resetSelectorToValuePosBuffer(); + dataChunkToSelect->state->selVector->setToFiltered(); } else { for (uint64_t i = numTupleToSkipInCurrentResultSet; i < dataChunkToSelect->state->selVector->selectedSize; ++i) { - selectedPosBuffer[i - numTupleToSkipInCurrentResultSet] = selectedPosBuffer[i]; + buffer[i - numTupleToSkipInCurrentResultSet] = buffer[i]; } } dataChunkToSelect->state->selVector->selectedSize = diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index 08e4f1248be..2dac3a77a9d 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -31,7 +31,7 @@ row_idx_t LocalRelNG::scanCSR(offset_t srcOffsetInChunk, offset_t posToReadForOf } } auto numRelsRead = rowIdxesToRead.size(); - outputVectors[0]->state->selVector->resetSelectorToUnselectedWithSize(numRelsRead); + outputVectors[0]->state->selVector->setToUnfiltered(numRelsRead); return numRelsRead; } @@ -65,7 +65,7 @@ void LocalRelNG::applyCSRDeletions(offset_t srcOffset, ValueVector* relIDVector) } auto selectPos = 0u; auto selVector = std::make_unique(DEFAULT_VECTOR_CAPACITY); - selVector->resetSelectorToValuePosBuffer(); + selVector->setToFiltered(); for (auto i = 0u; i < relIDVector->state->selVector->selectedSize; i++) { auto relIDPos = relIDVector->state->selVector->selectedPositions[i]; auto relOffset = relIDVector->getValue(relIDPos).offset; @@ -75,7 +75,7 @@ void LocalRelNG::applyCSRDeletions(offset_t srcOffset, ValueVector* relIDVector) selVector->selectedPositions[selectPos++] = relIDPos; } if (selectPos != relIDVector->state->selVector->selectedSize) { - relIDVector->state->selVector->resetSelectorToValuePosBuffer(); + relIDVector->state->selVector->setToFiltered(); memcpy(relIDVector->state->selVector->selectedPositions, selVector->selectedPositions, selectPos * sizeof(sel_t)); relIDVector->state->selVector->selectedSize = selectPos; diff --git a/src/storage/stats/node_table_statistics.cpp b/src/storage/stats/node_table_statistics.cpp index e890fb92d42..4721df8c09a 100644 --- a/src/storage/stats/node_table_statistics.cpp +++ b/src/storage/stats/node_table_statistics.cpp @@ -113,7 +113,7 @@ void NodeTableStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel(ValueVector* no auto originalSize = nodeIDVector->state->getOriginalSize(); auto itr = deletedNodeOffsets.begin(); common::sel_t numSelectedValue = 0; - auto selectedBuffer = nodeIDVector->state->selVector->getSelectedPositionsBuffer(); + auto selectedBuffer = nodeIDVector->state->selVector->getMultableBuffer(); KU_ASSERT(nodeIDVector->state->selVector->isUnfiltered()); for (auto pos = 0u; pos < nodeIDVector->state->getOriginalSize(); ++pos) { if (itr == deletedNodeOffsets.end()) { // no more deleted offset to check. @@ -127,7 +127,7 @@ void NodeTableStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel(ValueVector* no selectedBuffer[numSelectedValue++] = pos; } if (numSelectedValue != originalSize) { - nodeIDVector->state->selVector->resetSelectorToValuePosBuffer(); + nodeIDVector->state->selVector->setToFiltered(); } nodeIDVector->state->selVector->selectedSize = numSelectedValue; } diff --git a/src/storage/store/chunked_node_group_collection.cpp b/src/storage/store/chunked_node_group_collection.cpp index d118217f426..68ab9677f03 100644 --- a/src/storage/store/chunked_node_group_collection.cpp +++ b/src/storage/store/chunked_node_group_collection.cpp @@ -18,10 +18,11 @@ void ChunkedNodeGroupCollection::append( auto& lastChunkedGroup = chunkedGroups.back(); auto numRowsToAppendInGroup = std::min(numRowsToAppend - numRowsAppended, static_cast(CHUNK_CAPACITY - lastChunkedGroup->getNumRows())); - tmpSelVector.resetSelectorToValuePosBufferWithSize(numRowsToAppendInGroup); + auto tmpSelVectorBuffer = tmpSelVector.getMultableBuffer(); for (auto i = 0u; i < numRowsToAppendInGroup; i++) { - tmpSelVector.selectedPositions[i] = selVector.selectedPositions[numRowsAppended + i]; + tmpSelVectorBuffer[i] = selVector.selectedPositions[numRowsAppended + i]; } + tmpSelVector.setToFiltered(numRowsToAppendInGroup); lastChunkedGroup->append(vectors, tmpSelVector, numRowsToAppendInGroup); if (lastChunkedGroup->getNumRows() == CHUNK_CAPACITY) { chunkedGroups.push_back(std::make_unique( diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index a3785c1869e..f13d6c78083 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -318,13 +318,16 @@ void ColumnChunk::resize(uint64_t newCapacity) { } void ColumnChunk::populateWithDefaultVal(ValueVector* defaultValueVector) { + // TODO(Guodong): don't set vector state to a new one. Default vector is shared across all + // operators on the pipeline so setting its state will affect others. + // You can only set state for vectors that is local to this class. defaultValueVector->setState(std::make_shared()); auto valPos = defaultValueVector->state->selVector->selectedPositions[0]; - defaultValueVector->state->selVector->resetSelectorToValuePosBufferWithSize( - DEFAULT_VECTOR_CAPACITY); + auto positionBuffer = defaultValueVector->state->selVector->getMultableBuffer(); for (auto i = 0u; i < defaultValueVector->state->selVector->selectedSize; i++) { - defaultValueVector->state->selVector->selectedPositions[i] = valPos; + positionBuffer[i] = valPos; } + defaultValueVector->state->selVector->setToFiltered(DEFAULT_VECTOR_CAPACITY); auto numValuesAppended = 0u; auto numValuesToPopulate = capacity; while (numValuesAppended < numValuesToPopulate) { diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index 655de52aaac..1f2b0edefba 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -103,7 +103,7 @@ row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableDat while (relDataReadState->hasMoreToRead(transaction)) { scan(transaction, *relDataReadState); auto numRelsScanned = tempState->selVector->selectedSize; - tempState->selVector->resetSelectorToValuePosBufferWithSize(1); + tempState->selVector->setToFiltered(1); for (auto i = 0u; i < numRelsScanned; i++) { tempState->selVector->selectedPositions[0] = i; auto deleted = @@ -113,7 +113,7 @@ row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableDat KU_ASSERT(deleted == reverseDeleted); numRelsDeleted += (deleted && reverseDeleted); } - tempState->selVector->resetSelectorToUnselectedWithSize(DEFAULT_VECTOR_CAPACITY); + tempState->selVector->setToUnfiltered(); } return numRelsDeleted; } diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index ed2d11cf7e0..72f428390d3 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -217,7 +217,7 @@ void RelTableData::scan(Transaction* transaction, TableDataReadState& readState, } auto [startOffset, endOffset] = relReadState.getStartAndEndOffset(); auto numRowsToRead = endOffset - startOffset; - outputVectors[0]->state->selVector->resetSelectorToUnselectedWithSize(numRowsToRead); + outputVectors[0]->state->selVector->setToUnfiltered(numRowsToRead); outputVectors[0]->state->setOriginalSize(numRowsToRead); auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(relReadState.currentNodeOffset); auto relIDVectorIdx = INVALID_VECTOR_IDX; diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/var_list_column_chunk.cpp index b2cb6df8d56..1cb9f096495 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/var_list_column_chunk.cpp @@ -126,8 +126,9 @@ void VarListColumnChunk::append(ValueVector* vector, const SelectionVector& selV } varListDataColumnChunk->resizeBuffer(nextListOffsetInChunk); auto dataVector = ListVector::getDataVector(vector); + // TODO(Guodong): we should not set vector to a new state. dataVector->setState(std::make_unique()); - dataVector->state->selVector->resetSelectorToValuePosBuffer(); + dataVector->state->selVector->setToFiltered(); for (auto i = 0u; i < selVector.selectedSize; i++) { auto pos = selVector.selectedPositions[i]; if (vector->isNull(pos)) { @@ -206,14 +207,15 @@ void VarListColumnChunk::write( ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { checkOffsetSortedAsc = true; auto selVector = std::make_unique(1); - selVector->resetSelectorToValuePosBuffer(); + selVector->setToFiltered(); selVector->selectedPositions[0] = offsetInVector; auto appendSize = vector->isNull(offsetInVector) ? 0 : vector->getValue(offsetInVector).size; varListDataColumnChunk->resizeBuffer(varListDataColumnChunk->getNumValues() + appendSize); + // TODO(Guodong): Do not set vector to a new state. auto dataVector = ListVector::getDataVector(vector); dataVector->setState(std::make_unique()); - dataVector->state->selVector->resetSelectorToValuePosBuffer(); + dataVector->state->selVector->setToFiltered(); copyListValues(vector->getValue(offsetInVector), dataVector); while (offsetInChunk >= numValues) { appendNullList(); From 6f0d8f80bb9f2ebf830814802e9c20dedbdafe7b Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Sun, 31 Mar 2024 15:31:58 +0800 Subject: [PATCH 115/136] Fix issue 3151: disable null on internalID columns (#3165) --- CMakeLists.txt | 2 +- src/storage/store/column.cpp | 2 +- src/storage/store/rel_table_data.cpp | 6 +++--- test/test_files/tinysnb/call/call.test | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 81a7440e8cd..b2a137ecf1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.15) -project(Kuzu VERSION 0.3.2.4 LANGUAGES CXX C) +project(Kuzu VERSION 0.3.2.5 LANGUAGES CXX C) find_package(Threads REQUIRED) diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index ff954fdc97e..2fe76401ba5 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -208,7 +208,7 @@ InternalIDColumn::InternalIDColumn(std::string name, const MetadataDAHInfo& meta BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction, RWPropertyStats stats, bool enableCompression) : Column{name, *LogicalType::INTERNAL_ID(), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, - wal, transaction, stats, enableCompression}, + wal, transaction, stats, enableCompression, false /*requireNullColumn*/}, commonTableID{INVALID_TABLE_ID} {} void InternalIDColumn::populateCommonTableID(ValueVector* resultVector) const { diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 72f428390d3..2078418bbe2 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -146,9 +146,9 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, &DUMMY_WRITE_TRANSACTION, tableID, NBR_ID_COLUMN_ID, direction); auto nbrIDColName = StorageUtils::getColumnName("NBR_ID", StorageUtils::ColumnType::DEFAULT, RelDataDirectionUtils::relDirectionToString(direction)); - auto nbrIDColumn = ColumnFactory::createColumn(nbrIDColName, *LogicalType::INTERNAL_ID(), - *nbrIDMetadataDAHInfo, dataFH, metadataFH, bufferManager, wal, &DUMMY_WRITE_TRANSACTION, - RWPropertyStats::empty(), enableCompression); + auto nbrIDColumn = std::make_unique(nbrIDColName, *nbrIDMetadataDAHInfo, + dataFH, metadataFH, bufferManager, wal, &DUMMY_WRITE_TRANSACTION, RWPropertyStats::empty(), + enableCompression); columns.push_back(std::move(nbrIDColumn)); // Property columns. for (auto i = 0u; i < properties.size(); i++) { diff --git a/test/test_files/tinysnb/call/call.test b/test/test_files/tinysnb/call/call.test index c316cc12974..a57978c3d25 100644 --- a/test/test_files/tinysnb/call/call.test +++ b/test/test_files/tinysnb/call/call.test @@ -222,7 +222,7 @@ Binder exception: Cannot evaluate a.fName as a literal. 38 -STATEMENT CALL storage_info('knows') RETURN COUNT(*) ---- 1 -84 +80 -STATEMENT CALL storage_info('workAt') RETURN COUNT(*) ---- 1 -26 +22 From 6b1d45a910ec7c565bd4efb151e93ceb65c7e568 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Mon, 1 Apr 2024 11:39:06 +0800 Subject: [PATCH 116/136] Rework DDL operators (#3178) --- .../duckdb_scanner/src/duckdb_catalog.cpp | 1 + .../duckdb_scanner/src/duckdb_storage.cpp | 3 - .../src/include/duckdb_catalog.h | 3 +- src/binder/bind/bind_attach_database.cpp | 1 + src/binder/bind/bind_comment_on.cpp | 1 + src/binder/bind/bind_copy.cpp | 1 + src/binder/bind/bind_create_macro.cpp | 1 + src/binder/bind/bind_ddl.cpp | 1 + src/binder/bind/bind_detach_database.cpp | 1 + src/binder/bind/bind_export_database.cpp | 1 + src/binder/bind/bind_graph_pattern.cpp | 2 +- src/binder/bind/bind_import_database.cpp | 2 + src/binder/bind/bind_reading_clause.cpp | 3 + src/binder/bind/bind_updating_clause.cpp | 1 + src/binder/bind/copy/bind_copy_rdf_graph.cpp | 2 + src/binder/bind/ddl/bind_create_rdf_graph.cpp | 1 + .../bind_expression/bind_case_expression.cpp | 1 + .../bind_comparison_expression.cpp | 2 + .../bind_function_expression.cpp | 3 + .../bind_subquery_expression.cpp | 2 + src/binder/binder.cpp | 4 +- src/binder/expression_binder.cpp | 1 + src/catalog/catalog.cpp | 139 +++++++--------- src/catalog/catalog_content.cpp | 148 ++++++++++++------ .../catalog_entry/table_catalog_entry.cpp | 4 +- src/function/table/call/show_tables.cpp | 1 + src/function/vector_cast_functions.cpp | 1 + src/include/binder/binder.h | 20 ++- src/include/catalog/catalog.h | 26 +-- src/include/catalog/catalog_content.h | 42 +++-- src/include/catalog/catalog_set.h | 1 - .../operator/ddl/add_node_property.h | 26 --- .../processor/operator/ddl/add_property.h | 39 ----- .../processor/operator/ddl/add_rel_property.h | 26 --- src/include/processor/operator/ddl/alter.h | 41 +++++ .../processor/operator/ddl/create_rdf_graph.h | 35 ----- .../processor/operator/ddl/create_rel_table.h | 29 ---- .../operator/ddl/create_rel_table_group.h | 29 ---- .../{create_node_table.h => create_table.h} | 10 +- .../processor/operator/ddl/drop_property.h | 29 ---- .../processor/operator/ddl/rename_property.h | 34 ---- .../processor/operator/ddl/rename_table.h | 32 ---- .../processor/operator/physical_operator.h | 7 +- src/include/processor/plan_mapper.h | 9 -- src/include/storage/storage_manager.h | 4 + src/include/storage/store/table_data.h | 10 +- src/include/storage/wal/wal.h | 19 +-- src/include/storage/wal_replayer.h | 4 - .../map/create_factorized_table_scan.cpp | 1 + src/processor/map/map_ddl.cpp | 128 ++------------- src/processor/operator/comment_on.cpp | 1 + src/processor/operator/ddl/CMakeLists.txt | 10 +- .../operator/ddl/add_node_property.cpp | 22 --- src/processor/operator/ddl/add_property.cpp | 12 -- .../operator/ddl/add_rel_property.cpp | 26 --- src/processor/operator/ddl/alter.cpp | 55 +++++++ .../operator/ddl/create_node_table.cpp | 30 ---- .../operator/ddl/create_rdf_graph.cpp | 52 ------ .../operator/ddl/create_rel_table.cpp | 30 ---- .../operator/ddl/create_rel_table_group.cpp | 38 ----- src/processor/operator/ddl/create_table.cpp | 24 +++ src/processor/operator/ddl/drop_property.cpp | 24 --- .../operator/persistent/export_db.cpp | 1 + src/processor/operator/physical_operator.cpp | 14 +- src/storage/storage_manager.cpp | 48 +++++- src/storage/store/table_data.cpp | 9 ++ src/storage/wal/wal.cpp | 24 +-- test/test_files/ddl/add_property.test | 40 ----- test/test_files/ddl/ddl.test | 46 +++++- .../exceptions/binder/binder_error.test | 7 +- tools/shell/test/test_shell_commands.py | 2 +- tools/shell/test/test_shell_control_edit.py | 2 +- 72 files changed, 513 insertions(+), 936 deletions(-) delete mode 100644 src/include/processor/operator/ddl/add_node_property.h delete mode 100644 src/include/processor/operator/ddl/add_property.h delete mode 100644 src/include/processor/operator/ddl/add_rel_property.h create mode 100644 src/include/processor/operator/ddl/alter.h delete mode 100644 src/include/processor/operator/ddl/create_rdf_graph.h delete mode 100644 src/include/processor/operator/ddl/create_rel_table.h delete mode 100644 src/include/processor/operator/ddl/create_rel_table_group.h rename src/include/processor/operator/ddl/{create_node_table.h => create_table.h} (59%) delete mode 100644 src/include/processor/operator/ddl/drop_property.h delete mode 100644 src/include/processor/operator/ddl/rename_property.h delete mode 100644 src/include/processor/operator/ddl/rename_table.h delete mode 100644 src/processor/operator/ddl/add_node_property.cpp delete mode 100644 src/processor/operator/ddl/add_property.cpp delete mode 100644 src/processor/operator/ddl/add_rel_property.cpp create mode 100644 src/processor/operator/ddl/alter.cpp delete mode 100644 src/processor/operator/ddl/create_node_table.cpp delete mode 100644 src/processor/operator/ddl/create_rdf_graph.cpp delete mode 100644 src/processor/operator/ddl/create_rel_table.cpp delete mode 100644 src/processor/operator/ddl/create_rel_table_group.cpp create mode 100644 src/processor/operator/ddl/create_table.cpp delete mode 100644 src/processor/operator/ddl/drop_property.cpp delete mode 100644 test/test_files/ddl/add_property.test diff --git a/extension/duckdb_scanner/src/duckdb_catalog.cpp b/extension/duckdb_scanner/src/duckdb_catalog.cpp index 54f464ddd6b..9b034758374 100644 --- a/extension/duckdb_scanner/src/duckdb_catalog.cpp +++ b/extension/duckdb_scanner/src/duckdb_catalog.cpp @@ -1,6 +1,7 @@ #include "duckdb_catalog.h" #include "common/exception/binder.h" +#include "duckdb_table_catalog_entry.h" #include "duckdb_type_converter.h" namespace kuzu { diff --git a/extension/duckdb_scanner/src/duckdb_storage.cpp b/extension/duckdb_scanner/src/duckdb_storage.cpp index 642eab9c09f..1938c5a69df 100644 --- a/extension/duckdb_scanner/src/duckdb_storage.cpp +++ b/extension/duckdb_scanner/src/duckdb_storage.cpp @@ -1,11 +1,8 @@ #include "duckdb_storage.h" -#include "binder/ddl/bound_create_table_info.h" #include "catalog/catalog_entry/table_catalog_entry.h" #include "common/exception/binder.h" #include "duckdb_catalog.h" -#include "duckdb_scan.h" -#include "duckdb_type_converter.h" namespace kuzu { namespace duckdb_scanner { diff --git a/extension/duckdb_scanner/src/include/duckdb_catalog.h b/extension/duckdb_scanner/src/include/duckdb_catalog.h index 0c210722335..3f72f5878ea 100644 --- a/extension/duckdb_scanner/src/include/duckdb_catalog.h +++ b/extension/duckdb_scanner/src/include/duckdb_catalog.h @@ -1,9 +1,8 @@ #pragma once +#include "binder/ddl/bound_create_table_info.h" #include "catalog/catalog_content.h" -#include "catalog/catalog_entry/table_catalog_entry.h" #include "duckdb_scan.h" -#include "duckdb_table_catalog_entry.h" namespace kuzu { namespace duckdb_scanner { diff --git a/src/binder/bind/bind_attach_database.cpp b/src/binder/bind/bind_attach_database.cpp index b7adca93d2a..cad7a9b2bf6 100644 --- a/src/binder/bind/bind_attach_database.cpp +++ b/src/binder/bind/bind_attach_database.cpp @@ -1,5 +1,6 @@ #include "binder/binder.h" #include "binder/bound_attach_database.h" +#include "common/cast.h" #include "parser/attach_database.h" namespace kuzu { diff --git a/src/binder/bind/bind_comment_on.cpp b/src/binder/bind/bind_comment_on.cpp index 22a044efacb..5b8e5cf6136 100644 --- a/src/binder/bind/bind_comment_on.cpp +++ b/src/binder/bind/bind_comment_on.cpp @@ -1,5 +1,6 @@ #include "binder/binder.h" #include "binder/bound_comment_on.h" +#include "catalog/catalog.h" #include "main/client_context.h" #include "parser/comment_on.h" diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index 3f605f5804b..36836e40ceb 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -1,6 +1,7 @@ #include "binder/binder.h" #include "binder/copy/bound_copy_from.h" #include "binder/copy/bound_copy_to.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" diff --git a/src/binder/bind/bind_create_macro.cpp b/src/binder/bind/bind_create_macro.cpp index 25d06523a0b..c4d720dced3 100644 --- a/src/binder/bind/bind_create_macro.cpp +++ b/src/binder/bind/bind_create_macro.cpp @@ -1,5 +1,6 @@ #include "binder/binder.h" #include "binder/bound_create_macro.h" +#include "catalog/catalog.h" #include "common/exception/binder.h" #include "common/string_format.h" #include "common/string_utils.h" diff --git a/src/binder/bind/bind_ddl.cpp b/src/binder/bind/bind_ddl.cpp index 41ed5d18873..49dfba1d3d5 100644 --- a/src/binder/bind/bind_ddl.cpp +++ b/src/binder/bind/bind_ddl.cpp @@ -2,6 +2,7 @@ #include "binder/ddl/bound_alter.h" #include "binder/ddl/bound_create_table.h" #include "binder/ddl/bound_drop_table.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "catalog/catalog_entry/rel_group_catalog_entry.h" diff --git a/src/binder/bind/bind_detach_database.cpp b/src/binder/bind/bind_detach_database.cpp index af8fd52cdc5..849bd2311a6 100644 --- a/src/binder/bind/bind_detach_database.cpp +++ b/src/binder/bind/bind_detach_database.cpp @@ -1,5 +1,6 @@ #include "binder/binder.h" #include "binder/bound_detach_database.h" +#include "common/cast.h" #include "parser/detach_database.h" namespace kuzu { diff --git a/src/binder/bind/bind_export_database.cpp b/src/binder/bind/bind_export_database.cpp index 052c3e58883..b2d5574d4c3 100644 --- a/src/binder/bind/bind_export_database.cpp +++ b/src/binder/bind/bind_export_database.cpp @@ -1,5 +1,6 @@ #include "binder/copy/bound_export_database.h" #include "binder/query/bound_regular_query.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rel_table_catalog_entry.h" #include "common/exception/binder.h" diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index 839e9388188..fd47455422c 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -3,6 +3,7 @@ #include "binder/expression/path_expression.h" #include "binder/expression/property_expression.h" #include "binder/expression_visitor.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "catalog/catalog_entry/rel_group_catalog_entry.h" @@ -11,7 +12,6 @@ #include "common/keyword/rdf_keyword.h" #include "common/string_format.h" #include "function/cast/functions/cast_from_string_functions.h" -#include "main/client_context.h" using namespace kuzu::common; using namespace kuzu::parser; diff --git a/src/binder/bind/bind_import_database.cpp b/src/binder/bind/bind_import_database.cpp index f8038c55476..bb3d19ced7d 100644 --- a/src/binder/bind/bind_import_database.cpp +++ b/src/binder/bind/bind_import_database.cpp @@ -2,9 +2,11 @@ #include "binder/binder.h" #include "binder/copy/bound_import_database.h" +#include "common/cast.h" #include "common/copier_config/csv_reader_config.h" #include "common/exception/binder.h" #include "common/file_system/virtual_file_system.h" +#include "main/client_context.h" #include "parser/copy.h" #include "parser/parser.h" #include "parser/port_db.h" diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index 2ea4508c7f0..f73f2008441 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -4,10 +4,13 @@ #include "binder/query/reading_clause/bound_load_from.h" #include "binder/query/reading_clause/bound_match_clause.h" #include "binder/query/reading_clause/bound_unwind_clause.h" +#include "catalog/catalog.h" +#include "catalog/catalog_entry/table_catalog_entry.h" #include "common/exception/binder.h" #include "common/exception/message.h" #include "common/string_format.h" #include "common/string_utils.h" +#include "function/built_in_function_utils.h" #include "function/table/bind_input.h" #include "main/attached_database.h" #include "main/database.h" diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index 6a9ed375bde..91f19c1ce68 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -6,6 +6,7 @@ #include "binder/query/updating_clause/bound_insert_clause.h" #include "binder/query/updating_clause/bound_merge_clause.h" #include "binder/query/updating_clause/bound_set_clause.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "common/assert.h" diff --git a/src/binder/bind/copy/bind_copy_rdf_graph.cpp b/src/binder/bind/copy/bind_copy_rdf_graph.cpp index 2d3fba9e791..91be6b04fd7 100644 --- a/src/binder/bind/copy/bind_copy_rdf_graph.cpp +++ b/src/binder/bind/copy/bind_copy_rdf_graph.cpp @@ -1,9 +1,11 @@ #include "binder/binder.h" #include "binder/copy/bound_copy_from.h" +#include "catalog/catalog.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "common/constants.h" #include "common/copier_config/rdf_reader_config.h" #include "common/keyword/rdf_keyword.h" +#include "function/built_in_function_utils.h" #include "function/table/bind_input.h" #include "main/client_context.h" #include "parser/copy.h" diff --git a/src/binder/bind/ddl/bind_create_rdf_graph.cpp b/src/binder/bind/ddl/bind_create_rdf_graph.cpp index 1fd97c0d70d..8b5f79a3bcc 100644 --- a/src/binder/bind/ddl/bind_create_rdf_graph.cpp +++ b/src/binder/bind/ddl/bind_create_rdf_graph.cpp @@ -1,4 +1,5 @@ #include "binder/binder.h" +#include "binder/ddl/bound_create_table_info.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "common/keyword/rdf_keyword.h" #include "parser/ddl/create_table_info.h" diff --git a/src/binder/bind_expression/bind_case_expression.cpp b/src/binder/bind_expression/bind_case_expression.cpp index f6977584785..be3d49804ad 100644 --- a/src/binder/bind_expression/bind_case_expression.cpp +++ b/src/binder/bind_expression/bind_case_expression.cpp @@ -1,6 +1,7 @@ #include "binder/binder.h" #include "binder/expression/case_expression.h" #include "binder/expression_binder.h" +#include "common/cast.h" #include "parser/expression/parsed_case_expression.h" using namespace kuzu::common; diff --git a/src/binder/bind_expression/bind_comparison_expression.cpp b/src/binder/bind_expression/bind_comparison_expression.cpp index fb2086a08b6..42161e187bf 100644 --- a/src/binder/bind_expression/bind_comparison_expression.cpp +++ b/src/binder/bind_expression/bind_comparison_expression.cpp @@ -1,7 +1,9 @@ #include "binder/binder.h" #include "binder/expression/function_expression.h" #include "binder/expression_binder.h" +#include "catalog/catalog.h" #include "common/exception/binder.h" +#include "function/built_in_function_utils.h" #include "main/client_context.h" using namespace kuzu::common; diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index af4a41e9615..c67aa059cb1 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -3,12 +3,15 @@ #include "binder/expression/function_expression.h" #include "binder/expression/property_expression.h" #include "binder/expression_binder.h" +#include "catalog/catalog.h" #include "common/exception/binder.h" #include "function/aggregate/collect.h" #include "function/arithmetic/vector_arithmetic_functions.h" +#include "function/built_in_function_utils.h" #include "function/cast/vector_cast_functions.h" #include "function/path/vector_path_functions.h" #include "function/rewrite_function.h" +#include "function/scalar_macro_function.h" #include "function/schema/vector_label_functions.h" #include "function/schema/vector_node_rel_functions.h" #include "main/client_context.h" diff --git a/src/binder/bind_expression/bind_subquery_expression.cpp b/src/binder/bind_expression/bind_subquery_expression.cpp index a9a5db1aa20..ef05be7d8b1 100644 --- a/src/binder/bind_expression/bind_subquery_expression.cpp +++ b/src/binder/bind_expression/bind_subquery_expression.cpp @@ -2,8 +2,10 @@ #include "binder/expression/function_expression.h" #include "binder/expression/subquery_expression.h" #include "binder/expression_binder.h" +#include "catalog/catalog.h" #include "common/types/value/value.h" #include "function/aggregate/count_star.h" +#include "function/built_in_function_utils.h" #include "parser/expression/parsed_subquery_expression.h" using namespace kuzu::parser; diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 60069fa1661..fd950492d87 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -1,13 +1,15 @@ #include "binder/binder.h" #include "binder/bound_statement_rewriter.h" +#include "catalog/catalog.h" +#include "catalog/catalog_entry/table_catalog_entry.h" #include "common/copier_config/csv_reader_config.h" #include "common/exception/binder.h" #include "common/keyword/rdf_keyword.h" #include "common/string_format.h" #include "common/string_utils.h" +#include "function/built_in_function_utils.h" #include "function/table_functions.h" -#include "main/client_context.h" using namespace kuzu::catalog; using namespace kuzu::common; diff --git a/src/binder/expression_binder.cpp b/src/binder/expression_binder.cpp index c870f2a9aa0..0cfafed848d 100644 --- a/src/binder/expression_binder.cpp +++ b/src/binder/expression_binder.cpp @@ -8,6 +8,7 @@ #include "common/string_format.h" #include "expression_evaluator/expression_evaluator_utils.h" #include "function/cast/vector_cast_functions.h" +#include "main/client_context.h" using namespace kuzu::common; using namespace kuzu::function; diff --git a/src/catalog/catalog.cpp b/src/catalog/catalog.cpp index d075773bf53..6f580bd1a94 100644 --- a/src/catalog/catalog.cpp +++ b/src/catalog/catalog.cpp @@ -1,5 +1,7 @@ #include "catalog/catalog.h" +#include "binder/ddl/bound_alter_info.h" +#include "binder/ddl/bound_create_table_info.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" #include "catalog/catalog_entry/rel_group_catalog_entry.h" @@ -10,6 +12,7 @@ #include "transaction/transaction.h" #include "transaction/transaction_action.h" +using namespace kuzu::binder; using namespace kuzu::common; using namespace kuzu::storage; using namespace kuzu::transaction; @@ -45,11 +48,11 @@ table_id_t Catalog::getTableID(Transaction* tx, const std::string& tableName) co return getVersion(tx)->getTableID(tableName); } -std::vector Catalog::getNodeTableIDs(Transaction* tx) const { +std::vector Catalog::getNodeTableIDs(Transaction* tx) const { return getVersion(tx)->getTableIDs(CatalogEntryType::NODE_TABLE_ENTRY); } -std::vector Catalog::getRelTableIDs(Transaction* tx) const { +std::vector Catalog::getRelTableIDs(Transaction* tx) const { return getVersion(tx)->getTableIDs(CatalogEntryType::REL_TABLE_ENTRY); } @@ -57,8 +60,7 @@ std::string Catalog::getTableName(Transaction* tx, table_id_t tableID) const { return getVersion(tx)->getTableName(tableID); } -TableCatalogEntry* Catalog::getTableCatalogEntry( - transaction::Transaction* tx, common::table_id_t tableID) const { +TableCatalogEntry* Catalog::getTableCatalogEntry(Transaction* tx, table_id_t tableID) const { return ku_dynamic_cast( getVersion(tx)->getTableCatalogEntry(tableID)); } @@ -68,23 +70,22 @@ std::vector Catalog::getNodeTableEntries(Transaction* tx CatalogEntryType::NODE_TABLE_ENTRY); } -std::vector Catalog::getRelTableEntries(transaction::Transaction* tx) const { +std::vector Catalog::getRelTableEntries(Transaction* tx) const { return getVersion(tx)->getTableCatalogEntries( CatalogEntryType::REL_TABLE_ENTRY); } -std::vector Catalog::getRelTableGroupEntries( - transaction::Transaction* tx) const { +std::vector Catalog::getRelTableGroupEntries(Transaction* tx) const { return getVersion(tx)->getTableCatalogEntries( CatalogEntryType::REL_GROUP_ENTRY); } -std::vector Catalog::getRdfGraphEntries(transaction::Transaction* tx) const { +std::vector Catalog::getRdfGraphEntries(Transaction* tx) const { return getVersion(tx)->getTableCatalogEntries( CatalogEntryType::RDF_GRAPH_ENTRY); } -std::vector Catalog::getTableEntries(transaction::Transaction* tx) const { +std::vector Catalog::getTableEntries(Transaction* tx) const { std::vector result; for (auto& [_, entry] : getVersion(tx)->tables->getEntries()) { result.push_back(ku_dynamic_cast(entry.get())); @@ -118,29 +119,37 @@ void Catalog::checkpointInMemory() { } } -table_id_t Catalog::addNodeTableSchema(const binder::BoundCreateTableInfo& info) { +table_id_t Catalog::createTableSchema(const BoundCreateTableInfo& info) { KU_ASSERT(readWriteVersion != nullptr); setToUpdated(); - return readWriteVersion->createNodeTable(info); -} - -table_id_t Catalog::addRelTableSchema(const binder::BoundCreateTableInfo& info) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - return readWriteVersion->createRelTable(info); -} - -common::table_id_t Catalog::addRelTableGroupSchema(const binder::BoundCreateTableInfo& info) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - auto tableID = readWriteVersion->createRelGroup(info); + auto tableID = readWriteVersion->createTable(info); + logCreateTableToWAL(info, tableID); return tableID; } -table_id_t Catalog::addRdfGraphSchema(const binder::BoundCreateTableInfo& info) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - return readWriteVersion->createRDFGraph(info); +void Catalog::logCreateTableToWAL(const BoundCreateTableInfo& info, table_id_t tableID) { + auto tableEntry = readWriteVersion->getTableCatalogEntry(tableID); + switch (info.type) { + case TableType::NODE: + case TableType::REL: { + wal->logCreateTableRecord(tableID, info.type); + } break; + case TableType::REL_GROUP: { + auto newRelGroupEntry = ku_dynamic_cast(tableEntry); + for (auto& relTableID : newRelGroupEntry->getRelTableIDs()) { + wal->logCreateTableRecord(relTableID, TableType::REL); + } + } break; + case TableType::RDF: { + auto rdfGraphEntry = ku_dynamic_cast(tableEntry); + wal->logCreateRdfGraphRecord(tableID, rdfGraphEntry->getResourceTableID(), + rdfGraphEntry->getLiteralTableID(), rdfGraphEntry->getResourceTripleTableID(), + rdfGraphEntry->getLiteralTripleTableID()); + } break; + default: { + KU_UNREACHABLE; + } + } } void Catalog::dropTableSchema(table_id_t tableID) { @@ -181,64 +190,36 @@ void Catalog::dropTableSchema(table_id_t tableID) { } } -void Catalog::renameTable(table_id_t tableID, const std::string& newName) { +void Catalog::alterTableSchema(const BoundAlterInfo& info) { KU_ASSERT(readWriteVersion != nullptr); setToUpdated(); - auto tableEntry = readWriteVersion->getTableCatalogEntry(tableID); - switch (tableEntry->getType()) { - case CatalogEntryType::RDF_GRAPH_ENTRY: { - auto rdfGraphSchema = ku_dynamic_cast(tableEntry); - readWriteVersion->renameTable(rdfGraphSchema->getResourceTableID(), - RDFGraphCatalogEntry::getResourceTableName(newName)); - readWriteVersion->renameTable(rdfGraphSchema->getLiteralTableID(), - RDFGraphCatalogEntry::getLiteralTableName(newName)); - readWriteVersion->renameTable(rdfGraphSchema->getResourceTripleTableID(), - RDFGraphCatalogEntry::getResourceTripleTableName(newName)); - readWriteVersion->renameTable(rdfGraphSchema->getLiteralTripleTableID(), - RDFGraphCatalogEntry::getLiteralTripleTableName(newName)); - readWriteVersion->renameTable(tableID, newName); + readWriteVersion->alterTable(info); + logAlterTableToWAL(info); +} + +void Catalog::logAlterTableToWAL(const BoundAlterInfo& info) { + auto tableSchema = ku_dynamic_cast( + readWriteVersion->getTableCatalogEntry(info.tableID)); + switch (info.alterType) { + case AlterType::ADD_PROPERTY: { + auto& addPropInfo = + ku_dynamic_cast( + *info.extraInfo); + wal->logAddPropertyRecord( + info.tableID, tableSchema->getPropertyID(addPropInfo.propertyName)); + } break; + case AlterType::DROP_PROPERTY: { + auto& dropPropInfo = + ku_dynamic_cast( + *info.extraInfo); + wal->logDropPropertyRecord(info.tableID, dropPropInfo.propertyID); } break; default: { - readWriteVersion->renameTable(tableID, newName); + // DO NOTHING. } } } -void Catalog::addNodeProperty( - table_id_t tableID, const std::string& propertyName, std::unique_ptr dataType) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - auto tableEntry = readWriteVersion->getTableCatalogEntry(tableID); - ku_dynamic_cast(tableEntry) - ->addProperty(propertyName, std::move(dataType)); -} - -void Catalog::addRelProperty( - table_id_t tableID, const std::string& propertyName, std::unique_ptr dataType) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - auto tableEntry = readWriteVersion->getTableCatalogEntry(tableID); - ku_dynamic_cast(tableEntry) - ->addProperty(propertyName, std::move(dataType)); -} - -void Catalog::dropProperty(table_id_t tableID, property_id_t propertyID) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - auto tableEntry = readWriteVersion->getTableCatalogEntry(tableID); - ku_dynamic_cast(tableEntry)->dropProperty(propertyID); - wal->logDropPropertyRecord(tableID, propertyID); -} - -void Catalog::renameProperty( - table_id_t tableID, property_id_t propertyID, const std::string& newName) { - KU_ASSERT(readWriteVersion != nullptr); - setToUpdated(); - auto tableEntry = readWriteVersion->getTableCatalogEntry(tableID); - ku_dynamic_cast(tableEntry) - ->renameProperty(propertyID, newName); -} - void Catalog::addFunction(std::string name, function::function_set functionSet) { initCatalogContentForWriteTrxIfNecessary(); KU_ASSERT(readWriteVersion != nullptr); @@ -254,7 +235,7 @@ CatalogSet* Catalog::getFunctions(Transaction* tx) const { return getVersion(tx)->functions.get(); } -CatalogEntry* Catalog::getFunctionEntry(transaction::Transaction* tx, const std::string& name) { +CatalogEntry* Catalog::getFunctionEntry(Transaction* tx, const std::string& name) { auto catalogSet = getVersion(tx)->functions.get(); if (!catalogSet->containsEntry(name)) { throw CatalogException(stringFormat("function {} does not exist.", name)); @@ -275,7 +256,7 @@ void Catalog::addScalarMacroFunction( readWriteVersion->functions->createEntry(std::move(scalarMacroCatalogEntry)); } -std::vector Catalog::getMacroNames(transaction::Transaction* tx) const { +std::vector Catalog::getMacroNames(Transaction* tx) const { std::vector macroNames; for (auto& [_, function] : getVersion(tx)->functions->getEntries()) { if (function->getType() == CatalogEntryType::SCALAR_MACRO_ENTRY) { diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index b6ed6f70e1b..e7d92ed7cb1 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -2,6 +2,7 @@ #include +#include "binder/ddl/bound_alter_info.h" #include "binder/ddl/bound_create_table_info.h" #include "catalog/catalog_entry/function_catalog_entry.h" #include "catalog/catalog_entry/node_table_catalog_entry.h" @@ -17,6 +18,7 @@ #include "common/serializer/deserializer.h" #include "common/serializer/serializer.h" #include "common/string_format.h" +#include "function/built_in_function_utils.h" #include "storage/storage_utils.h" #include "storage/storage_version_info.h" @@ -27,7 +29,7 @@ using namespace kuzu::storage; namespace kuzu { namespace catalog { -CatalogContent::CatalogContent(common::VirtualFileSystem* vfs) : nextTableID{0}, vfs{vfs} { +CatalogContent::CatalogContent(VirtualFileSystem* vfs) : nextTableID{0}, vfs{vfs} { tables = std::make_unique(); functions = std::make_unique(); registerBuiltInFunctions(); @@ -38,8 +40,31 @@ CatalogContent::CatalogContent(const std::string& directory, VirtualFileSystem* registerBuiltInFunctions(); } -table_id_t CatalogContent::createNodeTable(const binder::BoundCreateTableInfo& info) { +table_id_t CatalogContent::createTable(const BoundCreateTableInfo& info) { table_id_t tableID = assignNextTableID(); + std::unique_ptr entry; + switch (info.type) { + case TableType::NODE: { + entry = createNodeTableEntry(tableID, info); + } break; + case TableType::REL: { + entry = createRelTableEntry(tableID, info); + } break; + case TableType::REL_GROUP: { + entry = createRelTableGroupEntry(tableID, info); + } break; + case TableType::RDF: { + entry = createRdfGraphEntry(tableID, info); + } break; + default: + KU_UNREACHABLE; + } + tables->createEntry(std::move(entry)); + return tableID; +} + +std::unique_ptr CatalogContent::createNodeTableEntry( + table_id_t tableID, const BoundCreateTableInfo& info) const { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -48,13 +73,11 @@ table_id_t CatalogContent::createNodeTable(const binder::BoundCreateTableInfo& i for (auto& propertyInfo : extraInfo->propertyInfos) { nodeTableEntry->addProperty(propertyInfo.name, propertyInfo.type.copy()); } - tableNameToIDMap.emplace(nodeTableEntry->getName(), tableID); - tables->createEntry(std::move(nodeTableEntry)); - return tableID; + return nodeTableEntry; } -table_id_t CatalogContent::createRelTable(const binder::BoundCreateTableInfo& info) { - table_id_t tableID = assignNextTableID(); +std::unique_ptr CatalogContent::createRelTableEntry( + table_id_t tableID, const BoundCreateTableInfo& info) const { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -70,29 +93,24 @@ table_id_t CatalogContent::createRelTable(const binder::BoundCreateTableInfo& in for (auto& propertyInfo : extraInfo->propertyInfos) { relTableEntry->addProperty(propertyInfo.name, propertyInfo.type.copy()); } - tableNameToIDMap.emplace(relTableEntry->getName(), tableID); - tables->createEntry(std::move(relTableEntry)); - return tableID; + return relTableEntry; } -table_id_t CatalogContent::createRelGroup(const binder::BoundCreateTableInfo& info) { - auto relGroupID = assignNextTableID(); - auto extraInfo = (BoundExtraCreateRelTableGroupInfo*)info.extraInfo.get(); +std::unique_ptr CatalogContent::createRelTableGroupEntry( + table_id_t tableID, const BoundCreateTableInfo& info) { + auto extraInfo = + ku_dynamic_cast( + info.extraInfo.get()); std::vector relTableIDs; relTableIDs.reserve(extraInfo->infos.size()); for (auto& childInfo : extraInfo->infos) { - relTableIDs.push_back(createRelTable(childInfo)); + relTableIDs.push_back(createTable(childInfo)); } - auto relGroupName = info.tableName; - auto relGroupEntry = - std::make_unique(relGroupName, relGroupID, std::move(relTableIDs)); - tableNameToIDMap.emplace(relGroupName, relGroupID); - tables->createEntry(std::move(relGroupEntry)); - return relGroupID; + return std::make_unique(info.tableName, tableID, std::move(relTableIDs)); } -table_id_t CatalogContent::createRDFGraph(const binder::BoundCreateTableInfo& info) { - table_id_t rdfGraphID = assignNextTableID(); +std::unique_ptr CatalogContent::createRdfGraphEntry( + table_id_t tableID, const BoundCreateTableInfo& info) { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -107,27 +125,24 @@ table_id_t CatalogContent::createRDFGraph(const binder::BoundCreateTableInfo& in ku_dynamic_cast( literalTripleInfo.extraInfo.get()); // Resource table - auto resourceTableID = createNodeTable(resourceInfo); + auto resourceTableID = createTable(resourceInfo); // Literal table - auto literalTableID = createNodeTable(literalInfo); + auto literalTableID = createTable(literalInfo); // Resource triple table resourceTripleExtraInfo->srcTableID = resourceTableID; resourceTripleExtraInfo->dstTableID = resourceTableID; - auto resourceTripleTableID = createRelTable(resourceTripleInfo); + auto resourceTripleTableID = createTable(resourceTripleInfo); // Literal triple table literalTripleExtraInfo->srcTableID = resourceTableID; literalTripleExtraInfo->dstTableID = literalTableID; - auto literalTripleTableID = createRelTable(literalTripleInfo); + auto literalTripleTableID = createTable(literalTripleInfo); // Rdf graph entry auto rdfGraphName = info.tableName; - auto rdfGraphEntry = std::make_unique(rdfGraphName, rdfGraphID, - resourceTableID, literalTableID, resourceTripleTableID, literalTripleTableID); - tableNameToIDMap.emplace(rdfGraphName, rdfGraphID); - tables->createEntry(std::move(rdfGraphEntry)); - return rdfGraphID; + return std::make_unique(rdfGraphName, tableID, resourceTableID, + literalTableID, resourceTripleTableID, literalTripleTableID); } -void CatalogContent::dropTable(common::table_id_t tableID) { +void CatalogContent::dropTable(table_id_t tableID) { auto tableEntry = getTableCatalogEntry(tableID); if (tableEntry->getType() == CatalogEntryType::REL_GROUP_ENTRY) { auto relGroupEntry = ku_dynamic_cast(tableEntry); @@ -135,14 +150,61 @@ void CatalogContent::dropTable(common::table_id_t tableID) { dropTable(relTableID); } } - tableNameToIDMap.erase(tableEntry->getName()); tables->removeEntry(tableEntry->getName()); } +void CatalogContent::alterTable(const BoundAlterInfo& info) { + switch (info.alterType) { + case AlterType::RENAME_TABLE: { + auto& renameInfo = + ku_dynamic_cast( + *info.extraInfo); + renameTable(info.tableID, renameInfo.newName); + } break; + case AlterType::ADD_PROPERTY: { + auto& addPropInfo = + ku_dynamic_cast( + *info.extraInfo); + auto tableEntry = + ku_dynamic_cast(getTableCatalogEntry(info.tableID)); + tableEntry->addProperty(addPropInfo.propertyName, addPropInfo.dataType.copy()); + } break; + case AlterType::RENAME_PROPERTY: { + auto& renamePropInfo = + ku_dynamic_cast( + *info.extraInfo); + auto tableEntry = + ku_dynamic_cast(getTableCatalogEntry(info.tableID)); + tableEntry->renameProperty(renamePropInfo.propertyID, renamePropInfo.newName); + } break; + case AlterType::DROP_PROPERTY: { + auto& dropPropInfo = + ku_dynamic_cast( + *info.extraInfo); + auto tableEntry = + ku_dynamic_cast(getTableCatalogEntry(info.tableID)); + tableEntry->dropProperty(dropPropInfo.propertyID); + } break; + default: { + KU_UNREACHABLE; + } + } +} + void CatalogContent::renameTable(table_id_t tableID, const std::string& newName) { + // TODO(Xiyang/Ziyi): Do we allow renaming of rel table groups? auto tableEntry = getTableCatalogEntry(tableID); - tableNameToIDMap.erase(tableEntry->getName()); - tableNameToIDMap.emplace(newName, tableID); + if (tableEntry->getType() == CatalogEntryType::RDF_GRAPH_ENTRY) { + auto rdfGraphEntry = ku_dynamic_cast(tableEntry); + renameTable(rdfGraphEntry->getResourceTableID(), + RDFGraphCatalogEntry::getResourceTableName(newName)); + renameTable( + rdfGraphEntry->getLiteralTableID(), RDFGraphCatalogEntry::getLiteralTableName(newName)); + renameTable(rdfGraphEntry->getResourceTripleTableID(), + RDFGraphCatalogEntry::getResourceTripleTableName(newName)); + renameTable(rdfGraphEntry->getLiteralTripleTableID(), + RDFGraphCatalogEntry::getLiteralTripleTableName(newName)); + } tables->renameEntry(tableEntry->getName(), newName); } @@ -197,17 +259,13 @@ void CatalogContent::readFromFile(const std::string& directory, FileVersionType deserializer.deserializeValue(savedStorageVersion); validateStorageVersion(savedStorageVersion); tables = CatalogSet::deserialize(deserializer); - for (auto& [name, entry] : tables->getEntries()) { - tableNameToIDMap[entry->getName()] = - ku_dynamic_cast(entry.get())->getTableID(); - } deserializer.deserializeValue(nextTableID); functions = CatalogSet::deserialize(deserializer); } void CatalogContent::addFunction(std::string name, function::function_set definitions) { if (functions->containsEntry(name)) { - throw CatalogException{common::stringFormat("function {} already exists.", name)}; + throw CatalogException{stringFormat("function {} already exists.", name)}; } functions->createEntry(std::make_unique( CatalogEntryType::SCALAR_FUNCTION_ENTRY, std::move(name), std::move(definitions))); @@ -221,8 +279,7 @@ function::ScalarMacroFunction* CatalogContent::getScalarMacroFunction( std::unique_ptr CatalogContent::copy() const { std::unordered_map> macrosToCopy; - return std::make_unique( - tables->copy(), tableNameToIDMap, nextTableID, functions->copy(), vfs); + return std::make_unique(tables->copy(), nextTableID, functions->copy(), vfs); } void CatalogContent::registerBuiltInFunctions() { @@ -230,7 +287,7 @@ void CatalogContent::registerBuiltInFunctions() { } bool CatalogContent::containsTable(const std::string& tableName) const { - return tableNameToIDMap.contains(tableName); + return tables->containsEntry(tableName); } bool CatalogContent::containsTable(CatalogEntryType tableType) const { @@ -256,13 +313,12 @@ CatalogEntry* CatalogContent::getTableCatalogEntry(table_id_t tableID) const { KU_UNREACHABLE; } -common::table_id_t CatalogContent::getTableID(const std::string& tableName) const { +table_id_t CatalogContent::getTableID(const std::string& tableName) const { if (tables->containsEntry(tableName)) { return ku_dynamic_cast(tables->getEntry(tableName)) ->getTableID(); } else { - throw common::CatalogException{ - common::stringFormat("Table: {} does not exist.", tableName)}; + throw CatalogException{stringFormat("Table: {} does not exist.", tableName)}; } } diff --git a/src/catalog/catalog_entry/table_catalog_entry.cpp b/src/catalog/catalog_entry/table_catalog_entry.cpp index cbae0dd4f1c..8a5a0267d44 100644 --- a/src/catalog/catalog_entry/table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/table_catalog_entry.cpp @@ -30,8 +30,8 @@ const Property* TableCatalogEntry::getProperty(common::property_id_t propertyID) common::column_id_t TableCatalogEntry::getColumnID(const common::property_id_t propertyID) const { auto it = std::find_if(properties.begin(), properties.end(), [&propertyID](const auto& property) { return property.getPropertyID() == propertyID; }); - return it == properties.end() ? common::INVALID_COLUMN_ID : - std::distance(properties.begin(), it); + KU_ASSERT(it != properties.end()); + return std::distance(properties.begin(), it); } bool TableCatalogEntry::containPropertyType(const common::LogicalType& logicalType) const { diff --git a/src/function/table/call/show_tables.cpp b/src/function/table/call/show_tables.cpp index 98acca07d25..8c120dd29b9 100644 --- a/src/function/table/call/show_tables.cpp +++ b/src/function/table/call/show_tables.cpp @@ -1,4 +1,5 @@ #include "catalog/catalog.h" +#include "catalog/catalog_entry/table_catalog_entry.h" #include "function/table/call_functions.h" using namespace kuzu::common; diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index 3ceb9c403af..17871fab5df 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -4,6 +4,7 @@ #include "binder/expression/literal_expression.h" #include "common/exception/binder.h" #include "common/exception/conversion.h" +#include "function/built_in_function_utils.h" #include "function/cast/functions/cast_array.h" #include "function/cast/functions/cast_from_string_functions.h" #include "function/cast/functions/cast_functions.h" diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index f63d932fb97..e378c661b0f 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -1,11 +1,11 @@ #pragma once +#include "binder/binder_scope.h" +#include "binder/expression_binder.h" #include "binder/query/bound_regular_query.h" #include "binder/query/query_graph.h" -#include "binder_scope.h" -#include "catalog/catalog.h" #include "common/copier_config/reader_config.h" -#include "expression_binder.h" +#include "common/enums/table_type.h" #include "parser/query/graph_pattern/pattern_element.h" #include "parser/query/regular_query.h" @@ -15,9 +15,16 @@ struct CreateTableInfo; struct BaseScanSource; } // namespace parser +namespace catalog { +class NodeTableCatalogEntry; +class RelTableCatalogEntry; +class RDFGraphCatalogEntry; +class Property; +} // namespace catalog + namespace extension { struct ExtensionOptions; -} +} // namespace extension namespace main { class ClientContext; @@ -26,11 +33,12 @@ class Database; namespace function { struct TableFunction; -} +} // namespace function namespace binder { - +struct PropertyInfo; struct BoundBaseScanSource; +struct BoundCreateTableInfo; struct BoundInsertInfo; struct BoundSetPropertyInfo; struct BoundDeleteInfo; diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index 27f0cd6a08e..2333d951ea9 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -2,8 +2,7 @@ #include -#include "catalog/catalog_entry/table_catalog_entry.h" -#include "catalog_content.h" +#include "catalog/catalog_content.h" namespace kuzu { namespace storage { @@ -14,7 +13,7 @@ enum class TransactionAction : uint8_t; class Transaction; } // namespace transaction namespace catalog { - +class TableCatalogEntry; class NodeTableCatalogEntry; class RelTableCatalogEntry; class RelGroupCatalogEntry; @@ -51,22 +50,9 @@ class Catalog { std::vector getTableSchemas( transaction::Transaction* tx, const common::table_id_vector_t& tableIDs) const; - common::table_id_t addNodeTableSchema(const binder::BoundCreateTableInfo& info); - common::table_id_t addRelTableSchema(const binder::BoundCreateTableInfo& info); - common::table_id_t addRelTableGroupSchema(const binder::BoundCreateTableInfo& info); - common::table_id_t addRdfGraphSchema(const binder::BoundCreateTableInfo& info); + common::table_id_t createTableSchema(const binder::BoundCreateTableInfo& info); void dropTableSchema(common::table_id_t tableID); - void renameTable(common::table_id_t tableID, const std::string& newName); - - void addNodeProperty(common::table_id_t tableID, const std::string& propertyName, - std::unique_ptr dataType); - void addRelProperty(common::table_id_t tableID, const std::string& propertyName, - std::unique_ptr dataType); - - void dropProperty(common::table_id_t tableID, common::property_id_t propertyID); - - void renameProperty( - common::table_id_t tableID, common::property_id_t propertyID, const std::string& newName); + void alterTableSchema(const binder::BoundAlterInfo& info); void setTableComment(common::table_id_t tableID, const std::string& comment); @@ -106,10 +92,12 @@ class Catalog { CatalogContent* getVersion(transaction::Transaction* tx) const; bool hasUpdates() const { return isUpdated; } - void setToUpdated() { isUpdated = true; } void resetToNotUpdated() { isUpdated = false; } + void logCreateTableToWAL(const binder::BoundCreateTableInfo& info, common::table_id_t tableID); + void logAlterTableToWAL(const binder::BoundAlterInfo& info); + protected: // The flat indicates if the readWriteVersion has been updated and is different from the // readOnlyVersion. diff --git a/src/include/catalog/catalog_content.h b/src/include/catalog/catalog_content.h index 10c45e302c1..335e62fc134 100644 --- a/src/include/catalog/catalog_content.h +++ b/src/include/catalog/catalog_content.h @@ -1,17 +1,22 @@ #pragma once -#include "binder/ddl/bound_create_table_info.h" -#include "catalog_set.h" +#include "catalog/catalog_set.h" #include "common/cast.h" -#include "function/built_in_function_utils.h" -#include "function/scalar_macro_function.h" namespace kuzu { +namespace binder { +struct BoundAlterInfo; +struct BoundCreateTableInfo; +} // namespace binder namespace common { class Serializer; class Deserializer; class VirtualFileSystem; } // namespace common +namespace function { +struct ScalarMacroFunction; +} // namespace function + namespace catalog { class CatalogContent { @@ -24,12 +29,10 @@ class CatalogContent { CatalogContent(const std::string& directory, common::VirtualFileSystem* vfs); - CatalogContent(std::unique_ptr tables, - std::unordered_map tableNameToIDMap, - common::table_id_t nextTableID, std::unique_ptr functions, - common::VirtualFileSystem* vfs) - : tables{std::move(tables)}, tableNameToIDMap{std::move(tableNameToIDMap)}, - nextTableID{nextTableID}, vfs{vfs}, functions{std::move(functions)} {} + CatalogContent(std::unique_ptr tables, common::table_id_t nextTableID, + std::unique_ptr functions, common::VirtualFileSystem* vfs) + : tables{std::move(tables)}, nextTableID{nextTableID}, vfs{vfs}, functions{std::move( + functions)} {} common::table_id_t getTableID(const std::string& tableName) const; CatalogEntry* getTableCatalogEntry(common::table_id_t tableID) const; @@ -74,20 +77,25 @@ class CatalogContent { std::vector getTableIDs(CatalogEntryType catalogType) const; - common::table_id_t createNodeTable(const binder::BoundCreateTableInfo& info); - common::table_id_t createRelTable(const binder::BoundCreateTableInfo& info); - common::table_id_t createRelGroup(const binder::BoundCreateTableInfo& info); - common::table_id_t createRDFGraph(const binder::BoundCreateTableInfo& info); + common::table_id_t createTable(const binder::BoundCreateTableInfo& info); void dropTable(common::table_id_t tableID); + void alterTable(const binder::BoundAlterInfo& info); + +private: + std::unique_ptr createNodeTableEntry( + common::table_id_t tableID, const binder::BoundCreateTableInfo& info) const; + std::unique_ptr createRelTableEntry( + common::table_id_t tableID, const binder::BoundCreateTableInfo& info) const; + std::unique_ptr createRelTableGroupEntry( + common::table_id_t tableID, const binder::BoundCreateTableInfo& info); + std::unique_ptr createRdfGraphEntry( + common::table_id_t tableID, const binder::BoundCreateTableInfo& info); void renameTable(common::table_id_t tableID, const std::string& newName); protected: std::unique_ptr tables; private: - // These two maps are maintained as caches. They are not serialized to the catalog file, but - // is re-constructed when reading from the catalog file. - std::unordered_map tableNameToIDMap; common::table_id_t nextTableID; common::VirtualFileSystem* vfs; std::unique_ptr functions; diff --git a/src/include/catalog/catalog_set.h b/src/include/catalog/catalog_set.h index 0165068ff20..367dbbfa69b 100644 --- a/src/include/catalog/catalog_set.h +++ b/src/include/catalog/catalog_set.h @@ -2,7 +2,6 @@ #include "catalog_entry/catalog_entry.h" #include "common/case_insensitive_map.h" -#include "common/serializer/serializer.h" namespace kuzu { namespace catalog { diff --git a/src/include/processor/operator/ddl/add_node_property.h b/src/include/processor/operator/ddl/add_node_property.h deleted file mode 100644 index e8c09e08b41..00000000000 --- a/src/include/processor/operator/ddl/add_node_property.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "processor/operator/ddl/add_property.h" - -namespace kuzu { -namespace processor { - -class AddNodeProperty final : public AddProperty { -public: - AddNodeProperty(common::table_id_t tableID, std::string propertyName, - std::unique_ptr dataType, - std::unique_ptr defaultValueEvaluator, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : AddProperty{tableID, std::move(propertyName), std::move(dataType), - std::move(defaultValueEvaluator), outputPos, id, paramsString} {} - - void executeDDLInternal(ExecutionContext* context) final; - - std::unique_ptr clone() override { - return make_unique(tableID, propertyName, dataType->copy(), - defaultValueEvaluator->clone(), outputPos, id, paramsString); - } -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/add_property.h b/src/include/processor/operator/ddl/add_property.h deleted file mode 100644 index 469cca98f23..00000000000 --- a/src/include/processor/operator/ddl/add_property.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "ddl.h" -#include "expression_evaluator/expression_evaluator.h" - -namespace kuzu { -namespace processor { - -class AddProperty : public DDL { -public: - AddProperty(common::table_id_t tableID, std::string propertyName, - std::unique_ptr dataType, - std::unique_ptr defaultValueEvaluator, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::ADD_PROPERTY, outputPos, id, paramsString}, tableID{tableID}, - propertyName{std::move(propertyName)}, dataType{std::move(dataType)}, - defaultValueEvaluator{std::move(defaultValueEvaluator)} {} - - void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override { - DDL::initLocalStateInternal(resultSet, context); - defaultValueEvaluator->init(*resultSet, context->clientContext->getMemoryManager()); - } - - void executeDDLInternal(ExecutionContext* context) override = 0; - - std::string getOutputMsg() override { return {"Add Succeed."}; } - -protected: - common::ValueVector* getDefaultValVector(ExecutionContext* context); - -protected: - common::table_id_t tableID; - std::string propertyName; - std::unique_ptr dataType; - std::unique_ptr defaultValueEvaluator; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/add_rel_property.h b/src/include/processor/operator/ddl/add_rel_property.h deleted file mode 100644 index 80e18a346e6..00000000000 --- a/src/include/processor/operator/ddl/add_rel_property.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "add_property.h" - -namespace kuzu { -namespace processor { - -class AddRelProperty final : public AddProperty { -public: - AddRelProperty(common::table_id_t tableID, std::string propertyName, - std::unique_ptr dataType, - std::unique_ptr expressionEvaluator, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : AddProperty(tableID, std::move(propertyName), std::move(dataType), - std::move(expressionEvaluator), outputPos, id, paramsString) {} - - void executeDDLInternal(ExecutionContext* context) override; - - std::unique_ptr clone() override { - return make_unique(tableID, propertyName, dataType->copy(), - defaultValueEvaluator->clone(), outputPos, id, paramsString); - } -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/alter.h b/src/include/processor/operator/ddl/alter.h new file mode 100644 index 00000000000..1f907e6ea42 --- /dev/null +++ b/src/include/processor/operator/ddl/alter.h @@ -0,0 +1,41 @@ +#pragma once + +#include "binder/ddl/bound_alter_info.h" +#include "expression_evaluator/expression_evaluator.h" +#include "processor/operator/ddl/ddl.h" + +namespace kuzu { +namespace processor { + +class Alter : public DDL { +public: + Alter(binder::BoundAlterInfo info, + std::unique_ptr defaultValueEvaluator, + const DataPos& outputPos, uint32_t id, const std::string& paramsString) + : DDL{PhysicalOperatorType::ALTER, outputPos, id, paramsString}, info{std::move(info)}, + defaultValueEvaluator{std::move(defaultValueEvaluator)} {} + + void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override { + DDL::initLocalStateInternal(resultSet, context); + if (defaultValueEvaluator) { + defaultValueEvaluator->init(*resultSet, context->clientContext->getMemoryManager()); + } + } + + void executeDDLInternal(ExecutionContext* context) final; + + std::string getOutputMsg() final; + + std::unique_ptr clone() final { + return std::make_unique(info.copy(), + defaultValueEvaluator == nullptr ? nullptr : defaultValueEvaluator->clone(), outputPos, + id, paramsString); + } + +private: + binder::BoundAlterInfo info; + std::unique_ptr defaultValueEvaluator; +}; + +} // namespace processor +} // namespace kuzu diff --git a/src/include/processor/operator/ddl/create_rdf_graph.h b/src/include/processor/operator/ddl/create_rdf_graph.h deleted file mode 100644 index 2596df63eb8..00000000000 --- a/src/include/processor/operator/ddl/create_rdf_graph.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "ddl.h" -#include "storage/storage_manager.h" - -namespace kuzu { -namespace processor { - -class CreateRdfGraph final : public DDL { -public: - CreateRdfGraph(storage::StorageManager* storageManager, binder::BoundCreateTableInfo info, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_RDF_GRAPH, outputPos, id, paramsString}, - storageManager{storageManager}, - nodesStatistics{storageManager->getNodesStatisticsAndDeletedIDs()}, - relsStatistics{storageManager->getRelsStatistics()}, info{std::move(info)} {} - - void executeDDLInternal(ExecutionContext* context) override; - - std::string getOutputMsg() override; - - inline std::unique_ptr clone() override { - return std::make_unique( - storageManager, info.copy(), outputPos, id, paramsString); - } - -private: - storage::StorageManager* storageManager; - storage::NodesStoreStatsAndDeletedIDs* nodesStatistics; - storage::RelsStoreStats* relsStatistics; - binder::BoundCreateTableInfo info; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/create_rel_table.h b/src/include/processor/operator/ddl/create_rel_table.h deleted file mode 100644 index 9a338d65722..00000000000 --- a/src/include/processor/operator/ddl/create_rel_table.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include "binder/ddl/bound_create_table_info.h" -#include "processor/operator/ddl/ddl.h" - -namespace kuzu { -namespace processor { - -class CreateRelTable final : public DDL { -public: - CreateRelTable(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, - const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_REL_TABLE, outputPos, id, paramsString}, info{std::move( - info)} {} - - void executeDDLInternal(ExecutionContext* context) override; - - std::string getOutputMsg() override; - - std::unique_ptr clone() override { - return make_unique(info.copy(), outputPos, id, paramsString); - } - -private: - binder::BoundCreateTableInfo info; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/create_rel_table_group.h b/src/include/processor/operator/ddl/create_rel_table_group.h deleted file mode 100644 index 869e7e8c81a..00000000000 --- a/src/include/processor/operator/ddl/create_rel_table_group.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include "binder/ddl/bound_create_table_info.h" -#include "processor/operator/ddl/ddl.h" - -namespace kuzu { -namespace processor { - -class CreateRelTableGroup : public DDL { -public: - CreateRelTableGroup(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, - const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_REL_TABLE, outputPos, id, paramsString}, info{std::move( - info)} {} - - void executeDDLInternal(ExecutionContext* context) override; - - std::string getOutputMsg() override; - - std::unique_ptr clone() override { - return make_unique(info.copy(), outputPos, id, paramsString); - } - -private: - binder::BoundCreateTableInfo info; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/create_node_table.h b/src/include/processor/operator/ddl/create_table.h similarity index 59% rename from src/include/processor/operator/ddl/create_node_table.h rename to src/include/processor/operator/ddl/create_table.h index 09d14169760..0b6f9f13812 100644 --- a/src/include/processor/operator/ddl/create_node_table.h +++ b/src/include/processor/operator/ddl/create_table.h @@ -6,19 +6,19 @@ namespace kuzu { namespace processor { -class CreateNodeTable : public DDL { +class CreateTable : public DDL { public: - CreateNodeTable(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, + CreateTable(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_NODE_TABLE, outputPos, id, paramsString}, info{std::move( - info)} {} + : DDL{PhysicalOperatorType::CREATE_TABLE, outputPos, id, paramsString}, info{std::move( + info)} {} void executeDDLInternal(ExecutionContext* context) final; std::string getOutputMsg() final; std::unique_ptr clone() final { - return std::make_unique(info.copy(), outputPos, id, paramsString); + return std::make_unique(info.copy(), outputPos, id, paramsString); } private: diff --git a/src/include/processor/operator/ddl/drop_property.h b/src/include/processor/operator/ddl/drop_property.h deleted file mode 100644 index 93947d95fbd..00000000000 --- a/src/include/processor/operator/ddl/drop_property.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include "ddl.h" - -namespace kuzu { -namespace processor { - -class DropProperty : public DDL { -public: - DropProperty(common::table_id_t tableID, common::property_id_t propertyID, - const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::DROP_PROPERTY, outputPos, id, paramsString}, tableID{tableID}, - propertyID{propertyID} {} - - void executeDDLInternal(ExecutionContext* context) final; - - std::string getOutputMsg() final { return {"Drop succeed."}; } - - std::unique_ptr clone() override { - return make_unique(tableID, propertyID, outputPos, id, paramsString); - } - -protected: - common::table_id_t tableID; - common::property_id_t propertyID; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/rename_property.h b/src/include/processor/operator/ddl/rename_property.h deleted file mode 100644 index 324a84e90e4..00000000000 --- a/src/include/processor/operator/ddl/rename_property.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "catalog/catalog.h" -#include "ddl.h" - -namespace kuzu { -namespace processor { - -class RenameProperty : public DDL { -public: - RenameProperty(common::table_id_t tableID, common::property_id_t propertyID, - std::string newName, const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::RENAME_PROPERTY, outputPos, id, paramsString}, tableID{tableID}, - propertyID{propertyID}, newName{std::move(newName)} {} - - void executeDDLInternal(ExecutionContext* context) override { - context->clientContext->getCatalog()->renameProperty(tableID, propertyID, newName); - } - - std::string getOutputMsg() override { return "Property renamed"; } - - std::unique_ptr clone() override { - return make_unique( - tableID, propertyID, newName, outputPos, id, paramsString); - } - -protected: - common::table_id_t tableID; - common::property_id_t propertyID; - std::string newName; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/ddl/rename_table.h b/src/include/processor/operator/ddl/rename_table.h deleted file mode 100644 index 77f96493de2..00000000000 --- a/src/include/processor/operator/ddl/rename_table.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "catalog/catalog.h" -#include "ddl.h" - -namespace kuzu { -namespace processor { - -class RenameTable final : public DDL { -public: - RenameTable(common::table_id_t tableID, std::string newName, const DataPos& outputPos, - uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::RENAME_TABLE, outputPos, id, paramsString}, tableID{tableID}, - newName{std::move(newName)} {} - - void executeDDLInternal(ExecutionContext* context) override { - context->clientContext->getCatalog()->renameTable(tableID, newName); - } - - std::string getOutputMsg() override { return "Table renamed"; } - - std::unique_ptr clone() override { - return make_unique(tableID, newName, outputPos, id, paramsString); - } - -protected: - common::table_id_t tableID; - std::string newName; -}; - -} // namespace processor -} // namespace kuzu diff --git a/src/include/processor/operator/physical_operator.h b/src/include/processor/operator/physical_operator.h index 3920a98aec9..203329da2a5 100644 --- a/src/include/processor/operator/physical_operator.h +++ b/src/include/processor/operator/physical_operator.h @@ -7,7 +7,7 @@ namespace kuzu { namespace processor { enum class PhysicalOperatorType : uint8_t { - ADD_PROPERTY, + ALTER, AGGREGATE, AGGREGATE_SCAN, ATTACH_DATABASE, @@ -19,13 +19,10 @@ enum class PhysicalOperatorType : uint8_t { IN_QUERY_CALL, COPY_RDF, COPY_TO, - CREATE_NODE_TABLE, - CREATE_REL_TABLE, - CREATE_RDF_GRAPH, + CREATE_TABLE, CROSS_PRODUCT, DELETE_NODE, DELETE_REL, - DROP_PROPERTY, DROP_TABLE, EMPTY_RESULT, EXPORT_DATABASE, diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index 8a0ef472f97..b4b8c1fe28a 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -76,11 +76,6 @@ class PlanMapper { std::unique_ptr mapDeleteNode(planner::LogicalOperator* logicalOperator); std::unique_ptr mapDeleteRel(planner::LogicalOperator* logicalOperator); std::unique_ptr mapCreateTable(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapCreateNodeTable(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapCreateRelTable(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapCreateRelTableGroup( - planner::LogicalOperator* logicalOperator); - std::unique_ptr mapCreateRdfGraph(planner::LogicalOperator* logicalOperator); std::unique_ptr mapCopyFrom(planner::LogicalOperator* logicalOperator); std::unique_ptr mapCopyTo(planner::LogicalOperator* logicalOperator); std::unique_ptr mapCopyNodeFrom(planner::LogicalOperator* logicalOperator); @@ -89,10 +84,6 @@ class PlanMapper { std::unique_ptr mapPartitioner(planner::LogicalOperator* logicalOperator); std::unique_ptr mapDropTable(planner::LogicalOperator* logicalOperator); std::unique_ptr mapAlter(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapRenameTable(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapAddProperty(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapDropProperty(planner::LogicalOperator* logicalOperator); - std::unique_ptr mapRenameProperty(planner::LogicalOperator* logicalOperator); std::unique_ptr mapStandaloneCall(planner::LogicalOperator* logicalOperator); std::unique_ptr mapCommentOn(planner::LogicalOperator* logicalOperator); std::unique_ptr mapInQueryCall(planner::LogicalOperator* logicalOperator); diff --git a/src/include/storage/storage_manager.h b/src/include/storage/storage_manager.h index a65bb490537..dc3888cdbfe 100644 --- a/src/include/storage/storage_manager.h +++ b/src/include/storage/storage_manager.h @@ -49,6 +49,10 @@ class StorageManager { void createNodeTable(common::table_id_t tableID, catalog::NodeTableCatalogEntry* tableSchema); void createRelTable(common::table_id_t tableID, catalog::RelTableCatalogEntry* tableSchema, catalog::Catalog* catalog, transaction::Transaction* transaction); + void createRelTableGroup(common::table_id_t tableID, catalog::RelGroupCatalogEntry* tableSchema, + catalog::Catalog* catalog, transaction::Transaction* transaction); + void createRdfGraph(common::table_id_t tableID, catalog::RDFGraphCatalogEntry* tableSchema, + catalog::Catalog* catalog, transaction::Transaction* transaction); private: std::unique_ptr dataFH; diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index 65ad23b1aa1..e73c3dd9cdd 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -4,6 +4,11 @@ #include "storage/store/column.h" namespace kuzu { +namespace catalog { +class TableCatalogEntry; +class Property; +} // namespace catalog + namespace storage { struct TableDataReadState { @@ -53,10 +58,7 @@ class TableData { protected: TableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, catalog::TableCatalogEntry* tableEntry, BufferManager* bufferManager, WAL* wal, - bool enableCompression) - : dataFH{dataFH}, metadataFH{metadataFH}, tableID{tableEntry->getTableID()}, - tableName{tableEntry->getName()}, bufferManager{bufferManager}, wal{wal}, - enableCompression{enableCompression} {} + bool enableCompression); protected: BMFileHandle* dataFH; diff --git a/src/include/storage/wal/wal.h b/src/include/storage/wal/wal.h index 042c97cb809..5a786fba8ff 100644 --- a/src/include/storage/wal/wal.h +++ b/src/include/storage/wal/wal.h @@ -5,10 +5,6 @@ #include "storage/buffer_manager/buffer_manager.h" #include "storage/wal/wal_record.h" -namespace spdlog { -class logger; -} - namespace kuzu { namespace storage { @@ -102,22 +98,16 @@ class WAL : public BaseWALAndWALIterator { void logCatalogRecord(); - void logCreateNodeTableRecord(common::table_id_t tableID); - void logCreateRelTableRecord(common::table_id_t tableID); - void logRdfGraphRecord(common::table_id_t rdfGraphID, common::table_id_t resourceTableID, + void logCreateTableRecord(common::table_id_t tableID, common::TableType tableType); + void logCreateRdfGraphRecord(common::table_id_t rdfGraphID, common::table_id_t resourceTableID, common::table_id_t literalTableID, common::table_id_t resourceTripleTableID, common::table_id_t literalTripleTableID); - - void logOverflowFileNextBytePosRecord(DBFileID dbFileID, uint64_t prevNextByteToWriteTo); - - void logCopyTableRecord(common::table_id_t tableID); - void logDropTableRecord(common::table_id_t tableID); - void logDropPropertyRecord(common::table_id_t tableID, common::property_id_t propertyID); - void logAddPropertyRecord(common::table_id_t tableID, common::property_id_t propertyID); + void logCopyTableRecord(common::table_id_t tableID); + // Removes the contents of WAL file. void clearWAL(); @@ -157,7 +147,6 @@ class WAL : public BaseWALAndWALIterator { // Node/Rel tables that might have changes to their in-memory data structures that need to be // committed/rolled back accordingly during the wal replaying. std::unordered_set updatedTables; - std::shared_ptr logger; std::string directory; std::mutex mtx; BufferManager& bufferManager; diff --git a/src/include/storage/wal_replayer.h b/src/include/storage/wal_replayer.h index fb5479d5745..90e2681fc02 100644 --- a/src/include/storage/wal_replayer.h +++ b/src/include/storage/wal_replayer.h @@ -6,10 +6,6 @@ #include "storage/wal/wal.h" #include "storage/wal/wal_record.h" -namespace spdlog { -class logger; -} - namespace kuzu { namespace storage { diff --git a/src/processor/map/create_factorized_table_scan.cpp b/src/processor/map/create_factorized_table_scan.cpp index 2e135b27782..f3142792d15 100644 --- a/src/processor/map/create_factorized_table_scan.cpp +++ b/src/processor/map/create_factorized_table_scan.cpp @@ -2,6 +2,7 @@ #include "binder/expression/expression_util.h" #include "catalog/catalog.h" +#include "function/built_in_function_utils.h" #include "processor/operator/call/in_query_call.h" #include "processor/operator/table_scan/ftable_scan_function.h" #include "processor/plan_mapper.h" diff --git a/src/processor/map/map_ddl.cpp b/src/processor/map/map_ddl.cpp index c94f957cf3b..9737f5063cc 100644 --- a/src/processor/map/map_ddl.cpp +++ b/src/processor/map/map_ddl.cpp @@ -1,16 +1,9 @@ #include "planner/operator/ddl/logical_alter.h" #include "planner/operator/ddl/logical_create_table.h" #include "planner/operator/ddl/logical_drop_table.h" -#include "processor/operator/ddl/add_node_property.h" -#include "processor/operator/ddl/add_rel_property.h" -#include "processor/operator/ddl/create_node_table.h" -#include "processor/operator/ddl/create_rdf_graph.h" -#include "processor/operator/ddl/create_rel_table.h" -#include "processor/operator/ddl/create_rel_table_group.h" -#include "processor/operator/ddl/drop_property.h" +#include "processor/operator/ddl/alter.h" +#include "processor/operator/ddl/create_table.h" #include "processor/operator/ddl/drop_table.h" -#include "processor/operator/ddl/rename_property.h" -#include "processor/operator/ddl/rename_table.h" #include "processor/plan_mapper.h" using namespace kuzu::binder; @@ -28,48 +21,8 @@ static DataPos getOutputPos(LogicalDDL* logicalDDL) { std::unique_ptr PlanMapper::mapCreateTable(LogicalOperator* logicalOperator) { auto createTable = (LogicalCreateTable*)logicalOperator; - switch (createTable->getInfo()->type) { - case TableType::NODE: { - return mapCreateNodeTable(logicalOperator); - } - case TableType::REL: { - return mapCreateRelTable(logicalOperator); - } - case TableType::REL_GROUP: { - return mapCreateRelTableGroup(logicalOperator); - } - case TableType::RDF: { - return mapCreateRdfGraph(logicalOperator); - } - default: - KU_UNREACHABLE; - } -} - -std::unique_ptr PlanMapper::mapCreateNodeTable(LogicalOperator* logicalOperator) { - auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(createTable->getInfo()->copy(), - getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); -} - -std::unique_ptr PlanMapper::mapCreateRelTable(LogicalOperator* logicalOperator) { - auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(createTable->getInfo()->copy(), - getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); -} - -std::unique_ptr PlanMapper::mapCreateRelTableGroup( - LogicalOperator* logicalOperator) { - auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(createTable->getInfo()->copy(), - getOutputPos(createTable), getOperatorID(), createTable->getExpressionsForPrinting()); -} - -std::unique_ptr PlanMapper::mapCreateRdfGraph(LogicalOperator* logicalOperator) { - auto createTable = (LogicalCreateTable*)logicalOperator; - return std::make_unique(clientContext->getStorageManager(), - createTable->getInfo()->copy(), getOutputPos(createTable), getOperatorID(), - createTable->getExpressionsForPrinting()); + return std::make_unique(createTable->getInfo()->copy(), getOutputPos(createTable), + getOperatorID(), createTable->getExpressionsForPrinting()); } std::unique_ptr PlanMapper::mapDropTable(LogicalOperator* logicalOperator) { @@ -80,69 +33,16 @@ std::unique_ptr PlanMapper::mapDropTable(LogicalOperator* logi std::unique_ptr PlanMapper::mapAlter(LogicalOperator* logicalOperator) { auto alter = reinterpret_cast(logicalOperator); - switch (alter->getInfo()->alterType) { - case AlterType::RENAME_TABLE: { - return mapRenameTable(logicalOperator); - } - case AlterType::ADD_PROPERTY: { - return mapAddProperty(logicalOperator); - } - case AlterType::DROP_PROPERTY: { - return mapDropProperty(logicalOperator); - } - case AlterType::RENAME_PROPERTY: { - return mapRenameProperty(logicalOperator); - } - default: - KU_UNREACHABLE; - } -} - -std::unique_ptr PlanMapper::mapRenameTable(LogicalOperator* logicalOperator) { - auto alter = reinterpret_cast(logicalOperator); - auto info = alter->getInfo(); - auto extraInfo = reinterpret_cast(info->extraInfo.get()); - return std::make_unique(info->tableID, extraInfo->newName, getOutputPos(alter), - getOperatorID(), alter->getExpressionsForPrinting()); -} - -std::unique_ptr PlanMapper::mapAddProperty(LogicalOperator* logicalOperator) { - auto alter = reinterpret_cast(logicalOperator); - auto info = alter->getInfo(); - auto extraInfo = reinterpret_cast(info->extraInfo.get()); - auto expressionEvaluator = - ExpressionMapper::getEvaluator(extraInfo->defaultValue, alter->getSchema()); - auto tableSchema = - clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), info->tableID); - switch (tableSchema->getTableType()) { - case TableType::NODE: - return std::make_unique(info->tableID, extraInfo->propertyName, - extraInfo->dataType.copy(), std::move(expressionEvaluator), getOutputPos(alter), - getOperatorID(), alter->getExpressionsForPrinting()); - case TableType::REL: - return std::make_unique(info->tableID, extraInfo->propertyName, - extraInfo->dataType.copy(), std::move(expressionEvaluator), getOutputPos(alter), - getOperatorID(), alter->getExpressionsForPrinting()); - default: - KU_UNREACHABLE; - } -} - -std::unique_ptr PlanMapper::mapDropProperty(LogicalOperator* logicalOperator) { - auto alter = reinterpret_cast(logicalOperator); - auto info = alter->getInfo(); - auto extraInfo = reinterpret_cast(info->extraInfo.get()); - return std::make_unique(info->tableID, extraInfo->propertyID, getOutputPos(alter), - getOperatorID(), alter->getExpressionsForPrinting()); -} - -std::unique_ptr PlanMapper::mapRenameProperty(LogicalOperator* logicalOperator) { - auto alter = reinterpret_cast(logicalOperator); - auto info = alter->getInfo(); - auto extraInfo = reinterpret_cast(info->extraInfo.get()); - return std::make_unique(info->tableID, extraInfo->propertyID, - extraInfo->newName, getOutputPos(alter), getOperatorID(), - alter->getExpressionsForPrinting()); + std::unique_ptr defaultValueEvaluator; + if (alter->getInfo()->alterType == AlterType::ADD_PROPERTY) { + auto& addPropInfo = + ku_dynamic_cast( + *alter->getInfo()->extraInfo); + defaultValueEvaluator = + ExpressionMapper::getEvaluator(addPropInfo.defaultValue, alter->getSchema()); + } + return std::make_unique(alter->getInfo()->copy(), std::move(defaultValueEvaluator), + getOutputPos(alter), getOperatorID(), alter->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/operator/comment_on.cpp b/src/processor/operator/comment_on.cpp index 95096422858..0b484c27bea 100644 --- a/src/processor/operator/comment_on.cpp +++ b/src/processor/operator/comment_on.cpp @@ -8,6 +8,7 @@ using namespace kuzu::common; namespace kuzu { namespace processor { +// TODO(Xiyang/Ziyi): Should move this operator into Alter. bool CommentOn::getNextTuplesInternal(kuzu::processor::ExecutionContext* /*context*/) { if (commentOnInfo->hasExecuted) { return false; diff --git a/src/processor/operator/ddl/CMakeLists.txt b/src/processor/operator/ddl/CMakeLists.txt index 0349e6816f1..f929222bcc1 100644 --- a/src/processor/operator/ddl/CMakeLists.txt +++ b/src/processor/operator/ddl/CMakeLists.txt @@ -1,14 +1,8 @@ add_library(kuzu_processor_operator_ddl OBJECT - add_node_property.cpp - add_property.cpp - add_rel_property.cpp - create_node_table.cpp - create_rdf_graph.cpp - create_rel_table_group.cpp - create_rel_table.cpp + alter.cpp + create_table.cpp ddl.cpp - drop_property.cpp drop_table.cpp) set(ALL_OBJECT_FILES diff --git a/src/processor/operator/ddl/add_node_property.cpp b/src/processor/operator/ddl/add_node_property.cpp deleted file mode 100644 index 1bee0b5197b..00000000000 --- a/src/processor/operator/ddl/add_node_property.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "processor/operator/ddl/add_node_property.h" - -#include "catalog/catalog.h" -#include "storage/storage_manager.h" - -namespace kuzu { -namespace processor { - -void AddNodeProperty::executeDDLInternal(ExecutionContext* context) { - auto catalog = context->clientContext->getCatalog(); - auto storageManager = context->clientContext->getStorageManager(); - catalog->addNodeProperty(tableID, propertyName, std::move(dataType)); - auto schema = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); - auto addedPropID = schema->getPropertyID(propertyName); - auto addedProp = schema->getProperty(addedPropID); - storageManager->getTable(tableID)->addColumn( - context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); - storageManager->getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/add_property.cpp b/src/processor/operator/ddl/add_property.cpp deleted file mode 100644 index 5986ea59c5c..00000000000 --- a/src/processor/operator/ddl/add_property.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "processor/operator/ddl/add_property.h" - -namespace kuzu { -namespace processor { - -common::ValueVector* AddProperty::getDefaultValVector(ExecutionContext* context) { - defaultValueEvaluator->evaluate(context->clientContext); - return defaultValueEvaluator->resultVector.get(); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/add_rel_property.cpp b/src/processor/operator/ddl/add_rel_property.cpp deleted file mode 100644 index 334a4f80da0..00000000000 --- a/src/processor/operator/ddl/add_rel_property.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "processor/operator/ddl/add_rel_property.h" - -#include "catalog/catalog.h" -#include "storage/storage_manager.h" - -using namespace kuzu::catalog; -using namespace kuzu::storage; -using namespace kuzu::common; - -namespace kuzu { -namespace processor { - -void AddRelProperty::executeDDLInternal(ExecutionContext* context) { - auto catalog = context->clientContext->getCatalog(); - auto storageManager = context->clientContext->getStorageManager(); - catalog->addRelProperty(tableID, propertyName, dataType->copy()); - auto tableSchema = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); - auto addedPropertyID = tableSchema->getPropertyID(propertyName); - auto addedProp = tableSchema->getProperty(addedPropertyID); - storageManager->getTable(tableID)->addColumn( - context->clientContext->getTx(), *addedProp, getDefaultValVector(context)); - storageManager->getWAL()->logAddPropertyRecord(tableID, addedProp->getPropertyID()); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/alter.cpp b/src/processor/operator/ddl/alter.cpp new file mode 100644 index 00000000000..6f05120d704 --- /dev/null +++ b/src/processor/operator/ddl/alter.cpp @@ -0,0 +1,55 @@ +#include "processor/operator/ddl/alter.h" + +#include "catalog/catalog.h" +#include "common/enums/alter_type.h" +#include "storage/storage_manager.h" + +namespace kuzu { +namespace processor { + +void Alter::executeDDLInternal(ExecutionContext* context) { + switch (info.alterType) { + case common::AlterType::ADD_PROPERTY: { + context->clientContext->getCatalog()->alterTableSchema(info); + auto& boundAddPropInfo = common::ku_dynamic_cast(*info.extraInfo); + KU_ASSERT(defaultValueEvaluator); + auto schema = context->clientContext->getCatalog()->getTableCatalogEntry( + context->clientContext->getTx(), info.tableID); + auto addedPropID = schema->getPropertyID(boundAddPropInfo.propertyName); + auto addedProp = schema->getProperty(addedPropID); + defaultValueEvaluator->evaluate(context->clientContext); + auto storageManager = context->clientContext->getStorageManager(); + storageManager->getTable(info.tableID) + ->addColumn(context->clientContext->getTx(), *addedProp, + defaultValueEvaluator->resultVector.get()); + } break; + case common::AlterType::DROP_PROPERTY: { + auto& boundDropPropInfo = common::ku_dynamic_cast(*info.extraInfo); + auto tableEntry = context->clientContext->getCatalog()->getTableCatalogEntry( + context->clientContext->getTx(), info.tableID); + auto columnID = tableEntry->getColumnID(boundDropPropInfo.propertyID); + context->clientContext->getCatalog()->alterTableSchema(info); + if (tableEntry->getTableType() == common::TableType::NODE) { + auto nodesStats = + context->clientContext->getStorageManager()->getNodesStatisticsAndDeletedIDs(); + nodesStats->removeMetadataDAHInfo(info.tableID, columnID); + } else { + auto relsStats = context->clientContext->getStorageManager()->getRelsStatistics(); + relsStats->removeMetadataDAHInfo(info.tableID, columnID); + } + } break; + default: { + context->clientContext->getCatalog()->alterTableSchema(info); + // DO NOTHING. + } + } +} + +std::string Alter::getOutputMsg() { + return common::stringFormat("Table {} altered.", info.tableName); +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/operator/ddl/create_node_table.cpp b/src/processor/operator/ddl/create_node_table.cpp deleted file mode 100644 index 80cffe8ab14..00000000000 --- a/src/processor/operator/ddl/create_node_table.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "processor/operator/ddl/create_node_table.h" - -#include "catalog/catalog_entry/node_table_catalog_entry.h" -#include "common/string_format.h" -#include "storage/storage_manager.h" - -using namespace kuzu::catalog; -using namespace kuzu::common; - -namespace kuzu { -namespace processor { - -void CreateNodeTable::executeDDLInternal(ExecutionContext* context) { - auto catalog = context->clientContext->getCatalog(); - auto storageManager = context->clientContext->getStorageManager(); - auto newTableID = catalog->addNodeTableSchema(info); - auto newNodeTableEntry = ku_dynamic_cast( - catalog->getTableCatalogEntry(context->clientContext->getTx(), newTableID)); - storageManager->getNodesStatisticsAndDeletedIDs()->addNodeStatisticsAndDeletedIDs( - newNodeTableEntry); - storageManager->createTable(newTableID, catalog, context->clientContext->getTx()); - storageManager->getWAL()->logCreateNodeTableRecord(newTableID); -} - -std::string CreateNodeTable::getOutputMsg() { - return stringFormat("Node table: {} has been created.", info.tableName); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/create_rdf_graph.cpp b/src/processor/operator/ddl/create_rdf_graph.cpp deleted file mode 100644 index fc934ab92d1..00000000000 --- a/src/processor/operator/ddl/create_rdf_graph.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "processor/operator/ddl/create_rdf_graph.h" - -#include "catalog/catalog_entry/rdf_graph_catalog_entry.h" -#include "common/cast.h" -#include "common/string_format.h" -#include "storage/storage_manager.h" - -using namespace kuzu::catalog; - -namespace kuzu { -namespace processor { - -using namespace kuzu::common; - -void CreateRdfGraph::executeDDLInternal(ExecutionContext* context) { - auto tx = context->clientContext->getTx(); - auto catalog = context->clientContext->getCatalog(); - auto newRdfGraphID = catalog->addRdfGraphSchema(info); - auto rdfGraphEntry = common::ku_dynamic_cast( - catalog->getTableCatalogEntry(tx, newRdfGraphID)); - auto resourceTableID = rdfGraphEntry->getResourceTableID(); - auto resourceTableEntry = common::ku_dynamic_cast( - catalog->getTableCatalogEntry(tx, resourceTableID)); - nodesStatistics->addNodeStatisticsAndDeletedIDs(resourceTableEntry); - storageManager->createTable(resourceTableID, catalog, tx); - auto literalTableID = rdfGraphEntry->getLiteralTableID(); - auto literalTableEntry = common::ku_dynamic_cast( - catalog->getTableCatalogEntry(tx, literalTableID)); - nodesStatistics->addNodeStatisticsAndDeletedIDs(literalTableEntry); - storageManager->createTable(literalTableID, catalog, tx); - auto resourceTripleTableID = rdfGraphEntry->getResourceTripleTableID(); - auto resourceTripleTableEntry = - common::ku_dynamic_cast( - catalog->getTableCatalogEntry(tx, resourceTripleTableID)); - relsStatistics->addTableStatistic(resourceTripleTableEntry); - storageManager->createTable(resourceTripleTableID, catalog, tx); - auto literalTripleTableID = rdfGraphEntry->getLiteralTripleTableID(); - auto literalTripleTableEntry = - common::ku_dynamic_cast( - catalog->getTableCatalogEntry(tx, literalTripleTableID)); - relsStatistics->addTableStatistic(literalTripleTableEntry); - storageManager->createTable(literalTripleTableID, catalog, tx); - storageManager->getWAL()->logRdfGraphRecord(newRdfGraphID, resourceTableID, literalTableID, - resourceTripleTableID, literalTripleTableID); -} - -std::string CreateRdfGraph::getOutputMsg() { - return common::stringFormat("RDF graph {} has been created.", info.tableName); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/create_rel_table.cpp b/src/processor/operator/ddl/create_rel_table.cpp deleted file mode 100644 index b19f8eacf3a..00000000000 --- a/src/processor/operator/ddl/create_rel_table.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "processor/operator/ddl/create_rel_table.h" - -#include "catalog/catalog_entry/rel_table_catalog_entry.h" -#include "common/string_format.h" -#include "storage/storage_manager.h" - -using namespace kuzu::catalog; -using namespace kuzu::common; -using namespace kuzu::binder; - -namespace kuzu { -namespace processor { - -void CreateRelTable::executeDDLInternal(ExecutionContext* context) { - auto catalog = context->clientContext->getCatalog(); - auto storageManager = context->clientContext->getStorageManager(); - auto newTableID = catalog->addRelTableSchema(info); - auto newRelTableEntry = ku_dynamic_cast( - catalog->getTableCatalogEntry(context->clientContext->getTx(), newTableID)); - storageManager->getRelsStatistics()->addTableStatistic(newRelTableEntry); - storageManager->createTable(newTableID, catalog, context->clientContext->getTx()); - storageManager->getWAL()->logCreateRelTableRecord(newTableID); -} - -std::string CreateRelTable::getOutputMsg() { - return stringFormat("Rel table: {} has been created.", info.tableName); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/create_rel_table_group.cpp b/src/processor/operator/ddl/create_rel_table_group.cpp deleted file mode 100644 index 082b583243b..00000000000 --- a/src/processor/operator/ddl/create_rel_table_group.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "processor/operator/ddl/create_rel_table_group.h" - -#include "catalog/catalog_entry/rel_group_catalog_entry.h" -#include "catalog/catalog_entry/rel_table_catalog_entry.h" -#include "common/string_format.h" -#include "storage/storage_manager.h" - -using namespace kuzu::common; -using namespace kuzu::catalog; - -namespace kuzu { -namespace processor { - -void CreateRelTableGroup::executeDDLInternal(ExecutionContext* context) { - auto catalog = context->clientContext->getCatalog(); - auto storageManager = context->clientContext->getStorageManager(); - auto newRelTableGroupID = catalog->addRelTableGroupSchema(info); - auto tx = context->clientContext->getTx(); - auto newRelGroupEntry = ku_dynamic_cast( - catalog->getTableCatalogEntry(tx, newRelTableGroupID)); - for (auto& relTableID : newRelGroupEntry->getRelTableIDs()) { - auto newRelTableEntry = catalog->getTableCatalogEntry(tx, relTableID); - storageManager->getRelsStatistics()->addTableStatistic( - ku_dynamic_cast(newRelTableEntry)); - storageManager->createTable(relTableID, catalog, tx); - } - // TODO(Ziyi): remove this when we can log variable size record. See also wal_record.h - for (auto relTableID : newRelGroupEntry->getRelTableIDs()) { - storageManager->getWAL()->logCreateRelTableRecord(relTableID); - } -} - -std::string CreateRelTableGroup::getOutputMsg() { - return stringFormat("Rel table group: {} has been created.", info.tableName); -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/ddl/create_table.cpp b/src/processor/operator/ddl/create_table.cpp new file mode 100644 index 00000000000..a4f73420773 --- /dev/null +++ b/src/processor/operator/ddl/create_table.cpp @@ -0,0 +1,24 @@ +#include "processor/operator/ddl/create_table.h" + +#include "common/string_format.h" +#include "storage/storage_manager.h" + +using namespace kuzu::catalog; +using namespace kuzu::common; + +namespace kuzu { +namespace processor { + +void CreateTable::executeDDLInternal(ExecutionContext* context) { + auto catalog = context->clientContext->getCatalog(); + auto newTableID = catalog->createTableSchema(info); + auto storageManager = context->clientContext->getStorageManager(); + storageManager->createTable(newTableID, catalog, context->clientContext->getTx()); +} + +std::string CreateTable::getOutputMsg() { + return stringFormat("Table {} has been created.", info.tableName); +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/operator/ddl/drop_property.cpp b/src/processor/operator/ddl/drop_property.cpp deleted file mode 100644 index 68a8a7c2a00..00000000000 --- a/src/processor/operator/ddl/drop_property.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "processor/operator/ddl/drop_property.h" - -#include "storage/storage_manager.h" - -namespace kuzu { -namespace processor { - -void DropProperty::executeDDLInternal(ExecutionContext* context) { - auto catalog = context->clientContext->getCatalog(); - auto storageManager = context->clientContext->getStorageManager(); - auto tableEntry = catalog->getTableCatalogEntry(context->clientContext->getTx(), tableID); - auto columnID = tableEntry->getColumnID(propertyID); - catalog->dropProperty(tableID, propertyID); - if (tableEntry->getTableType() == common::TableType::NODE) { - auto nodesStats = storageManager->getNodesStatisticsAndDeletedIDs(); - nodesStats->removeMetadataDAHInfo(tableID, columnID); - } else { - auto relsStats = storageManager->getRelsStatistics(); - relsStats->removeMetadataDAHInfo(tableID, columnID); - } -} - -} // namespace processor -} // namespace kuzu diff --git a/src/processor/operator/persistent/export_db.cpp b/src/processor/operator/persistent/export_db.cpp index 17a513a2c80..71a59de28ff 100644 --- a/src/processor/operator/persistent/export_db.cpp +++ b/src/processor/operator/persistent/export_db.cpp @@ -10,6 +10,7 @@ #include "common/copier_config/csv_reader_config.h" #include "common/file_system/virtual_file_system.h" #include "common/string_utils.h" +#include "function/scalar_macro_function.h" using namespace kuzu::common; using namespace kuzu::transaction; diff --git a/src/processor/operator/physical_operator.cpp b/src/processor/operator/physical_operator.cpp index daf6ab962ad..df0f508137e 100644 --- a/src/processor/operator/physical_operator.cpp +++ b/src/processor/operator/physical_operator.cpp @@ -9,8 +9,8 @@ namespace processor { // LCOV_EXCL_START std::string PhysicalOperatorUtils::operatorTypeToString(PhysicalOperatorType operatorType) { switch (operatorType) { - case PhysicalOperatorType::ADD_PROPERTY: - return "ADD_PROPERTY"; + case PhysicalOperatorType::ALTER: + return "ALTER"; case PhysicalOperatorType::AGGREGATE: return "AGGREGATE"; case PhysicalOperatorType::AGGREGATE_SCAN: @@ -33,20 +33,14 @@ std::string PhysicalOperatorUtils::operatorTypeToString(PhysicalOperatorType ope return "READER"; case PhysicalOperatorType::INSERT: return "INSERT"; - case PhysicalOperatorType::CREATE_NODE_TABLE: - return "CREATE_NODE_TABLE"; - case PhysicalOperatorType::CREATE_REL_TABLE: - return "CREATE_REL_TABLE"; - case PhysicalOperatorType::CREATE_RDF_GRAPH: - return "CREATE_RDF_TABLE"; + case PhysicalOperatorType::CREATE_TABLE: + return "CREATE_TABLE"; case PhysicalOperatorType::CROSS_PRODUCT: return "CROSS_PRODUCT"; case PhysicalOperatorType::DELETE_NODE: return "DELETE_NODE"; case PhysicalOperatorType::DELETE_REL: return "DELETE_REL"; - case PhysicalOperatorType::DROP_PROPERTY: - return "DROP_PROPERTY"; case PhysicalOperatorType::DROP_TABLE: return "DROP_TABLE"; case PhysicalOperatorType::EMPTY_RESULT: diff --git a/src/storage/storage_manager.cpp b/src/storage/storage_manager.cpp index 9398c970204..7969432806e 100644 --- a/src/storage/storage_manager.cpp +++ b/src/storage/storage_manager.cpp @@ -1,6 +1,7 @@ #include "storage/storage_manager.h" #include "catalog/catalog_entry/rdf_graph_catalog_entry.h" +#include "catalog/catalog_entry/rel_group_catalog_entry.h" #include "storage/stats/nodes_store_statistics.h" #include "storage/store/node_table.h" #include "storage/wal_replayer.h" @@ -68,6 +69,7 @@ void StorageManager::loadTables(bool readOnly, const Catalog& catalog) { } void StorageManager::createNodeTable(table_id_t tableID, NodeTableCatalogEntry* nodeTableEntry) { + nodesStatisticsAndDeletedIDs->addNodeStatisticsAndDeletedIDs(nodeTableEntry); WALReplayerUtils::createEmptyHashIndexFiles(nodeTableEntry, wal->getDirectory(), vfs); tables[tableID] = std::make_unique(dataFH.get(), metadataFH.get(), nodeTableEntry, nodesStatisticsAndDeletedIDs.get(), &memoryManager, wal, false /* readOnly */, @@ -76,12 +78,44 @@ void StorageManager::createNodeTable(table_id_t tableID, NodeTableCatalogEntry* void StorageManager::createRelTable(table_id_t tableID, RelTableCatalogEntry* relTableEntry, Catalog* catalog, Transaction* transaction) { + relsStatistics->addTableStatistic(relTableEntry); auto relTable = std::make_unique(dataFH.get(), metadataFH.get(), relsStatistics.get(), &memoryManager, relTableEntry, wal, enableCompression); setCommonTableIDToRdfRelTable(relTable.get(), catalog->getRdfGraphEntries(transaction)); tables[tableID] = std::move(relTable); } +void StorageManager::createRelTableGroup( + table_id_t, RelGroupCatalogEntry* tableSchema, Catalog* catalog, Transaction* transaction) { + for (auto relTableID : tableSchema->getRelTableIDs()) { + createRelTable(relTableID, + ku_dynamic_cast( + catalog->getTableCatalogEntry(transaction, relTableID)), + catalog, transaction); + } +} + +void StorageManager::createRdfGraph( + table_id_t, RDFGraphCatalogEntry* tableSchema, Catalog* catalog, Transaction* transaction) { + auto rdfGraphSchema = ku_dynamic_cast(tableSchema); + auto resourceTableID = rdfGraphSchema->getResourceTableID(); + auto resourceTableEntry = ku_dynamic_cast( + catalog->getTableCatalogEntry(transaction, resourceTableID)); + createNodeTable(resourceTableID, resourceTableEntry); + auto literalTableID = rdfGraphSchema->getLiteralTableID(); + auto literalTableEntry = ku_dynamic_cast( + catalog->getTableCatalogEntry(transaction, literalTableID)); + createNodeTable(literalTableID, literalTableEntry); + auto resourceTripleTableID = rdfGraphSchema->getResourceTripleTableID(); + auto resourceTripleTableEntry = ku_dynamic_cast( + catalog->getTableCatalogEntry(transaction, resourceTripleTableID)); + createRelTable(resourceTripleTableID, resourceTripleTableEntry, catalog, transaction); + auto literalTripleTableID = rdfGraphSchema->getLiteralTripleTableID(); + auto literalTripleTableEntry = ku_dynamic_cast( + catalog->getTableCatalogEntry(transaction, literalTripleTableID)); + createRelTable(literalTripleTableID, literalTripleTableEntry, catalog, transaction); +} + void StorageManager::createTable(table_id_t tableID, Catalog* catalog, Transaction* transaction) { auto tableEntry = catalog->getTableCatalogEntry(transaction, tableID); switch (tableEntry->getTableType()) { @@ -94,6 +128,16 @@ void StorageManager::createTable(table_id_t tableID, Catalog* catalog, Transacti ku_dynamic_cast(tableEntry), catalog, transaction); } break; + case TableType::REL_GROUP: { + createRelTableGroup(tableID, + ku_dynamic_cast(tableEntry), catalog, + transaction); + } break; + case TableType::RDF: { + createRdfGraph(tableID, + ku_dynamic_cast(tableEntry), catalog, + transaction); + } break; default: { KU_UNREACHABLE; } @@ -125,7 +169,7 @@ void StorageManager::dropTable(table_id_t tableID) { tables.erase(tableID); } -void StorageManager::prepareCommit(transaction::Transaction* transaction) { +void StorageManager::prepareCommit(Transaction* transaction) { transaction->getLocalStorage()->prepareCommit(); // Tables which are created but not inserted into may have pending writes // which need to be flushed (specifically, the metadata disk array header) @@ -145,7 +189,7 @@ void StorageManager::prepareCommit(transaction::Transaction* transaction) { } } -void StorageManager::prepareRollback(transaction::Transaction* transaction) { +void StorageManager::prepareRollback(Transaction* transaction) { if (nodesStatisticsAndDeletedIDs->hasUpdates()) { wal->logTableStatisticsRecord(true /* isNodeTable */); } diff --git a/src/storage/store/table_data.cpp b/src/storage/store/table_data.cpp index c38d43ea1f1..5c0b6c28307 100644 --- a/src/storage/store/table_data.cpp +++ b/src/storage/store/table_data.cpp @@ -1,11 +1,20 @@ #include "storage/store/table_data.h" +#include "catalog/catalog_entry/table_catalog_entry.h" + using namespace kuzu::common; using namespace kuzu::transaction; namespace kuzu { namespace storage { +TableData::TableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, + catalog::TableCatalogEntry* tableEntry, BufferManager* bufferManager, WAL* wal, + bool enableCompression) + : dataFH{dataFH}, + metadataFH{metadataFH}, tableID{tableEntry->getTableID()}, tableName{tableEntry->getName()}, + bufferManager{bufferManager}, wal{wal}, enableCompression{enableCompression} {} + void TableData::addColumn(Transaction* transaction, const std::string& colNamePrefix, InMemDiskArray* metadataDA, const MetadataDAHInfo& metadataDAHInfo, const catalog::Property& property, ValueVector* defaultValueVector, diff --git a/src/storage/wal/wal.cpp b/src/storage/wal/wal.cpp index dfc729dd543..d784d5d15cd 100644 --- a/src/storage/wal/wal.cpp +++ b/src/storage/wal/wal.cpp @@ -2,8 +2,6 @@ #include "common/exception/runtime.h" #include "common/file_system/virtual_file_system.h" -#include "common/utils.h" -#include "spdlog/spdlog.h" // IWYU pragma: keep: public interface to spdlog. #include "storage/storage_utils.h" using namespace kuzu::common; @@ -13,8 +11,7 @@ namespace storage { WAL::WAL(const std::string& directory, bool readOnly, BufferManager& bufferManager, VirtualFileSystem* vfs) - : logger{LoggerUtils::getLogger(LoggerConstants::LoggerEnum::WAL)}, directory{directory}, - bufferManager{bufferManager}, isLastLoggedRecordCommit_{false} { + : directory{directory}, bufferManager{bufferManager}, isLastLoggedRecordCommit_{false} { fileHandle = bufferManager.getBMFileHandle( vfs->joinPath(directory, std::string(StorageConstants::WAL_FILE_SUFFIX)), readOnly ? FileHandle::O_PERSISTENT_FILE_READ_ONLY : @@ -63,21 +60,15 @@ void WAL::logCatalogRecord() { addNewWALRecordNoLock(walRecord); } -void WAL::logCreateNodeTableRecord(table_id_t tableID) { +void WAL::logCreateTableRecord(table_id_t tableID, TableType tableType) { lock_t lck{mtx}; - WALRecord walRecord = WALRecord::newCreateTableRecord(tableID, TableType::NODE); + KU_ASSERT(tableType == TableType::NODE || tableType == TableType::REL); + WALRecord walRecord = WALRecord::newCreateTableRecord(tableID, tableType); addToUpdatedTables(tableID); addNewWALRecordNoLock(walRecord); } -void WAL::logCreateRelTableRecord(table_id_t tableID) { - lock_t lck{mtx}; - WALRecord walRecord = WALRecord::newCreateTableRecord(tableID, TableType::REL); - addToUpdatedTables(tableID); - addNewWALRecordNoLock(walRecord); -} - -void WAL::logRdfGraphRecord(table_id_t rdfGraphID, table_id_t resourceTableID, +void WAL::logCreateRdfGraphRecord(table_id_t rdfGraphID, table_id_t resourceTableID, table_id_t literalTableID, table_id_t resourceTripleTableID, table_id_t literalTripleTableID) { lock_t lck{mtx}; WALRecord walRecord = WALRecord::newRdfGraphRecord( @@ -160,10 +151,9 @@ void WAL::addNewWALRecordNoLock(WALRecord& walRecord) { void WAL::setIsLastRecordCommit() { WALIterator walIterator(fileHandle, mtx); WALRecord walRecord; + KU_ASSERT(walIterator.hasNextRecord()); if (!walIterator.hasNextRecord()) { - logger->info( - "Opening an existing WAL file but the file is empty. This should never happen. file: " + - fileHandle->getFileInfo()->path); + // Opening an existing WAL file but the file is empty. This should never happen. return; } while (walIterator.hasNextRecord()) { diff --git a/test/test_files/ddl/add_property.test b/test/test_files/ddl/add_property.test deleted file mode 100644 index 2ef869c7975..00000000000 --- a/test/test_files/ddl/add_property.test +++ /dev/null @@ -1,40 +0,0 @@ --GROUP DDL --DATASET CSV empty - --- - --CASE AddNodeProperty --STATEMENT create node table Comment (id int64, PRIMARY KEY (id)); ----- ok --STATEMENT copy Comment from '${KUZU_ROOT_DIRECTORY}/dataset/lsqb-sf01/Comment.csv' (HEADER=true, DELIM='|'); ----- ok --STATEMENT alter table Comment add propx int64; ----- ok --STATEMENT MATCH (c:Comment) RETURN SUM(c.propx); ----- 1 - --STATEMENT alter table Comment add propy int64 default 1; ----- ok --STATEMENT MATCH (c:Comment) RETURN SUM(c.propy); ----- 1 -215488 - --CASE AddRelProperty --STATEMENT create node table Comment (id int64, PRIMARY KEY (id)); ----- ok --STATEMENT create rel table replyOf (FROM Comment TO Comment, MANY_ONE); ----- ok --STATEMENT copy Comment from '${KUZU_ROOT_DIRECTORY}/dataset/lsqb-sf01/Comment.csv' (HEADER=true, DELIM='|'); ----- ok --STATEMENT copy replyOf from '${KUZU_ROOT_DIRECTORY}/dataset/lsqb-sf01/Comment_replyOf_Comment.csv' (HEADER=true, DELIM='|'); ----- ok --STATEMENT alter table replyOf add propx int64; ----- ok --STATEMENT MATCH (c:Comment)-[r:replyOf]->(c2:Comment) RETURN SUM(r.propx); ----- 1 - --STATEMENT alter table replyOf add propy int64 default 1; ----- ok --STATEMENT MATCH (c:Comment)-[r:replyOf]->(c2:Comment) RETURN SUM(r.propy); ----- 1 -108027 diff --git a/test/test_files/ddl/ddl.test b/test/test_files/ddl/ddl.test index cda6fa5dfa6..92861218cd8 100644 --- a/test/test_files/ddl/ddl.test +++ b/test/test_files/ddl/ddl.test @@ -35,10 +35,10 @@ Binder exception: Table movies does not exist. -CASE DDLOutputMessages -STATEMENT CREATE NODE TABLE university(ID INT64, PRIMARY KEY(ID)) ---- 1 -Node table: university has been created. +Table university has been created. -STATEMENT CREATE REL TABLE nearTo(FROM university TO university, MANY_MANY) ---- 1 -Rel table: nearTo has been created. +Table nearTo has been created. -STATEMENT DROP TABLE nearTo; ---- 1 Table: nearTo has been dropped. @@ -47,15 +47,15 @@ Table: nearTo has been dropped. Table: university has been dropped. -STATEMENT ALTER TABLE person DROP fName ---- 1 -Drop succeed. +Table person altered. -STATEMENT ALTER TABLE knows DROP date ---- 1 -Drop succeed. +Table knows altered. -CASE CreateRelGroup -STATEMENT CREATE REL TABLE GROUP likes (FROM person TO person, FROM person TO organisation, since INT64); ---- 1 -Rel table group: likes has been created. +Table likes has been created. -STATEMENT Call table_info('likes_person_person') RETURN *; ---- 1 1|since|INT64 @@ -89,6 +89,42 @@ Binder exception: Table movies does not exist. ---- error Binder exception: Table knows does not exist. +-CASE AddNodeProperty +-STATEMENT create node table Comment (id int64, PRIMARY KEY (id)); +---- ok +-STATEMENT copy Comment from '${KUZU_ROOT_DIRECTORY}/dataset/lsqb-sf01/Comment.csv' (HEADER=true, DELIM='|'); +---- ok +-STATEMENT alter table Comment add propx int64; +---- ok +-STATEMENT MATCH (c:Comment) RETURN SUM(c.propx); +---- 1 + +-STATEMENT alter table Comment add propy int64 default 1; +---- ok +-STATEMENT MATCH (c:Comment) RETURN SUM(c.propy); +---- 1 +215488 + +-CASE AddRelProperty +-STATEMENT create node table Comment (id int64, PRIMARY KEY (id)); +---- ok +-STATEMENT create rel table replyOf (FROM Comment TO Comment, MANY_ONE); +---- ok +-STATEMENT copy Comment from '${KUZU_ROOT_DIRECTORY}/dataset/lsqb-sf01/Comment.csv' (HEADER=true, DELIM='|'); +---- ok +-STATEMENT copy replyOf from '${KUZU_ROOT_DIRECTORY}/dataset/lsqb-sf01/Comment_replyOf_Comment.csv' (HEADER=true, DELIM='|'); +---- ok +-STATEMENT alter table replyOf add propx int64; +---- ok +-STATEMENT MATCH (c:Comment)-[r:replyOf]->(c2:Comment) RETURN SUM(r.propx); +---- 1 + +-STATEMENT alter table replyOf add propy int64 default 1; +---- ok +-STATEMENT MATCH (c:Comment)-[r:replyOf]->(c2:Comment) RETURN SUM(r.propy); +---- 1 +108027 + -CASE DropNodeTablePropertyNormalExecution -STATEMENT ALTER TABLE person DROP gender ---- ok diff --git a/test/test_files/exceptions/binder/binder_error.test b/test/test_files/exceptions/binder/binder_error.test index b9381ee22c8..f90af46521d 100644 --- a/test/test_files/exceptions/binder/binder_error.test +++ b/test/test_files/exceptions/binder/binder_error.test @@ -15,11 +15,6 @@ Binder exception: Cannot resolve any node or relationship to create. ---- error Binder exception: Cannot resolve any node or relationship to create. --LOG NodeTableNotExist --STATEMENT MATCH (a:PERSON) RETURN COUNT(*) ----- error -Binder exception: Table PERSON does not exist. - -LOG RepeatedRelName -STATEMENT MATCH (a:person)-[e1:knows]->(b:person)<-[e1:knows]-(:person) RETURN COUNT(*) ---- error @@ -286,7 +281,7 @@ Binder exception: person already exists in catalog. -LOG CreateNodeTablePKColNameNotExists -STATEMENT CREATE NODE TABLE PERSON(NAME STRING, ID INT64, birthdate date, primary key (dummyColName)) ---- error -Binder exception: Primary key dummyColName does not match any of the predefined node properties. +Binder exception: PERSON already exists in catalog. -LOG CreateNodeTableDuplicatedColumnName -STATEMENT CREATE NODE TABLE student (id INT64, eyesight double, eyesight double, PRIMARY KEY(id)) diff --git a/tools/shell/test/test_shell_commands.py b/tools/shell/test/test_shell_commands.py index c7bd10c7185..f0360e8b173 100644 --- a/tools/shell/test/test_shell_commands.py +++ b/tools/shell/test/test_shell_commands.py @@ -121,7 +121,7 @@ def test_max_width(temp_db, csv_path) -> None: ) result = test.run() # terminal width when running test is 80 - result.check_stdout("Node table: LANGUAGE_CODE has been created.") + result.check_stdout("Table LANGUAGE_CODE has been created.") result.check_not_stdout("| ... |") result.check_stdout("(1 column)") diff --git a/tools/shell/test/test_shell_control_edit.py b/tools/shell/test/test_shell_control_edit.py index 95910c27bdb..02f4eb4b1ed 100644 --- a/tools/shell/test/test_shell_control_edit.py +++ b/tools/shell/test/test_shell_control_edit.py @@ -300,7 +300,7 @@ def test_tab(temp_db) -> None: test.send_finished_statement(KEY_ACTION.ENTER.value) assert ( test.shell_process.expect_exact( - ["| Node table: t0 has been created. |", pexpect.EOF], + ["| Table t0 has been created. |", pexpect.EOF], ) == 0 ) From ac9cbf330d0455b05c2ae874806278cf6b89777e Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Mon, 1 Apr 2024 13:13:04 -0400 Subject: [PATCH 117/136] Refactor table functions (#3155) --- src/binder/bind/copy/bind_copy_rdf_graph.cpp | 23 ++- src/binder/binder.cpp | 13 +- src/catalog/catalog_entry/CMakeLists.txt | 3 +- .../table_function_catalog_entry.cpp | 18 -- src/function/built_in_function_utils.cpp | 71 +------- src/function/function_collection.cpp | 25 +++ src/function/table/call/current_setting.cpp | 5 +- src/function/table/call/db_version.cpp | 2 +- src/function/table/call/show_tables.cpp | 4 +- src/function/table/call/storage_info.cpp | 6 +- src/function/table/call/table_info.cpp | 2 +- .../table_function_catalog_entry.h | 23 --- src/include/common/enums/expression_type.h | 30 ---- .../function/built_in_function_utils.h | 5 - src/include/function/table/call_functions.h | 12 ++ .../reader/csv/parallel_csv_reader.h | 2 + .../persistent/reader/csv/serial_csv_reader.h | 2 + .../persistent/reader/npy/npy_reader.h | 2 + .../reader/parquet/parquet_reader.h | 2 + .../operator/persistent/reader/rdf/rdf_scan.h | 49 ++--- .../table_scan/ftable_scan_function.h | 2 + .../map/create_factorized_table_scan.cpp | 2 +- .../reader/csv/parallel_csv_reader.cpp | 6 +- .../reader/csv/serial_csv_reader.cpp | 6 +- .../persistent/reader/npy/npy_reader.cpp | 2 +- .../reader/parquet/parquet_reader.cpp | 6 +- .../persistent/reader/rdf/rdf_scan.cpp | 168 +++++++++--------- .../table_scan/ftable_scan_function.cpp | 2 +- .../src_cpp/include/pandas/pandas_scan.h | 2 + .../src_cpp/include/pyarrow/pyarrow_scan.h | 2 + .../python_api/src_cpp/pandas/pandas_scan.cpp | 2 +- tools/python_api/src_cpp/py_database.cpp | 2 +- .../src_cpp/pyarrow/pyarrow_scan.cpp | 4 +- 33 files changed, 206 insertions(+), 299 deletions(-) delete mode 100644 src/catalog/catalog_entry/table_function_catalog_entry.cpp delete mode 100644 src/include/catalog/catalog_entry/table_function_catalog_entry.h diff --git a/src/binder/bind/copy/bind_copy_rdf_graph.cpp b/src/binder/bind/copy/bind_copy_rdf_graph.cpp index 91be6b04fd7..1626b17b6cb 100644 --- a/src/binder/bind/copy/bind_copy_rdf_graph.cpp +++ b/src/binder/bind/copy/bind_copy_rdf_graph.cpp @@ -9,6 +9,7 @@ #include "function/table/bind_input.h" #include "main/client_context.h" #include "parser/copy.h" +#include "processor/operator/persistent/reader/rdf/rdf_scan.h" using namespace kuzu::binder; using namespace kuzu::catalog; @@ -50,13 +51,12 @@ std::unique_ptr Binder::bindCopyRdfFrom( Function* func; // Bind file scan; auto inMemory = RdfReaderConfig::construct(config->options).inMemory; - func = BuiltInFunctionsUtils::matchFunction(READ_RDF_ALL_TRIPLE_FUNC_NAME, functions); + func = BuiltInFunctionsUtils::matchFunction(RdfAllTripleScan::name, functions); auto scanFunc = ku_dynamic_cast(func); auto bindData = scanFunc->bindFunc(clientContext, bindInput.get()); // Bind copy resource. - func = inMemory ? - BuiltInFunctionsUtils::matchFunction(IN_MEM_READ_RDF_RESOURCE_FUNC_NAME, functions) : - BuiltInFunctionsUtils::matchFunction(READ_RDF_RESOURCE_FUNC_NAME, functions); + func = inMemory ? BuiltInFunctionsUtils::matchFunction(RdfResourceInMemScan::name, functions) : + BuiltInFunctionsUtils::matchFunction(RdfResourceScan::name, functions); auto rScanFunc = ku_dynamic_cast(func); auto rColumns = expression_vector{r}; auto rFileScanInfo = BoundFileScanInfo(*rScanFunc, bindData->copy(), std::move(rColumns)); @@ -65,9 +65,8 @@ std::unique_ptr Binder::bindCopyRdfFrom( auto rEntry = catalog->getTableCatalogEntry(clientContext->getTx(), rTableID); auto rCopyInfo = BoundCopyFromInfo(rEntry, std::move(rSource), offset, nullptr /* extraInfo */); // Bind copy literal. - func = inMemory ? - BuiltInFunctionsUtils::matchFunction(IN_MEM_READ_RDF_LITERAL_FUNC_NAME, functions) : - BuiltInFunctionsUtils::matchFunction(READ_RDF_LITERAL_FUNC_NAME, functions); + func = inMemory ? BuiltInFunctionsUtils::matchFunction(RdfLiteralInMemScan::name, functions) : + BuiltInFunctionsUtils::matchFunction(RdfLiteralScan::name, functions); auto lScanFunc = ku_dynamic_cast(func); auto lColumns = expression_vector{l, lang}; auto lFileScanInfo = BoundFileScanInfo(*lScanFunc, bindData->copy(), std::move(lColumns)); @@ -77,9 +76,8 @@ std::unique_ptr Binder::bindCopyRdfFrom( auto lCopyInfo = BoundCopyFromInfo(lEntry, std::move(lSource), offset, nullptr /* extraInfo */); // Bind copy resource triples func = inMemory ? - BuiltInFunctionsUtils::matchFunction( - IN_MEM_READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, functions) : - BuiltInFunctionsUtils::matchFunction(READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, functions); + BuiltInFunctionsUtils::matchFunction(RdfResourceTripleInMemScan::name, functions) : + BuiltInFunctionsUtils::matchFunction(RdfResourceTripleScan::name, functions); auto rrrScanFunc = ku_dynamic_cast(func); auto rrrColumns = expression_vector{s, p, o}; auto rrrFileScanInfo = BoundFileScanInfo(*rrrScanFunc, bindData->copy(), rrrColumns); @@ -99,9 +97,8 @@ std::unique_ptr Binder::bindCopyRdfFrom( BoundCopyFromInfo(rrrEntry, std::move(rrrSource), offset, std::move(rrrExtraInfo)); // Bind copy literal triples func = inMemory ? - BuiltInFunctionsUtils::matchFunction( - IN_MEM_READ_RDF_LITERAL_TRIPLE_FUNC_NAME, functions) : - BuiltInFunctionsUtils::matchFunction(READ_RDF_LITERAL_TRIPLE_FUNC_NAME, functions); + BuiltInFunctionsUtils::matchFunction(RdfLiteralTripleInMemScan::name, functions) : + BuiltInFunctionsUtils::matchFunction(RdfLiteralTripleScan::name, functions); auto rrlScanFunc = ku_dynamic_cast(func); auto rrlColumns = expression_vector{s, p, oOffset}; auto rrlFileScanInfo = BoundFileScanInfo(*rrlScanFunc, bindData->copy(), rrlColumns); diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index fd950492d87..91ab2ff5207 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -10,10 +10,15 @@ #include "common/string_utils.h" #include "function/built_in_function_utils.h" #include "function/table_functions.h" +#include "processor/operator/persistent/reader/csv/parallel_csv_reader.h" +#include "processor/operator/persistent/reader/csv/serial_csv_reader.h" +#include "processor/operator/persistent/reader/npy/npy_reader.h" +#include "processor/operator/persistent/reader/parquet/parquet_reader.h" using namespace kuzu::catalog; using namespace kuzu::common; using namespace kuzu::parser; +using namespace kuzu::processor; namespace kuzu { namespace binder { @@ -201,17 +206,17 @@ function::TableFunction Binder::getScanFunction(FileType fileType, const ReaderC switch (fileType) { case FileType::PARQUET: { func = function::BuiltInFunctionsUtils::matchFunction( - READ_PARQUET_FUNC_NAME, inputTypes, functions); + ParquetScanFunction::name, inputTypes, functions); } break; case FileType::NPY: { func = function::BuiltInFunctionsUtils::matchFunction( - READ_NPY_FUNC_NAME, inputTypes, functions); + NpyScanFunction::name, inputTypes, functions); } break; case FileType::CSV: { auto csvConfig = CSVReaderConfig::construct(config.options); func = function::BuiltInFunctionsUtils::matchFunction( - csvConfig.parallel ? READ_CSV_PARALLEL_FUNC_NAME : READ_CSV_SERIAL_FUNC_NAME, - inputTypes, functions); + csvConfig.parallel ? ParallelCSVScan::name : SerialCSVScan::name, inputTypes, + functions); } break; default: KU_UNREACHABLE; diff --git a/src/catalog/catalog_entry/CMakeLists.txt b/src/catalog/catalog_entry/CMakeLists.txt index 752366cbfbd..648fc3041b6 100644 --- a/src/catalog/catalog_entry/CMakeLists.txt +++ b/src/catalog/catalog_entry/CMakeLists.txt @@ -7,8 +7,7 @@ add_library(kuzu_catalog_entry rel_table_catalog_entry.cpp rel_group_catalog_entry.cpp rdf_graph_catalog_entry.cpp - scalar_macro_catalog_entry.cpp - table_function_catalog_entry.cpp) + scalar_macro_catalog_entry.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/catalog/catalog_entry/table_function_catalog_entry.cpp b/src/catalog/catalog_entry/table_function_catalog_entry.cpp deleted file mode 100644 index 26b4f69dd53..00000000000 --- a/src/catalog/catalog_entry/table_function_catalog_entry.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "catalog/catalog_entry/table_function_catalog_entry.h" - -#include "common/utils.h" - -namespace kuzu { -namespace catalog { - -TableFunctionCatalogEntry::TableFunctionCatalogEntry( - std::string name, function::function_set functionSet) - : FunctionCatalogEntry{ - CatalogEntryType::TABLE_FUNCTION_ENTRY, std::move(name), std::move(functionSet)} {} - -std::unique_ptr TableFunctionCatalogEntry::copy() const { - return std::make_unique(getName(), common::copyVector(functionSet)); -} - -} // namespace catalog -} // namespace kuzu diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index b2db1038a94..ad9ed317172 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -1,6 +1,6 @@ #include "function/built_in_function_utils.h" -#include "catalog/catalog_entry/table_function_catalog_entry.h" +#include "catalog/catalog_entry/function_catalog_entry.h" #include "catalog/catalog_set.h" #include "common/exception/binder.h" #include "common/exception/catalog.h" @@ -8,13 +8,6 @@ #include "function/arithmetic/vector_arithmetic_functions.h" #include "function/function_collection.h" #include "function/scalar_function.h" -#include "function/table/call_functions.h" -#include "processor/operator/persistent/reader/csv/parallel_csv_reader.h" -#include "processor/operator/persistent/reader/csv/serial_csv_reader.h" -#include "processor/operator/persistent/reader/npy/npy_reader.h" -#include "processor/operator/persistent/reader/parquet/parquet_reader.h" -#include "processor/operator/persistent/reader/rdf/rdf_scan.h" -#include "processor/operator/table_scan/ftable_scan_function.h" using namespace kuzu::common; using namespace kuzu::catalog; @@ -31,9 +24,12 @@ static void validateNonEmptyCandidateFunctions(std::vector& candidate function::function_set& set); void BuiltInFunctionsUtils::createFunctions(CatalogSet* catalogSet) { - registerTableFunctions(catalogSet); - - registerFunctions(catalogSet); + auto functions = FunctionCollection::getFunctions(); + for (auto i = 0u; functions[i].name != nullptr; ++i) { + auto functionSet = functions[i].getFunctionSetFunc(); + catalogSet->createEntry(std::make_unique( + functions[i].catalogEntryType, functions[i].name, std::move(functionSet))); + } } Function* BuiltInFunctionsUtils::matchFunction(const std::string& name, CatalogSet* catalogSet) { @@ -489,59 +485,6 @@ void BuiltInFunctionsUtils::validateSpecialCases(std::vector& candida } } -void BuiltInFunctionsUtils::registerTableFunctions(CatalogSet* catalogSet) { - catalogSet->createEntry(std::make_unique( - CURRENT_SETTING_FUNC_NAME, CurrentSettingFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - DB_VERSION_FUNC_NAME, DBVersionFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SHOW_TABLES_FUNC_NAME, ShowTablesFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - TABLE_INFO_FUNC_NAME, TableInfoFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - SHOW_CONNECTION_FUNC_NAME, ShowConnectionFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - STORAGE_INFO_FUNC_NAME, StorageInfoFunction::getFunctionSet())); - // Read functions - catalogSet->createEntry(std::make_unique( - READ_PARQUET_FUNC_NAME, ParquetScanFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_NPY_FUNC_NAME, NpyScanFunction::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_CSV_SERIAL_FUNC_NAME, SerialCSVScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_CSV_PARALLEL_FUNC_NAME, ParallelCSVScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_RDF_RESOURCE_FUNC_NAME, RdfResourceScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_RDF_LITERAL_FUNC_NAME, RdfLiteralScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, RdfResourceTripleScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_RDF_LITERAL_TRIPLE_FUNC_NAME, RdfLiteralTripleScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_RDF_ALL_TRIPLE_FUNC_NAME, RdfAllTripleScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - IN_MEM_READ_RDF_RESOURCE_FUNC_NAME, RdfResourceInMemScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - IN_MEM_READ_RDF_LITERAL_FUNC_NAME, RdfLiteralInMemScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - IN_MEM_READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, RdfResourceTripleInMemScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - IN_MEM_READ_RDF_LITERAL_TRIPLE_FUNC_NAME, RdfLiteralTripleInMemScan::getFunctionSet())); - catalogSet->createEntry(std::make_unique( - READ_FTABLE_FUNC_NAME, FTableScan::getFunctionSet())); -} - -void BuiltInFunctionsUtils::registerFunctions(catalog::CatalogSet* catalogSet) { - auto functions = FunctionCollection::getFunctions(); - for (auto i = 0u; functions[i].name != nullptr; ++i) { - auto functionSet = functions[i].getFunctionSetFunc(); - catalogSet->createEntry(std::make_unique( - functions[i].catalogEntryType, functions[i].name, std::move(functionSet))); - } -} - static std::string getFunctionMatchFailureMsg(const std::string name, const std::vector& inputTypes, const std::string& supportedInputs, bool isDistinct = false) { diff --git a/src/function/function_collection.cpp b/src/function/function_collection.cpp index ffaad9d5daa..60179cadedc 100644 --- a/src/function/function_collection.cpp +++ b/src/function/function_collection.cpp @@ -17,9 +17,18 @@ #include "function/schema/vector_node_rel_functions.h" #include "function/string/vector_string_functions.h" #include "function/struct/vector_struct_functions.h" +#include "function/table/call_functions.h" #include "function/timestamp/vector_timestamp_functions.h" #include "function/union/vector_union_functions.h" #include "function/uuid/vector_uuid_functions.h" +#include "processor/operator/persistent/reader/csv/parallel_csv_reader.h" +#include "processor/operator/persistent/reader/csv/serial_csv_reader.h" +#include "processor/operator/persistent/reader/npy/npy_reader.h" +#include "processor/operator/persistent/reader/parquet/parquet_reader.h" +#include "processor/operator/persistent/reader/rdf/rdf_scan.h" +#include "processor/operator/table_scan/ftable_scan_function.h" + +using namespace kuzu::processor; namespace kuzu { namespace function { @@ -32,6 +41,8 @@ namespace function { { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::REWRITE_FUNCTION_ENTRY } #define AGGREGATE_FUNCTION(_PARAM) \ { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::AGGREGATE_FUNCTION_ENTRY } +#define TABLE_FUNCTION(_PARAM) \ + { _PARAM::getFunctionSet, _PARAM::name, CatalogEntryType::TABLE_FUNCTION_ENTRY } #define FINAL_FUNCTION \ { nullptr, nullptr, CatalogEntryType::SCALAR_FUNCTION_ENTRY } @@ -173,6 +184,20 @@ FunctionCollection* FunctionCollection::getFunctions() { AGGREGATE_FUNCTION(AggregateMinFunction), AGGREGATE_FUNCTION(AggregateMaxFunction), AGGREGATE_FUNCTION(CollectFunction), + // Table functions + TABLE_FUNCTION(CurrentSettingFunction), TABLE_FUNCTION(DBVersionFunction), + TABLE_FUNCTION(ShowTablesFunction), TABLE_FUNCTION(TableInfoFunction), + TABLE_FUNCTION(ShowConnectionFunction), TABLE_FUNCTION(StorageInfoFunction), + + // Read functions + TABLE_FUNCTION(ParquetScanFunction), TABLE_FUNCTION(NpyScanFunction), + TABLE_FUNCTION(SerialCSVScan), TABLE_FUNCTION(ParallelCSVScan), + TABLE_FUNCTION(RdfResourceScan), TABLE_FUNCTION(RdfLiteralScan), + TABLE_FUNCTION(RdfResourceTripleScan), TABLE_FUNCTION(RdfLiteralTripleScan), + TABLE_FUNCTION(RdfAllTripleScan), TABLE_FUNCTION(RdfResourceInMemScan), + TABLE_FUNCTION(RdfLiteralInMemScan), TABLE_FUNCTION(RdfResourceTripleInMemScan), + TABLE_FUNCTION(RdfLiteralTripleInMemScan), TABLE_FUNCTION(FTableScan), + // End of array FINAL_FUNCTION}; diff --git a/src/function/table/call/current_setting.cpp b/src/function/table/call/current_setting.cpp index 5008229f8db..61f328a1a7a 100644 --- a/src/function/table/call/current_setting.cpp +++ b/src/function/table/call/current_setting.cpp @@ -51,9 +51,8 @@ static std::unique_ptr bindFunc( function_set CurrentSettingFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(CURRENT_SETTING_FUNC_NAME, tableFunc, - bindFunc, initSharedState, initEmptyLocalState, - std::vector{LogicalTypeID::STRING})); + functionSet.push_back(std::make_unique(name, tableFunc, bindFunc, + initSharedState, initEmptyLocalState, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/function/table/call/db_version.cpp b/src/function/table/call/db_version.cpp index 3c5b21785e4..13f0472dd0e 100644 --- a/src/function/table/call/db_version.cpp +++ b/src/function/table/call/db_version.cpp @@ -31,7 +31,7 @@ static std::unique_ptr bindFunc(ClientContext*, TableFuncBind function_set DBVersionFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(DB_VERSION_FUNC_NAME, tableFunc, bindFunc, + functionSet.push_back(std::make_unique(name, tableFunc, bindFunc, initSharedState, initEmptyLocalState, std::vector{})); return functionSet; } diff --git a/src/function/table/call/show_tables.cpp b/src/function/table/call/show_tables.cpp index 8c120dd29b9..42d3af36e43 100644 --- a/src/function/table/call/show_tables.cpp +++ b/src/function/table/call/show_tables.cpp @@ -61,8 +61,8 @@ static std::unique_ptr bindFunc( function_set ShowTablesFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(SHOW_TABLES_FUNC_NAME, tableFunc, - bindFunc, initSharedState, initEmptyLocalState, std::vector{})); + functionSet.push_back(std::make_unique(name, tableFunc, bindFunc, + initSharedState, initEmptyLocalState, std::vector{})); return functionSet; } diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index dba3109a326..03e3d44b73b 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -226,9 +226,9 @@ static std::unique_ptr bindFunc( function_set StorageInfoFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(STORAGE_INFO_FUNC_NAME, tableFunc, - bindFunc, initStorageInfoSharedState, initLocalState, - std::vector{LogicalTypeID::STRING})); + functionSet.push_back( + std::make_unique(name, tableFunc, bindFunc, initStorageInfoSharedState, + initLocalState, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/function/table/call/table_info.cpp b/src/function/table/call/table_info.cpp index 616848fc81c..fbf26c526c2 100644 --- a/src/function/table/call/table_info.cpp +++ b/src/function/table/call/table_info.cpp @@ -92,7 +92,7 @@ static std::unique_ptr bindFunc( function_set TableInfoFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(TABLE_INFO_FUNC_NAME, tableFunc, bindFunc, + functionSet.push_back(std::make_unique(name, tableFunc, bindFunc, initSharedState, initEmptyLocalState, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/include/catalog/catalog_entry/table_function_catalog_entry.h b/src/include/catalog/catalog_entry/table_function_catalog_entry.h deleted file mode 100644 index ba5b8e9d5d9..00000000000 --- a/src/include/catalog/catalog_entry/table_function_catalog_entry.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "function_catalog_entry.h" - -namespace kuzu { -namespace catalog { - -class TableFunctionCatalogEntry : public FunctionCatalogEntry { -public: - //===--------------------------------------------------------------------===// - // constructors - //===--------------------------------------------------------------------===// - TableFunctionCatalogEntry() = default; - TableFunctionCatalogEntry(std::string name, function::function_set functionSet); - - //===--------------------------------------------------------------------===// - // serialization & deserialization - //===--------------------------------------------------------------------===// - std::unique_ptr copy() const override; -}; - -} // namespace catalog -} // namespace kuzu diff --git a/src/include/common/enums/expression_type.h b/src/include/common/enums/expression_type.h index 115df910e3e..50c4f5e9c6a 100644 --- a/src/include/common/enums/expression_type.h +++ b/src/include/common/enums/expression_type.h @@ -6,36 +6,6 @@ namespace kuzu { namespace common { -/** - * Function name is a temporary identifier used for binder because grammar does not parse built in - * functions. After binding, expression type should replace function name and used as identifier. - */ - -// Table functions -const char* const TABLE_INFO_FUNC_NAME = "TABLE_INFO"; -const char* const DB_VERSION_FUNC_NAME = "DB_VERSION"; -const char* const CURRENT_SETTING_FUNC_NAME = "CURRENT_SETTING"; -const char* const SHOW_TABLES_FUNC_NAME = "SHOW_TABLES"; -const char* const SHOW_CONNECTION_FUNC_NAME = "SHOW_CONNECTION"; -const char* const STORAGE_INFO_FUNC_NAME = "STORAGE_INFO"; -// Table functions - read functions -const char* const READ_PARQUET_FUNC_NAME = "READ_PARQUET"; -const char* const READ_NPY_FUNC_NAME = "READ_NPY"; -const char* const READ_CSV_SERIAL_FUNC_NAME = "READ_CSV_SERIAL"; -const char* const READ_CSV_PARALLEL_FUNC_NAME = "READ_CSV_PARALLEL"; -const char* const READ_RDF_RESOURCE_FUNC_NAME = "READ_RDF_RESOURCE"; -const char* const READ_RDF_LITERAL_FUNC_NAME = "READ_RDF_LITERAL"; -const char* const READ_RDF_RESOURCE_TRIPLE_FUNC_NAME = "READ_RDF_RESOURCE_TRIPLE"; -const char* const READ_RDF_LITERAL_TRIPLE_FUNC_NAME = "READ_RDF_LITERAL_TRIPLE"; -const char* const READ_RDF_ALL_TRIPLE_FUNC_NAME = "READ_RDF_ALL_TRIPLE"; -const char* const IN_MEM_READ_RDF_RESOURCE_FUNC_NAME = "IN_MEM_READ_RDF_RESOURCE"; -const char* const IN_MEM_READ_RDF_LITERAL_FUNC_NAME = "IN_MEM_READ_RDF_LITERAL"; -const char* const IN_MEM_READ_RDF_RESOURCE_TRIPLE_FUNC_NAME = "IN_MEM_READ_RDF_RESOURCE_TRIPLE"; -const char* const IN_MEM_READ_RDF_LITERAL_TRIPLE_FUNC_NAME = "IN_MEM_READ_RDF_LITERAL_TRIPLE"; -const char* const READ_PANDAS_FUNC_NAME = "READ_PANDAS"; -const char* const READ_PYARROW_FUNC_NAME = "READ_PYARROW"; -const char* const READ_FTABLE_FUNC_NAME = "READ_FTABLE"; - enum class ExpressionType : uint8_t { // Boolean Connection Expressions diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index 3f0c75dcbb2..f74d39f1e23 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -79,11 +79,6 @@ class BuiltInFunctionsUtils { static void validateSpecialCases(std::vector& candidateFunctions, const std::string& name, const std::vector& inputTypes, function::function_set& set); - - // Table functions. - static void registerTableFunctions(catalog::CatalogSet* catalogSet); - - static void registerFunctions(catalog::CatalogSet* catalogSet); }; } // namespace function diff --git a/src/include/function/table/call_functions.h b/src/include/function/table/call_functions.h index a7a7174bcbd..c8aee631576 100644 --- a/src/include/function/table/call_functions.h +++ b/src/include/function/table/call_functions.h @@ -51,26 +51,38 @@ struct CallFunction { }; struct CurrentSettingFunction : public CallFunction { + static constexpr const char* name = "CURRENT_SETTING"; + static function_set getFunctionSet(); }; struct DBVersionFunction : public CallFunction { + static constexpr const char* name = "DB_VERSION"; + static function_set getFunctionSet(); }; struct ShowTablesFunction : public CallFunction { + static constexpr const char* name = "SHOW_TABLES"; + static function_set getFunctionSet(); }; struct TableInfoFunction : public CallFunction { + static constexpr const char* name = "TABLE_INFO"; + static function_set getFunctionSet(); }; struct ShowConnectionFunction final : public CallFunction { + static constexpr const char* name = "SHOW_CONNECTION"; + static function_set getFunctionSet(); }; struct StorageInfoFunction final : public CallFunction { + static constexpr const char* name = "STORAGE_INFO"; + static function_set getFunctionSet(); }; diff --git a/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h index 90709b2c208..bd078762015 100644 --- a/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/parallel_csv_reader.h @@ -49,6 +49,8 @@ struct ParallelCSVScanSharedState final : public function::ScanFileSharedState { }; struct ParallelCSVScan { + static constexpr const char* name = "READ_CSV_PARALLEL"; + static function::function_set getFunctionSet(); }; diff --git a/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h b/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h index 78f1f26684e..fc20f180bba 100644 --- a/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h +++ b/src/include/processor/operator/persistent/reader/csv/serial_csv_reader.h @@ -41,6 +41,8 @@ struct SerialCSVScanSharedState final : public function::ScanFileSharedState { }; struct SerialCSVScan { + static constexpr const char* name = "READ_CSV_SERIAL"; + static function::function_set getFunctionSet(); static void bindColumns(const function::ScanTableFuncBindInput* bindInput, std::vector& columnNames, std::vector& columnTypes); diff --git a/src/include/processor/operator/persistent/reader/npy/npy_reader.h b/src/include/processor/operator/persistent/reader/npy/npy_reader.h index dfa36cb6b51..c2a76f85aeb 100644 --- a/src/include/processor/operator/persistent/reader/npy/npy_reader.h +++ b/src/include/processor/operator/persistent/reader/npy/npy_reader.h @@ -62,6 +62,8 @@ struct NpyScanSharedState final : public function::ScanSharedState { }; struct NpyScanFunction { + static constexpr const char* name = "READ_NPY"; + static function::function_set getFunctionSet(); }; diff --git a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h index bfe624de117..4a412f7070a 100644 --- a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h @@ -107,6 +107,8 @@ struct ParquetScanLocalState final : public function::TableFuncLocalState { }; struct ParquetScanFunction { + static constexpr const char* name = "READ_PARQUET"; + static function::function_set getFunctionSet(); }; diff --git a/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h b/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h index f55e95c6fc4..15dfc2c971b 100644 --- a/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h +++ b/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h @@ -154,70 +154,57 @@ struct RdfInMemScanSharedState : public function::BaseScanSharedState { }; struct RdfResourceScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "READ_RDF_RESOURCE"; - static std::unique_ptr initSharedState( - function::TableFunctionInitInput& input); + static function::function_set getFunctionSet(); }; struct RdfLiteralScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "READ_RDF_LITERAL"; - static std::unique_ptr initSharedState( - function::TableFunctionInitInput& input); + static function::function_set getFunctionSet(); }; struct RdfResourceTripleScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "READ_RDF_RESOURCE_TRIPLE"; - static std::unique_ptr initSharedState( - function::TableFunctionInitInput& input); + static function::function_set getFunctionSet(); }; struct RdfLiteralTripleScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "READ_RDF_LITERAL_TRIPLE"; - static std::unique_ptr initSharedState( - function::TableFunctionInitInput& input); + static function::function_set getFunctionSet(); }; struct RdfAllTripleScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "READ_RDF_ALL_TRIPLE"; - static common::offset_t tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output); - static std::unique_ptr bindFunc( - main::ClientContext*, function::TableFuncBindInput* input_); - static std::unique_ptr initSharedState( - function::TableFunctionInitInput& input); + static function::function_set getFunctionSet(); }; struct RdfResourceInMemScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "IN_MEM_READ_RDF_RESOURCE"; - static common::offset_t tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output); + static function::function_set getFunctionSet(); }; struct RdfLiteralInMemScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "IN_MEM_READ_RDF_LITERAL"; - static common::offset_t tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output); + static function::function_set getFunctionSet(); }; struct RdfResourceTripleInMemScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "IN_MEM_READ_RDF_RESOURCE_TRIPLE"; - static common::offset_t tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output); + static function::function_set getFunctionSet(); }; struct RdfLiteralTripleInMemScan { - static function::function_set getFunctionSet(); + static constexpr const char* name = "IN_MEM_READ_RDF_LITERAL_TRIPLE"; - static common::offset_t tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output); + static function::function_set getFunctionSet(); }; } // namespace processor diff --git a/src/include/processor/operator/table_scan/ftable_scan_function.h b/src/include/processor/operator/table_scan/ftable_scan_function.h index 393b0cfc628..dcfa2df7d9c 100644 --- a/src/include/processor/operator/table_scan/ftable_scan_function.h +++ b/src/include/processor/operator/table_scan/ftable_scan_function.h @@ -26,6 +26,8 @@ struct FTableScanBindData : public function::TableFuncBindData { }; struct FTableScan { + static constexpr const char* name = "READ_FTABLE"; + static function::function_set getFunctionSet(); }; diff --git a/src/processor/map/create_factorized_table_scan.cpp b/src/processor/map/create_factorized_table_scan.cpp index f3142792d15..d10da28b8a3 100644 --- a/src/processor/map/create_factorized_table_scan.cpp +++ b/src/processor/map/create_factorized_table_scan.cpp @@ -27,7 +27,7 @@ std::unique_ptr PlanMapper::createFTableScan(const expression_ auto bindData = std::make_unique(table, std::move(colIndices), maxMorselSize); auto function = function::BuiltInFunctionsUtils::matchFunction( - READ_FTABLE_FUNC_NAME, clientContext->getCatalog()->getFunctions(clientContext->getTx())); + FTableScan::name, clientContext->getCatalog()->getFunctions(clientContext->getTx())); auto info = InQueryCallInfo(); info.function = *ku_dynamic_cast(function); info.bindData = std::move(bindData); diff --git a/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp index 1071ad77a4d..d7954bc65b7 100644 --- a/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp @@ -207,9 +207,9 @@ static double progressFunc(TableFuncSharedState* sharedState) { function_set ParallelCSVScan::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(READ_CSV_PARALLEL_FUNC_NAME, tableFunc, - bindFunc, initSharedState, initLocalState, progressFunc, - std::vector{LogicalTypeID::STRING})); + functionSet.push_back( + std::make_unique(name, tableFunc, bindFunc, initSharedState, initLocalState, + progressFunc, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp index 74cdc5a9fa0..32141ccfa6e 100644 --- a/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp @@ -146,9 +146,9 @@ static double progressFunc(TableFuncSharedState* sharedState) { function_set SerialCSVScan::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(READ_CSV_SERIAL_FUNC_NAME, tableFunc, - bindFunc, initSharedState, initLocalState, progressFunc, - std::vector{LogicalTypeID::STRING})); + functionSet.push_back( + std::make_unique(name, tableFunc, bindFunc, initSharedState, initLocalState, + progressFunc, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/processor/operator/persistent/reader/npy/npy_reader.cpp b/src/processor/operator/persistent/reader/npy/npy_reader.cpp index b343bd89ef2..3481361d3d6 100644 --- a/src/processor/operator/persistent/reader/npy/npy_reader.cpp +++ b/src/processor/operator/persistent/reader/npy/npy_reader.cpp @@ -332,7 +332,7 @@ static std::unique_ptr initLocalState( function_set NpyScanFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(READ_NPY_FUNC_NAME, tableFunc, bindFunc, + functionSet.push_back(std::make_unique(name, tableFunc, bindFunc, initSharedState, initLocalState, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp index ab92d893949..bc6960d6f6c 100644 --- a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp @@ -705,9 +705,9 @@ static double progressFunc(TableFuncSharedState* sharedState) { function_set ParquetScanFunction::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(READ_PARQUET_FUNC_NAME, tableFunc, - bindFunc, initSharedState, initLocalState, progressFunc, - std::vector{LogicalTypeID::STRING})); + functionSet.push_back( + std::make_unique(name, tableFunc, bindFunc, initSharedState, initLocalState, + progressFunc, std::vector{LogicalTypeID::STRING})); return functionSet; } diff --git a/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp b/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp index d3b0267d972..1ceeffde2bf 100644 --- a/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp +++ b/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp @@ -74,85 +74,13 @@ static std::unique_ptr initLocalState( return std::make_unique(); } -function_set RdfResourceScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(READ_RDF_RESOURCE_FUNC_NAME, scanTableFunc, nullptr, - initSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfLiteralScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(READ_RDF_LITERAL_FUNC_NAME, scanTableFunc, nullptr, - initSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfResourceTripleScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, scanTableFunc, - nullptr, initSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfLiteralTripleScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(READ_RDF_LITERAL_TRIPLE_FUNC_NAME, scanTableFunc, - nullptr, initSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function::function_set RdfAllTripleScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(READ_RDF_ALL_TRIPLE_FUNC_NAME, tableFunc, bindFunc, - initSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfResourceInMemScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(IN_MEM_READ_RDF_RESOURCE_FUNC_NAME, tableFunc, - nullptr, inMemScanInitSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfLiteralInMemScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(IN_MEM_READ_RDF_LITERAL_FUNC_NAME, tableFunc, - nullptr, inMemScanInitSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfResourceTripleInMemScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(IN_MEM_READ_RDF_RESOURCE_TRIPLE_FUNC_NAME, - tableFunc, nullptr, inMemScanInitSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -function_set RdfLiteralTripleInMemScan::getFunctionSet() { - function_set functionSet; - auto func = std::make_unique(IN_MEM_READ_RDF_LITERAL_TRIPLE_FUNC_NAME, tableFunc, - nullptr, inMemScanInitSharedState, initLocalState, std::vector{}); - functionSet.push_back(std::move(func)); - return functionSet; -} - -offset_t RdfAllTripleScan::tableFunc(TableFuncInput& input, TableFuncOutput&) { +static offset_t RdfAllTripleScanTableFunc(TableFuncInput& input, TableFuncOutput&) { auto sharedState = reinterpret_cast(input.sharedState); sharedState->readAll(); return 0; } -std::unique_ptr RdfAllTripleScan::bindFunc( +static std::unique_ptr RdfAllTripleScanBindFunc( main::ClientContext*, function::TableFuncBindInput* input_) { auto input = ku_dynamic_cast(input_); return std::make_unique(std::vector{}, @@ -160,7 +88,7 @@ std::unique_ptr RdfAllTripleScan::bindFunc( std::make_shared()); } -offset_t RdfResourceInMemScan::tableFunc(TableFuncInput& input, TableFuncOutput& output) { +static offset_t RdfResourceInMemScanTableFunc(TableFuncInput& input, TableFuncOutput& output) { auto sharedState = ku_dynamic_cast(input.sharedState); auto sVector = output.dataChunk.getValueVector(0).get(); @@ -185,7 +113,7 @@ offset_t RdfResourceInMemScan::tableFunc(TableFuncInput& input, TableFuncOutput& return vectorPos; } -offset_t RdfLiteralInMemScan::tableFunc(TableFuncInput& input, TableFuncOutput& output) { +static offset_t RdfLiteralInMemScanTableFunc(TableFuncInput& input, TableFuncOutput& output) { auto sharedState = ku_dynamic_cast(input.sharedState); auto oVector = output.dataChunk.getValueVector(0).get(); @@ -202,7 +130,8 @@ offset_t RdfLiteralInMemScan::tableFunc(TableFuncInput& input, TableFuncOutput& return numTuplesToScan; } -offset_t RdfResourceTripleInMemScan::tableFunc(TableFuncInput& input, TableFuncOutput& output) { +static offset_t RdfResourceTripleInMemScanTableFunc( + TableFuncInput& input, TableFuncOutput& output) { auto sharedState = ku_dynamic_cast(input.sharedState); auto [startIdx, numTuplesToScan] = sharedState->getResourceTripleRange(); @@ -218,7 +147,7 @@ offset_t RdfResourceTripleInMemScan::tableFunc(TableFuncInput& input, TableFuncO return numTuplesToScan; } -offset_t RdfLiteralTripleInMemScan::tableFunc(TableFuncInput& input, TableFuncOutput& output) { +static offset_t RdfLiteralTripleInMemScanTableFunc(TableFuncInput& input, TableFuncOutput& output) { auto sharedState = ku_dynamic_cast(input.sharedState); auto [startIdx, numTuplesToScan] = sharedState->getLiteralTripleRange(); @@ -234,7 +163,7 @@ offset_t RdfLiteralTripleInMemScan::tableFunc(TableFuncInput& input, TableFuncOu return numTuplesToScan; } -std::unique_ptr RdfResourceScan::initSharedState( +static std::unique_ptr RdfResourceScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); @@ -242,7 +171,7 @@ std::unique_ptr RdfResourceScan::initSharedState( bindData->config.copy(), std::move(rdfConfig)); } -std::unique_ptr RdfLiteralScan::initSharedState( +static std::unique_ptr RdfLiteralScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); @@ -250,7 +179,7 @@ std::unique_ptr RdfLiteralScan::initSharedState( bindData->config.copy(), std::move(rdfConfig)); } -std::unique_ptr RdfResourceTripleScan::initSharedState( +static std::unique_ptr RdfResourceTripleScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); @@ -258,7 +187,7 @@ std::unique_ptr RdfResourceTripleScan::initSharedState( bindData->config.copy(), std::move(rdfConfig)); } -std::unique_ptr RdfLiteralTripleScan::initSharedState( +static std::unique_ptr RdfLiteralTripleScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); @@ -266,7 +195,7 @@ std::unique_ptr RdfLiteralTripleScan::initSharedState( bindData->config.copy(), std::move(rdfConfig)); } -std::unique_ptr RdfAllTripleScan::initSharedState( +static std::unique_ptr RdfAllTripleScanInitSharedState( TableFunctionInitInput& input) { auto bindData = ku_dynamic_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); @@ -274,5 +203,78 @@ std::unique_ptr RdfAllTripleScan::initSharedState( bindData->config.copy(), std::move(rdfConfig), bindData->store); } +function_set RdfResourceScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, scanTableFunc, nullptr, + RdfResourceScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfLiteralScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, scanTableFunc, nullptr, + RdfLiteralScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfResourceTripleScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, scanTableFunc, nullptr, + RdfResourceTripleScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfLiteralTripleScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, scanTableFunc, nullptr, + RdfLiteralTripleScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function::function_set RdfAllTripleScan::getFunctionSet() { + function_set functionSet; + auto func = + std::make_unique(name, RdfAllTripleScanTableFunc, RdfAllTripleScanBindFunc, + RdfAllTripleScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfResourceInMemScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, RdfResourceInMemScanTableFunc, nullptr, + inMemScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfLiteralInMemScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, RdfLiteralInMemScanTableFunc, nullptr, + inMemScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfResourceTripleInMemScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, RdfResourceTripleInMemScanTableFunc, nullptr, + inMemScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + +function_set RdfLiteralTripleInMemScan::getFunctionSet() { + function_set functionSet; + auto func = std::make_unique(name, RdfLiteralTripleInMemScanTableFunc, nullptr, + inMemScanInitSharedState, initLocalState, std::vector{}); + functionSet.push_back(std::move(func)); + return functionSet; +} + } // namespace processor } // namespace kuzu diff --git a/src/processor/operator/table_scan/ftable_scan_function.cpp b/src/processor/operator/table_scan/ftable_scan_function.cpp index 709313adb86..c4d978adc10 100644 --- a/src/processor/operator/table_scan/ftable_scan_function.cpp +++ b/src/processor/operator/table_scan/ftable_scan_function.cpp @@ -61,7 +61,7 @@ static std::unique_ptr initLocalState( function_set FTableScan::getFunctionSet() { function_set functionSet; - functionSet.push_back(std::make_unique(READ_FTABLE_FUNC_NAME, tableFunc, nullptr, + functionSet.push_back(std::make_unique(name, tableFunc, nullptr /*bindFunc*/, initSharedState, initLocalState, std::vector{})); return functionSet; } diff --git a/tools/python_api/src_cpp/include/pandas/pandas_scan.h b/tools/python_api/src_cpp/include/pandas/pandas_scan.h index 681f80f6b90..7c36db5f1d9 100644 --- a/tools/python_api/src_cpp/include/pandas/pandas_scan.h +++ b/tools/python_api/src_cpp/include/pandas/pandas_scan.h @@ -26,6 +26,8 @@ struct PandasScanSharedState : public function::BaseScanSharedState { }; struct PandasScanFunction { + static constexpr const char* name = "READ_PANDAS"; + static function::function_set getFunctionSet(); }; diff --git a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h index a1463d39baf..ee99f34cd30 100644 --- a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h +++ b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h @@ -50,6 +50,8 @@ struct PyArrowTableScanFunctionData final : public function::TableFuncBindData { }; struct PyArrowTableScanFunction { + static constexpr const char* name = "READ_PYARROW"; + static function::function_set getFunctionSet(); static function::TableFunction getFunction(); diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index 6be70a4e665..71bf3392105 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -121,7 +121,7 @@ static double progressFunc(TableFuncSharedState* sharedState) { } static TableFunction getFunction() { - return TableFunction(READ_PANDAS_FUNC_NAME, tableFunc, bindFunc, initSharedState, + return TableFunction(PandasScanFunction::name, tableFunc, bindFunc, initSharedState, initLocalState, progressFunc, std::vector{LogicalTypeID::POINTER}); } diff --git a/tools/python_api/src_cpp/py_database.cpp b/tools/python_api/src_cpp/py_database.cpp index d7ecc9acedb..b99a5968b71 100644 --- a/tools/python_api/src_cpp/py_database.cpp +++ b/tools/python_api/src_cpp/py_database.cpp @@ -50,7 +50,7 @@ PyDatabase::PyDatabase(const std::string& databasePath, uint64_t bufferPoolSize, auto systemConfig = SystemConfig(bufferPoolSize, maxNumThreads, compression, readOnly, maxDBSize); database = std::make_unique(databasePath, systemConfig); - database->addBuiltInFunction(READ_PANDAS_FUNC_NAME, kuzu::PandasScanFunction::getFunctionSet()); + database->addBuiltInFunction(kuzu::PandasScanFunction::name, kuzu::PandasScanFunction::getFunctionSet()); storageDriver = std::make_unique(database.get()); py::gil_scoped_acquire acquire; if (kuzu::importCache.get() == nullptr) { diff --git a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp index 9cfdc986309..d4cf53d3f7c 100644 --- a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp +++ b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp @@ -98,13 +98,13 @@ function::function_set PyArrowTableScanFunction::getFunctionSet() { function_set functionSet; functionSet.push_back( - std::make_unique(READ_PYARROW_FUNC_NAME, tableFunc, bindFunc, + std::make_unique(name, tableFunc, bindFunc, initSharedState, initLocalState, progressFunc, std::vector{LogicalTypeID::POINTER})); return functionSet; } TableFunction PyArrowTableScanFunction::getFunction() { - return TableFunction(READ_PYARROW_FUNC_NAME, tableFunc, bindFunc, initSharedState, + return TableFunction(name, tableFunc, bindFunc, initSharedState, initLocalState, progressFunc, std::vector{LogicalTypeID::POINTER}); } From a99ff6ca81f0fdd419fa335f41c841a178b996d9 Mon Sep 17 00:00:00 2001 From: Manh Dinh Date: Mon, 1 Apr 2024 14:00:33 -0400 Subject: [PATCH 118/136] Rename VAR_LIST to LIST (#3170) --- .../{var_list => list}/bracket_error.csv | 0 .../{var_list => list}/change_config.csv | 0 .../change_config_error.csv | 0 .../{var_list => list}/conversion_error.csv | 0 .../{var_list => list}/delim_error.csv | 0 .../{var_list => list}/quote_error.csv | 0 .../{var_list => list}/should_pass.csv | 0 .../{var_list => list}/single_quote.csv | 0 .../{var_list => list}/single_quote2.csv | 0 .../single_struct_bracket.csv | 0 extension/duckdb_scanner/src/duckdb_scan.cpp | 2 +- .../src/duckdb_type_converter.cpp | 2 +- src/binder/bind/bind_graph_pattern.cpp | 4 +- src/binder/bind/bind_reading_clause.cpp | 4 +- .../bind_function_expression.cpp | 2 +- src/c_api/data_type.cpp | 2 +- src/common/arrow/arrow_array_scan.cpp | 20 +- src/common/arrow/arrow_converter.cpp | 2 +- src/common/arrow/arrow_row_batch.cpp | 32 +- src/common/arrow/arrow_type.cpp | 4 +- src/common/type_utils.cpp | 2 +- src/common/types/ku_list.cpp | 2 +- src/common/types/types.cpp | 69 ++- src/common/types/value/value.cpp | 18 +- src/common/vector/auxiliary_buffer.cpp | 5 +- src/common/vector/value_vector.cpp | 16 +- src/function/aggregate/collect.cpp | 4 +- src/function/built_in_function_utils.cpp | 4 +- src/function/cast/cast_array.cpp | 32 +- src/function/cast_from_string_functions.cpp | 4 +- src/function/comparison_functions.cpp | 2 +- src/function/table/call/storage_info.cpp | 8 +- src/function/vector_arithmetic_functions.cpp | 3 +- src/function/vector_cast_functions.cpp | 16 +- src/function/vector_hash_functions.cpp | 4 +- src/function/vector_list_functions.cpp | 108 +++-- src/function/vector_map_functions.cpp | 26 +- src/function/vector_path_functions.cpp | 10 +- src/function/vector_string_functions.cpp | 6 +- src/include/c_api/kuzu.h | 6 +- src/include/common/type_utils.h | 4 +- src/include/common/types/types.h | 38 +- src/include/common/types/value/value.h | 2 +- src/include/common/vector/value_vector.h | 16 +- .../comparison/vector_comparison_functions.h | 8 +- .../list/functions/list_position_function.h | 2 +- .../list/functions/list_range_function.h | 2 +- .../reader/parquet/list_column_reader.h | 2 +- ...t_column_writer.h => list_column_writer.h} | 4 +- src/include/storage/storage_utils.h | 4 +- src/include/storage/store/column.h | 4 +- src/include/storage/store/column_chunk.h | 2 +- .../{var_list_column.h => list_column.h} | 8 +- ...ist_column_chunk.h => list_column_chunk.h} | 16 +- src/main/query_result.cpp | 4 +- src/main/storage_driver.cpp | 2 +- src/processor/map/map_path_property_probe.cpp | 4 +- .../operator/persistent/copy_to_csv.cpp | 4 +- .../reader/parquet/list_column_reader.cpp | 2 +- .../reader/parquet/parquet_reader.cpp | 8 +- .../reader/parquet/struct_column_reader.cpp | 2 +- .../persistent/writer/parquet/CMakeLists.txt | 2 +- .../writer/parquet/column_writer.cpp | 13 +- ...lumn_writer.cpp => list_column_writer.cpp} | 18 +- src/storage/compression/compression.cpp | 14 +- src/storage/stats/property_statistics.cpp | 2 +- .../stats/table_statistics_collection.cpp | 4 +- src/storage/storage_utils.cpp | 4 +- src/storage/store/CMakeLists.txt | 4 +- src/storage/store/column.cpp | 6 +- src/storage/store/column_chunk.cpp | 14 +- .../{var_list_column.cpp => list_column.cpp} | 113 +++-- ...column_chunk.cpp => list_column_chunk.cpp} | 143 +++--- test/c_api/data_type_test.cpp | 16 +- test/c_api/value_test.cpp | 2 +- test/include/graph_test/base_graph_test.h | 2 +- .../exceptions/binder/binder_error.test | 18 +- .../tck/expressions/list/List1.test | 16 +- .../tck/expressions/list/List11.test | 420 +++++++++--------- test/test_files/tck/match/match2.test | 2 +- test/test_files/tck/match/match4.test | 4 +- test/test_files/tinysnb/agg/hash.test | 2 +- test/test_files/tinysnb/cast/cast_error.test | 42 +- .../tinysnb/cast/cast_to_nested_types.test | 18 +- test/test_files/tinysnb/exception/list.test | 2 +- test/test_files/tinysnb/function/map.test | 2 +- test/test_files/tinysnb/function/range.test | 20 +- .../tinysnb/nested_types/nested_types.test | 2 +- test/test_files/tinysnb/path/path.test | 6 +- test/test_files/tinysnb/unwind/unwind.test | 4 +- test/test_files/update_node/create_empty.test | 2 +- tools/java_api/src/jni/kuzu_java.cpp | 6 +- .../main/java/com/kuzudb/KuzuDataTypeID.java | 2 +- .../java/com/kuzudb/test/DataTypeTest.java | 14 +- .../test/java/com/kuzudb/test/ValueTest.java | 2 +- tools/nodejs_api/src_cpp/node_util.cpp | 2 +- tools/nodejs_api/test/test_data_type.js | 4 +- .../src_cpp/pandas/pandas_analyzer.cpp | 10 +- tools/python_api/src_cpp/py_connection.cpp | 12 +- tools/python_api/src_cpp/py_query_result.cpp | 2 +- .../src_cpp/py_query_result_converter.cpp | 4 +- tools/python_api/src_py/types.py | 2 +- tools/rust_api/include/kuzu_rs.h | 4 +- tools/rust_api/src/connection.rs | 2 +- tools/rust_api/src/ffi.rs | 8 +- tools/rust_api/src/kuzu_rs.cpp | 10 +- tools/rust_api/src/logical_type.rs | 18 +- tools/rust_api/src/value.rs | 44 +- 108 files changed, 804 insertions(+), 816 deletions(-) rename dataset/load-from-test/{var_list => list}/bracket_error.csv (100%) rename dataset/load-from-test/{var_list => list}/change_config.csv (100%) rename dataset/load-from-test/{var_list => list}/change_config_error.csv (100%) rename dataset/load-from-test/{var_list => list}/conversion_error.csv (100%) rename dataset/load-from-test/{var_list => list}/delim_error.csv (100%) rename dataset/load-from-test/{var_list => list}/quote_error.csv (100%) rename dataset/load-from-test/{var_list => list}/should_pass.csv (100%) rename dataset/load-from-test/{var_list => list}/single_quote.csv (100%) rename dataset/load-from-test/{var_list => list}/single_quote2.csv (100%) rename dataset/load-from-test/{var_list => list}/single_struct_bracket.csv (100%) rename src/include/processor/operator/persistent/writer/parquet/{var_list_column_writer.h => list_column_writer.h} (91%) rename src/include/storage/store/{var_list_column.h => list_column.h} (95%) rename src/include/storage/store/{var_list_column_chunk.h => list_column_chunk.h} (87%) rename src/processor/operator/persistent/writer/parquet/{var_list_column_writer.cpp => list_column_writer.cpp} (86%) rename src/storage/store/{var_list_column.cpp => list_column.cpp} (80%) rename src/storage/store/{var_list_column_chunk.cpp => list_column_chunk.cpp} (69%) diff --git a/dataset/load-from-test/var_list/bracket_error.csv b/dataset/load-from-test/list/bracket_error.csv similarity index 100% rename from dataset/load-from-test/var_list/bracket_error.csv rename to dataset/load-from-test/list/bracket_error.csv diff --git a/dataset/load-from-test/var_list/change_config.csv b/dataset/load-from-test/list/change_config.csv similarity index 100% rename from dataset/load-from-test/var_list/change_config.csv rename to dataset/load-from-test/list/change_config.csv diff --git a/dataset/load-from-test/var_list/change_config_error.csv b/dataset/load-from-test/list/change_config_error.csv similarity index 100% rename from dataset/load-from-test/var_list/change_config_error.csv rename to dataset/load-from-test/list/change_config_error.csv diff --git a/dataset/load-from-test/var_list/conversion_error.csv b/dataset/load-from-test/list/conversion_error.csv similarity index 100% rename from dataset/load-from-test/var_list/conversion_error.csv rename to dataset/load-from-test/list/conversion_error.csv diff --git a/dataset/load-from-test/var_list/delim_error.csv b/dataset/load-from-test/list/delim_error.csv similarity index 100% rename from dataset/load-from-test/var_list/delim_error.csv rename to dataset/load-from-test/list/delim_error.csv diff --git a/dataset/load-from-test/var_list/quote_error.csv b/dataset/load-from-test/list/quote_error.csv similarity index 100% rename from dataset/load-from-test/var_list/quote_error.csv rename to dataset/load-from-test/list/quote_error.csv diff --git a/dataset/load-from-test/var_list/should_pass.csv b/dataset/load-from-test/list/should_pass.csv similarity index 100% rename from dataset/load-from-test/var_list/should_pass.csv rename to dataset/load-from-test/list/should_pass.csv diff --git a/dataset/load-from-test/var_list/single_quote.csv b/dataset/load-from-test/list/single_quote.csv similarity index 100% rename from dataset/load-from-test/var_list/single_quote.csv rename to dataset/load-from-test/list/single_quote.csv diff --git a/dataset/load-from-test/var_list/single_quote2.csv b/dataset/load-from-test/list/single_quote2.csv similarity index 100% rename from dataset/load-from-test/var_list/single_quote2.csv rename to dataset/load-from-test/list/single_quote2.csv diff --git a/dataset/load-from-test/var_list/single_struct_bracket.csv b/dataset/load-from-test/list/single_struct_bracket.csv similarity index 100% rename from dataset/load-from-test/var_list/single_struct_bracket.csv rename to dataset/load-from-test/list/single_struct_bracket.csv diff --git a/extension/duckdb_scanner/src/duckdb_scan.cpp b/extension/duckdb_scanner/src/duckdb_scan.cpp index 5c248dade5c..095c5086e89 100644 --- a/extension/duckdb_scanner/src/duckdb_scan.cpp +++ b/extension/duckdb_scanner/src/duckdb_scan.cpp @@ -143,7 +143,7 @@ void getDuckDBVectorConversionFunc( case PhysicalTypeID::INTERVAL: { conversion_func = convertDuckDBVectorToVector; } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { conversion_func = convertDuckDBVectorToVector; } break; case PhysicalTypeID::STRUCT: { diff --git a/extension/duckdb_scanner/src/duckdb_type_converter.cpp b/extension/duckdb_scanner/src/duckdb_type_converter.cpp index 2eca69582b1..811dbb4f6d2 100644 --- a/extension/duckdb_scanner/src/duckdb_type_converter.cpp +++ b/extension/duckdb_scanner/src/duckdb_type_converter.cpp @@ -60,7 +60,7 @@ common::LogicalType DuckDBTypeConverter::convertDuckDBType(std::string typeStr) return LogicalType{LogicalTypeID::STRING}; } else if (typeStr.ends_with("[]")) { auto innerType = convertDuckDBType(typeStr.substr(0, typeStr.size() - 2)); - return *LogicalType::VAR_LIST(innerType.copy()); + return *LogicalType::LIST(innerType.copy()); } else if (typeStr.starts_with("STRUCT")) { return *LogicalType::STRUCT(parseStructTypeInfo(typeStr)); } else if (typeStr.starts_with("UNION")) { diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index fd47455422c..099437f92c4 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -63,8 +63,8 @@ QueryGraph Binder::bindPatternElement(const PatternElement& patternElement) { static std::unique_ptr getRecursiveRelLogicalType( const LogicalType& nodeType, const LogicalType& relType) { - auto nodesType = LogicalType::VAR_LIST(nodeType.copy()); - auto relsType = LogicalType::VAR_LIST(relType.copy()); + auto nodesType = LogicalType::LIST(nodeType.copy()); + auto relsType = LogicalType::LIST(relType.copy()); std::vector recursiveRelFields; recursiveRelFields.emplace_back(InternalKeyword::NODES, std::move(nodesType)); recursiveRelFields.emplace_back(InternalKeyword::RELS, std::move(relsType)); diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index f73f2008441..8f1ab1ed256 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -107,9 +107,9 @@ void Binder::rewriteMatchPattern(BoundGraphPattern& boundGraphPattern) { std::unique_ptr Binder::bindUnwindClause(const ReadingClause& readingClause) { auto& unwindClause = ku_dynamic_cast(readingClause); auto boundExpression = expressionBinder.bindExpression(*unwindClause.getExpression()); - ExpressionBinder::validateDataType(*boundExpression, LogicalTypeID::VAR_LIST); + ExpressionBinder::validateDataType(*boundExpression, LogicalTypeID::LIST); auto aliasName = unwindClause.getAlias(); - auto alias = createVariable(aliasName, *VarListType::getChildType(&boundExpression->dataType)); + auto alias = createVariable(aliasName, *ListType::getChildType(&boundExpression->dataType)); std::shared_ptr idExpr = nullptr; if (scope.hasMemorizedTableIDs(boundExpression->getAlias())) { auto tableIDs = scope.getMemorizedTableIDs(boundExpression->getAlias()); diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index c67aa059cb1..66ca34e216e 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -250,7 +250,7 @@ static std::vector> populateLabelValues(std::vector

    - Github Actions Badge - + Github Actions Badge - - + - discord - + discord - twitter - + twitter

    Df1BcK{!}#+PQ!cbJ3MvH!Ni*mdD2gKtLd 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 zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m zKn17(6`%rCfC^9nDnJFO02QDDRDcRl0V+TRr~nn90#twsPys4H1*iZOpaN8Y3Qz$m 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

    tbL-MM2LgMF!* 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
    V6^9XTuIO1W!D>g#65|TtEGlW!xDkb$46a9Cv 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�Hs;g{wF_I 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 ?hDqnMW1wi!9EZyfix(me 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

    I36>|0{b#{(f8%BmS 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%0Dv^^Iv1U>IX! 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

    ;_bcn>aYy+SI^=NEJ3W)Q$djrMm1 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

    mFISwY^f6-X6<+Q^@7o-@|UqO4kT? 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

    `s_yS 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

    !w{Vsp}aL3pI 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 z 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%0Dr)swKyU4d3c-_Q4l4kkgd&B(nJuMjU= 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 xUfxxQft;h6C%Q*|YF! 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

    BJ%)EhEZSCHj&kg*fdm8ps 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%0ATqZK~PKr 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%0A5+O4!|_1H}kb;XJE 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 z%0D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 )y7p6z&W=A)M7pG4*x5diArM}V0quJ55eo3El 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�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�htRmGIXb`{=oiTr(P1aV{t(R^OhQ zkFuUrdVmh(%_oxQEdUv+Rh21YOHKVh2?9T#*fPM*d}t6Z+{O9Za~Ur0)lw-xpMm#Z zJxM3RtD+0^v#>yk>WgznrLaTwF`t1Y(9I^IK`-P71g0YFQSzijc+M{n-^gWvOMwjE zx$61>U35ftbePND^E3v*>W#5=Jeh*hC{K=&ad1~x{Ddt9)#VS?Uw??&|onRS$A_B$-^N)_<*d?995;} zS0P8gI}vJEb|w+K2Lu9^K#n>@H}T%*-Q=L0_;v{-U973Xb}>jX&&&71_LcuYcNpVP16?7#~EFVeU&V-yJFDiPmv3J-wFTgzpP9u&j9RWBz{ zXHn*h!&pL~LOGCInOi@sHVnQgmn=a@cN;9{!#^Kl6TkT#PSttEN0zKSOJM^`peM`? zce;EHuQ$Yo>E9>JG(f(xA?i3PRUSxdN9gzwk>FGE*s|#(RHLt>FbrKgMkgz41F~Et4w9fO6B12Gp8{e588=rfYr5+Q% zSqi`obp)I(h8;%p?=Vu3{_}lTm_^W3aG%4hN`v==vaIjto5ns zZ9WVIeq~L>SwB122`JwmdcYN^7$(X5olPByx8Y8Ee-`iEwea9noJfr~#2mX3$_&hv z^mIdjQz?GOa^~swzHf$|p28aM&@kY?E@H5WKf#CHSh^o9*|T-;i`$r%@ilcs5H67X z0UIRTF?^qS0DJwi9C)gdHk5C3E*&qmcjJLTiMq; zl~cT{C=d4@WIE(Z{4V&qi5lx|Jo{ry_eOVcl8Pz`FG_D&J>qltCxJF=-`acCZv%v| z9A&6rI#j9f?dW*oLLP;P(Fr}){uJZM+C}mDhDaXJ`OP?GEG}o_Y6~SaB7^95x_5em zuHHT(1rJJtvBk#g3g;cCt%rxkh=SgpX-NFiR4}~uSyvXJ&4Zrf}7tlZlS%_LBa8GK>nZ#zQ5gtN0XE39J zFq>`A$2$G+pO5b8MTDYCnt(sE>LTe9P$ZaDXxZ4!+tJ5=o(3VI?CTZmyI9XQ;iz}G zEe6U?%6}Zk{E3d?&PR|~+3HHFUa^?EfRkrrKRs(Ykgty{hugZRByfTsuo9XtZ4muY zx27nv!@*&dLpZo{2M>zM3gNBbRfm-9C=`+4na)cN_dp>aGk{#2>5)tzRBwLQY-vX? zxvm>eYQNqb?nX|z85n>h@7|P>8lL{16cZ#&ox;VXnD@CUN(p)fq)0?g&S6Ioa3PuL zf1zZN+wy0SPnX+Ep@U5_QktI!&=W|%sJH5P@>#G=4v_IWr$3V|HQc+V`QX-4$pMp! z^l-G7l=bC*$*7>NSjRks zjrinn);hX)Au6yBkhX`FH#JhnuU!Ni^Z@j;m>NDr-^ml^1&|rJ!o$|+1mhHFWcu|_ z)1GcTM;95K;kiO0kAh}9cOmiUXKq@9sI-w*SoREHA4i2f)Zk8oOHs&je}GLm_y7`2 z*O5LfxAPX16V*LSfs`O2soM9?h64k&MAC3N9qUr1F-p*$fd~#A8_vET@rSMEdrtnT z^q20D^k{H%xvfU`BQv6fOp6lbi_=~u_$8Y*p3xayg#nF!bVJ9VK z$W9Oq@;UzDDZ}xCh2vb>pHQ`sRQ;kw`Y_WF!GY+%!7>+1KU}*oh|n8+c`8&E`~8(z zEiECL2J{C2U2Hh7{$?9`6GbO3Ka$WCuk;YUK8_)?RDgGdQPB27(>LrH+zC__Re)uV zv-8=0#0T&_QR0F_a-MtOko9;AB)P+Dgn~B05FA@ZOzyuDBRtb?E6^=o)&szDko%<3 zljB%y9LS%}ALf2R-c8yM(@6vm-k}1*MkGy9^kQg0OcJc~k&h2OYptuhMgjArHAtma z+?TFGDA3{nfq|>A3jG5;SiNDK3+L~^bNeXMt*{;1fsO+5_hsG$6#D$-uA$7KYHV4I z;ZLwAl*rL^3YVXK->2gY;UQ2_P z)x*yW_)Y5FITjGH8;vKjn(^Ofth8*!$#Rf-2VV}Xj<#`&mBT^fK^@n zoc2(VYk`#Xvp^Jsp4On}2oy)b;RIPByuIMO4|ipQTx_p{u7}#>9hK-%W@RhqGWq9RN}x`tA~FqmqEVA4VB-k~csf7f zrwUEF8pe0C^9C}Qwm8gsOE?=JYQ%cj+0lSCb9u;$zy|2X=;r2~TV%)!nEs4m^eDtJ z)Z(BF;7Eejw{y#bW$?=mA`GWsL_JH+k%MH=lxl>0roRS&h=_LZ9CN$+Tx^jm0HI&b zEd3|0oPSBno!!EW!rr1l7O=NWT-+$sZBhWL$0t6(pCJDA1H&A02gZySrb}8oW8E)y z)!E%p@tK?Lb=<9Z@9&6WvG*RlX3*Tb>MYxTdaypZC-I1X`3|{e;nxy%BDfPo%>@9$ z?c$$NouOCN?IM~51H^{>d%%=3vG#+Nh6{Vb)HBDV&*uIF`e6n0{P?!DE^PQINidRE zK`$1dy}%l2CRlbrZttA>8|?T`1eZM>i{ft{*yna zp+}+o)rOr`y55O(exS~GYPeH^t>*jbf0sq%e`?Em`oh`XXJ(#QL29zhpDHCkfYSa> ziaoQYSBwx7=Wv!5OY9->;#ZF|0O$^fFE|OBAuDk9d$lCbPXf3@(3+t?C$i{|20$i| zBKKz>2!zc^EPf*&7L_y=jhygPAOSP~WNEhX^HT2qjQVm8n^_WLChe7Q%@GZlyW}kg zyhWdtz;%}FvF_cnDY7}9uE^u*9@PNawKK0)0pB<5gNFuDS!Sf7Y6C%^mZJggSD3!o z`>_-eE2wvHb3QJPvwYNWP_PyOQ7Q8vDt<)5B){%Mi!dA*VLL&rU6W00kDZ z4;G(S5xV=!(-Y&)U@qMKg&se@nC7eUgg>M3Jk!s2uDP+hS7R9d%kU_%PGS2Wqixj3 zrgqsn)3tY-;~an?_l#7<^6dQH(7XnJ0oUo@{b>)3A+{{Y>4wG>JAO!(8N-LGS2g(t z`Qsz^O*}XlO;>~%wM59zE29EPlQyfEK#M!8mx#by&D}3k?n>4`RxLYxYnucvL~M9p zb?=`^-5)Y`nB84Ch65vN`H1o{ZO(w{gxX~!adg0`(}j#97eC>HTWH~aj^b4BrSV(n z3#5h7gLoThzvCa0ZSIHdUq&MMACYQ1?}*g~SNSnKr0~3i89bVW6Ft;f2W@Mj0hpcJ ziUR^pBflG^G?s3_h@TUS5Y23@i|V`~O*w=h*45>vn47IT-}2UzJs#LhkO(Fx%cjM}VK zhYIT*&hg3f(j7Tjm_7GGwO{l*9Jh~m;CQ=oxOC);chesL4I2QY^<;}F2eN2>725c7 zo(qk?(7-To`>>=| z6V`{-3^MiW+?D<%pAv7W=>s^yG!cV9i-XIM6d2L=Uj zu-she4N>DrI?dc4l{jue%eP0m_<(aGL~!M&2ACL-Z2%}GK;g=(Z`F}(j&ZpR6;(HP z`l5uQX0_;d>y3<>HbyjD+-2|pwe#QTk}eRyHgxfcS$g7Q45apbeRN`v2jY-FxiJ39 zo14!eRL|dLO%Nu-$DEZRpaK{FkaTsh9mjwS(TD)I_^&rr%#%o70%*~f7!Y738M$rLhh*?F{=nSAJ5Q2j;ACuf z0oy?xph18VGH(7rh(LVhCHYDxInM5-s`;NXS~iZo4R*rAcI8YT3Y%cAx7evhg`Wn- zHQ=d3z%G4?d;`S(wY7EOsC5Cr03X7*Z3$cMM0JVu@n6}39|%@p!>m#13gUs@vmsm( zcq@$%go#&`7hUI&W6iA-z4>UiQOOf`KoviC4&~+J zZB^pt3G>BwO=aXC9sRFFcMpMWF=DMPbA%cYLn*>b!%7MLBf<;U>XaX_s=`lyz0}Bh z9~}AdTT>Qep9j?F;HCtdV(#$v;LIc$s z5R;Sb&)w*Aj2NR07c&$16m7dn(|tT`VBd+wyoZO28h$-nO4asUyaj*9cetMFrLz?q zJVQAk))k#Pyl!Fa@;4=x^db$%FW7-+XM)&RC^xOx=8M*^U%UPytbw9wA#E6E@|n}z zw)f@?a`DgJx^?ww)r^CCy$1gSII@3N`tzjfB#`Q%(4`gJEhx?l74oOkh{N&acr7RM z6rbp)SQJzYLx1?$3J>;3QJVSaX%UV>88z2tf3R#*ns4C=Gl%kxUvv1}zOWZv zjfC|mdUvHluTr-f7ivH#&{hEFip9H8xZ772j3JO69HfWyU^QcCMF^v-HRz7J%+u%a zp_Ap0RV_J<99rzE^0C#rWD*|?WUlVjw z!MDL5Mj0~Rrg81=NdD*3YFY?wT)w3tPvYT5CSY)t&mLV;r#0qnb@)7(YCa#c-y*7*8_LW_)@_T}sDjh9-E=iV>tfbamR_rNc2% zrIt;*s1v&Yx{i6o<8SZT;X_7DiQjO&yvG(V9%+2t5ihPFOgNpxMM5$0C3AHKTPKEU zPaPG|m!i|3$0Y^cxSb9UHCsCRknub$T$QC4S~{|B2^wGe9x5Tk01V)kx#q!r-76fX zUZ9-)s5@HR&Wj9M$CyF)bM8kG8ap76Gh0i4|NRw9?L&uYdn~$+$~~g|&Y`59jE?=0 zmZo{%=xCp#%nb@4(!={|`+}IToQ!i(j)Todp6!_t;7_bF2AD#ZT+zowrT(1jq%eGr z(SJNG^d0-@@kSfb<*{HHcZ07q+L^n%`@s9`2oq98be`Ss0-r4~R2^WSmp6T5 z*RKjW6gV0&=!I0jqE(o;^irD?S9siA<(e%@R#)p`S2B3R3BnO#6Yy7Ij_Af-QX7uZ zW9~fhS-SC%YviSwJm_pbK%TL}0Ojzlckw=TI; zbB&^O=T_zNVJ3v>Pvktay%LJY$Z*VJKS1Vp03eFsBZ`EMu9AU-!5sry=wazhpD@0| z(Zhm6_iq|{3RY9GCt!~j%HAO1#&lge?pX=TO5X=IV}HCq0rCBlAru{JJ1&Urla&jE zQk5pyMdT^F+5M1yq%A)~j5s<0RlmEftLWX?eWA$^XB8 zXU}JN9o}g1tsbP?I;=hH`{Av?%5tt1#SzN;iD2Y%Fd?3?EMBV%_ydz7Lq%b9*=z%7 zye|%yg>sVYq&&O;ci-b<03!}w{xG8q z--;&y#2_;J)pF!N1R3u(Grqkswb{I;yXxR`Yr`&$ukf9@d3;6ca|7s@J3Yf!fjDnz4 z%bYPrW?&+8h-~b=CtV$W8&zJz(gT0k`D3(TjnbX z>F}v3Z7=}FytOw0h=sKVbndK=>R=|HA03Hcj38hWPRI}IwX2M;diTjH)TlA(T}k_a z2Vrifr?@{rT9qs6&m3=Kn}LMnp8lrgqStV@BPkTm+{pHwM-EQNZDYxIYx7@>ZGZ)# zdG(ushSdDgB!#)jJq)Nf-2)a`{L6r*7Dd;~IYMSef0_u!Ha=A)Q^Iq)z>FD8(w_lI z+D^KwB$!!Av9M<9txr802G~yd`oHp*R8~g)MVef z2=m=Hg92rveY=ey7eVM?ny8t09Ov zR@h-sFP=sXL?zpDF!gWJ5XjBSH(s$HWo3YAuA=Z?uL~Di)%LFG9Jrd`I9!N}rEJ1+ zg7pj-5}tbw*J=x0vBdN>1Y&kOjR#KfKv$frg4a6*yL3UN-vA z!o+|ilSg*MXZup*R(Z*HMfVH>HXCz`c`c;r9~{0vs_+N=|50Cl3V&z6%ZD3kQDu&7 zp)c^F@fVu!@d&=Zjev#B1YZG-_M^I2!&K5~x8_@IY4wM;_?H5?Hitbz=ldwixFQcX z#Zd!O^>hQGvrZhp_;eJTS;t|})?9ZKLudqZf;>JQAou-*hi!(N58ALO=d?hm5B80Y z`jd)`XZMq1#bkB4rW{by-rQ)wF+#VCr4TP0pyAB9*Zn_HJ`5Zr4mK$1FTk*!P_YV1 zV~0$pir3+{q6B#$jeOGq9B#5C0P}?nJN4ILul2)J(P>JrcDDbLoXsw+#l1^o-W%4VM`=x^ATa@>x<@CwqmOiP;b zN@OwzR)yktz!j+Xs2&FrS17>{kO54zY9TyE@E|Kpcc)*EDgHDrplF05Mn>HeXihw& z2$M^DZk^91cj&W@Qe^X$Gl0|qMT)9Bs`Oa&F%JAWr6BKrc!G6L;{Kml5-%@`#T+Ck z6d=EL?i1UYX9<{s17{YHMa#Zh_|kxJQ4p)Ez#^7ei%tLe+C-E$!0sU}(JKsdydowF ziQ%a5du$~2A}Q@IsjLy;2>vy4{Mq9C?Eu#RDJ-?zdO%I#9SA@$(X=|74|=RWkq>0r zMJ$B$JHd4oBop83Lo=53B(#v)-+#6v39>xB;OX?!B-1>#5{$Rb9<;C(mN6*y`B=jmMWS19-1Ie3nqj6>8`$n1AeXmR z0Qhyzjs{@RB}AXQrJS@Egnr>Wz9oR{3cWP4A~32}Z^Xnw&d?~&Ya=6pmF9#0HxZm| zbU2xfv^}{kl+X?Z1fdK~)IdMtFqrp>EEx)pu9(XM`n~@@NALYN&wtkSDhYyukN|Rk zfFg(lFdC&Q9C$!z5+LvZ0+AvDL6nwA=*3W?gdzz=FcKwTp@c)ggD5_x?DRgfJ7srg zcIxi*+3EeKbA8W0@cn-7``(>-zpv}{dOo#%@eUbL%c^mz1_httCMR524i%BEsI`P5&}jrQ1`Kq}q()O)@~Mq&r-LHxw~b;f;QMedhAcfF6az-$VX z4~dq|(1srnKTRWPWk(&Vjmq25R6;Z5POQHd0|+cay$@dgXaQkkK5}yZ)N;SrmKlz% z{lE7|GXXgK)P_ejI5d2#3w5H22XY&W69g4@0AG0h3VSa!bx3^)eA%~eZ-&UhZBEdxrrL#7RHpqJ$}HjapOsgEA&k zY(ZNy&RIPYyy7vkm&5T4J)?xTdKBfX8N0?LvAB1j$KZ>kK5Qs6(;sdl6J$#gB{s|S z*f%ERO`yoKrwrf<+Mi&^FBu+iPB{Q)Er9^# zbx}|8P3TV0?W|8Vtb*bee8aRDVy-_yoa20ajGmhV`^ql7Xt;{60NT-bR_~YBM>wZaq+Aomv28dY>c#+t1RM5`?7t+ATGKctvg*~^heFlPy zi-hYdftdyx`8v+d+U!cvaxkG2Bs2+_icnI6P@->tZKv#0ua-TU&cqb*3M1LafA_)e z=eX!GdY#(#+Yy0q*9CmCaAqTgmy#<5Nw(s{1(d>aH>}R?v$GW*P+w~>go*%k3NYL1 z0k1UVMR=iBP&9*l`LxphqWJc_%Ei^coaq%r?|=ednIhVNHVQdY^LVFY+PHl_`#Nq0 z9urS>^gDD&XPeM2i&d_#$x{_Tu6hBYR;Nwy9uty>SR@nfYuRaX`L=oEhr_(HLlUyf zI)Jyi!2#u}=>72N@|qUAA))XM)z5PO+f_d7zXV5~!TWStqjztohR@(YZo@}P z09juS_uym!%_(q-8<4`mL!xcYo}~p&L?mbfu|<`YSIi0N32e^XpCUEB$J0TmQ8gggDtD@w#zNMoY6jFUgXa;>e94XHRGtyM_%-@zo9_G`UVFMkuwo|iEK z#Q<4o$9R4Y6%;=oz2Kz}Rn5`EuXz*={2EDgh@5(3$DCQHA5$LjQxAE%LT|6crPm4S zZ+v5)mjH%w0psrWGxanN)8t|=%fTXCK)TSuPCp1O4(xuhEcq%QH@C%tdS=%qZ~WJb z?_Kv-%>U$v(?dEQ?cW@bielq4q%a|6-mIp1rDMkY5zYTqk_c)BSAil3Fs4nY+he-~ z7Ep2fkGyK&%Z*3muw?wq@oB46vp0-~2S)-i$K8a|w~46H9OW*Dg?%=EFnu;^3OXxV z;wTMqpbq!C-oPq6T@oVP{; z%%&i2ht$oKG=F8ut?#)qmkY*r99>p4G*@9Nr5zRpjjL_}&=rh&yd(5k?V&(?MLLkk zcFZTe4o2Ywb|eE|jo{#BJ_NARJOnmea`3UgyR_j(x#MnUGy@{f2l)#}&4Jg7{<@=KyqI)ETVhi2OrMf|4PoH#&M>9mx44 zcSZzW{y*2Q)RlZ34Y*lmZ@r2eF>u?Uiw`Z7-dxlQ!MA7ox+XV>^ zT-Oft6gqM*p%Qz`BnEPKx6cn|7|7)x0gvb{M;1m$N^$uR!K2R@ln~QIPBZ=vk(CS{ zj!b*aB5rQuGiI=IeiiaF0NE~ufMVXvdf%7kG(ME+98KUj7%Ez9wc9pSaB3f(Sa_;F$dXe!cY04=;2xSHfg6eYQ$ zF$ow=FR4hmQw&SOqyfw@o|Xs`BN?<`3t1k;KN;&?GGl?4Z={=fnc_z3FU7%QA> zMh1ytVD0c_&;hopt=QovZo;A%=07CzhZhiqXC`suqG?I6ND{x8U<7w7s{C$wKI5!jGD+QqIs*q-tOH^m_pLZTK5CK26JxZX)`{>L1t=g) zS&>>em8ut5wFI96j(?`~CTIF05H1EBBxusr{&mVWZXRsNdnbqIIlyi(0Dr&ozn*Uu z0Yml{93>w8;Jb3|l2~E^Bhv(Qg>S-P>maZ)f}e+#9-L zFkF1MQO9qm0G_%Ez-ufIpm`v12KE$eU3BM{=|Il2n~3)xDSt7tz!r&$gNHuhnk_f1d{L z+F?pZ9PF&U0hmBw6FhaHU-2`^!j&2mPvq|$n#+MmwMl(I!caRv5vM+51?OD<52*rB z?%c2E$Hm!COFtt`Ig7bVbCOq_0g3hi#(Nck{wHz7x46F;1=Z8#rB25mx6|PR1u<5@ z^hYlaaB5N299U@Ara|7@a~iwWZJ^RPl1-7w?=2uj{eo|8>8Qt zGgM6e;;H!@zXi)hS3GWDq+-YJ6IIEDg)sWaPu!u1#8#0AO*X zwWd1$!ghr+TYR}nz~4p)6V~wXwxa;FqyCmO?f?i!quMaiRC&d?lH$h`yf{JT1<+gi z-QmAw)!~<+uPtyN`%vo-v0ST!eVLE?hXK=Be*5v?OTmGc!G9WbmYa*1JOt2u34rdK ztvz?|H|t|halKl3$6zx~IVt^lUxMu#Uf#mqPX*V>L^A!>36sF@BLHv=x zmV<{#h)csKXap;vZZ(W0Y4?REWe}Mw#Wn^8w43cNS{c9dyRK8|Gku2sf)Zv~;nO?@ zrqDxDDSp3y)m|Q&nx6M~i6Nb=={^kd zH{CHCIx45~vi5nRoFK{t3Nw;jfs*%VD18EtMtA{`8x%92r$?T6`{u6)TS7wS3Pj>_ z_I`cVqb7;%eU2rbSYH8CwGIR%)S+<104$X`mQQn3Zpp~N1-VLm4jNYFwTv*zF!%qm zlK>xtlkA$>T=j$41oy!d__-9AFu=JscF-;UrF^3ccYiCiAD2}cR_9NLu*kv>9YS{= zW?d}}1-Le<1ukxBbA=y5ij*wR%ltT~ldCD^Hi3|A{XOi?y$pH~fYkR++v*()%}aLx ztTtc{CsW1IE=C7Z#(;2A$Q2D!0$>ROZrT+Pk4aW#eEki~=_gha*AFvWlS;6CX!fbK(bsb? zss757T27a-OpWf@bQi2WU7e{t!q2paD*u9olOV>?qoI@f43ofurX7kPH#^gLb``J0 zv)7J^3Y~=jY7fH3{7qvOOUn-+!Qoe67C=5G1qLmFg@}^?f7|?00nxd2f^4;_P0p`f zTdF=%uhw9h{jCI#6#6Q$f)lua?BdHKKd{&9m2bP>Id8Q3>Cy+*ErmgLs!@nXA z=t!DTvyhE2a%7aY`7(8X9BhtoO5q`vIM~Gn;)w-7)s!AsjEl08GYx(j3R|%J$o%=$ z&TDwHMA&Q2$~WZWO+k0QRZ6T(q1k*+Wj-pP)nY%cR;z-kukWA$WRpVwJY zKIjWTn9g1V_(#=Jw4&i%E)pO^D`1bIzZo&syHsL6kW2#a`Uemm-<~8ZRM+DRdUB|Z zzvl`n@D&_s;w*4s# zy^tB6HgfW{$8rQSPL)i*2{ajpoWb498Nna_Gx5Yao1D6pLpzZ0r8|BT5^kl&?-Z_D z!C^&5+CKen{Oj%JeMLpe4k%dEy@x#5?KbFlYH9kB(qN+xulD1c3(GeFb(dEE`ZLN9 z8v#w>-kcAxl>3Nqdn8!ae@f=28A;*Ag0_KTz6p$x}1T9oPO>dUBIXdZFwfRu3#hq%ZqrVr?rCA zJElHJ>DDf-m;T4vq~~lq6@Cj*c)D}LTLnSLBE9N4F0x(>c2)VdRS5K}$MYKoUnM*M z&X@!O44*^v9Z;FyIsivPW}jRt_pwy)b#KrQ1*($xq?EpopuyL1suG&_VprR%xEk#b z$Ko5KR`T{~`yTj7aFKtq2RX!X>oZfKfBQPhfatVl@2>^l7<;h1sZpuZ7l5I>#eXdVuF(Eml9{a_4wahz(@WywIb;Vq0zUG{ZljZb3v+Loyz2@WL*pzBFzcEfR3&te`f1J8^UQ z{v?HuUj6omAN37cx$C)Okh`Fmgp3 zXJ=s%18dHdh|UM^5g43dhFWmm{CqfZ_4-ZGwLe_7>%%W^>+nY)yGQ`UxqVEUv2^Kq zzrTQEJ3o#_b0K(&J7G^`nvx0R6V^L|$9{4vYh2Nd0pBdo;Tk8&X#N&ZfQJ4YysOby zbj(RmM0k(Ef3kb7%Cz1cIdyelPr1S6=Io}>J(7g`-Fki4&|(>qm%;^~Q4s*xbznvK z=Bdb40@eMH_-J84)PMHe#fE}X5w0j!LCm2bq0`FF;7U2pCAZs>AgdG)6lU_$wFJV$ z%WE)oAha4M&OM^a_#P_lH8KMgPrtEi@|-K29Ls;xmB>{jKh~som|8lzoC8PVvV|_VqDBNA4<2oq7aIIAFuV zt4-v$g-LvQqEgVy$6++0dJJJxvhnP;M-G?1*->2qTfgJGskR5r1h2 z9FRZDCzLvmam^j@M)`mkfKQwib7WFH%%Ww0MIBm=>&QPgqYvYu=4lf_ST^E3ZG($9 zr9E2o{vs`Y(oI#bfY$?7*%&3&<7i5^ue^z|h>Ae=jNYauHjSjlxuWeu1YITbkQH!p zUagHsh`;5c@-|xki>;$;KtKNFoGio>;6ekUJg6fOY6IobuKrsq_H5_v>(qF0hyGf! zXVj?bNjLYf5PH}7cKgXAGHi5*ENDfQFFWX-0V@wlZi)8EJ>%&XlRZPgbiDJ}Yu%P) zPvdyixEl-DsDff;W>Q?(`uWfA^fYkP+U&BeFco@=?&XjnbZ~bPQk!$hdR7E1M5#~j@7-) z6c#AI^ouJgxM-A_Jt%OB9JK2!wghafc7rg9=wN{S%UTBPC!wYIyC+5o7fWJ&a|6v*D#83EGd+0XJED$(tEB z`AsprbK=g;-lR5oQ~_b@XbG(DrF(9A36$Z4PmrAqyZ=Db#!s`YJnpQ)Ct&;SU`44G zEb~uzdB-s0NA=z#LCMHV&0`%eM$LTQKD!hI=&9>$!+s62ErNes&L>2^x5IqeI7P6x zn`J@5;(kb>=&W;VGQ$Kw5 zTv@)>{&{%6W?%%v;-2|>O20kWcgO!`uCMa#>r<@6VWfH6QQ7StpfNp5?bp(fTII=V zfc^FNGq40rfZ)S){!*T6Qjegs-l7uDK1UV5AU>YT!lt;;x^8j*5rx<(HZkyslzg)k zjxJ|{4m8#_UDZE*h~avk#V~E4Rl)Mjg@a(snTye_up6EZPRqK>|2aNun*`pgrBVTCwzEWz-p_?8=3 zCGN0N*K!%Z=3m!}bEE&<0sK-=Sc0F@=$MM(gOzgXwKo_0G=UQ#I!B#{tt=OyznGw! zqLV{E4VN$4gQ#3?-_RSt;0=wvep88l->J4~NOfRS9LNbv5gIW5Qksxa-(lYUxFn_W?`fS<-sz zp(mq6+>f_!yW*?mam~&xCc$c6v$vWHX;w|8P(JV&NRfkJGAX#6nLA^ZSj`=6q?{YBGRI_tDaU(2B0$sw5__ zgX+z+U%VDjW!OnN@4CXhZ-I7139*%z^&1DzJn*wNoOOjjD9013q3B&>yFW~gC*_@||SgZSsfL=uEz zQ@kR2R(BR+{*WbDk?tyh{T| zDyQ?|B$dkZ_{5i*c5rZWj%K^Z{Vv?cBgpYs6@en~9MRs3z#ZY}6g*)J{?vH~;`R1( z$YGxDnN8j*Fr1KA2_xYrqoOL(gU04AAbtr$mV>V!T&_u5*yvs(7{B?W;(WNm!cRFn zV5_x)zOemD(}Rm$B+Bi}&OP6LB0EQ`t>62^AubRMV-8U1V08XRc)+DaLkk{JFHHYR zczm%`Bg?-5zR3@oo1lp`5R4Ng5d!~LVAvQp!vji>4ZR3ac3?mM=W6@nQ;@R} zSi!mx1;qYswx1zjiairbG-|I1?s!~vJ2E0T^6NYnaHME@Ad;QxXeqlpD zJ<+dWPGOmOcEKq?5rh2Dp-NuHK5qMkcrpp{5SVCDS%8knE-)?x$m8Nk47`Oi#LuLJ zOwQGJaUFd*f2DW1@a(0CF{dpr4Jg^F%8=RDco4QLUrXgl(g&4~T}$3DxbC+Pih2dq z^E^!v@gK!3#Z%Rw`~hKslmkANN_xlu&s@e$W_(c=IK2a4&SO5l;dll-6qG0sc3dgw zj#SFwJe;A+@m+V|R=;=j{3=7GK39d(TrWsM*|UGGhLP6^kbBdcKAi<({Vc+R2W|cv zM(rX;h=E&s+~ksA6~3zwf%3j*KC4Tsq29@Xx|J=x_5~0d9WPno0?s1DoD$kMw7Gq2 z`08$hp)1f<;c*-tFR!M^FPj8|eaa7p-=h=eIM=)Bj|$G!f?bvMMqU`K(-E!?;;>g& z!y2P8@W_RF*5)v%06oYD&ZEKIvCh6+-lPbW2&PIi(EUMq`=a(Fjk& zI?|yO_(%7+=w;(vOzxYE6BE2B?lUJlvq=Fg&QnqRkf0`I@T_wfvv`Je60R{kRY4^w z50F=F7U2$QsqFmw#izYV{F%>y%CuW4BtjykB3vQ(pXhPc#Qp;Cek&O+cn7QfEp0hA zzklr|-;h4EaJ-$}3-Wsq>2%=CAdIkep>HGrB9)(`U|9ir`rfioI1)jEp?~i<4HZxo z5;^Ukn2TbRUX@nBW^=b7yVOLHX+1NY&I{@b6IgveKVE67tRU?nR;I|Bg&v;TFHw#f z*_DUWJ^G`K2Yu%sXs;CyOeC?oyw`?a$J~t9uhj#5M&Fsb- zII!pj361xLorb>(+0zPE6sCW3iYxAl?Q5C!8vcYMwd{f6?6YwVw7dI2&d`kYDOWw& zU|?)IaopDT*{I9xpOIj3#=@InbKeDf_oG0;I~T@*5Yb;9M#*hMdgDRDCbk|Nlql(3 z2lbQxto9DwJ;X&LEiInFV*b0{BUb1W%|P&Xn77HiZBIA+>UupwodsPN;Tt-b#K;HC zJOrpB^yzP!Nc&Hz&XPdwmWKBmRAG3DPY_=wwGPM((qD9E32*vL_JIwxwnhPOEVw~{ zbP0x_;@W56&%+ToAi1R*0N`dJ&fj~!6i@wVUbRC!o6c=;1Cw15d{MBa*cDnypos*O zfop3XI4a%_9F(z>o%^tg(rul((GulcvO7*gu3jzt39z&-N>sBs!q79RICFrL$})Y% z;f%MiWHb@6lWoZr5&Yx-pjjesGoRKaCvTCvA1SBzbx3Dxx;nw_wlr{FRf>~H)G=-{ zBC4?ySdDr}uR}54t%6y0xA=iUgNd&=hjc#5@Vtw(U3l-xhsed{Q%_45tfq(S_L}OPB za42vFl;~>xmHb#q-)4uVMB7XBe?TG%y0A6{XM@U~>hOZk+!vDwvHd=e}e=3@Gy zaG?bLi{*8V)1U*e^0$a4*kM(a&-`Nr!F8ytaq#v7%G|_XiC4YrTL9VKsj>l%71{($ zd(C_ziNqI~Os4FQ*_#%HgjYN2lY+5joE0Pb2a%_TeE3 zmM$VBya(ZoY<9UV>!!yy^L&l&&w2yQ zE7yxisN(3X(u?k|a$6dZ2sZd{Bo0F{yXFqFlPgF9Xq zGmK=BpTyV5`D?&9rYAt4Ziaa9D89d-BZ9$dAWdF~hE}Y7rie~Ij?;7islcs=Vpvjn zmRe>YpSXPMy5f!c`=k@XqH~<#;6K_8&>L~sO=&FPrFiD+u6J$zB{&`eqnq@J1*{_X zF{Hz%uOP6F28|h5PZ5T`tiJ;(tIz#+a-^1b$M^r^17Qe|y10KKFq$V$vJnhEyL)kj zO4fN+vRk`lTlh`P6uKZjZ<&80GxXN$FHA}AwlVL%@oOsRBniKty zy~3NyrJ6Yc>Gu@|E;mHGcvi0NCXgP^AsgLQ&^w-h(U(y`+}q`(hM7!h$v45o;}Fyj z*Yi*KhHrA670uS#v&9t%LoH$Wen?9ovd2^k9JpL@l)8VDf zoOrX*Fy38Tpsm6*>RkY>+Q}>0y(YFqG-Jz?GA}{g9wzbo(%qgc9219wns!dE==~GfWrneB7FCIq%eCOlJdFsKn2ozVH+;q5<2YH1I1KN z@vHKHbS{k3HBBN~M)WMqUoggM2jYCh5@~#NH*o)q&c?y7JUp0yp6M?yCePfW-GpC` zW*fv(52y(ILtprIY;fGvS4rD&cqAzQmpW@Vog8GpuhE9(j#_vDsRr*F{9qls$49CL z*_Y%5Xqo9#Km`wZuhrOQ$6PG~hSJ{vPV7@G9fq478FtumuKu;v z#%uQ{mZ&)IgUI~T?>WbTUWO&E&z1fF8884wzk5+7#RW^h`f8XMI+2Od81!3?)7$S^eRZzVPRY-Al(%kXG} z^57unp*(wAQGVgQbI$7DahiaGl}Sw1yz)W%1ZQrp@wgK!#BoZwv7{1(Ftv&7P#oAy% zQ-Y*eZ~GtRMQG+E)8YBe2!)M<@Q`N7jume_0MYSPEEs|X<_W?^XtET{mAIMt-#)y2 z7NuYZOX)#G&$OHm_y>V15mHgW9~oyl$cNj-7Ou%H(=p)jgQR6Yq&IE7!Y8`N+Nr1^ zY1}{=GOAojK<_;ca;vilXzx0;}C=`@!7gd0R@z%?<(jnX}RM>J@c zo8KD}z+g_?CO_X*oM2e!m4Tb*zM_2;_;+;=`+_8T8V=tZyz+glm zqwM1PV4FA}p|t^q8R9^<`P=ZQr%vn0Im1#Yh^-v!lXu=G;*AP$&*RHsl_rnpeSx z%c%%q!2tU*Y*A>Jm~sil$NwjVQ-G&+X^y1;<~%H|9vatYTfQjlAU+DeXT^}O%)0xH z4!NcS$FV;JqTV!p!{x`ma3)c?0}Ls;yoB6GN|%!}2??_|fJ4G6qNxu`fPjuSKMR`b zTgC~te^bF$b6Rgzzj}duC3_VALMDx>EyX8UCG7P4Gop(ps{gSNC>+ z^=*G(KwnLv`TTaVO{(se@K2d)tw4tj*`Jy_(Y(8C;sS+J+ttLujNY%Q5(w**qa==y z?Q=hQ5|;rK5r-}{lk(SocCCY|-xf4CVVd78IJBwJpS}H=eqw|ts?N88)X6L`k1xIV z>yJ*?1x9uBH7L*VJ*M=8Zv9&R_!3hNu{WW7cmF z&blR}+xDGwJlW5Y7_S>QoLkEhX);E`;+INrDQy0`IjRp%fX%Rv33`0Q%}e$lq56j< zpE(IGof*&*8=sADfTc*;c&Cd~6PEFY4a8@774mTwr1$)31#~BD?wCWc+mE^~glIom zK~f(81Fdv-)phwPm5uUOY~>)NpE_)!!4l#XX>KJmK<8V1fbU$@MGjiw;|cu7HKKR5 z)_!~cbmVtLOSJjd><3_52KV~d7zh~@s|RZ`&?pX(QBj610=o3$=EnqfrJ=rik`)+O z3H(RFK`T5xr5W3jgNf)@2v`;m@)1Bas67W6wpnG5OC&oSt^*EeK1mKIi6&&G zVjo?EER>CWMz|4&=d+4Cg1|Ds0zgDo!aN971042j9h~kNI!w0UQ%nKBWFY6+XU_3| zxKNtI0(<3o#D`El)9oYUGuvUZq4{ngB4k0YG(ZD!@ zRsseWaf8d-O;4JSKB`1P{L~%2F%$8wA48-bXb$V+c8_TpgDB&0q}=RS!uek!@Ok`W zbGU`JNy2Rko~aE8Jk~6eFEep1I%qRwojO4mW5_fSwP;WQgG>I>&rP39*P=edA6>X5 zRfFU4u1|;Uzf-Rjit_-1*N9vrESx7YG4h0dh+u0f9^R8ME33g>EWYC!BL>0u6_osT zzHUMQzHMMmKYxi}P z3VS>N^AIm>|{~TuDU056@$uSJqq^3O>K}J0DUYW0- z;R1D(Nb?`5PGLX-@N>m`&_g31_|Vzf4wW{26~UhCw7K!*VC&9^w3JagbK{S^pw6bT45*Q=4!&n57pCkuk-G337_ka=eUbs(-S<_>6_;DcKql91BDuzxI%2P zD1LLs60KDI{;@)J`+{sD3F*@J?LZR`aiMbtYHvG+)>Uwfg$s9GsKFh-R&<;pglT^A z;WA<=r+ah7R=nyi@<1tWrtLYL<-E64xwr2&sH3Ikdruj6I@&+Z?iMhgZc-#OLkB{qtTp<9>AY{`nSIw)(V0hdQ;Nj%?S|Se_<3y~t}b zb=-v@Lx2b-i`dUjd;|_s;91AUI^3R|#{$(QW?;g_BOWwpM#*a!z{mU+R{|aQIzsGL z_#p6$#Vz=C0Q@GWCcjX8^wX5jl#pa#cyOY1#LquO8}&*zz61ptRSCrpt$gV%$rH;9 z205X%-JibHg6(fMJ4sa$`ps(&-fU&+x!0%<()tRs#Ir*1g2d^YXhRIs=NMV?iY4@b2?8daD55$0y(yQPF49 zh*DGT_drJ9aA5SC@#R636gl?O1tJO9YQV<*aVL2b9=?Fvghhco+kFFfVk{8H`3Ngb z0dCzl)5k7Blb(r7rbdt&o8&Bkd%;lXM<_82EvlxHHHr`X;i$q0S)n6hGfWhp+Kw?5 zfyWpaKNFPjZ>zSJ*2_~i`!M7IB-<}r1R~XQJbWo-==4FMsQPWG@nt`c0U^M-cXR6==>W6@$x2K#mtv#IIVq-RSV;SH*%sP8+z{6cmSYVUI7q|9 zN(gFolX>pE6Ir~fo#ccP%?QU{nr)Xmq;ypeOw&>^Uhohu8*_iN6d~y8>WASRt7*XI zO0nThn$6@;VBQ($A_u?~&RbEqRsmt0)M~x~*sqTjjBM50 z>Zf0N>EKZ`mio(k^Kg2y{7^z*W2@nOeWM3I9|NydR6^QEc-{}37~B`0Jp7&K7tWmOEJM-Eck)1yTqS*?aK?EZ9px-m zLnBfQcxTREsj(h;3=a#8E`0wCF^4)QrtwFy1->{cawJE3Wii=0JdWX%Ap8PnBBUK6 z@)Zxu1D11A<~bAxm}R-BnLc6i%}$}LVxBw|xU~CZoRs7zao+(q81WMnQgZOQmsjYg zX9~weHU5q&^Hv7_rWUB0{%SLKV#LtZY-cKJjmN)?3)4iXnW=dzxTwv<9vpqaqSTlt zP|2YZ0mV&F0|f2ANQXP-1L?fw3!=5)wr4~JbvlZz?%ww1F3)~#&LeR*%j=wYHy*!a zA?+NVy{9A-aiN?JMre;LE(KKg(l-J#jqHg(2ck*0<4bQv zv{aY}d?Xb$!`4!lDx6mu3|ho-);@0zz!U3eXX^Cne0HIF>W67Xr}eLX`KNFSdKJgt z`~HkUkCKN^MbJphLxMG>2fSe^BmTwP5r{RHp2}rJlt0(C04A2~*!nPlOXg$I9C}X; zeZ009{OIcCb7AT&j@-9m-)867DUDZc%l?9EYM&6&42~v0G;4(M|$0rlS#k|pN|3!)q_ZE zf1I#yxFwQjKS34ZH*(UWsZBucp-H?KxNo28z|8G@g8{ zwj4f7J)-_we{>ZaIOGzAkAu=`0FTf^`L)G_-bJ_TE}TCQIj&~7Ytrc90N8PL3Vymc z%BIC_k0Jbmy=Lz(Lq5}WZ*UWz&fp7XZw)?g9N9s$X1#bYkfmQdsQ>VVZN?xM9)FGk zDjc%W9%i zMzd9HsD7mZYWEMY?n<5UC$<<=yQ31*^==!ecw0mz6p~h{Qlm(0(%89b4QbTl<1lUS z2NcC)nh^knuy~06Jr-uQL2J~VK4mePnRJm+0Fv7MCUC^FWm5n>eNw6%)j15?B$|ld z!~j|z#Xwx#;B9nYKe0LAq;s>G2d0X_eA|Q7F2t%r`1A3NP#|DKR^PEFn4{wKS@dTh z754`+RIJlroPAZXdYq;Gv`m<{d z0PtFOg@ucN5=z3+n0wgaM>MIV9IO6I+94b#y$9|e9Oe|7(4N7Of4(hmhePP8DkeaH z?gw3fF3$M4`xx#&Sa7~B$>%!l1vUWnaMfxY2WWh7A)T9nP(>R|NnmXeO*348hvo1 zrk2|cFyGvZjwTmFAes1pzhT@ah0nf+v$-+XQH_C*kO#qXys4-U`de7zq7UZ!-99_B)<8@4h=qb` zUPtqHc=;RnZ?qmS5!#;eK08O+!E?3~0#*8dr#G8y+3?jLeVM+wuLf1zT1%lxr+X~saG;J8FFapNB?j?SlnKv@7NNGDO$ToOr1pG% z+2XT|%$FacRr}w3B9nVPq5aUSIY4Wc#&IdLpe2dJH_Gh^pq}s$621aKfduc zCp6+Jh-seUe4!6K!I8g@lRMpc>9EB|&uzw|UQ^0tLv|;ua{*Q5HjdDbdg}TB$Ymg_ zWj;QHaC@Z0?@)IZErI<^*5*fzGxA}#o4UuM8ruAAnl~y&T0~mX< z*wlY30bxa~9Veg}1f?fLT1-?ZLvIb<7Zy)@18>IZS#@0e@z43 zFgg5Fbxpot2xWeR5W5ce_M+`8CV>v89oJulapA z+s&FoW6e4@79{dAPx(Rk0W`DdK{EeR`v*x)VAi~>INM0CVS`?)=w7 z>ybhe4;<_aJ?r^!&A<`~t-cSz`7yk?XweqC46D6}M&)dk(`Yese!k}?Ee~(=Js8gU zHok=I+|sw3SC`ZQ7k7W}efoj9`Tx7`M4FO$wr8Aj()4z{AM8ZU*rQk6+)&QGyg}gj z#$3#QEp^pIj^l1eZ@~ac0I~ zi`e|zAh_;zaqfzH`*h|hJge7Mj2~ont&8NUq=Lo9(=NEt5XpJ&nP2%rc0QY6BhdF~ zvu}KC(WWnrTdHM-RzQxS^+HD8$ z*wrY1mwcL|+4k5?c4X)W;}-Riwwc>^ar=lZVr_OE-w7>}wWQa^Q7sLMv%CQ@4<6Uc^`0}Ip+z92j1k@xoIf|z-S%NBN37whnyAWySqN3iNxvK zwYVh638G=wZ}v<*T%6SxzWCA=QaqKGN$`&{>KQY{|MQc4=mx&}JODrw$|audY-d%O z?6?}g1nUhFaU>l_eU`IVN_C)i=StccjG@fSRqHS5zBwQw;jWsZaLlv3bpzAj=K=Dl z(lsgMNLHeDQ5%;XCrapdz~fYCRtnVjvYheD=X}j^l2-H_+q2*e4X$9SkTY@_BTU4K zCxPvaqN!_UISk}69-(U#$eRf6+^~q1oWAPttm>zvHVj5OoXHtIP4(peY9ob$Z&H%~ zV3lAz3LAfn|`&M(9!ef!=y*icH7{cieQ_9yR^rU)*v1aWP(xL7OH9}m00w^w%8}CyrH=Ck(~Gf2!!A-Z};&$vYUEcMQ$VRe|-g5H#{fuX<4J32SlG!WHBV$ zU%K2wXt`cnTtuyx;g*-6*QE}JMG-qoQyA82d2zD4>V(_b%t^1O$HMxsp}UU@gO|UB zJpoTNY;CuCLe%M%Zq&oQ<^H-8YP|x3@t*vFiEd6aE}s@iZ(cn*tZFlTc!C(Di;F-O zgGx!HF|Xlk zR-XT?MLGeIXwI;mW*xIW5xT7w3$B4+OS~A9wc!_s``0dvTBK)c^UW8hrn|j_CKV}= zBFBK5|DDFu_ zjx#h{Sl!XqGH+yZA61hC^w1irm^AT551=abi8F!o9_ zC>j|(9gILVAAgvgPxCmtnLewmasxqH;_AxuNX=Ek@zqN*;wd2(>VZL?O)*2ecbQLpG0?U(jJ@G>g~7v0+w>G@OBK+}I;cPg@-y<)fy7kZRN zWAKN2&7Pzil!jQzUT$lAR&a09;^iJt?#Iqlr!jC4ZhgoweYW#$M2EeP?(im7F-2IE zLVPoKyhqQ)oUS0?iw1PasK?6c*BsK4*TqzBaOBX;0Kih1-h#whOXc=ZI``e)_8MoM z8lfE=_G>vSg1xD08N>mrtgW~G{Zm#IDnR#p28{kPr|XRUqHO4htDN8WLjfSdG(|VW zvkSIpD^d~!s)v?M7%}vnEs#<%DD@^Gilou}>Ack+caZD`@q^KFoy_k7S(!9!rMUor z|AP@I=DfJ%Bf0;`FS1A@LT#Nk7ip8yifMX~%7Af&Tc*OlISr;%LomsjeMMLvgH4dwaqILG+CFR+U&*6tuAtApsmVvU(W|6A*KNwYbh zZSM3DFkEjV-WJ*7pL?q-Cd7mhF!#eU7Bp7pX356A^YhJ%ncBUGWWG}LL~00o&NvUv z_~jG*r-h@(^v0Lv)`?oIz zYy;BMZ4^c~ThT!_I$bb;smfcV5pSuXtas;{J8q?Zy<#hys&XE`?C{TwZT?8&WE+kT z+ddlCzR{VP$()j61=vv2m?KrJA&oY#k&&qLiBDk%NjFqam0K-sWG@bqqgw6R?);fW z5~5M9XZ(Gby$_Ly_@}Sw1Dk{GN9{AaSiSZ<2=rvD5McKA7A=AGStcaq(B>QQ3Ev5z z;+~4*m3_b!{2!dGD_X2lOb^leYNH7A?4z;)rpi9nQ`VM4H>_jh1r6gih2}-{mR#7e;*uZ6sXf*6+%HZBiSfgqdjla&_02+MW%qwCu0rfkk3(4xJM$HG8vbp>8nBUl zSk=8rkt^5*W#u^J-a`U@AMAF;KwjnScbd5pjR(^bBM8+AJf^}c5@=lW@NcpnhYpbh zX`@>OwTj%?x_`UOvFe3uIq^DaI|9s=D{RyHX)s^mB%@rX`TNUmQ1-#l$;~-08U+6?@-WbG>PSO8jqM1DSFS!g%GBG`xq1-lbIG_nYB96iP|5P{{F)L-K*j!-}|F_ zbql`Sdi2sJGM74+2Uz!G(O6!xhJgPCam&Y%9v2?3Aw_Vk`)1zj-LDk6U9`-pBrIO> z5N+??h4tjQY6fnQSNOP<+N=eZcmnL{bb%sR{zDc$v-YUL+n~3jbot#A7PDrnV z*!J32s|zovZMV;?YXa!ifybB>I!dp<)%c`ycL5#K@H1XFFRZ<*ibQqUEGdwFVs)3^ z(vYH-%IWhx?}W}OnfI$Lz{snz|IlM~T9ezrv;&J#I%N2q@! zU$^ETv&&E2I>p3m*h^NqF-07xtu42Wi*d(luqpP%d@ml#`$63L%$4`kXE(_M1G)No zOMNS8H0gN13GJnHc(Ed&Hr@w-eI3!(V^3=-0N7=zR8W`oXM?+~-wu zmy_*+MT?M3ub-ak)jd4(`eiO?(7s$tIW%v~t-=v7LP&(z9FN(J6nKu|;Fz&If8o&9 zDFzD=}hYSwAl>~G*9A1R1jA$g+a!I64=B?iPL zdO>IbKtSZJ+@Q;-8e@Q;Sy4vxCqz7U;%gtnocKvID-&vKnkHhXz2F@+nCs}SP9r=-=DW2t^&0elIbZG6@kTGs+ zrn~-C397$)70QAgHv3INirJ{s%MU;EOM6T(#zl&Mh$ODc#h{@MpJ^-#Z2SsaI~RmB zsN7_kTVWiqr+68pO*~Us_h+z{xo&GeFA%u$=R#rHi;i0t)E z!EfG3AXBK?4UL6b1KTgWp|c(ZEC+e$XU<^@#l<3?zFCeWz0a9^z8>fN=}X;Ucx!OLAD~E=XKr@^BH1W8tQ0a! zfbGhEAzxgyF{!Vseq3UL8g4_jVnJs_9Y^Dq`Ry5E)~Vp+~YKibKdLN-{Tt#R-S!L@F? z`V`s^``l80N-W*QoZJkW>`_7WlJk%qkE2V*R*%3wy|mr+)p;tHEmG7E)@!Pd@@8zb z_3Oc#JMHa&7gnd3f#uDEVPH2NKE0rht#QR& zDfS;d9i5TGjAd4O7(Yu;mDMMn_W+szVFL8!OyUY*lDMl>^+fbdP2m;%kRm*GMH|hk zz`2Ute74pxem&klNIJh+7K!)*F!yAwr)q&COQ{9ZLYBCcC8~%DiJB|KVG*VxEF{Cv zb~37xep{v;tFM@G-LLKZKi1zx5hz*BkK%m&PR?h`zt@rJg0xtQe2v@>h2*@|^{iWV zU<~0F>ne9C%|_ZAi!Bi!4bgnyOR+|U1tmxam@H28^y;i%F#Xm7=~cD%(xfTwLQ(@& zrJaOvy1s-3zzSuuhk5zfHKKJhDz{3u5yX2zauo)JwyJK`DtZ=Qe8$630f2EdBwvo1 zI`U^*r%6VKvlmv@mPUbmeU}3Bxv>>r#!X|aIju!2HmW%G1azY~agT!YvcR;1>zB?1 zc=-UDuPV*1js&s3X6h6z$`e_)CbwH7m*e-CJ~ZrM&#j3L|E*o&;JTA^HlgBYedzCK z45A3NLsZIn_3xCQxlBe?r-BpY=2P$u3MXjhVO|EXdPJiYV)9uP7b1Hm?2P{Gx5h)>BV02sKako)JC4i zvV}Ghx0AZT%kx}oZs2W!V`3~X(NQ{o>cv(!cmy4+UK*9<+3psTvBZm~Q9?e8h{`Oe za5;uwkgB(rSH|{b_k1pgB%SQN3}!m_LgEitU*7o};#PnWV}`I(ADTz_2`|pRYBYJ0 z>Bwx7We7h471&?AN%!>TU-yJJ4>GfADAzh!L>U=&dx2MxTUOeg-|^wBSH9vo*Ga6Io8~NvmE?@2ZJ90cxyT_WQjU0E& z%l^B?O(a8VgtzSiI;W)&b?K1d36(2R#%sM>_AKTs>g(`%hQl?h$ro5VC=PNuIxnXP&qzM5_Zq2GNq@h z8#cD){3(LL1&6Ht7Lq*7a&x}){7OOW^&{tDIP|!6K^(0RY`J{Zkl{kBFZkO?vL0on zFq|^rHZecZ71$tmix3RpY>5drr=}ZmI64D;(GjRaM1bJmxn#j6eA*-go0Z z`Np~S09J~xHd(yBKXg9y2aLrcC7N%T^ZkAHddLsAIK*S>*X3x_AKu}shg<17c>T+` zC=;8-RcfgZf9(6~n2E$UwGum4J9;sVaWPQ`v#Hq|8V=4-j!n8O3n6&`R^2oGbeV>f zZCn^C*w#tjN?_^;yN-_Bp~A|;pv2QG71i{AnSEL8v)1(2+iRx$#_@Ot zr`(ON%WstwGYzI)%mcS@X>W5B5Oy}1DjiS<^YILJyG8G;Rur-O*BsI?cw>HlA+P#I zq)LbV;VK{d<9WKO9Xv3lQhZ%=?Mb@2c&BV@jTh;Tr#sx<>s3U zSe{mUF^-DBXgkFga{rALWEe|+y;H3Q!jk1~*T#xXn72Cz&YZT}*N(ARxL0%2knQ&{ zSwFL}H!5;{vAjRL`H9-(MyBj84IU2{L05fz%~e9`RmLXcpLrt3;GN4WfZVftXb^am zqX#kk*q9tu4WYub>I zwDgl_dy+VjuwF_?LzVq}?66X+J6ca$w%`-uCyh3U>8{XlBu#@l32Q|0vcU)`gvcRAYy50l!7Qtl&=^|QdhsY_qK6E(kyB2l#gL+ z7nF8dWagi^urNnU1dHR~*j|7d()Lpnp^>yb0b&hVr}tV zzt;AYd?_s(%P}qM$0w@^vFO>w?f9Xn(KYenv=eD$n`Wgv=25dwlDQ0e0LMiaA--Gw z0t)Sgj4CM@P@v&4_Y00gpOoi<%%;OpYIh!M9e%2nhw7AYHvqx}a?=MU-ihOo_kYTg z=iJiS|22E87arhmj_~$!0$oV(?-BcEuXr7C(?sSp%DIqY<~wo{P_Ik2-jrJI=hNBP zE8M6mTB5OPe--P^&-?-Kf}}#R9aO0{r}-heICVO#mSjoK)qi0mZ13wg{(POXs;WA-ol#>_u-`AjY@^R1jPvQ4?^ zlZtQBp`y3DyC3J#=nD4X4N^K7z^(@j2e42Ew{g{<`*Tic#c){B3We4LX#IB|r{!ug zgd+@Q-&t?6#V)mi4%I_y=ZdSN?@jqVIRyxUO7wkqTipK%QEkX!4m7}Y5v>F+6I$c? zb5b66YlZ!9w!(n~zni5?1W1DIx}%TC0gGIZOF4OIIQ@_Zk~>RJMJ#8?aCrU|urC{5 zs(HZ1XNw|q`XS>FqbO+W#1SN<=gq$abTuoAZHz}Kwc12@tDgvMnqBUv$4ra6{XH_m zYFSFaU5LU~=H~us_t{b$&MCd>)6aU8Z>IOmu&Ne&=FYF^!@+Q}bMJ_JSNYJZo4}h! znqu-8z$e?$Kowv5GX-CnT71Nyw(YRgL&pMsR-bgd_b-|2lCg?@t^B$aW1rkhBn28S}Id%g!Nc6%Z zhzSu`nIZ(GGl|a&3eHKIgFj=@tXNLQTRpiLiM_C7(b+~)enSu2X;WT6^+)bvXs_xi zCc}0&c}VIx)CiunQyqB00hQf= z2XmIS`hoM0fpI)u8S=1YzVVZ4{BVMJ7{=q*bIbu2bk4E}{rT8MvBK8-mQOy09A2ni zoW((OMK7W^ujf_+~7ve{&E^3Du-)vNmnc>3fJo{CM_=G3~tsCqzIyz zW`A{gP0$D0Z*jjse-2Ibm!-`+Z{w&MMh6QAB@y(-eJn;4_~y*PQ=%$d1493tBcELE zhghglbj`{`-8wf8;Ii>8BbQX)5}TAHD@cYvS?{)ikmLk#U{yy zy~Er=&0MQjU&B`+ngUAi>o!O1l&F~d_QCpWo;(U~`f%z>)hBHVQpW20d-Si~p)X;! z3vjU`-r0z}=)xHt4$A{~d6(fhhaFJ4B&W|&DcMyHL?Rw$0#{WPHpv@1cMWhfKP}Zz zn!^(1f1&se1LrnlLc{|ZvamsVNEkX?KFOkER) zA)(Cz-}deHx`#mLf3zVQ&zj9P%I8sH$s88a$RV$%3FOoMr@Aq1CRxG)BnSK13Q_h2 z_|PDZuSXN;l5f+!T3{UsPccH_-)o<~Z5^PrGDmA+1JktV7q>&Gf|Cg>YV?&(9~~2( z5^MV5b5^E2xOwa!oLe9t3E&dZBLz1ytmC2A^z?T$b%w+HCi8Po-|XIeu_jmG<_vq( zj{tTZ&t+D;IH6eiT{q_@ApP+Kt8(S~<}B7c#A#>a&*+EV1Wt0=K|Ec}0qid>c==DD z2pLOm%gzLr;}B@ahdeiKUzsYSewz=)gd&4Oo%QD7{I>|n_OxNY13O6C&$5{J=lC-W zagp8(DhO{BHSy|JUlbq$&XbswSx96%<|e&l717B>+D8yM%S|iF)@4_Aj%m`nHKdVX z`NF!VdNy@s&O9Nw@HZ9o}zr;fcBAH5MMBesEbt+p0DZUJ{2orOvzSQ31smx|?|8 zT-NGh!JL}e^O^NPgFruuT#&#K)0b889ji%*~^U>b0v&f9i&Is=%5DJ!Tlw|RISa!SQ*{3iGKDmaW& zh!s4m>=%n2i7UloC8|!RY)RYD;YPx+|9R#2ftV1md0z1B(aGwabc4>A#y=I?r$~aP z!1O9^Qt}c=BjeKF5UXiVbG!a;uAVi+@*xCHR=V4*yHv`4{3wYd+Me(kF^C{EOL83q z+|#v0-6SCnMmR&W->x@>o^gBV|D6ijnnpd}J_{jBpo-cs#-_@7Rl()%wNzB^#VR+xYuX?i) zN@ip(=|?v-gjr~4oM$uPa@O4SV#{pMe*8QX0wFknHS71{Jt@zG+x2{uCjJd6>{0W3 zbgJisyaU0=UY-}FUa9xwk}VL|3GBB-i^~uES>LWG^BKph5h7UXse}v8z>awQ_1j83 zc71*WF>$Szc6NFo^xc1K9QTvN1*>tkZ{U0~kbvYpfe?@X=QW?hr!5*!qkbIWCJtJG=ep9lXHP6|LUJs1T_e)?r1Rr8asrn#M?ws)6Q1$4j#L zY)AcQMwd#yqO^$sepnL&>z6im`njXA+NHsKhA)EBgT_5_KBU)d%_RMw<-@eAE&^Ai z!PX;ncEgatQoJXLfou7J8>)=?Ik!L&AN$uCmkqnRYf4#O?H_yES;`=;4sg zmIP*p`P&Ka}JxT!;+c4k4MBxlMWrLINUZ(0&R9z$vRk~tg?Ctku`yA@_}MNS*4 ziCS^o9>acAgtGy?X8D$LZG|$?2sp0y@z!7vEpjnc%LTX=P#%fa!i+p?D?9|i*(@-=zTL3uu@jo7VnV0`TLLtB>0)Wlv#WJ;J|U(a4EmSytm_lC`U#)jAL zUI|`3sHda8{@EhjF*kCH4?{Hp6#3Y_A8hiL`Vp<2o zD*-IS;r9%K0HCQkf3RgAy?E5f8a26aw%)_}?9BJrY;6Wa>wgPlZAhc5n)C(JPxko^2LC{uhjS zEHxBWu4~8z`O5#q05~5I>o7r4)-Hd)svT97>JqN{m9GsEu4Qi!9FXq=h-|eba5`|n zlEhiE5l7a%n%%?N@dDdKI;&Ni|AB__>CI~(g|VmDmLK?{BOyd?trA&of6;xKvP-D| z&9zu6-EZL=?caIi9@~5>4c6JT@%^F_E=%DRTiK{haWPV47V-o01FOU#iz)0o9uwcxpdkm)jLmX~YL#D(d)Q5~BX0o?ga7EL? z4?s(y{lp=;xNd)C9UkP_@g5e(+23b!l2;BUO`ag}pp=%q*^jQUjvGqS_ote`sr;?Gt+Q*r$!Hc7sAYyz2UuL@qpu+%AB06cIE-<^C3z;!yv|7xaNH1@j>HCxK z=SHoMPsi);zgIi#kmW4JEt0VNbGxi0t9pFaPZQ1!px2MjjfLR3e6h7A5ubo-GM6?# zJlP8mwX6|6zgEYf^1__OpqT_M&L%wU9lG@ShG$oxD9xH&FaC-9RNArjNXwHg+3JNW zv-#h>n04`p&$H&&Cx$A}12F2TvR8;@;%j<0yk!!Z$E33bV{KO|B$VYAK-=@!&5Z&pnLYK`IWJy6UTD4&1#~5|JdO@VzfzkFNCWcLXSp^b6d)TG5XL=IHd%A{QE78E8Mj7zOZRmD@TENTQ6io0fcP?I7z*SJj zoIKs^Y>uqitkVwbih$B_F1Sswr%6a>$OeKSDZ^1STHTyG=A`AEZc4e4x!IZnz8*qB zf4;#;aJ{KRfyPSrxant6etpcc`}zZ>z#+|YOrvPsxFNwG&zovl<%mm)s7_zaU*Poa zoP$+)uB^1ZJu+u_~My7^GOqGf0TE2_&u#Lk6&DQG)!JI=T$TuKuF&_BX!rDV&+%4oe@gFcyKqIG`TZa9D zKFiiac+a_-iP-0!613`0B>Zxu9kbMrWGmfd?n8^}VRV1?&4(qT514QC!#__3HqENq z-FE$E9Z^pM#UIHbWxk)gpZMdf*Uxiz!+ljJ4d?RGU9@90ZKk$s!fNG-fK{?aNHR3B zzQe-Hoc#Tx)2?;iReJr3G4hw4($u9k-w>voS=baIc##zUO27tnF>N19#+L#`{Gse% zohouBcn$GKQGxLNAkXw%WV>`J-m6=gjHm6v-<;gEK?HB_MaIP-9wvJcKcL#!<5pbq z?XrSdG{lKZbw(rR`&e99nY-WP_;~x~OMKEKB0ToFpwlO7LWn~XXG>ghZmIgHa~oi3 zfJC5nG_h2~w$MAeiAjBIoVw2`NF6!9(*4x<9L^pp)bNYArkB~aD$Dx{b{+bBv5=ce z*2EvIy5O{4>!`6(#%YM;Yy0?)Z}Qx|m=(X|E%^w;H|uB|Lnh{d_&$K>n7m@Vs(UP? z5BiVaPAj4~F}wKh-2XkE=6CUwSdv2+ zNZO?ASab|}3s7ApXmH8aoyKK_^rWZ%AOR>utAEg*>r5s0#{NZ1#FCEeR(L#rH+=mP zzjeZ`7wZ+`T1bTTKqKck68GoD>F+d4VJ2L8ApBC9WtS=LOX}JhcC|gpR12uwnxDn% z&FP=wPV8nGuGlxrLCRh8H;5%+_RIpmIfYp|A_4KFpW#%oh8n)p z95B*mt;KO8F!0tcpnbFxrGr3R>ej8WVfPypFh^6R5;2IH*`$_q_2rxSj;kDV3^yeBJzW%a|hJW$R_opV0hqefD7%SqG*`MIK zbf{c>Q3);#G48k=xfqKSos4!jv)Y}OI?HZ3dbED^`R6<$AywOjtcy;*%@m^kRK-D% z6Cf(5{QV zzOv$WZBX92$Mo^dkNGmrjMgZyvRMtIIX`G}$+B~so6e-CH-oOL;ZjR}gBX`r!3|b? z(CI`>K}S+Y(mGt+lKDEn-P4a=_mig3bS`dQ6kTcb(CTpkXdM7-t~z(A{mI$8>&9Pg z&DAB&J+EXqftxVJmi23g$)2t5K$|!S2@r6ZrK=KyoWKV(ge*A&iXub+jz z3eVW8Sqt)t6_Nb>Oi%wOeHo0WafV)Qx3b}Xni}wOUHQlb-&qaz0@IT#g?S5IE*f=l z9qaimtyacdTNjC6i6-rJC@Y4KM&U8cI&%KHKXm!(Z8W4e2tiaAcy;aMYknImSu zZ7~~&(UQY~VP?x6s4`luN9zT3Up+RCR2H75jw>dSrPX)lk2x^Dr)YcMKB)e@c_1^y z9+xt7XxI^cco)BiZi|b5SLw>z0TAgIB*v_uZlS7mV9m!C-@k;OX^6c;+%R8VZ=|tU zee|?(D#gzju_G+|;5b}<2V8vv9o@4VyugKh+N4yGB{?in6_pQ|dPr1*GZ?2Z=iZ|x z+5|`(-f&|teirM>lk0L^wh}n&-yRt;-IcEtXUCOsTaay<5=DEj9)@uKY6k~VQ_Po} z8%;FqaJ=t#<(-1S=aTN~%o4qo2Sh5jIi>#5!9{SnPo_CjUY_xTIIQ}Bz8tCQ0BXVR@{4T?4W5sVAcpwa zF(ijqCvf-#q_lGUjmh2NB6=_bIzZ>R;^mROd<&t*B~kq6nFv@P?5?{@nfu=jkc;i2 zkXPTId*&v3$q0YdqP=eo!IL|E#*+O*wf^oD$~4>;a!RUebt`*cRJ;Dl@r*W=x6BCa{f4>x z4e6`E@LD`v!3`IxWnQ`4{N@D0SrF|XS)bX1^7)(dP?V=FeOwqWd~4i`spv~@nD2CJ zTM#yLf4~TYapLHjtjTPxbk>&yw0=K)-;P?4nyKLXfU&N-osS%Zl9zXJ0IN$nGnTei%ln_P3Kkt0+-joy=SjWJf>H@$l1g$HmClK%A9*{&D6b z+%Pl6!C8kV=|E(70&BDm>DV@A=p+!g^R>g{I;m~0x3@&~qL>|VUszDs;9OMedEOPV zc+HwQalJuBISex5QKU?aPbv(3wF6&3_g}s2TUnV8>sgu+n?`Q^@q*IISzL|sk~x_) zKG5f*a;0kW{B!0M*o2in@4B&OQfp!Ki-S)#}kd3yEssb)|_9Xnr*yp+v(m} zV3Uvp#`kHrArIzt{8vx6kB#ZAb_Y|mn^@%HA7Y?j+wbq!d^ MMm9qTSewO7VGzm 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 z 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 z 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¥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%0A3AU|Ib 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%0DY1FR}XbrZV+vwJdwus1qKESO*o2@H*kM&zJMiV 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�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�Xs*HGv$3=M&eHc`!#NeKi|bq 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

    ^ozqV_o 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 j307ONY1G4*|*U{;(N(UBBCi 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

    % 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
    ExpressionBinder::bindLabelFunction(const Expression& expression) { auto catalog = context->getCatalog(); - auto listType = LogicalType::VAR_LIST(LogicalType::STRING()); + auto listType = LogicalType::LIST(LogicalType::STRING()); expression_vector children; switch (expression.getDataType().getLogicalTypeID()) { case LogicalTypeID::NODE: { diff --git a/src/c_api/data_type.cpp b/src/c_api/data_type.cpp index 67f006e360c..6030fae4c0c 100644 --- a/src/c_api/data_type.cpp +++ b/src/c_api/data_type.cpp @@ -26,7 +26,7 @@ kuzu_logical_type* kuzu_data_type_create( auto extraTypeInfo = num_elements_in_array > 0 ? std::make_unique(std::move(child_type_pty), num_elements_in_array) : - std::make_unique(std::move(child_type_pty)); + std::make_unique(std::move(child_type_pty)); data_type = CAPIHelper::createLogicalType(logicalTypeID, std::move(extraTypeInfo)); } c_data_type->_data_type = data_type; diff --git a/src/common/arrow/arrow_array_scan.cpp b/src/common/arrow/arrow_array_scan.cpp index 93c0bc96ec4..a588ab5f146 100644 --- a/src/common/arrow/arrow_array_scan.cpp +++ b/src/common/arrow/arrow_array_scan.cpp @@ -155,7 +155,7 @@ static void scanArrowArrayFixedBLOB(const ArrowArray* array, ValueVector& output } template -static void scanArrowArrayVarList(const ArrowSchema* schema, const ArrowArray* array, +static void scanArrowArrayList(const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; @@ -177,7 +177,7 @@ static void scanArrowArrayVarList(const ArrowSchema* schema, const ArrowArray* a } template -static void scanArrowArrayVarListView(const ArrowSchema* schema, const ArrowArray* array, +static void scanArrowArrayListView(const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { auto offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; @@ -491,12 +491,12 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* return scanArrowArrayRunEndEncoded( schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'l': - // VAR_LIST - return scanArrowArrayVarList( + // LIST + return scanArrowArrayList( schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'L': - // LONG VAR_LIST - return scanArrowArrayVarList( + // LONG LIST + return scanArrowArrayList( schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'w': // FIXED_LIST @@ -510,7 +510,7 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'm': // MAP - return scanArrowArrayVarList( + return scanArrowArrayList( schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'u': if (arrowType[2] == 'd') { @@ -525,12 +525,12 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* case 'v': switch (arrowType[2]) { case 'l': - return scanArrowArrayVarListView( + return scanArrowArrayListView( schema, array, outputVector, mask, srcOffset, dstOffset, count); case 'L': - return scanArrowArrayVarListView( + return scanArrowArrayListView( schema, array, outputVector, mask, srcOffset, dstOffset, count); - // LONG VAR_LIST VIEW + // LONG LIST VIEW default: KU_UNREACHABLE; } diff --git a/src/common/arrow/arrow_converter.cpp b/src/common/arrow/arrow_converter.cpp index 9b666cdce04..513ae926009 100644 --- a/src/common/arrow/arrow_converter.cpp +++ b/src/common/arrow/arrow_converter.cpp @@ -127,7 +127,7 @@ void ArrowConverter::setArrowFormat( case LogicalTypeID::STRING: { child.format = "u"; } break; - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { child.format = "+l"; child.n_children = 1; rootHolder.nestedChildren.emplace_back(); diff --git a/src/common/arrow/arrow_row_batch.cpp b/src/common/arrow/arrow_row_batch.cpp index 98874ed16a8..bb7280c6d1e 100644 --- a/src/common/arrow/arrow_row_batch.cpp +++ b/src/common/arrow/arrow_row_batch.cpp @@ -48,7 +48,7 @@ void ArrowRowBatch::templateInitializeVector( } template<> -void ArrowRowBatch::templateInitializeVector( +void ArrowRowBatch::templateInitializeVector( ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); KU_ASSERT(typeInfo.childrenTypesInfo.size() == 1); @@ -168,8 +168,8 @@ std::unique_ptr ArrowRowBatch::createVector( case LogicalTypeID::STRING: { templateInitializeVector(result.get(), typeInfo, capacity); } break; - case LogicalTypeID::VAR_LIST: { - templateInitializeVector(result.get(), typeInfo, capacity); + case LogicalTypeID::LIST: { + templateInitializeVector(result.get(), typeInfo, capacity); } break; case LogicalTypeID::ARRAY: { templateInitializeVector(result.get(), typeInfo, capacity); @@ -263,7 +263,7 @@ void ArrowRowBatch::templateCopyNonNullValue( } template<> -void ArrowRowBatch::templateCopyNonNullValue( +void ArrowRowBatch::templateCopyNonNullValue( ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { vector->data.resize((pos + 2) * sizeof(std::uint32_t)); auto offsets = (std::uint32_t*)vector->data.data(); @@ -277,11 +277,11 @@ void ArrowRowBatch::templateCopyNonNullValue( for (auto i = currentNumBytesForChildValidity; i < numBytesForChildValidity; i++) { vector->childData[0]->validity.data()[i] = 0xFF; // Init each value to be valid (as 1). } - // If vector->childData[0] is a VAR_LIST, its data buffer will be resized when we add a new + // If vector->childData[0] is a LIST, its data buffer will be resized when we add a new // value into it // If vector->childData[0] is an ARRAY, its data buffer is supposed to be empty, // so we don't resize it here - if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::VAR_LIST && + if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::LIST && typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::ARRAY) { vector->childData[0]->data.resize( numChildElements * storage::StorageUtils::getDataTypeSize( @@ -305,11 +305,11 @@ void ArrowRowBatch::templateCopyNonNullValue( for (auto i = currentNumBytesForChildValidity; i < numBytesForChildValidity; i++) { vector->childData[0]->validity.data()[i] = 0xFF; // Init each value to be valid (as 1). } - // If vector->childData[0] is a VAR_LIST, its data buffer will be resized when we add a new + // If vector->childData[0] is a LIST, its data buffer will be resized when we add a new // value into it // If vector->childData[0] is an ARRAY, its data buffer is supposed to be empty, // so we don't resize it here - if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::VAR_LIST && + if (typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::LIST && typeInfo.childrenTypesInfo[0]->typeID != LogicalTypeID::ARRAY) { vector->childData[0]->data.resize( numChildElements * storage::StorageUtils::getDataTypeSize( @@ -442,8 +442,8 @@ void ArrowRowBatch::copyNonNullValue( case LogicalTypeID::STRING: { templateCopyNonNullValue(vector, typeInfo, value, pos); } break; - case LogicalTypeID::VAR_LIST: { - templateCopyNonNullValue(vector, typeInfo, value, pos); + case LogicalTypeID::LIST: { + templateCopyNonNullValue(vector, typeInfo, value, pos); } break; case LogicalTypeID::ARRAY: { templateCopyNonNullValue(vector, typeInfo, value, pos); @@ -483,7 +483,7 @@ void ArrowRowBatch::templateCopyNullValue( } template<> -void ArrowRowBatch::templateCopyNullValue( +void ArrowRowBatch::templateCopyNullValue( ArrowVector* vector, std::int64_t pos) { auto offsets = (std::uint32_t*)vector->data.data(); offsets[pos + 1] = offsets[pos]; @@ -568,8 +568,8 @@ void ArrowRowBatch::copyNullValue(ArrowVector* vector, Value* value, std::int64_ case LogicalTypeID::STRING: { templateCopyNullValue(vector, pos); } break; - case LogicalTypeID::VAR_LIST: { - templateCopyNullValue(vector, pos); + case LogicalTypeID::LIST: { + templateCopyNullValue(vector, pos); } break; case LogicalTypeID::ARRAY: { templateCopyNullValue(vector, pos); @@ -639,7 +639,7 @@ ArrowArray* ArrowRowBatch::templateCreateArray( } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( +ArrowArray* ArrowRowBatch::templateCreateArray( ArrowVector& vector, const main::DataTypeInfo& typeInfo) { auto result = createArrayFromVector(vector); vector.childPointers.resize(1); @@ -768,8 +768,8 @@ ArrowArray* ArrowRowBatch::convertVectorToArray( case LogicalTypeID::STRING: { return templateCreateArray(vector, typeInfo); } - case LogicalTypeID::VAR_LIST: { - return templateCreateArray(vector, typeInfo); + case LogicalTypeID::LIST: { + return templateCreateArray(vector, typeInfo); } case LogicalTypeID::ARRAY: { return templateCreateArray(vector, typeInfo); diff --git a/src/common/arrow/arrow_type.cpp b/src/common/arrow/arrow_type.cpp index a530e3c0362..a1e4a692609 100644 --- a/src/common/arrow/arrow_type.cpp +++ b/src/common/arrow/arrow_type.cpp @@ -100,7 +100,7 @@ LogicalType ArrowConverter::fromArrowSchema(const ArrowSchema* schema) { // complex types need a complementary ExtraTypeInfo object case 'l': case 'L': - return *LogicalType::VAR_LIST( + return *LogicalType::LIST( std::make_unique(fromArrowSchema(schema->children[0]))); case 'w': throw RuntimeException("Fixed list is currently WIP."); @@ -129,7 +129,7 @@ LogicalType ArrowConverter::fromArrowSchema(const ArrowSchema* schema) { switch (arrowType[2]) { case 'l': case 'L': - return *LogicalType::VAR_LIST( + return *LogicalType::LIST( std::make_unique(fromArrowSchema(schema->children[0]))); default: KU_UNREACHABLE; diff --git a/src/common/type_utils.cpp b/src/common/type_utils.cpp index bc30e8d2292..5c97be92873 100644 --- a/src/common/type_utils.cpp +++ b/src/common/type_utils.cpp @@ -52,7 +52,7 @@ static std::string entryToString( case LogicalTypeID::INTERNAL_ID: return TypeUtils::toString(*reinterpret_cast(value)); case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: return TypeUtils::toString(*reinterpret_cast(value), valueVector); case LogicalTypeID::MAP: return TypeUtils::toString(*reinterpret_cast(value), valueVector); diff --git a/src/common/types/ku_list.cpp b/src/common/types/ku_list.cpp index f0d530d4d2b..f923339d9b7 100644 --- a/src/common/types/ku_list.cpp +++ b/src/common/types/ku_list.cpp @@ -9,7 +9,7 @@ namespace common { void ku_list_t::set(const uint8_t* values, const LogicalType& dataType) const { memcpy(reinterpret_cast(overflowPtr), values, - size * storage::StorageUtils::getDataTypeSize(*VarListType::getChildType(&dataType))); + size * storage::StorageUtils::getDataTypeSize(*ListType::getChildType(&dataType))); } void ku_list_t::set(const std::vector& parameters, LogicalTypeID childTypeId) { diff --git a/src/common/types/types.cpp b/src/common/types/types.cpp index bb30920ba56..e74732c19d7 100644 --- a/src/common/types/types.cpp +++ b/src/common/types/types.cpp @@ -51,8 +51,8 @@ std::string PhysicalTypeUtils::physicalTypeToString(PhysicalTypeID physicalType) return "STRING"; case PhysicalTypeID::STRUCT: return "STRUCT"; - case PhysicalTypeID::VAR_LIST: - return "VAR_LIST"; + case PhysicalTypeID::LIST: + return "LIST"; case PhysicalTypeID::POINTER: return "POINTER"; default: @@ -96,19 +96,19 @@ uint32_t PhysicalTypeUtils::getFixedTypeSize(PhysicalTypeID physicalType) { } } -bool VarListTypeInfo::operator==(const VarListTypeInfo& other) const { +bool ListTypeInfo::operator==(const ListTypeInfo& other) const { return *childType == *other.childType; } -std::unique_ptr VarListTypeInfo::copy() const { - return std::make_unique(childType->copy()); +std::unique_ptr ListTypeInfo::copy() const { + return std::make_unique(childType->copy()); } -std::unique_ptr VarListTypeInfo::deserialize(Deserializer& deserializer) { - return std::make_unique(LogicalType::deserialize(deserializer)); +std::unique_ptr ListTypeInfo::deserialize(Deserializer& deserializer) { + return std::make_unique(LogicalType::deserialize(deserializer)); } -void VarListTypeInfo::serializeInternal(Serializer& serializer) const { +void ListTypeInfo::serializeInternal(Serializer& serializer) const { childType->serialize(serializer); } @@ -128,7 +128,7 @@ std::unique_ptr ArrayTypeInfo::copy() const { } void ArrayTypeInfo::serializeInternal(Serializer& serializer) const { - VarListTypeInfo::serializeInternal(serializer); + ListTypeInfo::serializeInternal(serializer); serializer.serializeValue(numElements); } @@ -256,7 +256,7 @@ void StructTypeInfo::serializeInternal(Serializer& serializer) const { LogicalType::LogicalType(LogicalTypeID typeID) : typeID{typeID}, extraTypeInfo{nullptr} { physicalType = getPhysicalType(typeID); // Complex types should not use this constructor as they need extra type information - KU_ASSERT(physicalType != PhysicalTypeID::VAR_LIST); + KU_ASSERT(physicalType != PhysicalTypeID::LIST); // Node/Rel types are exempted due to some complex code in bind_graph_pattern.cpp KU_ASSERT(physicalType != PhysicalTypeID::STRUCT || typeID == LogicalTypeID::NODE || typeID == LogicalTypeID::REL || typeID == LogicalTypeID::RECURSIVE_REL); @@ -286,13 +286,13 @@ bool LogicalType::operator==(const LogicalType& other) const { return false; } switch (other.getPhysicalType()) { - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: if (typeID == LogicalTypeID::ARRAY) { return *ku_dynamic_cast(extraTypeInfo.get()) == *ku_dynamic_cast(other.extraTypeInfo.get()); } else { - return *ku_dynamic_cast(extraTypeInfo.get()) == - *ku_dynamic_cast(other.extraTypeInfo.get()); + return *ku_dynamic_cast(extraTypeInfo.get()) == + *ku_dynamic_cast(other.extraTypeInfo.get()); } case PhysicalTypeID::STRUCT: return *ku_dynamic_cast(extraTypeInfo.get()) == @@ -310,14 +310,13 @@ std::string LogicalType::toString() const { switch (typeID) { case LogicalTypeID::MAP: { auto structType = - ku_dynamic_cast(extraTypeInfo.get())->getChildType(); + ku_dynamic_cast(extraTypeInfo.get())->getChildType(); auto fieldTypes = StructType::getFieldTypes(structType); return "MAP(" + fieldTypes[0]->toString() + ": " + fieldTypes[1]->toString() + ")"; } - case LogicalTypeID::VAR_LIST: { - auto varListTypeInfo = - ku_dynamic_cast(extraTypeInfo.get()); - return varListTypeInfo->getChildType()->toString() + "[]"; + case LogicalTypeID::LIST: { + auto listTypeInfo = ku_dynamic_cast(extraTypeInfo.get()); + return listTypeInfo->getChildType()->toString() + "[]"; } case LogicalTypeID::ARRAY: { auto arrayTypeInfo = ku_dynamic_cast(extraTypeInfo.get()); @@ -389,7 +388,7 @@ void LogicalType::serialize(Serializer& serializer) const { serializer.serializeValue(typeID); serializer.serializeValue(physicalType); switch (physicalType) { - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::STRUCT: extraTypeInfo->serialize(serializer); default: @@ -404,11 +403,11 @@ std::unique_ptr LogicalType::deserialize(Deserializer& deserializer deserializer.deserializeValue(physicalType); std::unique_ptr extraTypeInfo; switch (physicalType) { - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { if (typeID == LogicalTypeID::ARRAY) { extraTypeInfo = ArrayTypeInfo::deserialize(deserializer); } else { - extraTypeInfo = VarListTypeInfo::deserialize(deserializer); + extraTypeInfo = ListTypeInfo::deserialize(deserializer); } } break; case PhysicalTypeID::STRUCT: { @@ -519,8 +518,8 @@ PhysicalTypeID LogicalType::getPhysicalType(LogicalTypeID typeID) { } break; case LogicalTypeID::ARRAY: case LogicalTypeID::MAP: - case LogicalTypeID::VAR_LIST: { - return PhysicalTypeID::VAR_LIST; + case LogicalTypeID::LIST: { + return PhysicalTypeID::LIST; } break; case LogicalTypeID::NODE: case LogicalTypeID::REL: @@ -543,7 +542,7 @@ LogicalType LogicalTypeUtils::dataTypeFromString(const std::string& dataTypeStri auto trimmedStr = StringUtils::ltrim(StringUtils::rtrim(dataTypeString)); auto upperDataTypeString = StringUtils::getUpper(trimmedStr); if (upperDataTypeString.ends_with("[]")) { - dataType = *parseVarListType(trimmedStr); + dataType = *parseListType(trimmedStr); } else if (upperDataTypeString.ends_with("]")) { dataType = *parseArrayType(trimmedStr); } else if (upperDataTypeString.starts_with("STRUCT")) { @@ -671,8 +670,8 @@ std::string LogicalTypeUtils::toString(LogicalTypeID dataTypeID) { return "UUID"; case LogicalTypeID::STRING: return "STRING"; - case LogicalTypeID::VAR_LIST: - return "VAR_LIST"; + case LogicalTypeID::LIST: + return "LIST"; case LogicalTypeID::ARRAY: return "ARRAY"; case LogicalTypeID::STRUCT: @@ -722,7 +721,7 @@ uint32_t LogicalTypeUtils::getRowLayoutSize(const LogicalType& type) { case PhysicalTypeID::STRING: { return sizeof(ku_string_t); } - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { return sizeof(ku_list_t); } case PhysicalTypeID::STRUCT: { @@ -766,7 +765,7 @@ bool LogicalTypeUtils::isNested(const LogicalType& dataType) { bool LogicalTypeUtils::isNested(kuzu::common::LogicalTypeID logicalTypeID) { switch (logicalTypeID) { case LogicalTypeID::STRUCT: - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: case LogicalTypeID::UNION: case LogicalTypeID::MAP: @@ -809,7 +808,7 @@ std::vector LogicalTypeUtils::getAllValidLogicTypes() { LogicalTypeID::INT128, LogicalTypeID::DOUBLE, LogicalTypeID::STRING, LogicalTypeID::BLOB, LogicalTypeID::UUID, LogicalTypeID::DATE, LogicalTypeID::TIMESTAMP, LogicalTypeID::TIMESTAMP_NS, LogicalTypeID::TIMESTAMP_MS, LogicalTypeID::TIMESTAMP_SEC, - LogicalTypeID::TIMESTAMP_TZ, LogicalTypeID::INTERVAL, LogicalTypeID::VAR_LIST, + LogicalTypeID::TIMESTAMP_TZ, LogicalTypeID::INTERVAL, LogicalTypeID::LIST, LogicalTypeID::ARRAY, LogicalTypeID::MAP, LogicalTypeID::FLOAT, LogicalTypeID::SERIAL, LogicalTypeID::NODE, LogicalTypeID::REL, LogicalTypeID::STRUCT, LogicalTypeID::UNION, LogicalTypeID::RDF_VARIANT}; @@ -846,8 +845,8 @@ std::vector LogicalTypeUtils::parseStructFields(const std::string& return structFieldsStr; } -std::unique_ptr LogicalTypeUtils::parseVarListType(const std::string& trimmedStr) { - return LogicalType::VAR_LIST(dataTypeFromString(trimmedStr.substr(0, trimmedStr.size() - 2))); +std::unique_ptr LogicalTypeUtils::parseListType(const std::string& trimmedStr) { + return LogicalType::LIST(dataTypeFromString(trimmedStr.substr(0, trimmedStr.size() - 2))); } std::unique_ptr LogicalTypeUtils::parseArrayType(const std::string& trimmedStr) { @@ -938,9 +937,9 @@ std::unique_ptr LogicalType::UNION(std::vector&& field new LogicalType(LogicalTypeID::UNION, std::make_unique(std::move(fields)))); } -std::unique_ptr LogicalType::VAR_LIST(std::unique_ptr childType) { - return std::unique_ptr(new LogicalType( - LogicalTypeID::VAR_LIST, std::make_unique(std::move(childType)))); +std::unique_ptr LogicalType::LIST(std::unique_ptr childType) { + return std::unique_ptr( + new LogicalType(LogicalTypeID::LIST, std::make_unique(std::move(childType)))); } std::unique_ptr LogicalType::MAP( @@ -950,7 +949,7 @@ std::unique_ptr LogicalType::MAP( structFields.emplace_back(InternalKeyword::MAP_VALUE, std::move(valueType)); auto mapStructType = LogicalType::STRUCT(std::move(structFields)); return std::unique_ptr(new LogicalType( - LogicalTypeID::MAP, std::make_unique(std::move(mapStructType)))); + LogicalTypeID::MAP, std::make_unique(std::move(mapStructType)))); } std::unique_ptr LogicalType::ARRAY( diff --git a/src/common/types/value/value.cpp b/src/common/types/value/value.cpp index b56cdcb1d66..8911e70b63f 100644 --- a/src/common/types/value/value.cpp +++ b/src/common/types/value/value.cpp @@ -107,7 +107,7 @@ Value Value::createDefaultValue(const LogicalType& dataType) { return Value(dataType.copy(), std::move(children)); } case LogicalTypeID::MAP: - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { return Value(dataType.copy(), std::vector>{}); } case LogicalTypeID::UNION: { @@ -330,11 +330,11 @@ void Value::copyValueFrom(const uint8_t* value) { strVal = ((ku_string_t*)value)->getAsString(); } break; case LogicalTypeID::MAP: - case LogicalTypeID::VAR_LIST: { - copyFromVarList(*(ku_list_t*)value, *VarListType::getChildType(dataType.get())); + case LogicalTypeID::LIST: { + copyFromList(*(ku_list_t*)value, *ListType::getChildType(dataType.get())); } break; case LogicalTypeID::ARRAY: { - copyFromVarList(*(ku_list_t*)value, *ArrayType::getChildType(dataType.get())); + copyFromList(*(ku_list_t*)value, *ArrayType::getChildType(dataType.get())); } break; case LogicalTypeID::UNION: { copyFromUnion(value); @@ -407,7 +407,7 @@ void Value::copyValueFrom(const Value& other) { case PhysicalTypeID::STRING: { strVal = other.strVal; } break; - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::STRUCT: { for (auto& child : other.children) { children.push_back(child->copy()); @@ -480,7 +480,7 @@ std::string Value::toString() const { case LogicalTypeID::MAP: { return mapToString(); } - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: { return listToString(); } @@ -512,7 +512,7 @@ Value::Value(const LogicalType& dataType_) : isNull_{true} { dataType = dataType_.copy(); } -void Value::copyFromVarList(ku_list_t& list, const LogicalType& childType) { +void Value::copyFromList(ku_list_t& list, const LogicalType& childType) { if (list.size > children.size()) { children.reserve(list.size); for (auto i = children.size(); i < list.size; ++i) { @@ -624,7 +624,7 @@ void Value::serialize(Serializer& serializer) const { case PhysicalTypeID::STRING: { serializer.serializeValue(strVal); } break; - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::STRUCT: { for (auto i = 0u; i < childrenSize; ++i) { children[i]->serialize(serializer); @@ -688,7 +688,7 @@ std::unique_ptr Value::deserialize(Deserializer& deserializer) { case PhysicalTypeID::STRING: { deserializer.deserializeValue(val->strVal); } break; - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::STRUCT: { deserializer.deserializeVectorOfPtrs(val->children); } break; diff --git a/src/common/vector/auxiliary_buffer.cpp b/src/common/vector/auxiliary_buffer.cpp index a31d6f3ca1e..1ce635623a4 100644 --- a/src/common/vector/auxiliary_buffer.cpp +++ b/src/common/vector/auxiliary_buffer.cpp @@ -79,9 +79,8 @@ std::unique_ptr AuxiliaryBufferFactory::getAuxiliaryBuffer( return std::make_unique(memoryManager); case PhysicalTypeID::STRUCT: return std::make_unique(type, memoryManager); - case PhysicalTypeID::VAR_LIST: - return std::make_unique( - *VarListType::getChildType(&type), memoryManager); + case PhysicalTypeID::LIST: + return std::make_unique(*ListType::getChildType(&type), memoryManager); default: return nullptr; } diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index 9b69223dc35..0e45a3c1cf1 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -74,7 +74,7 @@ void ValueVector::copyFromRowData(uint32_t pos, const uint8_t* rowData) { case PhysicalTypeID::STRUCT: { StructVector::copyFromRowData(this, pos, rowData); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { ListVector::copyFromRowData(this, pos, rowData); } break; case PhysicalTypeID::STRING: { @@ -93,7 +93,7 @@ void ValueVector::copyToRowData( case PhysicalTypeID::STRUCT: { StructVector::copyToRowData(this, pos, rowData, rowOverflowBuffer); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { ListVector::copyToRowData(this, pos, rowData, rowOverflowBuffer); } break; case PhysicalTypeID::STRING: { @@ -113,7 +113,7 @@ void ValueVector::copyFromVectorData( case PhysicalTypeID::STRUCT: { StructVector::copyFromVectorData(this, dstData, srcVector, srcVectorData); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { ListVector::copyFromVectorData(this, dstData, srcVector, srcVectorData); } break; case PhysicalTypeID::STRING: { @@ -185,7 +185,7 @@ void ValueVector::copyFromValue(uint64_t pos, const Value& value) { StringVector::addString( this, *(ku_string_t*)dstValue, value.strVal.data(), value.strVal.length()); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { auto listEntry = reinterpret_cast(dstValue); auto numValues = NestedVal::getChildrenSize(&value); *listEntry = ListVector::addList(this, numValues); @@ -259,7 +259,7 @@ std::unique_ptr ValueVector::getAsValue(uint64_t pos) const { case PhysicalTypeID::STRING: { value->strVal = getValue(pos).getAsString(); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { auto dataVector = ListVector::getDataVector(this); auto listEntry = getValue(pos); std::vector> children; @@ -294,7 +294,7 @@ void ValueVector::resetAuxiliaryBuffer() { ->resetOverflowBuffer(); return; } - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { auto listAuxiliaryBuffer = ku_dynamic_cast(auxiliaryBuffer.get()); listAuxiliaryBuffer->resetSize(); @@ -322,7 +322,7 @@ uint32_t ValueVector::getDataTypeSize(const LogicalType& type) { case PhysicalTypeID::STRUCT: { return sizeof(struct_entry_t); } - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { return sizeof(list_entry_t); } default: { @@ -504,7 +504,7 @@ void StringVector::copyToRowData(const ValueVector* vector, uint32_t pos, uint8_ } void ListVector::copyFromRowData(ValueVector* vector, uint32_t pos, const uint8_t* rowData) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); auto& srcKuList = *(ku_list_t*)rowData; auto srcNullBytes = reinterpret_cast(srcKuList.overflowPtr); auto srcListValues = srcNullBytes + NullBuffer::getNumBytesForNullValues(srcKuList.size); diff --git a/src/function/aggregate/collect.cpp b/src/function/aggregate/collect.cpp index d08295d0b26..c24b7a5e1a0 100644 --- a/src/function/aggregate/collect.cpp +++ b/src/function/aggregate/collect.cpp @@ -81,7 +81,7 @@ std::unique_ptr CollectFunction::bindFunc( KU_ASSERT(arguments.size() == 1); auto aggFuncDefinition = reinterpret_cast(definition); aggFuncDefinition->parameterTypeIDs[0] = arguments[0]->dataType.getLogicalTypeID(); - auto returnType = LogicalType::VAR_LIST(std::make_unique(arguments[0]->dataType)); + auto returnType = LogicalType::LIST(std::make_unique(arguments[0]->dataType)); return std::make_unique(std::move(returnType)); } @@ -89,7 +89,7 @@ function_set CollectFunction::getFunctionSet() { function_set result; for (auto isDistinct : std::vector{true, false}) { result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, initialize, + std::vector{LogicalTypeID::ANY}, LogicalTypeID::LIST, initialize, updateAll, updatePos, combine, finalize, isDistinct, bindFunc)); } return result; diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index ad9ed317172..a86c22a30fb 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -160,7 +160,7 @@ uint32_t BuiltInFunctionsUtils::getTargetTypeCost(LogicalTypeID typeID) { case LogicalTypeID::STRUCT: case LogicalTypeID::MAP: case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::UNION: return 160; case LogicalTypeID::RDF_VARIANT: @@ -354,7 +354,7 @@ uint32_t BuiltInFunctionsUtils::castFromString(LogicalTypeID inputTypeID) { uint32_t BuiltInFunctionsUtils::castFromRDFVariant(LogicalTypeID inputTypeID) { switch (inputTypeID) { case LogicalTypeID::STRUCT: - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: case LogicalTypeID::UNION: case LogicalTypeID::MAP: diff --git a/src/function/cast/cast_array.cpp b/src/function/cast/cast_array.cpp index 207b58099c0..7d2da8da739 100644 --- a/src/function/cast/cast_array.cpp +++ b/src/function/cast/cast_array.cpp @@ -9,8 +9,8 @@ namespace function { bool CastArrayHelper::checkCompatibleNestedTypes( LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { switch (sourceTypeID) { - case LogicalTypeID::VAR_LIST: { - if (targetTypeID == LogicalTypeID::ARRAY || targetTypeID == LogicalTypeID::VAR_LIST) { + case LogicalTypeID::LIST: { + if (targetTypeID == LogicalTypeID::ARRAY || targetTypeID == LogicalTypeID::LIST) { return true; } } @@ -21,7 +21,7 @@ bool CastArrayHelper::checkCompatibleNestedTypes( } } case LogicalTypeID::ARRAY: { - if (targetTypeID == LogicalTypeID::VAR_LIST || targetTypeID == LogicalTypeID::ARRAY) { + if (targetTypeID == LogicalTypeID::LIST || targetTypeID == LogicalTypeID::ARRAY) { return true; } } @@ -32,7 +32,7 @@ bool CastArrayHelper::checkCompatibleNestedTypes( } bool CastArrayHelper::containsListToArray(const LogicalType* srcType, const LogicalType* dstType) { - if ((srcType->getLogicalTypeID() == LogicalTypeID::VAR_LIST || + if ((srcType->getLogicalTypeID() == LogicalTypeID::LIST || srcType->getLogicalTypeID() == LogicalTypeID::ARRAY) && dstType->getLogicalTypeID() == LogicalTypeID::ARRAY) { return true; @@ -40,13 +40,13 @@ bool CastArrayHelper::containsListToArray(const LogicalType* srcType, const Logi if (checkCompatibleNestedTypes(srcType->getLogicalTypeID(), dstType->getLogicalTypeID())) { switch (srcType->getPhysicalType()) { - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { auto srcChildType = (srcType->getLogicalTypeID() == LogicalTypeID::ARRAY) ? ArrayType::getChildType(srcType) : - VarListType::getChildType(srcType); + ListType::getChildType(srcType); auto dstChildType = (dstType->getLogicalTypeID() == LogicalTypeID::ARRAY) ? ArrayType::getChildType(dstType) : - VarListType::getChildType(dstType); + ListType::getChildType(dstType); return containsListToArray(srcChildType, dstChildType); } case PhysicalTypeID::STRUCT: { @@ -79,8 +79,8 @@ void CastArrayHelper::validateListEntry( auto inputType = inputVector->dataType; switch (resultType->getPhysicalType()) { - case PhysicalTypeID::VAR_LIST: { - if (inputType.getPhysicalType() == PhysicalTypeID::VAR_LIST) { + case PhysicalTypeID::LIST: { + if (inputType.getPhysicalType() == PhysicalTypeID::LIST) { if (inputType.getLogicalTypeID() == LogicalTypeID::ARRAY && resultType->getLogicalTypeID() == LogicalTypeID::ARRAY) { if (ArrayType::getNumElements(&inputType) != @@ -90,22 +90,22 @@ void CastArrayHelper::validateListEntry( inputType.toString(), resultType->toString())); } } - if (inputType.getLogicalTypeID() == LogicalTypeID::VAR_LIST && + if (inputType.getLogicalTypeID() == LogicalTypeID::LIST && resultType->getLogicalTypeID() == LogicalTypeID::ARRAY) { auto listEntry = inputVector->getValue(pos); if (listEntry.size != ArrayType::getNumElements(resultType)) { - throw ConversionException{stringFormat( - "Unsupported casting VAR_LIST with incorrect list entry to ARRAY. " - "Expected: {}, Actual: {}.", - ArrayType::getNumElements(resultType), - inputVector->getValue(pos).size)}; + throw ConversionException{ + stringFormat("Unsupported casting LIST with incorrect list entry to ARRAY. " + "Expected: {}, Actual: {}.", + ArrayType::getNumElements(resultType), + inputVector->getValue(pos).size)}; } } auto listEntry = inputVector->getValue(pos); auto inputChildVector = ListVector::getDataVector(inputVector); auto resultChildType = (resultType->getLogicalTypeID() == LogicalTypeID::ARRAY) ? ArrayType::getChildType(resultType) : - VarListType::getChildType(resultType); + ListType::getChildType(resultType); for (auto i = listEntry.offset; i < listEntry.offset + listEntry.size; i++) { validateListEntry(inputChildVector, resultChildType, i); } diff --git a/src/function/cast_from_string_functions.cpp b/src/function/cast_from_string_functions.cpp index 522309b48c6..6d16df66ecc 100644 --- a/src/function/cast_from_string_functions.cpp +++ b/src/function/cast_from_string_functions.cpp @@ -252,7 +252,7 @@ static bool isNull(std::string_view& str) { return false; } -// ---------------------- cast String to Varlist Helper ------------------------------ // +// ---------------------- cast String to List Helper ------------------------------ // struct CountPartOperation { uint64_t count = 0; @@ -883,7 +883,7 @@ void CastString::copyStringToVector( CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { list_entry_t val; CastStringHelper::cast(strVal.data(), strVal.length(), val, vector, vectorPos, option); } break; diff --git a/src/function/comparison_functions.cpp b/src/function/comparison_functions.cpp index 304a7e899e8..c845320bfd4 100644 --- a/src/function/comparison_functions.cpp +++ b/src/function/comparison_functions.cpp @@ -86,7 +86,7 @@ static void executeNestedOperation(uint8_t& result, ValueVector* leftVector, rightVector->getValue(rightPos), result, nullptr /* left */, nullptr /* right */); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { OP::operation(leftVector->getValue(leftPos), rightVector->getValue(rightPos), result, leftVector, rightVector); } break; diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index 03e3d44b73b..ca1b4ff8604 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -3,10 +3,10 @@ #include "function/table/bind_input.h" #include "function/table/call_functions.h" #include "storage/storage_manager.h" +#include "storage/store/list_column.h" #include "storage/store/node_table.h" #include "storage/store/string_column.h" #include "storage/store/struct_column.h" -#include "storage/store/var_list_column.h" using namespace kuzu::common; using namespace kuzu::catalog; @@ -85,9 +85,9 @@ struct StorageInfoSharedState final : public CallFuncSharedState { result.push_back(dictionary.getDataColumn()); result.push_back(dictionary.getOffsetColumn()); } break; - case PhysicalTypeID::VAR_LIST: { - auto varListColumn = ku_dynamic_cast(column); - result.push_back(varListColumn->getDataColumn()); + case PhysicalTypeID::LIST: { + auto listColumn = ku_dynamic_cast(column); + result.push_back(listColumn->getDataColumn()); } break; default: { // DO NOTHING. diff --git a/src/function/vector_arithmetic_functions.cpp b/src/function/vector_arithmetic_functions.cpp index c90e614c96f..d7d824e66dc 100644 --- a/src/function/vector_arithmetic_functions.cpp +++ b/src/function/vector_arithmetic_functions.cpp @@ -147,8 +147,7 @@ function_set AddFunction::getFunctionSet() { } // list + list -> list result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, - LogicalTypeID::VAR_LIST, + std::vector{LogicalTypeID::LIST, LogicalTypeID::LIST}, LogicalTypeID::LIST, ScalarFunction::BinaryExecListStructFunction, nullptr, ListConcatFunction::bindFunc, false /* isVarlength*/)); diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index 17871fab5df..793527bbd63 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -21,8 +21,8 @@ static void resolveNestedVector(std::shared_ptr inputVector, ValueV auto inputType = &inputVector->dataType; auto resultType = &resultVector->dataType; while (true) { - if (inputType->getPhysicalType() == PhysicalTypeID::VAR_LIST && - resultType->getPhysicalType() == PhysicalTypeID::VAR_LIST) { + if (inputType->getPhysicalType() == PhysicalTypeID::LIST && + resultType->getPhysicalType() == PhysicalTypeID::LIST) { // copy data and nullmask from input memcpy(resultVector->getData(), inputVector->getData(), numOfEntries * resultVector->getNumBytesPerValue()); @@ -100,8 +100,8 @@ static void nestedTypesCastExecFunction( bool CastFunction::hasImplicitCast(const LogicalType& srcType, const LogicalType& dstType) { // TODO(Jiamin): should remove after support list implicit cast - if (srcType.getLogicalTypeID() == LogicalTypeID::VAR_LIST && - dstType.getLogicalTypeID() == LogicalTypeID::VAR_LIST) { + if (srcType.getLogicalTypeID() == LogicalTypeID::LIST && + dstType.getLogicalTypeID() == LogicalTypeID::LIST) { return false; } if (BuiltInFunctionsUtils::getCastCost( @@ -211,7 +211,7 @@ static std::unique_ptr bindCastFromStringFunction( ScalarFunction::UnaryCastStringExecFunction; } break; case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { execFunc = ScalarFunction::UnaryCastStringExecFunction; } break; @@ -404,7 +404,7 @@ static std::unique_ptr bindCastToStringFunction( ScalarFunction::UnaryCastExecFunction; } break; case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { func = ScalarFunction::UnaryCastExecFunction; } break; @@ -570,7 +570,7 @@ template static std::unique_ptr bindCastBetweenNested( const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { switch (sourceTypeID) { - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::MAP: case LogicalTypeID::STRUCT: case LogicalTypeID::ARRAY: { @@ -700,7 +700,7 @@ std::unique_ptr CastFunction::bindCastFunction( return bindCastToTimestampFunction( functionName, sourceTypeID, targetTypeID); } - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: case LogicalTypeID::MAP: case LogicalTypeID::STRUCT: { diff --git a/src/function/vector_hash_functions.cpp b/src/function/vector_hash_functions.cpp index f619690184d..b4167363c86 100644 --- a/src/function/vector_hash_functions.cpp +++ b/src/function/vector_hash_functions.cpp @@ -8,7 +8,7 @@ namespace kuzu { namespace function { static std::unique_ptr computeDataVecHash(ValueVector* operand) { - auto hashVector = std::make_unique(*LogicalType::VAR_LIST(LogicalType::HASH())); + auto hashVector = std::make_unique(*LogicalType::LIST(LogicalType::HASH())); auto numValuesInDataVec = ListVector::getDataVectorSize(operand); ListVector::resizeDataVector(hashVector.get(), numValuesInDataVec); auto selectionState = std::make_shared(); @@ -127,7 +127,7 @@ void VectorHashFunction::computeHash(ValueVector* operand, ValueVector* result) case PhysicalTypeID::STRUCT: { computeStructVecHash(operand, result); } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { computeListVectorHash(operand, result); } break; // LCOV_EXCL_START diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index ae384a65777..daf554432e5 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -92,7 +92,7 @@ static scalar_func_exec_t getBinaryListExecFuncSwitchRight(const LogicalType& ri execFunc = ScalarFunction::BinaryExecListStructFunction; } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { execFunc = ScalarFunction::BinaryExecListStructFunction; } break; @@ -165,7 +165,7 @@ template static std::unique_ptr bindFuncListAggr( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); - auto resultType = VarListType::getChildType(&arguments[0]->dataType); + auto resultType = ListType::getChildType(&arguments[0]->dataType); switch (resultType->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { @@ -257,7 +257,7 @@ static LogicalType getValidLogicalType(const binder::expression_vector& expressi static std::unique_ptr ListCreationBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { - auto resultType = LogicalType::VAR_LIST(ListCreationFunction::getChildType(arguments).copy()); + auto resultType = LogicalType::LIST(ListCreationFunction::getChildType(arguments).copy()); return std::make_unique(std::move(resultType)); } @@ -286,17 +286,17 @@ LogicalType ListCreationFunction::getChildType(const binder::expression_vector& function_set ListCreationFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - ListCreationBindFunc, true /* isVarLength */)); + result.push_back( + std::make_unique(name, std::vector{LogicalTypeID::ANY}, + LogicalTypeID::LIST, execFunc, nullptr, ListCreationBindFunc, true /* isVarLength */)); return result; } static std::unique_ptr ListRangeBindFunc( const binder::expression_vector& arguments, Function* /*function*/) { KU_ASSERT(arguments[0]->dataType == arguments[1]->dataType); - auto resultType = LogicalType::VAR_LIST( - std::make_unique(arguments[0]->dataType.getLogicalTypeID())); + auto resultType = + LogicalType::LIST(std::make_unique(arguments[0]->dataType.getLogicalTypeID())); return std::make_unique(std::move(resultType)); } @@ -305,12 +305,12 @@ function_set ListRangeFunction::getFunctionSet() { for (auto typeID : LogicalTypeUtils::getIntegerLogicalTypeIDs()) { // start, end result.push_back(std::make_unique(name, - std::vector{typeID, typeID}, LogicalTypeID::VAR_LIST, + std::vector{typeID, typeID}, LogicalTypeID::LIST, getBinaryListExecFuncSwitchAll(LogicalType{typeID}), nullptr, ListRangeBindFunc, false)); // start, end, step result.push_back(std::make_unique(name, - std::vector{typeID, typeID, typeID}, LogicalTypeID::VAR_LIST, + std::vector{typeID, typeID, typeID}, LogicalTypeID::LIST, getTernaryListExecFuncSwitchAll(LogicalType{typeID}), nullptr, ListRangeBindFunc, false)); } @@ -320,7 +320,7 @@ function_set ListRangeFunction::getFunctionSet() { function_set SizeFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, + std::vector{LogicalTypeID::LIST}, LogicalTypeID::INT64, ScalarFunction::UnaryExecFunction, true /* isVarlength*/)); result.push_back(std::make_unique(alias, std::vector{LogicalTypeID::MAP}, LogicalTypeID::INT64, @@ -341,7 +341,7 @@ static void BinaryExecListExtractFunction(const std::vector ListExtractBindFunc( const binder::expression_vector& arguments, Function* function) { - auto resultType = VarListType::getChildType(&arguments[0]->dataType); + auto resultType = ListType::getChildType(&arguments[0]->dataType); auto scalarFunction = ku_dynamic_cast(function); switch (resultType->getPhysicalType()) { case PhysicalTypeID::BOOL: { @@ -400,7 +400,7 @@ static std::unique_ptr ListExtractBindFunc( scalarFunction->execFunc = BinaryExecListExtractFunction; } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { scalarFunction->execFunc = BinaryExecListExtractFunction; } break; @@ -422,8 +422,8 @@ static std::unique_ptr ListExtractBindFunc( function_set ListExtractFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::INT64}, - LogicalTypeID::ANY, nullptr, nullptr, ListExtractBindFunc, false /* isVarlength*/)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::INT64}, LogicalTypeID::ANY, + nullptr, nullptr, ListExtractBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64}, LogicalTypeID::STRING, @@ -449,14 +449,14 @@ function_set ListConcatFunction::getFunctionSet() { auto execFunc = ScalarFunction::BinaryExecListStructFunction; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, - LogicalTypeID::VAR_LIST, execFunc, nullptr, bindFunc, false /* isVarlength*/)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::LIST}, LogicalTypeID::LIST, + execFunc, nullptr, bindFunc, false /* isVarlength*/)); return result; } static std::unique_ptr ListAppendBindFunc( const binder::expression_vector& arguments, Function* function) { - if (*VarListType::getChildType(&arguments[0]->dataType) != arguments[1]->getDataType()) { + if (*ListType::getChildType(&arguments[0]->dataType) != arguments[1]->getDataType()) { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( ListAppendFunction::name, arguments[0]->getDataType(), arguments[1]->getDataType())); } @@ -470,15 +470,15 @@ static std::unique_ptr ListAppendBindFunc( function_set ListAppendFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListAppendBindFunc, false /* isVarlength*/)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::ANY}, LogicalTypeID::LIST, + nullptr, nullptr, ListAppendBindFunc, false /* isVarlength*/)); return result; } static std::unique_ptr ListPrependBindFunc( const binder::expression_vector& arguments, Function* function) { if (arguments[0]->getDataType().getLogicalTypeID() != LogicalTypeID::ANY && - arguments[1]->dataType != *VarListType::getChildType(&arguments[0]->dataType)) { + arguments[1]->dataType != *ListType::getChildType(&arguments[0]->dataType)) { throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( ListPrependFunction::name, arguments[0]->getDataType(), arguments[1]->getDataType())); } @@ -492,8 +492,8 @@ static std::unique_ptr ListPrependBindFunc( function_set ListPrependFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListPrependBindFunc, false /* isVarlength */)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::ANY}, LogicalTypeID::LIST, + nullptr, nullptr, ListPrependBindFunc, false /* isVarlength */)); return result; } @@ -508,8 +508,8 @@ static std::unique_ptr ListPositionBindFunc( function_set ListPositionFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::INT64, nullptr, nullptr, ListPositionBindFunc, false /* isVarlength */)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::ANY}, LogicalTypeID::INT64, + nullptr, nullptr, ListPositionBindFunc, false /* isVarlength */)); return result; } @@ -524,8 +524,8 @@ static std::unique_ptr ListContainsBindFunc( function_set ListContainsFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::ANY}, - LogicalTypeID::BOOL, nullptr, nullptr, ListContainsBindFunc, false /* isVarlength */)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::ANY}, LogicalTypeID::BOOL, + nullptr, nullptr, ListContainsBindFunc, false /* isVarlength */)); return result; } @@ -537,9 +537,8 @@ static std::unique_ptr ListSliceBindFunc( function_set ListSliceFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{ - LogicalTypeID::VAR_LIST, LogicalTypeID::INT64, LogicalTypeID::INT64}, - LogicalTypeID::VAR_LIST, + std::vector{LogicalTypeID::LIST, LogicalTypeID::INT64, LogicalTypeID::INT64}, + LogicalTypeID::LIST, ScalarFunction::TernaryExecListStructFunction, nullptr, ListSliceBindFunc, false /* isVarlength*/)); @@ -575,7 +574,7 @@ static void getListSortExecFunction( static std::unique_ptr ListSortBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); - switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { + switch (ListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { getListSortExecFunction(arguments, scalarFunction->execFunc); @@ -647,15 +646,15 @@ static std::unique_ptr ListSortBindFunc( function_set ListSortFunction::getFunctionSet() { function_set result; result.push_back( - std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); + std::make_unique(name, std::vector{LogicalTypeID::LIST}, + LogicalTypeID::LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::STRING}, LogicalTypeID::LIST, + nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, std::vector{ - LogicalTypeID::VAR_LIST, LogicalTypeID::STRING, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); + LogicalTypeID::LIST, LogicalTypeID::STRING, LogicalTypeID::STRING}, + LogicalTypeID::LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); return result; } @@ -678,7 +677,7 @@ static void getListReverseSortExecFunction( static std::unique_ptr ListReverseSortBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); - switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { + switch (ListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { getListReverseSortExecFunction(arguments, scalarFunction->execFunc); @@ -750,19 +749,18 @@ static std::unique_ptr ListReverseSortBindFunc( function_set ListReverseSortFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, ListReverseSortBindFunc, false /* isVarlength*/)); + std::vector{LogicalTypeID::LIST}, LogicalTypeID::LIST, nullptr, nullptr, + ListReverseSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, nullptr, nullptr, ListReverseSortBindFunc, - false /* isVarlength*/)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::STRING}, LogicalTypeID::LIST, + nullptr, nullptr, ListReverseSortBindFunc, false /* isVarlength*/)); return result; } function_set ListSumFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, + std::vector{LogicalTypeID::LIST}, LogicalTypeID::INT64, nullptr, nullptr, bindFuncListAggr, false /* isVarlength*/)); return result; } @@ -770,7 +768,7 @@ function_set ListSumFunction::getFunctionSet() { function_set ListProductFunction::getFunctionSet() { function_set result; result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::INT64, nullptr, nullptr, + std::vector{LogicalTypeID::LIST}, LogicalTypeID::INT64, nullptr, nullptr, bindFuncListAggr, false /* isVarlength*/)); return result; } @@ -778,7 +776,7 @@ function_set ListProductFunction::getFunctionSet() { static std::unique_ptr ListDistinctBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); - switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { + switch (ListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { scalarFunction->execFunc = ScalarFunction::UnaryExecNestedTypeFunction ListDistinctBindFunc( function_set ListDistinctFunction::getFunctionSet() { function_set result; - result.push_back(std::make_unique(name, - std::vector{LogicalTypeID::VAR_LIST}, LogicalTypeID::VAR_LIST, nullptr, - nullptr, ListDistinctBindFunc, false /* isVarlength*/)); + result.push_back( + std::make_unique(name, std::vector{LogicalTypeID::LIST}, + LogicalTypeID::LIST, nullptr, nullptr, ListDistinctBindFunc, false /* isVarlength*/)); return result; } static std::unique_ptr ListUniqueBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); - switch (VarListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { + switch (ListType::getChildType(&arguments[0]->dataType)->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { scalarFunction->execFunc = @@ -978,7 +976,7 @@ static std::unique_ptr ListUniqueBindFunc( function_set ListUniqueFunction::getFunctionSet() { function_set result; result.push_back( - std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + std::make_unique(name, std::vector{LogicalTypeID::LIST}, LogicalTypeID::INT64, nullptr, nullptr, ListUniqueBindFunc, false /* isVarlength*/)); return result; } @@ -986,7 +984,7 @@ function_set ListUniqueFunction::getFunctionSet() { static std::unique_ptr ListAnyValueBindFunc( const binder::expression_vector& arguments, Function* function) { auto scalarFunction = ku_dynamic_cast(function); - auto resultType = VarListType::getChildType(&arguments[0]->dataType); + auto resultType = ListType::getChildType(&arguments[0]->dataType); switch (resultType->getLogicalTypeID()) { case LogicalTypeID::SERIAL: case LogicalTypeID::INT64: { @@ -1069,7 +1067,7 @@ static std::unique_ptr ListAnyValueBindFunc( scalarFunction->execFunc = ScalarFunction::UnaryExecNestedTypeFunction; } break; - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { scalarFunction->execFunc = ScalarFunction::UnaryExecNestedTypeFunction; } break; @@ -1087,7 +1085,7 @@ static std::unique_ptr ListAnyValueBindFunc( function_set ListAnyValueFunction::getFunctionSet() { function_set result; result.push_back( - std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + std::make_unique(name, std::vector{LogicalTypeID::LIST}, LogicalTypeID::ANY, nullptr, nullptr, ListAnyValueBindFunc, false /* isVarlength*/)); return result; } @@ -1104,7 +1102,7 @@ static std::unique_ptr ListReverseBindFunc( function_set ListReverseFunction::getFunctionSet() { function_set result; result.push_back( - std::make_unique(name, std::vector{LogicalTypeID::VAR_LIST}, + std::make_unique(name, std::vector{LogicalTypeID::LIST}, LogicalTypeID::ANY, nullptr, nullptr, ListReverseBindFunc, false /* isVarlength*/)); return result; } diff --git a/src/function/vector_map_functions.cpp b/src/function/vector_map_functions.cpp index 5e60733464d..05b4e9b6472 100644 --- a/src/function/vector_map_functions.cpp +++ b/src/function/vector_map_functions.cpp @@ -13,8 +13,8 @@ namespace function { static std::unique_ptr MapCreationBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { - auto keyType = VarListType::getChildType(&arguments[0]->dataType); - auto valueType = VarListType::getChildType(&arguments[1]->dataType); + auto keyType = ListType::getChildType(&arguments[0]->dataType); + auto valueType = ListType::getChildType(&arguments[1]->dataType); auto resultType = LogicalType::MAP(*keyType, *valueType); return std::make_unique(std::move(resultType)); } @@ -24,8 +24,8 @@ function_set MapCreationFunctions::getFunctionSet() { list_entry_t, MapCreation>; function_set functionSet; functionSet.push_back(make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::VAR_LIST}, - LogicalTypeID::MAP, execFunc, nullptr, MapCreationBindFunc, false /* isVarLength */)); + std::vector{LogicalTypeID::LIST, LogicalTypeID::LIST}, LogicalTypeID::MAP, + execFunc, nullptr, MapCreationBindFunc, false /* isVarLength */)); return functionSet; } @@ -102,7 +102,7 @@ static std::unique_ptr MapExtractBindFunc( scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { scalarFunction->execFunc = ScalarFunction::BinaryExecListStructFunction; } break; @@ -114,21 +114,21 @@ static std::unique_ptr MapExtractBindFunc( KU_UNREACHABLE; } } - return std::make_unique(LogicalType::VAR_LIST( + return std::make_unique(LogicalType::LIST( std::make_unique(*MapType::getValueType(&arguments[0]->dataType)))); } function_set MapExtractFunctions::getFunctionSet() { function_set functionSet; functionSet.push_back(make_unique(name, - std::vector{LogicalTypeID::MAP, LogicalTypeID::ANY}, LogicalTypeID::VAR_LIST, + std::vector{LogicalTypeID::MAP, LogicalTypeID::ANY}, LogicalTypeID::LIST, nullptr, nullptr, MapExtractBindFunc, false /* isVarLength */)); return functionSet; } static std::unique_ptr MapKeysBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { - return std::make_unique(LogicalType::VAR_LIST( + return std::make_unique(LogicalType::LIST( std::make_unique(*MapType::getKeyType(&arguments[0]->dataType)))); } @@ -138,13 +138,13 @@ function_set MapKeysFunctions::getFunctionSet() { function_set functionSet; functionSet.push_back( make_unique(name, std::vector{LogicalTypeID::MAP}, - LogicalTypeID::VAR_LIST, execFunc, nullptr, MapKeysBindFunc, false /* isVarLength */)); + LogicalTypeID::LIST, execFunc, nullptr, MapKeysBindFunc, false /* isVarLength */)); return functionSet; } static std::unique_ptr MapValuesBindFunc( const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { - return std::make_unique(LogicalType::VAR_LIST( + return std::make_unique(LogicalType::LIST( std::make_unique(*MapType::getValueType(&arguments[0]->dataType)))); } @@ -152,9 +152,9 @@ function_set MapValuesFunctions::getFunctionSet() { auto execFunc = ScalarFunction::UnaryExecNestedTypeFunction; function_set functionSet; - functionSet.push_back(make_unique(name, - std::vector{LogicalTypeID::MAP}, LogicalTypeID::VAR_LIST, execFunc, nullptr, - MapValuesBindFunc, false /* isVarLength */)); + functionSet.push_back( + make_unique(name, std::vector{LogicalTypeID::MAP}, + LogicalTypeID::LIST, execFunc, nullptr, MapValuesBindFunc, false /* isVarLength */)); return functionSet; } diff --git a/src/function/vector_path_functions.cpp b/src/function/vector_path_functions.cpp index 242a4e83aa4..a3eec3f9655 100644 --- a/src/function/vector_path_functions.cpp +++ b/src/function/vector_path_functions.cpp @@ -53,7 +53,7 @@ static std::unique_ptr PropertiesBindFunc( } auto key = ((binder::LiteralExpression&)*arguments[1]).getValue()->getValue(); auto listType = arguments[0]->getDataType(); - auto childType = VarListType::getChildType(&listType); + auto childType = ListType::getChildType(&listType); struct_field_idx_t fieldIdx; if (childType->getLogicalTypeID() == LogicalTypeID::NODE || childType->getLogicalTypeID() == LogicalTypeID::REL) { @@ -66,14 +66,14 @@ static std::unique_ptr PropertiesBindFunc( stringFormat("Cannot extract properties from {}.", listType.toString())); } auto field = StructType::getField(childType, fieldIdx); - auto returnType = LogicalType::VAR_LIST(field->getType()->copy()); + auto returnType = LogicalType::LIST(field->getType()->copy()); return std::make_unique(std::move(returnType), fieldIdx); } static void PropertiesCompileFunc(FunctionBindData* bindData, const std::vector>& parameters, std::shared_ptr& result) { - KU_ASSERT(parameters[0]->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(parameters[0]->dataType.getPhysicalType() == PhysicalTypeID::LIST); auto propertiesBindData = reinterpret_cast(bindData); auto fieldVector = StructVector::getFieldVector( ListVector::getDataVector(parameters[0].get()), propertiesBindData->childIdx); @@ -111,8 +111,8 @@ static void PropertiesExecFunc(const std::vector>& function_set PropertiesFunction::getFunctionSet() { function_set functions; functions.push_back(make_unique(name, - std::vector{LogicalTypeID::VAR_LIST, LogicalTypeID::STRING}, - LogicalTypeID::ANY, PropertiesExecFunc, nullptr, PropertiesCompileFunc, PropertiesBindFunc, + std::vector{LogicalTypeID::LIST, LogicalTypeID::STRING}, LogicalTypeID::ANY, + PropertiesExecFunc, nullptr, PropertiesCompileFunc, PropertiesBindFunc, false /* isVarLength */)); return functions; } diff --git a/src/function/vector_string_functions.cpp b/src/function/vector_string_functions.cpp index 4e44b326ed4..cdf07f9e81d 100644 --- a/src/function/vector_string_functions.cpp +++ b/src/function/vector_string_functions.cpp @@ -304,14 +304,14 @@ function_set RegexpExtractAllFunction::getFunctionSet() { function_set functionSet; functionSet.emplace_back(make_unique(name, std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, - LogicalTypeID::VAR_LIST, + LogicalTypeID::LIST, ScalarFunction::BinaryStringExecFunction, nullptr, bindFunc, false /* isVarLength */)); functionSet.emplace_back(make_unique(name, std::vector{ LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::INT64}, - LogicalTypeID::VAR_LIST, + LogicalTypeID::LIST, ScalarFunction::TernaryStringExecFunction, nullptr, bindFunc, false /* isVarLength */)); @@ -320,7 +320,7 @@ function_set RegexpExtractAllFunction::getFunctionSet() { std::unique_ptr RegexpExtractAllFunction::bindFunc( const binder::expression_vector& /*arguments*/, Function* /*definition*/) { - return std::make_unique(LogicalType::VAR_LIST(LogicalType::STRING())); + return std::make_unique(LogicalType::LIST(LogicalType::STRING())); } function_set LevenshteinFunction::getFunctionSet() { diff --git a/src/include/c_api/kuzu.h b/src/include/c_api/kuzu.h index f27677d303c..c1688e11186 100644 --- a/src/include/c_api/kuzu.h +++ b/src/include/c_api/kuzu.h @@ -296,7 +296,7 @@ typedef enum { // variable size types KUZU_STRING = 50, KUZU_BLOB = 51, - KUZU_VAR_LIST = 52, + KUZU_LIST = 52, KUZU_ARRAY = 53, KUZU_STRUCT = 54, KUZU_MAP = 55, @@ -896,8 +896,8 @@ KUZU_C_API void kuzu_value_destroy(kuzu_value* value); */ KUZU_C_API uint64_t kuzu_value_get_list_size(kuzu_value* value); /** - * @brief Returns the element at index of the given value. The value must be of type VAR_LIST. - * @param value The VAR_LIST value to return. + * @brief Returns the element at index of the given value. The value must be of type LIST. + * @param value The LIST value to return. * @param index The index of the element to return. */ KUZU_C_API kuzu_value* kuzu_value_get_list_element(kuzu_value* value, uint64_t index); diff --git a/src/include/common/type_utils.h b/src/include/common/type_utils.h index 0c50619c500..edb5473ace6 100644 --- a/src/include/common/type_utils.h +++ b/src/include/common/type_utils.h @@ -174,7 +174,7 @@ class TypeUtils { case LogicalTypeID::UUID: return func(ku_uuid_t()); case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: return func(list_entry_t()); case LogicalTypeID::MAP: return func(map_entry_t()); @@ -230,7 +230,7 @@ class TypeUtils { return func(internalID_t()); case PhysicalTypeID::STRING: return func(ku_string_t()); - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: return func(list_entry_t()); case PhysicalTypeID::STRUCT: return func(struct_entry_t()); diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 7377701cd02..528e28ba474 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -130,7 +130,7 @@ enum class KUZU_API LogicalTypeID : uint8_t { STRING = 50, BLOB = 51, - VAR_LIST = 52, + LIST = 52, ARRAY = 53, STRUCT = 54, MAP = 55, @@ -161,7 +161,7 @@ enum class PhysicalTypeID : uint8_t { // Variable size types. STRING = 20, - VAR_LIST = 22, + LIST = 22, STRUCT = 23, POINTER = 24, }; @@ -180,13 +180,13 @@ class ExtraTypeInfo { virtual void serializeInternal(Serializer& serializer) const = 0; }; -class VarListTypeInfo : public ExtraTypeInfo { +class ListTypeInfo : public ExtraTypeInfo { public: - VarListTypeInfo() = default; - explicit VarListTypeInfo(std::unique_ptr childType) + ListTypeInfo() = default; + explicit ListTypeInfo(std::unique_ptr childType) : childType{std::move(childType)} {} inline LogicalType* getChildType() const { return childType.get(); } - bool operator==(const VarListTypeInfo& other) const; + bool operator==(const ListTypeInfo& other) const; std::unique_ptr copy() const override; static std::unique_ptr deserialize(Deserializer& deserializer); @@ -198,11 +198,11 @@ class VarListTypeInfo : public ExtraTypeInfo { std::unique_ptr childType; }; -class ArrayTypeInfo : public VarListTypeInfo { +class ArrayTypeInfo : public ListTypeInfo { public: ArrayTypeInfo() = default; explicit ArrayTypeInfo(std::unique_ptr childType, uint64_t numElements) - : VarListTypeInfo{std::move(childType)}, numElements{numElements} {} + : ListTypeInfo{std::move(childType)}, numElements{numElements} {} inline uint64_t getNumElements() const { return numElements; } bool operator==(const ArrayTypeInfo& other) const; static std::unique_ptr deserialize(Deserializer& deserializer); @@ -269,7 +269,7 @@ class StructTypeInfo : public ExtraTypeInfo { class LogicalType { friend class LogicalTypeUtils; friend struct StructType; - friend struct VarListType; + friend struct ListType; friend struct ArrayType; public: @@ -405,10 +405,10 @@ class LogicalType { static KUZU_API std::unique_ptr UNION(std::vector&& fields); - static KUZU_API std::unique_ptr VAR_LIST(std::unique_ptr childType); + static KUZU_API std::unique_ptr LIST(std::unique_ptr childType); template - static inline std::unique_ptr VAR_LIST(T&& childType) { - return LogicalType::VAR_LIST(std::make_unique(std::forward(childType))); + static inline std::unique_ptr LIST(T&& childType) { + return LogicalType::LIST(std::make_unique(std::forward(childType))); } static KUZU_API std::unique_ptr MAP( @@ -443,11 +443,11 @@ class LogicalType { using logical_types_t = std::vector>; using logical_type_vec_t = std::vector; -struct VarListType { +struct ListType { static inline LogicalType* getChildType(const LogicalType* type) { - KU_ASSERT(type->getPhysicalType() == PhysicalTypeID::VAR_LIST); - auto varListTypeInfo = reinterpret_cast(type->extraTypeInfo.get()); - return varListTypeInfo->getChildType(); + KU_ASSERT(type->getPhysicalType() == PhysicalTypeID::LIST); + auto listTypeInfo = reinterpret_cast(type->extraTypeInfo.get()); + return listTypeInfo->getChildType(); } }; @@ -533,12 +533,12 @@ struct StructType { struct MapType { static inline LogicalType* getKeyType(const LogicalType* type) { KU_ASSERT(type->getLogicalTypeID() == LogicalTypeID::MAP); - return StructType::getFieldTypes(VarListType::getChildType(type))[0]; + return StructType::getFieldTypes(ListType::getChildType(type))[0]; } static inline LogicalType* getValueType(const LogicalType* type) { KU_ASSERT(type->getLogicalTypeID() == LogicalTypeID::MAP); - return StructType::getFieldTypes(VarListType::getChildType(type))[1]; + return StructType::getFieldTypes(ListType::getChildType(type))[1]; } }; @@ -590,7 +590,7 @@ class LogicalTypeUtils { private: static LogicalTypeID dataTypeIDFromString(const std::string& trimmedStr); static std::vector parseStructFields(const std::string& structTypeStr); - static std::unique_ptr parseVarListType(const std::string& trimmedStr); + static std::unique_ptr parseListType(const std::string& trimmedStr); static std::unique_ptr parseArrayType(const std::string& trimmedStr); static std::vector parseStructTypeInfo(const std::string& structTypeStr); static std::unique_ptr parseStructType(const std::string& trimmedStr); diff --git a/src/include/common/types/value/value.h b/src/include/common/types/value/value.h index 8b59f60f0c6..90306c02b19 100644 --- a/src/include/common/types/value/value.h +++ b/src/include/common/types/value/value.h @@ -236,7 +236,7 @@ class Value { Value(); explicit Value(const LogicalType& dataType); - void copyFromVarList(ku_list_t& list, const LogicalType& childType); + void copyFromList(ku_list_t& list, const LogicalType& childType); void copyFromStruct(const uint8_t* kuStruct); void copyFromUnion(const uint8_t* kuUnion); diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index a18e4eba843..ef360a48627 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -28,7 +28,7 @@ class KUZU_API ValueVector { explicit ValueVector(LogicalType dataType, storage::MemoryManager* memoryManager = nullptr); explicit ValueVector(LogicalTypeID dataTypeID, storage::MemoryManager* memoryManager = nullptr) : ValueVector(LogicalType(dataTypeID), memoryManager) { - KU_ASSERT(dataTypeID != LogicalTypeID::VAR_LIST); + KU_ASSERT(dataTypeID != LogicalTypeID::LIST); } ~ValueVector() = default; @@ -149,43 +149,43 @@ struct KUZU_API BlobVector { class KUZU_API ListVector { public: static void setDataVector(const ValueVector* vector, std::shared_ptr dataVector) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); auto listBuffer = ku_dynamic_cast(vector->auxiliaryBuffer.get()); listBuffer->setDataVector(std::move(dataVector)); } static ValueVector* getDataVector(const ValueVector* vector) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getDataVector(); } static std::shared_ptr getSharedDataVector(const ValueVector* vector) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getSharedDataVector(); } static uint64_t getDataVectorSize(const ValueVector* vector) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getSize(); } static uint8_t* getListValues(const ValueVector* vector, const list_entry_t& listEntry) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); auto dataVector = getDataVector(vector); return dataVector->getData() + dataVector->getNumBytesPerValue() * listEntry.offset; } static uint8_t* getListValuesWithOffset( const ValueVector* vector, const list_entry_t& listEntry, offset_t elementOffsetInList) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); return getListValues(vector, listEntry) + elementOffsetInList * getDataVector(vector)->getNumBytesPerValue(); } static list_entry_t addList(ValueVector* vector, uint64_t listSize) { - KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->addList(listSize); diff --git a/src/include/function/comparison/vector_comparison_functions.h b/src/include/function/comparison/vector_comparison_functions.h index 3d056821361..61e0c3f112e 100644 --- a/src/include/function/comparison/vector_comparison_functions.h +++ b/src/include/function/comparison/vector_comparison_functions.h @@ -15,8 +15,8 @@ struct ComparisonFunction { for (auto& comparableType : common::LogicalTypeUtils::getAllValidComparableLogicalTypes()) { functionSet.push_back(getFunction(name, comparableType, comparableType)); } - functionSet.push_back(getFunction( - name, common::LogicalTypeID::VAR_LIST, common::LogicalTypeID::VAR_LIST)); + functionSet.push_back( + getFunction(name, common::LogicalTypeID::LIST, common::LogicalTypeID::LIST)); functionSet.push_back( getFunction(name, common::LogicalTypeID::STRUCT, common::LogicalTypeID::STRUCT)); // We can only check whether two internal ids are equal or not. So INTERNAL_ID is not @@ -112,7 +112,7 @@ struct ComparisonFunction { func = BinaryComparisonExecFunction; } break; - case common::PhysicalTypeID::VAR_LIST: { + case common::PhysicalTypeID::LIST: { func = BinaryComparisonExecFunction; } break; @@ -178,7 +178,7 @@ struct ComparisonFunction { case common::PhysicalTypeID::INTERVAL: { func = BinaryComparisonSelectFunction; } break; - case common::PhysicalTypeID::VAR_LIST: { + case common::PhysicalTypeID::LIST: { func = BinaryComparisonSelectFunction; } break; case common::PhysicalTypeID::STRUCT: { diff --git a/src/include/function/list/functions/list_position_function.h b/src/include/function/list/functions/list_position_function.h index 50567a52b35..d47f0558c73 100644 --- a/src/include/function/list/functions/list_position_function.h +++ b/src/include/function/list/functions/list_position_function.h @@ -13,7 +13,7 @@ struct ListPosition { static inline void operation(common::list_entry_t& list, T& element, int64_t& result, common::ValueVector& listVector, common::ValueVector& elementVector, common::ValueVector& /*resultVector*/) { - if (*common::VarListType::getChildType(&listVector.dataType) != elementVector.dataType) { + if (*common::ListType::getChildType(&listVector.dataType) != elementVector.dataType) { result = 0; return; } diff --git a/src/include/function/list/functions/list_range_function.h b/src/include/function/list/functions/list_range_function.h index b7bf9b118a1..6d8be4e96c5 100644 --- a/src/include/function/list/functions/list_range_function.h +++ b/src/include/function/list/functions/list_range_function.h @@ -9,7 +9,7 @@ struct Range { public: // range function: // - include end - // - when start = end: there is only one element in result varlist + // - when start = end: there is only one element in result list // - when end - start are of opposite sign of step, the result will be empty // - default step = 1 template diff --git a/src/include/processor/operator/persistent/reader/parquet/list_column_reader.h b/src/include/processor/operator/persistent/reader/parquet/list_column_reader.h index 1e94f8757df..de3aea6cb05 100644 --- a/src/include/processor/operator/persistent/reader/parquet/list_column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/list_column_reader.h @@ -7,7 +7,7 @@ namespace processor { class ListColumnReader : public ColumnReader { public: - static constexpr const common::PhysicalTypeID TYPE = common::PhysicalTypeID::VAR_LIST; + static constexpr const common::PhysicalTypeID TYPE = common::PhysicalTypeID::LIST; public: ListColumnReader(ParquetReader& reader, std::unique_ptr type, diff --git a/src/include/processor/operator/persistent/writer/parquet/var_list_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/list_column_writer.h similarity index 91% rename from src/include/processor/operator/persistent/writer/parquet/var_list_column_writer.h rename to src/include/processor/operator/persistent/writer/parquet/list_column_writer.h index 30a5d1f08fa..ef35460a234 100644 --- a/src/include/processor/operator/persistent/writer/parquet/var_list_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/list_column_writer.h @@ -5,9 +5,9 @@ namespace kuzu { namespace processor { -class VarListColumnWriter : public ColumnWriter { +class ListColumnWriter : public ColumnWriter { public: - VarListColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schema, + ListColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schema, uint64_t maxRepeat, uint64_t maxDefine, std::unique_ptr childWriter, bool canHaveNulls) : ColumnWriter(writer, schemaIdx, std::move(schema), maxRepeat, maxDefine, canHaveNulls), diff --git a/src/include/storage/storage_utils.h b/src/include/storage/storage_utils.h index 9ac95a005f9..804541f056a 100644 --- a/src/include/storage/storage_utils.h +++ b/src/include/storage/storage_utils.h @@ -65,8 +65,8 @@ class StorageUtils { enum class ColumnType { DEFAULT = 0, INDEX = 1, // This is used for index columns in STRING columns. - OFFSET = 2, // This is used for offset columns in VAR_LIST and STRING columns. - DATA = 3, // This is used for data columns in VAR_LIST and STRING columns. + OFFSET = 2, // This is used for offset columns in LIST and STRING columns. + DATA = 3, // This is used for data columns in LIST and STRING columns. CSR_OFFSET = 4, CSR_LENGTH = 5, STRUCT_CHILD = 6, diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index 657ba8bd933..4ef9eace434 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -30,9 +30,9 @@ class NullColumn; class StructColumn; class Column { friend class StringColumn; - friend class VarListLocalColumn; + friend class ListLocalColumn; friend class StructColumn; - friend class VarListColumn; + friend class ListColumn; public: struct ReadState { diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index 534e34d88e2..eee12291358 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -32,7 +32,7 @@ struct ColumnChunkMetadata { class ColumnChunk { public: friend struct ColumnChunkFactory; - friend struct VarListDataColumnChunk; + friend struct ListDataColumnChunk; // ColumnChunks must be initialized after construction, so this constructor should only be used // through the ColumnChunkFactory diff --git a/src/include/storage/store/var_list_column.h b/src/include/storage/store/list_column.h similarity index 95% rename from src/include/storage/store/var_list_column.h rename to src/include/storage/store/list_column.h index 641ef601728..b98e95571a1 100644 --- a/src/include/storage/store/var_list_column.h +++ b/src/include/storage/store/list_column.h @@ -17,7 +17,7 @@ // in-place updates of a list column. In a list column chunk, offsets of lists are not always sorted // after updates. This is good for writes, but it introduces extra overheads for scans, as lists can // be scattered, and scans have to be broken into multiple small reads. To achieve a balance between -// reads and writes, during updates, we rewrite the whole var list column chunk in ascending order +// reads and writes, during updates, we rewrite the whole list column chunk in ascending order // when the offsets are not sorted in ascending order and the size of data column chunk is larger // than half of its capacity. @@ -41,11 +41,11 @@ struct ListOffsetSizeInfo { bool isOffsetSortedAscending(uint64_t startPos, uint64_t endPos) const; }; -class VarListColumn : public Column { - friend class VarListLocalColumn; +class ListColumn : public Column { + friend class ListLocalColumn; public: - VarListColumn(std::string name, common::LogicalType dataType, + ListColumn(std::string name, common::LogicalType dataType, const MetadataDAHInfo& metaDAHeaderInfo, BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction, RWPropertyStats propertyStatistics, bool enableCompression); diff --git a/src/include/storage/store/var_list_column_chunk.h b/src/include/storage/store/list_column_chunk.h similarity index 87% rename from src/include/storage/store/var_list_column_chunk.h rename to src/include/storage/store/list_column_chunk.h index 992ca00bbc8..871a4616fff 100644 --- a/src/include/storage/store/var_list_column_chunk.h +++ b/src/include/storage/store/list_column_chunk.h @@ -7,11 +7,11 @@ namespace kuzu { namespace storage { // TODO(Guodong): Let's simplify the data structure here by getting rid of this class. -struct VarListDataColumnChunk { +struct ListDataColumnChunk { std::unique_ptr dataColumnChunk; uint64_t capacity; - explicit VarListDataColumnChunk(std::unique_ptr dataChunk) + explicit ListDataColumnChunk(std::unique_ptr dataChunk) : dataColumnChunk{std::move(dataChunk)}, capacity{this->dataColumnChunk->capacity} {} void reset() const; @@ -25,14 +25,14 @@ struct VarListDataColumnChunk { inline uint64_t getNumValues() const { return dataColumnChunk->getNumValues(); } }; -class VarListColumnChunk final : public ColumnChunk { +class ListColumnChunk final : public ColumnChunk { public: - VarListColumnChunk( + ListColumnChunk( common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); inline ColumnChunk* getDataColumnChunk() const { - return varListDataColumnChunk->dataColumnChunk.get(); + return listDataColumnChunk->dataColumnChunk.get(); } inline ColumnChunk* getSizeColumnChunk() const { return sizeColumnChunk.get(); } @@ -60,7 +60,7 @@ class VarListColumnChunk final : public ColumnChunk { common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; inline void resizeDataColumnChunk(uint64_t numValues) { - varListDataColumnChunk->resizeBuffer(numValues); + listDataColumnChunk->resizeBuffer(numValues); } inline void resize(uint64_t newCapacity) override { @@ -75,7 +75,7 @@ class VarListColumnChunk final : public ColumnChunk { common::list_size_t getListSize(common::offset_t offset) const; void resetOffset(); - void resetFromOtherChunk(VarListColumnChunk* other); + void resetFromOtherChunk(ListColumnChunk* other); void finalize() override; bool isOffsetsConsecutiveAndSortedAscending(uint64_t startPos, uint64_t endPos) const; bool sanityCheck() override; @@ -91,7 +91,7 @@ class VarListColumnChunk final : public ColumnChunk { protected: std::unique_ptr sizeColumnChunk; - std::unique_ptr varListDataColumnChunk; + std::unique_ptr listDataColumnChunk; // we use checkOffsetSortedAsc flag to indicate that we do not trigger random write bool checkOffsetSortedAsc; }; diff --git a/src/main/query_result.cpp b/src/main/query_result.cpp index af96d6038cd..d3cdc47226d 100644 --- a/src/main/query_result.cpp +++ b/src/main/query_result.cpp @@ -23,9 +23,9 @@ std::unique_ptr DataTypeInfo::getInfoForDataType( columnTypeInfo->childrenTypesInfo.push_back( std::make_unique(LogicalTypeID::INT64, "tableID")); } break; - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { auto parentTypeInfo = columnTypeInfo.get(); - auto childType = VarListType::getChildType(&type); + auto childType = ListType::getChildType(&type); parentTypeInfo->childrenTypesInfo.push_back(getInfoForDataType(*childType, "")); } break; case LogicalTypeID::ARRAY: { diff --git a/src/main/storage_driver.cpp b/src/main/storage_driver.cpp index b6930a49319..b4e38a9f271 100644 --- a/src/main/storage_driver.cpp +++ b/src/main/storage_driver.cpp @@ -64,7 +64,7 @@ uint64_t StorageDriver::getNumRels(const std::string& relName) { void StorageDriver::scanColumn(Transaction* transaction, storage::Column* column, offset_t* offsets, size_t size, uint8_t* result) { auto dataType = column->getDataType(); - if (dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST) { + if (dataType.getPhysicalType() == PhysicalTypeID::LIST) { auto resultVector = ValueVector(dataType); for (auto i = 0u; i < size; ++i) { auto nodeOffset = offsets[i]; diff --git a/src/processor/map/map_path_property_probe.cpp b/src/processor/map/map_path_property_probe.cpp index e5f6c4a68b5..9451953a6e9 100644 --- a/src/processor/map/map_path_property_probe.cpp +++ b/src/processor/map/map_path_property_probe.cpp @@ -65,7 +65,7 @@ std::unique_ptr PlanMapper::mapPathPropertyProbe( std::move(nodeBuildInfo), std::move(nodeBuildPrevOperator), getOperatorID(), ""); auto relDataType = rel->getDataType(); auto nodesField = StructType::getField(&relDataType, InternalKeyword::NODES); - auto nodeStructType = VarListType::getChildType(nodesField->getType()); + auto nodeStructType = ListType::getChildType(nodesField->getType()); auto [fieldIndices, columnIndices] = getColIdxToScan(nodePayloads, nodeKeys.size(), *nodeStructType); nodeFieldIndices = std::move(fieldIndices); @@ -92,7 +92,7 @@ std::unique_ptr PlanMapper::mapPathPropertyProbe( std::move(relBuildInfo), std::move(relBuildPrvOperator), getOperatorID(), ""); auto relDataType = rel->getDataType(); auto relsField = StructType::getField(&relDataType, InternalKeyword::RELS); - auto relStructType = VarListType::getChildType(relsField->getType()); + auto relStructType = ListType::getChildType(relsField->getType()); auto [fieldIndices, columnIndices] = getColIdxToScan(relPayloads, relKeys.size(), *relStructType); relFieldIndices = std::move(fieldIndices); diff --git a/src/processor/operator/persistent/copy_to_csv.cpp b/src/processor/operator/persistent/copy_to_csv.cpp index 4d80e982b26..7b242a91f0d 100644 --- a/src/processor/operator/persistent/copy_to_csv.cpp +++ b/src/processor/operator/persistent/copy_to_csv.cpp @@ -167,10 +167,10 @@ void CopyToCSVLocalState::writeRows(CopyToCSVInfo* copyToCsvInfo) { continue; } auto strValue = vector->getValue(pos); - // Note: we need blindly add quotes to VAR_LIST. + // Note: we need blindly add quotes to LIST. writeString(serializer.get(), copyToCsvInfo, strValue.getData(), strValue.len, CopyToCSVConstants::DEFAULT_FORCE_QUOTE || - vectorsToCast[j]->dataType.getLogicalTypeID() == LogicalTypeID::VAR_LIST); + vectorsToCast[j]->dataType.getLogicalTypeID() == LogicalTypeID::LIST); } serializer->writeBufferData(CopyToCSVConstants::DEFAULT_CSV_NEWLINE); } diff --git a/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp index 50c8e70bb07..18028ae0ddc 100644 --- a/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp @@ -15,7 +15,7 @@ ListColumnReader::ListColumnReader(ParquetReader& reader, std::unique_ptr( - *common::VarListType::getChildType(this->type.get()), memoryManager); + *common::ListType::getChildType(this->type.get()), memoryManager); } void ListColumnReader::applyPendingSkips(uint64_t numValues) { diff --git a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp index bc6960d6f6c..17cc980bf65 100644 --- a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp @@ -272,10 +272,10 @@ std::unique_ptr ParquetReader::createReaderRecursive(uint64_t dept // LCOV_EXCL_STOP auto structType = LogicalType::STRUCT(std::move(structFields)); resultType = std::unique_ptr(new LogicalType( - LogicalTypeID::MAP, std::make_unique(std::move(structType)))); + LogicalTypeID::MAP, std::make_unique(std::move(structType)))); auto structReader = std::make_unique(*this, - VarListType::getChildType(resultType.get())->copy(), sEle, thisIdx, maxDefine - 1, + ListType::getChildType(resultType.get())->copy(), sEle, thisIdx, maxDefine - 1, maxRepeat - 1, std::move(childrenReaders)); return std::make_unique(*this, std::move(resultType), sEle, thisIdx, maxDefine, maxRepeat, std::move(structReader), context->getMemoryManager()); @@ -291,7 +291,7 @@ std::unique_ptr ParquetReader::createReaderRecursive(uint64_t dept result = std::move(childrenReaders[0]); } if (isRepeated) { - resultType = LogicalType::VAR_LIST(std::move(resultType)); + resultType = LogicalType::LIST(std::move(resultType)); return std::make_unique(*this, std::move(resultType), sEle, thisIdx, maxDefine, maxRepeat, std::move(result), context->getMemoryManager()); } @@ -305,7 +305,7 @@ std::unique_ptr ParquetReader::createReaderRecursive(uint64_t dept // LCOV_EXCL_STOP if (sEle.repetition_type == FieldRepetitionType::REPEATED) { auto derivedType = deriveLogicalType(sEle); - auto listType = LogicalType::VAR_LIST(derivedType->copy()); + auto listType = LogicalType::LIST(derivedType->copy()); auto elementReader = ColumnReader::createReader( *this, std::move(derivedType), sEle, nextFileIdx++, maxDefine, maxRepeat); return std::make_unique(*this, std::move(listType), sEle, thisIdx, diff --git a/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp index b1d70525aee..87bb3800232 100644 --- a/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp @@ -72,7 +72,7 @@ void StructColumnReader::skip(uint64_t num_values) { static bool TypeHasExactRowCount(const common::LogicalType* type) { switch (type->getLogicalTypeID()) { - case common::LogicalTypeID::VAR_LIST: + case common::LogicalTypeID::LIST: case common::LogicalTypeID::MAP: return false; case common::LogicalTypeID::STRUCT: diff --git a/src/processor/operator/persistent/writer/parquet/CMakeLists.txt b/src/processor/operator/persistent/writer/parquet/CMakeLists.txt index 829581ddd73..b379ed42820 100644 --- a/src/processor/operator/persistent/writer/parquet/CMakeLists.txt +++ b/src/processor/operator/persistent/writer/parquet/CMakeLists.txt @@ -6,7 +6,7 @@ add_library(kuzu_processor_operator_parquet_writer interval_column_writer.cpp struct_column_writer.cpp string_column_writer.cpp - var_list_column_writer.cpp + list_column_writer.cpp parquet_writer.cpp parquet_rle_bp_encoder.cpp) diff --git a/src/processor/operator/persistent/writer/parquet/column_writer.cpp b/src/processor/operator/persistent/writer/parquet/column_writer.cpp index 9b0b0dc6be3..659c426a2e1 100644 --- a/src/processor/operator/persistent/writer/parquet/column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/column_writer.cpp @@ -4,11 +4,11 @@ #include "function/cast/functions/numeric_limits.h" #include "processor/operator/persistent/writer/parquet/boolean_column_writer.h" #include "processor/operator/persistent/writer/parquet/interval_column_writer.h" +#include "processor/operator/persistent/writer/parquet/list_column_writer.h" #include "processor/operator/persistent/writer/parquet/parquet_writer.h" #include "processor/operator/persistent/writer/parquet/standard_column_writer.h" #include "processor/operator/persistent/writer/parquet/string_column_writer.h" #include "processor/operator/persistent/writer/parquet/struct_column_writer.h" -#include "processor/operator/persistent/writer/parquet/var_list_column_writer.h" #include "snappy/snappy.h" namespace kuzu { @@ -89,8 +89,8 @@ std::unique_ptr ColumnWriter::createWriterRecursive( std::move(schemaPathToCreate), maxRepeatToCreate, maxDefineToCreate, std::move(childWriters), canHaveNullsToCreate); } - case LogicalTypeID::VAR_LIST: { - auto childType = VarListType::getChildType(type); + case LogicalTypeID::LIST: { + auto childType = ListType::getChildType(type); // Set up the two schema elements for the list // for some reason we only set the converted type in the OPTIONAL element // first an OPTIONAL element. @@ -119,9 +119,8 @@ std::unique_ptr ColumnWriter::createWriterRecursive( auto child_writer = createWriterRecursive(schemas, writer, childType, "element", schemaPathToCreate, mm, maxRepeatToCreate + 1, maxDefineToCreate + 2); - return std::make_unique(writer, schemaIdx, - std::move(schemaPathToCreate), maxRepeatToCreate, maxDefineToCreate, - std::move(child_writer), canHaveNullsToCreate); + return std::make_unique(writer, schemaIdx, std::move(schemaPathToCreate), + maxRepeatToCreate, maxDefineToCreate, std::move(child_writer), canHaveNullsToCreate); } case LogicalTypeID::MAP: { // Maps are stored as follows in parquet: @@ -168,7 +167,7 @@ std::unique_ptr ColumnWriter::createWriterRecursive( auto structWriter = std::make_unique(writer, schemaIdx, schemaPathToCreate, maxRepeatToCreate, maxDefineToCreate, std::move(childrenWriters), canHaveNullsToCreate); - return std::make_unique(writer, schemaIdx, schemaPathToCreate, + return std::make_unique(writer, schemaIdx, schemaPathToCreate, maxRepeatToCreate, maxDefineToCreate, std::move(structWriter), canHaveNullsToCreate); } default: { diff --git a/src/processor/operator/persistent/writer/parquet/var_list_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/list_column_writer.cpp similarity index 86% rename from src/processor/operator/persistent/writer/parquet/var_list_column_writer.cpp rename to src/processor/operator/persistent/writer/parquet/list_column_writer.cpp index 43cd40a5181..b4243f6971c 100644 --- a/src/processor/operator/persistent/writer/parquet/var_list_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/list_column_writer.cpp @@ -1,34 +1,34 @@ -#include "processor/operator/persistent/writer/parquet/var_list_column_writer.h" +#include "processor/operator/persistent/writer/parquet/list_column_writer.h" namespace kuzu { namespace processor { using namespace kuzu_parquet::format; -std::unique_ptr VarListColumnWriter::initializeWriteState( +std::unique_ptr ListColumnWriter::initializeWriteState( kuzu_parquet::format::RowGroup& rowGroup) { auto result = std::make_unique(rowGroup, rowGroup.columns.size()); result->childState = childWriter->initializeWriteState(rowGroup); return result; } -bool VarListColumnWriter::hasAnalyze() { +bool ListColumnWriter::hasAnalyze() { return childWriter->hasAnalyze(); } -void VarListColumnWriter::analyze(ColumnWriterState& writerState, ColumnWriterState* /*parent*/, +void ListColumnWriter::analyze(ColumnWriterState& writerState, ColumnWriterState* /*parent*/, common::ValueVector* vector, uint64_t /*count*/) { auto& state = reinterpret_cast(writerState); childWriter->analyze(*state.childState, &writerState, common::ListVector::getDataVector(vector), common::ListVector::getDataVectorSize(vector)); } -void VarListColumnWriter::finalizeAnalyze(ColumnWriterState& writerState) { +void ListColumnWriter::finalizeAnalyze(ColumnWriterState& writerState) { auto& state = reinterpret_cast(writerState); childWriter->finalizeAnalyze(*state.childState); } -void VarListColumnWriter::prepare(ColumnWriterState& writerState, ColumnWriterState* parent, +void ListColumnWriter::prepare(ColumnWriterState& writerState, ColumnWriterState* parent, common::ValueVector* vector, uint64_t count) { auto& state = reinterpret_cast(writerState); @@ -85,19 +85,19 @@ void VarListColumnWriter::prepare(ColumnWriterState& writerState, ColumnWriterSt common::ListVector::getDataVectorSize(vector)); } -void VarListColumnWriter::beginWrite(ColumnWriterState& state_p) { +void ListColumnWriter::beginWrite(ColumnWriterState& state_p) { auto& state = reinterpret_cast(state_p); childWriter->beginWrite(*state.childState); } -void VarListColumnWriter::write( +void ListColumnWriter::write( ColumnWriterState& writerState, common::ValueVector* vector, uint64_t /*count*/) { auto& state = reinterpret_cast(writerState); childWriter->write(*state.childState, common::ListVector::getDataVector(vector), common::ListVector::getDataVectorSize(vector)); } -void VarListColumnWriter::finalizeWrite(ColumnWriterState& writerState) { +void ListColumnWriter::finalizeWrite(ColumnWriterState& writerState) { auto& state = reinterpret_cast(writerState); childWriter->finalizeWrite(*state.childState); } diff --git a/src/storage/compression/compression.cpp b/src/storage/compression/compression.cpp index 4b2952320b4..76b21f82f05 100644 --- a/src/storage/compression/compression.cpp +++ b/src/storage/compression/compression.cpp @@ -33,7 +33,7 @@ uint32_t getDataTypeSizeInChunk(const common::PhysicalTypeID& dataType) { case PhysicalTypeID::STRING: { return sizeof(uint32_t); } - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::INTERNAL_ID: { return sizeof(offset_t); } @@ -100,7 +100,7 @@ bool CompressionMetadata::canUpdateInPlace( value, BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { auto value = reinterpret_cast(data)[pos]; return IntegerBitpacking::canUpdateInPlace( @@ -156,7 +156,7 @@ uint64_t CompressionMetadata::numValues(uint64_t pageSize, const LogicalType& da case PhysicalTypeID::INT8: return IntegerBitpacking::numValues(pageSize, BitpackHeader::readHeader(data)); case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: return IntegerBitpacking::numValues( pageSize, BitpackHeader::readHeader(data)); @@ -213,7 +213,7 @@ std::optional ConstantCompression::analyze(const ColumnChun } return std::optional(CompressionMetadata(CompressionType::CONSTANT, value)); } - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::STRING: case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::DOUBLE: @@ -636,7 +636,7 @@ void ReadCompressedValuesFromPageToVector::operator()(const uint8_t* frame, Page resultVector->getData(), posInVector, numValuesToRead, metadata); } case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { return IntegerBitpacking().decompressFromPage(frame, pageCursor.elemPosInPage, resultVector->getData(), posInVector, numValuesToRead, metadata); @@ -697,7 +697,7 @@ void ReadCompressedValuesFromPage::operator()(const uint8_t* frame, PageCursor& result, startPosInResult, numValuesToRead, metadata); } case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { return IntegerBitpacking().decompressFromPage(frame, pageCursor.elemPosInPage, result, startPosInResult, numValuesToRead, metadata); @@ -759,7 +759,7 @@ void WriteCompressedValuesToPage::operator()(uint8_t* frame, uint16_t posInFrame data, dataOffset, frame, posInFrame, numValues, metadata); } case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { return IntegerBitpacking().setValuesFromUncompressed( data, dataOffset, frame, posInFrame, numValues, metadata); diff --git a/src/storage/stats/property_statistics.cpp b/src/storage/stats/property_statistics.cpp index fb808b30a16..3bdeb096e3e 100644 --- a/src/storage/stats/property_statistics.cpp +++ b/src/storage/stats/property_statistics.cpp @@ -26,7 +26,7 @@ std::unique_ptr PropertyStatistics::deserialize( // overwrite them and invalidate the reference bool RWPropertyStats::mayHaveNull(const transaction::Transaction& transaction) { // Columns internal to the storage, i.e., not mapping to a property in table schema, are not - // tracked in statistics. For example, offset of var list column, csr offset column, etc. + // tracked in statistics. For example, offset of list column, csr offset column, etc. // TODO(Guodong): INVALID_PROPERTY_ID is used here because we have a column, i.e., nbrIDColumn, // not exposed as property in table schema, but still have nullColumn. Should be fixed once we // properly align properties and chunks. diff --git a/src/storage/stats/table_statistics_collection.cpp b/src/storage/stats/table_statistics_collection.cpp index 965765d6f8d..442759245ea 100644 --- a/src/storage/stats/table_statistics_collection.cpp +++ b/src/storage/stats/table_statistics_collection.cpp @@ -96,11 +96,11 @@ std::unique_ptr TablesStatistics::createMetadataDAHInfo( createMetadataDAHInfo(*fields[i]->getType(), metadataFH, bm, wal); } } break; - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { metadataDAHInfo->childrenInfos.push_back( createMetadataDAHInfo(*LogicalType::UINT32(), metadataFH, bm, wal)); metadataDAHInfo->childrenInfos.push_back( - createMetadataDAHInfo(*VarListType::getChildType(&dataType), metadataFH, bm, wal)); + createMetadataDAHInfo(*ListType::getChildType(&dataType), metadataFH, bm, wal)); } break; case PhysicalTypeID::STRING: { auto dataMetadataDAHInfo = std::make_unique(); diff --git a/src/storage/storage_utils.cpp b/src/storage/storage_utils.cpp index baf868a0049..3b01b81b74e 100644 --- a/src/storage/storage_utils.cpp +++ b/src/storage/storage_utils.cpp @@ -86,7 +86,7 @@ uint32_t StorageUtils::getDataTypeSize(PhysicalTypeID type) { case PhysicalTypeID::STRING: { return sizeof(ku_string_t); } - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { return sizeof(ku_list_t); } case PhysicalTypeID::STRUCT: { @@ -104,7 +104,7 @@ uint32_t StorageUtils::getDataTypeSize(const LogicalType& type) { case PhysicalTypeID::STRING: { return sizeof(ku_string_t); } - case PhysicalTypeID::VAR_LIST: { + case PhysicalTypeID::LIST: { return sizeof(ku_list_t); } case PhysicalTypeID::STRUCT: { diff --git a/src/storage/store/CMakeLists.txt b/src/storage/store/CMakeLists.txt index 62de9fd2314..4a03cc5dccc 100644 --- a/src/storage/store/CMakeLists.txt +++ b/src/storage/store/CMakeLists.txt @@ -16,8 +16,8 @@ add_library(kuzu_storage_store struct_column_chunk.cpp struct_column.cpp table_data.cpp - var_list_column_chunk.cpp - var_list_column.cpp) + list_column_chunk.cpp + list_column.cpp) set(ALL_OBJECT_FILES ${ALL_OBJECT_FILES} $ diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 2fe76401ba5..8e3f318994e 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -8,10 +8,10 @@ #include "storage/stats/property_statistics.h" #include "storage/storage_utils.h" #include "storage/store/column_chunk.h" +#include "storage/store/list_column.h" #include "storage/store/null_column.h" #include "storage/store/string_column.h" #include "storage/store/struct_column.h" -#include "storage/store/var_list_column.h" #include "transaction/transaction.h" #include @@ -932,8 +932,8 @@ std::unique_ptr ColumnFactory::createColumn(std::string name, LogicalTyp } case LogicalTypeID::ARRAY: case LogicalTypeID::MAP: - case LogicalTypeID::VAR_LIST: { - return std::make_unique(name, std::move(dataType), metaDAHeaderInfo, dataFH, + case LogicalTypeID::LIST: { + return std::make_unique(name, std::move(dataType), metaDAHeaderInfo, dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); } case LogicalTypeID::UNION: diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index f13d6c78083..4ab880d38ef 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -6,9 +6,9 @@ #include "common/types/types.h" #include "storage/compression/compression.h" #include "storage/storage_utils.h" +#include "storage/store/list_column_chunk.h" #include "storage/store/string_column_chunk.h" #include "storage/store/struct_column_chunk.h" -#include "storage/store/var_list_column_chunk.h" using namespace kuzu::common; @@ -126,7 +126,7 @@ static std::shared_ptr getCompression( return std::make_shared>(); } case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { return std::make_shared>(); } @@ -183,7 +183,7 @@ void ColumnChunk::initializeFunction() { case PhysicalTypeID::INT16: case PhysicalTypeID::INT8: case PhysicalTypeID::INTERNAL_ID: - case PhysicalTypeID::VAR_LIST: + case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: case PhysicalTypeID::UINT32: case PhysicalTypeID::UINT16: @@ -262,12 +262,12 @@ void ColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultipli } // NOTE: This function is only called in LocalTable right now when performing out-of-place -// committing. VAR_LIST has a different logic for handling out-of-place committing as it has to +// committing. LIST has a different logic for handling out-of-place committing as it has to // be slided. However, this is unsafe, as this function can also be used for other purposes later. // Thus, an assertion is added at the first line. void ColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { KU_ASSERT(dataType.getPhysicalType() != PhysicalTypeID::BOOL && - dataType.getPhysicalType() != PhysicalTypeID::VAR_LIST); + dataType.getPhysicalType() != PhysicalTypeID::LIST); nullChunk->setNull(offsetInChunk, vector->isNull(offsetInVector)); if (offsetInChunk >= numValues) { numValues = offsetInChunk + 1; @@ -642,8 +642,8 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( return std::make_unique( std::move(dataType), capacity, enableCompression, inMemory); } - case PhysicalTypeID::VAR_LIST: { - return std::make_unique( + case PhysicalTypeID::LIST: { + return std::make_unique( std::move(dataType), capacity, enableCompression, inMemory); } case PhysicalTypeID::STRUCT: { diff --git a/src/storage/store/var_list_column.cpp b/src/storage/store/list_column.cpp similarity index 80% rename from src/storage/store/var_list_column.cpp rename to src/storage/store/list_column.cpp index 9fe70cc89c5..df0c01d9227 100644 --- a/src/storage/store/var_list_column.cpp +++ b/src/storage/store/list_column.cpp @@ -1,8 +1,8 @@ -#include "storage/store/var_list_column.h" +#include "storage/store/list_column.h" #include "storage/store/column.h" +#include "storage/store/list_column_chunk.h" #include "storage/store/null_column.h" -#include "storage/store/var_list_column_chunk.h" #include using namespace kuzu::common; @@ -47,7 +47,7 @@ bool ListOffsetSizeInfo::isOffsetSortedAscending(uint64_t startPos, uint64_t end return true; } -VarListColumn::VarListColumn(std::string name, LogicalType dataType, +ListColumn::ListColumn(std::string name, LogicalType dataType, const MetadataDAHInfo& metaDAHeaderInfo, BMFileHandle* dataFH, BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, Transaction* transaction, RWPropertyStats propertyStatistics, bool enableCompression) @@ -59,11 +59,11 @@ VarListColumn::VarListColumn(std::string name, LogicalType dataType, *metaDAHeaderInfo.childrenInfos[0], dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); dataColumn = ColumnFactory::createColumn(dataColName, - *VarListType::getChildType(&this->dataType)->copy(), *metaDAHeaderInfo.childrenInfos[1], + *ListType::getChildType(&this->dataType)->copy(), *metaDAHeaderInfo.childrenInfos[1], dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); } -void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, +void ListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t startOffsetInGroup, offset_t endOffsetInGroup, ValueVector* resultVector, uint64_t offsetInVector) { nullColumn->scan(transaction, nodeGroupIdx, startOffsetInGroup, endOffsetInGroup, resultVector, @@ -101,21 +101,21 @@ void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx } } -void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, +void ListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, kuzu::storage::ColumnChunk* columnChunk, offset_t startOffset, offset_t endOffset) { if (nodeGroupIdx >= metadataDA->getNumElements(transaction->getType())) { columnChunk->setNumValues(0); } else { - auto varListColumnChunk = ku_dynamic_cast(columnChunk); + auto listColumnChunk = ku_dynamic_cast(columnChunk); Column::scan(transaction, nodeGroupIdx, columnChunk, startOffset, endOffset); - auto sizeColumnChunk = varListColumnChunk->getSizeColumnChunk(); + auto sizeColumnChunk = listColumnChunk->getSizeColumnChunk(); sizeColumn->scan(transaction, nodeGroupIdx, sizeColumnChunk, startOffset, endOffset); - auto resizeNumValues = varListColumnChunk->getDataColumnChunk()->getNumValues(); + auto resizeNumValues = listColumnChunk->getDataColumnChunk()->getNumValues(); bool isOffsetSortedAscending = true; - offset_t prevOffset = varListColumnChunk->getListStartOffset(0); + offset_t prevOffset = listColumnChunk->getListStartOffset(0); for (auto i = 0u; i < columnChunk->getNumValues(); i++) { - auto currentEndOffset = varListColumnChunk->getListEndOffset(i); - auto appendSize = varListColumnChunk->getListSize(i); + auto currentEndOffset = listColumnChunk->getListEndOffset(i); + auto appendSize = listColumnChunk->getListSize(i); prevOffset += appendSize; if (currentEndOffset != prevOffset) { isOffsetSortedAscending = false; @@ -123,37 +123,36 @@ void VarListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx resizeNumValues += appendSize; } if (isOffsetSortedAscending) { - varListColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); - offset_t startVarListOffset = varListColumnChunk->getListStartOffset(0); - offset_t endVarListOffset = - varListColumnChunk->getListStartOffset(columnChunk->getNumValues()); - dataColumn->scan(transaction, nodeGroupIdx, varListColumnChunk->getDataColumnChunk(), - startVarListOffset, endVarListOffset); - varListColumnChunk->resetOffset(); + listColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); + offset_t startListOffset = listColumnChunk->getListStartOffset(0); + offset_t endListOffset = + listColumnChunk->getListStartOffset(columnChunk->getNumValues()); + dataColumn->scan(transaction, nodeGroupIdx, listColumnChunk->getDataColumnChunk(), + startListOffset, endListOffset); + listColumnChunk->resetOffset(); } else { - varListColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); + listColumnChunk->resizeDataColumnChunk(std::bit_ceil(resizeNumValues)); auto tmpDataColumnChunk = - std::make_unique(ColumnChunkFactory::createColumnChunk( - *VarListType::getChildType(&this->dataType)->copy(), enableCompression, + std::make_unique(ColumnChunkFactory::createColumnChunk( + *ListType::getChildType(&this->dataType)->copy(), enableCompression, std::bit_ceil(resizeNumValues))); - auto dataVarListColumnChunk = varListColumnChunk->getDataColumnChunk(); + auto dataListColumnChunk = listColumnChunk->getDataColumnChunk(); for (auto i = 0u; i < columnChunk->getNumValues(); i++) { - offset_t startVarListOffset = varListColumnChunk->getListStartOffset(i); - offset_t endVarListOffset = varListColumnChunk->getListEndOffset(i); + offset_t startListOffset = listColumnChunk->getListStartOffset(i); + offset_t endListOffset = listColumnChunk->getListEndOffset(i); dataColumn->scan(transaction, nodeGroupIdx, - tmpDataColumnChunk->dataColumnChunk.get(), startVarListOffset, - endVarListOffset); - KU_ASSERT(endVarListOffset - startVarListOffset == + tmpDataColumnChunk->dataColumnChunk.get(), startListOffset, endListOffset); + KU_ASSERT(endListOffset - startListOffset == tmpDataColumnChunk->dataColumnChunk->getNumValues()); - dataVarListColumnChunk->append(tmpDataColumnChunk->dataColumnChunk.get(), 0, + dataListColumnChunk->append(tmpDataColumnChunk->dataColumnChunk.get(), 0, tmpDataColumnChunk->dataColumnChunk->getNumValues()); } - varListColumnChunk->resetOffset(); + listColumnChunk->resetOffset(); } } } -void VarListColumn::scanInternal( +void ListColumn::scanInternal( Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { resultVector->resetAuxiliaryBuffer(); auto startNodeOffset = nodeIDVector->readNodeOffset(0); @@ -170,7 +169,7 @@ void VarListColumn::scanInternal( } } -void VarListColumn::lookupValue(Transaction* transaction, offset_t nodeOffset, +void ListColumn::lookupValue(Transaction* transaction, offset_t nodeOffset, ValueVector* resultVector, uint32_t posInVector) { auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(nodeOffset); auto nodeOffsetInGroup = nodeOffset - StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); @@ -185,17 +184,17 @@ void VarListColumn::lookupValue(Transaction* transaction, offset_t nodeOffset, listEndOffset, dataVector, offsetInVector); } -void VarListColumn::append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) { +void ListColumn::append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) { KU_ASSERT(columnChunk->getDataType().getPhysicalType() == dataType.getPhysicalType()); - auto varListColumnChunk = ku_dynamic_cast(columnChunk); - Column::append(varListColumnChunk, nodeGroupIdx); - auto sizeColumnChunk = varListColumnChunk->getSizeColumnChunk(); + auto listColumnChunk = ku_dynamic_cast(columnChunk); + Column::append(listColumnChunk, nodeGroupIdx); + auto sizeColumnChunk = listColumnChunk->getSizeColumnChunk(); sizeColumn->append(sizeColumnChunk, nodeGroupIdx); - auto dataColumnChunk = varListColumnChunk->getDataColumnChunk(); + auto dataColumnChunk = listColumnChunk->getDataColumnChunk(); dataColumn->append(dataColumnChunk, nodeGroupIdx); } -void VarListColumn::scanUnfiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx, +void ListColumn::scanUnfiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx, ValueVector* resultVector, const ListOffsetSizeInfo& listOffsetInfoInStorage) { auto numValuesToScan = resultVector->state->selVector->selectedSize; offset_t offsetInVector = 0; @@ -225,7 +224,7 @@ void VarListColumn::scanUnfiltered(Transaction* transaction, node_group_idx_t no } } -void VarListColumn::scanFiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx, +void ListColumn::scanFiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx, ValueVector* resultVector, const ListOffsetSizeInfo& listOffsetSizeInfo) { offset_t listOffset = 0; for (auto i = 0u; i < resultVector->state->selVector->selectedSize; i++) { @@ -247,25 +246,25 @@ void VarListColumn::scanFiltered(Transaction* transaction, node_group_idx_t node } } -void VarListColumn::prepareCommit() { +void ListColumn::prepareCommit() { Column::prepareCommit(); sizeColumn->prepareCommit(); dataColumn->prepareCommit(); } -void VarListColumn::checkpointInMemory() { +void ListColumn::checkpointInMemory() { Column::checkpointInMemory(); sizeColumn->checkpointInMemory(); dataColumn->checkpointInMemory(); } -void VarListColumn::rollbackInMemory() { +void ListColumn::rollbackInMemory() { Column::rollbackInMemory(); sizeColumn->rollbackInMemory(); dataColumn->rollbackInMemory(); } -offset_t VarListColumn::readOffset( +offset_t ListColumn::readOffset( Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t offsetInNodeGroup) { auto chunkMeta = metadataDA->get(nodeGroupIdx, transaction->getType()); auto pageCursor = PageUtils::getPageCursorForPos(offsetInNodeGroup, @@ -279,7 +278,7 @@ offset_t VarListColumn::readOffset( return value; } -list_size_t VarListColumn::readSize( +list_size_t ListColumn::readSize( Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t offsetInNodeGroup) { auto chunkMeta = sizeColumn->getMetadataDA()->get(nodeGroupIdx, transaction->getType()); auto pageCursor = PageUtils::getPageCursorForPos(offsetInNodeGroup, @@ -293,7 +292,7 @@ list_size_t VarListColumn::readSize( return value; } -ListOffsetSizeInfo VarListColumn::getListOffsetSizeInfo(Transaction* transaction, +ListOffsetSizeInfo ListColumn::getListOffsetSizeInfo(Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t startOffsetInNodeGroup, offset_t endOffsetInNodeGroup) { auto numOffsetsToRead = endOffsetInNodeGroup - startOffsetInNodeGroup; auto offsetColumnChunk = ColumnChunkFactory::createColumnChunk( @@ -307,7 +306,7 @@ ListOffsetSizeInfo VarListColumn::getListOffsetSizeInfo(Transaction* transaction return {numOffsetsToRead, std::move(offsetColumnChunk), std::move(sizeColumnChunk)}; } -void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, +void ListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) { @@ -337,7 +336,7 @@ void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_i } } -void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, +void ListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, offset_t startSrcOffset) { auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; @@ -347,23 +346,23 @@ void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_i } else { // we separate the commit into three parts: offset chunk commit, size column chunk commit, // data column chunk - auto varListChunk = ku_dynamic_cast(chunk); - sizeColumn->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, - varListChunk->getSizeColumnChunk(), startSrcOffset); + auto listChunk = ku_dynamic_cast(chunk); + sizeColumn->prepareCommitForChunk( + transaction, nodeGroupIdx, dstOffsets, listChunk->getSizeColumnChunk(), startSrcOffset); auto dataColumnSize = dataColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues; - auto dataColumnChunk = varListChunk->getDataColumnChunk(); + auto dataColumnChunk = listChunk->getDataColumnChunk(); auto numListsToAppend = std::min(chunk->getNumValues(), (uint64_t)dstOffsets.size()); auto dataSize = 0u; - auto startVarListOffset = varListChunk->getListStartOffset(startSrcOffset); + auto startListOffset = listChunk->getListStartOffset(startSrcOffset); std::vector dstOffsetsInDataColumn; for (auto i = 0u; i < numListsToAppend; i++) { - for (auto j = 0u; j < varListChunk->getListSize(startSrcOffset + i); j++) { + for (auto j = 0u; j < listChunk->getListSize(startSrcOffset + i); j++) { dstOffsetsInDataColumn.push_back(dataColumnSize + dataSize++); } } dataColumn->prepareCommitForChunk( - transaction, nodeGroupIdx, dstOffsetsInDataColumn, dataColumnChunk, startVarListOffset); + transaction, nodeGroupIdx, dstOffsetsInDataColumn, dataColumnChunk, startListOffset); // we need to update the offset since we do not do in-place list data update but append data // in the end of list data column we need to plus to original data column size to get the // new offset @@ -374,13 +373,13 @@ void VarListColumn::prepareCommitForChunk(Transaction* transaction, node_group_i enableCompression, 1.5 * std::bit_ceil(offsetChunkMeta.numValues + dstOffsets.size())); Column::scan(transaction, nodeGroupIdx, offsetColumnChunk.get()); for (auto i = 0u; i < numListsToAppend; i++) { - auto listEndOffset = varListChunk->getListEndOffset(startSrcOffset + i); - auto isNull = varListChunk->getNullChunk()->isNull(startSrcOffset + i); + auto listEndOffset = listChunk->getListEndOffset(startSrcOffset + i); + auto isNull = listChunk->getNullChunk()->isNull(startSrcOffset + i); offsetColumnChunk->setValue(dataColumnSize + listEndOffset, dstOffsets[i]); offsetColumnChunk->getNullChunk()->setNull(dstOffsets[i], isNull); } auto offsetListChunk = - ku_dynamic_cast(offsetColumnChunk.get()); + ku_dynamic_cast(offsetColumnChunk.get()); offsetListChunk->getSizeColumnChunk()->setNumValues(offsetColumnChunk->getNumValues()); Column::append(offsetColumnChunk.get(), nodeGroupIdx); } diff --git a/src/storage/store/var_list_column_chunk.cpp b/src/storage/store/list_column_chunk.cpp similarity index 69% rename from src/storage/store/var_list_column_chunk.cpp rename to src/storage/store/list_column_chunk.cpp index 1cb9f096495..6797aa8ac31 100644 --- a/src/storage/store/var_list_column_chunk.cpp +++ b/src/storage/store/list_column_chunk.cpp @@ -1,4 +1,4 @@ -#include "storage/store/var_list_column_chunk.h" +#include "storage/store/list_column_chunk.h" #include "common/cast.h" #include "common/data_chunk/sel_vector.h" @@ -10,11 +10,11 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -void VarListDataColumnChunk::reset() const { +void ListDataColumnChunk::reset() const { dataColumnChunk->resetToEmpty(); } -void VarListDataColumnChunk::resizeBuffer(uint64_t numValues) { +void ListDataColumnChunk::resizeBuffer(uint64_t numValues) { if (numValues <= capacity) { return; } @@ -25,19 +25,19 @@ void VarListDataColumnChunk::resizeBuffer(uint64_t numValues) { dataColumnChunk->resize(capacity); } -VarListColumnChunk::VarListColumnChunk( +ListColumnChunk::ListColumnChunk( LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) : ColumnChunk{std::move(dataType), capacity, enableCompression, true /* hasNullChunk */} { sizeColumnChunk = ColumnChunkFactory::createColumnChunk( *common::LogicalType::UINT32(), enableCompression, capacity); - varListDataColumnChunk = std::make_unique( - ColumnChunkFactory::createColumnChunk(*VarListType::getChildType(&this->dataType)->copy(), + listDataColumnChunk = std::make_unique( + ColumnChunkFactory::createColumnChunk(*ListType::getChildType(&this->dataType)->copy(), enableCompression, 0 /* capacity */, inMemory)); checkOffsetSortedAsc = false; - KU_ASSERT(this->dataType.getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(this->dataType.getPhysicalType() == PhysicalTypeID::LIST); } -bool VarListColumnChunk::isOffsetsConsecutiveAndSortedAscending( +bool ListColumnChunk::isOffsetsConsecutiveAndSortedAscending( uint64_t startPos, uint64_t endPos) const { offset_t prevEndOffset = getListStartOffset(startPos); for (auto i = startPos; i < endPos; i++) { @@ -51,60 +51,60 @@ bool VarListColumnChunk::isOffsetsConsecutiveAndSortedAscending( return true; } -offset_t VarListColumnChunk::getListStartOffset(offset_t offset) const { +offset_t ListColumnChunk::getListStartOffset(offset_t offset) const { if (numValues == 0) return 0; return offset == numValues ? getListEndOffset(offset - 1) : getListEndOffset(offset) - getListSize(offset); } -offset_t VarListColumnChunk::getListEndOffset(offset_t offset) const { +offset_t ListColumnChunk::getListEndOffset(offset_t offset) const { if (numValues == 0) return 0; KU_ASSERT(offset < numValues); return getValue(offset); } -list_size_t VarListColumnChunk::getListSize(common::offset_t offset) const { +list_size_t ListColumnChunk::getListSize(common::offset_t offset) const { if (numValues == 0) return 0; KU_ASSERT(offset < sizeColumnChunk->getNumValues()); return sizeColumnChunk->getValue(offset); } -void VarListColumnChunk::append( +void ListColumnChunk::append( ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { checkOffsetSortedAsc = true; - auto otherListChunk = ku_dynamic_cast(other); + auto otherListChunk = ku_dynamic_cast(other); nullChunk->append(other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); sizeColumnChunk->getNullChunk()->append( other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); - offset_t offsetInDataChunkToAppend = varListDataColumnChunk->getNumValues(); + offset_t offsetInDataChunkToAppend = listDataColumnChunk->getNumValues(); for (auto i = 0u; i < numValuesToAppend; i++) { auto appendSize = otherListChunk->getListSize(startPosInOtherChunk + i); sizeColumnChunk->setValue(appendSize, numValues); offsetInDataChunkToAppend += appendSize; setValue(offsetInDataChunkToAppend, numValues); } - varListDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); + listDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); for (auto i = 0u; i < numValuesToAppend; i++) { auto startOffset = otherListChunk->getListStartOffset(startPosInOtherChunk + i); auto appendSize = otherListChunk->getListSize(startPosInOtherChunk + i); - varListDataColumnChunk->dataColumnChunk->append( - otherListChunk->varListDataColumnChunk->dataColumnChunk.get(), startOffset, appendSize); + listDataColumnChunk->dataColumnChunk->append( + otherListChunk->listDataColumnChunk->dataColumnChunk.get(), startOffset, appendSize); } sanityCheck(); } -void VarListColumnChunk::resetToEmpty() { +void ListColumnChunk::resetToEmpty() { ColumnChunk::resetToEmpty(); sizeColumnChunk->resetToEmpty(); - varListDataColumnChunk = std::make_unique( - ColumnChunkFactory::createColumnChunk(*VarListType::getChildType(&this->dataType)->copy(), - enableCompression, 0 /* capacity */)); + listDataColumnChunk = + std::make_unique(ColumnChunkFactory::createColumnChunk( + *ListType::getChildType(&this->dataType)->copy(), enableCompression, 0 /* capacity */)); } -void VarListColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { +void ListColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { auto numToAppend = selVector.selectedSize; auto newCapacity = capacity; while (numValues + numToAppend >= newCapacity) { @@ -113,7 +113,7 @@ void VarListColumnChunk::append(ValueVector* vector, const SelectionVector& selV if (capacity < newCapacity) { resize(newCapacity); } - offset_t nextListOffsetInChunk = varListDataColumnChunk->getNumValues(); + offset_t nextListOffsetInChunk = listDataColumnChunk->getNumValues(); auto offsetBufferToWrite = (offset_t*)(buffer.get()); for (auto i = 0u; i < selVector.selectedSize; i++) { auto pos = selVector.selectedPositions[i]; @@ -124,7 +124,7 @@ void VarListColumnChunk::append(ValueVector* vector, const SelectionVector& selV nextListOffsetInChunk += listLen; offsetBufferToWrite[numValues + i] = nextListOffsetInChunk; } - varListDataColumnChunk->resizeBuffer(nextListOffsetInChunk); + listDataColumnChunk->resizeBuffer(nextListOffsetInChunk); auto dataVector = ListVector::getDataVector(vector); // TODO(Guodong): we should not set vector to a new state. dataVector->setState(std::make_unique()); @@ -140,8 +140,8 @@ void VarListColumnChunk::append(ValueVector* vector, const SelectionVector& selV sanityCheck(); } -void VarListColumnChunk::appendNullList() { - offset_t nextListOffsetInChunk = varListDataColumnChunk->getNumValues(); +void ListColumnChunk::appendNullList() { + offset_t nextListOffsetInChunk = listDataColumnChunk->getNumValues(); auto offsetBufferToWrite = (offset_t*)(buffer.get()); sizeColumnChunk->setValue(0, numValues); sizeColumnChunk->getNullChunk()->setNull(numValues, true); @@ -150,7 +150,7 @@ void VarListColumnChunk::appendNullList() { numValues++; } -void VarListColumnChunk::lookup( +void ListColumnChunk::lookup( offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { KU_ASSERT(offsetInChunk < numValues); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); @@ -164,23 +164,23 @@ void VarListColumnChunk::lookup( ListVector::resizeDataVector(&output, currentListDataSize + listSize); // TODO(Guodong): Should add `scan` interface and use `scan` here. for (auto i = 0u; i < listSize; i++) { - varListDataColumnChunk->dataColumnChunk->lookup(startOffset + i, *dataVector, i); + listDataColumnChunk->dataColumnChunk->lookup(startOffset + i, *dataVector, i); } } -void VarListColumnChunk::write( +void ListColumnChunk::write( ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == dataType.getPhysicalType() && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); checkOffsetSortedAsc = true; - offset_t currentIndex = varListDataColumnChunk->getNumValues(); - auto otherListChunk = ku_dynamic_cast(chunk); - varListDataColumnChunk->resizeBuffer(varListDataColumnChunk->getNumValues() + - otherListChunk->varListDataColumnChunk->getNumValues()); - varListDataColumnChunk->dataColumnChunk->append( - otherListChunk->varListDataColumnChunk->dataColumnChunk.get(), 0, - otherListChunk->varListDataColumnChunk->getNumValues()); + offset_t currentIndex = listDataColumnChunk->getNumValues(); + auto otherListChunk = ku_dynamic_cast(chunk); + listDataColumnChunk->resizeBuffer( + listDataColumnChunk->getNumValues() + otherListChunk->listDataColumnChunk->getNumValues()); + listDataColumnChunk->dataColumnChunk->append( + otherListChunk->listDataColumnChunk->dataColumnChunk.get(), 0, + otherListChunk->listDataColumnChunk->getNumValues()); offset_t maxDstOffset = 0; for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { auto posInChunk = dstOffsets->getValue(i); @@ -203,15 +203,14 @@ void VarListColumnChunk::write( sanityCheck(); } -void VarListColumnChunk::write( - ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { +void ListColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { checkOffsetSortedAsc = true; auto selVector = std::make_unique(1); selVector->setToFiltered(); selVector->selectedPositions[0] = offsetInVector; auto appendSize = vector->isNull(offsetInVector) ? 0 : vector->getValue(offsetInVector).size; - varListDataColumnChunk->resizeBuffer(varListDataColumnChunk->getNumValues() + appendSize); + listDataColumnChunk->resizeBuffer(listDataColumnChunk->getNumValues() + appendSize); // TODO(Guodong): Do not set vector to a new state. auto dataVector = ListVector::getDataVector(vector); dataVector->setState(std::make_unique()); @@ -225,17 +224,17 @@ void VarListColumnChunk::write( sizeColumnChunk->getNullChunk()->setNull(offsetInChunk, isNull); if (!isNull) { sizeColumnChunk->setValue(appendSize, offsetInChunk); - setValue(varListDataColumnChunk->getNumValues(), offsetInChunk); + setValue(listDataColumnChunk->getNumValues(), offsetInChunk); } sanityCheck(); } -void VarListColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, +void ListColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { - KU_ASSERT(srcChunk->getDataType().getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(srcChunk->getDataType().getPhysicalType() == PhysicalTypeID::LIST); checkOffsetSortedAsc = true; - auto srcListChunk = ku_dynamic_cast(srcChunk); - auto offsetInDataChunkToAppend = varListDataColumnChunk->getNumValues(); + auto srcListChunk = ku_dynamic_cast(srcChunk); + auto offsetInDataChunkToAppend = listDataColumnChunk->getNumValues(); for (auto i = 0u; i < numValuesToCopy; i++) { auto appendSize = srcListChunk->getListSize(srcOffsetInChunk + i); offsetInDataChunkToAppend += appendSize; @@ -246,20 +245,20 @@ void VarListColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, sizeColumnChunk->getNullChunk()->setNull( dstOffsetInChunk + i, srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); } - varListDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); + listDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); for (auto i = 0u; i < numValuesToCopy; i++) { auto startOffsetInSrcChunk = srcListChunk->getListStartOffset(srcOffsetInChunk + i); auto appendSize = srcListChunk->getListSize(srcOffsetInChunk + i); - varListDataColumnChunk->dataColumnChunk->append( - srcListChunk->varListDataColumnChunk->dataColumnChunk.get(), startOffsetInSrcChunk, + listDataColumnChunk->dataColumnChunk->append( + srcListChunk->listDataColumnChunk->dataColumnChunk.get(), startOffsetInSrcChunk, appendSize); } sanityCheck(); } -void VarListColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, +void ListColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { - KU_ASSERT(srcChunk->getDataType().getPhysicalType() == PhysicalTypeID::VAR_LIST); + KU_ASSERT(srcChunk->getDataType().getPhysicalType() == PhysicalTypeID::LIST); KU_ASSERT(dstOffsetInChunk >= numValues); while (numValues < dstOffsetInChunk) { appendNullList(); @@ -267,7 +266,7 @@ void VarListColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, append(srcChunk, srcOffsetInChunk, numValuesToCopy); } -void VarListColumnChunk::copyListValues(const list_entry_t& entry, ValueVector* dataVector) { +void ListColumnChunk::copyListValues(const list_entry_t& entry, ValueVector* dataVector) { auto numListValuesToCopy = entry.size; auto numListValuesCopied = 0u; while (numListValuesCopied < numListValuesToCopy) { @@ -278,12 +277,12 @@ void VarListColumnChunk::copyListValues(const list_entry_t& entry, ValueVector* dataVector->state->selVector->selectedPositions[j] = entry.offset + numListValuesCopied + j; } - varListDataColumnChunk->append(dataVector, *dataVector->state->selVector); + listDataColumnChunk->append(dataVector, *dataVector->state->selVector); numListValuesCopied += numListValuesToCopyInBatch; } } -void VarListColumnChunk::resetOffset() { +void ListColumnChunk::resetOffset() { offset_t nextListOffsetReset = 0; for (auto i = 0u; i < numValues; i++) { auto listSize = getListSize(i); @@ -293,12 +292,12 @@ void VarListColumnChunk::resetOffset() { } } -void VarListColumnChunk::finalize() { +void ListColumnChunk::finalize() { // rewrite the column chunk for better scanning performance auto newColumnChunk = ColumnChunkFactory::createColumnChunk( std::move(*dataType.copy()), enableCompression, capacity); - uint64_t totalListLen = varListDataColumnChunk->getNumValues(); - uint64_t resizeThreshold = varListDataColumnChunk->capacity / 2; + uint64_t totalListLen = listDataColumnChunk->getNumValues(); + uint64_t resizeThreshold = listDataColumnChunk->capacity / 2; // if the list is not very long, we do not need to rewrite if (totalListLen < resizeThreshold) { return; @@ -311,43 +310,43 @@ void VarListColumnChunk::finalize() { if (isOffsetsConsecutiveAndSortedAscending(0, numValues)) { return; } - auto newVarListChunk = ku_dynamic_cast(newColumnChunk.get()); - newVarListChunk->resize(numValues); - newVarListChunk->getDataColumnChunk()->resize(totalListLen); - auto dataColumnChunk = newVarListChunk->getDataColumnChunk(); - newVarListChunk->varListDataColumnChunk->resizeBuffer(totalListLen); + auto newListChunk = ku_dynamic_cast(newColumnChunk.get()); + newListChunk->resize(numValues); + newListChunk->getDataColumnChunk()->resize(totalListLen); + auto dataColumnChunk = newListChunk->getDataColumnChunk(); + newListChunk->listDataColumnChunk->resizeBuffer(totalListLen); offset_t offsetInChunk = 0; offset_t currentIndex = 0; for (auto i = 0u; i < numValues; i++) { if (nullChunk->isNull(i)) { - newVarListChunk->appendNullList(); + newListChunk->appendNullList(); } else { auto startOffset = getListStartOffset(i); auto listSize = getListSize(i); dataColumnChunk->append( - varListDataColumnChunk->dataColumnChunk.get(), startOffset, listSize); + listDataColumnChunk->dataColumnChunk.get(), startOffset, listSize); offsetInChunk += listSize; - newVarListChunk->getNullChunk()->setNull(currentIndex, false); - newVarListChunk->sizeColumnChunk->getNullChunk()->setNull(currentIndex, false); - newVarListChunk->sizeColumnChunk->setValue(listSize, currentIndex); - newVarListChunk->setValue(offsetInChunk, currentIndex); + newListChunk->getNullChunk()->setNull(currentIndex, false); + newListChunk->sizeColumnChunk->getNullChunk()->setNull(currentIndex, false); + newListChunk->sizeColumnChunk->setValue(listSize, currentIndex); + newListChunk->setValue(offsetInChunk, currentIndex); } currentIndex++; } - newVarListChunk->sanityCheck(); - // Move offsets, null, data from newVarListChunk to this column chunk. And release indices. - resetFromOtherChunk(newVarListChunk); + newListChunk->sanityCheck(); + // Move offsets, null, data from newListChunk to this column chunk. And release indices. + resetFromOtherChunk(newListChunk); } -void VarListColumnChunk::resetFromOtherChunk(VarListColumnChunk* other) { +void ListColumnChunk::resetFromOtherChunk(ListColumnChunk* other) { buffer = std::move(other->buffer); nullChunk = std::move(other->nullChunk); sizeColumnChunk = std::move(other->sizeColumnChunk); - varListDataColumnChunk = std::move(other->varListDataColumnChunk); + listDataColumnChunk = std::move(other->listDataColumnChunk); numValues = other->numValues; checkOffsetSortedAsc = false; } -bool VarListColumnChunk::sanityCheck() { +bool ListColumnChunk::sanityCheck() { KU_ASSERT(ColumnChunk::sanityCheck()); KU_ASSERT(sizeColumnChunk->sanityCheck()); KU_ASSERT(getDataColumnChunk()->sanityCheck()); diff --git a/test/c_api/data_type_test.cpp b/test/c_api/data_type_test.cpp index 917a8d1ef67..70c3faf75c6 100644 --- a/test/c_api/data_type_test.cpp +++ b/test/c_api/data_type_test.cpp @@ -10,10 +10,10 @@ TEST(CApiDataTypeTest, Create) { auto dataTypeCpp = (LogicalType*)dataType->_data_type; ASSERT_EQ(dataTypeCpp->getLogicalTypeID(), LogicalTypeID::INT64); - auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); + auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_LIST, dataType, 0); ASSERT_NE(dataType2, nullptr); auto dataTypeCpp2 = (LogicalType*)dataType2->_data_type; - ASSERT_EQ(dataTypeCpp2->getLogicalTypeID(), LogicalTypeID::VAR_LIST); + ASSERT_EQ(dataTypeCpp2->getLogicalTypeID(), LogicalTypeID::LIST); // ASSERT_EQ(dataTypeCpp2->getChildType()->getLogicalTypeID(), LogicalTypeID::INT64); auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); @@ -38,7 +38,7 @@ TEST(CApiDataTypeTest, Clone) { auto dataTypeCloneCpp = (LogicalType*)dataTypeClone->_data_type; ASSERT_TRUE(*dataTypeCpp == *dataTypeCloneCpp); - auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); + auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_LIST, dataType, 0); ASSERT_NE(dataType2, nullptr); auto dataTypeClone2 = kuzu_data_type_clone(dataType2); ASSERT_NE(dataTypeClone2, nullptr); @@ -69,7 +69,7 @@ TEST(CApiDataTypeTest, Eqauls) { ASSERT_NE(dataTypeClone, nullptr); ASSERT_TRUE(kuzu_data_type_equals(dataType, dataTypeClone)); - auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); + auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_LIST, dataType, 0); ASSERT_NE(dataType2, nullptr); auto dataTypeClone2 = kuzu_data_type_clone(dataType2); ASSERT_NE(dataTypeClone2, nullptr); @@ -98,9 +98,9 @@ TEST(CApiDataTypeTest, GetID) { ASSERT_NE(dataType, nullptr); ASSERT_EQ(kuzu_data_type_get_id(dataType), kuzu_data_type_id::KUZU_INT64); - auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); + auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_LIST, dataType, 0); ASSERT_NE(dataType2, nullptr); - ASSERT_EQ(kuzu_data_type_get_id(dataType2), kuzu_data_type_id::KUZU_VAR_LIST); + ASSERT_EQ(kuzu_data_type_get_id(dataType2), kuzu_data_type_id::KUZU_LIST); auto dataType3 = kuzu_data_type_create(kuzu_data_type_id::KUZU_ARRAY, dataType, 100); ASSERT_NE(dataType3, nullptr); @@ -118,7 +118,7 @@ TEST(CApiDataTypeTest, GetID) { // ASSERT_NE(dataType, nullptr); // ASSERT_EQ(kuzu_data_type_get_child_type(dataType), nullptr); // -// auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); +// auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_LIST, dataType, 0); // ASSERT_NE(dataType2, nullptr); // auto childType2 = kuzu_data_type_get_child_type(dataType2); // ASSERT_NE(childType2, nullptr); @@ -143,7 +143,7 @@ TEST(CApiDataTypeTest, GetFixedNumElementsInList) { ASSERT_NE(dataType, nullptr); ASSERT_EQ(kuzu_data_type_get_num_elements_in_array(dataType), 0); - auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_VAR_LIST, dataType, 0); + auto dataType2 = kuzu_data_type_create(kuzu_data_type_id::KUZU_LIST, dataType, 0); ASSERT_NE(dataType2, nullptr); ASSERT_EQ(kuzu_data_type_get_num_elements_in_array(dataType2), 0); diff --git a/test/c_api/value_test.cpp b/test/c_api/value_test.cpp index 3063298da48..ff552819e79 100644 --- a/test/c_api/value_test.cpp +++ b/test/c_api/value_test.cpp @@ -520,7 +520,7 @@ TEST_F(CApiValueTest, GetDataType) { value = kuzu_flat_tuple_get_value(flatTuple, 2); dataType = kuzu_value_get_data_type(value); - ASSERT_EQ(kuzu_data_type_get_id(dataType), KUZU_VAR_LIST); + ASSERT_EQ(kuzu_data_type_get_id(dataType), KUZU_LIST); kuzu_data_type_destroy(dataType); kuzu_value_destroy(value); diff --git a/test/include/graph_test/base_graph_test.h b/test/include/graph_test/base_graph_test.h index 3e099137aa9..105eb1a9603 100644 --- a/test/include/graph_test/base_graph_test.h +++ b/test/include/graph_test/base_graph_test.h @@ -107,7 +107,7 @@ class BaseGraphTest : public Test { ASSERT_EQ(actualResult, expectedResult); } static inline bool containsOverflowFile(common::LogicalTypeID typeID) { - return typeID == common::LogicalTypeID::STRING || typeID == common::LogicalTypeID::VAR_LIST; + return typeID == common::LogicalTypeID::STRING || typeID == common::LogicalTypeID::LIST; } void commitOrRollbackConnectionAndInitDBIfNecessary( diff --git a/test/test_files/exceptions/binder/binder_error.test b/test/test_files/exceptions/binder/binder_error.test index f90af46521d..8030e349fb4 100644 --- a/test/test_files/exceptions/binder/binder_error.test +++ b/test/test_files/exceptions/binder/binder_error.test @@ -106,7 +106,7 @@ Binder exception: Cannot match a built-in function for given function +(INTERNAL (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE @@ -132,7 +132,7 @@ Binder exception: Cannot match a built-in function for given function +(DATE,DAT (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE @@ -158,7 +158,7 @@ Binder exception: Cannot match a built-in function for given function +(TIMESTAM (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE @@ -184,7 +184,7 @@ Binder exception: Cannot match a built-in function for given function +(TIMESTAM (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE @@ -302,7 +302,7 @@ Binder exception: No file found that matches the pattern: wrong_path.parquet. -STATEMENT COPY person FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/vPerson.csv" (pk=",") ---- error Binder exception: Unrecognized csv parsing option: PK. --STATEMENT LOAD WITH HEADERS (list STRING[], str STRING, struct STRUCT(a STRUCT(b STRUCT(c INT64[])))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/change_config.csv" (HEADER=true, DELIM="|", ESCAPE="~", QUOTE="'", LIST_END=")") RETURN * ; +-STATEMENT LOAD WITH HEADERS (list STRING[], str STRING, struct STRUCT(a STRUCT(b STRUCT(c INT64[])))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/change_config.csv" (HEADER=true, DELIM="|", ESCAPE="~", QUOTE="'", LIST_END=")") RETURN * ; ---- error Binder exception: Unrecognized csv parsing option: LIST_END. -STATEMENT LOAD WITH HEADERS (map MAP(STRING, MAP(STRING, INT16))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/map/nested_map_correct.csv" (LIST_BEGIN="(") RETURN *; @@ -310,7 +310,7 @@ Binder exception: Unrecognized csv parsing option: LIST_END. Binder exception: Unrecognized csv parsing option: LIST_BEGIN. -LOG LoadCSVInvalidCol --STATEMENT LOAD WITH HEADERS (list INT32[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/quote_error.csv" RETURN * ; +-STATEMENT LOAD WITH HEADERS (list INT32[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/quote_error.csv" RETURN * ; ---- error Binder exception: Number of columns mismatch. Expected 1 but got 3. @@ -517,7 +517,7 @@ Binder exception: Cannot match a built-in function for given function +(INT64,ST (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE @@ -587,7 +587,7 @@ Binder exception: Cannot match a built-in function for given function +(TIMESTAM (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE @@ -611,7 +611,7 @@ Binder exception: Cannot match a built-in function for given function +(TIMESTAM (DOUBLE,DOUBLE) -> DOUBLE (FLOAT,FLOAT) -> FLOAT (SERIAL,SERIAL) -> SERIAL -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST (STRING,STRING) -> STRING (INTERVAL,INTERVAL) -> INTERVAL (DATE,INT64) -> DATE diff --git a/test/test_files/tck/expressions/list/List1.test b/test/test_files/tck/expressions/list/List1.test index b8d34f4de7c..e2f393bfa90 100644 --- a/test/test_files/tck/expressions/list/List1.test +++ b/test/test_files/tck/expressions/list/List1.test @@ -80,21 +80,21 @@ # RETURN list[idx]; #---- error #Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(BOOL,INT64). Supported inputs are -#(VAR_LIST,INT64) -> ANY +#(LIST,INT64) -> ANY #(STRING,INT64) -> STRING -STATEMENT WITH 123 AS list, 0 AS idx RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64,INT64). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING -STATEMENT WITH 4.7 AS list, 0 AS idx RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(DOUBLE,INT64). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING # Fail when indexing with a non-integer #Example: boolean @@ -104,7 +104,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],BOOL). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING (ARRAY,INT64) -> ANY @@ -112,7 +112,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],DOUBLE). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING (ARRAY,INT64) -> ANY @@ -120,7 +120,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],STRING). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING (ARRAY,INT64) -> ANY @@ -128,7 +128,7 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],INT64[]). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING (ARRAY,INT64) -> ANY @@ -136,6 +136,6 @@ Binder exception: Cannot match a built-in function for given function LIST_EXTRA RETURN list[idx]; ---- error Binder exception: Cannot match a built-in function for given function LIST_EXTRACT(INT64[],STRUCT(x:INT64)). Supported inputs are -(VAR_LIST,INT64) -> ANY +(LIST,INT64) -> ANY (STRING,INT64) -> STRING (ARRAY,INT64) -> ANY diff --git a/test/test_files/tck/expressions/list/List11.test b/test/test_files/tck/expressions/list/List11.test index cc59d17d122..5e617174f41 100644 --- a/test/test_files/tck/expressions/list/List11.test +++ b/test/test_files/tck/expressions/list/List11.test @@ -200,294 +200,294 @@ Runtime exception: Step of range cannot be 0. ## Outcome: an Error should be raised at runtime: InvalidArgumentType ---- error Binder exception: Cannot match a built-in function for given function RANGE(BOOL,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, true, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,BOOL,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1, true); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,BOOL). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(-1.1, 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(DOUBLE,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(-0.0, 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(DOUBLE,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0.0, 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(DOUBLE,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(1.1, 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(DOUBLE,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, -1.1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,DOUBLE,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, -0.0, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,DOUBLE,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 0.0, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,DOUBLE,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1.1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,DOUBLE,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1, -1.1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,DOUBLE). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1, 1.1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,DOUBLE). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range('xyz', 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(STRING,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 'xyz', 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,STRING,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1, 'xyz'); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,STRING). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range([0], 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64[],INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, [1], 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64[],INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1, [1]); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,INT64[]). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range({start: 0}, 1, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(STRUCT(start:INT64),INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(0, 1, {step: 1}); ---- error Binder exception: Cannot match a built-in function for given function RANGE(INT64,INT64,STRUCT(step:INT64)). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST diff --git a/test/test_files/tck/match/match2.test b/test/test_files/tck/match/match2.test index e8eb7d79f33..4c06b5229e4 100644 --- a/test/test_files/tck/match/match2.test +++ b/test/test_files/tck/match/match2.test @@ -380,7 +380,7 @@ Binder exception: r has data type DOUBLE but (REL) was expected. Binder exception: r has data type STRING but (REL) was expected. -STATEMENT WITH [10] AS r MATCH ()-[r]-() RETURN r; ---- error -Binder exception: r has data type VAR_LIST but (REL) was expected. +Binder exception: r has data type LIST but (REL) was expected. -STATEMENT WITH {x: 1} AS r MATCH ()-[r]-() RETURN r; ---- error Binder exception: r has data type STRUCT but (REL) was expected. diff --git a/test/test_files/tck/match/match4.test b/test/test_files/tck/match/match4.test index dcc2c42d620..9802b38c3ca 100644 --- a/test/test_files/tck/match/match4.test +++ b/test/test_files/tck/match/match4.test @@ -66,7 +66,7 @@ ---- ok -STATEMENT CREATE REL TABLE T(FROM A TO A); ---- ok -# indexing on varlist causes segmentaion fault +# indexing on list causes segmentaion fault -STATEMENT CREATE (a {var: -2}), (b {var: 0}) WITH * UNWIND range(1, 20) AS i @@ -160,7 +160,7 @@ Binder exception: Bind relationship r to relationship with same name is not supp MATCH (first)-[rs*]->(second) RETURN first, second; ---- error -Binder exception: rs has data type VAR_LIST but (RECURSIVE_REL) was expected. +Binder exception: rs has data type LIST but (RECURSIVE_REL) was expected. # Fail when asterisk operator is missing # Fail on negative bound diff --git a/test/test_files/tinysnb/agg/hash.test b/test/test_files/tinysnb/agg/hash.test index c795470e8e4..4bcb6eaa913 100644 --- a/test/test_files/tinysnb/agg/hash.test +++ b/test/test_files/tinysnb/agg/hash.test @@ -353,7 +353,7 @@ True|\xAB\xCD {_ID: 0:2, _LABEL: person, ID: 3, fName: Carol, gender: 1, isStudent: False, isWorker: True, age: 45, eyeSight: 5.000000, birthdate: 1940-06-22, registerTime: 1911-08-20 02:32:21, lastJobDuration: 48:24:11, workedHours: [4,5], usedNames: [Carmen,Fred], courseScoresPerTerm: [[8,10]], grades: [91,75,21,95], height: 1.000000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13}|9 {_ID: 0:3, _LABEL: person, ID: 5, fName: Dan, gender: 2, isStudent: False, isWorker: True, age: 20, eyeSight: 4.800000, birthdate: 1950-07-23, registerTime: 2031-11-30 12:25:30, lastJobDuration: 10 years 5 months 13:00:00.000024, workedHours: [1,9], usedNames: [Wolfeschlegelstein,Daniel], courseScoresPerTerm: [[7,4],[8,8],[9]], grades: [76,88,99,89], height: 1.300000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14}|9 --CASE VarListHashTest +-CASE ListHashTest -STATEMENT CREATE (:person {ID: 17, usedNames: ['Alice'], workedHours: [1,2,3], courseScoresPerTerm: [[1,2],[3,4]]}) ---- ok -STATEMENT CREATE (:person {ID: 25, usedNames: ['Carmen'], workedHours: [10, 5], courseScoresPerTerm: [[1,2],[3,4]]}) diff --git a/test/test_files/tinysnb/cast/cast_error.test b/test/test_files/tinysnb/cast/cast_error.test index 1b41e89b3ae..74cbc2b7be6 100644 --- a/test/test_files/tinysnb/cast/cast_error.test +++ b/test/test_files/tinysnb/cast/cast_error.test @@ -581,24 +581,24 @@ Conversion exception: Cast failed. bool is not in INT64[] range. Conversion exception: Cast failed. [[231|4324] is not in INT64[][] range. -CASE CastStringToNestedError --STATEMENT LOAD WITH HEADERS (list STRING[][]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/delim_error.csv" (DELIM="|", ESCAPE="~", QUOTE="'") RETURN * ; +-STATEMENT LOAD WITH HEADERS (list STRING[][]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/delim_error.csv" (DELIM="|", ESCAPE="~", QUOTE="'") RETURN * ; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/delim_error.csv on line 1: Conversion exception: Cast failed. "[[hello],[bdfadf],]" is not in STRING[][] range. --STATEMENT LOAD WITH HEADERS (list STRING[][]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/bracket_error.csv" (DELIM="|", ESCAPE="~") RETURN * ; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/delim_error.csv on line 1: Conversion exception: Cast failed. "[[hello],[bdfadf],]" is not in STRING[][] range. +-STATEMENT LOAD WITH HEADERS (list STRING[][]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/bracket_error.csv" (DELIM="|", ESCAPE="~") RETURN * ; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/bracket_error.csv on line 1: Conversion exception: Cast failed. [[] is not in STRING[][] range. --STATEMENT LOAD WITH HEADERS (list STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/single_quote.csv" RETURN *; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/bracket_error.csv on line 1: Conversion exception: Cast failed. [[] is not in STRING[][] range. +-STATEMENT LOAD WITH HEADERS (list STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/single_quote.csv" RETURN *; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/single_quote.csv on line 1: Conversion exception: Cast failed. ['fdsfdsfe werw] is not in STRING[] range. --STATEMENT LOAD WITH HEADERS (list STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/single_quote2.csv" RETURN *; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/single_quote.csv on line 1: Conversion exception: Cast failed. ['fdsfdsfe werw] is not in STRING[] range. +-STATEMENT LOAD WITH HEADERS (list STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/single_quote2.csv" RETURN *; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/single_quote2.csv on line 1: Conversion exception: Cast failed. [[' this is a signle quote]] is not in STRING[] range. --STATEMENT LOAD WITH HEADERS (list UINT8[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/single_struct_bracket.csv" RETURN *; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/single_quote2.csv on line 1: Conversion exception: Cast failed. [[' this is a signle quote]] is not in STRING[] range. +-STATEMENT LOAD WITH HEADERS (list UINT8[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/single_struct_bracket.csv" RETURN *; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/single_struct_bracket.csv on line 1: Conversion exception: Cast failed. [{32, 32] is not in UINT8[] range. --STATEMENT LOAD WITH HEADERS (list UINT8[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/conversion_error.csv" RETURN *; +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/single_struct_bracket.csv on line 1: Conversion exception: Cast failed. [{32, 32] is not in UINT8[] range. +-STATEMENT LOAD WITH HEADERS (list UINT8[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/conversion_error.csv" RETURN *; ---- error -Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/conversion_error.csv on line 1: Conversion exception: Cast failed. Could not convert "432412" to UINT8. +Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/conversion_error.csv on line 1: Conversion exception: Cast failed. Could not convert "432412" to UINT8. -STATEMENT LOAD WITH HEADERS (q STRUCT(a STRUCT(b STRING))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/struct/struct_bracket_error1.csv" RETURN *; ---- error Copy exception: Error in file ${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/struct/struct_bracket_error1.csv on line 1: Conversion exception: Cast failed. {a: {b: fsdf is not in STRUCT(a:STRUCT(b:STRING)) range. @@ -692,16 +692,16 @@ Conversion exception: Unsupported casting function from REL to TIMESTAMP. ---- error Conversion exception: Unsupported casting function from RECURSIVE_REL to INT64. --LOG InvalidVarListToVarList +-LOG InvalidListToList -STATEMENT RETURN cast([31231], "INT64[][]"); ---- error -Conversion exception: Unsupported casting function from INT64 to VAR_LIST. +Conversion exception: Unsupported casting function from INT64 to LIST. -STATEMENT RETURN cast([-1], "UINT8[]"); ---- error Overflow exception: Value -1 is not within UINT8 range -STATEMENT RETURN cast([[1, 1]], "UINT8[]"); ---- error -Conversion exception: Unsupported casting function from VAR_LIST to UINT8. +Conversion exception: Unsupported casting function from LIST to UINT8. -LOG InvalidMapToMap -STATEMENT RETURN cast(cast("{-1=3}", "MAP(INT64, INT64)"), "MAP(UINT8, UINT8)"); @@ -754,16 +754,16 @@ Overflow exception: Value 1000000000000000000 is not within INT16 range Overflow exception: Value 43121 is not within INT8 range -STATEMENT RETURN cast([[1000000000000000000]], "INT64[1]"); ---- error -Conversion exception: Unsupported casting function from VAR_LIST to INT64. +Conversion exception: Unsupported casting function from LIST to INT64. -STATEMENT RETURN cast([1, 2], "DOUBLE[100]"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 100, Actual: 2. +Conversion exception: Unsupported casting LIST with incorrect list entry to ARRAY. Expected: 100, Actual: 2. -STATEMENT RETURN cast([[1, 2], [1, 4], [2, 4, 5], [1, 2]], "INT64[2][]"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 2, Actual: 3. +Conversion exception: Unsupported casting LIST with incorrect list entry to ARRAY. Expected: 2, Actual: 3. -STATEMENT RETURN cast(cast("{3={}, 3= {a: 12}, 3={a:32, b:[1, 2, 3]}}", "MAP(STRING, STRUCT(a INT64, b INT64[]))"), "MAP(STRING, STRUCT(a INT64, b INT64[1]))"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 1, Actual: 3. +Conversion exception: Unsupported casting LIST with incorrect list entry to ARRAY. Expected: 1, Actual: 3. -LOG InvalidArrayToArray -STATEMENT RETURN cast(cast([4, 1], "INT16[2]"), "FLOAT[3]"); @@ -776,10 +776,10 @@ Conversion exception: Unsupported casting function from INT16[2] to FLOAT[1]. -LOG InvalidNestedCast -STATEMENT RETURN cast({a: {b: {c: [[1, 3, 4]], d: "str"}}, e: [1, 9, NULL]}, "STRUCT(a STRUCT(b STRUCT(c INT64[2][], d STRING)), e INT128[3])"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 2, Actual: 3. +Conversion exception: Unsupported casting LIST with incorrect list entry to ARRAY. Expected: 2, Actual: 3. -STATEMENT RETURN cast(cast("{a: {b: {c: [[1, 3, 4]], d: {18=[3, 2]}}}, e: [1, 9, 3]}", "STRUCT(a STRUCT(b STRUCT(c INT64[3][], d MAP(INT32,INT32[]))), e FLOAT[3])"), "STRUCT(a STRUCT(b STRUCT(c INT64[3][], d MAP(INT32,INT32[5]))), e INT32[3])"); ---- error -Conversion exception: Unsupported casting VAR_LIST with incorrect list entry to ARRAY. Expected: 5, Actual: 2. +Conversion exception: Unsupported casting LIST with incorrect list entry to ARRAY. Expected: 5, Actual: 2. -LOG InvalidNameCast -STATEMENT RETURN cast("nop", "STRUCT()"); diff --git a/test/test_files/tinysnb/cast/cast_to_nested_types.test b/test/test_files/tinysnb/cast/cast_to_nested_types.test index 3dc6ebfe8e8..e33e3c39254 100644 --- a/test/test_files/tinysnb/cast/cast_to_nested_types.test +++ b/test/test_files/tinysnb/cast/cast_to_nested_types.test @@ -4,7 +4,7 @@ -- -CASE CastToNestedTypes --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN *; +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/should_pass.csv" RETURN *; ---- 10 [[1,3,423,124,43242],[432]]|{num: -423432, str: this is a string []}|[255,254,43] [[1,3,423,124,43242],[432]]|{num: 3423423, str: this is a string}|[250,249,21] @@ -16,7 +16,7 @@ []||[111,0,0] ||[0,111,12] |{num: , str: }|[0,0,0] --STATEMENT LOAD WITH HEADERS (list STRING[], str STRING, struct STRUCT(a STRUCT(b STRUCT(c INT64[])))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/change_config.csv" (HEADER=true, DELIM="|", DELIM="|", ESCAPE="~", QUOTE="'") RETURN * ; +-STATEMENT LOAD WITH HEADERS (list STRING[], str STRING, struct STRUCT(a STRUCT(b STRUCT(c INT64[])))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/change_config.csv" (HEADER=true, DELIM="|", DELIM="|", ESCAPE="~", QUOTE="'") RETURN * ; ---- 3 [escape,is escape success? ~]| ' [ ] do not need to escape sepeical | []|{a: {b: }} [this,is a word,normal not escape,' [ ] | , ~ ']|try escape ~|{a: {b: {c: [3432423,-43423,31231,]}}} @@ -74,7 +74,7 @@ True|2022-06-06|4324.123047|-32768| 0|0|2014-05-12 12:11:59|4324254534123134124032.000000|fsaf False|-4325||18446744073709551616.000000| dfsa --LOG CastToVarList +-LOG CastToList -STATEMENT RETURN cast(" [ [ 1 ,3, 423 , 124,43242 ] , [ 432 ]]", "INT64[][]"); ---- 1 [[1,3,423,124,43242],[432]] @@ -182,7 +182,7 @@ True|2019-03-19|-12.343200|32768| 0|0|2014-05-12 12:11:59|4324254534123134124032.000000|fsaf False|-4325|14|18446744073709551616.000000| dfsa --LOG CastVarListToVarList +-LOG CastListToList -STATEMENT RETURN cast([321, 432], "DOUBLE[]"), cast([321, 432], "FLOAT[]"), cast([321, 432], "INT128[]"), cast([321, 432], "INT64[]"), cast([321, 432], "INT32[]"), cast([321, 432], "INT16[]"), cast([-1, -43], "INT8[]"), cast([0, 23], "UINT8[]"), cast([0, 23], "UINT16[]"), cast([0, 23], "UINT32[]"), cast([0, 23], "UINT64[]"), cast([5435234412435123, -432425341231], "STRING[]"); ---- 1 [321.000000,432.000000]|[321.000000,432.000000]|[321,432]|[321,432]|[321,432]|[321,432]|[-1,-43]|[0,23]|[0,23]|[0,23]|[0,23]|[5435234412435123,-432425341231] @@ -190,7 +190,7 @@ False|-4325|14|18446744073709551616.000000| dfsa ---- 1 []|[,]||[,432124,0,] --LOG CastNestedVarListToNestedVarList +-LOG CastNestedListToNestedList -STATEMENT RETURN cast([[4324.2312, 432.321, 43242.543], [31214.59,4132.72], NULL, [NULL,,4324.32]], "INT64[][]"); ---- 1 [[4324,432,43243],[31215,4133],,[,,4324]] @@ -249,7 +249,7 @@ False|-4325|14|18446744073709551616.000000| dfsa -STATEMENT RETURN cast(cast(cast("{a: 12, b: 0}", "STRUCT(a STRING, b STRING, c STRING)"), "STRUCT(a INT128, b INT128, c INT128)"), "STRUCT(a INT64, b INT64, c INT64)"), cast(cast(cast("{a: 15}", "STRUCT(a STRING, b STRING)"), "STRUCT(a INT32, b INT32)"), "STRUCT(a INT16, b INT16)"), cast(cast(cast("{b: 15}", "STRUCT(a STRING, b STRING)"), "STRUCT(a INT8, b INT8)"), "STRUCT(a UINT16, b UINT16)"), cast(cast(cast("{}", "STRUCT(a STRING, b STRING)"), "STRUCT(a UINT32, b UINT32)"), "STRUCT(a UINT64, b UINT64)"), cast(cast("{a: 12, b: 0}", "STRUCT(a STRING, b STRING)"), "STRUCT(a DOUBLE, b DOUBLE)"), cast(cast("{a: 12, b: 0}", "STRUCT(a STRING, b STRING)"), "STRUCT(a FLOAT, b FLOAT)"); ---- 1 {a: 12, b: 0, c: }|{a: 15, b: }|{a: , b: 15}|{a: , b: }|{a: 12.000000, b: 0.000000}|{a: 12.000000, b: 0.000000} --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(a, "struct(num INT64, str STRING)"), cast(a, "struct(num INT128, str STRING)"), cast(a, "struct(num STRING, str STRING)"), cast(a, "struct(num DOUBLE, str STRING)"), cast(a, "struct(num FLOAT, str STRING)"); +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/should_pass.csv" RETURN cast(a, "struct(num INT64, str STRING)"), cast(a, "struct(num INT128, str STRING)"), cast(a, "struct(num STRING, str STRING)"), cast(a, "struct(num DOUBLE, str STRING)"), cast(a, "struct(num FLOAT, str STRING)"); ---- 10 {num: -423432, str: this is a string []}|{num: -423432, str: this is a string []}|{num: -423432, str: this is a string []}|{num: -423432.000000, str: this is a string []}|{num: -423432.000000, str: this is a string []} {num: 0, str: this is a string}|{num: 0, str: this is a string}|{num: 0, str: this is a string}|{num: 0.000000, str: this is a string}|{num: 0.000000, str: this is a string} @@ -263,7 +263,7 @@ False|-4325|14|18446744073709551616.000000| dfsa |||| -LOG CastNestedStructToStruct --STATEMENT LOAD WITH HEADERS (list STRING[], str STRING, struct STRUCT(a STRUCT(b STRUCT(c INT64[])))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/change_config.csv" (HEADER=true, DELIM="|", DELIM="|", ESCAPE="~", QUOTE="'") RETURN cast(struct, "STRUCT(a STRUCT(b STRUCT(c INT128[])))"), cast(struct, "STRUCT(a STRUCT(b STRUCT(c DOUBLE[])))"), cast(struct, "STRUCT(a STRUCT(b STRUCT(c STRING)))"), cast(struct, "STRUCT(a STRUCT(b STRING))"), cast(struct, "STRUCT(a STRING)"); +-STATEMENT LOAD WITH HEADERS (list STRING[], str STRING, struct STRUCT(a STRUCT(b STRUCT(c INT64[])))) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/change_config.csv" (HEADER=true, DELIM="|", DELIM="|", ESCAPE="~", QUOTE="'") RETURN cast(struct, "STRUCT(a STRUCT(b STRUCT(c INT128[])))"), cast(struct, "STRUCT(a STRUCT(b STRUCT(c DOUBLE[])))"), cast(struct, "STRUCT(a STRUCT(b STRUCT(c STRING)))"), cast(struct, "STRUCT(a STRUCT(b STRING))"), cast(struct, "STRUCT(a STRING)"); ---- 3 {a: {b: {c: [3432423,-43423,31231,]}}}|{a: {b: {c: [3432423.000000,-43423.000000,31231.000000,]}}}|{a: {b: {c: [3432423,-43423,31231,]}}}|{a: {b: {c: [3432423,-43423,31231,]}}}|{a: {b: {c: [3432423,-43423,31231,]}}} {a: {b: {c: }}}|{a: {b: {c: }}}|{a: {b: {c: }}}|{a: {b: {c: }}}|{a: {b: {c: }}} @@ -283,7 +283,7 @@ False|-4325|14|18446744073709551616.000000| dfsa -STATEMENT RETURN cast(cast("[1,2,3]", "INT64[3]"), "INT128[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT64[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT32[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT16[]"), cast(cast("[1,2,3]", "INT64[3]"), "INT8[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT64[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT32[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT16[]"), cast(cast("[1,2,3]", "INT64[3]"), "UINT8[]"), cast(cast("[1,2,3]", "INT64[3]"), "DOUBLE[]"), cast(cast("[1,2,3]", "INT64[3]"), "STRING[]"), cast(cast("[1,2,3]", "INT64[3]"), "FLOAT[]"); ---- 1 [1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1,2,3]|[1.000000,2.000000,3.000000]|[1,2,3]|[1.000000,2.000000,3.000000] --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(cast(cast(array, "DOUBLE[]"), "STRING[]"), "FLOAT[]"); +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array INT16[3]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/should_pass.csv" RETURN cast(cast(cast(array, "DOUBLE[]"), "STRING[]"), "FLOAT[]"); ---- 10 @@ -305,7 +305,7 @@ False|-4325|14|18446744073709551616.000000| dfsa -STATEMENT RETURN cast([1], "INT64[1]"), cast([1], "INT32[1]"), cast([1], "INT16[1]"), cast([1], "DOUBLE[1]"), cast([1], "FLOAT[1]"), cast(NULL, "INT64[15]"); ---- 1 [1]|[1]|[1]|[1.000000]|[1.000000]| --STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/var_list/should_pass.csv" RETURN cast(cast(cast(array, "INT16[3]"), "STRING[]"), "FLOAT[3]"); +-STATEMENT LOAD WITH HEADERS (list INT64[][], a struct(num INT64, str STRING), array STRING[]) FROM "${KUZU_ROOT_DIRECTORY}/dataset/load-from-test/list/should_pass.csv" RETURN cast(cast(cast(array, "INT16[3]"), "STRING[]"), "FLOAT[3]"); ---- 10 diff --git a/test/test_files/tinysnb/exception/list.test b/test/test_files/tinysnb/exception/list.test index 20f8eef086f..30a1f6eb010 100644 --- a/test/test_files/tinysnb/exception/list.test +++ b/test/test_files/tinysnb/exception/list.test @@ -12,7 +12,7 @@ Binder exception: Expression LIST_CREATION(A,B) has data type STRING[] but expec -STATEMENT MATCH (a:person) RETURN array_concat(a.workedHours, a.age) ---- error Binder exception: Cannot match a built-in function for given function ARRAY_CONCAT(INT64[],INT64). Supported inputs are -(VAR_LIST,VAR_LIST) -> VAR_LIST +(LIST,LIST) -> LIST -STATEMENT MATCH (a:person) RETURN array_concat(a.workedHours, ['A']) ---- error diff --git a/test/test_files/tinysnb/function/map.test b/test/test_files/tinysnb/function/map.test index 24f09b0ac0b..ce02c8288fc 100644 --- a/test/test_files/tinysnb/function/map.test +++ b/test/test_files/tinysnb/function/map.test @@ -35,7 +35,7 @@ ---- 1 [3.200000] --LOG MapExtractVarList +-LOG MapExtractList -STATEMENT RETURN element_at(map([1, 88], [[4,5], [2,3,1]]), 1) ---- 1 [[4,5]] diff --git a/test/test_files/tinysnb/function/range.test b/test/test_files/tinysnb/function/range.test index 48c45a21d70..cb2a815a003 100644 --- a/test/test_files/tinysnb/function/range.test +++ b/test/test_files/tinysnb/function/range.test @@ -55,16 +55,16 @@ Runtime exception: Step of range cannot be 0. -STATEMENT MATCH (a) RETURN range(a.NAME, 4, 1); ---- error Binder exception: Cannot match a built-in function for given function RANGE(STRING,INT64,INT64). Supported inputs are -(INT64,INT64) -> VAR_LIST -(INT64,INT64,INT64) -> VAR_LIST -(INT32,INT32) -> VAR_LIST -(INT32,INT32,INT32) -> VAR_LIST -(INT16,INT16) -> VAR_LIST -(INT16,INT16,INT16) -> VAR_LIST -(INT8,INT8) -> VAR_LIST -(INT8,INT8,INT8) -> VAR_LIST -(SERIAL,SERIAL) -> VAR_LIST -(SERIAL,SERIAL,SERIAL) -> VAR_LIST +(INT64,INT64) -> LIST +(INT64,INT64,INT64) -> LIST +(INT32,INT32) -> LIST +(INT32,INT32,INT32) -> LIST +(INT16,INT16) -> LIST +(INT16,INT16,INT16) -> LIST +(INT8,INT8) -> LIST +(INT8,INT8,INT8) -> LIST +(SERIAL,SERIAL) -> LIST +(SERIAL,SERIAL,SERIAL) -> LIST -STATEMENT RETURN range(4, 3); ---- 1 [] diff --git a/test/test_files/tinysnb/nested_types/nested_types.test b/test/test_files/tinysnb/nested_types/nested_types.test index b660f0223af..f03a887af3a 100644 --- a/test/test_files/tinysnb/nested_types/nested_types.test +++ b/test/test_files/tinysnb/nested_types/nested_types.test @@ -185,7 +185,7 @@ Hubert Blaine Wolfeschlegelsteinhausenbergerdorff -STATEMENT MATCH (a) RETURN a.* UNION ALL MATCH (b) RETURN b.* ---- ok --CASE RelVarList +-CASE RelList -STATEMENT MATCH (a:person)-[r:knows]->(b:person) RETURN r.comments ---- 14 [rnme,m8sihsdnf2990nfiwf] diff --git a/test/test_files/tinysnb/path/path.test b/test/test_files/tinysnb/path/path.test index b1f8ab146a2..62d81362978 100644 --- a/test/test_files/tinysnb/path/path.test +++ b/test/test_files/tinysnb/path/path.test @@ -83,18 +83,18 @@ -STATEMENT MATCH p = (a:person)-[e:knows*1..2]->(b:person) RETURN size(a) ---- error Binder exception: Cannot match a built-in function for given function SIZE(NODE). Supported inputs are -(VAR_LIST) -> INT64 +(LIST) -> INT64 (MAP) -> INT64 (STRING) -> INT64 -STATEMENT MATCH p = (a:person)-[e:knows*1..2]->(b:person) RETURN size(p) ---- error Binder exception: Cannot match a built-in function for given function SIZE(RECURSIVE_REL). Supported inputs are -(VAR_LIST) -> INT64 +(LIST) -> INT64 (MAP) -> INT64 (STRING) -> INT64 -STATEMENT MATCH p = (a:person)-[e:knows]->(b:person) RETURN size(e) ---- error Binder exception: Cannot match a built-in function for given function SIZE(REL). Supported inputs are -(VAR_LIST) -> INT64 +(LIST) -> INT64 (MAP) -> INT64 (STRING) -> INT64 diff --git a/test/test_files/tinysnb/unwind/unwind.test b/test/test_files/tinysnb/unwind/unwind.test index 75c30785856..1c0e2c27fd7 100644 --- a/test/test_files/tinysnb/unwind/unwind.test +++ b/test/test_files/tinysnb/unwind/unwind.test @@ -17,10 +17,10 @@ Binder exception: Cannot set expression n with type VARIABLE. Expect node or rel Binder exception: Cannot delete expression n with type VARIABLE. Expect node or rel pattern. -STATEMENT UNWIND 1 AS a RETURN a; ---- error -Binder exception: 1 has data type INT64 but VAR_LIST was expected. +Binder exception: 1 has data type INT64 but LIST was expected. -STATEMENT MATCH p = (a:person)-[e:knows*1..2]->(b:person) UNWIND p AS x RETURN x; ---- error -Binder exception: p has data type RECURSIVE_REL but VAR_LIST was expected. +Binder exception: p has data type RECURSIVE_REL but LIST was expected. -STATEMENT MATCH p = (a:person)-[e:knows*1..1]->(b:person) UNWIND nodes(p) AS x RETURN x.fName, COUNT(*); ---- 7 Alice|6 diff --git a/test/test_files/update_node/create_empty.test b/test/test_files/update_node/create_empty.test index b2abd0f580c..74f7b552b7e 100644 --- a/test/test_files/update_node/create_empty.test +++ b/test/test_files/update_node/create_empty.test @@ -36,7 +36,7 @@ -STATEMENT COMMIT ---- ok --CASE CreateVarList +-CASE CreateList -STATEMENT CREATE NODE TABLE test(id INT64, prop STRING[], PRIMARY KEY(id)); ---- ok -STATEMENT CREATE (a:test {id:1, prop:['A', 'B', 'C', 'This is a long string for test']}) diff --git a/tools/java_api/src/jni/kuzu_java.cpp b/tools/java_api/src/jni/kuzu_java.cpp index 29911ef785b..4f7418cd988 100644 --- a/tools/java_api/src/jni/kuzu_java.cpp +++ b/tools/java_api/src/jni/kuzu_java.cpp @@ -545,7 +545,7 @@ JNIEXPORT jlong JNICALL Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1create( auto extraTypeInfo = num_elements_in_array > 0 ? std::make_unique( std::move(child_type_pty), num_elements_in_array) : - std::make_unique(std::move(child_type_pty)); + std::make_unique(std::move(child_type_pty)); data_type = JavaAPIHelper::createLogicalType(logicalTypeID, std::move(extraTypeInfo)); } uint64_t address = reinterpret_cast(data_type); @@ -593,8 +593,8 @@ JNIEXPORT jobject JNICALL Java_com_kuzudb_KuzuNative_kuzu_1data_1type_1get_1chil LogicalType* child_type; if (parent_type->getLogicalTypeID() == LogicalTypeID::ARRAY) { child_type = ArrayType::getChildType(parent_type); - } else if (parent_type->getLogicalTypeID() == LogicalTypeID::VAR_LIST) { - child_type = VarListType::getChildType(parent_type); + } else if (parent_type->getLogicalTypeID() == LogicalTypeID::LIST) { + child_type = ListType::getChildType(parent_type); } else { return nullptr; } diff --git a/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java b/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java index 09fff10ef2c..20e94b971d2 100644 --- a/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java +++ b/tools/java_api/src/main/java/com/kuzudb/KuzuDataTypeID.java @@ -31,7 +31,7 @@ public enum KuzuDataTypeID { INTERNAL_ID(42), STRING(50), BLOB(51), - VAR_LIST(52), + LIST(52), ARRAY(53), STRUCT(54), MAP(55), diff --git a/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java b/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java index 158db7e05a8..6829ff50fe3 100644 --- a/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java +++ b/tools/java_api/src/test/java/com/kuzudb/test/DataTypeTest.java @@ -16,11 +16,11 @@ void DataTypeClone() throws KuzuObjectRefDestroyedException { assertNotNull(dataTypeClone); assertEquals(dataTypeClone.getID(), KuzuDataTypeID.INT64); - KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.VAR_LIST, dataType, 0); + KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.LIST, dataType, 0); assertNotNull(dataType2); KuzuDataType dataTypeClone2 = dataType2.clone(); assertNotNull(dataTypeClone2); - assertEquals(dataTypeClone2.getID(), KuzuDataTypeID.VAR_LIST); + assertEquals(dataTypeClone2.getID(), KuzuDataTypeID.LIST); assertEquals(dataTypeClone2.getChildType().getID(), KuzuDataTypeID.INT64); KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); @@ -49,7 +49,7 @@ void DataTypeEquals() throws KuzuObjectRefDestroyedException { assertNotNull(dataTypeClone); assertTrue(dataType.equals(dataTypeClone)); - KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.VAR_LIST, dataType, 0); + KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.LIST, dataType, 0); assertNotNull(dataType2); KuzuDataType dataTypeClone2 = dataType2.clone(); assertNotNull(dataTypeClone2); @@ -80,9 +80,9 @@ void DataTypeGetID() throws KuzuObjectRefDestroyedException { assertNotNull(dataType); assertEquals(dataType.getID(), KuzuDataTypeID.INT64); - KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.VAR_LIST, dataType, 0); + KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.LIST, dataType, 0); assertNotNull(dataType2); - assertEquals(dataType2.getID(), KuzuDataTypeID.VAR_LIST); + assertEquals(dataType2.getID(), KuzuDataTypeID.LIST); KuzuDataType dataType3 = new KuzuDataType(KuzuDataTypeID.ARRAY, dataType, 100); assertNotNull(dataType3); @@ -98,7 +98,7 @@ void DataTypeGetChildType() throws KuzuObjectRefDestroyedException { KuzuDataType dataType = new KuzuDataType(KuzuDataTypeID.INT64, null, 0); assertNotNull(dataType); - KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.VAR_LIST, dataType, 0); + KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.LIST, dataType, 0); assertNotNull(dataType2); assertEquals(dataType2.getChildType().getID(), KuzuDataTypeID.INT64); @@ -117,7 +117,7 @@ void DataTypeGetFixedNumElementsInList() throws KuzuObjectRefDestroyedException assertNotNull(dataType); assertEquals(dataType.getFixedNumElementsInList(), 0); - KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.VAR_LIST, dataType, 0); + KuzuDataType dataType2 = new KuzuDataType(KuzuDataTypeID.LIST, dataType, 0); assertNotNull(dataType2); assertEquals(dataType.getFixedNumElementsInList(), 0); diff --git a/tools/java_api/src/test/java/com/kuzudb/test/ValueTest.java b/tools/java_api/src/test/java/com/kuzudb/test/ValueTest.java index 00338caf143..4e1c057885e 100644 --- a/tools/java_api/src/test/java/com/kuzudb/test/ValueTest.java +++ b/tools/java_api/src/test/java/com/kuzudb/test/ValueTest.java @@ -323,7 +323,7 @@ void ValueGetDatatype() throws KuzuObjectRefDestroyedException { value = flatTuple.getValue(2); dataType = value.getDataType(); - assertEquals(dataType.getID(), KuzuDataTypeID.VAR_LIST); + assertEquals(dataType.getID(), KuzuDataTypeID.LIST); KuzuDataType childDataType = dataType.getChildType(); assertEquals(childDataType.getID(), KuzuDataTypeID.INT64); childDataType.destroy(); diff --git a/tools/nodejs_api/src_cpp/node_util.cpp b/tools/nodejs_api/src_cpp/node_util.cpp index bb925a884a3..fd676a9fc34 100644 --- a/tools/nodejs_api/src_cpp/node_util.cpp +++ b/tools/nodejs_api/src_cpp/node_util.cpp @@ -184,7 +184,7 @@ Napi::Value Util::ConvertToNapiObject(const Value& value, Napi::Env env) { auto milliseconds = microseconds / Interval::MICROS_PER_MSEC; return Napi::Number::New(env, milliseconds); } - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: { auto size = NestedVal::getChildrenSize(&value); auto napiArray = Napi::Array::New(env, size); diff --git a/tools/nodejs_api/test/test_data_type.js b/tools/nodejs_api/test/test_data_type.js index 75b4eb598c0..033eb107e95 100644 --- a/tools/nodejs_api/test/test_data_type.js +++ b/tools/nodejs_api/test/test_data_type.js @@ -339,8 +339,8 @@ describe("INTERVAL", function () { }); }); -describe("VAR_LIST", function () { - it("should convert VAR_LIST type", async function () { +describe("LIST", function () { + it("should convert LIST type", async function () { const queryResult = await conn.query( "MATCH (a:person) WHERE a.ID = 0 RETURN a.courseScoresPerTerm;" ); diff --git a/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp b/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp index 354aa9a55b3..0e8a35b3c66 100644 --- a/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_analyzer.cpp @@ -11,14 +11,14 @@ static bool upgradeType(common::LogicalType& left, const common::LogicalType& ri return true; } if (left.getLogicalTypeID() == common::LogicalTypeID::ANY || - ((left.getLogicalTypeID() == common::LogicalTypeID::VAR_LIST) && - (common::VarListType::getChildType(&left)->getLogicalTypeID() == + ((left.getLogicalTypeID() == common::LogicalTypeID::LIST) && + (common::ListType::getChildType(&left)->getLogicalTypeID() == common::LogicalTypeID::ANY))) { left = right; return true; } - if (((right.getLogicalTypeID() == common::LogicalTypeID::VAR_LIST) && - (common::VarListType::getChildType(&right)->getLogicalTypeID() == + if (((right.getLogicalTypeID() == common::LogicalTypeID::LIST) && + (common::ListType::getChildType(&right)->getLogicalTypeID() == common::LogicalTypeID::ANY))) { return true; } @@ -71,7 +71,7 @@ common::LogicalType PandasAnalyzer::getItemType(py::object ele, bool& canConvert case PythonObjectType::String: return *common::LogicalType::STRING(); case PythonObjectType::List: - return *common::LogicalType::VAR_LIST(getListType(ele, canConvert)); + return *common::LogicalType::LIST(getListType(ele, canConvert)); default: KU_UNREACHABLE; } diff --git a/tools/python_api/src_cpp/py_connection.cpp b/tools/python_api/src_cpp/py_connection.cpp index 37f206a4976..b98c7bac3aa 100644 --- a/tools/python_api/src_cpp/py_connection.cpp +++ b/tools/python_api/src_cpp/py_connection.cpp @@ -194,12 +194,12 @@ static bool canCastPyLogicalType(const LogicalType& from, const LogicalType& to) canCastPyLogicalType(*toKeyType, *fromKeyType)) && (canCastPyLogicalType(*fromValueType, *toValueType) || canCastPyLogicalType(*toValueType, *fromValueType)); - } else if (from.getLogicalTypeID() == LogicalTypeID::VAR_LIST) { - if (to.getLogicalTypeID() != LogicalTypeID::VAR_LIST) { + } else if (from.getLogicalTypeID() == LogicalTypeID::LIST) { + if (to.getLogicalTypeID() != LogicalTypeID::LIST) { return false; } return canCastPyLogicalType( - *VarListType::getChildType(&from), *VarListType::getChildType(&to)); + *ListType::getChildType(&from), *ListType::getChildType(&to)); } else { auto castCost = function::BuiltInFunctionsUtils::getCastCost( from.getLogicalTypeID(), to.getLogicalTypeID()); @@ -266,7 +266,7 @@ static std::unique_ptr pyLogicalType(py::handle val) { auto curChildType = pyLogicalType(child); tryConvertPyLogicalType(*childType, *curChildType); } - return LogicalType::VAR_LIST(std::move(childType)); + return LogicalType::LIST(std::move(childType)); } else if (py::isinstance(val)) { py::dict dict = py::reinterpret_borrow(val); auto childKeyType = LogicalType::ANY(), childValueType = LogicalType::ANY(); @@ -343,12 +343,12 @@ static Value transformPythonValueAs(py::handle val, const LogicalType* type) { uuidToAppend.value = uuidVal; return Value{uuidToAppend}; } - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { py::list lst = py::reinterpret_borrow(val); std::vector> children; for (auto child : lst) { children.push_back(std::make_unique( - transformPythonValueAs(child, VarListType::getChildType(type)))); + transformPythonValueAs(child, ListType::getChildType(type)))); } return Value(std::make_unique(*type), std::move(children)); } diff --git a/tools/python_api/src_cpp/py_query_result.cpp b/tools/python_api/src_cpp/py_query_result.cpp index f20d3ea9b1b..6a8446e4bfa 100644 --- a/tools/python_api/src_cpp/py_query_result.cpp +++ b/tools/python_api/src_cpp/py_query_result.cpp @@ -242,7 +242,7 @@ py::object PyQueryResult::convertValueToPyObject(const Value& value) { return py::cast(importCache->datetime.timedelta()(py::arg("days") = days, py::arg("microseconds") = intervalVal.micros)); } - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: { py::list list; for (auto i = 0u; i < NestedVal::getChildrenSize(&value); ++i) { diff --git a/tools/python_api/src_cpp/py_query_result_converter.cpp b/tools/python_api/src_cpp/py_query_result_converter.cpp index 9fb9f2ef0a8..9c75c157d8b 100644 --- a/tools/python_api/src_cpp/py_query_result_converter.cpp +++ b/tools/python_api/src_cpp/py_query_result_converter.cpp @@ -94,7 +94,7 @@ void NPArrayWrapper::appendElement(Value* value) { ((py::object*)dataBuffer)[numElements] = PyQueryResult::convertValueToPyObject(*value); } break; case LogicalTypeID::ARRAY: - case LogicalTypeID::VAR_LIST: { + case LogicalTypeID::LIST: { ((py::list*)dataBuffer)[numElements] = PyQueryResult::convertValueToPyObject(*value); } break; case LogicalTypeID::RECURSIVE_REL: { @@ -173,7 +173,7 @@ py::dtype NPArrayWrapper::convertToArrayType(const LogicalType& type) { case LogicalTypeID::STRUCT: case LogicalTypeID::NODE: case LogicalTypeID::REL: - case LogicalTypeID::VAR_LIST: + case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: case LogicalTypeID::STRING: case LogicalTypeID::MAP: diff --git a/tools/python_api/src_py/types.py b/tools/python_api/src_py/types.py index 4ec3f7b7830..4566e24af54 100644 --- a/tools/python_api/src_py/types.py +++ b/tools/python_api/src_py/types.py @@ -32,7 +32,7 @@ class Type(Enum): STRING = "STRING" BLOB = "BLOB" UUID = "UUID" - VAR_LIST = "VAR_LIST" + LIST = "LIST" ARRAY = "ARRAY" STRUCT = "STRUCT" MAP = "MAP" diff --git a/tools/rust_api/include/kuzu_rs.h b/tools/rust_api/include/kuzu_rs.h index 8cfca801b5e..0155aa4d97b 100644 --- a/tools/rust_api/include/kuzu_rs.h +++ b/tools/rust_api/include/kuzu_rs.h @@ -39,7 +39,7 @@ struct QueryParams { std::unique_ptr new_params(); std::unique_ptr create_logical_type(kuzu::common::LogicalTypeID id); -std::unique_ptr create_logical_type_var_list( +std::unique_ptr create_logical_type_list( std::unique_ptr childType); std::unique_ptr create_logical_type_array( std::unique_ptr childType, uint64_t numElements); @@ -68,7 +68,7 @@ inline std::unique_ptr create_logical_type_rdf_varian return kuzu::common::LogicalType::RDF_VARIANT(); } -const kuzu::common::LogicalType& logical_type_get_var_list_child_type( +const kuzu::common::LogicalType& logical_type_get_list_child_type( const kuzu::common::LogicalType& logicalType); const kuzu::common::LogicalType& logical_type_get_array_child_type( const kuzu::common::LogicalType& logicalType); diff --git a/tools/rust_api/src/connection.rs b/tools/rust_api/src/connection.rs index 68bae150e07..853d941f287 100644 --- a/tools/rust_api/src/connection.rs +++ b/tools/rust_api/src/connection.rs @@ -128,7 +128,7 @@ impl<'a> Connection<'a> { // should be generic. // // E.g. - // let result: QueryResult> = conn.query("...")?; + // let result: QueryResult> = conn.query("...")?; // let result: QueryResult = conn.query("...")?; // // But this would really just be syntactic sugar wrapping the current system diff --git a/tools/rust_api/src/ffi.rs b/tools/rust_api/src/ffi.rs index 00dc763f4f7..f906838285b 100644 --- a/tools/rust_api/src/ffi.rs +++ b/tools/rust_api/src/ffi.rs @@ -78,7 +78,7 @@ pub(crate) mod ffi { // variable size types STRING = 50, BLOB = 51, - VAR_LIST = 52, + LIST = 52, ARRAY = 53, STRUCT = 54, MAP = 55, @@ -205,9 +205,7 @@ pub(crate) mod ffi { fn getLogicalTypeID(&self) -> LogicalTypeID; fn create_logical_type(id: LogicalTypeID) -> UniquePtr; - fn create_logical_type_var_list( - child_type: UniquePtr, - ) -> UniquePtr; + fn create_logical_type_list(child_type: UniquePtr) -> UniquePtr; fn create_logical_type_array( child_type: UniquePtr, num_elements: u64, @@ -225,7 +223,7 @@ pub(crate) mod ffi { valueType: UniquePtr, ) -> UniquePtr; - fn logical_type_get_var_list_child_type(value: &LogicalType) -> &LogicalType; + fn logical_type_get_list_child_type(value: &LogicalType) -> &LogicalType; fn logical_type_get_array_child_type(value: &LogicalType) -> &LogicalType; fn logical_type_get_array_num_elements(value: &LogicalType) -> u64; fn logical_type_get_struct_field_names(value: &LogicalType) -> Vec; diff --git a/tools/rust_api/src/kuzu_rs.cpp b/tools/rust_api/src/kuzu_rs.cpp index 59f2e3d7aa5..545291d3424 100644 --- a/tools/rust_api/src/kuzu_rs.cpp +++ b/tools/rust_api/src/kuzu_rs.cpp @@ -8,7 +8,7 @@ using kuzu::common::NodeVal; using kuzu::common::RelVal; using kuzu::common::StructField; using kuzu::common::Value; -using kuzu::common::VarListTypeInfo; +using kuzu::common::ListTypeInfo; using kuzu::main::Connection; using kuzu::main::Database; using kuzu::main::SystemConfig; @@ -22,8 +22,8 @@ std::unique_ptr new_params() { std::unique_ptr create_logical_type(kuzu::common::LogicalTypeID id) { return std::make_unique(id); } -std::unique_ptr create_logical_type_var_list(std::unique_ptr childType) { - return LogicalType::VAR_LIST(std::move(childType)); +std::unique_ptr create_logical_type_list(std::unique_ptr childType) { + return LogicalType::LIST(std::move(childType)); } std::unique_ptr create_logical_type_array( @@ -36,8 +36,8 @@ std::unique_ptr create_logical_type_map( return LogicalType::MAP(std::move(keyType), std::move(valueType)); } -const LogicalType& logical_type_get_var_list_child_type(const LogicalType& logicalType) { - return *kuzu::common::VarListType::getChildType(&logicalType); +const LogicalType& logical_type_get_list_child_type(const LogicalType& logicalType) { + return *kuzu::common::ListType::getChildType(&logicalType); } const LogicalType& logical_type_get_array_child_type(const LogicalType& logicalType) { return *kuzu::common::ArrayType::getChildType(&logicalType); diff --git a/tools/rust_api/src/logical_type.rs b/tools/rust_api/src/logical_type.rs index 69195603d82..2b562b8707d 100644 --- a/tools/rust_api/src/logical_type.rs +++ b/tools/rust_api/src/logical_type.rs @@ -54,8 +54,8 @@ pub enum LogicalType { String, /// Correponds to [Value::Blob](crate::value::Value::Blob) Blob, - /// Correponds to [Value::VarList](crate::value::Value::VarList) - VarList { + /// Correponds to [Value::List](crate::value::Value::List) + List { child_type: Box, }, /// Correponds to [Value::Array](crate::value::Value::Array) @@ -118,10 +118,8 @@ impl From<&ffi::LogicalType> for LogicalType { LogicalTypeID::TIMESTAMP_MS => LogicalType::TimestampMs, LogicalTypeID::TIMESTAMP_SEC => LogicalType::TimestampSec, LogicalTypeID::INTERNAL_ID => LogicalType::InternalID, - LogicalTypeID::VAR_LIST => LogicalType::VarList { - child_type: Box::new( - ffi::logical_type_get_var_list_child_type(logical_type).into(), - ), + LogicalTypeID::LIST => LogicalType::List { + child_type: Box::new(ffi::logical_type_get_list_child_type(logical_type).into()), }, LogicalTypeID::ARRAY => LogicalType::Array { child_type: Box::new(ffi::logical_type_get_array_child_type(logical_type).into()), @@ -141,7 +139,7 @@ impl From<&ffi::LogicalType> for LogicalType { LogicalTypeID::REL => LogicalType::Rel, LogicalTypeID::RECURSIVE_REL => LogicalType::RecursiveRel, LogicalTypeID::MAP => { - let child_types = ffi::logical_type_get_var_list_child_type(logical_type); + let child_types = ffi::logical_type_get_list_child_type(logical_type); let types = ffi::logical_type_get_struct_field_types(child_types); let key_type = types .as_ref() @@ -212,8 +210,8 @@ impl From<&LogicalType> for cxx::UniquePtr { | LogicalType::Rel | LogicalType::RecursiveRel | LogicalType::UUID => ffi::create_logical_type(typ.id()), - LogicalType::VarList { child_type } => { - ffi::create_logical_type_var_list(child_type.as_ref().into()) + LogicalType::List { child_type } => { + ffi::create_logical_type_list(child_type.as_ref().into()) } LogicalType::Array { child_type, @@ -276,7 +274,7 @@ impl LogicalType { LogicalType::TimestampMs => LogicalTypeID::TIMESTAMP_MS, LogicalType::TimestampSec => LogicalTypeID::TIMESTAMP_SEC, LogicalType::InternalID => LogicalTypeID::INTERNAL_ID, - LogicalType::VarList { .. } => LogicalTypeID::VAR_LIST, + LogicalType::List { .. } => LogicalTypeID::LIST, LogicalType::Array { .. } => LogicalTypeID::ARRAY, LogicalType::Struct { .. } => LogicalTypeID::STRUCT, LogicalType::Node => LogicalTypeID::NODE, diff --git a/tools/rust_api/src/value.rs b/tools/rust_api/src/value.rs index 272a6d728c7..9f07af1bed9 100644 --- a/tools/rust_api/src/value.rs +++ b/tools/rust_api/src/value.rs @@ -244,7 +244,7 @@ pub enum Value { // LogicalType is necessary so that we can pass the correct type to the C++ API if the list is empty. /// These must contain elements which are all the given type. /// - VarList(LogicalType, Vec), + List(LogicalType, Vec), /// These must contain elements which are all the same type. /// Array(LogicalType, Vec), @@ -300,7 +300,7 @@ impl std::fmt::Display for Value { Value::String(x) => write!(f, "{x}"), Value::Blob(x) => write!(f, "{x:x?}"), Value::Null(_) => write!(f, ""), - Value::VarList(_, x) | Value::Array(_, x) => display_list(f, x), + Value::List(_, x) | Value::Array(_, x) => display_list(f, x), // Note: These don't match kuzu's toString, but we probably don't want them to Value::Interval(x) => write!(f, "{x}"), Value::Timestamp(x) => write!(f, "{x}"), @@ -373,7 +373,7 @@ impl From<&Value> for LogicalType { Value::String(_) => LogicalType::String, Value::Blob(_) => LogicalType::Blob, Value::Null(x) => x.clone(), - Value::VarList(x, _) => LogicalType::VarList { + Value::List(x, _) => LogicalType::List { child_type: Box::new(x.clone()), }, Value::Array(x, value) => LogicalType::Array { @@ -497,14 +497,14 @@ impl TryFrom<&ffi::Value> for Value { .map(Value::TimestampSec) .ok_or(ConversionError::TimestampSec(sec)) } - LogicalTypeID::VAR_LIST => { + LogicalTypeID::LIST => { let mut result = vec![]; for index in 0..ffi::value_get_children_size(value) { let value: Value = ffi::value_get_child(value, index).try_into()?; result.push(value); } - if let LogicalType::VarList { child_type } = value.into() { - Ok(Value::VarList(*child_type, result)) + if let LogicalType::List { child_type } = value.into() { + Ok(Value::List(*child_type, result)) } else { unreachable!() } @@ -612,7 +612,7 @@ impl TryFrom<&ffi::Value> for Value { LogicalTypeID::RECURSIVE_REL => { let nodes: Value = ffi::recursive_rel_get_nodes(value).try_into()?; let rels: Value = ffi::recursive_rel_get_rels(value).try_into()?; - let nodes = if let Value::VarList(LogicalType::Node, nodes) = nodes { + let nodes = if let Value::List(LogicalType::Node, nodes) = nodes { nodes.into_iter().map(|x| { if let Value::Node(x) = x { x @@ -623,7 +623,7 @@ impl TryFrom<&ffi::Value> for Value { } else { panic!("Unexpected value in RecursiveRel's rels: {}", rels) }; - let rels = if let Value::VarList(LogicalType::Rel, rels) = rels { + let rels = if let Value::List(LogicalType::Rel, rels) = rels { rels.into_iter().map(|x| { if let Value::Rel(x) = x { x @@ -811,13 +811,13 @@ impl TryInto> for Value { let (months, days, micros) = get_interval_t(value); Ok(ffi::create_value_interval(months, days, micros)) } - Value::VarList(typ, value) => { + Value::List(typ, value) => { let mut builder = ffi::create_list(); for elem in value { builder.pin_mut().insert(elem.try_into()?); } Ok(ffi::get_list_value( - (&LogicalType::VarList { + (&LogicalType::List { child_type: Box::new(typ), }) .into(), @@ -1122,7 +1122,7 @@ mod tests { } type_tests! { - convert_var_list_type: LogicalType::VarList { child_type: Box::new(LogicalType::String) }, + convert_list_type: LogicalType::List { child_type: Box::new(LogicalType::String) }, convert_array_type: LogicalType::Array { child_type: Box::new(LogicalType::Int64), num_elements: 3 }, convert_int8_type: LogicalType::Int8, convert_int16_type: LogicalType::Int16, @@ -1157,8 +1157,8 @@ mod tests { } value_tests! { - convert_var_list: Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), - convert_var_list_empty: Value::VarList(LogicalType::String, vec![]), + convert_list: Value::List(LogicalType::String, vec!["Alice".into(), "Bob".into()]), + convert_list_empty: Value::List(LogicalType::String, vec![]), convert_array: Value::Array(LogicalType::String, vec!["Alice".into(), "Bob".into()]), convert_int8: Value::Int8(0), convert_int16: Value::Int16(1), @@ -1186,7 +1186,7 @@ mod tests { convert_string: Value::String("Hello World".to_string()), convert_blob: Value::Blob("Hello World".into()), convert_bool: Value::Bool(false), - convert_null: Value::Null(LogicalType::VarList { + convert_null: Value::Null(LogicalType::List { child_type: Box::new(LogicalType::Array { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) }), convert_struct: Value::Struct(vec![("NAME".to_string(), "Alice".into()), ("AGE".to_string(), 25.into())]), @@ -1200,8 +1200,8 @@ mod tests { } display_tests! { - display_var_list: Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), - display_var_list_empty: Value::VarList(LogicalType::String, vec![]), + display_list: Value::List(LogicalType::String, vec!["Alice".into(), "Bob".into()]), + display_list_empty: Value::List(LogicalType::String, vec![]), display_array: Value::Array(LogicalType::String, vec!["Alice".into(), "Bob".into()]), display_int8: Value::Int8(0), display_int16: Value::Int16(1), @@ -1218,7 +1218,7 @@ mod tests { // The C++ API escapes data in the blob as hex display_string: Value::String("Hello World".to_string()), display_bool: Value::Bool(false), - display_null: Value::Null(LogicalType::VarList { + display_null: Value::Null(LogicalType::List { child_type: Box::new(LogicalType::Array { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) }), display_struct: Value::Struct(vec![("NAME".to_string(), "Alice".into()), ("AGE".to_string(), 25.into())]), @@ -1237,8 +1237,8 @@ mod tests { database_tests! { // Passing these values as arguments is not yet implemented in kuzu: - // db_var_list_string: Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into()]), "STRING[]", - // db_var_list_int: Value::VarList(LogicalType::Int64, vec![0i64.into(), 1i64.into(), 2i64.into()]), "INT64[]", + // db_list_string: Value::List(LogicalType::String, vec!["Alice".into(), "Bob".into()]), "STRING[]", + // db_list_int: Value::List(LogicalType::Int64, vec![0i64.into(), 1i64.into(), 2i64.into()]), "INT64[]", // db_map: Value::Map((LogicalType::String, LogicalType::Int64), vec![(Value::String("key".to_string()), Value::Int64(24))]), "MAP(STRING,INT64)", // db_array: Value::Array(LogicalType::Int64, vec![1i64.into(), 2i64.into(), 3i64.into()]), "INT64[3]", // db_union: Value::Union { @@ -1250,7 +1250,7 @@ mod tests { "STRUCT(item STRING, count INT32)", db_null_string: Value::Null(LogicalType::String), "STRING", db_null_int: Value::Null(LogicalType::Int64), "INT64", - db_null_list: Value::Null(LogicalType::VarList { + db_null_list: Value::Null(LogicalType::List { child_type: Box::new(LogicalType::Array { child_type: Box::new(LogicalType::Int16), num_elements: 3 }) }), "INT16[3][]", db_int8: Value::Int8(0), "INT8", @@ -1280,7 +1280,7 @@ mod tests { #[test] /// Tests that the list value is correctly constructed - fn test_var_list_get() -> Result<()> { + fn test_list_get() -> Result<()> { let temp_dir = tempfile::tempdir()?; let db = Database::new(temp_dir.path(), SystemConfig::default())?; let conn = Connection::new(&db)?; @@ -1288,7 +1288,7 @@ mod tests { assert_eq!(result.len(), 1); assert_eq!( result[0], - Value::VarList(LogicalType::String, vec!["Alice".into(), "Bob".into(),]) + Value::List(LogicalType::String, vec!["Alice".into(), "Bob".into(),]) ); } temp_dir.close()?; From add8473fadd104cfdc26c0418f514187c26a091c Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Mon, 1 Apr 2024 18:38:55 -0400 Subject: [PATCH 119/136] Remove unused keywords in test runner (#3193) * remove unused test statements --- test/include/test_runner/test_parser.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/test/include/test_runner/test_parser.h b/test/include/test_runner/test_parser.h index c9214c0bc90..5163bf28dd2 100644 --- a/test/include/test_runner/test_parser.h +++ b/test/include/test_runner/test_parser.h @@ -16,8 +16,6 @@ enum class TokenType { SKIP_MUSL, SKIP_32BIT, // body - BEGIN_READ_ONLY_TRANSACTION, - BEGIN_WRITE_TRANSACTION, BUFFER_POOL_SIZE, CASE, CHECK_ORDER, @@ -52,13 +50,10 @@ const std::unordered_map tokenMap = {{"-GROUP", TokenTyp {"-DATASET", TokenType::DATASET}, {"-CASE", TokenType::CASE}, {"-COMMIT", TokenType::COMMIT}, {"-CHECK_ORDER", TokenType::CHECK_ORDER}, {"-ENCODED_JOIN", TokenType::ENCODED_JOIN}, {"-LOG", TokenType::LOG}, {"-DEFINE_STATEMENT_BLOCK", TokenType::DEFINE_STATEMENT_BLOCK}, - {"-ENUMERATE", TokenType::ENUMERATE}, - {"-BEGIN_WRITE_TRANSACTION", TokenType::BEGIN_WRITE_TRANSACTION}, - {"-BEGIN_READ_ONLY_TRANSACTION", TokenType::BEGIN_READ_ONLY_TRANSACTION}, - {"-PARALLELISM", TokenType::PARALLELISM}, {"-SKIP", TokenType::SKIP}, - {"-SKIP_MUSL", TokenType::SKIP_MUSL}, {"-SKIP_LINE", TokenType::DEFINE}, - {"-SKIP_32BIT", TokenType::SKIP_32BIT}, {"-DEFINE", TokenType::DEFINE}, - {"-STATEMENT", TokenType::STATEMENT}, + {"-ENUMERATE", TokenType::ENUMERATE}, {"-PARALLELISM", TokenType::PARALLELISM}, + {"-SKIP", TokenType::SKIP}, {"-SKIP_MUSL", TokenType::SKIP_MUSL}, + {"-SKIP_LINE", TokenType::DEFINE}, {"-SKIP_32BIT", TokenType::SKIP_32BIT}, + {"-DEFINE", TokenType::DEFINE}, {"-STATEMENT", TokenType::STATEMENT}, {"-INSERT_STATEMENT_BLOCK", TokenType::INSERT_STATEMENT_BLOCK}, {"-ROLLBACK", TokenType::ROLLBACK}, {"-BUFFER_POOL_SIZE", TokenType::BUFFER_POOL_SIZE}, {"-CHECKPOINT_WAIT_TIMEOUT", TokenType::CHECKPOINT_WAIT_TIMEOUT}, From 94fd5eb95b595c45a36cb43ed700e3dc29eff405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Tue, 2 Apr 2024 12:11:27 +0800 Subject: [PATCH 120/136] Split extension tests as separate jobs (#2987) --- .github/workflows/ci-workflow.yml | 152 +++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 44 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 3a95184de93..b8045b8de0d 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -46,15 +46,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Update PostgreSQL host - working-directory: extension/postgres_scanner/test/test_files - env: - FNAME: postgres_scanner.test - FIND: "localhost" - run: | - node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' - cat postgres_scanner.test - - name: Ensure Python dependencies run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -64,11 +55,6 @@ jobs: run: npm install --include=dev working-directory: tools/nodejs_api - - name: Extension test - run: | - cd scripts/ && python3 http-server.py & - make extension-test && make clean - - name: Build run: make all @@ -248,15 +234,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Update PostgreSQL host - working-directory: extension/postgres_scanner/test/test_files - env: - FNAME: postgres_scanner.test - FIND: "localhost" - run: | - node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' - cat postgres_scanner.test - - name: Ensure Python dependencies run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -266,13 +243,6 @@ jobs: run: npm install --include=dev working-directory: tools/nodejs_api - - name: Extension test - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" - cd scripts/ && start /b python http-server.py && cd .. - make extension-test && make clean - - name: Build shell: cmd run: | @@ -452,15 +422,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Update PostgreSQL host - working-directory: extension/postgres_scanner/test/test_files - env: - FNAME: postgres_scanner.test - FIND: "localhost" - run: | - node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' - cat postgres_scanner.test - - name: Ensure Python dependencies run: | pip3 install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -470,11 +431,6 @@ jobs: run: npm install --include=dev working-directory: tools/nodejs_api - - name: Extension test - run: | - cd scripts/ && python3 http-server.py & - make extension-test && make clean - - name: Build run: make all @@ -533,3 +489,111 @@ jobs: run: | pip3 install pytest pexpect python3 -m pytest -v . + + linux-extension-test: + name: linux extension test + needs: [gcc-build-test, clang-build-test] + runs-on: kuzu-self-hosted-testing + env: + NUM_THREADS: 32 + TEST_JOBS: 16 + CLANGD_DIAGNOSTIC_JOBS: 32 + CLANGD_DIAGNOSTIC_INSTANCES: 6 + GEN: ninja + CC: gcc + CXX: g++ + UW_S3_ACCESS_KEY_ID: ${{ secrets.UW_S3_ACCESS_KEY_ID }} + UW_S3_SECRET_ACCESS_KEY: ${{ secrets.UW_S3_SECRET_ACCESS_KEY }} + AWS_S3_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} + AWS_S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + RUN_ID: "$(hostname)-$(date +%s)" + + steps: + - uses: actions/checkout@v3 + + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + + - name: Extension test + run: | + cd scripts/ && python3 http-server.py & + make extension-test && make clean + + macos-extension-test: + name: macos extension test + needs: [macos-build-test] + runs-on: self-hosted-mac-x64 + env: + NUM_THREADS: 32 + TEST_JOBS: 16 + GEN: ninja + UW_S3_ACCESS_KEY_ID: ${{ secrets.UW_S3_ACCESS_KEY_ID }} + UW_S3_SECRET_ACCESS_KEY: ${{ secrets.UW_S3_SECRET_ACCESS_KEY }} + AWS_S3_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} + AWS_S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + PG_HOST: ${{ secrets.PG_HOST }} + RUN_ID: "$(hostname)-$(date +%s)" + steps: + - uses: actions/checkout@v3 + + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + + - name: Extension test + run: | + cd scripts/ && python3 http-server.py & + make extension-test && make clean + + windows-extension-test: + name: windows extension test + needs: [msvc-build-test] + runs-on: self-hosted-windows + env: + # Shorten build path as much as possible + CARGO_TARGET_DIR: ${{ github.workspace }}/rs + CARGO_BUILD_JOBS: 18 + NUM_THREADS: 18 + TEST_JOBS: 9 + WERROR: 0 + UW_S3_ACCESS_KEY_ID: ${{ secrets.UW_S3_ACCESS_KEY_ID }} + UW_S3_SECRET_ACCESS_KEY: ${{ secrets.UW_S3_SECRET_ACCESS_KEY }} + AWS_S3_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} + AWS_S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_S3_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY }} + PG_HOST: ${{ secrets.PG_HOST }} + RUN_ID: "$(hostname)-$([Math]::Floor((Get-Date).TimeOfDay.TotalSeconds))" + steps: + - uses: actions/checkout@v3 + + - name: Update PostgreSQL host + working-directory: extension/postgres_scanner/test/test_files + env: + FNAME: postgres_scanner.test + FIND: "localhost" + run: | + node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' + cat postgres_scanner.test + + - name: Extension test + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" + cd scripts/ && start /b python http-server.py && cd .. + make extension-test && make clean From a95b29e385d38abc4ed11ff377fd00eedfeb16a8 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Tue, 2 Apr 2024 08:54:21 -0700 Subject: [PATCH 121/136] Added progress for aggregate scan and order by scan (#3192) I have read and agree to the CLA of the Kuzu repository. --- .../processor/operator/aggregate/hash_aggregate.h | 2 ++ .../operator/aggregate/hash_aggregate_scan.h | 2 ++ .../processor/operator/order_by/order_by_scan.h | 10 +++++++++- .../operator/aggregate/hash_aggregate_scan.cpp | 10 ++++++++++ src/processor/operator/order_by/order_by_scan.cpp | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/include/processor/operator/aggregate/hash_aggregate.h b/src/include/processor/operator/aggregate/hash_aggregate.h index f8ba2321e77..06f2ab9088e 100644 --- a/src/include/processor/operator/aggregate/hash_aggregate.h +++ b/src/include/processor/operator/aggregate/hash_aggregate.h @@ -26,6 +26,8 @@ class HashAggregateSharedState final : public BaseAggregateSharedState { FactorizedTable* getFactorizedTable() { return globalAggregateHashTable->getFactorizedTable(); } + uint64_t getCurrentOffset() const { return currentOffset; } + private: std::vector> localAggregateHashTables; std::unique_ptr globalAggregateHashTable; diff --git a/src/include/processor/operator/aggregate/hash_aggregate_scan.h b/src/include/processor/operator/aggregate/hash_aggregate_scan.h index 00d763e0991..6259a347be2 100644 --- a/src/include/processor/operator/aggregate/hash_aggregate_scan.h +++ b/src/include/processor/operator/aggregate/hash_aggregate_scan.h @@ -33,6 +33,8 @@ class HashAggregateScan : public BaseAggregateScan { sharedState, groupByKeyVectorsPos, aggregatesPos, id, paramsString); } + double getProgress(ExecutionContext* context) const override; + private: std::vector groupByKeyVectorsPos; std::vector groupByKeyVectors; diff --git a/src/include/processor/operator/order_by/order_by_scan.h b/src/include/processor/operator/order_by/order_by_scan.h index a2453f5050d..11d3716d981 100644 --- a/src/include/processor/operator/order_by/order_by_scan.h +++ b/src/include/processor/operator/order_by/order_by_scan.h @@ -9,12 +9,18 @@ namespace processor { struct OrderByScanLocalState { std::vector vectorsToRead; std::unique_ptr payloadScanner; + uint64_t numTuples; + uint64_t numTuplesRead; void init( std::vector& outVectorPos, SortSharedState& sharedState, ResultSet& resultSet); // NOLINTNEXTLINE(readability-make-member-function-const): Updates vectorsToRead. - inline uint64_t scan() { return payloadScanner->scan(vectorsToRead); } + uint64_t scan() { + uint64_t tuplesRead = payloadScanner->scan(vectorsToRead); + numTuplesRead += tuplesRead; + return tuplesRead; + } }; // To preserve the ordering of tuples, the orderByScan operator will only @@ -48,6 +54,8 @@ class OrderByScan : public PhysicalOperator { return std::make_unique(outVectorPos, sharedState, id, paramsString); } + double getProgress(ExecutionContext* context) const override; + private: std::vector outVectorPos; std::unique_ptr localState; diff --git a/src/processor/operator/aggregate/hash_aggregate_scan.cpp b/src/processor/operator/aggregate/hash_aggregate_scan.cpp index d6f2454e87a..c984270069d 100644 --- a/src/processor/operator/aggregate/hash_aggregate_scan.cpp +++ b/src/processor/operator/aggregate/hash_aggregate_scan.cpp @@ -37,5 +37,15 @@ bool HashAggregateScan::getNextTuplesInternal(ExecutionContext* /*context*/) { return true; } +double HashAggregateScan::getProgress(ExecutionContext* /*context*/) const { + uint64_t totalNumTuples = sharedState->getFactorizedTable()->getNumTuples(); + if (totalNumTuples == 0) { + return 0.0; + } else if (sharedState->getCurrentOffset() == totalNumTuples) { + return 1.0; + } + return static_cast(sharedState->getCurrentOffset()) / totalNumTuples; +} + } // namespace processor } // namespace kuzu diff --git a/src/processor/operator/order_by/order_by_scan.cpp b/src/processor/operator/order_by/order_by_scan.cpp index 3910e4d663e..aa52b8bb49a 100644 --- a/src/processor/operator/order_by/order_by_scan.cpp +++ b/src/processor/operator/order_by/order_by_scan.cpp @@ -12,6 +12,11 @@ void OrderByScanLocalState::init( } payloadScanner = std::make_unique( sharedState.getMergedKeyBlock(), sharedState.getPayloadTables()); + numTuples = 0; + for (auto& table : sharedState.getPayloadTables()) { + numTuples += table->getNumTuples(); + } + numTuplesRead = 0; } void OrderByScan::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* /*context*/) { @@ -25,5 +30,14 @@ bool OrderByScan::getNextTuplesInternal(ExecutionContext* /*context*/) { return numTuplesRead != 0; } +double OrderByScan::getProgress(ExecutionContext* /*context*/) const { + if (localState->numTuples == 0) { + return 0.0; + } else if (localState->numTuplesRead == localState->numTuples) { + return 1.0; + } + return static_cast(localState->numTuplesRead) / localState->numTuples; +} + } // namespace processor } // namespace kuzu From 0ad815ecac5503abd47caf377005c136a3f91fc7 Mon Sep 17 00:00:00 2001 From: andyfeng Date: Tue, 2 Apr 2024 14:45:11 -0400 Subject: [PATCH 122/136] Fix is null executor bug (#3197) --- src/include/function/null/null_function_executor.h | 3 ++- test/test_files/tinysnb/function/null.test | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/include/function/null/null_function_executor.h b/src/include/function/null/null_function_executor.h index 008ed41c2f2..37f87a5449c 100644 --- a/src/include/function/null/null_function_executor.h +++ b/src/include/function/null/null_function_executor.h @@ -13,8 +13,9 @@ struct NullOperationExecutor { auto resultValues = (uint8_t*)result.getData(); if (operand.state->isFlat()) { auto pos = operand.state->selVector->selectedPositions[0]; + auto resultPos = result.state->selVector->selectedPositions[0]; FUNC::operation( - operand.getValue(pos), (bool)operand.isNull(pos), resultValues[pos]); + operand.getValue(pos), (bool)operand.isNull(pos), resultValues[resultPos]); } else { if (operand.state->selVector->isUnfiltered()) { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { diff --git a/test/test_files/tinysnb/function/null.test b/test/test_files/tinysnb/function/null.test index 28e7068c1f0..8f68b4fcd80 100644 --- a/test/test_files/tinysnb/function/null.test +++ b/test/test_files/tinysnb/function/null.test @@ -1,9 +1,16 @@ -GROUP TinySnbReadTest --DATASET CSV EMPTY +-DATASET CSV tinysnb -- -CASE NullTest + +-STATEMENT MATCH (a)-[:knows]->(b:person) WHERE a.ID = 2 RETURN a.ID, a.name, a.name IS NULL; +---- 3 +2||True +2||True +2||True + -STATEMENT RETURN NULL IS NULL ---- 1 True From f62e7c8eed653086b4a5b41156b595c366d559d9 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Tue, 2 Apr 2024 22:30:57 -0400 Subject: [PATCH 123/136] Fix order by radix sort bug (#3201) --- .../processor/operator/order_by/radix_sort.h | 3 +++ src/processor/operator/order_by/radix_sort.cpp | 13 +++++++------ test/test_files/issue/issue5.test | 13 +++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 test/test_files/issue/issue5.test diff --git a/src/include/processor/operator/order_by/radix_sort.h b/src/include/processor/operator/order_by/radix_sort.h index c0dbdf36c1c..e87f3179995 100644 --- a/src/include/processor/operator/order_by/radix_sort.h +++ b/src/include/processor/operator/order_by/radix_sort.h @@ -24,6 +24,9 @@ struct TieRange { // seen so far. If there are tie tuples, it will compare the overflow ptr of strings. For subsequent // columns, the algorithm only calls radixSort on tie tuples. class RadixSort { +private: + static constexpr uint16_t COUNTING_ARRAY_SIZE = 256; + public: RadixSort(storage::MemoryManager* memoryManager, FactorizedTable& factorizedTable, OrderByKeyEncoder& orderByKeyEncoder, std::vector strKeyColsInfo) diff --git a/src/processor/operator/order_by/radix_sort.cpp b/src/processor/operator/order_by/radix_sort.cpp index 18ab1d7f0ca..c86a23e8d08 100644 --- a/src/processor/operator/order_by/radix_sort.cpp +++ b/src/processor/operator/order_by/radix_sort.cpp @@ -58,11 +58,10 @@ void RadixSort::radixSort(uint8_t* keyBlockPtr, uint32_t numTuplesToSort, uint32 auto tmpKeyBlockPtr = tmpSortingResultBlock->getData(); keyBlockPtr += numBytesSorted; tmpKeyBlockPtr += numBytesSorted; - constexpr uint16_t countingArraySize = 256; - uint32_t count[countingArraySize]; + uint32_t count[COUNTING_ARRAY_SIZE]; auto isInTmpBlock = false; for (auto curByteIdx = 1ul; curByteIdx <= numBytesToSort; curByteIdx++) { - memset(count, 0, countingArraySize * sizeof(uint32_t)); + memset(count, 0, COUNTING_ARRAY_SIZE * sizeof(uint32_t)); auto sourcePtr = isInTmpBlock ? tmpKeyBlockPtr : keyBlockPtr; auto targetPtr = isInTmpBlock ? keyBlockPtr : tmpKeyBlockPtr; auto curByteOffset = numBytesToSort - curByteIdx; @@ -73,7 +72,7 @@ void RadixSort::radixSort(uint8_t* keyBlockPtr, uint32_t numTuplesToSort, uint32 sortBytePtr += numBytesPerTuple; } auto maxCounter = count[0]; - for (auto val = 1ul; val < countingArraySize; val++) { + for (auto val = 1ul; val < COUNTING_ARRAY_SIZE; val++) { maxCounter = std::max(count[val], maxCounter); count[val] = count[val] + count[val - 1]; } @@ -85,14 +84,16 @@ void RadixSort::radixSort(uint8_t* keyBlockPtr, uint32_t numTuplesToSort, uint32 auto sourceTuplePtr = sourcePtr + (numTuplesToSort - 1) * numBytesPerTuple; for (auto j = 0ul; j < numTuplesToSort; j++) { auto targetTupleNum = --count[*(sourceTuplePtr + curByteOffset)]; - memcpy(targetPtr + targetTupleNum * numBytesPerTuple, sourceTuplePtr, numBytesPerTuple); + memcpy(targetPtr + targetTupleNum * numBytesPerTuple - numBytesSorted, + sourceTuplePtr - numBytesSorted, numBytesPerTuple); sourceTuplePtr -= numBytesPerTuple; } isInTmpBlock = !isInTmpBlock; } // If the data is in the tmp block, copy the data from tmp block back. if (isInTmpBlock) { - memcpy(keyBlockPtr, tmpKeyBlockPtr, numTuplesToSort * numBytesPerTuple); + memcpy(keyBlockPtr - numBytesSorted, tmpKeyBlockPtr - numBytesSorted, + numTuplesToSort * numBytesPerTuple); } } diff --git a/test/test_files/issue/issue5.test b/test/test_files/issue/issue5.test new file mode 100644 index 00000000000..487b6131b8a --- /dev/null +++ b/test/test_files/issue/issue5.test @@ -0,0 +1,13 @@ +-GROUP IssueTest +-DATASET CSV ldbc-sf01 + +-- + +-CASE 3188 +-STATEMENT MATCH (a:Comment) RETURN a.id ORDER BY a.length, a.browserUsed, a.locationIP, a.creationDate, a.content, a.id limit 5; +---- 5 +68719546388 +68719764543 +137438958893 +137439023070 +137439023073 From 1f03f5a289d3391538f3fd9751a8dd8df07f75f9 Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Wed, 3 Apr 2024 14:04:20 -0700 Subject: [PATCH 124/136] Updated shell result truncation (#3206) I have read and agree to the CLA of the Kuzu repository. --- tools/shell/embedded_shell.cpp | 13 +++++++++---- tools/shell/test/test_shell_commands.py | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/shell/embedded_shell.cpp b/tools/shell/embedded_shell.cpp index 36676b666c4..7ea9103d9a1 100644 --- a/tools/shell/embedded_shell.cpp +++ b/tools/shell/embedded_shell.cpp @@ -482,11 +482,16 @@ void EmbeddedShell::printExecutionResult(QueryResult& queryResult) const { uint32_t sumGoal = minTruncatedWidth; uint32_t maxWidth = minTruncatedWidth; if (colsWidth.size() == 1) { - sumGoal = colsWidth[0] + 2; + uint32_t minDisplayWidth = minTruncatedWidth + SMALL_TABLE_SEPERATOR_LENGTH; + if (maxPrintWidth > minDisplayWidth) { + sumGoal = maxPrintWidth - 2; + } else { + sumGoal = std::max( + (uint32_t)(getColumns(STDIN_FILENO, STDOUT_FILENO) - colsWidth.size() - 1), + minDisplayWidth); + } } else if (colsWidth.size() > 1) { - uint32_t minDisplayWidth = SMALL_TABLE_SEPERATOR_LENGTH; - minDisplayWidth += (colsWidth[0] < minTruncatedWidth) ? colsWidth[0] : minTruncatedWidth; - minDisplayWidth += (colsWidth.back() < minTruncatedWidth) ? colsWidth.back() : minTruncatedWidth; + uint32_t minDisplayWidth = SMALL_TABLE_SEPERATOR_LENGTH + minTruncatedWidth * 2; if (maxPrintWidth > minDisplayWidth) { sumGoal = maxPrintWidth - colsWidth.size() - 1; } else { diff --git a/tools/shell/test/test_shell_commands.py b/tools/shell/test/test_shell_commands.py index f0360e8b173..b66948faf28 100644 --- a/tools/shell/test/test_shell_commands.py +++ b/tools/shell/test/test_shell_commands.py @@ -86,11 +86,11 @@ def test_max_width(temp_db, csv_path) -> None: test = ( ShellTest() .add_argument(temp_db) - .statement(":max_width 40") + .statement(":max_width 44") .statement(f'LOAD FROM "{csv_path}" (HEADER=true) RETURN *;') ) result = test.run() - # while max width is 40, the columns that fit have a total width of 34 + # while max width is 44, the columns that fit have a total width of 34 result.check_stdout("-" * 34) result.check_not_stdout("-" * 35) result.check_stdout("| ... |") From 1aaa21f8e2f291fdcf66daa11b1fb6220d538967 Mon Sep 17 00:00:00 2001 From: Prashanth Rao <35005448+prrao87@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:32:47 -0400 Subject: [PATCH 125/136] Fix-3200 (#3203) --- README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d35790073fc..00b0fbe4f64 100644 --- a/README.md +++ b/README.md @@ -46,16 +46,11 @@ To learn more about installation, see our [Installation](https://docs.kuzudb.com ## Getting Started -Refer to our [Getting Started](https://docs.kuzudb.com/getting-started/) page for your first example. - -More information can be found at -- [Data Import](https://docs.kuzudb.com/data-import/) -- [Cypher Reference](https://docs.kuzudb.com/cypher/) -- [Client APIs](https://docs.kuzudb.com/client-apis/) +Refer to our [Getting Started](https://docs.kuzudb.com/get-started/) page for your first example. ## Build from Source -Instructions can be found at [Build Kùzu from Source](https://docs.kuzudb.com/development/building-kuzu). +You can build from source using the instructions provided in the [developer guide](https://docs.kuzudb.com/developer-guide). ## Contributing We welcome contributions to Kùzu. If you are interested in contributing to Kùzu, please read our [Contributing Guide](CONTRIBUTING.md). From b3c6dc94d7d637696273efc020e10af9f19778d0 Mon Sep 17 00:00:00 2001 From: Neeraj Date: Thu, 4 Apr 2024 09:24:31 +0530 Subject: [PATCH 126/136] skip empty history file line (#3184) --- tools/shell/linenoise.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/shell/linenoise.cpp b/tools/shell/linenoise.cpp index daf472a194d..a3f55c4a901 100644 --- a/tools/shell/linenoise.cpp +++ b/tools/shell/linenoise.cpp @@ -2350,6 +2350,8 @@ int linenoiseHistoryLoad(const char* filename) { // add the full line to the history linenoiseHistoryAdd(buf); continue; + } else if (result.empty() && buf[0] == '\0') { + continue; } // else we are parsing a Cypher statement result += buf; From fa0ef79e21bcb14ce5e19fabf007d5cbb1297a07 Mon Sep 17 00:00:00 2001 From: ziyi chen Date: Thu, 4 Apr 2024 00:21:34 -0400 Subject: [PATCH 127/136] Merge duplicate key fix (#3207) --- src/binder/bind/bind_updating_clause.cpp | 3 +- .../updating_clause/bound_merge_clause.h | 54 ++-- .../optimizer/factorization_rewriter.h | 3 +- .../optimizer/logical_operator_visitor.h | 6 + .../planner/operator/logical_accumulate.h | 16 +- .../planner/operator/logical_distinct.h | 53 ++- .../planner/operator/logical_mark_accmulate.h | 35 ++ .../planner/operator/logical_operator.h | 1 + .../operator/persistent/logical_merge.h | 43 ++- src/include/planner/planner.h | 11 +- .../operator/aggregate/aggregate_hash_table.h | 54 ++-- .../operator/aggregate/hash_aggregate.h | 51 +-- .../operator/persistent/insert_executor.h | 9 +- .../processor/operator/persistent/merge.h | 14 +- src/include/processor/plan_mapper.h | 8 +- .../processor/result/mark_hash_table.h | 32 ++ .../agg_key_dependency_optimizer.cpp | 6 +- src/optimizer/factorization_rewriter.cpp | 9 + src/optimizer/logical_operator_visitor.cpp | 6 + .../projection_push_down_optimizer.cpp | 7 +- src/planner/operator/CMakeLists.txt | 1 + src/planner/operator/logical_accumulate.cpp | 2 +- src/planner/operator/logical_distinct.cpp | 18 +- .../operator/logical_mark_accumulate.cpp | 46 +++ src/planner/operator/logical_operator.cpp | 2 + src/planner/plan/CMakeLists.txt | 1 + src/planner/plan/append_distinct.cpp | 4 +- src/planner/plan/append_mark_accumulate.cpp | 20 ++ src/planner/plan/plan_read.cpp | 7 +- src/planner/plan/plan_subquery.cpp | 25 +- src/planner/plan/plan_update.cpp | 52 +-- src/processor/map/CMakeLists.txt | 1 + src/processor/map/map_accumulate.cpp | 2 +- src/processor/map/map_aggregate.cpp | 68 +++- src/processor/map/map_distinct.cpp | 8 +- src/processor/map/map_expressions_scan.cpp | 2 +- src/processor/map/map_mark_accumulate.cpp | 26 ++ src/processor/map/map_merge.cpp | 17 +- src/processor/map/plan_mapper.cpp | 3 + .../aggregate/aggregate_hash_table.cpp | 306 +++++++++--------- .../operator/aggregate/hash_aggregate.cpp | 61 +++- .../operator/persistent/insert_executor.cpp | 8 + src/processor/operator/persistent/merge.cpp | 53 ++- src/processor/result/CMakeLists.txt | 1 + src/processor/result/mark_hash_table.cpp | 51 +++ .../test_files/update_node/merge_tinysnb.test | 35 ++ 46 files changed, 837 insertions(+), 404 deletions(-) create mode 100644 src/include/planner/operator/logical_mark_accmulate.h create mode 100644 src/include/processor/result/mark_hash_table.h create mode 100644 src/planner/operator/logical_mark_accumulate.cpp create mode 100644 src/planner/plan/append_mark_accumulate.cpp create mode 100644 src/processor/map/map_mark_accumulate.cpp create mode 100644 src/processor/result/mark_hash_table.cpp diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index 91f19c1ce68..d94acc75a4a 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -80,9 +80,10 @@ std::unique_ptr Binder::bindMergeClause( auto boundGraphPattern = bindGraphPattern(mergeClause.getPatternElementsRef()); rewriteMatchPattern(boundGraphPattern); auto createInfos = bindInsertInfos(boundGraphPattern.queryGraphCollection, patternsScope); + auto distinctMark = createVariable("__distinctMark", *LogicalType::BOOL()); auto boundMergeClause = std::make_unique(std::move(boundGraphPattern.queryGraphCollection), - std::move(boundGraphPattern.where), std::move(createInfos)); + std::move(boundGraphPattern.where), std::move(createInfos), std::move(distinctMark)); if (mergeClause.hasOnMatchSetItems()) { for (auto& [lhs, rhs] : mergeClause.getOnMatchSetItemsRef()) { auto setPropertyInfo = bindSetPropertyInfo(lhs.get(), rhs.get()); diff --git a/src/include/binder/query/updating_clause/bound_merge_clause.h b/src/include/binder/query/updating_clause/bound_merge_clause.h index 0e794489dba..fa29b8d4db7 100644 --- a/src/include/binder/query/updating_clause/bound_merge_clause.h +++ b/src/include/binder/query/updating_clause/bound_merge_clause.h @@ -11,91 +11,92 @@ namespace binder { class BoundMergeClause : public BoundUpdatingClause { public: BoundMergeClause(QueryGraphCollection queryGraphCollection, - std::shared_ptr predicate, std::vector insertInfos) - : BoundUpdatingClause{common::ClauseType::MERGE}, queryGraphCollection{std::move( - queryGraphCollection)}, - predicate{std::move(predicate)}, insertInfos{std::move(insertInfos)} {} + std::shared_ptr predicate, std::vector insertInfos, + std::shared_ptr distinctMark) + : BoundUpdatingClause{common::ClauseType::MERGE}, + queryGraphCollection{std::move(queryGraphCollection)}, predicate{std::move(predicate)}, + insertInfos{std::move(insertInfos)}, distinctMark{std::move(distinctMark)} {} - inline const QueryGraphCollection* getQueryGraphCollection() const { - return &queryGraphCollection; - } - inline bool hasPredicate() const { return predicate != nullptr; } - inline std::shared_ptr getPredicate() const { return predicate; } + const QueryGraphCollection* getQueryGraphCollection() const { return &queryGraphCollection; } + bool hasPredicate() const { return predicate != nullptr; } + std::shared_ptr getPredicate() const { return predicate; } - inline const std::vector& getInsertInfosRef() const { return insertInfos; } - inline const std::vector& getOnMatchSetInfosRef() const { + const std::vector& getInsertInfosRef() const { return insertInfos; } + const std::vector& getOnMatchSetInfosRef() const { return onMatchSetPropertyInfos; } - inline const std::vector& getOnCreateSetInfosRef() const { + const std::vector& getOnCreateSetInfosRef() const { return onCreateSetPropertyInfos; } - inline bool hasInsertNodeInfo() const { + bool hasInsertNodeInfo() const { return hasInsertInfo( [](const BoundInsertInfo& info) { return info.tableType == common::TableType::NODE; }); } - inline std::vector getInsertNodeInfos() const { + std::vector getInsertNodeInfos() const { return getInsertInfos( [](const BoundInsertInfo& info) { return info.tableType == common::TableType::NODE; }); } - inline bool hasInsertRelInfo() const { + bool hasInsertRelInfo() const { return hasInsertInfo( [](const BoundInsertInfo& info) { return info.tableType == common::TableType::REL; }); } - inline std::vector getInsertRelInfos() const { + std::vector getInsertRelInfos() const { return getInsertInfos( [](const BoundInsertInfo& info) { return info.tableType == common::TableType::REL; }); } - inline bool hasOnMatchSetNodeInfo() const { + bool hasOnMatchSetNodeInfo() const { return hasOnMatchSetInfo([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::NODE; }); } - inline std::vector getOnMatchSetNodeInfos() const { + std::vector getOnMatchSetNodeInfos() const { return getOnMatchSetInfos([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::NODE; }); } - inline bool hasOnMatchSetRelInfo() const { + bool hasOnMatchSetRelInfo() const { return hasOnMatchSetInfo([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::REL; }); } - inline std::vector getOnMatchSetRelInfos() const { + std::vector getOnMatchSetRelInfos() const { return getOnMatchSetInfos([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::REL; }); } - inline bool hasOnCreateSetNodeInfo() const { + bool hasOnCreateSetNodeInfo() const { return hasOnCreateSetInfo([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::NODE; }); } - inline std::vector getOnCreateSetNodeInfos() const { + std::vector getOnCreateSetNodeInfos() const { return getOnCreateSetInfos([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::NODE; }); } - inline bool hasOnCreateSetRelInfo() const { + bool hasOnCreateSetRelInfo() const { return hasOnCreateSetInfo([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::REL; }); } - inline std::vector getOnCreateSetRelInfos() const { + std::vector getOnCreateSetRelInfos() const { return getOnCreateSetInfos([](const BoundSetPropertyInfo& info) { return info.updateTableType == UpdateTableType::REL; }); } - inline void addOnMatchSetPropertyInfo(BoundSetPropertyInfo setPropertyInfo) { + void addOnMatchSetPropertyInfo(BoundSetPropertyInfo setPropertyInfo) { onMatchSetPropertyInfos.push_back(std::move(setPropertyInfo)); } - inline void addOnCreateSetPropertyInfo(BoundSetPropertyInfo setPropertyInfo) { + void addOnCreateSetPropertyInfo(BoundSetPropertyInfo setPropertyInfo) { onCreateSetPropertyInfos.push_back(std::move(setPropertyInfo)); } + std::shared_ptr getDistinctMark() const { return distinctMark; } + private: bool hasInsertInfo(const std::function& check) const; std::vector getInsertInfos( @@ -121,6 +122,7 @@ class BoundMergeClause : public BoundUpdatingClause { std::vector onMatchSetPropertyInfos; // Update on create std::vector onCreateSetPropertyInfos; + std::shared_ptr distinctMark; }; } // namespace binder diff --git a/src/include/optimizer/factorization_rewriter.h b/src/include/optimizer/factorization_rewriter.h index afdbf05d639..95c978b2ef4 100644 --- a/src/include/optimizer/factorization_rewriter.h +++ b/src/include/optimizer/factorization_rewriter.h @@ -6,7 +6,7 @@ namespace kuzu { namespace optimizer { -class FactorizationRewriter : public LogicalOperatorVisitor { +class FactorizationRewriter final : public LogicalOperatorVisitor { public: void rewrite(planner::LogicalPlan* plan); @@ -19,6 +19,7 @@ class FactorizationRewriter : public LogicalOperatorVisitor { void visitIntersect(planner::LogicalOperator* op) override; void visitProjection(planner::LogicalOperator* op) override; void visitAccumulate(planner::LogicalOperator* op) override; + void visitMarkAccumulate(planner::LogicalOperator*) override; void visitAggregate(planner::LogicalOperator* op) override; void visitOrderBy(planner::LogicalOperator* op) override; void visitLimit(planner::LogicalOperator* op) override; diff --git a/src/include/optimizer/logical_operator_visitor.h b/src/include/optimizer/logical_operator_visitor.h index 6929ebc3058..69c72a5a72d 100644 --- a/src/include/optimizer/logical_operator_visitor.h +++ b/src/include/optimizer/logical_operator_visitor.h @@ -105,6 +105,12 @@ class LogicalOperatorVisitor { return op; } + virtual void visitMarkAccumulate(planner::LogicalOperator* /*op*/) {} + virtual std::shared_ptr visitMarkAccumulateReplace( + std::shared_ptr op) { + return op; + } + virtual void visitDistinct(planner::LogicalOperator* /*op*/) {} virtual std::shared_ptr visitDistinctReplace( std::shared_ptr op) { diff --git a/src/include/planner/operator/logical_accumulate.h b/src/include/planner/operator/logical_accumulate.h index 1f1a3399357..b521200de7a 100644 --- a/src/include/planner/operator/logical_accumulate.h +++ b/src/include/planner/operator/logical_accumulate.h @@ -6,7 +6,7 @@ namespace kuzu { namespace planner { -class LogicalAccumulate : public LogicalOperator { +class LogicalAccumulate final : public LogicalOperator { public: LogicalAccumulate(common::AccumulateType accumulateType, binder::expression_vector flatExprs, std::shared_ptr offset, std::shared_ptr child) @@ -14,20 +14,20 @@ class LogicalAccumulate : public LogicalOperator { accumulateType{accumulateType}, flatExprs{std::move(flatExprs)}, offset{ std::move(offset)} {} - void computeFactorizedSchema() final; - void computeFlatSchema() final; + void computeFactorizedSchema() override; + void computeFlatSchema() override; f_group_pos_set getGroupPositionsToFlatten() const; - inline std::string getExpressionsForPrinting() const final { return std::string{}; } + std::string getExpressionsForPrinting() const override { return {}; } - inline common::AccumulateType getAccumulateType() const { return accumulateType; } - inline binder::expression_vector getExpressionsToAccumulate() const { + common::AccumulateType getAccumulateType() const { return accumulateType; } + binder::expression_vector getPayloads() const { return children[0]->getSchema()->getExpressionsInScope(); } - inline std::shared_ptr getOffset() const { return offset; } + std::shared_ptr getOffset() const { return offset; } - inline std::unique_ptr copy() final { + std::unique_ptr copy() override { return make_unique( accumulateType, flatExprs, offset, children[0]->copy()); } diff --git a/src/include/planner/operator/logical_distinct.h b/src/include/planner/operator/logical_distinct.h index c635c14447f..46ae208b431 100644 --- a/src/include/planner/operator/logical_distinct.h +++ b/src/include/planner/operator/logical_distinct.h @@ -1,56 +1,43 @@ #pragma once #include "planner/operator/logical_operator.h" -#include "planner/operator/schema.h" namespace kuzu { namespace planner { class LogicalDistinct : public LogicalOperator { public: - LogicalDistinct( - binder::expression_vector keyExpressions, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::DISTINCT, std::move(child)}, - keyExpressions{std::move(keyExpressions)} {} - LogicalDistinct(binder::expression_vector keyExpressions, - binder::expression_vector dependentKeyExpressions, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::DISTINCT, std::move(child)}, - keyExpressions{std::move(keyExpressions)}, dependentKeyExpressions{ - std::move(dependentKeyExpressions)} {} + LogicalDistinct(binder::expression_vector keys, std::shared_ptr child) + : LogicalDistinct{ + LogicalOperatorType::DISTINCT, keys, binder::expression_vector{}, std::move(child)} {} + LogicalDistinct(LogicalOperatorType type, binder::expression_vector keys, + binder::expression_vector payloads, std::shared_ptr child) + : LogicalOperator{type, std::move(child)}, keys{std::move(keys)}, payloads{std::move( + payloads)} {} void computeFactorizedSchema() override; void computeFlatSchema() override; - f_group_pos_set getGroupsPosToFlatten(); + virtual f_group_pos_set getGroupsPosToFlatten(); std::string getExpressionsForPrinting() const override; - inline binder::expression_vector getKeyExpressions() const { return keyExpressions; } - inline void setKeyExpressions(binder::expression_vector expressions) { - keyExpressions = std::move(expressions); - } - inline binder::expression_vector getDependentKeyExpressions() const { - return dependentKeyExpressions; - } - inline void setDependentKeyExpressions(binder::expression_vector expressions) { - dependentKeyExpressions = std::move(expressions); - } - inline binder::expression_vector getAllDistinctExpressions() const { - binder::expression_vector result; - result.insert(result.end(), keyExpressions.begin(), keyExpressions.end()); - result.insert(result.end(), dependentKeyExpressions.begin(), dependentKeyExpressions.end()); - return result; - } + binder::expression_vector getKeys() const { return keys; } + void setKeys(binder::expression_vector expressions) { keys = std::move(expressions); } + binder::expression_vector getPayloads() const { return payloads; } + void setPayloads(binder::expression_vector expressions) { payloads = std::move(expressions); } std::unique_ptr copy() override { - return make_unique( - keyExpressions, dependentKeyExpressions, children[0]->copy()); + return make_unique(operatorType, keys, payloads, children[0]->copy()); } -private: - binder::expression_vector keyExpressions; - // See logical_aggregate.h for details. - binder::expression_vector dependentKeyExpressions; +protected: + binder::expression_vector getKeysAndPayloads() const; + +protected: + binder::expression_vector keys; + // Payloads meaning additional keys that are functional dependent on the keys above. + binder::expression_vector payloads; }; } // namespace planner diff --git a/src/include/planner/operator/logical_mark_accmulate.h b/src/include/planner/operator/logical_mark_accmulate.h new file mode 100644 index 00000000000..697cb942977 --- /dev/null +++ b/src/include/planner/operator/logical_mark_accmulate.h @@ -0,0 +1,35 @@ +#pragma once + +#include "planner/operator/logical_operator.h" + +namespace kuzu { +namespace planner { + +class LogicalMarkAccumulate final : public LogicalOperator { +public: + LogicalMarkAccumulate(binder::expression_vector keys, std::shared_ptr mark, + std::shared_ptr child) + : LogicalOperator{LogicalOperatorType::MARK_ACCUMULATE, std::move(child)}, + keys{std::move(keys)}, mark{std::move(mark)} {} + + void computeFactorizedSchema() override; + void computeFlatSchema() override; + + f_group_pos_set getGroupsPosToFlatten() const; + + std::string getExpressionsForPrinting() const override { return {}; } + binder::expression_vector getKeys() const { return keys; } + binder::expression_vector getPayloads() const; + std::shared_ptr getMark() const { return mark; } + + std::unique_ptr copy() override { + return std::make_unique(keys, mark, children[0]->copy()); + } + +private: + binder::expression_vector keys; + std::shared_ptr mark; +}; + +} // namespace planner +} // namespace kuzu diff --git a/src/include/planner/operator/logical_operator.h b/src/include/planner/operator/logical_operator.h index 4c65a8ea540..f2ab9daac09 100644 --- a/src/include/planner/operator/logical_operator.h +++ b/src/include/planner/operator/logical_operator.h @@ -34,6 +34,7 @@ enum class LogicalOperatorType : uint8_t { INTERSECT, INSERT, LIMIT, + MARK_ACCUMULATE, MERGE, MULTIPLICITY_REDUCER, NODE_LABEL_FILTER, diff --git a/src/include/planner/operator/persistent/logical_merge.h b/src/include/planner/operator/persistent/logical_merge.h index 93c4f2d9cb9..8762152247f 100644 --- a/src/include/planner/operator/persistent/logical_merge.h +++ b/src/include/planner/operator/persistent/logical_merge.h @@ -9,7 +9,8 @@ namespace planner { class LogicalMerge : public LogicalOperator { public: - LogicalMerge(std::shared_ptr mark, + LogicalMerge(std::shared_ptr existenceMark, + std::shared_ptr distinctMark, std::vector insertNodeInfos, std::vector insertRelInfos, std::vector> onCreateSetNodeInfos, @@ -17,7 +18,8 @@ class LogicalMerge : public LogicalOperator { std::vector> onMatchSetNodeInfos, std::vector> onMatchSetRelInfos, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::MERGE, std::move(child)}, mark{std::move(mark)}, + : LogicalOperator{LogicalOperatorType::MERGE, std::move(child)}, + existenceMark{std::move(existenceMark)}, distinctMark{std::move(distinctMark)}, insertNodeInfos{std::move(insertNodeInfos)}, insertRelInfos{std::move(insertRelInfos)}, onCreateSetNodeInfos{std::move(onCreateSetNodeInfos)}, onCreateSetRelInfos(std::move(onCreateSetRelInfos)), @@ -27,44 +29,41 @@ class LogicalMerge : public LogicalOperator { void computeFactorizedSchema() final; void computeFlatSchema() final; - inline std::string getExpressionsForPrinting() const final { return std::string(""); } + std::string getExpressionsForPrinting() const final { return {}; } f_group_pos_set getGroupsPosToFlatten(); - inline std::shared_ptr getMark() const { return mark; } - inline const std::vector& getInsertNodeInfosRef() const { - return insertNodeInfos; - } - inline const std::vector& getInsertRelInfosRef() const { - return insertRelInfos; - } - inline const std::vector>& - getOnCreateSetNodeInfosRef() const { + std::shared_ptr getExistenceMark() const { return existenceMark; } + bool hasDistinctMark() const { return distinctMark != nullptr; } + std::shared_ptr getDistinctMark() const { return distinctMark; } + + const std::vector& getInsertNodeInfosRef() const { return insertNodeInfos; } + const std::vector& getInsertRelInfosRef() const { return insertRelInfos; } + const std::vector>& getOnCreateSetNodeInfosRef() const { return onCreateSetNodeInfos; } - inline const std::vector>& - getOnCreateSetRelInfosRef() const { + const std::vector>& getOnCreateSetRelInfosRef() const { return onCreateSetRelInfos; } - inline const std::vector>& - getOnMatchSetNodeInfosRef() const { + const std::vector>& getOnMatchSetNodeInfosRef() const { return onMatchSetNodeInfos; } - inline const std::vector>& - getOnMatchSetRelInfosRef() const { + const std::vector>& getOnMatchSetRelInfosRef() const { return onMatchSetRelInfos; } - inline std::unique_ptr copy() final { - return std::make_unique(mark, copyVector(insertNodeInfos), - copyVector(insertRelInfos), LogicalSetPropertyInfo::copy(onCreateSetNodeInfos), + std::unique_ptr copy() final { + return std::make_unique(existenceMark, distinctMark, + copyVector(insertNodeInfos), copyVector(insertRelInfos), + LogicalSetPropertyInfo::copy(onCreateSetNodeInfos), LogicalSetPropertyInfo::copy(onCreateSetRelInfos), LogicalSetPropertyInfo::copy(onMatchSetNodeInfos), LogicalSetPropertyInfo::copy(onMatchSetRelInfos), children[0]->copy()); } private: - std::shared_ptr mark; + std::shared_ptr existenceMark; + std::shared_ptr distinctMark; // Create infos std::vector insertNodeInfos; std::vector insertRelInfos; diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index 594b78359f9..5040462cb94 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -111,13 +111,18 @@ class Planner { // Plan subquery void planOptionalMatch(const binder::QueryGraphCollection& queryGraphCollection, - const binder::expression_vector& predicates, LogicalPlan& leftPlan); + const binder::expression_vector& predicates, const binder::expression_vector& corrExprs, + LogicalPlan& leftPlan); void planRegularMatch(const binder::QueryGraphCollection& queryGraphCollection, const binder::expression_vector& predicates, LogicalPlan& leftPlan); void planSubquery(const std::shared_ptr& subquery, LogicalPlan& outerPlan); void planSubqueryIfNecessary( const std::shared_ptr& expression, LogicalPlan& plan); + static binder::expression_vector getCorrelatedExprs( + const binder::QueryGraphCollection& collection, const binder::expression_vector& predicates, + Schema* outerSchema); + // Plan query graphs std::unique_ptr planQueryGraphCollection( const binder::QueryGraphCollection& queryGraphCollection, @@ -246,6 +251,8 @@ class Planner { void appendAccumulate(common::AccumulateType accumulateType, const binder::expression_vector& flatExprs, std::shared_ptr offset, LogicalPlan& plan); + void appendMarkAccumulate(const binder::expression_vector& keys, + std::shared_ptr mark, LogicalPlan& plan); void appendDummyScan(LogicalPlan& plan); @@ -265,7 +272,7 @@ class Planner { void appendScanFile(const binder::BoundFileScanInfo* info, std::shared_ptr offset, LogicalPlan& plan); - void appendDistinct(const binder::expression_vector& expressionsToDistinct, LogicalPlan& plan); + void appendDistinct(const binder::expression_vector& keys, LogicalPlan& plan); std::unique_ptr createUnionPlan( std::vector>& childrenPlans, bool isUnionAll); diff --git a/src/include/processor/operator/aggregate/aggregate_hash_table.h b/src/include/processor/operator/aggregate/aggregate_hash_table.h index 017c5a74b96..3b60b34d651 100644 --- a/src/include/processor/operator/aggregate/aggregate_hash_table.h +++ b/src/include/processor/operator/aggregate/aggregate_hash_table.h @@ -14,6 +14,8 @@ struct HashSlot { // groupKeyN, aggregateState1, ..., aggregateStateN, hashValue]. }; +enum class HashTableType : uint8_t { AGGREGATE_HASH_TABLE = 0, MARK_HASH_TABLE = 1 }; + /** * AggregateHashTable Design * @@ -42,15 +44,15 @@ class AggregateHashTable : public BaseHashTable { AggregateHashTable(storage::MemoryManager& memoryManager, const common::logical_type_vec_t& keysDataTypes, const std::vector>& aggregateFunctions, - uint64_t numEntriesToAllocate) + uint64_t numEntriesToAllocate, std::unique_ptr tableSchema) : AggregateHashTable(memoryManager, keysDataTypes, std::vector(), - aggregateFunctions, numEntriesToAllocate) {} + aggregateFunctions, numEntriesToAllocate, std::move(tableSchema)) {} AggregateHashTable(storage::MemoryManager& memoryManager, std::vector keysDataTypes, std::vector payloadsDataTypes, const std::vector>& aggregateFunctions, - uint64_t numEntriesToAllocate); + uint64_t numEntriesToAllocate, std::unique_ptr tableSchema); uint8_t* getEntry(uint64_t idx) { return factorizedTable->getTuple(idx); } @@ -86,9 +88,26 @@ class AggregateHashTable : public BaseHashTable { void resize(uint64_t newSize); +protected: + virtual uint64_t matchFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, uint64_t numMayMatches, + uint64_t numNoMatches); + + virtual void initializeFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, + const std::vector& dependentKeyVectors, + uint64_t numFTEntriesToInitialize); + + uint64_t matchUnFlatVecWithFTColumn(common::ValueVector* vector, uint64_t numMayMatches, + uint64_t& numNoMatches, uint32_t colIdx); + + uint64_t matchFlatVecWithFTColumn(common::ValueVector* vector, uint64_t numMayMatches, + uint64_t& numNoMatches, uint32_t colIdx); + private: void initializeFT( - const std::vector>& aggregateFunctions); + const std::vector>& aggregateFunctions, + std::unique_ptr tableSchema); void initializeHashTable(uint64_t numEntriesToAllocate); @@ -105,11 +124,6 @@ class AggregateHashTable : public BaseHashTable { void initializeFTEntryWithUnFlatVec( common::ValueVector* unFlatVector, uint64_t numEntriesToInitialize, uint32_t colIdx); - void initializeFTEntries(const std::vector& flatKeyVectors, - const std::vector& unFlatKeyVectors, - const std::vector& dependentKeyVectors, - uint64_t numFTEntriesToInitialize); - uint8_t* createEntryInDistinctHT( const std::vector& groupByHashKeyVectors, common::hash_t hash); @@ -145,16 +159,6 @@ class AggregateHashTable : public BaseHashTable { // are flat. bool matchFlatGroupByKeys(const std::vector& keyVectors, uint8_t* entry); - uint64_t matchUnFlatVecWithFTColumn(common::ValueVector* vector, uint64_t numMayMatches, - uint64_t& numNoMatches, uint32_t colIdx); - - uint64_t matchFlatVecWithFTColumn(common::ValueVector* vector, uint64_t numMayMatches, - uint64_t& numNoMatches, uint32_t colIdx); - - uint64_t matchFTEntries(const std::vector& flatKeyVectors, - const std::vector& unFlatKeyVectors, uint64_t numMayMatches, - uint64_t numNoMatches); - void fillEntryWithInitialNullAggregateState(uint8_t* entry); //! find an uninitialized hash slot for given hash and fill hash slot with block id and offset @@ -205,13 +209,19 @@ class AggregateHashTable : public BaseHashTable { std::unique_ptr& aggregateFunction, common::ValueVector* aggVector, uint64_t multiplicity, uint32_t aggStateOffset); +protected: + uint32_t hashColIdxInFT; + std::unique_ptr mayMatchIdxes; + std::unique_ptr noMatchIdxes; + std::unique_ptr entryIdxesToInitialize; + std::unique_ptr hashSlotsToUpdateAggState; + private: std::vector dependentKeyDataTypes; std::vector> aggregateFunctions; //! special handling of distinct aggregate std::vector> distinctHashTables; - uint32_t hashColIdxInFT; uint32_t hashColOffsetInFT; uint32_t aggStateColOffsetInFT; uint32_t aggStateColIdxInFT; @@ -219,11 +229,7 @@ class AggregateHashTable : public BaseHashTable { uint32_t numBytesForDependentKeys = 0; std::vector updateAggFuncs; // Temporary arrays to hold intermediate results. - std::unique_ptr hashSlotsToUpdateAggState; std::unique_ptr tmpValueIdxes; - std::unique_ptr entryIdxesToInitialize; - std::unique_ptr mayMatchIdxes; - std::unique_ptr noMatchIdxes; std::unique_ptr tmpSlotIdxes; }; diff --git a/src/include/processor/operator/aggregate/hash_aggregate.h b/src/include/processor/operator/aggregate/hash_aggregate.h index 06f2ab9088e..aadee4cd5be 100644 --- a/src/include/processor/operator/aggregate/hash_aggregate.h +++ b/src/include/processor/operator/aggregate/hash_aggregate.h @@ -33,18 +33,42 @@ class HashAggregateSharedState final : public BaseAggregateSharedState { std::unique_ptr globalAggregateHashTable; }; +struct HashAggregateInfo { + std::vector flatKeysPos; + std::vector unFlatKeysPos; + std::vector dependentKeysPos; + std::unique_ptr tableSchema; + HashTableType hashTableType; + + HashAggregateInfo(std::vector flatKeysPos, std::vector unFlatKeysPos, + std::vector dependentKeysPos, std::unique_ptr tableSchema, + HashTableType hashTableType); + HashAggregateInfo(const HashAggregateInfo& other); +}; + +struct HashAggregateLocalState { + std::vector flatKeyVectors; + std::vector unFlatKeyVectors; + std::vector dependentKeyVectors; + common::DataChunkState* leadingState; + std::unique_ptr aggregateHashTable; + + void init(ResultSet& resultSet, main::ClientContext* context, HashAggregateInfo& info, + std::vector>& aggregateFunctions); + void append( + std::vector>& aggregateInputs, uint64_t multiplicity) const; +}; + class HashAggregate : public BaseAggregate { public: HashAggregate(std::unique_ptr resultSetDescriptor, - std::shared_ptr sharedState, std::vector flatKeysPos, - std::vector unFlatKeysPos, std::vector dependentKeysPos, + std::shared_ptr sharedState, HashAggregateInfo aggregateInfo, std::vector> aggregateFunctions, std::vector> aggregateInputInfos, std::unique_ptr child, uint32_t id, const std::string& paramsString) : BaseAggregate{std::move(resultSetDescriptor), std::move(aggregateFunctions), std::move(aggregateInputInfos), std::move(child), id, paramsString}, - flatKeysPos{std::move(flatKeysPos)}, unFlatKeysPos{std::move(unFlatKeysPos)}, - dependentKeysPos{std::move(dependentKeysPos)}, sharedState{std::move(sharedState)} {} + aggregateInfo{std::move(aggregateInfo)}, sharedState{std::move(sharedState)} {} void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; @@ -52,24 +76,15 @@ class HashAggregate : public BaseAggregate { void finalize(ExecutionContext* context) override; - inline std::unique_ptr clone() override { - return make_unique(resultSetDescriptor->copy(), sharedState, flatKeysPos, - unFlatKeysPos, dependentKeysPos, cloneAggFunctions(), cloneAggInputInfos(), - children[0]->clone(), id, paramsString); + std::unique_ptr clone() override { + return make_unique(resultSetDescriptor->copy(), sharedState, aggregateInfo, + cloneAggFunctions(), cloneAggInputInfos(), children[0]->clone(), id, paramsString); } private: - std::vector flatKeysPos; - std::vector unFlatKeysPos; - std::vector dependentKeysPos; - - std::vector flatKeyVectors; - std::vector unFlatKeyVectors; - std::vector dependentKeyVectors; - common::DataChunkState* leadingState; - + HashAggregateInfo aggregateInfo; + HashAggregateLocalState localState; std::shared_ptr sharedState; - std::unique_ptr localAggregateHashTable; }; } // namespace processor diff --git a/src/include/processor/operator/persistent/insert_executor.h b/src/include/processor/operator/persistent/insert_executor.h index 85f9f9f6196..1643feac1d3 100644 --- a/src/include/processor/operator/persistent/insert_executor.h +++ b/src/include/processor/operator/persistent/insert_executor.h @@ -28,11 +28,14 @@ class NodeInsertExecutor { void insert(transaction::Transaction* transaction, ExecutionContext* context); + void evaluateResult(ExecutionContext* context); + + void writeResult(); + private: NodeInsertExecutor(const NodeInsertExecutor& other); bool checkConfict(transaction::Transaction* transaction); - void writeResult(); private: // Node table to insert. @@ -69,11 +72,11 @@ class RelInsertExecutor { void insert(transaction::Transaction* transaction, ExecutionContext* context); + void writeResult(); + private: RelInsertExecutor(const RelInsertExecutor& other); - void writeResult(); - private: storage::RelsStoreStats* relsStatistics; storage::RelTable* table; diff --git a/src/include/processor/operator/persistent/merge.h b/src/include/processor/operator/persistent/merge.h index 7eea1e3959b..09994e1f05c 100644 --- a/src/include/processor/operator/persistent/merge.h +++ b/src/include/processor/operator/persistent/merge.h @@ -9,7 +9,8 @@ namespace processor { class Merge : public PhysicalOperator { public: - Merge(const DataPos& markPos, std::vector nodeInsertExecutors, + Merge(const DataPos& existenceMark, const DataPos& distinctMark, + std::vector nodeInsertExecutors, std::vector relInsertExecutors, std::vector> onCreateNodeSetExecutors, std::vector> onCreateRelSetExecutors, @@ -17,7 +18,8 @@ class Merge : public PhysicalOperator { std::vector> onMatchRelSetExecutors, std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::MERGE, std::move(child), id, paramsString}, - markPos{markPos}, nodeInsertExecutors{std::move(nodeInsertExecutors)}, + existenceMark{existenceMark}, distinctMark{distinctMark}, nodeInsertExecutors{std::move( + nodeInsertExecutors)}, relInsertExecutors{std::move(relInsertExecutors)}, onCreateNodeSetExecutors{std::move( onCreateNodeSetExecutors)}, onCreateRelSetExecutors{std::move(onCreateRelSetExecutors)}, @@ -31,7 +33,7 @@ class Merge : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return std::make_unique(markPos, copyVector(nodeInsertExecutors), + return std::make_unique(existenceMark, distinctMark, copyVector(nodeInsertExecutors), copyVector(relInsertExecutors), NodeSetExecutor::copy(onCreateNodeSetExecutors), RelSetExecutor::copy(onCreateRelSetExecutors), NodeSetExecutor::copy(onMatchNodeSetExecutors), @@ -39,8 +41,10 @@ class Merge : public PhysicalOperator { } private: - DataPos markPos; - common::ValueVector* markVector = nullptr; + DataPos existenceMark; + DataPos distinctMark; + common::ValueVector* existenceVector = nullptr; + common::ValueVector* distinctVector = nullptr; std::vector nodeInsertExecutors; std::vector relInsertExecutors; diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index b4b8c1fe28a..56131e4dbfd 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -69,6 +69,7 @@ class PlanMapper { std::unique_ptr mapOrderBy(planner::LogicalOperator* logicalOperator); std::unique_ptr mapUnionAll(planner::LogicalOperator* logicalOperator); std::unique_ptr mapAccumulate(planner::LogicalOperator* logicalOperator); + std::unique_ptr mapMarkAccumulate(planner::LogicalOperator* logicalOperator); std::unique_ptr mapDummyScan(planner::LogicalOperator* logicalOperator); std::unique_ptr mapInsert(planner::LogicalOperator* logicalOperator); std::unique_ptr mapSetNodeProperty(planner::LogicalOperator* logicalOperator); @@ -148,14 +149,13 @@ class PlanMapper { std::unique_ptr createHashBuildInfo(const planner::Schema& buildSideSchema, const binder::expression_vector& keys, const binder::expression_vector& payloads); - std::unique_ptr createHashAggregate( - const binder::expression_vector& keyExpressions, - const binder::expression_vector& dependentKeyExpressions, + std::unique_ptr createHashAggregate(const binder::expression_vector& keys, + const binder::expression_vector& payloads, std::vector> aggregateFunctions, std::vector> aggregateInputInfos, std::vector aggregatesOutputPos, planner::Schema* inSchema, planner::Schema* outSchema, std::unique_ptr prevOperator, - const std::string& paramsString); + const std::string& paramsString, std::shared_ptr markExpression); std::unique_ptr getNodeInsertExecutor( const planner::LogicalInsertInfo* info, const planner::Schema& inSchema, diff --git a/src/include/processor/result/mark_hash_table.h b/src/include/processor/result/mark_hash_table.h new file mode 100644 index 00000000000..5f014ae9819 --- /dev/null +++ b/src/include/processor/result/mark_hash_table.h @@ -0,0 +1,32 @@ +#include "processor/operator/aggregate/aggregate_hash_table.h" + +#pragma once + +namespace kuzu { +namespace processor { + +class MarkHashTable : public AggregateHashTable { + +public: + MarkHashTable(storage::MemoryManager& memoryManager, + std::vector keyDataTypes, + std::vector dependentKeyDataTypes, + const std::vector>& aggregateFunctions, + uint64_t numEntriesToAllocate, std::unique_ptr tableSchema); + + uint64_t matchFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, uint64_t numMayMatches, + uint64_t numNoMatches) override; + + void initializeFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, + const std::vector& dependentKeyVectors, + uint64_t numFTEntriesToInitialize) override; + +private: + std::unordered_set onMatchSlotIdxes; + uint32_t distinctColIdxInFT; +}; + +} // namespace processor +} // namespace kuzu diff --git a/src/optimizer/agg_key_dependency_optimizer.cpp b/src/optimizer/agg_key_dependency_optimizer.cpp index 04dcd7fbf9e..e027e792e31 100644 --- a/src/optimizer/agg_key_dependency_optimizer.cpp +++ b/src/optimizer/agg_key_dependency_optimizer.cpp @@ -33,9 +33,9 @@ void AggKeyDependencyOptimizer::visitAggregate(planner::LogicalOperator* op) { void AggKeyDependencyOptimizer::visitDistinct(planner::LogicalOperator* op) { auto distinct = (LogicalDistinct*)op; - auto [keys, dependentKeys] = resolveKeysAndDependentKeys(distinct->getKeyExpressions()); - distinct->setKeyExpressions(keys); - distinct->setDependentKeyExpressions(dependentKeys); + auto [keys, dependentKeys] = resolveKeysAndDependentKeys(distinct->getKeys()); + distinct->setKeys(keys); + distinct->setPayloads(dependentKeys); } std::pair diff --git a/src/optimizer/factorization_rewriter.cpp b/src/optimizer/factorization_rewriter.cpp index d18e3ad37e4..f87470dd1f1 100644 --- a/src/optimizer/factorization_rewriter.cpp +++ b/src/optimizer/factorization_rewriter.cpp @@ -1,6 +1,7 @@ #include "optimizer/factorization_rewriter.h" #include "binder/expression_visitor.h" +#include "common/cast.h" #include "planner/operator/extend/logical_extend.h" #include "planner/operator/extend/logical_recursive_extend.h" #include "planner/operator/factorization/flatten_resolver.h" @@ -12,6 +13,7 @@ #include "planner/operator/logical_hash_join.h" #include "planner/operator/logical_intersect.h" #include "planner/operator/logical_limit.h" +#include "planner/operator/logical_mark_accmulate.h" #include "planner/operator/logical_order_by.h" #include "planner/operator/logical_projection.h" #include "planner/operator/logical_union.h" @@ -22,6 +24,7 @@ #include "planner/operator/persistent/logical_merge.h" #include "planner/operator/persistent/logical_set.h" +using namespace kuzu::common; using namespace kuzu::binder; using namespace kuzu::planner; @@ -104,6 +107,12 @@ void FactorizationRewriter::visitAccumulate(planner::LogicalOperator* op) { accumulate->setChild(0, appendFlattens(accumulate->getChild(0), groupsPosToFlatten)); } +void FactorizationRewriter::visitMarkAccumulate(planner::LogicalOperator* op) { + auto markAccumulate = ku_dynamic_cast(op); + auto groupsPos = markAccumulate->getGroupsPosToFlatten(); + markAccumulate->setChild(0, appendFlattens(markAccumulate->getChild(0), groupsPos)); +} + void FactorizationRewriter::visitAggregate(planner::LogicalOperator* op) { auto aggregate = (LogicalAggregate*)op; auto groupsPosToFlattenForGroupBy = aggregate->getGroupsPosToFlattenForGroupBy(); diff --git a/src/optimizer/logical_operator_visitor.cpp b/src/optimizer/logical_operator_visitor.cpp index b43c85167b8..9cb1e0fb2cf 100644 --- a/src/optimizer/logical_operator_visitor.cpp +++ b/src/optimizer/logical_operator_visitor.cpp @@ -52,6 +52,9 @@ void LogicalOperatorVisitor::visitOperatorSwitch(planner::LogicalOperator* op) { case LogicalOperatorType::ACCUMULATE: { visitAccumulate(op); } break; + case LogicalOperatorType::MARK_ACCUMULATE: { + visitMarkAccumulate(op); + } break; case LogicalOperatorType::DISTINCT: { visitDistinct(op); } break; @@ -141,6 +144,9 @@ std::shared_ptr LogicalOperatorVisitor::visitOperatorR case LogicalOperatorType::ACCUMULATE: { return visitAccumulateReplace(op); } + case LogicalOperatorType::MARK_ACCUMULATE: { + return visitMarkAccumulateReplace(op); + } case LogicalOperatorType::DISTINCT: { return visitDistinctReplace(op); } diff --git a/src/optimizer/projection_push_down_optimizer.cpp b/src/optimizer/projection_push_down_optimizer.cpp index b6ca4f855af..90d5c7bdf47 100644 --- a/src/optimizer/projection_push_down_optimizer.cpp +++ b/src/optimizer/projection_push_down_optimizer.cpp @@ -66,7 +66,7 @@ void ProjectionPushDownOptimizer::visitAccumulate(planner::LogicalOperator* op) if (accumulate->getAccumulateType() != AccumulateType::REGULAR) { return; } - auto expressionsBeforePruning = accumulate->getExpressionsToAccumulate(); + auto expressionsBeforePruning = accumulate->getPayloads(); auto expressionsAfterPruning = pruneExpressions(expressionsBeforePruning); if (expressionsBeforePruning.size() == expressionsAfterPruning.size()) { return; @@ -200,7 +200,10 @@ void ProjectionPushDownOptimizer::visitDeleteRel(planner::LogicalOperator* op) { // TODO(Xiyang): come back and refactor this after changing insert interface void ProjectionPushDownOptimizer::visitMerge(planner::LogicalOperator* op) { auto merge = (LogicalMerge*)op; - collectExpressionsInUse(merge->getMark()); + if (merge->hasDistinctMark()) { + collectExpressionsInUse(merge->getDistinctMark()); + } + collectExpressionsInUse(merge->getExistenceMark()); for (auto& info : merge->getInsertNodeInfosRef()) { visitInsertInfo(&info); } diff --git a/src/planner/operator/CMakeLists.txt b/src/planner/operator/CMakeLists.txt index a69aaf38a68..fd176ffe117 100644 --- a/src/planner/operator/CMakeLists.txt +++ b/src/planner/operator/CMakeLists.txt @@ -20,6 +20,7 @@ add_library(kuzu_planner_operator logical_in_query_call.cpp logical_intersect.cpp logical_limit.cpp + logical_mark_accumulate.cpp logical_operator.cpp logical_order_by.cpp logical_partitioner.cpp diff --git a/src/planner/operator/logical_accumulate.cpp b/src/planner/operator/logical_accumulate.cpp index 35c402422fd..ffc4dc760ea 100644 --- a/src/planner/operator/logical_accumulate.cpp +++ b/src/planner/operator/logical_accumulate.cpp @@ -9,7 +9,7 @@ namespace planner { void LogicalAccumulate::computeFactorizedSchema() { createEmptySchema(); auto childSchema = children[0]->getSchema(); - SinkOperatorUtil::recomputeSchema(*childSchema, getExpressionsToAccumulate(), *schema); + SinkOperatorUtil::recomputeSchema(*childSchema, getPayloads(), *schema); if (offset != nullptr) { // If we need to generate row offset. Then all expressions must have been flattened and // accumulated. So the new schema should just have one group. diff --git a/src/planner/operator/logical_distinct.cpp b/src/planner/operator/logical_distinct.cpp index 74fde0ae8f9..b27415b7c8e 100644 --- a/src/planner/operator/logical_distinct.cpp +++ b/src/planner/operator/logical_distinct.cpp @@ -1,5 +1,6 @@ #include "planner/operator/logical_distinct.h" +#include "binder/expression/expression_util.h" #include "planner/operator/factorization/flatten_resolver.h" namespace kuzu { @@ -8,7 +9,7 @@ namespace planner { void LogicalDistinct::computeFactorizedSchema() { createEmptySchema(); auto groupPos = schema->createGroup(); - for (auto& expression : getAllDistinctExpressions()) { + for (auto& expression : getKeysAndPayloads()) { schema->insertToGroupAndScope(expression, groupPos); } } @@ -16,7 +17,7 @@ void LogicalDistinct::computeFactorizedSchema() { void LogicalDistinct::computeFlatSchema() { createEmptySchema(); schema->createGroup(); - for (auto& expression : getAllDistinctExpressions()) { + for (auto& expression : getKeysAndPayloads()) { schema->insertToGroupAndScope(expression, 0); } } @@ -24,7 +25,7 @@ void LogicalDistinct::computeFlatSchema() { f_group_pos_set LogicalDistinct::getGroupsPosToFlatten() { f_group_pos_set dependentGroupsPos; auto childSchema = children[0]->getSchema(); - for (auto& expression : getAllDistinctExpressions()) { + for (auto& expression : getKeysAndPayloads()) { for (auto groupPos : childSchema->getDependentGroupsPos(expression)) { dependentGroupsPos.insert(groupPos); } @@ -33,10 +34,13 @@ f_group_pos_set LogicalDistinct::getGroupsPosToFlatten() { } std::string LogicalDistinct::getExpressionsForPrinting() const { - std::string result; - for (auto& expression : getAllDistinctExpressions()) { - result += expression->getUniqueName() + ", "; - } + return binder::ExpressionUtil::toString(getKeysAndPayloads()); +} + +binder::expression_vector LogicalDistinct::getKeysAndPayloads() const { + binder::expression_vector result; + result.insert(result.end(), keys.begin(), keys.end()); + result.insert(result.end(), payloads.begin(), payloads.end()); return result; } diff --git a/src/planner/operator/logical_mark_accumulate.cpp b/src/planner/operator/logical_mark_accumulate.cpp new file mode 100644 index 00000000000..01234d84f81 --- /dev/null +++ b/src/planner/operator/logical_mark_accumulate.cpp @@ -0,0 +1,46 @@ +#include "binder/expression/expression_util.h" +#include "planner/operator/factorization/flatten_resolver.h" +#include "planner/operator/factorization/sink_util.h" +#include "planner/operator/logical_mark_accmulate.h" + +using namespace kuzu::binder; + +namespace kuzu { +namespace planner { + +void LogicalMarkAccumulate::computeFactorizedSchema() { + createEmptySchema(); + auto childSchema = children[0]->getSchema(); + SinkOperatorUtil::recomputeSchema(*childSchema, childSchema->getExpressionsInScope(), *schema); + f_group_pos groupPos; + if (!keys.empty()) { + groupPos = schema->getGroupPos(*keys[0]); + } else { + groupPos = schema->createGroup(); + } + schema->insertToGroupAndScope(mark, groupPos); +} + +void LogicalMarkAccumulate::computeFlatSchema() { + copyChildSchema(0); + schema->insertToGroupAndScope(mark, 0); +} + +f_group_pos_set LogicalMarkAccumulate::getGroupsPosToFlatten() const { + f_group_pos_set dependentGroupsPos; + auto childSchema = children[0]->getSchema(); + for (auto& key : keys) { + for (auto groupPos : childSchema->getDependentGroupsPos(key)) { + dependentGroupsPos.insert(groupPos); + } + } + return factorization::FlattenAll::getGroupsPosToFlatten(dependentGroupsPos, childSchema); +} + +expression_vector LogicalMarkAccumulate::getPayloads() const { + auto exprs = children[0]->getSchema()->getExpressionsInScope(); + return ExpressionUtil::excludeExpressions(exprs, keys); +} + +} // namespace planner +} // namespace kuzu diff --git a/src/planner/operator/logical_operator.cpp b/src/planner/operator/logical_operator.cpp index fca71e61f0c..3bf8c27794e 100644 --- a/src/planner/operator/logical_operator.cpp +++ b/src/planner/operator/logical_operator.cpp @@ -63,6 +63,8 @@ std::string LogicalOperatorUtils::logicalOperatorTypeToString(LogicalOperatorTyp return "INSERT"; case LogicalOperatorType::LIMIT: return "LIMIT"; + case LogicalOperatorType::MARK_ACCUMULATE: + return "MARK_ACCUMULATE"; case LogicalOperatorType::MERGE: return "MERGE"; case LogicalOperatorType::MULTIPLICITY_REDUCER: diff --git a/src/planner/plan/CMakeLists.txt b/src/planner/plan/CMakeLists.txt index 5c658dec138..1c26c928621 100644 --- a/src/planner/plan/CMakeLists.txt +++ b/src/planner/plan/CMakeLists.txt @@ -14,6 +14,7 @@ add_library(kuzu_planner_plan_operator append_in_query_call.cpp append_join.cpp append_limit.cpp + append_mark_accumulate.cpp append_multiplicity_reducer.cpp append_order_by.cpp append_projection.cpp diff --git a/src/planner/plan/append_distinct.cpp b/src/planner/plan/append_distinct.cpp index ec6f620b36e..1fc8f9d06f3 100644 --- a/src/planner/plan/append_distinct.cpp +++ b/src/planner/plan/append_distinct.cpp @@ -6,8 +6,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendDistinct(const expression_vector& expressionsToDistinct, LogicalPlan& plan) { - auto distinct = make_shared(expressionsToDistinct, plan.getLastOperator()); +void Planner::appendDistinct(const expression_vector& keys, LogicalPlan& plan) { + auto distinct = make_shared(keys, plan.getLastOperator()); appendFlattens(distinct->getGroupsPosToFlatten(), plan); distinct->setChild(0, plan.getLastOperator()); distinct->computeFactorizedSchema(); diff --git a/src/planner/plan/append_mark_accumulate.cpp b/src/planner/plan/append_mark_accumulate.cpp new file mode 100644 index 00000000000..feb67c9e1a5 --- /dev/null +++ b/src/planner/plan/append_mark_accumulate.cpp @@ -0,0 +1,20 @@ +#include "planner/operator/logical_mark_accmulate.h" +#include "planner/planner.h" + +using namespace kuzu::binder; + +namespace kuzu { +namespace planner { + +void Planner::appendMarkAccumulate( + const expression_vector& keys, std::shared_ptr mark, LogicalPlan& plan) { + auto markAccumulate = + std::make_shared(keys, mark, plan.getLastOperator()); + appendFlattens(markAccumulate->getGroupsPosToFlatten(), plan); + markAccumulate->setChild(0, plan.getLastOperator()); + markAccumulate->computeFactorizedSchema(); + plan.setLastOperator(std::move(markAccumulate)); +} + +} // namespace planner +} // namespace kuzu diff --git a/src/planner/plan/plan_read.cpp b/src/planner/plan/plan_read.cpp index a366e1c5d72..010d58789f3 100644 --- a/src/planner/plan/plan_read.cpp +++ b/src/planner/plan/plan_read.cpp @@ -50,7 +50,12 @@ void Planner::planMatchClause(const BoundReadingClause* boundReadingClause, } break; case MatchClauseType::OPTIONAL_MATCH: { for (auto& plan : plans) { - planOptionalMatch(*queryGraphCollection, predicates, *plan); + expression_vector corrExprs; + if (!plan->isEmpty()) { + corrExprs = + getCorrelatedExprs(*queryGraphCollection, predicates, plan->getSchema()); + } + planOptionalMatch(*queryGraphCollection, predicates, corrExprs, *plan); } } break; default: diff --git a/src/planner/plan/plan_subquery.cpp b/src/planner/plan/plan_subquery.cpp index a81e6c1a9d0..67da0e2332a 100644 --- a/src/planner/plan/plan_subquery.cpp +++ b/src/planner/plan/plan_subquery.cpp @@ -9,7 +9,7 @@ using namespace kuzu::common; namespace kuzu { namespace planner { -static expression_vector getCorrelatedExpressions(const QueryGraphCollection& collection, +binder::expression_vector Planner::getCorrelatedExprs(const QueryGraphCollection& collection, const expression_vector& predicates, Schema* outerSchema) { expression_vector result; for (auto& predicate : predicates) { @@ -26,7 +26,8 @@ static expression_vector getCorrelatedExpressions(const QueryGraphCollection& co } void Planner::planOptionalMatch(const QueryGraphCollection& queryGraphCollection, - const expression_vector& predicates, LogicalPlan& leftPlan) { + const expression_vector& predicates, const binder::expression_vector& corrExprs, + LogicalPlan& leftPlan) { if (leftPlan.isEmpty()) { // Optional match is the first clause. No left plan to join. auto plan = planQueryGraphCollection(queryGraphCollection, predicates); @@ -34,9 +35,7 @@ void Planner::planOptionalMatch(const QueryGraphCollection& queryGraphCollection appendAccumulate(AccumulateType::OPTIONAL_, leftPlan); return; } - auto correlatedExpressions = - getCorrelatedExpressions(queryGraphCollection, predicates, leftPlan.getSchema()); - if (correlatedExpressions.empty()) { + if (corrExprs.empty()) { // No join condition, apply cross product. auto rightPlan = planQueryGraphCollection(queryGraphCollection, predicates); if (leftPlan.hasUpdate()) { @@ -46,32 +45,32 @@ void Planner::planOptionalMatch(const QueryGraphCollection& queryGraphCollection } return; } - bool isInternalIDCorrelated = ExpressionUtil::isExpressionsWithDataType( - correlatedExpressions, LogicalTypeID::INTERNAL_ID); + bool isInternalIDCorrelated = + ExpressionUtil::isExpressionsWithDataType(corrExprs, LogicalTypeID::INTERNAL_ID); std::unique_ptr rightPlan; if (isInternalIDCorrelated) { // If all correlated expressions are node IDs. We can trivially unnest by scanning internal // ID in both outer and inner plan as these are fast in-memory operations. For node // properties, we only scan in the outer query. rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::INTERNAL_ID_CORRELATED, - correlatedExpressions, leftPlan.getCardinality(), queryGraphCollection, predicates); + corrExprs, leftPlan.getCardinality(), queryGraphCollection, predicates); } else { // Unnest using ExpressionsScan which scans the accumulated table on probe side. - rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::CORRELATED, - correlatedExpressions, leftPlan.getCardinality(), queryGraphCollection, predicates); - appendAccumulate(AccumulateType::REGULAR, correlatedExpressions, leftPlan); + rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::CORRELATED, corrExprs, + leftPlan.getCardinality(), queryGraphCollection, predicates); + appendAccumulate(AccumulateType::REGULAR, corrExprs, leftPlan); } if (leftPlan.hasUpdate()) { throw RuntimeException(stringFormat("Optional match after update is not supported. Missing " "right outer join implementation.")); } - appendHashJoin(correlatedExpressions, JoinType::LEFT, leftPlan, *rightPlan, leftPlan); + appendHashJoin(corrExprs, JoinType::LEFT, leftPlan, *rightPlan, leftPlan); } void Planner::planRegularMatch(const QueryGraphCollection& queryGraphCollection, const expression_vector& predicates, LogicalPlan& leftPlan) { auto correlatedExpressions = - getCorrelatedExpressions(queryGraphCollection, predicates, leftPlan.getSchema()); + getCorrelatedExprs(queryGraphCollection, predicates, leftPlan.getSchema()); expression_vector predicatesToPushDown, predicatesToPullUp; // E.g. MATCH (a) WITH COUNT(*) AS s MATCH (b) WHERE b.age > s // "b.age > s" should be pulled up after both MATCH clauses are joined. diff --git a/src/planner/plan/plan_update.cpp b/src/planner/plan/plan_update.cpp index be64ccf2195..210d3e95d06 100644 --- a/src/planner/plan/plan_update.cpp +++ b/src/planner/plan/plan_update.cpp @@ -65,23 +65,18 @@ void Planner::planMergeClause(const BoundUpdatingClause* updatingClause, Logical if (mergeClause->hasPredicate()) { predicates = mergeClause->getPredicate()->splitOnAND(); } - planOptionalMatch(*mergeClause->getQueryGraphCollection(), predicates, plan); - std::shared_ptr mark; - auto& createInfos = mergeClause->getInsertInfosRef(); - KU_ASSERT(!createInfos.empty()); - auto& createInfo = createInfos[0]; - switch (createInfo.tableType) { - case TableType::NODE: { - auto node = (NodeExpression*)createInfo.pattern.get(); - mark = node->getInternalID(); - } break; - case TableType::REL: { - auto rel = (RelExpression*)createInfo.pattern.get(); - mark = rel->getInternalIDProperty(); - } break; - default: - KU_UNREACHABLE; + std::shared_ptr distinctMark = nullptr; + expression_vector corrExprs; + if (!plan.isEmpty()) { + distinctMark = mergeClause->getDistinctMark(); + corrExprs = getCorrelatedExprs( + *mergeClause->getQueryGraphCollection(), predicates, plan.getSchema()); + if (corrExprs.size() == 0) { + throw RuntimeException{"Constant key in merge clause is not supported yet."}; + } + appendMarkAccumulate(corrExprs, distinctMark, plan); } + planOptionalMatch(*mergeClause->getQueryGraphCollection(), predicates, corrExprs, plan); std::vector logicalInsertNodeInfos; if (mergeClause->hasInsertNodeInfo()) { auto boundInsertNodeInfos = mergeClause->getInsertNodeInfos(); @@ -119,10 +114,27 @@ void Planner::planMergeClause(const BoundUpdatingClause* updatingClause, Logical logicalOnMatchSetRelInfos.push_back(createLogicalSetPropertyInfo(info)); } } - auto merge = std::make_shared(mark, std::move(logicalInsertNodeInfos), - std::move(logicalInsertRelInfos), std::move(logicalOnCreateSetNodeInfos), - std::move(logicalOnCreateSetRelInfos), std::move(logicalOnMatchSetNodeInfos), - std::move(logicalOnMatchSetRelInfos), plan.getLastOperator()); + std::shared_ptr existenceMark; + auto& createInfos = mergeClause->getInsertInfosRef(); + KU_ASSERT(!createInfos.empty()); + auto& createInfo = createInfos[0]; + switch (createInfo.tableType) { + case TableType::NODE: { + auto node = (NodeExpression*)createInfo.pattern.get(); + existenceMark = node->getInternalID(); + } break; + case TableType::REL: { + auto rel = (RelExpression*)createInfo.pattern.get(); + existenceMark = rel->getInternalIDProperty(); + } break; + default: + KU_UNREACHABLE; + } + auto merge = std::make_shared(existenceMark, distinctMark, + std::move(logicalInsertNodeInfos), std::move(logicalInsertRelInfos), + std::move(logicalOnCreateSetNodeInfos), std::move(logicalOnCreateSetRelInfos), + std::move(logicalOnMatchSetNodeInfos), std::move(logicalOnMatchSetRelInfos), + plan.getLastOperator()); appendFlattens(merge->getGroupsPosToFlatten(), plan); merge->setChild(0, plan.getLastOperator()); merge->computeFactorizedSchema(); diff --git a/src/processor/map/CMakeLists.txt b/src/processor/map/CMakeLists.txt index 8df4e48f0f3..c7aa880fcdc 100644 --- a/src/processor/map/CMakeLists.txt +++ b/src/processor/map/CMakeLists.txt @@ -33,6 +33,7 @@ add_library(kuzu_processor_mapper map_intersect.cpp map_label_filter.cpp map_limit.cpp + map_mark_accumulate.cpp map_merge.cpp map_multiplicity_reducer.cpp map_order_by.cpp diff --git a/src/processor/map/map_accumulate.cpp b/src/processor/map/map_accumulate.cpp index 2cb4d64b994..78f4fb36a8e 100644 --- a/src/processor/map/map_accumulate.cpp +++ b/src/processor/map/map_accumulate.cpp @@ -13,7 +13,7 @@ std::unique_ptr PlanMapper::mapAccumulate(LogicalOperator* log auto outSchema = acc->getSchema(); auto inSchema = acc->getChild(0)->getSchema(); auto prevOperator = mapOperator(acc->getChild(0).get()); - auto expressions = acc->getExpressionsToAccumulate(); + auto expressions = acc->getPayloads(); auto resultCollector = createResultCollector( acc->getAccumulateType(), expressions, inSchema, std::move(prevOperator)); auto table = resultCollector->getResultFactorizedTable(); diff --git a/src/processor/map/map_aggregate.cpp b/src/processor/map/map_aggregate.cpp index 9b5ffc39f6c..cfe8c0d26e2 100644 --- a/src/processor/map/map_aggregate.cpp +++ b/src/processor/map/map_aggregate.cpp @@ -81,7 +81,7 @@ std::unique_ptr PlanMapper::mapAggregate(LogicalOperator* logi return createHashAggregate(logicalAggregate.getKeyExpressions(), logicalAggregate.getDependentKeyExpressions(), std::move(aggregateFunctions), std::move(aggregateInputInfos), std::move(aggregatesOutputPos), inSchema, outSchema, - std::move(prevOperator), paramsString); + std::move(prevOperator), paramsString, nullptr); } else { auto sharedState = make_shared(aggregateFunctions); auto aggregate = @@ -93,28 +93,66 @@ std::unique_ptr PlanMapper::mapAggregate(LogicalOperator* logi } } +static std::unique_ptr getFactorizedTableSchema( + const binder::expression_vector& flatKeys, const binder::expression_vector& unflatKeys, + const binder::expression_vector& payloads, + std::vector>& aggregateFunctions, + std::shared_ptr markExpression) { + auto isUnflat = false; + auto dataChunkPos = 0u; + std::unique_ptr tableSchema = std::make_unique(); + for (auto& flatKey : flatKeys) { + auto size = LogicalTypeUtils::getRowLayoutSize(flatKey->dataType); + tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); + } + for (auto& unflatKey : unflatKeys) { + auto size = LogicalTypeUtils::getRowLayoutSize(unflatKey->dataType); + tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); + } + for (auto& payload : payloads) { + auto size = LogicalTypeUtils::getRowLayoutSize(payload->dataType); + tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); + } + for (auto& aggregateFunc : aggregateFunctions) { + tableSchema->appendColumn(std::make_unique( + isUnflat, dataChunkPos, aggregateFunc->getAggregateStateSize())); + } + if (markExpression != nullptr) { + tableSchema->appendColumn(std::make_unique( + isUnflat, dataChunkPos, LogicalTypeUtils::getRowLayoutSize(markExpression->dataType))); + } + tableSchema->appendColumn( + std::make_unique(isUnflat, dataChunkPos, sizeof(hash_t))); + return tableSchema; +} + std::unique_ptr PlanMapper::createHashAggregate( - const binder::expression_vector& keyExpressions, - const binder::expression_vector& dependentKeyExpressions, + const binder::expression_vector& keys, const binder::expression_vector& payloads, std::vector> aggregateFunctions, std::vector> aggregateInputInfos, std::vector aggregatesOutputPos, planner::Schema* inSchema, planner::Schema* outSchema, - std::unique_ptr prevOperator, const std::string& paramsString) { + std::unique_ptr prevOperator, const std::string& paramsString, + std::shared_ptr markExpression) { auto sharedState = make_shared(aggregateFunctions); - auto flatKeyExpressions = getKeyExpressions(keyExpressions, *inSchema, true /* isFlat */); - auto unFlatKeyExpressions = getKeyExpressions(keyExpressions, *inSchema, false /* isFlat */); + auto flatKeys = getKeyExpressions(keys, *inSchema, true /* isFlat */); + auto unFlatKeys = getKeyExpressions(keys, *inSchema, false /* isFlat */); + auto tableSchema = getFactorizedTableSchema( + flatKeys, unFlatKeys, payloads, aggregateFunctions, markExpression); + HashAggregateInfo aggregateInfo{getExpressionsDataPos(flatKeys, *inSchema), + getExpressionsDataPos(unFlatKeys, *inSchema), getExpressionsDataPos(payloads, *inSchema), + std::move(tableSchema), + markExpression == nullptr ? HashTableType::AGGREGATE_HASH_TABLE : + HashTableType::MARK_HASH_TABLE}; auto aggregate = make_unique(std::make_unique(inSchema), - sharedState, getExpressionsDataPos(flatKeyExpressions, *inSchema), - getExpressionsDataPos(unFlatKeyExpressions, *inSchema), - getExpressionsDataPos(dependentKeyExpressions, *inSchema), std::move(aggregateFunctions), + sharedState, std::move(aggregateInfo), std::move(aggregateFunctions), std::move(aggregateInputInfos), std::move(prevOperator), getOperatorID(), paramsString); binder::expression_vector outputExpressions; - outputExpressions.insert( - outputExpressions.end(), flatKeyExpressions.begin(), flatKeyExpressions.end()); - outputExpressions.insert( - outputExpressions.end(), unFlatKeyExpressions.begin(), unFlatKeyExpressions.end()); - outputExpressions.insert( - outputExpressions.end(), dependentKeyExpressions.begin(), dependentKeyExpressions.end()); + outputExpressions.insert(outputExpressions.end(), flatKeys.begin(), flatKeys.end()); + outputExpressions.insert(outputExpressions.end(), unFlatKeys.begin(), unFlatKeys.end()); + outputExpressions.insert(outputExpressions.end(), payloads.begin(), payloads.end()); + if (markExpression != nullptr) { + outputExpressions.emplace_back(markExpression); + } return std::make_unique(sharedState, getExpressionsDataPos(outputExpressions, *outSchema), std::move(aggregatesOutputPos), std::move(aggregate), getOperatorID(), paramsString); diff --git a/src/processor/map/map_distinct.cpp b/src/processor/map/map_distinct.cpp index 67eb1ab37c4..a1de19d1a49 100644 --- a/src/processor/map/map_distinct.cpp +++ b/src/processor/map/map_distinct.cpp @@ -16,10 +16,10 @@ std::unique_ptr PlanMapper::mapDistinct(LogicalOperator* logic std::vector> emptyAggFunctions; std::vector> emptyAggInputInfos; std::vector emptyAggregatesOutputPos; - return createHashAggregate(logicalDistinct.getKeyExpressions(), - logicalDistinct.getDependentKeyExpressions(), std::move(emptyAggFunctions), - std::move(emptyAggInputInfos), std::move(emptyAggregatesOutputPos), inSchema, outSchema, - std::move(prevOperator), logicalDistinct.getExpressionsForPrinting()); + return createHashAggregate(logicalDistinct.getKeys(), logicalDistinct.getPayloads(), + std::move(emptyAggFunctions), std::move(emptyAggInputInfos), + std::move(emptyAggregatesOutputPos), inSchema, outSchema, std::move(prevOperator), + logicalDistinct.getExpressionsForPrinting(), nullptr /* markExpression */); } } // namespace processor diff --git a/src/processor/map/map_expressions_scan.cpp b/src/processor/map/map_expressions_scan.cpp index 123a3d564a5..4a6558ee012 100644 --- a/src/processor/map/map_expressions_scan.cpp +++ b/src/processor/map/map_expressions_scan.cpp @@ -14,7 +14,7 @@ std::unique_ptr PlanMapper::mapExpressionsScan( auto expressionsScan = (planner::LogicalExpressionsScan*)logicalOperator; auto outerAccumulate = (planner::LogicalAccumulate*)expressionsScan->getOuterAccumulate(); expression_map materializedExpressionToColIdx; - auto materializedExpressions = outerAccumulate->getExpressionsToAccumulate(); + auto materializedExpressions = outerAccumulate->getPayloads(); for (auto i = 0u; i < materializedExpressions.size(); ++i) { materializedExpressionToColIdx.insert({materializedExpressions[i], i}); } diff --git a/src/processor/map/map_mark_accumulate.cpp b/src/processor/map/map_mark_accumulate.cpp new file mode 100644 index 00000000000..96268c08c7d --- /dev/null +++ b/src/processor/map/map_mark_accumulate.cpp @@ -0,0 +1,26 @@ +#include "planner/operator/logical_mark_accmulate.h" +#include "processor/operator/aggregate/aggregate_input.h" +#include "processor/plan_mapper.h" + +using namespace kuzu::planner; +using namespace kuzu::common; + +namespace kuzu { +namespace processor { + +std::unique_ptr PlanMapper::mapMarkAccumulate(LogicalOperator* op) { + auto logicalMarkAccumulate = ku_dynamic_cast(op); + auto keys = logicalMarkAccumulate->getKeys(); + auto payloads = logicalMarkAccumulate->getPayloads(); + auto outSchema = logicalMarkAccumulate->getSchema(); + auto inSchema = logicalMarkAccumulate->getChild(0)->getSchema(); + auto prevOperator = mapOperator(logicalMarkAccumulate->getChild(0).get()); + return createHashAggregate(keys, payloads, + std::vector>{}, + std::vector>{}, std::vector{}, inSchema, + outSchema, std::move(prevOperator), logicalMarkAccumulate->getExpressionsForPrinting(), + logicalMarkAccumulate->getMark()); +} + +} // namespace processor +} // namespace kuzu diff --git a/src/processor/map/map_merge.cpp b/src/processor/map/map_merge.cpp index 2bcc375946f..4b1b4ed3a83 100644 --- a/src/processor/map/map_merge.cpp +++ b/src/processor/map/map_merge.cpp @@ -12,7 +12,12 @@ std::unique_ptr PlanMapper::mapMerge(planner::LogicalOperator* auto outSchema = logicalMerge->getSchema(); auto inSchema = logicalMerge->getChild(0)->getSchema(); auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); - auto markPos = DataPos(inSchema->getExpressionPos(*logicalMerge->getMark())); + auto existenceMarkPos = getDataPos(*logicalMerge->getExistenceMark(), *inSchema); + auto distinctMarkPos = DataPos(); + if (logicalMerge + ->hasDistinctMark()) { // If there is no distinct mark, then every input is distinct. + distinctMarkPos = getDataPos(*logicalMerge->getDistinctMark(), *inSchema); + } std::vector nodeInsertExecutors; for (auto& info : logicalMerge->getInsertNodeInfosRef()) { nodeInsertExecutors.push_back(getNodeInsertExecutor(&info, *inSchema, *outSchema)->copy()); @@ -37,11 +42,11 @@ std::unique_ptr PlanMapper::mapMerge(planner::LogicalOperator* for (auto& info : logicalMerge->getOnMatchSetRelInfosRef()) { onMatchRelSetExecutors.push_back(getRelSetExecutor(info.get(), *inSchema)); } - return std::make_unique(markPos, std::move(nodeInsertExecutors), - std::move(relInsertExecutors), std::move(onCreateNodeSetExecutors), - std::move(onCreateRelSetExecutors), std::move(onMatchNodeSetExecutors), - std::move(onMatchRelSetExecutors), std::move(prevOperator), getOperatorID(), - logicalMerge->getExpressionsForPrinting()); + return std::make_unique(existenceMarkPos, distinctMarkPos, + std::move(nodeInsertExecutors), std::move(relInsertExecutors), + std::move(onCreateNodeSetExecutors), std::move(onCreateRelSetExecutors), + std::move(onMatchNodeSetExecutors), std::move(onMatchRelSetExecutors), + std::move(prevOperator), getOperatorID(), logicalMerge->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/plan_mapper.cpp b/src/processor/map/plan_mapper.cpp index cd52ed24967..366b072dc48 100644 --- a/src/processor/map/plan_mapper.cpp +++ b/src/processor/map/plan_mapper.cpp @@ -108,6 +108,9 @@ std::unique_ptr PlanMapper::mapOperator(LogicalOperator* logic case LogicalOperatorType::ACCUMULATE: { physicalOperator = mapAccumulate(logicalOperator); } break; + case LogicalOperatorType::MARK_ACCUMULATE: { + physicalOperator = mapMarkAccumulate(logicalOperator); + } break; case LogicalOperatorType::DUMMY_SCAN: { physicalOperator = mapDummyScan(logicalOperator); } break; diff --git a/src/processor/operator/aggregate/aggregate_hash_table.cpp b/src/processor/operator/aggregate/aggregate_hash_table.cpp index 1b29edc6e4a..d5870141d7f 100644 --- a/src/processor/operator/aggregate/aggregate_hash_table.cpp +++ b/src/processor/operator/aggregate/aggregate_hash_table.cpp @@ -13,10 +13,10 @@ namespace processor { AggregateHashTable::AggregateHashTable(MemoryManager& memoryManager, std::vector keyDataTypes, std::vector dependentKeyDataTypes, const std::vector>& aggregateFunctions, - uint64_t numEntriesToAllocate) + uint64_t numEntriesToAllocate, std::unique_ptr tableSchema) : BaseHashTable{memoryManager, std::move(keyDataTypes)}, dependentKeyDataTypes{ std::move(dependentKeyDataTypes)} { - initializeFT(aggregateFunctions); + initializeFT(aggregateFunctions, std::move(tableSchema)); initializeHashTable(numEntriesToAllocate); distinctHashTables = AggregateHashTableUtils::createDistinctHashTables( memoryManager, this->keyTypes, this->aggregateFunctions); @@ -127,20 +127,14 @@ void AggregateHashTable::finalizeAggregateStates() { } void AggregateHashTable::initializeFT( - const std::vector>& aggFuncs) { - auto isUnflat = false; - auto dataChunkPos = 0u; - std::unique_ptr tableSchema = std::make_unique(); + const std::vector>& aggFuncs, + std::unique_ptr tableSchema) { aggStateColIdxInFT = keyTypes.size() + dependentKeyDataTypes.size(); for (auto& dataType : keyTypes) { - auto size = LogicalTypeUtils::getRowLayoutSize(dataType); - tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); - numBytesForKeys += size; + numBytesForKeys += LogicalTypeUtils::getRowLayoutSize(dataType); } for (auto& dataType : dependentKeyDataTypes) { - auto size = LogicalTypeUtils::getRowLayoutSize(dataType); - tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); - numBytesForDependentKeys += size; + numBytesForDependentKeys += LogicalTypeUtils::getRowLayoutSize(dataType); } aggStateColOffsetInFT = numBytesForKeys + numBytesForDependentKeys; @@ -148,16 +142,12 @@ void AggregateHashTable::initializeFT( updateAggFuncs.reserve(aggFuncs.size()); for (auto i = 0u; i < aggFuncs.size(); i++) { auto& aggFunc = aggFuncs[i]; - tableSchema->appendColumn(std::make_unique( - isUnflat, dataChunkPos, aggFunc->getAggregateStateSize())); aggregateFunctions.push_back(aggFunc->clone()); updateAggFuncs.push_back(aggFunc->isFunctionDistinct() ? &AggregateHashTable::updateDistinctAggState : &AggregateHashTable::updateAggState); } - tableSchema->appendColumn( - std::make_unique(isUnflat, dataChunkPos, sizeof(hash_t))); - hashColIdxInFT = aggStateColIdxInFT + aggFuncs.size(); + hashColIdxInFT = tableSchema->getNumColumns() - 1; hashColOffsetInFT = tableSchema->getColOffset(hashColIdxInFT); factorizedTable = std::make_unique(&memoryManager, std::move(tableSchema)); } @@ -212,6 +202,140 @@ void AggregateHashTable::resize(uint64_t newSize) { } } +uint64_t AggregateHashTable::matchFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, uint64_t numMayMatches, + uint64_t numNoMatches) { + auto colIdx = 0u; + for (auto& flatKeyVector : flatKeyVectors) { + numMayMatches = + matchFlatVecWithFTColumn(flatKeyVector, numMayMatches, numNoMatches, colIdx++); + } + for (auto& unFlatKeyVector : unFlatKeyVectors) { + numMayMatches = + matchUnFlatVecWithFTColumn(unFlatKeyVector, numMayMatches, numNoMatches, colIdx++); + } + return numNoMatches; +} + +void AggregateHashTable::initializeFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, + const std::vector& dependentKeyVectors, uint64_t numFTEntriesToInitialize) { + auto colIdx = 0u; + for (auto flatKeyVector : flatKeyVectors) { + initializeFTEntryWithFlatVec(flatKeyVector, numFTEntriesToInitialize, colIdx++); + } + for (auto unFlatKeyVector : unFlatKeyVectors) { + initializeFTEntryWithUnFlatVec(unFlatKeyVector, numFTEntriesToInitialize, colIdx++); + } + for (auto dependentKeyVector : dependentKeyVectors) { + if (dependentKeyVector->state->isFlat()) { + initializeFTEntryWithFlatVec(dependentKeyVector, numFTEntriesToInitialize, colIdx++); + } else { + initializeFTEntryWithUnFlatVec(dependentKeyVector, numFTEntriesToInitialize, colIdx++); + } + } + for (auto i = 0u; i < numFTEntriesToInitialize; i++) { + auto entryIdx = entryIdxesToInitialize[i]; + auto entry = hashSlotsToUpdateAggState[entryIdx]->entry; + fillEntryWithInitialNullAggregateState(entry); + // Fill the hashValue in the ftEntry. + factorizedTable->updateFlatCellNoNull(entry, hashColIdxInFT, + hashVector->getData() + hashVector->getNumBytesPerValue() * entryIdx); + } +} + +uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( + ValueVector* vector, uint64_t numMayMatches, uint64_t& numNoMatches, uint32_t colIdx) { + KU_ASSERT(!vector->state->isFlat()); + auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); + uint64_t mayMatchIdx = 0; + if (vector->hasNoNullsGuarantee()) { + if (factorizedTable->hasNoNullGuarantee(colIdx)) { + for (auto i = 0u; i < numMayMatches; i++) { + auto idx = mayMatchIdxes[i]; + if (compareEntryFuncs[colIdx]( + vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + mayMatchIdxes[mayMatchIdx++] = idx; + } else { + noMatchIdxes[numNoMatches++] = idx; + } + } + } else { + for (auto i = 0u; i < numMayMatches; i++) { + auto idx = mayMatchIdxes[i]; + auto isEntryKeyNull = factorizedTable->isNonOverflowColNull( + hashSlotsToUpdateAggState[idx]->entry + + factorizedTable->getTableSchema()->getNullMapOffset(), + colIdx); + if (isEntryKeyNull) { + noMatchIdxes[numNoMatches++] = idx; + continue; + } + if (compareEntryFuncs[colIdx]( + vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + mayMatchIdxes[mayMatchIdx++] = idx; + } else { + noMatchIdxes[numNoMatches++] = idx; + } + } + } + } else { + for (auto i = 0u; i < numMayMatches; i++) { + auto idx = mayMatchIdxes[i]; + auto isKeyVectorNull = vector->isNull(idx); + auto isEntryKeyNull = factorizedTable->isNonOverflowColNull( + hashSlotsToUpdateAggState[idx]->entry + + factorizedTable->getTableSchema()->getNullMapOffset(), + colIdx); + if (isKeyVectorNull && isEntryKeyNull) { + mayMatchIdxes[mayMatchIdx++] = idx; + continue; + } else if (isKeyVectorNull != isEntryKeyNull) { + noMatchIdxes[numNoMatches++] = idx; + continue; + } + + if (compareEntryFuncs[colIdx]( + vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + mayMatchIdxes[mayMatchIdx++] = idx; + } else { + noMatchIdxes[numNoMatches++] = idx; + } + } + } + return mayMatchIdx; +} + +uint64_t AggregateHashTable::matchFlatVecWithFTColumn( + ValueVector* vector, uint64_t numMayMatches, uint64_t& numNoMatches, uint32_t colIdx) { + KU_ASSERT(vector->state->isFlat()); + auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); + uint64_t mayMatchIdx = 0; + auto pos = vector->state->selVector->selectedPositions[0]; + auto isVectorNull = vector->isNull(pos); + for (auto i = 0u; i < numMayMatches; i++) { + auto idx = mayMatchIdxes[i]; + auto isEntryKeyNull = factorizedTable->isNonOverflowColNull( + hashSlotsToUpdateAggState[idx]->entry + + factorizedTable->getTableSchema()->getNullMapOffset(), + colIdx); + if (isEntryKeyNull && isVectorNull) { + mayMatchIdxes[mayMatchIdx++] = idx; + continue; + } else if (isEntryKeyNull != isVectorNull) { + noMatchIdxes[numNoMatches++] = idx; + continue; + } + if (compareEntryFuncs[colIdx]( + vector, pos, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + mayMatchIdxes[mayMatchIdx++] = idx; + } else { + noMatchIdxes[numNoMatches++] = idx; + } + } + return mayMatchIdx; +} + void AggregateHashTable::initializeFTEntryWithFlatVec( ValueVector* flatVector, uint64_t numEntriesToInitialize, uint32_t colIdx) { KU_ASSERT(flatVector->state->isFlat()); @@ -254,33 +378,6 @@ void AggregateHashTable::initializeFTEntryWithUnFlatVec( } } -void AggregateHashTable::initializeFTEntries(const std::vector& flatKeyVectors, - const std::vector& unFlatKeyVectors, - const std::vector& dependentKeyVectors, uint64_t numFTEntriesToInitialize) { - auto colIdx = 0u; - for (auto flatKeyVector : flatKeyVectors) { - initializeFTEntryWithFlatVec(flatKeyVector, numFTEntriesToInitialize, colIdx++); - } - for (auto unFlatKeyVector : unFlatKeyVectors) { - initializeFTEntryWithUnFlatVec(unFlatKeyVector, numFTEntriesToInitialize, colIdx++); - } - for (auto dependentKeyVector : dependentKeyVectors) { - if (dependentKeyVector->state->isFlat()) { - initializeFTEntryWithFlatVec(dependentKeyVector, numFTEntriesToInitialize, colIdx++); - } else { - initializeFTEntryWithUnFlatVec(dependentKeyVector, numFTEntriesToInitialize, colIdx++); - } - } - for (auto i = 0u; i < numFTEntriesToInitialize; i++) { - auto entryIdx = entryIdxesToInitialize[i]; - auto entry = hashSlotsToUpdateAggState[entryIdx]->entry; - fillEntryWithInitialNullAggregateState(entry); - // Fill the hashValue in the ftEntry. - factorizedTable->updateFlatCellNoNull(entry, hashColIdxInFT, - hashVector->getData() + hashVector->getNumBytesPerValue() * entryIdx); - } -} - uint8_t* AggregateHashTable::createEntryInDistinctHT( const std::vector& groupByHashKeyVectors, hash_t hash) { auto entry = factorizedTable->appendEmptyTuple(); @@ -447,113 +544,6 @@ bool AggregateHashTable::matchFlatGroupByKeys( return true; } -uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( - ValueVector* vector, uint64_t numMayMatches, uint64_t& numNoMatches, uint32_t colIdx) { - KU_ASSERT(!vector->state->isFlat()); - auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); - uint64_t mayMatchIdx = 0; - if (vector->hasNoNullsGuarantee()) { - if (factorizedTable->hasNoNullGuarantee(colIdx)) { - for (auto i = 0u; i < numMayMatches; i++) { - auto idx = mayMatchIdxes[i]; - if (compareEntryFuncs[colIdx]( - vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { - mayMatchIdxes[mayMatchIdx++] = idx; - } else { - noMatchIdxes[numNoMatches++] = idx; - } - } - } else { - for (auto i = 0u; i < numMayMatches; i++) { - auto idx = mayMatchIdxes[i]; - auto isEntryKeyNull = factorizedTable->isNonOverflowColNull( - hashSlotsToUpdateAggState[idx]->entry + - factorizedTable->getTableSchema()->getNullMapOffset(), - colIdx); - if (isEntryKeyNull) { - noMatchIdxes[numNoMatches++] = idx; - continue; - } - if (compareEntryFuncs[colIdx]( - vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { - mayMatchIdxes[mayMatchIdx++] = idx; - } else { - noMatchIdxes[numNoMatches++] = idx; - } - } - } - } else { - for (auto i = 0u; i < numMayMatches; i++) { - auto idx = mayMatchIdxes[i]; - auto isKeyVectorNull = vector->isNull(idx); - auto isEntryKeyNull = factorizedTable->isNonOverflowColNull( - hashSlotsToUpdateAggState[idx]->entry + - factorizedTable->getTableSchema()->getNullMapOffset(), - colIdx); - if (isKeyVectorNull && isEntryKeyNull) { - mayMatchIdxes[mayMatchIdx++] = idx; - continue; - } else if (isKeyVectorNull != isEntryKeyNull) { - noMatchIdxes[numNoMatches++] = idx; - continue; - } - - if (compareEntryFuncs[colIdx]( - vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { - mayMatchIdxes[mayMatchIdx++] = idx; - } else { - noMatchIdxes[numNoMatches++] = idx; - } - } - } - return mayMatchIdx; -} - -uint64_t AggregateHashTable::matchFlatVecWithFTColumn( - ValueVector* vector, uint64_t numMayMatches, uint64_t& numNoMatches, uint32_t colIdx) { - KU_ASSERT(vector->state->isFlat()); - auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); - uint64_t mayMatchIdx = 0; - auto pos = vector->state->selVector->selectedPositions[0]; - auto isVectorNull = vector->isNull(pos); - for (auto i = 0u; i < numMayMatches; i++) { - auto idx = mayMatchIdxes[i]; - auto isEntryKeyNull = factorizedTable->isNonOverflowColNull( - hashSlotsToUpdateAggState[idx]->entry + - factorizedTable->getTableSchema()->getNullMapOffset(), - colIdx); - if (isEntryKeyNull && isVectorNull) { - mayMatchIdxes[mayMatchIdx++] = idx; - continue; - } else if (isEntryKeyNull != isVectorNull) { - noMatchIdxes[numNoMatches++] = idx; - continue; - } - if (compareEntryFuncs[colIdx]( - vector, pos, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { - mayMatchIdxes[mayMatchIdx++] = idx; - } else { - noMatchIdxes[numNoMatches++] = idx; - } - } - return mayMatchIdx; -} - -uint64_t AggregateHashTable::matchFTEntries(const std::vector& flatKeyVectors, - const std::vector& unFlatKeyVectors, uint64_t numMayMatches, - uint64_t numNoMatches) { - auto colIdx = 0u; - for (auto& flatKeyVector : flatKeyVectors) { - numMayMatches = - matchFlatVecWithFTColumn(flatKeyVector, numMayMatches, numNoMatches, colIdx++); - } - for (auto& unFlatKeyVector : unFlatKeyVectors) { - numMayMatches = - matchUnFlatVecWithFTColumn(unFlatKeyVector, numMayMatches, numNoMatches, colIdx++); - } - return numNoMatches; -} - void AggregateHashTable::fillEntryWithInitialNullAggregateState(uint8_t* entry) { for (auto i = 0u; i < aggregateFunctions.size(); i++) { factorizedTable->updateFlatCellNoNull(entry, aggStateColIdxInFT + i, @@ -766,18 +756,30 @@ void AggregateHashTable::updateBothUnFlatDifferentDCAggVectorState( std::vector> AggregateHashTableUtils::createDistinctHashTables( MemoryManager& memoryManager, const std::vector& groupByKeyDataTypes, const std::vector>& aggregateFunctions) { + // TODO(Xiyang): move the creation of distinct hashtable schema to mapper. std::vector> distinctHTs; for (auto& aggregateFunction : aggregateFunctions) { if (aggregateFunction->isFunctionDistinct()) { std::vector distinctKeysDataTypes(groupByKeyDataTypes.size() + 1); + auto tableSchema = std::make_unique(); for (auto i = 0u; i < groupByKeyDataTypes.size(); i++) { distinctKeysDataTypes[i] = groupByKeyDataTypes[i]; + auto size = LogicalTypeUtils::getRowLayoutSize(distinctKeysDataTypes[i]); + tableSchema->appendColumn(std::make_unique( + false /* isUnflat */, 0 /* dataChunkPos */, size)); } distinctKeysDataTypes[groupByKeyDataTypes.size()] = LogicalType{aggregateFunction->parameterTypeIDs[0]}; + tableSchema->appendColumn( + std::make_unique(false /* isUnflat */, 0 /* dataChunkPos */, + LogicalTypeUtils::getRowLayoutSize( + LogicalType{aggregateFunction->parameterTypeIDs[0]}))); + tableSchema->appendColumn(std::make_unique( + false /* isUnflat */, 0 /* dataChunkPos */, sizeof(hash_t))); std::vector> emptyFunctions; auto ht = std::make_unique(memoryManager, - std::move(distinctKeysDataTypes), emptyFunctions, 0 /* numEntriesToAllocate */); + std::move(distinctKeysDataTypes), emptyFunctions, 0 /* numEntriesToAllocate */, + std::move(tableSchema)); distinctHTs.push_back(std::move(ht)); } else { distinctHTs.push_back(nullptr); diff --git a/src/processor/operator/aggregate/hash_aggregate.cpp b/src/processor/operator/aggregate/hash_aggregate.cpp index 1fc641d76f2..6d27dd7c9bf 100644 --- a/src/processor/operator/aggregate/hash_aggregate.cpp +++ b/src/processor/operator/aggregate/hash_aggregate.cpp @@ -1,6 +1,7 @@ #include "processor/operator/aggregate/hash_aggregate.h" #include "common/utils.h" +#include "processor/result/mark_hash_table.h" using namespace kuzu::common; using namespace kuzu::function; @@ -49,38 +50,70 @@ std::pair HashAggregateSharedState::getNextRangeToRead() { return std::make_pair(startOffset, startOffset + range); } -void HashAggregate::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { - BaseAggregate::initLocalStateInternal(resultSet, context); +HashAggregateInfo::HashAggregateInfo(std::vector flatKeysPos, + std::vector unFlatKeysPos, std::vector dependentKeysPos, + std::unique_ptr tableSchema, HashTableType hashTableType) + : flatKeysPos{std::move(flatKeysPos)}, unFlatKeysPos{std::move(unFlatKeysPos)}, + dependentKeysPos{std::move(dependentKeysPos)}, tableSchema{std::move(tableSchema)}, + hashTableType{hashTableType} {} + +HashAggregateInfo::HashAggregateInfo(const HashAggregateInfo& other) + : flatKeysPos{other.flatKeysPos}, unFlatKeysPos{other.unFlatKeysPos}, + dependentKeysPos{other.dependentKeysPos}, tableSchema{other.tableSchema->copy()}, + hashTableType{other.hashTableType} {} + +void HashAggregateLocalState::init(ResultSet& resultSet, main::ClientContext* context, + HashAggregateInfo& info, + std::vector>& aggregateFunctions) { std::vector keyDataTypes; - for (auto& pos : flatKeysPos) { - auto vector = resultSet->getValueVector(pos).get(); + for (auto& pos : info.flatKeysPos) { + auto vector = resultSet.getValueVector(pos).get(); flatKeyVectors.push_back(vector); keyDataTypes.push_back(vector->dataType); } - for (auto& pos : unFlatKeysPos) { - auto vector = resultSet->getValueVector(pos).get(); + for (auto& pos : info.unFlatKeysPos) { + auto vector = resultSet.getValueVector(pos).get(); unFlatKeyVectors.push_back(vector); keyDataTypes.push_back(vector->dataType); } std::vector payloadDataTypes; - for (auto& pos : dependentKeysPos) { - auto vector = resultSet->getValueVector(pos).get(); + for (auto& pos : info.dependentKeysPos) { + auto vector = resultSet.getValueVector(pos).get(); dependentKeyVectors.push_back(vector); payloadDataTypes.push_back(vector->dataType); } leadingState = unFlatKeyVectors.empty() ? flatKeyVectors[0]->state.get() : unFlatKeyVectors[0]->state.get(); - localAggregateHashTable = - make_unique(*context->clientContext->getMemoryManager(), keyDataTypes, - payloadDataTypes, aggregateFunctions, 0); + switch (info.hashTableType) { + case HashTableType::AGGREGATE_HASH_TABLE: + aggregateHashTable = std::make_unique(*context->getMemoryManager(), + keyDataTypes, payloadDataTypes, aggregateFunctions, 0, std::move(info.tableSchema)); + break; + case HashTableType::MARK_HASH_TABLE: + aggregateHashTable = std::make_unique(*context->getMemoryManager(), + keyDataTypes, payloadDataTypes, aggregateFunctions, 0, std::move(info.tableSchema)); + break; + default: + KU_UNREACHABLE; + } +} + +void HashAggregateLocalState::append( + std::vector>& aggregateInputs, uint64_t multiplicity) const { + aggregateHashTable->append(flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, leadingState, + aggregateInputs, multiplicity); +} + +void HashAggregate::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { + BaseAggregate::initLocalStateInternal(resultSet, context); + localState.init(*resultSet, context->clientContext, aggregateInfo, aggregateFunctions); } void HashAggregate::executeInternal(ExecutionContext* context) { while (children[0]->getNextTuple(context)) { - localAggregateHashTable->append(flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, - leadingState, aggregateInputs, resultSet->multiplicity); + localState.append(aggregateInputs, resultSet->multiplicity); } - sharedState->appendAggregateHashTable(std::move(localAggregateHashTable)); + sharedState->appendAggregateHashTable(std::move(localState.aggregateHashTable)); } void HashAggregate::finalize(ExecutionContext* context) { diff --git a/src/processor/operator/persistent/insert_executor.cpp b/src/processor/operator/persistent/insert_executor.cpp index 65e6b25a398..c99d253c8b8 100644 --- a/src/processor/operator/persistent/insert_executor.cpp +++ b/src/processor/operator/persistent/insert_executor.cpp @@ -60,6 +60,14 @@ void NodeInsertExecutor::insert(Transaction* tx, ExecutionContext* context) { writeResult(); } +void NodeInsertExecutor::evaluateResult(ExecutionContext* context) { + for (auto& evaluator : columnDataEvaluators) { + evaluator->evaluate(context->clientContext); + } + nodeIDVector->setNull(nodeIDVector->state->selVector->selectedPositions[0], false); + writeResult(); +} + bool NodeInsertExecutor::checkConfict(Transaction* transaction) { if (conflictAction == ConflictAction::ON_CONFLICT_DO_NOTHING) { auto off = table->validateUniquenessConstraint(transaction, columnDataVectors); diff --git a/src/processor/operator/persistent/merge.cpp b/src/processor/operator/persistent/merge.cpp index 5f179a5b8c8..ccf66d830db 100644 --- a/src/processor/operator/persistent/merge.cpp +++ b/src/processor/operator/persistent/merge.cpp @@ -4,7 +4,10 @@ namespace kuzu { namespace processor { void Merge::initLocalStateInternal(ResultSet* /*resultSet_*/, ExecutionContext* context) { - markVector = resultSet->getValueVector(markPos).get(); + existenceVector = resultSet->getValueVector(existenceMark).get(); + if (distinctMark.isValid()) { + distinctVector = resultSet->getValueVector(distinctMark).get(); + } for (auto& executor : nodeInsertExecutors) { executor.init(resultSet, context); } @@ -29,9 +32,9 @@ bool Merge::getNextTuplesInternal(ExecutionContext* context) { if (!children[0]->getNextTuple(context)) { return false; } - KU_ASSERT(markVector->state->isFlat()); - auto pos = markVector->state->selVector->selectedPositions[0]; - if (!markVector->isNull(pos)) { + KU_ASSERT(existenceVector->state->isFlat()); + auto existencePos = existenceVector->state->selVector->selectedPositions[0]; + if (!existenceVector->isNull(existencePos)) { for (auto& executor : onMatchNodeSetExecutors) { executor->set(context); } @@ -39,17 +42,37 @@ bool Merge::getNextTuplesInternal(ExecutionContext* context) { executor->set(context); } } else { - for (auto& executor : nodeInsertExecutors) { - executor.insert(context->clientContext->getTx(), context); - } - for (auto& executor : relInsertExecutors) { - executor.insert(context->clientContext->getTx(), context); - } - for (auto& executor : onCreateNodeSetExecutors) { - executor->set(context); - } - for (auto& executor : onCreateRelSetExecutors) { - executor->set(context); + // pattern not exist + if (distinctVector != nullptr && + !distinctVector->getValue( + distinctVector->state->selVector->selectedPositions[0])) { + // pattern has been created + for (auto& executor : nodeInsertExecutors) { + executor.evaluateResult(context); + } + for (auto& executor : relInsertExecutors) { + executor.insert(context->clientContext->getTx(), context); + } + for (auto& executor : onMatchNodeSetExecutors) { + executor->set(context); + } + for (auto& executor : onMatchRelSetExecutors) { + executor->set(context); + } + } else { + // do insert and on create + for (auto& executor : nodeInsertExecutors) { + executor.insert(context->clientContext->getTx(), context); + } + for (auto& executor : relInsertExecutors) { + executor.insert(context->clientContext->getTx(), context); + } + for (auto& executor : onCreateNodeSetExecutors) { + executor->set(context); + } + for (auto& executor : onCreateRelSetExecutors) { + executor->set(context); + } } } return true; diff --git a/src/processor/result/CMakeLists.txt b/src/processor/result/CMakeLists.txt index cfcc402ea2f..9bab3f7059f 100644 --- a/src/processor/result/CMakeLists.txt +++ b/src/processor/result/CMakeLists.txt @@ -3,6 +3,7 @@ add_library(kuzu_processor_result base_hash_table.cpp factorized_table.cpp flat_tuple.cpp + mark_hash_table.cpp result_set.cpp result_set_descriptor.cpp ) diff --git a/src/processor/result/mark_hash_table.cpp b/src/processor/result/mark_hash_table.cpp new file mode 100644 index 00000000000..545d4197653 --- /dev/null +++ b/src/processor/result/mark_hash_table.cpp @@ -0,0 +1,51 @@ +#include "processor/result/mark_hash_table.h" + +namespace kuzu { +namespace processor { + +MarkHashTable::MarkHashTable(storage::MemoryManager& memoryManager, + std::vector keyDataTypes, + std::vector dependentKeyDataTypes, + const std::vector>& aggregateFunctions, + uint64_t numEntriesToAllocate, std::unique_ptr tableSchema) + : AggregateHashTable(memoryManager, std::move(keyDataTypes), std::move(dependentKeyDataTypes), + std::move(aggregateFunctions), numEntriesToAllocate, std::move(tableSchema)) { + distinctColIdxInFT = hashColIdxInFT - 1; +} + +uint64_t MarkHashTable::matchFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, uint64_t numMayMatches, + uint64_t numNoMatches) { + auto colIdx = 0u; + for (auto& flatKeyVector : flatKeyVectors) { + numMayMatches = + matchFlatVecWithFTColumn(flatKeyVector, numMayMatches, numNoMatches, colIdx++); + } + for (auto& unFlatKeyVector : unFlatKeyVectors) { + numMayMatches = + matchUnFlatVecWithFTColumn(unFlatKeyVector, numMayMatches, numNoMatches, colIdx++); + } + for (auto i = 0u; i < numMayMatches; i++) { + noMatchIdxes[numNoMatches++] = mayMatchIdxes[i]; + onMatchSlotIdxes.emplace(mayMatchIdxes[i]); + } + return numNoMatches; +} + +void MarkHashTable::initializeFTEntries(const std::vector& flatKeyVectors, + const std::vector& unFlatKeyVectors, + const std::vector& dependentKeyVectors, + uint64_t numFTEntriesToInitialize) { + AggregateHashTable::initializeFTEntries( + flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, numFTEntriesToInitialize); + for (auto i = 0u; i < numFTEntriesToInitialize; i++) { + auto entryIdx = entryIdxesToInitialize[i]; + auto entry = hashSlotsToUpdateAggState[entryIdx]->entry; + auto onMatch = !onMatchSlotIdxes.contains(entryIdx); + onMatchSlotIdxes.erase(entryIdx); + factorizedTable->updateFlatCellNoNull(entry, distinctColIdxInFT, &onMatch /* isOnMatch */); + } +} + +} // namespace processor +} // namespace kuzu diff --git a/test/test_files/update_node/merge_tinysnb.test b/test/test_files/update_node/merge_tinysnb.test index b25b0a0a843..b2e1c8c91c0 100644 --- a/test/test_files/update_node/merge_tinysnb.test +++ b/test/test_files/update_node/merge_tinysnb.test @@ -60,3 +60,38 @@ Runtime exception: Found duplicated primary key value 1, which violates the uniq -STATEMENT MATCH (a:person) RETURN COUNT(*); ---- 1 11 + +-CASE MergeDuplicatedKey +-STATEMENT CREATE NODE TABLE user (ID int64, primary key(ID)) +---- ok +-STATEMENT MATCH (a:person) with a.ID % 4 as result, a.age as age MERGE (u:user {ID: result}) RETURN u.ID, age +---- 8 +0|35 +2|30 +3|45 +1|20 +3|20 +0|25 +1|40 +2|83 +-STATEMENT MATCH (a:user) RETURN a.ID +---- 4 +0 +1 +2 +3 +-STATEMENT MATCH (a:person) with a.ID as id MERGE (u:user {ID: 10}) RETURN u.ID, id +---- error +Runtime exception: Constant key in merge clause is not supported yet. +-STATEMENT CREATE NODE TABLE user1 (ID int64, name string, primary key(ID)) +---- ok +-STATEMENT MATCH (a:person) with a.ID % 7 as result, a.fName as name MERGE (u:user1 {ID: result}) ON MATCH SET u.name = 'match: ' + name ON CREATE SET u.name = 'create: ' + name RETURN u.ID, u.name +---- 8 +0|create: Alice +0|match: Elizabeth +1|create: Farooq +2|create: Bob +2|match: Greg +3|create: Carol +3|match: Hubert Blaine Wolfeschlegelsteinhausenbergerdorff +5|create: Dan From 37de692b7a6aaff4a9fb17300fcd17914f22fd4f Mon Sep 17 00:00:00 2001 From: Mattias <81063080+MSebanc@users.noreply.github.com> Date: Thu, 4 Apr 2024 12:25:25 -0700 Subject: [PATCH 128/136] Implemented progress for in memory RDF scan (#3208) I have read and agree to the CLA of the Kuzu repository. --- .../persistent/reader/rdf/rdf_scan.cpp | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp b/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp index 1ceeffde2bf..2f50b7edac9 100644 --- a/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp +++ b/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp @@ -203,6 +203,39 @@ static std::unique_ptr RdfAllTripleScanInitSharedState( bindData->config.copy(), std::move(rdfConfig), bindData->store); } +static double RdfResourceInMemScanProgressFunc(TableFuncSharedState* sharedState) { + auto rdfSharedState = + ku_dynamic_cast(sharedState); + uint64_t rtSize = + ku_dynamic_cast(rdfSharedState->store.get())->rtStore.size(); + if (rtSize == 0) { + return 0.0; + } + return static_cast(rdfSharedState->rtCursor) / rtSize; +} + +static double RdfLiteralInMemScanProgressFunc(TableFuncSharedState* sharedState) { + auto rdfSharedState = + ku_dynamic_cast(sharedState); + uint64_t ltSize = + ku_dynamic_cast(rdfSharedState->store.get())->ltStore.size(); + if (ltSize == 0) { + return 0.0; + } + return static_cast(rdfSharedState->ltCursor) / ltSize; +} + +static double RdfResourceTripleInMemScanProgressFunc(TableFuncSharedState* sharedState) { + auto rdfSharedState = + ku_dynamic_cast(sharedState); + TripleStore* store = ku_dynamic_cast(rdfSharedState->store.get()); + uint64_t size = store->rtStore.size() + store->ltStore.size(); + if (size == 0) { + return 0.0; + } + return static_cast(rdfSharedState->rtCursor + rdfSharedState->ltCursor) / size; +} + function_set RdfResourceScan::getFunctionSet() { function_set functionSet; auto func = std::make_unique(name, scanTableFunc, nullptr, @@ -247,7 +280,8 @@ function::function_set RdfAllTripleScan::getFunctionSet() { function_set RdfResourceInMemScan::getFunctionSet() { function_set functionSet; auto func = std::make_unique(name, RdfResourceInMemScanTableFunc, nullptr, - inMemScanInitSharedState, initLocalState, std::vector{}); + inMemScanInitSharedState, initLocalState, RdfResourceInMemScanProgressFunc, + std::vector{}); functionSet.push_back(std::move(func)); return functionSet; } @@ -255,7 +289,8 @@ function_set RdfResourceInMemScan::getFunctionSet() { function_set RdfLiteralInMemScan::getFunctionSet() { function_set functionSet; auto func = std::make_unique(name, RdfLiteralInMemScanTableFunc, nullptr, - inMemScanInitSharedState, initLocalState, std::vector{}); + inMemScanInitSharedState, initLocalState, RdfLiteralInMemScanProgressFunc, + std::vector{}); functionSet.push_back(std::move(func)); return functionSet; } @@ -263,7 +298,8 @@ function_set RdfLiteralInMemScan::getFunctionSet() { function_set RdfResourceTripleInMemScan::getFunctionSet() { function_set functionSet; auto func = std::make_unique(name, RdfResourceTripleInMemScanTableFunc, nullptr, - inMemScanInitSharedState, initLocalState, std::vector{}); + inMemScanInitSharedState, initLocalState, RdfResourceTripleInMemScanProgressFunc, + std::vector{}); functionSet.push_back(std::move(func)); return functionSet; } @@ -271,7 +307,8 @@ function_set RdfResourceTripleInMemScan::getFunctionSet() { function_set RdfLiteralTripleInMemScan::getFunctionSet() { function_set functionSet; auto func = std::make_unique(name, RdfLiteralTripleInMemScanTableFunc, nullptr, - inMemScanInitSharedState, initLocalState, std::vector{}); + inMemScanInitSharedState, initLocalState, RdfLiteralInMemScanProgressFunc, + std::vector{}); functionSet.push_back(std::move(func)); return functionSet; } From ec6e309055db557138adfdb6a30537f132b4e638 Mon Sep 17 00:00:00 2001 From: Jiamin Hou Date: Thu, 4 Apr 2024 17:24:14 -0400 Subject: [PATCH 129/136] Rework multiple query result (#3191) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * multiple query results * Multiple query results C API fix (#3195) --------- Co-authored-by: 囧囧 --- src/c_api/connection.cpp | 8 +++++--- src/c_api/prepared_statement.cpp | 2 +- src/c_api/query_result.cpp | 22 ++++++++++++++++++++-- src/include/c_api/kuzu.h | 15 +++++++++++++++ src/include/main/query_result.h | 22 +++++++++++++++++----- src/main/client_context.cpp | 1 + src/main/query_result.cpp | 26 ++++++++++++++++---------- test/c_api/query_result_test.cpp | 27 +++++++++++++++++++++++++++ test/main/connection_test.cpp | 14 +++++++++++--- 9 files changed, 113 insertions(+), 24 deletions(-) diff --git a/src/c_api/connection.cpp b/src/c_api/connection.cpp index acd9b91e3e8..754db57a58e 100644 --- a/src/c_api/connection.cpp +++ b/src/c_api/connection.cpp @@ -52,8 +52,9 @@ kuzu_query_result* kuzu_connection_query(kuzu_connection* connection, const char if (query_result == nullptr) { return nullptr; } - auto* c_query_result = new kuzu_query_result; + auto* c_query_result = (kuzu_query_result*)malloc(sizeof(kuzu_query_result)); c_query_result->_query_result = query_result; + c_query_result->_is_owned_by_cpp = false; return c_query_result; } catch (Exception& e) { return nullptr; } } @@ -64,7 +65,7 @@ kuzu_prepared_statement* kuzu_connection_prepare(kuzu_connection* connection, co if (prepared_statement == nullptr) { return nullptr; } - auto* c_prepared_statement = new kuzu_prepared_statement; + auto* c_prepared_statement = (kuzu_prepared_statement*)malloc(sizeof(kuzu_prepared_statement)); c_prepared_statement->_prepared_statement = prepared_statement; c_prepared_statement->_bound_values = new std::unordered_map>; @@ -92,8 +93,9 @@ kuzu_query_result* kuzu_connection_execute( if (query_result == nullptr) { return nullptr; } - auto* c_query_result = new kuzu_query_result; + auto* c_query_result = (kuzu_query_result*)malloc(sizeof(kuzu_query_result)); c_query_result->_query_result = query_result; + c_query_result->_is_owned_by_cpp = false; return c_query_result; } diff --git a/src/c_api/prepared_statement.cpp b/src/c_api/prepared_statement.cpp index c6d5e485eb9..5c1464459f9 100644 --- a/src/c_api/prepared_statement.cpp +++ b/src/c_api/prepared_statement.cpp @@ -25,7 +25,7 @@ void kuzu_prepared_statement_destroy(kuzu_prepared_statement* prepared_statement delete static_cast>*>( prepared_statement->_bound_values); } - delete prepared_statement; + free(prepared_statement); } bool kuzu_prepared_statement_allow_active_transaction(kuzu_prepared_statement* prepared_statement) { diff --git a/src/c_api/query_result.cpp b/src/c_api/query_result.cpp index 8bdc49d2b38..ec839c95aef 100644 --- a/src/c_api/query_result.cpp +++ b/src/c_api/query_result.cpp @@ -12,9 +12,11 @@ void kuzu_query_result_destroy(kuzu_query_result* query_result) { return; } if (query_result->_query_result != nullptr) { - delete static_cast(query_result->_query_result); + if (!query_result->_is_owned_by_cpp) { + delete static_cast(query_result->_query_result); + } } - delete query_result; + free(query_result); } bool kuzu_query_result_is_success(kuzu_query_result* query_result) { @@ -69,6 +71,22 @@ bool kuzu_query_result_has_next(kuzu_query_result* query_result) { return static_cast(query_result->_query_result)->hasNext(); } +bool kuzu_query_result_has_next_query_result(kuzu_query_result* query_result) { + return static_cast(query_result->_query_result)->hasNextQueryResult(); +} + +kuzu_query_result* kuzu_query_result_get_next_query_result(kuzu_query_result* query_result) { + auto next_query_result = + static_cast(query_result->_query_result)->getNextQueryResult(); + if (next_query_result == nullptr) { + return nullptr; + } + auto* c_query_result = (kuzu_query_result*)malloc(sizeof(kuzu_query_result)); + c_query_result->_query_result = next_query_result; + c_query_result->_is_owned_by_cpp = true; + return c_query_result; +} + kuzu_flat_tuple* kuzu_query_result_get_next(kuzu_query_result* query_result) { auto flat_tuple = static_cast(query_result->_query_result)->getNext(); auto* flat_tuple_c = (kuzu_flat_tuple*)malloc(sizeof(kuzu_flat_tuple)); diff --git a/src/include/c_api/kuzu.h b/src/include/c_api/kuzu.h index c1688e11186..78353b1b6c1 100644 --- a/src/include/c_api/kuzu.h +++ b/src/include/c_api/kuzu.h @@ -154,6 +154,7 @@ typedef struct { */ typedef struct { void* _query_result; + bool _is_owned_by_cpp; } kuzu_query_result; /** @@ -630,6 +631,20 @@ KUZU_C_API bool kuzu_query_result_has_next(kuzu_query_result* query_result); * @param query_result The query result instance to return. */ KUZU_C_API kuzu_flat_tuple* kuzu_query_result_get_next(kuzu_query_result* query_result); +/** + * @brief Returns true if we have not consumed all query results, false otherwise. Use this function + * for loop results of multiple query statements + * @param query_result The query result instance to check. + */ +KUZU_C_API bool kuzu_query_result_has_next_query_result(kuzu_query_result* query_result); +/** + * @brief Returns the next query result. Use this function to loop multiple query statements' + * results. + * @param query_result The query result instance to return. + */ +KUZU_C_API kuzu_query_result* kuzu_query_result_get_next_query_result( + kuzu_query_result* query_result); + /** * @brief Returns the query result as a string. * @param query_result The query result instance to return. diff --git a/src/include/main/query_result.h b/src/include/main/query_result.h index de517b4c844..7cac6b82d14 100644 --- a/src/include/main/query_result.h +++ b/src/include/main/query_result.h @@ -38,6 +38,8 @@ class QueryResult { QueryResult* currentResult; public: + QueryResultIterator() = default; + explicit QueryResultIterator(QueryResult* startResult) : currentResult(startResult) {} void operator++() { @@ -46,9 +48,9 @@ class QueryResult { } } - bool isEnd() { return currentResult == nullptr; } + bool isEnd() const { return currentResult == nullptr; } - QueryResult* getCurrentResult() { return currentResult; } + QueryResult* getCurrentResult() const { return currentResult; } }; public: @@ -97,15 +99,22 @@ class QueryResult { * @return whether there are more tuples to read. */ KUZU_API bool hasNext() const; - std::unique_ptr nextQueryResult; + /** + * @return whether there are more query results to read. + */ + KUZU_API bool hasNextQueryResult() const; + /** + * @return get next query result to read (for multiple query statements). + */ + KUZU_API QueryResult* getNextQueryResult(); - std::string toSingleQueryString(); + std::unique_ptr nextQueryResult; /** * @return next flat tuple in the query result. */ KUZU_API std::shared_ptr getNext(); /** - * @return string of query result. + * @return string of first query result. */ KUZU_API std::string toString(); @@ -158,6 +167,9 @@ class QueryResult { // execution statistics std::unique_ptr querySummary; + + // query iterator + QueryResultIterator queryResultIterator; }; } // namespace main diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 1315025e15f..41368387aa1 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -262,6 +262,7 @@ std::unique_ptr ClientContext::queryResultWithError(std::string_vie queryResult->success = false; queryResult->errMsg = errMsg; queryResult->nextQueryResult = nullptr; + queryResult->queryResultIterator = QueryResult::QueryResultIterator{queryResult.get()}; return queryResult; } diff --git a/src/main/query_result.cpp b/src/main/query_result.cpp index d3cdc47226d..f004e602af3 100644 --- a/src/main/query_result.cpp +++ b/src/main/query_result.cpp @@ -55,6 +55,7 @@ QueryResult::QueryResult(const PreparedSummary& preparedSummary) { querySummary = std::make_unique(); querySummary->setPreparedSummary(preparedSummary); nextQueryResult = nullptr; + queryResultIterator = QueryResultIterator{this}; } QueryResult::~QueryResult() = default; @@ -152,6 +153,21 @@ bool QueryResult::hasNext() const { return iterator->hasNextFlatTuple(); } +bool QueryResult::hasNextQueryResult() const { + if (!queryResultIterator.isEnd()) { + return true; + } + return false; +} + +QueryResult* QueryResult::getNextQueryResult() { + ++queryResultIterator; + if (!queryResultIterator.isEnd()) { + return queryResultIterator.getCurrentResult(); + } + return nullptr; +} + std::shared_ptr QueryResult::getNext() { if (!hasNext()) { throw RuntimeException( @@ -163,16 +179,6 @@ std::shared_ptr QueryResult::getNext() { } std::string QueryResult::toString() { - std::string result; - QueryResultIterator it(this); - while (!it.isEnd()) { - result += it.getCurrentResult()->toSingleQueryString() + "\n"; - ++it; - } - return result; -} - -std::string QueryResult::toSingleQueryString() { std::string result; if (isSuccess()) { // print header diff --git a/test/c_api/query_result_test.cpp b/test/c_api/query_result_test.cpp index 48dd7be9f24..128d786ade3 100644 --- a/test/c_api/query_result_test.cpp +++ b/test/c_api/query_result_test.cpp @@ -176,3 +176,30 @@ TEST_F(CApiQueryResultTest, ResetIterator) { kuzu_query_result_destroy(result); } + +TEST_F(CApiQueryResultTest, MultipleQuery) { + auto connection = getConnection(); + auto result = kuzu_connection_query(connection, "return 1; return 2; return 3;"); + ASSERT_TRUE(kuzu_query_result_is_success(result)); + + auto str = kuzu_query_result_to_string(result); + ASSERT_EQ(std::string(str), "1\n1\n"); + kuzu_destroy_string(str); + + ASSERT_TRUE(kuzu_query_result_has_next_query_result(result)); + auto next_query_result = kuzu_query_result_get_next_query_result(result); + ASSERT_TRUE(kuzu_query_result_is_success(next_query_result)); + str = kuzu_query_result_to_string(next_query_result); + ASSERT_EQ(std::string(str), "2\n2\n"); + kuzu_destroy_string(str); + kuzu_query_result_destroy(next_query_result); + + next_query_result = kuzu_query_result_get_next_query_result(result); + ASSERT_TRUE(kuzu_query_result_is_success(next_query_result)); + str = kuzu_query_result_to_string(next_query_result); + ASSERT_EQ(std::string(str), "3\n3\n"); + kuzu_destroy_string(str); + kuzu_query_result_destroy(next_query_result); + + kuzu_query_result_destroy(result); +} diff --git a/test/main/connection_test.cpp b/test/main/connection_test.cpp index d7bda29f578..8a6538b19b1 100644 --- a/test/main/connection_test.cpp +++ b/test/main/connection_test.cpp @@ -114,10 +114,18 @@ TEST_F(ApiTest, MultipleQuery) { "MATCH (a:person) RETURN a.fName; MATCH (a:person)-[:knows]->(b:person) RETURN count(*);"); ASSERT_TRUE(result->isSuccess()); - result = - conn->query("CREATE NODE TABLE N(ID INT64, PRIMARY KEY(ID));CREATE REL TABLE E(FROM N TO " - "N, MANY_MANY);MATCH (a:N)-[:E]->(b:N) WHERE a.ID = 0 return b.ID;"); + result = conn->query("CREATE NODE TABLE Test(name STRING, age INT64, PRIMARY KEY(name));CREATE " + "(:Test {name: 'Alice', age: 25});" + "MATCH (a:Test) where a.name='Alice' return a.age;"); + ASSERT_TRUE(result->isSuccess()); + + result = conn->query("return 1; return 2; return 3;"); ASSERT_TRUE(result->isSuccess()); + ASSERT_EQ(result->toString(), "1\n1\n"); + ASSERT_TRUE(result->hasNextQueryResult()); + ASSERT_EQ(result->getNextQueryResult()->toString(), "2\n2\n"); + ASSERT_TRUE(result->hasNextQueryResult()); + ASSERT_EQ(result->getNextQueryResult()->toString(), "3\n3\n"); } TEST_F(ApiTest, Prepare) { From 2100fa3c880393dee31c5c20ce331f14e7844d6d Mon Sep 17 00:00:00 2001 From: Benjamin Winger Date: Thu, 4 Apr 2024 23:37:32 -0400 Subject: [PATCH 130/136] Fix constant compression in-place check for bools (#3211) Bools are stored packed in column chunks, so indexing into the data using the size in bytes of the type will not work. --- src/include/storage/store/null_column.h | 8 ---- src/storage/compression/compression.cpp | 12 ++++- src/storage/store/column.cpp | 3 +- src/storage/store/null_column.cpp | 58 ------------------------- 4 files changed, 12 insertions(+), 69 deletions(-) diff --git a/src/include/storage/store/null_column.h b/src/include/storage/store/null_column.h index 5b79d87c4c0..8675e36d28c 100644 --- a/src/include/storage/store/null_column.h +++ b/src/include/storage/store/null_column.h @@ -43,20 +43,12 @@ class NullColumn final : public Column { void write(common::node_group_idx_t nodeGroupIdx, common::offset_t offsetInChunk, ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues) override; - bool canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) override; - bool canCommitInPlace(transaction::Transaction* transaction, - common::node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, - ColumnChunk* chunk, common::offset_t srcOffset) override; void commitLocalChunkInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo, const offset_set_t& deleteInfo) override; private: - bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, const ChunkCollection& localChunk, - const offset_to_row_idx_t& writeInfo); std::unique_ptr getEmptyChunkForCommit(uint64_t capacity) override { return ColumnChunkFactory::createNullColumnChunk(enableCompression, capacity); } diff --git a/src/storage/compression/compression.cpp b/src/storage/compression/compression.cpp index 76b21f82f05..5a409aa1893 100644 --- a/src/storage/compression/compression.cpp +++ b/src/storage/compression/compression.cpp @@ -70,8 +70,16 @@ bool CompressionMetadata::canUpdateInPlace( switch (compression) { case CompressionType::CONSTANT: { // Value can be updated in place only if it is identical to the value already stored. - auto size = getDataTypeSizeInChunk(physicalType); - return memcmp(data + pos * size, this->data.data(), size) == 0; + switch (physicalType) { + case PhysicalTypeID::BOOL: { + return NullMask::isNull(reinterpret_cast(data), pos) == + *reinterpret_cast(this->data.data()); + } break; + default: { + auto size = getDataTypeSizeInChunk(physicalType); + return memcmp(data + pos * size, this->data.data(), size) == 0; + } + } } case CompressionType::BOOLEAN_BITPACKING: case CompressionType::UNCOMPRESSED: { diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 8e3f318994e..619f1baee6b 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -698,7 +698,8 @@ bool Column::checkUpdateInPlace(const ColumnChunkMetadata& metadata, for (auto rowIdx : rowIdxesToRead) { auto [chunkIdx, offsetInLocalChunk] = LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); - if (localChunks[chunkIdx]->getNullChunk()->isNull(offsetInLocalChunk)) { + if (localChunks[chunkIdx]->getNullChunk() != nullptr && + localChunks[chunkIdx]->getNullChunk()->isNull(offsetInLocalChunk)) { continue; } if (!metadata.compMeta.canUpdateInPlace( diff --git a/src/storage/store/null_column.cpp b/src/storage/store/null_column.cpp index 334292c1ffc..6a1fddf54d5 100644 --- a/src/storage/store/null_column.cpp +++ b/src/storage/store/null_column.cpp @@ -163,64 +163,6 @@ void NullColumn::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, Co } } -bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const ChunkCollection& localInsertChunk, const offset_to_row_idx_t& insertInfo, - const ChunkCollection& localUpdateChunk, const offset_to_row_idx_t& updateInfo) { - auto metadata = getMetadata(nodeGroupIdx, transaction->getType()); - if (metadata.compMeta.canAlwaysUpdateInPlace()) { - return true; - } - return checkUpdateInPlace(metadata, localInsertChunk, insertInfo) && - checkUpdateInPlace(metadata, localUpdateChunk, updateInfo); -} - -bool NullColumn::checkUpdateInPlace(const ColumnChunkMetadata& metadata, - const ChunkCollection& localChunks, const offset_to_row_idx_t& writeInfo) { - std::vector rowIdxesToRead; - for (auto& [_, rowIdx] : writeInfo) { - rowIdxesToRead.push_back(rowIdx); - } - std::sort(rowIdxesToRead.begin(), rowIdxesToRead.end()); - for (auto rowIdx : rowIdxesToRead) { - auto [chunkIdx, offsetInLocalChunk] = - LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); - auto localNullChunk = - ku_dynamic_cast(localChunks[chunkIdx]); - bool value = localNullChunk->isNull(offsetInLocalChunk); - if (!metadata.compMeta.canUpdateInPlace( - reinterpret_cast(&value), 0, dataType.getPhysicalType())) { - return false; - } - } - return true; -} - -bool NullColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, - const std::vector& dstOffsets, ColumnChunk* chunk, offset_t srcOffset) { - KU_ASSERT(chunk->getNullChunk() == nullptr && - chunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL); - auto metadata = getMetadata(nodeGroupIdx, transaction->getType()); - auto maxDstOffset = getMaxOffset(dstOffsets); - if ((metadata.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType) * - metadata.numPages) < maxDstOffset) { - // Note that for constant compression, `metadata.numPages` will be equal to 0. Thus, this - // function will always return false. - return false; - } - if (metadata.compMeta.canAlwaysUpdateInPlace()) { - return true; - } - auto nullChunk = ku_dynamic_cast(chunk); - for (auto i = 0u; i < dstOffsets.size(); i++) { - bool value = nullChunk->isNull(srcOffset + i); - if (!metadata.compMeta.canUpdateInPlace( - reinterpret_cast(&value), 0, dataType.getPhysicalType())) { - return false; - } - } - return true; -} - void NullColumn::commitLocalChunkInPlace(Transaction* /*transaction*/, node_group_idx_t nodeGroupIdx, const ChunkCollection& localInsertChunks, const offset_to_row_idx_t& insertInfo, const ChunkCollection& localUpdateChunks, From 8923c7fcd4a1c787852511800d9ced01a4ae12d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Fri, 5 Apr 2024 21:14:16 +0800 Subject: [PATCH 131/136] Replace Slack link with Discord in contributing guideline (#3217) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 23bd98c367b..4d6ed6826d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ Welcome to Kùzu! We are excited that you are interested in contributing to Kùzu. Before submitting your contribution though, please make sure to take a moment and read through the following guidelines. -Join our project's [Slack workspace](https://join.slack.com/t/kuzudb/shared_invite/zt-1w0thj6s7-0bLaU8Sb~4fDMKJ~oejG_g) for real-time communication with the core team and other contributors. +Join our project's [Discord community](https://discord.gg/VtX2gw9Rug) for real-time communication with the core team and other contributors. If you have a question or need help, feel free to ask in the appropriate channel or create an issue. ## Code of Conduct From 33111c8d577a36b5c8b45ec83af7aa4765902093 Mon Sep 17 00:00:00 2001 From: Maxwell <49460053+mxwli@users.noreply.github.com> Date: Fri, 5 Apr 2024 11:00:38 -0400 Subject: [PATCH 132/136] fix pyarrow segfaulting on fedora 39 (#3213) --- .../src_cpp/include/pyarrow/pyarrow_scan.h | 10 +++++----- .../python_api/src_cpp/pandas/pandas_scan.cpp | 2 +- .../src_cpp/pyarrow/pyarrow_scan.cpp | 19 ++++++++++--------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h index ee99f34cd30..4f477cfc91c 100644 --- a/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h +++ b/tools/python_api/src_cpp/include/pyarrow/pyarrow_scan.h @@ -22,7 +22,7 @@ struct PyArrowTableScanSharedState final : public function::BaseScanSharedState std::mutex lock; PyArrowTableScanSharedState( - uint64_t numRows, std::vector>&& chunks) + uint64_t numRows, std::vector> chunks) : BaseScanSharedState{numRows}, chunks{std::move(chunks)}, currentChunk{0} {} ArrowArrayWrapper* getNextChunk(); @@ -30,14 +30,14 @@ struct PyArrowTableScanSharedState final : public function::BaseScanSharedState struct PyArrowTableScanFunctionData final : public function::TableFuncBindData { std::shared_ptr schema; - py::object table; + std::vector> arrowArrayBatches; uint64_t numRows; PyArrowTableScanFunctionData(std::vector columnTypes, std::shared_ptr schema, std::vector columnNames, - py::handle table, uint64_t numRows) + std::vector> arrowArrayBatches, uint64_t numRows) : TableFuncBindData{std::move(columnTypes), std::move(columnNames)}, - schema{std::move(schema)}, table{py::reinterpret_borrow(table)}, numRows{numRows} {} + schema{std::move(schema)}, arrowArrayBatches{arrowArrayBatches}, numRows{numRows} {} ~PyArrowTableScanFunctionData() override {} @@ -45,7 +45,7 @@ struct PyArrowTableScanFunctionData final : public function::TableFuncBindData { py::gil_scoped_acquire acquire; // the schema is considered immutable so copying it by copying the shared_ptr is fine. return std::make_unique( - columnTypes, schema, columnNames, *table, numRows); + columnTypes, schema, columnNames, arrowArrayBatches, numRows); } }; diff --git a/tools/python_api/src_cpp/pandas/pandas_scan.cpp b/tools/python_api/src_cpp/pandas/pandas_scan.cpp index 71bf3392105..d43b37678c8 100644 --- a/tools/python_api/src_cpp/pandas/pandas_scan.cpp +++ b/tools/python_api/src_cpp/pandas/pandas_scan.cpp @@ -168,9 +168,9 @@ static std::unique_ptr tryReplacePD(py::dict& dict, py::str } std::unique_ptr replacePD(const std::string& objectName) { + py::gil_scoped_acquire acquire; auto pyTableName = py::str(objectName); // Here we do an exhaustive search on the frame lineage. - py::gil_scoped_acquire acquire; auto currentFrame = importCache->inspect.currentframe()(); while (hasattr(currentFrame, "f_locals")) { auto localDict = py::reinterpret_borrow(currentFrame.attr("f_locals")); diff --git a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp index d4cf53d3f7c..0598c269cda 100644 --- a/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp +++ b/tools/python_api/src_cpp/pyarrow/pyarrow_scan.cpp @@ -28,8 +28,16 @@ static std::unique_ptr bindFunc( } auto numRows = py::len(table); auto schema = Pyarrow::bind(table, returnTypes, names); + + py::list batches = table.attr("to_batches")(DEFAULT_VECTOR_CAPACITY); + std::vector> arrowArrayBatches; + for (auto& i: batches) { + arrowArrayBatches.push_back(std::make_shared()); + i.attr("_export_to_c")(reinterpret_cast(arrowArrayBatches.back().get())); + } + return std::make_unique( - std::move(returnTypes), std::move(schema), std::move(names), std::move(table), numRows); + std::move(returnTypes), std::move(schema), std::move(names), arrowArrayBatches, numRows); } ArrowArrayWrapper* PyArrowTableScanSharedState::getNextChunk() { @@ -46,16 +54,9 @@ static std::unique_ptr initSharedState( py::gil_scoped_acquire acquire; PyArrowTableScanFunctionData* bindData = dynamic_cast(input.bindData); - py::list batches = bindData->table.attr("to_batches")(DEFAULT_VECTOR_CAPACITY); - std::vector> arrowArrayBatches; - - for (auto& i : batches) { - arrowArrayBatches.push_back(std::make_shared()); - i.attr("_export_to_c")(reinterpret_cast(arrowArrayBatches.back().get())); - } return std::make_unique( - bindData->numRows, std::move(arrowArrayBatches)); + bindData->numRows, bindData->arrowArrayBatches); } static std::unique_ptr initLocalState( From b3917d99e365c3b509216ad731785faf6e312461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Sat, 6 Apr 2024 14:01:31 +0800 Subject: [PATCH 133/136] Bump clang-format to v18 and enable auto format (#3222) * Bump clang-format to v18 and enable auto format * Add repository and ref to actions/checkout step * Update source, test, and extension format checks * Run clang-format --------- Co-authored-by: CI Bot --- .github/workflows/ci-workflow.yml | 49 +++-- .../duckdb_scanner/src/duckdb_catalog.cpp | 32 +-- extension/duckdb_scanner/src/duckdb_scan.cpp | 56 ++--- .../duckdb_scanner/src/duckdb_storage.cpp | 4 +- .../src/duckdb_table_catalog_entry.cpp | 4 +- .../src/duckdb_type_converter.cpp | 8 +- .../src/include/duckdb_catalog.h | 4 +- .../duckdb_scanner/src/include/duckdb_scan.h | 8 +- .../src/include/duckdb_table_catalog_entry.h | 4 +- extension/httpfs/src/crypto.cpp | 8 +- extension/httpfs/src/httpfs.cpp | 44 ++-- extension/httpfs/src/httpfs_extension.cpp | 16 +- extension/httpfs/src/include/httpfs.h | 8 +- extension/httpfs/src/include/s3fs.h | 16 +- extension/httpfs/src/s3fs.cpp | 52 ++--- .../third_party/mbedtls/include/mbedtls/aes.h | 28 +-- .../mbedtls/include/mbedtls/aria.h | 8 +- .../mbedtls/include/mbedtls/asn1.h | 16 +- .../mbedtls/include/mbedtls/base64.h | 8 +- .../mbedtls/include/mbedtls/bignum.h | 12 +- .../mbedtls/include/mbedtls/camellia.h | 8 +- .../third_party/mbedtls/include/mbedtls/ccm.h | 4 +- .../mbedtls/include/mbedtls/cipher.h | 12 +- .../third_party/mbedtls/include/mbedtls/des.h | 24 +- .../mbedtls/include/mbedtls/entropy.h | 8 +- .../third_party/mbedtls/include/mbedtls/oid.h | 12 +- .../mbedtls/include/mbedtls/platform.h | 4 +- .../third_party/mbedtls/include/mbedtls/rsa.h | 4 +- .../third_party/mbedtls/library/aes.cpp | 130 +++++------ .../third_party/mbedtls/library/aria.cpp | 22 +- .../third_party/mbedtls/library/asn1parse.cpp | 28 +-- .../third_party/mbedtls/library/base64.cpp | 10 +- .../third_party/mbedtls/library/bignum.cpp | 42 ++-- .../third_party/mbedtls/library/camellia.cpp | 44 ++-- .../third_party/mbedtls/library/cipher.cpp | 76 +++---- .../mbedtls/library/cipher_wrap.cpp | 208 +++++++++--------- .../third_party/mbedtls/library/cipher_wrap.h | 4 +- .../third_party/mbedtls/library/common.h | 2 +- .../mbedtls/library/constant_time.cpp | 24 +- .../mbedtls/library/constant_time_internal.h | 12 +- .../mbedtls/library/constant_time_invasive.h | 4 +- .../third_party/mbedtls/library/entropy.cpp | 32 +-- .../third_party/mbedtls/library/gcm.cpp | 20 +- .../httpfs/third_party/mbedtls/library/md.cpp | 12 +- .../third_party/mbedtls/library/oid.cpp | 44 ++-- .../third_party/mbedtls/library/pem.cpp | 4 +- .../httpfs/third_party/mbedtls/library/pk.cpp | 12 +- .../third_party/mbedtls/library/pk_wrap.cpp | 40 ++-- .../third_party/mbedtls/library/pk_wrap.h | 4 +- .../third_party/mbedtls/library/pkparse.cpp | 68 +++--- .../third_party/mbedtls/library/rsa.cpp | 32 +-- .../mbedtls/library/rsa_alt_helpers.cpp | 4 +- .../mbedtls/library/rsa_alt_helpers.h | 4 +- .../third_party/mbedtls/library/sha1.cpp | 18 +- .../third_party/mbedtls/library/sha256.cpp | 9 +- .../postgres_scanner/src/postgres_catalog.cpp | 8 +- .../postgres_scanner/src/postgres_storage.cpp | 4 +- src/binder/bind/bind_copy.cpp | 28 +-- src/binder/bind/bind_ddl.cpp | 20 +- src/binder/bind/bind_explain.cpp | 4 +- src/binder/bind/bind_export_database.cpp | 8 +- src/binder/bind/bind_extension.cpp | 4 +- src/binder/bind/bind_file_scan.cpp | 8 +- src/binder/bind/bind_graph_pattern.cpp | 86 ++++---- src/binder/bind/bind_import_database.cpp | 4 +- src/binder/bind/bind_projection_clause.cpp | 16 +- src/binder/bind/bind_query.cpp | 8 +- src/binder/bind/bind_reading_clause.cpp | 20 +- src/binder/bind/bind_updating_clause.cpp | 36 +-- src/binder/bind/copy/bind_copy_rdf_graph.cpp | 20 +- src/binder/bind/ddl/bind_create_rdf_graph.cpp | 16 +- .../bind_boolean_expression.cpp | 12 +- .../bind_comparison_expression.cpp | 4 +- .../bind_function_expression.cpp | 20 +- .../bind_literal_expression.cpp | 4 +- .../bind_property_expression.cpp | 4 +- .../bind_subquery_expression.cpp | 8 +- .../bind_variable_expression.cpp | 8 +- src/binder/binder.cpp | 20 +- src/binder/binder_scope.cpp | 4 +- src/binder/bound_statement_rewriter.cpp | 4 +- src/binder/expression/expression_util.cpp | 16 +- src/binder/expression/function_expression.cpp | 8 +- src/binder/expression_binder.cpp | 20 +- src/binder/expression_visitor.cpp | 4 +- .../with_clause_projection_rewriter.cpp | 8 +- src/c_api/connection.cpp | 12 +- src/c_api/data_type.cpp | 8 +- src/c_api/database.cpp | 6 +- src/c_api/flat_tuple.cpp | 4 +- src/c_api/prepared_statement.cpp | 64 +++--- src/c_api/query_result.cpp | 8 +- src/catalog/catalog.cpp | 12 +- src/catalog/catalog_content.cpp | 20 +- .../catalog_entry/function_catalog_entry.cpp | 8 +- .../node_table_catalog_entry.cpp | 4 +- .../catalog_entry/rel_group_catalog_entry.cpp | 4 +- .../scalar_macro_catalog_entry.cpp | 8 +- .../catalog_entry/table_catalog_entry.cpp | 15 +- src/common/arrow/arrow_array_scan.cpp | 180 +++++++-------- src/common/arrow/arrow_converter.cpp | 12 +- src/common/arrow/arrow_null_mask_tree.cpp | 34 +-- src/common/arrow/arrow_row_batch.cpp | 188 ++++++++-------- src/common/case_insensitive_map.cpp | 4 +- .../copier_config/csv_reader_config.cpp | 8 +- .../data_chunk/data_chunk_collection.cpp | 4 +- src/common/exception/message.cpp | 4 +- src/common/file_system/file_system.cpp | 4 +- src/common/file_system/local_file_system.cpp | 36 +-- .../file_system/virtual_file_system.cpp | 16 +- src/common/null_mask.cpp | 4 +- src/common/string_utils.cpp | 16 +- src/common/system_message.cpp | 4 +- src/common/task_system/progress_bar.cpp | 6 +- src/common/task_system/task.cpp | 4 +- src/common/task_system/task_scheduler.cpp | 4 +- src/common/type_utils.cpp | 16 +- src/common/types/date_t.cpp | 16 +- src/common/types/dtime_t.cpp | 4 +- src/common/types/interval_t.cpp | 6 +- src/common/types/timestamp_t.cpp | 12 +- src/common/types/types.cpp | 32 +-- src/common/types/value/recursive_rel.cpp | 4 +- src/common/vector/auxiliary_buffer.cpp | 16 +- src/common/vector/value_vector.cpp | 40 ++-- src/expression_evaluator/case_evaluator.cpp | 12 +- .../expression_evaluator.cpp | 4 +- .../function_evaluator.cpp | 8 +- .../literal_evaluator.cpp | 8 +- .../node_rel_evaluator.cpp | 4 +- src/expression_evaluator/path_evaluator.cpp | 28 +-- .../reference_evaluator.cpp | 4 +- src/extension/extension.cpp | 8 +- src/function/aggregate/collect.cpp | 20 +- src/function/aggregate/count.cpp | 8 +- src/function/aggregate/count_star.cpp | 4 +- src/function/aggregate_function.cpp | 36 +-- src/function/arithmetic/subtract.cpp | 4 +- src/function/base_lower_upper_operation.cpp | 4 +- src/function/built_in_function_utils.cpp | 16 +- src/function/cast/cast_array.cpp | 8 +- src/function/cast_from_string_functions.cpp | 44 ++-- .../cast_string_non_nested_functions.cpp | 12 +- src/function/comparison_functions.cpp | 12 +- src/function/find_function.cpp | 28 +-- src/function/pattern/id_function.cpp | 8 +- src/function/scalar_macro_function.cpp | 8 +- src/function/table/call/current_setting.cpp | 8 +- src/function/table/call/db_version.cpp | 4 +- src/function/table/call/show_connection.cpp | 16 +- src/function/table/call/show_tables.cpp | 8 +- src/function/table/call/storage_info.cpp | 16 +- src/function/table/call/table_info.cpp | 16 +- src/function/vector_arithmetic_functions.cpp | 40 ++-- src/function/vector_array_functions.cpp | 16 +- src/function/vector_cast_functions.cpp | 132 +++++------ src/function/vector_date_functions.cpp | 4 +- src/function/vector_hash_functions.cpp | 8 +- src/function/vector_list_functions.cpp | 32 +-- src/function/vector_map_functions.cpp | 4 +- src/function/vector_path_functions.cpp | 20 +- src/function/vector_string_functions.cpp | 36 +-- src/function/vector_struct_functions.cpp | 8 +- src/function/vector_union_functions.cpp | 4 +- src/include/binder/binder.h | 48 ++-- src/include/binder/bound_create_macro.h | 4 +- src/include/binder/bound_explain.h | 4 +- src/include/binder/copy/bound_copy_from.h | 4 +- src/include/binder/ddl/bound_alter_info.h | 4 +- .../binder/ddl/bound_create_table_info.h | 12 +- .../binder/expression/case_expression.h | 8 +- src/include/binder/expression/expression.h | 12 +- .../binder/expression/expression_util.h | 16 +- .../binder/expression/function_expression.h | 12 +- .../binder/expression/node_rel_expression.h | 4 +- .../binder/expression/parameter_expression.h | 4 +- .../binder/expression/path_expression.h | 4 +- .../binder/expression/rel_expression.h | 8 +- .../binder/expression/subquery_expression.h | 4 +- .../binder/expression/variable_expression.h | 4 +- src/include/binder/expression_binder.h | 44 ++-- src/include/binder/expression_visitor.h | 4 +- .../reading_clause/bound_in_query_call.h | 4 +- .../query/reading_clause/bound_match_clause.h | 4 +- .../query/updating_clause/bound_delete_info.h | 8 +- .../query/updating_clause/bound_set_info.h | 8 +- src/include/c_api/kuzu.h | 92 ++++---- src/include/catalog/catalog.h | 20 +- src/include/catalog/catalog_content.h | 20 +- .../catalog_entry/function_catalog_entry.h | 4 +- .../catalog_entry/node_table_catalog_entry.h | 4 +- .../scalar_macro_catalog_entry.h | 4 +- .../catalog_entry/table_catalog_entry.h | 4 +- src/include/catalog/property.h | 8 +- src/include/common/arrow/arrow_converter.h | 16 +- .../common/arrow/arrow_nullmask_tree.h | 8 +- src/include/common/arrow/arrow_row_batch.h | 32 +-- src/include/common/assert.h | 8 +- src/include/common/copy_constructors.h | 4 +- src/include/common/exception/message.h | 8 +- src/include/common/file_system/file_system.h | 12 +- .../common/file_system/local_file_system.h | 8 +- .../common/file_system/virtual_file_system.h | 8 +- src/include/common/null_mask.h | 8 +- .../common/serializer/buffered_serializer.h | 4 +- src/include/common/serializer/deserializer.h | 6 +- src/include/common/serializer/serializer.h | 6 +- src/include/common/string_format.h | 20 +- src/include/common/string_utils.h | 12 +- src/include/common/task_system/task.h | 2 +- .../common/task_system/task_scheduler.h | 4 +- src/include/common/type_utils.h | 8 +- src/include/common/types/cast_helpers.h | 4 +- src/include/common/types/date_t.h | 12 +- src/include/common/types/dtime_t.h | 24 +- src/include/common/types/interval_t.h | 4 +- src/include/common/types/timestamp_t.h | 8 +- src/include/common/types/types.h | 28 +-- src/include/common/types/value/value.h | 4 +- src/include/common/vector/auxiliary_buffer.h | 8 +- src/include/common/vector/value_vector.h | 40 ++-- .../expression_evaluator/case_evaluator.h | 16 +- .../expression_evaluator.h | 4 +- .../expression_evaluator/function_evaluator.h | 12 +- .../expression_evaluator/literal_evaluator.h | 4 +- .../expression_evaluator/node_rel_evaluator.h | 8 +- .../expression_evaluator/path_evaluator.h | 12 +- .../reference_evaluator.h | 4 +- src/include/extension/extension.h | 4 +- src/include/function/aggregate/avg.h | 8 +- src/include/function/aggregate/base_count.h | 4 +- src/include/function/aggregate/collect.h | 16 +- src/include/function/aggregate/min_max.h | 8 +- src/include/function/aggregate/sum.h | 8 +- src/include/function/aggregate_function.h | 12 +- .../function/binary_function_executor.h | 176 +++++++-------- .../function/blob/functions/decode_function.h | 4 +- .../function/blob/functions/encode_function.h | 4 +- .../boolean/boolean_function_executor.h | 64 +++--- .../function/boolean/boolean_functions.h | 12 +- .../function/built_in_function_utils.h | 8 +- .../functions/cast_from_string_functions.h | 60 ++--- .../function/cast/functions/cast_functions.h | 92 ++++---- .../cast_string_non_nested_functions.h | 28 +-- .../function/cast/functions/numeric_cast.h | 24 +- .../function/cast/vector_cast_functions.h | 4 +- .../comparison/vector_comparison_functions.h | 12 +- src/include/function/date/date_functions.h | 32 +-- src/include/function/function.h | 8 +- src/include/function/hash/hash_functions.h | 76 +++---- .../function/hash/vector_hash_functions.h | 20 +- .../list/functions/base_list_sort_function.h | 8 +- .../list/functions/list_any_value_function.h | 4 +- .../list/functions/list_distinct_function.h | 4 +- .../list/functions/list_extract_function.h | 8 +- .../list/functions/list_len_function.h | 4 +- .../functions/list_reverse_sort_function.h | 4 +- .../list/functions/list_sort_function.h | 4 +- .../function/list/vector_list_functions.h | 4 +- .../map/functions/map_keys_function.h | 4 +- .../map/functions/map_values_function.h | 4 +- .../function/null/null_function_executor.h | 12 +- .../function/path/path_function_executor.h | 28 +-- src/include/function/rewrite_function.h | 4 +- src/include/function/scalar_function.h | 16 +- .../string/functions/array_extract_function.h | 8 +- .../string/functions/base_pad_function.h | 12 +- .../string/functions/base_regexp_function.h | 4 +- .../string/functions/contains_function.h | 4 +- .../string/functions/ends_with_function.h | 4 +- .../function/string/functions/find_function.h | 8 +- .../function/string/functions/lpad_function.h | 4 +- .../function/string/functions/pad_function.h | 4 +- .../functions/regexp_extract_all_function.h | 8 +- .../functions/regexp_extract_function.h | 4 +- .../functions/regexp_full_match_function.h | 4 +- .../functions/regexp_matches_function.h | 4 +- .../functions/regexp_replace_function.h | 4 +- .../function/string/functions/rpad_function.h | 4 +- .../string/functions/starts_with_function.h | 4 +- .../string/functions/substr_function.h | 12 +- .../function/string/vector_string_functions.h | 4 +- .../function/struct/vector_struct_functions.h | 8 +- src/include/function/table/bind_data.h | 4 +- src/include/function/table/bind_input.h | 4 +- src/include/function/table/call_functions.h | 8 +- src/include/function/table/scan_functions.h | 4 +- src/include/function/table_functions.h | 4 +- .../function/ternary_function_executor.h | 164 +++++++------- src/include/function/udf_function.h | 30 +-- .../function/unary_function_executor.h | 48 ++-- src/include/main/client_context.h | 4 +- src/include/main/connection.h | 24 +- src/include/main/database.h | 16 +- src/include/main/db_config.h | 8 +- src/include/main/plan_printer.h | 16 +- src/include/main/query_result.h | 4 +- .../projection_push_down_optimizer.h | 4 +- .../parser/antlr_parser/kuzu_cypher_parser.h | 4 +- .../antlr_parser/parser_error_strategy.h | 4 +- src/include/parser/comment_on.h | 4 +- src/include/parser/copy.h | 4 +- src/include/parser/ddl/alter_info.h | 4 +- src/include/parser/ddl/create_table_info.h | 8 +- .../expression/parsed_case_expression.h | 11 +- .../parser/expression/parsed_expression.h | 8 +- .../expression/parsed_function_expression.h | 4 +- .../expression/parsed_literal_expression.h | 8 +- .../expression/parsed_property_expression.h | 12 +- .../expression/parsed_variable_expression.h | 8 +- .../parser/query/graph_pattern/rel_pattern.h | 4 +- .../reading_clause/in_query_call_clause.h | 4 +- .../query/reading_clause/match_clause.h | 4 +- .../query/reading_clause/unwind_clause.h | 4 +- .../return_with_clause/projection_body.h | 8 +- .../query/updating_clause/insert_clause.h | 4 +- .../join_order/cardinality_estimator.h | 8 +- src/include/planner/join_order/cost_model.h | 8 +- .../planner/join_order/join_order_util.h | 4 +- .../planner/join_order_enumerator_context.h | 8 +- .../operator/extend/extend_direction.h | 4 +- .../planner/operator/extend/logical_extend.h | 4 +- .../operator/factorization/sink_util.h | 4 +- .../planner/operator/logical_accumulate.h | 8 +- .../planner/operator/logical_aggregate.h | 12 +- .../planner/operator/logical_create_macro.h | 6 +- .../planner/operator/logical_cross_product.h | 4 +- .../planner/operator/logical_distinct.h | 8 +- .../planner/operator/logical_explain.h | 4 +- src/include/planner/operator/logical_filter.h | 8 +- .../planner/operator/logical_hash_join.h | 4 +- .../planner/operator/logical_in_query_call.h | 4 +- .../planner/operator/logical_intersect.h | 4 +- .../planner/operator/logical_operator.h | 4 +- .../planner/operator/logical_order_by.h | 4 +- .../planner/operator/logical_partitioner.h | 8 +- .../planner/operator/logical_projection.h | 8 +- src/include/planner/operator/logical_union.h | 4 +- .../operator/persistent/logical_copy_to.h | 4 +- .../operator/persistent/logical_delete.h | 16 +- .../operator/persistent/logical_export_db.h | 4 +- .../operator/persistent/logical_merge.h | 4 +- .../planner/operator/persistent/logical_set.h | 16 +- .../operator/scan/logical_expressions_scan.h | 4 +- .../operator/scan/logical_index_scan.h | 8 +- .../planner/operator/scan/logical_scan_file.h | 4 +- .../operator/scan/logical_scan_internal_id.h | 8 +- .../scan/logical_scan_node_property.h | 8 +- src/include/planner/operator/schema.h | 24 +- src/include/planner/planner.h | 52 ++--- .../operator/aggregate/aggregate_hash_table.h | 16 +- .../operator/aggregate/aggregate_input.h | 4 +- .../operator/aggregate/base_aggregate.h | 4 +- .../operator/aggregate/base_aggregate_scan.h | 8 +- .../operator/aggregate/hash_aggregate.h | 4 +- .../operator/aggregate/hash_aggregate_scan.h | 12 +- .../processor/operator/call/standalone_call.h | 8 +- src/include/processor/operator/comment_on.h | 8 +- .../processor/operator/cross_product.h | 4 +- .../processor/operator/ddl/create_table.h | 4 +- src/include/processor/operator/filter.h | 8 +- .../operator/hash_join/join_hash_table.h | 4 +- .../processor/operator/intersect/intersect.h | 8 +- .../processor/operator/macro/create_macro.h | 12 +- .../processor/operator/multiplicity_reducer.h | 4 +- .../operator/order_by/key_block_merger.h | 8 +- .../operator/order_by/order_by_data_info.h | 17 +- .../operator/order_by/order_by_key_encoder.h | 22 +- .../operator/order_by/order_by_scan.h | 12 +- .../processor/operator/order_by/radix_sort.h | 4 +- .../processor/operator/order_by/top_k.h | 12 +- .../operator/order_by/top_k_scanner.h | 8 +- src/include/processor/operator/partitioner.h | 4 +- .../operator/persistent/batch_insert.h | 4 +- .../processor/operator/persistent/copy_rdf.h | 4 +- .../processor/operator/persistent/copy_to.h | 4 +- .../operator/persistent/copy_to_csv.h | 4 +- .../operator/persistent/copy_to_parquet.h | 4 +- .../operator/persistent/delete_executor.h | 12 +- .../processor/operator/persistent/export_db.h | 4 +- .../operator/persistent/file_writer.h | 4 +- .../operator/persistent/index_builder.h | 8 +- .../operator/persistent/insert_executor.h | 6 +- .../processor/operator/persistent/merge.h | 8 +- .../operator/persistent/node_batch_insert.h | 4 +- .../reader/parquet/boolean_column_reader.h | 4 +- .../reader/parquet/callback_column_reader.h | 8 +- .../persistent/reader/parquet/column_reader.h | 4 +- .../persistent/reader/parquet/decode_utils.h | 4 +- .../reader/parquet/interval_column_reader.h | 12 +- .../reader/parquet/parquet_reader.h | 4 +- .../reader/parquet/parquet_rle_bp_decoder.h | 12 +- .../reader/parquet/string_column_reader.h | 4 +- .../reader/parquet/templated_column_reader.h | 12 +- .../persistent/reader/parquet/thrift_tools.h | 4 +- .../persistent/reader/rdf/rdf_reader.h | 7 +- .../operator/persistent/reader/rdf/rdf_scan.h | 48 ++-- .../operator/persistent/rel_batch_insert.h | 16 +- .../processor/operator/persistent/set.h | 8 +- .../writer/parquet/basic_column_writer.h | 20 +- .../writer/parquet/boolean_column_writer.h | 8 +- .../writer/parquet/interval_column_writer.h | 4 +- .../writer/parquet/list_column_writer.h | 4 +- .../writer/parquet/parquet_writer.h | 4 +- .../writer/parquet/standard_column_writer.h | 4 +- .../writer/parquet/string_column_writer.h | 20 +- src/include/processor/operator/profile.h | 4 +- src/include/processor/operator/projection.h | 4 +- .../operator/recursive_extend/bfs_state.h | 4 +- .../recursive_extend/path_property_probe.h | 16 +- .../recursive_extend/recursive_join.h | 8 +- .../operator/recursive_extend/scan_frontier.h | 4 +- .../operator/scan/scan_multi_node_tables.h | 4 +- .../operator/scan/scan_multi_rel_tables.h | 4 +- .../processor/operator/scan/scan_node_table.h | 8 +- .../processor/operator/scan/scan_rel_table.h | 12 +- src/include/processor/operator/semi_masker.h | 16 +- src/include/processor/operator/sink.h | 6 +- src/include/processor/operator/skip.h | 4 +- .../operator/table_scan/union_all_scan.h | 8 +- src/include/processor/operator/transaction.h | 4 +- src/include/processor/operator/unwind.h | 4 +- src/include/processor/plan_mapper.h | 24 +- src/include/processor/processor_task.h | 4 +- .../processor/result/base_hash_table.h | 4 +- .../processor/result/factorized_table.h | 40 ++-- .../storage/buffer_manager/bm_file_handle.h | 24 +- .../storage/buffer_manager/buffer_manager.h | 24 +- src/include/storage/compression/compression.h | 34 +-- src/include/storage/index/hash_index.h | 24 +- .../storage/index/hash_index_builder.h | 12 +- src/include/storage/index/hash_index_utils.h | 16 +- .../storage/local_storage/local_node_table.h | 8 +- .../storage/local_storage/local_rel_table.h | 4 +- .../storage/local_storage/local_storage.h | 4 +- .../storage/local_storage/local_table.h | 12 +- .../storage/stats/nodes_store_statistics.h | 24 +- .../storage/stats/rel_table_statistics.h | 20 +- .../storage/stats/rels_store_statistics.h | 24 +- src/include/storage/stats/table_statistics.h | 4 +- .../stats/table_statistics_collection.h | 16 +- src/include/storage/storage_extension.h | 8 +- .../storage/storage_structure/disk_array.h | 12 +- .../storage/storage_structure/overflow_file.h | 8 +- src/include/storage/storage_utils.h | 52 ++--- .../storage/store/chunked_node_group.h | 12 +- .../store/chunked_node_group_collection.h | 4 +- src/include/storage/store/column.h | 28 +-- src/include/storage/store/column_chunk.h | 32 +-- src/include/storage/store/dictionary_column.h | 8 +- src/include/storage/store/list_column_chunk.h | 8 +- src/include/storage/store/node_table.h | 20 +- src/include/storage/store/node_table_data.h | 4 +- src/include/storage/store/null_column.h | 8 +- src/include/storage/store/rel_table.h | 4 +- src/include/storage/store/rel_table_data.h | 48 ++-- .../storage/store/string_column_chunk.h | 8 +- src/include/storage/store/struct_column.h | 4 +- .../storage/store/struct_column_chunk.h | 8 +- src/include/storage/store/table.h | 4 +- src/include/storage/store/table_data.h | 4 +- src/include/storage/wal/wal.h | 8 +- src/include/storage/wal/wal_record.h | 32 +-- src/include/storage/wal_replayer.h | 8 +- src/include/storage/wal_replayer_utils.h | 4 +- src/include/transaction/transaction.h | 4 +- src/main/client_context.cpp | 40 ++-- src/main/connection.cpp | 4 +- src/main/database.cpp | 38 ++-- src/main/plan_printer.cpp | 20 +- src/main/query_result.cpp | 4 +- src/main/storage_driver.cpp | 8 +- src/optimizer/acc_hash_join_optimizer.cpp | 12 +- src/optimizer/factorization_rewriter.cpp | 16 +- src/optimizer/filter_push_down_optimizer.cpp | 12 +- .../projection_push_down_optimizer.cpp | 4 +- .../antlr_parser/kuzu_cypher_parser.cpp | 4 +- .../antlr_parser/parser_error_listener.cpp | 4 +- .../antlr_parser/parser_error_strategy.cpp | 4 +- .../expression/parsed_case_expression.cpp | 4 +- src/parser/expression/parsed_expression.cpp | 4 +- src/parser/transform/transform_ddl.cpp | 12 +- src/parser/transform/transform_expression.cpp | 120 +++++----- src/parser/transform/transform_extension.cpp | 4 +- src/parser/transform/transform_projection.cpp | 4 +- src/parser/transform/transform_query.cpp | 4 +- .../transform/transform_updating_clause.cpp | 4 +- .../join_order/cardinality_estimator.cpp | 28 +-- src/planner/join_order/cost_model.cpp | 4 +- src/planner/join_order/join_order_util.cpp | 4 +- src/planner/join_order_enumerator_context.cpp | 4 +- .../factorization/flatten_resolver.cpp | 8 +- .../operator/factorization/sink_util.cpp | 12 +- src/planner/operator/logical_aggregate.cpp | 4 +- src/planner/operator/logical_dummy_scan.cpp | 4 +- src/planner/operator/logical_hash_join.cpp | 4 +- src/planner/operator/logical_intersect.cpp | 4 +- src/planner/operator/logical_operator.cpp | 8 +- src/planner/operator/logical_plan_util.cpp | 16 +- src/planner/operator/logical_union.cpp | 4 +- .../operator/persistent/logical_insert.cpp | 4 +- .../operator/persistent/logical_merge.cpp | 4 +- src/planner/operator/schema.cpp | 28 +-- src/planner/plan/append_accumulate.cpp | 4 +- src/planner/plan/append_aggregate.cpp | 4 +- src/planner/plan/append_cross_product.cpp | 4 +- src/planner/plan/append_delete.cpp | 8 +- src/planner/plan/append_extend.cpp | 44 ++-- src/planner/plan/append_filter.cpp | 4 +- src/planner/plan/append_insert.cpp | 8 +- src/planner/plan/append_join.cpp | 8 +- src/planner/plan/append_mark_accumulate.cpp | 4 +- src/planner/plan/append_order_by.cpp | 4 +- src/planner/plan/append_scan_node.cpp | 8 +- src/planner/plan/append_set.cpp | 4 +- src/planner/plan/append_simple.cpp | 16 +- src/planner/plan/plan_copy.cpp | 20 +- src/planner/plan/plan_join_order.cpp | 48 ++-- src/planner/plan/plan_port_db.cpp | 6 +- src/planner/plan/plan_read.cpp | 12 +- src/planner/plan/plan_subquery.cpp | 24 +- src/planner/plan/plan_update.cpp | 8 +- src/planner/query_planner.cpp | 4 +- src/planner/subplans_table.cpp | 4 +- .../map/create_factorized_table_scan.cpp | 16 +- src/processor/map/create_result_collector.cpp | 4 +- src/processor/map/expression_mapper.cpp | 28 +-- src/processor/map/map_accumulate.cpp | 8 +- src/processor/map/map_aggregate.cpp | 24 +- src/processor/map/map_comment_on.cpp | 4 +- src/processor/map/map_copy_from.cpp | 12 +- src/processor/map/map_copy_to.cpp | 8 +- src/processor/map/map_delete.cpp | 20 +- src/processor/map/map_detach_database.cpp | 4 +- src/processor/map/map_explain.cpp | 4 +- src/processor/map/map_extend.cpp | 24 +- src/processor/map/map_hash_join.cpp | 12 +- src/processor/map/map_in_query_call.cpp | 4 +- src/processor/map/map_index_scan_node.cpp | 4 +- src/processor/map/map_insert.cpp | 8 +- src/processor/map/map_label_filter.cpp | 4 +- .../map/map_multiplicity_reducer.cpp | 4 +- src/processor/map/map_order_by.cpp | 12 +- src/processor/map/map_path_property_probe.cpp | 4 +- src/processor/map/map_port_db.cpp | 4 +- src/processor/map/map_scan_file.cpp | 4 +- src/processor/map/map_scan_frontier.cpp | 4 +- src/processor/map/map_scan_node.cpp | 4 +- src/processor/map/map_semi_masker.cpp | 4 +- src/processor/map/map_set.cpp | 16 +- src/processor/map/plan_mapper.cpp | 16 +- .../aggregate/aggregate_hash_table.cpp | 152 ++++++------- .../aggregate/base_aggregate_scan.cpp | 8 +- .../operator/aggregate/hash_aggregate.cpp | 8 +- .../aggregate/hash_aggregate_scan.cpp | 4 +- .../operator/aggregate/simple_aggregate.cpp | 16 +- .../aggregate/simple_aggregate_scan.cpp | 4 +- src/processor/operator/attach_database.cpp | 4 +- src/processor/operator/call/in_query_call.cpp | 4 +- .../operator/call/standalone_call.cpp | 4 +- src/processor/operator/filter.cpp | 4 +- .../operator/hash_join/hash_join_probe.cpp | 24 +- .../operator/hash_join/join_hash_table.cpp | 16 +- src/processor/operator/index_lookup.cpp | 4 +- src/processor/operator/install_extension.cpp | 4 +- .../operator/intersect/intersect.cpp | 8 +- src/processor/operator/macro/create_macro.cpp | 4 +- .../operator/order_by/key_block_merger.cpp | 48 ++-- .../order_by/order_by_key_encoder.cpp | 22 +- .../operator/order_by/order_by_scan.cpp | 8 +- .../operator/order_by/radix_sort.cpp | 8 +- .../operator/order_by/sort_state.cpp | 12 +- src/processor/operator/order_by/top_k.cpp | 36 +-- .../operator/order_by/top_k_scanner.cpp | 8 +- src/processor/operator/partitioner.cpp | 8 +- .../operator/persistent/copy_rdf.cpp | 4 +- .../operator/persistent/copy_to_csv.cpp | 8 +- .../operator/persistent/copy_to_parquet.cpp | 4 +- src/processor/operator/persistent/delete.cpp | 8 +- .../operator/persistent/delete_executor.cpp | 16 +- .../operator/persistent/export_db.cpp | 20 +- .../operator/persistent/insert_executor.cpp | 8 +- .../operator/persistent/node_batch_insert.cpp | 24 +- .../persistent/reader/csv/base_csv_reader.cpp | 10 +- .../operator/persistent/reader/csv/driver.cpp | 12 +- .../reader/csv/parallel_csv_reader.cpp | 4 +- .../reader/csv/serial_csv_reader.cpp | 8 +- .../persistent/reader/npy/npy_reader.cpp | 8 +- .../reader/parquet/boolean_column_reader.cpp | 4 +- .../reader/parquet/column_reader.cpp | 104 ++++----- .../reader/parquet/interval_column_reader.cpp | 8 +- .../reader/parquet/list_column_reader.cpp | 4 +- .../reader/parquet/parquet_reader.cpp | 52 ++--- .../reader/parquet/string_column_reader.cpp | 24 +- .../reader/parquet/struct_column_reader.cpp | 4 +- .../persistent/reader/rdf/rdf_reader.cpp | 12 +- .../persistent/reader/rdf/rdf_scan.cpp | 36 +-- .../persistent/reader/rdf/rdf_utils.cpp | 4 +- .../operator/persistent/rel_batch_insert.cpp | 36 +-- .../operator/persistent/set_executor.cpp | 20 +- .../writer/parquet/basic_column_writer.cpp | 16 +- .../writer/parquet/boolean_column_writer.cpp | 4 +- .../writer/parquet/column_writer.cpp | 4 +- .../writer/parquet/interval_column_writer.cpp | 4 +- .../writer/parquet/list_column_writer.cpp | 4 +- .../writer/parquet/parquet_writer.cpp | 12 +- .../writer/parquet/string_column_writer.cpp | 12 +- .../writer/parquet/struct_column_writer.cpp | 20 +- .../recursive_extend/path_property_probe.cpp | 8 +- .../recursive_extend/recursive_join.cpp | 44 ++-- src/processor/operator/result_collector.cpp | 4 +- .../operator/scan/scan_multi_node_tables.cpp | 4 +- .../operator/scan/scan_multi_rel_tables.cpp | 8 +- .../operator/scan/scan_node_table.cpp | 4 +- src/processor/operator/scan/scan_table.cpp | 4 +- src/processor/operator/scan_node_id.cpp | 4 +- .../table_scan/ftable_scan_function.cpp | 8 +- .../operator/table_scan/union_all_scan.cpp | 4 +- src/processor/processor.cpp | 8 +- src/processor/processor_task.cpp | 4 +- src/processor/result/base_hash_table.cpp | 24 +- src/processor/result/factorized_table.cpp | 68 +++--- src/processor/result/flat_tuple.cpp | 4 +- src/processor/result/mark_hash_table.cpp | 4 +- src/processor/result/result_set.cpp | 4 +- src/storage/buffer_manager/buffer_manager.cpp | 32 +-- src/storage/buffer_manager/vm_region.cpp | 4 +- src/storage/compression/compression.cpp | 124 +++++------ src/storage/index/hash_index.cpp | 41 ++-- src/storage/index/hash_index_builder.cpp | 24 +- .../local_storage/local_node_table.cpp | 16 +- src/storage/local_storage/local_rel_table.cpp | 20 +- src/storage/local_storage/local_table.cpp | 28 +-- src/storage/stats/node_table_statistics.cpp | 12 +- src/storage/stats/nodes_store_statistics.cpp | 12 +- src/storage/stats/rel_table_statistics.cpp | 4 +- src/storage/stats/rels_store_statistics.cpp | 12 +- src/storage/stats/table_statistics.cpp | 4 +- .../stats/table_statistics_collection.cpp | 4 +- src/storage/storage_manager.cpp | 24 +- .../storage_structure/db_file_utils.cpp | 40 ++-- src/storage/storage_structure/disk_array.cpp | 20 +- src/storage/storage_structure/in_mem_page.cpp | 4 +- .../storage_structure/overflow_file.cpp | 28 +-- src/storage/storage_utils.cpp | 16 +- src/storage/store/chunked_node_group.cpp | 20 +- .../store/chunked_node_group_collection.cpp | 8 +- src/storage/store/column.cpp | 104 ++++----- src/storage/store/column_chunk.cpp | 101 +++++---- src/storage/store/dictionary_chunk.cpp | 8 +- src/storage/store/dictionary_column.cpp | 20 +- src/storage/store/list_column.cpp | 32 +-- src/storage/store/list_column_chunk.cpp | 50 ++--- src/storage/store/node_table.cpp | 32 +-- src/storage/store/node_table_data.cpp | 12 +- src/storage/store/null_column.cpp | 28 +-- src/storage/store/rel_table.cpp | 56 ++--- src/storage/store/rel_table_data.cpp | 116 +++++----- src/storage/store/string_column.cpp | 28 +-- src/storage/store/string_column_chunk.cpp | 24 +- src/storage/store/struct_column.cpp | 40 ++-- src/storage/store/struct_column_chunk.cpp | 32 +-- src/storage/store/table_data.cpp | 10 +- src/storage/wal/wal.cpp | 12 +- src/storage/wal/wal_record.cpp | 20 +- src/storage/wal_replayer.cpp | 36 +-- src/storage/wal_replayer_utils.cpp | 8 +- src/transaction/transaction_context.cpp | 4 +- src/transaction/transaction_manager.cpp | 4 +- test/c_api/connection_test.cpp | 8 +- test/c_api/flat_tuple_test.cpp | 8 +- test/c_api/query_result_test.cpp | 8 +- test/c_api/value_test.cpp | 56 ++--- test/common/interval_test.cpp | 8 +- test/common/null_mask_test.cpp | 12 +- test/common/time_test.cpp | 40 ++-- test/common/timestamp_test.cpp | 40 ++-- test/ddl/e2e_ddl_test.cpp | 68 +++--- test/graph_test/base_graph_test.cpp | 20 +- test/graph_test/graph_test.cpp | 4 +- test/include/graph_test/base_graph_test.h | 8 +- test/include/test_helper/test_helper.h | 8 +- .../test_runner/csv_to_parquet_converter.h | 4 +- test/include/test_runner/test_parser.h | 4 +- test/include/test_runner/test_runner.h | 16 +- test/main/db_locking_test.cpp | 12 +- test/main/prepare_test.cpp | 12 +- test/main/result_value_test.cpp | 8 +- test/main/udf_test.cpp | 40 ++-- test/runner/cleanup_test.cpp | 4 +- test/runner/e2e_test.cpp | 4 +- test/storage/compression_test.cpp | 12 +- test/test_helper/test_helper.cpp | 8 +- test/test_runner/test_parser.cpp | 4 +- test/test_runner/test_runner.cpp | 24 +- test/transaction/transaction_manager_test.cpp | 52 ++--- test/util_tests/string_format.cpp | 8 +- 697 files changed, 5441 insertions(+), 5377 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index b8045b8de0d..3ea78dd855c 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -25,7 +25,7 @@ concurrency: jobs: gcc-build-test: name: gcc build & test - needs: [clang-formatting-check, sanity-checks, python-lint-check] + needs: [clang-format, sanity-checks, python-lint-check] runs-on: kuzu-self-hosted-testing env: NUM_THREADS: 32 @@ -83,7 +83,7 @@ jobs: gcc-build-test-x86: name: gcc build & test 32-bit - needs: [clang-formatting-check, sanity-checks] + needs: [clang-format, sanity-checks] runs-on: ubuntu-latest steps: @@ -157,7 +157,7 @@ jobs: clang-build-test: name: clang build and test - needs: [clang-formatting-check, sanity-checks, python-lint-check] + needs: [clang-format, sanity-checks, python-lint-check] runs-on: kuzu-self-hosted-testing env: NUM_THREADS: 32 @@ -214,7 +214,7 @@ jobs: msvc-build-test: name: msvc build & test - needs: [clang-formatting-check, sanity-checks, python-lint-check] + needs: [clang-format, sanity-checks, python-lint-check] runs-on: self-hosted-windows env: # Shorten build path as much as possible @@ -285,7 +285,7 @@ jobs: tidy-and-diagnostics: name: clang tidy & clangd diagnostics check - needs: [clang-formatting-check, sanity-checks] + needs: [clang-format, sanity-checks] runs-on: kuzu-self-hosted-testing env: NUM_THREADS: 32 @@ -322,25 +322,37 @@ jobs: - name: Ensure generated grammar files are up to date run: cmp src/antlr4/Cypher.g4 scripts/antlr4/Cypher.g4.copy - clang-formatting-check: - name: clang-format check + clang-format: + name: clang format runs-on: ubuntu-22.04 steps: - name: Install clang-format run: | - sudo apt-get update - sudo apt-get install -y clang-format-11 + sudo apt-get install -y lsb-release wget software-properties-common gnupg + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + yes | sudo ./llvm.sh 18 all - uses: actions/checkout@v3 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} + + - name: Check and fix source format + run: python3 scripts/run-clang-format.py --in-place --clang-format-executable /usr/bin/clang-format-18 -r src/ - - name: Check source format - run: python3 scripts/run-clang-format.py --clang-format-executable /usr/bin/clang-format-11 -r src/ + - name: Check and fix test format + run: python3 scripts/run-clang-format.py --in-place --clang-format-executable /usr/bin/clang-format-18 -r test/ - - name: Check test format - run: python3 scripts/run-clang-format.py --clang-format-executable /usr/bin/clang-format-11 -r test/ + - name: Check and fix extension format + run: python3 scripts/run-clang-format.py --in-place --clang-format-executable /usr/bin/clang-format-18 -r extension/ - - name: Check extension format - run: python3 scripts/run-clang-format.py --clang-format-executable /usr/bin/clang-format-11 -r extension/ + - name: Commit changes + uses: EndBug/add-and-commit@v9 + if: github.ref != 'refs/heads/master' + with: + author_name: "CI Bot" + message: "Run clang-format" python-lint-check: name: python lint check @@ -379,7 +391,7 @@ jobs: macos-clang-tidy: name: macos clang tidy & clangd diagnostics check - needs: [clang-formatting-check, sanity-checks] + needs: [clang-format, sanity-checks] runs-on: self-hosted-mac-x64 env: NUM_THREADS: 32 @@ -404,8 +416,7 @@ jobs: macos-build-test: name: apple clang build & test - needs: - [clang-formatting-check, sanity-checks, rustfmt-check, python-lint-check] + needs: [clang-format, sanity-checks, rustfmt-check, python-lint-check] runs-on: self-hosted-mac-x64 env: NUM_THREADS: 32 @@ -475,7 +486,7 @@ jobs: shell-test: name: shell test runs-on: ubuntu-latest - needs: [clang-formatting-check, sanity-checks] + needs: [clang-format, sanity-checks] env: WERROR: 0 steps: diff --git a/extension/duckdb_scanner/src/duckdb_catalog.cpp b/extension/duckdb_scanner/src/duckdb_catalog.cpp index 9b034758374..cf11fea6ac8 100644 --- a/extension/duckdb_scanner/src/duckdb_catalog.cpp +++ b/extension/duckdb_scanner/src/duckdb_catalog.cpp @@ -7,8 +7,8 @@ namespace kuzu { namespace duckdb_scanner { -void DuckDBCatalogContent::init( - const std::string& dbPath, const std::string& catalogName, main::ClientContext* context) { +void DuckDBCatalogContent::init(const std::string& dbPath, const std::string& catalogName, + main::ClientContext* context) { auto [db, con] = getConnection(dbPath); auto query = common::stringFormat( "select table_name from information_schema.tables where table_catalog = '{}' and " @@ -18,12 +18,14 @@ void DuckDBCatalogContent::init( std::unique_ptr resultChunk; try { resultChunk = result->Fetch(); - } catch (std::exception& e) { throw common::BinderException(e.what()); } + } catch (std::exception& e) { + throw common::BinderException(e.what()); + } if (resultChunk->size() == 0) { return; } - common::ValueVector tableNamesVector{ - *common::LogicalType::STRING(), context->getMemoryManager()}; + common::ValueVector tableNamesVector{*common::LogicalType::STRING(), + context->getMemoryManager()}; duckdb_scanner::duckdb_conversion_func_t conversionFunc; duckdb_scanner::getDuckDBVectorConversionFunc(common::PhysicalTypeID::STRING, conversionFunc); conversionFunc(resultChunk->data[0], tableNamesVector, resultChunk->size()); @@ -36,8 +38,8 @@ void DuckDBCatalogContent::init( static std::string getQuery(const binder::BoundCreateTableInfo& info) { auto extraInfo = common::ku_dynamic_cast(info.extraInfo.get()); - return common::stringFormat( - "SELECT * FROM {}.{}.{}", extraInfo->catalogName, extraInfo->schemaName, info.tableName); + return common::stringFormat("SELECT * FROM {}.{}.{}", extraInfo->catalogName, + extraInfo->schemaName, info.tableName); } void DuckDBCatalogContent::createForeignTable(duckdb::Connection& con, const std::string& tableName, @@ -57,8 +59,8 @@ void DuckDBCatalogContent::createForeignTable(duckdb::Connection& con, const std } DuckDBScanBindData bindData(getQuery(*info), std::move(columnTypes), std::move(columnNames), std::bind(&DuckDBCatalogContent::getConnection, this, dbPath)); - auto tableEntry = std::make_unique( - info->tableName, tableID, getScanFunction(std::move(bindData))); + auto tableEntry = std::make_unique(info->tableName, tableID, + getScanFunction(std::move(bindData))); for (auto& propertyInfo : extraInfo->propertyInfos) { tableEntry->addProperty(propertyInfo.name, propertyInfo.type.copy()); } @@ -82,7 +84,9 @@ static bool getTableInfo(duckdb::Connection& con, const std::string& tableName, try { columnTypes.push_back(DuckDBTypeConverter::convertDuckDBType( result->GetValue(0, i).GetValue())); - } catch (common::BinderException& e) { return false; } + } catch (common::BinderException& e) { + return false; + } columnNames.push_back(result->GetValue(1, i).GetValue()); } return true; @@ -92,8 +96,8 @@ bool DuckDBCatalogContent::bindPropertyInfos(duckdb::Connection& con, const std: const std::string& catalogName, std::vector& propertyInfos) { std::vector columnTypes; std::vector columnNames; - if (!getTableInfo( - con, tableName, getDefaultSchemaName(), catalogName, columnTypes, columnNames)) { + if (!getTableInfo(con, tableName, getDefaultSchemaName(), catalogName, columnTypes, + columnNames)) { return false; } for (auto i = 0u; i < columnNames.size(); i++) { @@ -111,8 +115,8 @@ std::unique_ptr DuckDBCatalogContent::bindCreateTa return nullptr; } return std::make_unique(common::TableType::FOREIGN, tableName, - std::make_unique( - dbPath, catalogName, getDefaultSchemaName(), std::move(propertyInfos))); + std::make_unique(dbPath, catalogName, + getDefaultSchemaName(), std::move(propertyInfos))); } std::string DuckDBCatalogContent::getDefaultSchemaName() const { diff --git a/extension/duckdb_scanner/src/duckdb_scan.cpp b/extension/duckdb_scanner/src/duckdb_scan.cpp index 095c5086e89..e1ac8454e00 100644 --- a/extension/duckdb_scanner/src/duckdb_scan.cpp +++ b/extension/duckdb_scanner/src/duckdb_scan.cpp @@ -9,8 +9,8 @@ using namespace kuzu::common; namespace kuzu { namespace duckdb_scanner { -void getDuckDBVectorConversionFunc( - PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func); +void getDuckDBVectorConversionFunc(PhysicalTypeID physicalTypeID, + duckdb_conversion_func_t& conversion_func); DuckDBScanBindData::DuckDBScanBindData(std::string query, std::vector columnTypes, std::vector columnNames, @@ -19,8 +19,8 @@ DuckDBScanBindData::DuckDBScanBindData(std::string query, initDuckDBConn{std::move(initDuckDBConn)} { conversionFunctions.resize(this->columnTypes.size()); for (auto i = 0u; i < this->columnTypes.size(); i++) { - getDuckDBVectorConversionFunc( - this->columnTypes[i].getPhysicalType(), conversionFunctions[i]); + getDuckDBVectorConversionFunc(this->columnTypes[i].getPhysicalType(), + conversionFunctions[i]); } } @@ -34,8 +34,8 @@ DuckDBScanSharedState::DuckDBScanSharedState(std::unique_ptr bindFunc(DuckDBScanBindData bindData, main::ClientContext* /*context*/, function::TableFuncBindInput* input); @@ -68,8 +68,8 @@ std::unique_ptr DuckDBScanFunction::initLocalStat } template -void convertDuckDBVectorToVector( - duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { +void convertDuckDBVectorToVector(duckdb::Vector& duckDBVector, ValueVector& result, + uint64_t numValuesToCopy) { auto duckDBData = (T*)duckDBVector.GetData(); auto validityMasks = duckdb::FlatVector::Validity(duckDBVector); memcpy(result.getData(), duckDBData, numValuesToCopy * result.getNumBytesPerValue()); @@ -79,15 +79,15 @@ void convertDuckDBVectorToVector( } template<> -void convertDuckDBVectorToVector( - duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy); +void convertDuckDBVectorToVector(duckdb::Vector& duckDBVector, ValueVector& result, + uint64_t numValuesToCopy); template<> -void convertDuckDBVectorToVector( - duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy); +void convertDuckDBVectorToVector(duckdb::Vector& duckDBVector, ValueVector& result, + uint64_t numValuesToCopy); template<> -void convertDuckDBVectorToVector( - duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { +void convertDuckDBVectorToVector(duckdb::Vector& duckDBVector, ValueVector& result, + uint64_t numValuesToCopy) { auto strs = reinterpret_cast(duckDBVector.GetData()); auto validityMasks = duckdb::FlatVector::Validity(duckDBVector); for (auto i = 0u; i < numValuesToCopy; i++) { @@ -98,8 +98,8 @@ void convertDuckDBVectorToVector( } } -void getDuckDBVectorConversionFunc( - PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func) { +void getDuckDBVectorConversionFunc(PhysicalTypeID physicalTypeID, + duckdb_conversion_func_t& conversion_func) { switch (physicalTypeID) { case PhysicalTypeID::BOOL: { conversion_func = convertDuckDBVectorToVector; @@ -155,10 +155,10 @@ void getDuckDBVectorConversionFunc( } template<> -void convertDuckDBVectorToVector( - duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { - memcpy( - result.getData(), duckDBVector.GetData(), numValuesToCopy * result.getNumBytesPerValue()); +void convertDuckDBVectorToVector(duckdb::Vector& duckDBVector, ValueVector& result, + uint64_t numValuesToCopy) { + memcpy(result.getData(), duckDBVector.GetData(), + numValuesToCopy * result.getNumBytesPerValue()); auto numValuesInDataVec = 0; auto listEntries = reinterpret_cast(duckDBVector.GetData()); auto validityMasks = duckdb::FlatVector::Validity(duckDBVector); @@ -176,8 +176,8 @@ void convertDuckDBVectorToVector( } template<> -void convertDuckDBVectorToVector( - duckdb::Vector& duckDBVector, ValueVector& result, uint64_t numValuesToCopy) { +void convertDuckDBVectorToVector(duckdb::Vector& duckDBVector, ValueVector& result, + uint64_t numValuesToCopy) { auto& duckdbChildrenVectors = duckdb::StructVector::GetEntries(duckDBVector); for (auto i = 0u; i < duckdbChildrenVectors.size(); i++) { duckdb_conversion_func_t conversionFunc; @@ -193,19 +193,21 @@ static void convertDuckDBResultToVector(duckdb::DataChunk& duckDBResult, DataChu for (auto i = 0u; i < conversionFuncs.size(); i++) { result.state->selVector->selectedSize = duckDBResult.size(); assert(duckDBResult.data[i].GetVectorType() == duckdb::VectorType::FLAT_VECTOR); - conversionFuncs[i]( - duckDBResult.data[i], *result.getValueVector(i), result.state->selVector->selectedSize); + conversionFuncs[i](duckDBResult.data[i], *result.getValueVector(i), + result.state->selVector->selectedSize); } } -common::offset_t DuckDBScanFunction::tableFunc( - function::TableFuncInput& input, function::TableFuncOutput& output) { +common::offset_t DuckDBScanFunction::tableFunc(function::TableFuncInput& input, + function::TableFuncOutput& output) { auto duckdbScanSharedState = reinterpret_cast(input.sharedState); auto duckdbScanBindData = reinterpret_cast(input.bindData); std::unique_ptr result; try { result = duckdbScanSharedState->queryResult->Fetch(); - } catch (std::exception& e) { return 0; } + } catch (std::exception& e) { + return 0; + } if (result == nullptr) { return 0; } diff --git a/extension/duckdb_scanner/src/duckdb_storage.cpp b/extension/duckdb_scanner/src/duckdb_storage.cpp index 1938c5a69df..78dc791bc3c 100644 --- a/extension/duckdb_scanner/src/duckdb_storage.cpp +++ b/extension/duckdb_scanner/src/duckdb_storage.cpp @@ -7,8 +7,8 @@ namespace kuzu { namespace duckdb_scanner { -std::unique_ptr attachDuckDB( - std::string dbName, std::string dbPath, main::ClientContext* clientContext) { +std::unique_ptr attachDuckDB(std::string dbName, std::string dbPath, + main::ClientContext* clientContext) { if (dbName == "") { if (dbPath.find('.') != std::string::npos) { auto fileNamePos = dbPath.find_last_of('/') + 1; diff --git a/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp b/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp index caf1267e7a2..fcc1c5c522a 100644 --- a/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp +++ b/extension/duckdb_scanner/src/duckdb_table_catalog_entry.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace catalog { -DuckDBTableCatalogEntry::DuckDBTableCatalogEntry( - std::string name, common::table_id_t tableID, function::TableFunction scanFunction) +DuckDBTableCatalogEntry::DuckDBTableCatalogEntry(std::string name, common::table_id_t tableID, + function::TableFunction scanFunction) : TableCatalogEntry{CatalogEntryType::FOREIGN_TABLE_ENTRY, std::move(name), tableID}, scanFunction{std::move(scanFunction)} {} diff --git a/extension/duckdb_scanner/src/duckdb_type_converter.cpp b/extension/duckdb_scanner/src/duckdb_type_converter.cpp index 811dbb4f6d2..f7212080145 100644 --- a/extension/duckdb_scanner/src/duckdb_type_converter.cpp +++ b/extension/duckdb_scanner/src/duckdb_type_converter.cpp @@ -65,8 +65,8 @@ common::LogicalType DuckDBTypeConverter::convertDuckDBType(std::string typeStr) return *LogicalType::STRUCT(parseStructTypeInfo(typeStr)); } else if (typeStr.starts_with("UNION")) { auto unionFields = parseStructTypeInfo(typeStr); - auto unionTagField = StructField( - UnionType::TAG_FIELD_NAME, std::make_unique(UnionType::TAG_FIELD_TYPE)); + auto unionTagField = StructField(UnionType::TAG_FIELD_NAME, + std::make_unique(UnionType::TAG_FIELD_TYPE)); unionFields.insert(unionFields.begin(), std::move(unionTagField)); return *LogicalType::UNION(std::move(unionFields)); } else if (typeStr.starts_with("MAP")) { @@ -74,8 +74,8 @@ common::LogicalType DuckDBTypeConverter::convertDuckDBType(std::string typeStr) auto rightBracketPos = typeStr.find_last_of(')'); auto mapTypeStr = typeStr.substr(leftBracketPos + 1, rightBracketPos - leftBracketPos - 1); auto keyValueTypes = StringUtils::splitComma(mapTypeStr); - return *LogicalType::MAP( - convertDuckDBType(keyValueTypes[0]), convertDuckDBType(keyValueTypes[1])); + return *LogicalType::MAP(convertDuckDBType(keyValueTypes[0]), + convertDuckDBType(keyValueTypes[1])); } throw BinderException{stringFormat("Unsupported duckdb type: {}.", typeStr)}; } diff --git a/extension/duckdb_scanner/src/include/duckdb_catalog.h b/extension/duckdb_scanner/src/include/duckdb_catalog.h index 3f72f5878ea..2ecb068003c 100644 --- a/extension/duckdb_scanner/src/include/duckdb_catalog.h +++ b/extension/duckdb_scanner/src/include/duckdb_catalog.h @@ -29,8 +29,8 @@ class DuckDBCatalogContent : public catalog::CatalogContent { public: DuckDBCatalogContent() : catalog::CatalogContent{nullptr /* vfs */} {} - virtual void init( - const std::string& dbPath, const std::string& catalogName, main::ClientContext* context); + virtual void init(const std::string& dbPath, const std::string& catalogName, + main::ClientContext* context); protected: bool bindPropertyInfos(duckdb::Connection& con, const std::string& tableName, diff --git a/extension/duckdb_scanner/src/include/duckdb_scan.h b/extension/duckdb_scanner/src/include/duckdb_scan.h index cb435bab4fe..28c2c600247 100644 --- a/extension/duckdb_scanner/src/include/duckdb_scan.h +++ b/extension/duckdb_scanner/src/include/duckdb_scan.h @@ -16,8 +16,8 @@ namespace kuzu { namespace duckdb_scanner { -using duckdb_conversion_func_t = std::function; +using duckdb_conversion_func_t = std::function; using init_duckdb_conn_t = std::function()>; struct DuckDBScanBindData : public function::TableFuncBindData { @@ -37,8 +37,8 @@ struct DuckDBScanSharedState : public function::TableFuncSharedState { std::unique_ptr queryResult; }; -void getDuckDBVectorConversionFunc( - common::PhysicalTypeID physicalTypeID, duckdb_conversion_func_t& conversion_func); +void getDuckDBVectorConversionFunc(common::PhysicalTypeID physicalTypeID, + duckdb_conversion_func_t& conversion_func); function::TableFunction getScanFunction(DuckDBScanBindData bindData); diff --git a/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h b/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h index b896fc6ec2a..8ba4b5bdb92 100644 --- a/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h +++ b/extension/duckdb_scanner/src/include/duckdb_table_catalog_entry.h @@ -11,8 +11,8 @@ class DuckDBTableCatalogEntry final : public TableCatalogEntry { //===--------------------------------------------------------------------===// // constructors //===--------------------------------------------------------------------===// - DuckDBTableCatalogEntry( - std::string name, common::table_id_t tableID, function::TableFunction scanFunction); + DuckDBTableCatalogEntry(std::string name, common::table_id_t tableID, + function::TableFunction scanFunction); //===--------------------------------------------------------------------===// // getter & setter diff --git a/extension/httpfs/src/crypto.cpp b/extension/httpfs/src/crypto.cpp index 4d345170e80..637f79754ec 100644 --- a/extension/httpfs/src/crypto.cpp +++ b/extension/httpfs/src/crypto.cpp @@ -26,10 +26,10 @@ void hmac256(const std::string& message, const char* secret, size_t secretLen, h } if (mbedtls_md_setup(&hmacCtx, mdType, 1) || - mbedtls_md_hmac_starts( - &hmacCtx, reinterpret_cast(secret), secretLen) || - mbedtls_md_hmac_update( - &hmacCtx, reinterpret_cast(message.c_str()), message.length()) || + mbedtls_md_hmac_starts(&hmacCtx, reinterpret_cast(secret), + secretLen) || + mbedtls_md_hmac_update(&hmacCtx, reinterpret_cast(message.c_str()), + message.length()) || mbedtls_md_hmac_finish(&hmacCtx, reinterpret_cast(out))) { throw common::RuntimeException("HMAC256 Error"); } diff --git a/extension/httpfs/src/httpfs.cpp b/extension/httpfs/src/httpfs.cpp index 3da57dedf63..e0e1d9ac000 100644 --- a/extension/httpfs/src/httpfs.cpp +++ b/extension/httpfs/src/httpfs.cpp @@ -16,8 +16,8 @@ HTTPResponse::HTTPResponse(httplib::Response& res, const std::string& url) } HTTPFileInfo::HTTPFileInfo(std::string path, FileSystem* fileSystem, int flags) - : FileInfo{std::move(path), fileSystem}, flags{flags}, length{0}, - availableBuffer{0}, bufferIdx{0}, fileOffset{0}, bufferStartPos{0}, bufferEndPos{0} {} + : FileInfo{std::move(path), fileSystem}, flags{flags}, length{0}, availableBuffer{0}, + bufferIdx{0}, fileOffset{0}, bufferStartPos{0}, bufferEndPos{0} {} void HTTPFileInfo::initialize() { initializeClient(); @@ -40,8 +40,8 @@ void HTTPFileInfo::initialize() { hfs->getRangeRequest(this, this->path, {}, 0, nullptr /* buffer */, 2); if (rangeRequest->code != 206) { // LCOV_EXCL_START - throw IOException(stringFormat( - "Unable to connect to URL \"{}\": {} ({})", this->path, res->code, res->error)); + throw IOException(stringFormat("Unable to connect to URL \"{}\": {} ({})", + this->path, res->code, res->error)); // LCOV_EXCL_STOP } auto rangeFound = rangeRequest->headers["Content-Range"].find("/"); @@ -92,13 +92,13 @@ void HTTPFileInfo::initialize() { } } catch (std::invalid_argument& e) { // LCOV_EXCL_START - throw IOException(stringFormat( - "Invalid Content-Length header received: {}", res->headers["Content-Length"])); + throw IOException(stringFormat("Invalid Content-Length header received: {}", + res->headers["Content-Length"])); // LCOV_EXCL_STOP } catch (std::out_of_range& e) { // LCOV_EXCL_START - throw IOException(stringFormat( - "Invalid Content-Length header received: {}", res->headers["Content-Length"])); + throw IOException(stringFormat("Invalid Content-Length header received: {}", + res->headers["Content-Length"])); // LCOV_EXCL_STOP } } @@ -116,8 +116,8 @@ std::unique_ptr HTTPFileSystem::openFile(const std::string& pa return std::move(httpFileInfo); } -std::vector HTTPFileSystem::glob( - main::ClientContext* /*context*/, const std::string& path) const { +std::vector HTTPFileSystem::glob(main::ClientContext* /*context*/, + const std::string& path) const { // Glob is not supported on HTTPFS, simply return the path itself. return {path}; } @@ -126,8 +126,8 @@ bool HTTPFileSystem::canHandleFile(const std::string& path) const { return path.rfind("https://", 0) == 0 || path.rfind("http://", 0) == 0; } -void HTTPFileSystem::readFromFile( - common::FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const { +void HTTPFileSystem::readFromFile(common::FileInfo* fileInfo, void* buffer, uint64_t numBytes, + uint64_t position) const { auto httpFileInfo = ku_dynamic_cast(fileInfo); auto numBytesToRead = numBytes; auto bufferOffset = 0; @@ -158,8 +158,8 @@ void HTTPFileSystem::readFromFile( } if (numBytesToRead > 0 && httpFileInfo->availableBuffer == 0) { - auto newBufferAvailableSize = std::min( - httpFileInfo->READ_BUFFER_LEN, httpFileInfo->length - httpFileInfo->fileOffset); + auto newBufferAvailableSize = std::min(httpFileInfo->READ_BUFFER_LEN, + httpFileInfo->length - httpFileInfo->fileOffset); // Bypass buffer if we read more than buffer size. if (numBytesToRead > newBufferAvailableSize) { @@ -261,7 +261,9 @@ std::unique_ptr HTTPFileSystem::runRequestWithRetry( status = res->status; response = res.value(); } - } catch (IOException& e) { exception = std::current_exception(); } + } catch (IOException& e) { + exception = std::current_exception(); + } if (err == httplib::Error::Success) { switch (status) { @@ -292,8 +294,8 @@ std::unique_ptr HTTPFileSystem::runRequestWithRetry( std::rethrow_exception(exception); } else if (err == httplib::Error::Success) { // LCOV_EXCL_START - throw IOException(stringFormat( - "Request returned HTTP {} for HTTP {} to '{}'", status, method, url)); + throw IOException(stringFormat("Request returned HTTP {} for HTTP {} to '{}'", + status, method, url)); // LCOV_EXCL_STOP } else { // LCOV_EXCL_START @@ -305,8 +307,8 @@ std::unique_ptr HTTPFileSystem::runRequestWithRetry( } } -std::unique_ptr HTTPFileSystem::headRequest( - FileInfo* fileInfo, const std::string& url, HeaderMap headerMap) const { +std::unique_ptr HTTPFileSystem::headRequest(FileInfo* fileInfo, + const std::string& url, HeaderMap headerMap) const { auto httpFileInfo = ku_dynamic_cast(fileInfo); auto parsedURL = parseUrl(url); auto host = parsedURL.first; @@ -330,8 +332,8 @@ std::unique_ptr HTTPFileSystem::getRangeRequest(FileInfo* fileInfo auto hostPath = parsedURL.second; auto headers = getHTTPHeaders(headerMap); - headers->insert(std::make_pair( - "Range", stringFormat("bytes={}-{}", fileOffset, fileOffset + bufferLen - 1))); + headers->insert(std::make_pair("Range", + stringFormat("bytes={}-{}", fileOffset, fileOffset + bufferLen - 1))); uint64_t bufferOffset = 0; diff --git a/extension/httpfs/src/httpfs_extension.cpp b/extension/httpfs/src/httpfs_extension.cpp index 61b358d777f..1814a55a815 100644 --- a/extension/httpfs/src/httpfs_extension.cpp +++ b/extension/httpfs/src/httpfs_extension.cpp @@ -12,18 +12,18 @@ void HttpfsExtension::load(main::ClientContext* context) { db->registerFileSystem(std::make_unique()); db->registerFileSystem(std::make_unique()); db->addExtensionOption("s3_access_key_id", common::LogicalTypeID::STRING, common::Value{""}); - db->addExtensionOption( - "s3_secret_access_key", common::LogicalTypeID::STRING, common::Value{""}); - db->addExtensionOption( - "s3_endpoint", common::LogicalTypeID::STRING, common::Value{"s3.amazonaws.com"}); + db->addExtensionOption("s3_secret_access_key", common::LogicalTypeID::STRING, + common::Value{""}); + db->addExtensionOption("s3_endpoint", common::LogicalTypeID::STRING, + common::Value{"s3.amazonaws.com"}); db->addExtensionOption("s3_url_style", common::LogicalTypeID::STRING, common::Value{"vhost"}); db->addExtensionOption("s3_region", common::LogicalTypeID::STRING, common::Value{"us-east-1"}); db->addExtensionOption("s3_uploader_max_num_parts_per_file", common::LogicalTypeID::INT64, common::Value{(int64_t)800000000000}); - db->addExtensionOption( - "s3_uploader_max_filesize", common::LogicalTypeID::INT64, common::Value{(int64_t)10000}); - db->addExtensionOption( - "s3_uploader_threads_limit", common::LogicalTypeID::INT64, common::Value{(int64_t)50}); + db->addExtensionOption("s3_uploader_max_filesize", common::LogicalTypeID::INT64, + common::Value{(int64_t)10000}); + db->addExtensionOption("s3_uploader_threads_limit", common::LogicalTypeID::INT64, + common::Value{(int64_t)50}); AWSEnvironmentCredentialsProvider::setOptionValue(context); } diff --git a/extension/httpfs/src/include/httpfs.h b/extension/httpfs/src/include/httpfs.h index 5aaa6fc3507..47d377c8db3 100644 --- a/extension/httpfs/src/include/httpfs.h +++ b/extension/httpfs/src/include/httpfs.h @@ -63,8 +63,8 @@ class HTTPFileSystem : public common::FileSystem { main::ClientContext* context = nullptr, common::FileLockType lock_type = common::FileLockType::NO_LOCK) override; - std::vector glob( - main::ClientContext* context, const std::string& path) const override; + std::vector glob(main::ClientContext* context, + const std::string& path) const override; bool canHandleFile(const std::string& path) const override; @@ -88,8 +88,8 @@ class HTTPFileSystem : public common::FileSystem { const std::function& request, const std::string& url, std::string method, const std::function& retry = {}); - virtual std::unique_ptr headRequest( - common::FileInfo* fileInfo, const std::string& url, HeaderMap headerMap) const; + virtual std::unique_ptr headRequest(common::FileInfo* fileInfo, + const std::string& url, HeaderMap headerMap) const; virtual std::unique_ptr getRangeRequest(common::FileInfo* fileInfo, const std::string& url, HeaderMap headerMap, uint64_t fileOffset, char* buffer, diff --git a/extension/httpfs/src/include/s3fs.h b/extension/httpfs/src/include/s3fs.h index b7ee438acf9..925a14db232 100644 --- a/extension/httpfs/src/include/s3fs.h +++ b/extension/httpfs/src/include/s3fs.h @@ -112,8 +112,8 @@ class S3FileSystem final : public HTTPFileSystem { main::ClientContext* context = nullptr, common::FileLockType lock_type = common::FileLockType::NO_LOCK) override; - std::vector glob( - main::ClientContext* context, const std::string& path) const override; + std::vector glob(main::ClientContext* context, + const std::string& path) const override; bool canHandleFile(const std::string& path) const override; @@ -128,8 +128,8 @@ class S3FileSystem final : public HTTPFileSystem { void writeFile(common::FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, uint64_t offset) const override; - std::shared_ptr allocateWriteBuffer( - uint16_t writeBufferIdx, uint64_t partSize, uint16_t maxThreads); + std::shared_ptr allocateWriteBuffer(uint16_t writeBufferIdx, uint64_t partSize, + uint16_t maxThreads); void flushAllBuffers(S3FileInfo* fileInfo); @@ -140,8 +140,8 @@ class S3FileSystem final : public HTTPFileSystem { std::string payloadHash = "", std::string contentType = ""); protected: - std::unique_ptr headRequest( - common::FileInfo* fileInfo, const std::string& url, HeaderMap headerMap) const override; + std::unique_ptr headRequest(common::FileInfo* fileInfo, const std::string& url, + HeaderMap headerMap) const override; std::unique_ptr getRangeRequest(common::FileInfo* fileInfo, const std::string& url, HeaderMap headerMap, uint64_t fileOffset, char* buffer, @@ -179,8 +179,8 @@ struct AWSListObjectV2 { static constexpr char OPEN_PREFIX_TAG[] = ""; static constexpr char CLOSE_PREFIX_TAG[] = ""; - static std::string request( - std::string& path, S3AuthParams& authParams, std::string& continuationToken); + static std::string request(std::string& path, S3AuthParams& authParams, + std::string& continuationToken); static void parseKey(std::string& awsResponse, std::vector& result); static std::vector parseCommonPrefix(std::string& awsResponse); static std::string parseContinuationToken(std::string& awsResponse); diff --git a/extension/httpfs/src/s3fs.cpp b/extension/httpfs/src/s3fs.cpp index 8b70e88ab29..fc3e0578bf7 100644 --- a/extension/httpfs/src/s3fs.cpp +++ b/extension/httpfs/src/s3fs.cpp @@ -130,7 +130,7 @@ std::unique_ptr S3FileSystem::openFile(const std::string& path bool likes(const char* string, uint64_t slen, const char* pattern, uint64_t plen) { uint64_t sidx = 0; uint64_t pidx = 0; -main_loop : { +main_loop: { // main matching loop while (sidx < slen && pidx < plen) { char s = string[sidx]; @@ -188,7 +188,7 @@ main_loop : { // we are finished only if we have consumed the full pattern return pidx == plen && sidx == slen; } -parse_bracket : { +parse_bracket: { // inside a bracket if (pidx == plen) { return false; @@ -287,8 +287,8 @@ static bool match(std::vector::const_iterator key, return key == key_end && pattern == pattern_end; } -std::vector S3FileSystem::glob( - main::ClientContext* context, const std::string& path) const { +std::vector S3FileSystem::glob(main::ClientContext* context, + const std::string& path) const { auto s3AuthParams = getS3AuthParams(context); auto parsedS3URL = parseS3URL(path, s3AuthParams); auto parsedGlobURL = parsedS3URL.trimmedS3URL; @@ -311,8 +311,8 @@ std::vector S3FileSystem::glob( commonPrefixes.pop_back(); std::string commonPrefixContinuationToken = ""; do { - auto prefixRequest = AWSListObjectV2::request( - prefixPath, s3AuthParams, commonPrefixContinuationToken); + auto prefixRequest = AWSListObjectV2::request(prefixPath, s3AuthParams, + commonPrefixContinuationToken); AWSListObjectV2::parseKey(prefixRequest, s3Keys); auto commonPrefixesToInsert = AWSListObjectV2::parseCommonPrefix(prefixRequest); commonPrefixes.insert(commonPrefixes.end(), commonPrefixesToInsert.begin(), @@ -455,8 +455,8 @@ std::string S3FileSystem::initializeMultiPartUpload(S3FileInfo* fileInfo) const return getUploadID(result); } -void S3FileSystem::writeFile( - common::FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, uint64_t offset) const { +void S3FileSystem::writeFile(common::FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, + uint64_t offset) const { auto s3FileInfo = ku_dynamic_cast(fileInfo); if (!((s3FileInfo->flags & O_ACCMODE) & O_WRONLY)) { throw IOException("Write called on a file which is not open in write mode."); @@ -485,8 +485,8 @@ void S3FileSystem::writeFile( } } -std::shared_ptr S3FileSystem::allocateWriteBuffer( - uint16_t writeBufferIdx, uint64_t partSize, uint16_t maxThreads) { +std::shared_ptr S3FileSystem::allocateWriteBuffer(uint16_t writeBufferIdx, + uint64_t partSize, uint16_t maxThreads) { std::unique_lock lck(bufferInfoLock); if (numUsedBuffers >= maxThreads) { bufferInfoCV.wait(lck, [&] { return numUsedBuffers < maxThreads; }); @@ -509,8 +509,8 @@ void S3FileSystem::flushAllBuffers(S3FileInfo* fileInfo) { } } std::unique_lock lck(fileInfo->uploadsInProgressLock); - fileInfo->uploadsInProgressCV.wait( - lck, [fileInfo] { return fileInfo->uploadsInProgress == 0; }); + fileInfo->uploadsInProgressCV.wait(lck, + [fileInfo] { return fileInfo->uploadsInProgress == 0; }); fileInfo->rethrowIOError(); } @@ -650,8 +650,8 @@ HeaderMap S3FileSystem::createS3Header(std::string url, std::string query, std:: return res; } -std::unique_ptr S3FileSystem::headRequest( - common::FileInfo* fileInfo, const std::string& url, HeaderMap /*headerMap*/) const { +std::unique_ptr S3FileSystem::headRequest(common::FileInfo* fileInfo, + const std::string& url, HeaderMap /*headerMap*/) const { auto& authParams = ku_dynamic_cast(fileInfo)->authParams; auto parsedS3URL = parseS3URL(url, authParams); auto httpURL = parsedS3URL.getHTTPURL(); @@ -666,8 +666,8 @@ std::unique_ptr S3FileSystem::getRangeRequest(common::FileInfo* fi auto parsedS3URL = parseS3URL(url, authParams); auto s3HTTPUrl = parsedS3URL.getHTTPURL(); auto headers = createS3Header(parsedS3URL.path, "", parsedS3URL.host, "s3", "GET", authParams); - return HTTPFileSystem::getRangeRequest( - fileInfo, s3HTTPUrl, headers, fileOffset, buffer, bufferLen); + return HTTPFileSystem::getRangeRequest(fileInfo, s3HTTPUrl, headers, fileOffset, buffer, + bufferLen); } std::unique_ptr S3FileSystem::postRequest(common::FileInfo* fileInfo, @@ -680,8 +680,8 @@ std::unique_ptr S3FileSystem::postRequest(common::FileInfo* fileIn auto payloadHash = getPayloadHash(inputBuffer, inputBufferLen); auto headers = createS3Header(parsedS3URL.path, httpParams, parsedS3URL.host, "s3", "POST", authParams, payloadHash, "application/octet-stream"); - return HTTPFileSystem::postRequest( - fileInfo, httpURL, headers, outputBuffer, outputBufferLen, inputBuffer, inputBufferLen); + return HTTPFileSystem::postRequest(fileInfo, httpURL, headers, outputBuffer, outputBufferLen, + inputBuffer, inputBufferLen); } std::unique_ptr S3FileSystem::putRequest(common::FileInfo* fileInfo, @@ -708,8 +708,8 @@ std::string S3FileSystem::getPayloadHash(const uint8_t* buffer, uint64_t bufferL } } -void S3FileSystem::flushBuffer( - S3FileInfo* fileInfo, std::shared_ptr bufferToFlush) const { +void S3FileSystem::flushBuffer(S3FileInfo* fileInfo, + std::shared_ptr bufferToFlush) const { if (bufferToFlush->numBytesWritten == 0) { return; } @@ -734,8 +734,8 @@ void S3FileSystem::flushBuffer( uploadThread.detach(); } -void S3FileSystem::uploadBuffer( - S3FileInfo* fileInfo, std::shared_ptr bufferToUpload) { +void S3FileSystem::uploadBuffer(S3FileInfo* fileInfo, + std::shared_ptr bufferToUpload) { auto s3FileSystem = ku_dynamic_cast(fileInfo->fileSystem); std::string queryParam = "partNumber=" + std::to_string(bufferToUpload->partID + 1) + "&" + @@ -797,8 +797,8 @@ std::string S3FileSystem::getUploadID(const std::string& response) { return response.substr(openTagPos, closeTagPos - openTagPos); } -std::string AWSListObjectV2::request( - std::string& path, S3AuthParams& authParams, std::string& continuationToken) { +std::string AWSListObjectV2::request(std::string& path, S3AuthParams& authParams, + std::string& continuationToken) { auto parsedURL = S3FileSystem::parseS3URL(path, authParams); std::string requestPath; if (authParams.urlStyle == "path") { @@ -830,8 +830,8 @@ std::string AWSListObjectV2::request( listObjectV2URL.c_str(), *headers, [&](const httplib::Response& response) { if (response.status >= 400) { - throw IOException{common::stringFormat( - "HTTP GET error on '{}' (HTTP {})", listObjectV2URL, response.status)}; + throw IOException{common::stringFormat("HTTP GET error on '{}' (HTTP {})", + listObjectV2URL, response.status)}; } return true; }, diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/aes.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/aes.h index e9466f8ad21..49bf0c97cb2 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/aes.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/aes.h @@ -160,8 +160,8 @@ void mbedtls_aes_xts_free(mbedtls_aes_xts_context* ctx); * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_aes_setkey_enc( - mbedtls_aes_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_aes_setkey_enc(mbedtls_aes_context* ctx, const unsigned char* key, + unsigned int keybits); /** * \brief This function sets the decryption key. @@ -179,8 +179,8 @@ int mbedtls_aes_setkey_enc( * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_aes_setkey_dec( - mbedtls_aes_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_aes_setkey_dec(mbedtls_aes_context* ctx, const unsigned char* key, + unsigned int keybits); #if defined(MBEDTLS_CIPHER_MODE_XTS) /** @@ -200,8 +200,8 @@ int mbedtls_aes_setkey_dec( * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_aes_xts_setkey_enc( - mbedtls_aes_xts_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context* ctx, const unsigned char* key, + unsigned int keybits); /** * \brief This function prepares an XTS context for decryption and @@ -220,8 +220,8 @@ int mbedtls_aes_xts_setkey_enc( * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_aes_xts_setkey_dec( - mbedtls_aes_xts_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context* ctx, const unsigned char* key, + unsigned int keybits); #endif /* MBEDTLS_CIPHER_MODE_XTS */ /** @@ -248,8 +248,8 @@ int mbedtls_aes_xts_setkey_dec( * \return \c 0 on success. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_aes_crypt_ecb( - mbedtls_aes_context* ctx, int mode, const unsigned char input[16], unsigned char output[16]); +int mbedtls_aes_crypt_ecb(mbedtls_aes_context* ctx, int mode, const unsigned char input[16], + unsigned char output[16]); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** @@ -567,8 +567,8 @@ int mbedtls_aes_crypt_ctr(mbedtls_aes_context* ctx, size_t length, size_t* nc_of * \return \c 0 on success. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_internal_aes_encrypt( - mbedtls_aes_context* ctx, const unsigned char input[16], unsigned char output[16]); +int mbedtls_internal_aes_encrypt(mbedtls_aes_context* ctx, const unsigned char input[16], + unsigned char output[16]); /** * \brief Internal AES block decryption function. This is only @@ -582,8 +582,8 @@ int mbedtls_internal_aes_encrypt( * \return \c 0 on success. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_internal_aes_decrypt( - mbedtls_aes_context* ctx, const unsigned char input[16], unsigned char output[16]); +int mbedtls_internal_aes_decrypt(mbedtls_aes_context* ctx, const unsigned char input[16], + unsigned char output[16]); #if defined(MBEDTLS_SELF_TEST) /** diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/aria.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/aria.h index c1bed14d24e..93b62ab30ea 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/aria.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/aria.h @@ -103,8 +103,8 @@ void mbedtls_aria_free(mbedtls_aria_context* ctx); * \return \c 0 on success. * \return A negative error code on failure. */ -int mbedtls_aria_setkey_enc( - mbedtls_aria_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_aria_setkey_enc(mbedtls_aria_context* ctx, const unsigned char* key, + unsigned int keybits); /** * \brief This function sets the decryption key. @@ -121,8 +121,8 @@ int mbedtls_aria_setkey_enc( * \return \c 0 on success. * \return A negative error code on failure. */ -int mbedtls_aria_setkey_dec( - mbedtls_aria_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_aria_setkey_dec(mbedtls_aria_context* ctx, const unsigned char* key, + unsigned int keybits); /** * \brief This function performs an ARIA single-block encryption or diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/asn1.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/asn1.h index 4d0ec240956..69f0c0cc2b5 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/asn1.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/asn1.h @@ -317,8 +317,8 @@ int mbedtls_asn1_get_enum(unsigned char** p, const unsigned char* end, int* val) * \return An ASN.1 error code if the input does not start with * a valid ASN.1 BIT STRING. */ -int mbedtls_asn1_get_bitstring( - unsigned char** p, const unsigned char* end, mbedtls_asn1_bitstring* bs); +int mbedtls_asn1_get_bitstring(unsigned char** p, const unsigned char* end, + mbedtls_asn1_bitstring* bs); /** * \brief Retrieve a bitstring ASN.1 tag without unused bits and its @@ -387,8 +387,8 @@ int mbedtls_asn1_get_bitstring_null(unsigned char** p, const unsigned char* end, * \return An ASN.1 error code if the input does not start with * a valid ASN.1 SEQUENCE. */ -int mbedtls_asn1_get_sequence_of( - unsigned char** p, const unsigned char* end, mbedtls_asn1_sequence* cur, int tag); +int mbedtls_asn1_get_sequence_of(unsigned char** p, const unsigned char* end, + mbedtls_asn1_sequence* cur, int tag); /** * \brief Free a heap-allocated linked list presentation of * an ASN.1 sequence, including the first element. @@ -540,8 +540,8 @@ int mbedtls_asn1_get_mpi(unsigned char** p, const unsigned char* end, mbedtls_mp * * \return 0 if successful or a specific ASN.1 or MPI error code. */ -int mbedtls_asn1_get_alg( - unsigned char** p, const unsigned char* end, mbedtls_asn1_buf* alg, mbedtls_asn1_buf* params); +int mbedtls_asn1_get_alg(unsigned char** p, const unsigned char* end, mbedtls_asn1_buf* alg, + mbedtls_asn1_buf* params); /** * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no @@ -570,8 +570,8 @@ int mbedtls_asn1_get_alg_null(unsigned char** p, const unsigned char* end, mbedt * * \return NULL if not found, or a pointer to the existing entry. */ -const mbedtls_asn1_named_data* mbedtls_asn1_find_named_data( - const mbedtls_asn1_named_data* list, const char* oid, size_t len); +const mbedtls_asn1_named_data* mbedtls_asn1_find_named_data(const mbedtls_asn1_named_data* list, + const char* oid, size_t len); /** * \brief Free a mbedtls_asn1_named_data entry diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/base64.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/base64.h index 7fca8a8f4d6..89c5ff25526 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/base64.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/base64.h @@ -54,8 +54,8 @@ extern "C" { * \note Call this function with dlen = 0 to obtain the * required buffer size in *olen */ -int mbedtls_base64_encode( - unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, size_t slen); +int mbedtls_base64_encode(unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, + size_t slen); /** * \brief Decode a base64-formatted buffer @@ -74,8 +74,8 @@ int mbedtls_base64_encode( * \note Call this function with *dst = NULL or dlen = 0 to obtain * the required buffer size in *olen */ -int mbedtls_base64_decode( - unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, size_t slen); +int mbedtls_base64_decode(unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, + size_t slen); #if defined(MBEDTLS_SELF_TEST) /** diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/bignum.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/bignum.h index 630dd0c6f08..8c87780e175 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/bignum.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/bignum.h @@ -434,8 +434,8 @@ int mbedtls_mpi_read_string(mbedtls_mpi* X, int radix, const char* s); * size of \p buf required for a successful call. * \return Another negative error code on different kinds of failure. */ -int mbedtls_mpi_write_string( - const mbedtls_mpi* X, int radix, char* buf, size_t buflen, size_t* olen); +int mbedtls_mpi_write_string(const mbedtls_mpi* X, int radix, char* buf, size_t buflen, + size_t* olen); #if defined(MBEDTLS_FS_IO) /** @@ -850,8 +850,8 @@ int mbedtls_mpi_exp_mod(mbedtls_mpi* X, const mbedtls_mpi* A, const mbedtls_mpi* * as a big-endian representation of an MPI; this can * be relevant in applications like deterministic ECDSA. */ -int mbedtls_mpi_fill_random( - mbedtls_mpi* X, size_t size, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); +int mbedtls_mpi_fill_random(mbedtls_mpi* X, size_t size, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); /** Generate a random number uniformly in a range. * @@ -946,8 +946,8 @@ int mbedtls_mpi_inv_mod(mbedtls_mpi* X, const mbedtls_mpi* A, const mbedtls_mpi* * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. * \return Another negative error code on other kinds of failure. */ -int mbedtls_mpi_is_prime_ext( - const mbedtls_mpi* X, int rounds, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); +int mbedtls_mpi_is_prime_ext(const mbedtls_mpi* X, int rounds, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); /** * \brief Flags for mbedtls_mpi_gen_prime() * diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/camellia.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/camellia.h index 30e7f25672b..f409c12374b 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/camellia.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/camellia.h @@ -86,8 +86,8 @@ void mbedtls_camellia_free(mbedtls_camellia_context* ctx); * \return \c 0 if successful. * \return A negative error code on failure. */ -int mbedtls_camellia_setkey_enc( - mbedtls_camellia_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_camellia_setkey_enc(mbedtls_camellia_context* ctx, const unsigned char* key, + unsigned int keybits); /** * \brief Perform a CAMELLIA key schedule operation for decryption. @@ -101,8 +101,8 @@ int mbedtls_camellia_setkey_enc( * \return \c 0 if successful. * \return A negative error code on failure. */ -int mbedtls_camellia_setkey_dec( - mbedtls_camellia_context* ctx, const unsigned char* key, unsigned int keybits); +int mbedtls_camellia_setkey_dec(mbedtls_camellia_context* ctx, const unsigned char* key, + unsigned int keybits); /** * \brief Perform a CAMELLIA-ECB block encryption/decryption operation. diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/ccm.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/ccm.h index d51849b1352..c8880f6883b 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/ccm.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/ccm.h @@ -357,8 +357,8 @@ int mbedtls_ccm_starts(mbedtls_ccm_context* ctx, int mode, const unsigned char* * \p ctx is in an invalid state, * \p total_ad_len is greater than \c 0xFF00. */ -int mbedtls_ccm_set_lengths( - mbedtls_ccm_context* ctx, size_t total_ad_len, size_t plaintext_len, size_t tag_len); +int mbedtls_ccm_set_lengths(mbedtls_ccm_context* ctx, size_t total_ad_len, size_t plaintext_len, + size_t tag_len); /** * \brief This function feeds an input buffer as associated data diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/cipher.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/cipher.h index ff68fce6b71..27bbd307a8f 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/cipher.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/cipher.h @@ -428,8 +428,8 @@ const mbedtls_cipher_info_t* mbedtls_cipher_info_from_type(const mbedtls_cipher_ * given \p cipher_id. * \return \c NULL if the associated cipher information is not found. */ -const mbedtls_cipher_info_t* mbedtls_cipher_info_from_values( - const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode); +const mbedtls_cipher_info_t* mbedtls_cipher_info_from_values(const mbedtls_cipher_id_t cipher_id, + int key_bitlen, const mbedtls_cipher_mode_t mode); /** * \brief Retrieve the identifier for a cipher info structure. @@ -649,8 +649,8 @@ int mbedtls_cipher_setup(mbedtls_cipher_context_t* ctx, const mbedtls_cipher_inf * \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the * cipher-specific context fails. */ -int mbedtls_cipher_setup_psa( - mbedtls_cipher_context_t* ctx, const mbedtls_cipher_info_t* cipher_info, size_t taglen); +int mbedtls_cipher_setup_psa(mbedtls_cipher_context_t* ctx, + const mbedtls_cipher_info_t* cipher_info, size_t taglen); #endif /* MBEDTLS_USE_PSA_CRYPTO */ /** @@ -987,8 +987,8 @@ int mbedtls_cipher_write_tag(mbedtls_cipher_context_t* ctx, unsigned char* tag, * \return \c 0 on success. * \return A specific error code on failure. */ -int mbedtls_cipher_check_tag( - mbedtls_cipher_context_t* ctx, const unsigned char* tag, size_t tag_len); +int mbedtls_cipher_check_tag(mbedtls_cipher_context_t* ctx, const unsigned char* tag, + size_t tag_len); #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /** diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/des.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/des.h index e5734d05852..656af738ba1 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/des.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/des.h @@ -191,8 +191,8 @@ int mbedtls_des_setkey_dec(mbedtls_des_context* ctx, const unsigned char key[MBE * \return 0 */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_des3_set2key_enc( - mbedtls_des3_context* ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]); +int mbedtls_des3_set2key_enc(mbedtls_des3_context* ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]); /** * \brief Triple-DES key schedule (112-bit, decryption) @@ -203,8 +203,8 @@ int mbedtls_des3_set2key_enc( * \return 0 */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_des3_set2key_dec( - mbedtls_des3_context* ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]); +int mbedtls_des3_set2key_dec(mbedtls_des3_context* ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2]); /** * \brief Triple-DES key schedule (168-bit, encryption) @@ -215,8 +215,8 @@ int mbedtls_des3_set2key_dec( * \return 0 */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_des3_set3key_enc( - mbedtls_des3_context* ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]); +int mbedtls_des3_set3key_enc(mbedtls_des3_context* ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]); /** * \brief Triple-DES key schedule (168-bit, decryption) @@ -227,8 +227,8 @@ int mbedtls_des3_set3key_enc( * \return 0 */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_des3_set3key_dec( - mbedtls_des3_context* ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]); +int mbedtls_des3_set3key_dec(mbedtls_des3_context* ctx, + const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3]); /** * \brief DES-ECB block encryption/decryption @@ -244,8 +244,8 @@ int mbedtls_des3_set3key_dec( * instead. */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_des_crypt_ecb( - mbedtls_des_context* ctx, const unsigned char input[8], unsigned char output[8]); +int mbedtls_des_crypt_ecb(mbedtls_des_context* ctx, const unsigned char input[8], + unsigned char output[8]); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** @@ -285,8 +285,8 @@ int mbedtls_des_crypt_cbc(mbedtls_des_context* ctx, int mode, size_t length, uns * \return 0 if successful */ MBEDTLS_CHECK_RETURN_TYPICAL -int mbedtls_des3_crypt_ecb( - mbedtls_des3_context* ctx, const unsigned char input[8], unsigned char output[8]); +int mbedtls_des3_crypt_ecb(mbedtls_des3_context* ctx, const unsigned char input[8], + unsigned char output[8]); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/entropy.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/entropy.h index e440444c00d..a1cc701fd6e 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/entropy.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/entropy.h @@ -96,8 +96,8 @@ extern "C" { * \return 0 if no critical failures occurred, * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise */ -typedef int (*mbedtls_entropy_f_source_ptr)( - void* data, unsigned char* output, size_t len, size_t* olen); +typedef int ( + *mbedtls_entropy_f_source_ptr)(void* data, unsigned char* output, size_t len, size_t* olen); /** * \brief Entropy source state @@ -206,8 +206,8 @@ int mbedtls_entropy_func(void* data, unsigned char* output, size_t len); * * \return 0 if successful */ -int mbedtls_entropy_update_manual( - mbedtls_entropy_context* ctx, const unsigned char* data, size_t len); +int mbedtls_entropy_update_manual(mbedtls_entropy_context* ctx, const unsigned char* data, + size_t len); #if defined(MBEDTLS_ENTROPY_NV_SEED) /** diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/oid.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/oid.h index 7bcd50f2099..de20988a156 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/oid.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/oid.h @@ -677,8 +677,8 @@ int mbedtls_oid_get_oid_by_ec_grp(mbedtls_ecp_group_id grp_id, const char** oid, * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ -int mbedtls_oid_get_sig_alg( - const mbedtls_asn1_buf* oid, mbedtls_md_type_t* md_alg, mbedtls_pk_type_t* pk_alg); +int mbedtls_oid_get_sig_alg(const mbedtls_asn1_buf* oid, mbedtls_md_type_t* md_alg, + mbedtls_pk_type_t* pk_alg); /** * \brief Translate SignatureAlgorithm OID into description @@ -700,8 +700,8 @@ int mbedtls_oid_get_sig_alg_desc(const mbedtls_asn1_buf* oid, const char** desc) * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ -int mbedtls_oid_get_oid_by_sig_alg( - mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const char** oid, size_t* olen); +int mbedtls_oid_get_oid_by_sig_alg(mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, + const char** oid, size_t* olen); /** * \brief Translate hash algorithm OID into md_type @@ -780,8 +780,8 @@ int mbedtls_oid_get_cipher_alg(const mbedtls_asn1_buf* oid, mbedtls_cipher_type_ * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ -int mbedtls_oid_get_pkcs12_pbe_alg( - const mbedtls_asn1_buf* oid, mbedtls_md_type_t* md_alg, mbedtls_cipher_type_t* cipher_alg); +int mbedtls_oid_get_pkcs12_pbe_alg(const mbedtls_asn1_buf* oid, mbedtls_md_type_t* md_alg, + mbedtls_cipher_type_t* cipher_alg); #endif /* MBEDTLS_PKCS12_C */ #ifdef __cplusplus diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/platform.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/platform.h index 15d22ab92c1..3f4a5650b52 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/platform.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/platform.h @@ -143,8 +143,8 @@ extern void mbedtls_free(void* ptr); * * \return \c 0. */ -int mbedtls_platform_set_calloc_free( - void* (*calloc_func)(size_t, size_t), void (*free_func)(void*)); +int mbedtls_platform_set_calloc_free(void* (*calloc_func)(size_t, size_t), + void (*free_func)(void*)); #endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ #else /* !MBEDTLS_PLATFORM_MEMORY */ #define mbedtls_free free diff --git a/extension/httpfs/third_party/mbedtls/include/mbedtls/rsa.h b/extension/httpfs/third_party/mbedtls/include/mbedtls/rsa.h index a9669d5447d..e2fa3e7db74 100644 --- a/extension/httpfs/third_party/mbedtls/include/mbedtls/rsa.h +++ b/extension/httpfs/third_party/mbedtls/include/mbedtls/rsa.h @@ -394,8 +394,8 @@ int mbedtls_rsa_export_raw(const mbedtls_rsa_context* ctx, unsigned char* N, siz * \return A non-zero error code on failure. * */ -int mbedtls_rsa_export_crt( - const mbedtls_rsa_context* ctx, mbedtls_mpi* DP, mbedtls_mpi* DQ, mbedtls_mpi* QP); +int mbedtls_rsa_export_crt(const mbedtls_rsa_context* ctx, mbedtls_mpi* DP, mbedtls_mpi* DQ, + mbedtls_mpi* QP); /** * \brief This function retrieves the length of RSA modulus in Bytes. diff --git a/extension/httpfs/third_party/mbedtls/library/aes.cpp b/extension/httpfs/third_party/mbedtls/library/aes.cpp index 677594d6bda..f5879491401 100644 --- a/extension/httpfs/third_party/mbedtls/library/aes.cpp +++ b/extension/httpfs/third_party/mbedtls/library/aes.cpp @@ -41,12 +41,12 @@ #endif #if defined(MBEDTLS_SELF_TEST) -//#if defined(MBEDTLS_PLATFORM_C) -//#include "mbedtls/platform.h" -//#else -//#include -//#define mbedtls_printf printf -//#endif /* MBEDTLS_PLATFORM_C */ +// #if defined(MBEDTLS_PLATFORM_C) +// #include "mbedtls/platform.h" +// #else +// #include +// #define mbedtls_printf printf +// #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_AES_ALT) @@ -325,7 +325,7 @@ static uint32_t RCON[10]; * Tables generation code */ #define ROTL8(x) (((x) << 8) & 0xFFFFFFFF) | ((x) >> 24) -#define XTIME(x) (((x) << 1) ^ (((x)&0x80) ? 0x1B : 0x00)) +#define XTIME(x) (((x) << 1) ^ (((x) & 0x80) ? 0x1B : 0x00)) #define MUL(x, y) (((x) && (y)) ? pow[(log[(x)] + log[(y)]) % 255] : 0) static int aes_init_done = 0; @@ -472,8 +472,8 @@ void mbedtls_aes_xts_free(mbedtls_aes_xts_context* ctx) { * AES key schedule (encryption) */ #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT) -int mbedtls_aes_setkey_enc( - mbedtls_aes_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_aes_setkey_enc(mbedtls_aes_context* ctx, const unsigned char* key, + unsigned int keybits) { unsigned int i; uint32_t* RK; @@ -583,8 +583,8 @@ int mbedtls_aes_setkey_enc( * AES key schedule (decryption) */ #if !defined(MBEDTLS_AES_SETKEY_DEC_ALT) -int mbedtls_aes_setkey_dec( - mbedtls_aes_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_aes_setkey_dec(mbedtls_aes_context* ctx, const unsigned char* key, + unsigned int keybits) { int i, j, ret; mbedtls_aes_context cty; uint32_t* RK; @@ -668,8 +668,8 @@ static int mbedtls_aes_xts_decode_keys(const unsigned char* key, unsigned int ke return 0; } -int mbedtls_aes_xts_setkey_enc( - mbedtls_aes_xts_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_aes_xts_setkey_enc(mbedtls_aes_xts_context* ctx, const unsigned char* key, + unsigned int keybits) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; const unsigned char *key1, *key2; unsigned int key1bits, key2bits; @@ -690,8 +690,8 @@ int mbedtls_aes_xts_setkey_enc( return mbedtls_aes_setkey_enc(&ctx->crypt, key1, key1bits); } -int mbedtls_aes_xts_setkey_dec( - mbedtls_aes_xts_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_aes_xts_setkey_dec(mbedtls_aes_xts_context* ctx, const unsigned char* key, + unsigned int keybits) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; const unsigned char *key1, *key2; unsigned int key1bits, key2bits; @@ -747,8 +747,8 @@ int mbedtls_aes_xts_setkey_dec( * AES-ECB block encryption */ #if !defined(MBEDTLS_AES_ENCRYPT_ALT) -int mbedtls_internal_aes_encrypt( - mbedtls_aes_context* ctx, const unsigned char input[16], unsigned char output[16]) { +int mbedtls_internal_aes_encrypt(mbedtls_aes_context* ctx, const unsigned char input[16], + unsigned char output[16]) { int i; uint32_t* RK = ctx->rk; struct { @@ -807,8 +807,8 @@ int mbedtls_internal_aes_encrypt( * AES-ECB block decryption */ #if !defined(MBEDTLS_AES_DECRYPT_ALT) -int mbedtls_internal_aes_decrypt( - mbedtls_aes_context* ctx, const unsigned char input[16], unsigned char output[16]) { +int mbedtls_internal_aes_decrypt(mbedtls_aes_context* ctx, const unsigned char input[16], + unsigned char output[16]) { int i; uint32_t* RK = ctx->rk; struct { @@ -866,8 +866,8 @@ int mbedtls_internal_aes_decrypt( /* * AES-ECB block encryption/decryption */ -int mbedtls_aes_crypt_ecb( - mbedtls_aes_context* ctx, int mode, const unsigned char input[16], unsigned char output[16]) { +int mbedtls_aes_crypt_ecb(mbedtls_aes_context* ctx, int mode, const unsigned char input[16], + unsigned char output[16]) { AES_VALIDATE_RET(ctx != NULL); AES_VALIDATE_RET(input != NULL); AES_VALIDATE_RET(output != NULL); @@ -1274,34 +1274,34 @@ int mbedtls_aes_crypt_ctr(mbedtls_aes_context* ctx, size_t length, size_t* nc_of * * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip */ -static const unsigned char aes_test_ecb_dec[3][16] = { - {0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58, 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, - 0xE0}, +static const unsigned char aes_test_ecb_dec[3][16] = {{0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, + 0x58, 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, + 0xEB, 0xE0}, {0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2, 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4}, {0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D, 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE}}; -static const unsigned char aes_test_ecb_enc[3][16] = { - {0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73, 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, - 0x7F}, +static const unsigned char aes_test_ecb_enc[3][16] = {{0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, + 0x73, 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, + 0x29, 0x7F}, {0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11, 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14}, {0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D, 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4}}; #if defined(MBEDTLS_CIPHER_MODE_CBC) -static const unsigned char aes_test_cbc_dec[3][16] = { - {0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73, 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, - 0x86}, +static const unsigned char aes_test_cbc_dec[3][16] = {{0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, + 0x73, 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, + 0xAF, 0x86}, {0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75, 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B}, {0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75, 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13}}; -static const unsigned char aes_test_cbc_enc[3][16] = { - {0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84, 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, - 0x3D}, +static const unsigned char aes_test_cbc_enc[3][16] = {{0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, + 0x84, 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, + 0x8E, 0x3D}, {0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB, 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04}, {0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5, 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, @@ -1314,17 +1314,17 @@ static const unsigned char aes_test_cbc_enc[3][16] = { * * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */ -static const unsigned char aes_test_cfb128_key[3][32] = { - {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, - 0x3C}, +static const unsigned char aes_test_cfb128_key[3][32] = {{0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, + 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, + 0xCF, 0x4F, 0x3C}, {0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B}, {0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4}}; -static const unsigned char aes_test_cfb128_iv[16] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; +static const unsigned char aes_test_cfb128_iv[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; static const unsigned char aes_test_cfb128_pt[64] = {0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, @@ -1356,17 +1356,17 @@ static const unsigned char aes_test_cfb128_ct[3][64] = { * * https://csrc.nist.gov/publications/detail/sp/800-38a/final */ -static const unsigned char aes_test_ofb_key[3][32] = { - {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, - 0x3C}, +static const unsigned char aes_test_ofb_key[3][32] = {{0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, + 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, + 0x4F, 0x3C}, {0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B}, {0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4}}; -static const unsigned char aes_test_ofb_iv[16] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; +static const unsigned char aes_test_ofb_iv[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; static const unsigned char aes_test_ofb_pt[64] = {0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, @@ -1399,25 +1399,25 @@ static const unsigned char aes_test_ofb_ct[3][64] = { * http://www.faqs.org/rfcs/rfc3686.html */ -static const unsigned char aes_test_ctr_key[3][16] = { - {0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, - 0x9E}, +static const unsigned char aes_test_ctr_key[3][16] = {{0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, + 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, + 0xF3, 0x9E}, {0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63}, {0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC}}; -static const unsigned char aes_test_ctr_nonce_counter[3][16] = { - {0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01}, +static const unsigned char aes_test_ctr_nonce_counter[3][16] = {{0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01}, {0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01}, {0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01}}; -static const unsigned char aes_test_ctr_pt[3][48] = { - {0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, - 0x67}, +static const unsigned char aes_test_ctr_pt[3][48] = {{0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, + 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, + 0x73, 0x67}, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, @@ -1427,9 +1427,9 @@ static const unsigned char aes_test_ctr_pt[3][48] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23}}; -static const unsigned char aes_test_ctr_ct[3][48] = { - {0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79, 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, - 0xB8}, +static const unsigned char aes_test_ctr_ct[3][48] = {{0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, + 0x79, 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, + 0x11, 0xB8}, {0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9, 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88, 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8, 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28}, @@ -1535,8 +1535,8 @@ int mbedtls_aes_self_test(int verbose) { mode = i & 1; if (verbose != 0) - mbedtls_printf( - " AES-ECB-%3u (%s): ", keybits, (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + mbedtls_printf(" AES-ECB-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); memset(buf, 0, 16); @@ -1588,8 +1588,8 @@ int mbedtls_aes_self_test(int verbose) { mode = i & 1; if (verbose != 0) - mbedtls_printf( - " AES-CBC-%3u (%s): ", keybits, (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + mbedtls_printf(" AES-CBC-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); memset(iv, 0, 16); memset(prv, 0, 16); @@ -1652,8 +1652,8 @@ int mbedtls_aes_self_test(int verbose) { mode = i & 1; if (verbose != 0) - mbedtls_printf( - " AES-CFB128-%3u (%s): ", keybits, (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); memcpy(iv, aes_test_cfb128_iv, 16); memcpy(key, aes_test_cfb128_key[u], keybits / 8); @@ -1707,8 +1707,8 @@ int mbedtls_aes_self_test(int verbose) { mode = i & 1; if (verbose != 0) - mbedtls_printf( - " AES-OFB-%3u (%s): ", keybits, (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + mbedtls_printf(" AES-OFB-%3u (%s): ", keybits, + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); memcpy(iv, aes_test_ofb_iv, 16); memcpy(key, aes_test_ofb_key[u], keybits / 8); @@ -1813,8 +1813,8 @@ int mbedtls_aes_self_test(int verbose) { mode = i & 1; if (verbose != 0) - mbedtls_printf( - " AES-XTS-128 (%s): ", (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); + mbedtls_printf(" AES-XTS-128 (%s): ", + (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); memset(key, 0, sizeof(key)); memcpy(key, aes_test_xts_key[u], 32); diff --git a/extension/httpfs/third_party/mbedtls/library/aria.cpp b/extension/httpfs/third_party/mbedtls/library/aria.cpp index bfc460fd4ad..678c298516f 100644 --- a/extension/httpfs/third_party/mbedtls/library/aria.cpp +++ b/extension/httpfs/third_party/mbedtls/library/aria.cpp @@ -87,7 +87,7 @@ static inline uint32_t aria_p1(uint32_t x) { #endif /* x86 gnuc */ #endif /* MBEDTLS_HAVE_ASM && GNUC */ #if !defined(ARIA_P1) -#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x)&0x00FF00FF) << 8)) +#define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8)) #endif /* @@ -283,8 +283,8 @@ static const uint8_t aria_is2[256] = {0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, /* * Helper for key schedule: r = FO( p, k ) ^ x */ -static void aria_fo_xor( - uint32_t r[4], const uint32_t p[4], const uint32_t k[4], const uint32_t x[4]) { +static void aria_fo_xor(uint32_t r[4], const uint32_t p[4], const uint32_t k[4], + const uint32_t x[4]) { uint32_t a, b, c, d; a = p[0] ^ k[0]; @@ -304,8 +304,8 @@ static void aria_fo_xor( /* * Helper for key schedule: r = FE( p, k ) ^ x */ -static void aria_fe_xor( - uint32_t r[4], const uint32_t p[4], const uint32_t k[4], const uint32_t x[4]) { +static void aria_fe_xor(uint32_t r[4], const uint32_t p[4], const uint32_t k[4], + const uint32_t x[4]) { uint32_t a, b, c, d; a = p[0] ^ k[0]; @@ -352,8 +352,8 @@ static void aria_rot128(uint32_t r[4], const uint32_t a[4], const uint32_t b[4], /* * Set encryption key */ -int mbedtls_aria_setkey_enc( - mbedtls_aria_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_aria_setkey_enc(mbedtls_aria_context* ctx, const unsigned char* key, + unsigned int keybits) { /* round constant masks */ const uint32_t rc[3][4] = {{0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA}, {0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF}, @@ -411,8 +411,8 @@ int mbedtls_aria_setkey_enc( /* * Set decryption key */ -int mbedtls_aria_setkey_dec( - mbedtls_aria_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_aria_setkey_dec(mbedtls_aria_context* ctx, const unsigned char* key, + unsigned int keybits) { int i, j, k, ret; ARIA_VALIDATE_RET(ctx != NULL); ARIA_VALIDATE_RET(key != NULL); @@ -906,8 +906,8 @@ int mbedtls_aria_self_test(int verbose) { memcpy(iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE); memset(buf, 0xAA, sizeof(buf)); j = 0; - mbedtls_aria_crypt_cfb128( - &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j, iv, aria_test2_cfb_ct[i], buf); + mbedtls_aria_crypt_cfb128(&ctx, MBEDTLS_ARIA_DECRYPT, 48, &j, iv, aria_test2_cfb_ct[i], + buf); if (memcmp(buf, aria_test2_pt, 48) != 0) ARIA_SELF_TEST_IF_FAIL; } diff --git a/extension/httpfs/third_party/mbedtls/library/asn1parse.cpp b/extension/httpfs/third_party/mbedtls/library/asn1parse.cpp index be18c6b07c3..f1d4af27c66 100644 --- a/extension/httpfs/third_party/mbedtls/library/asn1parse.cpp +++ b/extension/httpfs/third_party/mbedtls/library/asn1parse.cpp @@ -185,8 +185,8 @@ int mbedtls_asn1_get_mpi(unsigned char** p, const unsigned char* end, mbedtls_mp } #endif /* MBEDTLS_BIGNUM_C */ -int mbedtls_asn1_get_bitstring( - unsigned char** p, const unsigned char* end, mbedtls_asn1_bitstring* bs) { +int mbedtls_asn1_get_bitstring(unsigned char** p, const unsigned char* end, + mbedtls_asn1_bitstring* bs) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; /* Certificate type is a single byte bitstring */ @@ -226,8 +226,8 @@ int mbedtls_asn1_traverse_sequence_of(unsigned char** p, const unsigned char* en size_t len; /* Get main sequence tag */ - if ((ret = mbedtls_asn1_get_tag( - p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { return (ret); } @@ -315,21 +315,21 @@ static int asn1_get_sequence_of_cb(void* ctx, int tag, unsigned char* start, siz /* * Parses and splits an ASN.1 "SEQUENCE OF " */ -int mbedtls_asn1_get_sequence_of( - unsigned char** p, const unsigned char* end, mbedtls_asn1_sequence* cur, int tag) { +int mbedtls_asn1_get_sequence_of(unsigned char** p, const unsigned char* end, + mbedtls_asn1_sequence* cur, int tag) { asn1_get_sequence_of_cb_ctx_t cb_ctx = {tag, cur}; memset(cur, 0, sizeof(mbedtls_asn1_sequence)); - return (mbedtls_asn1_traverse_sequence_of( - p, end, 0xFF, tag, 0, 0, asn1_get_sequence_of_cb, &cb_ctx)); + return (mbedtls_asn1_traverse_sequence_of(p, end, 0xFF, tag, 0, 0, asn1_get_sequence_of_cb, + &cb_ctx)); } -int mbedtls_asn1_get_alg( - unsigned char** p, const unsigned char* end, mbedtls_asn1_buf* alg, mbedtls_asn1_buf* params) { +int mbedtls_asn1_get_alg(unsigned char** p, const unsigned char* end, mbedtls_asn1_buf* alg, + mbedtls_asn1_buf* params) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t len; - if ((ret = mbedtls_asn1_get_tag( - p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) return (ret); if ((end - *p) < 1) @@ -399,8 +399,8 @@ void mbedtls_asn1_free_named_data_list(mbedtls_asn1_named_data** head) { } } -const mbedtls_asn1_named_data* mbedtls_asn1_find_named_data( - const mbedtls_asn1_named_data* list, const char* oid, size_t len) { +const mbedtls_asn1_named_data* mbedtls_asn1_find_named_data(const mbedtls_asn1_named_data* list, + const char* oid, size_t len) { while (list != NULL) { if (list->oid.len == len && memcmp(list->oid.p, oid, len) == 0) { break; diff --git a/extension/httpfs/third_party/mbedtls/library/base64.cpp b/extension/httpfs/third_party/mbedtls/library/base64.cpp index 31870bcd7de..cea5cedebc0 100644 --- a/extension/httpfs/third_party/mbedtls/library/base64.cpp +++ b/extension/httpfs/third_party/mbedtls/library/base64.cpp @@ -36,13 +36,13 @@ #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ -#define BASE64_SIZE_T_MAX ((size_t)-1) /* SIZE_T_MAX is not standard */ +#define BASE64_SIZE_T_MAX ((size_t) - 1) /* SIZE_T_MAX is not standard */ /* * Encode a buffer into base64 format */ -int mbedtls_base64_encode( - unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, size_t slen) { +int mbedtls_base64_encode(unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, + size_t slen) { size_t i, n; int C1, C2, C3; unsigned char* p; @@ -103,8 +103,8 @@ int mbedtls_base64_encode( /* * Decode a base64-formatted buffer */ -int mbedtls_base64_decode( - unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, size_t slen) { +int mbedtls_base64_decode(unsigned char* dst, size_t dlen, size_t* olen, const unsigned char* src, + size_t slen) { size_t i; /* index in source */ size_t n; /* number of digits or trailing = in source */ uint32_t x; /* value accumulator */ diff --git a/extension/httpfs/third_party/mbedtls/library/bignum.cpp b/extension/httpfs/third_party/mbedtls/library/bignum.cpp index 13fb1d1a9e8..39b733381db 100644 --- a/extension/httpfs/third_party/mbedtls/library/bignum.cpp +++ b/extension/httpfs/third_party/mbedtls/library/bignum.cpp @@ -63,7 +63,7 @@ #define biL (ciL << 3) /* bits in limb */ #define biH (ciL << 2) /* half limb size */ -#define MPI_SIZE_T_MAX ((size_t)-1) /* SIZE_T_MAX is not standard */ +#define MPI_SIZE_T_MAX ((size_t) - 1) /* SIZE_T_MAX is not standard */ /* * Convert between bits/chars and number of limbs @@ -482,8 +482,8 @@ static int mpi_write_hlp(mbedtls_mpi* X, int radix, char** p, const size_t bufle /* * Export into an ASCII string */ -int mbedtls_mpi_write_string( - const mbedtls_mpi* X, int radix, char* buf, size_t buflen, size_t* olen) { +int mbedtls_mpi_write_string(const mbedtls_mpi* X, int radix, char* buf, size_t buflen, + size_t* olen) { int ret = 0; size_t n; char* p; @@ -1113,8 +1113,8 @@ int mbedtls_mpi_add_abs(mbedtls_mpi* X, const mbedtls_mpi* A, const mbedtls_mpi* * \return 1 if `l < r`. * 0 if `l >= r`. */ -static mbedtls_mpi_uint mpi_sub_hlp( - size_t n, mbedtls_mpi_uint* d, const mbedtls_mpi_uint* l, const mbedtls_mpi_uint* r) { +static mbedtls_mpi_uint mpi_sub_hlp(size_t n, mbedtls_mpi_uint* d, const mbedtls_mpi_uint* l, + const mbedtls_mpi_uint* r) { size_t i; mbedtls_mpi_uint c = 0, t, z; @@ -1439,8 +1439,8 @@ int mbedtls_mpi_mul_int(mbedtls_mpi* X, const mbedtls_mpi* A, mbedtls_mpi_uint b * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and * mbedtls_mpi_uint divisor, d */ -static mbedtls_mpi_uint mbedtls_int_div_int( - mbedtls_mpi_uint u1, mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint* r) { +static mbedtls_mpi_uint mbedtls_int_div_int(mbedtls_mpi_uint u1, mbedtls_mpi_uint u0, + mbedtls_mpi_uint d, mbedtls_mpi_uint* r) { #if defined(MBEDTLS_HAVE_UDBL) mbedtls_t_udbl dividend, quotient; #else @@ -1533,8 +1533,8 @@ static mbedtls_mpi_uint mbedtls_int_div_int( /* * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20) */ -int mbedtls_mpi_div_mpi( - mbedtls_mpi* Q, mbedtls_mpi* R, const mbedtls_mpi* A, const mbedtls_mpi* B) { +int mbedtls_mpi_div_mpi(mbedtls_mpi* Q, mbedtls_mpi* R, const mbedtls_mpi* A, + const mbedtls_mpi* B) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t i, n, t, k; mbedtls_mpi X, Y, Z, T1, T2; @@ -1837,8 +1837,8 @@ static void mpi_montmul(mbedtls_mpi* A, const mbedtls_mpi* B, const mbedtls_mpi* * * See mpi_montmul() regarding constraints and guarantees on the parameters. */ -static void mpi_montred( - mbedtls_mpi* A, const mbedtls_mpi* N, mbedtls_mpi_uint mm, const mbedtls_mpi* T) { +static void mpi_montred(mbedtls_mpi* A, const mbedtls_mpi* N, mbedtls_mpi_uint mm, + const mbedtls_mpi* T) { mbedtls_mpi_uint z = 1; mbedtls_mpi U; @@ -2216,8 +2216,8 @@ int mbedtls_mpi_gcd(mbedtls_mpi* G, const mbedtls_mpi* A, const mbedtls_mpi* B) * The size and sign of X are unchanged. * n_bytes must not be 0. */ -static int mpi_fill_random_internal( - mbedtls_mpi* X, size_t n_bytes, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +static int mpi_fill_random_internal(mbedtls_mpi* X, size_t n_bytes, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; const size_t limbs = CHARS_TO_LIMBS(n_bytes); const size_t overhead = (limbs * ciL) - n_bytes; @@ -2241,8 +2241,8 @@ static int mpi_fill_random_internal( * regardless of the platform endianness (useful when f_rng is actually * deterministic, eg for tests). */ -int mbedtls_mpi_fill_random( - mbedtls_mpi* X, size_t size, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +int mbedtls_mpi_fill_random(mbedtls_mpi* X, size_t size, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t const limbs = CHARS_TO_LIMBS(size); @@ -2473,8 +2473,8 @@ static int mpi_check_small_factors(const mbedtls_mpi* X) { /* * Miller-Rabin pseudo-primality test (HAC 4.24) */ -static int mpi_miller_rabin( - const mbedtls_mpi* X, size_t rounds, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +static int mpi_miller_rabin(const mbedtls_mpi* X, size_t rounds, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { int ret, count; size_t i, j, k, s; mbedtls_mpi W, R, T, A, RR; @@ -2562,8 +2562,8 @@ static int mpi_miller_rabin( /* * Pseudo-primality test: small factors, then Miller-Rabin */ -int mbedtls_mpi_is_prime_ext( - const mbedtls_mpi* X, int rounds, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +int mbedtls_mpi_is_prime_ext(const mbedtls_mpi* X, int rounds, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; mbedtls_mpi XX; MPI_VALIDATE_RET(X != NULL); @@ -2722,8 +2722,8 @@ int mbedtls_mpi_gen_prime(mbedtls_mpi* X, size_t nbits, int flags, #define GCD_PAIR_COUNT 3 -static const int gcd_pairs[GCD_PAIR_COUNT][3] = { - {693, 609, 21}, {1764, 868, 28}, {768454923, 542167814, 1}}; +static const int gcd_pairs[GCD_PAIR_COUNT][3] = {{693, 609, 21}, {1764, 868, 28}, + {768454923, 542167814, 1}}; /* * Checkup routine diff --git a/extension/httpfs/third_party/mbedtls/library/camellia.cpp b/extension/httpfs/third_party/mbedtls/library/camellia.cpp index 15ebd26ec8a..3827792d937 100644 --- a/extension/httpfs/third_party/mbedtls/library/camellia.cpp +++ b/extension/httpfs/third_party/mbedtls/library/camellia.cpp @@ -199,10 +199,10 @@ static const signed char transposes[2][20] = { #define SHIFT_AND_PLACE(INDEX, OFFSET) \ { \ - TK[0] = KC[(OFFSET)*4 + 0]; \ - TK[1] = KC[(OFFSET)*4 + 1]; \ - TK[2] = KC[(OFFSET)*4 + 2]; \ - TK[3] = KC[(OFFSET)*4 + 3]; \ + TK[0] = KC[(OFFSET) * 4 + 0]; \ + TK[1] = KC[(OFFSET) * 4 + 1]; \ + TK[2] = KC[(OFFSET) * 4 + 2]; \ + TK[3] = KC[(OFFSET) * 4 + 3]; \ \ for (i = 1; i <= 4; i++) \ if (shifts[(INDEX)][(OFFSET)][i - 1]) \ @@ -248,8 +248,8 @@ void mbedtls_camellia_free(mbedtls_camellia_context* ctx) { /* * Camellia key schedule (encryption) */ -int mbedtls_camellia_setkey_enc( - mbedtls_camellia_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_camellia_setkey_enc(mbedtls_camellia_context* ctx, const unsigned char* key, + unsigned int keybits) { int idx; size_t i; uint32_t* RK; @@ -361,8 +361,8 @@ int mbedtls_camellia_setkey_enc( /* * Camellia key schedule (decryption) */ -int mbedtls_camellia_setkey_dec( - mbedtls_camellia_context* ctx, const unsigned char* key, unsigned int keybits) { +int mbedtls_camellia_setkey_dec(mbedtls_camellia_context* ctx, const unsigned char* key, + unsigned int keybits) { int idx, ret; size_t i; mbedtls_camellia_context cty; @@ -658,9 +658,9 @@ static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] = #if defined(MBEDTLS_CIPHER_MODE_CBC) #define CAMELLIA_TESTS_CBC 3 -static const unsigned char camellia_test_cbc_key[3][32] = { - {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, - 0x3C}, +static const unsigned char camellia_test_cbc_key[3][32] = {{0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, + 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, + 0x09, 0xCF, 0x4F, 0x3C}, {0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B}, {0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, @@ -709,9 +709,9 @@ static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] = * http://www.faqs.org/rfcs/rfc5528.html */ -static const unsigned char camellia_test_ctr_key[3][16] = { - {0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, - 0x9E}, +static const unsigned char camellia_test_ctr_key[3][16] = {{0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, + 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, + 0x55, 0x77, 0xF3, 0x9E}, {0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63}, {0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, @@ -725,9 +725,9 @@ static const unsigned char camellia_test_ctr_nonce_counter[3][16] = { {0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01}}; -static const unsigned char camellia_test_ctr_pt[3][48] = { - {0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, - 0x67}, +static const unsigned char camellia_test_ctr_pt[3][48] = {{0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, + 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, + 0x6D, 0x73, 0x67}, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, @@ -737,9 +737,9 @@ static const unsigned char camellia_test_ctr_pt[3][48] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23}}; -static const unsigned char camellia_test_ctr_ct[3][48] = { - {0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A, 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, - 0x3F}, +static const unsigned char camellia_test_ctr_ct[3][48] = {{0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, + 0x9A, 0x20, 0x87, 0x7C, 0x76, 0xDB, + 0x1F, 0x0B, 0x3F}, {0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4, 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44, 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7, 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48}, @@ -871,8 +871,8 @@ int mbedtls_camellia_self_test(int verbose) { v = i & 1; if (verbose != 0) - mbedtls_printf( - " CAMELLIA-CTR-128 (%s): ", (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); + mbedtls_printf(" CAMELLIA-CTR-128 (%s): ", + (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); memcpy(nonce_counter, camellia_test_ctr_nonce_counter[u], 16); memcpy(key, camellia_test_ctr_key[u], 16); diff --git a/extension/httpfs/third_party/mbedtls/library/cipher.cpp b/extension/httpfs/third_party/mbedtls/library/cipher.cpp index ecf3b1d1f28..22a9b08c7f3 100644 --- a/extension/httpfs/third_party/mbedtls/library/cipher.cpp +++ b/extension/httpfs/third_party/mbedtls/library/cipher.cpp @@ -119,8 +119,8 @@ const mbedtls_cipher_info_t* mbedtls_cipher_info_from_string(const char* cipher_ return (NULL); } -const mbedtls_cipher_info_t* mbedtls_cipher_info_from_values( - const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode) { +const mbedtls_cipher_info_t* mbedtls_cipher_info_from_values(const mbedtls_cipher_id_t cipher_id, + int key_bitlen, const mbedtls_cipher_mode_t mode) { const mbedtls_cipher_definition_t* def; for (def = mbedtls_cipher_definitions; def->info != NULL; def++) @@ -200,8 +200,8 @@ int mbedtls_cipher_setup(mbedtls_cipher_context_t* ctx, const mbedtls_cipher_inf } #if defined(MBEDTLS_USE_PSA_CRYPTO) -int mbedtls_cipher_setup_psa( - mbedtls_cipher_context_t* ctx, const mbedtls_cipher_info_t* cipher_info, size_t taglen) { +int mbedtls_cipher_setup_psa(mbedtls_cipher_context_t* ctx, + const mbedtls_cipher_info_t* cipher_info, size_t taglen) { psa_algorithm_t alg; mbedtls_cipher_context_psa* cipher_psa; @@ -408,8 +408,8 @@ int mbedtls_cipher_reset(mbedtls_cipher_context_t* ctx) { } #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) -int mbedtls_cipher_update_ad( - mbedtls_cipher_context_t* ctx, const unsigned char* ad, size_t ad_len) { +int mbedtls_cipher_update_ad(mbedtls_cipher_context_t* ctx, const unsigned char* ad, + size_t ad_len) { CIPHER_VALIDATE_RET(ctx != NULL); CIPHER_VALIDATE_RET(ad_len == 0 || ad != NULL); if (ctx->cipher_info == NULL) @@ -443,8 +443,8 @@ int mbedtls_cipher_update_ad( if (result != 0) return (result); - return (mbedtls_chachapoly_update_aad( - (mbedtls_chachapoly_context*)ctx->cipher_ctx, ad, ad_len)); + return (mbedtls_chachapoly_update_aad((mbedtls_chachapoly_context*)ctx->cipher_ctx, ad, + ad_len)); } #endif @@ -485,8 +485,8 @@ int mbedtls_cipher_update(mbedtls_cipher_context_t* ctx, const unsigned char* in *olen = ilen; - if (0 != (ret = ctx->cipher_info->base->ecb_func( - ctx->cipher_ctx, ctx->operation, input, output))) { + if (0 != (ret = ctx->cipher_info->base->ecb_func(ctx->cipher_ctx, ctx->operation, input, + output))) { return (ret); } @@ -495,23 +495,23 @@ int mbedtls_cipher_update(mbedtls_cipher_context_t* ctx, const unsigned char* in #if defined(MBEDTLS_GCM_C) if (ctx->cipher_info->mode == MBEDTLS_MODE_GCM) { - return (mbedtls_gcm_update( - (mbedtls_gcm_context*)ctx->cipher_ctx, input, ilen, output, ilen, olen)); + return (mbedtls_gcm_update((mbedtls_gcm_context*)ctx->cipher_ctx, input, ilen, output, ilen, + olen)); } #endif #if defined(MBEDTLS_CCM_C) if (ctx->cipher_info->mode == MBEDTLS_MODE_CCM_STAR_NO_TAG) { - return (mbedtls_ccm_update( - (mbedtls_ccm_context*)ctx->cipher_ctx, input, ilen, output, ilen, olen)); + return (mbedtls_ccm_update((mbedtls_ccm_context*)ctx->cipher_ctx, input, ilen, output, ilen, + olen)); } #endif #if defined(MBEDTLS_CHACHAPOLY_C) if (ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305) { *olen = ilen; - return (mbedtls_chachapoly_update( - (mbedtls_chachapoly_context*)ctx->cipher_ctx, ilen, input, output)); + return (mbedtls_chachapoly_update((mbedtls_chachapoly_context*)ctx->cipher_ctx, ilen, input, + output)); } #endif @@ -581,8 +581,8 @@ int mbedtls_cipher_update(mbedtls_cipher_context_t* ctx, const unsigned char* in * Process remaining full blocks */ if (ilen) { - if (0 != (ret = ctx->cipher_info->base->cbc_func( - ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, input, output))) { + if (0 != (ret = ctx->cipher_info->base->cbc_func(ctx->cipher_ctx, ctx->operation, ilen, + ctx->iv, input, output))) { return (ret); } @@ -608,8 +608,8 @@ int mbedtls_cipher_update(mbedtls_cipher_context_t* ctx, const unsigned char* in #if defined(MBEDTLS_CIPHER_MODE_OFB) if (ctx->cipher_info->mode == MBEDTLS_MODE_OFB) { - if (0 != (ret = ctx->cipher_info->base->ofb_func( - ctx->cipher_ctx, ilen, &ctx->unprocessed_len, ctx->iv, input, output))) { + if (0 != (ret = ctx->cipher_info->base->ofb_func(ctx->cipher_ctx, ilen, + &ctx->unprocessed_len, ctx->iv, input, output))) { return (ret); } @@ -639,8 +639,8 @@ int mbedtls_cipher_update(mbedtls_cipher_context_t* ctx, const unsigned char* in return (MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE); } - ret = ctx->cipher_info->base->xts_func( - ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, input, output); + ret = ctx->cipher_info->base->xts_func(ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, + input, output); if (ret != 0) { return (ret); } @@ -869,8 +869,8 @@ int mbedtls_cipher_finish(mbedtls_cipher_context_t* ctx, unsigned char* output, return (0); } - ctx->add_padding( - ctx->unprocessed_data, mbedtls_cipher_get_iv_size(ctx), ctx->unprocessed_len); + ctx->add_padding(ctx->unprocessed_data, mbedtls_cipher_get_iv_size(ctx), + ctx->unprocessed_len); } else if (mbedtls_cipher_get_block_size(ctx) != ctx->unprocessed_len) { /* * For decrypt operations, expect a full block, @@ -986,8 +986,8 @@ int mbedtls_cipher_write_tag(mbedtls_cipher_context_t* ctx, unsigned char* tag, size_t output_length; /* The code here doesn't yet support alternative implementations * that can delay up to a block of output. */ - return (mbedtls_gcm_finish( - (mbedtls_gcm_context*)ctx->cipher_ctx, NULL, 0, &output_length, tag, tag_len)); + return (mbedtls_gcm_finish((mbedtls_gcm_context*)ctx->cipher_ctx, NULL, 0, &output_length, + tag, tag_len)); } #endif @@ -1004,8 +1004,8 @@ int mbedtls_cipher_write_tag(mbedtls_cipher_context_t* ctx, unsigned char* tag, return (0); } -int mbedtls_cipher_check_tag( - mbedtls_cipher_context_t* ctx, const unsigned char* tag, size_t tag_len) { +int mbedtls_cipher_check_tag(mbedtls_cipher_context_t* ctx, const unsigned char* tag, + size_t tag_len) { unsigned char check_tag[16]; int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; @@ -1201,8 +1201,8 @@ static int mbedtls_cipher_aead_encrypt(mbedtls_cipher_context_t* ctx, const unsi #if defined(MBEDTLS_CCM_C) if (MBEDTLS_MODE_CCM == ctx->cipher_info->mode) { *olen = ilen; - return (mbedtls_ccm_encrypt_and_tag( - ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, tag, tag_len)); + return (mbedtls_ccm_encrypt_and_tag(ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, + output, tag, tag_len)); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) @@ -1213,8 +1213,8 @@ static int mbedtls_cipher_aead_encrypt(mbedtls_cipher_context_t* ctx, const unsi } *olen = ilen; - return (mbedtls_chachapoly_encrypt_and_tag( - ctx->cipher_ctx, ilen, iv, ad, ad_len, input, output, tag)); + return (mbedtls_chachapoly_encrypt_and_tag(ctx->cipher_ctx, ilen, iv, ad, ad_len, input, + output, tag)); } #endif /* MBEDTLS_CHACHAPOLY_C */ @@ -1274,8 +1274,8 @@ static int mbedtls_cipher_aead_decrypt(mbedtls_cipher_context_t* ctx, const unsi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; *olen = ilen; - ret = mbedtls_ccm_auth_decrypt( - ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, tag, tag_len); + ret = mbedtls_ccm_auth_decrypt(ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, + tag, tag_len); if (ret == MBEDTLS_ERR_CCM_AUTH_FAILED) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; @@ -1293,8 +1293,8 @@ static int mbedtls_cipher_aead_decrypt(mbedtls_cipher_context_t* ctx, const unsi } *olen = ilen; - ret = mbedtls_chachapoly_auth_decrypt( - ctx->cipher_ctx, ilen, iv, ad, ad_len, tag, input, output); + ret = mbedtls_chachapoly_auth_decrypt(ctx->cipher_ctx, ilen, iv, ad, ad_len, tag, input, + output); if (ret == MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; @@ -1347,8 +1347,8 @@ int mbedtls_cipher_auth_encrypt_ext(mbedtls_cipher_context_t* ctx, const unsigne if (output_len < ilen + tag_len) return (MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA); - int ret = mbedtls_cipher_aead_encrypt( - ctx, iv, iv_len, ad, ad_len, input, ilen, output, olen, output + ilen, tag_len); + int ret = mbedtls_cipher_aead_encrypt(ctx, iv, iv_len, ad, ad_len, input, ilen, output, olen, + output + ilen, tag_len); *olen += tag_len; return (ret); #else diff --git a/extension/httpfs/third_party/mbedtls/library/cipher_wrap.cpp b/extension/httpfs/third_party/mbedtls/library/cipher_wrap.cpp index 3b7b86399ea..7de01cc3ac6 100644 --- a/extension/httpfs/third_party/mbedtls/library/cipher_wrap.cpp +++ b/extension/httpfs/third_party/mbedtls/library/cipher_wrap.cpp @@ -112,8 +112,8 @@ static void ccm_ctx_free(void* ctx) { #if defined(MBEDTLS_AES_C) -static int aes_crypt_ecb_wrap( - void* ctx, mbedtls_operation_t operation, const unsigned char* input, unsigned char* output) { +static int aes_crypt_ecb_wrap(void* ctx, mbedtls_operation_t operation, const unsigned char* input, + unsigned char* output) { return mbedtls_aes_crypt_ecb((mbedtls_aes_context*)ctx, operation, input, output); } @@ -127,8 +127,8 @@ static int aes_crypt_cbc_wrap(void* ctx, mbedtls_operation_t operation, size_t l #if defined(MBEDTLS_CIPHER_MODE_CFB) static int aes_crypt_cfb128_wrap(void* ctx, mbedtls_operation_t operation, size_t length, size_t* iv_off, unsigned char* iv, const unsigned char* input, unsigned char* output) { - return mbedtls_aes_crypt_cfb128( - (mbedtls_aes_context*)ctx, operation, length, iv_off, iv, input, output); + return mbedtls_aes_crypt_cfb128((mbedtls_aes_context*)ctx, operation, length, iv_off, iv, input, + output); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ @@ -143,8 +143,8 @@ static int aes_crypt_ofb_wrap(void* ctx, size_t length, size_t* iv_off, unsigned static int aes_crypt_ctr_wrap(void* ctx, size_t length, size_t* nc_off, unsigned char* nonce_counter, unsigned char* stream_block, const unsigned char* input, unsigned char* output) { - return mbedtls_aes_crypt_ctr( - (mbedtls_aes_context*)ctx, length, nc_off, nonce_counter, stream_block, input, output); + return mbedtls_aes_crypt_ctr((mbedtls_aes_context*)ctx, length, nc_off, nonce_counter, + stream_block, input, output); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ @@ -214,57 +214,57 @@ static const mbedtls_cipher_base_t aes_info = {MBEDTLS_CIPHER_ID_AES, aes_crypt_ #endif aes_setkey_enc_wrap, aes_setkey_dec_wrap, aes_ctx_alloc, aes_ctx_free}; -static const mbedtls_cipher_info_t aes_128_ecb_info = { - MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_MODE_ECB, 128, "AES-128-ECB", 0, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_128_ecb_info = {MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_MODE_ECB, + 128, "AES-128-ECB", 0, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_192_ecb_info = { - MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_MODE_ECB, 192, "AES-192-ECB", 0, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_192_ecb_info = {MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_MODE_ECB, + 192, "AES-192-ECB", 0, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_256_ecb_info = { - MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_MODE_ECB, 256, "AES-256-ECB", 0, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_256_ecb_info = {MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_MODE_ECB, + 256, "AES-256-ECB", 0, 0, 16, &aes_info}; #if defined(MBEDTLS_CIPHER_MODE_CBC) -static const mbedtls_cipher_info_t aes_128_cbc_info = { - MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MODE_CBC, 128, "AES-128-CBC", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_128_cbc_info = {MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MODE_CBC, + 128, "AES-128-CBC", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_192_cbc_info = { - MBEDTLS_CIPHER_AES_192_CBC, MBEDTLS_MODE_CBC, 192, "AES-192-CBC", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_192_cbc_info = {MBEDTLS_CIPHER_AES_192_CBC, MBEDTLS_MODE_CBC, + 192, "AES-192-CBC", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_256_cbc_info = { - MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MODE_CBC, 256, "AES-256-CBC", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_256_cbc_info = {MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MODE_CBC, + 256, "AES-256-CBC", 16, 0, 16, &aes_info}; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) -static const mbedtls_cipher_info_t aes_128_cfb128_info = { - MBEDTLS_CIPHER_AES_128_CFB128, MBEDTLS_MODE_CFB, 128, "AES-128-CFB128", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_128_cfb128_info = {MBEDTLS_CIPHER_AES_128_CFB128, + MBEDTLS_MODE_CFB, 128, "AES-128-CFB128", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_192_cfb128_info = { - MBEDTLS_CIPHER_AES_192_CFB128, MBEDTLS_MODE_CFB, 192, "AES-192-CFB128", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_192_cfb128_info = {MBEDTLS_CIPHER_AES_192_CFB128, + MBEDTLS_MODE_CFB, 192, "AES-192-CFB128", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_256_cfb128_info = { - MBEDTLS_CIPHER_AES_256_CFB128, MBEDTLS_MODE_CFB, 256, "AES-256-CFB128", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_256_cfb128_info = {MBEDTLS_CIPHER_AES_256_CFB128, + MBEDTLS_MODE_CFB, 256, "AES-256-CFB128", 16, 0, 16, &aes_info}; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) -static const mbedtls_cipher_info_t aes_128_ofb_info = { - MBEDTLS_CIPHER_AES_128_OFB, MBEDTLS_MODE_OFB, 128, "AES-128-OFB", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_128_ofb_info = {MBEDTLS_CIPHER_AES_128_OFB, MBEDTLS_MODE_OFB, + 128, "AES-128-OFB", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_192_ofb_info = { - MBEDTLS_CIPHER_AES_192_OFB, MBEDTLS_MODE_OFB, 192, "AES-192-OFB", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_192_ofb_info = {MBEDTLS_CIPHER_AES_192_OFB, MBEDTLS_MODE_OFB, + 192, "AES-192-OFB", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_256_ofb_info = { - MBEDTLS_CIPHER_AES_256_OFB, MBEDTLS_MODE_OFB, 256, "AES-256-OFB", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_256_ofb_info = {MBEDTLS_CIPHER_AES_256_OFB, MBEDTLS_MODE_OFB, + 256, "AES-256-OFB", 16, 0, 16, &aes_info}; #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) -static const mbedtls_cipher_info_t aes_128_ctr_info = { - MBEDTLS_CIPHER_AES_128_CTR, MBEDTLS_MODE_CTR, 128, "AES-128-CTR", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_128_ctr_info = {MBEDTLS_CIPHER_AES_128_CTR, MBEDTLS_MODE_CTR, + 128, "AES-128-CTR", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_192_ctr_info = { - MBEDTLS_CIPHER_AES_192_CTR, MBEDTLS_MODE_CTR, 192, "AES-192-CTR", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_192_ctr_info = {MBEDTLS_CIPHER_AES_192_CTR, MBEDTLS_MODE_CTR, + 192, "AES-192-CTR", 16, 0, 16, &aes_info}; -static const mbedtls_cipher_info_t aes_256_ctr_info = { - MBEDTLS_CIPHER_AES_256_CTR, MBEDTLS_MODE_CTR, 256, "AES-256-CTR", 16, 0, 16, &aes_info}; +static const mbedtls_cipher_info_t aes_256_ctr_info = {MBEDTLS_CIPHER_AES_256_CTR, MBEDTLS_MODE_CTR, + 256, "AES-256-CTR", 16, 0, 16, &aes_info}; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) @@ -318,11 +318,11 @@ static const mbedtls_cipher_base_t xts_aes_info = {MBEDTLS_CIPHER_ID_AES, NULL, #endif xts_aes_setkey_enc_wrap, xts_aes_setkey_dec_wrap, xts_aes_ctx_alloc, xts_aes_ctx_free}; -static const mbedtls_cipher_info_t aes_128_xts_info = { - MBEDTLS_CIPHER_AES_128_XTS, MBEDTLS_MODE_XTS, 256, "AES-128-XTS", 16, 0, 16, &xts_aes_info}; +static const mbedtls_cipher_info_t aes_128_xts_info = {MBEDTLS_CIPHER_AES_128_XTS, MBEDTLS_MODE_XTS, + 256, "AES-128-XTS", 16, 0, 16, &xts_aes_info}; -static const mbedtls_cipher_info_t aes_256_xts_info = { - MBEDTLS_CIPHER_AES_256_XTS, MBEDTLS_MODE_XTS, 512, "AES-256-XTS", 16, 0, 16, &xts_aes_info}; +static const mbedtls_cipher_info_t aes_256_xts_info = {MBEDTLS_CIPHER_AES_256_XTS, MBEDTLS_MODE_XTS, + 512, "AES-256-XTS", 16, 0, 16, &xts_aes_info}; #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_GCM_C) @@ -425,24 +425,24 @@ static const mbedtls_cipher_info_t aes_256_ccm_star_no_tag_info = { #if defined(MBEDTLS_CAMELLIA_C) -static int camellia_crypt_ecb_wrap( - void* ctx, mbedtls_operation_t operation, const unsigned char* input, unsigned char* output) { +static int camellia_crypt_ecb_wrap(void* ctx, mbedtls_operation_t operation, + const unsigned char* input, unsigned char* output) { return mbedtls_camellia_crypt_ecb((mbedtls_camellia_context*)ctx, operation, input, output); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int camellia_crypt_cbc_wrap(void* ctx, mbedtls_operation_t operation, size_t length, unsigned char* iv, const unsigned char* input, unsigned char* output) { - return mbedtls_camellia_crypt_cbc( - (mbedtls_camellia_context*)ctx, operation, length, iv, input, output); + return mbedtls_camellia_crypt_cbc((mbedtls_camellia_context*)ctx, operation, length, iv, input, + output); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int camellia_crypt_cfb128_wrap(void* ctx, mbedtls_operation_t operation, size_t length, size_t* iv_off, unsigned char* iv, const unsigned char* input, unsigned char* output) { - return mbedtls_camellia_crypt_cfb128( - (mbedtls_camellia_context*)ctx, operation, length, iv_off, iv, input, output); + return mbedtls_camellia_crypt_cfb128((mbedtls_camellia_context*)ctx, operation, length, iv_off, + iv, input, output); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ @@ -450,8 +450,8 @@ static int camellia_crypt_cfb128_wrap(void* ctx, mbedtls_operation_t operation, static int camellia_crypt_ctr_wrap(void* ctx, size_t length, size_t* nc_off, unsigned char* nonce_counter, unsigned char* stream_block, const unsigned char* input, unsigned char* output) { - return mbedtls_camellia_crypt_ctr( - (mbedtls_camellia_context*)ctx, length, nc_off, nonce_counter, stream_block, input, output); + return mbedtls_camellia_crypt_ctr((mbedtls_camellia_context*)ctx, length, nc_off, nonce_counter, + stream_block, input, output); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ @@ -546,8 +546,8 @@ static const mbedtls_cipher_info_t camellia_256_ctr_info = {MBEDTLS_CIPHER_CAMEL #if defined(MBEDTLS_GCM_C) static int gcm_camellia_setkey_wrap(void* ctx, const unsigned char* key, unsigned int key_bitlen) { - return mbedtls_gcm_setkey( - (mbedtls_gcm_context*)ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, key_bitlen); + return mbedtls_gcm_setkey((mbedtls_gcm_context*)ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, + key_bitlen); } static const mbedtls_cipher_base_t gcm_camellia_info = { @@ -592,8 +592,8 @@ static const mbedtls_cipher_info_t camellia_256_gcm_info = {MBEDTLS_CIPHER_CAMEL #if defined(MBEDTLS_CCM_C) static int ccm_camellia_setkey_wrap(void* ctx, const unsigned char* key, unsigned int key_bitlen) { - return mbedtls_ccm_setkey( - (mbedtls_ccm_context*)ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, key_bitlen); + return mbedtls_ccm_setkey((mbedtls_ccm_context*)ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, + key_bitlen); } static const mbedtls_cipher_base_t ccm_camellia_info = { @@ -652,8 +652,8 @@ static const mbedtls_cipher_info_t camellia_256_ccm_star_no_tag_info = { #if defined(MBEDTLS_ARIA_C) -static int aria_crypt_ecb_wrap( - void* ctx, mbedtls_operation_t operation, const unsigned char* input, unsigned char* output) { +static int aria_crypt_ecb_wrap(void* ctx, mbedtls_operation_t operation, const unsigned char* input, + unsigned char* output) { (void)operation; return mbedtls_aria_crypt_ecb((mbedtls_aria_context*)ctx, input, output); } @@ -668,8 +668,8 @@ static int aria_crypt_cbc_wrap(void* ctx, mbedtls_operation_t operation, size_t #if defined(MBEDTLS_CIPHER_MODE_CFB) static int aria_crypt_cfb128_wrap(void* ctx, mbedtls_operation_t operation, size_t length, size_t* iv_off, unsigned char* iv, const unsigned char* input, unsigned char* output) { - return mbedtls_aria_crypt_cfb128( - (mbedtls_aria_context*)ctx, operation, length, iv_off, iv, input, output); + return mbedtls_aria_crypt_cfb128((mbedtls_aria_context*)ctx, operation, length, iv_off, iv, + input, output); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ @@ -677,8 +677,8 @@ static int aria_crypt_cfb128_wrap(void* ctx, mbedtls_operation_t operation, size static int aria_crypt_ctr_wrap(void* ctx, size_t length, size_t* nc_off, unsigned char* nonce_counter, unsigned char* stream_block, const unsigned char* input, unsigned char* output) { - return mbedtls_aria_crypt_ctr( - (mbedtls_aria_context*)ctx, length, nc_off, nonce_counter, stream_block, input, output); + return mbedtls_aria_crypt_ctr((mbedtls_aria_context*)ctx, length, nc_off, nonce_counter, + stream_block, input, output); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ @@ -728,24 +728,24 @@ static const mbedtls_cipher_base_t aria_info = {MBEDTLS_CIPHER_ID_ARIA, aria_cry #endif aria_setkey_enc_wrap, aria_setkey_dec_wrap, aria_ctx_alloc, aria_ctx_free}; -static const mbedtls_cipher_info_t aria_128_ecb_info = { - MBEDTLS_CIPHER_ARIA_128_ECB, MBEDTLS_MODE_ECB, 128, "ARIA-128-ECB", 0, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_128_ecb_info = {MBEDTLS_CIPHER_ARIA_128_ECB, + MBEDTLS_MODE_ECB, 128, "ARIA-128-ECB", 0, 0, 16, &aria_info}; -static const mbedtls_cipher_info_t aria_192_ecb_info = { - MBEDTLS_CIPHER_ARIA_192_ECB, MBEDTLS_MODE_ECB, 192, "ARIA-192-ECB", 0, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_192_ecb_info = {MBEDTLS_CIPHER_ARIA_192_ECB, + MBEDTLS_MODE_ECB, 192, "ARIA-192-ECB", 0, 0, 16, &aria_info}; -static const mbedtls_cipher_info_t aria_256_ecb_info = { - MBEDTLS_CIPHER_ARIA_256_ECB, MBEDTLS_MODE_ECB, 256, "ARIA-256-ECB", 0, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_256_ecb_info = {MBEDTLS_CIPHER_ARIA_256_ECB, + MBEDTLS_MODE_ECB, 256, "ARIA-256-ECB", 0, 0, 16, &aria_info}; #if defined(MBEDTLS_CIPHER_MODE_CBC) -static const mbedtls_cipher_info_t aria_128_cbc_info = { - MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MODE_CBC, 128, "ARIA-128-CBC", 16, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_128_cbc_info = {MBEDTLS_CIPHER_ARIA_128_CBC, + MBEDTLS_MODE_CBC, 128, "ARIA-128-CBC", 16, 0, 16, &aria_info}; -static const mbedtls_cipher_info_t aria_192_cbc_info = { - MBEDTLS_CIPHER_ARIA_192_CBC, MBEDTLS_MODE_CBC, 192, "ARIA-192-CBC", 16, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_192_cbc_info = {MBEDTLS_CIPHER_ARIA_192_CBC, + MBEDTLS_MODE_CBC, 192, "ARIA-192-CBC", 16, 0, 16, &aria_info}; -static const mbedtls_cipher_info_t aria_256_cbc_info = { - MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MODE_CBC, 256, "ARIA-256-CBC", 16, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_256_cbc_info = {MBEDTLS_CIPHER_ARIA_256_CBC, + MBEDTLS_MODE_CBC, 256, "ARIA-256-CBC", 16, 0, 16, &aria_info}; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) @@ -760,14 +760,14 @@ static const mbedtls_cipher_info_t aria_256_cfb128_info = {MBEDTLS_CIPHER_ARIA_2 #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) -static const mbedtls_cipher_info_t aria_128_ctr_info = { - MBEDTLS_CIPHER_ARIA_128_CTR, MBEDTLS_MODE_CTR, 128, "ARIA-128-CTR", 16, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_128_ctr_info = {MBEDTLS_CIPHER_ARIA_128_CTR, + MBEDTLS_MODE_CTR, 128, "ARIA-128-CTR", 16, 0, 16, &aria_info}; -static const mbedtls_cipher_info_t aria_192_ctr_info = { - MBEDTLS_CIPHER_ARIA_192_CTR, MBEDTLS_MODE_CTR, 192, "ARIA-192-CTR", 16, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_192_ctr_info = {MBEDTLS_CIPHER_ARIA_192_CTR, + MBEDTLS_MODE_CTR, 192, "ARIA-192-CTR", 16, 0, 16, &aria_info}; -static const mbedtls_cipher_info_t aria_256_ctr_info = { - MBEDTLS_CIPHER_ARIA_256_CTR, MBEDTLS_MODE_CTR, 256, "ARIA-256-CTR", 16, 0, 16, &aria_info}; +static const mbedtls_cipher_info_t aria_256_ctr_info = {MBEDTLS_CIPHER_ARIA_256_CTR, + MBEDTLS_MODE_CTR, 256, "ARIA-256-CTR", 16, 0, 16, &aria_info}; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_GCM_C) @@ -870,14 +870,14 @@ static const mbedtls_cipher_info_t aria_256_ccm_star_no_tag_info = { #if defined(MBEDTLS_DES_C) -static int des_crypt_ecb_wrap( - void* ctx, mbedtls_operation_t operation, const unsigned char* input, unsigned char* output) { +static int des_crypt_ecb_wrap(void* ctx, mbedtls_operation_t operation, const unsigned char* input, + unsigned char* output) { ((void)operation); return mbedtls_des_crypt_ecb((mbedtls_des_context*)ctx, input, output); } -static int des3_crypt_ecb_wrap( - void* ctx, mbedtls_operation_t operation, const unsigned char* input, unsigned char* output) { +static int des3_crypt_ecb_wrap(void* ctx, mbedtls_operation_t operation, const unsigned char* input, + unsigned char* output) { ((void)operation); return mbedtls_des3_crypt_ecb((mbedtls_des3_context*)ctx, input, output); } @@ -1064,8 +1064,8 @@ static int chacha20_setkey_wrap(void* ctx, const unsigned char* key, unsigned in return (0); } -static int chacha20_stream_wrap( - void* ctx, size_t length, const unsigned char* input, unsigned char* output) { +static int chacha20_stream_wrap(void* ctx, size_t length, const unsigned char* input, + unsigned char* output) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; ret = mbedtls_chacha20_update(ctx, length, input, output); @@ -1112,8 +1112,8 @@ static const mbedtls_cipher_base_t chacha20_base_info = {MBEDTLS_CIPHER_ID_CHACH chacha20_stream_wrap, #endif chacha20_setkey_wrap, chacha20_setkey_wrap, chacha20_ctx_alloc, chacha20_ctx_free}; -static const mbedtls_cipher_info_t chacha20_info = { - MBEDTLS_CIPHER_CHACHA20, MBEDTLS_MODE_STREAM, 256, "CHACHA20", 12, 0, 1, &chacha20_base_info}; +static const mbedtls_cipher_info_t chacha20_info = {MBEDTLS_CIPHER_CHACHA20, MBEDTLS_MODE_STREAM, + 256, "CHACHA20", 12, 0, 1, &chacha20_base_info}; #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) @@ -1170,8 +1170,8 @@ static const mbedtls_cipher_info_t chachapoly_info = {MBEDTLS_CIPHER_CHACHA20_PO #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) -static int null_crypt_stream( - void* ctx, size_t length, const unsigned char* input, unsigned char* output) { +static int null_crypt_stream(void* ctx, size_t length, const unsigned char* input, + unsigned char* output) { ((void)ctx); memmove(output, input, length); return (0); @@ -1214,8 +1214,8 @@ static const mbedtls_cipher_base_t null_base_info = {MBEDTLS_CIPHER_ID_NULL, NUL #endif null_setkey, null_setkey, null_ctx_alloc, null_ctx_free}; -static const mbedtls_cipher_info_t null_cipher_info = { - MBEDTLS_CIPHER_NULL, MBEDTLS_MODE_STREAM, 0, "NULL", 0, 0, 1, &null_base_info}; +static const mbedtls_cipher_info_t null_cipher_info = {MBEDTLS_CIPHER_NULL, MBEDTLS_MODE_STREAM, 0, + "NULL", 0, 0, 1, &null_base_info}; #endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */ #if defined(MBEDTLS_NIST_KW_C) @@ -1234,13 +1234,13 @@ static void kw_ctx_free(void* ctx) { } static int kw_aes_setkey_wrap(void* ctx, const unsigned char* key, unsigned int key_bitlen) { - return mbedtls_nist_kw_setkey( - (mbedtls_nist_kw_context*)ctx, MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 1); + return mbedtls_nist_kw_setkey((mbedtls_nist_kw_context*)ctx, MBEDTLS_CIPHER_ID_AES, key, + key_bitlen, 1); } static int kw_aes_setkey_unwrap(void* ctx, const unsigned char* key, unsigned int key_bitlen) { - return mbedtls_nist_kw_setkey( - (mbedtls_nist_kw_context*)ctx, MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 0); + return mbedtls_nist_kw_setkey((mbedtls_nist_kw_context*)ctx, MBEDTLS_CIPHER_ID_AES, key, + key_bitlen, 0); } static const mbedtls_cipher_base_t kw_aes_info = { @@ -1270,23 +1270,23 @@ static const mbedtls_cipher_base_t kw_aes_info = { kw_ctx_free, }; -static const mbedtls_cipher_info_t aes_128_nist_kw_info = { - MBEDTLS_CIPHER_AES_128_KW, MBEDTLS_MODE_KW, 128, "AES-128-KW", 0, 0, 16, &kw_aes_info}; +static const mbedtls_cipher_info_t aes_128_nist_kw_info = {MBEDTLS_CIPHER_AES_128_KW, + MBEDTLS_MODE_KW, 128, "AES-128-KW", 0, 0, 16, &kw_aes_info}; -static const mbedtls_cipher_info_t aes_192_nist_kw_info = { - MBEDTLS_CIPHER_AES_192_KW, MBEDTLS_MODE_KW, 192, "AES-192-KW", 0, 0, 16, &kw_aes_info}; +static const mbedtls_cipher_info_t aes_192_nist_kw_info = {MBEDTLS_CIPHER_AES_192_KW, + MBEDTLS_MODE_KW, 192, "AES-192-KW", 0, 0, 16, &kw_aes_info}; -static const mbedtls_cipher_info_t aes_256_nist_kw_info = { - MBEDTLS_CIPHER_AES_256_KW, MBEDTLS_MODE_KW, 256, "AES-256-KW", 0, 0, 16, &kw_aes_info}; +static const mbedtls_cipher_info_t aes_256_nist_kw_info = {MBEDTLS_CIPHER_AES_256_KW, + MBEDTLS_MODE_KW, 256, "AES-256-KW", 0, 0, 16, &kw_aes_info}; -static const mbedtls_cipher_info_t aes_128_nist_kwp_info = { - MBEDTLS_CIPHER_AES_128_KWP, MBEDTLS_MODE_KWP, 128, "AES-128-KWP", 0, 0, 16, &kw_aes_info}; +static const mbedtls_cipher_info_t aes_128_nist_kwp_info = {MBEDTLS_CIPHER_AES_128_KWP, + MBEDTLS_MODE_KWP, 128, "AES-128-KWP", 0, 0, 16, &kw_aes_info}; -static const mbedtls_cipher_info_t aes_192_nist_kwp_info = { - MBEDTLS_CIPHER_AES_192_KWP, MBEDTLS_MODE_KWP, 192, "AES-192-KWP", 0, 0, 16, &kw_aes_info}; +static const mbedtls_cipher_info_t aes_192_nist_kwp_info = {MBEDTLS_CIPHER_AES_192_KWP, + MBEDTLS_MODE_KWP, 192, "AES-192-KWP", 0, 0, 16, &kw_aes_info}; -static const mbedtls_cipher_info_t aes_256_nist_kwp_info = { - MBEDTLS_CIPHER_AES_256_KWP, MBEDTLS_MODE_KWP, 256, "AES-256-KWP", 0, 0, 16, &kw_aes_info}; +static const mbedtls_cipher_info_t aes_256_nist_kwp_info = {MBEDTLS_CIPHER_AES_256_KWP, + MBEDTLS_MODE_KWP, 256, "AES-256-KWP", 0, 0, 16, &kw_aes_info}; #endif /* MBEDTLS_NIST_KW_C */ const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] = { diff --git a/extension/httpfs/third_party/mbedtls/library/cipher_wrap.h b/extension/httpfs/third_party/mbedtls/library/cipher_wrap.h index ce7a08f0505..5da60eba5c0 100644 --- a/extension/httpfs/third_party/mbedtls/library/cipher_wrap.h +++ b/extension/httpfs/third_party/mbedtls/library/cipher_wrap.h @@ -43,8 +43,8 @@ struct mbedtls_cipher_base_t { mbedtls_cipher_id_t cipher; /** Encrypt using ECB */ - int (*ecb_func)( - void* ctx, mbedtls_operation_t mode, const unsigned char* input, unsigned char* output); + int (*ecb_func)(void* ctx, mbedtls_operation_t mode, const unsigned char* input, + unsigned char* output); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** Encrypt using CBC */ diff --git a/extension/httpfs/third_party/mbedtls/library/common.h b/extension/httpfs/third_party/mbedtls/library/common.h index bf39453a222..1fe2fe6af06 100644 --- a/extension/httpfs/third_party/mbedtls/library/common.h +++ b/extension/httpfs/third_party/mbedtls/library/common.h @@ -72,7 +72,7 @@ extern void (*mbedtls_test_hook_test_fail)(const char* test, int line, const cha * Given a multi-byte integer \p x, MBEDTLS_BYTE_n retrieves the n-th * byte from x, where byte 0 is the least significant byte. */ -#define MBEDTLS_BYTE_0(x) ((uint8_t)((x)&0xff)) +#define MBEDTLS_BYTE_0(x) ((uint8_t)((x) & 0xff)) #define MBEDTLS_BYTE_1(x) ((uint8_t)(((x) >> 8) & 0xff)) #define MBEDTLS_BYTE_2(x) ((uint8_t)(((x) >> 16) & 0xff)) #define MBEDTLS_BYTE_3(x) ((uint8_t)(((x) >> 24) & 0xff)) diff --git a/extension/httpfs/third_party/mbedtls/library/constant_time.cpp b/extension/httpfs/third_party/mbedtls/library/constant_time.cpp index ede6c964764..d554e3e657e 100644 --- a/extension/httpfs/third_party/mbedtls/library/constant_time.cpp +++ b/extension/httpfs/third_party/mbedtls/library/constant_time.cpp @@ -154,8 +154,8 @@ size_t mbedtls_ct_size_mask_ge(size_t x, size_t y) { * Constant flow with respect to c. */ MBEDTLS_STATIC_TESTABLE -unsigned char mbedtls_ct_uchar_mask_of_range( - unsigned char low, unsigned char high, unsigned char c) { +unsigned char mbedtls_ct_uchar_mask_of_range(unsigned char low, unsigned char high, + unsigned char c) { /* low_mask is: 0 if low <= c, 0x...ff if low > c */ unsigned low_mask = ((unsigned)c - low) >> 8; /* high_mask is: 0 if c <= high, 0x...ff if c > high */ @@ -276,8 +276,8 @@ static int mbedtls_ct_cond_select_sign(unsigned char condition, int if1, int if0 return ((int)ur - 1); } -void mbedtls_ct_mpi_uint_cond_assign( - size_t n, mbedtls_mpi_uint* dest, const mbedtls_mpi_uint* src, unsigned char condition) { +void mbedtls_ct_mpi_uint_cond_assign(size_t n, mbedtls_mpi_uint* dest, const mbedtls_mpi_uint* src, + unsigned char condition) { size_t i; /* MSVC has a warning about unary minus on unsigned integer types, @@ -374,8 +374,8 @@ static void mbedtls_ct_mem_move_to_left(void* start, size_t total, size_t offset #if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) -void mbedtls_ct_memcpy_if_eq( - unsigned char* dest, const unsigned char* src, size_t len, size_t c1, size_t c2) { +void mbedtls_ct_memcpy_if_eq(unsigned char* dest, const unsigned char* src, size_t len, size_t c1, + size_t c2) { /* mask = c1 == c2 ? 0xff : 0x00 */ const size_t equal = mbedtls_ct_size_bool_eq(c1, c2); const unsigned char mask = (unsigned char)mbedtls_ct_size_mask(equal); @@ -609,8 +609,8 @@ int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi* X, const mbedtls_mpi* Y, unsigned* #if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) -int mbedtls_ct_rsaes_pkcs1_v15_unpadding( - unsigned char* input, size_t ilen, unsigned char* output, size_t output_max_len, size_t* olen) { +int mbedtls_ct_rsaes_pkcs1_v15_unpadding(unsigned char* input, size_t ilen, unsigned char* output, + size_t output_max_len, size_t* olen) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t i, plaintext_max_size; @@ -689,8 +689,8 @@ int mbedtls_ct_rsaes_pkcs1_v15_unpadding( * Copy anyway to avoid revealing the length through timing, because * revealing the length is as bad as revealing the padding validity * for a Bleichenbacher attack. */ - plaintext_size = mbedtls_ct_uint_if( - output_too_large, (unsigned)plaintext_max_size, (unsigned)plaintext_size); + plaintext_size = mbedtls_ct_uint_if(output_too_large, (unsigned)plaintext_max_size, + (unsigned)plaintext_size); /* Move the plaintext to the leftmost position where it can start in * the working buffer, i.e. make it start plaintext_max_size from @@ -698,8 +698,8 @@ int mbedtls_ct_rsaes_pkcs1_v15_unpadding( * does not depend on the plaintext size. After this move, the * starting location of the plaintext is no longer sensitive * information. */ - mbedtls_ct_mem_move_to_left( - input + ilen - plaintext_max_size, plaintext_max_size, plaintext_max_size - plaintext_size); + mbedtls_ct_mem_move_to_left(input + ilen - plaintext_max_size, plaintext_max_size, + plaintext_max_size - plaintext_size); /* Finally copy the decrypted plaintext plus trailing zeros into the output * buffer. If output_max_len is 0, then output may be an invalid pointer diff --git a/extension/httpfs/third_party/mbedtls/library/constant_time_internal.h b/extension/httpfs/third_party/mbedtls/library/constant_time_internal.h index 17d7d4ddf88..30eeccb6d19 100644 --- a/extension/httpfs/third_party/mbedtls/library/constant_time_internal.h +++ b/extension/httpfs/third_party/mbedtls/library/constant_time_internal.h @@ -154,8 +154,8 @@ unsigned mbedtls_ct_uint_if(unsigned condition, unsigned if1, unsigned if0); * initialized MPI. * \param condition Condition to test, must be 0 or 1. */ -void mbedtls_ct_mpi_uint_cond_assign( - size_t n, mbedtls_mpi_uint* dest, const mbedtls_mpi_uint* src, unsigned char condition); +void mbedtls_ct_mpi_uint_cond_assign(size_t n, mbedtls_mpi_uint* dest, const mbedtls_mpi_uint* src, + unsigned char condition); #endif /* MBEDTLS_BIGNUM_C */ @@ -201,8 +201,8 @@ signed char mbedtls_ct_base64_dec_value(unsigned char c); * \param c1 The first value to analyze in the condition. * \param c2 The second value to analyze in the condition. */ -void mbedtls_ct_memcpy_if_eq( - unsigned char* dest, const unsigned char* src, size_t len, size_t c1, size_t c2); +void mbedtls_ct_memcpy_if_eq(unsigned char* dest, const unsigned char* src, size_t len, size_t c1, + size_t c2); /** Copy data from a secret position with constant flow. * @@ -296,8 +296,8 @@ int mbedtls_ct_hmac(mbedtls_md_context_t* ctx, const unsigned char* add_data, si * \return #MBEDTLS_ERR_RSA_INVALID_PADDING * The input doesn't contain properly formatted padding. */ -int mbedtls_ct_rsaes_pkcs1_v15_unpadding( - unsigned char* input, size_t ilen, unsigned char* output, size_t output_max_len, size_t* olen); +int mbedtls_ct_rsaes_pkcs1_v15_unpadding(unsigned char* input, size_t ilen, unsigned char* output, + size_t output_max_len, size_t* olen); #endif /* MBEDTLS_PKCS1_V15 && MBEDTLS_RSA_C && ! MBEDTLS_RSA_ALT */ diff --git a/extension/httpfs/third_party/mbedtls/library/constant_time_invasive.h b/extension/httpfs/third_party/mbedtls/library/constant_time_invasive.h index fdb4c285db4..9dcd31bb45e 100644 --- a/extension/httpfs/third_party/mbedtls/library/constant_time_invasive.h +++ b/extension/httpfs/third_party/mbedtls/library/constant_time_invasive.h @@ -42,8 +42,8 @@ * * \return All-bits-one if \p low <= \p c <= \p high, otherwise zero. */ -unsigned char mbedtls_ct_uchar_mask_of_range( - unsigned char low, unsigned char high, unsigned char c); +unsigned char mbedtls_ct_uchar_mask_of_range(unsigned char low, unsigned char high, + unsigned char c); #endif /* MBEDTLS_TEST_HOOKS */ diff --git a/extension/httpfs/third_party/mbedtls/library/entropy.cpp b/extension/httpfs/third_party/mbedtls/library/entropy.cpp index b3a1b52bfa0..533c2935462 100644 --- a/extension/httpfs/third_party/mbedtls/library/entropy.cpp +++ b/extension/httpfs/third_party/mbedtls/library/entropy.cpp @@ -37,12 +37,12 @@ #endif #if defined(MBEDTLS_SELF_TEST) -//#if defined(MBEDTLS_PLATFORM_C) -//#include "mbedtls/platform.h" -//#else -//#include -//#define mbedtls_printf printf -//#endif /* MBEDTLS_PLATFORM_C */ +// #if defined(MBEDTLS_PLATFORM_C) +// #include "mbedtls/platform.h" +// #else +// #include +// #define mbedtls_printf printf +// #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */ @@ -75,8 +75,8 @@ void mbedtls_entropy_init(mbedtls_entropy_context* ctx) { MBEDTLS_ENTROPY_SOURCE_STRONG); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) - mbedtls_entropy_add_source( - ctx, mbedtls_nv_seed_poll, NULL, MBEDTLS_ENTROPY_BLOCK_SIZE, MBEDTLS_ENTROPY_SOURCE_STRONG); + mbedtls_entropy_add_source(ctx, mbedtls_nv_seed_poll, NULL, MBEDTLS_ENTROPY_BLOCK_SIZE, + MBEDTLS_ENTROPY_SOURCE_STRONG); ctx->initial_entropy_run = 0; #endif #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ @@ -138,8 +138,8 @@ int mbedtls_entropy_add_source(mbedtls_entropy_context* ctx, mbedtls_entropy_f_s /* * Entropy accumulator update */ -static int entropy_update( - mbedtls_entropy_context* ctx, unsigned char source_id, const unsigned char* data, size_t len) { +static int entropy_update(mbedtls_entropy_context* ctx, unsigned char source_id, + const unsigned char* data, size_t len) { unsigned char header[2]; unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE]; size_t use_len = len; @@ -190,8 +190,8 @@ static int entropy_update( return (ret); } -int mbedtls_entropy_update_manual( - mbedtls_entropy_context* ctx, const unsigned char* data, size_t len) { +int mbedtls_entropy_update_manual(mbedtls_entropy_context* ctx, const unsigned char* data, + size_t len) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; #if defined(MBEDTLS_THREADING_C) @@ -230,8 +230,8 @@ static int entropy_gather_internal(mbedtls_entropy_context* ctx) { have_one_strong = 1; olen = 0; - if ((ret = ctx->source[i].f_source( - ctx->source[i].p_source, buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen)) != 0) { + if ((ret = ctx->source[i].f_source(ctx->source[i].p_source, buf, MBEDTLS_ENTROPY_MAX_GATHER, + &olen)) != 0) { goto cleanup; } @@ -594,8 +594,8 @@ int mbedtls_entropy_self_test(int verbose) { if ((ret = mbedtls_entropy_gather(&ctx)) != 0) goto cleanup; - ret = mbedtls_entropy_add_source( - &ctx, entropy_dummy_source, NULL, 16, MBEDTLS_ENTROPY_SOURCE_WEAK); + ret = mbedtls_entropy_add_source(&ctx, entropy_dummy_source, NULL, 16, + MBEDTLS_ENTROPY_SOURCE_WEAK); if (ret != 0) goto cleanup; diff --git a/extension/httpfs/third_party/mbedtls/library/gcm.cpp b/extension/httpfs/third_party/mbedtls/library/gcm.cpp index d7cf192d13a..cccba00af15 100644 --- a/extension/httpfs/third_party/mbedtls/library/gcm.cpp +++ b/extension/httpfs/third_party/mbedtls/library/gcm.cpp @@ -171,8 +171,8 @@ static const uint64_t last4[16] = {0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca * Sets output to x times H using the precomputed tables. * x and output are seen as elements of GF(2^128) as in [MGV]. */ -static void gcm_mult( - mbedtls_gcm_context* ctx, const unsigned char x[16], unsigned char output[16]) { +static void gcm_mult(mbedtls_gcm_context* ctx, const unsigned char x[16], + unsigned char output[16]) { int i = 0; unsigned char lo, hi, rem; uint64_t zh, zl; @@ -831,15 +831,15 @@ int mbedtls_gcm_self_test(int verbose) { if (ret != 0) goto exit; - ret = mbedtls_gcm_update_ad( - &ctx, additional_test_data[add_index_test_data[i]], add_len_test_data[i]); + ret = mbedtls_gcm_update_ad(&ctx, additional_test_data[add_index_test_data[i]], + add_len_test_data[i]); if (ret != 0) goto exit; if (pt_len_test_data[i] > 32) { size_t rest_len = pt_len_test_data[i] - 32; - ret = mbedtls_gcm_update( - &ctx, pt_test_data[pt_index_test_data[i]], 32, buf, sizeof(buf), &olen); + ret = mbedtls_gcm_update(&ctx, pt_test_data[pt_index_test_data[i]], 32, buf, + sizeof(buf), &olen); if (ret != 0) goto exit; if (olen != 32) @@ -888,8 +888,8 @@ int mbedtls_gcm_self_test(int verbose) { iv_len_test_data[i]); if (ret != 0) goto exit; - ret = mbedtls_gcm_update_ad( - &ctx, additional_test_data[add_index_test_data[i]], add_len_test_data[i]); + ret = mbedtls_gcm_update_ad(&ctx, additional_test_data[add_index_test_data[i]], + add_len_test_data[i]); if (ret != 0) goto exit; @@ -909,8 +909,8 @@ int mbedtls_gcm_self_test(int verbose) { if (olen != rest_len) goto exit; } else { - ret = mbedtls_gcm_update( - &ctx, ct_test_data[j * 6 + i], pt_len_test_data[i], buf, sizeof(buf), &olen); + ret = mbedtls_gcm_update(&ctx, ct_test_data[j * 6 + i], pt_len_test_data[i], buf, + sizeof(buf), &olen); if (ret != 0) goto exit; if (olen != pt_len_test_data[i]) diff --git a/extension/httpfs/third_party/mbedtls/library/md.cpp b/extension/httpfs/third_party/mbedtls/library/md.cpp index b8381bd6085..ee05ad9f7e0 100644 --- a/extension/httpfs/third_party/mbedtls/library/md.cpp +++ b/extension/httpfs/third_party/mbedtls/library/md.cpp @@ -316,14 +316,14 @@ int mbedtls_md_clone(mbedtls_md_context_t* dst, const mbedtls_md_context_t* src) #endif #if defined(MBEDTLS_SHA224_C) case MBEDTLS_MD_SHA224: - mbedtls_sha256_clone( - (mbedtls_sha256_context*)dst->md_ctx, (mbedtls_sha256_context*)src->md_ctx); + mbedtls_sha256_clone((mbedtls_sha256_context*)dst->md_ctx, + (mbedtls_sha256_context*)src->md_ctx); break; #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: - mbedtls_sha256_clone( - (mbedtls_sha256_context*)dst->md_ctx, (mbedtls_sha256_context*)src->md_ctx); + mbedtls_sha256_clone((mbedtls_sha256_context*)dst->md_ctx, + (mbedtls_sha256_context*)src->md_ctx); break; #endif #if defined(MBEDTLS_SHA384_C) @@ -511,8 +511,8 @@ int mbedtls_md_finish(mbedtls_md_context_t* ctx, unsigned char* output) { #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: - return (mbedtls_sha256_finish( - (mbedtls_sha256_context*)(mbedtls_sha256_context*)ctx->md_ctx, output)); + return (mbedtls_sha256_finish((mbedtls_sha256_context*)(mbedtls_sha256_context*)ctx->md_ctx, + output)); #endif #if defined(MBEDTLS_SHA384_C) case MBEDTLS_MD_SHA384: diff --git a/extension/httpfs/third_party/mbedtls/library/oid.cpp b/extension/httpfs/third_party/mbedtls/library/oid.cpp index 948d82e1240..1782225d719 100644 --- a/extension/httpfs/third_party/mbedtls/library/oid.cpp +++ b/extension/httpfs/third_party/mbedtls/library/oid.cpp @@ -225,8 +225,8 @@ static const oid_x520_attr_t oid_x520_attr_type[] = { "title", }, { - OID_DESCRIPTOR( - MBEDTLS_OID_AT_DN_QUALIFIER, "id-at-dnQualifier", "Distinguished Name qualifier"), + OID_DESCRIPTOR(MBEDTLS_OID_AT_DN_QUALIFIER, "id-at-dnQualifier", + "Distinguished Name qualifier"), "dnQualifier", }, { @@ -242,8 +242,8 @@ static const oid_x520_attr_t oid_x520_attr_type[] = { "DC", }, { - OID_DESCRIPTOR( - MBEDTLS_OID_AT_UNIQUE_IDENTIFIER, "id-at-uniqueIdentifier", "Unique Identifier"), + OID_DESCRIPTOR(MBEDTLS_OID_AT_UNIQUE_IDENTIFIER, "id-at-uniqueIdentifier", + "Unique Identifier"), "uniqueIdentifier", }, { @@ -252,8 +252,8 @@ static const oid_x520_attr_t oid_x520_attr_type[] = { }}; FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type) -FN_OID_GET_ATTR1( - mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char*, short_name) +FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char*, + short_name) /* * For X509 extensions @@ -265,8 +265,8 @@ typedef struct { static const oid_x509_ext_t oid_x509_ext[] = { { - OID_DESCRIPTOR( - MBEDTLS_OID_BASIC_CONSTRAINTS, "id-ce-basicConstraints", "Basic Constraints"), + OID_DESCRIPTOR(MBEDTLS_OID_BASIC_CONSTRAINTS, "id-ce-basicConstraints", + "Basic Constraints"), MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS, }, { @@ -282,13 +282,13 @@ static const oid_x509_ext_t oid_x509_ext[] = { MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME, }, { - OID_DESCRIPTOR( - MBEDTLS_OID_NS_CERT_TYPE, "id-netscape-certtype", "Netscape Certificate Type"), + OID_DESCRIPTOR(MBEDTLS_OID_NS_CERT_TYPE, "id-netscape-certtype", + "Netscape Certificate Type"), MBEDTLS_OID_X509_EXT_NS_CERT_TYPE, }, { - OID_DESCRIPTOR( - MBEDTLS_OID_CERTIFICATE_POLICIES, "id-ce-certificatePolicies", "Certificate Policies"), + OID_DESCRIPTOR(MBEDTLS_OID_CERTIFICATE_POLICIES, "id-ce-certificatePolicies", + "Certificate Policies"), MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES, }, { @@ -443,8 +443,8 @@ static const oid_sig_alg_t oid_sig_alg[] = { FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg) #if !defined(MBEDTLS_X509_REMOVE_INFO) -FN_OID_GET_DESCRIPTOR_ATTR1( - mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char*, description) +FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char*, + description) #endif FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, oid_sig_alg_t, sig_alg, mbedtls_md_type_t, md_alg, @@ -482,8 +482,8 @@ static const oid_pk_alg_t oid_pk_alg[] = { FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg) -FN_OID_GET_OID_BY_ATTR1( - mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, pk_alg) +FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, + pk_alg) #if defined(MBEDTLS_ECP_C) /* @@ -569,8 +569,8 @@ static const oid_ecp_grp_t oid_ecp_grp[] = { FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp) FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id) -FN_OID_GET_OID_BY_ATTR1( - mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, mbedtls_ecp_group_id, grp_id) +FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, + mbedtls_ecp_group_id, grp_id) #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_CIPHER_C) @@ -598,8 +598,8 @@ static const oid_cipher_alg_t oid_cipher_alg[] = { }; FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg) -FN_OID_GET_ATTR1( - mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, cipher_alg) +FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, + cipher_alg) #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_MD_C) @@ -662,8 +662,8 @@ static const oid_md_alg_t oid_md_alg[] = { FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg) -FN_OID_GET_OID_BY_ATTR1( - mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, md_alg) +FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, + md_alg) /* * For HMAC digestAlgorithm diff --git a/extension/httpfs/third_party/mbedtls/library/pem.cpp b/extension/httpfs/third_party/mbedtls/library/pem.cpp index c55fbd29f67..ea6532b6122 100644 --- a/extension/httpfs/third_party/mbedtls/library/pem.cpp +++ b/extension/httpfs/third_party/mbedtls/library/pem.cpp @@ -77,8 +77,8 @@ static int pem_get_iv(const unsigned char* s, unsigned char* iv, size_t iv_len) return (0); } -static int pem_pbkdf1( - unsigned char* key, size_t keylen, unsigned char* iv, const unsigned char* pwd, size_t pwdlen) { +static int pem_pbkdf1(unsigned char* key, size_t keylen, unsigned char* iv, + const unsigned char* pwd, size_t pwdlen) { mbedtls_md5_context md5_ctx; unsigned char md5sum[16]; size_t use_len; diff --git a/extension/httpfs/third_party/mbedtls/library/pk.cpp b/extension/httpfs/third_party/mbedtls/library/pk.cpp index 96f8d8149ad..a4c862862f8 100644 --- a/extension/httpfs/third_party/mbedtls/library/pk.cpp +++ b/extension/httpfs/third_party/mbedtls/library/pk.cpp @@ -272,8 +272,8 @@ int mbedtls_pk_verify_restartable(mbedtls_pk_context* ctx, mbedtls_md_type_t md_ if ((ret = pk_restart_setup(rs_ctx, ctx->pk_info)) != 0) return (ret); - ret = ctx->pk_info->verify_rs_func( - ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, rs_ctx->rs_ctx); + ret = ctx->pk_info->verify_rs_func(ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, + rs_ctx->rs_ctx); if (ret != MBEDTLS_ERR_ECP_IN_PROGRESS) mbedtls_pk_restart_free(rs_ctx); @@ -390,8 +390,8 @@ int mbedtls_pk_sign_restartable(mbedtls_pk_context* ctx, mbedtls_md_type_t md_al if (ctx->pk_info->sign_func == NULL) return (MBEDTLS_ERR_PK_TYPE_MISMATCH); - return (ctx->pk_info->sign_func( - ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_size, sig_len, f_rng, p_rng)); + return (ctx->pk_info->sign_func(ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_size, sig_len, + f_rng, p_rng)); } /* @@ -400,8 +400,8 @@ int mbedtls_pk_sign_restartable(mbedtls_pk_context* ctx, mbedtls_md_type_t md_al int mbedtls_pk_sign(mbedtls_pk_context* ctx, mbedtls_md_type_t md_alg, const unsigned char* hash, size_t hash_len, unsigned char* sig, size_t sig_size, size_t* sig_len, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { - return (mbedtls_pk_sign_restartable( - ctx, md_alg, hash, hash_len, sig, sig_size, sig_len, f_rng, p_rng, NULL)); + return (mbedtls_pk_sign_restartable(ctx, md_alg, hash, hash_len, sig, sig_size, sig_len, f_rng, + p_rng, NULL)); } /* diff --git a/extension/httpfs/third_party/mbedtls/library/pk_wrap.cpp b/extension/httpfs/third_party/mbedtls/library/pk_wrap.cpp index b5eb7edd9e6..ce2499a4fb5 100644 --- a/extension/httpfs/third_party/mbedtls/library/pk_wrap.cpp +++ b/extension/httpfs/third_party/mbedtls/library/pk_wrap.cpp @@ -139,12 +139,12 @@ static int rsa_encrypt_wrap(void* ctx, const unsigned char* input, size_t ilen, return (mbedtls_rsa_pkcs1_encrypt(rsa, f_rng, p_rng, ilen, input, output)); } -static int rsa_check_pair_wrap( - const void* pub, const void* prv, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +static int rsa_check_pair_wrap(const void* pub, const void* prv, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { (void)f_rng; (void)p_rng; - return (mbedtls_rsa_check_pub_priv( - (const mbedtls_rsa_context*)pub, (const mbedtls_rsa_context*)prv)); + return (mbedtls_rsa_check_pub_priv((const mbedtls_rsa_context*)pub, + (const mbedtls_rsa_context*)prv)); } static void* rsa_alloc_wrap(void) { @@ -345,10 +345,10 @@ static int eckey_sign_rs_wrap(void* ctx, mbedtls_md_type_t md_alg, const unsigne #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDSA_C */ -static int eckey_check_pair( - const void* pub, const void* prv, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { - return (mbedtls_ecp_check_pub_priv( - (const mbedtls_ecp_keypair*)pub, (const mbedtls_ecp_keypair*)prv, f_rng, p_rng)); +static int eckey_check_pair(const void* pub, const void* prv, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { + return (mbedtls_ecp_check_pub_priv((const mbedtls_ecp_keypair*)pub, + (const mbedtls_ecp_keypair*)prv, f_rng, p_rng)); } static void* eckey_alloc_wrap(void) { @@ -431,8 +431,8 @@ static int ecdsa_can_do(mbedtls_pk_type_t type) { * An ASN.1 encoded signature is a sequence of two ASN.1 integers. Parse one of * those integers and convert it to the fixed-length encoding expected by PSA. */ -static int extract_ecdsa_sig_int( - unsigned char** from, const unsigned char* end, unsigned char* to, size_t to_len) { +static int extract_ecdsa_sig_int(unsigned char** from, const unsigned char* end, unsigned char* to, + size_t to_len) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t unpadded_len, padding_len; @@ -461,13 +461,13 @@ static int extract_ecdsa_sig_int( * to a raw {r,s} buffer. Note: the provided sig buffer must be at least * twice as big as int_size. */ -static int extract_ecdsa_sig( - unsigned char** p, const unsigned char* end, unsigned char* sig, size_t int_size) { +static int extract_ecdsa_sig(unsigned char** p, const unsigned char* end, unsigned char* sig, + size_t int_size) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t tmp_size; - if ((ret = mbedtls_asn1_get_tag( - p, end, &tmp_size, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) + if ((ret = mbedtls_asn1_get_tag(p, end, &tmp_size, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) return (ret); /* Extract r */ @@ -567,8 +567,8 @@ static int ecdsa_verify_wrap(void* ctx, mbedtls_md_type_t md_alg, const unsigned static int ecdsa_sign_wrap(void* ctx, mbedtls_md_type_t md_alg, const unsigned char* hash, size_t hash_len, unsigned char* sig, size_t sig_size, size_t* sig_len, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { - return (mbedtls_ecdsa_write_signature( - (mbedtls_ecdsa_context*)ctx, md_alg, hash, hash_len, sig, sig_size, sig_len, f_rng, p_rng)); + return (mbedtls_ecdsa_write_signature((mbedtls_ecdsa_context*)ctx, md_alg, hash, hash_len, sig, + sig_size, sig_len, f_rng, p_rng)); } #if defined(MBEDTLS_ECP_RESTARTABLE) @@ -689,8 +689,8 @@ static int rsa_alt_decrypt_wrap(void* ctx, const unsigned char* input, size_t il } #if defined(MBEDTLS_RSA_C) -static int rsa_alt_check_pair( - const void* pub, const void* prv, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +static int rsa_alt_check_pair(const void* pub, const void* prv, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char hash[32]; size_t sig_len = 0; @@ -860,8 +860,8 @@ static int pk_ecdsa_sig_asn1_from_psa(unsigned char* sig, size_t* sig_len, size_ MBEDTLS_ASN1_CHK_ADD(len, asn1_write_mpibuf(&p, sig, rs_len)); MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&p, sig, len)); - MBEDTLS_ASN1_CHK_ADD( - len, mbedtls_asn1_write_tag(&p, sig, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)); + MBEDTLS_ASN1_CHK_ADD(len, + mbedtls_asn1_write_tag(&p, sig, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)); memmove(sig, p, len); *sig_len = len; diff --git a/extension/httpfs/third_party/mbedtls/library/pk_wrap.h b/extension/httpfs/third_party/mbedtls/library/pk_wrap.h index 24d5355e11d..9e9b27d199d 100644 --- a/extension/httpfs/third_party/mbedtls/library/pk_wrap.h +++ b/extension/httpfs/third_party/mbedtls/library/pk_wrap.h @@ -68,8 +68,8 @@ struct mbedtls_pk_info_t { size_t* olen, size_t osize, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); /** Check public-private key pair */ - int (*check_pair_func)( - const void* pub, const void* prv, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); + int (*check_pair_func)(const void* pub, const void* prv, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng); /** Allocate a new context */ void* (*ctx_alloc_func)(void); diff --git a/extension/httpfs/third_party/mbedtls/library/pkparse.cpp b/extension/httpfs/third_party/mbedtls/library/pkparse.cpp index 249bca6c062..055d693cd22 100644 --- a/extension/httpfs/third_party/mbedtls/library/pkparse.cpp +++ b/extension/httpfs/third_party/mbedtls/library/pkparse.cpp @@ -243,8 +243,8 @@ static int pk_group_from_specified(const mbedtls_asn1_buf* params, mbedtls_ecp_g * parameters FIELD-ID.&Type({IOSet}{@fieldType}) * } */ - if ((ret = mbedtls_asn1_get_tag( - &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) return (ret); end_field = p + len; @@ -286,8 +286,8 @@ static int pk_group_from_specified(const mbedtls_asn1_buf* params, mbedtls_ecp_g * -- with version equal to ecdpVer2 or ecdpVer3 * } */ - if ((ret = mbedtls_asn1_get_tag( - &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) return (ret); end_curve = p + len; @@ -398,8 +398,8 @@ static int pk_group_id_from_group(const mbedtls_ecp_group* grp, mbedtls_ecp_grou /* * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID */ -static int pk_group_id_from_specified( - const mbedtls_asn1_buf* params, mbedtls_ecp_group_id* grp_id) { +static int pk_group_id_from_specified(const mbedtls_asn1_buf* params, + mbedtls_ecp_group_id* grp_id) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; mbedtls_ecp_group grp; @@ -463,8 +463,8 @@ static int pk_use_ecparams(const mbedtls_asn1_buf* params, mbedtls_ecp_group* gr static int pk_get_ecpubkey(unsigned char** p, const unsigned char* end, mbedtls_ecp_keypair* key) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; - if ((ret = mbedtls_ecp_point_read_binary( - &key->grp, &key->Q, (const unsigned char*)*p, end - *p)) == 0) { + if ((ret = mbedtls_ecp_point_read_binary(&key->grp, &key->Q, (const unsigned char*)*p, + end - *p)) == 0) { ret = mbedtls_ecp_check_pubkey(&key->grp, &key->Q); } @@ -488,8 +488,8 @@ static int pk_get_rsapubkey(unsigned char** p, const unsigned char* end, mbedtls int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t len; - if ((ret = mbedtls_asn1_get_tag( - p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_INVALID_PUBKEY, ret)); if (*p + len != end) @@ -559,8 +559,8 @@ static int pk_get_pk_alg(unsigned char** p, const unsigned char* end, mbedtls_pk * algorithm AlgorithmIdentifier, * subjectPublicKey BIT STRING } */ -int mbedtls_pk_parse_subpubkey( - unsigned char** p, const unsigned char* end, mbedtls_pk_context* pk) { +int mbedtls_pk_parse_subpubkey(unsigned char** p, const unsigned char* end, + mbedtls_pk_context* pk) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t len; mbedtls_asn1_buf alg_params; @@ -572,8 +572,8 @@ int mbedtls_pk_parse_subpubkey( PK_VALIDATE_RET(end != NULL); PK_VALIDATE_RET(pk != NULL); - if ((ret = mbedtls_asn1_get_tag( - p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if ((ret = mbedtls_asn1_get_tag(p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret)); } @@ -644,8 +644,8 @@ static int asn1_get_nonzero_mpi(unsigned char** p, const unsigned char* end, mbe /* * Parse a PKCS#1 encoded private RSA key */ -static int pk_parse_key_pkcs1_der( - mbedtls_rsa_context* rsa, const unsigned char* key, size_t keylen) { +static int pk_parse_key_pkcs1_der(mbedtls_rsa_context* rsa, const unsigned char* key, + size_t keylen) { int ret, version; size_t len; unsigned char *p, *end; @@ -672,8 +672,8 @@ static int pk_parse_key_pkcs1_der( * otherPrimeInfos OtherPrimeInfos OPTIONAL * } */ - if ((ret = mbedtls_asn1_get_tag( - &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret)); } @@ -807,8 +807,8 @@ static int pk_parse_key_sec1_der(mbedtls_ecp_keypair* eck, const unsigned char* * publicKey [1] BIT STRING OPTIONAL * } */ - if ((ret = mbedtls_asn1_get_tag( - &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret)); } @@ -861,8 +861,8 @@ static int pk_parse_key_sec1_der(mbedtls_ecp_keypair* eck, const unsigned char* return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret)); if (p + len != end2) - return (MBEDTLS_ERROR_ADD( - MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, MBEDTLS_ERR_ASN1_LENGTH_MISMATCH)); + return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH)); if ((ret = pk_get_ecpubkey(&p, end2, eck)) == 0) pubkey_done = 1; @@ -939,8 +939,8 @@ static int pk_parse_key_pkcs8_unencrypted_der(mbedtls_pk_context* pk, const unsi * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey */ - if ((ret = mbedtls_asn1_get_tag( - &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret)); } @@ -1034,8 +1034,8 @@ static int pk_parse_key_pkcs8_encrypted_der(mbedtls_pk_context* pk, unsigned cha * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo * */ - if ((ret = mbedtls_asn1_get_tag( - &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { + if ((ret = mbedtls_asn1_get_tag(&p, end, &len, + MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { return (MBEDTLS_ERROR_ADD(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT, ret)); } @@ -1067,8 +1067,8 @@ static int pk_parse_key_pkcs8_encrypted_der(mbedtls_pk_context* pk, unsigned cha #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PKCS5_C) if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS5_PBES2, &pbe_alg_oid) == 0) { - if ((ret = mbedtls_pkcs5_pbes2( - &pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen, p, len, buf)) != 0) { + if ((ret = mbedtls_pkcs5_pbes2(&pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen, p, len, + buf)) != 0) { if (ret == MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH) return (MBEDTLS_ERR_PK_PASSWORD_MISMATCH); @@ -1165,8 +1165,8 @@ int mbedtls_pk_parse_key(mbedtls_pk_context* pk, const unsigned char* key, size_ if (key[keylen - 1] != '\0') ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else - ret = mbedtls_pem_read_buffer( - &pem, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----", key, NULL, 0, &len); + ret = mbedtls_pem_read_buffer(&pem, "-----BEGIN PRIVATE KEY-----", + "-----END PRIVATE KEY-----", key, NULL, 0, &len); if (ret == 0) { if ((ret = pk_parse_key_pkcs8_unencrypted_der(pk, pem.buf, pem.buflen, f_rng, p_rng)) != 0) { @@ -1186,8 +1186,8 @@ int mbedtls_pk_parse_key(mbedtls_pk_context* pk, const unsigned char* key, size_ ret = mbedtls_pem_read_buffer(&pem, "-----BEGIN ENCRYPTED PRIVATE KEY-----", "-----END ENCRYPTED PRIVATE KEY-----", key, NULL, 0, &len); if (ret == 0) { - if ((ret = pk_parse_key_pkcs8_encrypted_der( - pk, pem.buf, pem.buflen, pwd, pwdlen, f_rng, p_rng)) != 0) { + if ((ret = pk_parse_key_pkcs8_encrypted_der(pk, pem.buf, pem.buflen, pwd, pwdlen, f_rng, + p_rng)) != 0) { mbedtls_pk_free(pk); } @@ -1328,8 +1328,8 @@ int mbedtls_pk_parse_public_key(mbedtls_pk_context* ctx, const unsigned char* ke if (key[keylen - 1] != '\0') ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else - ret = mbedtls_pem_read_buffer( - &pem, "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", key, NULL, 0, &len); + ret = mbedtls_pem_read_buffer(&pem, "-----BEGIN PUBLIC KEY-----", + "-----END PUBLIC KEY-----", key, NULL, 0, &len); if (ret == 0) { /* diff --git a/extension/httpfs/third_party/mbedtls/library/rsa.cpp b/extension/httpfs/third_party/mbedtls/library/rsa.cpp index 641694ba623..9301e52271b 100644 --- a/extension/httpfs/third_party/mbedtls/library/rsa.cpp +++ b/extension/httpfs/third_party/mbedtls/library/rsa.cpp @@ -366,8 +366,8 @@ int mbedtls_rsa_export(const mbedtls_rsa_context* ctx, mbedtls_mpi* N, mbedtls_m * write DER encoded RSA keys. The helper function mbedtls_rsa_deduce_crt * can be used in this case. */ -int mbedtls_rsa_export_crt( - const mbedtls_rsa_context* ctx, mbedtls_mpi* DP, mbedtls_mpi* DQ, mbedtls_mpi* QP) { +int mbedtls_rsa_export_crt(const mbedtls_rsa_context* ctx, mbedtls_mpi* DP, mbedtls_mpi* DQ, + mbedtls_mpi* QP) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; int is_priv; RSA_VALIDATE_RET(ctx != NULL); @@ -639,8 +639,8 @@ int mbedtls_rsa_check_pub_priv(const mbedtls_rsa_context* pub, const mbedtls_rsa /* * Do an RSA public key operation */ -int mbedtls_rsa_public( - mbedtls_rsa_context* ctx, const unsigned char* input, unsigned char* output) { +int mbedtls_rsa_public(mbedtls_rsa_context* ctx, const unsigned char* input, + unsigned char* output) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t olen; mbedtls_mpi T; @@ -689,8 +689,8 @@ int mbedtls_rsa_public( * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer * Berlin Heidelberg, 1996. p. 104-113. */ -static int rsa_prepare_blinding( - mbedtls_rsa_context* ctx, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { +static int rsa_prepare_blinding(mbedtls_rsa_context* ctx, + int (*f_rng)(void*, unsigned char*, size_t), void* p_rng) { int ret, count = 0; mbedtls_mpi R; @@ -1363,14 +1363,14 @@ int mbedtls_rsa_pkcs1_decrypt(mbedtls_rsa_context* ctx, int (*f_rng)(void*, unsi switch (ctx->padding) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: - return mbedtls_rsa_rsaes_pkcs1_v15_decrypt( - ctx, f_rng, p_rng, olen, input, output, output_max_len); + return mbedtls_rsa_rsaes_pkcs1_v15_decrypt(ctx, f_rng, p_rng, olen, input, output, + output_max_len); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: - return mbedtls_rsa_rsaes_oaep_decrypt( - ctx, f_rng, p_rng, NULL, 0, olen, input, output, output_max_len); + return mbedtls_rsa_rsaes_oaep_decrypt(ctx, f_rng, p_rng, NULL, 0, olen, input, output, + output_max_len); #endif default: @@ -1508,8 +1508,8 @@ int mbedtls_rsa_rsassa_pss_sign_ext(mbedtls_rsa_context* ctx, int mbedtls_rsa_rsassa_pss_sign(mbedtls_rsa_context* ctx, int (*f_rng)(void*, unsigned char*, size_t), void* p_rng, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char* hash, unsigned char* sig) { - return rsa_rsassa_pss_sign( - ctx, f_rng, p_rng, md_alg, hashlen, hash, MBEDTLS_RSA_SALT_LEN_ANY, sig); + return rsa_rsassa_pss_sign(ctx, f_rng, p_rng, md_alg, hashlen, hash, MBEDTLS_RSA_SALT_LEN_ANY, + sig); } #endif /* MBEDTLS_PKCS1_V21 */ @@ -1867,8 +1867,8 @@ int mbedtls_rsa_rsassa_pss_verify(mbedtls_rsa_context* ctx, mbedtls_md_type_t md mgf1_hash_id = (ctx->hash_id != MBEDTLS_MD_NONE) ? (mbedtls_md_type_t)ctx->hash_id : md_alg; - return (mbedtls_rsa_rsassa_pss_verify_ext( - ctx, md_alg, hashlen, hash, mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY, sig)); + return (mbedtls_rsa_rsassa_pss_verify_ext(ctx, md_alg, hashlen, hash, mgf1_hash_id, + MBEDTLS_RSA_SALT_LEN_ANY, sig)); } #endif /* MBEDTLS_PKCS1_V21 */ @@ -2163,8 +2163,8 @@ int mbedtls_rsa_self_test(int verbose) { if (verbose != 0) mbedtls_printf("passed\n PKCS#1 decryption : "); - if (mbedtls_rsa_pkcs1_decrypt( - &rsa, myrand, NULL, &len, rsa_ciphertext, rsa_decrypted, sizeof(rsa_decrypted)) != 0) { + if (mbedtls_rsa_pkcs1_decrypt(&rsa, myrand, NULL, &len, rsa_ciphertext, rsa_decrypted, + sizeof(rsa_decrypted)) != 0) { if (verbose != 0) mbedtls_printf("failed\n"); diff --git a/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.cpp b/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.cpp index 72bed6b306c..baa3a058de5 100644 --- a/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.cpp +++ b/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.cpp @@ -177,8 +177,8 @@ int mbedtls_rsa_deduce_primes(mbedtls_mpi const* N, mbedtls_mpi const* E, mbedtl * Given P, Q and the public exponent E, deduce D. * This is essentially a modular inversion. */ -int mbedtls_rsa_deduce_private_exponent( - mbedtls_mpi const* P, mbedtls_mpi const* Q, mbedtls_mpi const* E, mbedtls_mpi* D) { +int mbedtls_rsa_deduce_private_exponent(mbedtls_mpi const* P, mbedtls_mpi const* Q, + mbedtls_mpi const* E, mbedtls_mpi* D) { int ret = 0; mbedtls_mpi K, L; diff --git a/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.h b/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.h index f449213d613..e801fb12f82 100644 --- a/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.h +++ b/extension/httpfs/third_party/mbedtls/library/rsa_alt_helpers.h @@ -110,8 +110,8 @@ int mbedtls_rsa_deduce_primes(mbedtls_mpi const* N, mbedtls_mpi const* E, mbedtl * \note This function does not check whether P and Q are primes. * */ -int mbedtls_rsa_deduce_private_exponent( - mbedtls_mpi const* P, mbedtls_mpi const* Q, mbedtls_mpi const* E, mbedtls_mpi* D); +int mbedtls_rsa_deduce_private_exponent(mbedtls_mpi const* P, mbedtls_mpi const* Q, + mbedtls_mpi const* E, mbedtls_mpi* D); /** * \brief Generate RSA-CRT parameters diff --git a/extension/httpfs/third_party/mbedtls/library/sha1.cpp b/extension/httpfs/third_party/mbedtls/library/sha1.cpp index 01e66959383..3bdbe695f98 100644 --- a/extension/httpfs/third_party/mbedtls/library/sha1.cpp +++ b/extension/httpfs/third_party/mbedtls/library/sha1.cpp @@ -111,12 +111,12 @@ int mbedtls_internal_sha1_process(mbedtls_sha1_context* ctx, const unsigned char local.W[14] = MBEDTLS_GET_UINT32_BE(data, 56); local.W[15] = MBEDTLS_GET_UINT32_BE(data, 60); -#define S(x, n) (((x) << (n)) | (((x)&0xFFFFFFFF) >> (32 - (n)))) +#define S(x, n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) #define R(t) \ - (local.temp = local.W[((t)-3) & 0x0F] ^ local.W[((t)-8) & 0x0F] ^ local.W[((t)-14) & 0x0F] ^ \ - local.W[(t)&0x0F], \ - (local.W[(t)&0x0F] = S(local.temp, 1))) + (local.temp = local.W[((t) - 3) & 0x0F] ^ local.W[((t) - 8) & 0x0F] ^ \ + local.W[((t) - 14) & 0x0F] ^ local.W[(t) & 0x0F], \ + (local.W[(t) & 0x0F] = S(local.temp, 1))) #define P(a, b, c, d, e, x) \ do { \ @@ -388,14 +388,14 @@ int mbedtls_sha1(const unsigned char* input, size_t ilen, unsigned char output[2 /* * FIPS-180-1 test vectors */ -static const unsigned char sha1_test_buf[3][57] = { - {"abc"}, {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, {""}}; +static const unsigned char sha1_test_buf[3][57] = {{"abc"}, + {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, {""}}; static const size_t sha1_test_buflen[3] = {3, 56, 1000}; -static const unsigned char sha1_test_sum[3][20] = { - {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, - 0x9C, 0xD0, 0xD8, 0x9D}, +static const unsigned char sha1_test_sum[3][20] = {{0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, + 0x6C, 0x9C, 0xD0, 0xD8, 0x9D}, {0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1}, {0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, diff --git a/extension/httpfs/third_party/mbedtls/library/sha256.cpp b/extension/httpfs/third_party/mbedtls/library/sha256.cpp index 5105caca4dd..7f6c74aefec 100644 --- a/extension/httpfs/third_party/mbedtls/library/sha256.cpp +++ b/extension/httpfs/third_party/mbedtls/library/sha256.cpp @@ -182,7 +182,7 @@ static const uint32_t K[] = { 0xC67178F2, }; -#define SHR(x, n) (((x)&0xFFFFFFFF) >> (n)) +#define SHR(x, n) (((x) & 0xFFFFFFFF) >> (n)) #define ROTR(x, n) (SHR(x, n) | ((x) << (32 - (n)))) #define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) @@ -195,7 +195,8 @@ static const uint32_t K[] = { #define F1(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define R(t) \ - (local.W[t] = S1(local.W[(t)-2]) + local.W[(t)-7] + S0(local.W[(t)-15]) + local.W[(t)-16]) + (local.W[t] = \ + S1(local.W[(t) - 2]) + local.W[(t) - 7] + S0(local.W[(t) - 15]) + local.W[(t) - 16]) #define P(a, b, c, d, e, f, g, h, x, K) \ do { \ @@ -442,8 +443,8 @@ int mbedtls_sha256(const unsigned char* input, size_t ilen, unsigned char* outpu /* * FIPS-180-2 test vectors */ -static const unsigned char sha256_test_buf[3][57] = { - {"abc"}, {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, {""}}; +static const unsigned char sha256_test_buf[3][57] = {{"abc"}, + {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, {""}}; static const size_t sha256_test_buflen[3] = {3, 56, 1000}; diff --git a/extension/postgres_scanner/src/postgres_catalog.cpp b/extension/postgres_scanner/src/postgres_catalog.cpp index 978748235ca..713fcf40836 100644 --- a/extension/postgres_scanner/src/postgres_catalog.cpp +++ b/extension/postgres_scanner/src/postgres_catalog.cpp @@ -6,8 +6,8 @@ namespace kuzu { namespace postgres_scanner { -void PostgresCatalogContent::init( - const std::string& dbPath, const std::string& /*catalogName*/, main::ClientContext* context) { +void PostgresCatalogContent::init(const std::string& dbPath, const std::string& /*catalogName*/, + main::ClientContext* context) { duckdb_scanner::DuckDBCatalogContent::init(dbPath, DEFAULT_CATALOG_NAME, context); } @@ -24,8 +24,8 @@ std::unique_ptr PostgresCatalogContent::bindCreate } auto extraCreatePostgresTableInfo = std::make_unique(dbPath, "" /* dbPath */, DEFAULT_CATALOG_NAME, getDefaultSchemaName(), std::move(propertyInfos)); - return std::make_unique( - common::TableType::FOREIGN, tableName, std::move(extraCreatePostgresTableInfo)); + return std::make_unique(common::TableType::FOREIGN, tableName, + std::move(extraCreatePostgresTableInfo)); } static void executeQueryAndCheckErrMsg(duckdb::Connection& con, std::string query) { diff --git a/extension/postgres_scanner/src/postgres_storage.cpp b/extension/postgres_scanner/src/postgres_storage.cpp index e31118a4172..7ba98b14484 100644 --- a/extension/postgres_scanner/src/postgres_storage.cpp +++ b/extension/postgres_scanner/src/postgres_storage.cpp @@ -18,8 +18,8 @@ std::string extractDBName(const std::string& connectionInfo) { throw common::RuntimeException{"Invalid postgresql connection string."}; } -std::unique_ptr attachPostgres( - std::string dbName, std::string dbPath, main::ClientContext* clientContext) { +std::unique_ptr attachPostgres(std::string dbName, std::string dbPath, + main::ClientContext* clientContext) { auto catalogName = extractDBName(dbPath); if (dbName == "") { dbName = catalogName; diff --git a/src/binder/bind/bind_copy.cpp b/src/binder/bind/bind_copy.cpp index 36836e40ceb..a3ba5aefa99 100644 --- a/src/binder/bind/bind_copy.cpp +++ b/src/binder/bind/bind_copy.cpp @@ -44,8 +44,8 @@ std::unique_ptr Binder::bindCopyToClause(const Statement& statem } auto csvConfig = CSVReaderConfig::construct(bindParsingOptions(copyToStatement.getParsingOptionsRef())); - return std::make_unique( - boundFilePath, fileType, std::move(query), csvConfig.option.copy()); + return std::make_unique(boundFilePath, fileType, std::move(query), + csvConfig.option.copy()); } std::unique_ptr Binder::bindCopyFromClause(const Statement& statement) { @@ -91,14 +91,14 @@ static void bindExpectedRelColumns(RelTableCatalogEntry* relTableEntry, const std::vector& inputColumnNames, std::vector& columnNames, std::vector& columnTypes, main::ClientContext* context); -std::unique_ptr Binder::bindCopyNodeFrom( - const Statement& statement, NodeTableCatalogEntry* nodeTableEntry) { +std::unique_ptr Binder::bindCopyNodeFrom(const Statement& statement, + NodeTableCatalogEntry* nodeTableEntry) { auto& copyStatement = ku_dynamic_cast(statement); // Bind expected columns based on catalog information. std::vector expectedColumnNames; std::vector expectedColumnTypes; - bindExpectedNodeColumns( - nodeTableEntry, copyStatement.getColumnNames(), expectedColumnNames, expectedColumnTypes); + bindExpectedNodeColumns(nodeTableEntry, copyStatement.getColumnNames(), expectedColumnNames, + expectedColumnTypes); auto boundSource = bindScanSource(copyStatement.getSource(), copyStatement.getParsingOptionsRef(), expectedColumnNames, expectedColumnTypes); if (boundSource->type == ScanSourceType::FILE) { @@ -111,15 +111,15 @@ std::unique_ptr Binder::bindCopyNodeFrom( FileTypeUtils::toString(bindData->config.fileType))); } } - auto offset = expressionBinder.createVariableExpression( - *LogicalType::INT64(), std::string(InternalKeyword::ANONYMOUS)); + auto offset = expressionBinder.createVariableExpression(*LogicalType::INT64(), + std::string(InternalKeyword::ANONYMOUS)); auto boundCopyFromInfo = BoundCopyFromInfo(nodeTableEntry, std::move(boundSource), offset, nullptr /* extraInfo */); return std::make_unique(std::move(boundCopyFromInfo)); } -std::unique_ptr Binder::bindCopyRelFrom( - const parser::Statement& statement, RelTableCatalogEntry* relTableEntry) { +std::unique_ptr Binder::bindCopyRelFrom(const parser::Statement& statement, + RelTableCatalogEntry* relTableEntry) { auto& copyStatement = ku_dynamic_cast(statement); if (copyStatement.byColumn()) { throw BinderException( @@ -133,8 +133,8 @@ std::unique_ptr Binder::bindCopyRelFrom( auto boundSource = bindScanSource(copyStatement.getSource(), copyStatement.getParsingOptionsRef(), expectedColumnNames, expectedColumnTypes); auto columns = boundSource->getColumns(); - auto offset = expressionBinder.createVariableExpression( - *LogicalType::INT64(), std::string(InternalKeyword::ROW_OFFSET)); + auto offset = expressionBinder.createVariableExpression(*LogicalType::INT64(), + std::string(InternalKeyword::ROW_OFFSET)); auto srcTableID = relTableEntry->getSrcTableID(); auto dstTableID = relTableEntry->getDstTableID(); auto catalog = clientContext->getCatalog(); @@ -190,8 +190,8 @@ static void bindExpectedColumns(TableCatalogEntry* tableEntry, // Search column data type for each input column. for (auto& columnName : inputColumnNames) { if (!tableEntry->containProperty(columnName)) { - throw BinderException(stringFormat( - "Table {} does not contain column {}.", tableEntry->getName(), columnName)); + throw BinderException(stringFormat("Table {} does not contain column {}.", + tableEntry->getName(), columnName)); } auto propertyID = tableEntry->getPropertyID(columnName); auto property = tableEntry->getProperty(propertyID); diff --git a/src/binder/bind/bind_ddl.cpp b/src/binder/bind/bind_ddl.cpp index 49dfba1d3d5..8bb0d0d1223 100644 --- a/src/binder/bind/bind_ddl.cpp +++ b/src/binder/bind/bind_ddl.cpp @@ -40,8 +40,8 @@ std::vector Binder::bindPropertyInfo( std::vector propertyInfos; propertyInfos.reserve(propertyNameDataTypes.size()); for (auto& propertyNameDataType : propertyNameDataTypes) { - propertyInfos.emplace_back( - propertyNameDataType.first, *bindDataType(propertyNameDataType.second)); + propertyInfos.emplace_back(propertyNameDataType.first, + *bindDataType(propertyNameDataType.second)); } validateUniquePropertyName(propertyInfos); for (auto& info : propertyInfos) { @@ -52,8 +52,8 @@ std::vector Binder::bindPropertyInfo( return propertyInfos; } -static uint32_t bindPrimaryKey( - const std::string& pkColName, const std::vector& infos) { +static uint32_t bindPrimaryKey(const std::string& pkColName, + const std::vector& infos) { uint32_t primaryKeyIdx = UINT32_MAX; for (auto i = 0u; i < infos.size(); i++) { if (infos[i].name == pkColName) { @@ -138,8 +138,8 @@ BoundCreateTableInfo Binder::bindCreateRelTableInfo(const CreateTableInfo* info) validateTableType(srcTableID, TableType::NODE); auto dstTableID = bindTableID(extraInfo->dstTableName); validateTableType(dstTableID, TableType::NODE); - auto boundExtraInfo = std::make_unique( - srcMultiplicity, dstMultiplicity, srcTableID, dstTableID, std::move(propertyInfos)); + auto boundExtraInfo = std::make_unique(srcMultiplicity, + dstMultiplicity, srcTableID, dstTableID, std::move(propertyInfos)); return BoundCreateTableInfo(TableType::REL, info->tableName, std::move(boundExtraInfo)); } @@ -306,16 +306,16 @@ static void validatePropertyExist(TableCatalogEntry* tableEntry, const std::stri } } -static void validatePropertyNotExist( - TableCatalogEntry* tableEntry, const std::string& propertyName) { +static void validatePropertyNotExist(TableCatalogEntry* tableEntry, + const std::string& propertyName) { if (tableEntry->containProperty(propertyName)) { throw BinderException( tableEntry->getName() + " table already has property " + propertyName + "."); } } -static void validatePropertyDDLOnTable( - TableCatalogEntry* tableEntry, const std::string& ddlOperation) { +static void validatePropertyDDLOnTable(TableCatalogEntry* tableEntry, + const std::string& ddlOperation) { switch (tableEntry->getTableType()) { case TableType::REL_GROUP: case TableType::RDF: { diff --git a/src/binder/bind/bind_explain.cpp b/src/binder/bind/bind_explain.cpp index f01d5256c99..bf256869432 100644 --- a/src/binder/bind/bind_explain.cpp +++ b/src/binder/bind/bind_explain.cpp @@ -8,8 +8,8 @@ namespace binder { std::unique_ptr Binder::bindExplain(const parser::Statement& statement) { auto& explain = (parser::ExplainStatement&)statement; auto boundStatementToExplain = bind(*explain.getStatementToExplain()); - return std::make_unique( - std::move(boundStatementToExplain), explain.getExplainType()); + return std::make_unique(std::move(boundStatementToExplain), + explain.getExplainType()); } } // namespace binder diff --git a/src/binder/bind/bind_export_database.cpp b/src/binder/bind/bind_export_database.cpp index b2d5574d4c3..34eb09b611f 100644 --- a/src/binder/bind/bind_export_database.cpp +++ b/src/binder/bind/bind_export_database.cpp @@ -26,8 +26,8 @@ static std::string getPrimaryKeyName(table_id_t tableId, const Catalog& catalog, return primaryProperty->getName(); } -static std::vector getExportInfo( - const Catalog& catalog, Transaction* tx, Binder* binder) { +static std::vector getExportInfo(const Catalog& catalog, Transaction* tx, + Binder* binder) { std::vector exportData; for (auto& nodeTableEntry : catalog.getNodeTableEntries(tx)) { auto tableName = nodeTableEntry->getName(); @@ -93,8 +93,8 @@ std::unique_ptr Binder::bindExportDatabaseClause(const Statement if (fileType != FileType::CSV && parsedOptions.size() != 0) { throw BinderException{"Only export to csv can have options."}; } - return std::make_unique( - boundFilePath, fileType, std::move(exportData), std::move(parsedOptions)); + return std::make_unique(boundFilePath, fileType, std::move(exportData), + std::move(parsedOptions)); } } // namespace binder } // namespace kuzu diff --git a/src/binder/bind/bind_extension.cpp b/src/binder/bind/bind_extension.cpp index b7ab836a85c..a5b5b0b4d66 100644 --- a/src/binder/bind/bind_extension.cpp +++ b/src/binder/bind/bind_extension.cpp @@ -11,8 +11,8 @@ namespace binder { std::unique_ptr Binder::bindExtension(const Statement& statement) { auto extensionStatement = common::ku_dynamic_cast(statement); - return std::make_unique( - extensionStatement.getAction(), extensionStatement.getPath()); + return std::make_unique(extensionStatement.getAction(), + extensionStatement.getPath()); } } // namespace binder diff --git a/src/binder/bind/bind_file_scan.cpp b/src/binder/bind/bind_file_scan.cpp index e71ecbcd57e..c866887e2a4 100644 --- a/src/binder/bind/bind_file_scan.cpp +++ b/src/binder/bind/bind_file_scan.cpp @@ -44,8 +44,8 @@ std::vector Binder::bindFilePaths(const std::vector& f throw BinderException{ stringFormat("No file found that matches the pattern: {}.", filePath)}; } - boundFilePaths.insert( - boundFilePaths.end(), globbedFilePaths.begin(), globbedFilePaths.end()); + boundFilePaths.insert(boundFilePaths.end(), globbedFilePaths.begin(), + globbedFilePaths.end()); } return boundFilePaths; } @@ -109,8 +109,8 @@ std::unique_ptr Binder::bindScanSource(BaseScanSource* sour } case ScanSourceType::OBJECT: { auto objectSource = ku_dynamic_cast(source); - throw BinderException(stringFormat( - "Scan from external object {} is not supported.", objectSource->objectName)); + throw BinderException(stringFormat("Scan from external object {} is not supported.", + objectSource->objectName)); } default: KU_UNREACHABLE; diff --git a/src/binder/bind/bind_graph_pattern.cpp b/src/binder/bind/bind_graph_pattern.cpp index 099437f92c4..ccbece6cd5f 100644 --- a/src/binder/bind/bind_graph_pattern.cpp +++ b/src/binder/bind/bind_graph_pattern.cpp @@ -61,8 +61,8 @@ QueryGraph Binder::bindPatternElement(const PatternElement& patternElement) { return queryGraph; } -static std::unique_ptr getRecursiveRelLogicalType( - const LogicalType& nodeType, const LogicalType& relType) { +static std::unique_ptr getRecursiveRelLogicalType(const LogicalType& nodeType, + const LogicalType& relType) { auto nodesType = LogicalType::LIST(nodeType.copy()); auto relsType = LogicalType::LIST(relType.copy()); std::vector recursiveRelFields; @@ -84,8 +84,8 @@ static void extraFieldFromStructType(const LogicalType& structType, } } -std::shared_ptr Binder::createPath( - const std::string& pathName, const expression_vector& children) { +std::shared_ptr Binder::createPath(const std::string& pathName, + const expression_vector& children) { std::unordered_set nodeFieldNameSet; std::vector nodeFieldNames; std::vector> nodeFieldTypes; @@ -95,19 +95,19 @@ std::shared_ptr Binder::createPath( for (auto& child : children) { if (ExpressionUtil::isNodePattern(*child)) { auto node = ku_dynamic_cast(child.get()); - extraFieldFromStructType( - node->getDataType(), nodeFieldNameSet, nodeFieldNames, nodeFieldTypes); + extraFieldFromStructType(node->getDataType(), nodeFieldNameSet, nodeFieldNames, + nodeFieldTypes); } else if (ExpressionUtil::isRelPattern(*child)) { auto rel = ku_dynamic_cast(child.get()); - extraFieldFromStructType( - rel->getDataType(), relFieldNameSet, relFieldNames, relFieldTypes); + extraFieldFromStructType(rel->getDataType(), relFieldNameSet, relFieldNames, + relFieldTypes); } else if (ExpressionUtil::isRecursiveRelPattern(*child)) { auto recursiveRel = ku_dynamic_cast(child.get()); auto recursiveInfo = recursiveRel->getRecursiveInfo(); extraFieldFromStructType(recursiveInfo->node->getDataType(), nodeFieldNameSet, nodeFieldNames, nodeFieldTypes); - extraFieldFromStructType( - recursiveInfo->rel->getDataType(), relFieldNameSet, relFieldNames, relFieldTypes); + extraFieldFromStructType(recursiveInfo->rel->getDataType(), relFieldNameSet, + relFieldNames, relFieldTypes); } else { KU_UNREACHABLE; } @@ -212,8 +212,8 @@ std::shared_ptr Binder::bindQueryRel(const RelPattern& relPattern if (QueryRelTypeUtils::isRecursive(relPattern.getRelType())) { queryRel = createRecursiveQueryRel(relPattern, tableIDs, srcNode, dstNode, directionType); } else { - queryRel = createNonRecursiveQueryRel( - relPattern.getVariableName(), tableIDs, srcNode, dstNode, directionType); + queryRel = createNonRecursiveQueryRel(relPattern.getVariableName(), tableIDs, srcNode, + dstNode, directionType); for (auto& [propertyName, rhs] : relPattern.getPropertyKeyVals()) { auto boundLhs = expressionBinder.bindNodeOrRelPropertyExpression(*queryRel, propertyName); @@ -299,8 +299,8 @@ std::shared_ptr Binder::createNonRecursiveQueryRel(const std::str fields.emplace_back(InternalKeyword::DST, LogicalType::INTERNAL_ID()); // Bind internal expressions. queryRel->setLabelExpression(expressionBinder.bindLabelFunction(*queryRel)); - fields.emplace_back( - InternalKeyword::LABEL, queryRel->getLabelExpression()->getDataType().copy()); + fields.emplace_back(InternalKeyword::LABEL, + queryRel->getLabelExpression()->getDataType().copy()); // Bind properties. for (auto& expression : queryRel->getPropertyExprsRef()) { auto property = ku_dynamic_cast(expression.get()); @@ -311,12 +311,12 @@ std::shared_ptr Binder::createNonRecursiveQueryRel(const std::str return queryRel; } -static void bindRecursiveRelProjectionList( - const expression_vector& projectionList, std::vector& fields) { +static void bindRecursiveRelProjectionList(const expression_vector& projectionList, + std::vector& fields) { for (auto& expression : projectionList) { if (expression->expressionType != common::ExpressionType::PROPERTY) { - throw BinderException(stringFormat( - "Unsupported projection item {} on recursive rel.", expression->toString())); + throw BinderException(stringFormat("Unsupported projection item {} on recursive rel.", + expression->toString())); } auto property = ku_dynamic_cast(expression.get()); fields.emplace_back(property->getPropertyName(), property->getDataType().copy()); @@ -343,8 +343,8 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel scope.addExpression(node->toString(), node); std::vector nodeFields; nodeFields.emplace_back(InternalKeyword::ID, node->getInternalID()->getDataType().copy()); - nodeFields.emplace_back( - InternalKeyword::LABEL, node->getLabelExpression()->getDataType().copy()); + nodeFields.emplace_back(InternalKeyword::LABEL, + node->getLabelExpression()->getDataType().copy()); expression_vector nodeProjectionList; if (!recursivePatternInfo->hasProjection) { for (auto& expression : node->getPropertyExprsRef()) { @@ -361,8 +361,8 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel auto nodeCopy = createQueryNode(recursivePatternInfo->nodeName, std::vector{nodeTableIDs.begin(), nodeTableIDs.end()}); // Bind intermediate rel - auto rel = createNonRecursiveQueryRel( - recursivePatternInfo->relName, tableIDs, nullptr, nullptr, directionType); + auto rel = createNonRecursiveQueryRel(recursivePatternInfo->relName, tableIDs, nullptr, nullptr, + directionType); scope.addExpression(rel->toString(), rel); expression_vector relProjectionList; if (!recursivePatternInfo->hasProjection) { @@ -392,8 +392,8 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel auto boundRhs = expressionBinder.bindExpression(*rhs); boundRhs = ExpressionBinder::implicitCastIfNecessary(boundRhs, boundLhs->dataType); auto predicate = expressionBinder.createEqualityComparisonExpression(boundLhs, boundRhs); - relPredicate = expressionBinder.combineBooleanExpressions( - ExpressionType::AND, relPredicate, predicate); + relPredicate = expressionBinder.combineBooleanExpressions(ExpressionType::AND, relPredicate, + predicate); } // Bind predicates in (r, n | WHERE ) std::shared_ptr nodePredicate; @@ -409,19 +409,19 @@ std::shared_ptr Binder::createRecursiveQueryRel(const parser::Rel throw BinderException(stringFormat("Cannot evaluate {} in recursive pattern {}.", predicate->toString(), relPattern.getVariableName())); } else if (dependOnNode) { - nodePredicate = expressionBinder.combineBooleanExpressions( - ExpressionType::AND, nodePredicate, predicate); + nodePredicate = expressionBinder.combineBooleanExpressions(ExpressionType::AND, + nodePredicate, predicate); } else { - relPredicate = expressionBinder.combineBooleanExpressions( - ExpressionType::AND, relPredicate, predicate); + relPredicate = expressionBinder.combineBooleanExpressions(ExpressionType::AND, + relPredicate, predicate); } } } auto nodePredicateExecutionFlag = expressionBinder.createVariableExpression( LogicalType{LogicalTypeID::BOOL}, std::string(InternalKeyword::ANONYMOUS)); if (nodePredicate != nullptr) { - nodePredicate = expressionBinder.combineBooleanExpressions( - ExpressionType::OR, nodePredicate, nodePredicateExecutionFlag); + nodePredicate = expressionBinder.combineBooleanExpressions(ExpressionType::OR, + nodePredicate, nodePredicateExecutionFlag); } // Bind rel restoreScope(std::move(prevScope)); @@ -463,8 +463,8 @@ std::pair Binder::bindVariableLengthRelBound( upperBound); } if (lowerBound > upperBound) { - throw BinderException(stringFormat( - "Lower bound of rel {} is greater than upperBound.", relPattern.getVariableName())); + throw BinderException(stringFormat("Lower bound of rel {} is greater than upperBound.", + relPattern.getVariableName())); } if (upperBound > maxDepth) { throw BinderException(stringFormat("Upper bound of rel {} exceeds maximum: {}.", @@ -487,9 +487,9 @@ void Binder::bindQueryRelProperties(RelExpression& rel) { } auto propertyNames = getPropertyNames(tableCatalogEntries); for (auto& propertyName : propertyNames) { - rel.addPropertyExpression( - propertyName, createPropertyExpression(propertyName, rel.getUniqueName(), - rel.getVariableName(), tableCatalogEntries)); + rel.addPropertyExpression(propertyName, + createPropertyExpression(propertyName, rel.getUniqueName(), rel.getVariableName(), + tableCatalogEntries)); } } @@ -503,8 +503,8 @@ static std::unique_ptr createInternalNodeIDExpression(const NodeExpr false /* isPrimaryKey */); } -std::shared_ptr Binder::bindQueryNode( - const NodePattern& nodePattern, QueryGraph& queryGraph) { +std::shared_ptr Binder::bindQueryNode(const NodePattern& nodePattern, + QueryGraph& queryGraph) { auto parsedName = nodePattern.getVariableName(); std::shared_ptr queryNode; if (scope.contains(parsedName)) { // bind to node in scope @@ -546,8 +546,8 @@ std::shared_ptr Binder::createQueryNode(const NodePattern& nodeP return createQueryNode(parsedName, bindTableIDs(nodePattern.getTableNames(), true)); } -std::shared_ptr Binder::createQueryNode( - const std::string& parsedName, const std::vector& tableIDs) { +std::shared_ptr Binder::createQueryNode(const std::string& parsedName, + const std::vector& tableIDs) { auto nodeTableIDs = getNodeTableIDs(tableIDs); auto queryNode = make_shared(LogicalType(LogicalTypeID::NODE), getUniqueExpressionName(parsedName), parsedName, nodeTableIDs); @@ -578,14 +578,14 @@ void Binder::bindQueryNodeProperties(NodeExpression& node) { clientContext->getCatalog()->getTableSchemas(clientContext->getTx(), node.getTableIDs()); auto propertyNames = getPropertyNames(tableSchemas); for (auto& propertyName : propertyNames) { - auto property = createPropertyExpression( - propertyName, node.getUniqueName(), node.getVariableName(), tableSchemas); + auto property = createPropertyExpression(propertyName, node.getUniqueName(), + node.getVariableName(), tableSchemas); node.addPropertyExpression(propertyName, std::move(property)); } } -std::vector Binder::bindTableIDs( - const std::vector& tableNames, bool nodePattern) { +std::vector Binder::bindTableIDs(const std::vector& tableNames, + bool nodePattern) { auto tx = clientContext->getTx(); auto catalog = clientContext->getCatalog(); std::unordered_set tableIDSet; diff --git a/src/binder/bind/bind_import_database.cpp b/src/binder/bind/bind_import_database.cpp index bb3d19ced7d..83d4468cbfa 100644 --- a/src/binder/bind/bind_import_database.cpp +++ b/src/binder/bind/bind_import_database.cpp @@ -17,8 +17,8 @@ using namespace kuzu::parser; namespace kuzu { namespace binder { -static std::string getQueryFromFile( - common::VirtualFileSystem* vfs, const std::string boundFilePath, const std::string fileName) { +static std::string getQueryFromFile(common::VirtualFileSystem* vfs, const std::string boundFilePath, + const std::string fileName) { auto filePath = vfs->joinPath(boundFilePath, fileName); if (!vfs->fileOrPathExists(filePath)) { throw BinderException(stringFormat("File {} does not exist.", filePath)); diff --git a/src/binder/bind/bind_projection_clause.cpp b/src/binder/bind/bind_projection_clause.cpp index a23cc05009f..eec42bf2261 100644 --- a/src/binder/bind/bind_projection_clause.cpp +++ b/src/binder/bind/bind_projection_clause.cpp @@ -75,8 +75,8 @@ BoundReturnClause Binder::bindReturnClause(const ReturnClause& returnClause) { return BoundReturnClause(std::move(boundProjectionBody), std::move(statementResult)); } -static bool isAggregateExpression( - const std::shared_ptr& expression, const BinderScope& scope) { +static bool isAggregateExpression(const std::shared_ptr& expression, + const BinderScope& scope) { if (expression->hasAlias() && scope.contains(expression->getAlias())) { return false; } @@ -91,8 +91,8 @@ static bool isAggregateExpression( return false; } -static expression_vector getAggregateExpressions( - const std::shared_ptr& expression, const BinderScope& scope) { +static expression_vector getAggregateExpressions(const std::shared_ptr& expression, + const BinderScope& scope) { expression_vector result; if (expression->hasAlias() && scope.contains(expression->getAlias())) { return result; @@ -109,8 +109,8 @@ static expression_vector getAggregateExpressions( return result; } -BoundProjectionBody Binder::bindProjectionBody( - const parser::ProjectionBody& projectionBody, const expression_vector& projectionExpressions) { +BoundProjectionBody Binder::bindProjectionBody(const parser::ProjectionBody& projectionBody, + const expression_vector& projectionExpressions) { auto boundProjectionBody = BoundProjectionBody(projectionBody.getIsDistinct(), projectionExpressions); // Bind group by & aggregate. @@ -164,8 +164,8 @@ BoundProjectionBody Binder::bindProjectionBody( } } } - boundProjectionBody.setOrderByExpressions( - std::move(orderByExpressions), projectionBody.getSortOrders()); + boundProjectionBody.setOrderByExpressions(std::move(orderByExpressions), + projectionBody.getSortOrders()); } // Bind skip if (projectionBody.hasSkipExpression()) { diff --git a/src/binder/bind/bind_query.cpp b/src/binder/bind/bind_query.cpp index 586477bcf30..5a56b582278 100644 --- a/src/binder/bind/bind_query.cpp +++ b/src/binder/bind/bind_query.cpp @@ -23,8 +23,8 @@ void validateUnionColumnsOfTheSameType( // Check whether the dataTypes in union expressions are exactly the same in each single // query. for (auto j = 0u; j < columns.size(); j++) { - ExpressionBinder::validateExpectedDataType( - *otherColumns[j], columns[j]->dataType.getLogicalTypeID()); + ExpressionBinder::validateExpectedDataType(*otherColumns[j], + columns[j]->dataType.getLogicalTypeID()); } } } @@ -50,8 +50,8 @@ std::unique_ptr Binder::bindQuery(const RegularQuery& regular } validateUnionColumnsOfTheSameType(normalizedSingleQueries); KU_ASSERT(!normalizedSingleQueries.empty()); - auto boundRegularQuery = std::make_unique( - regularQuery.getIsUnionAll(), normalizedSingleQueries[0].getStatementResult()->copy()); + auto boundRegularQuery = std::make_unique(regularQuery.getIsUnionAll(), + normalizedSingleQueries[0].getStatementResult()->copy()); for (auto& normalizedSingleQuery : normalizedSingleQueries) { boundRegularQuery->addSingleQuery(std::move(normalizedSingleQuery)); } diff --git a/src/binder/bind/bind_reading_clause.cpp b/src/binder/bind/bind_reading_clause.cpp index 8f1ab1ed256..c758ee92ada 100644 --- a/src/binder/bind/bind_reading_clause.cpp +++ b/src/binder/bind/bind_reading_clause.cpp @@ -96,8 +96,8 @@ void Binder::rewriteMatchPattern(BoundGraphPattern& boundGraphPattern) { expressionBinder.bindNodeOrRelPropertyExpression(*pattern, propertyName); auto predicate = expressionBinder.createEqualityComparisonExpression(propertyExpr, rhs); - where = expressionBinder.combineBooleanExpressions( - ExpressionType::AND, predicate, where); + where = expressionBinder.combineBooleanExpressions(ExpressionType::AND, predicate, + where); } } } @@ -117,8 +117,8 @@ std::unique_ptr Binder::bindUnwindClause(const ReadingClause idExpr = node->getInternalID(); scope.addNodeReplacement(node); } - return make_unique( - std::move(boundExpression), std::move(alias), std::move(idExpr)); + return make_unique(std::move(boundExpression), std::move(alias), + std::move(idExpr)); } std::unique_ptr Binder::bindInQueryCall(const ReadingClause& readingClause) { @@ -165,8 +165,8 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& inputValues.push_back(*literalExpr->getValue()); } auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); - auto func = BuiltInFunctionsUtils::matchFunction( - functionExpr->getFunctionName(), inputTypes, functions); + auto func = BuiltInFunctionsUtils::matchFunction(functionExpr->getFunctionName(), + inputTypes, functions); tableFunction = *ku_dynamic_cast(func); auto bindInput = function::TableFuncBindInput(); bindInput.inputs = std::move(inputValues); @@ -176,10 +176,10 @@ std::unique_ptr Binder::bindInQueryCall(const ReadingClause& for (auto i = 0u; i < bindData->columnTypes.size(); i++) { columns.push_back(createVariable(bindData->columnNames[i], bindData->columnTypes[i])); } - auto offset = expressionBinder.createVariableExpression( - *LogicalType::INT64(), std::string(InternalKeyword::ROW_OFFSET)); - auto boundInQueryCall = std::make_unique( - tableFunction, std::move(bindData), std::move(columns), offset); + auto offset = expressionBinder.createVariableExpression(*LogicalType::INT64(), + std::string(InternalKeyword::ROW_OFFSET)); + auto boundInQueryCall = std::make_unique(tableFunction, std::move(bindData), + std::move(columns), offset); if (call.hasWherePredicate()) { auto wherePredicate = expressionBinder.bindExpression(*call.getWherePredicate()); boundInQueryCall->setPredicate(std::move(wherePredicate)); diff --git a/src/binder/bind/bind_updating_clause.cpp b/src/binder/bind/bind_updating_clause.cpp index d94acc75a4a..0664f4225f4 100644 --- a/src/binder/bind/bind_updating_clause.cpp +++ b/src/binder/bind/bind_updating_clause.cpp @@ -140,8 +140,8 @@ std::vector Binder::bindInsertInfos( return result; } -static void validatePrimaryKeyExistence( - const NodeTableCatalogEntry* nodeTableEntry, const NodeExpression& node) { +static void validatePrimaryKeyExistence(const NodeTableCatalogEntry* nodeTableEntry, + const NodeExpression& node) { auto primaryKey = nodeTableEntry->getPrimaryKey(); if (*primaryKey->getDataType() == *LogicalType::SERIAL()) { if (node.hasPropertyDataExpr(primaryKey->getName())) { @@ -159,8 +159,8 @@ static void validatePrimaryKeyExistence( } } -void Binder::bindInsertNode( - std::shared_ptr node, std::vector& infos) { +void Binder::bindInsertNode(std::shared_ptr node, + std::vector& infos) { if (node->isMultiLabeled()) { throw BinderException( "Create node " + node->toString() + " with multiple node labels is not supported."); @@ -189,8 +189,8 @@ void Binder::bindInsertNode( infos.push_back(std::move(insertInfo)); } -void Binder::bindInsertRel( - std::shared_ptr rel, std::vector& infos) { +void Binder::bindInsertRel(std::shared_ptr rel, + std::vector& infos) { if (rel->isMultiLabeled() || rel->isBoundByMultiLabeledNode()) { throw BinderException( "Create rel " + rel->toString() + @@ -220,8 +220,8 @@ void Binder::bindInsertRel( } // Insert predicate resource node. auto resourceTableID = rdfGraphEntry->getResourceTableID(); - auto pNode = createQueryNode( - rel->getVariableName(), std::vector{resourceTableID}); + auto pNode = createQueryNode(rel->getVariableName(), + std::vector{resourceTableID}); auto iriData = rel->getPropertyDataExpr(std::string(rdf::IRI)); iriData = expressionBinder.bindScalarFunctionExpression( expression_vector{std::move(iriData)}, function::ValidatePredicateFunction::name); @@ -235,8 +235,8 @@ void Binder::bindInsertRel( auto relInsertInfo = BoundInsertInfo(TableType::REL, rel); std::unordered_map> relPropertyRhsExpr; relPropertyRhsExpr.insert({std::string(rdf::PID), pNode->getInternalID()}); - relInsertInfo.columnExprs.push_back(expressionBinder.bindNodeOrRelPropertyExpression( - *rel, std::string(InternalKeyword::ID))); + relInsertInfo.columnExprs.push_back(expressionBinder.bindNodeOrRelPropertyExpression(*rel, + std::string(InternalKeyword::ID))); relInsertInfo.columnExprs.push_back( expressionBinder.bindNodeOrRelPropertyExpression(*rel, std::string(rdf::PID))); relInsertInfo.columnDataExprs = @@ -245,8 +245,8 @@ void Binder::bindInsertRel( } else { auto insertInfo = BoundInsertInfo(TableType::REL, rel); insertInfo.columnExprs = rel->getPropertyExprs(); - insertInfo.columnDataExprs = bindInsertColumnDataExprs( - rel->getPropertyDataExprRef(), tableEntry->getPropertiesRef()); + insertInfo.columnDataExprs = bindInsertColumnDataExprs(rel->getPropertyDataExprRef(), + tableEntry->getPropertiesRef()); infos.push_back(std::move(insertInfo)); } } @@ -277,8 +277,8 @@ std::unique_ptr Binder::bindSetClause(const UpdatingClause& return boundSetClause; } -BoundSetPropertyInfo Binder::bindSetPropertyInfo( - parser::ParsedExpression* lhs, parser::ParsedExpression* rhs) { +BoundSetPropertyInfo Binder::bindSetPropertyInfo(parser::ParsedExpression* lhs, + parser::ParsedExpression* rhs) { auto pattern = expressionBinder.bindExpression(*lhs->getChild(0)); auto isNode = ExpressionUtil::isNodePattern(*pattern); auto isRel = ExpressionUtil::isRelPattern(*pattern); @@ -301,8 +301,8 @@ BoundSetPropertyInfo Binder::bindSetPropertyInfo( } } } - return BoundSetPropertyInfo( - isNode ? UpdateTableType::NODE : UpdateTableType::REL, pattern, std::move(boundSetItem)); + return BoundSetPropertyInfo(isNode ? UpdateTableType::NODE : UpdateTableType::REL, pattern, + std::move(boundSetItem)); } expression_pair Binder::bindSetItem(parser::ParsedExpression* lhs, parser::ParsedExpression* rhs) { @@ -335,8 +335,8 @@ std::unique_ptr Binder::bindDeleteClause( auto nodeOrRel = expressionBinder.bindExpression(*deleteClause.getExpression(i)); if (ExpressionUtil::isNodePattern(*nodeOrRel)) { validateRdfResourceDeletion(nodeOrRel.get(), clientContext); - auto deleteNodeInfo = BoundDeleteInfo( - UpdateTableType::NODE, nodeOrRel, deleteClause.getDeleteClauseType()); + auto deleteNodeInfo = BoundDeleteInfo(UpdateTableType::NODE, nodeOrRel, + deleteClause.getDeleteClauseType()); boundDeleteClause->addInfo(std::move(deleteNodeInfo)); } else if (ExpressionUtil::isRelPattern(*nodeOrRel)) { if (deleteClause.getDeleteClauseType() == DeleteClauseType::DETACH_DELETE) { diff --git a/src/binder/bind/copy/bind_copy_rdf_graph.cpp b/src/binder/bind/copy/bind_copy_rdf_graph.cpp index 1626b17b6cb..f1342fd94ca 100644 --- a/src/binder/bind/copy/bind_copy_rdf_graph.cpp +++ b/src/binder/bind/copy/bind_copy_rdf_graph.cpp @@ -21,8 +21,8 @@ using namespace kuzu::parser; namespace kuzu { namespace binder { -std::unique_ptr Binder::bindCopyRdfFrom( - const parser::Statement& statement, RDFGraphCatalogEntry* rdfGraphEntry) { +std::unique_ptr Binder::bindCopyRdfFrom(const parser::Statement& statement, + RDFGraphCatalogEntry* rdfGraphEntry) { auto& copyStatement = ku_dynamic_cast(statement); // Bind path. KU_ASSERT(copyStatement.getSource()->type == ScanSourceType::FILE); @@ -34,19 +34,19 @@ std::unique_ptr Binder::bindCopyRdfFrom( config->options = bindParsingOptions(copyStatement.getParsingOptionsRef()); auto catalog = clientContext->getCatalog(); auto functions = catalog->getFunctions(clientContext->getTx()); - auto offset = expressionBinder.createVariableExpression( - *LogicalType::INT64(), InternalKeyword::ROW_OFFSET); + auto offset = expressionBinder.createVariableExpression(*LogicalType::INT64(), + InternalKeyword::ROW_OFFSET); auto r = expressionBinder.createVariableExpression(*LogicalType::STRING(), rdf::IRI); auto l = expressionBinder.createVariableExpression(*LogicalType::RDF_VARIANT(), rdf::VAL); auto lang = expressionBinder.createVariableExpression(*LogicalType::STRING(), rdf::LANG); auto s = expressionBinder.createVariableExpression(*LogicalType::STRING(), rdf::SUBJECT); auto p = expressionBinder.createVariableExpression(*LogicalType::STRING(), rdf::PREDICATE); auto o = expressionBinder.createVariableExpression(*LogicalType::STRING(), rdf::OBJECT); - auto sOffset = expressionBinder.createVariableExpression( - *LogicalType::INT64(), InternalKeyword::SRC_OFFSET); + auto sOffset = expressionBinder.createVariableExpression(*LogicalType::INT64(), + InternalKeyword::SRC_OFFSET); auto pOffset = expressionBinder.createVariableExpression(*LogicalType::INT64(), rdf::PID); - auto oOffset = expressionBinder.createVariableExpression( - *LogicalType::INT64(), InternalKeyword::DST_OFFSET); + auto oOffset = expressionBinder.createVariableExpression(*LogicalType::INT64(), + InternalKeyword::DST_OFFSET); auto bindInput = std::make_unique(config->copy()); Function* func; // Bind file scan; @@ -114,8 +114,8 @@ std::unique_ptr Binder::bindCopyRdfFrom( auto rrLCopyInfo = BoundCopyFromInfo(rrlEntry, std::move(rrlSource), offset, std::move(rrlExtraInfo)); // Bind copy rdf - auto rdfExtraInfo = std::make_unique( - std::move(rCopyInfo), std::move(lCopyInfo), std::move(rrrCopyInfo), std::move(rrLCopyInfo)); + auto rdfExtraInfo = std::make_unique(std::move(rCopyInfo), + std::move(lCopyInfo), std::move(rrrCopyInfo), std::move(rrLCopyInfo)); std::unique_ptr source; if (inMemory) { auto fileScanInfo = BoundFileScanInfo(*scanFunc, bindData->copy(), expression_vector{}); diff --git a/src/binder/bind/ddl/bind_create_rdf_graph.cpp b/src/binder/bind/ddl/bind_create_rdf_graph.cpp index 8b5f79a3bcc..8a8249f5930 100644 --- a/src/binder/bind/ddl/bind_create_rdf_graph.cpp +++ b/src/binder/bind/ddl/bind_create_rdf_graph.cpp @@ -17,8 +17,8 @@ BoundCreateTableInfo Binder::bindCreateRdfGraphInfo(const CreateTableInfo* info) auto resourceTableName = RDFGraphCatalogEntry::getResourceTableName(rdfGraphName); std::vector resourceProperties; resourceProperties.emplace_back(std::string(rdf::IRI), *LogicalType::STRING()); - auto resourceExtraInfo = std::make_unique( - 0 /* primaryKeyIdx */, std::move(resourceProperties)); + auto resourceExtraInfo = std::make_unique(0 /* primaryKeyIdx */, + std::move(resourceProperties)); auto resourceCreateInfo = BoundCreateTableInfo(TableType::NODE, resourceTableName, std::move(resourceExtraInfo)); // Literal table. @@ -27,8 +27,8 @@ BoundCreateTableInfo Binder::bindCreateRdfGraphInfo(const CreateTableInfo* info) literalProperties.emplace_back(std::string(rdf::ID), *LogicalType::SERIAL()); literalProperties.emplace_back(std::string(rdf::VAL), *LogicalType::RDF_VARIANT()); literalProperties.emplace_back(std::string(rdf::LANG), *LogicalType::STRING()); - auto literalExtraInfo = std::make_unique( - 0 /* primaryKeyIdx */, std::move(literalProperties)); + auto literalExtraInfo = std::make_unique(0 /* primaryKeyIdx */, + std::move(literalProperties)); auto literalCreateInfo = BoundCreateTableInfo(TableType::NODE, literalTableName, std::move(literalExtraInfo)); // Resource triple table. @@ -39,8 +39,8 @@ BoundCreateTableInfo Binder::bindCreateRdfGraphInfo(const CreateTableInfo* info) auto boundResourceTripleExtraInfo = std::make_unique(RelMultiplicity::MANY, RelMultiplicity::MANY, INVALID_TABLE_ID, INVALID_TABLE_ID, std::move(resourceTripleProperties)); - auto boundResourceTripleCreateInfo = BoundCreateTableInfo( - TableType::REL, resourceTripleTableName, std::move(boundResourceTripleExtraInfo)); + auto boundResourceTripleCreateInfo = BoundCreateTableInfo(TableType::REL, + resourceTripleTableName, std::move(boundResourceTripleExtraInfo)); // Literal triple table. auto literalTripleTableName = RDFGraphCatalogEntry::getLiteralTripleTableName(rdfGraphName); std::vector literalTripleProperties; @@ -49,8 +49,8 @@ BoundCreateTableInfo Binder::bindCreateRdfGraphInfo(const CreateTableInfo* info) auto boundLiteralTripleExtraInfo = std::make_unique(RelMultiplicity::MANY, RelMultiplicity::MANY, INVALID_TABLE_ID, INVALID_TABLE_ID, std::move(literalTripleProperties)); - auto boundLiteralTripleCreateInfo = BoundCreateTableInfo( - TableType::REL, literalTripleTableName, std::move(boundLiteralTripleExtraInfo)); + auto boundLiteralTripleCreateInfo = BoundCreateTableInfo(TableType::REL, literalTripleTableName, + std::move(boundLiteralTripleExtraInfo)); // Rdf table. auto boundExtraInfo = std::make_unique( std::move(resourceCreateInfo), std::move(literalCreateInfo), diff --git a/src/binder/bind_expression/bind_boolean_expression.cpp b/src/binder/bind_expression/bind_boolean_expression.cpp index 8464a48ccd3..5e8ec912330 100644 --- a/src/binder/bind_expression/bind_boolean_expression.cpp +++ b/src/binder/bind_expression/bind_boolean_expression.cpp @@ -17,8 +17,8 @@ std::shared_ptr ExpressionBinder::bindBooleanExpression( return bindBooleanExpression(parsedExpression.getExpressionType(), children); } -std::shared_ptr ExpressionBinder::bindBooleanExpression( - ExpressionType expressionType, const expression_vector& children) { +std::shared_ptr ExpressionBinder::bindBooleanExpression(ExpressionType expressionType, + const expression_vector& children) { expression_vector childrenAfterCast; for (auto& child : children) { childrenAfterCast.push_back(implicitCastIfNecessary(child, LogicalTypeID::BOOL)); @@ -27,8 +27,8 @@ std::shared_ptr ExpressionBinder::bindBooleanExpression( function::scalar_func_exec_t execFunc; function::VectorBooleanFunction::bindExecFunction(expressionType, childrenAfterCast, execFunc); function::scalar_func_select_t selectFunc; - function::VectorBooleanFunction::bindSelectFunction( - expressionType, childrenAfterCast, selectFunc); + function::VectorBooleanFunction::bindSelectFunction(expressionType, childrenAfterCast, + selectFunc); auto bindData = std::make_unique(LogicalType::BOOL()); auto uniqueExpressionName = ScalarFunctionExpression::getUniqueName(functionName, childrenAfterCast); @@ -45,8 +45,8 @@ std::shared_ptr ExpressionBinder::combineBooleanExpressions( } else if (right == nullptr) { return left; } else { - return bindBooleanExpression( - expressionType, expression_vector{std::move(left), std::move(right)}); + return bindBooleanExpression(expressionType, + expression_vector{std::move(left), std::move(right)}); } } diff --git a/src/binder/bind_expression/bind_comparison_expression.cpp b/src/binder/bind_expression/bind_comparison_expression.cpp index 42161e187bf..251be59d28a 100644 --- a/src/binder/bind_expression/bind_comparison_expression.cpp +++ b/src/binder/bind_expression/bind_comparison_expression.cpp @@ -68,8 +68,8 @@ std::shared_ptr ExpressionBinder::bindComparisonExpression( std::shared_ptr ExpressionBinder::createEqualityComparisonExpression( std::shared_ptr left, std::shared_ptr right) { - return bindComparisonExpression( - ExpressionType::EQUALS, expression_vector{std::move(left), std::move(right)}); + return bindComparisonExpression(ExpressionType::EQUALS, + expression_vector{std::move(left), std::move(right)}); } } // namespace binder diff --git a/src/binder/bind_expression/bind_function_expression.cpp b/src/binder/bind_expression/bind_function_expression.cpp index 66ca34e216e..3b63cb759de 100644 --- a/src/binder/bind_expression/bind_function_expression.cpp +++ b/src/binder/bind_expression/bind_function_expression.cpp @@ -116,8 +116,8 @@ std::shared_ptr ExpressionBinder::bindRewriteFunctionExpression( } auto childrenTypes = getTypes(children); auto functions = context->getCatalog()->getFunctions(context->getTx()); - auto match = BuiltInFunctionsUtils::matchFunction( - funcExpr.getNormalizedFunctionName(), childrenTypes, functions); + auto match = BuiltInFunctionsUtils::matchFunction(funcExpr.getNormalizedFunctionName(), + childrenTypes, functions); auto function = ku_dynamic_cast(match); KU_ASSERT(function->rewriteFunc != nullptr); return function->rewriteFunc(children, this); @@ -138,8 +138,8 @@ std::shared_ptr ExpressionBinder::bindAggregateFunctionExpression( children.push_back(std::move(child)); } auto functions = context->getCatalog()->getFunctions(context->getTx()); - auto function = function::BuiltInFunctionsUtils::matchAggregateFunction( - functionName, childrenTypes, isDistinct, functions) + auto function = function::BuiltInFunctionsUtils::matchAggregateFunction(functionName, + childrenTypes, isDistinct, functions) ->clone(); if (function->paramRewriteFunc) { function->paramRewriteFunc(children); @@ -202,8 +202,8 @@ std::shared_ptr ExpressionBinder::rewriteFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName) { if (functionName == LabelFunction::name) { auto child = bindExpression(*parsedExpression.getChild(0)); - validateExpectedDataType( - *child, std::vector{LogicalTypeID::NODE, LogicalTypeID::REL}); + validateExpectedDataType(*child, + std::vector{LogicalTypeID::NODE, LogicalTypeID::REL}); return bindLabelFunction(*child); } else if (functionName == LengthFunction::name) { auto child = bindExpression(*parsedExpression.getChild(0)); @@ -262,8 +262,8 @@ std::shared_ptr ExpressionBinder::bindLabelFunction(const Expression } auto nodeTableIDs = catalog->getNodeTableIDs(context->getTx()); children.push_back(node.getInternalID()); - auto labelsValue = std::make_unique( - std::move(listType), populateLabelValues(nodeTableIDs, *catalog, context->getTx())); + auto labelsValue = std::make_unique(std::move(listType), + populateLabelValues(nodeTableIDs, *catalog, context->getTx())); children.push_back(createLiteralExpression(std::move(labelsValue))); } break; case LogicalTypeID::REL: { @@ -275,8 +275,8 @@ std::shared_ptr ExpressionBinder::bindLabelFunction(const Expression } auto relTableIDs = catalog->getRelTableIDs(context->getTx()); children.push_back(rel.getInternalIDProperty()); - auto labelsValue = std::make_unique( - std::move(listType), populateLabelValues(relTableIDs, *catalog, context->getTx())); + auto labelsValue = std::make_unique(std::move(listType), + populateLabelValues(relTableIDs, *catalog, context->getTx())); children.push_back(createLiteralExpression(std::move(labelsValue))); } break; default: diff --git a/src/binder/bind_expression/bind_literal_expression.cpp b/src/binder/bind_expression/bind_literal_expression.cpp index 56b02344b03..c1d115c2113 100644 --- a/src/binder/bind_expression/bind_literal_expression.cpp +++ b/src/binder/bind_expression/bind_literal_expression.cpp @@ -32,8 +32,8 @@ std::shared_ptr ExpressionBinder::createStringLiteralExpression( } std::shared_ptr ExpressionBinder::createNullLiteralExpression() { - return make_shared( - std::make_unique(Value::createNullValue()), binder->getUniqueExpressionName("NULL")); + return make_shared(std::make_unique(Value::createNullValue()), + binder->getUniqueExpressionName("NULL")); } } // namespace binder diff --git a/src/binder/bind_expression/bind_property_expression.cpp b/src/binder/bind_expression/bind_property_expression.cpp index 5aa1fc53ecd..cc45fef1bf6 100644 --- a/src/binder/bind_expression/bind_property_expression.cpp +++ b/src/binder/bind_expression/bind_property_expression.cpp @@ -66,8 +66,8 @@ std::shared_ptr ExpressionBinder::bindPropertyExpression( const ParsedExpression& parsedExpression) { auto& propertyExpression = (ParsedPropertyExpression&)parsedExpression; if (propertyExpression.isStar()) { - throw BinderException(stringFormat( - "Cannot bind {} as a single property expression.", parsedExpression.toString())); + throw BinderException(stringFormat("Cannot bind {} as a single property expression.", + parsedExpression.toString())); } auto propertyName = propertyExpression.getPropertyName(); auto child = bindExpression(*parsedExpression.getChild(0)); diff --git a/src/binder/bind_expression/bind_subquery_expression.cpp b/src/binder/bind_expression/bind_subquery_expression.cpp index ef05be7d8b1..68b1732cc36 100644 --- a/src/binder/bind_expression/bind_subquery_expression.cpp +++ b/src/binder/bind_expression/bind_subquery_expression.cpp @@ -35,8 +35,8 @@ std::shared_ptr ExpressionBinder::bindSubqueryExpression( boundSubqueryExpr->setWhereExpression(boundGraphPattern.where); // Bind projection auto functions = context->getCatalog()->getFunctions(context->getTx()); - auto function = BuiltInFunctionsUtils::matchAggregateFunction( - CountStarFunction::name, std::vector{}, false, functions); + auto function = BuiltInFunctionsUtils::matchAggregateFunction(CountStarFunction::name, + std::vector{}, false, functions); auto bindData = std::make_unique(std::make_unique(function->returnTypeID)); auto countStarExpr = std::make_shared(CountStarFunction::name, @@ -52,8 +52,8 @@ std::shared_ptr ExpressionBinder::bindSubqueryExpression( case SubqueryType::EXISTS: { // Rewrite EXISTS subquery as COUNT(*) > 0 auto literalExpr = createLiteralExpression(std::make_unique((int64_t)0)); - projectionExpr = bindComparisonExpression( - ExpressionType::GREATER_THAN, expression_vector{countStarExpr, literalExpr}); + projectionExpr = bindComparisonExpression(ExpressionType::GREATER_THAN, + expression_vector{countStarExpr, literalExpr}); } break; default: KU_UNREACHABLE; diff --git a/src/binder/bind_expression/bind_variable_expression.cpp b/src/binder/bind_expression/bind_variable_expression.cpp index a4bf60bbb2a..a68fa7f1e32 100644 --- a/src/binder/bind_expression/bind_variable_expression.cpp +++ b/src/binder/bind_expression/bind_variable_expression.cpp @@ -32,10 +32,10 @@ std::shared_ptr ExpressionBinder::createVariableExpression( return createVariableExpression(logicalType, std::string(name)); } -std::shared_ptr ExpressionBinder::createVariableExpression( - LogicalType logicalType, std::string name) { - return std::make_shared( - std::move(logicalType), binder->getUniqueExpressionName(name), std::move(name)); +std::shared_ptr ExpressionBinder::createVariableExpression(LogicalType logicalType, + std::string name) { + return std::make_shared(std::move(logicalType), + binder->getUniqueExpressionName(name), std::move(name)); } } // namespace binder diff --git a/src/binder/binder.cpp b/src/binder/binder.cpp index 91ab2ff5207..d416829746e 100644 --- a/src/binder/binder.cpp +++ b/src/binder/binder.cpp @@ -96,18 +96,18 @@ common::table_id_t Binder::bindTableID(const std::string& tableName) const { return catalog->getTableID(clientContext->getTx(), tableName); } -std::shared_ptr Binder::createVariable( - std::string_view name, common::LogicalTypeID typeID) { +std::shared_ptr Binder::createVariable(std::string_view name, + common::LogicalTypeID typeID) { return createVariable(std::string(name), LogicalType{typeID}); } -std::shared_ptr Binder::createVariable( - const std::string& name, LogicalTypeID logicalTypeID) { +std::shared_ptr Binder::createVariable(const std::string& name, + LogicalTypeID logicalTypeID) { return createVariable(name, LogicalType{logicalTypeID}); } -std::shared_ptr Binder::createVariable( - const std::string& name, const LogicalType& dataType) { +std::shared_ptr Binder::createVariable(const std::string& name, + const LogicalType& dataType) { if (scope.contains(name)) { throw BinderException("Variable " + name + " already exists."); } @@ -205,12 +205,12 @@ function::TableFunction Binder::getScanFunction(FileType fileType, const ReaderC auto functions = clientContext->getCatalog()->getFunctions(clientContext->getTx()); switch (fileType) { case FileType::PARQUET: { - func = function::BuiltInFunctionsUtils::matchFunction( - ParquetScanFunction::name, inputTypes, functions); + func = function::BuiltInFunctionsUtils::matchFunction(ParquetScanFunction::name, inputTypes, + functions); } break; case FileType::NPY: { - func = function::BuiltInFunctionsUtils::matchFunction( - NpyScanFunction::name, inputTypes, functions); + func = function::BuiltInFunctionsUtils::matchFunction(NpyScanFunction::name, inputTypes, + functions); } break; case FileType::CSV: { auto csvConfig = CSVReaderConfig::construct(config.options); diff --git a/src/binder/binder_scope.cpp b/src/binder/binder_scope.cpp index 40775243247..e2a540b4ba3 100644 --- a/src/binder/binder_scope.cpp +++ b/src/binder/binder_scope.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace binder { -void BinderScope::addExpression( - const std::string& varName, std::shared_ptr expression) { +void BinderScope::addExpression(const std::string& varName, + std::shared_ptr expression) { nameToExprIdx.insert({varName, expressions.size()}); expressions.push_back(std::move(expression)); } diff --git a/src/binder/bound_statement_rewriter.cpp b/src/binder/bound_statement_rewriter.cpp index f09ac4bb4d5..6dd62c0e5f3 100644 --- a/src/binder/bound_statement_rewriter.cpp +++ b/src/binder/bound_statement_rewriter.cpp @@ -7,8 +7,8 @@ namespace kuzu { namespace binder { -void BoundStatementRewriter::rewrite( - BoundStatement& boundStatement, const main::ClientContext& clientContext) { +void BoundStatementRewriter::rewrite(BoundStatement& boundStatement, + const main::ClientContext& clientContext) { auto withClauseProjectionRewriter = WithClauseProjectionRewriter(); withClauseProjectionRewriter.visitUnsafe(boundStatement); diff --git a/src/binder/expression/expression_util.cpp b/src/binder/expression/expression_util.cpp index 78c7ed9cdec..40e21c98fb0 100644 --- a/src/binder/expression/expression_util.cpp +++ b/src/binder/expression/expression_util.cpp @@ -5,8 +5,8 @@ using namespace kuzu::common; namespace kuzu { namespace binder { -bool ExpressionUtil::isExpressionsWithDataType( - const expression_vector& expressions, common::LogicalTypeID dataTypeID) { +bool ExpressionUtil::isExpressionsWithDataType(const expression_vector& expressions, + common::LogicalTypeID dataTypeID) { for (auto& expression : expressions) { if (expression->dataType.getLogicalTypeID() != dataTypeID) { return false; @@ -15,8 +15,8 @@ bool ExpressionUtil::isExpressionsWithDataType( return true; } -expression_vector ExpressionUtil::getExpressionsWithDataType( - const expression_vector& expressions, common::LogicalTypeID dataTypeID) { +expression_vector ExpressionUtil::getExpressionsWithDataType(const expression_vector& expressions, + common::LogicalTypeID dataTypeID) { expression_vector result; for (auto& expression : expressions) { if (expression->dataType.getLogicalTypeID() == dataTypeID) { @@ -61,8 +61,8 @@ std::string ExpressionUtil::toString(const expression_pair& expressionPair) { return expressionPair.first->toString() + "=" + expressionPair.second->toString(); } -expression_vector ExpressionUtil::excludeExpression( - const expression_vector& exprs, const Expression& exprToExclude) { +expression_vector ExpressionUtil::excludeExpression(const expression_vector& exprs, + const Expression& exprToExclude) { expression_vector result; for (auto& expr : exprs) { if (*expr != exprToExclude) { @@ -72,8 +72,8 @@ expression_vector ExpressionUtil::excludeExpression( return result; } -expression_vector ExpressionUtil::excludeExpressions( - const expression_vector& expressions, const expression_vector& expressionsToExclude) { +expression_vector ExpressionUtil::excludeExpressions(const expression_vector& expressions, + const expression_vector& expressionsToExclude) { expression_set excludeSet; for (auto& expression : expressionsToExclude) { excludeSet.insert(expression); diff --git a/src/binder/expression/function_expression.cpp b/src/binder/expression/function_expression.cpp index 8a9ece310e3..ef4f77ebce7 100644 --- a/src/binder/expression/function_expression.cpp +++ b/src/binder/expression/function_expression.cpp @@ -5,8 +5,8 @@ namespace kuzu { namespace binder { -std::string ScalarFunctionExpression::getUniqueName( - const std::string& functionName, const kuzu::binder::expression_vector& children) { +std::string ScalarFunctionExpression::getUniqueName(const std::string& functionName, + const kuzu::binder::expression_vector& children) { auto result = functionName + "("; for (auto& child : children) { result += child->getUniqueName() + ", "; @@ -26,8 +26,8 @@ std::string ScalarFunctionExpression::toStringInternal() const { return result; } -std::string AggregateFunctionExpression::getUniqueName( - const std::string& functionName, kuzu::binder::expression_vector& children, bool isDistinct) { +std::string AggregateFunctionExpression::getUniqueName(const std::string& functionName, + kuzu::binder::expression_vector& children, bool isDistinct) { auto result = functionName + "("; if (isDistinct) { result += "DISTINCT "; diff --git a/src/binder/expression_binder.cpp b/src/binder/expression_binder.cpp index 0cfafed848d..07eb0a13720 100644 --- a/src/binder/expression_binder.cpp +++ b/src/binder/expression_binder.cpp @@ -58,8 +58,8 @@ std::shared_ptr ExpressionBinder::bindExpression( std::shared_ptr ExpressionBinder::foldExpression( const std::shared_ptr& expression) { - auto value = evaluator::ExpressionEvaluatorUtils::evaluateConstantExpression( - expression, context->getMemoryManager()); + auto value = evaluator::ExpressionEvaluatorUtils::evaluateConstantExpression(expression, + context->getMemoryManager()); auto result = createLiteralExpression(std::move(value)); // Fold result should preserve the alias original expression. E.g. // RETURN 2, 1 + 1 AS x @@ -73,8 +73,8 @@ std::shared_ptr ExpressionBinder::foldExpression( return result; } -static std::string unsupportedImplicitCastException( - const Expression& expression, const std::string& targetTypeStr) { +static std::string unsupportedImplicitCastException(const Expression& expression, + const std::string& targetTypeStr) { return stringFormat( "Expression {} has data type {} but expected {}. Implicit cast is not supported.", expression.toString(), expression.dataType.toString(), targetTypeStr); @@ -89,8 +89,8 @@ std::shared_ptr ExpressionBinder::implicitCastIfNecessary( } // We don't support casting to nested data type. So instead we validate type match. if (expression->getDataType().getLogicalTypeID() != targetTypeID) { - throw BinderException(unsupportedImplicitCastException( - *expression, LogicalTypeUtils::toString(targetTypeID))); + throw BinderException(unsupportedImplicitCastException(*expression, + LogicalTypeUtils::toString(targetTypeID))); } return expression; } @@ -115,8 +115,8 @@ std::shared_ptr ExpressionBinder::implicitCast( auto functionName = stringFormat("CAST_TO({})", targetType.toString()); auto children = expression_vector{expression}; auto bindData = std::make_unique(targetType.copy()); - auto scalarFunction = CastFunction::bindCastFunction( - functionName, expression->dataType.getLogicalTypeID(), targetType.getLogicalTypeID()); + auto scalarFunction = CastFunction::bindCastFunction(functionName, + expression->dataType.getLogicalTypeID(), targetType.getLogicalTypeID()); auto uniqueName = ScalarFunctionExpression::getUniqueName(functionName, children); return std::make_shared(functionName, ExpressionType::FUNCTION, std::move(bindData), std::move(children), scalarFunction->execFunc, @@ -126,8 +126,8 @@ std::shared_ptr ExpressionBinder::implicitCast( } } -void ExpressionBinder::validateExpectedDataType( - const Expression& expression, const std::vector& targets) { +void ExpressionBinder::validateExpectedDataType(const Expression& expression, + const std::vector& targets) { auto dataType = expression.dataType; auto targetsSet = std::unordered_set{targets.begin(), targets.end()}; if (!targetsSet.contains(dataType.getLogicalTypeID())) { diff --git a/src/binder/expression_visitor.cpp b/src/binder/expression_visitor.cpp index 1ed04359fb6..b49ccc9ca9c 100644 --- a/src/binder/expression_visitor.cpp +++ b/src/binder/expression_visitor.cpp @@ -119,8 +119,8 @@ bool ExpressionVisitor::isRandom(const Expression& expression) { return false; } -bool ExpressionVisitor::satisfyAny( - const Expression& expression, const std::function& condition) { +bool ExpressionVisitor::satisfyAny(const Expression& expression, + const std::function& condition) { if (condition(expression)) { return true; } diff --git a/src/binder/rewriter/with_clause_projection_rewriter.cpp b/src/binder/rewriter/with_clause_projection_rewriter.cpp index 2686a25363f..c9edb229d0d 100644 --- a/src/binder/rewriter/with_clause_projection_rewriter.cpp +++ b/src/binder/rewriter/with_clause_projection_rewriter.cpp @@ -8,8 +8,8 @@ using namespace kuzu::common; namespace kuzu { namespace binder { -static expression_vector getPropertiesOfSameVariable( - const expression_vector& expressions, const std::string& variableName) { +static expression_vector getPropertiesOfSameVariable(const expression_vector& expressions, + const std::string& variableName) { expression_vector result; for (auto& expression : expressions) { auto propertyExpression = (PropertyExpression*)expression.get(); @@ -21,8 +21,8 @@ static expression_vector getPropertiesOfSameVariable( return result; } -static expression_vector rewriteExpressions( - const expression_vector& expressions, const expression_vector& properties) { +static expression_vector rewriteExpressions(const expression_vector& expressions, + const expression_vector& properties) { expression_set distinctResult; for (auto& expression : expressions) { if (expression->expressionType != common::ExpressionType::PROPERTY) { diff --git a/src/c_api/connection.cpp b/src/c_api/connection.cpp index 754db57a58e..740dd8cb956 100644 --- a/src/c_api/connection.cpp +++ b/src/c_api/connection.cpp @@ -36,8 +36,8 @@ void kuzu_connection_destroy(kuzu_connection* connection) { free(connection); } -void kuzu_connection_set_max_num_thread_for_exec( - kuzu_connection* connection, uint64_t num_threads) { +void kuzu_connection_set_max_num_thread_for_exec(kuzu_connection* connection, + uint64_t num_threads) { static_cast(connection->_connection)->setMaxNumThreadForExec(num_threads); } @@ -56,7 +56,9 @@ kuzu_query_result* kuzu_connection_query(kuzu_connection* connection, const char c_query_result->_query_result = query_result; c_query_result->_is_owned_by_cpp = false; return c_query_result; - } catch (Exception& e) { return nullptr; } + } catch (Exception& e) { + return nullptr; + } } kuzu_prepared_statement* kuzu_connection_prepare(kuzu_connection* connection, const char* query) { @@ -72,8 +74,8 @@ kuzu_prepared_statement* kuzu_connection_prepare(kuzu_connection* connection, co return c_prepared_statement; } -kuzu_query_result* kuzu_connection_execute( - kuzu_connection* connection, kuzu_prepared_statement* prepared_statement) { +kuzu_query_result* kuzu_connection_execute(kuzu_connection* connection, + kuzu_prepared_statement* prepared_statement) { auto prepared_statement_ptr = static_cast(prepared_statement->_prepared_statement); auto bound_values = static_cast>*>( diff --git a/src/c_api/data_type.cpp b/src/c_api/data_type.cpp index 6030fae4c0c..d7158e77851 100644 --- a/src/c_api/data_type.cpp +++ b/src/c_api/data_type.cpp @@ -5,15 +5,15 @@ using namespace kuzu::common; namespace kuzu::common { struct CAPIHelper { - static inline LogicalType* createLogicalType( - LogicalTypeID typeID, std::unique_ptr extraTypeInfo) { + static inline LogicalType* createLogicalType(LogicalTypeID typeID, + std::unique_ptr extraTypeInfo) { return new LogicalType(typeID, std::move(extraTypeInfo)); } }; } // namespace kuzu::common -kuzu_logical_type* kuzu_data_type_create( - kuzu_data_type_id id, kuzu_logical_type* child_type, uint64_t num_elements_in_array) { +kuzu_logical_type* kuzu_data_type_create(kuzu_data_type_id id, kuzu_logical_type* child_type, + uint64_t num_elements_in_array) { auto* c_data_type = (kuzu_logical_type*)malloc(sizeof(kuzu_logical_type)); uint8_t data_type_id_u8 = id; LogicalType* data_type; diff --git a/src/c_api/database.cpp b/src/c_api/database.cpp index 18d27f29960..97403d791fb 100644 --- a/src/c_api/database.cpp +++ b/src/c_api/database.cpp @@ -9,9 +9,9 @@ kuzu_database* kuzu_database_init(const char* database_path, kuzu_system_config auto database = (kuzu_database*)malloc(sizeof(kuzu_database)); std::string database_path_str = database_path; try { - database->_database = new Database( - database_path_str, SystemConfig(config.buffer_pool_size, config.max_num_threads, - config.enable_compression, config.read_only)); + database->_database = new Database(database_path_str, + SystemConfig(config.buffer_pool_size, config.max_num_threads, config.enable_compression, + config.read_only)); } catch (Exception& e) { free(database); return nullptr; diff --git a/src/c_api/flat_tuple.cpp b/src/c_api/flat_tuple.cpp index 5a7aefb6832..4c689355c25 100644 --- a/src/c_api/flat_tuple.cpp +++ b/src/c_api/flat_tuple.cpp @@ -25,7 +25,9 @@ kuzu_value* kuzu_flat_tuple_get_value(kuzu_flat_tuple* flat_tuple, uint64_t inde Value* _value; try { _value = (*flat_tuple_shared_ptr)->getValue(index); - } catch (Exception& e) { return nullptr; } + } catch (Exception& e) { + return nullptr; + } auto* value = (kuzu_value*)malloc(sizeof(kuzu_value)); value->_value = _value; // We set the ownership of the value to C++, so it will not be deleted if the value is destroyed diff --git a/src/c_api/prepared_statement.cpp b/src/c_api/prepared_statement.cpp index 5c1464459f9..20b25507014 100644 --- a/src/c_api/prepared_statement.cpp +++ b/src/c_api/prepared_statement.cpp @@ -46,74 +46,74 @@ char* kuzu_prepared_statement_get_error_message(kuzu_prepared_statement* prepare return convertToOwnedCString(error_message); } -void kuzu_prepared_statement_bind_bool( - kuzu_prepared_statement* prepared_statement, const char* param_name, bool value) { +void kuzu_prepared_statement_bind_bool(kuzu_prepared_statement* prepared_statement, + const char* param_name, bool value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_int64( - kuzu_prepared_statement* prepared_statement, const char* param_name, int64_t value) { +void kuzu_prepared_statement_bind_int64(kuzu_prepared_statement* prepared_statement, + const char* param_name, int64_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_int32( - kuzu_prepared_statement* prepared_statement, const char* param_name, int32_t value) { +void kuzu_prepared_statement_bind_int32(kuzu_prepared_statement* prepared_statement, + const char* param_name, int32_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_int16( - kuzu_prepared_statement* prepared_statement, const char* param_name, int16_t value) { +void kuzu_prepared_statement_bind_int16(kuzu_prepared_statement* prepared_statement, + const char* param_name, int16_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_int8( - kuzu_prepared_statement* prepared_statement, const char* param_name, int8_t value) { +void kuzu_prepared_statement_bind_int8(kuzu_prepared_statement* prepared_statement, + const char* param_name, int8_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_uint64( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint64_t value) { +void kuzu_prepared_statement_bind_uint64(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint64_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_uint32( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint32_t value) { +void kuzu_prepared_statement_bind_uint32(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint32_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_uint16( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint16_t value) { +void kuzu_prepared_statement_bind_uint16(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint16_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_uint8( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint8_t value) { +void kuzu_prepared_statement_bind_uint8(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint8_t value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_double( - kuzu_prepared_statement* prepared_statement, const char* param_name, double value) { +void kuzu_prepared_statement_bind_double(kuzu_prepared_statement* prepared_statement, + const char* param_name, double value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_float( - kuzu_prepared_statement* prepared_statement, const char* param_name, float value) { +void kuzu_prepared_statement_bind_float(kuzu_prepared_statement* prepared_statement, + const char* param_name, float value) { auto value_ptr = std::make_unique(value); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_date( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_date_t value) { +void kuzu_prepared_statement_bind_date(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_date_t value) { auto value_ptr = std::make_unique(date_t(value.days)); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } @@ -142,26 +142,26 @@ void kuzu_prepared_statement_bind_timestamp_tz(kuzu_prepared_statement* prepared kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_timestamp( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_timestamp_t value) { +void kuzu_prepared_statement_bind_timestamp(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_timestamp_t value) { auto value_ptr = std::make_unique(timestamp_t(value.value)); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_interval( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_interval_t value) { +void kuzu_prepared_statement_bind_interval(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_interval_t value) { auto value_ptr = std::make_unique(interval_t(value.months, value.days, value.micros)); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_string( - kuzu_prepared_statement* prepared_statement, const char* param_name, const char* value) { +void kuzu_prepared_statement_bind_string(kuzu_prepared_statement* prepared_statement, + const char* param_name, const char* value) { auto value_ptr = std::make_unique(LogicalType::STRING(), std::string(value)); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } -void kuzu_prepared_statement_bind_value( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_value* value) { +void kuzu_prepared_statement_bind_value(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_value* value) { auto value_ptr = std::make_unique(*static_cast(value->_value)); kuzu_prepared_statement_bind_cpp_value(prepared_statement, param_name, std::move(value_ptr)); } diff --git a/src/c_api/query_result.cpp b/src/c_api/query_result.cpp index ec839c95aef..508ccc2f059 100644 --- a/src/c_api/query_result.cpp +++ b/src/c_api/query_result.cpp @@ -43,8 +43,8 @@ char* kuzu_query_result_get_column_name(kuzu_query_result* query_result, uint64_ return convertToOwnedCString(column_names[index]); } -kuzu_logical_type* kuzu_query_result_get_column_data_type( - kuzu_query_result* query_result, uint64_t index) { +kuzu_logical_type* kuzu_query_result_get_column_data_type(kuzu_query_result* query_result, + uint64_t index) { auto column_data_types = static_cast(query_result->_query_result)->getColumnDataTypes(); if (index >= column_data_types.size()) { @@ -107,7 +107,7 @@ struct ArrowSchema kuzu_query_result_get_arrow_schema(kuzu_query_result* query_r return *static_cast(query_result->_query_result)->getArrowSchema(); } -struct ArrowArray kuzu_query_result_get_next_arrow_chunk( - kuzu_query_result* query_result, int64_t chunk_size) { +struct ArrowArray kuzu_query_result_get_next_arrow_chunk(kuzu_query_result* query_result, + int64_t chunk_size) { return *static_cast(query_result->_query_result)->getNextArrowChunk(chunk_size); } diff --git a/src/catalog/catalog.cpp b/src/catalog/catalog.cpp index 6f580bd1a94..4b39975d4f9 100644 --- a/src/catalog/catalog.cpp +++ b/src/catalog/catalog.cpp @@ -93,8 +93,8 @@ std::vector Catalog::getTableEntries(Transaction* tx) const return result; } -std::vector Catalog::getTableSchemas( - Transaction* tx, const table_id_vector_t& tableIDs) const { +std::vector Catalog::getTableSchemas(Transaction* tx, + const table_id_vector_t& tableIDs) const { std::vector result; for (auto tableID : tableIDs) { result.push_back(ku_dynamic_cast( @@ -205,8 +205,8 @@ void Catalog::logAlterTableToWAL(const BoundAlterInfo& info) { auto& addPropInfo = ku_dynamic_cast( *info.extraInfo); - wal->logAddPropertyRecord( - info.tableID, tableSchema->getPropertyID(addPropInfo.propertyName)); + wal->logAddPropertyRecord(info.tableID, + tableSchema->getPropertyID(addPropInfo.propertyName)); } break; case AlterType::DROP_PROPERTY: { auto& dropPropInfo = @@ -247,8 +247,8 @@ bool Catalog::containsMacro(Transaction* tx, const std::string& macroName) const return getVersion(tx)->containMacro(macroName); } -void Catalog::addScalarMacroFunction( - std::string name, std::unique_ptr macro) { +void Catalog::addScalarMacroFunction(std::string name, + std::unique_ptr macro) { KU_ASSERT(readWriteVersion != nullptr); setToUpdated(); auto scalarMacroCatalogEntry = diff --git a/src/catalog/catalog_content.cpp b/src/catalog/catalog_content.cpp index e7d92ed7cb1..9b11b84ce39 100644 --- a/src/catalog/catalog_content.cpp +++ b/src/catalog/catalog_content.cpp @@ -63,8 +63,8 @@ table_id_t CatalogContent::createTable(const BoundCreateTableInfo& info) { return tableID; } -std::unique_ptr CatalogContent::createNodeTableEntry( - table_id_t tableID, const BoundCreateTableInfo& info) const { +std::unique_ptr CatalogContent::createNodeTableEntry(table_id_t tableID, + const BoundCreateTableInfo& info) const { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -76,8 +76,8 @@ std::unique_ptr CatalogContent::createNodeTableEntry( return nodeTableEntry; } -std::unique_ptr CatalogContent::createRelTableEntry( - table_id_t tableID, const BoundCreateTableInfo& info) const { +std::unique_ptr CatalogContent::createRelTableEntry(table_id_t tableID, + const BoundCreateTableInfo& info) const { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -96,8 +96,8 @@ std::unique_ptr CatalogContent::createRelTableEntry( return relTableEntry; } -std::unique_ptr CatalogContent::createRelTableGroupEntry( - table_id_t tableID, const BoundCreateTableInfo& info) { +std::unique_ptr CatalogContent::createRelTableGroupEntry(table_id_t tableID, + const BoundCreateTableInfo& info) { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -109,8 +109,8 @@ std::unique_ptr CatalogContent::createRelTableGroupEntry( return std::make_unique(info.tableName, tableID, std::move(relTableIDs)); } -std::unique_ptr CatalogContent::createRdfGraphEntry( - table_id_t tableID, const BoundCreateTableInfo& info) { +std::unique_ptr CatalogContent::createRdfGraphEntry(table_id_t tableID, + const BoundCreateTableInfo& info) { auto extraInfo = ku_dynamic_cast( info.extraInfo.get()); @@ -198,8 +198,8 @@ void CatalogContent::renameTable(table_id_t tableID, const std::string& newName) auto rdfGraphEntry = ku_dynamic_cast(tableEntry); renameTable(rdfGraphEntry->getResourceTableID(), RDFGraphCatalogEntry::getResourceTableName(newName)); - renameTable( - rdfGraphEntry->getLiteralTableID(), RDFGraphCatalogEntry::getLiteralTableName(newName)); + renameTable(rdfGraphEntry->getLiteralTableID(), + RDFGraphCatalogEntry::getLiteralTableName(newName)); renameTable(rdfGraphEntry->getResourceTripleTableID(), RDFGraphCatalogEntry::getResourceTripleTableName(newName)); renameTable(rdfGraphEntry->getLiteralTripleTableID(), diff --git a/src/catalog/catalog_entry/function_catalog_entry.cpp b/src/catalog/catalog_entry/function_catalog_entry.cpp index edc8c74164d..293ae88cf92 100644 --- a/src/catalog/catalog_entry/function_catalog_entry.cpp +++ b/src/catalog/catalog_entry/function_catalog_entry.cpp @@ -5,13 +5,13 @@ namespace kuzu { namespace catalog { -FunctionCatalogEntry::FunctionCatalogEntry( - CatalogEntryType entryType, std::string name, function::function_set functionSet) +FunctionCatalogEntry::FunctionCatalogEntry(CatalogEntryType entryType, std::string name, + function::function_set functionSet) : CatalogEntry{entryType, std::move(name)}, functionSet{std::move(functionSet)} {} std::unique_ptr FunctionCatalogEntry::copy() const { - return std::make_unique( - getType(), getName(), common::copyVector>(functionSet)); + return std::make_unique(getType(), getName(), + common::copyVector>(functionSet)); } } // namespace catalog diff --git a/src/catalog/catalog_entry/node_table_catalog_entry.cpp b/src/catalog/catalog_entry/node_table_catalog_entry.cpp index 296838dae03..fb1398c94bc 100644 --- a/src/catalog/catalog_entry/node_table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/node_table_catalog_entry.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace catalog { -NodeTableCatalogEntry::NodeTableCatalogEntry( - std::string name, common::table_id_t tableID, common::property_id_t primaryKeyPID) +NodeTableCatalogEntry::NodeTableCatalogEntry(std::string name, common::table_id_t tableID, + common::property_id_t primaryKeyPID) : TableCatalogEntry{CatalogEntryType::NODE_TABLE_ENTRY, std::move(name), tableID}, primaryKeyPID{primaryKeyPID} {} diff --git a/src/catalog/catalog_entry/rel_group_catalog_entry.cpp b/src/catalog/catalog_entry/rel_group_catalog_entry.cpp index 17711e028af..c047ac11201 100644 --- a/src/catalog/catalog_entry/rel_group_catalog_entry.cpp +++ b/src/catalog/catalog_entry/rel_group_catalog_entry.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace catalog { -RelGroupCatalogEntry::RelGroupCatalogEntry( - std::string tableName, common::table_id_t tableID, std::vector relTableIDs) +RelGroupCatalogEntry::RelGroupCatalogEntry(std::string tableName, common::table_id_t tableID, + std::vector relTableIDs) : TableCatalogEntry{CatalogEntryType::REL_GROUP_ENTRY, std::move(tableName), tableID}, relTableIDs{std::move(relTableIDs)} {} diff --git a/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp b/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp index aea87f907fd..ce2e695eb6a 100644 --- a/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp +++ b/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp @@ -3,10 +3,10 @@ namespace kuzu { namespace catalog { -ScalarMacroCatalogEntry::ScalarMacroCatalogEntry( - std::string name, std::unique_ptr macroFunction) - : CatalogEntry{CatalogEntryType::SCALAR_MACRO_ENTRY, std::move(name)}, macroFunction{std::move( - macroFunction)} {} +ScalarMacroCatalogEntry::ScalarMacroCatalogEntry(std::string name, + std::unique_ptr macroFunction) + : CatalogEntry{CatalogEntryType::SCALAR_MACRO_ENTRY, std::move(name)}, + macroFunction{std::move(macroFunction)} {} void ScalarMacroCatalogEntry::serialize(common::Serializer& serializer) const { CatalogEntry::serialize(serializer); diff --git a/src/catalog/catalog_entry/table_catalog_entry.cpp b/src/catalog/catalog_entry/table_catalog_entry.cpp index 8a5a0267d44..74edb93d72a 100644 --- a/src/catalog/catalog_entry/table_catalog_entry.cpp +++ b/src/catalog/catalog_entry/table_catalog_entry.cpp @@ -35,14 +35,13 @@ common::column_id_t TableCatalogEntry::getColumnID(const common::property_id_t p } bool TableCatalogEntry::containPropertyType(const common::LogicalType& logicalType) const { - return std::any_of( - properties.begin(), properties.end(), [&logicalType](const Property& property) { - return *property.getDataType() == logicalType; - }); + return std::any_of(properties.begin(), properties.end(), + [&logicalType]( + const Property& property) { return *property.getDataType() == logicalType; }); } -void TableCatalogEntry::addProperty( - std::string propertyName, std::unique_ptr dataType) { +void TableCatalogEntry::addProperty(std::string propertyName, + std::unique_ptr dataType) { properties.emplace_back(std::move(propertyName), std::move(dataType), nextPID++, tableID); } @@ -54,8 +53,8 @@ void TableCatalogEntry::dropProperty(common::property_id_t propertyID) { properties.end()); } -void TableCatalogEntry::renameProperty( - common::property_id_t propertyID, const std::string& newName) { +void TableCatalogEntry::renameProperty(common::property_id_t propertyID, + const std::string& newName) { auto it = std::find_if(properties.begin(), properties.end(), [&propertyID](const auto& property) { return property.getPropertyID() == propertyID; }); KU_ASSERT(it != properties.end()); diff --git a/src/common/arrow/arrow_array_scan.cpp b/src/common/arrow/arrow_array_scan.cpp index a588ab5f146..82aa4bd3cc7 100644 --- a/src/common/arrow/arrow_array_scan.cpp +++ b/src/common/arrow/arrow_array_scan.cpp @@ -26,8 +26,8 @@ void scanArrowArrayFixedSizePrimitive(const ArrowArray* array, ValueVector auto arrayBuffer = (const uint8_t*)array->buffers[1]; mask->copyToValueVector(&outputVector, dstOffset, count); for (uint64_t i = 0; i < count; i++) { - outputVector.setValue( - i + dstOffset, NullMask::isNull((const uint64_t*)arrayBuffer, i + srcOffset)); + outputVector.setValue(i + dstOffset, + NullMask::isNull((const uint64_t*)arrayBuffer, i + srcOffset)); } } @@ -39,8 +39,8 @@ static void scanArrowArrayDurationScaledUp(const ArrowArray* array, ValueVector& for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curValue = arrayBuffer[i]; - outputVector.setValue( - i + dstOffset, interval_t(0, 0, curValue * scaleFactor)); + outputVector.setValue(i + dstOffset, + interval_t(0, 0, curValue * scaleFactor)); } } } @@ -53,8 +53,8 @@ static void scanArrowArrayDurationScaledDown(const ArrowArray* array, ValueVecto for (uint64_t i = 0; i < count; i++) { if (!mask->isNull(i)) { auto curValue = arrayBuffer[i]; - outputVector.setValue( - i + dstOffset, interval_t(0, 0, curValue / scaleFactor)); + outputVector.setValue(i + dstOffset, + interval_t(0, 0, curValue / scaleFactor)); } } } @@ -130,13 +130,13 @@ static void scanArrowArrayBLOBView(const ArrowArray* array, ValueVector& outputV // view structures are 16 bytes long auto viewLength = curView[0]; if (viewLength <= 12) { - BlobVector::addBlob( - &outputVector, i + dstOffset, (uint8_t*)(curView + 1), viewLength); + BlobVector::addBlob(&outputVector, i + dstOffset, (uint8_t*)(curView + 1), + viewLength); } else { auto bufIndex = curView[2]; auto offset = curView[3]; - BlobVector::addBlob( - &outputVector, i + dstOffset, valueBuffs[bufIndex] + offset, viewLength); + BlobVector::addBlob(&outputVector, i + dstOffset, valueBuffs[bufIndex] + offset, + viewLength); } } } @@ -325,29 +325,29 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* if (array->dictionary != nullptr) { switch (arrowType[0]) { case 'c': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 'C': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 's': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 'S': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 'i': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 'I': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 'l': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); case 'L': - return scanArrowArrayDictionaryEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDictionaryEncoded(schema, array, outputVector, mask, + srcOffset, dstOffset, count); default: throw RuntimeException("Invalid Index Type: " + std::string(arrowType)); } @@ -359,48 +359,48 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* return; case 'b': // BOOL - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'c': // INT8 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'C': // UINT8 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 's': // INT16 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'S': // UINT16 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'i': // INT32 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'I': // UINT32 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'l': // INT64 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'L': // UINT64 - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'f': // FLOAT - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'g': // DOUBLE - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'z': // BLOB return scanArrowArrayBLOB(array, outputVector, mask, srcOffset, dstOffset, count); @@ -425,44 +425,44 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* } case 'w': // FIXED BLOB - return scanArrowArrayFixedBLOB( - array, outputVector, mask, std::stoi(arrowType + 2), srcOffset, dstOffset, count); + return scanArrowArrayFixedBLOB(array, outputVector, mask, std::stoi(arrowType + 2), + srcOffset, dstOffset, count); case 't': switch (arrowType[1]) { case 'd': // DATE if (arrowType[2] == 'D') { // days since unix epoch - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, + srcOffset, dstOffset, count); } else { // ms since unix epoch - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, + srcOffset, dstOffset, count); } case 't': // TODO pure time type KU_UNREACHABLE; case 's': // TIMESTAMP - return scanArrowArrayFixedSizePrimitive( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayFixedSizePrimitive(array, outputVector, mask, srcOffset, + dstOffset, count); case 'D': // DURATION (KUZU INTERVAL) switch (arrowType[2]) { case 's': // consider implement overflow checking here? - return scanArrowArrayDurationScaledUp( - array, outputVector, mask, 1000000, srcOffset, dstOffset, count); + return scanArrowArrayDurationScaledUp(array, outputVector, mask, 1000000, srcOffset, + dstOffset, count); case 'm': - return scanArrowArrayDurationScaledUp( - array, outputVector, mask, 1000, srcOffset, dstOffset, count); + return scanArrowArrayDurationScaledUp(array, outputVector, mask, 1000, srcOffset, + dstOffset, count); case 'u': - return scanArrowArrayDurationScaledUp( - array, outputVector, mask, 1, srcOffset, dstOffset, count); + return scanArrowArrayDurationScaledUp(array, outputVector, mask, 1, srcOffset, + dstOffset, count); case 'n': - return scanArrowArrayDurationScaledDown( - array, outputVector, mask, 1000, srcOffset, dstOffset, count); + return scanArrowArrayDurationScaledDown(array, outputVector, mask, 1000, srcOffset, + dstOffset, count); default: KU_UNREACHABLE; } @@ -470,14 +470,14 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* // INTERVAL switch (arrowType[2]) { case 'M': - return scanArrowArrayMonthInterval( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayMonthInterval(array, outputVector, mask, srcOffset, dstOffset, + count); case 'D': - return scanArrowArrayDayTimeInterval( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDayTimeInterval(array, outputVector, mask, srcOffset, + dstOffset, count); case 'n': - return scanArrowArrayMonthDayNanoInterval( - array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayMonthDayNanoInterval(array, outputVector, mask, srcOffset, + dstOffset, count); default: KU_UNREACHABLE; } @@ -488,16 +488,16 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* switch (arrowType[1]) { case 'r': // RUN END ENCODED - return scanArrowArrayRunEndEncoded( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayRunEndEncoded(schema, array, outputVector, mask, srcOffset, + dstOffset, count); case 'l': // LIST - return scanArrowArrayList( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayList(schema, array, outputVector, mask, srcOffset, + dstOffset, count); case 'L': // LONG LIST - return scanArrowArrayList( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayList(schema, array, outputVector, mask, srcOffset, + dstOffset, count); case 'w': // FIXED_LIST // TODO Manh: Array Scanning @@ -506,30 +506,30 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* // schema, array, outputVector, mask, srcOffset, dstOffset, count); case 's': // STRUCT - return scanArrowArrayStruct( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayStruct(schema, array, outputVector, mask, srcOffset, dstOffset, + count); case 'm': // MAP - return scanArrowArrayList( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayList(schema, array, outputVector, mask, srcOffset, + dstOffset, count); case 'u': if (arrowType[2] == 'd') { // DENSE UNION - return scanArrowArrayDenseUnion( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayDenseUnion(schema, array, outputVector, mask, srcOffset, + dstOffset, count); } else { // SPARSE UNION - return scanArrowArraySparseUnion( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArraySparseUnion(schema, array, outputVector, mask, srcOffset, + dstOffset, count); } case 'v': switch (arrowType[2]) { case 'l': - return scanArrowArrayListView( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayListView(schema, array, outputVector, mask, srcOffset, + dstOffset, count); case 'L': - return scanArrowArrayListView( - schema, array, outputVector, mask, srcOffset, dstOffset, count); + return scanArrowArrayListView(schema, array, outputVector, mask, srcOffset, + dstOffset, count); // LONG LIST VIEW default: KU_UNREACHABLE; @@ -542,8 +542,8 @@ void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* } } -void ArrowConverter::fromArrowArray( - const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector) { +void ArrowConverter::fromArrowArray(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector) { ArrowNullMaskTree mask(schema, array, array->offset, array->length); return fromArrowArray(schema, array, outputVector, &mask, array->offset, 0, array->length); } diff --git a/src/common/arrow/arrow_converter.cpp b/src/common/arrow/arrow_converter.cpp index 513ae926009..e6c4f9c4893 100644 --- a/src/common/arrow/arrow_converter.cpp +++ b/src/common/arrow/arrow_converter.cpp @@ -41,8 +41,8 @@ void ArrowConverter::initializeChild(ArrowSchema& child, const std::string& name child.dictionary = nullptr; } -void ArrowConverter::setArrowFormatForStruct( - ArrowSchemaHolder& rootHolder, ArrowSchema& child, const main::DataTypeInfo& typeInfo) { +void ArrowConverter::setArrowFormatForStruct(ArrowSchemaHolder& rootHolder, ArrowSchema& child, + const main::DataTypeInfo& typeInfo) { auto& childrenTypesInfo = typeInfo.childrenTypesInfo; child.format = "+s"; // name is set by parent. @@ -62,8 +62,8 @@ void ArrowConverter::setArrowFormatForStruct( } } -void ArrowConverter::setArrowFormat( - ArrowSchemaHolder& rootHolder, ArrowSchema& child, const main::DataTypeInfo& typeInfo) { +void ArrowConverter::setArrowFormat(ArrowSchemaHolder& rootHolder, ArrowSchema& child, + const main::DataTypeInfo& typeInfo) { switch (typeInfo.typeID) { case LogicalTypeID::BOOL: { child.format = "b"; @@ -195,8 +195,8 @@ std::unique_ptr ArrowConverter::toArrowSchema( return outSchema; } -void ArrowConverter::toArrowArray( - main::QueryResult& queryResult, ArrowArray* outArray, std::int64_t chunkSize) { +void ArrowConverter::toArrowArray(main::QueryResult& queryResult, ArrowArray* outArray, + std::int64_t chunkSize) { auto typesInfo = queryResult.getColumnTypesInfo(); auto rowBatch = make_unique(std::move(typesInfo), chunkSize); *outArray = rowBatch->append(queryResult, chunkSize); diff --git a/src/common/arrow/arrow_null_mask_tree.cpp b/src/common/arrow/arrow_null_mask_tree.cpp index 5d236dbab74..e9d7405aa6d 100644 --- a/src/common/arrow/arrow_null_mask_tree.cpp +++ b/src/common/arrow/arrow_null_mask_tree.cpp @@ -46,33 +46,33 @@ bool ArrowNullMaskTree::applyParentBitmap(const NullMask* parent, uint64_t count } template -void ArrowNullMaskTree::scanListPushDown( - const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count) { +void ArrowNullMaskTree::scanListPushDown(const ArrowSchema* schema, const ArrowArray* array, + uint64_t srcOffset, uint64_t count) { const offsetsT* offsets = ((const offsetsT*)array->buffers[1]) + srcOffset; offsetsT auxiliaryLength = offsets[count] - offsets[0]; NullMask pushDownMask((auxiliaryLength + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2); for (uint64_t i = 0; i < count; i++) { - pushDownMask.setNullFromRange( - offsets[i] - offsets[0], offsets[i + 1] - offsets[i], isNull(i)); + pushDownMask.setNullFromRange(offsets[i] - offsets[0], offsets[i + 1] - offsets[i], + isNull(i)); } - children->push_back(ArrowNullMaskTree( - schema->children[0], array->children[0], offsets[0], auxiliaryLength, &pushDownMask)); + children->push_back(ArrowNullMaskTree(schema->children[0], array->children[0], offsets[0], + auxiliaryLength, &pushDownMask)); } -void ArrowNullMaskTree::scanStructPushDown( - const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count) { +void ArrowNullMaskTree::scanStructPushDown(const ArrowSchema* schema, const ArrowArray* array, + uint64_t srcOffset, uint64_t count) { for (int64_t i = 0; i < array->n_children; i++) { - children->push_back(ArrowNullMaskTree( - schema->children[i], array->children[i], srcOffset, count, mask.get())); + children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], srcOffset, + count, mask.get())); } } ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count, const NullMask* parentBitmap) - : offset{0}, mask{std::make_shared( - (count + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> - NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2)}, + : offset{0}, + mask{std::make_shared((count + NullMask::NUM_BITS_PER_NULL_ENTRY - 1) >> + NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2)}, children(std::make_shared>()) { if (schema->dictionary != nullptr) { copyFromBuffer(array->buffers[0], srcOffset, count); @@ -165,8 +165,8 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray } } else { for (int64_t i = 0; i < array->n_children; i++) { - children->push_back(ArrowNullMaskTree( - schema->children[i], array->children[i], srcOffset, count)); + children->push_back(ArrowNullMaskTree(schema->children[i], array->children[i], + srcOffset, count)); } for (auto i = 0u; i < count; i++) { int8_t curType = types[i + srcOffset]; @@ -188,8 +188,8 @@ ArrowNullMaskTree::ArrowNullMaskTree(const ArrowSchema* schema, const ArrowArray if (array->buffers[0] == nullptr) { mask->setAllNonNull(); } else { - mask->copyFromNullBits( - (const uint64_t*)array->buffers[0], srcOffset, 0, count, true); + mask->copyFromNullBits((const uint64_t*)array->buffers[0], srcOffset, 0, count, + true); } if (parentBitmap != nullptr) { for (uint64_t i = 0; i < count >> NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2; i++) { diff --git a/src/common/arrow/arrow_row_batch.cpp b/src/common/arrow/arrow_row_batch.cpp index bb7280c6d1e..964966930fc 100644 --- a/src/common/arrow/arrow_row_batch.cpp +++ b/src/common/arrow/arrow_row_batch.cpp @@ -12,8 +12,8 @@ namespace kuzu { namespace common { -ArrowRowBatch::ArrowRowBatch( - std::vector> typesInfo, std::int64_t capacity) +ArrowRowBatch::ArrowRowBatch(std::vector> typesInfo, + std::int64_t capacity) : typesInfo{std::move(typesInfo)}, numTuples{0} { auto numVectors = this->typesInfo.size(); vectors.resize(numVectors); @@ -24,22 +24,22 @@ ArrowRowBatch::ArrowRowBatch( // TODO(Ziyi): use physical type instead of logical type here. template -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); vector->data.reserve(storage::StorageUtils::getDataTypeSize(LogicalType{DT}) * capacity); } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); vector->data.reserve(getNumBytesForBits(capacity)); } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); // Initialize offsets and string values buffer. vector->data.reserve((capacity + 1) * sizeof(std::uint32_t)); @@ -48,8 +48,8 @@ void ArrowRowBatch::templateInitializeVector( } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); KU_ASSERT(typeInfo.childrenTypesInfo.size() == 1); auto childTypeInfo = typeInfo.childrenTypesInfo[0].get(); @@ -61,8 +61,8 @@ void ArrowRowBatch::templateInitializeVector( } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeNullBits(vector->validity, capacity); KU_ASSERT(typeInfo.childrenTypesInfo.size() == 1); auto childTypeInfo = typeInfo.childrenTypesInfo[0].get(); @@ -71,13 +71,13 @@ void ArrowRowBatch::templateInitializeVector( } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeStructVector(vector, typeInfo, capacity); } -void ArrowRowBatch::initializeStructVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::initializeStructVector(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + std::int64_t capacity) { initializeNullBits(vector->validity, capacity); for (auto& childTypeInfo : typeInfo.childrenTypesInfo) { auto childVector = createVector(*childTypeInfo, capacity); @@ -86,25 +86,25 @@ void ArrowRowBatch::initializeStructVector( } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeStructVector(vector, typeInfo, capacity); } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeStructVector(vector, typeInfo, capacity); } template<> -void ArrowRowBatch::templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +void ArrowRowBatch::templateInitializeVector(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, std::int64_t capacity) { initializeStructVector(vector, typeInfo, capacity); } -std::unique_ptr ArrowRowBatch::createVector( - const main::DataTypeInfo& typeInfo, std::int64_t capacity) { +std::unique_ptr ArrowRowBatch::createVector(const main::DataTypeInfo& typeInfo, + std::int64_t capacity) { auto result = std::make_unique(); switch (typeInfo.typeID) { case LogicalTypeID::BOOL: { @@ -214,8 +214,8 @@ static void setBitToOne(std::uint8_t* data, std::int64_t pos) { data[bytePos] |= ((std::uint64_t)1 << bitOffset); } -void ArrowRowBatch::appendValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value) { +void ArrowRowBatch::appendValue(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + Value* value) { if (value->isNull()) { copyNullValue(vector, value, vector->numValues); } else { @@ -225,15 +225,15 @@ void ArrowRowBatch::appendValue( } template -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { auto valSize = storage::StorageUtils::getDataTypeSize(LogicalType{DT}); std::memcpy(vector->data.data() + pos * valSize, &value->val, valSize); } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { if (value->val.booleanVal) { setBitToOne(vector->data.data(), pos); } else { @@ -242,8 +242,8 @@ void ArrowRowBatch::templateCopyNonNullValue( } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { auto offsets = (std::uint32_t*)vector->data.data(); auto strLength = value->strVal.length(); offsets[pos + 1] = offsets[pos] + strLength; @@ -252,8 +252,8 @@ void ArrowRowBatch::templateCopyNonNullValue( } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& /*typeInfo*/, Value* value, std::int64_t pos) { auto offsets = (std::uint32_t*)vector->data.data(); auto str = UUID::toString(value->val.int128Val); auto strLength = str.length(); @@ -263,8 +263,8 @@ void ArrowRowBatch::templateCopyNonNullValue( } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { vector->data.resize((pos + 2) * sizeof(std::uint32_t)); auto offsets = (std::uint32_t*)vector->data.data(); auto numElements = value->childrenSize; @@ -288,14 +288,14 @@ void ArrowRowBatch::templateCopyNonNullValue( LogicalType{typeInfo.childrenTypesInfo[0]->typeID})); } for (auto i = 0u; i < numElements; i++) { - appendValue( - vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], value->children[i].get()); + appendValue(vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], + value->children[i].get()); } } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { auto numElements = value->childrenSize; auto numChildElements = numElements * (pos + 1); auto currentNumBytesForChildValidity = vector->childData[0]->validity.size(); @@ -316,23 +316,23 @@ void ArrowRowBatch::templateCopyNonNullValue( LogicalType{typeInfo.childrenTypesInfo[0]->typeID})); } for (auto i = 0u; i < numElements; i++) { - appendValue( - vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], value->children[i].get()); + appendValue(vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], + value->children[i].get()); } } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { for (auto i = 0u; i < value->childrenSize; i++) { - appendValue( - vector->childData[i].get(), *typeInfo.childrenTypesInfo[i], value->children[i].get()); + appendValue(vector->childData[i].get(), *typeInfo.childrenTypesInfo[i], + value->children[i].get()); } } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { auto nodeID = value->getValue(); Value offsetVal((std::int64_t)nodeID.offset); Value tableIDVal((std::int64_t)nodeID.tableID); @@ -341,43 +341,43 @@ void ArrowRowBatch::templateCopyNonNullValue( } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { - appendValue( - vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], NodeVal::getNodeIDVal(value)); - appendValue( - vector->childData[1].get(), *typeInfo.childrenTypesInfo[1], NodeVal::getLabelVal(value)); +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { + appendValue(vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], + NodeVal::getNodeIDVal(value)); + appendValue(vector->childData[1].get(), *typeInfo.childrenTypesInfo[1], + NodeVal::getLabelVal(value)); std::int64_t propertyId = 2; auto numProperties = NodeVal::getNumProperties(value); for (auto i = 0u; i < numProperties; i++) { auto name = NodeVal::getPropertyName(value, i); auto val = NodeVal::getPropertyVal(value, i); - appendValue( - vector->childData[propertyId].get(), *typeInfo.childrenTypesInfo[propertyId], val); + appendValue(vector->childData[propertyId].get(), *typeInfo.childrenTypesInfo[propertyId], + val); propertyId++; } } template<> -void ArrowRowBatch::templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { - appendValue( - vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], RelVal::getSrcNodeIDVal(value)); - appendValue( - vector->childData[1].get(), *typeInfo.childrenTypesInfo[1], RelVal::getDstNodeIDVal(value)); +void ArrowRowBatch::templateCopyNonNullValue(ArrowVector* vector, + const main::DataTypeInfo& typeInfo, Value* value, std::int64_t /*pos*/) { + appendValue(vector->childData[0].get(), *typeInfo.childrenTypesInfo[0], + RelVal::getSrcNodeIDVal(value)); + appendValue(vector->childData[1].get(), *typeInfo.childrenTypesInfo[1], + RelVal::getDstNodeIDVal(value)); std::int64_t propertyId = 2; auto numProperties = NodeVal::getNumProperties(value); for (auto i = 0u; i < numProperties; i++) { auto name = NodeVal::getPropertyName(value, i); auto val = NodeVal::getPropertyVal(value, i); - appendValue( - vector->childData[propertyId].get(), *typeInfo.childrenTypesInfo[propertyId], val); + appendValue(vector->childData[propertyId].get(), *typeInfo.childrenTypesInfo[propertyId], + val); propertyId++; } } -void ArrowRowBatch::copyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos) { +void ArrowRowBatch::copyNonNullValue(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + Value* value, std::int64_t pos) { switch (typeInfo.typeID) { case LogicalTypeID::BOOL: { templateCopyNonNullValue(vector, typeInfo, value, pos); @@ -474,8 +474,8 @@ void ArrowRowBatch::templateCopyNullValue(ArrowVector* vector, std::int64_t pos) } template<> -void ArrowRowBatch::templateCopyNullValue( - ArrowVector* vector, std::int64_t pos) { +void ArrowRowBatch::templateCopyNullValue(ArrowVector* vector, + std::int64_t pos) { auto offsets = (std::uint32_t*)vector->data.data(); offsets[pos + 1] = offsets[pos]; setBitToZero(vector->validity.data(), pos); @@ -483,8 +483,8 @@ void ArrowRowBatch::templateCopyNullValue( } template<> -void ArrowRowBatch::templateCopyNullValue( - ArrowVector* vector, std::int64_t pos) { +void ArrowRowBatch::templateCopyNullValue(ArrowVector* vector, + std::int64_t pos) { auto offsets = (std::uint32_t*)vector->data.data(); offsets[pos + 1] = offsets[pos]; setBitToZero(vector->validity.data(), pos); @@ -492,15 +492,15 @@ void ArrowRowBatch::templateCopyNullValue( } template<> -void ArrowRowBatch::templateCopyNullValue( - ArrowVector* vector, std::int64_t pos) { +void ArrowRowBatch::templateCopyNullValue(ArrowVector* vector, + std::int64_t pos) { setBitToZero(vector->validity.data(), pos); vector->numNulls++; } template<> -void ArrowRowBatch::templateCopyNullValue( - ArrowVector* vector, std::int64_t pos) { +void ArrowRowBatch::templateCopyNullValue(ArrowVector* vector, + std::int64_t pos) { setBitToZero(vector->validity.data(), pos); vector->numNulls++; } @@ -621,16 +621,16 @@ static std::unique_ptr createArrayFromVector(ArrowVector& vector) { } template -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& /*typeInfo*/) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& /*typeInfo*/) { auto result = createArrayFromVector(vector); vector.array = std::move(result); return vector.array.get(); } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& /*typeInfo*/) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& /*typeInfo*/) { auto result = createArrayFromVector(vector); result->n_buffers = 3; result->buffers[2] = vector.overflow.data(); @@ -639,8 +639,8 @@ ArrowArray* ArrowRowBatch::templateCreateArray( } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { auto result = createArrayFromVector(vector); vector.childPointers.resize(1); result->children = vector.childPointers.data(); @@ -652,8 +652,8 @@ ArrowArray* ArrowRowBatch::templateCreateArray( } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { auto result = createArrayFromVector(vector); vector.childPointers.resize(1); result->n_buffers = 1; @@ -666,13 +666,13 @@ ArrowArray* ArrowRowBatch::templateCreateArray( } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { return convertStructVectorToArray(vector, typeInfo); } -ArrowArray* ArrowRowBatch::convertStructVectorToArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::convertStructVectorToArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { auto result = createArrayFromVector(vector); result->n_buffers = 1; vector.childPointers.resize(typeInfo.childrenTypesInfo.size()); @@ -687,25 +687,25 @@ ArrowArray* ArrowRowBatch::convertStructVectorToArray( } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { return convertStructVectorToArray(vector, typeInfo); } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { return convertStructVectorToArray(vector, typeInfo); } template<> -ArrowArray* ArrowRowBatch::templateCreateArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::templateCreateArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { return convertStructVectorToArray(vector, typeInfo); } -ArrowArray* ArrowRowBatch::convertVectorToArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo) { +ArrowArray* ArrowRowBatch::convertVectorToArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo) { switch (typeInfo.typeID) { case LogicalTypeID::BOOL: { return templateCreateArray(vector, typeInfo); diff --git a/src/common/case_insensitive_map.cpp b/src/common/case_insensitive_map.cpp index ce961897d1f..33114da913e 100644 --- a/src/common/case_insensitive_map.cpp +++ b/src/common/case_insensitive_map.cpp @@ -9,8 +9,8 @@ uint64_t CaseInsensitiveStringHashFunction::operator()(const std::string& str) c return common::StringUtils::caseInsensitiveHash(str); } -bool CaseInsensitiveStringEquality::operator()( - const std::string& lhs, const std::string& rhs) const { +bool CaseInsensitiveStringEquality::operator()(const std::string& lhs, + const std::string& rhs) const { return common::StringUtils::caseInsensitiveEquals(lhs, rhs); } diff --git a/src/common/copier_config/csv_reader_config.cpp b/src/common/copier_config/csv_reader_config.cpp index 4fffee643c7..cdfcbeb2d36 100644 --- a/src/common/copier_config/csv_reader_config.cpp +++ b/src/common/copier_config/csv_reader_config.cpp @@ -16,8 +16,8 @@ static char bindParsingOptionValue(std::string value) { return value[value.length() - 1]; } -static void bindBoolParsingOption( - CSVReaderConfig& config, const std::string& optionName, bool optionValue) { +static void bindBoolParsingOption(CSVReaderConfig& config, const std::string& optionName, + bool optionValue) { if (optionName == "HEADER") { config.option.hasHeader = optionValue; } else if (optionName == "PARALLEL") { @@ -25,8 +25,8 @@ static void bindBoolParsingOption( } } -static void bindStringParsingOption( - CSVReaderConfig& config, const std::string& optionName, const std::string& optionValue) { +static void bindStringParsingOption(CSVReaderConfig& config, const std::string& optionName, + const std::string& optionValue) { auto parsingOptionValue = bindParsingOptionValue(optionValue); if (optionName == "ESCAPE") { config.option.escapeChar = parsingOptionValue; diff --git a/src/common/data_chunk/data_chunk_collection.cpp b/src/common/data_chunk/data_chunk_collection.cpp index 1b0cf723831..e3412313e1f 100644 --- a/src/common/data_chunk/data_chunk_collection.cpp +++ b/src/common/data_chunk/data_chunk_collection.cpp @@ -20,8 +20,8 @@ void DataChunkCollection::append(DataChunk& chunk) { for (auto i = 0u; i < numTuplesToCopy; i++) { auto srcPos = chunk.state->selVector->selectedPositions[numTuplesAppended + i]; auto dstPos = chunkToAppend.state->selVector->selectedSize + i; - chunkToAppend.getValueVector(vectorIdx)->copyFromVectorData( - dstPos, chunk.getValueVector(vectorIdx).get(), srcPos); + chunkToAppend.getValueVector(vectorIdx)->copyFromVectorData(dstPos, + chunk.getValueVector(vectorIdx).get(), srcPos); } } chunkToAppend.state->selVector->selectedSize += numTuplesToCopy; diff --git a/src/common/exception/message.cpp b/src/common/exception/message.cpp index 1857f70434d..a57f873d8b6 100644 --- a/src/common/exception/message.cpp +++ b/src/common/exception/message.cpp @@ -48,8 +48,8 @@ std::string ExceptionMessage::violateDeleteNodeWithConnectedEdgesConstraint( offset, tableName, direction); } -std::string ExceptionMessage::violateRelMultiplicityConstraint( - const std::string& tableName, const std::string& offset, const std::string& direction) { +std::string ExceptionMessage::violateRelMultiplicityConstraint(const std::string& tableName, + const std::string& offset, const std::string& direction) { return stringFormat("Node(nodeOffset: {}) has more than one neighbour in table {} in the {} " "direction, which violates the rel multiplicity constraint.", offset, tableName, direction); diff --git a/src/common/file_system/file_system.cpp b/src/common/file_system/file_system.cpp index 989ea54c731..4985ea99f41 100644 --- a/src/common/file_system/file_system.cpp +++ b/src/common/file_system/file_system.cpp @@ -23,8 +23,8 @@ bool FileSystem::fileOrPathExists(const std::string& /*path*/) const { KU_UNREACHABLE; } -std::string FileSystem::expandPath( - main::ClientContext* /*context*/, const std::string& path) const { +std::string FileSystem::expandPath(main::ClientContext* /*context*/, + const std::string& path) const { return path; } diff --git a/src/common/file_system/local_file_system.cpp b/src/common/file_system/local_file_system.cpp index 61bf453ac59..723faa7c1a1 100644 --- a/src/common/file_system/local_file_system.cpp +++ b/src/common/file_system/local_file_system.cpp @@ -39,8 +39,8 @@ LocalFileInfo::~LocalFileInfo() { #endif } -std::unique_ptr LocalFileSystem::openFile( - const std::string& path, int flags, main::ClientContext* context, FileLockType lock_type) { +std::unique_ptr LocalFileSystem::openFile(const std::string& path, int flags, + main::ClientContext* context, FileLockType lock_type) { auto fullPath = expandPath(context, path); #if defined(_WIN32) auto dwDesiredAccess = 0ul; @@ -93,8 +93,8 @@ std::unique_ptr LocalFileSystem::openFile( #endif } -std::vector LocalFileSystem::glob( - main::ClientContext* context, const std::string& path) const { +std::vector LocalFileSystem::glob(main::ClientContext* context, + const std::string& path) const { if (path.empty()) { return std::vector(); } @@ -133,11 +133,11 @@ void LocalFileSystem::overwriteFile(const std::string& from, const std::string& if (!fileOrPathExists(from) || !fileOrPathExists(to)) return; std::error_code errorCode; - if (!std::filesystem::copy_file( - from, to, std::filesystem::copy_options::overwrite_existing, errorCode)) { + if (!std::filesystem::copy_file(from, to, std::filesystem::copy_options::overwrite_existing, + errorCode)) { // LCOV_EXCL_START - throw Exception(stringFormat( - "Error copying file {} to {}. ErrorMessage: {}", from, to, errorCode.message())); + throw Exception(stringFormat("Error copying file {} to {}. ErrorMessage: {}", from, to, + errorCode.message())); // LCOV_EXCL_STOP } } @@ -148,8 +148,8 @@ void LocalFileSystem::copyFile(const std::string& from, const std::string& to) c std::error_code errorCode; if (!std::filesystem::copy_file(from, to, std::filesystem::copy_options::none, errorCode)) { // LCOV_EXCL_START - throw Exception(stringFormat( - "Error copying file {} to {}. ErrorMessage: {}", from, to, errorCode.message())); + throw Exception(stringFormat("Error copying file {} to {}. ErrorMessage: {}", from, to, + errorCode.message())); // LCOV_EXCL_STOP } } @@ -179,8 +179,8 @@ void LocalFileSystem::removeFileIfExists(const std::string& path) const { return; if (remove(path.c_str()) != 0) { // LCOV_EXCL_START - throw Exception(stringFormat( - "Error removing directory or file {}. Error Message: {}", path, posixErrMessage())); + throw Exception(stringFormat("Error removing directory or file {}. Error Message: {}", + path, posixErrMessage())); // LCOV_EXCL_STOP } } @@ -189,8 +189,8 @@ bool LocalFileSystem::fileOrPathExists(const std::string& path) const { return std::filesystem::exists(path); } -std::string LocalFileSystem::expandPath( - main::ClientContext* context, const std::string& path) const { +std::string LocalFileSystem::expandPath(main::ClientContext* context, + const std::string& path) const { auto fullPath = path; if (path.starts_with('~')) { fullPath = @@ -200,8 +200,8 @@ std::string LocalFileSystem::expandPath( return fullPath; } -void LocalFileSystem::readFromFile( - FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const { +void LocalFileSystem::readFromFile(FileInfo* fileInfo, void* buffer, uint64_t numBytes, + uint64_t position) const { auto localFileInfo = ku_dynamic_cast(fileInfo); #if defined(_WIN32) DWORD numBytesRead; @@ -245,8 +245,8 @@ int64_t LocalFileSystem::readFile(FileInfo* fileInfo, void* buf, size_t nbyte) c #endif } -void LocalFileSystem::writeFile( - FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, uint64_t offset) const { +void LocalFileSystem::writeFile(FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, + uint64_t offset) const { auto localFileInfo = ku_dynamic_cast(fileInfo); uint64_t remainingNumBytesToWrite = numBytes; uint64_t bufferOffset = 0; diff --git a/src/common/file_system/virtual_file_system.cpp b/src/common/file_system/virtual_file_system.cpp index bc461a3943f..962f0c3a30d 100644 --- a/src/common/file_system/virtual_file_system.cpp +++ b/src/common/file_system/virtual_file_system.cpp @@ -15,13 +15,13 @@ void VirtualFileSystem::registerFileSystem(std::unique_ptr fileSyste subSystems.push_back(std::move(fileSystem)); } -std::unique_ptr VirtualFileSystem::openFile( - const std::string& path, int flags, main::ClientContext* context, FileLockType lockType) { +std::unique_ptr VirtualFileSystem::openFile(const std::string& path, int flags, + main::ClientContext* context, FileLockType lockType) { return findFileSystem(path)->openFile(path, flags, context, lockType); } -std::vector VirtualFileSystem::glob( - main::ClientContext* context, const std::string& path) const { +std::vector VirtualFileSystem::glob(main::ClientContext* context, + const std::string& path) const { return findFileSystem(path)->glob(context, path); } @@ -41,13 +41,13 @@ bool VirtualFileSystem::fileOrPathExists(const std::string& path) const { return findFileSystem(path)->fileOrPathExists(path); } -std::string VirtualFileSystem::expandPath( - main::ClientContext* context, const std::string& path) const { +std::string VirtualFileSystem::expandPath(main::ClientContext* context, + const std::string& path) const { return findFileSystem(path)->expandPath(context, path); } -void VirtualFileSystem::readFromFile( - FileInfo* /*fileInfo*/, void* /*buffer*/, uint64_t /*numBytes*/, uint64_t /*position*/) const { +void VirtualFileSystem::readFromFile(FileInfo* /*fileInfo*/, void* /*buffer*/, + uint64_t /*numBytes*/, uint64_t /*position*/) const { KU_UNREACHABLE; } diff --git a/src/common/null_mask.cpp b/src/common/null_mask.cpp index 4a9d82ea3d8..e328f541ec8 100644 --- a/src/common/null_mask.cpp +++ b/src/common/null_mask.cpp @@ -103,8 +103,8 @@ void NullMask::setNullFromRange(uint64_t offset, uint64_t numBitsToSet, bool isN setNullRange(data, offset, numBitsToSet, isNull); } -void NullMask::setNullRange( - uint64_t* nullEntries, uint64_t offset, uint64_t numBitsToSet, bool isNull) { +void NullMask::setNullRange(uint64_t* nullEntries, uint64_t offset, uint64_t numBitsToSet, + bool isNull) { auto [firstEntryPos, firstBitPos] = getNullEntryAndBitPos(offset); auto [lastEntryPos, lastBitPos] = getNullEntryAndBitPos(offset + numBitsToSet); diff --git a/src/common/string_utils.cpp b/src/common/string_utils.cpp index a88d9adff84..febea00544b 100644 --- a/src/common/string_utils.cpp +++ b/src/common/string_utils.cpp @@ -25,8 +25,8 @@ std::vector StringUtils::splitComma(const std::string& input) { return result; } -std::vector StringUtils::split( - const std::string& input, const std::string& delimiter, bool ignoreEmptyStringParts) { +std::vector StringUtils::split(const std::string& input, const std::string& delimiter, + bool ignoreEmptyStringParts) { auto result = std::vector(); auto prevPos = 0u; auto currentPos = input.find(delimiter, prevPos); @@ -62,8 +62,8 @@ void StringUtils::removeCStringWhiteSpaces(const char*& input, uint64_t& len) { } } -void StringUtils::replaceAll( - std::string& str, const std::string& search, const std::string& replacement) { +void StringUtils::replaceAll(std::string& str, const std::string& search, + const std::string& replacement) { size_t pos = 0; while ((pos = str.find(search, pos)) != std::string::npos) { str.replace(pos, search.length(), replacement); @@ -71,8 +71,8 @@ void StringUtils::replaceAll( } } -std::string StringUtils::extractStringBetween( - const std::string& input, char delimiterStart, char delimiterEnd, bool includeDelimiter) { +std::string StringUtils::extractStringBetween(const std::string& input, char delimiterStart, + char delimiterEnd, bool includeDelimiter) { std::string::size_type posStart = input.find_first_of(delimiterStart); std::string::size_type posEnd = input.find_last_of(delimiterEnd); if (posStart == std::string::npos || posEnd == std::string::npos || posStart >= posEnd) { @@ -127,8 +127,8 @@ bool StringUtils::caseInsensitiveEquals(const std::string& left, const std::stri } std::string StringUtils::join(const std::vector& input, const std::string& separator) { - return StringUtils::join( - input, input.size(), separator, [](const std::string& s) { return s; }); + return StringUtils::join(input, input.size(), separator, + [](const std::string& s) { return s; }); } template diff --git a/src/common/system_message.cpp b/src/common/system_message.cpp index fa74c0332d6..d6b81e28d55 100644 --- a/src/common/system_message.cpp +++ b/src/common/system_message.cpp @@ -17,8 +17,8 @@ std::string dlErrMessage() { } LPSTR messageBuffer = nullptr; - auto size = FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + auto size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL); diff --git a/src/common/task_system/progress_bar.cpp b/src/common/task_system/progress_bar.cpp index e571a8a58c2..e332d618044 100644 --- a/src/common/task_system/progress_bar.cpp +++ b/src/common/task_system/progress_bar.cpp @@ -64,10 +64,8 @@ void ProgressBar::printProgressBar(double curPipelineProgress) { pipelineProgress = (float)numPipelinesFinished / (float)numPipelines; } setGreenFont(); - std::cout << "Pipelines Finished: " << int(pipelineProgress * 100.0) << "%" - << "\n"; - std::cout << "Current Pipeline Progress: " << int(curPipelineProgress * 100.0) << "%" - << "\n"; + std::cout << "Pipelines Finished: " << int(pipelineProgress * 100.0) << "%" << "\n"; + std::cout << "Current Pipeline Progress: " << int(curPipelineProgress * 100.0) << "%" << "\n"; std::cout.flush(); setDefaultFont(); } diff --git a/src/common/task_system/task.cpp b/src/common/task_system/task.cpp index 143d4139266..3d07ce04517 100644 --- a/src/common/task_system/task.cpp +++ b/src/common/task_system/task.cpp @@ -20,7 +20,9 @@ void Task::deRegisterThreadAndFinalizeTask() { if (!hasExceptionNoLock() && isCompletedNoLock()) { try { finalizeIfNecessary(); - } catch (std::exception& e) { setExceptionNoLock(std::current_exception()); } + } catch (std::exception& e) { + setExceptionNoLock(std::current_exception()); + } } if (isCompletedNoLock()) { lck.unlock(); diff --git a/src/common/task_system/task_scheduler.cpp b/src/common/task_system/task_scheduler.cpp index a107c920994..c1c181f5b4d 100644 --- a/src/common/task_system/task_scheduler.cpp +++ b/src/common/task_system/task_scheduler.cpp @@ -21,8 +21,8 @@ TaskScheduler::~TaskScheduler() { } } -void TaskScheduler::scheduleTaskAndWaitOrError( - const std::shared_ptr& task, processor::ExecutionContext* context) { +void TaskScheduler::scheduleTaskAndWaitOrError(const std::shared_ptr& task, + processor::ExecutionContext* context) { for (auto& dependency : task->children) { scheduleTaskAndWaitOrError(dependency, context); } diff --git a/src/common/type_utils.cpp b/src/common/type_utils.cpp index 5c97be92873..c1d0321fdc7 100644 --- a/src/common/type_utils.cpp +++ b/src/common/type_utils.cpp @@ -5,8 +5,8 @@ namespace kuzu { namespace common { -static std::string entryToString( - const LogicalType& dataType, const uint8_t* value, ValueVector* vector) { +static std::string entryToString(const LogicalType& dataType, const uint8_t* value, + ValueVector* vector) { auto valueVector = reinterpret_cast(vector); switch (dataType.getLogicalTypeID()) { case LogicalTypeID::BOOL: @@ -63,8 +63,8 @@ static std::string entryToString( case LogicalTypeID::UUID: return TypeUtils::toString(*reinterpret_cast(value)); case LogicalTypeID::NODE: - return TypeUtils::nodeToString( - *reinterpret_cast(value), valueVector); + return TypeUtils::nodeToString(*reinterpret_cast(value), + valueVector); case LogicalTypeID::REL: return TypeUtils::relToString(*reinterpret_cast(value), valueVector); default: @@ -76,8 +76,8 @@ static std::string entryToString(sel_t pos, ValueVector* vector) { if (vector->isNull(pos)) { return ""; } - return entryToString( - vector->dataType, vector->getData() + vector->getNumBytesPerValue() * pos, vector); + return entryToString(vector->dataType, vector->getData() + vector->getNumBytesPerValue() * pos, + vector); } template<> @@ -162,8 +162,8 @@ std::string TypeUtils::toString(const list_entry_t& val, void* valueVector) { return result; } -static std::string getMapEntryStr( - sel_t pos, ValueVector* dataVector, ValueVector* keyVector, ValueVector* valVector) { +static std::string getMapEntryStr(sel_t pos, ValueVector* dataVector, ValueVector* keyVector, + ValueVector* valVector) { if (dataVector->isNull(pos)) { return ""; } diff --git a/src/common/types/date_t.cpp b/src/common/types/date_t.cpp index 7faa6426ad2..0abf2798357 100644 --- a/src/common/types/date_t.cpp +++ b/src/common/types/date_t.cpp @@ -115,10 +115,10 @@ date_t date_t::operator-(const int32_t& day) const { const int32_t Date::NORMAL_DAYS[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const int32_t Date::LEAP_DAYS[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -const int32_t Date::CUMULATIVE_LEAP_DAYS[] = { - 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; -const int32_t Date::CUMULATIVE_DAYS[] = { - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; +const int32_t Date::CUMULATIVE_LEAP_DAYS[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, + 366}; +const int32_t Date::CUMULATIVE_DAYS[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, + 365}; const int8_t Date::MONTH_PER_DAY_OF_YEAR[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -391,8 +391,8 @@ int32_t Date::monthDays(int32_t year, int32_t month) { } std::string Date::getDayName(date_t& date) { - std::string dayNames[] = { - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + std::string dayNames[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", + "Saturday"}; return dayNames[(date.days < 0 ? 7 - ((-date.days + 3) % 7) : ((date.days + 3) % 7) + 1) % 7]; } @@ -448,8 +448,8 @@ int32_t Date::getDatePart(DatePartSpecifier specifier, date_t& date) { date_t Date::trunc(DatePartSpecifier specifier, date_t& date) { switch (specifier) { case DatePartSpecifier::YEAR: - return Date::fromDate( - Date::getDatePart(DatePartSpecifier::YEAR, date), 1 /* month */, 1 /* day */); + return Date::fromDate(Date::getDatePart(DatePartSpecifier::YEAR, date), 1 /* month */, + 1 /* day */); case DatePartSpecifier::MONTH: return Date::fromDate(Date::getDatePart(DatePartSpecifier::YEAR, date), Date::getDatePart(DatePartSpecifier::MONTH, date), 1 /* day */); diff --git a/src/common/types/dtime_t.cpp b/src/common/types/dtime_t.cpp index ac11fc7a586..b0643cd9f8c 100644 --- a/src/common/types/dtime_t.cpp +++ b/src/common/types/dtime_t.cpp @@ -201,8 +201,8 @@ dtime_t Time::fromTimeInternal(int32_t hour, int32_t minute, int32_t second, int dtime_t Time::fromTime(int32_t hour, int32_t minute, int32_t second, int32_t microseconds) { if (!Time::isValid(hour, minute, second, microseconds)) { - throw ConversionException(stringFormat( - "Time field value out of range: {}:{}:{}[.{}].", hour, minute, second, microseconds)); + throw ConversionException(stringFormat("Time field value out of range: {}:{}:{}[.{}].", + hour, minute, second, microseconds)); } return Time::fromTimeInternal(hour, minute, second, microseconds); } diff --git a/src/common/types/interval_t.cpp b/src/common/types/interval_t.cpp index e2d41cb2c95..cd77cbccb2d 100644 --- a/src/common/types/interval_t.cpp +++ b/src/common/types/interval_t.cpp @@ -219,7 +219,7 @@ interval_t Interval::fromCString(const char* str, uint64_t len) { } goto interval_parse_identifier; -interval_parse_time : { +interval_parse_time: { // parse the remainder of the time as a Time type dtime_t time; uint64_t tmpPos; @@ -336,8 +336,8 @@ std::string Interval::toString(interval_t interval) { } // helper function of interval comparison -void Interval::normalizeIntervalEntries( - interval_t input, int64_t& months, int64_t& days, int64_t& micros) { +void Interval::normalizeIntervalEntries(interval_t input, int64_t& months, int64_t& days, + int64_t& micros) { int64_t extra_months_d = input.days / Interval::DAYS_PER_MONTH; int64_t extra_months_micros = input.micros / Interval::MICROS_PER_MONTH; input.days -= extra_months_d * Interval::DAYS_PER_MONTH; diff --git a/src/common/types/timestamp_t.cpp b/src/common/types/timestamp_t.cpp index b517929ce96..8a42fe00663 100644 --- a/src/common/types/timestamp_t.cpp +++ b/src/common/types/timestamp_t.cpp @@ -177,8 +177,8 @@ timestamp_t Timestamp::fromCString(const char* str, uint64_t len) { return result; } -bool Timestamp::tryParseUTCOffset( - const char* str, uint64_t& pos, uint64_t len, int& hour_offset, int& minute_offset) { +bool Timestamp::tryParseUTCOffset(const char* str, uint64_t& pos, uint64_t len, int& hour_offset, + int& minute_offset) { minute_offset = 0; uint64_t curpos = pos; // parse the next 3 characters @@ -318,11 +318,11 @@ timestamp_t Timestamp::trunc(DatePartSpecifier specifier, timestamp_t& timestamp case DatePartSpecifier::SECOND: return Timestamp::fromDateTime(date, Time::fromTime(hour, min, sec, 0 /* microseconds */)); case DatePartSpecifier::MINUTE: - return Timestamp::fromDateTime( - date, Time::fromTime(hour, min, 0 /* seconds */, 0 /* microseconds */)); + return Timestamp::fromDateTime(date, + Time::fromTime(hour, min, 0 /* seconds */, 0 /* microseconds */)); case DatePartSpecifier::HOUR: - return Timestamp::fromDateTime( - date, Time::fromTime(hour, 0 /* minutes */, 0 /* seconds */, 0 /* microseconds */)); + return Timestamp::fromDateTime(date, + Time::fromTime(hour, 0 /* minutes */, 0 /* seconds */, 0 /* microseconds */)); default: date_t date = getDate(timestamp); return fromDateTime(Date::trunc(specifier, date), dtime_t(0)); diff --git a/src/common/types/types.cpp b/src/common/types/types.cpp index e74732c19d7..17df3754ef0 100644 --- a/src/common/types/types.cpp +++ b/src/common/types/types.cpp @@ -875,8 +875,8 @@ std::vector LogicalTypeUtils::parseStructTypeInfo(const std::string auto pos = structFieldStr.find(' '); auto fieldName = structFieldStr.substr(0, pos); auto fieldTypeString = structFieldStr.substr(pos + 1); - structFields.emplace_back( - fieldName, std::make_unique(dataTypeFromString(fieldTypeString))); + structFields.emplace_back(fieldName, + std::make_unique(dataTypeFromString(fieldTypeString))); } return structFields; } @@ -893,21 +893,21 @@ std::unique_ptr LogicalTypeUtils::parseMapType(const std::string& t } auto mapTypeStr = trimmedStr.substr(leftBracketPos + 1, rightBracketPos - leftBracketPos - 1); auto keyValueTypes = StringUtils::splitComma(mapTypeStr); - return LogicalType::MAP( - dataTypeFromString(keyValueTypes[0]), dataTypeFromString(keyValueTypes[1])); + return LogicalType::MAP(dataTypeFromString(keyValueTypes[0]), + dataTypeFromString(keyValueTypes[1])); } std::unique_ptr LogicalTypeUtils::parseUnionType(const std::string& trimmedStr) { auto unionFields = parseStructTypeInfo(trimmedStr); - auto unionTagField = StructField( - UnionType::TAG_FIELD_NAME, std::make_unique(UnionType::TAG_FIELD_TYPE)); + auto unionTagField = StructField(UnionType::TAG_FIELD_NAME, + std::make_unique(UnionType::TAG_FIELD_TYPE)); unionFields.insert(unionFields.begin(), std::move(unionTagField)); return LogicalType::UNION(std::move(unionFields)); } std::unique_ptr LogicalType::STRUCT(std::vector&& fields) { - return std::unique_ptr(new LogicalType( - LogicalTypeID::STRUCT, std::make_unique(std::move(fields)))); + return std::unique_ptr(new LogicalType(LogicalTypeID::STRUCT, + std::make_unique(std::move(fields)))); } std::unique_ptr LogicalType::RECURSIVE_REL(std::unique_ptr typeInfo) { @@ -942,20 +942,20 @@ std::unique_ptr LogicalType::LIST(std::unique_ptr chil new LogicalType(LogicalTypeID::LIST, std::make_unique(std::move(childType)))); } -std::unique_ptr LogicalType::MAP( - std::unique_ptr keyType, std::unique_ptr valueType) { +std::unique_ptr LogicalType::MAP(std::unique_ptr keyType, + std::unique_ptr valueType) { std::vector structFields; structFields.emplace_back(InternalKeyword::MAP_KEY, std::move(keyType)); structFields.emplace_back(InternalKeyword::MAP_VALUE, std::move(valueType)); auto mapStructType = LogicalType::STRUCT(std::move(structFields)); - return std::unique_ptr(new LogicalType( - LogicalTypeID::MAP, std::make_unique(std::move(mapStructType)))); + return std::unique_ptr(new LogicalType(LogicalTypeID::MAP, + std::make_unique(std::move(mapStructType)))); } -std::unique_ptr LogicalType::ARRAY( - std::unique_ptr childType, uint64_t numElements) { - return std::unique_ptr(new LogicalType( - LogicalTypeID::ARRAY, std::make_unique(std::move(childType), numElements))); +std::unique_ptr LogicalType::ARRAY(std::unique_ptr childType, + uint64_t numElements) { + return std::unique_ptr(new LogicalType(LogicalTypeID::ARRAY, + std::make_unique(std::move(childType), numElements))); } } // namespace common diff --git a/src/common/types/value/recursive_rel.cpp b/src/common/types/value/recursive_rel.cpp index 1d791ebb998..6bdcda5d299 100644 --- a/src/common/types/value/recursive_rel.cpp +++ b/src/common/types/value/recursive_rel.cpp @@ -21,8 +21,8 @@ Value* RecursiveRelVal::getRels(const Value* val) { void RecursiveRelVal::throwIfNotRecursiveRel(const Value* val) { // LCOV_EXCL_START if (val->dataType->getLogicalTypeID() != LogicalTypeID::RECURSIVE_REL) { - throw Exception(stringFormat( - "Expected RECURSIVE_REL type, but got {} type", val->dataType->toString())); + throw Exception(stringFormat("Expected RECURSIVE_REL type, but got {} type", + val->dataType->toString())); } // LCOV_EXCL_STOP } diff --git a/src/common/vector/auxiliary_buffer.cpp b/src/common/vector/auxiliary_buffer.cpp index 1ce635623a4..e40f021c950 100644 --- a/src/common/vector/auxiliary_buffer.cpp +++ b/src/common/vector/auxiliary_buffer.cpp @@ -5,8 +5,8 @@ namespace kuzu { namespace common { -StructAuxiliaryBuffer::StructAuxiliaryBuffer( - const LogicalType& type, storage::MemoryManager* memoryManager) { +StructAuxiliaryBuffer::StructAuxiliaryBuffer(const LogicalType& type, + storage::MemoryManager* memoryManager) { auto fieldTypes = StructType::getFieldTypes(&type); childrenVectors.reserve(fieldTypes.size()); for (auto fieldType : fieldTypes) { @@ -14,10 +14,10 @@ StructAuxiliaryBuffer::StructAuxiliaryBuffer( } } -ListAuxiliaryBuffer::ListAuxiliaryBuffer( - const LogicalType& dataVectorType, storage::MemoryManager* memoryManager) - : capacity{DEFAULT_VECTOR_CAPACITY}, size{0}, dataVector{std::make_shared( - dataVectorType, memoryManager)} {} +ListAuxiliaryBuffer::ListAuxiliaryBuffer(const LogicalType& dataVectorType, + storage::MemoryManager* memoryManager) + : capacity{DEFAULT_VECTOR_CAPACITY}, size{0}, + dataVector{std::make_shared(dataVectorType, memoryManager)} {} list_entry_t ListAuxiliaryBuffer::addList(list_size_t listSize) { auto listEntry = list_entry_t{size, listSize}; @@ -72,8 +72,8 @@ void ListAuxiliaryBuffer::resizeStructDataVector(ValueVector* dataVector) { } } -std::unique_ptr AuxiliaryBufferFactory::getAuxiliaryBuffer( - LogicalType& type, storage::MemoryManager* memoryManager) { +std::unique_ptr AuxiliaryBufferFactory::getAuxiliaryBuffer(LogicalType& type, + storage::MemoryManager* memoryManager) { switch (type.getPhysicalType()) { case PhysicalTypeID::STRING: return std::make_unique(memoryManager); diff --git a/src/common/vector/value_vector.cpp b/src/common/vector/value_vector.cpp index 0e45a3c1cf1..78491f972e1 100644 --- a/src/common/vector/value_vector.cpp +++ b/src/common/vector/value_vector.cpp @@ -87,8 +87,8 @@ void ValueVector::copyFromRowData(uint32_t pos, const uint8_t* rowData) { } } -void ValueVector::copyToRowData( - uint32_t pos, uint8_t* rowData, InMemOverflowBuffer* rowOverflowBuffer) const { +void ValueVector::copyToRowData(uint32_t pos, uint8_t* rowData, + InMemOverflowBuffer* rowOverflowBuffer) const { switch (dataType.getPhysicalType()) { case PhysicalTypeID::STRUCT: { StructVector::copyToRowData(this, pos, rowData, rowOverflowBuffer); @@ -106,8 +106,8 @@ void ValueVector::copyToRowData( } } -void ValueVector::copyFromVectorData( - uint8_t* dstData, const ValueVector* srcVector, const uint8_t* srcVectorData) { +void ValueVector::copyFromVectorData(uint8_t* dstData, const ValueVector* srcVector, + const uint8_t* srcVectorData) { KU_ASSERT(srcVector->dataType.getPhysicalType() == dataType.getPhysicalType()); switch (srcVector->dataType.getPhysicalType()) { case PhysicalTypeID::STRUCT: { @@ -125,8 +125,8 @@ void ValueVector::copyFromVectorData( } } -void ValueVector::copyFromVectorData( - uint64_t dstPos, const ValueVector* srcVector, uint64_t srcPos) { +void ValueVector::copyFromVectorData(uint64_t dstPos, const ValueVector* srcVector, + uint64_t srcPos) { setNull(dstPos, srcVector->isNull(srcPos)); if (!isNull(dstPos)) { copyFromVectorData(getData() + dstPos * getNumBytesPerValue(), srcVector, @@ -182,8 +182,8 @@ void ValueVector::copyFromValue(uint64_t pos, const Value& value) { memcpy(dstValue, &value.val.intervalVal, numBytesPerValue); } break; case PhysicalTypeID::STRING: { - StringVector::addString( - this, *(ku_string_t*)dstValue, value.strVal.data(), value.strVal.length()); + StringVector::addString(this, *(ku_string_t*)dstValue, value.strVal.data(), + value.strVal.length()); } break; case PhysicalTypeID::LIST: { auto listEntry = reinterpret_cast(dstValue); @@ -194,8 +194,8 @@ void ValueVector::copyFromValue(uint64_t pos, const Value& value) { auto childVal = NestedVal::getChildVal(&value, i); dstDataVector->setNull(listEntry->offset + i, childVal->isNull()); if (!childVal->isNull()) { - dstDataVector->copyFromValue( - listEntry->offset + i, *NestedVal::getChildVal(&value, i)); + dstDataVector->copyFromValue(listEntry->offset + i, + *NestedVal::getChildVal(&value, i)); } } } break; @@ -399,8 +399,8 @@ void StringVector::addString(ValueVector* vector, uint32_t vectorPos, ku_string_ } } -void StringVector::addString( - ValueVector* vector, uint32_t vectorPos, const char* srcStr, uint64_t length) { +void StringVector::addString(ValueVector* vector, uint32_t vectorPos, const char* srcStr, + uint64_t length) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); auto stringBuffer = ku_dynamic_cast(vector->auxiliaryBuffer.get()); @@ -465,8 +465,8 @@ void StringVector::addString(ValueVector* vector, ku_string_t& dstStr, ku_string } } -void StringVector::addString( - ValueVector* vector, ku_string_t& dstStr, const char* srcStr, uint64_t length) { +void StringVector::addString(ValueVector* vector, ku_string_t& dstStr, const char* srcStr, + uint64_t length) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); auto stringBuffer = ku_dynamic_cast(vector->auxiliaryBuffer.get()); @@ -485,8 +485,8 @@ void StringVector::addString( } } -void StringVector::addString( - kuzu::common::ValueVector* vector, ku_string_t& dstStr, const std::string& srcStr) { +void StringVector::addString(kuzu::common::ValueVector* vector, ku_string_t& dstStr, + const std::string& srcStr) { addString(vector, dstStr, srcStr.data(), srcStr.length()); } @@ -541,8 +541,8 @@ void ListVector::copyToRowData(const ValueVector* vector, uint32_t pos, uint8_t* if (srcListDataVector->isNull(srcListEntry.offset + i)) { NullBuffer::setNull(dstListOverflow, i); } else { - srcListDataVector->copyToRowData( - srcListEntry.offset + i, dstListValues, rowOverflowBuffer); + srcListDataVector->copyToRowData(srcListEntry.offset + i, dstListValues, + rowOverflowBuffer); } dstListValues += dataRowLayoutSize; } @@ -634,8 +634,8 @@ void RdfVariantVector::addString(ValueVector* vector, sel_t pos, ku_string_t str addString(vector, pos, (const char*)str.getData(), str.len); } -void RdfVariantVector::addString( - ValueVector* vector, common::sel_t pos, const char* str, uint32_t length) { +void RdfVariantVector::addString(ValueVector* vector, common::sel_t pos, const char* str, + uint32_t length) { auto typeVector = StructVector::getFieldVector(vector, 0).get(); auto valVector = StructVector::getFieldVector(vector, 1).get(); typeVector->setValue(pos, static_cast(LogicalTypeID::STRING)); diff --git a/src/expression_evaluator/case_evaluator.cpp b/src/expression_evaluator/case_evaluator.cpp index 11b731b6a49..40ef2db71de 100644 --- a/src/expression_evaluator/case_evaluator.cpp +++ b/src/expression_evaluator/case_evaluator.cpp @@ -68,12 +68,12 @@ std::unique_ptr CaseExpressionEvaluator::clone() { for (auto& alternative : alternativeEvaluators) { clonedAlternativeEvaluators.push_back(alternative->clone()); } - return make_unique( - expression, std::move(clonedAlternativeEvaluators), elseEvaluator->clone()); + return make_unique(expression, std::move(clonedAlternativeEvaluators), + elseEvaluator->clone()); } -void CaseExpressionEvaluator::resolveResultVector( - const ResultSet& /*resultSet*/, MemoryManager* memoryManager) { +void CaseExpressionEvaluator::resolveResultVector(const ResultSet& /*resultSet*/, + MemoryManager* memoryManager) { resultVector = std::make_shared(expression->dataType, memoryManager); std::vector inputEvaluators; for (auto& alternative : alternativeEvaluators) { @@ -84,8 +84,8 @@ void CaseExpressionEvaluator::resolveResultVector( resolveResultStateFromChildren(inputEvaluators); } -void CaseExpressionEvaluator::fillSelected( - const SelectionVector& selVector, ValueVector* srcVector) { +void CaseExpressionEvaluator::fillSelected(const SelectionVector& selVector, + ValueVector* srcVector) { for (auto i = 0u; i < selVector.selectedSize; ++i) { auto resultPos = selVector.selectedPositions[i]; fillEntry(resultPos, srcVector); diff --git a/src/expression_evaluator/expression_evaluator.cpp b/src/expression_evaluator/expression_evaluator.cpp index 2f205be1f71..97349f01487 100644 --- a/src/expression_evaluator/expression_evaluator.cpp +++ b/src/expression_evaluator/expression_evaluator.cpp @@ -5,8 +5,8 @@ using namespace kuzu::common; namespace kuzu { namespace evaluator { -void ExpressionEvaluator::init( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) { +void ExpressionEvaluator::init(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) { for (auto& child : children) { child->init(resultSet, memoryManager); } diff --git a/src/expression_evaluator/function_evaluator.cpp b/src/expression_evaluator/function_evaluator.cpp index 42f6f7bb20c..95d1c1fb23d 100644 --- a/src/expression_evaluator/function_evaluator.cpp +++ b/src/expression_evaluator/function_evaluator.cpp @@ -34,8 +34,8 @@ void FunctionExpressionEvaluator::evaluate(ClientContext* clientContext) { } } -bool FunctionExpressionEvaluator::select( - SelectionVector& selVector, ClientContext* /*ClientContext*/) { +bool FunctionExpressionEvaluator::select(SelectionVector& selVector, + ClientContext* /*ClientContext*/) { for (auto& child : children) { child->evaluate(nullptr); } @@ -66,8 +66,8 @@ std::unique_ptr FunctionExpressionEvaluator::clone() { return make_unique(expression, std::move(clonedChildren)); } -void FunctionExpressionEvaluator::resolveResultVector( - const ResultSet& /*resultSet*/, MemoryManager* memoryManager) { +void FunctionExpressionEvaluator::resolveResultVector(const ResultSet& /*resultSet*/, + MemoryManager* memoryManager) { resultVector = std::make_shared(expression->dataType, memoryManager); std::vector inputEvaluators; inputEvaluators.reserve(children.size()); diff --git a/src/expression_evaluator/literal_evaluator.cpp b/src/expression_evaluator/literal_evaluator.cpp index 34ef154c907..b94b7146298 100644 --- a/src/expression_evaluator/literal_evaluator.cpp +++ b/src/expression_evaluator/literal_evaluator.cpp @@ -9,16 +9,16 @@ using namespace kuzu::main; namespace kuzu { namespace evaluator { -bool LiteralExpressionEvaluator::select( - SelectionVector& /*selVector*/, ClientContext* /*clientContext*/) { +bool LiteralExpressionEvaluator::select(SelectionVector& /*selVector*/, + ClientContext* /*clientContext*/) { KU_ASSERT(resultVector->dataType.getLogicalTypeID() == LogicalTypeID::BOOL); auto pos = resultVector->state->selVector->selectedPositions[0]; KU_ASSERT(pos == 0u); return resultVector->getValue(pos) && (!resultVector->isNull(pos)); } -void LiteralExpressionEvaluator::resolveResultVector( - const processor::ResultSet& /*resultSet*/, MemoryManager* memoryManager) { +void LiteralExpressionEvaluator::resolveResultVector(const processor::ResultSet& /*resultSet*/, + MemoryManager* memoryManager) { resultVector = std::make_shared(*value->getDataType(), memoryManager); resultVector->setState(DataChunkState::getSingleValueDataChunkState()); if (value->isNull()) { diff --git a/src/expression_evaluator/node_rel_evaluator.cpp b/src/expression_evaluator/node_rel_evaluator.cpp index 59dddd658de..27324e724f7 100644 --- a/src/expression_evaluator/node_rel_evaluator.cpp +++ b/src/expression_evaluator/node_rel_evaluator.cpp @@ -24,8 +24,8 @@ void NodeRelExpressionEvaluator::evaluate(ClientContext* clientContext) { } } -void NodeRelExpressionEvaluator::resolveResultVector( - const processor::ResultSet& /*resultSet*/, storage::MemoryManager* memoryManager) { +void NodeRelExpressionEvaluator::resolveResultVector(const processor::ResultSet& /*resultSet*/, + storage::MemoryManager* memoryManager) { resultVector = std::make_shared(nodeOrRel->getDataType(), memoryManager); std::vector inputEvaluators; inputEvaluators.reserve(children.size()); diff --git a/src/expression_evaluator/path_evaluator.cpp b/src/expression_evaluator/path_evaluator.cpp index 87a7a298157..baa514c083d 100644 --- a/src/expression_evaluator/path_evaluator.cpp +++ b/src/expression_evaluator/path_evaluator.cpp @@ -12,8 +12,8 @@ namespace kuzu { namespace evaluator { // For each result field vector, find its corresponding input field vector if exist. -static std::vector getFieldVectors( - const LogicalType& inputType, const LogicalType& resultType, ValueVector* inputVector) { +static std::vector getFieldVectors(const LogicalType& inputType, + const LogicalType& resultType, ValueVector* inputVector) { std::vector result; for (auto field : StructType::getFields(&resultType)) { auto fieldName = StringUtils::getUpper(field->getName()); @@ -27,8 +27,8 @@ static std::vector getFieldVectors( return result; } -void PathExpressionEvaluator::init( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) { +void PathExpressionEvaluator::init(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) { ExpressionEvaluator::init(resultSet, memoryManager); auto resultNodesIdx = StructType::getFieldIdx(&resultVector->dataType, InternalKeyword::NODES); resultNodesVector = StructVector::getFieldVector(resultVector.get(), resultNodesIdx).get(); @@ -63,14 +63,14 @@ void PathExpressionEvaluator::init( auto nodeFieldIdx = StructType::getFieldIdx(&child->dataType, InternalKeyword::NODES); vectors->nodesInput = StructVector::getFieldVector(vectors->input, nodeFieldIdx).get(); vectors->nodesDataInput = ListVector::getDataVector(vectors->nodesInput); - vectors->nodeFieldVectors = getFieldVectors( - recursiveNode->dataType, *pathExpression->getNodeType(), vectors->nodesDataInput); + vectors->nodeFieldVectors = getFieldVectors(recursiveNode->dataType, + *pathExpression->getNodeType(), vectors->nodesDataInput); auto relFieldIdx = StructType::getFieldIdx(&vectors->input->dataType, InternalKeyword::RELS); vectors->relsInput = StructVector::getFieldVector(vectors->input, relFieldIdx).get(); vectors->relsDataInput = ListVector::getDataVector(vectors->relsInput); - vectors->relFieldVectors = getFieldVectors( - recursiveRel->dataType, *pathExpression->getRelType(), vectors->relsDataInput); + vectors->relFieldVectors = getFieldVectors(recursiveRel->dataType, + *pathExpression->getRelType(), vectors->relsDataInput); } break; default: KU_UNREACHABLE; @@ -132,8 +132,8 @@ void PathExpressionEvaluator::copyNodes(sel_t resultPos, bool isEmptyRels) { auto inputPos = getCurrentPos(vectors->input, resultPos); switch (child->dataType.getLogicalTypeID()) { case LogicalTypeID::NODE: { - copyFieldVectors( - inputPos, vectors->nodeFieldVectors, resultDataPos, resultNodesFieldVectors); + copyFieldVectors(inputPos, vectors->nodeFieldVectors, resultDataPos, + resultNodesFieldVectors); } break; case LogicalTypeID::RECURSIVE_REL: { auto& listEntry = vectors->nodesInput->getValue(inputPos); @@ -177,8 +177,8 @@ uint64_t PathExpressionEvaluator::copyRels(sel_t resultPos) { auto inputPos = getCurrentPos(vectors->input, resultPos); switch (child->dataType.getLogicalTypeID()) { case LogicalTypeID::REL: { - copyFieldVectors( - inputPos, vectors->relFieldVectors, resultDataPos, resultRelsFieldVectors); + copyFieldVectors(inputPos, vectors->relFieldVectors, resultDataPos, + resultRelsFieldVectors); } break; case LogicalTypeID::RECURSIVE_REL: { auto& listEntry = vectors->relsInput->getValue(inputPos); @@ -212,8 +212,8 @@ void PathExpressionEvaluator::copyFieldVectors(offset_t inputVectorPos, resultVectorPos++; } -void PathExpressionEvaluator::resolveResultVector( - const processor::ResultSet& /*resultSet*/, storage::MemoryManager* memoryManager) { +void PathExpressionEvaluator::resolveResultVector(const processor::ResultSet& /*resultSet*/, + storage::MemoryManager* memoryManager) { resultVector = std::make_shared(expression->getDataType(), memoryManager); std::vector inputEvaluators; inputEvaluators.reserve(children.size()); diff --git a/src/expression_evaluator/reference_evaluator.cpp b/src/expression_evaluator/reference_evaluator.cpp index 6066782285d..2a52d633d27 100644 --- a/src/expression_evaluator/reference_evaluator.cpp +++ b/src/expression_evaluator/reference_evaluator.cpp @@ -11,8 +11,8 @@ inline static bool isTrue(ValueVector& vector, uint64_t pos) { return !vector.isNull(pos) && vector.getValue(pos); } -bool ReferenceExpressionEvaluator::select( - SelectionVector& selVector, ClientContext* /*clientContext*/) { +bool ReferenceExpressionEvaluator::select(SelectionVector& selVector, + ClientContext* /*clientContext*/) { uint64_t numSelectedValues = 0; auto selectedBuffer = resultVector->state->selVector->getMultableBuffer(); if (resultVector->state->selVector->isUnfiltered()) { diff --git a/src/extension/extension.cpp b/src/extension/extension.cpp index 3282495f3bc..7838c419098 100644 --- a/src/extension/extension.cpp +++ b/src/extension/extension.cpp @@ -35,8 +35,8 @@ std::string getPlatform() { return getOS() + "_" + getArch(); } -std::string ExtensionUtils::getExtensionPath( - const std::string& extensionDir, const std::string& name) { +std::string ExtensionUtils::getExtensionPath(const std::string& extensionDir, + const std::string& name) { return common::stringFormat("{}/lib{}.kuzu_extension", extensionDir, name); } @@ -56,8 +56,8 @@ ExtensionRepoInfo ExtensionUtils::getExtensionRepoInfo(const std::string& extens return {hostPath, hostURL, extensionURL}; } -void ExtensionOptions::addExtensionOption( - std::string name, common::LogicalTypeID type, common::Value defaultValue) { +void ExtensionOptions::addExtensionOption(std::string name, common::LogicalTypeID type, + common::Value defaultValue) { common::StringUtils::toLower(name); extensionOptions.emplace(name, main::ExtensionOption{name, type, std::move(defaultValue)}); } diff --git a/src/function/aggregate/collect.cpp b/src/function/aggregate/collect.cpp index c24b7a5e1a0..184398367b4 100644 --- a/src/function/aggregate/collect.cpp +++ b/src/function/aggregate/collect.cpp @@ -14,8 +14,8 @@ std::unique_ptr CollectFunction::initialize() { return std::make_unique(); } -void CollectFunction::updateAll( - uint8_t* state_, ValueVector* input, uint64_t multiplicity, MemoryManager* memoryManager) { +void CollectFunction::updateAll(uint8_t* state_, ValueVector* input, uint64_t multiplicity, + MemoryManager* memoryManager) { KU_ASSERT(!input->state->isFlat()); auto state = reinterpret_cast(state_); if (input->hasNoNullsGuarantee()) { @@ -39,12 +39,12 @@ void CollectFunction::updatePos(uint8_t* state_, ValueVector* input, uint64_t mu updateSingleValue(state, input, pos, multiplicity, memoryManager); } -void CollectFunction::initCollectStateIfNecessary( - CollectState* state, MemoryManager* memoryManager, LogicalType& dataType) { +void CollectFunction::initCollectStateIfNecessary(CollectState* state, MemoryManager* memoryManager, + LogicalType& dataType) { if (state->factorizedTable == nullptr) { auto tableSchema = std::make_unique(); - tableSchema->appendColumn(std::make_unique( - false /* isUnflat */, 0 /* dataChunkPos */, StorageUtils::getDataTypeSize(dataType))); + tableSchema->appendColumn(std::make_unique(false /* isUnflat */, + 0 /* dataChunkPos */, StorageUtils::getDataTypeSize(dataType))); state->factorizedTable = std::make_unique(memoryManager, std::move(tableSchema)); } @@ -60,8 +60,8 @@ void CollectFunction::updateSingleValue(CollectState* state, ValueVector* input, } } -void CollectFunction::combine( - uint8_t* state_, uint8_t* otherState_, MemoryManager* /*memoryManager*/) { +void CollectFunction::combine(uint8_t* state_, uint8_t* otherState_, + MemoryManager* /*memoryManager*/) { auto otherState = reinterpret_cast(otherState_); if (otherState->isNull) { return; @@ -76,8 +76,8 @@ void CollectFunction::combine( otherState->factorizedTable.reset(); } -std::unique_ptr CollectFunction::bindFunc( - const expression_vector& arguments, Function* definition) { +std::unique_ptr CollectFunction::bindFunc(const expression_vector& arguments, + Function* definition) { KU_ASSERT(arguments.size() == 1); auto aggFuncDefinition = reinterpret_cast(definition); aggFuncDefinition->parameterTypeIDs[0] = arguments[0]->dataType.getLogicalTypeID(); diff --git a/src/function/aggregate/count.cpp b/src/function/aggregate/count.cpp index c0bd5d2c164..3c2ddf2529f 100644 --- a/src/function/aggregate/count.cpp +++ b/src/function/aggregate/count.cpp @@ -11,8 +11,8 @@ using namespace kuzu::binder; namespace kuzu { namespace function { -void CountFunction::updateAll( - uint8_t* state_, ValueVector* input, uint64_t multiplicity, MemoryManager* /*memoryManager*/) { +void CountFunction::updateAll(uint8_t* state_, ValueVector* input, uint64_t multiplicity, + MemoryManager* /*memoryManager*/) { auto state = reinterpret_cast(state_); if (input->hasNoNullsGuarantee()) { for (auto i = 0u; i < input->state->selVector->selectedSize; ++i) { @@ -43,8 +43,8 @@ function_set CountFunction::getFunctionSet() { function_set result; for (auto& type : LogicalTypeUtils::getAllValidLogicTypes()) { for (auto isDistinct : std::vector{true, false}) { - result.push_back(AggregateFunctionUtil::getAggFunc( - name, type, LogicalTypeID::INT64, isDistinct, paramRewriteFunc)); + result.push_back(AggregateFunctionUtil::getAggFunc(name, type, + LogicalTypeID::INT64, isDistinct, paramRewriteFunc)); } } return result; diff --git a/src/function/aggregate/count_star.cpp b/src/function/aggregate/count_star.cpp index bafeba7cc74..e883f85f0e7 100644 --- a/src/function/aggregate/count_star.cpp +++ b/src/function/aggregate/count_star.cpp @@ -6,8 +6,8 @@ using namespace kuzu::storage; namespace kuzu { namespace function { -void CountStarFunction::updateAll( - uint8_t* state_, ValueVector* input, uint64_t multiplicity, MemoryManager* /*memoryManager*/) { +void CountStarFunction::updateAll(uint8_t* state_, ValueVector* input, uint64_t multiplicity, + MemoryManager* /*memoryManager*/) { auto state = reinterpret_cast(state_); KU_ASSERT(input == nullptr); (void)input; diff --git a/src/function/aggregate_function.cpp b/src/function/aggregate_function.cpp index ac44742b25c..62fc00c91fe 100644 --- a/src/function/aggregate_function.cpp +++ b/src/function/aggregate_function.cpp @@ -16,8 +16,8 @@ std::unique_ptr AggregateFunctionUtil::getSumFunc(std::string common::LogicalTypeID inputType, common::LogicalTypeID resultType, bool isDistinct) { switch (inputType) { case common::LogicalTypeID::INT128: - return getAggFunc>( - std::move(name), inputType, resultType, isDistinct); + return getAggFunc>(std::move(name), inputType, resultType, + isDistinct); case common::LogicalTypeID::SERIAL: case common::LogicalTypeID::INT64: return getAggFunc>(name, inputType, resultType, isDistinct); @@ -48,8 +48,8 @@ std::unique_ptr AggregateFunctionUtil::getAvgFunc(std::string common::LogicalTypeID inputType, common::LogicalTypeID resultType, bool isDistinct) { switch (inputType) { case common::LogicalTypeID::INT128: - return getAggFunc>( - std::move(name), inputType, resultType, isDistinct); + return getAggFunc>(std::move(name), inputType, resultType, + isDistinct); case common::LogicalTypeID::SERIAL: case common::LogicalTypeID::INT64: return getAggFunc>(std::move(name), inputType, resultType, isDistinct); @@ -60,14 +60,14 @@ std::unique_ptr AggregateFunctionUtil::getAvgFunc(std::string case common::LogicalTypeID::INT8: return getAggFunc>(std::move(name), inputType, resultType, isDistinct); case common::LogicalTypeID::UINT64: - return getAggFunc>( - std::move(name), inputType, resultType, isDistinct); + return getAggFunc>(std::move(name), inputType, resultType, + isDistinct); case common::LogicalTypeID::UINT32: - return getAggFunc>( - std::move(name), inputType, resultType, isDistinct); + return getAggFunc>(std::move(name), inputType, resultType, + isDistinct); case common::LogicalTypeID::UINT16: - return getAggFunc>( - std::move(name), inputType, resultType, isDistinct); + return getAggFunc>(std::move(name), inputType, resultType, + isDistinct); case common::LogicalTypeID::UINT8: return getAggFunc>(std::move(name), inputType, resultType, isDistinct); case common::LogicalTypeID::DOUBLE: @@ -79,16 +79,16 @@ std::unique_ptr AggregateFunctionUtil::getAvgFunc(std::string } } -std::unique_ptr AggregateFunctionUtil::getMinFunc( - LogicalTypeID inputType, bool isDistinct) { - return AggregateFunctionUtil::getMinMaxFunction( - AggregateMinFunction::name, inputType, inputType, isDistinct); +std::unique_ptr AggregateFunctionUtil::getMinFunc(LogicalTypeID inputType, + bool isDistinct) { + return AggregateFunctionUtil::getMinMaxFunction(AggregateMinFunction::name, inputType, + inputType, isDistinct); } -std::unique_ptr AggregateFunctionUtil::getMaxFunc( - LogicalTypeID inputType, bool isDistinct) { - return AggregateFunctionUtil::getMinMaxFunction( - AggregateMaxFunction::name, inputType, inputType, isDistinct); +std::unique_ptr AggregateFunctionUtil::getMaxFunc(LogicalTypeID inputType, + bool isDistinct) { + return AggregateFunctionUtil::getMinMaxFunction(AggregateMaxFunction::name, + inputType, inputType, isDistinct); } template diff --git a/src/function/arithmetic/subtract.cpp b/src/function/arithmetic/subtract.cpp index 88cefcbbf2c..62613c0fc02 100644 --- a/src/function/arithmetic/subtract.cpp +++ b/src/function/arithmetic/subtract.cpp @@ -10,8 +10,8 @@ namespace function { // reference from duckDB subtract.cpp template -static inline bool SubtractInPlaceWithOverflowCheck( - SRC_TYPE left, SRC_TYPE right, SRC_TYPE& result) { +static inline bool SubtractInPlaceWithOverflowCheck(SRC_TYPE left, SRC_TYPE right, + SRC_TYPE& result) { DST_TYPE uresult; uresult = static_cast(left) - static_cast(right); if (uresult < NumericLimits::minimum() || diff --git a/src/function/base_lower_upper_operation.cpp b/src/function/base_lower_upper_operation.cpp index 42b78028b68..2f4cdd66969 100644 --- a/src/function/base_lower_upper_operation.cpp +++ b/src/function/base_lower_upper_operation.cpp @@ -39,8 +39,8 @@ uint32_t BaseLowerUpperFunction::getResultLen(char* inputStr, uint32_t inputLen, return outputLength; } -uint64_t BaseLowerUpperFunction::convertCharCase( - char* result, const char* input, int32_t charPos, bool toUpper) { +uint64_t BaseLowerUpperFunction::convertCharCase(char* result, const char* input, int32_t charPos, + bool toUpper) { if (input[charPos] & 0x80) { int size = 0u, newSize = 0u; auto codepoint = utf8proc_codepoint(input + charPos, size); diff --git a/src/function/built_in_function_utils.cpp b/src/function/built_in_function_utils.cpp index a86c22a30fb..a43ef52d365 100644 --- a/src/function/built_in_function_utils.cpp +++ b/src/function/built_in_function_utils.cpp @@ -81,8 +81,8 @@ AggregateFunction* BuiltInFunctionsUtils::matchAggregateFunction(const std::stri } candidateFunctions.push_back(aggregateFunction); } - validateNonEmptyCandidateFunctions( - candidateFunctions, name, inputTypes, isDistinct, functionSet); + validateNonEmptyCandidateFunctions(candidateFunctions, name, inputTypes, isDistinct, + functionSet); KU_ASSERT(candidateFunctions.size() == 1); return candidateFunctions[0]; } @@ -397,8 +397,8 @@ Function* BuiltInFunctionsUtils::getBestMatch(std::vector& functionsT return result; } -uint32_t BuiltInFunctionsUtils::getFunctionCost( - const std::vector& inputTypes, Function* function, bool isOverload) { +uint32_t BuiltInFunctionsUtils::getFunctionCost(const std::vector& inputTypes, + Function* function, bool isOverload) { switch (function->type) { case FunctionType::SCALAR: { auto scalarFunction = ku_dynamic_cast(function); @@ -414,8 +414,8 @@ uint32_t BuiltInFunctionsUtils::getFunctionCost( } } -uint32_t BuiltInFunctionsUtils::getAggregateFunctionCost( - const std::vector& inputTypes, bool isDistinct, AggregateFunction* function) { +uint32_t BuiltInFunctionsUtils::getAggregateFunctionCost(const std::vector& inputTypes, + bool isDistinct, AggregateFunction* function) { if (inputTypes.size() != function->parameterTypeIDs.size() || isDistinct != function->isDistinct) { return UINT32_MAX; @@ -446,8 +446,8 @@ uint32_t BuiltInFunctionsUtils::matchParameters(const std::vector& return cost; } -uint32_t BuiltInFunctionsUtils::matchVarLengthParameters( - const std::vector& inputTypes, LogicalTypeID targetTypeID, bool /*isOverload*/) { +uint32_t BuiltInFunctionsUtils::matchVarLengthParameters(const std::vector& inputTypes, + LogicalTypeID targetTypeID, bool /*isOverload*/) { auto cost = 0u; for (auto inputType : inputTypes) { auto castCost = getCastCost(inputType.getLogicalTypeID(), targetTypeID); diff --git a/src/function/cast/cast_array.cpp b/src/function/cast/cast_array.cpp index 7d2da8da739..2131da1c2e4 100644 --- a/src/function/cast/cast_array.cpp +++ b/src/function/cast/cast_array.cpp @@ -6,8 +6,8 @@ namespace kuzu { namespace function { -bool CastArrayHelper::checkCompatibleNestedTypes( - LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { +bool CastArrayHelper::checkCompatibleNestedTypes(LogicalTypeID sourceTypeID, + LogicalTypeID targetTypeID) { switch (sourceTypeID) { case LogicalTypeID::LIST: { if (targetTypeID == LogicalTypeID::ARRAY || targetTypeID == LogicalTypeID::LIST) { @@ -71,8 +71,8 @@ bool CastArrayHelper::containsListToArray(const LogicalType* srcType, const Logi return false; } -void CastArrayHelper::validateListEntry( - ValueVector* inputVector, LogicalType* resultType, uint64_t pos) { +void CastArrayHelper::validateListEntry(ValueVector* inputVector, LogicalType* resultType, + uint64_t pos) { if (inputVector->isNull(pos)) { return; } diff --git a/src/function/cast_from_string_functions.cpp b/src/function/cast_from_string_functions.cpp index 6d16df66ecc..1d4e7574e15 100644 --- a/src/function/cast_from_string_functions.cpp +++ b/src/function/cast_from_string_functions.cpp @@ -107,8 +107,8 @@ inline void CastStringHelper::cast(const char* input, uint64_t len, timestamp_ns template<> inline void CastStringHelper::cast(const char* input, uint64_t len, timestamp_sec_t& result, ValueVector* /*vector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - TryCastStringToTimestamp::cast( - input, len, result, LogicalTypeID::TIMESTAMP_SEC); + TryCastStringToTimestamp::cast(input, len, result, + LogicalTypeID::TIMESTAMP_SEC); } template<> @@ -141,8 +141,8 @@ void CastString::operation(const ku_string_t& input, blob_t& result, ValueVector Blob::fromString(reinterpret_cast(input.getData()), input.len, overflowPtr); memcpy(result.value.prefix, overflowPtr, ku_string_t::PREFIX_LENGTH); } else { - Blob::fromString( - reinterpret_cast(input.getData()), input.len, result.value.prefix); + Blob::fromString(reinterpret_cast(input.getData()), input.len, + result.value.prefix); } } @@ -204,8 +204,8 @@ static bool skipToCloseQuotes(const char*& input, const char* end) { return false; } -static bool skipToClose( - const char*& input, const char* end, uint64_t& lvl, char target, const CSVOption* option) { +static bool skipToClose(const char*& input, const char* end, uint64_t& lvl, char target, + const CSVOption* option) { input++; while (input != end) { if (*input == '\'') { @@ -256,12 +256,12 @@ static bool isNull(std::string_view& str) { struct CountPartOperation { uint64_t count = 0; - static inline bool handleKey( - const char* /*start*/, const char* /*end*/, const CSVOption* /*config*/) { + static inline bool handleKey(const char* /*start*/, const char* /*end*/, + const CSVOption* /*config*/) { return true; } - inline void handleValue( - const char* /*start*/, const char* /*end*/, const CSVOption* /*config*/) { + inline void handleValue(const char* /*start*/, const char* /*end*/, + const CSVOption* /*config*/) { count++; } }; @@ -276,8 +276,8 @@ struct SplitStringListOperation { void handleValue(const char* start, const char* end, const CSVOption* option) { skipWhitespace(start, end); trimRightWhitespace(start, end); - CastString::copyStringToVector( - resultVector, offset, std::string_view{start, (uint32_t)(end - start)}, option); + CastString::copyStringToVector(resultVector, offset, + std::string_view{start, (uint32_t)(end - start)}, option); offset++; } }; @@ -330,8 +330,8 @@ static bool splitCStringList(const char* input, uint64_t len, T& state, const CS } template -static inline void startListCast( - const char* input, uint64_t len, T split, const CSVOption* option, ValueVector* vector) { +static inline void startListCast(const char* input, uint64_t len, T split, const CSVOption* option, + ValueVector* vector) { if (!splitCStringList(input, len, split, option)) { throw ConversionException("Cast failed. " + std::string{input, len} + " is not in " + vector->dataType.toString() + " range."); @@ -503,8 +503,8 @@ static bool parseStructFieldName(const char*& input, const char* end) { return false; } -static bool parseStructFieldValue( - const char*& input, const char* end, const CSVOption* option, bool& closeBrack) { +static bool parseStructFieldValue(const char*& input, const char* end, const CSVOption* option, + bool& closeBrack) { uint64_t lvl = 0; while (input < end) { if (*input == '"' || *input == '\'') { @@ -614,8 +614,8 @@ static inline void testAndSetValue(ValueVector* vector, uint64_t rowToAdd, T res } } -static bool tryCastUnionField( - ValueVector* vector, uint64_t rowToAdd, const char* input, uint64_t len) { +static bool tryCastUnionField(ValueVector* vector, uint64_t rowToAdd, const char* input, + uint64_t len) { auto& targetType = vector->dataType; bool success = false; switch (targetType.getLogicalTypeID()) { @@ -743,8 +743,8 @@ void CastStringHelper::cast(const char* input, uint64_t len, union_entry_t& /*re } if (selectedFieldIdx == INVALID_STRUCT_FIELD_IDX) { - throw ConversionException{stringFormat( - "Could not convert to union type {}: {}.", type.toString(), std::string{input, len})}; + throw ConversionException{stringFormat("Could not convert to union type {}: {}.", + type.toString(), std::string{input, len})}; } StructVector::getFieldVector(vector, UnionType::TAG_FIELD_IDX) ->setValue(rowToAdd, selectedFieldIdx); @@ -759,8 +759,8 @@ void CastString::operation(const ku_string_t& input, union_entry_t& result, resultVector, rowToAdd, CSVOption); } -void CastString::copyStringToVector( - ValueVector* vector, uint64_t vectorPos, std::string_view strVal, const CSVOption* option) { +void CastString::copyStringToVector(ValueVector* vector, uint64_t vectorPos, + std::string_view strVal, const CSVOption* option) { auto& type = vector->dataType; if (strVal.empty() || isNull(strVal)) { vector->setNull(vectorPos, true /* isNull */); diff --git a/src/function/cast_string_non_nested_functions.cpp b/src/function/cast_string_non_nested_functions.cpp index 02ce6458fd6..5ec298a8bb8 100644 --- a/src/function/cast_string_non_nested_functions.cpp +++ b/src/function/cast_string_non_nested_functions.cpp @@ -54,8 +54,8 @@ void castStringToBool(const char* input, uint64_t len, bool& result) { } template<> -bool TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result) { +bool TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result) { if (!Timestamp::tryConvertTimestamp(input, len, result)) { return false; } @@ -64,8 +64,8 @@ bool TryCastStringToTimestamp::tryCast( } template<> -bool TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result) { +bool TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result) { if (!Timestamp::tryConvertTimestamp(input, len, result)) { return false; } @@ -74,8 +74,8 @@ bool TryCastStringToTimestamp::tryCast( } template<> -bool TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result) { +bool TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result) { if (!Timestamp::tryConvertTimestamp(input, len, result)) { return false; } diff --git a/src/function/comparison_functions.cpp b/src/function/comparison_functions.cpp index c845320bfd4..12cb9fcd106 100644 --- a/src/function/comparison_functions.cpp +++ b/src/function/comparison_functions.cpp @@ -160,11 +160,11 @@ static void executeNestedGreaterThan(uint8_t& isGreaterThan, uint8_t& isEqual, isGreaterThan = !isRightNull; isEqual = (isLeftNull == isRightNull); } else { - executeNestedOperation( - isGreaterThan, leftDataVector, rightDataVector, leftPos, rightPos); + executeNestedOperation(isGreaterThan, leftDataVector, rightDataVector, leftPos, + rightPos); if (!isGreaterThan) { - executeNestedOperation( - isEqual, leftDataVector, rightDataVector, leftPos, rightPos); + executeNestedOperation(isEqual, leftDataVector, rightDataVector, leftPos, + rightPos); } else { isEqual = false; } @@ -182,8 +182,8 @@ void GreaterThan::operation(const list_entry_t& left, const list_entry_t& right, for (auto i = 0u; i < commonLength; i++) { auto leftPos = left.offset + i; auto rightPos = right.offset + i; - executeNestedGreaterThan( - result, isEqual, leftDataVector, rightDataVector, leftPos, rightPos); + executeNestedGreaterThan(result, isEqual, leftDataVector, rightDataVector, leftPos, + rightPos); if (result || (!result && !isEqual)) { return; } diff --git a/src/function/find_function.cpp b/src/function/find_function.cpp index df9f58fedaf..7714d826cd2 100644 --- a/src/function/find_function.cpp +++ b/src/function/find_function.cpp @@ -92,8 +92,8 @@ int64_t Find::genericFind(const uint8_t* haystack, uint32_t haystackLen, const u // Returns the position of the first occurrence of needle in the haystack. If haystack doesn't // contain needle, it returns -1. -int64_t Find::find( - const uint8_t* haystack, uint32_t haystackLen, const uint8_t* needle, uint32_t needleLen) { +int64_t Find::find(const uint8_t* haystack, uint32_t haystackLen, const uint8_t* needle, + uint32_t needleLen) { auto firstMatchCharPos = (uint8_t*)memchr(haystack, needle[0], haystackLen); if (firstMatchCharPos == nullptr) { return -1; @@ -104,25 +104,25 @@ int64_t Find::find( case 1: return firstMatchCharOffset; case 2: - return alignedNeedleSizeFind( - firstMatchCharPos, numCharsToMatch, needle, firstMatchCharOffset); + return alignedNeedleSizeFind(firstMatchCharPos, numCharsToMatch, needle, + firstMatchCharOffset); case 3: - return unalignedNeedleSizeFind( - firstMatchCharPos, numCharsToMatch, needle, 3, firstMatchCharOffset); + return unalignedNeedleSizeFind(firstMatchCharPos, numCharsToMatch, needle, 3, + firstMatchCharOffset); case 4: - return alignedNeedleSizeFind( - firstMatchCharPos, numCharsToMatch, needle, firstMatchCharOffset); + return alignedNeedleSizeFind(firstMatchCharPos, numCharsToMatch, needle, + firstMatchCharOffset); case 5: case 6: case 7: - return unalignedNeedleSizeFind( - firstMatchCharPos, numCharsToMatch, needle, needleLen, firstMatchCharOffset); + return unalignedNeedleSizeFind(firstMatchCharPos, numCharsToMatch, needle, + needleLen, firstMatchCharOffset); case 8: - return alignedNeedleSizeFind( - firstMatchCharPos, numCharsToMatch, needle, firstMatchCharOffset); + return alignedNeedleSizeFind(firstMatchCharPos, numCharsToMatch, needle, + firstMatchCharOffset); default: - return genericFind( - firstMatchCharPos, numCharsToMatch, needle, needleLen, firstMatchCharOffset); + return genericFind(firstMatchCharPos, numCharsToMatch, needle, needleLen, + firstMatchCharOffset); } } diff --git a/src/function/pattern/id_function.cpp b/src/function/pattern/id_function.cpp index 8f05ef35d47..0495e44bc28 100644 --- a/src/function/pattern/id_function.cpp +++ b/src/function/pattern/id_function.cpp @@ -14,8 +14,8 @@ using namespace kuzu::binder; namespace kuzu { namespace function { -static std::shared_ptr rewriteFunc( - const expression_vector& params, ExpressionBinder* binder) { +static std::shared_ptr rewriteFunc(const expression_vector& params, + ExpressionBinder* binder) { KU_ASSERT(params.size() == 1); auto param = params[0].get(); if (ExpressionUtil::isNodePattern(*param)) { @@ -38,8 +38,8 @@ function_set IDFunction::getFunctionSet() { auto inputTypes = std::vector{LogicalTypeID::NODE, LogicalTypeID::REL, LogicalTypeID::STRUCT}; for (auto& inputType : inputTypes) { - auto function = std::make_unique( - InternalKeyword::ID, std::vector{inputType}, rewriteFunc); + auto function = std::make_unique(InternalKeyword::ID, + std::vector{inputType}, rewriteFunc); functionSet.push_back(std::move(function)); } return functionSet; diff --git a/src/function/scalar_macro_function.cpp b/src/function/scalar_macro_function.cpp index b2fed1e81bf..618ed034033 100644 --- a/src/function/scalar_macro_function.cpp +++ b/src/function/scalar_macro_function.cpp @@ -24,8 +24,8 @@ std::unique_ptr ScalarMacroFunction::copy() const { for (auto& defaultArg : defaultArgs) { defaultArgsCopy.emplace_back(defaultArg.first, defaultArg.second->copy()); } - return std::make_unique( - expression->copy(), positionalArgs, std::move(defaultArgsCopy)); + return std::make_unique(expression->copy(), positionalArgs, + std::move(defaultArgsCopy)); } void ScalarMacroFunction::serialize(Serializer& serializer) const { @@ -53,8 +53,8 @@ std::unique_ptr ScalarMacroFunction::deserialize(Deserializ auto val = ParsedExpression::deserialize(deserializer); defaultArgs.emplace_back(std::move(key), std::move(val)); } - return std::make_unique( - std::move(expression), std::move(positionalArgs), std::move(defaultArgs)); + return std::make_unique(std::move(expression), std::move(positionalArgs), + std::move(defaultArgs)); } std::string ScalarMacroFunction::toCypher(const std::string& name) const { diff --git a/src/function/table/call/current_setting.cpp b/src/function/table/call/current_setting.cpp index 61f328a1a7a..70da8da0b29 100644 --- a/src/function/table/call/current_setting.cpp +++ b/src/function/table/call/current_setting.cpp @@ -16,8 +16,8 @@ struct CurrentSettingBindData final : public CallTableFuncBindData { result{std::move(result)} {} std::unique_ptr copy() const override { - return std::make_unique( - result, columnTypes, columnNames, maxOffset); + return std::make_unique(result, columnTypes, columnNames, + maxOffset); } }; @@ -37,8 +37,8 @@ static common::offset_t tableFunc(TableFuncInput& data, TableFuncOutput& output) return 1; } -static std::unique_ptr bindFunc( - ClientContext* context, TableFuncBindInput* input) { +static std::unique_ptr bindFunc(ClientContext* context, + TableFuncBindInput* input) { auto optionName = input->inputs[0].getValue(); std::vector columnNames; std::vector columnTypes; diff --git a/src/function/table/call/db_version.cpp b/src/function/table/call/db_version.cpp index 13f0472dd0e..44255980902 100644 --- a/src/function/table/call/db_version.cpp +++ b/src/function/table/call/db_version.cpp @@ -25,8 +25,8 @@ static std::unique_ptr bindFunc(ClientContext*, TableFuncBind std::vector returnTypes; returnColumnNames.emplace_back("version"); returnTypes.emplace_back(*LogicalType::STRING()); - return std::make_unique( - std::move(returnTypes), std::move(returnColumnNames), 1 /* one row result */); + return std::make_unique(std::move(returnTypes), + std::move(returnColumnNames), 1 /* one row result */); } function_set DBVersionFunction::getFunctionSet() { diff --git a/src/function/table/call/show_connection.cpp b/src/function/table/call/show_connection.cpp index c0d7e4b505f..6dc8bc8f308 100644 --- a/src/function/table/call/show_connection.cpp +++ b/src/function/table/call/show_connection.cpp @@ -23,8 +23,8 @@ struct ShowConnectionBindData : public CallTableFuncBindData { context{context}, tableEntry{tableEntry} {} inline std::unique_ptr copy() const override { - return std::make_unique( - context, tableEntry, columnTypes, columnNames, maxOffset); + return std::make_unique(context, tableEntry, columnTypes, + columnNames, maxOffset); } }; @@ -58,8 +58,8 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output auto vectorPos = 0u; switch (tableEntry->getTableType()) { case TableType::REL: { - outputRelTableConnection( - srcVector, dstVector, vectorPos, bindData->context, tableEntry->getTableID()); + outputRelTableConnection(srcVector, dstVector, vectorPos, bindData->context, + tableEntry->getTableID()); vectorPos++; } break; case TableType::REL_GROUP: { @@ -78,8 +78,8 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output return vectorPos; } -static std::unique_ptr bindFunc( - ClientContext* context, TableFuncBindInput* input) { +static std::unique_ptr bindFunc(ClientContext* context, + TableFuncBindInput* input) { std::vector columnNames; std::vector columnTypes; // Special case here Due to any -> string, but lack implicit cast @@ -103,8 +103,8 @@ static std::unique_ptr bindFunc( auto relGroupEntry = ku_dynamic_cast(tableEntry); maxOffset = relGroupEntry->getRelTableIDs().size(); } - return std::make_unique( - context, tableEntry, std::move(columnTypes), std::move(columnNames), maxOffset); + return std::make_unique(context, tableEntry, std::move(columnTypes), + std::move(columnNames), maxOffset); } function_set ShowConnectionFunction::getFunctionSet() { diff --git a/src/function/table/call/show_tables.cpp b/src/function/table/call/show_tables.cpp index 42d3af36e43..752184a7898 100644 --- a/src/function/table/call/show_tables.cpp +++ b/src/function/table/call/show_tables.cpp @@ -43,8 +43,8 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output return numTablesToOutput; } -static std::unique_ptr bindFunc( - main::ClientContext* context, TableFuncBindInput*) { +static std::unique_ptr bindFunc(main::ClientContext* context, + TableFuncBindInput*) { std::vector columnNames; std::vector columnTypes; columnNames.emplace_back("name"); @@ -55,8 +55,8 @@ static std::unique_ptr bindFunc( columnTypes.emplace_back(*LogicalType::STRING()); auto tableEntries = context->getCatalog()->getTableEntries(context->getTx()); auto numTables = context->getCatalog()->getTableCount(context->getTx()); - return std::make_unique( - std::move(tableEntries), std::move(columnTypes), std::move(columnNames), numTables); + return std::make_unique(std::move(tableEntries), std::move(columnTypes), + std::move(columnNames), numTables); } function_set ShowTablesFunction::getFunctionSet() { diff --git a/src/function/table/call/storage_info.cpp b/src/function/table/call/storage_info.cpp index ca1b4ff8604..9693f87d1a5 100644 --- a/src/function/table/call/storage_info.cpp +++ b/src/function/table/call/storage_info.cpp @@ -108,8 +108,8 @@ struct StorageInfoBindData final : public CallTableFuncBindData { tableEntry{tableEntry}, table{table}, context{context} {} inline std::unique_ptr copy() const override { - return std::make_unique( - columnTypes, columnNames, tableEntry, table, context); + return std::make_unique(columnTypes, columnNames, tableEntry, table, + context); } }; @@ -122,8 +122,8 @@ static std::unique_ptr initStorageInfoSharedState( TableFunctionInitInput& input) { auto storageInfoBindData = ku_dynamic_cast(input.bindData); - return std::make_unique( - storageInfoBindData->table, storageInfoBindData->maxOffset); + return std::make_unique(storageInfoBindData->table, + storageInfoBindData->maxOffset); } static void appendColumnChunkStorageInfo(node_group_idx_t nodeGroupIdx, @@ -198,8 +198,8 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output } } -static std::unique_ptr bindFunc( - ClientContext* context, TableFuncBindInput* input) { +static std::unique_ptr bindFunc(ClientContext* context, + TableFuncBindInput* input) { std::vector columnNames = {"node_group_id", "column_name", "data_type", "table_type", "start_page_idx", "num_pages", "num_values", "compression"}; std::vector columnTypes; @@ -220,8 +220,8 @@ static std::unique_ptr bindFunc( auto tableEntry = catalog->getTableCatalogEntry(context->getTx(), tableID); auto storageManager = context->getStorageManager(); auto table = storageManager->getTable(tableID); - return std::make_unique( - std::move(columnTypes), std::move(columnNames), tableEntry, table, context); + return std::make_unique(std::move(columnTypes), std::move(columnNames), + tableEntry, table, context); } function_set StorageInfoFunction::getFunctionSet() { diff --git a/src/function/table/call/table_info.cpp b/src/function/table/call/table_info.cpp index fbf26c526c2..88122cdb9e0 100644 --- a/src/function/table/call/table_info.cpp +++ b/src/function/table/call/table_info.cpp @@ -46,8 +46,8 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output if (property->getName() == rdf::PID) { // Replace pid column with (virtual) iri column. dataChunk.getValueVector(0)->setValue(vectorPos, -1); - dataChunk.getValueVector(1)->setValue( - vectorPos, std::string(rdf::IRI) + " (Virtual)"); + dataChunk.getValueVector(1)->setValue(vectorPos, + std::string(rdf::IRI) + " (Virtual)"); dataChunk.getValueVector(2)->setValue(vectorPos, LogicalType::STRING()->toString()); vectorPos++; continue; @@ -61,16 +61,16 @@ static common::offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output auto nodeTableEntry = ku_dynamic_cast(tableEntry); auto primaryKeyID = nodeTableEntry->getPrimaryKeyPID(); - dataChunk.getValueVector(3)->setValue( - vectorPos, primaryKeyID == property->getPropertyID()); + dataChunk.getValueVector(3)->setValue(vectorPos, + primaryKeyID == property->getPropertyID()); } vectorPos++; } return vectorPos; } -static std::unique_ptr bindFunc( - main::ClientContext* context, TableFuncBindInput* input) { +static std::unique_ptr bindFunc(main::ClientContext* context, + TableFuncBindInput* input) { std::vector columnNames; std::vector columnTypes; auto tableName = input->inputs[0].getValue(); @@ -86,8 +86,8 @@ static std::unique_ptr bindFunc( columnNames.emplace_back("primary key"); columnTypes.push_back(*LogicalType::BOOL()); } - return std::make_unique( - tableEntry, std::move(columnTypes), std::move(columnNames), tableEntry->getNumProperties()); + return std::make_unique(tableEntry, std::move(columnTypes), + std::move(columnNames), tableEntry->getNumProperties()); } function_set TableInfoFunction::getFunctionSet() { diff --git a/src/function/vector_arithmetic_functions.cpp b/src/function/vector_arithmetic_functions.cpp index d7d824e66dc..bc201855d4a 100644 --- a/src/function/vector_arithmetic_functions.cpp +++ b/src/function/vector_arithmetic_functions.cpp @@ -107,25 +107,25 @@ static void getBinaryExecFunc(LogicalTypeID operandTypeID, scalar_func_exec_t& f } template -static std::unique_ptr getUnaryFunction( - std::string name, LogicalTypeID operandTypeID) { +static std::unique_ptr getUnaryFunction(std::string name, + LogicalTypeID operandTypeID) { function::scalar_func_exec_t execFunc; getUnaryExecFunc(operandTypeID, execFunc); - return std::make_unique( - std::move(name), std::vector{operandTypeID}, operandTypeID, execFunc); + return std::make_unique(std::move(name), + std::vector{operandTypeID}, operandTypeID, execFunc); } template -static std::unique_ptr getUnaryFunction( - std::string name, LogicalTypeID operandTypeID, LogicalTypeID resultTypeID) { +static std::unique_ptr getUnaryFunction(std::string name, + LogicalTypeID operandTypeID, LogicalTypeID resultTypeID) { return std::make_unique(std::move(name), std::vector{operandTypeID}, resultTypeID, ScalarFunction::UnaryExecFunction); } template -static inline std::unique_ptr getBinaryFunction( - std::string name, LogicalTypeID operandTypeID) { +static inline std::unique_ptr getBinaryFunction(std::string name, + LogicalTypeID operandTypeID) { function::scalar_func_exec_t execFunc; getBinaryExecFunc(operandTypeID, execFunc); return std::make_unique(std::move(name), @@ -133,8 +133,8 @@ static inline std::unique_ptr getBinaryFunction( } template -static inline std::unique_ptr getBinaryFunction( - std::string name, LogicalTypeID operandTypeID, LogicalTypeID resultTypeID) { +static inline std::unique_ptr getBinaryFunction(std::string name, + LogicalTypeID operandTypeID, LogicalTypeID resultTypeID) { return std::make_unique(std::move(name), std::vector{operandTypeID, operandTypeID}, resultTypeID, ScalarFunction::BinaryExecFunction); @@ -156,8 +156,8 @@ function_set AddFunction::getFunctionSet() { std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING}, LogicalTypeID::STRING, ConcatFunction::execFunc)); // interval + interval → interval - result.push_back(getBinaryFunction( - name, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); + result.push_back(getBinaryFunction(name, LogicalTypeID::INTERVAL, + LogicalTypeID::INTERVAL)); // date + int → date result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::INT64}, LogicalTypeID::DATE, @@ -193,8 +193,8 @@ function_set SubtractFunction::getFunctionSet() { result.push_back(getBinaryFunction(name, typeID)); } // date - date → int64 - result.push_back(getBinaryFunction( - name, LogicalTypeID::DATE, LogicalTypeID::INT64)); + result.push_back(getBinaryFunction(name, LogicalTypeID::DATE, + LogicalTypeID::INT64)); // date - integer → date result.push_back(make_unique(name, std::vector{LogicalTypeID::DATE, LogicalTypeID::INT64}, LogicalTypeID::DATE, @@ -205,16 +205,16 @@ function_set SubtractFunction::getFunctionSet() { LogicalTypeID::DATE, ScalarFunction::BinaryExecFunction)); // timestamp - timestamp → interval - result.push_back(getBinaryFunction( - name, LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL)); + result.push_back(getBinaryFunction(name, + LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL)); // timestamp - interval → timestamp result.push_back(make_unique(name, std::vector{LogicalTypeID::TIMESTAMP, LogicalTypeID::INTERVAL}, LogicalTypeID::TIMESTAMP, ScalarFunction::BinaryExecFunction)); // interval - interval → interval - result.push_back(getBinaryFunction( - name, LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); + result.push_back(getBinaryFunction(name, + LogicalTypeID::INTERVAL, LogicalTypeID::INTERVAL)); return result; } @@ -470,8 +470,8 @@ function_set BitShiftLeftFunction::getFunctionSet() { function_set BitShiftRightFunction::getFunctionSet() { function_set result; - result.push_back(getBinaryFunction( - name, LogicalTypeID::INT64, LogicalTypeID::INT64)); + result.push_back(getBinaryFunction(name, LogicalTypeID::INT64, + LogicalTypeID::INT64)); return result; } diff --git a/src/function/vector_array_functions.cpp b/src/function/vector_array_functions.cpp index bdd06ea7e0f..b2c6cfb49a0 100644 --- a/src/function/vector_array_functions.cpp +++ b/src/function/vector_array_functions.cpp @@ -13,8 +13,8 @@ using namespace kuzu::common; namespace kuzu { namespace function { -std::unique_ptr ArrayValueBindFunc( - const binder::expression_vector& arguments, Function* /*function*/) { +std::unique_ptr ArrayValueBindFunc(const binder::expression_vector& arguments, + Function* /*function*/) { auto resultType = LogicalType::ARRAY(ListCreationFunction::getChildType(arguments).copy(), arguments.size()); return std::make_unique(std::move(resultType)); @@ -73,8 +73,8 @@ std::unique_ptr ArrayCrossProductBindFunc( ArrayCrossProductFunction::name)}; } ku_dynamic_cast(function)->execFunc = execFunc; - auto resultType = LogicalType::ARRAY( - *ArrayType::getChildType(&leftType), ArrayType::getNumElements(&leftType)); + auto resultType = LogicalType::ARRAY(*ArrayType::getChildType(&leftType), + ArrayType::getNumElements(&leftType)); return std::make_unique(std::move(resultType)); } @@ -90,8 +90,8 @@ function_set ArrayCrossProductFunction::getFunctionSet() { return result; } -static void validateArrayFunctionParameters( - const LogicalType& leftType, const LogicalType& rightType, const std::string& functionName) { +static void validateArrayFunctionParameters(const LogicalType& leftType, + const LogicalType& rightType, const std::string& functionName) { if (leftType != rightType) { throw BinderException( stringFormat("{} requires both arrays to have the same element type", functionName)); @@ -127,8 +127,8 @@ scalar_func_exec_t getScalarExecFunc(LogicalType type) { } template -std::unique_ptr arrayTemplateBindFunc( - std::string functionName, const binder::expression_vector& arguments, Function* function) { +std::unique_ptr arrayTemplateBindFunc(std::string functionName, + const binder::expression_vector& arguments, Function* function) { auto leftType = arguments[0]->dataType; auto rightType = arguments[1]->dataType; validateArrayFunctionParameters(leftType, rightType, functionName); diff --git a/src/function/vector_cast_functions.cpp b/src/function/vector_cast_functions.cpp index 793527bbd63..9a499e0cc91 100644 --- a/src/function/vector_cast_functions.cpp +++ b/src/function/vector_cast_functions.cpp @@ -59,8 +59,8 @@ static void resolveNestedVector(std::shared_ptr inputVector, ValueV auto inputFieldVectors = StructVector::getFieldVectors(inputVector.get()); auto resultFieldVectors = StructVector::getFieldVectors(resultVector); for (auto i = 0u; i < inputFieldVectors.size(); i++) { - resolveNestedVector( - inputFieldVectors[i], resultFieldVectors[i].get(), numOfEntries, dataPtr); + resolveNestedVector(inputFieldVectors[i], resultFieldVectors[i].get(), numOfEntries, + dataPtr); } return; } else { @@ -69,16 +69,16 @@ static void resolveNestedVector(std::shared_ptr inputVector, ValueV } // non-nested types - scalar_func_exec_t func = CastFunction::bindCastFunction( - "CAST", inputType->getLogicalTypeID(), resultType->getLogicalTypeID()) + scalar_func_exec_t func = CastFunction::bindCastFunction("CAST", + inputType->getLogicalTypeID(), resultType->getLogicalTypeID()) ->execFunc; std::vector> childParams{inputVector}; dataPtr->numOfEntries = numOfEntries; func(childParams, *resultVector, (void*)dataPtr); } -static void nestedTypesCastExecFunction( - const std::vector>& params, ValueVector& result, void* dataPtr) { +static void nestedTypesCastExecFunction(const std::vector>& params, + ValueVector& result, void* dataPtr) { KU_ASSERT(params.size() == 1); result.resetAuxiliaryBuffer(); const auto& inputVector = params[0]; @@ -94,8 +94,8 @@ static void nestedTypesCastExecFunction( auto numOfEntries = inputVector->state->selVector ->selectedPositions[inputVector->state->selVector->selectedSize - 1] + 1; - resolveNestedVector( - inputVector, &result, numOfEntries, reinterpret_cast(dataPtr)); + resolveNestedVector(inputVector, &result, numOfEntries, + reinterpret_cast(dataPtr)); } bool CastFunction::hasImplicitCast(const LogicalType& srcType, const LogicalType& dstType) { @@ -104,8 +104,8 @@ bool CastFunction::hasImplicitCast(const LogicalType& srcType, const LogicalType dstType.getLogicalTypeID() == LogicalTypeID::LIST) { return false; } - if (BuiltInFunctionsUtils::getCastCost( - srcType.getLogicalTypeID(), dstType.getLogicalTypeID()) != UNDEFINED_CAST_COST) { + if (BuiltInFunctionsUtils::getCastCost(srcType.getLogicalTypeID(), + dstType.getLogicalTypeID()) != UNDEFINED_CAST_COST) { return true; } // TODO(Jiamin): there are still other special cases @@ -117,8 +117,8 @@ bool CastFunction::hasImplicitCast(const LogicalType& srcType, const LogicalType } template -static std::unique_ptr bindCastFromStringFunction( - const std::string& functionName, LogicalTypeID targetTypeID) { +static std::unique_ptr bindCastFromStringFunction(const std::string& functionName, + LogicalTypeID targetTypeID) { scalar_func_exec_t execFunc; switch (targetTypeID) { case LogicalTypeID::DATE: { @@ -235,8 +235,8 @@ static std::unique_ptr bindCastFromStringFunction( throw ConversionException{stringFormat("Unsupported casting function from STRING to {}.", LogicalTypeUtils::toString(targetTypeID))}; } - return std::make_unique( - functionName, std::vector{LogicalTypeID::STRING}, targetTypeID, execFunc); + return std::make_unique(functionName, + std::vector{LogicalTypeID::STRING}, targetTypeID, execFunc); } static std::unique_ptr bindCastFromRdfVariantFunction( @@ -324,8 +324,8 @@ static std::unique_ptr bindCastFromRdfVariantFunction( } template -static std::unique_ptr bindCastToStringFunction( - const std::string& functionName, LogicalTypeID sourceTypeID) { +static std::unique_ptr bindCastToStringFunction(const std::string& functionName, + LogicalTypeID sourceTypeID) { scalar_func_exec_t func; switch (sourceTypeID) { case LogicalTypeID::BOOL: { @@ -432,12 +432,12 @@ static std::unique_ptr bindCastToStringFunction( default: KU_UNREACHABLE; } - return std::make_unique( - functionName, std::vector{sourceTypeID}, LogicalTypeID::STRING, func); + return std::make_unique(functionName, std::vector{sourceTypeID}, + LogicalTypeID::STRING, func); } -static std::unique_ptr bindCastToRdfVariantFunction( - const std::string& functionName, LogicalTypeID sourceTypeID) { +static std::unique_ptr bindCastToRdfVariantFunction(const std::string& functionName, + LogicalTypeID sourceTypeID) { scalar_func_exec_t execFunc; switch (sourceTypeID) { case LogicalTypeID::DATE: { @@ -520,8 +520,8 @@ static std::unique_ptr bindCastToRdfVariantFunction( } template -static std::unique_ptr bindCastToNumericFunction( - const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { +static std::unique_ptr bindCastToNumericFunction(const std::string& functionName, + LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { scalar_func_exec_t func; switch (sourceTypeID) { case LogicalTypeID::INT8: { @@ -562,13 +562,13 @@ static std::unique_ptr bindCastToNumericFunction( throw ConversionException{stringFormat("Unsupported casting function from {} to {}.", LogicalTypeUtils::toString(sourceTypeID), LogicalTypeUtils::toString(targetTypeID))}; } - return std::make_unique( - functionName, std::vector{sourceTypeID}, targetTypeID, func); + return std::make_unique(functionName, std::vector{sourceTypeID}, + targetTypeID, func); } template -static std::unique_ptr bindCastBetweenNested( - const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { +static std::unique_ptr bindCastBetweenNested(const std::string& functionName, + LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { switch (sourceTypeID) { case LogicalTypeID::LIST: case LogicalTypeID::MAP: @@ -587,8 +587,8 @@ static std::unique_ptr bindCastBetweenNested( } template -static std::unique_ptr bindCastToTimestampFunction( - const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID dstTypeID) { +static std::unique_ptr bindCastToTimestampFunction(const std::string& functionName, + LogicalTypeID sourceTypeID, LogicalTypeID dstTypeID) { scalar_func_exec_t func; switch (sourceTypeID) { case LogicalTypeID::DATE: { @@ -615,13 +615,13 @@ static std::unique_ptr bindCastToTimestampFunction( throw ConversionException{stringFormat("Unsupported casting function from {} to {}.", LogicalTypeUtils::toString(sourceTypeID), LogicalTypeUtils::toString(dstTypeID))}; } - return std::make_unique( - functionName, std::vector{sourceTypeID}, LogicalTypeID::TIMESTAMP, func); + return std::make_unique(functionName, std::vector{sourceTypeID}, + LogicalTypeID::TIMESTAMP, func); } template -std::unique_ptr CastFunction::bindCastFunction( - const std::string& functionName, LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { +std::unique_ptr CastFunction::bindCastFunction(const std::string& functionName, + LogicalTypeID sourceTypeID, LogicalTypeID targetTypeID) { if (sourceTypeID == LogicalTypeID::STRING) { return bindCastFromStringFunction(functionName, targetTypeID); } @@ -636,69 +636,69 @@ std::unique_ptr CastFunction::bindCastFunction( return bindCastToRdfVariantFunction(functionName, sourceTypeID); } case LogicalTypeID::DOUBLE: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::FLOAT: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::INT128: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, + sourceTypeID, targetTypeID); } case LogicalTypeID::SERIAL: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, + sourceTypeID, targetTypeID); } case LogicalTypeID::INT64: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::INT32: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::INT16: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::INT8: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::UINT64: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, + sourceTypeID, targetTypeID); } case LogicalTypeID::UINT32: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, + sourceTypeID, targetTypeID); } case LogicalTypeID::UINT16: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, + sourceTypeID, targetTypeID); } case LogicalTypeID::UINT8: { - return bindCastToNumericFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToNumericFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::TIMESTAMP_NS: { - return bindCastToTimestampFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToTimestampFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::TIMESTAMP_MS: { - return bindCastToTimestampFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToTimestampFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::TIMESTAMP_SEC: { - return bindCastToTimestampFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToTimestampFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::TIMESTAMP_TZ: case LogicalTypeID::TIMESTAMP: { - return bindCastToTimestampFunction( - functionName, sourceTypeID, targetTypeID); + return bindCastToTimestampFunction(functionName, sourceTypeID, + targetTypeID); } case LogicalTypeID::LIST: case LogicalTypeID::ARRAY: @@ -916,8 +916,8 @@ function_set CastToUInt8Function::getFunctionSet() { return result; } -static std::unique_ptr castBindFunc( - const binder::expression_vector& arguments, Function* function) { +static std::unique_ptr castBindFunc(const binder::expression_vector& arguments, + Function* function) { KU_ASSERT(arguments.size() == 2); // Bind target type. if (arguments[1]->expressionType != ExpressionType::LITERAL) { diff --git a/src/function/vector_date_functions.cpp b/src/function/vector_date_functions.cpp index 1b8397521c2..2af8e16874f 100644 --- a/src/function/vector_date_functions.cpp +++ b/src/function/vector_date_functions.cpp @@ -86,8 +86,8 @@ function_set LeastFunction::getFunctionSet() { function_set MakeDateFunction::getFunctionSet() { function_set result; result.push_back(make_unique(name, - std::vector{ - LogicalTypeID::INT64, LogicalTypeID::INT64, LogicalTypeID::INT64}, + std::vector{LogicalTypeID::INT64, LogicalTypeID::INT64, + LogicalTypeID::INT64}, LogicalTypeID::DATE, ScalarFunction::TernaryExecFunction)); return result; diff --git a/src/function/vector_hash_functions.cpp b/src/function/vector_hash_functions.cpp index b4167363c86..6796bd861d6 100644 --- a/src/function/vector_hash_functions.cpp +++ b/src/function/vector_hash_functions.cpp @@ -20,8 +20,8 @@ static std::unique_ptr computeDataVecHash(ValueVector* operand) { selectionState->selVector->selectedPositions[i] = numValuesComputed; numValuesComputed++; } - VectorHashFunction::computeHash( - ListVector::getDataVector(operand), ListVector::getDataVector(hashVector.get())); + VectorHashFunction::computeHash(ListVector::getDataVector(operand), + ListVector::getDataVector(hashVector.get())); } return hashVector; } @@ -61,8 +61,8 @@ static void computeStructVecHash(ValueVector* operand, ValueVector* result) { *StructVector::getFieldVector(operand, 3), *result); } break; case LogicalTypeID::STRUCT: { - VectorHashFunction::computeHash( - StructVector::getFieldVector(operand, 0 /* idx */).get(), result); + VectorHashFunction::computeHash(StructVector::getFieldVector(operand, 0 /* idx */).get(), + result); auto tmpHashVector = std::make_unique(LogicalTypeID::INT64); for (auto i = 1u; i < StructType::getNumFields(&operand->dataType); i++) { auto fieldVector = StructVector::getFieldVector(operand, i); diff --git a/src/function/vector_list_functions.cpp b/src/function/vector_list_functions.cpp index daf554432e5..87792daf3a2 100644 --- a/src/function/vector_list_functions.cpp +++ b/src/function/vector_list_functions.cpp @@ -220,8 +220,8 @@ static std::unique_ptr bindFuncListAggr( return std::make_unique(resultType->copy()); } -static std::string getListFunctionIncompatibleChildrenTypeErrorMsg( - const std::string& functionName, const LogicalType& left, const LogicalType& right) { +static std::string getListFunctionIncompatibleChildrenTypeErrorMsg(const std::string& functionName, + const LogicalType& left, const LogicalType& right) { return std::string("Cannot bind " + functionName + " with parameter type " + left.toString() + " and " + right.toString() + "."); } @@ -276,8 +276,8 @@ LogicalType ListCreationFunction::getChildType(const binder::expression_vector& if (parameterType.getLogicalTypeID() == LogicalTypeID::ANY) { argument->cast(childType); } else { - throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( - name, arguments[0]->getDataType(), argument->getDataType())); + throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg(name, + arguments[0]->getDataType(), argument->getDataType())); } } } @@ -335,8 +335,8 @@ template>& params, ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(params.size() == 2); - BinaryFunctionExecutor::executeListExtract( - *params[0], *params[1], result); + BinaryFunctionExecutor::executeListExtract(*params[0], + *params[1], result); } static std::unique_ptr ListExtractBindFunc( @@ -438,8 +438,8 @@ function_set ListExtractFunction::getFunctionSet() { std::unique_ptr ListConcatFunction::bindFunc( const binder::expression_vector& arguments, Function* /*function*/) { if (arguments[0]->getDataType() != arguments[1]->getDataType()) { - throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg( - name, arguments[0]->getDataType(), arguments[1]->getDataType())); + throw BinderException(getListFunctionIncompatibleChildrenTypeErrorMsg(name, + arguments[0]->getDataType(), arguments[1]->getDataType())); } return std::make_unique(arguments[0]->getDataType().copy()); } @@ -543,8 +543,8 @@ function_set ListSliceFunction::getFunctionSet() { ListSlice>, nullptr, ListSliceBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::INT64}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64, + LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::TernaryExecListStructFunction, @@ -553,8 +553,8 @@ function_set ListSliceFunction::getFunctionSet() { } template -static void getListSortExecFunction( - const binder::expression_vector& arguments, scalar_func_exec_t& func) { +static void getListSortExecFunction(const binder::expression_vector& arguments, + scalar_func_exec_t& func) { if (arguments.size() == 1) { func = ScalarFunction::UnaryExecNestedTypeFunction>; return; @@ -652,15 +652,15 @@ function_set ListSortFunction::getFunctionSet() { std::vector{LogicalTypeID::LIST, LogicalTypeID::STRING}, LogicalTypeID::LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); result.push_back(std::make_unique(name, - std::vector{ - LogicalTypeID::LIST, LogicalTypeID::STRING, LogicalTypeID::STRING}, + std::vector{LogicalTypeID::LIST, LogicalTypeID::STRING, + LogicalTypeID::STRING}, LogicalTypeID::LIST, nullptr, nullptr, ListSortBindFunc, false /* isVarlength*/)); return result; } template -static void getListReverseSortExecFunction( - const binder::expression_vector& arguments, scalar_func_exec_t& func) { +static void getListReverseSortExecFunction(const binder::expression_vector& arguments, + scalar_func_exec_t& func) { if (arguments.size() == 1) { func = ScalarFunction::UnaryExecNestedTypeFunction>; diff --git a/src/function/vector_map_functions.cpp b/src/function/vector_map_functions.cpp index 05b4e9b6472..60685f70c08 100644 --- a/src/function/vector_map_functions.cpp +++ b/src/function/vector_map_functions.cpp @@ -126,8 +126,8 @@ function_set MapExtractFunctions::getFunctionSet() { return functionSet; } -static std::unique_ptr MapKeysBindFunc( - const binder::expression_vector& arguments, kuzu::function::Function* /*function*/) { +static std::unique_ptr MapKeysBindFunc(const binder::expression_vector& arguments, + kuzu::function::Function* /*function*/) { return std::make_unique(LogicalType::LIST( std::make_unique(*MapType::getKeyType(&arguments[0]->dataType)))); } diff --git a/src/function/vector_path_functions.cpp b/src/function/vector_path_functions.cpp index a3eec3f9655..dfa202f759e 100644 --- a/src/function/vector_path_functions.cpp +++ b/src/function/vector_path_functions.cpp @@ -13,8 +13,8 @@ using namespace kuzu::common; namespace kuzu { namespace function { -static std::unique_ptr NodesBindFunc( - const binder::expression_vector& arguments, Function* /*function*/) { +static std::unique_ptr NodesBindFunc(const binder::expression_vector& arguments, + Function* /*function*/) { auto structType = arguments[0]->getDataType(); auto fieldIdx = StructType::getFieldIdx(&structType, InternalKeyword::NODES); return std::make_unique( @@ -29,8 +29,8 @@ function_set NodesFunction::getFunctionSet() { return functionSet; } -static std::unique_ptr RelsBindFunc( - const binder::expression_vector& arguments, Function* /*function*/) { +static std::unique_ptr RelsBindFunc(const binder::expression_vector& arguments, + Function* /*function*/) { auto structType = arguments[0]->getDataType(); auto fieldIdx = StructType::getFieldIdx(&structType, InternalKeyword::RELS); return std::make_unique( @@ -75,8 +75,8 @@ static void PropertiesCompileFunc(FunctionBindData* bindData, std::shared_ptr& result) { KU_ASSERT(parameters[0]->dataType.getPhysicalType() == PhysicalTypeID::LIST); auto propertiesBindData = reinterpret_cast(bindData); - auto fieldVector = StructVector::getFieldVector( - ListVector::getDataVector(parameters[0].get()), propertiesBindData->childIdx); + auto fieldVector = StructVector::getFieldVector(ListVector::getDataVector(parameters[0].get()), + propertiesBindData->childIdx); ListVector::setDataVector(result.get(), fieldVector); } @@ -122,8 +122,8 @@ static void IsTrailExecFunc(const std::vector>& par UnaryPathExecutor::executeRelIDs(*parameters[0], result); } -static bool IsTrailSelectFunc( - const std::vector>& parameters, SelectionVector& selectionVector) { +static bool IsTrailSelectFunc(const std::vector>& parameters, + SelectionVector& selectionVector) { return UnaryPathExecutor::selectRelIDs(*parameters[0], selectionVector); } @@ -140,8 +140,8 @@ static void IsACyclicExecFunc(const std::vector>& p UnaryPathExecutor::executeNodeIDs(*parameters[0], result); } -static bool IsACyclicSelectFunc( - const std::vector>& parameters, SelectionVector& selectionVector) { +static bool IsACyclicSelectFunc(const std::vector>& parameters, + SelectionVector& selectionVector) { return UnaryPathExecutor::selectNodeIDs(*parameters[0], selectionVector); } diff --git a/src/function/vector_string_functions.cpp b/src/function/vector_string_functions.cpp index cdf07f9e81d..5c48e904244 100644 --- a/src/function/vector_string_functions.cpp +++ b/src/function/vector_string_functions.cpp @@ -23,8 +23,8 @@ using namespace kuzu::common; namespace kuzu { namespace function { -void BaseLowerUpperFunction::operation( - ku_string_t& input, ku_string_t& result, ValueVector& resultValueVector, bool isUpper) { +void BaseLowerUpperFunction::operation(ku_string_t& input, ku_string_t& result, + ValueVector& resultValueVector, bool isUpper) { uint32_t resultLen = getResultLen((char*)input.getData(), input.len, isUpper); result.len = resultLen; if (resultLen <= ku_string_t::SHORT_STR_LENGTH) { @@ -52,8 +52,8 @@ void BaseStrOperation::operation(ku_string_t& input, ku_string_t& result, } } -void Repeat::operation( - ku_string_t& left, int64_t& right, ku_string_t& result, ValueVector& resultValueVector) { +void Repeat::operation(ku_string_t& left, int64_t& right, ku_string_t& result, + ValueVector& resultValueVector) { result.len = left.len * right; if (result.len <= ku_string_t::SHORT_STR_LENGTH) { repeatStr((char*)result.prefix, left.getAsString(), right); @@ -84,8 +84,8 @@ void Reverse::operation(ku_string_t& input, ku_string_t& result, ValueVector& re auto resultBuffer = result.len <= ku_string_t::SHORT_STR_LENGTH ? reinterpret_cast(result.prefix) : reinterpret_cast(result.overflowPtr); - utf8proc::utf8proc_grapheme_callback( - inputStr.c_str(), input.len, [&](size_t start, size_t end) { + utf8proc::utf8proc_grapheme_callback(inputStr.c_str(), input.len, + [&](size_t start, size_t end) { memcpy(resultBuffer + input.len - end, input.getData() + start, end - start); return true; }); @@ -182,8 +182,8 @@ function_set LeftFunction::getFunctionSet() { function_set LpadFunction::getFunctionSet() { function_set functionSet; functionSet.emplace_back(make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::STRING}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64, + LogicalTypeID::STRING}, LogicalTypeID::STRING, ScalarFunction::TernaryStringExecFunction, @@ -214,8 +214,8 @@ function_set RightFunction::getFunctionSet() { function_set RpadFunction::getFunctionSet() { function_set functionSet; functionSet.emplace_back(make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::STRING}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64, + LogicalTypeID::STRING}, LogicalTypeID::STRING, ScalarFunction::TernaryStringExecFunction, @@ -237,8 +237,8 @@ function_set StartsWithFunction::getFunctionSet() { function_set SubStrFunction::getFunctionSet() { function_set functionSet; functionSet.emplace_back(make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::INT64, LogicalTypeID::INT64}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::INT64, + LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::TernaryStringExecFunction, @@ -273,8 +273,8 @@ function_set RegexpReplaceFunction::getFunctionSet() { // Todo: Implement a function with modifiers // regexp_replace(string, regex, replacement, modifiers) functionSet.emplace_back(make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::STRING}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING, + LogicalTypeID::STRING}, LogicalTypeID::STRING, ScalarFunction::TernaryStringExecFunction, @@ -291,8 +291,8 @@ function_set RegexpExtractFunction::getFunctionSet() { RegexpExtract>, false /* isVarLength */)); functionSet.emplace_back(make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::INT64}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING, + LogicalTypeID::INT64}, LogicalTypeID::STRING, ScalarFunction::TernaryStringExecFunction, @@ -309,8 +309,8 @@ function_set RegexpExtractAllFunction::getFunctionSet() { RegexpExtractAll>, nullptr, bindFunc, false /* isVarLength */)); functionSet.emplace_back(make_unique(name, - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::STRING, LogicalTypeID::INT64}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::STRING, + LogicalTypeID::INT64}, LogicalTypeID::LIST, ScalarFunction::TernaryStringExecFunction, diff --git a/src/function/vector_struct_functions.cpp b/src/function/vector_struct_functions.cpp index a778df7fb37..0bb000f26a0 100644 --- a/src/function/vector_struct_functions.cpp +++ b/src/function/vector_struct_functions.cpp @@ -38,8 +38,8 @@ void StructPackFunctions::compileFunc(FunctionBindData* /*bindData*/, } } -static void copyParameterValueToStructFieldVector( - const ValueVector* parameter, ValueVector* structField, DataChunkState* structVectorState) { +static void copyParameterValueToStructFieldVector(const ValueVector* parameter, + ValueVector* structField, DataChunkState* structVectorState) { // If the parameter is unFlat, then its state must be consistent with the result's state. // Thus, we don't need to copy values to structFieldVector. KU_ASSERT(parameter->state->isFlat()); @@ -64,8 +64,8 @@ void StructPackFunctions::execFunc(const std::vector UnionValueBindFunc( KU_ASSERT(arguments.size() == 1); std::vector fields; // TODO(Ziy): Use UINT8 to represent tag value. - fields.emplace_back( - UnionType::TAG_FIELD_NAME, std::make_unique(UnionType::TAG_FIELD_TYPE)); + fields.emplace_back(UnionType::TAG_FIELD_NAME, + std::make_unique(UnionType::TAG_FIELD_TYPE)); if (arguments[0]->getDataType().getLogicalTypeID() == common::LogicalTypeID::ANY) { arguments[0]->cast(*LogicalType::STRING()); } diff --git a/src/include/binder/binder.h b/src/include/binder/binder.h index e378c661b0f..4e8c6ab7f52 100644 --- a/src/include/binder/binder.h +++ b/src/include/binder/binder.h @@ -55,8 +55,8 @@ class Binder { public: explicit Binder(main::ClientContext* clientContext) - : lastExpressionId{0}, scope{}, expressionBinder{this, clientContext}, clientContext{ - clientContext} {} + : lastExpressionId{0}, scope{}, expressionBinder{this, clientContext}, + clientContext{clientContext} {} std::unique_ptr bind(const parser::Statement& statement); @@ -80,10 +80,10 @@ class Binder { common::table_id_t bindTableID(const std::string& tableName) const; std::shared_ptr createVariable(std::string_view name, common::LogicalTypeID typeID); - std::shared_ptr createVariable( - const std::string& name, common::LogicalTypeID typeID); - std::shared_ptr createVariable( - const std::string& name, const common::LogicalType& dataType); + std::shared_ptr createVariable(const std::string& name, + common::LogicalTypeID typeID); + std::shared_ptr createVariable(const std::string& name, + const common::LogicalType& dataType); /*** bind DDL ***/ BoundCreateTableInfo bindCreateTableInfo(const parser::CreateTableInfo* info); @@ -105,12 +105,12 @@ class Binder { /*** bind copy ***/ std::unique_ptr bindCopyFromClause(const parser::Statement& statement); - std::unique_ptr bindCopyNodeFrom( - const parser::Statement& statement, catalog::NodeTableCatalogEntry* nodeTableEntry); - std::unique_ptr bindCopyRelFrom( - const parser::Statement& statement, catalog::RelTableCatalogEntry* relTableEntry); - std::unique_ptr bindCopyRdfFrom( - const parser::Statement& statement, catalog::RDFGraphCatalogEntry* rdfGraphEntry); + std::unique_ptr bindCopyNodeFrom(const parser::Statement& statement, + catalog::NodeTableCatalogEntry* nodeTableEntry); + std::unique_ptr bindCopyRelFrom(const parser::Statement& statement, + catalog::RelTableCatalogEntry* relTableEntry); + std::unique_ptr bindCopyRdfFrom(const parser::Statement& statement, + catalog::RDFGraphCatalogEntry* rdfGraphEntry); std::unique_ptr bindCopyToClause(const parser::Statement& statement); @@ -184,8 +184,8 @@ class Binder { const std::unordered_map>& propertyRhsExpr, const std::vector& properties); - BoundSetPropertyInfo bindSetPropertyInfo( - parser::ParsedExpression* lhs, parser::ParsedExpression* rhs); + BoundSetPropertyInfo bindSetPropertyInfo(parser::ParsedExpression* lhs, + parser::ParsedExpression* rhs); expression_pair bindSetItem(parser::ParsedExpression* lhs, parser::ParsedExpression* rhs); /*** bind projection clause ***/ @@ -207,8 +207,8 @@ class Binder { BoundGraphPattern bindGraphPattern(const std::vector& graphPattern); QueryGraph bindPatternElement(const parser::PatternElement& patternElement); - std::shared_ptr createPath( - const std::string& pathName, const expression_vector& children); + std::shared_ptr createPath(const std::string& pathName, + const expression_vector& children); std::shared_ptr bindQueryRel(const parser::RelPattern& relPattern, const std::shared_ptr& leftNode, @@ -222,18 +222,18 @@ class Binder { std::pair bindVariableLengthRelBound(const parser::RelPattern& relPattern); void bindQueryRelProperties(RelExpression& rel); - std::shared_ptr bindQueryNode( - const parser::NodePattern& nodePattern, QueryGraph& queryGraph); + std::shared_ptr bindQueryNode(const parser::NodePattern& nodePattern, + QueryGraph& queryGraph); std::shared_ptr createQueryNode(const parser::NodePattern& nodePattern); - std::shared_ptr createQueryNode( - const std::string& parsedName, const std::vector& tableIDs); + std::shared_ptr createQueryNode(const std::string& parsedName, + const std::vector& tableIDs); void bindQueryNodeProperties(NodeExpression& node); /*** bind table ID ***/ // Bind table names to catalog table schemas. The function does NOT validate if the table schema // type matches node or rel pattern. - std::vector bindTableIDs( - const std::vector& tableNames, bool nodePattern); + std::vector bindTableIDs(const std::vector& tableNames, + bool nodePattern); std::vector getNodeTableIDs( const std::vector& tableIDs); std::vector getNodeTableIDs(common::table_id_t tableID); @@ -261,8 +261,8 @@ class Binder { BinderScope saveScope(); void restoreScope(BinderScope prevScope); - function::TableFunction getScanFunction( - common::FileType fileType, const common::ReaderConfig& config); + function::TableFunction getScanFunction(common::FileType fileType, + const common::ReaderConfig& config); private: uint32_t lastExpressionId; diff --git a/src/include/binder/bound_create_macro.h b/src/include/binder/bound_create_macro.h index 3e6bedd63c3..2acd3d1a684 100644 --- a/src/include/binder/bound_create_macro.h +++ b/src/include/binder/bound_create_macro.h @@ -8,8 +8,8 @@ namespace binder { class BoundCreateMacro : public BoundStatement { public: - explicit BoundCreateMacro( - std::string macroName, std::unique_ptr macro) + explicit BoundCreateMacro(std::string macroName, + std::unique_ptr macro) : BoundStatement{common::StatementType::CREATE_MACRO, BoundStatementResult::createSingleStringColumnResult("result" /* columnName */)}, macroName{std::move(macroName)}, macro{std::move(macro)} {} diff --git a/src/include/binder/bound_explain.h b/src/include/binder/bound_explain.h index fa0d78c2535..0db6ab5dffd 100644 --- a/src/include/binder/bound_explain.h +++ b/src/include/binder/bound_explain.h @@ -8,8 +8,8 @@ namespace binder { class BoundExplain : public BoundStatement { public: - explicit BoundExplain( - std::unique_ptr statementToExplain, common::ExplainType explainType) + explicit BoundExplain(std::unique_ptr statementToExplain, + common::ExplainType explainType) : BoundStatement{common::StatementType::EXPLAIN, BoundStatementResult::createSingleStringColumnResult( "explain result" /* columnName */)}, diff --git a/src/include/binder/copy/bound_copy_from.h b/src/include/binder/copy/bound_copy_from.h index 84d9ef337d7..bbf79a3ae70 100644 --- a/src/include/binder/copy/bound_copy_from.h +++ b/src/include/binder/copy/bound_copy_from.h @@ -24,8 +24,8 @@ struct BoundCopyFromInfo { BoundCopyFromInfo(catalog::TableCatalogEntry* tableEntry, std::unique_ptr source, std::shared_ptr offset, std::unique_ptr extraInfo) - : tableEntry{tableEntry}, source{std::move(source)}, offset{offset}, extraInfo{std::move( - extraInfo)} {} + : tableEntry{tableEntry}, source{std::move(source)}, offset{offset}, + extraInfo{std::move(extraInfo)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundCopyFromInfo); private: diff --git a/src/include/binder/ddl/bound_alter_info.h b/src/include/binder/ddl/bound_alter_info.h index a6c7d6c965e..9fa5515af97 100644 --- a/src/include/binder/ddl/bound_alter_info.h +++ b/src/include/binder/ddl/bound_alter_info.h @@ -51,8 +51,8 @@ struct BoundExtraAddPropertyInfo : public BoundExtraAlterInfo { : propertyName{std::move(propertyName)}, dataType{std::move(dataType)}, defaultValue{std::move(defaultValue)} {} BoundExtraAddPropertyInfo(const BoundExtraAddPropertyInfo& other) - : propertyName{other.propertyName}, dataType{other.dataType}, defaultValue{ - other.defaultValue} {} + : propertyName{other.propertyName}, dataType{other.dataType}, + defaultValue{other.defaultValue} {} inline std::unique_ptr copy() const final { return std::make_unique(*this); diff --git a/src/include/binder/ddl/bound_create_table_info.h b/src/include/binder/ddl/bound_create_table_info.h index 1db69672bd8..197d9f5faca 100644 --- a/src/include/binder/ddl/bound_create_table_info.h +++ b/src/include/binder/ddl/bound_create_table_info.h @@ -60,12 +60,12 @@ struct BoundExtraCreateTableInfo : public BoundExtraCreateCatalogEntryInfo { struct BoundExtraCreateNodeTableInfo final : public BoundExtraCreateTableInfo { common::property_id_t primaryKeyIdx; - BoundExtraCreateNodeTableInfo( - common::property_id_t primaryKeyIdx, std::vector propertyInfos) + BoundExtraCreateNodeTableInfo(common::property_id_t primaryKeyIdx, + std::vector propertyInfos) : BoundExtraCreateTableInfo{std::move(propertyInfos)}, primaryKeyIdx{primaryKeyIdx} {} BoundExtraCreateNodeTableInfo(const BoundExtraCreateNodeTableInfo& other) - : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, primaryKeyIdx{ - other.primaryKeyIdx} {} + : BoundExtraCreateTableInfo{copyVector(other.propertyInfos)}, + primaryKeyIdx{other.primaryKeyIdx} {} std::unique_ptr copy() const override { return std::make_unique(*this); @@ -116,8 +116,8 @@ struct BoundExtraCreateRdfGraphInfo final : public BoundExtraCreateCatalogEntryI BoundCreateTableInfo literalInfo, BoundCreateTableInfo resourceTripleInfo, BoundCreateTableInfo literalTripleInfo) : resourceInfo{std::move(resourceInfo)}, literalInfo{std::move(literalInfo)}, - resourceTripleInfo{std::move(resourceTripleInfo)}, literalTripleInfo{ - std::move(literalTripleInfo)} {} + resourceTripleInfo{std::move(resourceTripleInfo)}, + literalTripleInfo{std::move(literalTripleInfo)} {} BoundExtraCreateRdfGraphInfo(const BoundExtraCreateRdfGraphInfo& other) : resourceInfo{other.resourceInfo.copy()}, literalInfo{other.literalInfo.copy()}, resourceTripleInfo{other.resourceTripleInfo.copy()}, diff --git a/src/include/binder/expression/case_expression.h b/src/include/binder/expression/case_expression.h index 39a6648bffd..33f8b2c40f9 100644 --- a/src/include/binder/expression/case_expression.h +++ b/src/include/binder/expression/case_expression.h @@ -9,8 +9,8 @@ struct CaseAlternative { std::shared_ptr whenExpression; std::shared_ptr thenExpression; - CaseAlternative( - std::shared_ptr whenExpression, std::shared_ptr thenExpression) + CaseAlternative(std::shared_ptr whenExpression, + std::shared_ptr thenExpression) : whenExpression{std::move(whenExpression)}, thenExpression{std::move(thenExpression)} {} }; @@ -21,8 +21,8 @@ class CaseExpression : public Expression { : Expression{common::ExpressionType::CASE_ELSE, std::move(dataType), name}, elseExpression{std::move(elseExpression)} {} - inline void addCaseAlternative( - std::shared_ptr when, std::shared_ptr then) { + inline void addCaseAlternative(std::shared_ptr when, + std::shared_ptr then) { caseAlternatives.push_back(make_unique(std::move(when), std::move(then))); } inline size_t getNumCaseAlternatives() const { return caseAlternatives.size(); } diff --git a/src/include/binder/expression/expression.h b/src/include/binder/expression/expression.h index 3275f0be250..a8fc4a27111 100644 --- a/src/include/binder/expression/expression.h +++ b/src/include/binder/expression/expression.h @@ -46,10 +46,10 @@ class Expression : public std::enable_shared_from_this { : Expression{expressionType, std::move(dataType), expression_vector{child}, std::move(uniqueName)} {} // Create leaf expression - Expression( - common::ExpressionType expressionType, common::LogicalType dataType, std::string uniqueName) - : Expression{ - expressionType, std::move(dataType), expression_vector{}, std::move(uniqueName)} {} + Expression(common::ExpressionType expressionType, common::LogicalType dataType, + std::string uniqueName) + : Expression{expressionType, std::move(dataType), expression_vector{}, + std::move(uniqueName)} {} DELETE_COPY_DEFAULT_MOVE(Expression); virtual ~Expression() = default; @@ -108,8 +108,8 @@ struct ExpressionHasher { }; struct ExpressionEquality { - bool operator()( - const std::shared_ptr& left, const std::shared_ptr& right) const { + bool operator()(const std::shared_ptr& left, + const std::shared_ptr& right) const { return left->getUniqueName() == right->getUniqueName(); } }; diff --git a/src/include/binder/expression/expression_util.h b/src/include/binder/expression/expression_util.h index 3060f771538..b692875d8b9 100644 --- a/src/include/binder/expression/expression_util.h +++ b/src/include/binder/expression/expression_util.h @@ -6,10 +6,10 @@ namespace kuzu { namespace binder { struct ExpressionUtil { - static bool isExpressionsWithDataType( - const expression_vector& expressions, common::LogicalTypeID dataTypeID); - static expression_vector getExpressionsWithDataType( - const expression_vector& expressions, common::LogicalTypeID dataTypeID); + static bool isExpressionsWithDataType(const expression_vector& expressions, + common::LogicalTypeID dataTypeID); + static expression_vector getExpressionsWithDataType(const expression_vector& expressions, + common::LogicalTypeID dataTypeID); static uint32_t find(Expression* target, expression_vector expressions); @@ -20,10 +20,10 @@ struct ExpressionUtil { // Print as a1=a2 static std::string toString(const expression_pair& expressionPair); - static expression_vector excludeExpression( - const expression_vector& exprs, const Expression& exprToExclude); - static expression_vector excludeExpressions( - const expression_vector& expressions, const expression_vector& expressionsToExclude); + static expression_vector excludeExpression(const expression_vector& exprs, + const Expression& exprToExclude); + static expression_vector excludeExpressions(const expression_vector& expressions, + const expression_vector& expressionsToExclude); static common::logical_type_vec_t getDataTypes(const expression_vector& expressions); diff --git a/src/include/binder/expression/function_expression.h b/src/include/binder/expression/function_expression.h index 59d9963093b..909f7291e2a 100644 --- a/src/include/binder/expression/function_expression.h +++ b/src/include/binder/expression/function_expression.h @@ -54,11 +54,11 @@ class ScalarFunctionExpression : public FunctionExpression { function::scalar_func_compile_exec_t compileFunc, const std::string& uniqueName) : FunctionExpression{std::move(functionName), expressionType, std::move(bindData), std::move(children), uniqueName}, - execFunc{std::move(execFunc)}, selectFunc{std::move(selectFunc)}, compileFunc{std::move( - compileFunc)} {} + execFunc{std::move(execFunc)}, selectFunc{std::move(selectFunc)}, + compileFunc{std::move(compileFunc)} {} - static std::string getUniqueName( - const std::string& functionName, const expression_vector& children); + static std::string getUniqueName(const std::string& functionName, + const expression_vector& children); std::string toStringInternal() const final; @@ -85,8 +85,8 @@ class AggregateFunctionExpression : public FunctionExpression { std::move(bindData), std::move(children), uniqueName}, aggregateFunction{std::move(aggregateFunction)} {} - static std::string getUniqueName( - const std::string& functionName, expression_vector& children, bool isDistinct); + static std::string getUniqueName(const std::string& functionName, expression_vector& children, + bool isDistinct); inline bool isDistinct() const { return aggregateFunction->isFunctionDistinct(); } diff --git a/src/include/binder/expression/node_rel_expression.h b/src/include/binder/expression/node_rel_expression.h index 446cdb00485..3ef320aa93a 100644 --- a/src/include/binder/expression/node_rel_expression.h +++ b/src/include/binder/expression/node_rel_expression.h @@ -40,8 +40,8 @@ class NodeOrRelExpression : public Expression { return tableIDs[0]; } - inline void addPropertyExpression( - const std::string& propertyName, std::unique_ptr property) { + inline void addPropertyExpression(const std::string& propertyName, + std::unique_ptr property) { KU_ASSERT(!propertyNameToIdx.contains(propertyName)); propertyNameToIdx.insert({propertyName, propertyExprs.size()}); propertyExprs.push_back(std::move(property)); diff --git a/src/include/binder/expression/parameter_expression.h b/src/include/binder/expression/parameter_expression.h index 1d8c53f81bb..127f8e12e3c 100644 --- a/src/include/binder/expression/parameter_expression.h +++ b/src/include/binder/expression/parameter_expression.h @@ -8,8 +8,8 @@ namespace binder { class ParameterExpression : public Expression { public: - explicit ParameterExpression( - const std::string& parameterName, std::shared_ptr value) + explicit ParameterExpression(const std::string& parameterName, + std::shared_ptr value) : Expression{common::ExpressionType::PARAMETER, common::LogicalType(*value->getDataType()), createUniqueName(parameterName)}, parameterName(parameterName), value{std::move(value)} {} diff --git a/src/include/binder/expression/path_expression.h b/src/include/binder/expression/path_expression.h index c8b334652ac..ee23db3a41a 100644 --- a/src/include/binder/expression/path_expression.h +++ b/src/include/binder/expression/path_expression.h @@ -12,8 +12,8 @@ class PathExpression : public Expression { expression_vector children) : Expression{common::ExpressionType::PATH, std::move(dataType), std::move(children), std::move(uniqueName)}, - variableName{std::move(variableName)}, nodeType{std::move(nodeType)}, relType{std::move( - relType)} {} + variableName{std::move(variableName)}, nodeType{std::move(nodeType)}, + relType{std::move(relType)} {} inline std::string getVariableName() const { return variableName; } inline common::LogicalType* getNodeType() const { return nodeType.get(); } diff --git a/src/include/binder/expression/rel_expression.h b/src/include/binder/expression/rel_expression.h index 4e6155cb3b2..687c9bb44fb 100644 --- a/src/include/binder/expression/rel_expression.h +++ b/src/include/binder/expression/rel_expression.h @@ -49,8 +49,8 @@ struct RdfPredicateInfo { std::vector resourceTableIDs; std::shared_ptr predicateID; - RdfPredicateInfo( - std::vector resourceTableIDs, std::shared_ptr predicateID) + RdfPredicateInfo(std::vector resourceTableIDs, + std::shared_ptr predicateID) : resourceTableIDs{std::move(resourceTableIDs)}, predicateID{std::move(predicateID)} {} DELETE_COPY_DEFAULT_MOVE(RdfPredicateInfo); }; @@ -63,8 +63,8 @@ class RelExpression : public NodeOrRelExpression { common::QueryRelType relType) : NodeOrRelExpression{std::move(dataType), std::move(uniqueName), std::move(variableName), std::move(tableIDs)}, - srcNode{std::move(srcNode)}, dstNode{std::move(dstNode)}, - directionType{directionType}, relType{relType} {} + srcNode{std::move(srcNode)}, dstNode{std::move(dstNode)}, directionType{directionType}, + relType{relType} {} inline bool isRecursive() const { return dataType.getLogicalTypeID() == common::LogicalTypeID::RECURSIVE_REL; diff --git a/src/include/binder/expression/subquery_expression.h b/src/include/binder/expression/subquery_expression.h index eb9fcf6f9c6..9953a9100d6 100644 --- a/src/include/binder/expression/subquery_expression.h +++ b/src/include/binder/expression/subquery_expression.h @@ -14,8 +14,8 @@ class SubqueryExpression : public Expression { SubqueryExpression(common::SubqueryType subqueryType, common::LogicalType dataType, QueryGraphCollection queryGraphCollection, std::string uniqueName, std::string rawName) : Expression{common::ExpressionType::SUBQUERY, std::move(dataType), std::move(uniqueName)}, - subqueryType{subqueryType}, - queryGraphCollection{std::move(queryGraphCollection)}, rawName{std::move(rawName)} {} + subqueryType{subqueryType}, queryGraphCollection{std::move(queryGraphCollection)}, + rawName{std::move(rawName)} {} inline common::SubqueryType getSubqueryType() const { return subqueryType; } diff --git a/src/include/binder/expression/variable_expression.h b/src/include/binder/expression/variable_expression.h index 6d2c6a3d5f3..45b7c5d89b7 100644 --- a/src/include/binder/expression/variable_expression.h +++ b/src/include/binder/expression/variable_expression.h @@ -7,8 +7,8 @@ namespace binder { class VariableExpression : public Expression { public: - VariableExpression( - common::LogicalType dataType, std::string uniqueName, std::string variableName) + VariableExpression(common::LogicalType dataType, std::string uniqueName, + std::string variableName) : Expression{common::ExpressionType::VARIABLE, std::move(dataType), std::move(uniqueName)}, variableName{std::move(variableName)} {} diff --git a/src/include/binder/expression_binder.h b/src/include/binder/expression_binder.h index 0af8d19b701..5f3fa343d7e 100644 --- a/src/include/binder/expression_binder.h +++ b/src/include/binder/expression_binder.h @@ -27,12 +27,12 @@ class ExpressionBinder { std::shared_ptr bindExpression(const parser::ParsedExpression& parsedExpression); /****** validation *****/ - static void validateExpectedDataType( - const Expression& expression, common::LogicalTypeID target) { + static void validateExpectedDataType(const Expression& expression, + common::LogicalTypeID target) { validateExpectedDataType(expression, std::vector{target}); } - static void validateExpectedDataType( - const Expression& expression, const std::vector& targets); + static void validateExpectedDataType(const Expression& expression, + const std::vector& targets); // Validate data type. static void validateDataType(const Expression& expr, const common::LogicalType& expectedType); // Validate recursive data type top level (used when child type is unknown). @@ -44,17 +44,17 @@ class ExpressionBinder { // Boolean expressions. std::shared_ptr bindBooleanExpression( const parser::ParsedExpression& parsedExpression); - std::shared_ptr bindBooleanExpression( - common::ExpressionType expressionType, const expression_vector& children); + std::shared_ptr bindBooleanExpression(common::ExpressionType expressionType, + const expression_vector& children); std::shared_ptr combineBooleanExpressions(common::ExpressionType expressionType, std::shared_ptr left, std::shared_ptr right); // Comparison expressions. std::shared_ptr bindComparisonExpression( const parser::ParsedExpression& parsedExpression); - std::shared_ptr bindComparisonExpression( - common::ExpressionType expressionType, const expression_vector& children); - std::shared_ptr createEqualityComparisonExpression( - std::shared_ptr left, std::shared_ptr right); + std::shared_ptr bindComparisonExpression(common::ExpressionType expressionType, + const expression_vector& children); + std::shared_ptr createEqualityComparisonExpression(std::shared_ptr left, + std::shared_ptr right); // Null operator expressions. std::shared_ptr bindNullOperatorExpression( const parser::ParsedExpression& parsedExpression); @@ -64,18 +64,18 @@ class ExpressionBinder { expression_vector bindStructPropertyStarExpression(const std::shared_ptr& child); std::shared_ptr bindPropertyExpression( const parser::ParsedExpression& parsedExpression); - std::shared_ptr bindNodeOrRelPropertyExpression( - const Expression& child, const std::string& propertyName); - std::shared_ptr bindStructPropertyExpression( - std::shared_ptr child, const std::string& propertyName); + std::shared_ptr bindNodeOrRelPropertyExpression(const Expression& child, + const std::string& propertyName); + std::shared_ptr bindStructPropertyExpression(std::shared_ptr child, + const std::string& propertyName); // Function expressions. std::shared_ptr bindFunctionExpression( const parser::ParsedExpression& parsedExpression); std::shared_ptr bindScalarFunctionExpression( const parser::ParsedExpression& parsedExpression, const std::string& functionName); - std::shared_ptr bindScalarFunctionExpression( - const expression_vector& children, const std::string& functionName); + std::shared_ptr bindScalarFunctionExpression(const expression_vector& children, + const std::string& functionName); std::shared_ptr bindRewriteFunctionExpression( const parser::ParsedExpression& parsedExpression); std::shared_ptr bindAggregateFunctionExpression( @@ -104,10 +104,10 @@ class ExpressionBinder { std::shared_ptr bindVariableExpression( const parser::ParsedExpression& parsedExpression); std::shared_ptr bindVariableExpression(const std::string& varName); - std::shared_ptr createVariableExpression( - common::LogicalType logicalType, std::string_view name); - std::shared_ptr createVariableExpression( - common::LogicalType logicalType, std::string name); + std::shared_ptr createVariableExpression(common::LogicalType logicalType, + std::string_view name); + std::shared_ptr createVariableExpression(common::LogicalType logicalType, + std::string name); // Subquery expressions. std::shared_ptr bindSubqueryExpression( const parser::ParsedExpression& parsedExpression); @@ -120,8 +120,8 @@ class ExpressionBinder { const std::shared_ptr& expression, common::LogicalTypeID targetTypeID); static std::shared_ptr implicitCastIfNecessary( const std::shared_ptr& expression, const common::LogicalType& targetType); - static std::shared_ptr implicitCast( - const std::shared_ptr& expression, const common::LogicalType& targetType); + static std::shared_ptr implicitCast(const std::shared_ptr& expression, + const common::LogicalType& targetType); /****** validation *****/ // E.g. SUM(SUM(a.age)) is not allowed diff --git a/src/include/binder/expression_visitor.h b/src/include/binder/expression_visitor.h index 86f3e482ec1..353fc23c0c1 100644 --- a/src/include/binder/expression_visitor.h +++ b/src/include/binder/expression_visitor.h @@ -44,8 +44,8 @@ class ExpressionVisitor { static bool isRandom(const Expression& expression); private: - static bool satisfyAny( - const Expression& expression, const std::function& condition); + static bool satisfyAny(const Expression& expression, + const std::function& condition); }; class ExpressionCollector { diff --git a/src/include/binder/query/reading_clause/bound_in_query_call.h b/src/include/binder/query/reading_clause/bound_in_query_call.h index 7d0c115f4f1..05ab3de3752 100644 --- a/src/include/binder/query/reading_clause/bound_in_query_call.h +++ b/src/include/binder/query/reading_clause/bound_in_query_call.h @@ -14,8 +14,8 @@ class BoundInQueryCall : public BoundReadingClause { std::unique_ptr bindData, expression_vector outExprs, std::shared_ptr rowIdxExpr) : BoundReadingClause{common::ClauseType::IN_QUERY_CALL}, tableFunc{tableFunc}, - bindData{std::move(bindData)}, outExprs{std::move(outExprs)}, rowIdxExpr{std::move( - rowIdxExpr)} {} + bindData{std::move(bindData)}, outExprs{std::move(outExprs)}, + rowIdxExpr{std::move(rowIdxExpr)} {} function::TableFunction getTableFunc() const { return tableFunc; } diff --git a/src/include/binder/query/reading_clause/bound_match_clause.h b/src/include/binder/query/reading_clause/bound_match_clause.h index 728edc1f52a..0f5db8c915d 100644 --- a/src/include/binder/query/reading_clause/bound_match_clause.h +++ b/src/include/binder/query/reading_clause/bound_match_clause.h @@ -8,8 +8,8 @@ namespace binder { class BoundMatchClause : public BoundReadingClause { public: - BoundMatchClause( - QueryGraphCollection queryGraphCollection, common::MatchClauseType matchClauseType) + BoundMatchClause(QueryGraphCollection queryGraphCollection, + common::MatchClauseType matchClauseType) : BoundReadingClause{common::ClauseType::MATCH}, queryGraphCollection{std::move(queryGraphCollection)}, matchClauseType{matchClauseType} {} diff --git a/src/include/binder/query/updating_clause/bound_delete_info.h b/src/include/binder/query/updating_clause/bound_delete_info.h index 3553b63b1cc..5edc3c675c2 100644 --- a/src/include/binder/query/updating_clause/bound_delete_info.h +++ b/src/include/binder/query/updating_clause/bound_delete_info.h @@ -14,14 +14,14 @@ struct BoundDeleteInfo { BoundDeleteInfo(UpdateTableType updateTableType, std::shared_ptr nodeOrRel, common::DeleteClauseType deleteClauseType) - : deleteClauseType{deleteClauseType}, updateTableType{updateTableType}, nodeOrRel{std::move( - nodeOrRel)} {} + : deleteClauseType{deleteClauseType}, updateTableType{updateTableType}, + nodeOrRel{std::move(nodeOrRel)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundDeleteInfo); private: BoundDeleteInfo(const BoundDeleteInfo& other) - : deleteClauseType{other.deleteClauseType}, - updateTableType{other.updateTableType}, nodeOrRel{other.nodeOrRel} {} + : deleteClauseType{other.deleteClauseType}, updateTableType{other.updateTableType}, + nodeOrRel{other.nodeOrRel} {} }; } // namespace binder diff --git a/src/include/binder/query/updating_clause/bound_set_info.h b/src/include/binder/query/updating_clause/bound_set_info.h index 55959557d5c..e2e8d43b76e 100644 --- a/src/include/binder/query/updating_clause/bound_set_info.h +++ b/src/include/binder/query/updating_clause/bound_set_info.h @@ -13,14 +13,14 @@ struct BoundSetPropertyInfo { BoundSetPropertyInfo(UpdateTableType updateTableType, std::shared_ptr nodeOrRel, expression_pair setItem) - : updateTableType{updateTableType}, nodeOrRel{std::move(nodeOrRel)}, setItem{std::move( - setItem)} {} + : updateTableType{updateTableType}, nodeOrRel{std::move(nodeOrRel)}, + setItem{std::move(setItem)} {} EXPLICIT_COPY_DEFAULT_MOVE(BoundSetPropertyInfo); private: BoundSetPropertyInfo(const BoundSetPropertyInfo& other) - : updateTableType{other.updateTableType}, nodeOrRel{other.nodeOrRel}, setItem{ - other.setItem} {} + : updateTableType{other.updateTableType}, nodeOrRel{other.nodeOrRel}, + setItem{other.setItem} {} }; } // namespace binder diff --git a/src/include/c_api/kuzu.h b/src/include/c_api/kuzu.h index 78353b1b6c1..4e88e7837be 100644 --- a/src/include/c_api/kuzu.h +++ b/src/include/c_api/kuzu.h @@ -316,8 +316,8 @@ typedef enum { * @param system_config The runtime configuration for creating or opening the database. * @return The database instance. */ -KUZU_C_API kuzu_database* kuzu_database_init( - const char* database_path, kuzu_system_config system_config); +KUZU_C_API kuzu_database* kuzu_database_init(const char* database_path, + kuzu_system_config system_config); /** * @brief Destroys the kuzu database instance and frees the allocated memory. * @param database The database instance to destroy. @@ -350,8 +350,8 @@ KUZU_C_API void kuzu_connection_destroy(kuzu_connection* connection); * @param connection The connection instance to set max number of threads for execution. * @param num_threads The maximum number of threads to use for executing queries. */ -KUZU_C_API void kuzu_connection_set_max_num_thread_for_exec( - kuzu_connection* connection, uint64_t num_threads); +KUZU_C_API void kuzu_connection_set_max_num_thread_for_exec(kuzu_connection* connection, + uint64_t num_threads); /** * @brief Returns the maximum number of threads of the connection to use for executing queries. @@ -370,15 +370,15 @@ KUZU_C_API kuzu_query_result* kuzu_connection_query(kuzu_connection* connection, * @param connection The connection instance to prepare the query. * @param query The query to prepare. */ -KUZU_C_API kuzu_prepared_statement* kuzu_connection_prepare( - kuzu_connection* connection, const char* query); +KUZU_C_API kuzu_prepared_statement* kuzu_connection_prepare(kuzu_connection* connection, + const char* query); /** * @brief Executes the prepared_statement using connection. * @param connection The connection instance to execute the prepared_statement. * @param prepared_statement The prepared statement to execute. */ -KUZU_C_API kuzu_query_result* kuzu_connection_execute( - kuzu_connection* connection, kuzu_prepared_statement* prepared_statement); +KUZU_C_API kuzu_query_result* kuzu_connection_execute(kuzu_connection* connection, + kuzu_prepared_statement* prepared_statement); /** * @brief Interrupts the current query execution in the connection. * @param connection The connection instance to interrupt. @@ -389,8 +389,8 @@ KUZU_C_API void kuzu_connection_interrupt(kuzu_connection* connection); * @param connection The connection instance to set query timeout value. * @param timeout_in_ms The timeout value in milliseconds. */ -KUZU_C_API void kuzu_connection_set_query_timeout( - kuzu_connection* connection, uint64_t timeout_in_ms); +KUZU_C_API void kuzu_connection_set_query_timeout(kuzu_connection* connection, + uint64_t timeout_in_ms); // PreparedStatement /** @@ -420,72 +420,72 @@ KUZU_C_API char* kuzu_prepared_statement_get_error_message( * @param param_name The parameter name to bind the value. * @param value The boolean value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_bool( - kuzu_prepared_statement* prepared_statement, const char* param_name, bool value); +KUZU_C_API void kuzu_prepared_statement_bind_bool(kuzu_prepared_statement* prepared_statement, + const char* param_name, bool value); /** * @brief Binds the given int64_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The int64_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_int64( - kuzu_prepared_statement* prepared_statement, const char* param_name, int64_t value); +KUZU_C_API void kuzu_prepared_statement_bind_int64(kuzu_prepared_statement* prepared_statement, + const char* param_name, int64_t value); /** * @brief Binds the given int32_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The int32_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_int32( - kuzu_prepared_statement* prepared_statement, const char* param_name, int32_t value); +KUZU_C_API void kuzu_prepared_statement_bind_int32(kuzu_prepared_statement* prepared_statement, + const char* param_name, int32_t value); /** * @brief Binds the given int16_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The int16_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_int16( - kuzu_prepared_statement* prepared_statement, const char* param_name, int16_t value); +KUZU_C_API void kuzu_prepared_statement_bind_int16(kuzu_prepared_statement* prepared_statement, + const char* param_name, int16_t value); /** * @brief Binds the given int8_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The int8_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_int8( - kuzu_prepared_statement* prepared_statement, const char* param_name, int8_t value); +KUZU_C_API void kuzu_prepared_statement_bind_int8(kuzu_prepared_statement* prepared_statement, + const char* param_name, int8_t value); /** * @brief Binds the given uint64_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The uint64_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_uint64( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint64_t value); +KUZU_C_API void kuzu_prepared_statement_bind_uint64(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint64_t value); /** * @brief Binds the given uint32_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The uint32_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_uint32( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint32_t value); +KUZU_C_API void kuzu_prepared_statement_bind_uint32(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint32_t value); /** * @brief Binds the given uint16_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The uint16_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_uint16( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint16_t value); +KUZU_C_API void kuzu_prepared_statement_bind_uint16(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint16_t value); /** * @brief Binds the given int8_t value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The int8_t value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_uint8( - kuzu_prepared_statement* prepared_statement, const char* param_name, uint8_t value); +KUZU_C_API void kuzu_prepared_statement_bind_uint8(kuzu_prepared_statement* prepared_statement, + const char* param_name, uint8_t value); /** * @brief Binds the given double value to the given parameter name in the prepared statement. @@ -493,24 +493,24 @@ KUZU_C_API void kuzu_prepared_statement_bind_uint8( * @param param_name The parameter name to bind the value. * @param value The double value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_double( - kuzu_prepared_statement* prepared_statement, const char* param_name, double value); +KUZU_C_API void kuzu_prepared_statement_bind_double(kuzu_prepared_statement* prepared_statement, + const char* param_name, double value); /** * @brief Binds the given float value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The float value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_float( - kuzu_prepared_statement* prepared_statement, const char* param_name, float value); +KUZU_C_API void kuzu_prepared_statement_bind_float(kuzu_prepared_statement* prepared_statement, + const char* param_name, float value); /** * @brief Binds the given date value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The date value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_date( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_date_t value); +KUZU_C_API void kuzu_prepared_statement_bind_date(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_date_t value); /** * @brief Binds the given timestamp_ns value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. @@ -550,32 +550,32 @@ KUZU_C_API void kuzu_prepared_statement_bind_timestamp_ms( * @param param_name The parameter name to bind the value. * @param value The timestamp value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_timestamp( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_timestamp_t value); +KUZU_C_API void kuzu_prepared_statement_bind_timestamp(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_timestamp_t value); /** * @brief Binds the given interval value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The interval value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_interval( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_interval_t value); +KUZU_C_API void kuzu_prepared_statement_bind_interval(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_interval_t value); /** * @brief Binds the given string value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The string value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_string( - kuzu_prepared_statement* prepared_statement, const char* param_name, const char* value); +KUZU_C_API void kuzu_prepared_statement_bind_string(kuzu_prepared_statement* prepared_statement, + const char* param_name, const char* value); /** * @brief Binds the given kuzu value to the given parameter name in the prepared statement. * @param prepared_statement The prepared statement instance to bind the value. * @param param_name The parameter name to bind the value. * @param value The kuzu value to bind. */ -KUZU_C_API void kuzu_prepared_statement_bind_value( - kuzu_prepared_statement* prepared_statement, const char* param_name, kuzu_value* value); +KUZU_C_API void kuzu_prepared_statement_bind_value(kuzu_prepared_statement* prepared_statement, + const char* param_name, kuzu_value* value); // QueryResult /** @@ -674,8 +674,8 @@ KUZU_C_API struct ArrowSchema kuzu_query_result_get_arrow_schema(kuzu_query_resu * * It is the caller's responsibility to call the release function to release the underlying data */ -KUZU_C_API struct ArrowArray kuzu_query_result_get_next_arrow_chunk( - kuzu_query_result* query_result, int64_t chunk_size); +KUZU_C_API struct ArrowArray kuzu_query_result_get_next_arrow_chunk(kuzu_query_result* query_result, + int64_t chunk_size); // FlatTuple /** @@ -704,8 +704,8 @@ KUZU_C_API char* kuzu_flat_tuple_to_string(kuzu_flat_tuple* flat_tuple); * @param child_type The child type of the datatype to create(only used for nested dataTypes). * @param num_elements_in_array The number of elements in the array(only used for ARRAY). */ -KUZU_C_API kuzu_logical_type* kuzu_data_type_create( - kuzu_data_type_id id, kuzu_logical_type* child_type, uint64_t num_elements_in_array); +KUZU_C_API kuzu_logical_type* kuzu_data_type_create(kuzu_data_type_id id, + kuzu_logical_type* child_type, uint64_t num_elements_in_array); /** * @brief Creates a new data type instance by cloning the given data type instance. * @param data_type The data type instance to clone. diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index 2333d951ea9..fb6c15ad428 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -40,15 +40,15 @@ class Catalog { std::vector getRelTableIDs(transaction::Transaction* tx) const; std::string getTableName(transaction::Transaction* tx, common::table_id_t tableID) const; - TableCatalogEntry* getTableCatalogEntry( - transaction::Transaction* tx, common::table_id_t tableID) const; + TableCatalogEntry* getTableCatalogEntry(transaction::Transaction* tx, + common::table_id_t tableID) const; std::vector getNodeTableEntries(transaction::Transaction* tx) const; std::vector getRelTableEntries(transaction::Transaction* tx) const; std::vector getRelTableGroupEntries(transaction::Transaction* tx) const; std::vector getRdfGraphEntries(transaction::Transaction* tx) const; std::vector getTableEntries(transaction::Transaction* tx) const; - std::vector getTableSchemas( - transaction::Transaction* tx, const common::table_id_vector_t& tableIDs) const; + std::vector getTableSchemas(transaction::Transaction* tx, + const common::table_id_vector_t& tableIDs) const; common::table_id_t createTableSchema(const binder::BoundCreateTableInfo& info); void dropTableSchema(common::table_id_t tableID); @@ -63,8 +63,8 @@ class Catalog { CatalogEntry* getFunctionEntry(transaction::Transaction* tx, const std::string& name); bool containsMacro(transaction::Transaction* tx, const std::string& macroName) const; - void addScalarMacroFunction( - std::string name, std::unique_ptr macro); + void addScalarMacroFunction(std::string name, + std::unique_ptr macro); // TODO(Ziyi): pass transaction pointer here. function::ScalarMacroFunction* getScalarMacroFunction(const std::string& name) const { return readOnlyVersion->getScalarMacroFunction(name); @@ -82,10 +82,10 @@ class Catalog { } } - static void saveInitialCatalogToFile( - const std::string& directory, common::VirtualFileSystem* vfs) { - std::make_unique(vfs)->getReadOnlyVersion()->saveToFile( - directory, common::FileVersionType::ORIGINAL); + static void saveInitialCatalogToFile(const std::string& directory, + common::VirtualFileSystem* vfs) { + std::make_unique(vfs)->getReadOnlyVersion()->saveToFile(directory, + common::FileVersionType::ORIGINAL); } private: diff --git a/src/include/catalog/catalog_content.h b/src/include/catalog/catalog_content.h index 335e62fc134..965c4cc63be 100644 --- a/src/include/catalog/catalog_content.h +++ b/src/include/catalog/catalog_content.h @@ -31,8 +31,8 @@ class CatalogContent { CatalogContent(std::unique_ptr tables, common::table_id_t nextTableID, std::unique_ptr functions, common::VirtualFileSystem* vfs) - : tables{std::move(tables)}, nextTableID{nextTableID}, vfs{vfs}, functions{std::move( - functions)} {} + : tables{std::move(tables)}, nextTableID{nextTableID}, vfs{vfs}, + functions{std::move(functions)} {} common::table_id_t getTableID(const std::string& tableName) const; CatalogEntry* getTableCatalogEntry(common::table_id_t tableID) const; @@ -82,14 +82,14 @@ class CatalogContent { void alterTable(const binder::BoundAlterInfo& info); private: - std::unique_ptr createNodeTableEntry( - common::table_id_t tableID, const binder::BoundCreateTableInfo& info) const; - std::unique_ptr createRelTableEntry( - common::table_id_t tableID, const binder::BoundCreateTableInfo& info) const; - std::unique_ptr createRelTableGroupEntry( - common::table_id_t tableID, const binder::BoundCreateTableInfo& info); - std::unique_ptr createRdfGraphEntry( - common::table_id_t tableID, const binder::BoundCreateTableInfo& info); + std::unique_ptr createNodeTableEntry(common::table_id_t tableID, + const binder::BoundCreateTableInfo& info) const; + std::unique_ptr createRelTableEntry(common::table_id_t tableID, + const binder::BoundCreateTableInfo& info) const; + std::unique_ptr createRelTableGroupEntry(common::table_id_t tableID, + const binder::BoundCreateTableInfo& info); + std::unique_ptr createRdfGraphEntry(common::table_id_t tableID, + const binder::BoundCreateTableInfo& info); void renameTable(common::table_id_t tableID, const std::string& newName); protected: diff --git a/src/include/catalog/catalog_entry/function_catalog_entry.h b/src/include/catalog/catalog_entry/function_catalog_entry.h index 603ec3c5ce3..969f0b077cb 100644 --- a/src/include/catalog/catalog_entry/function_catalog_entry.h +++ b/src/include/catalog/catalog_entry/function_catalog_entry.h @@ -12,8 +12,8 @@ class FunctionCatalogEntry : public CatalogEntry { // constructors //===--------------------------------------------------------------------===// FunctionCatalogEntry() = default; - FunctionCatalogEntry( - CatalogEntryType entryType, std::string name, function::function_set functionSet); + FunctionCatalogEntry(CatalogEntryType entryType, std::string name, + function::function_set functionSet); //===--------------------------------------------------------------------===// // getters & setters diff --git a/src/include/catalog/catalog_entry/node_table_catalog_entry.h b/src/include/catalog/catalog_entry/node_table_catalog_entry.h index 29903debae9..7cd6ebef09d 100644 --- a/src/include/catalog/catalog_entry/node_table_catalog_entry.h +++ b/src/include/catalog/catalog_entry/node_table_catalog_entry.h @@ -11,8 +11,8 @@ class NodeTableCatalogEntry final : public TableCatalogEntry { // constructors //===--------------------------------------------------------------------===// NodeTableCatalogEntry() = default; - NodeTableCatalogEntry( - std::string name, common::table_id_t tableID, common::property_id_t primaryKeyPID); + NodeTableCatalogEntry(std::string name, common::table_id_t tableID, + common::property_id_t primaryKeyPID); NodeTableCatalogEntry(const NodeTableCatalogEntry& other); //===--------------------------------------------------------------------===// diff --git a/src/include/catalog/catalog_entry/scalar_macro_catalog_entry.h b/src/include/catalog/catalog_entry/scalar_macro_catalog_entry.h index c211164d954..706d0f2c8dc 100644 --- a/src/include/catalog/catalog_entry/scalar_macro_catalog_entry.h +++ b/src/include/catalog/catalog_entry/scalar_macro_catalog_entry.h @@ -12,8 +12,8 @@ class ScalarMacroCatalogEntry final : public CatalogEntry { // constructors //===--------------------------------------------------------------------===// ScalarMacroCatalogEntry() = default; - ScalarMacroCatalogEntry( - std::string name, std::unique_ptr macroFunction); + ScalarMacroCatalogEntry(std::string name, + std::unique_ptr macroFunction); //===--------------------------------------------------------------------===// // getter & setter diff --git a/src/include/catalog/catalog_entry/table_catalog_entry.h b/src/include/catalog/catalog_entry/table_catalog_entry.h index 7f31d175042..cec2160eb6a 100644 --- a/src/include/catalog/catalog_entry/table_catalog_entry.h +++ b/src/include/catalog/catalog_entry/table_catalog_entry.h @@ -52,8 +52,8 @@ class KUZU_API TableCatalogEntry : public CatalogEntry { // serialization & deserialization //===--------------------------------------------------------------------===// void serialize(common::Serializer& serializer) const override; - static std::unique_ptr deserialize( - common::Deserializer& deserializer, CatalogEntryType type); + static std::unique_ptr deserialize(common::Deserializer& deserializer, + CatalogEntryType type); protected: common::table_id_t tableID; diff --git a/src/include/catalog/property.h b/src/include/catalog/property.h index 4a92105fb3b..238fc9d4780 100644 --- a/src/include/catalog/property.h +++ b/src/include/catalog/property.h @@ -18,8 +18,8 @@ class Property { common::INVALID_TABLE_ID} {} Property(std::string name, std::unique_ptr dataType, common::property_id_t propertyID, common::table_id_t tableID) - : name{std::move(name)}, dataType{std::move(dataType)}, - propertyID{propertyID}, tableID{tableID} {} + : name{std::move(name)}, dataType{std::move(dataType)}, propertyID{propertyID}, + tableID{tableID} {} EXPLICIT_COPY_DEFAULT_MOVE(Property); std::string getName() const { return name; } @@ -39,8 +39,8 @@ class Property { private: Property(const Property& other) - : name{other.name}, dataType{other.dataType->copy()}, - propertyID{other.propertyID}, tableID{other.tableID} {} + : name{other.name}, dataType{other.dataType->copy()}, propertyID{other.propertyID}, + tableID{other.tableID} {} private: std::string name; diff --git a/src/include/common/arrow/arrow_converter.h b/src/include/common/arrow/arrow_converter.h index 2d68d245b52..9a51fa75e8b 100644 --- a/src/include/common/arrow/arrow_converter.h +++ b/src/include/common/arrow/arrow_converter.h @@ -24,22 +24,22 @@ struct ArrowConverter { public: static std::unique_ptr toArrowSchema( const std::vector>& typesInfo); - static void toArrowArray( - main::QueryResult& queryResult, ArrowArray* out_array, std::int64_t chunkSize); + static void toArrowArray(main::QueryResult& queryResult, ArrowArray* out_array, + std::int64_t chunkSize); static common::LogicalType fromArrowSchema(const ArrowSchema* schema); static void fromArrowArray(const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector, ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count); - static void fromArrowArray( - const ArrowSchema* schema, const ArrowArray* array, ValueVector& outputVector); + static void fromArrowArray(const ArrowSchema* schema, const ArrowArray* array, + ValueVector& outputVector); private: static void initializeChild(ArrowSchema& child, const std::string& name = ""); - static void setArrowFormatForStruct( - ArrowSchemaHolder& rootHolder, ArrowSchema& child, const main::DataTypeInfo& typeInfo); - static void setArrowFormat( - ArrowSchemaHolder& rootHolder, ArrowSchema& child, const main::DataTypeInfo& typeInfo); + static void setArrowFormatForStruct(ArrowSchemaHolder& rootHolder, ArrowSchema& child, + const main::DataTypeInfo& typeInfo); + static void setArrowFormat(ArrowSchemaHolder& rootHolder, ArrowSchema& child, + const main::DataTypeInfo& typeInfo); }; } // namespace common diff --git a/src/include/common/arrow/arrow_nullmask_tree.h b/src/include/common/arrow/arrow_nullmask_tree.h index b3494b9ca80..85ea6a19a81 100644 --- a/src/include/common/arrow/arrow_nullmask_tree.h +++ b/src/include/common/arrow/arrow_nullmask_tree.h @@ -23,11 +23,11 @@ class ArrowNullMaskTree { bool applyParentBitmap(const NullMask* buffer, uint64_t count); template - void scanListPushDown( - const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count); + void scanListPushDown(const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, + uint64_t count); - void scanStructPushDown( - const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, uint64_t count); + void scanStructPushDown(const ArrowSchema* schema, const ArrowArray* array, uint64_t srcOffset, + uint64_t count); int64_t offset; std::shared_ptr mask; diff --git a/src/include/common/arrow/arrow_row_batch.h b/src/include/common/arrow/arrow_row_batch.h index d73194bd57f..209a5551674 100644 --- a/src/include/common/arrow/arrow_row_batch.h +++ b/src/include/common/arrow/arrow_row_batch.h @@ -44,37 +44,37 @@ struct ArrowVector { // An arrow data chunk consisting of N rows in columnar format. class ArrowRowBatch { public: - ArrowRowBatch( - std::vector> typesInfo, std::int64_t capacity); + ArrowRowBatch(std::vector> typesInfo, + std::int64_t capacity); //! Append a data chunk to the underlying arrow array ArrowArray append(main::QueryResult& queryResult, std::int64_t chunkSize); private: - static std::unique_ptr createVector( - const main::DataTypeInfo& typeInfo, std::int64_t capacity); + static std::unique_ptr createVector(const main::DataTypeInfo& typeInfo, + std::int64_t capacity); static void appendValue(ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value); - static ArrowArray* convertVectorToArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo); - static ArrowArray* convertStructVectorToArray( - ArrowVector& vector, const main::DataTypeInfo& typeInfo); + static ArrowArray* convertVectorToArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo); + static ArrowArray* convertStructVectorToArray(ArrowVector& vector, + const main::DataTypeInfo& typeInfo); static inline void initializeNullBits(ArrowBuffer& validity, std::int64_t capacity) { auto numBytesForValidity = getNumBytesForBits(capacity); validity.resize(numBytesForValidity, 0xFF); } - static void initializeStructVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity); - static void copyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos); + static void initializeStructVector(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + std::int64_t capacity); + static void copyNonNullValue(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + Value* value, std::int64_t pos); static void copyNullValue(ArrowVector* vector, Value* value, std::int64_t pos); template - static void templateInitializeVector( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, std::int64_t capacity); + static void templateInitializeVector(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + std::int64_t capacity); template - static void templateCopyNonNullValue( - ArrowVector* vector, const main::DataTypeInfo& typeInfo, Value* value, std::int64_t pos); + static void templateCopyNonNullValue(ArrowVector* vector, const main::DataTypeInfo& typeInfo, + Value* value, std::int64_t pos); template static void templateCopyNullValue(ArrowVector* vector, std::int64_t pos); template diff --git a/src/include/common/assert.h b/src/include/common/assert.h index cc46a295016..17afa6cb600 100644 --- a/src/include/common/assert.h +++ b/src/include/common/assert.h @@ -6,11 +6,11 @@ namespace kuzu { namespace common { -[[noreturn]] inline void kuAssertFailureInternal( - const char* condition_name, const char* file, int linenr) { +[[noreturn]] inline void kuAssertFailureInternal(const char* condition_name, const char* file, + int linenr) { // LCOV_EXCL_START - throw InternalException(stringFormat( - "Assertion failed in file \"{}\" on line {}: {}", file, linenr, condition_name)); + throw InternalException(stringFormat("Assertion failed in file \"{}\" on line {}: {}", file, + linenr, condition_name)); // LCOV_EXCL_STOP } diff --git a/src/include/common/copy_constructors.h b/src/include/common/copy_constructors.h index cbeebf544bc..7db4d6bc68b 100644 --- a/src/include/common/copy_constructors.h +++ b/src/include/common/copy_constructors.h @@ -27,7 +27,9 @@ DEFAULT_MOVE_ASSN(Object) #define EXPLICIT_COPY_METHOD(Object) \ - Object copy() const { return *this; } + Object copy() const { \ + return *this; \ + } // EXPLICIT_COPY_DEFAULT_MOVE should be the default choice. It expects a PRIVATE copy constructor to // be defined, which will be used by an explicit `copy()` method. For instance: diff --git a/src/include/common/exception/message.h b/src/include/common/exception/message.h index ad5f499a76e..99028d515fc 100644 --- a/src/include/common/exception/message.h +++ b/src/include/common/exception/message.h @@ -19,10 +19,10 @@ struct ExceptionMessage { static std::string overLargeStringPKValueException(uint64_t length); static std::string overLargeStringValueException(uint64_t length); // Foreign key. - static std::string violateDeleteNodeWithConnectedEdgesConstraint( - const std::string& tableName, const std::string& offset, const std::string& direction); - static std::string violateRelMultiplicityConstraint( - const std::string& tableName, const std::string& offset, const std::string& direction); + static std::string violateDeleteNodeWithConnectedEdgesConstraint(const std::string& tableName, + const std::string& offset, const std::string& direction); + static std::string violateRelMultiplicityConstraint(const std::string& tableName, + const std::string& offset, const std::string& direction); // Binding exception static std::string variableNotInScope(const std::string& varName); }; diff --git a/src/include/common/file_system/file_system.h b/src/include/common/file_system/file_system.h index 0562f4e9b05..89a2b27a082 100644 --- a/src/include/common/file_system/file_system.h +++ b/src/include/common/file_system/file_system.h @@ -24,8 +24,8 @@ class KUZU_API FileSystem { virtual std::unique_ptr openFile(const std::string& path, int flags, main::ClientContext* context = nullptr, FileLockType lock_type = FileLockType::NO_LOCK) = 0; - virtual std::vector glob( - main::ClientContext* context, const std::string& path) const = 0; + virtual std::vector glob(main::ClientContext* context, + const std::string& path) const = 0; virtual void overwriteFile(const std::string& from, const std::string& to) const; @@ -46,13 +46,13 @@ class KUZU_API FileSystem { virtual bool canHandleFile(const std::string& /*path*/) const { KU_UNREACHABLE; } protected: - virtual void readFromFile( - FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const = 0; + virtual void readFromFile(FileInfo* fileInfo, void* buffer, uint64_t numBytes, + uint64_t position) const = 0; virtual int64_t readFile(FileInfo* fileInfo, void* buf, size_t nbyte) const = 0; - virtual void writeFile( - FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, uint64_t offset) const; + virtual void writeFile(FileInfo* fileInfo, const uint8_t* buffer, uint64_t numBytes, + uint64_t offset) const; virtual int64_t seek(FileInfo* fileInfo, uint64_t offset, int whence) const = 0; diff --git a/src/include/common/file_system/local_file_system.h b/src/include/common/file_system/local_file_system.h index 60db5628026..f34ec930ed2 100644 --- a/src/include/common/file_system/local_file_system.h +++ b/src/include/common/file_system/local_file_system.h @@ -31,8 +31,8 @@ class LocalFileSystem final : public FileSystem { main::ClientContext* context = nullptr, FileLockType lock_type = FileLockType::NO_LOCK) override; - std::vector glob( - main::ClientContext* context, const std::string& path) const override; + std::vector glob(main::ClientContext* context, + const std::string& path) const override; void overwriteFile(const std::string& from, const std::string& to) const override; @@ -47,8 +47,8 @@ class LocalFileSystem final : public FileSystem { std::string expandPath(main::ClientContext* context, const std::string& path) const override; protected: - void readFromFile( - FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const override; + void readFromFile(FileInfo* fileInfo, void* buffer, uint64_t numBytes, + uint64_t position) const override; int64_t readFile(FileInfo* fileInfo, void* buf, size_t nbyte) const override; diff --git a/src/include/common/file_system/virtual_file_system.h b/src/include/common/file_system/virtual_file_system.h index 2cc61a928f6..32199652016 100644 --- a/src/include/common/file_system/virtual_file_system.h +++ b/src/include/common/file_system/virtual_file_system.h @@ -19,8 +19,8 @@ class VirtualFileSystem final : public FileSystem { main::ClientContext* context = nullptr, FileLockType lockType = FileLockType::NO_LOCK) override; - std::vector glob( - main::ClientContext* context, const std::string& path) const override; + std::vector glob(main::ClientContext* context, + const std::string& path) const override; void overwriteFile(const std::string& from, const std::string& to) const override; @@ -33,8 +33,8 @@ class VirtualFileSystem final : public FileSystem { std::string expandPath(main::ClientContext* context, const std::string& path) const override; protected: - void readFromFile( - FileInfo* fileInfo, void* buffer, uint64_t numBytes, uint64_t position) const override; + void readFromFile(FileInfo* fileInfo, void* buffer, uint64_t numBytes, + uint64_t position) const override; int64_t readFile(FileInfo* fileInfo, void* buf, size_t nbyte) const override; diff --git a/src/include/common/null_mask.h b/src/include/common/null_mask.h index 9246c7cfddf..b588d85ff7d 100644 --- a/src/include/common/null_mask.h +++ b/src/include/common/null_mask.h @@ -140,8 +140,8 @@ class NullMask { // Sets the given number of bits to null (if isNull is true) or non-null (if isNull is false), // starting at the offset - static void setNullRange( - uint64_t* nullEntries, uint64_t offset, uint64_t numBitsToSet, bool isNull); + static void setNullRange(uint64_t* nullEntries, uint64_t offset, uint64_t numBitsToSet, + bool isNull); void setNullFromRange(uint64_t offset, uint64_t numBitsToSet, bool isNull); @@ -150,8 +150,8 @@ class NullMask { private: static inline std::pair getNullEntryAndBitPos(uint64_t pos) { auto nullEntryPos = pos >> NUM_BITS_PER_NULL_ENTRY_LOG2; - return std::make_pair( - nullEntryPos, pos - (nullEntryPos << NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2)); + return std::make_pair(nullEntryPos, + pos - (nullEntryPos << NullMask::NUM_BITS_PER_NULL_ENTRY_LOG2)); } private: diff --git a/src/include/common/serializer/buffered_serializer.h b/src/include/common/serializer/buffered_serializer.h index d51e65d107b..0291928890f 100644 --- a/src/include/common/serializer/buffered_serializer.h +++ b/src/include/common/serializer/buffered_serializer.h @@ -35,8 +35,8 @@ class BufferedSerializer : public Writer { template void write(T element) { - static_assert( - std::is_trivially_destructible(), "Write element must be trivially destructible"); + static_assert(std::is_trivially_destructible(), + "Write element must be trivially destructible"); write(reinterpret_cast(&element), sizeof(T)); } diff --git a/src/include/common/serializer/deserializer.h b/src/include/common/serializer/deserializer.h index a0cbf596d02..198486f04f1 100644 --- a/src/include/common/serializer/deserializer.h +++ b/src/include/common/serializer/deserializer.h @@ -17,8 +17,8 @@ class Deserializer { explicit Deserializer(std::unique_ptr reader) : reader(std::move(reader)) {} template - requires std::is_trivially_destructible::value || - std::is_same::value void deserializeValue(T& value) { + requires std::is_trivially_destructible::value || std::is_same::value + void deserializeValue(T& value) { reader->read((uint8_t*)&value, sizeof(T)); } @@ -50,7 +50,7 @@ class Deserializer { deserializeValue(vectorSize); values.resize(vectorSize); for (auto& value : values) { - if constexpr (requires(Deserializer & deser) { T::deserialize(deser); }) { + if constexpr (requires(Deserializer& deser) { T::deserialize(deser); }) { value = T::deserialize(*this); } else { deserializeValue(value); diff --git a/src/include/common/serializer/serializer.h b/src/include/common/serializer/serializer.h index 74c60076828..aac1ee12d0b 100644 --- a/src/include/common/serializer/serializer.h +++ b/src/include/common/serializer/serializer.h @@ -17,8 +17,8 @@ class Serializer { explicit Serializer(std::shared_ptr writer) : writer(std::move(writer)) {} template - requires std::is_trivially_destructible::value || - std::is_same::value void serializeValue(const T& value) { + requires std::is_trivially_destructible::value || std::is_same::value + void serializeValue(const T& value) { writer->write((uint8_t*)&value, sizeof(T)); } @@ -53,7 +53,7 @@ class Serializer { uint64_t vectorSize = values.size(); serializeValue(vectorSize); for (auto& value : values) { - if constexpr (requires(Serializer & ser) { value.serialize(ser); }) { + if constexpr (requires(Serializer& ser) { value.serialize(ser); }) { value.serialize(*this); } else { serializeValue(value); diff --git a/src/include/common/string_format.h b/src/include/common/string_format.h index 9c11134726a..2f4d53f942d 100644 --- a/src/include/common/string_format.h +++ b/src/include/common/string_format.h @@ -11,7 +11,9 @@ namespace common { namespace string_format_detail { #define MAP_STD_TO_STRING(typ) \ - inline std::string map(typ v) { return std::to_string(v); } + inline std::string map(typ v) { \ + return std::to_string(v); \ + } MAP_STD_TO_STRING(short) MAP_STD_TO_STRING(unsigned short) @@ -26,7 +28,9 @@ MAP_STD_TO_STRING(double) #undef MAP_STD_TO_STRING #define MAP_SELF(typ) \ - inline typ map(typ v) { return v; } + inline typ map(typ v) { \ + return v; \ + } MAP_SELF(const char*); // Also covers std::string MAP_SELF(std::string_view) @@ -65,8 +69,8 @@ inline void stringFormatHelper(std::string& ret, std::string_view format, Args&& } template -inline void stringFormatHelper( - std::string& ret, std::string_view format, Arg&& arg, Args&&... args) { +inline void stringFormatHelper(std::string& ret, std::string_view format, Arg&& arg, + Args&&... args) { size_t bracket = format.find('{'); if (bracket == std::string_view::npos) { throw InternalException("Too many values for string_format."); @@ -75,8 +79,8 @@ inline void stringFormatHelper( if (format.substr(bracket, 4) == "{{}}") { // Escaped {}. ret += "{}"; - return stringFormatHelper( - ret, format.substr(bracket + 4), std::forward(arg), std::forward(args)...); + return stringFormatHelper(ret, format.substr(bracket + 4), std::forward(arg), + std::forward(args)...); } else if (format.substr(bracket, 2) == "{}") { // Formatted {}. ret += map(arg); @@ -84,8 +88,8 @@ inline void stringFormatHelper( } // Something else. ret.push_back('{'); - return stringFormatHelper( - ret, format.substr(bracket + 1), std::forward(arg), std::forward(args)...); + return stringFormatHelper(ret, format.substr(bracket + 1), std::forward(arg), + std::forward(args)...); } } // namespace string_format_detail diff --git a/src/include/common/string_utils.h b/src/include/common/string_utils.h index c1013857c3d..a50893e874b 100644 --- a/src/include/common/string_utils.h +++ b/src/include/common/string_utils.h @@ -13,8 +13,8 @@ class StringUtils { public: KUZU_API static std::vector splitComma(const std::string& input); - KUZU_API static std::vector split( - const std::string& input, const std::string& delimiter, bool ignoreEmptyStringParts = true); + KUZU_API static std::vector split(const std::string& input, + const std::string& delimiter, bool ignoreEmptyStringParts = true); static std::vector splitBySpace(const std::string& input); @@ -39,8 +39,8 @@ class StringUtils { static inline std::string ltrim(const std::string& input) { auto s = input; - s.erase( - s.begin(), find_if(s.begin(), s.end(), [](unsigned char ch) { return !isspace(ch); })); + s.erase(s.begin(), + find_if(s.begin(), s.end(), [](unsigned char ch) { return !isspace(ch); })); return s; } @@ -58,8 +58,8 @@ class StringUtils { static void removeCStringWhiteSpaces(const char*& input, uint64_t& len); - static void replaceAll( - std::string& str, const std::string& search, const std::string& replacement); + static void replaceAll(std::string& str, const std::string& search, + const std::string& replacement); static std::string extractStringBetween(const std::string& input, char delimiterStart, char delimiterEnd, bool includeDelimiter = false); diff --git a/src/include/common/task_system/task.h b/src/include/common/task_system/task.h index 8e46df2b4c3..7c0ec99f4ef 100644 --- a/src/include/common/task_system/task.h +++ b/src/include/common/task_system/task.h @@ -35,7 +35,7 @@ class Task { // already acquired. So do not attempt to acquire the task lock inside. If needed we can // make the deregister function release the lock before calling finalize and drop this // assumption. - virtual void finalizeIfNecessary(){}; + virtual void finalizeIfNecessary() {}; void addChildTask(std::unique_ptr child) { child->parent = this; diff --git a/src/include/common/task_system/task_scheduler.h b/src/include/common/task_system/task_scheduler.h index 5c6a1e54c21..0fa129bfe10 100644 --- a/src/include/common/task_system/task_scheduler.h +++ b/src/include/common/task_system/task_scheduler.h @@ -46,8 +46,8 @@ class TaskScheduler { // whether or not the given task or one of its dependencies errors, when this function // returns, no task related to the given task will be in the task queue. Further no worker // thread will be working on the given task. - void scheduleTaskAndWaitOrError( - const std::shared_ptr& task, processor::ExecutionContext* context); + void scheduleTaskAndWaitOrError(const std::shared_ptr& task, + processor::ExecutionContext* context); private: std::shared_ptr pushTaskIntoQueue(const std::shared_ptr& task); diff --git a/src/include/common/type_utils.h b/src/include/common/type_utils.h index edb5473ace6..5d06b4b4aca 100644 --- a/src/include/common/type_utils.h +++ b/src/include/common/type_utils.h @@ -37,13 +37,13 @@ class TypeUtils { static std::string nodeToString(const struct_entry_t& val, ValueVector* vector); static std::string relToString(const struct_entry_t& val, ValueVector* vector); - static inline void encodeOverflowPtr( - uint64_t& overflowPtr, page_idx_t pageIdx, uint16_t pageOffset) { + static inline void encodeOverflowPtr(uint64_t& overflowPtr, page_idx_t pageIdx, + uint16_t pageOffset) { memcpy(&overflowPtr, &pageIdx, 4); memcpy(((uint8_t*)&overflowPtr) + 4, &pageOffset, 2); } - static inline void decodeOverflowPtr( - uint64_t overflowPtr, page_idx_t& pageIdx, uint16_t& pageOffset) { + static inline void decodeOverflowPtr(uint64_t overflowPtr, page_idx_t& pageIdx, + uint16_t& pageOffset) { pageIdx = 0; memcpy(&pageIdx, &overflowPtr, 4); memcpy(&pageOffset, ((uint8_t*)&overflowPtr) + 4, 2); diff --git a/src/include/common/types/cast_helpers.h b/src/include/common/types/cast_helpers.h index 697bb40154c..d75289f1c42 100644 --- a/src/include/common/types/cast_helpers.h +++ b/src/include/common/types/cast_helpers.h @@ -213,8 +213,8 @@ struct IntervalToStringCast { length += 2; } - static void FormatIntervalValue( - int32_t value, char buffer[], uint64_t& length, const char* name, uint64_t name_len) { + static void FormatIntervalValue(int32_t value, char buffer[], uint64_t& length, + const char* name, uint64_t name_len) { if (value == 0) { return; } diff --git a/src/include/common/types/date_t.h b/src/include/common/types/date_t.h index 1413fdfe46e..2b760535186 100644 --- a/src/include/common/types/date_t.h +++ b/src/include/common/types/date_t.h @@ -73,8 +73,8 @@ class Date { // Convert a date object to a string in the format "YYYY-MM-DD" KUZU_API static std::string toString(date_t date); // Try to convert text in a buffer to a date; returns true if parsing was successful - KUZU_API static bool tryConvertDate( - const char* buf, uint64_t len, uint64_t& pos, date_t& result); + KUZU_API static bool tryConvertDate(const char* buf, uint64_t len, uint64_t& pos, + date_t& result); // private: // Returns true if (year) is a leap year, and false otherwise @@ -83,14 +83,14 @@ class Date { // date KUZU_API static bool isValid(int32_t year, int32_t month, int32_t day); // Extract the year, month and day from a given date object - KUZU_API static void convert( - date_t date, int32_t& out_year, int32_t& out_month, int32_t& out_day); + KUZU_API static void convert(date_t date, int32_t& out_year, int32_t& out_month, + int32_t& out_day); // Create a Date object from a specified (year, month, day) combination KUZU_API static date_t fromDate(int32_t year, int32_t month, int32_t day); // Helper function to parse two digits from a string (e.g. "30" -> 30, "03" -> 3, "3" -> 3) - KUZU_API static bool parseDoubleDigit( - const char* buf, uint64_t len, uint64_t& pos, int32_t& result); + KUZU_API static bool parseDoubleDigit(const char* buf, uint64_t len, uint64_t& pos, + int32_t& result); KUZU_API static int32_t monthDays(int32_t year, int32_t month); diff --git a/src/include/common/types/dtime_t.h b/src/include/common/types/dtime_t.h index 81d8bc3a26f..05f20355ee7 100644 --- a/src/include/common/types/dtime_t.h +++ b/src/include/common/types/dtime_t.h @@ -39,28 +39,28 @@ class Time { public: // Convert a string in the format "hh:mm:ss" to a time object KUZU_API static dtime_t fromCString(const char* buf, uint64_t len); - KUZU_API static bool tryConvertInterval( - const char* buf, uint64_t len, uint64_t& pos, dtime_t& result); - KUZU_API static bool tryConvertTime( - const char* buf, uint64_t len, uint64_t& pos, dtime_t& result); + KUZU_API static bool tryConvertInterval(const char* buf, uint64_t len, uint64_t& pos, + dtime_t& result); + KUZU_API static bool tryConvertTime(const char* buf, uint64_t len, uint64_t& pos, + dtime_t& result); // Convert a time object to a string in the format "hh:mm:ss" KUZU_API static std::string toString(dtime_t time); - KUZU_API static dtime_t fromTime( - int32_t hour, int32_t minute, int32_t second, int32_t microseconds = 0); + KUZU_API static dtime_t fromTime(int32_t hour, int32_t minute, int32_t second, + int32_t microseconds = 0); // Extract the time from a given timestamp object - KUZU_API static void convert( - dtime_t time, int32_t& out_hour, int32_t& out_min, int32_t& out_sec, int32_t& out_micros); + KUZU_API static void convert(dtime_t time, int32_t& out_hour, int32_t& out_min, + int32_t& out_sec, int32_t& out_micros); - KUZU_API static bool isValid( - int32_t hour, int32_t minute, int32_t second, int32_t milliseconds); + KUZU_API static bool isValid(int32_t hour, int32_t minute, int32_t second, + int32_t milliseconds); private: static bool tryConvertInternal(const char* buf, uint64_t len, uint64_t& pos, dtime_t& result); - static dtime_t fromTimeInternal( - int32_t hour, int32_t minute, int32_t second, int32_t microseconds = 0); + static dtime_t fromTimeInternal(int32_t hour, int32_t minute, int32_t second, + int32_t microseconds = 0); }; } // namespace common diff --git a/src/include/common/types/interval_t.h b/src/include/common/types/interval_t.h index 5d74cb13ae9..90696c2b32b 100644 --- a/src/include/common/types/interval_t.h +++ b/src/include/common/types/interval_t.h @@ -97,8 +97,8 @@ class Interval { KUZU_API static interval_t fromCString(const char* str, uint64_t len); KUZU_API static std::string toString(interval_t interval); KUZU_API static bool greaterThan(const interval_t& left, const interval_t& right); - KUZU_API static void normalizeIntervalEntries( - interval_t input, int64_t& months, int64_t& days, int64_t& micros); + KUZU_API static void normalizeIntervalEntries(interval_t input, int64_t& months, int64_t& days, + int64_t& micros); KUZU_API static void tryGetDatePartSpecifier(std::string specifier, DatePartSpecifier& result); KUZU_API static int32_t getIntervalPart(DatePartSpecifier specifier, interval_t& timestamp); KUZU_API static int64_t getMicro(const interval_t& val); diff --git a/src/include/common/types/timestamp_t.h b/src/include/common/types/timestamp_t.h index f5b4379efdf..790c99eaaaf 100644 --- a/src/include/common/types/timestamp_t.h +++ b/src/include/common/types/timestamp_t.h @@ -103,11 +103,11 @@ class Timestamp { KUZU_API static int64_t getEpochSeconds(const timestamp_t& timestamp); - KUZU_API static bool tryParseUTCOffset( - const char* str, uint64_t& pos, uint64_t len, int& hour_offset, int& minute_offset); + KUZU_API static bool tryParseUTCOffset(const char* str, uint64_t& pos, uint64_t len, + int& hour_offset, int& minute_offset); - static std::string getTimestampConversionExceptionMsg( - const char* str, uint64_t len, const std::string& typeID = "TIMESTAMP") { + static std::string getTimestampConversionExceptionMsg(const char* str, uint64_t len, + const std::string& typeID = "TIMESTAMP") { return "Error occurred during parsing " + typeID + ". Given: \"" + std::string(str, len) + "\". Expected format: (YYYY-MM-DD hh:mm:ss[.zzzzzz][+-TT[:tt]])"; } diff --git a/src/include/common/types/types.h b/src/include/common/types/types.h index 528e28ba474..f97ea733641 100644 --- a/src/include/common/types/types.h +++ b/src/include/common/types/types.h @@ -85,10 +85,10 @@ template concept HashablePrimitive = ((std::integral && !std::is_same_v) || std::floating_point || std::is_same_v); template -concept IndexHashable = ((std::integral && !std::is_same_v) || std::floating_point || - std::is_same_v || - std::is_same_v || - std::is_same_v || std::same_as); +concept IndexHashable = + ((std::integral && !std::is_same_v) || std::floating_point || + std::is_same_v || std::is_same_v || + std::is_same_v || std::same_as); template concept HashableTypes = (std::integral || std::floating_point || @@ -411,20 +411,20 @@ class LogicalType { return LogicalType::LIST(std::make_unique(std::forward(childType))); } - static KUZU_API std::unique_ptr MAP( - std::unique_ptr keyType, std::unique_ptr valueType); + static KUZU_API std::unique_ptr MAP(std::unique_ptr keyType, + std::unique_ptr valueType); template static inline std::unique_ptr MAP(T&& keyType, T&& valueType) { return LogicalType::MAP(std::make_unique(std::forward(keyType)), std::make_unique(std::forward(valueType))); } - static KUZU_API std::unique_ptr ARRAY( - std::unique_ptr childType, uint64_t numElements); + static KUZU_API std::unique_ptr ARRAY(std::unique_ptr childType, + uint64_t numElements); template static inline std::unique_ptr ARRAY(T&& childType, uint64_t numElements) { - return LogicalType::ARRAY( - std::make_unique(std::forward(childType)), numElements); + return LogicalType::ARRAY(std::make_unique(std::forward(childType)), + numElements); } private: @@ -466,16 +466,16 @@ struct ArrayType { }; struct NodeType { - static inline void setExtraTypeInfo( - LogicalType& type, std::unique_ptr extraTypeInfo) { + static inline void setExtraTypeInfo(LogicalType& type, + std::unique_ptr extraTypeInfo) { KU_ASSERT(type.getLogicalTypeID() == LogicalTypeID::NODE); type.setExtraTypeInfo(std::move(extraTypeInfo)); } }; struct RelType { - static inline void setExtraTypeInfo( - LogicalType& type, std::unique_ptr extraTypeInfo) { + static inline void setExtraTypeInfo(LogicalType& type, + std::unique_ptr extraTypeInfo) { KU_ASSERT(type.getLogicalTypeID() == LogicalTypeID::REL); type.setExtraTypeInfo(std::move(extraTypeInfo)); } diff --git a/src/include/common/types/value/value.h b/src/include/common/types/value/value.h index 90306c02b19..7ac3e380267 100644 --- a/src/include/common/types/value/value.h +++ b/src/include/common/types/value/value.h @@ -152,8 +152,8 @@ class Value { * @param dataType the logical type of the value. * @param children a vector of children values. */ - KUZU_API explicit Value( - std::unique_ptr dataType, std::vector> children); + KUZU_API explicit Value(std::unique_ptr dataType, + std::vector> children); /** * @param other the value to copy from. */ diff --git a/src/include/common/vector/auxiliary_buffer.h b/src/include/common/vector/auxiliary_buffer.h index 476b1d009a4..d2e74bbea99 100644 --- a/src/include/common/vector/auxiliary_buffer.h +++ b/src/include/common/vector/auxiliary_buffer.h @@ -37,8 +37,8 @@ class StructAuxiliaryBuffer : public AuxiliaryBuffer { public: StructAuxiliaryBuffer(const LogicalType& type, storage::MemoryManager* memoryManager); - inline void referenceChildVector( - vector_idx_t idx, std::shared_ptr vectorToReference) { + inline void referenceChildVector(vector_idx_t idx, + std::shared_ptr vectorToReference) { childrenVectors[idx] = std::move(vectorToReference); } inline const std::vector>& getFieldVectors() const { @@ -94,8 +94,8 @@ class ListAuxiliaryBuffer : public AuxiliaryBuffer { class AuxiliaryBufferFactory { public: - static std::unique_ptr getAuxiliaryBuffer( - LogicalType& type, storage::MemoryManager* memoryManager); + static std::unique_ptr getAuxiliaryBuffer(LogicalType& type, + storage::MemoryManager* memoryManager); }; } // namespace common diff --git a/src/include/common/vector/value_vector.h b/src/include/common/vector/value_vector.h index ef360a48627..5f9afe437ec 100644 --- a/src/include/common/vector/value_vector.h +++ b/src/include/common/vector/value_vector.h @@ -69,11 +69,11 @@ class KUZU_API ValueVector { // copyFromRowData assumes rowData is non-NULL. void copyFromRowData(uint32_t pos, const uint8_t* rowData); // copyToRowData assumes srcVectorData is non-NULL. - void copyToRowData( - uint32_t pos, uint8_t* rowData, InMemOverflowBuffer* rowOverflowBuffer) const; + void copyToRowData(uint32_t pos, uint8_t* rowData, + InMemOverflowBuffer* rowOverflowBuffer) const; // copyFromVectorData assumes srcVectorData is non-NULL. - void copyFromVectorData( - uint8_t* dstData, const ValueVector* srcVector, const uint8_t* srcVectorData); + void copyFromVectorData(uint8_t* dstData, const ValueVector* srcVector, + const uint8_t* srcVectorData); void copyFromVectorData(uint64_t dstPos, const ValueVector* srcVector, uint64_t srcPos); void copyFromValue(uint64_t pos, const Value& value); @@ -121,18 +121,18 @@ class KUZU_API StringVector { } static void addString(ValueVector* vector, uint32_t vectorPos, ku_string_t& srcStr); - static void addString( - ValueVector* vector, uint32_t vectorPos, const char* srcStr, uint64_t length); + static void addString(ValueVector* vector, uint32_t vectorPos, const char* srcStr, + uint64_t length); static void addString(ValueVector* vector, uint32_t vectorPos, const std::string& srcStr); // Add empty string with space reserved for the provided size // Returned value can be modified to set the string contents static ku_string_t& reserveString(ValueVector* vector, uint32_t vectorPos, uint64_t length); static void reserveString(ValueVector* vector, ku_string_t& dstStr, uint64_t length); static void addString(ValueVector* vector, ku_string_t& dstStr, ku_string_t& srcStr); - static void addString( - ValueVector* vector, ku_string_t& dstStr, const char* srcStr, uint64_t length); - static void addString( - kuzu::common::ValueVector* vector, ku_string_t& dstStr, const std::string& srcStr); + static void addString(ValueVector* vector, ku_string_t& dstStr, const char* srcStr, + uint64_t length); + static void addString(kuzu::common::ValueVector* vector, ku_string_t& dstStr, + const std::string& srcStr); static void copyToRowData(const ValueVector* vector, uint32_t pos, uint8_t* rowData, InMemOverflowBuffer* rowOverflowBuffer); }; @@ -178,8 +178,8 @@ class KUZU_API ListVector { auto dataVector = getDataVector(vector); return dataVector->getData() + dataVector->getNumBytesPerValue() * listEntry.offset; } - static uint8_t* getListValuesWithOffset( - const ValueVector* vector, const list_entry_t& listEntry, offset_t elementOffsetInList) { + static uint8_t* getListValuesWithOffset(const ValueVector* vector, + const list_entry_t& listEntry, offset_t elementOffsetInList) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::LIST); return getListValues(vector, listEntry) + elementOffsetInList * getDataVector(vector)->getNumBytesPerValue(); @@ -200,8 +200,8 @@ class KUZU_API ListVector { InMemOverflowBuffer* rowOverflowBuffer); static void copyFromVectorData(ValueVector* dstVector, uint8_t* dstData, const ValueVector* srcVector, const uint8_t* srcData); - static void appendDataVector( - ValueVector* dstVector, ValueVector* srcDataVector, uint64_t numValuesToAppend); + static void appendDataVector(ValueVector* dstVector, ValueVector* srcDataVector, + uint64_t numValuesToAppend); static void sliceDataVector(ValueVector* vectorToSlice, uint64_t offset, uint64_t numValues); }; @@ -214,8 +214,8 @@ class StructVector { ->getFieldVectors(); } - static inline std::shared_ptr getFieldVector( - const ValueVector* vector, struct_field_idx_t idx) { + static inline std::shared_ptr getFieldVector(const ValueVector* vector, + struct_field_idx_t idx) { return ku_dynamic_cast( vector->auxiliaryBuffer.get()) ->getFieldVectors()[idx]; @@ -255,15 +255,15 @@ class UnionVector { static inline void referenceVector(ValueVector* vector, union_field_idx_t fieldIdx, std::shared_ptr vectorToReference) { - StructVector::referenceVector( - vector, UnionType::getInternalFieldIdx(fieldIdx), std::move(vectorToReference)); + StructVector::referenceVector(vector, UnionType::getInternalFieldIdx(fieldIdx), + std::move(vectorToReference)); } static inline void setTagField(ValueVector* vector, union_field_idx_t tag) { KU_ASSERT(vector->dataType.getLogicalTypeID() == LogicalTypeID::UNION); for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { - vector->setValue( - vector->state->selVector->selectedPositions[i], tag); + vector->setValue(vector->state->selVector->selectedPositions[i], + tag); } } }; diff --git a/src/include/expression_evaluator/case_evaluator.h b/src/include/expression_evaluator/case_evaluator.h index acd5c9e77a5..7c81bc9961e 100644 --- a/src/include/expression_evaluator/case_evaluator.h +++ b/src/include/expression_evaluator/case_evaluator.h @@ -24,8 +24,8 @@ struct CaseAlternativeEvaluator { void init(const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager); inline std::unique_ptr clone() const { - return make_unique( - whenEvaluator->clone(), thenEvaluator->clone()); + return make_unique(whenEvaluator->clone(), + thenEvaluator->clone()); } }; @@ -35,11 +35,11 @@ class CaseExpressionEvaluator : public ExpressionEvaluator { std::vector> alternativeEvaluators, std::unique_ptr elseEvaluator) : ExpressionEvaluator{}, expression{std::move(expression)}, - alternativeEvaluators{std::move(alternativeEvaluators)}, elseEvaluator{ - std::move(elseEvaluator)} {} + alternativeEvaluators{std::move(alternativeEvaluators)}, + elseEvaluator{std::move(elseEvaluator)} {} - void init( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void init(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; void evaluate(main::ClientContext* clientContext) override; @@ -48,8 +48,8 @@ class CaseExpressionEvaluator : public ExpressionEvaluator { std::unique_ptr clone() override; protected: - void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; private: void fillSelected(const common::SelectionVector& selVector, common::ValueVector* srcVector); diff --git a/src/include/expression_evaluator/expression_evaluator.h b/src/include/expression_evaluator/expression_evaluator.h index 6e9d7260683..29bbf57469b 100644 --- a/src/include/expression_evaluator/expression_evaluator.h +++ b/src/include/expression_evaluator/expression_evaluator.h @@ -29,8 +29,8 @@ class ExpressionEvaluator { virtual std::unique_ptr clone() = 0; protected: - virtual void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) = 0; + virtual void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) = 0; void resolveResultStateFromChildren(const std::vector& inputEvaluators); diff --git a/src/include/expression_evaluator/function_evaluator.h b/src/include/expression_evaluator/function_evaluator.h index e2535f9d02e..3cb6fd83051 100644 --- a/src/include/expression_evaluator/function_evaluator.h +++ b/src/include/expression_evaluator/function_evaluator.h @@ -14,11 +14,11 @@ class FunctionExpressionEvaluator : public ExpressionEvaluator { public: FunctionExpressionEvaluator(std::shared_ptr expression, std::vector> children) - : ExpressionEvaluator{std::move(children)}, - expression{std::move(expression)}, execFunc{nullptr}, selectFunc{nullptr} {} + : ExpressionEvaluator{std::move(children)}, expression{std::move(expression)}, + execFunc{nullptr}, selectFunc{nullptr} {} - void init( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void init(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; void evaluate(main::ClientContext* clientContext) override; @@ -27,8 +27,8 @@ class FunctionExpressionEvaluator : public ExpressionEvaluator { std::unique_ptr clone() override; protected: - void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; private: std::shared_ptr expression; diff --git a/src/include/expression_evaluator/literal_evaluator.h b/src/include/expression_evaluator/literal_evaluator.h index 13996ee3442..4d02e7f1495 100644 --- a/src/include/expression_evaluator/literal_evaluator.h +++ b/src/include/expression_evaluator/literal_evaluator.h @@ -25,8 +25,8 @@ class LiteralExpressionEvaluator : public ExpressionEvaluator { } protected: - void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; private: std::shared_ptr value; diff --git a/src/include/expression_evaluator/node_rel_evaluator.h b/src/include/expression_evaluator/node_rel_evaluator.h index af2b5d2639d..ce357906601 100644 --- a/src/include/expression_evaluator/node_rel_evaluator.h +++ b/src/include/expression_evaluator/node_rel_evaluator.h @@ -18,8 +18,8 @@ class NodeRelExpressionEvaluator final : public ExpressionEvaluator { void evaluate(main::ClientContext* clientContext) override; - bool select( - common::SelectionVector& /*selVector*/, main::ClientContext* /*clientContext*/) override { + bool select(common::SelectionVector& /*selVector*/, + main::ClientContext* /*clientContext*/) override { KU_UNREACHABLE; } @@ -33,8 +33,8 @@ class NodeRelExpressionEvaluator final : public ExpressionEvaluator { } private: - void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; private: std::shared_ptr nodeOrRel; diff --git a/src/include/expression_evaluator/path_evaluator.h b/src/include/expression_evaluator/path_evaluator.h index 8ae31f0444b..e0c22e650c7 100644 --- a/src/include/expression_evaluator/path_evaluator.h +++ b/src/include/expression_evaluator/path_evaluator.h @@ -16,13 +16,13 @@ class PathExpressionEvaluator final : public ExpressionEvaluator { std::vector> children) : ExpressionEvaluator{std::move(children)}, expression{std::move(expression)} {} - void init( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void init(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; void evaluate(main::ClientContext* clientContext) override; - bool select( - common::SelectionVector& /*selVector*/, main::ClientContext* /*clientContext*/) override { + bool select(common::SelectionVector& /*selVector*/, + main::ClientContext* /*clientContext*/) override { KU_UNREACHABLE; } @@ -52,8 +52,8 @@ class PathExpressionEvaluator final : public ExpressionEvaluator { std::vector relFieldVectors; }; - void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* memoryManager) override; + void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* memoryManager) override; void copyNodes(common::sel_t resultPos, bool isEmptyRels); uint64_t copyRels(common::sel_t resultPos); diff --git a/src/include/expression_evaluator/reference_evaluator.h b/src/include/expression_evaluator/reference_evaluator.h index 8f897130592..1eb2a431ed9 100644 --- a/src/include/expression_evaluator/reference_evaluator.h +++ b/src/include/expression_evaluator/reference_evaluator.h @@ -23,8 +23,8 @@ class ReferenceExpressionEvaluator : public ExpressionEvaluator { } protected: - inline void resolveResultVector( - const processor::ResultSet& resultSet, storage::MemoryManager* /*memoryManager*/) override { + inline void resolveResultVector(const processor::ResultSet& resultSet, + storage::MemoryManager* /*memoryManager*/) override { resultVector = resultSet.dataChunks[vectorPos.dataChunkPos]->valueVectors[vectorPos.valueVectorPos]; } diff --git a/src/include/extension/extension.h b/src/include/extension/extension.h index 9a59d648408..05529c759bb 100644 --- a/src/include/extension/extension.h +++ b/src/include/extension/extension.h @@ -38,8 +38,8 @@ struct ExtensionUtils { struct ExtensionOptions { std::unordered_map extensionOptions; - void addExtensionOption( - std::string name, common::LogicalTypeID type, common::Value defaultValue); + void addExtensionOption(std::string name, common::LogicalTypeID type, + common::Value defaultValue); main::ExtensionOption* getExtensionOption(std::string name); }; diff --git a/src/include/function/aggregate/avg.h b/src/include/function/aggregate/avg.h index 4fc0467918c..c42d3b9d53a 100644 --- a/src/include/function/aggregate/avg.h +++ b/src/include/function/aggregate/avg.h @@ -48,8 +48,8 @@ struct AvgFunction { updateSingleValue(reinterpret_cast(state_), input, pos, multiplicity); } - static void updateSingleValue( - AvgState* state, common::ValueVector* input, uint32_t pos, uint64_t multiplicity) { + static void updateSingleValue(AvgState* state, common::ValueVector* input, uint32_t pos, + uint64_t multiplicity) { T val = input->getValue(pos); for (auto i = 0u; i < multiplicity; ++i) { if (state->isNull) { @@ -62,8 +62,8 @@ struct AvgFunction { state->count += multiplicity; } - static void combine( - uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* /*memoryManager*/) { + static void combine(uint8_t* state_, uint8_t* otherState_, + storage::MemoryManager* /*memoryManager*/) { auto* otherState = reinterpret_cast(otherState_); if (otherState->isNull) { return; diff --git a/src/include/function/aggregate/base_count.h b/src/include/function/aggregate/base_count.h index 4181b55c5d3..47dff0289a5 100644 --- a/src/include/function/aggregate/base_count.h +++ b/src/include/function/aggregate/base_count.h @@ -23,8 +23,8 @@ struct BaseCountFunction { return state; } - static void combine( - uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* /*memoryManager*/) { + static void combine(uint8_t* state_, uint8_t* otherState_, + storage::MemoryManager* /*memoryManager*/) { auto state = reinterpret_cast(state_); auto otherState = reinterpret_cast(otherState_); state->count += otherState->count; diff --git a/src/include/function/aggregate/collect.h b/src/include/function/aggregate/collect.h index 42f026c4a28..18128121037 100644 --- a/src/include/function/aggregate/collect.h +++ b/src/include/function/aggregate/collect.h @@ -18,8 +18,8 @@ struct CollectFunction { outputVector->setValue(pos, listEntry); auto outputDataVector = common::ListVector::getDataVector(outputVector); for (auto i = 0u; i < listEntry.size; i++) { - outputDataVector->copyFromRowData( - listEntry.offset + i, factorizedTable->getTuple(i)); + outputDataVector->copyFromRowData(listEntry.offset + i, + factorizedTable->getTuple(i)); } // CollectStates are stored in factorizedTable entries. When the factorizedTable is // destructed, the destructor of CollectStates won't be called. Therefore, we need to @@ -38,19 +38,19 @@ struct CollectFunction { static void updatePos(uint8_t* state_, common::ValueVector* input, uint64_t multiplicity, uint32_t pos, storage::MemoryManager* memoryManager); - static void initCollectStateIfNecessary( - CollectState* state, storage::MemoryManager* memoryManager, common::LogicalType& dataType); + static void initCollectStateIfNecessary(CollectState* state, + storage::MemoryManager* memoryManager, common::LogicalType& dataType); static void updateSingleValue(CollectState* state, common::ValueVector* input, uint32_t pos, uint64_t multiplicity, storage::MemoryManager* memoryManager); - static void combine( - uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* /*memoryManager*/); + static void combine(uint8_t* state_, uint8_t* otherState_, + storage::MemoryManager* /*memoryManager*/); static void finalize(uint8_t* /*state_*/) {} - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* definition); + static std::unique_ptr bindFunc(const binder::expression_vector& arguments, + Function* definition); static function_set getFunctionSet(); }; diff --git a/src/include/function/aggregate/min_max.h b/src/include/function/aggregate/min_max.h index a5c83f9e068..bcebb5a7848 100644 --- a/src/include/function/aggregate/min_max.h +++ b/src/include/function/aggregate/min_max.h @@ -66,8 +66,8 @@ struct MinMaxFunction { } template - static void combine( - uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* memoryManager) { + static void combine(uint8_t* state_, uint8_t* otherState_, + storage::MemoryManager* memoryManager) { auto* otherState = reinterpret_cast(otherState_); if (otherState->isNull) { return; @@ -91,8 +91,8 @@ struct MinMaxFunction { }; template<> -void MinMaxFunction::MinMaxState::setVal( - common::ku_string_t& val_, storage::MemoryManager* memoryManager) { +void MinMaxFunction::MinMaxState::setVal(common::ku_string_t& val_, + storage::MemoryManager* memoryManager) { if (overflowBuffer == nullptr) { overflowBuffer = std::make_unique(memoryManager); } diff --git a/src/include/function/aggregate/sum.h b/src/include/function/aggregate/sum.h index 2a991e24d83..02d1f47823c 100644 --- a/src/include/function/aggregate/sum.h +++ b/src/include/function/aggregate/sum.h @@ -46,8 +46,8 @@ struct SumFunction { updateSingleValue(state, input, pos, multiplicity); } - static void updateSingleValue( - SumState* state, common::ValueVector* input, uint32_t pos, uint64_t multiplicity) { + static void updateSingleValue(SumState* state, common::ValueVector* input, uint32_t pos, + uint64_t multiplicity) { T val = input->getValue(pos); for (auto j = 0u; j < multiplicity; ++j) { if (state->isNull) { @@ -59,8 +59,8 @@ struct SumFunction { } } - static void combine( - uint8_t* state_, uint8_t* otherState_, storage::MemoryManager* /*memoryManager*/) { + static void combine(uint8_t* state_, uint8_t* otherState_, + storage::MemoryManager* /*memoryManager*/) { auto* otherState = reinterpret_cast(otherState_); if (otherState->isNull) { return; diff --git a/src/include/function/aggregate_function.h b/src/include/function/aggregate_function.h index 57f29142273..864afbee2c6 100644 --- a/src/include/function/aggregate_function.h +++ b/src/include/function/aggregate_function.h @@ -75,8 +75,8 @@ struct AggregateFunction final : public BaseScalarFunction { return updatePosFunc(state, input, multiplicity, pos, memoryManager); } - inline void combineState( - uint8_t* state, uint8_t* otherState, storage::MemoryManager* memoryManager) const { + inline void combineState(uint8_t* state, uint8_t* otherState, + storage::MemoryManager* memoryManager) const { return combineFunc(state, otherState, memoryManager); } @@ -122,10 +122,10 @@ class AggregateFunctionUtil { common::LogicalTypeID inputType, common::LogicalTypeID resultType, bool isDistinct); static std::unique_ptr getAvgFunc(const std::string name, common::LogicalTypeID inputType, common::LogicalTypeID resultType, bool isDistinct); - static std::unique_ptr getMinFunc( - common::LogicalTypeID inputType, bool isDistinct); - static std::unique_ptr getMaxFunc( - common::LogicalTypeID inputType, bool isDistinct); + static std::unique_ptr getMinFunc(common::LogicalTypeID inputType, + bool isDistinct); + static std::unique_ptr getMaxFunc(common::LogicalTypeID inputType, + bool isDistinct); template static std::unique_ptr getMinMaxFunction(const std::string name, common::LogicalTypeID inputType, common::LogicalTypeID resultType, bool isDistinct); diff --git a/src/include/function/binary_function_executor.h b/src/include/function/binary_function_executor.h index 3b04943d083..c41afd9df94 100644 --- a/src/include/function/binary_function_executor.h +++ b/src/include/function/binary_function_executor.h @@ -86,8 +86,8 @@ struct BinaryFunctionExecutor { auto resPos = result.state->selVector->selectedPositions[0]; result.setNull(resPos, left.isNull(lPos) || right.isNull(rPos)); if (!result.isNull(resPos)) { - executeOnValue( - left, right, result, lPos, rPos, resPos, dataPtr); + executeOnValue(left, right, + result, lPos, rPos, resPos, dataPtr); } } @@ -101,14 +101,14 @@ struct BinaryFunctionExecutor { } else if (right.hasNoNullsGuarantee()) { if (right.state->selVector->isUnfiltered()) { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { - executeOnValue( - left, right, result, lPos, i, i, dataPtr); + executeOnValue(left, + right, result, lPos, i, i, dataPtr); } } else { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { auto rPos = right.state->selVector->selectedPositions[i]; - executeOnValue( - left, right, result, lPos, rPos, rPos, dataPtr); + executeOnValue(left, + right, result, lPos, rPos, rPos, dataPtr); } } } else { @@ -116,8 +116,8 @@ struct BinaryFunctionExecutor { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { result.setNull(i, right.isNull(i)); // left is always not null if (!result.isNull(i)) { - executeOnValue( - left, right, result, lPos, i, i, dataPtr); + executeOnValue(left, + right, result, lPos, i, i, dataPtr); } } } else { @@ -125,8 +125,8 @@ struct BinaryFunctionExecutor { auto rPos = right.state->selVector->selectedPositions[i]; result.setNull(rPos, right.isNull(rPos)); // left is always not null if (!result.isNull(rPos)) { - executeOnValue( - left, right, result, lPos, rPos, rPos, dataPtr); + executeOnValue(left, + right, result, lPos, rPos, rPos, dataPtr); } } } @@ -143,14 +143,14 @@ struct BinaryFunctionExecutor { } else if (left.hasNoNullsGuarantee()) { if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { - executeOnValue( - left, right, result, i, rPos, i, dataPtr); + executeOnValue(left, + right, result, i, rPos, i, dataPtr); } } else { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { auto lPos = left.state->selVector->selectedPositions[i]; - executeOnValue( - left, right, result, lPos, rPos, lPos, dataPtr); + executeOnValue(left, + right, result, lPos, rPos, lPos, dataPtr); } } } else { @@ -158,8 +158,8 @@ struct BinaryFunctionExecutor { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { result.setNull(i, left.isNull(i)); // right is always not null if (!result.isNull(i)) { - executeOnValue( - left, right, result, i, rPos, i, dataPtr); + executeOnValue(left, + right, result, i, rPos, i, dataPtr); } } } else { @@ -167,8 +167,8 @@ struct BinaryFunctionExecutor { auto lPos = left.state->selVector->selectedPositions[i]; result.setNull(lPos, left.isNull(lPos)); // right is always not null if (!result.isNull(lPos)) { - executeOnValue( - left, right, result, lPos, rPos, lPos, dataPtr); + executeOnValue(left, + right, result, lPos, rPos, lPos, dataPtr); } } } @@ -183,14 +183,14 @@ struct BinaryFunctionExecutor { if (left.hasNoNullsGuarantee() && right.hasNoNullsGuarantee()) { if (result.state->selVector->isUnfiltered()) { for (uint64_t i = 0; i < result.state->selVector->selectedSize; i++) { - executeOnValue( - left, right, result, i, i, i, dataPtr); + executeOnValue(left, + right, result, i, i, i, dataPtr); } } else { for (uint64_t i = 0; i < result.state->selVector->selectedSize; i++) { auto pos = result.state->selVector->selectedPositions[i]; - executeOnValue( - left, right, result, pos, pos, pos, dataPtr); + executeOnValue(left, + right, result, pos, pos, pos, dataPtr); } } } else { @@ -198,8 +198,8 @@ struct BinaryFunctionExecutor { for (uint64_t i = 0; i < result.state->selVector->selectedSize; i++) { result.setNull(i, left.isNull(i) || right.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - left, right, result, i, i, i, dataPtr); + executeOnValue(left, + right, result, i, i, i, dataPtr); } } } else { @@ -207,8 +207,8 @@ struct BinaryFunctionExecutor { auto pos = result.state->selVector->selectedPositions[i]; result.setNull(pos, left.isNull(pos) || right.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - left, right, result, pos, pos, pos, dataPtr); + executeOnValue(left, + right, result, pos, pos, pos, dataPtr); } } } @@ -221,53 +221,53 @@ struct BinaryFunctionExecutor { common::ValueVector& result, void* dataPtr) { result.resetAuxiliaryBuffer(); if (left.state->isFlat() && right.state->isFlat()) { - executeBothFlat( - left, right, result, dataPtr); + executeBothFlat(left, right, + result, dataPtr); } else if (left.state->isFlat() && !right.state->isFlat()) { - executeFlatUnFlat( - left, right, result, dataPtr); + executeFlatUnFlat(left, right, + result, dataPtr); } else if (!left.state->isFlat() && right.state->isFlat()) { - executeUnFlatFlat( - left, right, result, dataPtr); + executeUnFlatFlat(left, right, + result, dataPtr); } else if (!left.state->isFlat() && !right.state->isFlat()) { - executeBothUnFlat( - left, right, result, dataPtr); + executeBothUnFlat(left, right, + result, dataPtr); } else { KU_ASSERT(false); } } template - static void execute( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { - executeSwitch( - left, right, result, nullptr /* dataPtr */); + static void execute(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { + executeSwitch(left, right, + result, nullptr /* dataPtr */); } template - static void executeString( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { - executeSwitch( - left, right, result, nullptr /* dataPtr */); + static void executeString(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { + executeSwitch(left, + right, result, nullptr /* dataPtr */); } template - static void executeListStruct( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void executeListStruct(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { executeSwitch( left, right, result, nullptr /* dataPtr */); } template - static void executeListExtract( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void executeListExtract(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { executeSwitch( left, right, result, nullptr /* dataPtr */); } template - static void executeComparison( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void executeComparison(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { executeSwitch( left, right, result, nullptr /* dataPtr */); } @@ -275,8 +275,8 @@ struct BinaryFunctionExecutor { template static void executeUDF(common::ValueVector& left, common::ValueVector& right, common::ValueVector& result, void* dataPtr) { - executeSwitch( - left, right, result, dataPtr); + executeSwitch(left, + right, result, dataPtr); } struct BinarySelectWrapper { @@ -321,8 +321,8 @@ struct BinaryFunctionExecutor { } template - static bool selectFlatUnFlat( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectFlatUnFlat(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { auto lPos = left.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; auto selectedPositionsBuffer = selVector.getMultableBuffer(); @@ -331,22 +331,22 @@ struct BinaryFunctionExecutor { } else if (right.hasNoNullsGuarantee()) { if (right.state->selVector->isUnfiltered()) { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { - selectOnValue( - left, right, lPos, i, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, lPos, i, + i, numSelectedValues, selectedPositionsBuffer); } } else { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { auto rPos = right.state->selVector->selectedPositions[i]; - selectOnValue( - left, right, lPos, rPos, rPos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, lPos, + rPos, rPos, numSelectedValues, selectedPositionsBuffer); } } } else { if (right.state->selVector->isUnfiltered()) { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { if (!right.isNull(i)) { - selectOnValue( - left, right, lPos, i, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, + lPos, i, i, numSelectedValues, selectedPositionsBuffer); } } } else { @@ -364,8 +364,8 @@ struct BinaryFunctionExecutor { } template - static bool selectUnFlatFlat( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectUnFlatFlat(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { auto rPos = right.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; auto selectedPositionsBuffer = selVector.getMultableBuffer(); @@ -374,22 +374,22 @@ struct BinaryFunctionExecutor { } else if (left.hasNoNullsGuarantee()) { if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { - selectOnValue( - left, right, i, rPos, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, i, rPos, + i, numSelectedValues, selectedPositionsBuffer); } } else { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { auto lPos = left.state->selVector->selectedPositions[i]; - selectOnValue( - left, right, lPos, rPos, lPos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, lPos, + rPos, lPos, numSelectedValues, selectedPositionsBuffer); } } } else { if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { if (!left.isNull(i)) { - selectOnValue( - left, right, i, rPos, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, i, + rPos, i, numSelectedValues, selectedPositionsBuffer); } } } else { @@ -408,21 +408,21 @@ struct BinaryFunctionExecutor { // Right, left, and result vectors share the same selectedPositions. template - static bool selectBothUnFlat( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectBothUnFlat(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { uint64_t numSelectedValues = 0; auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.hasNoNullsGuarantee() && right.hasNoNullsGuarantee()) { if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; i++) { - selectOnValue( - left, right, i, i, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, i, i, i, + numSelectedValues, selectedPositionsBuffer); } } else { for (auto i = 0u; i < left.state->selVector->selectedSize; i++) { auto pos = left.state->selVector->selectedPositions[i]; - selectOnValue( - left, right, pos, pos, pos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, pos, + pos, pos, numSelectedValues, selectedPositionsBuffer); } } } else { @@ -430,8 +430,8 @@ struct BinaryFunctionExecutor { for (uint64_t i = 0; i < left.state->selVector->selectedSize; i++) { auto isNull = left.isNull(i) || right.isNull(i); if (!isNull) { - selectOnValue( - left, right, i, i, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, i, + i, i, numSelectedValues, selectedPositionsBuffer); } } } else { @@ -439,8 +439,8 @@ struct BinaryFunctionExecutor { auto pos = left.state->selVector->selectedPositions[i]; auto isNull = left.isNull(pos) || right.isNull(pos); if (!isNull) { - selectOnValue( - left, right, pos, pos, pos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, pos, + pos, pos, numSelectedValues, selectedPositionsBuffer); } } } @@ -451,29 +451,29 @@ struct BinaryFunctionExecutor { // BOOLEAN (AND, OR, XOR) template - static bool select( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool select(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { if (left.state->isFlat() && right.state->isFlat()) { return selectBothFlat(left, right); } else if (left.state->isFlat() && !right.state->isFlat()) { - return selectFlatUnFlat( - left, right, selVector); + return selectFlatUnFlat(left, right, + selVector); } else if (!left.state->isFlat() && right.state->isFlat()) { - return selectUnFlatFlat( - left, right, selVector); + return selectUnFlatFlat(left, right, + selVector); } else { - return selectBothUnFlat( - left, right, selVector); + return selectBothUnFlat(left, right, + selVector); } } // COMPARISON (GT, GTE, LT, LTE, EQ, NEQ) template - static bool selectComparison( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectComparison(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { if (left.state->isFlat() && right.state->isFlat()) { - return selectBothFlat( - left, right); + return selectBothFlat(left, + right); } else if (left.state->isFlat() && !right.state->isFlat()) { return selectFlatUnFlat( left, right, selVector); diff --git a/src/include/function/blob/functions/decode_function.h b/src/include/function/blob/functions/decode_function.h index 0f07e8956cd..95ceb9062db 100644 --- a/src/include/function/blob/functions/decode_function.h +++ b/src/include/function/blob/functions/decode_function.h @@ -8,8 +8,8 @@ namespace kuzu { namespace function { struct Decode { - static inline void operation( - common::blob_t& input, common::ku_string_t& result, common::ValueVector& resultVector) { + static inline void operation(common::blob_t& input, common::ku_string_t& result, + common::ValueVector& resultVector) { if (utf8proc::Utf8Proc::analyze(reinterpret_cast(input.value.getData()), input.value.len) == utf8proc::UnicodeType::INVALID) { throw common::RuntimeException( diff --git a/src/include/function/blob/functions/encode_function.h b/src/include/function/blob/functions/encode_function.h index 39d07563862..abcc282287d 100644 --- a/src/include/function/blob/functions/encode_function.h +++ b/src/include/function/blob/functions/encode_function.h @@ -7,8 +7,8 @@ namespace kuzu { namespace function { struct Encode { - static inline void operation( - common::ku_string_t& input, common::blob_t& result, common::ValueVector& resultVector) { + static inline void operation(common::ku_string_t& input, common::blob_t& result, + common::ValueVector& resultVector) { common::StringVector::addString(&resultVector, result.value, input); } }; diff --git a/src/include/function/boolean/boolean_function_executor.h b/src/include/function/boolean/boolean_function_executor.h index 6b1a68cde73..c5958e9f412 100644 --- a/src/include/function/boolean/boolean_function_executor.h +++ b/src/include/function/boolean/boolean_function_executor.h @@ -32,8 +32,8 @@ struct BinaryBooleanFunctionExecutor { } template - static inline void executeBothFlat( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static inline void executeBothFlat(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { auto lPos = left.state->selVector->selectedPositions[0]; auto rPos = right.state->selVector->selectedPositions[0]; auto resPos = result.state->selVector->selectedPositions[0]; @@ -41,8 +41,8 @@ struct BinaryBooleanFunctionExecutor { } template - static void executeFlatUnFlat( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void executeFlatUnFlat(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { auto lPos = left.state->selVector->selectedPositions[0]; if (right.state->selVector->isUnfiltered()) { if (right.hasNoNullsGuarantee() && !left.isNull(lPos)) { @@ -70,8 +70,8 @@ struct BinaryBooleanFunctionExecutor { } template - static void executeUnFlatFlat( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void executeUnFlatFlat(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { auto rPos = right.state->selVector->selectedPositions[0]; if (left.state->selVector->isUnfiltered()) { if (left.hasNoNullsGuarantee() && !right.isNull(rPos)) { @@ -99,8 +99,8 @@ struct BinaryBooleanFunctionExecutor { } template - static void executeBothUnFlat( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void executeBothUnFlat(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { KU_ASSERT(left.state == right.state); if (left.state->selVector->isUnfiltered()) { if (left.hasNoNullsGuarantee() && right.hasNoNullsGuarantee()) { @@ -128,8 +128,8 @@ struct BinaryBooleanFunctionExecutor { } template - static void execute( - common::ValueVector& left, common::ValueVector& right, common::ValueVector& result) { + static void execute(common::ValueVector& left, common::ValueVector& right, + common::ValueVector& result) { KU_ASSERT(left.dataType.getLogicalTypeID() == common::LogicalTypeID::BOOL && right.dataType.getLogicalTypeID() == common::LogicalTypeID::BOOL && result.dataType.getLogicalTypeID() == common::LogicalTypeID::BOOL); @@ -166,21 +166,21 @@ struct BinaryBooleanFunctionExecutor { } template - static bool selectFlatUnFlat( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectFlatUnFlat(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { auto lPos = left.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (right.state->selVector->isUnfiltered()) { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { - selectOnValue( - left, right, lPos, i, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, lPos, i, i, numSelectedValues, + selectedPositionsBuffer); } } else { for (auto i = 0u; i < right.state->selVector->selectedSize; ++i) { auto rPos = right.state->selVector->selectedPositions[i]; - selectOnValue( - left, right, lPos, rPos, rPos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, lPos, rPos, rPos, numSelectedValues, + selectedPositionsBuffer); } } selVector.selectedSize = numSelectedValues; @@ -188,21 +188,21 @@ struct BinaryBooleanFunctionExecutor { } template - static bool selectUnFlatFlat( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectUnFlatFlat(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { auto rPos = right.state->selVector->selectedPositions[0]; uint64_t numSelectedValues = 0; auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { - selectOnValue( - left, right, i, rPos, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, i, rPos, i, numSelectedValues, + selectedPositionsBuffer); } } else { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { auto lPos = left.state->selVector->selectedPositions[i]; - selectOnValue( - left, right, lPos, rPos, lPos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, lPos, rPos, lPos, numSelectedValues, + selectedPositionsBuffer); } } selVector.selectedSize = numSelectedValues; @@ -210,20 +210,20 @@ struct BinaryBooleanFunctionExecutor { } template - static bool selectBothUnFlat( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool selectBothUnFlat(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { uint64_t numSelectedValues = 0; auto selectedPositionsBuffer = selVector.getMultableBuffer(); if (left.state->selVector->isUnfiltered()) { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { - selectOnValue( - left, right, i, i, i, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, i, i, i, numSelectedValues, + selectedPositionsBuffer); } } else { for (auto i = 0u; i < left.state->selVector->selectedSize; ++i) { auto pos = left.state->selVector->selectedPositions[i]; - selectOnValue( - left, right, pos, pos, pos, numSelectedValues, selectedPositionsBuffer); + selectOnValue(left, right, pos, pos, pos, numSelectedValues, + selectedPositionsBuffer); } } selVector.selectedSize = numSelectedValues; @@ -231,8 +231,8 @@ struct BinaryBooleanFunctionExecutor { } template - static bool select( - common::ValueVector& left, common::ValueVector& right, common::SelectionVector& selVector) { + static bool select(common::ValueVector& left, common::ValueVector& right, + common::SelectionVector& selVector) { KU_ASSERT(left.dataType.getLogicalTypeID() == common::LogicalTypeID::BOOL && right.dataType.getLogicalTypeID() == common::LogicalTypeID::BOOL); if (left.state->isFlat() && right.state->isFlat()) { @@ -288,8 +288,8 @@ struct UnaryBooleanOperationExecutor { static inline void selectOnValue(common::ValueVector& operand, uint64_t operandPos, uint64_t& numSelectedValues, common::sel_t* selectedPositionsBuffer) { uint8_t resultValue = 0; - FUNC::operation( - operand.getValue(operandPos), operand.isNull(operandPos), resultValue); + FUNC::operation(operand.getValue(operandPos), operand.isNull(operandPos), + resultValue); selectedPositionsBuffer[numSelectedValues] = operandPos; numSelectedValues += resultValue == true; } diff --git a/src/include/function/boolean/boolean_functions.h b/src/include/function/boolean/boolean_functions.h index f90a8b57433..c09f013888c 100644 --- a/src/include/function/boolean/boolean_functions.h +++ b/src/include/function/boolean/boolean_functions.h @@ -36,8 +36,8 @@ const uint8_t NULL_BOOL = 2; * - T - T 2 * */ struct And { - static inline void operation( - bool left, bool right, uint8_t& result, bool isLeftNull, bool isRightNull) { + static inline void operation(bool left, bool right, uint8_t& result, bool isLeftNull, + bool isRightNull) { if ((!left && !isLeftNull) || (!right && !isRightNull)) { result = false; } else if (isLeftNull || isRightNull) { @@ -64,8 +64,8 @@ struct And { * - T - T 2 * */ struct Or { - static inline void operation( - bool left, bool right, uint8_t& result, bool isLeftNull, bool isRightNull) { + static inline void operation(bool left, bool right, uint8_t& result, bool isLeftNull, + bool isRightNull) { if ((left && !isLeftNull) || (right && !isRightNull)) { result = true; } else if (isLeftNull || isRightNull) { @@ -92,8 +92,8 @@ struct Or { * - T - T 2 * */ struct Xor { - static inline void operation( - bool left, bool right, uint8_t& result, bool isLeftNull, bool isRightNull) { + static inline void operation(bool left, bool right, uint8_t& result, bool isLeftNull, + bool isRightNull) { if (isLeftNull || isRightNull) { result = NULL_BOOL; } else { diff --git a/src/include/function/built_in_function_utils.h b/src/include/function/built_in_function_utils.h index f74d39f1e23..ae8d19d0a78 100644 --- a/src/include/function/built_in_function_utils.h +++ b/src/include/function/built_in_function_utils.h @@ -24,8 +24,8 @@ class BuiltInFunctionsUtils { const std::vector& inputTypes, bool isDistinct, catalog::CatalogSet* catalogSet); - static uint32_t getCastCost( - common::LogicalTypeID inputTypeID, common::LogicalTypeID targetTypeID); + static uint32_t getCastCost(common::LogicalTypeID inputTypeID, + common::LogicalTypeID targetTypeID); private: // TODO(Xiyang): move casting cost related functions to binder. @@ -67,8 +67,8 @@ class BuiltInFunctionsUtils { static Function* getBestMatch(std::vector& functions); - static uint32_t getFunctionCost( - const std::vector& inputTypes, Function* function, bool isOverload); + static uint32_t getFunctionCost(const std::vector& inputTypes, + Function* function, bool isOverload); static uint32_t matchParameters(const std::vector& inputTypes, const std::vector& targetTypeIDs, bool isOverload); static uint32_t matchVarLengthParameters(const std::vector& inputTypes, diff --git a/src/include/function/cast/functions/cast_from_string_functions.h b/src/include/function/cast/functions/cast_from_string_functions.h index 219021f3354..fdc74fb7c86 100644 --- a/src/include/function/cast/functions/cast_from_string_functions.h +++ b/src/include/function/cast/functions/cast_from_string_functions.h @@ -13,14 +13,14 @@ namespace kuzu { namespace function { struct CastString { - static void copyStringToVector( - ValueVector* vector, uint64_t vectorPos, std::string_view strVal, const CSVOption* option); + static void copyStringToVector(ValueVector* vector, uint64_t vectorPos, std::string_view strVal, + const CSVOption* option); template static inline bool tryCast(const ku_string_t& input, T& result) { // try cast for signed integer types - return trySimpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result); + return trySimpleIntegerCast(reinterpret_cast(input.getData()), + input.len, result); } template @@ -42,64 +42,64 @@ inline void CastString::operation(const ku_string_t& input, int128_t& result, template<> inline void CastString::operation(const ku_string_t& input, int32_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::INT32); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, result, + LogicalTypeID::INT32); } template<> inline void CastString::operation(const ku_string_t& input, int16_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::INT16); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, result, + LogicalTypeID::INT16); } template<> inline void CastString::operation(const ku_string_t& input, int8_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::INT8); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, result, + LogicalTypeID::INT8); } template<> inline void CastString::operation(const ku_string_t& input, uint64_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::UINT64); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, + result, LogicalTypeID::UINT64); } template<> inline void CastString::operation(const ku_string_t& input, uint32_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::UINT32); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, + result, LogicalTypeID::UINT32); } template<> inline void CastString::operation(const ku_string_t& input, uint16_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::UINT16); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, + result, LogicalTypeID::UINT16); } template<> inline void CastString::operation(const ku_string_t& input, uint8_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - simpleIntegerCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::UINT8); + simpleIntegerCast(reinterpret_cast(input.getData()), input.len, + result, LogicalTypeID::UINT8); } template<> inline void CastString::operation(const ku_string_t& input, float& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - doubleCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::FLOAT); + doubleCast(reinterpret_cast(input.getData()), input.len, result, + LogicalTypeID::FLOAT); } template<> inline void CastString::operation(const ku_string_t& input, double& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - doubleCast( - reinterpret_cast(input.getData()), input.len, result, LogicalTypeID::DOUBLE); + doubleCast(reinterpret_cast(input.getData()), input.len, result, + LogicalTypeID::DOUBLE); } template<> @@ -117,29 +117,29 @@ inline void CastString::operation(const ku_string_t& input, timestamp_t& result, template<> inline void CastString::operation(const ku_string_t& input, timestamp_ns_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - TryCastStringToTimestamp::cast( - (const char*)input.getData(), input.len, result, LogicalTypeID::TIMESTAMP_NS); + TryCastStringToTimestamp::cast((const char*)input.getData(), input.len, result, + LogicalTypeID::TIMESTAMP_NS); } template<> inline void CastString::operation(const ku_string_t& input, timestamp_ms_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - TryCastStringToTimestamp::cast( - (const char*)input.getData(), input.len, result, LogicalTypeID::TIMESTAMP_MS); + TryCastStringToTimestamp::cast((const char*)input.getData(), input.len, result, + LogicalTypeID::TIMESTAMP_MS); } template<> inline void CastString::operation(const ku_string_t& input, timestamp_sec_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - TryCastStringToTimestamp::cast( - (const char*)input.getData(), input.len, result, LogicalTypeID::TIMESTAMP_SEC); + TryCastStringToTimestamp::cast((const char*)input.getData(), input.len, result, + LogicalTypeID::TIMESTAMP_SEC); } template<> inline void CastString::operation(const ku_string_t& input, timestamp_tz_t& result, ValueVector* /*resultVector*/, uint64_t /*rowToAdd*/, const CSVOption* /*option*/) { - TryCastStringToTimestamp::cast( - (const char*)input.getData(), input.len, result, LogicalTypeID::TIMESTAMP_TZ); + TryCastStringToTimestamp::cast((const char*)input.getData(), input.len, result, + LogicalTypeID::TIMESTAMP_TZ); } template<> diff --git a/src/include/function/cast/functions/cast_functions.h b/src/include/function/cast/functions/cast_functions.h index 4574ae315f1..9ddaf5b26b3 100644 --- a/src/include/function/cast/functions/cast_functions.h +++ b/src/include/function/cast/functions/cast_functions.h @@ -73,8 +73,8 @@ struct CastToDouble { template<> inline void CastToDouble::operation(common::int128_t& input, double& result) { if (!common::Int128_t::tryCast(input, result)) { // LCOV_EXCL_START - throw common::OverflowException{common::stringFormat( - "Value {} is not within DOUBLE range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within DOUBLE range", + common::TypeUtils::toString(input))}; } // LCOV_EXCL_STOP } @@ -91,8 +91,8 @@ struct CastToFloat { template<> inline void CastToFloat::operation(common::int128_t& input, float& result) { if (!common::Int128_t::tryCast(input, result)) { // LCOV_EXCL_START - throw common::OverflowException{common::stringFormat( - "Value {} is not within FLOAT range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within FLOAT range", + common::TypeUtils::toString(input))}; }; // LCOV_EXCL_STOP } @@ -116,8 +116,8 @@ struct CastToInt64 { template<> inline void CastToInt64::operation(common::int128_t& input, int64_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within INT64 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within INT64 range", + common::TypeUtils::toString(input))}; }; } @@ -134,8 +134,8 @@ struct CastToSerial { template<> inline void CastToSerial::operation(common::int128_t& input, int64_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within INT64 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within INT64 range", + common::TypeUtils::toString(input))}; }; } @@ -152,8 +152,8 @@ struct CastToInt32 { template<> inline void CastToInt32::operation(common::int128_t& input, int32_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within INT32 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within INT32 range", + common::TypeUtils::toString(input))}; }; } @@ -170,8 +170,8 @@ struct CastToInt16 { template<> inline void CastToInt16::operation(common::int128_t& input, int16_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within INT16 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within INT16 range", + common::TypeUtils::toString(input))}; }; } @@ -188,8 +188,8 @@ struct CastToInt8 { template<> inline void CastToInt8::operation(common::int128_t& input, int8_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within INT8 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within INT8 range", + common::TypeUtils::toString(input))}; }; } @@ -206,8 +206,8 @@ struct CastToUInt64 { template<> inline void CastToUInt64::operation(common::int128_t& input, uint64_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within UINT64 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within UINT64 range", + common::TypeUtils::toString(input))}; }; } @@ -224,8 +224,8 @@ struct CastToUInt32 { template<> inline void CastToUInt32::operation(common::int128_t& input, uint32_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within UINT32 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within UINT32 range", + common::TypeUtils::toString(input))}; }; } @@ -242,8 +242,8 @@ struct CastToUInt16 { template<> inline void CastToUInt16::operation(common::int128_t& input, uint16_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within UINT16 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within UINT16 range", + common::TypeUtils::toString(input))}; }; } @@ -260,8 +260,8 @@ struct CastToUInt8 { template<> inline void CastToUInt8::operation(common::int128_t& input, uint8_t& result) { if (!common::Int128_t::tryCast(input, result)) { - throw common::OverflowException{common::stringFormat( - "Value {} is not within UINT8 range", common::TypeUtils::toString(input))}; + throw common::OverflowException{common::stringFormat("Value {} is not within UINT8 range", + common::TypeUtils::toString(input))}; }; } @@ -274,79 +274,79 @@ struct CastBetweenTimestamp { }; template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_t& input, common::timestamp_ns_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_t& input, + common::timestamp_ns_t& output) { output.value = common::Timestamp::getEpochNanoSeconds(input); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_t& input, common::timestamp_ms_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_t& input, + common::timestamp_ms_t& output) { output.value = common::Timestamp::getEpochMilliSeconds(input); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_t& input, common::timestamp_sec_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_t& input, + common::timestamp_sec_t& output) { output.value = common::Timestamp::getEpochSeconds(input); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_ms_t& input, common::timestamp_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_ms_t& input, + common::timestamp_t& output) { output = common::Timestamp::fromEpochMilliSeconds(input.value); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_ms_t& input, common::timestamp_ns_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_ms_t& input, + common::timestamp_ns_t& output) { operation(input, output); operation(output, output); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_ms_t& input, common::timestamp_sec_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_ms_t& input, + common::timestamp_sec_t& output) { operation(input, output); operation(output, output); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_ns_t& input, common::timestamp_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_ns_t& input, + common::timestamp_t& output) { output = common::Timestamp::fromEpochNanoSeconds(input.value); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_ns_t& input, common::timestamp_ms_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_ns_t& input, + common::timestamp_ms_t& output) { operation(input, output); operation(output, output); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_ns_t& input, common::timestamp_sec_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_ns_t& input, + common::timestamp_sec_t& output) { operation(input, output); operation(output, output); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_sec_t& input, common::timestamp_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_sec_t& input, + common::timestamp_t& output) { output = common::Timestamp::fromEpochSeconds(input.value); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_sec_t& input, common::timestamp_ns_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_sec_t& input, + common::timestamp_ns_t& output) { operation(input, output); operation(output, output); } template<> -inline void CastBetweenTimestamp::operation( - const common::timestamp_sec_t& input, common::timestamp_ms_t& output) { +inline void CastBetweenTimestamp::operation(const common::timestamp_sec_t& input, + common::timestamp_ms_t& output) { operation(input, output); operation(output, output); } diff --git a/src/include/function/cast/functions/cast_string_non_nested_functions.h b/src/include/function/cast/functions/cast_string_non_nested_functions.h index 020d0c5dbc1..ab75ea89fad 100644 --- a/src/include/function/cast/functions/cast_string_non_nested_functions.h +++ b/src/include/function/cast/functions/cast_string_non_nested_functions.h @@ -188,8 +188,8 @@ inline bool trySimpleIntegerCast(const char* input, uint64_t len, T& result) { } template -inline void simpleIntegerCast( - const char* input, uint64_t len, T& result, LogicalTypeID typeID = LogicalTypeID::ANY) { +inline void simpleIntegerCast(const char* input, uint64_t len, T& result, + LogicalTypeID typeID = LogicalTypeID::ANY) { if (!trySimpleIntegerCast(input, len, result)) { throw ConversionException(stringFormat("Cast failed. Could not convert \"{}\" to {}.", std::string{input, len}, LogicalTypeUtils::toString(typeID))); @@ -217,8 +217,8 @@ inline bool tryDoubleCast(const char* input, uint64_t len, T& result) { } template -inline void doubleCast( - const char* input, uint64_t len, T& result, LogicalTypeID typeID = LogicalTypeID::ANY) { +inline void doubleCast(const char* input, uint64_t len, T& result, + LogicalTypeID typeID = LogicalTypeID::ANY) { if (!tryDoubleCast(input, len, result)) { throw ConversionException(stringFormat("Cast failed. {} is not in {} range.", std::string{input, len}, LogicalTypeUtils::toString(typeID))); @@ -233,27 +233,27 @@ struct TryCastStringToTimestamp { template static void cast(const char* input, uint64_t len, timestamp_t& result, LogicalTypeID typeID) { if (!tryCast(input, len, result)) { - throw ConversionException(Timestamp::getTimestampConversionExceptionMsg( - input, len, LogicalTypeUtils::toString(typeID))); + throw ConversionException(Timestamp::getTimestampConversionExceptionMsg(input, len, + LogicalTypeUtils::toString(typeID))); } } }; template<> -bool TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result); +bool TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result); template<> -bool TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result); +bool TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result); template<> -bool TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result); +bool TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result); template<> -bool inline TryCastStringToTimestamp::tryCast( - const char* input, uint64_t len, timestamp_t& result) { +bool inline TryCastStringToTimestamp::tryCast(const char* input, uint64_t len, + timestamp_t& result) { return Timestamp::tryConvertTimestamp(input, len, result); } diff --git a/src/include/function/cast/functions/numeric_cast.h b/src/include/function/cast/functions/numeric_cast.h index 861fe0724a3..a1fe65a0261 100644 --- a/src/include/function/cast/functions/numeric_cast.h +++ b/src/include/function/cast/functions/numeric_cast.h @@ -74,14 +74,14 @@ inline bool tryCastWithOverflowCheck(float value, int16_t& result) { template<> inline bool tryCastWithOverflowCheck(float value, int32_t& result) { - return tryCastWithOverflowCheckFloat( - value, result, -2147483648.0f, 2147483648.0f); + return tryCastWithOverflowCheckFloat(value, result, -2147483648.0f, + 2147483648.0f); } template<> inline bool tryCastWithOverflowCheck(float value, int64_t& result) { - return tryCastWithOverflowCheckFloat( - value, result, -9223372036854775808.0f, 9223372036854775808.0f); + return tryCastWithOverflowCheckFloat(value, result, -9223372036854775808.0f, + 9223372036854775808.0f); } template<> @@ -101,8 +101,8 @@ inline bool tryCastWithOverflowCheck(float value, uint32_t& result) { template<> inline bool tryCastWithOverflowCheck(float value, uint64_t& result) { - return tryCastWithOverflowCheckFloat( - value, result, 0.0f, 18446744073709551616.0f); + return tryCastWithOverflowCheckFloat(value, result, 0.0f, + 18446744073709551616.0f); } template<> @@ -117,14 +117,14 @@ inline bool tryCastWithOverflowCheck(double value, int16_t& result) { template<> inline bool tryCastWithOverflowCheck(double value, int32_t& result) { - return tryCastWithOverflowCheckFloat( - value, result, -2147483648.0, 2147483648.0); + return tryCastWithOverflowCheckFloat(value, result, -2147483648.0, + 2147483648.0); } template<> inline bool tryCastWithOverflowCheck(double value, int64_t& result) { - return tryCastWithOverflowCheckFloat( - value, result, -9223372036854775808.0, 9223372036854775808.0); + return tryCastWithOverflowCheckFloat(value, result, -9223372036854775808.0, + 9223372036854775808.0); } template<> @@ -144,8 +144,8 @@ inline bool tryCastWithOverflowCheck(double value, uint32_t& result) { template<> inline bool tryCastWithOverflowCheck(double value, uint64_t& result) { - return tryCastWithOverflowCheckFloat( - value, result, 0.0, 18446744073709551615.0); + return tryCastWithOverflowCheckFloat(value, result, 0.0, + 18446744073709551615.0); } template<> diff --git a/src/include/function/cast/vector_cast_functions.h b/src/include/function/cast/vector_cast_functions.h index 1cad769ccb7..3ca772935a8 100644 --- a/src/include/function/cast/vector_cast_functions.h +++ b/src/include/function/cast/vector_cast_functions.h @@ -13,8 +13,8 @@ namespace function { struct CastFunction { // This function is only used by expression binder when implicit cast is needed. // The expression binder should consider reusing the existing matchFunction() API. - static bool hasImplicitCast( - const common::LogicalType& srcType, const common::LogicalType& dstType); + static bool hasImplicitCast(const common::LogicalType& srcType, + const common::LogicalType& dstType); template static std::unique_ptr bindCastFunction(const std::string& functionName, diff --git a/src/include/function/comparison/vector_comparison_functions.h b/src/include/function/comparison/vector_comparison_functions.h index 61e0c3f112e..2f7a439a20a 100644 --- a/src/include/function/comparison/vector_comparison_functions.h +++ b/src/include/function/comparison/vector_comparison_functions.h @@ -21,8 +21,8 @@ struct ComparisonFunction { getFunction(name, common::LogicalTypeID::STRUCT, common::LogicalTypeID::STRUCT)); // We can only check whether two internal ids are equal or not. So INTERNAL_ID is not // part of the comparable logical types. - functionSet.push_back(getFunction( - name, common::LogicalTypeID::INTERNAL_ID, common::LogicalTypeID::INTERNAL_ID)); + functionSet.push_back(getFunction(name, common::LogicalTypeID::INTERNAL_ID, + common::LogicalTypeID::INTERNAL_ID)); return functionSet; } @@ -41,13 +41,13 @@ struct ComparisonFunction { const std::vector>& params, common::SelectionVector& selVector) { KU_ASSERT(params.size() == 2); - return BinaryFunctionExecutor::selectComparison( - *params[0], *params[1], selVector); + return BinaryFunctionExecutor::selectComparison(*params[0], + *params[1], selVector); } template - static std::unique_ptr getFunction( - const std::string& name, common::LogicalTypeID leftType, common::LogicalTypeID rightType) { + static std::unique_ptr getFunction(const std::string& name, + common::LogicalTypeID leftType, common::LogicalTypeID rightType) { auto leftPhysical = common::LogicalType::getPhysicalType(leftType); auto rightPhysical = common::LogicalType::getPhysicalType(rightType); scalar_func_exec_t execFunc; diff --git a/src/include/function/date/date_functions.h b/src/include/function/date/date_functions.h index 1b5ba3419be..0ab4e2d499f 100644 --- a/src/include/function/date/date_functions.h +++ b/src/include/function/date/date_functions.h @@ -75,31 +75,31 @@ inline void LastDay::operation(common::timestamp_t& input, common::date_t& resul struct DatePart { template - static inline void operation( - LEFT_TYPE& /*partSpecifier*/, RIGHT_TYPE& /*input*/, int64_t& /*result*/) { + static inline void operation(LEFT_TYPE& /*partSpecifier*/, RIGHT_TYPE& /*input*/, + int64_t& /*result*/) { KU_UNREACHABLE; } }; template<> -inline void DatePart::operation( - common::ku_string_t& partSpecifier, common::date_t& input, int64_t& result) { +inline void DatePart::operation(common::ku_string_t& partSpecifier, common::date_t& input, + int64_t& result) { common::DatePartSpecifier specifier; common::Interval::tryGetDatePartSpecifier(partSpecifier.getAsString(), specifier); result = common::Date::getDatePart(specifier, input); } template<> -inline void DatePart::operation( - common::ku_string_t& partSpecifier, common::timestamp_t& input, int64_t& result) { +inline void DatePart::operation(common::ku_string_t& partSpecifier, common::timestamp_t& input, + int64_t& result) { common::DatePartSpecifier specifier; common::Interval::tryGetDatePartSpecifier(partSpecifier.getAsString(), specifier); result = common::Timestamp::getTimestampPart(specifier, input); } template<> -inline void DatePart::operation( - common::ku_string_t& partSpecifier, common::interval_t& input, int64_t& result) { +inline void DatePart::operation(common::ku_string_t& partSpecifier, common::interval_t& input, + int64_t& result) { common::DatePartSpecifier specifier; common::Interval::tryGetDatePartSpecifier(partSpecifier.getAsString(), specifier); result = common::Interval::getIntervalPart(specifier, input); @@ -107,23 +107,23 @@ inline void DatePart::operation( struct DateTrunc { template - static inline void operation( - LEFT_TYPE& /*partSpecifier*/, RIGHT_TYPE& /*input*/, RIGHT_TYPE& /*result*/) { + static inline void operation(LEFT_TYPE& /*partSpecifier*/, RIGHT_TYPE& /*input*/, + RIGHT_TYPE& /*result*/) { KU_UNREACHABLE; } }; template<> -inline void DateTrunc::operation( - common::ku_string_t& partSpecifier, common::date_t& input, common::date_t& result) { +inline void DateTrunc::operation(common::ku_string_t& partSpecifier, common::date_t& input, + common::date_t& result) { common::DatePartSpecifier specifier; common::Interval::tryGetDatePartSpecifier(partSpecifier.getAsString(), specifier); result = common::Date::trunc(specifier, input); } template<> -inline void DateTrunc::operation( - common::ku_string_t& partSpecifier, common::timestamp_t& input, common::timestamp_t& result) { +inline void DateTrunc::operation(common::ku_string_t& partSpecifier, common::timestamp_t& input, + common::timestamp_t& result) { common::DatePartSpecifier specifier; common::Interval::tryGetDatePartSpecifier(partSpecifier.getAsString(), specifier); result = common::Timestamp::trunc(specifier, input); @@ -144,8 +144,8 @@ struct Least { }; struct MakeDate { - static inline void operation( - int64_t& year, int64_t& month, int64_t& day, common::date_t& result) { + static inline void operation(int64_t& year, int64_t& month, int64_t& day, + common::date_t& result) { result = common::Date::fromDate(year, month, day); } }; diff --git a/src/include/function/function.h b/src/include/function/function.h index c7b57bd3ffa..ea3f028d0e3 100644 --- a/src/include/function/function.h +++ b/src/include/function/function.h @@ -29,8 +29,8 @@ enum class FunctionType : uint8_t { struct Function { Function() : type{FunctionType::UNKNOWN} {}; - Function( - FunctionType type, std::string name, std::vector parameterTypeIDs) + Function(FunctionType type, std::string name, + std::vector parameterTypeIDs) : type{type}, name{std::move(name)}, parameterTypeIDs{std::move(parameterTypeIDs)} {} virtual ~Function() = default; @@ -51,8 +51,8 @@ struct BaseScalarFunction : public Function { BaseScalarFunction(FunctionType type, std::string name, std::vector parameterTypeIDs, common::LogicalTypeID returnTypeID, scalar_bind_func bindFunc) - : Function{type, std::move(name), std::move(parameterTypeIDs)}, - returnTypeID{returnTypeID}, bindFunc{std::move(bindFunc)} {} + : Function{type, std::move(name), std::move(parameterTypeIDs)}, returnTypeID{returnTypeID}, + bindFunc{std::move(bindFunc)} {} std::string signatureToString() const override { auto result = Function::signatureToString(); diff --git a/src/include/function/hash/hash_functions.h b/src/include/function/hash/hash_functions.h index 2812d747ddd..9cd4c4c3f2a 100644 --- a/src/include/function/hash/hash_functions.h +++ b/src/include/function/hash/hash_functions.h @@ -53,81 +53,81 @@ struct Hash { }; struct CombineHash { - static inline void operation( - common::hash_t& left, common::hash_t& right, common::hash_t& result) { + static inline void operation(common::hash_t& left, common::hash_t& right, + common::hash_t& result) { result = combineHashScalar(left, right); } }; template<> -inline void Hash::operation( - const common::internalID_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const common::internalID_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key.offset) ^ murmurhash64(key.tableID); } template<> -inline void Hash::operation( - const bool& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const bool& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const uint8_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const uint8_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const uint16_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const uint16_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const uint32_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const uint32_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const uint64_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const uint64_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const int64_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const int64_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const int32_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const int32_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const int16_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const int16_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const int8_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const int8_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key); } template<> -inline void Hash::operation( - const common::int128_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const common::int128_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = murmurhash64(key.low) ^ murmurhash64(key.high); } template<> -inline void Hash::operation( - const double& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const double& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { // 0 and -0 are not byte-equivalent, but should have the same hash if (key == 0) { result = murmurhash64(0); @@ -137,8 +137,8 @@ inline void Hash::operation( } template<> -inline void Hash::operation( - const float& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const float& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { // 0 and -0 are not byte-equivalent, but should have the same hash if (key == 0) { result = murmurhash64(0); @@ -148,8 +148,8 @@ inline void Hash::operation( } template<> -inline void Hash::operation( - const std::string_view& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const std::string_view& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { common::hash_t hashValue = 0; auto data64 = reinterpret_cast(key.data()); for (size_t i = 0u; i < key.size() / 8; i++) { @@ -165,20 +165,20 @@ inline void Hash::operation( } template<> -inline void Hash::operation( - const std::string& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const std::string& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { Hash::operation(std::string_view(key), result); } template<> -inline void Hash::operation( - const common::ku_string_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const common::ku_string_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { Hash::operation(key.getAsStringView(), result); } template<> -inline void Hash::operation( - const common::interval_t& key, common::hash_t& result, common::ValueVector* /*keyVector*/) { +inline void Hash::operation(const common::interval_t& key, common::hash_t& result, + common::ValueVector* /*keyVector*/) { result = combineHashScalar(murmurhash64(key.months), combineHashScalar(murmurhash64(key.days), murmurhash64(key.micros))); } @@ -194,8 +194,8 @@ inline void Hash::operation(const std::unordered_set& key, common:: struct InternalIDHasher { std::size_t operator()(const common::internalID_t& internalID) const { common::hash_t result; - function::Hash::operation( - internalID, result, nullptr /* keyVector */); + function::Hash::operation(internalID, result, + nullptr /* keyVector */); return result; } }; diff --git a/src/include/function/hash/vector_hash_functions.h b/src/include/function/hash/vector_hash_functions.h index 62c01aae08a..1a73c939da1 100644 --- a/src/include/function/hash/vector_hash_functions.h +++ b/src/include/function/hash/vector_hash_functions.h @@ -21,22 +21,22 @@ struct UnaryHashFunctionExecutor { if (operand.hasNoNullsGuarantee()) { if (operand.state->selVector->isUnfiltered()) { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { - Hash::operation( - operand.getValue(i), resultValues[i], &operand); + Hash::operation(operand.getValue(i), resultValues[i], + &operand); } } else { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { auto pos = operand.state->selVector->selectedPositions[i]; - Hash::operation( - operand.getValue(pos), resultValues[pos], &operand); + Hash::operation(operand.getValue(pos), resultValues[pos], + &operand); } } } else { if (operand.state->selVector->isUnfiltered()) { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { if (!operand.isNull(i)) { - Hash::operation( - operand.getValue(i), resultValues[i], &operand); + Hash::operation(operand.getValue(i), resultValues[i], + &operand); } else { result.setValue(i, NULL_HASH); } @@ -45,8 +45,8 @@ struct UnaryHashFunctionExecutor { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { auto pos = operand.state->selVector->selectedPositions[i]; if (!operand.isNull(pos)) { - Hash::operation( - operand.getValue(pos), resultValues[pos], &operand); + Hash::operation(operand.getValue(pos), resultValues[pos], + &operand); } else { resultValues[pos] = NULL_HASH; } @@ -60,8 +60,8 @@ struct UnaryHashFunctionExecutor { struct VectorHashFunction { static void computeHash(common::ValueVector* operand, common::ValueVector* result); - static void combineHash( - common::ValueVector* left, common::ValueVector* right, common::ValueVector* result); + static void combineHash(common::ValueVector* left, common::ValueVector* right, + common::ValueVector* result); }; } // namespace function diff --git a/src/include/function/list/functions/base_list_sort_function.h b/src/include/function/list/functions/base_list_sort_function.h index 5d8cf542d38..47684f1e765 100644 --- a/src/include/function/list/functions/base_list_sort_function.h +++ b/src/include/function/list/functions/base_list_sort_function.h @@ -68,8 +68,8 @@ struct BaseListSortOperation { // Add nulls in the end. if (!nullFirst) { - setVectorRangeToNull( - *resultDataVector, result.offset, input.size - nullCount, input.size); + setVectorRangeToNull(*resultDataVector, result.offset, input.size - nullCount, + input.size); } // Determine the starting and ending position of the data to be sorted. @@ -90,8 +90,8 @@ struct BaseListSortOperation { } } - static void setVectorRangeToNull( - common::ValueVector& vector, uint64_t offset, uint64_t startPos, uint64_t endPos) { + static void setVectorRangeToNull(common::ValueVector& vector, uint64_t offset, + uint64_t startPos, uint64_t endPos) { for (auto i = startPos; i < endPos; i++) { vector.setNull(offset + i, true); } diff --git a/src/include/function/list/functions/list_any_value_function.h b/src/include/function/list/functions/list_any_value_function.h index 4970d6c5b49..8adcbb076f8 100644 --- a/src/include/function/list/functions/list_any_value_function.h +++ b/src/include/function/list/functions/list_any_value_function.h @@ -15,8 +15,8 @@ struct ListAnyValue { for (auto i = 0u; i < input.size; i++) { if (!(inputDataVector->isNull(input.offset + i))) { - resultVector.copyFromVectorData( - reinterpret_cast(&result), inputDataVector, inputValues); + resultVector.copyFromVectorData(reinterpret_cast(&result), + inputDataVector, inputValues); break; } inputValues += numBytesPerValue; diff --git a/src/include/function/list/functions/list_distinct_function.h b/src/include/function/list/functions/list_distinct_function.h index b3beff0263a..0a9f9523645 100644 --- a/src/include/function/list/functions/list_distinct_function.h +++ b/src/include/function/list/functions/list_distinct_function.h @@ -28,8 +28,8 @@ struct ListDistinct { auto resultDataVector = common::ListVector::getDataVector(&resultVector); auto numBytesPerValue = inputDataVector->getNumBytesPerValue(); for (auto val : uniqueValues) { - resultDataVector->copyFromVectorData( - resultValues, inputDataVector, reinterpret_cast(&val)); + resultDataVector->copyFromVectorData(resultValues, inputDataVector, + reinterpret_cast(&val)); resultValues += numBytesPerValue; } } diff --git a/src/include/function/list/functions/list_extract_function.h b/src/include/function/list/functions/list_extract_function.h index 46199930672..1a6ef0c6db3 100644 --- a/src/include/function/list/functions/list_extract_function.h +++ b/src/include/function/list/functions/list_extract_function.h @@ -32,13 +32,13 @@ struct ListExtract { if (!resultVector.isNull(resPos)) { auto listValues = common::ListVector::getListValuesWithOffset(&listVector, listEntry, upos - 1); - resultVector.copyFromVectorData( - reinterpret_cast(&result), listDataVector, listValues); + resultVector.copyFromVectorData(reinterpret_cast(&result), listDataVector, + listValues); } } - static inline void operation( - common::ku_string_t& str, int64_t& idx, common::ku_string_t& result) { + static inline void operation(common::ku_string_t& str, int64_t& idx, + common::ku_string_t& result) { if (str.len < idx) { result.set("", 0); } else { diff --git a/src/include/function/list/functions/list_len_function.h b/src/include/function/list/functions/list_len_function.h index 3c6e22d56be..25af99da23d 100644 --- a/src/include/function/list/functions/list_len_function.h +++ b/src/include/function/list/functions/list_len_function.h @@ -25,8 +25,8 @@ inline void ListLen::operation(common::ku_string_t& input, int64_t& result) { int64_t length = 0; // Use grapheme iterator to identify bytes of utf8 char and increment once for each // char. - utf8proc::utf8proc_grapheme_callback( - inputString.c_str(), totalByteLength, [&](size_t /*start*/, size_t /*end*/) { + utf8proc::utf8proc_grapheme_callback(inputString.c_str(), totalByteLength, + [&](size_t /*start*/, size_t /*end*/) { length++; return true; }); diff --git a/src/include/function/list/functions/list_reverse_sort_function.h b/src/include/function/list/functions/list_reverse_sort_function.h index 704a7785ba2..e0f84011c2a 100644 --- a/src/include/function/list/functions/list_reverse_sort_function.h +++ b/src/include/function/list/functions/list_reverse_sort_function.h @@ -10,8 +10,8 @@ template struct ListReverseSort : BaseListSortOperation { static inline void operation(common::list_entry_t& input, common::list_entry_t& result, common::ValueVector& inputVector, common::ValueVector& resultVector) { - sortValues( - input, result, inputVector, resultVector, false /* ascOrder */, true /* nullFirst */); + sortValues(input, result, inputVector, resultVector, false /* ascOrder */, + true /* nullFirst */); } static inline void operation(common::list_entry_t& input, common::ku_string_t& nullOrder, diff --git a/src/include/function/list/functions/list_sort_function.h b/src/include/function/list/functions/list_sort_function.h index 99b720d3ec6..fe0616d1049 100644 --- a/src/include/function/list/functions/list_sort_function.h +++ b/src/include/function/list/functions/list_sort_function.h @@ -10,8 +10,8 @@ template struct ListSort : BaseListSortOperation { static inline void operation(common::list_entry_t& input, common::list_entry_t& result, common::ValueVector& inputVector, common::ValueVector& resultVector) { - sortValues( - input, result, inputVector, resultVector, true /* ascOrder */, true /* nullFirst */); + sortValues(input, result, inputVector, resultVector, true /* ascOrder */, + true /* nullFirst */); } static inline void operation(common::list_entry_t& input, common::ku_string_t& sortOrder, diff --git a/src/include/function/list/vector_list_functions.h b/src/include/function/list/vector_list_functions.h index 576947615dd..180c745671b 100644 --- a/src/include/function/list/vector_list_functions.h +++ b/src/include/function/list/vector_list_functions.h @@ -43,8 +43,8 @@ struct ListConcatFunction { static constexpr const char* alias = "LIST_CAT"; static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); + static std::unique_ptr bindFunc(const binder::expression_vector& arguments, + Function* function); }; struct ListAppendFunction { diff --git a/src/include/function/map/functions/map_keys_function.h b/src/include/function/map/functions/map_keys_function.h index dd5e9121777..26e59af3512 100644 --- a/src/include/function/map/functions/map_keys_function.h +++ b/src/include/function/map/functions/map_keys_function.h @@ -10,8 +10,8 @@ struct MapKeys : public BaseMapExtract { common::ValueVector& listVector, common::ValueVector& resultVector) { auto mapKeyVector = common::MapVector::getKeyVector(&listVector); auto mapKeyValues = common::MapVector::getMapKeys(&listVector, listEntry); - BaseMapExtract::operation( - resultEntry, resultVector, mapKeyValues, mapKeyVector, listEntry.size); + BaseMapExtract::operation(resultEntry, resultVector, mapKeyValues, mapKeyVector, + listEntry.size); } }; diff --git a/src/include/function/map/functions/map_values_function.h b/src/include/function/map/functions/map_values_function.h index 81efb07b6a6..a4f68a4a39c 100644 --- a/src/include/function/map/functions/map_values_function.h +++ b/src/include/function/map/functions/map_values_function.h @@ -11,8 +11,8 @@ struct MapValues : public BaseMapExtract { common::ValueVector& listVector, common::ValueVector& resultVector) { auto mapValueVector = common::MapVector::getValueVector(&listVector); auto mapValueValues = common::MapVector::getMapValues(&listVector, listEntry); - BaseMapExtract::operation( - resultEntry, resultVector, mapValueValues, mapValueVector, listEntry.size); + BaseMapExtract::operation(resultEntry, resultVector, mapValueValues, mapValueVector, + listEntry.size); } }; diff --git a/src/include/function/null/null_function_executor.h b/src/include/function/null/null_function_executor.h index 37f87a5449c..ad54389138b 100644 --- a/src/include/function/null/null_function_executor.h +++ b/src/include/function/null/null_function_executor.h @@ -14,13 +14,13 @@ struct NullOperationExecutor { if (operand.state->isFlat()) { auto pos = operand.state->selVector->selectedPositions[0]; auto resultPos = result.state->selVector->selectedPositions[0]; - FUNC::operation( - operand.getValue(pos), (bool)operand.isNull(pos), resultValues[resultPos]); + FUNC::operation(operand.getValue(pos), (bool)operand.isNull(pos), + resultValues[resultPos]); } else { if (operand.state->selVector->isUnfiltered()) { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { - FUNC::operation( - operand.getValue(i), (bool)operand.isNull(i), resultValues[i]); + FUNC::operation(operand.getValue(i), (bool)operand.isNull(i), + resultValues[i]); } } else { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { @@ -55,8 +55,8 @@ struct NullOperationExecutor { static void selectOnValue(common::ValueVector& operand, uint64_t operandPos, uint64_t& numSelectedValues, common::sel_t* selectedPositionsBuffer) { uint8_t resultValue = 0; - FUNC::operation( - operand.getValue(operandPos), operand.isNull(operandPos), resultValue); + FUNC::operation(operand.getValue(operandPos), operand.isNull(operandPos), + resultValue); selectedPositionsBuffer[numSelectedValues] = operandPos; numSelectedValues += resultValue == true; } diff --git a/src/include/function/path/path_function_executor.h b/src/include/function/path/path_function_executor.h index 435d6d39f19..d69d34655b1 100644 --- a/src/include/function/path/path_function_executor.h +++ b/src/include/function/path/path_function_executor.h @@ -42,8 +42,8 @@ struct UnaryPathExecutor { execute(*input.state->selVector, *relsVector, internalIDFieldIdx, result); } - static bool selectNodeIDs( - common::ValueVector& input, common::SelectionVector& selectionVector) { + static bool selectNodeIDs(common::ValueVector& input, + common::SelectionVector& selectionVector) { auto nodesFieldIdx = 0; KU_ASSERT(nodesFieldIdx == common::StructType::getFieldIdx(&input.dataType, common::InternalKeyword::NODES)); @@ -66,24 +66,24 @@ struct UnaryPathExecutor { common::ValueVector& listVector, common::struct_field_idx_t fieldIdx, common::ValueVector& result) { auto listDataVector = common::ListVector::getDataVector(&listVector); - KU_ASSERT(fieldIdx == common::StructType::getFieldIdx( - &listDataVector->dataType, common::InternalKeyword::ID)); + KU_ASSERT(fieldIdx == common::StructType::getFieldIdx(&listDataVector->dataType, + common::InternalKeyword::ID)); auto internalIDsVector = common::StructVector::getFieldVector(listDataVector, fieldIdx).get(); std::unordered_set internalIDSet; if (inputSelVector.isUnfiltered()) { for (auto i = 0u; i < inputSelVector.selectedSize; ++i) { auto& listEntry = listVector.getValue(i); - bool isTrail = isAllInternalIDDistinct( - internalIDsVector, listEntry.offset, listEntry.size, internalIDSet); + bool isTrail = isAllInternalIDDistinct(internalIDsVector, listEntry.offset, + listEntry.size, internalIDSet); result.setValue(i, isTrail); } } else { for (auto i = 0u; i < inputSelVector.selectedSize; ++i) { auto pos = inputSelVector.selectedPositions[i]; auto& listEntry = listVector.getValue(pos); - bool isTrail = isAllInternalIDDistinct( - internalIDsVector, listEntry.offset, listEntry.size, internalIDSet); + bool isTrail = isAllInternalIDDistinct(internalIDsVector, listEntry.offset, + listEntry.size, internalIDSet); result.setValue(pos, isTrail); } } @@ -93,8 +93,8 @@ struct UnaryPathExecutor { common::ValueVector& listVector, common::struct_field_idx_t fieldIdx, common::SelectionVector& selectionVector) { auto listDataVector = common::ListVector::getDataVector(&listVector); - KU_ASSERT(fieldIdx == common::StructType::getFieldIdx( - &listDataVector->dataType, common::InternalKeyword::ID)); + KU_ASSERT(fieldIdx == common::StructType::getFieldIdx(&listDataVector->dataType, + common::InternalKeyword::ID)); auto internalIDsVector = common::StructVector::getFieldVector(listDataVector, fieldIdx).get(); std::unordered_set internalIDSet; @@ -103,8 +103,8 @@ struct UnaryPathExecutor { if (inputSelVector.isUnfiltered()) { for (auto i = 0u; i < inputSelVector.selectedSize; ++i) { auto& listEntry = listVector.getValue(i); - bool isTrail = isAllInternalIDDistinct( - internalIDsVector, listEntry.offset, listEntry.size, internalIDSet); + bool isTrail = isAllInternalIDDistinct(internalIDsVector, listEntry.offset, + listEntry.size, internalIDSet); buffer[numSelectedValues] = i; numSelectedValues += isTrail; } @@ -112,8 +112,8 @@ struct UnaryPathExecutor { for (auto i = 0u; i < inputSelVector.selectedSize; ++i) { auto pos = inputSelVector.selectedPositions[i]; auto& listEntry = listVector.getValue(pos); - bool isTrail = isAllInternalIDDistinct( - internalIDsVector, listEntry.offset, listEntry.size, internalIDSet); + bool isTrail = isAllInternalIDDistinct(internalIDsVector, listEntry.offset, + listEntry.size, internalIDSet); buffer[numSelectedValues] = pos; numSelectedValues += isTrail; } diff --git a/src/include/function/rewrite_function.h b/src/include/function/rewrite_function.h index 5b9b0a45a52..0fc9bb5d9c9 100644 --- a/src/include/function/rewrite_function.h +++ b/src/include/function/rewrite_function.h @@ -18,8 +18,8 @@ struct RewriteFunction final : public Function { RewriteFunction(std::string name, std::vector parameterTypeIDs, rewrite_func_rewrite_t rewriteFunc) - : Function{FunctionType::REWRITE, name, std::move(parameterTypeIDs)}, rewriteFunc{ - rewriteFunc} {} + : Function{FunctionType::REWRITE, name, std::move(parameterTypeIDs)}, + rewriteFunc{rewriteFunc} {} std::unique_ptr copy() const override { return std::make_unique(*this); diff --git a/src/include/function/scalar_function.h b/src/include/function/scalar_function.h index 9fc4b8175ff..48ff546e712 100644 --- a/src/include/function/scalar_function.h +++ b/src/include/function/scalar_function.h @@ -55,8 +55,8 @@ struct ScalarFunction final : public BaseScalarFunction { static void TernaryExecFunction(const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(params.size() == 3); - TernaryFunctionExecutor::execute( - *params[0], *params[1], *params[2], result); + TernaryFunctionExecutor::execute(*params[0], + *params[1], *params[2], result); } template @@ -72,8 +72,8 @@ struct ScalarFunction final : public BaseScalarFunction { static void BinaryExecFunction(const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(params.size() == 2); - BinaryFunctionExecutor::execute( - *params[0], *params[1], result); + BinaryFunctionExecutor::execute(*params[0], + *params[1], result); } template @@ -81,8 +81,8 @@ struct ScalarFunction final : public BaseScalarFunction { const std::vector>& params, common::ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(params.size() == 2); - BinaryFunctionExecutor::executeString( - *params[0], *params[1], result); + BinaryFunctionExecutor::executeString(*params[0], + *params[1], result); } template @@ -90,8 +90,8 @@ struct ScalarFunction final : public BaseScalarFunction { const std::vector>& params, common::SelectionVector& selVector) { KU_ASSERT(params.size() == 2); - return BinaryFunctionExecutor::select( - *params[0], *params[1], selVector); + return BinaryFunctionExecutor::select(*params[0], *params[1], + selVector); } template padCountChars( - const uint32_t count, const char* data, const uint32_t size) { + static std::pair padCountChars(const uint32_t count, const char* data, + const uint32_t size) { auto str = reinterpret_cast(data); uint32_t byteCount = 0, charCount = 0; for (; charCount < count && byteCount < size; charCount++) { @@ -47,8 +47,8 @@ struct BasePadOperation { padByteCount = 0; } utf8proc::utf8proc_int32_t codepoint; - auto bytes = utf8proc::utf8proc_iterate( - padData + padByteCount, padSize - padByteCount, &codepoint); + auto bytes = utf8proc::utf8proc_iterate(padData + padByteCount, padSize - padByteCount, + &codepoint); padByteCount += bytes; } result.insert(result.end(), (char*)padData, (char*)(padData + padByteCount)); diff --git a/src/include/function/string/functions/base_regexp_function.h b/src/include/function/string/functions/base_regexp_function.h index b8781e81a0a..8dda8c6747d 100644 --- a/src/include/function/string/functions/base_regexp_function.h +++ b/src/include/function/string/functions/base_regexp_function.h @@ -15,8 +15,8 @@ struct BaseRegexpOperation { return std::regex_replace(pattern, std::regex(R"(\\\\)"), "\\"); } - static inline void copyToKuzuString( - const std::string& value, common::ku_string_t& kuString, common::ValueVector& valueVector) { + static inline void copyToKuzuString(const std::string& value, common::ku_string_t& kuString, + common::ValueVector& valueVector) { common::StringVector::addString(&valueVector, kuString, value.data(), value.length()); } }; diff --git a/src/include/function/string/functions/contains_function.h b/src/include/function/string/functions/contains_function.h index 985cc08d912..bf90ab72697 100644 --- a/src/include/function/string/functions/contains_function.h +++ b/src/include/function/string/functions/contains_function.h @@ -7,8 +7,8 @@ namespace kuzu { namespace function { struct Contains { - static inline void operation( - common::ku_string_t& left, common::ku_string_t& right, uint8_t& result) { + static inline void operation(common::ku_string_t& left, common::ku_string_t& right, + uint8_t& result) { auto lStr = left.getAsString(); auto rStr = right.getAsString(); int64_t pos; diff --git a/src/include/function/string/functions/ends_with_function.h b/src/include/function/string/functions/ends_with_function.h index 4390d99a6e5..07bc8148696 100644 --- a/src/include/function/string/functions/ends_with_function.h +++ b/src/include/function/string/functions/ends_with_function.h @@ -7,8 +7,8 @@ namespace kuzu { namespace function { struct EndsWith { - static inline void operation( - common::ku_string_t& left, common::ku_string_t& right, uint8_t& result) { + static inline void operation(common::ku_string_t& left, common::ku_string_t& right, + uint8_t& result) { int64_t pos = 0; Find::operation(left, right, pos); result = (pos == left.len - right.len + 1); diff --git a/src/include/function/string/functions/find_function.h b/src/include/function/string/functions/find_function.h index b0b3cac4924..a41bcf739f8 100644 --- a/src/include/function/string/functions/find_function.h +++ b/src/include/function/string/functions/find_function.h @@ -9,8 +9,8 @@ namespace function { // https://github.com/duckdb/duckdb/blob/master/src/function/scalar/string/contains.cpp struct Find { - static inline void operation( - common::ku_string_t& left, common::ku_string_t& right, int64_t& result) { + static inline void operation(common::ku_string_t& left, common::ku_string_t& right, + int64_t& result) { if (right.len == 0) { result = 1; } else if (right.len > left.len) { @@ -33,8 +33,8 @@ struct Find { // Returns the position of the first occurrence of needle in the haystack. If haystack doesn't // contain needle, it returns -1. - static int64_t find( - const uint8_t* haystack, uint32_t haystackLen, const uint8_t* needle, uint32_t needleLen); + static int64_t find(const uint8_t* haystack, uint32_t haystackLen, const uint8_t* needle, + uint32_t needleLen); }; } // namespace function diff --git a/src/include/function/string/functions/lpad_function.h b/src/include/function/string/functions/lpad_function.h index 193c9ec8a2c..3bcad0d042e 100644 --- a/src/include/function/string/functions/lpad_function.h +++ b/src/include/function/string/functions/lpad_function.h @@ -11,8 +11,8 @@ struct Lpad : BasePadOperation { static inline void operation(common::ku_string_t& src, int64_t count, common::ku_string_t& characterToPad, common::ku_string_t& result, common::ValueVector& resultValueVector) { - BasePadOperation::operation( - src, count, characterToPad, result, resultValueVector, lpadOperation); + BasePadOperation::operation(src, count, characterToPad, result, resultValueVector, + lpadOperation); } static void lpadOperation(common::ku_string_t& src, int64_t count, diff --git a/src/include/function/string/functions/pad_function.h b/src/include/function/string/functions/pad_function.h index 445cf655b80..50d2ed536a8 100644 --- a/src/include/function/string/functions/pad_function.h +++ b/src/include/function/string/functions/pad_function.h @@ -20,8 +20,8 @@ struct PadOperation { } KU_ASSERT(characterToPad.len == 1); padOperation(result, src, characterToPad); - common::StringVector::addString( - &resultValueVector, result, (const char*)result.getData(), count); + common::StringVector::addString(&resultValueVector, result, (const char*)result.getData(), + count); } }; diff --git a/src/include/function/string/functions/regexp_extract_all_function.h b/src/include/function/string/functions/regexp_extract_all_function.h index 603c0a32efa..4c493bd9482 100644 --- a/src/include/function/string/functions/regexp_extract_all_function.h +++ b/src/include/function/string/functions/regexp_extract_all_function.h @@ -19,8 +19,8 @@ struct RegexpExtractAll : BaseRegexpOperation { for (const auto& match : matches) { common::ku_string_t kuString; copyToKuzuString(match, kuString, *resultDataVector); - resultDataVector->copyFromVectorData( - resultValues, resultDataVector, reinterpret_cast(&kuString)); + resultDataVector->copyFromVectorData(resultValues, resultDataVector, + reinterpret_cast(&kuString)); resultValues += numBytesPerValue; } } @@ -31,8 +31,8 @@ struct RegexpExtractAll : BaseRegexpOperation { operation(value, pattern, defaultGroup, result, resultVector); } - static std::vector regexExtractAll( - const std::string& value, const std::string& pattern, std::int64_t& group) { + static std::vector regexExtractAll(const std::string& value, + const std::string& pattern, std::int64_t& group) { RE2 regex(parseCypherPatten(pattern)); auto submatchCount = regex.NumberOfCapturingGroups() + 1; if (group >= submatchCount) { diff --git a/src/include/function/string/functions/regexp_extract_function.h b/src/include/function/string/functions/regexp_extract_function.h index 17d50c374f0..5918a02bb5c 100644 --- a/src/include/function/string/functions/regexp_extract_function.h +++ b/src/include/function/string/functions/regexp_extract_function.h @@ -17,8 +17,8 @@ struct RegexpExtract : BaseRegexpOperation { static inline void operation(common::ku_string_t& value, common::ku_string_t& pattern, common::ku_string_t& result, common::ValueVector& resultValueVector) { int64_t defaultGroup = 0; - regexExtract( - value.getAsString(), pattern.getAsString(), defaultGroup, result, resultValueVector); + regexExtract(value.getAsString(), pattern.getAsString(), defaultGroup, result, + resultValueVector); } static void regexExtract(const std::string& input, const std::string& pattern, diff --git a/src/include/function/string/functions/regexp_full_match_function.h b/src/include/function/string/functions/regexp_full_match_function.h index 70a881c34b9..05ad9496f57 100644 --- a/src/include/function/string/functions/regexp_full_match_function.h +++ b/src/include/function/string/functions/regexp_full_match_function.h @@ -8,8 +8,8 @@ namespace kuzu { namespace function { struct RegexpFullMatch : BaseRegexpOperation { - static inline void operation( - common::ku_string_t& left, common::ku_string_t& right, uint8_t& result) { + static inline void operation(common::ku_string_t& left, common::ku_string_t& right, + uint8_t& result) { result = RE2::FullMatch(left.getAsString(), parseCypherPatten(right.getAsString())); } }; diff --git a/src/include/function/string/functions/regexp_matches_function.h b/src/include/function/string/functions/regexp_matches_function.h index 0489b0a9eb7..df729a68701 100644 --- a/src/include/function/string/functions/regexp_matches_function.h +++ b/src/include/function/string/functions/regexp_matches_function.h @@ -8,8 +8,8 @@ namespace kuzu { namespace function { struct RegexpMatches : BaseRegexpOperation { - static inline void operation( - common::ku_string_t& left, common::ku_string_t& right, uint8_t& result) { + static inline void operation(common::ku_string_t& left, common::ku_string_t& right, + uint8_t& result) { result = RE2::PartialMatch(left.getAsString(), parseCypherPatten(right.getAsString())); } }; diff --git a/src/include/function/string/functions/regexp_replace_function.h b/src/include/function/string/functions/regexp_replace_function.h index 956b86fda1d..cf20b91c5ca 100644 --- a/src/include/function/string/functions/regexp_replace_function.h +++ b/src/include/function/string/functions/regexp_replace_function.h @@ -12,8 +12,8 @@ struct RegexpReplace : BaseRegexpOperation { common::ku_string_t& replacement, common::ku_string_t& result, common::ValueVector& resultValueVector) { std::string resultStr = value.getAsString(); - RE2::Replace( - &resultStr, parseCypherPatten(pattern.getAsString()), replacement.getAsString()); + RE2::Replace(&resultStr, parseCypherPatten(pattern.getAsString()), + replacement.getAsString()); copyToKuzuString(resultStr, result, resultValueVector); } }; diff --git a/src/include/function/string/functions/rpad_function.h b/src/include/function/string/functions/rpad_function.h index 16a79c227c4..841274bff71 100644 --- a/src/include/function/string/functions/rpad_function.h +++ b/src/include/function/string/functions/rpad_function.h @@ -11,8 +11,8 @@ struct Rpad : BasePadOperation { static inline void operation(common::ku_string_t& src, int64_t count, common::ku_string_t& characterToPad, common::ku_string_t& result, common::ValueVector& resultValueVector) { - BasePadOperation::operation( - src, count, characterToPad, result, resultValueVector, rpadOperation); + BasePadOperation::operation(src, count, characterToPad, result, resultValueVector, + rpadOperation); } static void rpadOperation(common::ku_string_t& src, int64_t count, diff --git a/src/include/function/string/functions/starts_with_function.h b/src/include/function/string/functions/starts_with_function.h index e6a51a34df7..bee3237f058 100644 --- a/src/include/function/string/functions/starts_with_function.h +++ b/src/include/function/string/functions/starts_with_function.h @@ -6,8 +6,8 @@ namespace kuzu { namespace function { struct StartsWith { - static inline void operation( - common::ku_string_t& left, common::ku_string_t& right, uint8_t& result) { + static inline void operation(common::ku_string_t& left, common::ku_string_t& right, + uint8_t& result) { auto lStr = left.getAsString(); auto rStr = right.getAsString(); result = lStr.starts_with(rStr); diff --git a/src/include/function/string/functions/substr_function.h b/src/include/function/string/functions/substr_function.h index 6d6ed1d68d6..0c01ca26b7c 100644 --- a/src/include/function/string/functions/substr_function.h +++ b/src/include/function/string/functions/substr_function.h @@ -29,8 +29,8 @@ struct SubStr { copySubstr(src, start, len, result, resultValueVector, true /* isAscii */); } else { int64_t characterCount = 0, startBytePos = 0, endBytePos = 0; - kuzu::utf8proc::utf8proc_grapheme_callback( - srcStr.c_str(), srcStr.size(), [&](int64_t gstart, int64_t /*gend*/) { + kuzu::utf8proc::utf8proc_grapheme_callback(srcStr.c_str(), srcStr.size(), + [&](int64_t gstart, int64_t /*gend*/) { if (characterCount == startPos) { startBytePos = gstart; } else if ((uint64_t)characterCount == endPos) { @@ -55,12 +55,12 @@ struct SubStr { if (isAscii) { // For normal ASCII char case, we get to the proper byte position to copy from by doing // a -1 (since it is guaranteed each char is 1 byte). - common::StringVector::addString( - &resultValueVector, result, (const char*)(src.getData() + start - 1), length); + common::StringVector::addString(&resultValueVector, result, + (const char*)(src.getData() + start - 1), length); } else { // For utf8 char copy, the function gets the exact starting byte position to copy from. - common::StringVector::addString( - &resultValueVector, result, (const char*)(src.getData() + start), length); + common::StringVector::addString(&resultValueVector, result, + (const char*)(src.getData() + start), length); } } }; diff --git a/src/include/function/string/vector_string_functions.h b/src/include/function/string/vector_string_functions.h index d19d98076d1..067793f689e 100644 --- a/src/include/function/string/vector_string_functions.h +++ b/src/include/function/string/vector_string_functions.h @@ -168,8 +168,8 @@ struct RegexpExtractAllFunction : public VectorStringFunction { static constexpr const char* name = "REGEXP_EXTRACT_ALL"; static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); + static std::unique_ptr bindFunc(const binder::expression_vector& arguments, + Function* function); }; struct LevenshteinFunction : public VectorStringFunction { diff --git a/src/include/function/struct/vector_struct_functions.h b/src/include/function/struct/vector_struct_functions.h index 39f8a23a82c..a0493b0a07a 100644 --- a/src/include/function/struct/vector_struct_functions.h +++ b/src/include/function/struct/vector_struct_functions.h @@ -21,8 +21,8 @@ struct StructPackFunctions { struct StructExtractBindData : public FunctionBindData { common::vector_idx_t childIdx; - StructExtractBindData( - std::unique_ptr dataType, common::vector_idx_t childIdx) + StructExtractBindData(std::unique_ptr dataType, + common::vector_idx_t childIdx) : FunctionBindData{std::move(dataType)}, childIdx{childIdx} {} }; @@ -31,8 +31,8 @@ struct StructExtractFunctions { static function_set getFunctionSet(); - static std::unique_ptr bindFunc( - const binder::expression_vector& arguments, Function* function); + static std::unique_ptr bindFunc(const binder::expression_vector& arguments, + Function* function); static void compileFunc(FunctionBindData* bindData, const std::vector>& parameters, std::shared_ptr& result); diff --git a/src/include/function/table/bind_data.h b/src/include/function/table/bind_data.h index 73116a26f72..28cdab7fa38 100644 --- a/src/include/function/table/bind_data.h +++ b/src/include/function/table/bind_data.h @@ -16,8 +16,8 @@ struct TableFuncBindData { std::vector columnNames; TableFuncBindData() = default; - TableFuncBindData( - std::vector columnTypes, std::vector columnNames) + TableFuncBindData(std::vector columnTypes, + std::vector columnNames) : columnTypes{std::move(columnTypes)}, columnNames{std::move(columnNames)} {} TableFuncBindData(const TableFuncBindData& other) : columnTypes{other.columnTypes}, columnNames{other.columnNames} {} diff --git a/src/include/function/table/bind_input.h b/src/include/function/table/bind_input.h index 8de191b36dd..db25100d470 100644 --- a/src/include/function/table/bind_input.h +++ b/src/include/function/table/bind_input.h @@ -33,8 +33,8 @@ struct ScanTableFuncBindInput final : public TableFuncBindInput { ScanTableFuncBindInput(common::ReaderConfig config, std::vector expectedColumnNames, std::vector expectedColumnTypes, main::ClientContext* context) - : TableFuncBindInput{}, config{std::move(config)}, expectedColumnNames{std::move( - expectedColumnNames)}, + : TableFuncBindInput{}, config{std::move(config)}, + expectedColumnNames{std::move(expectedColumnNames)}, expectedColumnTypes{std::move(expectedColumnTypes)}, context{context} { inputs.push_back(common::Value::createValue(this->config.filePaths[0])); } diff --git a/src/include/function/table/call_functions.h b/src/include/function/table/call_functions.h index c8aee631576..fd769698219 100644 --- a/src/include/function/table/call_functions.h +++ b/src/include/function/table/call_functions.h @@ -36,8 +36,8 @@ struct CallTableFuncBindData : public TableFuncBindData { CallTableFuncBindData(std::vector columnTypes, std::vector returnColumnNames, common::offset_t maxOffset) - : TableFuncBindData{std::move(columnTypes), std::move(returnColumnNames)}, maxOffset{ - maxOffset} {} + : TableFuncBindData{std::move(columnTypes), std::move(returnColumnNames)}, + maxOffset{maxOffset} {} inline std::unique_ptr copy() const override { return std::make_unique(columnTypes, columnNames, maxOffset); @@ -46,8 +46,8 @@ struct CallTableFuncBindData : public TableFuncBindData { struct CallFunction { static std::unique_ptr initSharedState(TableFunctionInitInput& input); - static std::unique_ptr initEmptyLocalState( - TableFunctionInitInput& input, TableFuncSharedState* state, storage::MemoryManager* mm); + static std::unique_ptr initEmptyLocalState(TableFunctionInitInput& input, + TableFuncSharedState* state, storage::MemoryManager* mm); }; struct CurrentSettingFunction : public CallFunction { diff --git a/src/include/function/table/scan_functions.h b/src/include/function/table/scan_functions.h index 9c1baf9008f..05a61f0de8c 100644 --- a/src/include/function/table/scan_functions.h +++ b/src/include/function/table/scan_functions.h @@ -32,8 +32,8 @@ struct ScanFileSharedState : public ScanSharedState { main::ClientContext* context; uint64_t totalSize; - ScanFileSharedState( - common::ReaderConfig readerConfig, uint64_t numRows, main::ClientContext* context) + ScanFileSharedState(common::ReaderConfig readerConfig, uint64_t numRows, + main::ClientContext* context) : ScanSharedState{std::move(readerConfig), numRows}, context{context}, totalSize{0} {} }; diff --git a/src/include/function/table_functions.h b/src/include/function/table_functions.h index 052cad076a3..c8a78ef8129 100644 --- a/src/include/function/table_functions.h +++ b/src/include/function/table_functions.h @@ -55,8 +55,8 @@ struct TableFunctionInitInput { virtual ~TableFunctionInitInput() = default; }; -using table_func_bind_t = std::function( - main::ClientContext*, function::TableFuncBindInput*)>; +using table_func_bind_t = std::function(main::ClientContext*, + function::TableFuncBindInput*)>; using table_func_t = std::function; using table_func_init_shared_t = std::function(TableFunctionInitInput&)>; diff --git a/src/include/function/ternary_function_executor.h b/src/include/function/ternary_function_executor.h index a3ad99297b5..1d0ae1c9e63 100644 --- a/src/include/function/ternary_function_executor.h +++ b/src/include/function/ternary_function_executor.h @@ -60,8 +60,8 @@ struct TernaryFunctionExecutor { auto resPos = result.state->selVector->selectedPositions[0]; result.setNull(resPos, a.isNull(aPos) || b.isNull(bPos) || c.isNull(cPos)); if (!result.isNull(resPos)) { - executeOnValue( - a, b, c, result, aPos, bPos, cPos, resPos, dataPtr); + executeOnValue(a, b, c, result, + aPos, bPos, cPos, resPos, dataPtr); } } @@ -76,14 +76,14 @@ struct TernaryFunctionExecutor { } else if (c.hasNoNullsGuarantee()) { if (c.state->selVector->isUnfiltered()) { for (auto i = 0u; i < c.state->selVector->selectedSize; ++i) { - executeOnValue( - a, b, c, result, aPos, bPos, i, i, dataPtr); + executeOnValue(a, b, c, + result, aPos, bPos, i, i, dataPtr); } } else { for (auto i = 0u; i < c.state->selVector->selectedSize; ++i) { auto pos = c.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, aPos, bPos, pos, pos, dataPtr); + executeOnValue(a, b, c, + result, aPos, bPos, pos, pos, dataPtr); } } } else { @@ -91,8 +91,8 @@ struct TernaryFunctionExecutor { for (auto i = 0u; i < c.state->selVector->selectedSize; ++i) { result.setNull(i, c.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, aPos, bPos, i, i, dataPtr); + executeOnValue(a, b, + c, result, aPos, bPos, i, i, dataPtr); } } } else { @@ -100,8 +100,8 @@ struct TernaryFunctionExecutor { auto pos = c.state->selVector->selectedPositions[i]; result.setNull(pos, c.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, aPos, bPos, pos, pos, dataPtr); + executeOnValue(a, b, + c, result, aPos, bPos, pos, pos, dataPtr); } } } @@ -119,14 +119,14 @@ struct TernaryFunctionExecutor { } else if (b.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) { if (b.state->selVector->isUnfiltered()) { for (auto i = 0u; i < b.state->selVector->selectedSize; ++i) { - executeOnValue( - a, b, c, result, aPos, i, i, i, dataPtr); + executeOnValue(a, b, c, + result, aPos, i, i, i, dataPtr); } } else { for (auto i = 0u; i < b.state->selVector->selectedSize; ++i) { auto pos = b.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, aPos, pos, pos, pos, dataPtr); + executeOnValue(a, b, c, + result, aPos, pos, pos, pos, dataPtr); } } } else { @@ -134,8 +134,8 @@ struct TernaryFunctionExecutor { for (auto i = 0u; i < b.state->selVector->selectedSize; ++i) { result.setNull(i, b.isNull(i) || c.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, aPos, i, i, i, dataPtr); + executeOnValue(a, b, + c, result, aPos, i, i, i, dataPtr); } } } else { @@ -143,8 +143,8 @@ struct TernaryFunctionExecutor { auto pos = b.state->selVector->selectedPositions[i]; result.setNull(pos, b.isNull(pos) || c.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, aPos, pos, pos, pos, dataPtr); + executeOnValue(a, b, + c, result, aPos, pos, pos, pos, dataPtr); } } } @@ -162,14 +162,14 @@ struct TernaryFunctionExecutor { } else if (b.hasNoNullsGuarantee()) { if (b.state->selVector->isUnfiltered()) { for (auto i = 0u; i < b.state->selVector->selectedSize; ++i) { - executeOnValue( - a, b, c, result, aPos, i, cPos, i, dataPtr); + executeOnValue(a, b, c, + result, aPos, i, cPos, i, dataPtr); } } else { for (auto i = 0u; i < b.state->selVector->selectedSize; ++i) { auto pos = b.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, aPos, pos, cPos, pos, dataPtr); + executeOnValue(a, b, c, + result, aPos, pos, cPos, pos, dataPtr); } } } else { @@ -177,8 +177,8 @@ struct TernaryFunctionExecutor { for (auto i = 0u; i < b.state->selVector->selectedSize; ++i) { result.setNull(i, b.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, aPos, i, cPos, i, dataPtr); + executeOnValue(a, b, + c, result, aPos, i, cPos, i, dataPtr); } } } else { @@ -186,8 +186,8 @@ struct TernaryFunctionExecutor { auto pos = b.state->selVector->selectedPositions[i]; result.setNull(pos, b.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, aPos, pos, cPos, pos, dataPtr); + executeOnValue(a, b, + c, result, aPos, pos, cPos, pos, dataPtr); } } } @@ -202,14 +202,14 @@ struct TernaryFunctionExecutor { if (a.hasNoNullsGuarantee() && b.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) { if (a.state->selVector->isUnfiltered()) { for (uint64_t i = 0; i < a.state->selVector->selectedSize; i++) { - executeOnValue( - a, b, c, result, i, i, i, i, dataPtr); + executeOnValue(a, b, c, + result, i, i, i, i, dataPtr); } } else { for (uint64_t i = 0; i < a.state->selVector->selectedSize; i++) { auto pos = a.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, pos, pos, pos, pos, dataPtr); + executeOnValue(a, b, c, + result, pos, pos, pos, pos, dataPtr); } } } else { @@ -217,8 +217,8 @@ struct TernaryFunctionExecutor { for (uint64_t i = 0; i < a.state->selVector->selectedSize; i++) { result.setNull(i, a.isNull(i) || b.isNull(i) || c.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, i, i, i, i, dataPtr); + executeOnValue(a, b, + c, result, i, i, i, i, dataPtr); } } } else { @@ -226,8 +226,8 @@ struct TernaryFunctionExecutor { auto pos = a.state->selVector->selectedPositions[i]; result.setNull(pos, a.isNull(pos) || b.isNull(pos) || c.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, pos, pos, pos, pos, dataPtr); + executeOnValue(a, b, + c, result, pos, pos, pos, pos, dataPtr); } } } @@ -245,14 +245,14 @@ struct TernaryFunctionExecutor { } else if (a.hasNoNullsGuarantee()) { if (a.state->selVector->isUnfiltered()) { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { - executeOnValue( - a, b, c, result, i, bPos, cPos, i, dataPtr); + executeOnValue(a, b, c, + result, i, bPos, cPos, i, dataPtr); } } else { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { auto pos = a.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, pos, bPos, cPos, pos, dataPtr); + executeOnValue(a, b, c, + result, pos, bPos, cPos, pos, dataPtr); } } } else { @@ -260,8 +260,8 @@ struct TernaryFunctionExecutor { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { result.setNull(i, a.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, i, bPos, cPos, i, dataPtr); + executeOnValue(a, b, + c, result, i, bPos, cPos, i, dataPtr); } } } else { @@ -269,8 +269,8 @@ struct TernaryFunctionExecutor { auto pos = a.state->selVector->selectedPositions[i]; result.setNull(pos, a.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, pos, bPos, cPos, pos, dataPtr); + executeOnValue(a, b, + c, result, pos, bPos, cPos, pos, dataPtr); } } } @@ -288,14 +288,14 @@ struct TernaryFunctionExecutor { } else if (a.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) { if (a.state->selVector->isUnfiltered()) { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { - executeOnValue( - a, b, c, result, i, bPos, i, i, dataPtr); + executeOnValue(a, b, c, + result, i, bPos, i, i, dataPtr); } } else { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { auto pos = a.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, pos, bPos, pos, pos, dataPtr); + executeOnValue(a, b, c, + result, pos, bPos, pos, pos, dataPtr); } } } else { @@ -303,8 +303,8 @@ struct TernaryFunctionExecutor { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { result.setNull(i, a.isNull(i) || c.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, i, bPos, i, i, dataPtr); + executeOnValue(a, b, + c, result, i, bPos, i, i, dataPtr); } } } else { @@ -312,8 +312,8 @@ struct TernaryFunctionExecutor { auto pos = b.state->selVector->selectedPositions[i]; result.setNull(pos, a.isNull(pos) || c.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, pos, bPos, pos, pos, dataPtr); + executeOnValue(a, b, + c, result, pos, bPos, pos, pos, dataPtr); } } } @@ -331,14 +331,14 @@ struct TernaryFunctionExecutor { } else if (a.hasNoNullsGuarantee() && b.hasNoNullsGuarantee()) { if (a.state->selVector->isUnfiltered()) { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { - executeOnValue( - a, b, c, result, i, i, cPos, i, dataPtr); + executeOnValue(a, b, c, + result, i, i, cPos, i, dataPtr); } } else { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { auto pos = a.state->selVector->selectedPositions[i]; - executeOnValue( - a, b, c, result, pos, pos, cPos, pos, dataPtr); + executeOnValue(a, b, c, + result, pos, pos, cPos, pos, dataPtr); } } } else { @@ -346,8 +346,8 @@ struct TernaryFunctionExecutor { for (auto i = 0u; i < a.state->selVector->selectedSize; ++i) { result.setNull(i, a.isNull(i) || b.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - a, b, c, result, i, i, cPos, i, dataPtr); + executeOnValue(a, b, + c, result, i, i, cPos, i, dataPtr); } } } else { @@ -355,8 +355,8 @@ struct TernaryFunctionExecutor { auto pos = a.state->selVector->selectedPositions[i]; result.setNull(pos, a.isNull(pos) || b.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - a, b, c, result, pos, pos, cPos, pos, dataPtr); + executeOnValue(a, b, + c, result, pos, pos, cPos, pos, dataPtr); } } } @@ -369,29 +369,29 @@ struct TernaryFunctionExecutor { common::ValueVector& c, common::ValueVector& result, void* dataPtr) { result.resetAuxiliaryBuffer(); if (a.state->isFlat() && b.state->isFlat() && c.state->isFlat()) { - executeAllFlat( - a, b, c, result, dataPtr); + executeAllFlat(a, b, c, result, + dataPtr); } else if (a.state->isFlat() && b.state->isFlat() && !c.state->isFlat()) { - executeFlatFlatUnflat( - a, b, c, result, dataPtr); + executeFlatFlatUnflat(a, b, c, + result, dataPtr); } else if (a.state->isFlat() && !b.state->isFlat() && !c.state->isFlat()) { - executeFlatUnflatUnflat( - a, b, c, result, dataPtr); + executeFlatUnflatUnflat(a, b, c, + result, dataPtr); } else if (a.state->isFlat() && !b.state->isFlat() && c.state->isFlat()) { - executeFlatUnflatFlat( - a, b, c, result, dataPtr); + executeFlatUnflatFlat(a, b, c, + result, dataPtr); } else if (!a.state->isFlat() && !b.state->isFlat() && !c.state->isFlat()) { - executeAllUnFlat( - a, b, c, result, dataPtr); + executeAllUnFlat(a, b, c, result, + dataPtr); } else if (!a.state->isFlat() && !b.state->isFlat() && c.state->isFlat()) { - executeUnflatUnFlatFlat( - a, b, c, result, dataPtr); + executeUnflatUnFlatFlat(a, b, c, + result, dataPtr); } else if (!a.state->isFlat() && b.state->isFlat() && c.state->isFlat()) { - executeUnflatFlatFlat( - a, b, c, result, dataPtr); + executeUnflatFlatFlat(a, b, c, + result, dataPtr); } else if (!a.state->isFlat() && b.state->isFlat() && !c.state->isFlat()) { - executeUnflatFlatUnflat( - a, b, c, result, dataPtr); + executeUnflatFlatUnflat(a, b, c, + result, dataPtr); } else { KU_ASSERT(false); } @@ -400,29 +400,29 @@ struct TernaryFunctionExecutor { template static void execute(common::ValueVector& a, common::ValueVector& b, common::ValueVector& c, common::ValueVector& result) { - executeSwitch( - a, b, c, result, nullptr /* dataPtr */); + executeSwitch(a, b, c, + result, nullptr /* dataPtr */); } template static void executeString(common::ValueVector& a, common::ValueVector& b, common::ValueVector& c, common::ValueVector& result) { - executeSwitch( - a, b, c, result, nullptr /* dataPtr */); + executeSwitch(a, b, + c, result, nullptr /* dataPtr */); } template static void executeListStruct(common::ValueVector& a, common::ValueVector& b, common::ValueVector& c, common::ValueVector& result) { - executeSwitch( - a, b, c, result, nullptr /* dataPtr */); + executeSwitch(a, b, + c, result, nullptr /* dataPtr */); } template static void executeUDF(common::ValueVector& a, common::ValueVector& b, common::ValueVector& c, common::ValueVector& result, void* dataPtr) { - executeSwitch( - a, b, c, result, dataPtr); + executeSwitch(a, b, c, + result, dataPtr); } }; diff --git a/src/include/function/udf_function.h b/src/include/function/udf_function.h index 50cf3f317ad..f1762582ad3 100644 --- a/src/include/function/udf_function.h +++ b/src/include/function/udf_function.h @@ -20,8 +20,8 @@ struct UnaryUDFExecutor { struct BinaryUDFExecutor { template - static inline void operation( - LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result, void* udfFunc) { + static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result, + void* udfFunc) { typedef RESULT_TYPE (*binary_udf_func)(LEFT_TYPE, RIGHT_TYPE); auto binaryUDFFunc = (binary_udf_func)udfFunc; result = binaryUDFFunc(left, right); @@ -30,8 +30,8 @@ struct BinaryUDFExecutor { struct TernaryUDFExecutor { template - static inline void operation( - A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result, void* udfFunc) { + static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result, + void* udfFunc) { typedef RESULT_TYPE (*ternary_udf_func)(A_TYPE, B_TYPE, C_TYPE); auto ternaryUDFFunc = (ternary_udf_func)udfFunc; result = ternaryUDFFunc(a, b, c); @@ -80,7 +80,7 @@ struct UDF { } template - static function::scalar_func_exec_t createUnaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), + static function::scalar_func_exec_t createUnaryExecFunc(RESULT_TYPE (* /*udfFunc*/)(Args...), const std::vector& /*parameterTypes*/) { KU_UNREACHABLE; } @@ -105,7 +105,7 @@ struct UDF { } template - static function::scalar_func_exec_t createBinaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), + static function::scalar_func_exec_t createBinaryExecFunc(RESULT_TYPE (* /*udfFunc*/)(Args...), const std::vector& /*parameterTypes*/) { KU_UNREACHABLE; } @@ -132,7 +132,7 @@ struct UDF { } template - static function::scalar_func_exec_t createTernaryExecFunc(RESULT_TYPE (*/*udfFunc*/)(Args...), + static function::scalar_func_exec_t createTernaryExecFunc(RESULT_TYPE (* /*udfFunc*/)(Args...), const std::vector& /*parameterTypes*/) { KU_UNREACHABLE; } @@ -160,8 +160,8 @@ struct UDF { } template - static scalar_func_exec_t getScalarExecFunc( - TR (*udfFunc)(Args...), std::vector parameterTypes) { + static scalar_func_exec_t getScalarExecFunc(TR (*udfFunc)(Args...), + std::vector parameterTypes) { constexpr auto numArgs = sizeof...(Args); switch (numArgs) { case 1: @@ -223,15 +223,15 @@ struct UDF { } validateType(returnType); scalar_func_exec_t scalarExecFunc = getScalarExecFunc(udfFunc, parameterTypes); - definitions.push_back(std::make_unique( - std::move(name), std::move(parameterTypes), returnType, std::move(scalarExecFunc))); + definitions.push_back(std::make_unique(std::move(name), + std::move(parameterTypes), returnType, std::move(scalarExecFunc))); return definitions; } template static function_set getFunction(std::string name, TR (*udfFunc)(Args...)) { - return getFunction( - std::move(name), udfFunc, getParameterTypes(), getParameterType()); + return getFunction(std::move(name), udfFunc, getParameterTypes(), + getParameterType()); } template @@ -245,8 +245,8 @@ struct UDF { static function_set getVectorizedFunction(std::string name, scalar_func_exec_t execFunc, std::vector parameterTypes, common::LogicalTypeID returnType) { function_set definitions; - definitions.push_back(std::make_unique( - std::move(name), std::move(parameterTypes), returnType, std::move(execFunc))); + definitions.push_back(std::make_unique(std::move(name), + std::move(parameterTypes), returnType, std::move(execFunc))); return definitions; } }; diff --git a/src/include/function/unary_function_executor.h b/src/include/function/unary_function_executor.h index ae9002eafa5..ba1b3230656 100644 --- a/src/include/function/unary_function_executor.h +++ b/src/include/function/unary_function_executor.h @@ -92,14 +92,14 @@ struct UnaryUDFFunctionWrapper { struct CastChildFunctionExecutor { template - static void executeSwitch( - common::ValueVector& operand, common::ValueVector& result, void* dataPtr) { + static void executeSwitch(common::ValueVector& operand, common::ValueVector& result, + void* dataPtr) { auto numOfEntries = reinterpret_cast(dataPtr)->numOfEntries; for (auto i = 0u; i < numOfEntries; i++) { result.setNull(i, operand.isNull(i)); if (!result.isNull(i)) { - OP_WRAPPER::template operation( - (void*)(&operand), i, (void*)(&result), i, dataPtr); + OP_WRAPPER::template operation((void*)(&operand), + i, (void*)(&result), i, dataPtr); } } } @@ -109,34 +109,34 @@ struct UnaryFunctionExecutor { template static void executeOnValue(common::ValueVector& inputVector, uint64_t inputPos, common::ValueVector& resultVector, uint64_t resultPos, void* dataPtr) { - OP_WRAPPER::template operation( - (void*)&inputVector, inputPos, (void*)&resultVector, resultPos, dataPtr); + OP_WRAPPER::template operation((void*)&inputVector, + inputPos, (void*)&resultVector, resultPos, dataPtr); } template - static void executeSwitch( - common::ValueVector& operand, common::ValueVector& result, void* dataPtr) { + static void executeSwitch(common::ValueVector& operand, common::ValueVector& result, + void* dataPtr) { result.resetAuxiliaryBuffer(); if (operand.state->isFlat()) { auto inputPos = operand.state->selVector->selectedPositions[0]; auto resultPos = result.state->selVector->selectedPositions[0]; result.setNull(resultPos, operand.isNull(inputPos)); if (!result.isNull(resultPos)) { - executeOnValue( - operand, inputPos, result, resultPos, dataPtr); + executeOnValue(operand, inputPos, + result, resultPos, dataPtr); } } else { if (operand.hasNoNullsGuarantee()) { if (operand.state->selVector->isUnfiltered()) { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { - executeOnValue( - operand, i, result, i, dataPtr); + executeOnValue(operand, i, + result, i, dataPtr); } } else { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { auto pos = operand.state->selVector->selectedPositions[i]; - executeOnValue( - operand, pos, result, pos, dataPtr); + executeOnValue(operand, pos, + result, pos, dataPtr); } } } else { @@ -144,8 +144,8 @@ struct UnaryFunctionExecutor { for (auto i = 0u; i < operand.state->selVector->selectedSize; i++) { result.setNull(i, operand.isNull(i)); if (!result.isNull(i)) { - executeOnValue( - operand, i, result, i, dataPtr); + executeOnValue(operand, i, + result, i, dataPtr); } } } else { @@ -153,8 +153,8 @@ struct UnaryFunctionExecutor { auto pos = operand.state->selVector->selectedPositions[i]; result.setNull(pos, operand.isNull(pos)); if (!result.isNull(pos)) { - executeOnValue( - operand, pos, result, pos, dataPtr); + executeOnValue(operand, + pos, result, pos, dataPtr); } } } @@ -164,15 +164,15 @@ struct UnaryFunctionExecutor { template static void execute(common::ValueVector& operand, common::ValueVector& result) { - executeSwitch( - operand, result, nullptr /* dataPtr */); + executeSwitch(operand, result, + nullptr /* dataPtr */); } template - static void executeUDF( - common::ValueVector& operand, common::ValueVector& result, void* dataPtr) { - executeSwitch( - operand, result, dataPtr); + static void executeUDF(common::ValueVector& operand, common::ValueVector& result, + void* dataPtr) { + executeSwitch(operand, result, + dataPtr); } }; diff --git a/src/include/main/client_context.h b/src/include/main/client_context.h index ec7517f6dca..7dc6d40a1c6 100644 --- a/src/include/main/client_context.h +++ b/src/include/main/client_context.h @@ -112,8 +112,8 @@ class ClientContext { std::vector> parseQuery(std::string_view query); private: - std::unique_ptr query( - std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans = true); + std::unique_ptr query(std::string_view query, std::string_view encodedJoin, + bool enumerateAllPlans = true); std::unique_ptr queryResultWithError(std::string_view errMsg); diff --git a/src/include/main/connection.h b/src/include/main/connection.h index d0d5c477183..af059781d7f 100644 --- a/src/include/main/connection.h +++ b/src/include/main/connection.h @@ -64,8 +64,8 @@ class Connection { * @return the result of the query. */ template - inline std::unique_ptr execute( - PreparedStatement* preparedStatement, std::pair... args) { + inline std::unique_ptr execute(PreparedStatement* preparedStatement, + std::pair... args) { std::unordered_map> inputParameters; return executeWithParams(preparedStatement, std::move(inputParameters), args...); } @@ -99,8 +99,8 @@ class Connection { void createScalarFunction(std::string name, TR (*udfFunc)(Args...)) { auto autoTrx = startUDFAutoTrx(clientContext->getTransactionContext()); auto nameCopy = std::string(name); - addScalarFunction( - std::move(nameCopy), function::UDF::getFunction(std::move(name), udfFunc)); + addScalarFunction(std::move(nameCopy), + function::UDF::getFunction(std::move(name), udfFunc)); commitUDFTrx(autoTrx); } @@ -109,9 +109,9 @@ class Connection { common::LogicalTypeID returnType, TR (*udfFunc)(Args...)) { auto autoTrx = startUDFAutoTrx(clientContext->getTransactionContext()); auto nameCopy = std::string(name); - addScalarFunction( - std::move(nameCopy), function::UDF::getFunction(std::move(name), udfFunc, - std::move(parameterTypes), returnType)); + addScalarFunction(std::move(nameCopy), + function::UDF::getFunction(std::move(name), udfFunc, + std::move(parameterTypes), returnType)); commitUDFTrx(autoTrx); } @@ -129,17 +129,17 @@ class Connection { function::scalar_func_exec_t scalarFunc) { auto autoTrx = startUDFAutoTrx(clientContext->getTransactionContext()); auto nameCopy = std::string(name); - addScalarFunction( - std::move(nameCopy), function::UDF::getVectorizedFunction(std::move(name), - std::move(scalarFunc), std::move(parameterTypes), returnType)); + addScalarFunction(std::move(nameCopy), + function::UDF::getVectorizedFunction(std::move(name), std::move(scalarFunc), + std::move(parameterTypes), returnType)); commitUDFTrx(autoTrx); } ClientContext* getClientContext() { return clientContext.get(); }; private: - std::unique_ptr query( - std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans = true); + std::unique_ptr query(std::string_view query, std::string_view encodedJoin, + bool enumerateAllPlans = true); std::unique_ptr queryResultWithError(std::string_view errMsg); diff --git a/src/include/main/database.h b/src/include/main/database.h index 8efb8340015..2af50812ce6 100644 --- a/src/include/main/database.h +++ b/src/include/main/database.h @@ -85,8 +85,8 @@ class Database { * @param databasePath Database path. * @param systemConfig System configurations (buffer pool size and max num threads). */ - KUZU_API explicit Database( - std::string_view databasePath, SystemConfig systemConfig = SystemConfig()); + KUZU_API explicit Database(std::string_view databasePath, + SystemConfig systemConfig = SystemConfig()); /** * @brief Destructs the database object. */ @@ -101,16 +101,16 @@ class Database { // TODO(Ziyi): Instead of exposing a dedicated API for adding a new function, we should consider // add function through the extension module. - void addBuiltInFunction( - std::string name, std::vector> functionSet); + void addBuiltInFunction(std::string name, + std::vector> functionSet); KUZU_API void registerFileSystem(std::unique_ptr fs); - KUZU_API void registerStorageExtension( - std::string name, std::unique_ptr storageExtension); + KUZU_API void registerStorageExtension(std::string name, + std::unique_ptr storageExtension); - KUZU_API void addExtensionOption( - std::string name, common::LogicalTypeID type, common::Value defaultValue); + KUZU_API void addExtensionOption(std::string name, common::LogicalTypeID type, + common::Value defaultValue); ExtensionOption* getExtensionOption(std::string name); diff --git a/src/include/main/db_config.h b/src/include/main/db_config.h index 06c64003de9..a660b9adcbe 100644 --- a/src/include/main/db_config.h +++ b/src/include/main/db_config.h @@ -36,10 +36,10 @@ struct ConfigurationOption : public Option { struct ExtensionOption : public Option { common::Value defaultValue; - ExtensionOption( - std::string name, common::LogicalTypeID parameterType, common::Value defaultValue) - : Option{std::move(name), parameterType, OptionType::EXTENSION}, defaultValue{std::move( - defaultValue)} {} + ExtensionOption(std::string name, common::LogicalTypeID parameterType, + common::Value defaultValue) + : Option{std::move(name), parameterType, OptionType::EXTENSION}, + defaultValue{std::move(defaultValue)} {} }; class DBConfig { diff --git a/src/include/main/plan_printer.h b/src/include/main/plan_printer.h index c4eb119009c..292d248b625 100644 --- a/src/include/main/plan_printer.h +++ b/src/include/main/plan_printer.h @@ -13,8 +13,8 @@ namespace main { class OpProfileBox { public: - OpProfileBox( - std::string opName, const std::string& paramsName, std::vector attributes); + OpProfileBox(std::string opName, const std::string& paramsName, + std::vector attributes); inline std::string getOpName() const { return opName; } @@ -41,8 +41,8 @@ class OpProfileTree { std::ostringstream printPlanToOstream() const; private: - static void calculateNumRowsAndColsForOp( - processor::PhysicalOperator* op, uint32_t& numRows, uint32_t& numCols); + static void calculateNumRowsAndColsForOp(processor::PhysicalOperator* op, uint32_t& numRows, + uint32_t& numCols); uint32_t fillOpProfileBoxes(processor::PhysicalOperator* op, uint32_t rowIdx, uint32_t colIdx, uint32_t& maxFieldWidth, common::Profiler& profiler); @@ -64,8 +64,8 @@ class OpProfileTree { (void)colIdx; } - void insertOpProfileBox( - uint32_t rowIdx, uint32_t colIdx, std::unique_ptr opProfileBox); + void insertOpProfileBox(uint32_t rowIdx, uint32_t colIdx, + std::unique_ptr opProfileBox); OpProfileBox* getOpProfileBox(uint32_t rowIdx, uint32_t colIdx) const; @@ -102,8 +102,8 @@ class PlanPrinter { static inline std::string getOperatorParams(processor::PhysicalOperator* physicalOperator); private: - nlohmann::json toJson( - processor::PhysicalOperator* physicalOperator, common::Profiler& profiler); + nlohmann::json toJson(processor::PhysicalOperator* physicalOperator, + common::Profiler& profiler); private: processor::PhysicalPlan* physicalPlan; diff --git a/src/include/main/query_result.h b/src/include/main/query_result.h index 7cac6b82d14..afd5bebf08c 100644 --- a/src/include/main/query_result.h +++ b/src/include/main/query_result.h @@ -23,8 +23,8 @@ struct DataTypeInfo { // Used by array only. uint64_t fixedNumValues; - static std::unique_ptr getInfoForDataType( - const common::LogicalType& type, const std::string& name); + static std::unique_ptr getInfoForDataType(const common::LogicalType& type, + const std::string& name); }; /** diff --git a/src/include/optimizer/projection_push_down_optimizer.h b/src/include/optimizer/projection_push_down_optimizer.h index 2fb5d07170d..6f9fceb55aa 100644 --- a/src/include/optimizer/projection_push_down_optimizer.h +++ b/src/include/optimizer/projection_push_down_optimizer.h @@ -44,8 +44,8 @@ class ProjectionPushDownOptimizer : public LogicalOperatorVisitor { binder::expression_vector pruneExpressions(const binder::expression_vector& expressions); - void preAppendProjection( - planner::LogicalOperator* op, uint32_t childIdx, binder::expression_vector expressions); + void preAppendProjection(planner::LogicalOperator* op, uint32_t childIdx, + binder::expression_vector expressions); private: binder::expression_set propertiesInUse; diff --git a/src/include/parser/antlr_parser/kuzu_cypher_parser.h b/src/include/parser/antlr_parser/kuzu_cypher_parser.h index 8ec369457b6..d3a8cedc185 100644 --- a/src/include/parser/antlr_parser/kuzu_cypher_parser.h +++ b/src/include/parser/antlr_parser/kuzu_cypher_parser.h @@ -16,8 +16,8 @@ class KuzuCypherParser : public CypherParser { void notifyQueryNotConcludeWithReturn(antlr4::Token* startToken) override; - void notifyNodePatternWithoutParentheses( - std::string nodeName, antlr4::Token* startToken) override; + void notifyNodePatternWithoutParentheses(std::string nodeName, + antlr4::Token* startToken) override; void notifyInvalidNotEqualOperator(antlr4::Token* startToken) override; diff --git a/src/include/parser/antlr_parser/parser_error_strategy.h b/src/include/parser/antlr_parser/parser_error_strategy.h index 7b6dc630eaa..0980073b5a3 100644 --- a/src/include/parser/antlr_parser/parser_error_strategy.h +++ b/src/include/parser/antlr_parser/parser_error_strategy.h @@ -8,8 +8,8 @@ namespace parser { class ParserErrorStrategy : public antlr4::DefaultErrorStrategy { protected: - void reportNoViableAlternative( - antlr4::Parser* recognizer, const antlr4::NoViableAltException& e) override; + void reportNoViableAlternative(antlr4::Parser* recognizer, + const antlr4::NoViableAltException& e) override; }; } // namespace parser diff --git a/src/include/parser/comment_on.h b/src/include/parser/comment_on.h index 092cff669c6..c64451cd4f5 100644 --- a/src/include/parser/comment_on.h +++ b/src/include/parser/comment_on.h @@ -10,8 +10,8 @@ namespace parser { class CommentOn : public Statement { public: explicit CommentOn(std::string table, std::string comment) - : Statement{common::StatementType::COMMENT_ON}, table{std::move(table)}, comment{std::move( - comment)} {} + : Statement{common::StatementType::COMMENT_ON}, table{std::move(table)}, + comment{std::move(comment)} {} inline std::string getTable() const { return table; } diff --git a/src/include/parser/copy.h b/src/include/parser/copy.h index bbc9b23ad80..82c8ff1ac28 100644 --- a/src/include/parser/copy.h +++ b/src/include/parser/copy.h @@ -46,8 +46,8 @@ class CopyFrom : public Copy { class CopyTo : public Copy { public: CopyTo(std::string filePath, std::unique_ptr statement) - : Copy{common::StatementType::COPY_TO}, filePath{std::move(filePath)}, statement{std::move( - statement)} {} + : Copy{common::StatementType::COPY_TO}, filePath{std::move(filePath)}, + statement{std::move(statement)} {} inline std::string getFilePath() const { return filePath; } inline const Statement* getStatement() const { return statement.get(); } diff --git a/src/include/parser/ddl/alter_info.h b/src/include/parser/ddl/alter_info.h index 26d04c81a0d..490747c908b 100644 --- a/src/include/parser/ddl/alter_info.h +++ b/src/include/parser/ddl/alter_info.h @@ -18,8 +18,8 @@ struct AlterInfo { std::string tableName; std::unique_ptr extraInfo; - AlterInfo( - common::AlterType type, std::string tableName, std::unique_ptr extraInfo) + AlterInfo(common::AlterType type, std::string tableName, + std::unique_ptr extraInfo) : type{type}, tableName{std::move(tableName)}, extraInfo{std::move(extraInfo)} {} DELETE_COPY_DEFAULT_MOVE(AlterInfo); }; diff --git a/src/include/parser/ddl/create_table_info.h b/src/include/parser/ddl/create_table_info.h index 7cac23c1132..bef38ea4c0c 100644 --- a/src/include/parser/ddl/create_table_info.h +++ b/src/include/parser/ddl/create_table_info.h @@ -37,8 +37,8 @@ struct ExtraCreateRelTableInfo : public ExtraCreateTableInfo { std::string srcTableName; std::string dstTableName; - ExtraCreateRelTableInfo( - std::string relMultiplicity, std::string srcTableName, std::string dstTableName) + ExtraCreateRelTableInfo(std::string relMultiplicity, std::string srcTableName, + std::string dstTableName) : relMultiplicity{std::move(relMultiplicity)}, srcTableName{std::move(srcTableName)}, dstTableName{std::move(dstTableName)} {} }; @@ -49,8 +49,8 @@ struct ExtraCreateRelTableGroupInfo : public ExtraCreateTableInfo { ExtraCreateRelTableGroupInfo(std::string relMultiplicity, std::vector> srcDstTablePairs) - : relMultiplicity{std::move(relMultiplicity)}, srcDstTablePairs{ - std::move(srcDstTablePairs)} {} + : relMultiplicity{std::move(relMultiplicity)}, + srcDstTablePairs{std::move(srcDstTablePairs)} {} }; } // namespace parser diff --git a/src/include/parser/expression/parsed_case_expression.h b/src/include/parser/expression/parsed_case_expression.h index 0cd4b74a171..e9f709036fb 100644 --- a/src/include/parser/expression/parsed_case_expression.h +++ b/src/include/parser/expression/parsed_case_expression.h @@ -15,8 +15,8 @@ struct ParsedCaseAlternative { std::unique_ptr thenExpression) : whenExpression{std::move(whenExpression)}, thenExpression{std::move(thenExpression)} {} ParsedCaseAlternative(const ParsedCaseAlternative& other) - : whenExpression{other.whenExpression->copy()}, thenExpression{ - other.thenExpression->copy()} {} + : whenExpression{other.whenExpression->copy()}, + thenExpression{other.thenExpression->copy()} {} DEFAULT_BOTH_MOVE(ParsedCaseAlternative); void serialize(common::Serializer& serializer) const; @@ -47,10 +47,9 @@ class ParsedCaseExpression final : public ParsedExpression { ParsedCaseExpression(std::unique_ptr caseExpression, std::vector caseAlternatives, std::unique_ptr elseExpression) - : ParsedExpression{common::ExpressionType::CASE_ELSE}, caseExpression{std::move( - caseExpression)}, - caseAlternatives{std::move(caseAlternatives)}, elseExpression{std::move(elseExpression)} { - } + : ParsedExpression{common::ExpressionType::CASE_ELSE}, + caseExpression{std::move(caseExpression)}, caseAlternatives{std::move(caseAlternatives)}, + elseExpression{std::move(elseExpression)} {} inline void setCaseExpression(std::unique_ptr expression) { caseExpression = std::move(expression); diff --git a/src/include/parser/expression/parsed_expression.h b/src/include/parser/expression/parsed_expression.h index a8a3257adbe..2033910f010 100644 --- a/src/include/parser/expression/parsed_expression.h +++ b/src/include/parser/expression/parsed_expression.h @@ -29,8 +29,8 @@ class ParsedExpression { friend class ParsedExpressionChildrenVisitor; public: - ParsedExpression( - common::ExpressionType type, std::unique_ptr child, std::string rawName); + ParsedExpression(common::ExpressionType type, std::unique_ptr child, + std::string rawName); ParsedExpression(common::ExpressionType type, std::unique_ptr left, std::unique_ptr right, std::string rawName); @@ -42,8 +42,8 @@ class ParsedExpression { ParsedExpression(common::ExpressionType type, std::string alias, std::string rawName, parsed_expr_vector children) - : type{type}, alias{std::move(alias)}, rawName{std::move(rawName)}, children{std::move( - children)} {} + : type{type}, alias{std::move(alias)}, rawName{std::move(rawName)}, + children{std::move(children)} {} DELETE_COPY_DEFAULT_MOVE(ParsedExpression); virtual ~ParsedExpression() = default; diff --git a/src/include/parser/expression/parsed_function_expression.h b/src/include/parser/expression/parsed_function_expression.h index ac9f4b18046..dc1021d4e75 100644 --- a/src/include/parser/expression/parsed_function_expression.h +++ b/src/include/parser/expression/parsed_function_expression.h @@ -49,8 +49,8 @@ class ParsedFunctionExpression : public ParsedExpression { common::Deserializer& deserializer); inline std::unique_ptr copy() const override { - return std::make_unique( - alias, rawName, copyChildren(), functionName, isDistinct); + return std::make_unique(alias, rawName, copyChildren(), + functionName, isDistinct); } private: diff --git a/src/include/parser/expression/parsed_literal_expression.h b/src/include/parser/expression/parsed_literal_expression.h index bfe14d82080..90e73dc4eec 100644 --- a/src/include/parser/expression/parsed_literal_expression.h +++ b/src/include/parser/expression/parsed_literal_expression.h @@ -9,11 +9,11 @@ namespace parser { class ParsedLiteralExpression : public ParsedExpression { public: ParsedLiteralExpression(common::Value value, std::string raw) - : ParsedExpression{common::ExpressionType::LITERAL, std::move(raw)}, value{std::move( - value)} {} + : ParsedExpression{common::ExpressionType::LITERAL, std::move(raw)}, + value{std::move(value)} {} - ParsedLiteralExpression( - std::string alias, std::string rawName, parsed_expr_vector children, common::Value value) + ParsedLiteralExpression(std::string alias, std::string rawName, parsed_expr_vector children, + common::Value value) : ParsedExpression{common::ExpressionType::LITERAL, std::move(alias), std::move(rawName), std::move(children)}, value{std::move(value)} {} diff --git a/src/include/parser/expression/parsed_property_expression.h b/src/include/parser/expression/parsed_property_expression.h index c89e21c520f..55f218994d3 100644 --- a/src/include/parser/expression/parsed_property_expression.h +++ b/src/include/parser/expression/parsed_property_expression.h @@ -9,8 +9,8 @@ namespace parser { class ParsedPropertyExpression : public ParsedExpression { public: - ParsedPropertyExpression( - std::string propertyName, std::unique_ptr child, std::string raw) + ParsedPropertyExpression(std::string propertyName, std::unique_ptr child, + std::string raw) : ParsedExpression{common::ExpressionType::PROPERTY, std::move(child), std::move(raw)}, propertyName{std::move(propertyName)} {} @@ -21,8 +21,8 @@ class ParsedPropertyExpression : public ParsedExpression { propertyName{std::move(propertyName)} {} explicit ParsedPropertyExpression(std::string propertyName) - : ParsedExpression{common::ExpressionType::PROPERTY}, propertyName{ - std::move(propertyName)} {} + : ParsedExpression{common::ExpressionType::PROPERTY}, + propertyName{std::move(propertyName)} {} inline std::string getPropertyName() const { return propertyName; } inline bool isStar() const { return propertyName == common::InternalKeyword::STAR; } @@ -31,8 +31,8 @@ class ParsedPropertyExpression : public ParsedExpression { common::Deserializer& deserializer); inline std::unique_ptr copy() const override { - return std::make_unique( - alias, rawName, copyChildren(), propertyName); + return std::make_unique(alias, rawName, copyChildren(), + propertyName); } private: diff --git a/src/include/parser/expression/parsed_variable_expression.h b/src/include/parser/expression/parsed_variable_expression.h index 40618c0adc6..4ee7545b831 100644 --- a/src/include/parser/expression/parsed_variable_expression.h +++ b/src/include/parser/expression/parsed_variable_expression.h @@ -20,8 +20,8 @@ class ParsedVariableExpression : public ParsedExpression { variableName{std::move(variableName)} {} explicit ParsedVariableExpression(std::string variableName) - : ParsedExpression{common::ExpressionType::VARIABLE}, variableName{ - std::move(variableName)} {} + : ParsedExpression{common::ExpressionType::VARIABLE}, + variableName{std::move(variableName)} {} inline std::string getVariableName() const { return variableName; } @@ -29,8 +29,8 @@ class ParsedVariableExpression : public ParsedExpression { common::Deserializer& deserializer); inline std::unique_ptr copy() const override { - return std::make_unique( - alias, rawName, copyChildren(), variableName); + return std::make_unique(alias, rawName, copyChildren(), + variableName); } private: diff --git a/src/include/parser/query/graph_pattern/rel_pattern.h b/src/include/parser/query/graph_pattern/rel_pattern.h index 424580f7bbb..e45dc21a851 100644 --- a/src/include/parser/query/graph_pattern/rel_pattern.h +++ b/src/include/parser/query/graph_pattern/rel_pattern.h @@ -29,8 +29,8 @@ class RelPattern : public NodePattern { ArrowDirection arrowDirection, std::vector propertyKeyValPairs, RecursiveRelPatternInfo recursiveInfo) : NodePattern{std::move(name), std::move(tableNames), std::move(propertyKeyValPairs)}, - relType{relType}, arrowDirection{arrowDirection}, recursiveInfo{ - std::move(recursiveInfo)} {} + relType{relType}, arrowDirection{arrowDirection}, + recursiveInfo{std::move(recursiveInfo)} {} DELETE_COPY_DEFAULT_MOVE(RelPattern); inline common::QueryRelType getRelType() const { return relType; } diff --git a/src/include/parser/query/reading_clause/in_query_call_clause.h b/src/include/parser/query/reading_clause/in_query_call_clause.h index 2534f7f5300..309da657251 100644 --- a/src/include/parser/query/reading_clause/in_query_call_clause.h +++ b/src/include/parser/query/reading_clause/in_query_call_clause.h @@ -9,8 +9,8 @@ namespace parser { class InQueryCallClause final : public ReadingClause { public: explicit InQueryCallClause(std::unique_ptr functionExpression) - : ReadingClause{common::ClauseType::IN_QUERY_CALL}, functionExpression{ - std::move(functionExpression)} {} + : ReadingClause{common::ClauseType::IN_QUERY_CALL}, + functionExpression{std::move(functionExpression)} {} inline const ParsedExpression* getFunctionExpression() const { return functionExpression.get(); diff --git a/src/include/parser/query/reading_clause/match_clause.h b/src/include/parser/query/reading_clause/match_clause.h index 05f3975524d..5a7eb9f31b3 100644 --- a/src/include/parser/query/reading_clause/match_clause.h +++ b/src/include/parser/query/reading_clause/match_clause.h @@ -9,8 +9,8 @@ namespace parser { class MatchClause : public ReadingClause { public: - MatchClause( - std::vector patternElements, common::MatchClauseType matchClauseType) + MatchClause(std::vector patternElements, + common::MatchClauseType matchClauseType) : ReadingClause{common::ClauseType::MATCH}, patternElements{std::move(patternElements)}, matchClauseType{matchClauseType} {} diff --git a/src/include/parser/query/reading_clause/unwind_clause.h b/src/include/parser/query/reading_clause/unwind_clause.h index 10fcba0d997..70de26ecf33 100644 --- a/src/include/parser/query/reading_clause/unwind_clause.h +++ b/src/include/parser/query/reading_clause/unwind_clause.h @@ -9,8 +9,8 @@ namespace parser { class UnwindClause : public ReadingClause { public: UnwindClause(std::unique_ptr expression, std::string listAlias) - : ReadingClause{common::ClauseType::UNWIND}, - expression{std::move(expression)}, alias{std::move(listAlias)} {} + : ReadingClause{common::ClauseType::UNWIND}, expression{std::move(expression)}, + alias{std::move(listAlias)} {} const ParsedExpression* getExpression() const { return expression.get(); } diff --git a/src/include/parser/query/return_with_clause/projection_body.h b/src/include/parser/query/return_with_clause/projection_body.h index 697557f89b3..6729e3d17b4 100644 --- a/src/include/parser/query/return_with_clause/projection_body.h +++ b/src/include/parser/query/return_with_clause/projection_body.h @@ -8,8 +8,8 @@ namespace parser { class ProjectionBody { public: - ProjectionBody( - bool isDistinct, std::vector> projectionExpressions) + ProjectionBody(bool isDistinct, + std::vector> projectionExpressions) : isDistinct{isDistinct}, projectionExpressions{std::move(projectionExpressions)} {} DELETE_COPY_DEFAULT_MOVE(ProjectionBody); @@ -19,8 +19,8 @@ class ProjectionBody { return projectionExpressions; } - inline void setOrderByExpressions( - std::vector> expressions, std::vector sortOrders) { + inline void setOrderByExpressions(std::vector> expressions, + std::vector sortOrders) { orderByExpressions = std::move(expressions); isAscOrders = std::move(sortOrders); } diff --git a/src/include/parser/query/updating_clause/insert_clause.h b/src/include/parser/query/updating_clause/insert_clause.h index ea836013a5c..715b7a777e2 100644 --- a/src/include/parser/query/updating_clause/insert_clause.h +++ b/src/include/parser/query/updating_clause/insert_clause.h @@ -9,8 +9,8 @@ namespace parser { class InsertClause final : public UpdatingClause { public: explicit InsertClause(std::vector patternElements) - : UpdatingClause{common::ClauseType::INSERT}, patternElements{ - std::move(patternElements)} {}; + : UpdatingClause{common::ClauseType::INSERT}, + patternElements{std::move(patternElements)} {}; inline const std::vector& getPatternElementsRef() const { return patternElements; diff --git a/src/include/planner/join_order/cardinality_estimator.h b/src/include/planner/join_order/cardinality_estimator.h index 918bfbe68fb..01b388ed852 100644 --- a/src/include/planner/join_order/cardinality_estimator.h +++ b/src/include/planner/join_order/cardinality_estimator.h @@ -40,11 +40,11 @@ class CardinalityEstimator { KU_ASSERT(nodeIDName2dom.contains(nodeIDName)); return nodeIDName2dom.at(nodeIDName); } - uint64_t getNumNodes( - const std::vector& tableIDs, transaction::Transaction* transaction); + uint64_t getNumNodes(const std::vector& tableIDs, + transaction::Transaction* transaction); - uint64_t getNumRels( - const std::vector& tableIDs, transaction::Transaction* transaction); + uint64_t getNumRels(const std::vector& tableIDs, + transaction::Transaction* transaction); private: const storage::NodesStoreStatsAndDeletedIDs* nodesStatistics; diff --git a/src/include/planner/join_order/cost_model.h b/src/include/planner/join_order/cost_model.h index afc1e4bb61f..94e6ba19492 100644 --- a/src/include/planner/join_order/cost_model.h +++ b/src/include/planner/join_order/cost_model.h @@ -8,14 +8,14 @@ namespace planner { class CostModel { public: static uint64_t computeExtendCost(const LogicalPlan& childPlan); - static uint64_t computeRecursiveExtendCost( - uint8_t upperBound, double extensionRate, const LogicalPlan& childPlan); + static uint64_t computeRecursiveExtendCost(uint8_t upperBound, double extensionRate, + const LogicalPlan& childPlan); static uint64_t computeHashJoinCost(const binder::expression_vector& joinNodeIDs, const LogicalPlan& probe, const LogicalPlan& build); static uint64_t computeMarkJoinCost(const binder::expression_vector& joinNodeIDs, const LogicalPlan& probe, const LogicalPlan& build); - static uint64_t computeIntersectCost( - const LogicalPlan& probePlan, const std::vector>& buildPlans); + static uint64_t computeIntersectCost(const LogicalPlan& probePlan, + const std::vector>& buildPlans); }; } // namespace planner diff --git a/src/include/planner/join_order/join_order_util.h b/src/include/planner/join_order/join_order_util.h index 52cde7f159f..47a715da090 100644 --- a/src/include/planner/join_order/join_order_util.h +++ b/src/include/planner/join_order/join_order_util.h @@ -8,8 +8,8 @@ namespace planner { struct JoinOrderUtil { // Although we do not flatten join key in Build operator computation. We still need to perform // cardinality and cost estimation based on their flat cardinality. - static uint64_t getJoinKeysFlatCardinality( - const binder::expression_vector& joinNodeIDs, const LogicalPlan& buildPlan); + static uint64_t getJoinKeysFlatCardinality(const binder::expression_vector& joinNodeIDs, + const LogicalPlan& buildPlan); }; } // namespace planner diff --git a/src/include/planner/join_order_enumerator_context.h b/src/include/planner/join_order_enumerator_context.h index af77ac05c91..3f4ddccb4c0 100644 --- a/src/include/planner/join_order_enumerator_context.h +++ b/src/include/planner/join_order_enumerator_context.h @@ -18,8 +18,8 @@ class JoinOrderEnumeratorContext { public: JoinOrderEnumeratorContext() : currentLevel{0}, maxLevel{0}, subPlansTable{std::make_unique()}, - queryGraph{nullptr}, subqueryType{SubqueryType::NONE}, correlatedExpressionsCardinality{ - 1} {} + queryGraph{nullptr}, subqueryType{SubqueryType::NONE}, + correlatedExpressionsCardinality{1} {} DELETE_COPY_DEFAULT_MOVE(JoinOrderEnumeratorContext); void init(const binder::QueryGraph* queryGraph, const binder::expression_vector& predicates); @@ -33,8 +33,8 @@ class JoinOrderEnumeratorContext { const binder::SubqueryGraph& subqueryGraph) const { return subPlansTable->getSubgraphPlans(subqueryGraph); } - inline void addPlan( - const binder::SubqueryGraph& subqueryGraph, std::unique_ptr plan) { + inline void addPlan(const binder::SubqueryGraph& subqueryGraph, + std::unique_ptr plan) { subPlansTable->addPlan(subqueryGraph, std::move(plan)); } diff --git a/src/include/planner/operator/extend/extend_direction.h b/src/include/planner/operator/extend/extend_direction.h index 079727f9547..0541cef3889 100644 --- a/src/include/planner/operator/extend/extend_direction.h +++ b/src/include/planner/operator/extend/extend_direction.h @@ -11,8 +11,8 @@ namespace planner { enum class ExtendDirection : uint8_t { FWD = 0, BWD = 1, BOTH = 2 }; struct ExtendDirectionUtils { - static inline ExtendDirection getExtendDirection( - const binder::RelExpression& relExpression, const binder::NodeExpression& boundNode) { + static inline ExtendDirection getExtendDirection(const binder::RelExpression& relExpression, + const binder::NodeExpression& boundNode) { if (relExpression.getDirectionType() == binder::RelDirectionType::BOTH) { return ExtendDirection::BOTH; } diff --git a/src/include/planner/operator/extend/logical_extend.h b/src/include/planner/operator/extend/logical_extend.h index ab8aa0eca73..5400d839ded 100644 --- a/src/include/planner/operator/extend/logical_extend.h +++ b/src/include/planner/operator/extend/logical_extend.h @@ -23,8 +23,8 @@ class LogicalExtend : public BaseLogicalExtend { inline binder::expression_vector getProperties() const { return properties; } inline std::unique_ptr copy() override { - return make_unique( - boundNode, nbrNode, rel, direction, properties, hasAtMostOneNbr, children[0]->copy()); + return make_unique(boundNode, nbrNode, rel, direction, properties, + hasAtMostOneNbr, children[0]->copy()); } private: diff --git a/src/include/planner/operator/factorization/sink_util.h b/src/include/planner/operator/factorization/sink_util.h index 20d3c7b1eec..a9e2d96fe1a 100644 --- a/src/include/planner/operator/factorization/sink_util.h +++ b/src/include/planner/operator/factorization/sink_util.h @@ -18,8 +18,8 @@ class SinkOperatorUtil { static std::unordered_map getUnFlatPayloadsPerGroup( const Schema& schema, const binder::expression_vector& payloads); - static binder::expression_vector getFlatPayloads( - const Schema& schema, const binder::expression_vector& payloads); + static binder::expression_vector getFlatPayloads(const Schema& schema, + const binder::expression_vector& payloads); static uint32_t appendPayloadsToNewGroup(Schema& schema, binder::expression_vector& payloads); }; diff --git a/src/include/planner/operator/logical_accumulate.h b/src/include/planner/operator/logical_accumulate.h index b521200de7a..3ed55bfc0af 100644 --- a/src/include/planner/operator/logical_accumulate.h +++ b/src/include/planner/operator/logical_accumulate.h @@ -11,8 +11,8 @@ class LogicalAccumulate final : public LogicalOperator { LogicalAccumulate(common::AccumulateType accumulateType, binder::expression_vector flatExprs, std::shared_ptr offset, std::shared_ptr child) : LogicalOperator{LogicalOperatorType::ACCUMULATE, std::move(child)}, - accumulateType{accumulateType}, flatExprs{std::move(flatExprs)}, offset{ - std::move(offset)} {} + accumulateType{accumulateType}, flatExprs{std::move(flatExprs)}, + offset{std::move(offset)} {} void computeFactorizedSchema() override; void computeFlatSchema() override; @@ -28,8 +28,8 @@ class LogicalAccumulate final : public LogicalOperator { std::shared_ptr getOffset() const { return offset; } std::unique_ptr copy() override { - return make_unique( - accumulateType, flatExprs, offset, children[0]->copy()); + return make_unique(accumulateType, flatExprs, offset, + children[0]->copy()); } private: diff --git a/src/include/planner/operator/logical_aggregate.h b/src/include/planner/operator/logical_aggregate.h index 105616385f7..a5e4e700c2f 100644 --- a/src/include/planner/operator/logical_aggregate.h +++ b/src/include/planner/operator/logical_aggregate.h @@ -10,14 +10,14 @@ class LogicalAggregate : public LogicalOperator { LogicalAggregate(binder::expression_vector keyExpressions, binder::expression_vector aggregateExpressions, std::shared_ptr child) : LogicalOperator{LogicalOperatorType::AGGREGATE, std::move(child)}, - keyExpressions{std::move(keyExpressions)}, aggregateExpressions{ - std::move(aggregateExpressions)} {} + keyExpressions{std::move(keyExpressions)}, + aggregateExpressions{std::move(aggregateExpressions)} {} LogicalAggregate(binder::expression_vector keyExpressions, binder::expression_vector dependentKeyExpressions, binder::expression_vector aggregateExpressions, std::shared_ptr child) : LogicalOperator{LogicalOperatorType::AGGREGATE, std::move(child)}, - keyExpressions{std::move(keyExpressions)}, dependentKeyExpressions{std::move( - dependentKeyExpressions)}, + keyExpressions{std::move(keyExpressions)}, + dependentKeyExpressions{std::move(dependentKeyExpressions)}, aggregateExpressions{std::move(aggregateExpressions)} {} void computeFactorizedSchema() override; @@ -50,8 +50,8 @@ class LogicalAggregate : public LogicalOperator { } inline std::unique_ptr copy() override { - return make_unique( - keyExpressions, dependentKeyExpressions, aggregateExpressions, children[0]->copy()); + return make_unique(keyExpressions, dependentKeyExpressions, + aggregateExpressions, children[0]->copy()); } private: diff --git a/src/include/planner/operator/logical_create_macro.h b/src/include/planner/operator/logical_create_macro.h index 72a663710cf..7b123047aa2 100644 --- a/src/include/planner/operator/logical_create_macro.h +++ b/src/include/planner/operator/logical_create_macro.h @@ -10,9 +10,9 @@ class LogicalCreateMacro : public LogicalOperator { public: LogicalCreateMacro(std::shared_ptr outputExpression, std::string macroName, std::unique_ptr macro) - : LogicalOperator{LogicalOperatorType::CREATE_MACRO}, outputExpression{std::move( - outputExpression)}, - macroName{std::move(macroName)}, macro{std::move(macro)} {} + : LogicalOperator{LogicalOperatorType::CREATE_MACRO}, + outputExpression{std::move(outputExpression)}, macroName{std::move(macroName)}, + macro{std::move(macro)} {} void computeFactorizedSchema() override; void computeFlatSchema() override; diff --git a/src/include/planner/operator/logical_cross_product.h b/src/include/planner/operator/logical_cross_product.h index 9825b272ff0..d25557646eb 100644 --- a/src/include/planner/operator/logical_cross_product.h +++ b/src/include/planner/operator/logical_cross_product.h @@ -22,8 +22,8 @@ class LogicalCrossProduct : public LogicalOperator { inline common::AccumulateType getAccumulateType() const { return accumulateType; } inline std::unique_ptr copy() override { - return make_unique( - accumulateType, children[0]->copy(), children[1]->copy()); + return make_unique(accumulateType, children[0]->copy(), + children[1]->copy()); } private: diff --git a/src/include/planner/operator/logical_distinct.h b/src/include/planner/operator/logical_distinct.h index 46ae208b431..bc58ed489c5 100644 --- a/src/include/planner/operator/logical_distinct.h +++ b/src/include/planner/operator/logical_distinct.h @@ -8,12 +8,12 @@ namespace planner { class LogicalDistinct : public LogicalOperator { public: LogicalDistinct(binder::expression_vector keys, std::shared_ptr child) - : LogicalDistinct{ - LogicalOperatorType::DISTINCT, keys, binder::expression_vector{}, std::move(child)} {} + : LogicalDistinct{LogicalOperatorType::DISTINCT, keys, binder::expression_vector{}, + std::move(child)} {} LogicalDistinct(LogicalOperatorType type, binder::expression_vector keys, binder::expression_vector payloads, std::shared_ptr child) - : LogicalOperator{type, std::move(child)}, keys{std::move(keys)}, payloads{std::move( - payloads)} {} + : LogicalOperator{type, std::move(child)}, keys{std::move(keys)}, + payloads{std::move(payloads)} {} void computeFactorizedSchema() override; void computeFlatSchema() override; diff --git a/src/include/planner/operator/logical_explain.h b/src/include/planner/operator/logical_explain.h index f1cc2c53740..83e2e1d8ebd 100644 --- a/src/include/planner/operator/logical_explain.h +++ b/src/include/planner/operator/logical_explain.h @@ -34,8 +34,8 @@ class LogicalExplain : public LogicalOperator { } inline std::unique_ptr copy() override { - return std::make_unique( - children[0], outputExpression, explainType, outputExpressionsToExplain); + return std::make_unique(children[0], outputExpression, explainType, + outputExpressionsToExplain); } private: diff --git a/src/include/planner/operator/logical_filter.h b/src/include/planner/operator/logical_filter.h index 335f671edb4..1487ac8dd2c 100644 --- a/src/include/planner/operator/logical_filter.h +++ b/src/include/planner/operator/logical_filter.h @@ -8,10 +8,10 @@ namespace planner { class LogicalFilter : public LogicalOperator { public: - LogicalFilter( - std::shared_ptr expression, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::FILTER, std::move(child)}, expression{std::move( - expression)} {} + LogicalFilter(std::shared_ptr expression, + std::shared_ptr child) + : LogicalOperator{LogicalOperatorType::FILTER, std::move(child)}, + expression{std::move(expression)} {} inline void computeFactorizedSchema() override { copyChildSchema(0); } inline void computeFlatSchema() override { copyChildSchema(0); } diff --git a/src/include/planner/operator/logical_hash_join.h b/src/include/planner/operator/logical_hash_join.h index f9018045afa..e1e49028989 100644 --- a/src/include/planner/operator/logical_hash_join.h +++ b/src/include/planner/operator/logical_hash_join.h @@ -70,8 +70,8 @@ class LogicalHashJoin : public LogicalOperator { inline JoinSubPlanSolveOrder getJoinSubPlanSolveOrder() const { return order; } inline std::unique_ptr copy() override { - return make_unique( - joinConditions, joinType, mark, children[0]->copy(), children[1]->copy()); + return make_unique(joinConditions, joinType, mark, children[0]->copy(), + children[1]->copy()); } // Flat probe side key group in either of the following two cases: diff --git a/src/include/planner/operator/logical_in_query_call.h b/src/include/planner/operator/logical_in_query_call.h index dc40a15c84c..f77f0c245eb 100644 --- a/src/include/planner/operator/logical_in_query_call.h +++ b/src/include/planner/operator/logical_in_query_call.h @@ -32,8 +32,8 @@ class LogicalInQueryCall : public LogicalOperator { inline std::string getExpressionsForPrinting() const override { return "CALL TABLE FUNC"; } std::unique_ptr copy() override { - return std::make_unique( - tableFunc, bindData->copy(), outputExpressions, rowIDExpression); + return std::make_unique(tableFunc, bindData->copy(), outputExpressions, + rowIDExpression); } private: diff --git a/src/include/planner/operator/logical_intersect.h b/src/include/planner/operator/logical_intersect.h index 3ec8e73f01b..6770cae9e9a 100644 --- a/src/include/planner/operator/logical_intersect.h +++ b/src/include/planner/operator/logical_intersect.h @@ -12,8 +12,8 @@ class LogicalIntersect : public LogicalOperator { binder::expression_vector keyNodeIDs, std::shared_ptr probeChild, std::vector> buildChildren) : LogicalOperator{LogicalOperatorType::INTERSECT, std::move(probeChild)}, - intersectNodeID{std::move(intersectNodeID)}, - keyNodeIDs{std::move(keyNodeIDs)}, sip{SidewaysInfoPassing::NONE} { + intersectNodeID{std::move(intersectNodeID)}, keyNodeIDs{std::move(keyNodeIDs)}, + sip{SidewaysInfoPassing::NONE} { for (auto& child : buildChildren) { children.push_back(std::move(child)); } diff --git a/src/include/planner/operator/logical_operator.h b/src/include/planner/operator/logical_operator.h index f2ab9daac09..a9118b8471f 100644 --- a/src/include/planner/operator/logical_operator.h +++ b/src/include/planner/operator/logical_operator.h @@ -70,8 +70,8 @@ using logical_op_vector_t = std::vector>; class LogicalOperator { public: explicit LogicalOperator(LogicalOperatorType operatorType) : operatorType{operatorType} {} - explicit LogicalOperator( - LogicalOperatorType operatorType, std::shared_ptr child); + explicit LogicalOperator(LogicalOperatorType operatorType, + std::shared_ptr child); explicit LogicalOperator(LogicalOperatorType operatorType, std::shared_ptr left, std::shared_ptr right); explicit LogicalOperator(LogicalOperatorType operatorType, const logical_op_vector_t& children); diff --git a/src/include/planner/operator/logical_order_by.h b/src/include/planner/operator/logical_order_by.h index 9331bc5399c..783ccf8aba8 100644 --- a/src/include/planner/operator/logical_order_by.h +++ b/src/include/planner/operator/logical_order_by.h @@ -10,8 +10,8 @@ class LogicalOrderBy : public LogicalOperator { LogicalOrderBy(binder::expression_vector expressionsToOrderBy, std::vector sortOrders, std::shared_ptr child) : LogicalOperator{LogicalOperatorType::ORDER_BY, std::move(child)}, - expressionsToOrderBy{std::move(expressionsToOrderBy)}, isAscOrders{ - std::move(sortOrders)} {} + expressionsToOrderBy{std::move(expressionsToOrderBy)}, + isAscOrders{std::move(sortOrders)} {} f_group_pos_set getGroupsPosToFlatten(); diff --git a/src/include/planner/operator/logical_partitioner.h b/src/include/planner/operator/logical_partitioner.h index b6dac4b7eb5..4f5c3723224 100644 --- a/src/include/planner/operator/logical_partitioner.h +++ b/src/include/planner/operator/logical_partitioner.h @@ -34,8 +34,8 @@ class LogicalPartitioner : public LogicalOperator { public: LogicalPartitioner(std::vector> infos, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::PARTITIONER, std::move(child)}, infos{std::move( - infos)} {} + : LogicalOperator{LogicalOperatorType::PARTITIONER, std::move(child)}, + infos{std::move(infos)} {} void computeFactorizedSchema() final; void computeFlatSchema() final; @@ -49,8 +49,8 @@ class LogicalPartitioner : public LogicalOperator { } inline std::unique_ptr copy() final { - return make_unique( - LogicalPartitionerInfo::copy(infos), children[0]->copy()); + return make_unique(LogicalPartitionerInfo::copy(infos), + children[0]->copy()); } private: diff --git a/src/include/planner/operator/logical_projection.h b/src/include/planner/operator/logical_projection.h index ac0b7428694..1c68cfda921 100644 --- a/src/include/planner/operator/logical_projection.h +++ b/src/include/planner/operator/logical_projection.h @@ -9,10 +9,10 @@ namespace planner { class LogicalProjection : public LogicalOperator { public: - explicit LogicalProjection( - binder::expression_vector expressions, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::PROJECTION, std::move(child)}, expressions{std::move( - expressions)} {} + explicit LogicalProjection(binder::expression_vector expressions, + std::shared_ptr child) + : LogicalOperator{LogicalOperatorType::PROJECTION, std::move(child)}, + expressions{std::move(expressions)} {} void computeFactorizedSchema() override; void computeFlatSchema() override; diff --git a/src/include/planner/operator/logical_union.h b/src/include/planner/operator/logical_union.h index a7269fb7b9e..32e7f5871af 100644 --- a/src/include/planner/operator/logical_union.h +++ b/src/include/planner/operator/logical_union.h @@ -9,8 +9,8 @@ class LogicalUnion : public LogicalOperator { public: LogicalUnion(binder::expression_vector expressions, const std::vector>& children) - : LogicalOperator{LogicalOperatorType::UNION_ALL, children}, expressionsToUnion{ - std::move(expressions)} {} + : LogicalOperator{LogicalOperatorType::UNION_ALL, children}, + expressionsToUnion{std::move(expressions)} {} f_group_pos_set getGroupsPosToFlatten(uint32_t childIdx); diff --git a/src/include/planner/operator/persistent/logical_copy_to.h b/src/include/planner/operator/persistent/logical_copy_to.h index 4c976a48499..ce0ff8fd79b 100644 --- a/src/include/planner/operator/persistent/logical_copy_to.h +++ b/src/include/planner/operator/persistent/logical_copy_to.h @@ -30,8 +30,8 @@ class LogicalCopyTo : public LogicalOperator { inline const common::CSVOption* getCopyOption() const { return ©ToOption; } inline std::unique_ptr copy() override { - return make_unique( - filePath, fileType, columnNames, columnTypes, copyToOption.copy(), children[0]->copy()); + return make_unique(filePath, fileType, columnNames, columnTypes, + copyToOption.copy(), children[0]->copy()); } private: diff --git a/src/include/planner/operator/persistent/logical_delete.h b/src/include/planner/operator/persistent/logical_delete.h index f2089216977..2bef3bbc64a 100644 --- a/src/include/planner/operator/persistent/logical_delete.h +++ b/src/include/planner/operator/persistent/logical_delete.h @@ -11,8 +11,8 @@ struct LogicalDeleteNodeInfo { std::shared_ptr node; common::DeleteNodeType deleteType; - LogicalDeleteNodeInfo( - std::shared_ptr node, common::DeleteNodeType deleteType) + LogicalDeleteNodeInfo(std::shared_ptr node, + common::DeleteNodeType deleteType) : node{std::move(node)}, deleteType{deleteType} {} inline std::unique_ptr copy() const { @@ -27,8 +27,8 @@ class LogicalDeleteNode : public LogicalOperator { public: LogicalDeleteNode(std::vector> infos, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::DELETE_NODE, std::move(child)}, infos{std::move( - infos)} {} + : LogicalOperator{LogicalOperatorType::DELETE_NODE, std::move(child)}, + infos{std::move(infos)} {} inline void computeFactorizedSchema() final { copyChildSchema(0); } inline void computeFlatSchema() final { copyChildSchema(0); } @@ -47,8 +47,8 @@ class LogicalDeleteNode : public LogicalOperator { f_group_pos_set getGroupsPosToFlatten(); inline std::unique_ptr copy() final { - return std::make_unique( - LogicalDeleteNodeInfo::copy(infos), children[0]->copy()); + return std::make_unique(LogicalDeleteNodeInfo::copy(infos), + children[0]->copy()); } private: @@ -59,8 +59,8 @@ class LogicalDeleteRel : public LogicalOperator { public: LogicalDeleteRel(std::vector> rels, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::DELETE_REL, std::move(child)}, rels{std::move( - rels)} {} + : LogicalOperator{LogicalOperatorType::DELETE_REL, std::move(child)}, + rels{std::move(rels)} {} inline void computeFactorizedSchema() final { copyChildSchema(0); } inline void computeFlatSchema() final { copyChildSchema(0); } diff --git a/src/include/planner/operator/persistent/logical_export_db.h b/src/include/planner/operator/persistent/logical_export_db.h index f2f24189cb3..e77e4a0bbff 100644 --- a/src/include/planner/operator/persistent/logical_export_db.h +++ b/src/include/planner/operator/persistent/logical_export_db.h @@ -9,8 +9,8 @@ namespace planner { class LogicalExportDatabase : public LogicalOperator { public: - explicit LogicalExportDatabase( - common::ReaderConfig boundFileInfo, std::vector> plans) + explicit LogicalExportDatabase(common::ReaderConfig boundFileInfo, + std::vector> plans) : LogicalOperator{LogicalOperatorType::EXPORT_DATABASE, std::move(plans)}, boundFileInfo{std::move(boundFileInfo)} {} diff --git a/src/include/planner/operator/persistent/logical_merge.h b/src/include/planner/operator/persistent/logical_merge.h index 8762152247f..213ae51173c 100644 --- a/src/include/planner/operator/persistent/logical_merge.h +++ b/src/include/planner/operator/persistent/logical_merge.h @@ -23,8 +23,8 @@ class LogicalMerge : public LogicalOperator { insertNodeInfos{std::move(insertNodeInfos)}, insertRelInfos{std::move(insertRelInfos)}, onCreateSetNodeInfos{std::move(onCreateSetNodeInfos)}, onCreateSetRelInfos(std::move(onCreateSetRelInfos)), - onMatchSetNodeInfos{std::move(onMatchSetNodeInfos)}, onMatchSetRelInfos{ - std::move(onMatchSetRelInfos)} {} + onMatchSetNodeInfos{std::move(onMatchSetNodeInfos)}, + onMatchSetRelInfos{std::move(onMatchSetRelInfos)} {} void computeFactorizedSchema() final; void computeFlatSchema() final; diff --git a/src/include/planner/operator/persistent/logical_set.h b/src/include/planner/operator/persistent/logical_set.h index 48860a83608..ab2455dd864 100644 --- a/src/include/planner/operator/persistent/logical_set.h +++ b/src/include/planner/operator/persistent/logical_set.h @@ -9,8 +9,8 @@ struct LogicalSetPropertyInfo { std::shared_ptr nodeOrRel; binder::expression_pair setItem; - LogicalSetPropertyInfo( - std::shared_ptr nodeOrRel, binder::expression_pair setItem) + LogicalSetPropertyInfo(std::shared_ptr nodeOrRel, + binder::expression_pair setItem) : nodeOrRel{std::move(nodeOrRel)}, setItem{std::move(setItem)} {} LogicalSetPropertyInfo(const LogicalSetPropertyInfo& other) : nodeOrRel{other.nodeOrRel}, setItem{other.setItem} {} @@ -42,8 +42,8 @@ class LogicalSetNodeProperty : public LogicalOperator { std::string getExpressionsForPrinting() const final; inline std::unique_ptr copy() final { - return std::make_unique( - LogicalSetPropertyInfo::copy(infos), children[0]->copy()); + return std::make_unique(LogicalSetPropertyInfo::copy(infos), + children[0]->copy()); } private: @@ -54,8 +54,8 @@ class LogicalSetRelProperty : public LogicalOperator { public: LogicalSetRelProperty(std::vector> infos, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::SET_REL_PROPERTY, std::move(child)}, infos{std::move( - infos)} {} + : LogicalOperator{LogicalOperatorType::SET_REL_PROPERTY, std::move(child)}, + infos{std::move(infos)} {} inline void computeFactorizedSchema() final { copyChildSchema(0); } inline void computeFlatSchema() final { copyChildSchema(0); } @@ -69,8 +69,8 @@ class LogicalSetRelProperty : public LogicalOperator { std::string getExpressionsForPrinting() const final; inline std::unique_ptr copy() final { - return std::make_unique( - LogicalSetPropertyInfo::copy(infos), children[0]->copy()); + return std::make_unique(LogicalSetPropertyInfo::copy(infos), + children[0]->copy()); } private: diff --git a/src/include/planner/operator/scan/logical_expressions_scan.h b/src/include/planner/operator/scan/logical_expressions_scan.h index 90633964c3e..326ac96ef06 100644 --- a/src/include/planner/operator/scan/logical_expressions_scan.h +++ b/src/include/planner/operator/scan/logical_expressions_scan.h @@ -10,8 +10,8 @@ namespace planner { class LogicalExpressionsScan : public LogicalOperator { public: explicit LogicalExpressionsScan(binder::expression_vector expressions) - : LogicalOperator{LogicalOperatorType::EXPRESSIONS_SCAN}, expressions{ - std::move(expressions)} {} + : LogicalOperator{LogicalOperatorType::EXPRESSIONS_SCAN}, + expressions{std::move(expressions)} {} inline void computeFactorizedSchema() final { computeSchema(); } inline void computeFlatSchema() final { computeSchema(); } diff --git a/src/include/planner/operator/scan/logical_index_scan.h b/src/include/planner/operator/scan/logical_index_scan.h index 87a84bbe825..06b61ac239d 100644 --- a/src/include/planner/operator/scan/logical_index_scan.h +++ b/src/include/planner/operator/scan/logical_index_scan.h @@ -8,10 +8,10 @@ namespace planner { class LogicalIndexScanNode : public LogicalOperator { public: - LogicalIndexScanNode( - std::vector infos, std::shared_ptr child) - : LogicalOperator{LogicalOperatorType::INDEX_SCAN_NODE, std::move(child)}, infos{std::move( - infos)} {} + LogicalIndexScanNode(std::vector infos, + std::shared_ptr child) + : LogicalOperator{LogicalOperatorType::INDEX_SCAN_NODE, std::move(child)}, + infos{std::move(infos)} {} void computeFactorizedSchema() override; void computeFlatSchema() override; diff --git a/src/include/planner/operator/scan/logical_scan_file.h b/src/include/planner/operator/scan/logical_scan_file.h index 4e070354198..e3ab967ad08 100644 --- a/src/include/planner/operator/scan/logical_scan_file.h +++ b/src/include/planner/operator/scan/logical_scan_file.h @@ -9,8 +9,8 @@ namespace planner { class LogicalScanFile : public LogicalOperator { public: LogicalScanFile(binder::BoundFileScanInfo info, std::shared_ptr offset) - : LogicalOperator{LogicalOperatorType::SCAN_FILE}, info{std::move(info)}, offset{std::move( - offset)} {} + : LogicalOperator{LogicalOperatorType::SCAN_FILE}, info{std::move(info)}, + offset{std::move(offset)} {} std::string getExpressionsForPrinting() const override { return std::string(); } diff --git a/src/include/planner/operator/scan/logical_scan_internal_id.h b/src/include/planner/operator/scan/logical_scan_internal_id.h index f069196306c..38099ab1d2c 100644 --- a/src/include/planner/operator/scan/logical_scan_internal_id.h +++ b/src/include/planner/operator/scan/logical_scan_internal_id.h @@ -7,10 +7,10 @@ namespace planner { class LogicalScanInternalID : public LogicalOperator { public: - explicit LogicalScanInternalID( - std::shared_ptr internalID, std::vector tableIDs) - : LogicalOperator{LogicalOperatorType::SCAN_INTERNAL_ID}, - internalID{std::move(internalID)}, tableIDs{std::move(tableIDs)} {} + explicit LogicalScanInternalID(std::shared_ptr internalID, + std::vector tableIDs) + : LogicalOperator{LogicalOperatorType::SCAN_INTERNAL_ID}, internalID{std::move(internalID)}, + tableIDs{std::move(tableIDs)} {} void computeFactorizedSchema() final; void computeFlatSchema() final; diff --git a/src/include/planner/operator/scan/logical_scan_node_property.h b/src/include/planner/operator/scan/logical_scan_node_property.h index 958a1d14712..d6926ce2096 100644 --- a/src/include/planner/operator/scan/logical_scan_node_property.h +++ b/src/include/planner/operator/scan/logical_scan_node_property.h @@ -12,8 +12,8 @@ class LogicalScanNodeProperty : public LogicalOperator { std::vector nodeTableIDs, binder::expression_vector properties, std::shared_ptr child) : LogicalOperator{LogicalOperatorType::SCAN_NODE_PROPERTY, std::move(child)}, - nodeID{std::move(nodeID)}, nodeTableIDs{std::move(nodeTableIDs)}, properties{std::move( - properties)} {} + nodeID{std::move(nodeID)}, nodeTableIDs{std::move(nodeTableIDs)}, + properties{std::move(properties)} {} void computeFactorizedSchema() final; void computeFlatSchema() final; @@ -27,8 +27,8 @@ class LogicalScanNodeProperty : public LogicalOperator { inline binder::expression_vector getProperties() const { return properties; } inline std::unique_ptr copy() final { - return make_unique( - nodeID, nodeTableIDs, properties, children[0]->copy()); + return make_unique(nodeID, nodeTableIDs, properties, + children[0]->copy()); } private: diff --git a/src/include/planner/operator/schema.h b/src/include/planner/operator/schema.h index 4597e780201..eaaadf7ba28 100644 --- a/src/include/planner/operator/schema.h +++ b/src/include/planner/operator/schema.h @@ -76,14 +76,14 @@ class Schema { f_group_pos createGroup(); void insertToScope(const std::shared_ptr& expression, uint32_t groupPos); - void insertToGroupAndScope( - const std::shared_ptr& expression, uint32_t groupPos); + void insertToGroupAndScope(const std::shared_ptr& expression, + uint32_t groupPos); // Use these unsafe insert functions only if the operator may work with duplicate expressions. // E.g. group by a.age, a.age - void insertToScopeMayRepeat( - const std::shared_ptr& expression, uint32_t groupPos); - void insertToGroupAndScopeMayRepeat( - const std::shared_ptr& expression, uint32_t groupPos); + void insertToScopeMayRepeat(const std::shared_ptr& expression, + uint32_t groupPos); + void insertToGroupAndScopeMayRepeat(const std::shared_ptr& expression, + uint32_t groupPos); void insertToGroupAndScope(const binder::expression_vector& expressions, uint32_t groupPos); @@ -142,13 +142,13 @@ class SchemaUtils { // Given a set of factorization group, a leading group is selected as the unFlat group (caller // should ensure at most one unFlat group which is our general assumption of factorization). If // all groups are flat, we select any (the first) group as leading group. - static f_group_pos getLeadingGroupPos( - const std::unordered_set& groupPositions, const Schema& schema); + static f_group_pos getLeadingGroupPos(const std::unordered_set& groupPositions, + const Schema& schema); - static void validateAtMostOneUnFlatGroup( - const std::unordered_set& groupPositions, const Schema& schema); - static void validateNoUnFlatGroup( - const std::unordered_set& groupPositions, const Schema& schema); + static void validateAtMostOneUnFlatGroup(const std::unordered_set& groupPositions, + const Schema& schema); + static void validateNoUnFlatGroup(const std::unordered_set& groupPositions, + const Schema& schema); }; } // namespace planner diff --git a/src/include/planner/planner.h b/src/include/planner/planner.h index 5040462cb94..248d7fb29b3 100644 --- a/src/include/planner/planner.h +++ b/src/include/planner/planner.h @@ -56,14 +56,14 @@ class Planner { // Plan copy. std::unique_ptr planCopyTo(const binder::BoundStatement& statement); std::unique_ptr planCopyFrom(const binder::BoundStatement& statement); - std::unique_ptr planCopyNodeFrom( - const binder::BoundCopyFromInfo* info, binder::expression_vector outExprs); - std::unique_ptr planCopyResourceFrom( - const binder::BoundCopyFromInfo* info, binder::expression_vector results); - std::unique_ptr planCopyRelFrom( - const binder::BoundCopyFromInfo* info, binder::expression_vector outExprs); - std::unique_ptr planCopyRdfFrom( - const binder::BoundCopyFromInfo* info, binder::expression_vector outExprs); + std::unique_ptr planCopyNodeFrom(const binder::BoundCopyFromInfo* info, + binder::expression_vector outExprs); + std::unique_ptr planCopyResourceFrom(const binder::BoundCopyFromInfo* info, + binder::expression_vector results); + std::unique_ptr planCopyRelFrom(const binder::BoundCopyFromInfo* info, + binder::expression_vector outExprs); + std::unique_ptr planCopyRdfFrom(const binder::BoundCopyFromInfo* info, + binder::expression_vector outExprs); // Plan export/import database std::unique_ptr planExportDatabase(const binder::BoundStatement& statement); @@ -116,8 +116,8 @@ class Planner { void planRegularMatch(const binder::QueryGraphCollection& queryGraphCollection, const binder::expression_vector& predicates, LogicalPlan& leftPlan); void planSubquery(const std::shared_ptr& subquery, LogicalPlan& outerPlan); - void planSubqueryIfNecessary( - const std::shared_ptr& expression, LogicalPlan& plan); + void planSubqueryIfNecessary(const std::shared_ptr& expression, + LogicalPlan& plan); static binder::expression_vector getCorrelatedExprs( const binder::QueryGraphCollection& collection, const binder::expression_vector& predicates, @@ -139,8 +139,8 @@ class Planner { const binder::QueryGraph& queryGraph, binder::expression_vector& predicates); // Plan node/rel table scan - void planBaseTableScans( - SubqueryType subqueryType, const binder::expression_vector& correlatedExpressions); + void planBaseTableScans(SubqueryType subqueryType, + const binder::expression_vector& correlatedExpressions); void planCorrelatedExpressionsScan(const binder::expression_vector& correlatedExpressions); void planNodeScan(uint32_t nodePos); void planNodeIDScan(uint32_t nodePos); @@ -175,18 +175,18 @@ class Planner { std::vector> rightPlans); // Append updating operators - void appendInsertNode( - const std::vector& boundInsertInfos, LogicalPlan& plan); - void appendInsertRel( - const std::vector& boundInsertInfos, LogicalPlan& plan); - void appendSetNodeProperty( - const std::vector& boundInfos, LogicalPlan& plan); - void appendSetRelProperty( - const std::vector& boundInfos, LogicalPlan& plan); - void appendDeleteNode( - const std::vector& boundInfos, LogicalPlan& plan); - void appendDeleteRel( - const std::vector& boundInfos, LogicalPlan& plan); + void appendInsertNode(const std::vector& boundInsertInfos, + LogicalPlan& plan); + void appendInsertRel(const std::vector& boundInsertInfos, + LogicalPlan& plan); + void appendSetNodeProperty(const std::vector& boundInfos, + LogicalPlan& plan); + void appendSetRelProperty(const std::vector& boundInfos, + LogicalPlan& plan); + void appendDeleteNode(const std::vector& boundInfos, + LogicalPlan& plan); + void appendDeleteRel(const std::vector& boundInfos, + LogicalPlan& plan); std::unique_ptr createLogicalInsertInfo(const binder::BoundInsertInfo* info); std::unique_ptr createLogicalSetPropertyInfo( const binder::BoundSetPropertyInfo* boundSetPropertyInfo); @@ -217,8 +217,8 @@ class Planner { const std::shared_ptr& nbrNode, const std::shared_ptr& rel, ExtendDirection direction, LogicalPlan& plan); - void createRecursivePlan( - const binder::RecursiveInfo& recursiveInfo, ExtendDirection direction, LogicalPlan& plan); + void createRecursivePlan(const binder::RecursiveInfo& recursiveInfo, ExtendDirection direction, + LogicalPlan& plan); void createPathNodePropertyScanPlan(const std::shared_ptr& node, const binder::expression_vector& properties, LogicalPlan& plan); void createPathRelPropertyScanPlan(const std::shared_ptr& boundNode, diff --git a/src/include/processor/operator/aggregate/aggregate_hash_table.h b/src/include/processor/operator/aggregate/aggregate_hash_table.h index 3b60b34d651..e918621d47e 100644 --- a/src/include/processor/operator/aggregate/aggregate_hash_table.h +++ b/src/include/processor/operator/aggregate/aggregate_hash_table.h @@ -115,17 +115,17 @@ class AggregateHashTable : public BaseHashTable { // ! This function will only be used by distinct aggregate, which assumes that all groupByKeys // are flat. - uint8_t* findEntryInDistinctHT( - const std::vector& groupByKeyVectors, common::hash_t hash); + uint8_t* findEntryInDistinctHT(const std::vector& groupByKeyVectors, + common::hash_t hash); - void initializeFTEntryWithFlatVec( - common::ValueVector* flatVector, uint64_t numEntriesToInitialize, uint32_t colIdx); + void initializeFTEntryWithFlatVec(common::ValueVector* flatVector, + uint64_t numEntriesToInitialize, uint32_t colIdx); - void initializeFTEntryWithUnFlatVec( - common::ValueVector* unFlatVector, uint64_t numEntriesToInitialize, uint32_t colIdx); + void initializeFTEntryWithUnFlatVec(common::ValueVector* unFlatVector, + uint64_t numEntriesToInitialize, uint32_t colIdx); - uint8_t* createEntryInDistinctHT( - const std::vector& groupByHashKeyVectors, common::hash_t hash); + uint8_t* createEntryInDistinctHT(const std::vector& groupByHashKeyVectors, + common::hash_t hash); void increaseSlotIdx(uint64_t& slotIdx) const; diff --git a/src/include/processor/operator/aggregate/aggregate_input.h b/src/include/processor/operator/aggregate/aggregate_input.h index b391ee7d343..3392c3016e8 100644 --- a/src/include/processor/operator/aggregate/aggregate_input.h +++ b/src/include/processor/operator/aggregate/aggregate_input.h @@ -10,8 +10,8 @@ struct AggregateInputInfo { DataPos aggregateVectorPos; std::vector multiplicityChunksPos; - AggregateInputInfo( - const DataPos& vectorPos, std::vector multiplicityChunksPos) + AggregateInputInfo(const DataPos& vectorPos, + std::vector multiplicityChunksPos) : aggregateVectorPos{vectorPos}, multiplicityChunksPos{std::move(multiplicityChunksPos)} {} AggregateInputInfo(const AggregateInputInfo& other) : AggregateInputInfo(other.aggregateVectorPos, other.multiplicityChunksPos) {} diff --git a/src/include/processor/operator/aggregate/base_aggregate.h b/src/include/processor/operator/aggregate/base_aggregate.h index 65365e45c33..8a1d693ec02 100644 --- a/src/include/processor/operator/aggregate/base_aggregate.h +++ b/src/include/processor/operator/aggregate/base_aggregate.h @@ -30,8 +30,8 @@ class BaseAggregate : public Sink { std::unique_ptr child, uint32_t id, const std::string& paramsString) : Sink{std::move(resultSetDescriptor), PhysicalOperatorType::AGGREGATE, std::move(child), id, paramsString}, - aggregateFunctions{std::move(aggregateFunctions)}, aggregateInputInfos{ - std::move(aggregateInputInfos)} {} + aggregateFunctions{std::move(aggregateFunctions)}, + aggregateInputInfos{std::move(aggregateInputInfos)} {} void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; diff --git a/src/include/processor/operator/aggregate/base_aggregate_scan.h b/src/include/processor/operator/aggregate/base_aggregate_scan.h index f276fc8846f..f9073a3ae2b 100644 --- a/src/include/processor/operator/aggregate/base_aggregate_scan.h +++ b/src/include/processor/operator/aggregate/base_aggregate_scan.h @@ -14,8 +14,8 @@ class BaseAggregateScan : public PhysicalOperator { paramsString}, aggregatesPos{std::move(aggregatesPos)} {} - BaseAggregateScan( - std::vector aggregatesPos, uint32_t id, const std::string& paramsString) + BaseAggregateScan(std::vector aggregatesPos, uint32_t id, + const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::AGGREGATE_SCAN, id, paramsString}, aggregatesPos{std::move(aggregatesPos)} {} @@ -28,8 +28,8 @@ class BaseAggregateScan : public PhysicalOperator { std::unique_ptr clone() override = 0; protected: - void writeAggregateResultToVector( - common::ValueVector& vector, uint64_t pos, function::AggregateState* aggregateState); + void writeAggregateResultToVector(common::ValueVector& vector, uint64_t pos, + function::AggregateState* aggregateState); protected: std::vector aggregatesPos; diff --git a/src/include/processor/operator/aggregate/hash_aggregate.h b/src/include/processor/operator/aggregate/hash_aggregate.h index aadee4cd5be..0f224db67da 100644 --- a/src/include/processor/operator/aggregate/hash_aggregate.h +++ b/src/include/processor/operator/aggregate/hash_aggregate.h @@ -55,8 +55,8 @@ struct HashAggregateLocalState { void init(ResultSet& resultSet, main::ClientContext* context, HashAggregateInfo& info, std::vector>& aggregateFunctions); - void append( - std::vector>& aggregateInputs, uint64_t multiplicity) const; + void append(std::vector>& aggregateInputs, + uint64_t multiplicity) const; }; class HashAggregate : public BaseAggregate { diff --git a/src/include/processor/operator/aggregate/hash_aggregate_scan.h b/src/include/processor/operator/aggregate/hash_aggregate_scan.h index 6259a347be2..0715bf7b6cb 100644 --- a/src/include/processor/operator/aggregate/hash_aggregate_scan.h +++ b/src/include/processor/operator/aggregate/hash_aggregate_scan.h @@ -12,15 +12,15 @@ class HashAggregateScan : public BaseAggregateScan { std::vector groupByKeyVectorsPos, std::vector aggregatesPos, std::unique_ptr child, uint32_t id, const std::string& paramsString) : BaseAggregateScan{std::move(aggregatesPos), std::move(child), id, paramsString}, - groupByKeyVectorsPos{std::move(groupByKeyVectorsPos)}, sharedState{ - std::move(sharedState)} {} + groupByKeyVectorsPos{std::move(groupByKeyVectorsPos)}, + sharedState{std::move(sharedState)} {} HashAggregateScan(std::shared_ptr sharedState, std::vector groupByKeyVectorsPos, std::vector aggregatesPos, uint32_t id, const std::string& paramsString) : BaseAggregateScan{std::move(aggregatesPos), id, paramsString}, - groupByKeyVectorsPos{std::move(groupByKeyVectorsPos)}, sharedState{ - std::move(sharedState)} {} + groupByKeyVectorsPos{std::move(groupByKeyVectorsPos)}, + sharedState{std::move(sharedState)} {} inline std::shared_ptr getSharedState() const { return sharedState; } @@ -29,8 +29,8 @@ class HashAggregateScan : public BaseAggregateScan { bool getNextTuplesInternal(ExecutionContext* context) override; std::unique_ptr clone() override { - return std::make_unique( - sharedState, groupByKeyVectorsPos, aggregatesPos, id, paramsString); + return std::make_unique(sharedState, groupByKeyVectorsPos, aggregatesPos, + id, paramsString); } double getProgress(ExecutionContext* context) const override; diff --git a/src/include/processor/operator/call/standalone_call.h b/src/include/processor/operator/call/standalone_call.h index 6172f9d93a6..ba957ecdcd7 100644 --- a/src/include/processor/operator/call/standalone_call.h +++ b/src/include/processor/operator/call/standalone_call.h @@ -24,8 +24,8 @@ class StandaloneCall : public PhysicalOperator { public: StandaloneCall(std::unique_ptr localState, PhysicalOperatorType operatorType, uint32_t id, const std::string& paramsString) - : PhysicalOperator{operatorType, id, paramsString}, standaloneCallInfo{ - std::move(localState)} {} + : PhysicalOperator{operatorType, id, paramsString}, + standaloneCallInfo{std::move(localState)} {} inline bool isSource() const override { return true; } inline bool canParallel() const final { return false; } @@ -33,8 +33,8 @@ class StandaloneCall : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) override; inline std::unique_ptr clone() override { - return std::make_unique( - standaloneCallInfo->copy(), operatorType, id, paramsString); + return std::make_unique(standaloneCallInfo->copy(), operatorType, id, + paramsString); } private: diff --git a/src/include/processor/operator/comment_on.h b/src/include/processor/operator/comment_on.h index 5514d67817a..944181b99a1 100644 --- a/src/include/processor/operator/comment_on.h +++ b/src/include/processor/operator/comment_on.h @@ -24,16 +24,16 @@ struct CommentOnInfo { class CommentOn : public PhysicalOperator { public: - CommentOn( - std::unique_ptr localState, uint32_t id, const std::string& paramsString) + CommentOn(std::unique_ptr localState, uint32_t id, + const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::COMMENT_ON, id, paramsString}, commentOnInfo{std::move(localState)} {} inline bool isSource() const override { return true; } inline bool canParallel() const final { return false; } - inline void initLocalStateInternal( - ResultSet* resultSet, ExecutionContext* /*context*/) override { + inline void initLocalStateInternal(ResultSet* resultSet, + ExecutionContext* /*context*/) override { outputVector = resultSet->getValueVector(commentOnInfo->outputPos).get(); } diff --git a/src/include/processor/operator/cross_product.h b/src/include/processor/operator/cross_product.h index 535b35f2c53..5c0286109e4 100644 --- a/src/include/processor/operator/cross_product.h +++ b/src/include/processor/operator/cross_product.h @@ -66,8 +66,8 @@ class CrossProduct : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) override; std::unique_ptr clone() override { - return std::make_unique( - info->copy(), localState->copy(), children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), localState->copy(), + children[0]->clone(), id, paramsString); } private: diff --git a/src/include/processor/operator/ddl/create_table.h b/src/include/processor/operator/ddl/create_table.h index 0b6f9f13812..6b45ca1d008 100644 --- a/src/include/processor/operator/ddl/create_table.h +++ b/src/include/processor/operator/ddl/create_table.h @@ -10,8 +10,8 @@ class CreateTable : public DDL { public: CreateTable(binder::BoundCreateTableInfo info, const DataPos& outputPos, uint32_t id, const std::string& paramsString) - : DDL{PhysicalOperatorType::CREATE_TABLE, outputPos, id, paramsString}, info{std::move( - info)} {} + : DDL{PhysicalOperatorType::CREATE_TABLE, outputPos, id, paramsString}, + info{std::move(info)} {} void executeDDLInternal(ExecutionContext* context) final; diff --git a/src/include/processor/operator/filter.h b/src/include/processor/operator/filter.h index 424b7c029ac..741d7acc004 100644 --- a/src/include/processor/operator/filter.h +++ b/src/include/processor/operator/filter.h @@ -35,8 +35,8 @@ struct NodeLabelFilterInfo { DataPos nodeVectorPos; std::unordered_set nodeLabelSet; - NodeLabelFilterInfo( - const DataPos& nodeVectorPos, std::unordered_set nodeLabelSet) + NodeLabelFilterInfo(const DataPos& nodeVectorPos, + std::unordered_set nodeLabelSet) : nodeVectorPos{nodeVectorPos}, nodeLabelSet{std::move(nodeLabelSet)} {} NodeLabelFilterInfo(const NodeLabelFilterInfo& other) : nodeVectorPos{other.nodeVectorPos}, nodeLabelSet{other.nodeLabelSet} {} @@ -58,8 +58,8 @@ class NodeLabelFiler : public PhysicalOperator, public SelVectorOverWriter { bool getNextTuplesInternal(ExecutionContext* context) override; inline std::unique_ptr clone() final { - return std::make_unique( - info->copy(), children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), children[0]->clone(), id, + paramsString); } private: diff --git a/src/include/processor/operator/hash_join/join_hash_table.h b/src/include/processor/operator/hash_join/join_hash_table.h index a069fa4911c..34c81fb940e 100644 --- a/src/include/processor/operator/hash_join/join_hash_table.h +++ b/src/include/processor/operator/hash_join/join_hash_table.h @@ -17,8 +17,8 @@ class JoinHashTable : public BaseHashTable { const std::vector& appendInfos, ft_col_idx_t colIdx); // Used in worst-case optimal join - void appendVectorWithSorting( - common::ValueVector* keyVector, std::vector payloadVectors); + void appendVectorWithSorting(common::ValueVector* keyVector, + std::vector payloadVectors); void allocateHashSlots(uint64_t numTuples); void buildHashSlots(); diff --git a/src/include/processor/operator/intersect/intersect.h b/src/include/processor/operator/intersect/intersect.h index 14d26617278..62981220df5 100644 --- a/src/include/processor/operator/intersect/intersect.h +++ b/src/include/processor/operator/intersect/intersect.h @@ -19,8 +19,8 @@ class Intersect : public PhysicalOperator { std::vector> children, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::INTERSECT, std::move(children), id, paramsString}, - outputDataPos{outputDataPos}, - intersectDataInfos{std::move(intersectDataInfos)}, sharedHTs{std::move(sharedHTs)} { + outputDataPos{outputDataPos}, intersectDataInfos{std::move(intersectDataInfos)}, + sharedHTs{std::move(sharedHTs)} { tupleIdxPerBuildSide.resize(this->sharedHTs.size(), 0); carryBuildSideIdx = -1u; probedFlatTuples.resize(this->sharedHTs.size()); @@ -44,8 +44,8 @@ class Intersect : public PhysicalOperator { static void twoWayIntersect(common::nodeID_t* leftNodeIDs, common::SelectionVector& lSelVector, common::nodeID_t* rightNodeIDs, common::SelectionVector& rSelVector); void intersectLists(const std::vector& listsToIntersect); - void populatePayloads( - const std::vector& tuples, const std::vector& listIdxes); + void populatePayloads(const std::vector& tuples, + const std::vector& listIdxes); bool hasNextTuplesToIntersect(); inline uint32_t getNumBuilds() { return sharedHTs.size(); } diff --git a/src/include/processor/operator/macro/create_macro.h b/src/include/processor/operator/macro/create_macro.h index 7da9604cb8c..1eafc8cfa87 100644 --- a/src/include/processor/operator/macro/create_macro.h +++ b/src/include/processor/operator/macro/create_macro.h @@ -27,22 +27,22 @@ class CreateMacro : public PhysicalOperator { public: CreateMacro(PhysicalOperatorType operatorType, std::unique_ptr createMacroInfo, uint32_t id, const std::string& paramsString) - : PhysicalOperator{operatorType, id, paramsString}, createMacroInfo{ - std::move(createMacroInfo)} {} + : PhysicalOperator{operatorType, id, paramsString}, + createMacroInfo{std::move(createMacroInfo)} {} inline bool isSource() const override { return true; } inline bool canParallel() const final { return false; } - inline void initLocalStateInternal( - ResultSet* resultSet, ExecutionContext* /*context*/) override { + inline void initLocalStateInternal(ResultSet* resultSet, + ExecutionContext* /*context*/) override { outputVector = resultSet->getValueVector(createMacroInfo->outputPos).get(); } bool getNextTuplesInternal(ExecutionContext* context) override; std::unique_ptr clone() override { - return std::make_unique( - operatorType, createMacroInfo->copy(), id, paramsString); + return std::make_unique(operatorType, createMacroInfo->copy(), id, + paramsString); } private: diff --git a/src/include/processor/operator/multiplicity_reducer.h b/src/include/processor/operator/multiplicity_reducer.h index 9ecb158f993..1b36c921627 100644 --- a/src/include/processor/operator/multiplicity_reducer.h +++ b/src/include/processor/operator/multiplicity_reducer.h @@ -8,8 +8,8 @@ namespace processor { class MultiplicityReducer : public PhysicalOperator { public: - MultiplicityReducer( - std::unique_ptr child, uint32_t id, const std::string& paramsString) + MultiplicityReducer(std::unique_ptr child, uint32_t id, + const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::MULTIPLICITY_REDUCER, std::move(child), id, paramsString}, prevMultiplicity{1}, numRepeat{0} {} diff --git a/src/include/processor/operator/order_by/key_block_merger.h b/src/include/processor/operator/order_by/key_block_merger.h index 57e3796dee7..66c65a79ce6 100644 --- a/src/include/processor/operator/order_by/key_block_merger.h +++ b/src/include/processor/operator/order_by/key_block_merger.h @@ -28,8 +28,8 @@ struct StrKeyColInfo { class MergedKeyBlocks { public: - MergedKeyBlocks( - uint32_t numBytesPerTuple, uint64_t numTuples, storage::MemoryManager* memoryManager); + MergedKeyBlocks(uint32_t numBytesPerTuple, uint64_t numTuples, + storage::MemoryManager* memoryManager); // This constructor is used to convert a dataBlock to a MergedKeyBlocks. MergedKeyBlocks(uint32_t numBytesPerTuple, std::shared_ptr keyBlock); @@ -51,8 +51,8 @@ class MergedKeyBlocks { return keyBlocks[idx]->getData(); } - uint8_t* getBlockEndTuplePtr( - uint32_t blockIdx, uint64_t endTupleIdx, uint32_t endTupleBlockIdx) const; + uint8_t* getBlockEndTuplePtr(uint32_t blockIdx, uint64_t endTupleIdx, + uint32_t endTupleBlockIdx) const; private: uint32_t numBytesPerTuple; diff --git a/src/include/processor/operator/order_by/order_by_data_info.h b/src/include/processor/operator/order_by/order_by_data_info.h index 45863ee22c7..9594808d825 100644 --- a/src/include/processor/operator/order_by/order_by_data_info.h +++ b/src/include/processor/operator/order_by/order_by_data_info.h @@ -20,17 +20,16 @@ struct OrderByDataInfo { std::vector> payloadTypes, std::vector isAscOrder, std::unique_ptr payloadTableSchema, std::vector keyInPayloadPos) - : keysPos{std::move(keysPos)}, payloadsPos{std::move(payloadsPos)}, keyTypes{std::move( - keyTypes)}, - payloadTypes{std::move(payloadTypes)}, isAscOrder{std::move(isAscOrder)}, - payloadTableSchema{std::move(payloadTableSchema)}, keyInPayloadPos{ - std::move(keyInPayloadPos)} {} + : keysPos{std::move(keysPos)}, payloadsPos{std::move(payloadsPos)}, + keyTypes{std::move(keyTypes)}, payloadTypes{std::move(payloadTypes)}, + isAscOrder{std::move(isAscOrder)}, payloadTableSchema{std::move(payloadTableSchema)}, + keyInPayloadPos{std::move(keyInPayloadPos)} {} OrderByDataInfo(const OrderByDataInfo& other) - : keysPos{other.keysPos}, - payloadsPos{other.payloadsPos}, keyTypes{common::LogicalType::copy(other.keyTypes)}, + : keysPos{other.keysPos}, payloadsPos{other.payloadsPos}, + keyTypes{common::LogicalType::copy(other.keyTypes)}, payloadTypes{common::LogicalType::copy(other.payloadTypes)}, isAscOrder{other.isAscOrder}, - payloadTableSchema{other.payloadTableSchema->copy()}, keyInPayloadPos{ - other.keyInPayloadPos} {} + payloadTableSchema{other.payloadTableSchema->copy()}, + keyInPayloadPos{other.keyInPayloadPos} {} std::unique_ptr copy() const { return std::make_unique(*this); diff --git a/src/include/processor/operator/order_by/order_by_key_encoder.h b/src/include/processor/operator/order_by/order_by_key_encoder.h index 1a6df18dc38..05aeed8df0d 100644 --- a/src/include/processor/operator/order_by/order_by_key_encoder.h +++ b/src/include/processor/operator/order_by/order_by_key_encoder.h @@ -11,20 +11,20 @@ namespace kuzu { namespace processor { #define BSWAP64(x) \ - ((uint64_t)((((uint64_t)(x)&0xff00000000000000ull) >> 56) | \ - (((uint64_t)(x)&0x00ff000000000000ull) >> 40) | \ - (((uint64_t)(x)&0x0000ff0000000000ull) >> 24) | \ - (((uint64_t)(x)&0x000000ff00000000ull) >> 8) | \ - (((uint64_t)(x)&0x00000000ff000000ull) << 8) | \ - (((uint64_t)(x)&0x0000000000ff0000ull) << 24) | \ - (((uint64_t)(x)&0x000000000000ff00ull) << 40) | \ - (((uint64_t)(x)&0x00000000000000ffull) << 56))) + ((uint64_t)((((uint64_t)(x) & 0xff00000000000000ull) >> 56) | \ + (((uint64_t)(x) & 0x00ff000000000000ull) >> 40) | \ + (((uint64_t)(x) & 0x0000ff0000000000ull) >> 24) | \ + (((uint64_t)(x) & 0x000000ff00000000ull) >> 8) | \ + (((uint64_t)(x) & 0x00000000ff000000ull) << 8) | \ + (((uint64_t)(x) & 0x0000000000ff0000ull) << 24) | \ + (((uint64_t)(x) & 0x000000000000ff00ull) << 40) | \ + (((uint64_t)(x) & 0x00000000000000ffull) << 56))) #define BSWAP32(x) \ - ((uint32_t)((((uint32_t)(x)&0xff000000) >> 24) | (((uint32_t)(x)&0x00ff0000) >> 8) | \ - (((uint32_t)(x)&0x0000ff00) << 8) | (((uint32_t)(x)&0x000000ff) << 24))) + ((uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) | (((uint32_t)(x) & 0x00ff0000) >> 8) | \ + (((uint32_t)(x) & 0x0000ff00) << 8) | (((uint32_t)(x) & 0x000000ff) << 24))) -#define BSWAP16(x) ((uint16_t)((((uint16_t)(x)&0xff00) >> 8) | (((uint16_t)(x)&0x00ff) << 8))) +#define BSWAP16(x) ((uint16_t)((((uint16_t)(x) & 0xff00) >> 8) | (((uint16_t)(x) & 0x00ff) << 8))) // The OrderByKeyEncoder encodes all columns in the ORDER BY clause into a single binary sequence // that, when compared using memcmp will yield the correct overall sorting order. On little-endian diff --git a/src/include/processor/operator/order_by/order_by_scan.h b/src/include/processor/operator/order_by/order_by_scan.h index 11d3716d981..fcb3929e1e6 100644 --- a/src/include/processor/operator/order_by/order_by_scan.h +++ b/src/include/processor/operator/order_by/order_by_scan.h @@ -12,8 +12,8 @@ struct OrderByScanLocalState { uint64_t numTuples; uint64_t numTuplesRead; - void init( - std::vector& outVectorPos, SortSharedState& sharedState, ResultSet& resultSet); + void init(std::vector& outVectorPos, SortSharedState& sharedState, + ResultSet& resultSet); // NOLINTNEXTLINE(readability-make-member-function-const): Updates vectorsToRead. uint64_t scan() { @@ -31,16 +31,16 @@ class OrderByScan : public PhysicalOperator { std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::ORDER_BY_SCAN, std::move(child), id, paramsString}, outVectorPos{std::move(outVectorPos)}, - localState{std::make_unique()}, sharedState{ - std::move(sharedState)} {} + localState{std::make_unique()}, + sharedState{std::move(sharedState)} {} // This constructor is used for cloning only. OrderByScan(std::vector outVectorPos, std::shared_ptr sharedState, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::ORDER_BY_SCAN, id, paramsString}, outVectorPos{std::move(outVectorPos)}, - localState{std::make_unique()}, sharedState{ - std::move(sharedState)} {} + localState{std::make_unique()}, + sharedState{std::move(sharedState)} {} inline bool isSource() const final { return true; } // Ordered table should be scanned in single-thread mode. diff --git a/src/include/processor/operator/order_by/radix_sort.h b/src/include/processor/operator/order_by/radix_sort.h index e87f3179995..d868e9811d0 100644 --- a/src/include/processor/operator/order_by/radix_sort.h +++ b/src/include/processor/operator/order_by/radix_sort.h @@ -33,8 +33,8 @@ class RadixSort { : tmpSortingResultBlock{std::make_unique(memoryManager)}, tmpTuplePtrSortingBlock{std::make_unique(memoryManager)}, factorizedTable{factorizedTable}, strKeyColsInfo{std::move(strKeyColsInfo)}, - numBytesPerTuple{orderByKeyEncoder.getNumBytesPerTuple()}, numBytesToRadixSort{ - numBytesPerTuple - 8} {} + numBytesPerTuple{orderByKeyEncoder.getNumBytesPerTuple()}, + numBytesToRadixSort{numBytesPerTuple - 8} {} void sortSingleKeyBlock(const DataBlock& keyBlock); diff --git a/src/include/processor/operator/order_by/top_k.h b/src/include/processor/operator/order_by/top_k.h index 62219a88cb7..407e39c1638 100644 --- a/src/include/processor/operator/order_by/top_k.h +++ b/src/include/processor/operator/order_by/top_k.h @@ -64,8 +64,8 @@ class TopKBuffer { void initVectors(); template - void getSelectComparisonFunction( - common::PhysicalTypeID typeID, vector_select_comparison_func& selectFunc); + void getSelectComparisonFunction(common::PhysicalTypeID typeID, + vector_select_comparison_func& selectFunc); void initCompareFuncs(); @@ -79,8 +79,8 @@ class TopKBuffer { void compareUnflatKeys(common::vector_idx_t vectorIdxToCompare, const std::vector keyVectors); - static void appendSelState( - common::SelectionVector* selVector, common::SelectionVector* selVectorToAppend); + static void appendSelState(common::SelectionVector* selVector, + common::SelectionVector* selVectorToAppend); public: const OrderByDataInfo* orderByDataInfo; @@ -153,8 +153,8 @@ class TopK final : public Sink { void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; inline void initGlobalStateInternal(ExecutionContext* context) override { - sharedState->init( - *info, context->clientContext->getMemoryManager(), skipNumber, limitNumber); + sharedState->init(*info, context->clientContext->getMemoryManager(), skipNumber, + limitNumber); } void executeInternal(ExecutionContext* context) override; diff --git a/src/include/processor/operator/order_by/top_k_scanner.h b/src/include/processor/operator/order_by/top_k_scanner.h index 1b51f37a93e..c658d45465b 100644 --- a/src/include/processor/operator/order_by/top_k_scanner.h +++ b/src/include/processor/operator/order_by/top_k_scanner.h @@ -9,8 +9,8 @@ struct TopKLocalScanState { std::vector vectorsToScan; std::unique_ptr payloadScanner; - void init( - std::vector& outVectorPos, TopKSharedState& sharedState, ResultSet& resultSet); + void init(std::vector& outVectorPos, TopKSharedState& sharedState, + ResultSet& resultSet); // NOLINTNEXTLINE(readability-make-member-function-const): Semantically non-const. inline uint64_t scan() { return payloadScanner->scan(vectorsToScan); } @@ -33,8 +33,8 @@ class TopKScan : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) final; std::unique_ptr clone() final { - return std::make_unique( - outVectorPos, sharedState, children[0]->clone(), id, paramsString); + return std::make_unique(outVectorPos, sharedState, children[0]->clone(), id, + paramsString); } private: diff --git a/src/include/processor/operator/partitioner.h b/src/include/processor/operator/partitioner.h index 4f94803a1c9..38797f46611 100644 --- a/src/include/processor/operator/partitioner.h +++ b/src/include/processor/operator/partitioner.h @@ -112,8 +112,8 @@ class Partitioner : public Sink { const std::shared_ptr& state); // TODO: For now, RelBatchInsert will guarantee all data are inside one data chunk. Should be // generalized to resultSet later if needed. - void copyDataToPartitions( - common::partition_idx_t partitioningIdx, common::DataChunk chunkToCopyFrom); + void copyDataToPartitions(common::partition_idx_t partitioningIdx, + common::DataChunk chunkToCopyFrom); private: std::vector> infos; diff --git a/src/include/processor/operator/persistent/batch_insert.h b/src/include/processor/operator/persistent/batch_insert.h index 1fcb5548d50..8f675d8967a 100644 --- a/src/include/processor/operator/persistent/batch_insert.h +++ b/src/include/processor/operator/persistent/batch_insert.h @@ -26,8 +26,8 @@ struct BatchInsertSharedState { std::shared_ptr fTable; storage::WAL* wal; - BatchInsertSharedState( - storage::Table* table, std::shared_ptr fTable, storage::WAL* wal) + BatchInsertSharedState(storage::Table* table, std::shared_ptr fTable, + storage::WAL* wal) : numRows{0}, table{table}, fTable{std::move(fTable)}, wal{wal} {}; BatchInsertSharedState(const BatchInsertSharedState& other) = delete; diff --git a/src/include/processor/operator/persistent/copy_rdf.h b/src/include/processor/operator/persistent/copy_rdf.h index b186ed6f451..8397ed46bbf 100644 --- a/src/include/processor/operator/persistent/copy_rdf.h +++ b/src/include/processor/operator/persistent/copy_rdf.h @@ -24,8 +24,8 @@ class CopyRdf : public Sink { void finalize(ExecutionContext*) override; std::unique_ptr clone() override { - return std::make_unique( - sharedState, resultSetDescriptor->copy(), id, paramsString); + return std::make_unique(sharedState, resultSetDescriptor->copy(), id, + paramsString); } private: diff --git a/src/include/processor/operator/persistent/copy_to.h b/src/include/processor/operator/persistent/copy_to.h index 405286da45f..a46b30e0d86 100644 --- a/src/include/processor/operator/persistent/copy_to.h +++ b/src/include/processor/operator/persistent/copy_to.h @@ -48,8 +48,8 @@ class CopyTo : public Sink { std::shared_ptr sharedState, PhysicalOperatorType opType, std::unique_ptr child, uint32_t id, const std::string& paramsString) : Sink{std::move(resultSetDescriptor), opType, std::move(child), id, paramsString}, - info{std::move(info)}, localState{std::move(localState)}, sharedState{ - std::move(sharedState)} {} + info{std::move(info)}, localState{std::move(localState)}, + sharedState{std::move(sharedState)} {} void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) final; diff --git a/src/include/processor/operator/persistent/copy_to_csv.h b/src/include/processor/operator/persistent/copy_to_csv.h index 0bac084afd5..23c22b91441 100644 --- a/src/include/processor/operator/persistent/copy_to_csv.h +++ b/src/include/processor/operator/persistent/copy_to_csv.h @@ -21,8 +21,8 @@ struct CopyToCSVInfo final : public CopyToInfo { uint64_t getNumFlatVectors(); inline std::unique_ptr copy() override { - return std::make_unique( - names, dataPoses, fileName, isFlat, copyToOption.copy()); + return std::make_unique(names, dataPoses, fileName, isFlat, + copyToOption.copy()); } }; diff --git a/src/include/processor/operator/persistent/copy_to_parquet.h b/src/include/processor/operator/persistent/copy_to_parquet.h index 1a79b318343..f0a22e112ef 100644 --- a/src/include/processor/operator/persistent/copy_to_parquet.h +++ b/src/include/processor/operator/persistent/copy_to_parquet.h @@ -19,8 +19,8 @@ struct CopyToParquetInfo final : public CopyToInfo { std::vector> types, std::vector names, std::vector dataPoses, std::string fileName, DataPos countingVecPos) : CopyToInfo{std::move(names), std::move(dataPoses), std::move(fileName)}, - tableSchema{std::move(tableSchema)}, types{std::move(types)}, countingVecPos{std::move( - countingVecPos)} {} + tableSchema{std::move(tableSchema)}, types{std::move(types)}, + countingVecPos{std::move(countingVecPos)} {} std::unique_ptr copy() override { return std::make_unique(tableSchema->copy(), diff --git a/src/include/processor/operator/persistent/delete_executor.h b/src/include/processor/operator/persistent/delete_executor.h index 9cc55b268c6..c06e12ab63e 100644 --- a/src/include/processor/operator/persistent/delete_executor.h +++ b/src/include/processor/operator/persistent/delete_executor.h @@ -66,8 +66,8 @@ class MultiLabelNodeDeleteExecutor final : public NodeDeleteExecutor { std::unordered_map tableIDToBwdRelTablesMap, common::DeleteNodeType deleteType, const DataPos& nodeIDPos) : NodeDeleteExecutor(deleteType, nodeIDPos), - tableIDToTableMap{std::move(tableIDToTableMap)}, tableIDToFwdRelTablesMap{std::move( - tableIDToFwdRelTablesMap)}, + tableIDToTableMap{std::move(tableIDToTableMap)}, + tableIDToFwdRelTablesMap{std::move(tableIDToFwdRelTablesMap)}, tableIDToBwdRelTablesMap{std::move(tableIDToBwdRelTablesMap)} {} MultiLabelNodeDeleteExecutor(const MultiLabelNodeDeleteExecutor& other) : NodeDeleteExecutor(other.deleteType, other.nodeIDPos), @@ -91,8 +91,8 @@ class MultiLabelNodeDeleteExecutor final : public NodeDeleteExecutor { class RelDeleteExecutor { public: - RelDeleteExecutor( - const DataPos& srcNodeIDPos, const DataPos& dstNodeIDPos, const DataPos& relIDPos) + RelDeleteExecutor(const DataPos& srcNodeIDPos, const DataPos& dstNodeIDPos, + const DataPos& relIDPos) : srcNodeIDPos{srcNodeIDPos}, dstNodeIDPos{dstNodeIDPos}, relIDPos{relIDPos}, srcNodeIDVector(nullptr), dstNodeIDVector(nullptr), relIDVector(nullptr) {} virtual ~RelDeleteExecutor() = default; @@ -136,8 +136,8 @@ class MultiLabelRelDeleteExecutor final : public RelDeleteExecutor { MultiLabelRelDeleteExecutor( std::unordered_map tableIDToTableMap, const DataPos& srcNodeIDPos, const DataPos& dstNodeIDPos, const DataPos& relIDPos) - : RelDeleteExecutor(srcNodeIDPos, dstNodeIDPos, relIDPos), tableIDToTableMap{std::move( - tableIDToTableMap)} {} + : RelDeleteExecutor(srcNodeIDPos, dstNodeIDPos, relIDPos), + tableIDToTableMap{std::move(tableIDToTableMap)} {} MultiLabelRelDeleteExecutor(const MultiLabelRelDeleteExecutor& other) = default; void delete_(ExecutionContext* context) override; diff --git a/src/include/processor/operator/persistent/export_db.h b/src/include/processor/operator/persistent/export_db.h index fb94ba52095..3c7216d925b 100644 --- a/src/include/processor/operator/persistent/export_db.h +++ b/src/include/processor/operator/persistent/export_db.h @@ -21,8 +21,8 @@ class ExportDB : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) override; inline std::unique_ptr clone() override { - return std::make_unique( - std::move(boundFileInfo), id, paramsString, std::move(children)); + return std::make_unique(std::move(boundFileInfo), id, paramsString, + std::move(children)); } private: diff --git a/src/include/processor/operator/persistent/file_writer.h b/src/include/processor/operator/persistent/file_writer.h index 0fe52e373f4..f1d8b36bd5c 100644 --- a/src/include/processor/operator/persistent/file_writer.h +++ b/src/include/processor/operator/persistent/file_writer.h @@ -10,8 +10,8 @@ class FileWriter { public: FileWriter(std::string filePath, std::vector columnNames, std::vector> columnTypes) - : filePath{std::move(filePath)}, columnNames{std::move(columnNames)}, columnTypes{std::move( - columnTypes)} {} + : filePath{std::move(filePath)}, columnNames{std::move(columnNames)}, + columnTypes{std::move(columnTypes)} {} virtual ~FileWriter() = default; virtual void init() = 0; virtual void openFile() = 0; diff --git a/src/include/processor/operator/persistent/index_builder.h b/src/include/processor/operator/persistent/index_builder.h index 74a7eff5dbf..ec4e4648740 100644 --- a/src/include/processor/operator/persistent/index_builder.h +++ b/src/include/processor/operator/persistent/index_builder.h @@ -150,8 +150,8 @@ class IndexBuilder { IndexBuilder clone() { return IndexBuilder(sharedState); } - void insert( - const storage::ColumnChunk& chunk, common::offset_t nodeOffset, common::offset_t numNodes); + void insert(const storage::ColumnChunk& chunk, common::offset_t nodeOffset, + common::offset_t numNodes); ProducerToken getProducerToken() const { return ProducerToken(sharedState); } @@ -159,8 +159,8 @@ class IndexBuilder { void finalize(ExecutionContext* context); private: - void checkNonNullConstraint( - const storage::NullColumnChunk& nullChunk, common::offset_t numNodes); + void checkNonNullConstraint(const storage::NullColumnChunk& nullChunk, + common::offset_t numNodes); std::shared_ptr sharedState; IndexBuilderLocalBuffers localBuffers; diff --git a/src/include/processor/operator/persistent/insert_executor.h b/src/include/processor/operator/persistent/insert_executor.h index 1643feac1d3..b74a0b14131 100644 --- a/src/include/processor/operator/persistent/insert_executor.h +++ b/src/include/processor/operator/persistent/insert_executor.h @@ -17,9 +17,9 @@ class NodeInsertExecutor { std::vector columnVectorsPos, std::vector> columnDataEvaluators, common::ConflictAction conflictAction) - : table{table}, fwdRelTables{std::move(fwdRelTables)}, bwdRelTables{std::move( - bwdRelTables)}, - nodeIDVectorPos{nodeIDVectorPos}, columnVectorsPos{std::move(columnVectorsPos)}, + : table{table}, fwdRelTables{std::move(fwdRelTables)}, + bwdRelTables{std::move(bwdRelTables)}, nodeIDVectorPos{nodeIDVectorPos}, + columnVectorsPos{std::move(columnVectorsPos)}, columnDataEvaluators{std::move(columnDataEvaluators)}, conflictAction{conflictAction}, nodeIDVector{nullptr} {} EXPLICIT_COPY_DEFAULT_MOVE(NodeInsertExecutor); diff --git a/src/include/processor/operator/persistent/merge.h b/src/include/processor/operator/persistent/merge.h index 09994e1f05c..f7488dec45e 100644 --- a/src/include/processor/operator/persistent/merge.h +++ b/src/include/processor/operator/persistent/merge.h @@ -18,10 +18,10 @@ class Merge : public PhysicalOperator { std::vector> onMatchRelSetExecutors, std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::MERGE, std::move(child), id, paramsString}, - existenceMark{existenceMark}, distinctMark{distinctMark}, nodeInsertExecutors{std::move( - nodeInsertExecutors)}, - relInsertExecutors{std::move(relInsertExecutors)}, onCreateNodeSetExecutors{std::move( - onCreateNodeSetExecutors)}, + existenceMark{existenceMark}, distinctMark{distinctMark}, + nodeInsertExecutors{std::move(nodeInsertExecutors)}, + relInsertExecutors{std::move(relInsertExecutors)}, + onCreateNodeSetExecutors{std::move(onCreateNodeSetExecutors)}, onCreateRelSetExecutors{std::move(onCreateRelSetExecutors)}, onMatchNodeSetExecutors{std::move(onMatchNodeSetExecutors)}, onMatchRelSetExecutors{std::move(onMatchRelSetExecutors)} {} diff --git a/src/include/processor/operator/persistent/node_batch_insert.h b/src/include/processor/operator/persistent/node_batch_insert.h index 2aaebc147d1..26a2dd940a4 100644 --- a/src/include/processor/operator/persistent/node_batch_insert.h +++ b/src/include/processor/operator/persistent/node_batch_insert.h @@ -46,8 +46,8 @@ struct NodeBatchInsertSharedState final : public BatchInsertSharedState { // ops. std::unique_ptr sharedNodeGroup; - NodeBatchInsertSharedState( - storage::Table* table, std::shared_ptr fTable, storage::WAL* wal) + NodeBatchInsertSharedState(storage::Table* table, std::shared_ptr fTable, + storage::WAL* wal) : BatchInsertSharedState{table, fTable, wal}, readerSharedState{nullptr}, distinctSharedState{nullptr}, currentNodeGroupIdx{0}, sharedNodeGroup{nullptr} {}; diff --git a/src/include/processor/operator/persistent/reader/parquet/boolean_column_reader.h b/src/include/processor/operator/persistent/reader/parquet/boolean_column_reader.h index 5961b23cf35..ed8db5ef80d 100644 --- a/src/include/processor/operator/persistent/reader/parquet/boolean_column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/boolean_column_reader.h @@ -16,8 +16,8 @@ class BooleanColumnReader : public TemplatedColumnReader type, const kuzu_parquet::format::SchemaElement& schema, uint64_t schemaIdx, uint64_t maxDefine, uint64_t maxRepeat) - : TemplatedColumnReader( - reader, std::move(type), schema, schemaIdx, maxDefine, maxRepeat), + : TemplatedColumnReader(reader, std::move(type), + schema, schemaIdx, maxDefine, maxRepeat), bytePos(0){}; uint8_t bytePos; diff --git a/src/include/processor/operator/persistent/reader/parquet/callback_column_reader.h b/src/include/processor/operator/persistent/reader/parquet/callback_column_reader.h index ecfef53094f..b66ba250ab0 100644 --- a/src/include/processor/operator/persistent/reader/parquet/callback_column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/callback_column_reader.h @@ -23,12 +23,12 @@ class CallbackColumnReader const kuzu_parquet::format::SchemaElement& schema_p, uint64_t file_idx_p, uint64_t max_define_p, uint64_t max_repeat_p) : TemplatedColumnReader>( - reader, std::move(type_p), schema_p, file_idx_p, max_define_p, max_repeat_p) {} + CallbackParquetValueConversion>(reader, + std::move(type_p), schema_p, file_idx_p, max_define_p, max_repeat_p) {} protected: - void dictionary( - const std::shared_ptr& dictionaryData, uint64_t numEntries) override { + void dictionary(const std::shared_ptr& dictionaryData, + uint64_t numEntries) override { BaseType::allocateDict(numEntries * sizeof(KU_PHYSICAL_TYPE)); auto dictPtr = (KU_PHYSICAL_TYPE*)this->dict->ptr; for (auto i = 0u; i < numEntries; i++) { diff --git a/src/include/processor/operator/persistent/reader/parquet/column_reader.h b/src/include/processor/operator/persistent/reader/parquet/column_reader.h index 9a61863b652..6766daddda3 100644 --- a/src/include/processor/operator/persistent/reader/parquet/column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/column_reader.h @@ -27,8 +27,8 @@ class ColumnReader { inline bool hasDefines() const { return maxDefine > 0; } inline bool hasRepeats() const { return maxRepeat > 0; } virtual inline void skip(uint64_t numValues) { pendingSkips += numValues; } - virtual inline void dictionary( - const std::shared_ptr& /*data*/, uint64_t /*num_entries*/) { + virtual inline void dictionary(const std::shared_ptr& /*data*/, + uint64_t /*num_entries*/) { KU_UNREACHABLE; } virtual inline void offsets(uint32_t* /*offsets*/, uint8_t* /*defines*/, uint64_t /*numValues*/, diff --git a/src/include/processor/operator/persistent/reader/parquet/decode_utils.h b/src/include/processor/operator/persistent/reader/parquet/decode_utils.h index 3cd2e29b2ca..430db31d63e 100644 --- a/src/include/processor/operator/persistent/reader/parquet/decode_utils.h +++ b/src/include/processor/operator/persistent/reader/parquet/decode_utils.h @@ -19,8 +19,8 @@ class ParquetDecodeUtils { static const uint8_t BITPACK_DLEN; template - static uint32_t BitUnpack( - ByteBuffer& buffer, uint8_t& bitpack_pos, T* dest, uint32_t count, uint8_t width) { + static uint32_t BitUnpack(ByteBuffer& buffer, uint8_t& bitpack_pos, T* dest, uint32_t count, + uint8_t width) { if (width >= ParquetDecodeUtils::BITPACK_MASKS_SIZE) { throw common::CopyException(common::stringFormat( "The width ({}) of the bitpacked data exceeds the supported max width ({}), " diff --git a/src/include/processor/operator/persistent/reader/parquet/interval_column_reader.h b/src/include/processor/operator/persistent/reader/parquet/interval_column_reader.h index 31297e048a3..41eb1d1b99b 100644 --- a/src/include/processor/operator/persistent/reader/parquet/interval_column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/interval_column_reader.h @@ -7,8 +7,8 @@ namespace kuzu { namespace processor { struct IntervalValueConversion { - static inline common::interval_t dictRead( - ByteBuffer& dict, uint32_t& offset, ColumnReader& /*reader*/) { + static inline common::interval_t dictRead(ByteBuffer& dict, uint32_t& offset, + ColumnReader& /*reader*/) { return (reinterpret_cast(dict.ptr))[offset]; } @@ -28,12 +28,12 @@ class IntervalColumnReader IntervalColumnReader(ParquetReader& reader, std::unique_ptr type, const kuzu_parquet::format::SchemaElement& schema, uint64_t fileIdx, uint64_t maxDefine, uint64_t maxRepeat) - : TemplatedColumnReader( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat){}; + : TemplatedColumnReader(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat){}; protected: - void dictionary( - const std::shared_ptr& dictionary_data, uint64_t num_entries) override; + void dictionary(const std::shared_ptr& dictionary_data, + uint64_t num_entries) override; }; } // namespace processor diff --git a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h index 4a412f7070a..b39a0c12df1 100644 --- a/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/parquet_reader.h @@ -91,8 +91,8 @@ class ParquetReader { }; struct ParquetScanSharedState final : public function::ScanFileSharedState { - explicit ParquetScanSharedState( - const common::ReaderConfig readerConfig, uint64_t numRows, main::ClientContext* context); + explicit ParquetScanSharedState(const common::ReaderConfig readerConfig, uint64_t numRows, + main::ClientContext* context); std::vector> readers; uint64_t totalRowsGroups; diff --git a/src/include/processor/operator/persistent/reader/parquet/parquet_rle_bp_decoder.h b/src/include/processor/operator/persistent/reader/parquet/parquet_rle_bp_decoder.h index 65a62ea4de3..95ecabe8def 100644 --- a/src/include/processor/operator/persistent/reader/parquet/parquet_rle_bp_decoder.h +++ b/src/include/processor/operator/persistent/reader/parquet/parquet_rle_bp_decoder.h @@ -27,17 +27,17 @@ class RleBpDecoder { while (values_read < batch_size) { if (repeat_count_ > 0) { - int repeat_batch = std::min( - batch_size - values_read, static_cast(repeat_count_)); + int repeat_batch = std::min(batch_size - values_read, + static_cast(repeat_count_)); std::fill(values + values_read, values + values_read + repeat_batch, static_cast(current_value_)); repeat_count_ -= repeat_batch; values_read += repeat_batch; } else if (literal_count_ > 0) { - uint32_t literal_batch = std::min( - batch_size - values_read, static_cast(literal_count_)); - uint32_t actual_read = ParquetDecodeUtils::BitUnpack( - buffer_, bitpack_pos, values + values_read, literal_batch, bit_width_); + uint32_t literal_batch = std::min(batch_size - values_read, + static_cast(literal_count_)); + uint32_t actual_read = ParquetDecodeUtils::BitUnpack(buffer_, bitpack_pos, + values + values_read, literal_batch, bit_width_); if (literal_batch != actual_read) { throw std::runtime_error("Did not find enough values"); } diff --git a/src/include/processor/operator/persistent/reader/parquet/string_column_reader.h b/src/include/processor/operator/persistent/reader/parquet/string_column_reader.h index 97b53906973..06859b6b785 100644 --- a/src/include/processor/operator/persistent/reader/parquet/string_column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/string_column_reader.h @@ -28,8 +28,8 @@ class StringColumnReader uint64_t fixedWidthStringLength; public: - void dictionary( - const std::shared_ptr& dictionary_data, uint64_t numEntries) override; + void dictionary(const std::shared_ptr& dictionary_data, + uint64_t numEntries) override; static uint32_t verifyString(const char* strData, uint32_t strLen, const bool isVarchar); uint32_t verifyString(const char* strData, uint32_t strLen); }; diff --git a/src/include/processor/operator/persistent/reader/parquet/templated_column_reader.h b/src/include/processor/operator/persistent/reader/parquet/templated_column_reader.h index 55552c88ebb..0980127ce6e 100644 --- a/src/include/processor/operator/persistent/reader/parquet/templated_column_reader.h +++ b/src/include/processor/operator/persistent/reader/parquet/templated_column_reader.h @@ -64,12 +64,12 @@ class TemplatedColumnReader : public ColumnReader { void plain(const std::shared_ptr& plainData, uint8_t* defines, uint64_t numValues, parquet_filter_t& filter, uint64_t resultOffset, common::ValueVector* result) override { - plainTemplated( - plainData, defines, numValues, filter, resultOffset, result); + plainTemplated(plainData, defines, numValues, filter, + resultOffset, result); } - void dictionary( - const std::shared_ptr& data, uint64_t /*num_entries*/) override { + void dictionary(const std::shared_ptr& data, + uint64_t /*num_entries*/) override { dict = data; } }; @@ -78,8 +78,8 @@ template struct CallbackParquetValueConversion { static DUCKDB_PHYSICAL_TYPE dictRead(ByteBuffer& dict, uint32_t& offset, ColumnReader& reader) { - return TemplatedParquetValueConversion::dictRead( - dict, offset, reader); + return TemplatedParquetValueConversion::dictRead(dict, offset, + reader); } static DUCKDB_PHYSICAL_TYPE plainRead(ByteBuffer& plainData, ColumnReader& /*reader*/) { diff --git a/src/include/processor/operator/persistent/reader/parquet/thrift_tools.h b/src/include/processor/operator/persistent/reader/parquet/thrift_tools.h index 3181b0c3add..a7ad305c28c 100644 --- a/src/include/processor/operator/persistent/reader/parquet/thrift_tools.h +++ b/src/include/processor/operator/persistent/reader/parquet/thrift_tools.h @@ -130,8 +130,8 @@ class ThriftFileTransport if (!prefetch_buffer->data_isset) { prefetch_buffer->Allocate(); - handle->readFromFile( - prefetch_buffer->data.get(), prefetch_buffer->size, prefetch_buffer->location); + handle->readFromFile(prefetch_buffer->data.get(), prefetch_buffer->size, + prefetch_buffer->location); prefetch_buffer->data_isset = true; } memcpy(buf, prefetch_buffer->data.get() + location - prefetch_buffer->location, len); diff --git a/src/include/processor/operator/persistent/reader/rdf/rdf_reader.h b/src/include/processor/operator/persistent/reader/rdf/rdf_reader.h index 78f9e28fd02..5307f249f3b 100644 --- a/src/include/processor/operator/persistent/reader/rdf/rdf_reader.h +++ b/src/include/processor/operator/persistent/reader/rdf/rdf_reader.h @@ -29,10 +29,9 @@ class RdfReader { protected: RdfReader(common::RdfReaderConfig rdfConfig, uint32_t fileIdx, std::string filePath, common::FileType fileType, RdfStore* store_, const common::offset_t startOffset) - : store_{store_}, cursor{0}, startOffset{startOffset}, - numLiteralTriplesScanned{0}, rdfConfig{std::move(rdfConfig)}, fileIdx{fileIdx}, - filePath{std::move(filePath)}, fileType{fileType}, reader{nullptr}, status{SERD_SUCCESS} { - } + : store_{store_}, cursor{0}, startOffset{startOffset}, numLiteralTriplesScanned{0}, + rdfConfig{std::move(rdfConfig)}, fileIdx{fileIdx}, filePath{std::move(filePath)}, + fileType{fileType}, reader{nullptr}, status{SERD_SUCCESS} {} void initInternal(SerdStatementSink statementHandle); diff --git a/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h b/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h index 15dfc2c971b..ec53afeed62 100644 --- a/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h +++ b/src/include/processor/operator/persistent/reader/rdf/rdf_scan.h @@ -17,8 +17,8 @@ struct RdfScanSharedState : public function::ScanSharedState { std::shared_ptr store) : ScanSharedState{std::move(readerConfig), 0}, rdfConfig{std::move(rdfConfig)}, store{std::move(store)}, numLiteralTriplesScanned{0} {} - explicit RdfScanSharedState( - common::ReaderConfig readerConfig, common::RdfReaderConfig rdfConfig) + explicit RdfScanSharedState(common::ReaderConfig readerConfig, + common::RdfReaderConfig rdfConfig) : RdfScanSharedState{std::move(readerConfig), std::move(rdfConfig), nullptr} {} void read(common::DataChunk& dataChunk); @@ -27,16 +27,16 @@ struct RdfScanSharedState : public function::ScanSharedState { void initReader(); private: - virtual void createReader( - uint32_t fileIdx, const std::string& path, common::offset_t startOffset) = 0; + virtual void createReader(uint32_t fileIdx, const std::string& path, + common::offset_t startOffset) = 0; common::offset_t numLiteralTriplesScanned; }; struct RdfResourceScanSharedState final : public RdfScanSharedState { - explicit RdfResourceScanSharedState( - common::ReaderConfig readerConfig, common::RdfReaderConfig rdfConfig) + explicit RdfResourceScanSharedState(common::ReaderConfig readerConfig, + common::RdfReaderConfig rdfConfig) : RdfScanSharedState{std::move(readerConfig), std::move(rdfConfig)} { KU_ASSERT(store == nullptr); store = std::make_shared(); @@ -44,15 +44,15 @@ struct RdfResourceScanSharedState final : public RdfScanSharedState { } inline void createReader(uint32_t fileIdx, const std::string& path, common::offset_t) override { - reader = std::make_unique( - rdfConfig, fileIdx, path, readerConfig.fileType, store.get()); + reader = std::make_unique(rdfConfig, fileIdx, path, + readerConfig.fileType, store.get()); } }; struct RdfLiteralScanSharedState final : public RdfScanSharedState { - explicit RdfLiteralScanSharedState( - common::ReaderConfig readerConfig, common::RdfReaderConfig rdfConfig) + explicit RdfLiteralScanSharedState(common::ReaderConfig readerConfig, + common::RdfReaderConfig rdfConfig) : RdfScanSharedState{std::move(readerConfig), std::move(rdfConfig)} { KU_ASSERT(store == nullptr); store = std::make_shared(); @@ -60,15 +60,15 @@ struct RdfLiteralScanSharedState final : public RdfScanSharedState { } inline void createReader(uint32_t fileIdx, const std::string& path, common::offset_t) override { - reader = std::make_unique( - rdfConfig, fileIdx, path, readerConfig.fileType, store.get()); + reader = std::make_unique(rdfConfig, fileIdx, path, readerConfig.fileType, + store.get()); } }; struct RdfResourceTripleScanSharedState final : public RdfScanSharedState { - explicit RdfResourceTripleScanSharedState( - common::ReaderConfig readerConfig, common::RdfReaderConfig rdfConfig) + explicit RdfResourceTripleScanSharedState(common::ReaderConfig readerConfig, + common::RdfReaderConfig rdfConfig) : RdfScanSharedState{std::move(readerConfig), std::move(rdfConfig)} { KU_ASSERT(store == nullptr); store = std::make_shared(); @@ -76,25 +76,25 @@ struct RdfResourceTripleScanSharedState final : public RdfScanSharedState { } inline void createReader(uint32_t fileIdx, const std::string& path, common::offset_t) override { - reader = std::make_unique( - rdfConfig, fileIdx, path, readerConfig.fileType, store.get()); + reader = std::make_unique(rdfConfig, fileIdx, path, + readerConfig.fileType, store.get()); } }; struct RdfLiteralTripleScanSharedState final : public RdfScanSharedState { - explicit RdfLiteralTripleScanSharedState( - common::ReaderConfig readerConfig, common::RdfReaderConfig rdfConfig) + explicit RdfLiteralTripleScanSharedState(common::ReaderConfig readerConfig, + common::RdfReaderConfig rdfConfig) : RdfScanSharedState{std::move(readerConfig), std::move(rdfConfig)} { KU_ASSERT(store == nullptr); store = std::make_shared(); initReader(); } - void createReader( - uint32_t fileIdx, const std::string& path, common::offset_t startOffset) override { - reader = std::make_unique( - rdfConfig, fileIdx, path, readerConfig.fileType, store.get(), startOffset); + void createReader(uint32_t fileIdx, const std::string& path, + common::offset_t startOffset) override { + reader = std::make_unique(rdfConfig, fileIdx, path, + readerConfig.fileType, store.get(), startOffset); } }; @@ -107,8 +107,8 @@ struct RdfTripleScanSharedState final : public RdfScanSharedState { } void createReader(uint32_t fileIdx, const std::string& path, common::offset_t) override { - reader = std::make_unique( - rdfConfig, fileIdx, path, readerConfig.fileType, store.get()); + reader = std::make_unique(rdfConfig, fileIdx, path, readerConfig.fileType, + store.get()); } }; diff --git a/src/include/processor/operator/persistent/rel_batch_insert.h b/src/include/processor/operator/persistent/rel_batch_insert.h index 80cf1845e3d..a026665315a 100644 --- a/src/include/processor/operator/persistent/rel_batch_insert.h +++ b/src/include/processor/operator/persistent/rel_batch_insert.h @@ -19,8 +19,8 @@ struct RelBatchInsertInfo final : public BatchInsertInfo { common::RelDataDirection direction, uint64_t partitioningIdx, common::column_id_t offsetColumnID, std::vector columnTypes) : BatchInsertInfo{tableEntry, compressionEnabled}, direction{direction}, - partitioningIdx{partitioningIdx}, offsetColumnID{offsetColumnID}, columnTypes{std::move( - columnTypes)} {} + partitioningIdx{partitioningIdx}, offsetColumnID{offsetColumnID}, + columnTypes{std::move(columnTypes)} {} RelBatchInsertInfo(const RelBatchInsertInfo& other) : BatchInsertInfo{other.tableEntry, other.compressionEnabled}, direction{other.direction}, partitioningIdx{other.partitioningIdx}, offsetColumnID{other.offsetColumnID}, @@ -75,12 +75,12 @@ class RelBatchInsert final : public BatchInsert { static std::vector populateStartCSROffsetsAndLengths( storage::ChunkedCSRHeader& csrHeader, common::offset_t numNodes, const storage::ChunkedNodeGroupCollection& partition, common::column_id_t offsetColumnID); - static void populateEndCSROffsets( - storage::ChunkedCSRHeader& csrHeader, std::vector& gaps); - static void setOffsetToWithinNodeGroup( - storage::ColumnChunk& chunk, common::offset_t startOffset); - static void setOffsetFromCSROffsets( - storage::ColumnChunk& nodeOffsetChunk, storage::ColumnChunk& csrOffsetChunk); + static void populateEndCSROffsets(storage::ChunkedCSRHeader& csrHeader, + std::vector& gaps); + static void setOffsetToWithinNodeGroup(storage::ColumnChunk& chunk, + common::offset_t startOffset); + static void setOffsetFromCSROffsets(storage::ColumnChunk& nodeOffsetChunk, + storage::ColumnChunk& csrOffsetChunk); static std::optional checkRelMultiplicityConstraint( const storage::ChunkedCSRHeader& csrHeader, const RelBatchInsertInfo& relInfo); diff --git a/src/include/processor/operator/persistent/set.h b/src/include/processor/operator/persistent/set.h index e8d8ff7985b..198a2682f4d 100644 --- a/src/include/processor/operator/persistent/set.h +++ b/src/include/processor/operator/persistent/set.h @@ -21,8 +21,8 @@ class SetNodeProperty : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return make_unique( - NodeSetExecutor::copy(executors), children[0]->clone(), id, paramsString); + return make_unique(NodeSetExecutor::copy(executors), children[0]->clone(), + id, paramsString); } private: @@ -44,8 +44,8 @@ class SetRelProperty : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return make_unique( - RelSetExecutor::copy(executors), children[0]->clone(), id, paramsString); + return make_unique(RelSetExecutor::copy(executors), children[0]->clone(), + id, paramsString); } private: diff --git a/src/include/processor/operator/persistent/writer/parquet/basic_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/basic_column_writer.h index 4b38ad4bf80..57dafd66728 100644 --- a/src/include/processor/operator/persistent/writer/parquet/basic_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/basic_column_writer.h @@ -26,8 +26,8 @@ class BasicColumnWriter : public ColumnWriter { BasicColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schemaPath, uint64_t maxRepeat, uint64_t maxDefine, bool canHaveNulls) - : ColumnWriter( - writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, canHaveNulls) {} + : ColumnWriter(writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, + canHaveNulls) {} public: std::unique_ptr initializeWriteState( @@ -61,12 +61,12 @@ class BasicColumnWriter : public ColumnWriter { } // Flushes the writer for a specific page. Only used for scalar types. - virtual void flushPageState( - common::Serializer& /*bufferedSerializer*/, ColumnWriterPageState* /*state*/) {} + virtual void flushPageState(common::Serializer& /*bufferedSerializer*/, + ColumnWriterPageState* /*state*/) {} // Retrieves the row size of a vector at the specified location. Only used for scalar types. - virtual uint64_t getRowSize( - common::ValueVector* /*vector*/, uint64_t /*index*/, BasicColumnWriterState& /*state*/) { + virtual uint64_t getRowSize(common::ValueVector* /*vector*/, uint64_t /*index*/, + BasicColumnWriterState& /*state*/) { KU_UNREACHABLE; } // Writes a (subset of a) vector to the specified serializer. Only used for scalar types. @@ -79,13 +79,13 @@ class BasicColumnWriter : public ColumnWriter { virtual uint64_t dictionarySize(BasicColumnWriterState& /*writerState*/) { KU_UNREACHABLE; } void writeDictionary(BasicColumnWriterState& state, std::unique_ptr bufferedSerializer, uint64_t rowCount); - virtual void flushDictionary( - BasicColumnWriterState& /*state*/, ColumnWriterStatistics* /*stats*/) { + virtual void flushDictionary(BasicColumnWriterState& /*state*/, + ColumnWriterStatistics* /*stats*/) { KU_UNREACHABLE; } - void setParquetStatistics( - BasicColumnWriterState& state, kuzu_parquet::format::ColumnChunk& column); + void setParquetStatistics(BasicColumnWriterState& state, + kuzu_parquet::format::ColumnChunk& column); void registerToRowGroup(kuzu_parquet::format::RowGroup& rowGroup); }; diff --git a/src/include/processor/operator/persistent/writer/parquet/boolean_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/boolean_column_writer.h index 33cc094f17a..d5d8159939e 100644 --- a/src/include/processor/operator/persistent/writer/parquet/boolean_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/boolean_column_writer.h @@ -38,8 +38,8 @@ class BooleanColumnWriter : public BasicColumnWriter { BooleanColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schemaPath, uint64_t maxRepeat, uint64_t maxDefine, bool canHaveNulls) - : BasicColumnWriter( - writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, canHaveNulls) {} + : BasicColumnWriter(writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, + canHaveNulls) {} inline std::unique_ptr initializeStatsState() override { return std::make_unique(); @@ -59,8 +59,8 @@ class BooleanColumnWriter : public BasicColumnWriter { ColumnWriterStatistics* writerStatistics, ColumnWriterPageState* writerPageState, common::ValueVector* vector, uint64_t chunkStart, uint64_t chunkEnd) override; - void flushPageState( - common::Serializer& temp_writer, ColumnWriterPageState* writerPageState) override; + void flushPageState(common::Serializer& temp_writer, + ColumnWriterPageState* writerPageState) override; }; } // namespace processor diff --git a/src/include/processor/operator/persistent/writer/parquet/interval_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/interval_column_writer.h index f3c69d8384d..9fcd49df73c 100644 --- a/src/include/processor/operator/persistent/writer/parquet/interval_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/interval_column_writer.h @@ -12,8 +12,8 @@ class IntervalColumnWriter : public BasicColumnWriter { IntervalColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schemaPath, uint64_t maxRepeat, uint64_t maxDefine, bool canHaveNulls) - : BasicColumnWriter( - writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, canHaveNulls) {} + : BasicColumnWriter(writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, + canHaveNulls) {} public: static void writeParquetInterval(common::interval_t input, uint8_t* result); diff --git a/src/include/processor/operator/persistent/writer/parquet/list_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/list_column_writer.h index ef35460a234..fafe2cd5fdb 100644 --- a/src/include/processor/operator/persistent/writer/parquet/list_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/list_column_writer.h @@ -22,8 +22,8 @@ class ListColumnWriter : public ColumnWriter { void prepare(ColumnWriterState& writerState, ColumnWriterState* parent, common::ValueVector* vector, uint64_t count) override; void beginWrite(ColumnWriterState& state) override; - void write( - ColumnWriterState& writerState, common::ValueVector* vector, uint64_t count) override; + void write(ColumnWriterState& writerState, common::ValueVector* vector, + uint64_t count) override; void finalizeWrite(ColumnWriterState& writerState) override; private: diff --git a/src/include/processor/operator/persistent/writer/parquet/parquet_writer.h b/src/include/processor/operator/persistent/writer/parquet/parquet_writer.h index 27d86249be3..e5abee8a80d 100644 --- a/src/include/processor/operator/persistent/writer/parquet/parquet_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/parquet_writer.h @@ -60,8 +60,8 @@ class ParquetWriter { void flush(FactorizedTable& ft); void finalize(); static kuzu_parquet::format::Type::type convertToParquetType(common::LogicalType* type); - static void setSchemaProperties( - common::LogicalType* type, kuzu_parquet::format::SchemaElement& schemaElement); + static void setSchemaProperties(common::LogicalType* type, + kuzu_parquet::format::SchemaElement& schemaElement); private: void prepareRowGroup(FactorizedTable& ft, PreparedRowGroup& result); diff --git a/src/include/processor/operator/persistent/writer/parquet/standard_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/standard_column_writer.h index c9054821f7d..a7c73ab35c3 100644 --- a/src/include/processor/operator/persistent/writer/parquet/standard_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/standard_column_writer.h @@ -70,8 +70,8 @@ class StandardColumnWriter : public BasicColumnWriter { StandardColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schemaPath, uint64_t maxRepeat, uint64_t maxDefine, bool canHaveNulls) - : BasicColumnWriter( - writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, canHaveNulls) {} + : BasicColumnWriter(writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, + canHaveNulls) {} inline std::unique_ptr initializeStatsState() override { return OP::template initializeStats(); diff --git a/src/include/processor/operator/persistent/writer/parquet/string_column_writer.h b/src/include/processor/operator/persistent/writer/parquet/string_column_writer.h index 6282fbe6289..d1cdfd749cf 100644 --- a/src/include/processor/operator/persistent/writer/parquet/string_column_writer.h +++ b/src/include/processor/operator/persistent/writer/parquet/string_column_writer.h @@ -38,8 +38,8 @@ class StringStatisticsState : public ColumnWriterStatistics { class StringColumnWriterState : public BasicColumnWriterState { public: - StringColumnWriterState( - kuzu_parquet::format::RowGroup& rowGroup, uint64_t colIdx, storage::MemoryManager* mm) + StringColumnWriterState(kuzu_parquet::format::RowGroup& rowGroup, uint64_t colIdx, + storage::MemoryManager* mm) : BasicColumnWriterState{rowGroup, colIdx}, overflowBuffer{std::make_unique(mm)} {} @@ -77,8 +77,8 @@ class StringColumnWriter : public BasicColumnWriter { StringColumnWriter(ParquetWriter& writer, uint64_t schemaIdx, std::vector schemaPath, uint64_t maxRepeat, uint64_t maxDefine, bool canHaveNulls, storage::MemoryManager* mm) - : BasicColumnWriter( - writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, canHaveNulls), + : BasicColumnWriter(writer, schemaIdx, std::move(schemaPath), maxRepeat, maxDefine, + canHaveNulls), mm{mm} {} public: @@ -124,14 +124,14 @@ class StringColumnWriter : public BasicColumnWriter { ColumnWriterPageState* writerPageState, common::ValueVector* vector, uint64_t chunkStart, uint64_t chunkEnd) override; - void flushPageState( - common::Serializer& bufferedSerializer, ColumnWriterPageState* writerPageState) override; + void flushPageState(common::Serializer& bufferedSerializer, + ColumnWriterPageState* writerPageState) override; - void flushDictionary( - BasicColumnWriterState& writerState, ColumnWriterStatistics* writerStats) override; + void flushDictionary(BasicColumnWriterState& writerState, + ColumnWriterStatistics* writerStats) override; - uint64_t getRowSize( - common::ValueVector* vector, uint64_t index, BasicColumnWriterState& writerState) override; + uint64_t getRowSize(common::ValueVector* vector, uint64_t index, + BasicColumnWriterState& writerState) override; private: storage::MemoryManager* mm; diff --git a/src/include/processor/operator/profile.h b/src/include/processor/operator/profile.h index 6ead2cf4c31..6e4ab2fcbc2 100644 --- a/src/include/processor/operator/profile.h +++ b/src/include/processor/operator/profile.h @@ -30,8 +30,8 @@ class Profile : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) override; std::unique_ptr clone() override { - return std::make_unique( - outputPos, info, localState, id, paramsString, children[0]->clone()); + return std::make_unique(outputPos, info, localState, id, paramsString, + children[0]->clone()); } private: diff --git a/src/include/processor/operator/projection.h b/src/include/processor/operator/projection.h index 869f5434a43..f358ccc59c8 100644 --- a/src/include/processor/operator/projection.h +++ b/src/include/processor/operator/projection.h @@ -13,8 +13,8 @@ class Projection : public PhysicalOperator { std::unordered_set discardedDataChunksPos, std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator(PhysicalOperatorType::PROJECTION, std::move(child), id, paramsString), - expressionEvaluators(std::move(expressionEvaluators)), expressionsOutputPos{std::move( - expressionsOutputPos)}, + expressionEvaluators(std::move(expressionEvaluators)), + expressionsOutputPos{std::move(expressionsOutputPos)}, discardedDataChunksPos{std::move(discardedDataChunksPos)}, prevMultiplicity{1} {} void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; diff --git a/src/include/processor/operator/recursive_extend/bfs_state.h b/src/include/processor/operator/recursive_extend/bfs_state.h index 1461f351e6e..bd0daf7aacb 100644 --- a/src/include/processor/operator/recursive_extend/bfs_state.h +++ b/src/include/processor/operator/recursive_extend/bfs_state.h @@ -40,8 +40,8 @@ class TargetDstNodes { class BaseBFSState { public: explicit BaseBFSState(uint8_t upperBound, TargetDstNodes* targetDstNodes) - : upperBound{upperBound}, currentLevel{0}, nextNodeIdxToExtend{0}, targetDstNodes{ - targetDstNodes} {} + : upperBound{upperBound}, currentLevel{0}, nextNodeIdxToExtend{0}, + targetDstNodes{targetDstNodes} {} virtual ~BaseBFSState() = default; // Get next node offset to extend from current level. diff --git a/src/include/processor/operator/recursive_extend/path_property_probe.h b/src/include/processor/operator/recursive_extend/path_property_probe.h index e9afe25e4f2..3886d966cf9 100644 --- a/src/include/processor/operator/recursive_extend/path_property_probe.h +++ b/src/include/processor/operator/recursive_extend/path_property_probe.h @@ -12,8 +12,8 @@ struct PathPropertyProbeSharedState { PathPropertyProbeSharedState(std::shared_ptr nodeHashTableState, std::shared_ptr relHashTableState) - : nodeHashTableState{std::move(nodeHashTableState)}, relHashTableState{ - std::move(relHashTableState)} {} + : nodeHashTableState{std::move(nodeHashTableState)}, + relHashTableState{std::move(relHashTableState)} {} }; struct PathPropertyProbeLocalState { @@ -41,14 +41,14 @@ struct PathPropertyProbeDataInfo { std::vector nodeTableColumnIndices, std::vector relTableColumnIndices) : pathPos{pathPos}, nodeFieldIndices{std::move(nodeFieldIndices)}, - relFieldIndices{std::move(relFieldIndices)}, nodeTableColumnIndices{std::move( - nodeTableColumnIndices)}, + relFieldIndices{std::move(relFieldIndices)}, + nodeTableColumnIndices{std::move(nodeTableColumnIndices)}, relTableColumnIndices{std::move(relTableColumnIndices)} {} PathPropertyProbeDataInfo(const PathPropertyProbeDataInfo& other) : pathPos{other.pathPos}, nodeFieldIndices{other.nodeFieldIndices}, relFieldIndices{other.relFieldIndices}, - nodeTableColumnIndices{other.nodeTableColumnIndices}, relTableColumnIndices{ - other.relTableColumnIndices} {} + nodeTableColumnIndices{other.nodeTableColumnIndices}, + relTableColumnIndices{other.relTableColumnIndices} {} std::unique_ptr copy() const { return std::make_unique(*this); @@ -76,8 +76,8 @@ class PathPropertyProbe : public PhysicalOperator { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return std::make_unique( - info->copy(), sharedState, children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), sharedState, children[0]->clone(), + id, paramsString); } private: diff --git a/src/include/processor/operator/recursive_extend/recursive_join.h b/src/include/processor/operator/recursive_extend/recursive_join.h index ce47117468e..72c1eceaae1 100644 --- a/src/include/processor/operator/recursive_extend/recursive_join.h +++ b/src/include/processor/operator/recursive_extend/recursive_join.h @@ -45,10 +45,10 @@ struct RecursiveJoinDataInfo { : srcNodePos{srcNodePos}, dstNodePos{dstNodePos}, dstNodeTableIDs{std::move(dstNodeTableIDs)}, pathLengthPos{pathLengthPos}, localResultSetDescriptor{std::move(localResultSetDescriptor)}, - recursiveDstNodeIDPos{recursiveDstNodeIDPos}, recursiveDstNodeTableIDs{std::move( - recursiveDstNodeTableIDs)}, - recursiveEdgeIDPos{recursiveEdgeIDPos}, pathPos{pathPos}, tableIDToName{ - std::move(tableIDToName)} {} + recursiveDstNodeIDPos{recursiveDstNodeIDPos}, + recursiveDstNodeTableIDs{std::move(recursiveDstNodeTableIDs)}, + recursiveEdgeIDPos{recursiveEdgeIDPos}, pathPos{pathPos}, + tableIDToName{std::move(tableIDToName)} {} inline std::unique_ptr copy() { return std::make_unique(srcNodePos, dstNodePos, dstNodeTableIDs, diff --git a/src/include/processor/operator/recursive_extend/scan_frontier.h b/src/include/processor/operator/recursive_extend/scan_frontier.h index adee72fea67..736ffb8e544 100644 --- a/src/include/processor/operator/recursive_extend/scan_frontier.h +++ b/src/include/processor/operator/recursive_extend/scan_frontier.h @@ -17,8 +17,8 @@ class ScanFrontier : public PhysicalOperator { inline bool isSource() const override { return true; } - inline void initLocalStateInternal( - ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) override { + inline void initLocalStateInternal(ResultSet* /*resultSet_*/, + ExecutionContext* /*context*/) override { nodeIDVector = resultSet->getValueVector(info.nodeIDPos).get(); flagVector = resultSet->getValueVector(info.flagPos).get(); } diff --git a/src/include/processor/operator/scan/scan_multi_node_tables.h b/src/include/processor/operator/scan/scan_multi_node_tables.h index 5fdc10c9e14..6c93e6e0652 100644 --- a/src/include/processor/operator/scan/scan_multi_node_tables.h +++ b/src/include/processor/operator/scan/scan_multi_node_tables.h @@ -18,8 +18,8 @@ class ScanMultiNodeTables : public ScanTable { inline void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override { ScanTable::initLocalStateInternal(resultSet, context); for (auto& [tableID, scanInfo] : tables) { - readStates[tableID] = std::make_unique( - *inVector, scanInfo->columnIDs, outVectors); + readStates[tableID] = std::make_unique(*inVector, + scanInfo->columnIDs, outVectors); } } bool getNextTuplesInternal(ExecutionContext* context) override; diff --git a/src/include/processor/operator/scan/scan_multi_rel_tables.h b/src/include/processor/operator/scan/scan_multi_rel_tables.h index 4de085f3c9a..697b16c07fd 100644 --- a/src/include/processor/operator/scan/scan_multi_rel_tables.h +++ b/src/include/processor/operator/scan/scan_multi_rel_tables.h @@ -15,8 +15,8 @@ class RelTableCollectionScanner { nextTableIdx = 0; } - void init( - common::ValueVector* inVector, const std::vector& outputVectors); + void init(common::ValueVector* inVector, + const std::vector& outputVectors); bool scan(common::ValueVector* inVector, const std::vector& outputVectors, transaction::Transaction* transaction); diff --git a/src/include/processor/operator/scan/scan_node_table.h b/src/include/processor/operator/scan/scan_node_table.h index 099ed5364fd..dbc68e7990a 100644 --- a/src/include/processor/operator/scan/scan_node_table.h +++ b/src/include/processor/operator/scan/scan_node_table.h @@ -30,8 +30,8 @@ class ScanSingleNodeTable : public ScanTable { : ScanSingleNodeTable{PhysicalOperatorType::SCAN_NODE_TABLE, std::move(info), inVectorPos, std::move(outVectorsPos), std::move(child), id, paramsString} {} - inline void initLocalStateInternal( - ResultSet* resultSet, ExecutionContext* executionContext) final { + inline void initLocalStateInternal(ResultSet* resultSet, + ExecutionContext* executionContext) final { ScanTable::initLocalStateInternal(resultSet, executionContext); readState = std::make_unique(*inVector, info->columnIDs, outVectors); @@ -40,8 +40,8 @@ class ScanSingleNodeTable : public ScanTable { bool getNextTuplesInternal(ExecutionContext* context) override; inline std::unique_ptr clone() override { - return make_unique( - info->copy(), inVectorPos, outVectorsPos, children[0]->clone(), id, paramsString); + return make_unique(info->copy(), inVectorPos, outVectorsPos, + children[0]->clone(), id, paramsString); } protected: diff --git a/src/include/processor/operator/scan/scan_rel_table.h b/src/include/processor/operator/scan/scan_rel_table.h index 17a0ceb8ed4..98dad613901 100644 --- a/src/include/processor/operator/scan/scan_rel_table.h +++ b/src/include/processor/operator/scan/scan_rel_table.h @@ -31,20 +31,20 @@ class ScanRelTable : public ScanTable { std::move(outVectorsPos), std::move(child), id, paramsString} {} ~ScanRelTable() override = default; - inline void initLocalStateInternal( - ResultSet* resultSet, ExecutionContext* executionContext) override { + inline void initLocalStateInternal(ResultSet* resultSet, + ExecutionContext* executionContext) override { ScanTable::initLocalStateInternal(resultSet, executionContext); if (info) { - scanState = std::make_unique( - *inVector, info->columnIDs, outVectors, info->direction); + scanState = std::make_unique(*inVector, info->columnIDs, + outVectors, info->direction); } } bool getNextTuplesInternal(ExecutionContext* context) override; inline std::unique_ptr clone() override { - return std::make_unique( - info->copy(), inVectorPos, outVectorsPos, children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), inVectorPos, outVectorsPos, + children[0]->clone(), id, paramsString); } protected: diff --git a/src/include/processor/operator/semi_masker.h b/src/include/processor/operator/semi_masker.h index e8f4f968514..cef0e76c29f 100644 --- a/src/include/processor/operator/semi_masker.h +++ b/src/include/processor/operator/semi_masker.h @@ -68,8 +68,8 @@ class SingleTableSemiMasker : public BaseSemiMasker { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return std::make_unique( - info->copy(), children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), children[0]->clone(), id, + paramsString); } }; @@ -82,8 +82,8 @@ class MultiTableSemiMasker : public BaseSemiMasker { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return std::make_unique( - info->copy(), children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), children[0]->clone(), id, + paramsString); } }; @@ -110,8 +110,8 @@ class PathSingleTableSemiMasker : public PathSemiMasker { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return std::make_unique( - info->copy(), children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), children[0]->clone(), id, + paramsString); } }; @@ -124,8 +124,8 @@ class PathMultipleTableSemiMasker : public PathSemiMasker { bool getNextTuplesInternal(ExecutionContext* context) final; inline std::unique_ptr clone() final { - return std::make_unique( - info->copy(), children[0]->clone(), id, paramsString); + return std::make_unique(info->copy(), children[0]->clone(), id, + paramsString); } }; diff --git a/src/include/processor/operator/sink.h b/src/include/processor/operator/sink.h index a5a7e33d0eb..3f1e05421d3 100644 --- a/src/include/processor/operator/sink.h +++ b/src/include/processor/operator/sink.h @@ -11,8 +11,8 @@ class Sink : public PhysicalOperator { public: Sink(std::unique_ptr resultSetDescriptor, PhysicalOperatorType operatorType, uint32_t id, const std::string& paramsString) - : PhysicalOperator{operatorType, id, paramsString}, resultSetDescriptor{ - std::move(resultSetDescriptor)} {} + : PhysicalOperator{operatorType, id, paramsString}, + resultSetDescriptor{std::move(resultSetDescriptor)} {} Sink(std::unique_ptr resultSetDescriptor, PhysicalOperatorType operatorType, std::unique_ptr child, uint32_t id, const std::string& paramsString) @@ -30,7 +30,7 @@ class Sink : public PhysicalOperator { metrics->executionTime.stop(); } - virtual void finalize(ExecutionContext* /*context*/){}; + virtual void finalize(ExecutionContext* /*context*/) {}; std::unique_ptr clone() override = 0; diff --git a/src/include/processor/operator/skip.h b/src/include/processor/operator/skip.h index 4e1eadb41dc..da9491259a7 100644 --- a/src/include/processor/operator/skip.h +++ b/src/include/processor/operator/skip.h @@ -13,8 +13,8 @@ class Skip : public PhysicalOperator, public SelVectorOverWriter { std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::SKIP, std::move(child), id, paramsString}, skipNumber{skipNumber}, counter{std::move(counter)}, - dataChunkToSelectPos{dataChunkToSelectPos}, dataChunksPosInScope{ - std::move(dataChunksPosInScope)} {} + dataChunkToSelectPos{dataChunkToSelectPos}, + dataChunksPosInScope{std::move(dataChunksPosInScope)} {} void initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) override; diff --git a/src/include/processor/operator/table_scan/union_all_scan.h b/src/include/processor/operator/table_scan/union_all_scan.h index 4ba751c4e61..f901ce3066f 100644 --- a/src/include/processor/operator/table_scan/union_all_scan.h +++ b/src/include/processor/operator/table_scan/union_all_scan.h @@ -31,10 +31,10 @@ struct UnionAllScanMorsel { class UnionAllScanSharedState { public: - UnionAllScanSharedState( - std::vector> tables, uint64_t maxMorselSize) - : tables{std::move(tables)}, maxMorselSize{maxMorselSize}, tableIdx{0}, nextTupleIdxToScan{ - 0} {} + UnionAllScanSharedState(std::vector> tables, + uint64_t maxMorselSize) + : tables{std::move(tables)}, maxMorselSize{maxMorselSize}, tableIdx{0}, + nextTupleIdxToScan{0} {} std::unique_ptr getMorsel(); diff --git a/src/include/processor/operator/transaction.h b/src/include/processor/operator/transaction.h index d6c2c0b2e88..c62e60ed0b8 100644 --- a/src/include/processor/operator/transaction.h +++ b/src/include/processor/operator/transaction.h @@ -16,8 +16,8 @@ class Transaction : public PhysicalOperator { inline bool isSource() const final { return true; } inline bool canParallel() const final { return false; } - inline void initLocalStateInternal( - ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) final { + inline void initLocalStateInternal(ResultSet* /*resultSet_*/, + ExecutionContext* /*context*/) final { hasExecuted = false; } diff --git a/src/include/processor/operator/unwind.h b/src/include/processor/operator/unwind.h index 52eef58e54a..9016940ea7d 100644 --- a/src/include/processor/operator/unwind.h +++ b/src/include/processor/operator/unwind.h @@ -13,8 +13,8 @@ class Unwind : public PhysicalOperator { std::unique_ptr expressionEvaluator, std::unique_ptr child, uint32_t id, const std::string& paramsString) : PhysicalOperator{PhysicalOperatorType::UNWIND, std::move(child), id, paramsString}, - outDataPos{outDataPos}, - idPos(idPos), expressionEvaluator{std::move(expressionEvaluator)}, startIndex{0u} {} + outDataPos{outDataPos}, idPos(idPos), expressionEvaluator{std::move(expressionEvaluator)}, + startIndex{0u} {} bool getNextTuplesInternal(ExecutionContext* context) override; diff --git a/src/include/processor/plan_mapper.h b/src/include/processor/plan_mapper.h index 56131e4dbfd..9e9ca5b5e78 100644 --- a/src/include/processor/plan_mapper.h +++ b/src/include/processor/plan_mapper.h @@ -35,8 +35,8 @@ class PlanMapper { explicit PlanMapper(main::ClientContext* clientContext) : expressionMapper{}, clientContext{clientContext}, physicalOperatorID{0} {} - std::unique_ptr mapLogicalPlanToPhysical( - planner::LogicalPlan* logicalPlan, const binder::expression_vector& expressionsToCollect); + std::unique_ptr mapLogicalPlanToPhysical(planner::LogicalPlan* logicalPlan, + const binder::expression_vector& expressionsToCollect); private: std::unique_ptr mapOperator(planner::LogicalOperator* logicalOperator); @@ -126,8 +126,8 @@ class PlanMapper { uint64_t maxMorselSize, std::unique_ptr child); // Do not scan anything from table. Serves as a control logic of pull model. // Scan is the leaf operator of physical plan. - std::unique_ptr createEmptyFTableScan( - std::shared_ptr table, uint64_t maxMorselSize); + std::unique_ptr createEmptyFTableScan(std::shared_ptr table, + uint64_t maxMorselSize); // Assume scans all columns of table in the same order as given expressions. // Scan fTable with row offset. std::unique_ptr createFTableScanAligned( @@ -162,10 +162,10 @@ class PlanMapper { const planner::Schema& outSchema) const; std::unique_ptr getRelInsertExecutor(const planner::LogicalInsertInfo* info, const planner::Schema& inSchema, const planner::Schema& outSchema) const; - std::unique_ptr getNodeSetExecutor( - planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const; - std::unique_ptr getRelSetExecutor( - planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const; + std::unique_ptr getNodeSetExecutor(planner::LogicalSetPropertyInfo* info, + const planner::Schema& inSchema) const; + std::unique_ptr getRelSetExecutor(planner::LogicalSetPropertyInfo* info, + const planner::Schema& inSchema) const; std::shared_ptr getSingleStringColumnFTable() const; @@ -173,11 +173,11 @@ class PlanMapper { static void mapSIPJoin(PhysicalOperator* probe); - static std::vector getExpressionsDataPos( - const binder::expression_vector& expressions, const planner::Schema& schema); + static std::vector getExpressionsDataPos(const binder::expression_vector& expressions, + const planner::Schema& schema); - static inline DataPos getDataPos( - const binder::Expression& expression, const planner::Schema& schema) { + static inline DataPos getDataPos(const binder::Expression& expression, + const planner::Schema& schema) { return DataPos(schema.getExpressionPos(expression)); } diff --git a/src/include/processor/processor_task.h b/src/include/processor/processor_task.h index 9d8059c0360..c81a3ef6777 100644 --- a/src/include/processor/processor_task.h +++ b/src/include/processor/processor_task.h @@ -16,8 +16,8 @@ class ProcessorTask : public common::Task { void finalizeIfNecessary() override; private: - static std::unique_ptr populateResultSet( - Sink* op, storage::MemoryManager* memoryManager); + static std::unique_ptr populateResultSet(Sink* op, + storage::MemoryManager* memoryManager); private: bool sharedStateInitialized; diff --git a/src/include/processor/result/base_hash_table.h b/src/include/processor/result/base_hash_table.h index 9472530b3ff..36fa78e0e10 100644 --- a/src/include/processor/result/base_hash_table.h +++ b/src/include/processor/result/base_hash_table.h @@ -18,8 +18,8 @@ class BaseHashTable { protected: uint64_t getSlotIdxForHash(common::hash_t hash) const { return hash & bitmask; } void setMaxNumHashSlots(uint64_t newSize); - void computeAndCombineVecHash( - const std::vector& unFlatKeyVectors, uint32_t startVecIdx); + void computeAndCombineVecHash(const std::vector& unFlatKeyVectors, + uint32_t startVecIdx); void computeVectorHashes(const std::vector& flatKeyVectors, const std::vector& unFlatKeyVectors); void initSlotConstant(uint64_t numSlotsPerBlock_); diff --git a/src/include/processor/result/factorized_table.h b/src/include/processor/result/factorized_table.h index 6d454721387..c014b888349 100644 --- a/src/include/processor/result/factorized_table.h +++ b/src/include/processor/result/factorized_table.h @@ -94,8 +94,8 @@ class DataBlockCollection { class ColumnSchema { public: ColumnSchema(bool isUnflat, data_chunk_pos_t dataChunksPos, uint32_t numBytes) - : isUnflat{isUnflat}, dataChunkPos{dataChunksPos}, numBytes{numBytes}, mayContainNulls{ - false} {} + : isUnflat{isUnflat}, dataChunkPos{dataChunksPos}, numBytes{numBytes}, + mayContainNulls{false} {} ColumnSchema(const ColumnSchema& other); @@ -177,8 +177,8 @@ class FactorizedTable { friend class PathPropertyProbe; public: - FactorizedTable( - storage::MemoryManager* memoryManager, std::unique_ptr tableSchema); + FactorizedTable(storage::MemoryManager* memoryManager, + std::unique_ptr tableSchema); void append(const std::vector& vectors); @@ -232,15 +232,15 @@ class FactorizedTable { inline const FactorizedTableSchema* getTableSchema() const { return tableSchema.get(); } template - inline TYPE getData( - ft_block_idx_t blockIdx, ft_block_offset_t blockOffset, ft_col_offset_t colOffset) const { + inline TYPE getData(ft_block_idx_t blockIdx, ft_block_offset_t blockOffset, + ft_col_offset_t colOffset) const { return *((TYPE*)getCell(blockIdx, blockOffset, colOffset)); } uint8_t* getTuple(ft_tuple_idx_t tupleIdx) const; - void updateFlatCell( - uint8_t* tuplePtr, ft_col_idx_t colIdx, common::ValueVector* valueVector, uint32_t pos); + void updateFlatCell(uint8_t* tuplePtr, ft_col_idx_t colIdx, common::ValueVector* valueVector, + uint32_t pos); inline void updateFlatCellNoNull(uint8_t* ftTuplePtr, ft_col_idx_t colIdx, void* dataBuf) { memcpy(ftTuplePtr + tableSchema->getColOffset(colIdx), dataBuf, tableSchema->getColumn(colIdx)->getNumBytes()); @@ -252,8 +252,8 @@ class FactorizedTable { return tableSchema->getColumn(colIdx)->hasNoNullGuarantee(); } - bool isOverflowColNull( - const uint8_t* nullBuffer, ft_tuple_idx_t tupleIdx, ft_col_idx_t colIdx) const; + bool isOverflowColNull(const uint8_t* nullBuffer, ft_tuple_idx_t tupleIdx, + ft_col_idx_t colIdx) const; bool isNonOverflowColNull(const uint8_t* nullBuffer, ft_col_idx_t colIdx) const; void setNonOverflowColNull(uint8_t* nullBuffer, ft_col_idx_t colIdx); void clear(); @@ -264,8 +264,8 @@ class FactorizedTable { uint64_t computeNumTuplesToAppend( const std::vector& vectorsToAppend) const; - inline uint8_t* getCell( - ft_block_idx_t blockIdx, ft_block_offset_t blockOffset, ft_col_offset_t colOffset) const { + inline uint8_t* getCell(ft_block_idx_t blockIdx, ft_block_offset_t blockOffset, + ft_col_offset_t colOffset) const { return flatTupleBlockCollection->getBlock(blockIdx)->getData() + blockOffset * tableSchema->getNumBytesPerTuple() + colOffset; } @@ -291,12 +291,12 @@ class FactorizedTable { const BlockAppendingInfo& blockAppendInfo, ft_col_idx_t colIdx); void copyVectorToColumn(const common::ValueVector& vector, const BlockAppendingInfo& blockAppendInfo, uint64_t numAppendedTuples, ft_col_idx_t colIdx); - common::overflow_value_t appendVectorToUnflatTupleBlocks( - const common::ValueVector& vector, ft_col_idx_t colIdx); + common::overflow_value_t appendVectorToUnflatTupleBlocks(const common::ValueVector& vector, + ft_col_idx_t colIdx); // TODO(Guodong): Unify these two `readUnflatCol()` with a (possibly templated) copy executor. - void readUnflatCol( - uint8_t** tuplesToRead, ft_col_idx_t colIdx, common::ValueVector& vector) const; + void readUnflatCol(uint8_t** tuplesToRead, ft_col_idx_t colIdx, + common::ValueVector& vector) const; void readUnflatCol(const uint8_t* tupleToRead, const common::SelectionVector* selVector, ft_col_idx_t colIdx, common::ValueVector& vector) const; void readFlatColToFlatVector(uint8_t* tupleToRead, ft_col_idx_t colIdx, @@ -324,14 +324,14 @@ class FactorizedTableUtils { public: static void appendStringToTable(FactorizedTable* factorizedTable, std::string& outputMsg, storage::MemoryManager* memoryManager); - static std::shared_ptr getFactorizedTableForOutputMsg( - std::string& outputMsg, storage::MemoryManager* memoryManager); + static std::shared_ptr getFactorizedTableForOutputMsg(std::string& outputMsg, + storage::MemoryManager* memoryManager); }; class FlatTupleIterator { public: - explicit FlatTupleIterator( - FactorizedTable& factorizedTable, std::vector values); + explicit FlatTupleIterator(FactorizedTable& factorizedTable, + std::vector values); inline bool hasNextFlatTuple() { return nextTupleIdx < factorizedTable.getNumTuples() || nextFlatTupleIdx < numFlatTuples; diff --git a/src/include/storage/buffer_manager/bm_file_handle.h b/src/include/storage/buffer_manager/bm_file_handle.h index 08baca066cb..e279982a289 100644 --- a/src/include/storage/buffer_manager/bm_file_handle.h +++ b/src/include/storage/buffer_manager/bm_file_handle.h @@ -36,12 +36,12 @@ class PageState { inline static uint64_t getVersion(uint64_t stateAndVersion) { return stateAndVersion & VERSION_MASK; } - inline static uint64_t updateStateWithSameVersion( - uint64_t oldStateAndVersion, uint64_t newState) { + inline static uint64_t updateStateWithSameVersion(uint64_t oldStateAndVersion, + uint64_t newState) { return ((oldStateAndVersion << 8) >> 8) | (newState << NUM_BITS_TO_SHIFT_FOR_STATE); } - inline static uint64_t updateStateAndIncrementVersion( - uint64_t oldStateAndVersion, uint64_t newState) { + inline static uint64_t updateStateAndIncrementVersion(uint64_t oldStateAndVersion, + uint64_t newState) { return (((oldStateAndVersion << 8) >> 8) + 1) | (newState << NUM_BITS_TO_SHIFT_FOR_STATE); } inline void spinLock(uint64_t oldStateAndVersion) { @@ -52,8 +52,8 @@ class PageState { } } inline bool tryLock(uint64_t oldStateAndVersion) { - return stateAndVersion.compare_exchange_strong( - oldStateAndVersion, updateStateWithSameVersion(oldStateAndVersion, LOCKED)); + return stateAndVersion.compare_exchange_strong(oldStateAndVersion, + updateStateWithSameVersion(oldStateAndVersion, LOCKED)); } inline void unlock() { // TODO(Keenan / Guodong): Track down this rare bug and re-enable the assert. Ref #2289. @@ -64,12 +64,12 @@ class PageState { // Change page state from Mark to Unlocked. inline bool tryClearMark(uint64_t oldStateAndVersion) { KU_ASSERT(getState(oldStateAndVersion) == MARKED); - return stateAndVersion.compare_exchange_strong( - oldStateAndVersion, updateStateWithSameVersion(oldStateAndVersion, UNLOCKED)); + return stateAndVersion.compare_exchange_strong(oldStateAndVersion, + updateStateWithSameVersion(oldStateAndVersion, UNLOCKED)); } inline bool tryMark(uint64_t oldStateAndVersion) { - return stateAndVersion.compare_exchange_strong( - oldStateAndVersion, updateStateWithSameVersion(oldStateAndVersion, MARKED)); + return stateAndVersion.compare_exchange_strong(oldStateAndVersion, + updateStateWithSameVersion(oldStateAndVersion, MARKED)); } inline void setDirty() { @@ -113,8 +113,8 @@ class WALPageIdxGroup { inline common::page_idx_t getWALVersionPageIdxNoLock(common::page_idx_t pageIdxInGroup) const { return walPageIdxes[pageIdxInGroup]; } - inline void setWALVersionPageIdxNoLock( - common::page_idx_t pageIdxInGroup, common::page_idx_t walVersionPageIdx) { + inline void setWALVersionPageIdxNoLock(common::page_idx_t pageIdxInGroup, + common::page_idx_t walVersionPageIdx) { walPageIdxes[pageIdxInGroup] = walVersionPageIdx; } diff --git a/src/include/storage/buffer_manager/buffer_manager.h b/src/include/storage/buffer_manager/buffer_manager.h index 2ecd9227be9..f74fb0cd187 100644 --- a/src/include/storage/buffer_manager/buffer_manager.h +++ b/src/include/storage/buffer_manager/buffer_manager.h @@ -177,16 +177,16 @@ class BufferManager { // Currently, these functions are specifically used only for WAL files. void removeFilePagesFromFrames(BMFileHandle& fileHandle); void flushAllDirtyPagesInFrames(BMFileHandle& fileHandle); - void updateFrameIfPageIsInFrameWithoutLock( - BMFileHandle& fileHandle, uint8_t* newPage, common::page_idx_t pageIdx); + void updateFrameIfPageIsInFrameWithoutLock(BMFileHandle& fileHandle, uint8_t* newPage, + common::page_idx_t pageIdx); void removePageFromFrameIfNecessary(BMFileHandle& fileHandle, common::page_idx_t pageIdx); // For files that are managed by BM, their FileHandles should be created through this function. inline std::unique_ptr getBMFileHandle(const std::string& filePath, uint8_t flags, BMFileHandle::FileVersionedType fileVersionedType, common::VirtualFileSystem* vfs, common::PageSizeClass pageSizeClass = common::PAGE_4KB) { - return std::make_unique( - filePath, flags, this, pageSizeClass, fileVersionedType, vfs); + return std::make_unique(filePath, flags, this, pageSizeClass, + fileVersionedType, vfs); } inline common::frame_group_idx_t addNewFrameGroup(common::PageSizeClass pageSizeClass) { return vmRegions[pageSizeClass]->addNewFrameGroup(); @@ -196,19 +196,19 @@ class BufferManager { private: static void verifySizeParams(uint64_t bufferPoolSize, uint64_t maxDBSize); - bool claimAFrame( - BMFileHandle& fileHandle, common::page_idx_t pageIdx, PageReadPolicy pageReadPolicy); + bool claimAFrame(BMFileHandle& fileHandle, common::page_idx_t pageIdx, + PageReadPolicy pageReadPolicy); // Return number of bytes freed. uint64_t tryEvictPage(EvictionCandidate& candidate); - void cachePageIntoFrame( - BMFileHandle& fileHandle, common::page_idx_t pageIdx, PageReadPolicy pageReadPolicy); + void cachePageIntoFrame(BMFileHandle& fileHandle, common::page_idx_t pageIdx, + PageReadPolicy pageReadPolicy); void flushIfDirtyWithoutLock(BMFileHandle& fileHandle, common::page_idx_t pageIdx); - void removePageFromFrame( - BMFileHandle& fileHandle, common::page_idx_t pageIdx, bool shouldFlush); + void removePageFromFrame(BMFileHandle& fileHandle, common::page_idx_t pageIdx, + bool shouldFlush); - void addToEvictionQueue( - BMFileHandle* fileHandle, common::page_idx_t pageIdx, PageState* pageState); + void addToEvictionQueue(BMFileHandle* fileHandle, common::page_idx_t pageIdx, + PageState* pageState); inline uint64_t reserveUsedMemory(uint64_t size) { return usedMemory.fetch_add(size); } inline uint64_t freeUsedMemory(uint64_t size) { diff --git a/src/include/storage/compression/compression.h b/src/include/storage/compression/compression.h index 915135e912f..2ab574e8884 100644 --- a/src/include/storage/compression/compression.h +++ b/src/include/storage/compression/compression.h @@ -44,8 +44,8 @@ struct CompressionMetadata { uint64_t numValues(uint64_t dataSize, const common::LogicalType& dataType) const; // Returns true if and only if the provided value within the vector can be updated // in this chunk in-place. - bool canUpdateInPlace( - const uint8_t* data, uint32_t pos, common::PhysicalTypeID physicalType) const; + bool canUpdateInPlace(const uint8_t* data, uint32_t pos, + common::PhysicalTypeID physicalType) const; bool canAlwaysUpdateInPlace() const; inline bool isConstant() const { return compression == CompressionType::CONSTANT; } @@ -65,8 +65,8 @@ class CompressionAlg { // Returns compression metadata, including any relevant parameters specific to this dataset // which will need to be passed to compressNextPage. Since this may need to scan the entire // buffer, which is slow, it should only be called once for each set of data to compress. - virtual CompressionMetadata getCompressionMetadata( - const uint8_t* srcBuffer, uint64_t numValues) const = 0; + virtual CompressionMetadata getCompressionMetadata(const uint8_t* srcBuffer, + uint64_t numValues) const = 0; // Takes uncompressed data from the srcBuffer and compresses it into the dstBuffer // @@ -121,14 +121,14 @@ class ConstantCompression final : public CompressionAlg { uint64_t dstOffset, uint64_t numValues, const CompressionMetadata& metadata) const; // Shouldn't be used. No type exclusively uses constant compression - CompressionMetadata getCompressionMetadata( - const uint8_t* /*srcBuffer*/, uint64_t /*numValues*/) const override { + CompressionMetadata getCompressionMetadata(const uint8_t* /*srcBuffer*/, + uint64_t /*numValues*/) const override { KU_UNREACHABLE; } // Nothing to do; constant compressed data is only updated if the update is to the same value void setValuesFromUncompressed(const uint8_t*, common::offset_t, uint8_t*, common::offset_t, - common::offset_t, const CompressionMetadata&) const override{}; + common::offset_t, const CompressionMetadata&) const override {}; private: uint8_t numBytesPerValue; @@ -156,8 +156,8 @@ class Uncompressed : public CompressionAlg { return numBytesPerValue == 0 ? UINT64_MAX : dataSize / numBytesPerValue; } - inline CompressionMetadata getCompressionMetadata( - const uint8_t* /*srcBuffer*/, uint64_t /*numValues*/) const override { + inline CompressionMetadata getCompressionMetadata(const uint8_t* /*srcBuffer*/, + uint64_t /*numValues*/) const override { return CompressionMetadata(); } @@ -239,8 +239,8 @@ class IntegerBitpacking : public CompressionAlg { return numValues; } - CompressionMetadata getCompressionMetadata( - const uint8_t* srcBuffer, uint64_t numValues) const override { + CompressionMetadata getCompressionMetadata(const uint8_t* srcBuffer, + uint64_t numValues) const override { auto header = getBitWidth(srcBuffer, numValues); // Use uncompressed if the bitwidth is equal to the size of the type in bits if (header.bitWidth >= sizeof(T) * 8) { @@ -264,8 +264,8 @@ class IntegerBitpacking : public CompressionAlg { void getValues(const uint8_t* chunkStart, uint8_t pos, uint8_t* dst, uint8_t numValuesToRead, const BitpackHeader& header) const; - inline const uint8_t* getChunkStart( - const uint8_t* buffer, uint64_t pos, uint8_t bitWidth) const { + inline const uint8_t* getChunkStart(const uint8_t* buffer, uint64_t pos, + uint8_t bitWidth) const { // Order of operations is important so that pos is rounded down to a multiple of CHUNK_SIZE return buffer + (pos / CHUNK_SIZE) * bitWidth * CHUNK_SIZE / 8; } @@ -282,8 +282,8 @@ class BooleanBitpacking : public CompressionAlg { static inline uint64_t numValues(uint64_t dataSize) { return dataSize * 8; } - inline CompressionMetadata getCompressionMetadata( - const uint8_t* /*srcBuffer*/, uint64_t /*numValues*/) const override { + inline CompressionMetadata getCompressionMetadata(const uint8_t* /*srcBuffer*/, + uint64_t /*numValues*/) const override { return CompressionMetadata{CompressionType::BOOLEAN_BITPACKING}; } uint64_t compressNextPage(const uint8_t*& srcBuffer, uint64_t numValuesRemaining, @@ -303,8 +303,8 @@ class CompressedFunctor { protected: explicit CompressedFunctor(const common::LogicalType& logicalType) - : constant{logicalType}, uncompressed{logicalType}, physicalType{ - logicalType.getPhysicalType()} {} + : constant{logicalType}, uncompressed{logicalType}, + physicalType{logicalType.getPhysicalType()} {} const ConstantCompression constant; const Uncompressed uncompressed; const BooleanBitpacking booleanBitpacking; diff --git a/src/include/storage/index/hash_index.h b/src/include/storage/index/hash_index.h index 8d9f11ead39..74d245dca7f 100644 --- a/src/include/storage/index/hash_index.h +++ b/src/include/storage/index/hash_index.h @@ -72,8 +72,8 @@ class HashIndex final : public OnDiskHashIndex { inline BMFileHandle* getFileHandle() const { return fileHandle.get(); } private: - bool lookupInPersistentIndex( - transaction::TransactionType trxType, Key key, common::offset_t& result); + bool lookupInPersistentIndex(transaction::TransactionType trxType, Key key, + common::offset_t& result); // The following two functions are only used in prepareCommit, and are not thread-safe. void insertIntoPersistentIndex(Key key, common::offset_t value); void deleteFromPersistentIndex(Key key); @@ -102,13 +102,13 @@ class HashIndex final : public OnDiskHashIndex { } void rehashSlots(HashIndexHeader& header); - inline bool equals( - transaction::TransactionType /*trxType*/, Key keyToLookup, const T& keyInEntry) const { + inline bool equals(transaction::TransactionType /*trxType*/, Key keyToLookup, + const T& keyInEntry) const { return keyToLookup == keyInEntry; } template - void copyAndUpdateSlotHeader( - Slot& slot, entry_pos_t entryPos, K key, common::offset_t value, uint8_t fingerprint) { + void copyAndUpdateSlotHeader(Slot& slot, entry_pos_t entryPos, K key, common::offset_t value, + uint8_t fingerprint) { if constexpr (isCopyEntry) { slot.entries[entryPos].copyFrom((uint8_t*)&key); } else { @@ -160,8 +160,8 @@ class HashIndex final : public OnDiskHashIndex { } else { for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (!slot.header.isEntryValid(entryPos)) { - copyAndUpdateSlotHeader( - slot, entryPos, key, value, fingerprint); + copyAndUpdateSlotHeader(slot, entryPos, key, value, + fingerprint); break; } } @@ -190,8 +190,8 @@ class HashIndex final : public OnDiskHashIndex { }; template<> -common::hash_t HashIndex::hashStored( - transaction::TransactionType trxType, const common::ku_string_t& key) const; +common::hash_t HashIndex::hashStored(transaction::TransactionType trxType, + const common::ku_string_t& key) const; template<> inline bool HashIndex::equals(transaction::TransactionType trxType, @@ -215,8 +215,8 @@ class PrimaryKeyIndex { hashIndices[HashIndexUtils::getHashIndexPosition(key)].get()); } - inline bool lookup( - transaction::Transaction* trx, common::ku_string_t key, common::offset_t& result) { + inline bool lookup(transaction::Transaction* trx, common::ku_string_t key, + common::offset_t& result) { return lookup(trx, key.getAsStringView(), result); } template diff --git a/src/include/storage/index/hash_index_builder.h b/src/include/storage/index/hash_index_builder.h index c498942309f..9a7ca5195a9 100644 --- a/src/include/storage/index/hash_index_builder.h +++ b/src/include/storage/index/hash_index_builder.h @@ -99,8 +99,8 @@ class HashIndexBuilder final : public InMemHashIndex { return keyToLookup == keyInEntry; } - inline void insert( - Key key, Slot* slot, uint8_t entryPos, common::offset_t value, uint8_t fingerprint) { + inline void insert(Key key, Slot* slot, uint8_t entryPos, common::offset_t value, + uint8_t fingerprint) { auto& entry = slot->entries[entryPos]; entry.key = key; entry.value = value; @@ -108,8 +108,8 @@ class HashIndexBuilder final : public InMemHashIndex { KU_ASSERT(HashIndexUtils::getFingerprintForHash(HashIndexUtils::hash(key)) == fingerprint); } void copy(const uint8_t* oldEntry, slot_id_t newSlotId, uint8_t fingerprint); - void insertToNewOvfSlot( - Key key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint); + void insertToNewOvfSlot(Key key, Slot* previousSlot, common::offset_t offset, + uint8_t fingerprint); common::hash_t hashStored(const T& key) const; struct SlotIterator { @@ -139,8 +139,8 @@ class HashIndexBuilder final : public InMemHashIndex { }; template<> -bool HashIndexBuilder::equals( - std::string_view keyToLookup, const common::ku_string_t& keyInEntry) const; +bool HashIndexBuilder::equals(std::string_view keyToLookup, + const common::ku_string_t& keyInEntry) const; class PrimaryKeyIndexBuilder { public: diff --git a/src/include/storage/index/hash_index_utils.h b/src/include/storage/index/hash_index_utils.h index ff901d36af5..f36865b0708 100644 --- a/src/include/storage/index/hash_index_utils.h +++ b/src/include/storage/index/hash_index_utils.h @@ -29,10 +29,10 @@ struct SlotInfo { class HashIndexUtils { public: - inline static bool areStringPrefixAndLenEqual( - std::string_view keyToLookup, const common::ku_string_t& keyInEntry) { - auto prefixLen = std::min( - (uint64_t)keyInEntry.len, static_cast(common::ku_string_t::PREFIX_LENGTH)); + inline static bool areStringPrefixAndLenEqual(std::string_view keyToLookup, + const common::ku_string_t& keyInEntry) { + auto prefixLen = std::min((uint64_t)keyInEntry.len, + static_cast(common::ku_string_t::PREFIX_LENGTH)); return keyToLookup.length() == keyInEntry.len && memcmp(keyToLookup.data(), keyInEntry.prefix, prefixLen) == 0; } @@ -49,8 +49,8 @@ class HashIndexUtils { return (hash >> (64 - NUM_HASH_INDEXES_LOG2 - 8)) & 255; } - inline static slot_id_t getPrimarySlotIdForHash( - const HashIndexHeader& indexHeader, common::hash_t hash) { + inline static slot_id_t getPrimarySlotIdForHash(const HashIndexHeader& indexHeader, + common::hash_t hash) { auto slotId = hash & indexHeader.levelHashMask; if (slotId < indexHeader.nextSplitSlotId) { slotId = hash & indexHeader.higherLevelHashMask; @@ -62,8 +62,8 @@ class HashIndexUtils { return (HashIndexUtils::hash(key) >> (64 - NUM_HASH_INDEXES_LOG2)) & (NUM_HASH_INDEXES - 1); } - static inline uint64_t getNumRequiredEntries( - uint64_t numExistingEntries, uint64_t numNewEntries) { + static inline uint64_t getNumRequiredEntries(uint64_t numExistingEntries, + uint64_t numNewEntries) { return ceil((double)(numExistingEntries + numNewEntries) * common::DEFAULT_HT_LOAD_FACTOR); } }; diff --git a/src/include/storage/local_storage/local_node_table.h b/src/include/storage/local_storage/local_node_table.h index 5d683480f37..ed39c51db62 100644 --- a/src/include/storage/local_storage/local_node_table.h +++ b/src/include/storage/local_storage/local_node_table.h @@ -10,8 +10,8 @@ namespace storage { class LocalNodeNG final : public LocalNodeGroup { public: - LocalNodeNG( - common::offset_t nodeGroupStartOffset, const std::vector& dataTypes) + LocalNodeNG(common::offset_t nodeGroupStartOffset, + const std::vector& dataTypes) : LocalNodeGroup{nodeGroupStartOffset, dataTypes} {} DELETE_COPY_DEFAULT_MOVE(LocalNodeNG); @@ -24,8 +24,8 @@ class LocalNodeNG final : public LocalNodeGroup { std::vector propertyVectors) override; bool update(std::vector nodeIDVectors, common::column_id_t columnID, common::ValueVector* propertyVector) override; - bool delete_( - common::ValueVector* nodeIDVector, common::ValueVector* /*extraVector*/ = nullptr) override; + bool delete_(common::ValueVector* nodeIDVector, + common::ValueVector* /*extraVector*/ = nullptr) override; inline const offset_to_row_idx_t& getInsertInfoRef() const { return insertChunks.getOffsetToRowIdx(); diff --git a/src/include/storage/local_storage/local_rel_table.h b/src/include/storage/local_storage/local_rel_table.h index c8b7dd2e9ea..1b8b003e4ef 100644 --- a/src/include/storage/local_storage/local_rel_table.h +++ b/src/include/storage/local_storage/local_rel_table.h @@ -34,8 +34,8 @@ class LocalRelNG final : public LocalNodeGroup { bool delete_(common::ValueVector* srcNodeVector, common::ValueVector* relIDVector) override; common::offset_t getNumInsertedRels(common::offset_t srcOffset) const; - void getChangesPerCSRSegment( - std::vector& sizeChangesPerSegment, std::vector& hasChangesPerSegment); + void getChangesPerCSRSegment(std::vector& sizeChangesPerSegment, + std::vector& hasChangesPerSegment); private: static common::vector_idx_t getSegmentIdx(common::offset_t offset) { diff --git a/src/include/storage/local_storage/local_storage.h b/src/include/storage/local_storage/local_storage.h index 2b31309fb61..c02c4809b27 100644 --- a/src/include/storage/local_storage/local_storage.h +++ b/src/include/storage/local_storage/local_storage.h @@ -22,8 +22,8 @@ class LocalStorage { explicit LocalStorage(main::ClientContext& clientContext) : clientContext{clientContext} {} DELETE_COPY_AND_MOVE(LocalStorage); - LocalTable* getLocalTable( - common::table_id_t tableID, NotExistAction action = NotExistAction::RETURN_NULL); + LocalTable* getLocalTable(common::table_id_t tableID, + NotExistAction action = NotExistAction::RETURN_NULL); void prepareCommit(); void prepareRollback(); diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index 39bd2defeb7..1d0aa0f7611 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -51,8 +51,8 @@ class LocalChunkedGroupCollection { } inline const offset_to_row_idx_t& getOffsetToRowIdx() const { return offsetToRowIdx; } - void appendChunkedGroup( - ColumnChunk* srcOffsetChunk, std::unique_ptr chunkedGroup); + void appendChunkedGroup(ColumnChunk* srcOffsetChunk, + std::unique_ptr chunkedGroup); bool isEmpty() const { return offsetToRowIdx.empty() && srcNodeOffsetToRelOffsets.empty(); } void readValueAtRowIdx(common::row_idx_t rowIdx, common::column_id_t columnID, @@ -69,8 +69,8 @@ class LocalChunkedGroupCollection { append(relOffset, vectors); srcNodeOffsetToRelOffsets[nodeOffset].push_back(relOffset); } - void update( - common::offset_t offset, common::column_id_t columnID, common::ValueVector* propertyVector); + void update(common::offset_t offset, common::column_id_t columnID, + common::ValueVector* propertyVector); void remove(common::offset_t offset) { if (offsetToRowIdx.contains(offset)) { offsetToRowIdx.erase(offset); @@ -140,8 +140,8 @@ class LocalDeletionInfo { class LocalNodeGroup { public: - LocalNodeGroup( - common::offset_t nodeGroupStartOffset, const std::vector& dataTypes); + LocalNodeGroup(common::offset_t nodeGroupStartOffset, + const std::vector& dataTypes); DELETE_COPY_DEFAULT_MOVE(LocalNodeGroup); virtual ~LocalNodeGroup() = default; diff --git a/src/include/storage/stats/nodes_store_statistics.h b/src/include/storage/stats/nodes_store_statistics.h index d96f47d07f9..5e0cf9cd1f1 100644 --- a/src/include/storage/stats/nodes_store_statistics.h +++ b/src/include/storage/stats/nodes_store_statistics.h @@ -15,8 +15,8 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { // Should only be used by saveInitialNodesStatisticsAndDeletedIDsToFile to start a database // from an empty directory. explicit NodesStoreStatsAndDeletedIDs(common::VirtualFileSystem* vfs) - : TablesStatistics{ - nullptr /* metadataFH */, nullptr /* bufferManager */, nullptr /* wal */, vfs} {}; + : TablesStatistics{nullptr /* metadataFH */, nullptr /* bufferManager */, nullptr /* wal */, + vfs} {}; // Should be used when an already loaded database is started from a directory. NodesStoreStatsAndDeletedIDs(BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, common::VirtualFileSystem* vfs, @@ -30,16 +30,16 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { return getNodeTableStats(transaction->getType(), tableID); } - static inline void saveInitialNodesStatisticsAndDeletedIDsToFile( - common::VirtualFileSystem* vfs, const std::string& directory) { - std::make_unique(vfs)->saveToFile( - directory, common::FileVersionType::ORIGINAL, transaction::TransactionType::READ_ONLY); + static inline void saveInitialNodesStatisticsAndDeletedIDsToFile(common::VirtualFileSystem* vfs, + const std::string& directory) { + std::make_unique(vfs)->saveToFile(directory, + common::FileVersionType::ORIGINAL, transaction::TransactionType::READ_ONLY); } void updateNumTuplesByValue(common::table_id_t tableID, int64_t value) override; - common::offset_t getMaxNodeOffset( - transaction::Transaction* transaction, common::table_id_t tableID); + common::offset_t getMaxNodeOffset(transaction::Transaction* transaction, + common::table_id_t tableID); // This function is only used for testing purpose. inline uint32_t getNumNodeStatisticsAndDeleteIDsPerTable() const { @@ -78,8 +78,8 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { protected: inline std::unique_ptr constructTableStatistic( catalog::TableCatalogEntry* tableEntry) override { - return std::make_unique( - metadataFH, *tableEntry, bufferManager, wal); + return std::make_unique(metadataFH, *tableEntry, bufferManager, + wal); } inline std::unique_ptr constructTableStatistic( @@ -88,8 +88,8 @@ class NodesStoreStatsAndDeletedIDs : public TablesStatistics { *(NodeTableStatsAndDeletedIDs*)tableStatistics); } - inline std::string getTableStatisticsFilePath( - const std::string& directory, common::FileVersionType dbFileType) override { + inline std::string getTableStatisticsFilePath(const std::string& directory, + common::FileVersionType dbFileType) override { return StorageUtils::getNodesStatisticsAndDeletedIDsFilePath(vfs, directory, dbFileType); } diff --git a/src/include/storage/stats/rel_table_statistics.h b/src/include/storage/stats/rel_table_statistics.h index 7249688006b..561b37b35fd 100644 --- a/src/include/storage/stats/rel_table_statistics.h +++ b/src/include/storage/stats/rel_table_statistics.h @@ -14,8 +14,8 @@ class RelTableStats : public TableStatistics { RelTableStats(BMFileHandle* metadataFH, const catalog::TableCatalogEntry& tableEntry, BufferManager* bufferManager, WAL* wal); RelTableStats(uint64_t numRels, common::table_id_t tableID, common::offset_t nextRelOffset) - : TableStatistics{common::TableType::REL, numRels, tableID, {}}, nextRelOffset{ - nextRelOffset} {} + : TableStatistics{common::TableType::REL, numRels, tableID, {}}, + nextRelOffset{nextRelOffset} {} RelTableStats(uint64_t numRels, common::table_id_t tableID, std::unordered_map>&& propertyStats, @@ -28,13 +28,13 @@ class RelTableStats : public TableStatistics { inline common::offset_t getNextRelOffset() const { return nextRelOffset; } inline void incrementNextRelOffset(uint64_t numTuples) { nextRelOffset += numTuples; } - inline void addMetadataDAHInfoForColumn( - std::unique_ptr metadataDAHInfo, common::RelDataDirection direction) { + inline void addMetadataDAHInfoForColumn(std::unique_ptr metadataDAHInfo, + common::RelDataDirection direction) { auto& metadataDAHInfos = getDirectedMetadataDAHInfosRef(direction); metadataDAHInfos.push_back(std::move(metadataDAHInfo)); } - inline void removeMetadataDAHInfoForColumn( - common::column_id_t columnID, common::RelDataDirection direction) { + inline void removeMetadataDAHInfoForColumn(common::column_id_t columnID, + common::RelDataDirection direction) { auto& metadataDAHInfos = getDirectedMetadataDAHInfosRef(direction); KU_ASSERT(columnID < metadataDAHInfos.size()); metadataDAHInfos.erase(metadataDAHInfos.begin() + columnID); @@ -47,16 +47,16 @@ class RelTableStats : public TableStatistics { return direction == common::RelDataDirection::FWD ? fwdCSRLengthMetadataDAHInfo.get() : bwdCSRLengthMetadataDAHInfo.get(); } - inline MetadataDAHInfo* getColumnMetadataDAHInfo( - common::column_id_t columnID, common::RelDataDirection direction) { + inline MetadataDAHInfo* getColumnMetadataDAHInfo(common::column_id_t columnID, + common::RelDataDirection direction) { auto& metadataDAHInfos = getDirectedMetadataDAHInfosRef(direction); KU_ASSERT(columnID < metadataDAHInfos.size()); return metadataDAHInfos[columnID].get(); } void serializeInternal(common::Serializer& serializer) final; - static std::unique_ptr deserialize( - uint64_t numRels, common::table_id_t tableID, common::Deserializer& deserializer); + static std::unique_ptr deserialize(uint64_t numRels, common::table_id_t tableID, + common::Deserializer& deserializer); inline std::unique_ptr copy() final { return std::make_unique(*this); diff --git a/src/include/storage/stats/rels_store_statistics.h b/src/include/storage/stats/rels_store_statistics.h index 7da2cc25ab2..2012b9c2a54 100644 --- a/src/include/storage/stats/rels_store_statistics.h +++ b/src/include/storage/stats/rels_store_statistics.h @@ -13,20 +13,20 @@ class RelsStoreStats : public TablesStatistics { // Should only be used by saveInitialRelsStatisticsToFile to start a database from an empty // directory. explicit RelsStoreStats(common::VirtualFileSystem* vfs) - : TablesStatistics{ - nullptr /* metadataFH */, nullptr /* bufferManager */, nullptr /* wal */, vfs} {}; + : TablesStatistics{nullptr /* metadataFH */, nullptr /* bufferManager */, nullptr /* wal */, + vfs} {}; // Should be used when an already loaded database is started from a directory. RelsStoreStats(BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, common::VirtualFileSystem* vfs); - static inline void saveInitialRelsStatisticsToFile( - common::VirtualFileSystem* vfs, const std::string& directory) { - std::make_unique(vfs)->saveToFile( - directory, common::FileVersionType::ORIGINAL, transaction::TransactionType::READ_ONLY); + static inline void saveInitialRelsStatisticsToFile(common::VirtualFileSystem* vfs, + const std::string& directory) { + std::make_unique(vfs)->saveToFile(directory, + common::FileVersionType::ORIGINAL, transaction::TransactionType::READ_ONLY); } - inline RelTableStats* getRelStatistics( - common::table_id_t tableID, transaction::Transaction* transaction) const { + inline RelTableStats* getRelStatistics(common::table_id_t tableID, + transaction::Transaction* transaction) const { auto& tableStatisticPerTable = transaction->getType() == transaction::TransactionType::READ_ONLY ? readOnlyVersion->tableStatisticPerTable : @@ -37,8 +37,8 @@ class RelsStoreStats : public TablesStatistics { void updateNumTuplesByValue(common::table_id_t relTableID, int64_t value) override; - common::offset_t getNextRelOffset( - transaction::Transaction* transaction, common::table_id_t tableID); + common::offset_t getNextRelOffset(transaction::Transaction* transaction, + common::table_id_t tableID); void addMetadataDAHInfo(common::table_id_t tableID, const common::LogicalType& dataType); void removeMetadataDAHInfo(common::table_id_t tableID, common::column_id_t columnID); @@ -61,8 +61,8 @@ class RelsStoreStats : public TablesStatistics { return std::make_unique(*(RelTableStats*)tableStatistics); } - inline std::string getTableStatisticsFilePath( - const std::string& directory, common::FileVersionType dbFileType) override { + inline std::string getTableStatisticsFilePath(const std::string& directory, + common::FileVersionType dbFileType) override { return StorageUtils::getRelsStatisticsFilePath(vfs, directory, dbFileType); } diff --git a/src/include/storage/stats/table_statistics.h b/src/include/storage/stats/table_statistics.h index 9ba30f56e2b..319a01d13c2 100644 --- a/src/include/storage/stats/table_statistics.h +++ b/src/include/storage/stats/table_statistics.h @@ -35,8 +35,8 @@ class TableStatistics { KU_ASSERT(propertyStatistics.contains(propertyID)); return *(propertyStatistics.at(propertyID)); } - inline void setPropertyStatistics( - common::property_id_t propertyID, PropertyStatistics newStats) { + inline void setPropertyStatistics(common::property_id_t propertyID, + PropertyStatistics newStats) { propertyStatistics[propertyID] = std::make_unique(newStats); } diff --git a/src/include/storage/stats/table_statistics_collection.h b/src/include/storage/stats/table_statistics_collection.h index f80eee113e8..6e834ef5df6 100644 --- a/src/include/storage/stats/table_statistics_collection.h +++ b/src/include/storage/stats/table_statistics_collection.h @@ -30,8 +30,8 @@ class TablesStatistics { virtual void updateNumTuplesByValue(common::table_id_t tableID, int64_t value) = 0; inline void writeTablesStatisticsFileForWALRecord(const std::string& directory) { - saveToFile( - directory, common::FileVersionType::WAL_VERSION, transaction::TransactionType::WRITE); + saveToFile(directory, common::FileVersionType::WAL_VERSION, + transaction::TransactionType::WRITE); } inline bool hasUpdates() const { return isUpdated; } @@ -60,8 +60,8 @@ class TablesStatistics { readOnlyVersion->tableStatisticPerTable.erase(tableID); } - inline uint64_t getNumTuplesForTable( - transaction::Transaction* transaction, common::table_id_t tableID) { + inline uint64_t getNumTuplesForTable(transaction::Transaction* transaction, + common::table_id_t tableID) { if (transaction->isWriteTransaction()) { initTableStatisticsForWriteTrx(); KU_ASSERT(readWriteVersion->tableStatisticPerTable.contains(tableID)); @@ -74,8 +74,8 @@ class TablesStatistics { PropertyStatistics& getPropertyStatisticsForTable(const transaction::Transaction& transaction, common::table_id_t tableID, common::property_id_t propertyID); - void setPropertyStatisticsForTable( - common::table_id_t tableID, common::property_id_t propertyID, PropertyStatistics stats); + void setPropertyStatisticsForTable(common::table_id_t tableID, common::property_id_t propertyID, + PropertyStatistics stats); static std::unique_ptr createMetadataDAHInfo( const common::LogicalType& dataType, BMFileHandle& metadataFH, BufferManager* bm, WAL* wal); @@ -89,8 +89,8 @@ class TablesStatistics { virtual std::unique_ptr constructTableStatistic( TableStatistics* tableStatistics) = 0; - virtual std::string getTableStatisticsFilePath( - const std::string& directory, common::FileVersionType dbFileType) = 0; + virtual std::string getTableStatisticsFilePath(const std::string& directory, + common::FileVersionType dbFileType) = 0; const TablesStatisticsContent* getVersion(transaction::TransactionType type) const { return type == transaction::TransactionType::READ_ONLY ? readOnlyVersion.get() : diff --git a/src/include/storage/storage_extension.h b/src/include/storage/storage_extension.h index 99aca94d3d1..9502e85ac01 100644 --- a/src/include/storage/storage_extension.h +++ b/src/include/storage/storage_extension.h @@ -5,8 +5,8 @@ namespace kuzu { namespace storage { -using attach_function_t = std::unique_ptr (*)( - std::string dbPath, std::string dbName, main::ClientContext* clientContext); +using attach_function_t = std::unique_ptr (*)(std::string dbPath, + std::string dbName, main::ClientContext* clientContext); class StorageExtension { public: @@ -14,8 +14,8 @@ class StorageExtension { : attachFunction{std::move(attachFunction)} {} virtual bool canHandleDB(std::string /*dbType*/) const { return false; } - std::unique_ptr attach( - std::string dbPath, std::string dbName, main::ClientContext* clientContext) const { + std::unique_ptr attach(std::string dbPath, std::string dbName, + main::ClientContext* clientContext) const { return attachFunction(dbPath, dbName, clientContext); } diff --git a/src/include/storage/storage_structure/disk_array.h b/src/include/storage/storage_structure/disk_array.h index 2bc07eb9093..5770f89bb1c 100644 --- a/src/include/storage/storage_structure/disk_array.h +++ b/src/include/storage/storage_structure/disk_array.h @@ -102,8 +102,8 @@ struct PIPUpdates { class BaseDiskArrayInternal { public: // Used by copiers. - BaseDiskArrayInternal( - FileHandle& fileHandle, common::page_idx_t headerPageIdx, uint64_t elementSize); + BaseDiskArrayInternal(FileHandle& fileHandle, common::page_idx_t headerPageIdx, + uint64_t elementSize); // Used when loading from file BaseDiskArrayInternal(FileHandle& fileHandle, DBFileID dbFileID, common::page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, @@ -256,8 +256,8 @@ class BaseDiskArray { class BaseInMemDiskArray : public BaseDiskArrayInternal { protected: - BaseInMemDiskArray( - FileHandle& fileHandle, common::page_idx_t headerPageIdx, uint64_t elementSize); + BaseInMemDiskArray(FileHandle& fileHandle, common::page_idx_t headerPageIdx, + uint64_t elementSize); BaseInMemDiskArray(FileHandle& fileHandle, DBFileID dbFileID, common::page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction); @@ -293,8 +293,8 @@ class InMemDiskArray : public BaseDiskArray { InMemDiskArray(FileHandle& fileHandle, DBFileID dbFileID, common::page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, transaction::Transaction* transaction) : BaseDiskArray(fileHandle, dbFileID, headerPageIdx, bufferManager, wal, transaction) {} - static inline common::page_idx_t addDAHPageToFile( - BMFileHandle& fileHandle, BufferManager* bufferManager, WAL* wal) { + static inline common::page_idx_t addDAHPageToFile(BMFileHandle& fileHandle, + BufferManager* bufferManager, WAL* wal) { DiskArrayHeader daHeader(sizeof(U)); return DBFileUtils::insertNewPage(fileHandle, DBFileID{DBFileType::METADATA}, *bufferManager, *wal, diff --git a/src/include/storage/storage_structure/overflow_file.h b/src/include/storage/storage_structure/overflow_file.h index 78e803cc810..10c9666a014 100644 --- a/src/include/storage/storage_structure/overflow_file.h +++ b/src/include/storage/storage_structure/overflow_file.h @@ -53,8 +53,8 @@ class OverflowFileHandle { private: uint8_t* addANewPage(); - void setStringOverflow( - const char* inMemSrcStr, uint64_t len, common::ku_string_t& diskDstString); + void setStringOverflow(const char* inMemSrcStr, uint64_t len, + common::ku_string_t& diskDstString); inline void read(transaction::TransactionType trxType, common::page_idx_t pageIdx, const std::function& func) const; @@ -93,8 +93,8 @@ class OverflowFile { // For creating an overflow file from scratch OverflowFile(const std::string& fName, common::VirtualFileSystem* vfs) - : numPagesOnDisk{0}, fileHandle{std::make_unique( - fName, FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs)}, + : numPagesOnDisk{0}, fileHandle{std::make_unique(fName, + FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs)}, bufferManager{nullptr}, wal{nullptr}, pageCounter{0}, headerChanged{true} { // Reserve a page for the header getNewPageIdx(); diff --git a/src/include/storage/storage_utils.h b/src/include/storage/storage_utils.h index 804541f056a..5fe68a7a6fe 100644 --- a/src/include/storage/storage_utils.h +++ b/src/include/storage/storage_utils.h @@ -79,8 +79,8 @@ class StorageUtils { return std::ceil((double)v1 / (double)v2); } - static std::string getColumnName( - const std::string& propertyName, ColumnType type, const std::string& prefix); + static std::string getColumnName(const std::string& propertyName, ColumnType type, + const std::string& prefix); static inline common::offset_t getStartOffsetOfNodeGroup( common::node_group_idx_t nodeGroupIdx) { @@ -100,42 +100,42 @@ class StorageUtils { const std::string& directory, const common::table_id_t& tableID, common::FileVersionType dbFileType); - static inline std::string getDataFName( - common::VirtualFileSystem* vfs, const std::string& directory) { + static inline std::string getDataFName(common::VirtualFileSystem* vfs, + const std::string& directory) { return vfs->joinPath(directory, common::StorageConstants::DATA_FILE_NAME); } - static inline std::string getMetadataFName( - common::VirtualFileSystem* vfs, const std::string& directory) { + static inline std::string getMetadataFName(common::VirtualFileSystem* vfs, + const std::string& directory) { return vfs->joinPath(directory, common::StorageConstants::METADATA_FILE_NAME); } - static inline DBFileIDAndName getNodeIndexIDAndFName( - common::VirtualFileSystem* vfs, const std::string& directory, common::table_id_t tableID) { + static inline DBFileIDAndName getNodeIndexIDAndFName(common::VirtualFileSystem* vfs, + const std::string& directory, common::table_id_t tableID) { auto fName = getNodeIndexFName(vfs, directory, tableID, common::FileVersionType::ORIGINAL); return {DBFileID::newPKIndexFileID(tableID), fName}; } static inline std::string getOverflowFileName(const std::string& fName) { - return appendSuffixOrInsertBeforeWALSuffix( - fName, common::StorageConstants::OVERFLOW_FILE_SUFFIX); + return appendSuffixOrInsertBeforeWALSuffix(fName, + common::StorageConstants::OVERFLOW_FILE_SUFFIX); } static inline std::string getNodesStatisticsAndDeletedIDsFilePath( common::VirtualFileSystem* vfs, const std::string& directory, common::FileVersionType dbFileType) { - return vfs->joinPath( - directory, dbFileType == common::FileVersionType::ORIGINAL ? - common::StorageConstants::NODES_STATISTICS_AND_DELETED_IDS_FILE_NAME : - common::StorageConstants::NODES_STATISTICS_FILE_NAME_FOR_WAL); + return vfs->joinPath(directory, + dbFileType == common::FileVersionType::ORIGINAL ? + common::StorageConstants::NODES_STATISTICS_AND_DELETED_IDS_FILE_NAME : + common::StorageConstants::NODES_STATISTICS_FILE_NAME_FOR_WAL); } static inline std::string getRelsStatisticsFilePath(common::VirtualFileSystem* vfs, const std::string& directory, common::FileVersionType dbFileType) { - return vfs->joinPath( - directory, dbFileType == common::FileVersionType::ORIGINAL ? - common::StorageConstants::RELS_METADATA_FILE_NAME : - common::StorageConstants::RELS_METADATA_FILE_NAME_FOR_WAL); + return vfs->joinPath(directory, + dbFileType == common::FileVersionType::ORIGINAL ? + common::StorageConstants::RELS_METADATA_FILE_NAME : + common::StorageConstants::RELS_METADATA_FILE_NAME_FOR_WAL); } static inline std::string getCatalogFilePath(common::VirtualFileSystem* vfs, @@ -145,8 +145,8 @@ class StorageUtils { common::StorageConstants::CATALOG_FILE_NAME_FOR_WAL); } - static inline std::string getLockFilePath( - common::VirtualFileSystem* vfs, const std::string& directory) { + static inline std::string getLockFilePath(common::VirtualFileSystem* vfs, + const std::string& directory) { return vfs->joinPath(directory, common::StorageConstants::LOCK_FILE_NAME); } @@ -164,8 +164,8 @@ class StorageUtils { } } - static inline std::string appendWALFileSuffixIfNecessary( - const std::string& fileName, common::FileVersionType fileVersionType) { + static inline std::string appendWALFileSuffixIfNecessary(const std::string& fileName, + common::FileVersionType fileVersionType) { return fileVersionType == common::FileVersionType::WAL_VERSION ? appendWALFileSuffix(fileName) : fileName; @@ -176,15 +176,15 @@ class StorageUtils { return fileName + common::StorageConstants::WAL_FILE_SUFFIX; } - static std::unique_ptr getFileInfoForReadWrite( - const std::string& directory, DBFileID dbFileID, common::VirtualFileSystem* vfs); + static std::unique_ptr getFileInfoForReadWrite(const std::string& directory, + DBFileID dbFileID, common::VirtualFileSystem* vfs); static uint32_t getDataTypeSize(const common::LogicalType& type); static uint32_t getDataTypeSize(common::PhysicalTypeID type); private: - static std::string appendSuffixOrInsertBeforeWALSuffix( - const std::string& fileName, const std::string& suffix); + static std::string appendSuffixOrInsertBeforeWALSuffix(const std::string& fileName, + const std::string& suffix); }; } // namespace storage diff --git a/src/include/storage/store/chunked_node_group.h b/src/include/storage/store/chunked_node_group.h index e1b640a27d4..3ce4e8c6fcc 100644 --- a/src/include/storage/store/chunked_node_group.h +++ b/src/include/storage/store/chunked_node_group.h @@ -41,8 +41,8 @@ class ChunkedNodeGroup { uint64_t append(const std::vector& columnVectors, common::SelectionVector& selVector, uint64_t numValuesToAppend); common::offset_t append(ChunkedNodeGroup* other, common::offset_t offsetInOtherNodeGroup); - void write( - const std::vector>& data, common::column_id_t offsetColumnID); + void write(const std::vector>& data, + common::column_id_t offsetColumnID); void write(const ChunkedNodeGroup& data, common::column_id_t offsetColumnID); void finalize(uint64_t nodeGroupIdx_); @@ -66,8 +66,8 @@ struct ChunkedCSRHeader { std::unique_ptr length; ChunkedCSRHeader() {} - explicit ChunkedCSRHeader( - bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE); + explicit ChunkedCSRHeader(bool enableCompression, + uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE); DELETE_COPY_DEFAULT_MOVE(ChunkedCSRHeader); common::offset_t getStartCSROffset(common::offset_t nodeOffset) const; @@ -85,8 +85,8 @@ struct ChunkedCSRHeader { class ChunkedCSRNodeGroup : public ChunkedNodeGroup { public: - ChunkedCSRNodeGroup( - const std::vector& columnTypes, bool enableCompression); + ChunkedCSRNodeGroup(const std::vector& columnTypes, + bool enableCompression); DELETE_COPY_DEFAULT_MOVE(ChunkedCSRNodeGroup); ChunkedCSRHeader& getCSRHeader() { return csrHeader; } diff --git a/src/include/storage/store/chunked_node_group_collection.h b/src/include/storage/store/chunked_node_group_collection.h index 29bb45ae728..6a2a8180b29 100644 --- a/src/include/storage/store/chunked_node_group_collection.h +++ b/src/include/storage/store/chunked_node_group_collection.h @@ -30,8 +30,8 @@ class ChunkedNodeGroupCollection { return chunkedGroups[groupIdx].get(); } - void append( - const std::vector& vectors, const common::SelectionVector& selVector); + void append(const std::vector& vectors, + const common::SelectionVector& selVector); void merge(std::unique_ptr chunkedGroup); void merge(ChunkedNodeGroupCollection& other); diff --git a/src/include/storage/store/column.h b/src/include/storage/store/column.h index 4ef9eace434..80b751074e5 100644 --- a/src/include/storage/store/column.h +++ b/src/include/storage/store/column.h @@ -90,8 +90,8 @@ class Column { void populateWithDefaultVal(transaction::Transaction* transaction, InMemDiskArray* metadataDA, common::ValueVector* defaultValueVector); - inline ColumnChunkMetadata getMetadata( - common::node_group_idx_t nodeGroupIdx, transaction::TransactionType transaction) const { + inline ColumnChunkMetadata getMetadata(common::node_group_idx_t nodeGroupIdx, + transaction::TransactionType transaction) const { return metadataDA->get(nodeGroupIdx, transaction); } inline InMemDiskArray* getMetadataDA() const { return metadataDA.get(); } @@ -109,11 +109,11 @@ class Column { ColumnChunk* data, common::offset_t dataOffset, common::length_t numValues); // Append values to the end of the node group, resizing it if necessary - common::offset_t appendValues( - common::node_group_idx_t nodeGroupIdx, const uint8_t* data, common::offset_t numValues); + common::offset_t appendValues(common::node_group_idx_t nodeGroupIdx, const uint8_t* data, + common::offset_t numValues); - ReadState getReadState( - transaction::TransactionType transactionType, common::node_group_idx_t nodeGroupIdx) const; + ReadState getReadState(transaction::TransactionType transactionType, + common::node_group_idx_t nodeGroupIdx) const; virtual std::unique_ptr getEmptyChunkForCommit(uint64_t capacity); static void applyLocalChunkToColumnChunk(const ChunkCollection& localChunks, @@ -143,13 +143,13 @@ class Column { common::offset_t dataOffset = 0, common::offset_t numValues = 1); // Produces a page cursor for the offset relative to the given node group - PageCursor getPageCursorForOffsetInGroup( - common::offset_t offsetInChunk, const ReadState& state); + PageCursor getPageCursorForOffsetInGroup(common::offset_t offsetInChunk, + const ReadState& state); // Produces a page cursor for the absolute node offset PageCursor getPageCursorForOffset(transaction::TransactionType transactionType, common::node_group_idx_t nodeGroupIdx, common::offset_t offsetInChunk); - void updatePageWithCursor( - PageCursor cursor, const std::function& writeOp); + void updatePageWithCursor(PageCursor cursor, + const std::function& writeOp); inline common::offset_t getMaxOffset(const std::vector& offsets) { common::offset_t maxOffset = 0u; @@ -162,10 +162,10 @@ class Column { static ChunkCollection getNullChunkCollection(const ChunkCollection& chunkCollection); private: - bool isInsertionsOutOfPagesCapacity( - const ColumnChunkMetadata& metadata, const offset_to_row_idx_t& insertInfo); - bool isMaxOffsetOutOfPagesCapacity( - const ColumnChunkMetadata& metadata, common::offset_t maxOffset); + bool isInsertionsOutOfPagesCapacity(const ColumnChunkMetadata& metadata, + const offset_to_row_idx_t& insertInfo); + bool isMaxOffsetOutOfPagesCapacity(const ColumnChunkMetadata& metadata, + common::offset_t maxOffset); bool checkUpdateInPlace(const ColumnChunkMetadata& metadata, const ChunkCollection& localChunks, const offset_to_row_idx_t& writeInfo); virtual bool canCommitInPlace(transaction::Transaction* transaction, diff --git a/src/include/storage/store/column_chunk.h b/src/include/storage/store/column_chunk.h index eee12291358..19370792dbd 100644 --- a/src/include/storage/store/column_chunk.h +++ b/src/include/storage/store/column_chunk.h @@ -58,11 +58,11 @@ class ColumnChunk { virtual ColumnChunkMetadata getMetadataToFlush() const; virtual void append(common::ValueVector* vector, const common::SelectionVector& selVector); - virtual void append( - ColumnChunk* other, common::offset_t startPosInOtherChunk, uint32_t numValuesToAppend); + virtual void append(ColumnChunk* other, common::offset_t startPosInOtherChunk, + uint32_t numValuesToAppend); - ColumnChunkMetadata flushBuffer( - BMFileHandle* dataFH, common::page_idx_t startPageIdx, const ColumnChunkMetadata& metadata); + ColumnChunkMetadata flushBuffer(BMFileHandle* dataFH, common::page_idx_t startPageIdx, + const ColumnChunkMetadata& metadata); static inline common::page_idx_t getNumPagesForBytes(uint64_t numBytes) { return (numBytes + common::BufferPoolConstants::PAGE_4KB_SIZE - 1) / @@ -79,8 +79,8 @@ class ColumnChunk { // `offsetInVector`, we should flatten the vector to pos at `offsetInVector`. virtual void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk); - virtual void write( - ColumnChunk* chunk, ColumnChunk* offsetsInChunk, common::RelMultiplicity multiplicity); + virtual void write(ColumnChunk* chunk, ColumnChunk* offsetsInChunk, + common::RelMultiplicity multiplicity); virtual void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy); // TODO(Guodong): Used in `applyDeletionsToChunk`. Should unify with `write`. @@ -133,8 +133,8 @@ class ColumnChunk { std::unique_ptr buffer; std::unique_ptr nullChunk; uint64_t numValues; - std::function + std::function flushBufferFunction; std::function getMetadataFunction; @@ -170,8 +170,8 @@ class BoolColumnChunk : public ColumnChunk { void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) override; - void write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) final; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + common::RelMultiplicity multiplicity) final; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; }; @@ -179,8 +179,8 @@ class BoolColumnChunk : public ColumnChunk { class NullColumnChunk final : public BoolColumnChunk { public: explicit NullColumnChunk(uint64_t capacity, bool enableCompression) - : BoolColumnChunk(capacity, enableCompression, false /*hasNullChunk*/), mayHaveNullValue{ - false} {} + : BoolColumnChunk(capacity, enableCompression, false /*hasNullChunk*/), + mayHaveNullValue{false} {} // Maybe this should be combined with BoolColumnChunk if the only difference is these functions? inline bool isNull(common::offset_t pos) const { return getValue(pos); } void setNull(common::offset_t pos, bool isNull); @@ -202,8 +202,8 @@ class NullColumnChunk final : public BoolColumnChunk { inline void copyFromBuffer(uint64_t* srcBuffer, uint64_t srcOffset, uint64_t dstOffset, uint64_t numBits, bool invert = false) { - if (common::NullMask::copyNullMask( - srcBuffer, srcOffset, (uint64_t*)buffer.get(), dstOffset, numBits, invert)) { + if (common::NullMask::copyNullMask(srcBuffer, srcOffset, (uint64_t*)buffer.get(), dstOffset, + numBits, invert)) { mayHaveNullValue = true; } } @@ -227,8 +227,8 @@ struct ColumnChunkFactory { bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE, bool inMemory = false); - static std::unique_ptr createNullColumnChunk( - bool enableCompression, uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { + static std::unique_ptr createNullColumnChunk(bool enableCompression, + uint64_t capacity = common::StorageConstants::NODE_GROUP_SIZE) { return std::make_unique(capacity, enableCompression); } }; diff --git a/src/include/storage/store/dictionary_column.h b/src/include/storage/store/dictionary_column.h index d667d5c54d4..446de039eca 100644 --- a/src/include/storage/store/dictionary_column.h +++ b/src/include/storage/store/dictionary_column.h @@ -22,15 +22,15 @@ class DictionaryColumn { std::vector>& offsetsToScan, common::ValueVector* resultVector, const ColumnChunkMetadata& indexMeta); - DictionaryChunk::string_index_t append( - common::node_group_idx_t nodeGroupIdx, std::string_view val); + DictionaryChunk::string_index_t append(common::node_group_idx_t nodeGroupIdx, + std::string_view val); bool canCommitInPlace(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, uint64_t numNewStrings, uint64_t totalStringLengthToAdd); - uint64_t getNumValuesInOffsets( - transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx); + uint64_t getNumValuesInOffsets(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx); void prepareCommit(); void checkpointInMemory(); diff --git a/src/include/storage/store/list_column_chunk.h b/src/include/storage/store/list_column_chunk.h index 871a4616fff..c721f67089f 100644 --- a/src/include/storage/store/list_column_chunk.h +++ b/src/include/storage/store/list_column_chunk.h @@ -28,8 +28,8 @@ struct ListDataColumnChunk { class ListColumnChunk final : public ColumnChunk { public: - ListColumnChunk( - common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); + ListColumnChunk(common::LogicalType dataType, uint64_t capacity, bool enableCompression, + bool inMemory); inline ColumnChunk* getDataColumnChunk() const { return listDataColumnChunk->dataColumnChunk.get(); @@ -52,8 +52,8 @@ class ListColumnChunk final : public ColumnChunk { // Note: `write` assumes that no `append` will be called afterward. void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) override; - void write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) override; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + common::RelMultiplicity multiplicity) override; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, diff --git a/src/include/storage/store/node_table.h b/src/include/storage/store/node_table.h index c93eccc09f1..b3a16110634 100644 --- a/src/include/storage/store/node_table.h +++ b/src/include/storage/store/node_table.h @@ -19,8 +19,8 @@ struct NodeTableInsertState : public TableInsertState { NodeTableInsertState(common::ValueVector& nodeIDVector, const common::ValueVector& pkVector, const std::vector& propertyVectors) - : TableInsertState{std::move(propertyVectors)}, nodeIDVector{nodeIDVector}, pkVector{ - pkVector} {} + : TableInsertState{std::move(propertyVectors)}, nodeIDVector{nodeIDVector}, + pkVector{pkVector} {} }; struct NodeTableUpdateState : public TableUpdateState { @@ -35,8 +35,8 @@ struct NodeTableDeleteState : public TableDeleteState { const common::ValueVector& nodeIDVector; common::ValueVector& pkVector; - explicit NodeTableDeleteState( - const common::ValueVector& nodeIDVector, common::ValueVector& pkVector) + explicit NodeTableDeleteState(const common::ValueVector& nodeIDVector, + common::ValueVector& pkVector) : nodeIDVector{nodeIDVector}, pkVector{pkVector} {} }; @@ -55,8 +55,8 @@ class NodeTable final : public Table { tablesStatistics); return nodesStats->getMaxNodeOffset(transaction, tableID); } - void setSelVectorForDeletedOffsets( - transaction::Transaction* trx, common::ValueVector* vector) const { + void setSelVectorForDeletedOffsets(transaction::Transaction* trx, + common::ValueVector* vector) const { KU_ASSERT(vector->isSequential()); auto nodeStateCollection = common::ku_dynamic_cast( @@ -67,8 +67,8 @@ class NodeTable final : public Table { inline void initializeReadState(transaction::Transaction* transaction, std::vector columnIDs, const common::ValueVector& inNodeIDVector, TableReadState& readState) { - tableData->initializeReadState( - transaction, std::move(columnIDs), inNodeIDVector, *readState.dataReadState); + tableData->initializeReadState(transaction, std::move(columnIDs), inNodeIDVector, + *readState.dataReadState); } void read(transaction::Transaction* transaction, TableReadState& readState) override; @@ -108,8 +108,8 @@ class NodeTable final : public Table { private: void updatePK(transaction::Transaction* transaction, common::column_id_t columnID, const common::ValueVector& nodeIDVector, const common::ValueVector& pkVector); - void insertPK( - const common::ValueVector& nodeIDVector, const common::ValueVector& primaryKeyVector); + void insertPK(const common::ValueVector& nodeIDVector, + const common::ValueVector& primaryKeyVector); void scan(transaction::Transaction* transaction, TableReadState& readState); void lookup(transaction::Transaction* transaction, TableReadState& readState); diff --git a/src/include/storage/store/node_table_data.h b/src/include/storage/store/node_table_data.h index 5686af1b82a..218b5673a10 100644 --- a/src/include/storage/store/node_table_data.h +++ b/src/include/storage/store/node_table_data.h @@ -31,8 +31,8 @@ class NodeTableData final : public TableData { // Flush the nodeGroup to disk and update metadataDAs. void append(ChunkedNodeGroup* nodeGroup) override; - void prepareLocalTableToCommit( - transaction::Transaction* transaction, LocalTableData* localTable) override; + void prepareLocalTableToCommit(transaction::Transaction* transaction, + LocalTableData* localTable) override; inline common::node_group_idx_t getNumNodeGroups( transaction::Transaction* transaction) const override { diff --git a/src/include/storage/store/null_column.h b/src/include/storage/store/null_column.h index 8675e36d28c..11c6ccd5121 100644 --- a/src/include/storage/store/null_column.h +++ b/src/include/storage/store/null_column.h @@ -20,8 +20,8 @@ class NullColumn final : public Column { BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, Transaction* transaction, RWPropertyStats propertyStatistics, bool enableCompression); - void scan( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) override; + void scan(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) override; void scan(transaction::Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t startOffsetInGroup, offset_t endOffsetInGroup, ValueVector* resultVector, uint64_t offsetInVector) override; @@ -29,8 +29,8 @@ class NullColumn final : public Column { ColumnChunk* columnChunk, common::offset_t startOffset = 0, common::offset_t endOffset = common::INVALID_OFFSET) override; - void lookup( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) override; + void lookup(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) override; void append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) override; diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index 13bc233a988..5eb40b28b7f 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -54,8 +54,8 @@ struct RelTableDeleteState : public TableDeleteState { RelTableDeleteState(const common::ValueVector& srcNodeIDVector, const common::ValueVector& dstNodeIDVector, const common::ValueVector& relIDVector) - : srcNodeIDVector{srcNodeIDVector}, dstNodeIDVector{dstNodeIDVector}, relIDVector{ - relIDVector} {} + : srcNodeIDVector{srcNodeIDVector}, dstNodeIDVector{dstNodeIDVector}, + relIDVector{relIDVector} {} }; // TODO(Guodong): Should move inside RelTableDeleteState. diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index 131d351cba5..a3a254e3988 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -48,14 +48,14 @@ struct CSRHeaderColumns { offset->scan(transaction, nodeGroupIdx, chunks.offset.get()); length->scan(transaction, nodeGroupIdx, chunks.length.get()); } - inline void append( - const ChunkedCSRHeader& headerChunks, common::node_group_idx_t nodeGroupIdx) const { + inline void append(const ChunkedCSRHeader& headerChunks, + common::node_group_idx_t nodeGroupIdx) const { offset->append(headerChunks.offset.get(), nodeGroupIdx); length->append(headerChunks.length.get(), nodeGroupIdx); } - common::offset_t getNumNodes( - transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx) const; + common::offset_t getNumNodes(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx) const; }; // TODO(Guodong): Serialize the info to disk. This should be a config per node group. @@ -146,21 +146,21 @@ class RelTableData final : public TableData { bool delete_(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); - void checkRelMultiplicityConstraint( - transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector) const; - bool checkIfNodeHasRels( - transaction::Transaction* transaction, common::offset_t nodeOffset) const; + void checkRelMultiplicityConstraint(transaction::Transaction* transaction, + common::ValueVector* srcNodeIDVector) const; + bool checkIfNodeHasRels(transaction::Transaction* transaction, + common::offset_t nodeOffset) const; void append(ChunkedNodeGroup* nodeGroup) override; inline Column* getNbrIDColumn() const { return columns[NBR_ID_COLUMN_ID].get(); } inline Column* getCSROffsetColumn() const { return csrHeaderColumns.offset.get(); } inline Column* getCSRLengthColumn() const { return csrHeaderColumns.length.get(); } - bool isNewNodeGroup( - transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx) const; + bool isNewNodeGroup(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx) const; - void prepareLocalTableToCommit( - transaction::Transaction* transaction, LocalTableData* localTable) override; + void prepareLocalTableToCommit(transaction::Transaction* transaction, + LocalTableData* localTable) override; void prepareCommitNodeGroup(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, LocalRelNG* localRelNG); @@ -175,11 +175,11 @@ class RelTableData final : public TableData { } private: - static common::offset_t getMaxNumNodesInRegion( - const ChunkedCSRHeader& header, const PackedCSRRegion& region, const LocalRelNG* localNG); + static common::offset_t getMaxNumNodesInRegion(const ChunkedCSRHeader& header, + const PackedCSRRegion& region, const LocalRelNG* localNG); - std::vector findRegions( - const ChunkedCSRHeader& headerChunks, LocalState& localState); + std::vector findRegions(const ChunkedCSRHeader& headerChunks, + LocalState& localState); common::length_t getNewRegionSize(const ChunkedCSRHeader& header, const std::vector& sizeChangesPerSegment, PackedCSRRegion& region); bool isWithinDensityBound(const ChunkedCSRHeader& headerChunks, @@ -200,10 +200,10 @@ class RelTableData final : public TableData { common::node_group_idx_t nodeGroupIdx, common::column_id_t columnID, const PersistentState& persistentState, LocalState& localState); - void findPositionsForInsertions( - common::offset_t nodeOffset, common::length_t numInsertions, LocalState& localState); - void slideForInsertions( - common::offset_t nodeOffset, common::length_t numInsertions, LocalState& localState); + void findPositionsForInsertions(common::offset_t nodeOffset, common::length_t numInsertions, + LocalState& localState); + void slideForInsertions(common::offset_t nodeOffset, common::length_t numInsertions, + LocalState& localState); void slideLeftForInsertions(common::offset_t nodeOffset, common::offset_t leftBoundary, LocalState& localState, uint64_t numValuesToInsert); void slideRightForInsertions(common::offset_t nodeOffset, common::offset_t rightBoundary, @@ -213,8 +213,8 @@ class RelTableData final : public TableData { const ChunkCollection& localChunk, ColumnChunk* chunk, common::column_id_t columnID); void applyInsertionsToChunk(const PersistentState& persistentState, const LocalState& localState, const ChunkCollection& localChunk, ColumnChunk* chunk); - void applyDeletionsToChunk( - const PersistentState& persistentState, const LocalState& localState, ColumnChunk* chunk); + void applyDeletionsToChunk(const PersistentState& persistentState, const LocalState& localState, + ColumnChunk* chunk); void applyUpdatesToColumn(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, common::column_id_t columnID, @@ -231,8 +231,8 @@ class RelTableData final : public TableData { std::vector> getSlidesForDeletions( const PersistentState& persistentState, const LocalState& localState); - LocalRelNG* getLocalNodeGroup( - transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx); + LocalRelNG* getLocalNodeGroup(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx); template static double divideNoRoundUp(T1 v1, T2 v2) { diff --git a/src/include/storage/store/string_column_chunk.h b/src/include/storage/store/string_column_chunk.h index 949bfd7c837..1ffb3bcb346 100644 --- a/src/include/storage/store/string_column_chunk.h +++ b/src/include/storage/store/string_column_chunk.h @@ -11,8 +11,8 @@ namespace storage { class StringColumnChunk final : public ColumnChunk { public: - StringColumnChunk( - common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); + StringColumnChunk(common::LogicalType dataType, uint64_t capacity, bool enableCompression, + bool inMemory); void resetToEmpty() final; void append(common::ValueVector* vector, const common::SelectionVector& selVector) final; @@ -24,8 +24,8 @@ class StringColumnChunk final : public ColumnChunk { void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) override; - void write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) override; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + common::RelMultiplicity multiplicity) override; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, diff --git a/src/include/storage/store/struct_column.h b/src/include/storage/store/struct_column.h index acafb82b298..758d2bb66e2 100644 --- a/src/include/storage/store/struct_column.h +++ b/src/include/storage/store/struct_column.h @@ -57,8 +57,8 @@ class StructColumn final : public Column { ColumnChunk* chunk, common::offset_t dataOffset) override; private: - static ChunkCollection getStructChildChunkCollection( - const ChunkCollection& chunkCollection, common::vector_idx_t childIdx); + static ChunkCollection getStructChildChunkCollection(const ChunkCollection& chunkCollection, + common::vector_idx_t childIdx); private: std::vector> childColumns; diff --git a/src/include/storage/store/struct_column_chunk.h b/src/include/storage/store/struct_column_chunk.h index 75802f50d29..30e7513c527 100644 --- a/src/include/storage/store/struct_column_chunk.h +++ b/src/include/storage/store/struct_column_chunk.h @@ -10,8 +10,8 @@ namespace storage { class StructColumnChunk final : public ColumnChunk { public: - StructColumnChunk( - common::LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory); + StructColumnChunk(common::LogicalType dataType, uint64_t capacity, bool enableCompression, + bool inMemory); inline ColumnChunk* getChild(common::vector_idx_t childIdx) { KU_ASSERT(childIdx < childChunks.size()); @@ -30,8 +30,8 @@ class StructColumnChunk final : public ColumnChunk { void write(common::ValueVector* vector, common::offset_t offsetInVector, common::offset_t offsetInChunk) override; - void write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, common::RelMultiplicity multiplicity) override; + void write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + common::RelMultiplicity multiplicity) override; void write(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, common::offset_t dstOffsetInChunk, common::offset_t numValuesToCopy) override; void copy(ColumnChunk* srcChunk, common::offset_t srcOffsetInChunk, diff --git a/src/include/storage/store/table.h b/src/include/storage/store/table.h index 6b0a0f925a2..b3717080583 100644 --- a/src/include/storage/store/table.h +++ b/src/include/storage/store/table.h @@ -16,8 +16,8 @@ struct TableReadState { TableReadState(const common::ValueVector& nodeIDVector, const std::vector& columnIDs, const std::vector& outputVectors) - : nodeIDVector{nodeIDVector}, columnIDs{std::move(columnIDs)}, outputVectors{ - outputVectors} { + : nodeIDVector{nodeIDVector}, columnIDs{std::move(columnIDs)}, + outputVectors{outputVectors} { dataReadState = std::make_unique(); } virtual ~TableReadState() = default; diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index e73c3dd9cdd..3d1cb9c1893 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -46,8 +46,8 @@ class TableData { } inline const std::vector>& getColumns() const { return columns; } - virtual void prepareLocalTableToCommit( - transaction::Transaction* transaction, LocalTableData* localTable) = 0; + virtual void prepareLocalTableToCommit(transaction::Transaction* transaction, + LocalTableData* localTable) = 0; virtual void checkpointInMemory(); virtual void rollbackInMemory(); virtual void prepareCommit(); diff --git a/src/include/storage/wal/wal.h b/src/include/storage/wal/wal.h index 5a786fba8ff..ba08f65cf56 100644 --- a/src/include/storage/wal/wal.h +++ b/src/include/storage/wal/wal.h @@ -86,11 +86,11 @@ class WAL : public BaseWALAndWALIterator { return make_unique(fileHandle, mtx); } - common::page_idx_t logPageUpdateRecord( - DBFileID dbFileID, common::page_idx_t pageIdxInOriginalFile); + common::page_idx_t logPageUpdateRecord(DBFileID dbFileID, + common::page_idx_t pageIdxInOriginalFile); - common::page_idx_t logPageInsertRecord( - DBFileID dbFileID, common::page_idx_t pageIdxInOriginalFile); + common::page_idx_t logPageInsertRecord(DBFileID dbFileID, + common::page_idx_t pageIdxInOriginalFile); void logCommit(uint64_t transactionID); diff --git a/src/include/storage/wal/wal_record.h b/src/include/storage/wal/wal_record.h index 9948717d2c8..e544baa318e 100644 --- a/src/include/storage/wal/wal_record.h +++ b/src/include/storage/wal/wal_record.h @@ -69,8 +69,8 @@ struct PageUpdateOrInsertRecord { PageUpdateOrInsertRecord() = default; - PageUpdateOrInsertRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL, bool isInsert) + PageUpdateOrInsertRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL, bool isInsert) : dbFileID{dbFileID}, pageIdxInOriginalFile{pageIdxInOriginalFile}, pageIdxInWAL{pageIdxInWAL}, isInsert{isInsert} {} @@ -118,8 +118,8 @@ struct RdfGraphRecord { CreateTableRecord literalTripleTableRecord) : tableID{tableID}, resourceTableRecord{resourceTableRecord}, literalTableRecord{literalTableRecord}, - resourceTripleTableRecord{resourceTripleTableRecord}, literalTripleTableRecord{ - literalTripleTableRecord} {} + resourceTripleTableRecord{resourceTripleTableRecord}, + literalTripleTableRecord{literalTripleTableRecord} {} inline bool operator==(const RdfGraphRecord& rhs) const { return tableID == rhs.tableID && resourceTableRecord == rhs.resourceTableRecord && @@ -206,10 +206,10 @@ struct WALRecord { bool operator==(const WALRecord& rhs) const; - static WALRecord newPageUpdateRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL); - static WALRecord newPageInsertRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL); + static WALRecord newPageUpdateRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL); + static WALRecord newPageInsertRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL); static WALRecord newCommitRecord(uint64_t transactionID); static WALRecord newTableStatisticsRecord(bool isNodeTable); static WALRecord newCatalogRecord(); @@ -219,18 +219,18 @@ struct WALRecord { common::table_id_t resourceTripleTableID, common::table_id_t literalTripleTableID); static WALRecord newCopyTableRecord(common::table_id_t tableID); static WALRecord newDropTableRecord(common::table_id_t tableID); - static WALRecord newDropPropertyRecord( - common::table_id_t tableID, common::property_id_t propertyID); - static WALRecord newAddPropertyRecord( - common::table_id_t tableID, common::property_id_t propertyID); + static WALRecord newDropPropertyRecord(common::table_id_t tableID, + common::property_id_t propertyID); + static WALRecord newAddPropertyRecord(common::table_id_t tableID, + common::property_id_t propertyID); static void constructWALRecordFromBytes(WALRecord& retVal, uint8_t* bytes, uint64_t& offset); // This functions assumes that the caller ensures there is enough space in the bytes pointer // to write the record. This should be checked by calling numBytesToWrite. void writeWALRecordToBytes(uint8_t* bytes, uint64_t& offset) const; private: - static WALRecord newPageInsertOrUpdateRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL, bool isInsert); + static WALRecord newPageInsertOrUpdateRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL, bool isInsert); }; } // namespace storage @@ -243,8 +243,8 @@ struct hash { auto dbFileTypeHash = std::hash()(static_cast(fileId.dbFileType)); auto isOverflowHash = std::hash()(fileId.isOverflow); auto nodeIndexIDHash = std::hash()(fileId.nodeIndexID.tableID); - return kuzu::function::combineHashScalar( - dbFileTypeHash, kuzu::function::combineHashScalar(isOverflowHash, nodeIndexIDHash)); + return kuzu::function::combineHashScalar(dbFileTypeHash, + kuzu::function::combineHashScalar(isOverflowHash, nodeIndexIDHash)); } }; } // namespace std diff --git a/src/include/storage/wal_replayer.h b/src/include/storage/wal_replayer.h index 90e2681fc02..53a729a2672 100644 --- a/src/include/storage/wal_replayer.h +++ b/src/include/storage/wal_replayer.h @@ -36,10 +36,10 @@ class WALReplayer { void replayDropPropertyRecord(const WALRecord& walRecord); void replayAddPropertyRecord(const WALRecord& walRecord); - void checkpointOrRollbackVersionedFileHandleAndBufferManager( - const WALRecord& walRecord, const DBFileID& dbFileID); - void truncateFileIfInsertion( - BMFileHandle* fileHandle, const PageUpdateOrInsertRecord& pageInsertOrUpdateRecord); + void checkpointOrRollbackVersionedFileHandleAndBufferManager(const WALRecord& walRecord, + const DBFileID& dbFileID); + void truncateFileIfInsertion(BMFileHandle* fileHandle, + const PageUpdateOrInsertRecord& pageInsertOrUpdateRecord); BMFileHandle* getVersionedFileHandleIfWALVersionAndBMShouldBeCleared(const DBFileID& dbFileID); std::unique_ptr getCatalogForRecovery(common::FileVersionType dbFileType); diff --git a/src/include/storage/wal_replayer_utils.h b/src/include/storage/wal_replayer_utils.h index 5c7718713f9..cddcdb2a3bb 100644 --- a/src/include/storage/wal_replayer_utils.h +++ b/src/include/storage/wal_replayer_utils.h @@ -19,8 +19,8 @@ namespace storage { class WALReplayerUtils { public: - static void removeHashIndexFile( - common::VirtualFileSystem* vfs, common::table_id_t tableID, const std::string& directory); + static void removeHashIndexFile(common::VirtualFileSystem* vfs, common::table_id_t tableID, + const std::string& directory); // Create empty hash index file for the new node table. static void createEmptyHashIndexFiles(catalog::NodeTableCatalogEntry* nodeTableEntry, diff --git a/src/include/transaction/transaction.h b/src/include/transaction/transaction.h index 6ad1ab41411..dd97c4e95c8 100644 --- a/src/include/transaction/transaction.h +++ b/src/include/transaction/transaction.h @@ -21,8 +21,8 @@ class Transaction { friend class TransactionManager; public: - Transaction( - main::ClientContext& clientContext, TransactionType transactionType, uint64_t transactionID) + Transaction(main::ClientContext& clientContext, TransactionType transactionType, + uint64_t transactionID) : type{transactionType}, ID{transactionID} { localStorage = std::make_unique(clientContext); } diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 41368387aa1..784713f1ea2 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -198,7 +198,9 @@ std::unique_ptr ClientContext::prepare(std::string_view query auto parsedStatements = std::vector>(); try { parsedStatements = Parser::parseQuery(query); - } catch (std::exception& exception) { return preparedStatementWithError(exception.what()); } + } catch (std::exception& exception) { + return preparedStatementWithError(exception.what()); + } if (parsedStatements.size() > 1) { return preparedStatementWithError( "Connection Exception: We do not support prepare multiple statements."); @@ -212,7 +214,9 @@ std::unique_ptr ClientContext::prepareTest(std::string_view q auto parsedStatements = std::vector>(); try { parsedStatements = Parser::parseQuery(query); - } catch (std::exception& exception) { return preparedStatementWithError(exception.what()); } + } catch (std::exception& exception) { + return preparedStatementWithError(exception.what()); + } if (parsedStatements.size() > 1) { return preparedStatementWithError( "Connection Exception: We do not support prepare multiple statements."); @@ -220,16 +224,16 @@ std::unique_ptr ClientContext::prepareTest(std::string_view q if (parsedStatements.empty()) { return preparedStatementWithError("Connection Exception: Query is empty."); } - return prepareNoLock( - parsedStatements[0], false /* enumerate all plans */, "", false /*requireNewTx*/); + return prepareNoLock(parsedStatements[0], false /* enumerate all plans */, "", + false /*requireNewTx*/); } std::unique_ptr ClientContext::query(std::string_view queryStatement) { return query(queryStatement, std::string_view() /*encodedJoin*/, false /*enumerateAllPlans */); } -std::unique_ptr ClientContext::query( - std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans) { +std::unique_ptr ClientContext::query(std::string_view query, + std::string_view encodedJoin, bool enumerateAllPlans) { lock_t lck{mtx}; if (query.empty()) { return queryResultWithError("Connection Exception: Query is empty."); @@ -237,14 +241,16 @@ std::unique_ptr ClientContext::query( auto parsedStatements = std::vector>(); try { parsedStatements = Parser::parseQuery(query); - } catch (std::exception& exception) { return queryResultWithError(exception.what()); } + } catch (std::exception& exception) { + return queryResultWithError(exception.what()); + } std::unique_ptr queryResult; QueryResult* lastResult = nullptr; for (auto& statement : parsedStatements) { auto preparedStatement = prepareNoLock(statement, enumerateAllPlans /* enumerate all plans */, encodedJoin, false /*requireNewTx*/); - auto currentQueryResult = executeAndAutoCommitIfNecessaryNoLock( - preparedStatement.get(), 0u, false /*requiredNexTx*/); + auto currentQueryResult = executeAndAutoCommitIfNecessaryNoLock(preparedStatement.get(), 0u, + false /*requiredNexTx*/); if (!lastResult) { // first result of the query queryResult = std::move(currentQueryResult); @@ -375,8 +381,8 @@ std::unique_ptr ClientContext::executeWithParams(PreparedStatement* } // rebind KU_ASSERT(preparedStatement->parsedStatement != nullptr); - auto rebindPreparedStatement = prepareNoLock( - preparedStatement->parsedStatement, false, "", false, preparedStatement->parameterMap); + auto rebindPreparedStatement = prepareNoLock(preparedStatement->parsedStatement, false, "", + false, preparedStatement->parameterMap); return executeAndAutoCommitIfNecessaryNoLock(rebindPreparedStatement.get(), 0u, false); } @@ -448,8 +454,8 @@ std::unique_ptr ClientContext::executeAndAutoCommitIfNecessaryNoLoc } executingTimer.stop(); queryResult->querySummary->executionTime = executingTimer.getElapsedTimeMS(); - queryResult->initResultTableAndIterator( - std::move(resultFT), preparedStatement->statementResult->getColumns()); + queryResult->initResultTableAndIterator(std::move(resultFT), + preparedStatement->statementResult->getColumns()); return queryResult; } @@ -485,7 +491,9 @@ void ClientContext::runQuery(std::string query) { auto parsedStatements = std::vector>(); try { parsedStatements = Parser::parseQuery(query); - } catch (std::exception& exception) { throw ConnectionException(exception.what()); } + } catch (std::exception& exception) { + throw ConnectionException(exception.what()); + } if (parsedStatements.empty()) { throw ConnectionException("Connection Exception: Query is empty."); } @@ -498,7 +506,9 @@ void ClientContext::runQuery(std::string query) { throw ConnectionException(currentQueryResult->errMsg); } } - } catch (std::exception& exception) { throw ConnectionException(exception.what()); } + } catch (std::exception& exception) { + throw ConnectionException(exception.what()); + } return; } } // namespace main diff --git a/src/main/connection.cpp b/src/main/connection.cpp index 0c9c4674670..8b39398b1b5 100644 --- a/src/main/connection.cpp +++ b/src/main/connection.cpp @@ -39,8 +39,8 @@ std::unique_ptr Connection::query(std::string_view queryStatement) return clientContext->query(queryStatement); } -std::unique_ptr Connection::query( - std::string_view query, std::string_view encodedJoin, bool enumerateAllPlans) { +std::unique_ptr Connection::query(std::string_view query, std::string_view encodedJoin, + bool enumerateAllPlans) { return clientContext->query(query, encodedJoin, enumerateAllPlans); } diff --git a/src/main/database.cpp b/src/main/database.cpp index 7a34406fa37..77720645d23 100644 --- a/src/main/database.cpp +++ b/src/main/database.cpp @@ -50,9 +50,9 @@ SystemConfig::SystemConfig(uint64_t bufferPoolSize_, uint64_t maxNumThreads, boo // On 32-bit systems or systems with extremely large memory, the buffer pool size may // exceed the maximum size of a VMRegion. In this case, we set the buffer pool size to // 80% of the maximum size of a VMRegion. - bufferPoolSize_ = (uint64_t)std::min( - (double)bufferPoolSize_, BufferPoolConstants::DEFAULT_VM_REGION_MAX_SIZE * - BufferPoolConstants::DEFAULT_PHY_MEM_SIZE_RATIO_FOR_BM); + bufferPoolSize_ = (uint64_t)std::min((double)bufferPoolSize_, + BufferPoolConstants::DEFAULT_VM_REGION_MAX_SIZE * + BufferPoolConstants::DEFAULT_PHY_MEM_SIZE_RATIO_FOR_BM); } bufferPoolSize = bufferPoolSize_; if (maxNumThreads == 0) { @@ -82,8 +82,8 @@ Database::Database(std::string_view databasePath, SystemConfig systemConfig) auto clientContext = ClientContext(this); auto dbPathStr = std::string(databasePath); this->databasePath = vfs->expandPath(&clientContext, dbPathStr); - bufferManager = std::make_unique( - this->systemConfig.bufferPoolSize, this->systemConfig.maxDBSize); + bufferManager = std::make_unique(this->systemConfig.bufferPoolSize, + this->systemConfig.maxDBSize); memoryManager = std::make_unique(bufferManager.get(), vfs.get()); queryProcessor = std::make_unique(this->systemConfig.maxNumThreads); initDBDirAndCoreFilesIfNecessary(); @@ -115,13 +115,13 @@ void Database::registerFileSystem(std::unique_ptr fs) { vfs->registerFileSystem(std::move(fs)); } -void Database::registerStorageExtension( - std::string name, std::unique_ptr storageExtension) { +void Database::registerStorageExtension(std::string name, + std::unique_ptr storageExtension) { storageExtensions.emplace(std::move(name), std::move(storageExtension)); } -void Database::addExtensionOption( - std::string name, common::LogicalTypeID type, common::Value defaultValue) { +void Database::addExtensionOption(std::string name, common::LogicalTypeID type, + common::Value defaultValue) { if (extensionOptions->getExtensionOption(name) != nullptr) { throw ExtensionException{common::stringFormat("Extension option {} already exists.", name)}; } @@ -161,13 +161,13 @@ void Database::initDBDirAndCoreFilesIfNecessary() { vfs->createDir(databasePath); } openLockFile(); - if (!vfs->fileOrPathExists(StorageUtils::getNodesStatisticsAndDeletedIDsFilePath( - vfs.get(), databasePath, FileVersionType::ORIGINAL))) { - NodesStoreStatsAndDeletedIDs::saveInitialNodesStatisticsAndDeletedIDsToFile( - vfs.get(), databasePath); + if (!vfs->fileOrPathExists(StorageUtils::getNodesStatisticsAndDeletedIDsFilePath(vfs.get(), + databasePath, FileVersionType::ORIGINAL))) { + NodesStoreStatsAndDeletedIDs::saveInitialNodesStatisticsAndDeletedIDsToFile(vfs.get(), + databasePath); } - if (!vfs->fileOrPathExists(StorageUtils::getRelsStatisticsFilePath( - vfs.get(), databasePath, FileVersionType::ORIGINAL))) { + if (!vfs->fileOrPathExists(StorageUtils::getRelsStatisticsFilePath(vfs.get(), databasePath, + FileVersionType::ORIGINAL))) { RelsStoreStats::saveInitialRelsStatisticsToFile(vfs.get(), databasePath); } if (!vfs->fileOrPathExists( @@ -230,8 +230,8 @@ void Database::commit(Transaction* transaction, bool skipCheckpointForTestingRec transactionManager->allowReceivingNewTransactions(); } -void Database::rollback( - transaction::Transaction* transaction, bool skipCheckpointForTestingRecovery) { +void Database::rollback(transaction::Transaction* transaction, + bool skipCheckpointForTestingRecovery) { if (transaction->isReadOnly()) { transactionManager->rollback(transaction); return; @@ -250,8 +250,8 @@ void Database::rollback( void Database::checkpointAndClearWAL(WALReplayMode replayMode) { KU_ASSERT(replayMode == WALReplayMode::COMMIT_CHECKPOINT || replayMode == WALReplayMode::RECOVERY_CHECKPOINT); - auto walReplayer = std::make_unique( - wal.get(), storageManager.get(), bufferManager.get(), catalog.get(), replayMode, vfs.get()); + auto walReplayer = std::make_unique(wal.get(), storageManager.get(), + bufferManager.get(), catalog.get(), replayMode, vfs.get()); walReplayer->replay(); wal->clearWAL(); } diff --git a/src/main/plan_printer.cpp b/src/main/plan_printer.cpp index ae0f4766a0c..44edb54364f 100644 --- a/src/main/plan_printer.cpp +++ b/src/main/plan_printer.cpp @@ -11,8 +11,8 @@ using namespace kuzu::processor; namespace kuzu { namespace main { -OpProfileBox::OpProfileBox( - std::string opName, const std::string& paramsName, std::vector attributes) +OpProfileBox::OpProfileBox(std::string opName, const std::string& paramsName, + std::vector attributes) : opName{std::move(opName)}, attributes{std::move(attributes)} { std::stringstream paramsStream{paramsName}; std::string paramStr = ""; @@ -94,8 +94,8 @@ std::ostringstream OpProfileTree::printPlanToOstream() const { return oss; } -void OpProfileTree::calculateNumRowsAndColsForOp( - PhysicalOperator* op, uint32_t& numRows, uint32_t& numCols) { +void OpProfileTree::calculateNumRowsAndColsForOp(PhysicalOperator* op, uint32_t& numRows, + uint32_t& numCols) { if (!op->getNumChildren()) { numRows = 1; numCols = 1; @@ -123,8 +123,8 @@ uint32_t OpProfileTree::fillOpProfileBoxes(PhysicalOperator* op, uint32_t rowIdx uint32_t colOffset = 0; for (auto i = 0u; i < op->getNumChildren(); i++) { - colOffset += fillOpProfileBoxes( - op->getChild(i), rowIdx + 1, colIdx + colOffset, maxFieldWidth, profiler); + colOffset += fillOpProfileBoxes(op->getChild(i), rowIdx + 1, colIdx + colOffset, + maxFieldWidth, profiler); } return colOffset; } @@ -268,8 +268,8 @@ std::string OpProfileTree::genHorizLine(uint32_t len) { return tableFrame.str(); } -void OpProfileTree::insertOpProfileBox( - uint32_t rowIdx, uint32_t colIdx, std::unique_ptr opProfileBox) { +void OpProfileTree::insertOpProfileBox(uint32_t rowIdx, uint32_t colIdx, + std::unique_ptr opProfileBox) { validateRowIdxAndColIdx(rowIdx, colIdx); opProfileBoxes[rowIdx][colIdx] = std::move(opProfileBox); } @@ -295,8 +295,8 @@ uint32_t OpProfileTree::calculateRowHeight(uint32_t rowIdx) const { for (auto i = 0u; i < opProfileBoxes[rowIdx].size(); i++) { auto opProfileBox = getOpProfileBox(rowIdx, i); if (opProfileBox) { - height = std::max( - height, 2 * opProfileBox->getNumAttributes() + opProfileBox->getNumParams()); + height = std::max(height, + 2 * opProfileBox->getNumAttributes() + opProfileBox->getNumParams()); } } return height + 2; diff --git a/src/main/query_result.cpp b/src/main/query_result.cpp index f004e602af3..6fa17c6ce7d 100644 --- a/src/main/query_result.cpp +++ b/src/main/query_result.cpp @@ -13,8 +13,8 @@ using namespace kuzu::processor; namespace kuzu { namespace main { -std::unique_ptr DataTypeInfo::getInfoForDataType( - const LogicalType& type, const std::string& name) { +std::unique_ptr DataTypeInfo::getInfoForDataType(const LogicalType& type, + const std::string& name) { auto columnTypeInfo = std::make_unique(type.getLogicalTypeID(), name); switch (type.getLogicalTypeID()) { case LogicalTypeID::INTERNAL_ID: { diff --git a/src/main/storage_driver.cpp b/src/main/storage_driver.cpp index b4e38a9f271..4e1cefa797d 100644 --- a/src/main/storage_driver.cpp +++ b/src/main/storage_driver.cpp @@ -56,8 +56,8 @@ uint64_t StorageDriver::getNumNodes(const std::string& nodeName) { uint64_t StorageDriver::getNumRels(const std::string& relName) { auto relTableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, relName); - auto relStatistics = storageManager->getRelsStatistics()->getRelStatistics( - relTableID, Transaction::getDummyReadOnlyTrx().get()); + auto relStatistics = storageManager->getRelsStatistics()->getRelStatistics(relTableID, + Transaction::getDummyReadOnlyTrx().get()); return relStatistics->getNumTuples(); } @@ -70,8 +70,8 @@ void StorageDriver::scanColumn(Transaction* transaction, storage::Column* column auto nodeOffset = offsets[i]; auto [nodeGroupIdx, offsetInChunk] = StorageUtils::getNodeGroupIdxAndOffsetInChunk(nodeOffset); - column->scan( - transaction, nodeGroupIdx, offsetInChunk, offsetInChunk + 1, &resultVector, i); + column->scan(transaction, nodeGroupIdx, offsetInChunk, offsetInChunk + 1, &resultVector, + i); } auto dataVector = ListVector::getDataVector(&resultVector); auto dataVectorSize = ListVector::getDataVectorSize(&resultVector); diff --git a/src/optimizer/acc_hash_join_optimizer.cpp b/src/optimizer/acc_hash_join_optimizer.cpp index a729115b8cd..a8122f1eff1 100644 --- a/src/optimizer/acc_hash_join_optimizer.cpp +++ b/src/optimizer/acc_hash_join_optimizer.cpp @@ -201,8 +201,8 @@ std::vector HashJoinSIPOptimizer::resolveScanInternal } std::vector -HashJoinSIPOptimizer::resolveShortestPathExtendToApplySemiMask( - const binder::Expression& nodeID, planner::LogicalOperator* root) { +HashJoinSIPOptimizer::resolveShortestPathExtendToApplySemiMask(const binder::Expression& nodeID, + planner::LogicalOperator* root) { std::vector result; auto recursiveJoinCollector = LogicalRecursiveExtendCollector(); recursiveJoinCollector.collect(root); @@ -252,16 +252,16 @@ std::shared_ptr HashJoinSIPOptimizer::appendPathSemiMa auto op = opsToApplySemiMask[0]; KU_ASSERT(op->getOperatorType() == planner::LogicalOperatorType::SCAN_INTERNAL_ID); auto scan = ku_dynamic_cast(op); - auto semiMasker = std::make_shared( - SemiMaskType::PATH, pathExpression, scan->getTableIDs(), opsToApplySemiMask, child); + auto semiMasker = std::make_shared(SemiMaskType::PATH, pathExpression, + scan->getTableIDs(), opsToApplySemiMask, child); semiMasker->computeFlatSchema(); return semiMasker; } std::shared_ptr HashJoinSIPOptimizer::appendAccumulate( std::shared_ptr child) { - auto accumulate = std::make_shared( - AccumulateType::REGULAR, expression_vector{}, nullptr /* offset */, std::move(child)); + auto accumulate = std::make_shared(AccumulateType::REGULAR, + expression_vector{}, nullptr /* offset */, std::move(child)); accumulate->computeFlatSchema(); return accumulate; } diff --git a/src/optimizer/factorization_rewriter.cpp b/src/optimizer/factorization_rewriter.cpp index f87470dd1f1..007de0c18bc 100644 --- a/src/optimizer/factorization_rewriter.cpp +++ b/src/optimizer/factorization_rewriter.cpp @@ -71,8 +71,8 @@ void FactorizationRewriter::visitIntersect(planner::LogicalOperator* op) { for (auto i = 0u; i < intersect->getNumBuilds(); ++i) { auto groupPosToFlatten = intersect->getGroupsPosToFlattenOnBuildSide(i); auto childIdx = i + 1; // skip probe - intersect->setChild( - childIdx, appendFlattens(intersect->getChild(childIdx), groupPosToFlatten)); + intersect->setChild(childIdx, + appendFlattens(intersect->getChild(childIdx), groupPosToFlatten)); } } @@ -87,8 +87,8 @@ void FactorizationRewriter::visitProjection(planner::LogicalOperator* op) { if (hasRandomFunction) { // Fall back to tuple-at-a-time evaluation. auto groupsPos = op->getChild(0)->getSchema()->getGroupsPosInScope(); - auto groupsPosToFlatten = factorization::FlattenAll::getGroupsPosToFlatten( - groupsPos, op->getChild(0)->getSchema()); + auto groupsPosToFlatten = factorization::FlattenAll::getGroupsPosToFlatten(groupsPos, + op->getChild(0)->getSchema()); projection->setChild(0, appendFlattens(projection->getChild(0), groupsPosToFlatten)); } else { for (auto& expression : projection->getExpressionsToProject()) { @@ -163,8 +163,8 @@ void FactorizationRewriter::visitSetNodeProperty(planner::LogicalOperator* op) { auto setNodeProperty = (LogicalSetNodeProperty*)op; for (auto i = 0u; i < setNodeProperty->getInfosRef().size(); ++i) { auto groupsPosToFlatten = setNodeProperty->getGroupsPosToFlatten(i); - setNodeProperty->setChild( - 0, appendFlattens(setNodeProperty->getChild(0), groupsPosToFlatten)); + setNodeProperty->setChild(0, + appendFlattens(setNodeProperty->getChild(0), groupsPosToFlatten)); } } @@ -172,8 +172,8 @@ void FactorizationRewriter::visitSetRelProperty(planner::LogicalOperator* op) { auto setRelProperty = (LogicalSetRelProperty*)op; for (auto i = 0u; i < setRelProperty->getInfosRef().size(); ++i) { auto groupsPosToFlatten = setRelProperty->getGroupsPosToFlatten(i); - setRelProperty->setChild( - 0, appendFlattens(setRelProperty->getChild(0), groupsPosToFlatten)); + setRelProperty->setChild(0, + appendFlattens(setRelProperty->getChild(0), groupsPosToFlatten)); } } diff --git a/src/optimizer/filter_push_down_optimizer.cpp b/src/optimizer/filter_push_down_optimizer.cpp index b9abed2f355..2d47f41b280 100644 --- a/src/optimizer/filter_push_down_optimizer.cpp +++ b/src/optimizer/filter_push_down_optimizer.cpp @@ -86,8 +86,8 @@ std::shared_ptr FilterPushDownOptimizer::visitCrossProductRepla if (joinConditions.empty()) { return finishPushDown(op); } - auto hashJoin = std::make_shared( - joinConditions, JoinType::INNER, op->getChild(0), op->getChild(1)); + auto hashJoin = std::make_shared(joinConditions, JoinType::INNER, + op->getChild(0), op->getChild(1)); hashJoin->setSIP(planner::SidewaysInfoPassing::PROHIBIT); hashJoin->computeFlatSchema(); return hashJoin; @@ -111,8 +111,8 @@ std::shared_ptr FilterPushDownOptimizer::visitScanNode std::vector infos; KU_ASSERT(tableIDs.size() == 1); infos.push_back(IndexLookupInfo(tableIDs[0], nodeID, rhs, rhs->getDataType())); - auto indexScan = std::make_shared( - std::move(infos), std::move(expressionsScan)); + auto indexScan = std::make_shared(std::move(infos), + std::move(expressionsScan)); indexScan->computeFlatSchema(); op->setChild(0, std::move(indexScan)); } else { @@ -182,8 +182,8 @@ std::shared_ptr FilterPushDownOptimizer::appendScanNod if (properties.empty()) { return child; } - auto scanNodeProperty = std::make_shared( - std::move(nodeID), std::move(nodeTableIDs), std::move(properties), std::move(child)); + auto scanNodeProperty = std::make_shared(std::move(nodeID), + std::move(nodeTableIDs), std::move(properties), std::move(child)); scanNodeProperty->computeFlatSchema(); return scanNodeProperty; } diff --git a/src/optimizer/projection_push_down_optimizer.cpp b/src/optimizer/projection_push_down_optimizer.cpp index 90d5c7bdf47..a5168939ed7 100644 --- a/src/optimizer/projection_push_down_optimizer.cpp +++ b/src/optimizer/projection_push_down_optimizer.cpp @@ -301,8 +301,8 @@ binder::expression_vector ProjectionPushDownOptimizer::pruneExpressions( return expression_vector{expressionsAfterPruning.begin(), expressionsAfterPruning.end()}; } -void ProjectionPushDownOptimizer::preAppendProjection( - planner::LogicalOperator* op, uint32_t childIdx, binder::expression_vector expressions) { +void ProjectionPushDownOptimizer::preAppendProjection(planner::LogicalOperator* op, + uint32_t childIdx, binder::expression_vector expressions) { auto projection = std::make_shared(std::move(expressions), op->getChild(childIdx)); projection->computeFlatSchema(); diff --git a/src/parser/antlr_parser/kuzu_cypher_parser.cpp b/src/parser/antlr_parser/kuzu_cypher_parser.cpp index 281b7fa6e07..82f11e8ee31 100644 --- a/src/parser/antlr_parser/kuzu_cypher_parser.cpp +++ b/src/parser/antlr_parser/kuzu_cypher_parser.cpp @@ -10,8 +10,8 @@ void KuzuCypherParser::notifyQueryNotConcludeWithReturn(antlr4::Token* startToke notifyErrorListeners(startToken, errorMsg, nullptr); } -void KuzuCypherParser::notifyNodePatternWithoutParentheses( - std::string nodeName, antlr4::Token* startToken) { +void KuzuCypherParser::notifyNodePatternWithoutParentheses(std::string nodeName, + antlr4::Token* startToken) { auto errorMsg = "Parentheses are required to identify nodes in patterns, i.e. (" + nodeName + ")"; notifyErrorListeners(startToken, errorMsg, nullptr); diff --git a/src/parser/antlr_parser/parser_error_listener.cpp b/src/parser/antlr_parser/parser_error_listener.cpp index 845f2667985..7eb9aacb4ba 100644 --- a/src/parser/antlr_parser/parser_error_listener.cpp +++ b/src/parser/antlr_parser/parser_error_listener.cpp @@ -17,8 +17,8 @@ void ParserErrorListener::syntaxError(Recognizer* recognizer, Token* offendingSy throw ParserException(finalError); } -std::string ParserErrorListener::formatUnderLineError( - Recognizer& recognizer, const Token& offendingToken, size_t line, size_t charPositionInLine) { +std::string ParserErrorListener::formatUnderLineError(Recognizer& recognizer, + const Token& offendingToken, size_t line, size_t charPositionInLine) { auto tokens = (CommonTokenStream*)recognizer.getInputStream(); auto input = tokens->getTokenSource()->getInputStream()->toString(); auto errorLine = StringUtils::split(input, "\n")[line - 1]; diff --git a/src/parser/antlr_parser/parser_error_strategy.cpp b/src/parser/antlr_parser/parser_error_strategy.cpp index 055490750b9..b5e4e36d302 100644 --- a/src/parser/antlr_parser/parser_error_strategy.cpp +++ b/src/parser/antlr_parser/parser_error_strategy.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace parser { -void ParserErrorStrategy::reportNoViableAlternative( - antlr4::Parser* recognizer, const antlr4::NoViableAltException& e) { +void ParserErrorStrategy::reportNoViableAlternative(antlr4::Parser* recognizer, + const antlr4::NoViableAltException& e) { auto tokens = recognizer->getTokenStream(); auto errorMsg = tokens ? diff --git a/src/parser/expression/parsed_case_expression.cpp b/src/parser/expression/parsed_case_expression.cpp index 9276b6bca5e..6c1f381d754 100644 --- a/src/parser/expression/parsed_case_expression.cpp +++ b/src/parser/expression/parsed_case_expression.cpp @@ -27,8 +27,8 @@ std::unique_ptr ParsedCaseExpression::deserialize( deserializer.deserializeVector(caseAlternatives); std::unique_ptr elseExpression; deserializer.deserializeOptionalValue(elseExpression); - return std::make_unique( - std::move(caseExpression), std::move(caseAlternatives), std::move(elseExpression)); + return std::make_unique(std::move(caseExpression), + std::move(caseAlternatives), std::move(elseExpression)); } std::unique_ptr ParsedCaseExpression::copy() const { diff --git a/src/parser/expression/parsed_expression.cpp b/src/parser/expression/parsed_expression.cpp index e3d3c934957..1d1e8187fcc 100644 --- a/src/parser/expression/parsed_expression.cpp +++ b/src/parser/expression/parsed_expression.cpp @@ -15,8 +15,8 @@ using namespace kuzu::common; namespace kuzu { namespace parser { -ParsedExpression::ParsedExpression( - ExpressionType type, std::unique_ptr child, std::string rawName) +ParsedExpression::ParsedExpression(ExpressionType type, std::unique_ptr child, + std::string rawName) : type{type}, rawName{std::move(rawName)} { children.push_back(std::move(child)); } diff --git a/src/parser/transform/transform_ddl.cpp b/src/parser/transform/transform_ddl.cpp index 84fc56ec5d5..86f76de1654 100644 --- a/src/parser/transform/transform_ddl.cpp +++ b/src/parser/transform/transform_ddl.cpp @@ -66,8 +66,8 @@ std::unique_ptr Transformer::transformCreateRelTable( createTableInfo.propertyNameDataTypes = transformPropertyDefinitions(*ctx.kU_PropertyDefinitions()); } - createTableInfo.extraInfo = std::make_unique( - relMultiplicity, std::move(srcTableName), std::move(dstTableName)); + createTableInfo.extraInfo = std::make_unique(relMultiplicity, + std::move(srcTableName), std::move(dstTableName)); return std::make_unique(std::move(createTableInfo)); } @@ -91,8 +91,8 @@ std::unique_ptr Transformer::transformCreateRelTableGroup( createTableInfo.propertyNameDataTypes = transformPropertyDefinitions(*ctx.kU_PropertyDefinitions()); } - createTableInfo.extraInfo = std::make_unique( - relMultiplicity, std::move(srcDstTablePairs)); + createTableInfo.extraInfo = std::make_unique(relMultiplicity, + std::move(srcDstTablePairs)); return std::make_unique(std::move(createTableInfo)); } @@ -129,8 +129,8 @@ std::unique_ptr Transformer::transformAddProperty( } else { defaultValue = std::make_unique(Value::createNullValue(), "NULL"); } - auto extraInfo = std::make_unique( - std::move(propertyName), std::move(dataType), std::move(defaultValue)); + auto extraInfo = std::make_unique(std::move(propertyName), + std::move(dataType), std::move(defaultValue)); auto info = AlterInfo(AlterType::ADD_PROPERTY, tableName, std::move(extraInfo)); return std::make_unique(std::move(info)); } diff --git a/src/parser/transform/transform_expression.cpp b/src/parser/transform/transform_expression.cpp index d11f276c3c1..e142a4cda06 100644 --- a/src/parser/transform/transform_expression.cpp +++ b/src/parser/transform/transform_expression.cpp @@ -33,8 +33,8 @@ std::unique_ptr Transformer::transformOrExpression( expression = std::move(next); } else { auto rawName = expression->getRawName() + " OR " + next->getRawName(); - expression = std::make_unique( - ExpressionType::OR, std::move(expression), std::move(next), rawName); + expression = std::make_unique(ExpressionType::OR, + std::move(expression), std::move(next), rawName); } } return expression; @@ -49,8 +49,8 @@ std::unique_ptr Transformer::transformXorExpression( expression = std::move(next); } else { auto rawName = expression->getRawName() + " XOR " + next->getRawName(); - expression = std::make_unique( - ExpressionType::XOR, std::move(expression), std::move(next), rawName); + expression = std::make_unique(ExpressionType::XOR, + std::move(expression), std::move(next), rawName); } } return expression; @@ -65,8 +65,8 @@ std::unique_ptr Transformer::transformAndExpression( expression = std::move(next); } else { auto rawName = expression->getRawName() + " AND " + next->getRawName(); - expression = std::make_unique( - ExpressionType::AND, std::move(expression), std::move(next), rawName); + expression = std::make_unique(ExpressionType::AND, + std::move(expression), std::move(next), rawName); } } return expression; @@ -78,8 +78,8 @@ std::unique_ptr Transformer::transformNotExpression( if (!ctx.NOT().empty()) { for ([[maybe_unused]] auto& _ : ctx.NOT()) { auto rawName = "NOT " + result->toString(); - result = std::make_unique( - ExpressionType::NOT, std::move(result), std::move(rawName)); + result = std::make_unique(ExpressionType::NOT, std::move(result), + std::move(rawName)); } } return result; @@ -97,24 +97,24 @@ std::unique_ptr Transformer::transformComparisonExpression( auto right = transformBitwiseOrOperatorExpression(*ctx.kU_BitwiseOrOperatorExpression(1)); auto comparisonOperator = ctx.kU_ComparisonOperator()[0]->getText(); if (comparisonOperator == "=") { - return std::make_unique( - ExpressionType::EQUALS, std::move(left), std::move(right), ctx.getText()); + return std::make_unique(ExpressionType::EQUALS, std::move(left), + std::move(right), ctx.getText()); } else if (comparisonOperator == "<>") { - return std::make_unique( - ExpressionType::NOT_EQUALS, std::move(left), std::move(right), ctx.getText()); + return std::make_unique(ExpressionType::NOT_EQUALS, std::move(left), + std::move(right), ctx.getText()); } else if (comparisonOperator == ">") { - return std::make_unique( - ExpressionType::GREATER_THAN, std::move(left), std::move(right), ctx.getText()); + return std::make_unique(ExpressionType::GREATER_THAN, std::move(left), + std::move(right), ctx.getText()); } else if (comparisonOperator == ">=") { - return std::make_unique( - ExpressionType::GREATER_THAN_EQUALS, std::move(left), std::move(right), ctx.getText()); + return std::make_unique(ExpressionType::GREATER_THAN_EQUALS, + std::move(left), std::move(right), ctx.getText()); } else if (comparisonOperator == "<") { - return std::make_unique( - ExpressionType::LESS_THAN, std::move(left), std::move(right), ctx.getText()); + return std::make_unique(ExpressionType::LESS_THAN, std::move(left), + std::move(right), ctx.getText()); } else { KU_ASSERT(comparisonOperator == "<="); - return std::make_unique( - ExpressionType::LESS_THAN_EQUALS, std::move(left), std::move(right), ctx.getText()); + return std::make_unique(ExpressionType::LESS_THAN_EQUALS, std::move(left), + std::move(right), ctx.getText()); } } @@ -127,8 +127,8 @@ std::unique_ptr Transformer::transformBitwiseOrOperatorExpress expression = std::move(next); } else { auto rawName = expression->getRawName() + " | " + next->getRawName(); - expression = std::make_unique( - BitwiseOrFunction::name, std::move(expression), std::move(next), rawName); + expression = std::make_unique(BitwiseOrFunction::name, + std::move(expression), std::move(next), rawName); } } return expression; @@ -143,8 +143,8 @@ std::unique_ptr Transformer::transformBitwiseAndOperatorExpres expression = std::move(next); } else { auto rawName = expression->getRawName() + " & " + next->getRawName(); - expression = std::make_unique( - BitwiseAndFunction::name, std::move(expression), std::move(next), rawName); + expression = std::make_unique(BitwiseAndFunction::name, + std::move(expression), std::move(next), rawName); } } return expression; @@ -162,12 +162,12 @@ std::unique_ptr Transformer::transformBitShiftOperatorExpressi auto rawName = expression->getRawName() + " " + bitShiftOperator + " " + next->getRawName(); if (bitShiftOperator == "<<") { - expression = std::make_unique( - BitShiftLeftFunction::name, std::move(expression), std::move(next), rawName); + expression = std::make_unique(BitShiftLeftFunction::name, + std::move(expression), std::move(next), rawName); } else { KU_ASSERT(bitShiftOperator == ">>"); - expression = std::make_unique( - BitShiftRightFunction::name, std::move(expression), std::move(next), rawName); + expression = std::make_unique(BitShiftRightFunction::name, + std::move(expression), std::move(next), rawName); } } } @@ -186,8 +186,8 @@ std::unique_ptr Transformer::transformAddOrSubtractExpression( auto arithmeticOperator = ctx.kU_AddOrSubtractOperator(i - 1)->getText(); auto rawName = expression->getRawName() + " " + arithmeticOperator + " " + next->getRawName(); - expression = std::make_unique( - arithmeticOperator, std::move(expression), std::move(next), rawName); + expression = std::make_unique(arithmeticOperator, + std::move(expression), std::move(next), rawName); } } return expression; @@ -204,8 +204,8 @@ std::unique_ptr Transformer::transformMultiplyDivideModuloExpr auto arithmeticOperator = ctx.kU_MultiplyDivideModuloOperator(i - 1)->getText(); auto rawName = expression->getRawName() + " " + arithmeticOperator + " " + next->getRawName(); - expression = std::make_unique( - arithmeticOperator, std::move(expression), std::move(next), rawName); + expression = std::make_unique(arithmeticOperator, + std::move(expression), std::move(next), rawName); } } return expression; @@ -220,8 +220,8 @@ std::unique_ptr Transformer::transformPowerOfExpression( expression = std::move(next); } else { auto rawName = expression->getRawName() + " ^ " + next->getRawName(); - expression = std::make_unique( - PowerFunction::name, std::move(expression), std::move(next), rawName); + expression = std::make_unique(PowerFunction::name, + std::move(expression), std::move(next), rawName); } } return expression; @@ -233,14 +233,14 @@ std::unique_ptr Transformer::transformUnaryAddSubtractOrFactor transformStringListNullOperatorExpression(*ctx.oC_StringListNullOperatorExpression()); if (ctx.FACTORIAL()) { // Factorial has a higher auto raw = result->toString() + "!"; - result = std::make_unique( - FactorialFunction::name, std::move(result), std::move(raw)); + result = std::make_unique(FactorialFunction::name, + std::move(result), std::move(raw)); } if (!ctx.MINUS().empty()) { for ([[maybe_unused]] auto& _ : ctx.MINUS()) { auto raw = "-" + result->toString(); - result = std::make_unique( - NegateFunction::name, std::move(result), std::move(raw)); + result = std::make_unique(NegateFunction::name, + std::move(result), std::move(raw)); } } return result; @@ -251,21 +251,21 @@ std::unique_ptr Transformer::transformStringListNullOperatorEx auto propertyExpression = transformPropertyOrLabelsExpression(*ctx.oC_PropertyOrLabelsExpression()); if (ctx.oC_NullOperatorExpression()) { - return transformNullOperatorExpression( - *ctx.oC_NullOperatorExpression(), std::move(propertyExpression)); + return transformNullOperatorExpression(*ctx.oC_NullOperatorExpression(), + std::move(propertyExpression)); } if (!ctx.oC_ListOperatorExpression().empty()) { - auto result = transformListOperatorExpression( - *ctx.oC_ListOperatorExpression(0), std::move(propertyExpression)); + auto result = transformListOperatorExpression(*ctx.oC_ListOperatorExpression(0), + std::move(propertyExpression)); for (auto i = 1u; i < ctx.oC_ListOperatorExpression().size(); ++i) { - result = transformListOperatorExpression( - *ctx.oC_ListOperatorExpression(i), std::move(result)); + result = transformListOperatorExpression(*ctx.oC_ListOperatorExpression(i), + std::move(result)); } return result; } if (ctx.oC_StringOperatorExpression()) { - return transformStringOperatorExpression( - *ctx.oC_StringOperatorExpression(), std::move(propertyExpression)); + return transformStringOperatorExpression(*ctx.oC_StringOperatorExpression(), + std::move(propertyExpression)); } return propertyExpression; } @@ -279,11 +279,11 @@ std::unique_ptr Transformer::transformStringOperatorExpression return std::make_unique(StartsWithFunction::name, std::move(propertyExpression), std::move(right), rawExpression); } else if (ctx.ENDS()) { - return std::make_unique( - EndsWithFunction::name, std::move(propertyExpression), std::move(right), rawExpression); + return std::make_unique(EndsWithFunction::name, + std::move(propertyExpression), std::move(right), rawExpression); } else if (ctx.CONTAINS()) { - return std::make_unique( - ContainsFunction::name, std::move(propertyExpression), std::move(right), rawExpression); + return std::make_unique(ContainsFunction::name, + std::move(propertyExpression), std::move(right), rawExpression); } else { KU_ASSERT(ctx.oC_RegularExpression()); return std::make_unique(RegexpFullMatchFunction::name, @@ -343,8 +343,8 @@ std::unique_ptr Transformer::transformNullOperatorExpression( KU_ASSERT(ctx.IS() && ctx.NULL_()); return ctx.NOT() ? std::make_unique(ExpressionType::IS_NOT_NULL, std::move(propertyExpression), rawExpression) : - std::make_unique( - ExpressionType::IS_NULL, std::move(propertyExpression), rawExpression); + std::make_unique(ExpressionType::IS_NULL, + std::move(propertyExpression), rawExpression); } std::unique_ptr Transformer::transformPropertyOrLabelsExpression( @@ -382,8 +382,8 @@ std::unique_ptr Transformer::transformAtom(CypherParser::OC_At return transformCountSubquery(*ctx.kU_CountSubquery()); } else { KU_ASSERT(ctx.oC_Variable()); - return std::make_unique( - transformVariable(*ctx.oC_Variable()), ctx.getText()); + return std::make_unique(transformVariable(*ctx.oC_Variable()), + ctx.getText()); } } @@ -398,8 +398,8 @@ std::unique_ptr Transformer::transformLiteral( Value(LogicalType::STRING(), transformStringLiteral(*ctx.StringLiteral())), ctx.getText()); } else if (ctx.NULL_()) { - return std::make_unique( - Value(Value::createNullValue()), ctx.getText()); + return std::make_unique(Value(Value::createNullValue()), + ctx.getText()); } else if (ctx.kU_StructLiteral()) { return transformStructLiteral(*ctx.kU_StructLiteral()); } else { @@ -479,8 +479,8 @@ std::unique_ptr Transformer::transformFunctionInvocation( } else { functionName = transformFunctionName(*ctx.oC_FunctionName()); } - auto expression = std::make_unique( - functionName, ctx.getText(), ctx.DISTINCT() != nullptr); + auto expression = std::make_unique(functionName, ctx.getText(), + ctx.DISTINCT() != nullptr); for (auto& functionParameter : ctx.kU_FunctionParameter()) { expression->addChild(transformFunctionParameterExpression(*functionParameter)); } @@ -535,8 +535,8 @@ std::unique_ptr Transformer::createPropertyExpression( CypherParser::OC_PropertyLookupContext& ctx, std::unique_ptr child) { auto key = ctx.STAR() ? InternalKeyword::STAR : transformPropertyKeyName(*ctx.oC_PropertyKeyName()); - return std::make_unique( - key, std::move(child), child->toString() + ctx.getText()); + return std::make_unique(key, std::move(child), + child->toString() + ctx.getText()); } std::unique_ptr Transformer::transformCaseExpression( diff --git a/src/parser/transform/transform_extension.cpp b/src/parser/transform/transform_extension.cpp index f0c92ba0553..7fd7d7c858f 100644 --- a/src/parser/transform/transform_extension.cpp +++ b/src/parser/transform/transform_extension.cpp @@ -9,8 +9,8 @@ namespace parser { std::unique_ptr Transformer::transformExtension(CypherParser::KU_ExtensionContext& ctx) { if (ctx.kU_InstallExtension()) { - return std::make_unique( - ExtensionAction::INSTALL, transformVariable(*ctx.kU_InstallExtension()->oC_Variable())); + return std::make_unique(ExtensionAction::INSTALL, + transformVariable(*ctx.kU_InstallExtension()->oC_Variable())); } else { auto path = ctx.kU_LoadExtension()->StringLiteral() ? transformStringLiteral(*ctx.kU_LoadExtension()->StringLiteral()) : diff --git a/src/parser/transform/transform_projection.cpp b/src/parser/transform/transform_projection.cpp index 3cbe690dec0..b253ba3b5e5 100644 --- a/src/parser/transform/transform_projection.cpp +++ b/src/parser/transform/transform_projection.cpp @@ -20,8 +20,8 @@ ReturnClause Transformer::transformReturn(CypherParser::OC_ReturnContext& ctx) { } ProjectionBody Transformer::transformProjectionBody(CypherParser::OC_ProjectionBodyContext& ctx) { - auto projectionBody = ProjectionBody( - nullptr != ctx.DISTINCT(), transformProjectionItems(*ctx.oC_ProjectionItems())); + auto projectionBody = ProjectionBody(nullptr != ctx.DISTINCT(), + transformProjectionItems(*ctx.oC_ProjectionItems())); if (ctx.oC_Order()) { std::vector> orderByExpressions; std::vector isAscOrders; diff --git a/src/parser/transform/transform_query.cpp b/src/parser/transform/transform_query.cpp index 6a14af76c29..6f90eea3a68 100644 --- a/src/parser/transform/transform_query.cpp +++ b/src/parser/transform/transform_query.cpp @@ -12,8 +12,8 @@ std::unique_ptr Transformer::transformRegularQuery( CypherParser::OC_RegularQueryContext& ctx) { auto regularQuery = std::make_unique(transformSingleQuery(*ctx.oC_SingleQuery())); for (auto unionClause : ctx.oC_Union()) { - regularQuery->addSingleQuery( - transformSingleQuery(*unionClause->oC_SingleQuery()), unionClause->ALL()); + regularQuery->addSingleQuery(transformSingleQuery(*unionClause->oC_SingleQuery()), + unionClause->ALL()); } return regularQuery; } diff --git a/src/parser/transform/transform_updating_clause.cpp b/src/parser/transform/transform_updating_clause.cpp index de36ad9ccb8..b28cd2dfb91 100644 --- a/src/parser/transform/transform_updating_clause.cpp +++ b/src/parser/transform/transform_updating_clause.cpp @@ -52,8 +52,8 @@ std::unique_ptr Transformer::transformSet(CypherParser::OC_SetCo } parsed_expr_pair Transformer::transformSetItem(CypherParser::OC_SetItemContext& ctx) { - return make_pair( - transformProperty(*ctx.oC_PropertyExpression()), transformExpression(*ctx.oC_Expression())); + return make_pair(transformProperty(*ctx.oC_PropertyExpression()), + transformExpression(*ctx.oC_Expression())); } std::unique_ptr Transformer::transformDelete(CypherParser::OC_DeleteContext& ctx) { diff --git a/src/planner/join_order/cardinality_estimator.cpp b/src/planner/join_order/cardinality_estimator.cpp index 6f2abb5d6dd..91b6239a190 100644 --- a/src/planner/join_order/cardinality_estimator.cpp +++ b/src/planner/join_order/cardinality_estimator.cpp @@ -38,8 +38,8 @@ uint64_t CardinalityEstimator::estimateScanNode(LogicalOperator* op) { return atLeastOne(getNodeIDDom(scan->getInternalID()->getUniqueName())); } -uint64_t CardinalityEstimator::estimateHashJoin( - const expression_vector& joinKeys, const LogicalPlan& probePlan, const LogicalPlan& buildPlan) { +uint64_t CardinalityEstimator::estimateHashJoin(const expression_vector& joinKeys, + const LogicalPlan& probePlan, const LogicalPlan& buildPlan) { auto denominator = 1u; for (auto& joinKey : joinKeys) { // TODO(Xiyang): we should be able to estimate non-ID-based joins as well. @@ -51,8 +51,8 @@ uint64_t CardinalityEstimator::estimateHashJoin( JoinOrderUtil::getJoinKeysFlatCardinality(joinKeys, buildPlan) / denominator); } -uint64_t CardinalityEstimator::estimateCrossProduct( - const LogicalPlan& probePlan, const LogicalPlan& buildPlan) { +uint64_t CardinalityEstimator::estimateCrossProduct(const LogicalPlan& probePlan, + const LogicalPlan& buildPlan) { return atLeastOne(probePlan.estCardinality * buildPlan.estCardinality); } @@ -75,8 +75,8 @@ uint64_t CardinalityEstimator::estimateIntersect(const expression_vector& joinNo return atLeastOne(std::min(estCardinality1, estCardinality2)); } -uint64_t CardinalityEstimator::estimateFlatten( - const LogicalPlan& childPlan, f_group_pos groupPosToFlatten) { +uint64_t CardinalityEstimator::estimateFlatten(const LogicalPlan& childPlan, + f_group_pos groupPosToFlatten) { auto group = childPlan.getSchema()->getGroup(groupPosToFlatten); return atLeastOne(childPlan.estCardinality * group->cardinalityMultiplier); } @@ -88,8 +88,8 @@ static bool isPrimaryKey(const Expression& expression) { return ((PropertyExpression&)expression).isPrimaryKey(); } -uint64_t CardinalityEstimator::estimateFilter( - const LogicalPlan& childPlan, const Expression& predicate) { +uint64_t CardinalityEstimator::estimateFilter(const LogicalPlan& childPlan, + const Expression& predicate) { if (predicate.expressionType == ExpressionType::EQUALS) { if (isPrimaryKey(*predicate.getChild(0)) || isPrimaryKey(*predicate.getChild(1))) { return 1; @@ -103,8 +103,8 @@ uint64_t CardinalityEstimator::estimateFilter( } } -uint64_t CardinalityEstimator::getNumNodes( - const std::vector& tableIDs, Transaction* transaction) { +uint64_t CardinalityEstimator::getNumNodes(const std::vector& tableIDs, + Transaction* transaction) { auto numNodes = 0u; for (auto& tableID : tableIDs) { numNodes += @@ -113,8 +113,8 @@ uint64_t CardinalityEstimator::getNumNodes( return atLeastOne(numNodes); } -uint64_t CardinalityEstimator::getNumRels( - const std::vector& tableIDs, Transaction* transaction) { +uint64_t CardinalityEstimator::getNumRels(const std::vector& tableIDs, + Transaction* transaction) { auto numRels = 0u; for (auto tableID : tableIDs) { numRels += relsStatistics->getRelStatistics(tableID, transaction)->getNumTuples(); @@ -122,8 +122,8 @@ uint64_t CardinalityEstimator::getNumRels( return atLeastOne(numRels); } -double CardinalityEstimator::getExtensionRate( - const RelExpression& rel, const NodeExpression& boundNode, Transaction* transaction) { +double CardinalityEstimator::getExtensionRate(const RelExpression& rel, + const NodeExpression& boundNode, Transaction* transaction) { auto numBoundNodes = (double)getNumNodes(boundNode.getTableIDs(), transaction); auto numRels = (double)getNumRels(rel.getTableIDs(), transaction); auto oneHopExtensionRate = numRels / numBoundNodes; diff --git a/src/planner/join_order/cost_model.cpp b/src/planner/join_order/cost_model.cpp index 1b4d3d6b5eb..2d95e2ec9a8 100644 --- a/src/planner/join_order/cost_model.cpp +++ b/src/planner/join_order/cost_model.cpp @@ -12,8 +12,8 @@ uint64_t CostModel::computeExtendCost(const LogicalPlan& childPlan) { return childPlan.estCardinality; } -uint64_t CostModel::computeRecursiveExtendCost( - uint8_t upperBound, double extensionRate, const LogicalPlan& childPlan) { +uint64_t CostModel::computeRecursiveExtendCost(uint8_t upperBound, double extensionRate, + const LogicalPlan& childPlan) { return PlannerKnobs::BUILD_PENALTY * childPlan.estCardinality * (uint64_t)extensionRate * upperBound; } diff --git a/src/planner/join_order/join_order_util.cpp b/src/planner/join_order/join_order_util.cpp index a79ee300ad0..f06b8644e4f 100644 --- a/src/planner/join_order/join_order_util.cpp +++ b/src/planner/join_order/join_order_util.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace planner { -uint64_t JoinOrderUtil::getJoinKeysFlatCardinality( - const binder::expression_vector& joinNodeIDs, const LogicalPlan& buildPlan) { +uint64_t JoinOrderUtil::getJoinKeysFlatCardinality(const binder::expression_vector& joinNodeIDs, + const LogicalPlan& buildPlan) { auto schema = buildPlan.getSchema(); f_group_pos_set unFlatGroupsPos; for (auto& joinID : joinNodeIDs) { diff --git a/src/planner/join_order_enumerator_context.cpp b/src/planner/join_order_enumerator_context.cpp index a17831fa7e3..ea3ce5d0398 100644 --- a/src/planner/join_order_enumerator_context.cpp +++ b/src/planner/join_order_enumerator_context.cpp @@ -5,8 +5,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void JoinOrderEnumeratorContext::init( - const QueryGraph* queryGraph_, const expression_vector& predicates) { +void JoinOrderEnumeratorContext::init(const QueryGraph* queryGraph_, + const expression_vector& predicates) { whereExpressionsSplitOnAND = predicates; this->queryGraph = queryGraph_; // clear and resize subPlansTable diff --git a/src/planner/operator/factorization/flatten_resolver.cpp b/src/planner/operator/factorization/flatten_resolver.cpp index bd375a84e5c..74cb5f8ffd4 100644 --- a/src/planner/operator/factorization/flatten_resolver.cpp +++ b/src/planner/operator/factorization/flatten_resolver.cpp @@ -4,8 +4,8 @@ namespace kuzu { namespace planner { namespace factorization { -f_group_pos_set FlattenAllButOne::getGroupsPosToFlatten( - const f_group_pos_set& groupsPos, Schema* schema) { +f_group_pos_set FlattenAllButOne::getGroupsPosToFlatten(const f_group_pos_set& groupsPos, + Schema* schema) { std::vector unFlatGroupsPos; for (auto groupPos : groupsPos) { if (!schema->getGroup(groupPos)->isFlat()) { @@ -20,8 +20,8 @@ f_group_pos_set FlattenAllButOne::getGroupsPosToFlatten( return result; } -f_group_pos_set FlattenAll::getGroupsPosToFlatten( - const f_group_pos_set& groupsPos, Schema* schema) { +f_group_pos_set FlattenAll::getGroupsPosToFlatten(const f_group_pos_set& groupsPos, + Schema* schema) { f_group_pos_set result; for (auto groupPos : groupsPos) { if (!schema->getGroup(groupPos)->isFlat()) { diff --git a/src/planner/operator/factorization/sink_util.cpp b/src/planner/operator/factorization/sink_util.cpp index c49e7aeee6d..cb4b5e16842 100644 --- a/src/planner/operator/factorization/sink_util.cpp +++ b/src/planner/operator/factorization/sink_util.cpp @@ -30,8 +30,8 @@ void SinkOperatorUtil::recomputeSchema(const Schema& inputSchema, } std::unordered_map -SinkOperatorUtil::getUnFlatPayloadsPerGroup( - const Schema& schema, const binder::expression_vector& payloads) { +SinkOperatorUtil::getUnFlatPayloadsPerGroup(const Schema& schema, + const binder::expression_vector& payloads) { std::unordered_map result; for (auto& payload : payloads) { auto groupPos = schema.getGroupPos(*payload); @@ -46,8 +46,8 @@ SinkOperatorUtil::getUnFlatPayloadsPerGroup( return result; } -binder::expression_vector SinkOperatorUtil::getFlatPayloads( - const Schema& schema, const binder::expression_vector& payloads) { +binder::expression_vector SinkOperatorUtil::getFlatPayloads(const Schema& schema, + const binder::expression_vector& payloads) { binder::expression_vector result; for (auto& payload : payloads) { if (schema.getGroup(payload)->isFlat()) { @@ -57,8 +57,8 @@ binder::expression_vector SinkOperatorUtil::getFlatPayloads( return result; } -uint32_t SinkOperatorUtil::appendPayloadsToNewGroup( - Schema& schema, binder::expression_vector& payloads) { +uint32_t SinkOperatorUtil::appendPayloadsToNewGroup(Schema& schema, + binder::expression_vector& payloads) { auto outputGroupPos = schema.createGroup(); for (auto& payload : payloads) { schema.insertToGroupAndScope(payload, outputGroupPos); diff --git a/src/planner/operator/logical_aggregate.cpp b/src/planner/operator/logical_aggregate.cpp index 3fe16e522ff..daa04431db9 100644 --- a/src/planner/operator/logical_aggregate.cpp +++ b/src/planner/operator/logical_aggregate.cpp @@ -30,8 +30,8 @@ f_group_pos_set LogicalAggregate::getGroupsPosToFlattenForGroupBy() { if (hasDistinctAggregate()) { return FlattenAll::getGroupsPosToFlatten(dependentGroupsPos, children[0]->getSchema()); } else { - return FlattenAllButOne::getGroupsPosToFlatten( - dependentGroupsPos, children[0]->getSchema()); + return FlattenAllButOne::getGroupsPosToFlatten(dependentGroupsPos, + children[0]->getSchema()); } } diff --git a/src/planner/operator/logical_dummy_scan.cpp b/src/planner/operator/logical_dummy_scan.cpp index 9f09d9d7edf..9eeeddea592 100644 --- a/src/planner/operator/logical_dummy_scan.cpp +++ b/src/planner/operator/logical_dummy_scan.cpp @@ -21,8 +21,8 @@ void LogicalDummyScan::computeFlatSchema() { std::shared_ptr LogicalDummyScan::getDummyExpression() { auto logicalType = LogicalType(LogicalTypeID::STRING); auto nullValue = Value::createNullValue(logicalType); - return std::make_shared( - nullValue.copy(), InternalKeyword::PLACE_HOLDER); + return std::make_shared(nullValue.copy(), + InternalKeyword::PLACE_HOLDER); } } // namespace planner diff --git a/src/planner/operator/logical_hash_join.cpp b/src/planner/operator/logical_hash_join.cpp index 8a03e18c25c..95792f30ba1 100644 --- a/src/planner/operator/logical_hash_join.cpp +++ b/src/planner/operator/logical_hash_join.cpp @@ -65,8 +65,8 @@ void LogicalHashJoin::computeFactorizedSchema() { } } } - SinkOperatorUtil::mergeSchema( - *buildSchema, expressionsToMaterializeInNonKeyGroups, *schema); + SinkOperatorUtil::mergeSchema(*buildSchema, expressionsToMaterializeInNonKeyGroups, + *schema); } break; case JoinType::MARK: { std::unordered_set probeSideKeyGroupPositions; diff --git a/src/planner/operator/logical_intersect.cpp b/src/planner/operator/logical_intersect.cpp index df7196b8ed6..c5d57bac59b 100644 --- a/src/planner/operator/logical_intersect.cpp +++ b/src/planner/operator/logical_intersect.cpp @@ -61,8 +61,8 @@ std::unique_ptr LogicalIntersect::copy() { for (auto i = 1u; i < children.size(); ++i) { buildChildren.push_back(children[i]->copy()); } - return make_unique( - intersectNodeID, keyNodeIDs, children[0]->copy(), std::move(buildChildren)); + return make_unique(intersectNodeID, keyNodeIDs, children[0]->copy(), + std::move(buildChildren)); } } // namespace planner diff --git a/src/planner/operator/logical_operator.cpp b/src/planner/operator/logical_operator.cpp index 3bf8c27794e..d03b4820e63 100644 --- a/src/planner/operator/logical_operator.cpp +++ b/src/planner/operator/logical_operator.cpp @@ -128,8 +128,8 @@ bool LogicalOperatorUtils::isUpdate(LogicalOperatorType type) { } } -LogicalOperator::LogicalOperator( - LogicalOperatorType operatorType, std::shared_ptr child) +LogicalOperator::LogicalOperator(LogicalOperatorType operatorType, + std::shared_ptr child) : operatorType{operatorType} { children.push_back(std::move(child)); } @@ -141,8 +141,8 @@ LogicalOperator::LogicalOperator(LogicalOperatorType operatorType, children.push_back(std::move(right)); } -LogicalOperator::LogicalOperator( - LogicalOperatorType operatorType, const logical_op_vector_t& children) +LogicalOperator::LogicalOperator(LogicalOperatorType operatorType, + const logical_op_vector_t& children) : operatorType{operatorType} { for (auto& child : children) { this->children.push_back(child); diff --git a/src/planner/operator/logical_plan_util.cpp b/src/planner/operator/logical_plan_util.cpp index a5d570632d4..92d8df2d329 100644 --- a/src/planner/operator/logical_plan_util.cpp +++ b/src/planner/operator/logical_plan_util.cpp @@ -12,8 +12,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void LogicalPlanUtil::encodeJoinRecursive( - LogicalOperator* logicalOperator, std::string& encodeString) { +void LogicalPlanUtil::encodeJoinRecursive(LogicalOperator* logicalOperator, + std::string& encodeString) { switch (logicalOperator->getOperatorType()) { case LogicalOperatorType::CROSS_PRODUCT: { encodeCrossProduct(logicalOperator, encodeString); @@ -57,8 +57,8 @@ void LogicalPlanUtil::encodeJoinRecursive( } } -void LogicalPlanUtil::encodeCrossProduct( - LogicalOperator* /*logicalOperator*/, std::string& encodeString) { +void LogicalPlanUtil::encodeCrossProduct(LogicalOperator* /*logicalOperator*/, + std::string& encodeString) { encodeString += "CP()"; } @@ -79,15 +79,15 @@ void LogicalPlanUtil::encodeExtend(LogicalOperator* logicalOperator, std::string encodeString += "E(" + logicalExtend->getNbrNode()->toString() + ")"; } -void LogicalPlanUtil::encodeRecursiveExtend( - LogicalOperator* logicalOperator, std::string& encodeString) { +void LogicalPlanUtil::encodeRecursiveExtend(LogicalOperator* logicalOperator, + std::string& encodeString) { auto logicalExtend = common::ku_dynamic_cast(logicalOperator); encodeString += "RE(" + logicalExtend->getNbrNode()->toString() + ")"; } -void LogicalPlanUtil::encodeScanInternalID( - LogicalOperator* logicalOperator, std::string& encodeString) { +void LogicalPlanUtil::encodeScanInternalID(LogicalOperator* logicalOperator, + std::string& encodeString) { auto scan = common::ku_dynamic_cast(logicalOperator); encodeString += "S(" + scan->getInternalID()->toString() + ")"; } diff --git a/src/planner/operator/logical_union.cpp b/src/planner/operator/logical_union.cpp index 27a3330f861..0fc0440bbb4 100644 --- a/src/planner/operator/logical_union.cpp +++ b/src/planner/operator/logical_union.cpp @@ -21,8 +21,8 @@ f_group_pos_set LogicalUnion::getGroupsPosToFlatten(uint32_t childIdx) { void LogicalUnion::computeFactorizedSchema() { auto firstChildSchema = children[0]->getSchema(); createEmptySchema(); - SinkOperatorUtil::recomputeSchema( - *firstChildSchema, firstChildSchema->getExpressionsInScope(), *schema); + SinkOperatorUtil::recomputeSchema(*firstChildSchema, firstChildSchema->getExpressionsInScope(), + *schema); } void LogicalUnion::computeFlatSchema() { diff --git a/src/planner/operator/persistent/logical_insert.cpp b/src/planner/operator/persistent/logical_insert.cpp index 3549fbc1d8c..115797a1bcb 100644 --- a/src/planner/operator/persistent/logical_insert.cpp +++ b/src/planner/operator/persistent/logical_insert.cpp @@ -53,8 +53,8 @@ std::string LogicalInsert::getExpressionsForPrinting() const { f_group_pos_set LogicalInsert::getGroupsPosToFlatten() { auto childSchema = children[0]->getSchema(); - return factorization::FlattenAll::getGroupsPosToFlatten( - childSchema->getGroupsPosInScope(), childSchema); + return factorization::FlattenAll::getGroupsPosToFlatten(childSchema->getGroupsPosInScope(), + childSchema); } } // namespace planner diff --git a/src/planner/operator/persistent/logical_merge.cpp b/src/planner/operator/persistent/logical_merge.cpp index c8e980fa5df..5bc92535de5 100644 --- a/src/planner/operator/persistent/logical_merge.cpp +++ b/src/planner/operator/persistent/logical_merge.cpp @@ -33,8 +33,8 @@ void LogicalMerge::computeFlatSchema() { f_group_pos_set LogicalMerge::getGroupsPosToFlatten() { auto childSchema = children[0]->getSchema(); - return factorization::FlattenAll::getGroupsPosToFlatten( - childSchema->getGroupsPosInScope(), childSchema); + return factorization::FlattenAll::getGroupsPosToFlatten(childSchema->getGroupsPosInScope(), + childSchema); } } // namespace planner diff --git a/src/planner/operator/schema.cpp b/src/planner/operator/schema.cpp index 1367792ef03..cca6becc804 100644 --- a/src/planner/operator/schema.cpp +++ b/src/planner/operator/schema.cpp @@ -15,39 +15,39 @@ f_group_pos Schema::createGroup() { return pos; } -void Schema::insertToScope( - const std::shared_ptr& expression, f_group_pos groupPos) { +void Schema::insertToScope(const std::shared_ptr& expression, + f_group_pos groupPos) { KU_ASSERT(!expressionNameToGroupPos.contains(expression->getUniqueName())); expressionNameToGroupPos.insert({expression->getUniqueName(), groupPos}); expressionsInScope.push_back(expression); } -void Schema::insertToGroupAndScope( - const std::shared_ptr& expression, f_group_pos groupPos) { +void Schema::insertToGroupAndScope(const std::shared_ptr& expression, + f_group_pos groupPos) { KU_ASSERT(!expressionNameToGroupPos.contains(expression->getUniqueName())); expressionNameToGroupPos.insert({expression->getUniqueName(), groupPos}); groups[groupPos]->insertExpression(expression); expressionsInScope.push_back(expression); } -void Schema::insertToScopeMayRepeat( - const std::shared_ptr& expression, uint32_t groupPos) { +void Schema::insertToScopeMayRepeat(const std::shared_ptr& expression, + uint32_t groupPos) { if (expressionNameToGroupPos.contains(expression->getUniqueName())) { return; } insertToScope(expression, groupPos); } -void Schema::insertToGroupAndScopeMayRepeat( - const std::shared_ptr& expression, uint32_t groupPos) { +void Schema::insertToGroupAndScopeMayRepeat(const std::shared_ptr& expression, + uint32_t groupPos) { if (expressionNameToGroupPos.contains(expression->getUniqueName())) { return; } insertToGroupAndScope(expression, groupPos); } -void Schema::insertToGroupAndScope( - const binder::expression_vector& expressions, f_group_pos groupPos) { +void Schema::insertToGroupAndScope(const binder::expression_vector& expressions, + f_group_pos groupPos) { for (auto& expression : expressions) { insertToGroupAndScope(expression, groupPos); } @@ -132,8 +132,8 @@ size_t Schema::getNumGroups(bool isFlat) const { return result; } -f_group_pos SchemaUtils::getLeadingGroupPos( - const std::unordered_set& groupPositions, const Schema& schema) { +f_group_pos SchemaUtils::getLeadingGroupPos(const std::unordered_set& groupPositions, + const Schema& schema) { auto leadingGroupPos = INVALID_F_GROUP_POS; for (auto groupPos : groupPositions) { if (!schema.getGroup(groupPos)->isFlat()) { @@ -157,8 +157,8 @@ void SchemaUtils::validateAtMostOneUnFlatGroup( } } -void SchemaUtils::validateNoUnFlatGroup( - const std::unordered_set& groupPositions, const Schema& schema) { +void SchemaUtils::validateNoUnFlatGroup(const std::unordered_set& groupPositions, + const Schema& schema) { for (auto groupPos : groupPositions) { if (!schema.getGroup(groupPos)->isFlat()) { throw InternalException("Unexpected unFlat factorization group found."); diff --git a/src/planner/plan/append_accumulate.cpp b/src/planner/plan/append_accumulate.cpp index 5ec40918a51..26ce1fb20a5 100644 --- a/src/planner/plan/append_accumulate.cpp +++ b/src/planner/plan/append_accumulate.cpp @@ -11,8 +11,8 @@ void Planner::appendAccumulate(AccumulateType accumulateType, LogicalPlan& plan) appendAccumulate(accumulateType, expression_vector{}, plan); } -void Planner::appendAccumulate( - AccumulateType accumulateType, const expression_vector& flatExprs, LogicalPlan& plan) { +void Planner::appendAccumulate(AccumulateType accumulateType, const expression_vector& flatExprs, + LogicalPlan& plan) { appendAccumulate(accumulateType, flatExprs, nullptr, plan); } diff --git a/src/planner/plan/append_aggregate.cpp b/src/planner/plan/append_aggregate.cpp index 09fcaebaf29..15a56f36806 100644 --- a/src/planner/plan/append_aggregate.cpp +++ b/src/planner/plan/append_aggregate.cpp @@ -8,8 +8,8 @@ namespace planner { void Planner::appendAggregate(const expression_vector& expressionsToGroupBy, const expression_vector& expressionsToAggregate, LogicalPlan& plan) { - auto aggregate = make_shared( - expressionsToGroupBy, expressionsToAggregate, plan.getLastOperator()); + auto aggregate = make_shared(expressionsToGroupBy, expressionsToAggregate, + plan.getLastOperator()); appendFlattens(aggregate->getGroupsPosToFlattenForGroupBy(), plan); aggregate->setChild(0, plan.getLastOperator()); appendFlattens(aggregate->getGroupsPosToFlattenForAggregate(), plan); diff --git a/src/planner/plan/append_cross_product.cpp b/src/planner/plan/append_cross_product.cpp index 5482a79d871..dbaf3dc8a11 100644 --- a/src/planner/plan/append_cross_product.cpp +++ b/src/planner/plan/append_cross_product.cpp @@ -8,8 +8,8 @@ namespace planner { void Planner::appendCrossProduct(AccumulateType accumulateType, const LogicalPlan& probePlan, const LogicalPlan& buildPlan, LogicalPlan& resultPlan) { - auto crossProduct = make_shared( - accumulateType, probePlan.getLastOperator(), buildPlan.getLastOperator()); + auto crossProduct = make_shared(accumulateType, + probePlan.getLastOperator(), buildPlan.getLastOperator()); crossProduct->computeFactorizedSchema(); // update cost resultPlan.setCost(probePlan.getCardinality() + buildPlan.getCardinality()); diff --git a/src/planner/plan/append_delete.cpp b/src/planner/plan/append_delete.cpp index 4e7f7a9b443..8bd79bebf4e 100644 --- a/src/planner/plan/append_delete.cpp +++ b/src/planner/plan/append_delete.cpp @@ -8,8 +8,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendDeleteNode( - const std::vector& boundInfos, LogicalPlan& plan) { +void Planner::appendDeleteNode(const std::vector& boundInfos, + LogicalPlan& plan) { std::vector> infos; infos.reserve(boundInfos.size()); for (auto& boundInfo : boundInfos) { @@ -27,8 +27,8 @@ void Planner::appendDeleteNode( plan.setLastOperator(std::move(deleteNode)); } -void Planner::appendDeleteRel( - const std::vector& boundInfos, LogicalPlan& plan) { +void Planner::appendDeleteRel(const std::vector& boundInfos, + LogicalPlan& plan) { std::vector> rels; for (auto& info : boundInfos) { auto rel = std::static_pointer_cast(info->nodeOrRel); diff --git a/src/planner/plan/append_extend.cpp b/src/planner/plan/append_extend.cpp index e41d7353165..9a35d4172c8 100644 --- a/src/planner/plan/append_extend.cpp +++ b/src/planner/plan/append_extend.cpp @@ -119,8 +119,8 @@ void Planner::appendNonRecursiveExtend(const std::shared_ptr& bo properties_ = ExpressionUtil::removeDuplication(properties_); } // Append extend - auto extend = make_shared( - boundNode, nbrNode, rel, direction, properties_, hasAtMostOneNbr, plan.getLastOperator()); + auto extend = make_shared(boundNode, nbrNode, rel, direction, properties_, + hasAtMostOneNbr, plan.getLastOperator()); appendFlattens(extend->getGroupsPosToFlatten(), plan); extend->setChild(0, plan.getLastOperator()); extend->computeFactorizedSchema(); @@ -140,13 +140,13 @@ void Planner::appendNonRecursiveExtend(const std::shared_ptr& bo auto rdfInfo = rel->getRdfPredicateInfo(); // Append hash join for remaining properties auto tmpPlan = std::make_unique(); - cardinalityEstimator.addNodeIDDom( - *rdfInfo->predicateID, rdfInfo->resourceTableIDs, clientContext->getTx()); + cardinalityEstimator.addNodeIDDom(*rdfInfo->predicateID, rdfInfo->resourceTableIDs, + clientContext->getTx()); appendScanInternalID(rdfInfo->predicateID, rdfInfo->resourceTableIDs, *tmpPlan); - appendScanNodeProperties( - rdfInfo->predicateID, rdfInfo->resourceTableIDs, expression_vector{iri}, *tmpPlan); - appendHashJoin( - expression_vector{rdfInfo->predicateID}, JoinType::INNER, plan, *tmpPlan, plan); + appendScanNodeProperties(rdfInfo->predicateID, rdfInfo->resourceTableIDs, + expression_vector{iri}, *tmpPlan); + appendHashJoin(expression_vector{rdfInfo->predicateID}, JoinType::INNER, plan, *tmpPlan, + plan); } } @@ -160,8 +160,8 @@ void Planner::appendRecursiveExtend(const std::shared_ptr& bound createRecursivePlan(*recursiveInfo, direction, *recursivePlan); // Create recursive extend if (boundNode->getNumTableIDs() > recursiveInfo->node->getNumTableIDs()) { - appendNodeLabelFilter( - boundNode->getInternalID(), recursiveInfo->node->getTableIDsSet(), plan); + appendNodeLabelFilter(boundNode->getInternalID(), recursiveInfo->node->getTableIDsSet(), + plan); } auto extend = std::make_shared(boundNode, nbrNode, rel, direction, RecursiveJoinType::TRACK_PATH, plan.getLastOperator(), recursivePlan->getLastOperator()); @@ -173,8 +173,8 @@ void Planner::appendRecursiveExtend(const std::shared_ptr& bound std::shared_ptr nodeScanRoot; if (!recursiveInfo->nodeProjectionList.empty()) { auto pathNodePropertyScanPlan = std::make_unique(); - createPathNodePropertyScanPlan( - recursiveInfo->node, recursiveInfo->nodeProjectionList, *pathNodePropertyScanPlan); + createPathNodePropertyScanPlan(recursiveInfo->node, recursiveInfo->nodeProjectionList, + *pathNodePropertyScanPlan); nodeScanRoot = pathNodePropertyScanPlan->getLastOperator(); } // Create path rel property scan plan @@ -190,8 +190,8 @@ void Planner::appendRecursiveExtend(const std::shared_ptr& bound relScanCardinality = pathRelPropertyScanPlan->getCardinality(); } // Create path property probe - auto pathPropertyProbe = std::make_shared( - rel, extend, nodeScanRoot, relScanRoot, RecursiveJoinType::TRACK_PATH); + auto pathPropertyProbe = std::make_shared(rel, extend, nodeScanRoot, + relScanRoot, RecursiveJoinType::TRACK_PATH); pathPropertyProbe->computeFactorizedSchema(); // Check for sip auto ratio = plan.getCardinality() / relScanCardinality; @@ -219,13 +219,13 @@ static expression_vector collectPropertiesToRead(const std::shared_ptr( - boundNode->getInternalID(), recursiveInfo.nodePredicateExecFlag); + auto scanFrontier = std::make_shared(boundNode->getInternalID(), + recursiveInfo.nodePredicateExecFlag); scanFrontier->computeFactorizedSchema(); plan.setLastOperator(std::move(scanFrontier)); auto nodeProperties = collectPropertiesToRead(recursiveInfo.nodePredicate); @@ -247,8 +247,8 @@ void Planner::createRecursivePlan( appendNonRecursiveExtend(boundNode, nbrNode, rel, direction, ExpressionUtil::removeDuplication(relProperties), plan); auto rdfInfo = rel->getRdfPredicateInfo(); - appendScanNodeProperties( - rdfInfo->predicateID, rdfInfo->resourceTableIDs, expression_vector{iri}, plan); + appendScanNodeProperties(rdfInfo->predicateID, rdfInfo->resourceTableIDs, + expression_vector{iri}, plan); } else { appendNonRecursiveExtend(boundNode, nbrNode, rel, direction, ExpressionUtil::removeDuplication(relProperties), plan); @@ -274,8 +274,8 @@ void Planner::createPathRelPropertyScanPlan(const std::shared_ptr nodeID, std::unordered_set tableIDSet, LogicalPlan& plan) { - auto filter = std::make_shared( - std::move(nodeID), std::move(tableIDSet), plan.getLastOperator()); + auto filter = std::make_shared(std::move(nodeID), std::move(tableIDSet), + plan.getLastOperator()); filter->computeFactorizedSchema(); plan.setLastOperator(std::move(filter)); } diff --git a/src/planner/plan/append_filter.cpp b/src/planner/plan/append_filter.cpp index ae218d0ecd5..443e1df89d7 100644 --- a/src/planner/plan/append_filter.cpp +++ b/src/planner/plan/append_filter.cpp @@ -6,8 +6,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendFilters( - const binder::expression_vector& predicates, kuzu::planner::LogicalPlan& plan) { +void Planner::appendFilters(const binder::expression_vector& predicates, + kuzu::planner::LogicalPlan& plan) { for (auto& predicate : predicates) { appendFilter(predicate, plan); } diff --git a/src/planner/plan/append_insert.cpp b/src/planner/plan/append_insert.cpp index 2c8fc4a782b..f677ee3c89d 100644 --- a/src/planner/plan/append_insert.cpp +++ b/src/planner/plan/append_insert.cpp @@ -33,8 +33,8 @@ std::unique_ptr Planner::createLogicalInsertInfo(const BoundI return insertInfo; } -void Planner::appendInsertNode( - const std::vector& boundInsertInfos, LogicalPlan& plan) { +void Planner::appendInsertNode(const std::vector& boundInsertInfos, + LogicalPlan& plan) { std::vector logicalInfos; logicalInfos.reserve(boundInsertInfos.size()); for (auto& boundInfo : boundInsertInfos) { @@ -48,8 +48,8 @@ void Planner::appendInsertNode( plan.setLastOperator(insertNode); } -void Planner::appendInsertRel( - const std::vector& boundInsertInfos, LogicalPlan& plan) { +void Planner::appendInsertRel(const std::vector& boundInsertInfos, + LogicalPlan& plan) { std::vector logicalInfos; logicalInfos.reserve(boundInsertInfos.size()); for (auto& boundInfo : boundInsertInfos) { diff --git a/src/planner/plan/append_join.cpp b/src/planner/plan/append_join.cpp index 498d6b335c9..ca1cf1cf39f 100644 --- a/src/planner/plan/append_join.cpp +++ b/src/planner/plan/append_join.cpp @@ -14,8 +14,8 @@ void Planner::appendHashJoin(const binder::expression_vector& joinNodeIDs, JoinT for (auto& joinNodeID : joinNodeIDs) { joinConditions.emplace_back(joinNodeID, joinNodeID); } - auto hashJoin = make_shared( - joinConditions, joinType, probePlan.getLastOperator(), buildPlan.getLastOperator()); + auto hashJoin = make_shared(joinConditions, joinType, + probePlan.getLastOperator(), buildPlan.getLastOperator()); // Apply flattening to probe side auto groupsPosToFlattenOnProbeSide = hashJoin->getGroupsPosToFlattenOnProbeSide(); appendFlattens(groupsPosToFlattenOnProbeSide, probePlan); @@ -46,8 +46,8 @@ void Planner::appendMarkJoin(const binder::expression_vector& joinNodeIDs, for (auto& joinNodeID : joinNodeIDs) { joinConditions.emplace_back(joinNodeID, joinNodeID); } - auto hashJoin = make_shared( - joinConditions, mark, probePlan.getLastOperator(), buildPlan.getLastOperator()); + auto hashJoin = make_shared(joinConditions, mark, probePlan.getLastOperator(), + buildPlan.getLastOperator()); // Apply flattening to probe side appendFlattens(hashJoin->getGroupsPosToFlattenOnProbeSide(), probePlan); hashJoin->setChild(0, probePlan.getLastOperator()); diff --git a/src/planner/plan/append_mark_accumulate.cpp b/src/planner/plan/append_mark_accumulate.cpp index feb67c9e1a5..83d34dd0324 100644 --- a/src/planner/plan/append_mark_accumulate.cpp +++ b/src/planner/plan/append_mark_accumulate.cpp @@ -6,8 +6,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendMarkAccumulate( - const expression_vector& keys, std::shared_ptr mark, LogicalPlan& plan) { +void Planner::appendMarkAccumulate(const expression_vector& keys, std::shared_ptr mark, + LogicalPlan& plan) { auto markAccumulate = std::make_shared(keys, mark, plan.getLastOperator()); appendFlattens(markAccumulate->getGroupsPosToFlatten(), plan); diff --git a/src/planner/plan/append_order_by.cpp b/src/planner/plan/append_order_by.cpp index e2a74a08cca..461cdf98d4f 100644 --- a/src/planner/plan/append_order_by.cpp +++ b/src/planner/plan/append_order_by.cpp @@ -6,8 +6,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendOrderBy( - const expression_vector& expressions, const std::vector& isAscOrders, LogicalPlan& plan) { +void Planner::appendOrderBy(const expression_vector& expressions, + const std::vector& isAscOrders, LogicalPlan& plan) { auto orderBy = make_shared(expressions, isAscOrders, plan.getLastOperator()); appendFlattens(orderBy->getGroupsPosToFlatten(), plan); orderBy->setChild(0, plan.getLastOperator()); diff --git a/src/planner/plan/append_scan_node.cpp b/src/planner/plan/append_scan_node.cpp index 100982d1d32..1ec6ea01591 100644 --- a/src/planner/plan/append_scan_node.cpp +++ b/src/planner/plan/append_scan_node.cpp @@ -9,8 +9,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::appendScanInternalID( - std::shared_ptr internalID, std::vector tableIDs, LogicalPlan& plan) { +void Planner::appendScanInternalID(std::shared_ptr internalID, + std::vector tableIDs, LogicalPlan& plan) { KU_ASSERT(plan.isEmpty()); auto scan = make_shared(std::move(internalID), std::move(tableIDs)); scan->computeFactorizedSchema(); @@ -33,8 +33,8 @@ void Planner::appendScanNodeProperties(std::shared_ptr nodeID, if (propertiesToScan_.empty()) { return; } - auto scanNodeProperty = make_shared( - std::move(nodeID), std::move(tableIDs), propertiesToScan_, plan.getLastOperator()); + auto scanNodeProperty = make_shared(std::move(nodeID), + std::move(tableIDs), propertiesToScan_, plan.getLastOperator()); scanNodeProperty->computeFactorizedSchema(); plan.setLastOperator(std::move(scanNodeProperty)); } diff --git a/src/planner/plan/append_set.cpp b/src/planner/plan/append_set.cpp index 94a0bd4cd28..364606a8b44 100644 --- a/src/planner/plan/append_set.cpp +++ b/src/planner/plan/append_set.cpp @@ -9,8 +9,8 @@ namespace planner { std::unique_ptr Planner::createLogicalSetPropertyInfo( const BoundSetPropertyInfo* boundSetPropertyInfo) { - return std::make_unique( - boundSetPropertyInfo->nodeOrRel, boundSetPropertyInfo->setItem); + return std::make_unique(boundSetPropertyInfo->nodeOrRel, + boundSetPropertyInfo->setItem); } void Planner::appendSetNodeProperty( diff --git a/src/planner/plan/append_simple.cpp b/src/planner/plan/append_simple.cpp index 7873e1e9fc7..5765caf6cdb 100644 --- a/src/planner/plan/append_simple.cpp +++ b/src/planner/plan/append_simple.cpp @@ -32,8 +32,8 @@ namespace planner { void Planner::appendCreateTable(const BoundStatement& statement, LogicalPlan& plan) { auto& creatTable = ku_dynamic_cast(statement); auto info = creatTable.getInfo(); - auto op = make_shared( - info->tableName, info->copy(), statement.getStatementResult()->getSingleColumnExpr()); + auto op = make_shared(info->tableName, info->copy(), + statement.getStatementResult()->getSingleColumnExpr()); plan.setLastOperator(std::move(op)); } @@ -47,16 +47,16 @@ void Planner::appendDropTable(const BoundStatement& statement, LogicalPlan& plan void Planner::appendAlter(const BoundStatement& statement, LogicalPlan& plan) { auto& alter = ku_dynamic_cast(statement); auto info = alter.getInfo(); - auto op = std::make_shared( - info->copy(), info->tableName, statement.getStatementResult()->getSingleColumnExpr()); + auto op = std::make_shared(info->copy(), info->tableName, + statement.getStatementResult()->getSingleColumnExpr()); plan.setLastOperator(std::move(op)); } void Planner::appendStandaloneCall(const BoundStatement& statement, LogicalPlan& plan) { auto& standaloneCallClause = ku_dynamic_cast(statement); - auto op = make_shared( - standaloneCallClause.getOption(), standaloneCallClause.getOptionValue()); + auto op = make_shared(standaloneCallClause.getOption(), + standaloneCallClause.getOptionValue()); plan.setLastOperator(std::move(op)); } @@ -95,8 +95,8 @@ void Planner::appendTransaction(const BoundStatement& statement, LogicalPlan& pl void Planner::appendExtension(const BoundStatement& statement, LogicalPlan& plan) { auto& extensionStatement = common::ku_dynamic_cast(statement); - auto op = std::make_shared( - extensionStatement.getAction(), extensionStatement.getPath()); + auto op = std::make_shared(extensionStatement.getAction(), + extensionStatement.getPath()); plan.setLastOperator(std::move(op)); } diff --git a/src/planner/plan/plan_copy.cpp b/src/planner/plan/plan_copy.cpp index 3f0fb909669..0abb3846fc1 100644 --- a/src/planner/plan/plan_copy.cpp +++ b/src/planner/plan/plan_copy.cpp @@ -53,8 +53,8 @@ static void appendPartitioner(const BoundCopyFromInfo& copyFromInfo, LogicalPlan plan.setLastOperator(std::move(partitioner)); } -static void appendCopyFrom( - const BoundCopyFromInfo& info, expression_vector outExprs, LogicalPlan& plan) { +static void appendCopyFrom(const BoundCopyFromInfo& info, expression_vector outExprs, + LogicalPlan& plan) { auto op = make_shared(info.copy(), std::move(outExprs), plan.getLastOperator()); op->computeFactorizedSchema(); @@ -81,8 +81,8 @@ std::unique_ptr Planner::planCopyFrom(const BoundStatement& stateme } } -std::unique_ptr Planner::planCopyNodeFrom( - const BoundCopyFromInfo* info, binder::expression_vector results) { +std::unique_ptr Planner::planCopyNodeFrom(const BoundCopyFromInfo* info, + binder::expression_vector results) { auto plan = std::make_unique(); switch (info->source->type) { case ScanSourceType::FILE: { @@ -104,8 +104,8 @@ std::unique_ptr Planner::planCopyNodeFrom( return plan; } -std::unique_ptr Planner::planCopyResourceFrom( - const BoundCopyFromInfo* info, binder::expression_vector results) { +std::unique_ptr Planner::planCopyResourceFrom(const BoundCopyFromInfo* info, + binder::expression_vector results) { auto plan = std::make_unique(); KU_ASSERT(info->source->type == ScanSourceType::FILE); auto fileSource = @@ -116,8 +116,8 @@ std::unique_ptr Planner::planCopyResourceFrom( return plan; } -std::unique_ptr Planner::planCopyRelFrom( - const BoundCopyFromInfo* info, binder::expression_vector results) { +std::unique_ptr Planner::planCopyRelFrom(const BoundCopyFromInfo* info, + binder::expression_vector results) { auto plan = std::make_unique(); switch (info->source->type) { case ScanSourceType::FILE: { @@ -143,8 +143,8 @@ std::unique_ptr Planner::planCopyRelFrom( return plan; } -std::unique_ptr Planner::planCopyRdfFrom( - const BoundCopyFromInfo* info, binder::expression_vector results) { +std::unique_ptr Planner::planCopyRdfFrom(const BoundCopyFromInfo* info, + binder::expression_vector results) { auto extraRdfInfo = ku_dynamic_cast(info->extraInfo.get()); auto rPlan = planCopyResourceFrom(&extraRdfInfo->rInfo, results); diff --git a/src/planner/plan/plan_join_order.cpp b/src/planner/plan/plan_join_order.cpp index 9ad0633231a..d7942bdf443 100644 --- a/src/planner/plan/plan_join_order.cpp +++ b/src/planner/plan/plan_join_order.cpp @@ -25,8 +25,8 @@ std::unique_ptr Planner::planQueryGraphCollectionInNewContext( return getBestPlan(std::move(plans)); } -static int32_t getConnectedQueryGraphIdx( - const QueryGraphCollection& queryGraphCollection, const expression_set& expressionSet) { +static int32_t getConnectedQueryGraphIdx(const QueryGraphCollection& queryGraphCollection, + const expression_set& expressionSet) { for (auto i = 0u; i < queryGraphCollection.getNumQueryGraphs(); ++i) { auto queryGraph = queryGraphCollection.getQueryGraph(i); for (auto& queryNode : queryGraph->getQueryNodes()) { @@ -66,8 +66,8 @@ std::vector> Planner::enumerateQueryGraphCollection predicateToEvaluateIndices.insert(j); } } - evaluatedPredicatesIndices.insert( - predicateToEvaluateIndices.begin(), predicateToEvaluateIndices.end()); + evaluatedPredicatesIndices.insert(predicateToEvaluateIndices.begin(), + predicateToEvaluateIndices.end()); expression_vector predicatesToEvaluate; for (auto idx : predicateToEvaluateIndices) { predicatesToEvaluate.push_back(predicates[idx]); @@ -76,8 +76,8 @@ std::vector> Planner::enumerateQueryGraphCollection switch (context.subqueryType) { case SubqueryType::NONE: { // Plan current query graph as an isolated query graph. - plans = enumerateQueryGraph( - SubqueryType::NONE, expression_vector{}, *queryGraph, predicatesToEvaluate); + plans = enumerateQueryGraph(SubqueryType::NONE, expression_vector{}, *queryGraph, + predicatesToEvaluate); } break; case SubqueryType::INTERNAL_ID_CORRELATED: { // All correlated expressions are node IDs. Plan as isolated query graph but do not scan @@ -92,8 +92,8 @@ std::vector> Planner::enumerateQueryGraphCollection *queryGraph, predicatesToEvaluate); } else { // Plan current query graph as an isolated query graph. - plans = enumerateQueryGraph( - SubqueryType::NONE, expression_vector{}, *queryGraph, predicatesToEvaluate); + plans = enumerateQueryGraph(SubqueryType::NONE, expression_vector{}, *queryGraph, + predicatesToEvaluate); } } break; default: @@ -194,12 +194,12 @@ static expression_vector getNewlyMatchedExpressions(const std::vector{prevSubgraph}, newSubgraph, expressions); + return getNewlyMatchedExpressions(std::vector{prevSubgraph}, newSubgraph, + expressions); } -void Planner::planBaseTableScans( - SubqueryType subqueryType, const expression_vector& correlatedExpressions) { +void Planner::planBaseTableScans(SubqueryType subqueryType, + const expression_vector& correlatedExpressions) { auto queryGraph = context.getQueryGraph(); auto correlatedExpressionSet = expression_set{correlatedExpressions.begin(), correlatedExpressions.end()}; @@ -256,8 +256,8 @@ void Planner::planCorrelatedExpressionsScan( auto plan = std::make_unique(); appendExpressionsScan(correlatedExpressions, *plan); plan->setCardinality(context.correlatedExpressionsCardinality); - auto predicates = getNewlyMatchedExpressions( - context.getEmptySubqueryGraph(), newSubgraph, context.getWhereExpressions()); + auto predicates = getNewlyMatchedExpressions(context.getEmptySubqueryGraph(), newSubgraph, + context.getWhereExpressions()); appendFilters(predicates, *plan); appendDistinct(correlatedExpressions, *plan); context.addPlan(newSubgraph, std::move(plan)); @@ -271,8 +271,8 @@ void Planner::planNodeScan(uint32_t nodePos) { appendScanInternalID(node->getInternalID(), node->getTableIDs(), *plan); auto properties = getProperties(*node); appendScanNodeProperties(node->getInternalID(), node->getTableIDs(), properties, *plan); - auto predicates = getNewlyMatchedExpressions( - context.getEmptySubqueryGraph(), newSubgraph, context.getWhereExpressions()); + auto predicates = getNewlyMatchedExpressions(context.getEmptySubqueryGraph(), newSubgraph, + context.getWhereExpressions()); appendFilters(predicates, *plan); context.addPlan(newSubgraph, std::move(plan)); } @@ -298,8 +298,8 @@ void Planner::planRelScan(uint32_t relPos) { auto rel = context.queryGraph->getQueryRel(relPos); auto newSubgraph = context.getEmptySubqueryGraph(); newSubgraph.addQueryRel(relPos); - auto predicates = getNewlyMatchedExpressions( - context.getEmptySubqueryGraph(), newSubgraph, context.getWhereExpressions()); + auto predicates = getNewlyMatchedExpressions(context.getEmptySubqueryGraph(), newSubgraph, + context.getWhereExpressions()); // Regardless of whether rel is directed or not, // we always enumerate two plans, one from src to dst, and the other from dst to src. for (auto direction : {ExtendDirection::FWD, ExtendDirection::BWD}) { @@ -452,8 +452,8 @@ void Planner::planWCOJoin(const SubqueryGraph& subgraph, for (auto& relPlan : relPlans) { rightPlansCopy.push_back(relPlan->shallowCopy()); } - appendIntersect( - intersectNode->getInternalID(), boundNodeIDs, *leftPlanCopy, rightPlansCopy); + appendIntersect(intersectNode->getInternalID(), boundNodeIDs, *leftPlanCopy, + rightPlansCopy); for (auto& predicate : predicates) { appendFilter(predicate, *leftPlanCopy); } @@ -467,8 +467,8 @@ void Planner::planWCOJoin(const SubqueryGraph& subgraph, // We prune such join. // Note that this does not mean we may lose good plan. An equivalent join can be found between [e2] // and (a)-[e1]->(b). -static bool needPruneImplicitJoins( - const SubqueryGraph& leftSubgraph, const SubqueryGraph& rightSubgraph, uint32_t numJoinNodes) { +static bool needPruneImplicitJoins(const SubqueryGraph& leftSubgraph, + const SubqueryGraph& rightSubgraph, uint32_t numJoinNodes) { auto leftNodePositions = leftSubgraph.getNodePositionsIgnoringNodeSelector(); auto rightNodePositions = rightSubgraph.getNodePositionsIgnoringNodeSelector(); auto intersectionSize = 0u; @@ -588,8 +588,8 @@ std::vector> Planner::planCrossProduct( for (auto& rightPlan : rightPlans) { auto leftPlanCopy = leftPlan->shallowCopy(); auto rightPlanCopy = rightPlan->shallowCopy(); - appendCrossProduct( - AccumulateType::REGULAR, *leftPlanCopy, *rightPlanCopy, *leftPlanCopy); + appendCrossProduct(AccumulateType::REGULAR, *leftPlanCopy, *rightPlanCopy, + *leftPlanCopy); result.push_back(std::move(leftPlanCopy)); } } diff --git a/src/planner/plan/plan_port_db.cpp b/src/planner/plan/plan_port_db.cpp index b9c91e0f601..1ab223fb39e 100644 --- a/src/planner/plan/plan_port_db.cpp +++ b/src/planner/plan/plan_port_db.cpp @@ -29,9 +29,9 @@ std::unique_ptr Planner::planExportDatabase(const BoundStatement& s auto regularQuery = exportTableData.getRegularQuery(); KU_ASSERT(regularQuery->getStatementType() == StatementType::QUERY); auto tablePlan = getBestPlan(*regularQuery); - auto copyTo = std::make_shared( - filePath + "/" + exportTableData.tableName + copyToSuffix, fileType, - exportTableData.columnNames, exportTableData.getColumnTypesRef(), + auto copyTo = std::make_shared(filePath + "/" + exportTableData.tableName + + copyToSuffix, + fileType, exportTableData.columnNames, exportTableData.getColumnTypesRef(), boundExportDatabase.getCopyOption(), tablePlan->getLastOperator()); logicalOperators.push_back(std::move(copyTo)); } diff --git a/src/planner/plan/plan_read.cpp b/src/planner/plan/plan_read.cpp index 010d58789f3..a22dfe453cd 100644 --- a/src/planner/plan/plan_read.cpp +++ b/src/planner/plan/plan_read.cpp @@ -11,8 +11,8 @@ using namespace kuzu::common; namespace kuzu { namespace planner { -void Planner::planReadingClause( - const BoundReadingClause* readingClause, std::vector>& prevPlans) { +void Planner::planReadingClause(const BoundReadingClause* readingClause, + std::vector>& prevPlans) { auto readingClauseType = readingClause->getClauseType(); switch (readingClauseType) { case ClauseType::MATCH: { @@ -84,8 +84,8 @@ static bool hasExternalDependency(const std::shared_ptr& expression, return false; } -void Planner::planInQueryCall( - const BoundReadingClause* readingClause, std::vector>& plans) { +void Planner::planInQueryCall(const BoundReadingClause* readingClause, + std::vector>& plans) { auto inQueryCall = ku_dynamic_cast(readingClause); std::unordered_set columnNameSet; @@ -121,8 +121,8 @@ void Planner::planInQueryCall( } } -void Planner::planLoadFrom( - const BoundReadingClause* readingClause, std::vector>& plans) { +void Planner::planLoadFrom(const BoundReadingClause* readingClause, + std::vector>& plans) { auto loadFrom = ku_dynamic_cast(readingClause); std::unordered_set columnNameSet; for (auto& column : loadFrom->getInfo()->columns) { diff --git a/src/planner/plan/plan_subquery.cpp b/src/planner/plan/plan_subquery.cpp index 67da0e2332a..6f90d93c1e3 100644 --- a/src/planner/plan/plan_subquery.cpp +++ b/src/planner/plan/plan_subquery.cpp @@ -81,8 +81,8 @@ void Planner::planRegularMatch(const QueryGraphCollection& queryGraphCollection, predicatesToPullUp.push_back(predicate); } } - auto joinNodeIDs = ExpressionUtil::getExpressionsWithDataType( - correlatedExpressions, LogicalTypeID::INTERNAL_ID); + auto joinNodeIDs = ExpressionUtil::getExpressionsWithDataType(correlatedExpressions, + LogicalTypeID::INTERNAL_ID); if (joinNodeIDs.empty()) { auto rightPlan = planQueryGraphCollectionInNewContext(SubqueryType::NONE, correlatedExpressions, @@ -120,13 +120,13 @@ void Planner::planSubquery(const std::shared_ptr& expression, Logica outerPlan.getCardinality(), *subquery->getQueryGraphCollection(), predicates); switch (subquery->getSubqueryType()) { case common::SubqueryType::EXISTS: { - appendAggregate( - expression_vector{}, expression_vector{subquery->getCountStarExpr()}, *innerPlan); + appendAggregate(expression_vector{}, expression_vector{subquery->getCountStarExpr()}, + *innerPlan); appendProjection(expression_vector{subquery->getProjectionExpr()}, *innerPlan); } break; case common::SubqueryType::COUNT: { - appendAggregate( - expression_vector{}, expression_vector{subquery->getProjectionExpr()}, *innerPlan); + appendAggregate(expression_vector{}, expression_vector{subquery->getProjectionExpr()}, + *innerPlan); } break; default: KU_UNREACHABLE; @@ -150,10 +150,10 @@ void Planner::planSubquery(const std::shared_ptr& expression, Logica appendMarkJoin(correlatedExprs, expression, outerPlan, *innerPlan); } break; case common::SubqueryType::COUNT: { - appendAggregate( - correlatedExprs, expression_vector{subquery->getProjectionExpr()}, *innerPlan); - appendHashJoin( - correlatedExprs, common::JoinType::COUNT, outerPlan, *innerPlan, outerPlan); + appendAggregate(correlatedExprs, expression_vector{subquery->getProjectionExpr()}, + *innerPlan); + appendHashJoin(correlatedExprs, common::JoinType::COUNT, outerPlan, *innerPlan, + outerPlan); } break; default: KU_UNREACHABLE; @@ -161,8 +161,8 @@ void Planner::planSubquery(const std::shared_ptr& expression, Logica } } -void Planner::planSubqueryIfNecessary( - const std::shared_ptr& expression, LogicalPlan& plan) { +void Planner::planSubqueryIfNecessary(const std::shared_ptr& expression, + LogicalPlan& plan) { if (ExpressionVisitor::hasSubquery(*expression)) { auto expressionCollector = std::make_unique(); for (auto& expr : expressionCollector->collectTopLevelSubqueryExpressions(expression)) { diff --git a/src/planner/plan/plan_update.cpp b/src/planner/plan/plan_update.cpp index 210d3e95d06..f544979f909 100644 --- a/src/planner/plan/plan_update.cpp +++ b/src/planner/plan/plan_update.cpp @@ -12,8 +12,8 @@ using namespace kuzu::binder; namespace kuzu { namespace planner { -void Planner::planUpdatingClause( - const BoundUpdatingClause* updatingClause, std::vector>& plans) { +void Planner::planUpdatingClause(const BoundUpdatingClause* updatingClause, + std::vector>& plans) { for (auto& plan : plans) { planUpdatingClause(updatingClause, *plan); } @@ -69,8 +69,8 @@ void Planner::planMergeClause(const BoundUpdatingClause* updatingClause, Logical expression_vector corrExprs; if (!plan.isEmpty()) { distinctMark = mergeClause->getDistinctMark(); - corrExprs = getCorrelatedExprs( - *mergeClause->getQueryGraphCollection(), predicates, plan.getSchema()); + corrExprs = getCorrelatedExprs(*mergeClause->getQueryGraphCollection(), predicates, + plan.getSchema()); if (corrExprs.size() == 0) { throw RuntimeException{"Constant key in merge clause is not supported yet."}; } diff --git a/src/planner/query_planner.cpp b/src/planner/query_planner.cpp index 78b7b07d473..60b1af94ea5 100644 --- a/src/planner/query_planner.cpp +++ b/src/planner/query_planner.cpp @@ -76,8 +76,8 @@ std::unique_ptr Planner::createUnionPlan( children.push_back(childPlan->getLastOperator()); } // we compute the schema based on first child - auto union_ = make_shared( - childrenPlans[0]->getSchema()->getExpressionsInScope(), std::move(children)); + auto union_ = make_shared(childrenPlans[0]->getSchema()->getExpressionsInScope(), + std::move(children)); for (auto i = 0u; i < childrenPlans.size(); ++i) { appendFlattens(union_->getGroupsPosToFlatten(i), *childrenPlans[i]); union_->setChild(i, childrenPlans[i]->getLastOperator()); diff --git a/src/planner/subplans_table.cpp b/src/planner/subplans_table.cpp index 130e7466890..d51cf8a0fe5 100644 --- a/src/planner/subplans_table.cpp +++ b/src/planner/subplans_table.cpp @@ -59,8 +59,8 @@ std::vector DPLevel::getSubqueryGraphs() { return result; } -void DPLevel::addPlan( - const kuzu::binder::SubqueryGraph& subqueryGraph, std::unique_ptr plan) { +void DPLevel::addPlan(const kuzu::binder::SubqueryGraph& subqueryGraph, + std::unique_ptr plan) { if (subgraph2Plans.size() > MAX_NUM_SUBGRAPH) { return; } diff --git a/src/processor/map/create_factorized_table_scan.cpp b/src/processor/map/create_factorized_table_scan.cpp index d10da28b8a3..2c839ebded3 100644 --- a/src/processor/map/create_factorized_table_scan.cpp +++ b/src/processor/map/create_factorized_table_scan.cpp @@ -26,8 +26,8 @@ std::unique_ptr PlanMapper::createFTableScan(const expression_ } auto bindData = std::make_unique(table, std::move(colIndices), maxMorselSize); - auto function = function::BuiltInFunctionsUtils::matchFunction( - FTableScan::name, clientContext->getCatalog()->getFunctions(clientContext->getTx())); + auto function = function::BuiltInFunctionsUtils::matchFunction(FTableScan::name, + clientContext->getCatalog()->getFunctions(clientContext->getTx())); auto info = InQueryCallInfo(); info.function = *ku_dynamic_cast(function); info.bindData = std::move(bindData); @@ -40,8 +40,8 @@ std::unique_ptr PlanMapper::createFTableScan(const expression_ info.outputType = TableScanOutputType::MULTI_DATA_CHUNK; auto sharedState = std::make_shared(); if (child == nullptr) { - return std::make_unique( - std::move(info), sharedState, getOperatorID(), ExpressionUtil::toString(exprs)); + return std::make_unique(std::move(info), sharedState, getOperatorID(), + ExpressionUtil::toString(exprs)); } return std::make_unique(std::move(info), sharedState, std::move(child), getOperatorID(), ExpressionUtil::toString(exprs)); @@ -90,15 +90,15 @@ std::unique_ptr PlanMapper::createFTableScanAligned( std::unique_ptr PlanMapper::createFTableScanAligned( const expression_vector& exprs, Schema* schema, std::shared_ptr table, uint64_t maxMorselSize, std::unique_ptr child) { - return createFTableScanAligned( - exprs, schema, nullptr /* offset*/, std::move(table), maxMorselSize, std::move(child)); + return createFTableScanAligned(exprs, schema, nullptr /* offset*/, std::move(table), + maxMorselSize, std::move(child)); } std::unique_ptr PlanMapper::createFTableScanAligned( const expression_vector& exprs, planner::Schema* schema, std::shared_ptr table, uint64_t maxMorselSize) { - return createFTableScanAligned( - exprs, schema, std::move(table), maxMorselSize, nullptr /* child */); + return createFTableScanAligned(exprs, schema, std::move(table), maxMorselSize, + nullptr /* child */); } } // namespace processor diff --git a/src/processor/map/create_result_collector.cpp b/src/processor/map/create_result_collector.cpp index 685fedc4d3e..029db31faa0 100644 --- a/src/processor/map/create_result_collector.cpp +++ b/src/processor/map/create_result_collector.cpp @@ -20,8 +20,8 @@ std::unique_ptr PlanMapper::createResultCollector(AccumulateTyp columnSchema = std::make_unique(false /* isUnFlat */, dataPos.dataChunkPos, LogicalTypeUtils::getRowLayoutSize(expression->dataType)); } else { - columnSchema = std::make_unique( - true /* isUnFlat */, dataPos.dataChunkPos, (uint32_t)sizeof(overflow_value_t)); + columnSchema = std::make_unique(true /* isUnFlat */, dataPos.dataChunkPos, + (uint32_t)sizeof(overflow_value_t)); } tableSchema->appendColumn(std::move(columnSchema)); payloadsPos.push_back(dataPos); diff --git a/src/processor/map/expression_mapper.cpp b/src/processor/map/expression_mapper.cpp index 3b8c637f8a1..fda446c9d4d 100644 --- a/src/processor/map/expression_mapper.cpp +++ b/src/processor/map/expression_mapper.cpp @@ -70,8 +70,8 @@ std::unique_ptr ExpressionMapper::getEvaluator( return getFunctionEvaluator(expression, schema); } else { // LCOV_EXCL_START - throw NotImplementedException(stringFormat( - "Cannot evaluate expression with type {}.", expressionTypeToString(expressionType))); + throw NotImplementedException(stringFormat("Cannot evaluate expression with type {}.", + expressionTypeToString(expressionType))); // LCOV_EXCL_STOP } } @@ -88,8 +88,8 @@ std::unique_ptr ExpressionMapper::getConstantEvaluator( return getFunctionEvaluator(expression, nullptr); } else { // LCOV_EXCL_START - throw NotImplementedException(stringFormat( - "Cannot evaluate expression with type {}.", expressionTypeToString(expressionType))); + throw NotImplementedException(stringFormat("Cannot evaluate expression with type {}.", + expressionTypeToString(expressionType))); // LCOV_EXCL_STOP } } @@ -128,15 +128,15 @@ std::unique_ptr ExpressionMapper::getCaseEvaluator( std::move(whenEvaluator), std::move(thenEvaluator))); } auto elseEvaluator = getEvaluator(caseExpression->getElseExpression(), schema); - return std::make_unique( - std::move(expression), std::move(alternativeEvaluators), std::move(elseEvaluator)); + return std::make_unique(std::move(expression), + std::move(alternativeEvaluators), std::move(elseEvaluator)); } std::unique_ptr ExpressionMapper::getFunctionEvaluator( std::shared_ptr expression, const Schema* schema) { auto childrenEvaluators = getEvaluators(expression->getChildren(), schema); - return std::make_unique( - std::move(expression), std::move(childrenEvaluators)); + return std::make_unique(std::move(expression), + std::move(childrenEvaluators)); } std::unique_ptr ExpressionMapper::getNodeEvaluator( @@ -149,8 +149,8 @@ std::unique_ptr ExpressionMapper::getNodeEvaluator( children.push_back(property); } auto childrenEvaluators = getEvaluators(children, schema); - return std::make_unique( - std::move(expression), std::move(childrenEvaluators)); + return std::make_unique(std::move(expression), + std::move(childrenEvaluators)); } std::unique_ptr ExpressionMapper::getRelEvaluator( @@ -164,15 +164,15 @@ std::unique_ptr ExpressionMapper::getRelEvaluator( children.push_back(property); } auto childrenEvaluators = getEvaluators(children, schema); - return std::make_unique( - std::move(expression), std::move(childrenEvaluators)); + return std::make_unique(std::move(expression), + std::move(childrenEvaluators)); } std::unique_ptr ExpressionMapper::getPathEvaluator( std::shared_ptr expression, const Schema* schema) { auto childrenEvaluators = getEvaluators(expression->getChildren(), schema); - return std::make_unique( - std::move(expression), std::move(childrenEvaluators)); + return std::make_unique(std::move(expression), + std::move(childrenEvaluators)); } std::vector> ExpressionMapper::getEvaluators( diff --git a/src/processor/map/map_accumulate.cpp b/src/processor/map/map_accumulate.cpp index 78f4fb36a8e..3870e8bee19 100644 --- a/src/processor/map/map_accumulate.cpp +++ b/src/processor/map/map_accumulate.cpp @@ -14,12 +14,12 @@ std::unique_ptr PlanMapper::mapAccumulate(LogicalOperator* log auto inSchema = acc->getChild(0)->getSchema(); auto prevOperator = mapOperator(acc->getChild(0).get()); auto expressions = acc->getPayloads(); - auto resultCollector = createResultCollector( - acc->getAccumulateType(), expressions, inSchema, std::move(prevOperator)); + auto resultCollector = createResultCollector(acc->getAccumulateType(), expressions, inSchema, + std::move(prevOperator)); auto table = resultCollector->getResultFactorizedTable(); auto maxMorselSize = table->hasUnflatCol() ? 1 : DEFAULT_VECTOR_CAPACITY; - return createFTableScanAligned( - expressions, outSchema, acc->getOffset(), table, maxMorselSize, std::move(resultCollector)); + return createFTableScanAligned(expressions, outSchema, acc->getOffset(), table, maxMorselSize, + std::move(resultCollector)); } } // namespace processor diff --git a/src/processor/map/map_aggregate.cpp b/src/processor/map/map_aggregate.cpp index cfe8c0d26e2..fc811f3809d 100644 --- a/src/processor/map/map_aggregate.cpp +++ b/src/processor/map/map_aggregate.cpp @@ -45,14 +45,14 @@ static std::vector> getAggregateInputInfos( multiplicityChunksPos.push_back(groupPos); } } - result.emplace_back(std::make_unique( - aggregateVectorPos, std::move(multiplicityChunksPos))); + result.emplace_back(std::make_unique(aggregateVectorPos, + std::move(multiplicityChunksPos))); } return result; } -static binder::expression_vector getKeyExpressions( - const binder::expression_vector& expressions, const Schema& schema, bool isFlat) { +static binder::expression_vector getKeyExpressions(const binder::expression_vector& expressions, + const Schema& schema, bool isFlat) { binder::expression_vector result; for (auto& expression : expressions) { if (schema.getGroup(schema.getGroupPos(*expression))->isFlat() == isFlat) { @@ -88,8 +88,8 @@ std::unique_ptr PlanMapper::mapAggregate(LogicalOperator* logi make_unique(std::make_unique(inSchema), sharedState, std::move(aggregateFunctions), std::move(aggregateInputInfos), std::move(prevOperator), getOperatorID(), paramsString); - return make_unique( - sharedState, aggregatesOutputPos, std::move(aggregate), getOperatorID(), paramsString); + return make_unique(sharedState, aggregatesOutputPos, + std::move(aggregate), getOperatorID(), paramsString); } } @@ -114,12 +114,12 @@ static std::unique_ptr getFactorizedTableSchema( tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, size)); } for (auto& aggregateFunc : aggregateFunctions) { - tableSchema->appendColumn(std::make_unique( - isUnflat, dataChunkPos, aggregateFunc->getAggregateStateSize())); + tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, + aggregateFunc->getAggregateStateSize())); } if (markExpression != nullptr) { - tableSchema->appendColumn(std::make_unique( - isUnflat, dataChunkPos, LogicalTypeUtils::getRowLayoutSize(markExpression->dataType))); + tableSchema->appendColumn(std::make_unique(isUnflat, dataChunkPos, + LogicalTypeUtils::getRowLayoutSize(markExpression->dataType))); } tableSchema->appendColumn( std::make_unique(isUnflat, dataChunkPos, sizeof(hash_t))); @@ -136,8 +136,8 @@ std::unique_ptr PlanMapper::createHashAggregate( auto sharedState = make_shared(aggregateFunctions); auto flatKeys = getKeyExpressions(keys, *inSchema, true /* isFlat */); auto unFlatKeys = getKeyExpressions(keys, *inSchema, false /* isFlat */); - auto tableSchema = getFactorizedTableSchema( - flatKeys, unFlatKeys, payloads, aggregateFunctions, markExpression); + auto tableSchema = getFactorizedTableSchema(flatKeys, unFlatKeys, payloads, aggregateFunctions, + markExpression); HashAggregateInfo aggregateInfo{getExpressionsDataPos(flatKeys, *inSchema), getExpressionsDataPos(unFlatKeys, *inSchema), getExpressionsDataPos(payloads, *inSchema), std::move(tableSchema), diff --git a/src/processor/map/map_comment_on.cpp b/src/processor/map/map_comment_on.cpp index dea444f97e3..a84b41ecb6b 100644 --- a/src/processor/map/map_comment_on.cpp +++ b/src/processor/map/map_comment_on.cpp @@ -18,8 +18,8 @@ std::unique_ptr PlanMapper::mapCommentOn( auto commentOnInfo = std::make_unique(logicalCommentOn->getTableID(), logicalCommentOn->getTableName(), logicalCommentOn->getComment(), outputPos, clientContext->getCatalog()); - return std::make_unique( - std::move(commentOnInfo), getOperatorID(), logicalCommentOn->getExpressionsForPrinting()); + return std::make_unique(std::move(commentOnInfo), getOperatorID(), + logicalCommentOn->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/map_copy_from.cpp b/src/processor/map/map_copy_from.cpp index 506669cadec..e5a053563b2 100644 --- a/src/processor/map/map_copy_from.cpp +++ b/src/processor/map/map_copy_from.cpp @@ -71,8 +71,8 @@ static void getRelColumnNamesInCopyOrder(TableCatalogEntry* tableEntry, } } -static std::shared_ptr matchColumnExpression( - const expression_vector& columnExpressions, const std::string& columnName) { +static std::shared_ptr matchColumnExpression(const expression_vector& columnExpressions, + const std::string& columnName) { for (auto& expression : columnExpressions) { if (columnName == expression->toString()) { return expression; @@ -105,8 +105,8 @@ std::unique_ptr PlanMapper::mapCopyNodeFrom(LogicalOperator* l // Map reader. auto prevOperator = mapOperator(copyFrom->getChild(0).get()); auto nodeTable = storageManager->getTable(nodeTableEntry->getTableID()); - auto sharedState = std::make_shared( - nodeTable, getSingleStringColumnFTable(), storageManager->getWAL()); + auto sharedState = std::make_shared(nodeTable, + getSingleStringColumnFTable(), storageManager->getWAL()); if (prevOperator->getOperatorType() == PhysicalOperatorType::IN_QUERY_CALL) { auto inQueryCall = ku_dynamic_cast(prevOperator.get()); sharedState->readerSharedState = inQueryCall->getSharedState(); @@ -213,8 +213,8 @@ physical_op_vector_t PlanMapper::mapCopyRelFrom(LogicalOperator* logicalOperator for (auto& property : relTableEntry->getPropertiesRef()) { columnTypes.push_back(*property.getDataType()->copy()); } - auto batchInsertSharedState = std::make_shared( - relTable, getSingleStringColumnFTable(), storageManager->getWAL()); + auto batchInsertSharedState = std::make_shared(relTable, + getSingleStringColumnFTable(), storageManager->getWAL()); auto copyRelFWD = createCopyRel(partitionerSharedState, batchInsertSharedState, copyFrom, RelDataDirection::FWD, LogicalType::copy(columnTypes)); auto copyRelBWD = createCopyRel(partitionerSharedState, batchInsertSharedState, copyFrom, diff --git a/src/processor/map/map_copy_to.cpp b/src/processor/map/map_copy_to.cpp index d00628fc3ff..044f40a920c 100644 --- a/src/processor/map/map_copy_to.cpp +++ b/src/processor/map/map_copy_to.cpp @@ -24,8 +24,8 @@ std::unique_ptr getCopyToInfo(Schema* childSchema, std::string fileP std::unique_ptr columnSchema; if (!childSchema->getGroup(dataChunkPos)->isFlat()) { // payload is unFlat and not in the same group as keys - columnSchema = std::make_unique( - true /* isUnFlat */, dataChunkPos, sizeof(overflow_value_t)); + columnSchema = std::make_unique(true /* isUnFlat */, dataChunkPos, + sizeof(overflow_value_t)); countingVecPos = DataPos(childSchema->getExpressionPos(*copyToExpression)); } else { columnSchema = std::make_unique(false /* isUnFlat */, dataChunkPos, @@ -88,8 +88,8 @@ std::unique_ptr PlanMapper::mapCopyTo(LogicalOperator* logical } std::shared_ptr fTable; auto ftTableSchema = std::make_unique(); - fTable = std::make_shared( - clientContext->getMemoryManager(), std::move(ftTableSchema)); + fTable = std::make_shared(clientContext->getMemoryManager(), + std::move(ftTableSchema)); return createEmptyFTableScan(fTable, 0, std::move(copyTo)); } diff --git a/src/processor/map/map_delete.cpp b/src/processor/map/map_delete.cpp index de7ac9bf8f8..30e436f5e0f 100644 --- a/src/processor/map/map_delete.cpp +++ b/src/processor/map/map_delete.cpp @@ -12,8 +12,8 @@ using namespace kuzu::storage; namespace kuzu { namespace processor { -static std::unique_ptr getNodeDeleteExecutor( - LogicalDeleteNodeInfo* info, const Schema& inSchema, main::ClientContext* clientContext) { +static std::unique_ptr getNodeDeleteExecutor(LogicalDeleteNodeInfo* info, + const Schema& inSchema, main::ClientContext* clientContext) { auto nodeIDPos = DataPos(inSchema.getExpressionPos(*info->node->getInternalID())); auto storageManager = clientContext->getStorageManager(); auto catalog = clientContext->getCatalog(); @@ -48,8 +48,8 @@ static std::unique_ptr getNodeDeleteExecutor( } else { auto table = ku_dynamic_cast( storageManager->getTable(info->node->getSingleTableID())); - auto tableEntry = catalog->getTableCatalogEntry( - &transaction::DUMMY_READ_TRANSACTION, info->node->getSingleTableID()); + auto tableEntry = catalog->getTableCatalogEntry(&transaction::DUMMY_READ_TRANSACTION, + info->node->getSingleTableID()); auto nodeTableEntry = ku_dynamic_cast(tableEntry); auto fwdRelTableIDs = nodeTableEntry->getFwdRelTableIDSet(); @@ -64,8 +64,8 @@ static std::unique_ptr getNodeDeleteExecutor( bwdRelTables.insert( ku_dynamic_cast(storageManager->getTable(tableID))); } - return std::make_unique( - table, std::move(fwdRelTables), std::move(bwdRelTables), info->deleteType, nodeIDPos); + return std::make_unique(table, std::move(fwdRelTables), + std::move(bwdRelTables), info->deleteType, nodeIDPos); } } @@ -93,13 +93,13 @@ static std::unique_ptr getRelDeleteExecutor( auto table = ku_dynamic_cast(storageManager.getTable(tableID)); tableIDToTableMap.insert({tableID, table}); } - return std::make_unique( - std::move(tableIDToTableMap), srcNodePos, dstNodePos, relIDPos); + return std::make_unique(std::move(tableIDToTableMap), + srcNodePos, dstNodePos, relIDPos); } else { auto table = ku_dynamic_cast(storageManager.getTable(rel.getSingleTableID())); - return std::make_unique( - table, srcNodePos, dstNodePos, relIDPos); + return std::make_unique(table, srcNodePos, dstNodePos, + relIDPos); } } diff --git a/src/processor/map/map_detach_database.cpp b/src/processor/map/map_detach_database.cpp index 84e331811ad..be70e803e90 100644 --- a/src/processor/map/map_detach_database.cpp +++ b/src/processor/map/map_detach_database.cpp @@ -11,8 +11,8 @@ std::unique_ptr PlanMapper::mapDetachDatabase( planner::LogicalOperator* logicalOperator) { auto detachDatabase = common::ku_dynamic_cast(logicalOperator); - return std::make_unique( - detachDatabase->getDBName(), getOperatorID(), detachDatabase->getExpressionsForPrinting()); + return std::make_unique(detachDatabase->getDBName(), getOperatorID(), + detachDatabase->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/map_explain.cpp b/src/processor/map/map_explain.cpp index d7232f060ff..9e3b54903e5 100644 --- a/src/processor/map/map_explain.cpp +++ b/src/processor/map/map_explain.cpp @@ -30,8 +30,8 @@ std::unique_ptr PlanMapper::mapExplain(LogicalOperator* logica auto planPrinter = std::make_unique(physicalPlanToExplain.get(), profiler.get()); auto explainStr = planPrinter->printPlanToOstream().str(); - auto factorizedTable = FactorizedTableUtils::getFactorizedTableForOutputMsg( - explainStr, clientContext->getMemoryManager()); + auto factorizedTable = FactorizedTableUtils::getFactorizedTableForOutputMsg(explainStr, + clientContext->getMemoryManager()); return createFTableScanAligned(expression_vector{outputExpression}, outSchema, factorizedTable, DEFAULT_VECTOR_CAPACITY /* maxMorselSize */); } diff --git a/src/processor/map/map_extend.cpp b/src/processor/map/map_extend.cpp index a80b6c091c7..7263f62ff76 100644 --- a/src/processor/map/map_extend.cpp +++ b/src/processor/map/map_extend.cpp @@ -42,8 +42,8 @@ static std::unique_ptr populateRelTableCollectionScan switch (extendDirection) { case ExtendDirection::FWD: { if (relTableEntry->getBoundTableID(RelDataDirection::FWD) == boundNodeTableID) { - auto scanInfo = getRelTableScanInfo( - relTableEntry, RelDataDirection::FWD, storageManager, properties); + auto scanInfo = getRelTableScanInfo(relTableEntry, RelDataDirection::FWD, + storageManager, properties); if (scanInfo != nullptr) { scanInfos.push_back(std::move(scanInfo)); } @@ -51,8 +51,8 @@ static std::unique_ptr populateRelTableCollectionScan } break; case ExtendDirection::BWD: { if (relTableEntry->getBoundTableID(RelDataDirection::BWD) == boundNodeTableID) { - auto scanInfo = getRelTableScanInfo( - relTableEntry, RelDataDirection::BWD, storageManager, properties); + auto scanInfo = getRelTableScanInfo(relTableEntry, RelDataDirection::BWD, + storageManager, properties); if (scanInfo != nullptr) { scanInfos.push_back(std::move(scanInfo)); } @@ -60,15 +60,15 @@ static std::unique_ptr populateRelTableCollectionScan } break; case ExtendDirection::BOTH: { if (relTableEntry->getBoundTableID(RelDataDirection::FWD) == boundNodeTableID) { - auto scanInfoFWD = getRelTableScanInfo( - relTableEntry, RelDataDirection::FWD, storageManager, properties); + auto scanInfoFWD = getRelTableScanInfo(relTableEntry, RelDataDirection::FWD, + storageManager, properties); if (scanInfoFWD != nullptr) { scanInfos.push_back(std::move(scanInfoFWD)); } } if (relTableEntry->getBoundTableID(RelDataDirection::BWD) == boundNodeTableID) { - auto scanInfoBWD = getRelTableScanInfo( - relTableEntry, RelDataDirection::BWD, storageManager, properties); + auto scanInfoBWD = getRelTableScanInfo(relTableEntry, RelDataDirection::BWD, + storageManager, properties); if (scanInfoBWD != nullptr) { scanInfos.push_back(std::move(scanInfoBWD)); } @@ -103,8 +103,8 @@ std::unique_ptr PlanMapper::mapExtend(LogicalOperator* logical if (!rel->isMultiLabeled() && !boundNode->isMultiLabeled() && extendDirection != ExtendDirection::BOTH) { auto relTableEntry = ku_dynamic_cast( - clientContext->getCatalog()->getTableCatalogEntry( - clientContext->getTx(), rel->getSingleTableID())); + clientContext->getCatalog()->getTableCatalogEntry(clientContext->getTx(), + rel->getSingleTableID())); auto relDataDirection = ExtendDirectionUtils::getRelDataDirection(extendDirection); auto scanInfo = getRelTableScanInfo(relTableEntry, relDataDirection, clientContext->getStorageManager(), extend->getProperties()); @@ -113,8 +113,8 @@ std::unique_ptr PlanMapper::mapExtend(LogicalOperator* logical } else { // map to generic extend std::unordered_map> scanners; for (auto boundNodeTableID : boundNode->getTableIDs()) { - auto scanner = populateRelTableCollectionScanner( - boundNodeTableID, *rel, extendDirection, extend->getProperties(), *clientContext); + auto scanner = populateRelTableCollectionScanner(boundNodeTableID, *rel, + extendDirection, extend->getProperties(), *clientContext); if (scanner != nullptr) { scanners.insert({boundNodeTableID, std::move(scanner)}); } diff --git a/src/processor/map/map_hash_join.cpp b/src/processor/map/map_hash_join.cpp index d6c9a18de4f..f13837b821a 100644 --- a/src/processor/map/map_hash_join.cpp +++ b/src/processor/map/map_hash_join.cpp @@ -10,8 +10,8 @@ using namespace kuzu::common; namespace kuzu { namespace processor { -std::unique_ptr PlanMapper::createHashBuildInfo( - const Schema& buildSchema, const expression_vector& keys, const expression_vector& payloads) { +std::unique_ptr PlanMapper::createHashBuildInfo(const Schema& buildSchema, + const expression_vector& keys, const expression_vector& payloads) { planner::f_group_pos_set keyGroupPosSet; std::vector keysPos; std::vector fStateTypes; @@ -41,8 +41,8 @@ std::unique_ptr PlanMapper::createHashBuildInfo( columnSchema = std::make_unique(false /* isUnFlat */, pos.dataChunkPos, LogicalTypeUtils::getRowLayoutSize(payload->dataType)); } else { - columnSchema = std::make_unique( - true /* isUnFlat */, pos.dataChunkPos, (uint32_t)sizeof(overflow_value_t)); + columnSchema = std::make_unique(true /* isUnFlat */, pos.dataChunkPos, + (uint32_t)sizeof(overflow_value_t)); } tableSchema->appendColumn(std::move(columnSchema)); payloadsPos.push_back(pos); @@ -53,8 +53,8 @@ std::unique_ptr PlanMapper::createHashBuildInfo( auto pointerColumn = std::make_unique(false /* isUnFlat */, INVALID_DATA_CHUNK_POS, LogicalTypeUtils::getRowLayoutSize(*LogicalType::INT64())); tableSchema->appendColumn(std::move(pointerColumn)); - return std::make_unique( - std::move(keysPos), std::move(fStateTypes), std::move(payloadsPos), std::move(tableSchema)); + return std::make_unique(std::move(keysPos), std::move(fStateTypes), + std::move(payloadsPos), std::move(tableSchema)); } std::unique_ptr PlanMapper::mapHashJoin(LogicalOperator* logicalOperator) { diff --git a/src/processor/map/map_in_query_call.cpp b/src/processor/map/map_in_query_call.cpp index 0402488be53..59ca20c9301 100644 --- a/src/processor/map/map_in_query_call.cpp +++ b/src/processor/map/map_in_query_call.cpp @@ -23,8 +23,8 @@ std::unique_ptr PlanMapper::mapInQueryCall(LogicalOperator* lo info.outputType = outPosV.empty() ? TableScanOutputType::EMPTY : TableScanOutputType::SINGLE_DATA_CHUNK; auto sharedState = std::make_shared(); - return std::make_unique( - std::move(info), sharedState, getOperatorID(), call->getExpressionsForPrinting()); + return std::make_unique(std::move(info), sharedState, getOperatorID(), + call->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/map_index_scan_node.cpp b/src/processor/map/map_index_scan_node.cpp index 96d12085878..7af7630ece9 100644 --- a/src/processor/map/map_index_scan_node.cpp +++ b/src/processor/map/map_index_scan_node.cpp @@ -27,8 +27,8 @@ std::unique_ptr PlanMapper::mapIndexScan( ->getPKIndex(); auto offsetPos = DataPos(outSchema->getExpressionPos(*info->offset)); auto keyPos = DataPos(outSchema->getExpressionPos(*info->key)); - indexLookupInfos.push_back(std::make_unique( - info->indexType.copy(), storageIndex, keyPos, offsetPos)); + indexLookupInfos.push_back(std::make_unique(info->indexType.copy(), + storageIndex, keyPos, offsetPos)); } return std::make_unique(std::move(indexLookupInfos), std::move(prevOperator), getOperatorID(), logicalIndexScan->getExpressionsForPrinting()); diff --git a/src/processor/map/map_insert.cpp b/src/processor/map/map_insert.cpp index 8b46256d1e3..66c9a48b2f5 100644 --- a/src/processor/map/map_insert.cpp +++ b/src/processor/map/map_insert.cpp @@ -15,8 +15,8 @@ using namespace kuzu::binder; namespace kuzu { namespace processor { -static std::vector populateReturnVectorsPos( - const LogicalInsertInfo& info, const Schema& schema) { +static std::vector populateReturnVectorsPos(const LogicalInsertInfo& info, + const Schema& schema) { std::vector result; for (auto i = 0u; i < info.columnDataExprs.size(); ++i) { if (info.isReturnColumnExprs[i]) { @@ -28,8 +28,8 @@ static std::vector populateReturnVectorsPos( return result; } -std::unique_ptr PlanMapper::getNodeInsertExecutor( - const LogicalInsertInfo* info, const Schema& inSchema, const Schema& outSchema) const { +std::unique_ptr PlanMapper::getNodeInsertExecutor(const LogicalInsertInfo* info, + const Schema& inSchema, const Schema& outSchema) const { auto storageManager = clientContext->getStorageManager(); auto node = ku_dynamic_cast(info->pattern.get()); auto nodeTableID = node->getSingleTableID(); diff --git a/src/processor/map/map_label_filter.cpp b/src/processor/map/map_label_filter.cpp index 5fac14fac92..ddf4acab562 100644 --- a/src/processor/map/map_label_filter.cpp +++ b/src/processor/map/map_label_filter.cpp @@ -12,8 +12,8 @@ std::unique_ptr PlanMapper::mapNodeLabelFilter(LogicalOperator auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); auto schema = logicalOperator->getSchema(); auto nbrNodeVectorPos = DataPos(schema->getExpressionPos(*logicalLabelFilter->getNodeID())); - auto filterInfo = std::make_unique( - nbrNodeVectorPos, logicalLabelFilter->getTableIDSet()); + auto filterInfo = std::make_unique(nbrNodeVectorPos, + logicalLabelFilter->getTableIDSet()); return std::make_unique(std::move(filterInfo), std::move(prevOperator), getOperatorID(), logicalLabelFilter->getExpressionsForPrinting()); } diff --git a/src/processor/map/map_multiplicity_reducer.cpp b/src/processor/map/map_multiplicity_reducer.cpp index d3e8abbc729..810781f12d4 100644 --- a/src/processor/map/map_multiplicity_reducer.cpp +++ b/src/processor/map/map_multiplicity_reducer.cpp @@ -9,8 +9,8 @@ namespace processor { std::unique_ptr PlanMapper::mapMultiplicityReducer( LogicalOperator* logicalOperator) { auto prevOperator = mapOperator(logicalOperator->getChild(0).get()); - return make_unique( - std::move(prevOperator), getOperatorID(), logicalOperator->getExpressionsForPrinting()); + return make_unique(std::move(prevOperator), getOperatorID(), + logicalOperator->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/map_order_by.cpp b/src/processor/map/map_order_by.cpp index 2e963422503..ae68ae5bf89 100644 --- a/src/processor/map/map_order_by.cpp +++ b/src/processor/map/map_order_by.cpp @@ -33,8 +33,8 @@ std::unique_ptr PlanMapper::mapOrderBy(LogicalOperator* logica std::unique_ptr columnSchema; if (!inSchema->getGroup(dataChunkPos)->isFlat() && !mayContainUnFlatKey) { // payload is unFlat and not in the same group as keys - columnSchema = std::make_unique( - true /* isUnFlat */, dataChunkPos, sizeof(overflow_value_t)); + columnSchema = std::make_unique(true /* isUnFlat */, dataChunkPos, + sizeof(overflow_value_t)); } else { columnSchema = std::make_unique(false /* isUnFlat */, dataChunkPos, LogicalTypeUtils::getRowLayoutSize(expression->getDataType())); @@ -63,8 +63,8 @@ std::unique_ptr PlanMapper::mapOrderBy(LogicalOperator* logica auto topK = make_unique(std::make_unique(inSchema), std::move(orderByDataInfo), topKSharedState, logicalOrderBy->getSkipNum(), logicalOrderBy->getLimitNum(), std::move(prevOperator), getOperatorID(), paramsString); - return make_unique( - outPos, topKSharedState, std::move(topK), getOperatorID(), paramsString); + return make_unique(outPos, topKSharedState, std::move(topK), getOperatorID(), + paramsString); } else { auto orderBySharedState = std::make_shared(); auto orderBy = make_unique(std::make_unique(inSchema), @@ -73,8 +73,8 @@ std::unique_ptr PlanMapper::mapOrderBy(LogicalOperator* logica auto dispatcher = std::make_shared(); auto orderByMerge = make_unique(orderBySharedState, std::move(dispatcher), std::move(orderBy), getOperatorID(), paramsString); - return make_unique( - outPos, orderBySharedState, std::move(orderByMerge), getOperatorID(), paramsString); + return make_unique(outPos, orderBySharedState, std::move(orderByMerge), + getOperatorID(), paramsString); } } diff --git a/src/processor/map/map_path_property_probe.cpp b/src/processor/map/map_path_property_probe.cpp index 9451953a6e9..303a545efaf 100644 --- a/src/processor/map/map_path_property_probe.cpp +++ b/src/processor/map/map_path_property_probe.cpp @@ -115,8 +115,8 @@ std::unique_ptr PlanMapper::mapPathPropertyProbe( if (relBuild != nullptr) { children.push_back(std::move(relBuild)); } - auto pathPropertyProbe = std::make_unique( - std::move(pathProbeInfo), pathProbeSharedState, std::move(children), getOperatorID(), ""); + auto pathPropertyProbe = std::make_unique(std::move(pathProbeInfo), + pathProbeSharedState, std::move(children), getOperatorID(), ""); if (logicalProbe->getSIP() == planner::SidewaysInfoPassing::PROBE_TO_BUILD) { mapSIPJoin(pathPropertyProbe.get()); } diff --git a/src/processor/map/map_port_db.cpp b/src/processor/map/map_port_db.cpp index 9a9aec8f8e9..2dbd6b506f1 100644 --- a/src/processor/map/map_port_db.cpp +++ b/src/processor/map/map_port_db.cpp @@ -42,8 +42,8 @@ std::unique_ptr PlanMapper::mapImportDatabase( auto importDatabase = ku_dynamic_cast(logicalOperator); std::unique_ptr resultSetDescriptor; - return std::make_unique( - importDatabase->getQuery(), getOperatorID(), importDatabase->getExpressionsForPrinting()); + return std::make_unique(importDatabase->getQuery(), getOperatorID(), + importDatabase->getExpressionsForPrinting()); } } // namespace processor } // namespace kuzu diff --git a/src/processor/map/map_scan_file.cpp b/src/processor/map/map_scan_file.cpp index 2cb623f5035..27e5d0d2962 100644 --- a/src/processor/map/map_scan_file.cpp +++ b/src/processor/map/map_scan_file.cpp @@ -30,8 +30,8 @@ std::unique_ptr PlanMapper::mapScanFile(LogicalOperator* logic info.outputType = outPosV.empty() ? TableScanOutputType::EMPTY : TableScanOutputType::SINGLE_DATA_CHUNK; auto sharedState = std::make_shared(); - return std::make_unique( - std::move(info), sharedState, getOperatorID(), scanFile->getExpressionsForPrinting()); + return std::make_unique(std::move(info), sharedState, getOperatorID(), + scanFile->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/map_scan_frontier.cpp b/src/processor/map/map_scan_frontier.cpp index a031ca7e7e7..d38cdcd6d8e 100644 --- a/src/processor/map/map_scan_frontier.cpp +++ b/src/processor/map/map_scan_frontier.cpp @@ -14,8 +14,8 @@ std::unique_ptr PlanMapper::mapScanFrontier( auto nodeIDPos = DataPos(schema->getExpressionPos(*scanFrontier->getNodeID())); auto flagPos = DataPos(schema->getExpressionPos(*scanFrontier->getNodePredicateExecutionFlag())); - return std::make_unique( - ScanFrontierInfo{nodeIDPos, flagPos}, getOperatorID(), std::string()); + return std::make_unique(ScanFrontierInfo{nodeIDPos, flagPos}, getOperatorID(), + std::string()); } } // namespace processor diff --git a/src/processor/map/map_scan_node.cpp b/src/processor/map/map_scan_node.cpp index ab304ef15c4..7ca29df23ce 100644 --- a/src/processor/map/map_scan_node.cpp +++ b/src/processor/map/map_scan_node.cpp @@ -19,8 +19,8 @@ std::unique_ptr PlanMapper::mapScanInternalID(LogicalOperator* clientContext->getStorageManager()->getTable(tableID)); sharedState->addTableState(nodeTable); } - return std::make_unique( - dataPos, sharedState, getOperatorID(), scan->getExpressionsForPrinting()); + return std::make_unique(dataPos, sharedState, getOperatorID(), + scan->getExpressionsForPrinting()); } } // namespace processor diff --git a/src/processor/map/map_semi_masker.cpp b/src/processor/map/map_semi_masker.cpp index 0ed05958774..24deabbdf35 100644 --- a/src/processor/map/map_semi_masker.cpp +++ b/src/processor/map/map_semi_masker.cpp @@ -27,8 +27,8 @@ std::unique_ptr PlanMapper::mapSemiMasker(LogicalOperator* log for (auto i = 0u; i < scanNodeID->getSharedState()->getNumTableStates(); ++i) { auto tableState = scanNodeID->getSharedState()->getTableState(i); auto tableID = tableState->getTable()->getTableID(); - masksPerTable.at(tableID).emplace_back( - tableState->getSemiMask(), 0 /* initial mask idx */); + masksPerTable.at(tableID).emplace_back(tableState->getSemiMask(), + 0 /* initial mask idx */); } } break; case PhysicalOperatorType::RECURSIVE_JOIN: { diff --git a/src/processor/map/map_set.cpp b/src/processor/map/map_set.cpp index f27d5d17ea7..ecca5996213 100644 --- a/src/processor/map/map_set.cpp +++ b/src/processor/map/map_set.cpp @@ -41,8 +41,8 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( ->getColumnID(propertyID); tableIDToSetInfo.insert({tableID, NodeSetInfo{table, columnID}}); } - return std::make_unique( - std::move(tableIDToSetInfo), nodeIDPos, propertyPos, std::move(evaluator)); + return std::make_unique(std::move(tableIDToSetInfo), nodeIDPos, + propertyPos, std::move(evaluator)); } else { auto tableID = node->getSingleTableID(); auto table = ku_dynamic_cast(storageManager->getTable(tableID)); @@ -52,8 +52,8 @@ std::unique_ptr PlanMapper::getNodeSetExecutor( columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); } - return std::make_unique( - NodeSetInfo{table, columnID}, nodeIDPos, propertyPos, std::move(evaluator)); + return std::make_unique(NodeSetInfo{table, columnID}, nodeIDPos, + propertyPos, std::move(evaluator)); } } @@ -69,8 +69,8 @@ std::unique_ptr PlanMapper::mapSetNodeProperty(LogicalOperator getOperatorID(), logicalSetNodeProperty.getExpressionsForPrinting()); } -std::unique_ptr PlanMapper::getRelSetExecutor( - planner::LogicalSetPropertyInfo* info, const planner::Schema& inSchema) const { +std::unique_ptr PlanMapper::getRelSetExecutor(planner::LogicalSetPropertyInfo* info, + const planner::Schema& inSchema) const { auto storageManager = clientContext->getStorageManager(); auto catalog = clientContext->getCatalog(); auto rel = (RelExpression*)info->nodeOrRel.get(); @@ -106,8 +106,8 @@ std::unique_ptr PlanMapper::getRelSetExecutor( columnID = catalog->getTableCatalogEntry(clientContext->getTx(), tableID) ->getColumnID(propertyID); } - return std::make_unique( - table, columnID, srcNodePos, dstNodePos, relIDPos, propertyPos, std::move(evaluator)); + return std::make_unique(table, columnID, srcNodePos, dstNodePos, + relIDPos, propertyPos, std::move(evaluator)); } } diff --git a/src/processor/map/plan_mapper.cpp b/src/processor/map/plan_mapper.cpp index 366b072dc48..4103f73afbd 100644 --- a/src/processor/map/plan_mapper.cpp +++ b/src/processor/map/plan_mapper.cpp @@ -8,16 +8,16 @@ using namespace kuzu::planner; namespace kuzu { namespace processor { -static void setPhysicalPlanIfProfile( - planner::LogicalPlan* logicalPlan, PhysicalPlan* physicalPlan) { +static void setPhysicalPlanIfProfile(planner::LogicalPlan* logicalPlan, + PhysicalPlan* physicalPlan) { if (logicalPlan->isProfile()) { ku_dynamic_cast(physicalPlan->lastOperator->getChild(0)) ->setPhysicalPlan(physicalPlan); } } -std::unique_ptr PlanMapper::mapLogicalPlanToPhysical( - LogicalPlan* logicalPlan, const binder::expression_vector& expressionsToCollect) { +std::unique_ptr PlanMapper::mapLogicalPlanToPhysical(LogicalPlan* logicalPlan, + const binder::expression_vector& expressionsToCollect) { auto lastOperator = mapOperator(logicalPlan->getLastOperator().get()); lastOperator = createResultCollector(AccumulateType::REGULAR, expressionsToCollect, logicalPlan->getSchema(), std::move(lastOperator)); @@ -190,8 +190,8 @@ std::unique_ptr PlanMapper::mapOperator(LogicalOperator* logic return physicalOperator; } -std::vector PlanMapper::getExpressionsDataPos( - const binder::expression_vector& expressions, const planner::Schema& schema) { +std::vector PlanMapper::getExpressionsDataPos(const binder::expression_vector& expressions, + const planner::Schema& schema) { std::vector result; for (auto& expression : expressions) { result.emplace_back(schema.getExpressionPos(*expression)); @@ -204,8 +204,8 @@ std::shared_ptr PlanMapper::getSingleStringColumnFTable() const ftTableSchema->appendColumn( std::make_unique(false /* flat */, 0 /* dataChunkPos */, LogicalTypeUtils::getRowLayoutSize(LogicalType{LogicalTypeID::STRING}))); - return std::make_shared( - clientContext->getMemoryManager(), std::move(ftTableSchema)); + return std::make_shared(clientContext->getMemoryManager(), + std::move(ftTableSchema)); } } // namespace processor diff --git a/src/processor/operator/aggregate/aggregate_hash_table.cpp b/src/processor/operator/aggregate/aggregate_hash_table.cpp index d5870141d7f..a7a8fa4643b 100644 --- a/src/processor/operator/aggregate/aggregate_hash_table.cpp +++ b/src/processor/operator/aggregate/aggregate_hash_table.cpp @@ -14,12 +14,12 @@ AggregateHashTable::AggregateHashTable(MemoryManager& memoryManager, std::vector keyDataTypes, std::vector dependentKeyDataTypes, const std::vector>& aggregateFunctions, uint64_t numEntriesToAllocate, std::unique_ptr tableSchema) - : BaseHashTable{memoryManager, std::move(keyDataTypes)}, dependentKeyDataTypes{ - std::move(dependentKeyDataTypes)} { + : BaseHashTable{memoryManager, std::move(keyDataTypes)}, + dependentKeyDataTypes{std::move(dependentKeyDataTypes)} { initializeFT(aggregateFunctions, std::move(tableSchema)); initializeHashTable(numEntriesToAllocate); - distinctHashTables = AggregateHashTableUtils::createDistinctHashTables( - memoryManager, this->keyTypes, this->aggregateFunctions); + distinctHashTables = AggregateHashTableUtils::createDistinctHashTables(memoryManager, + this->keyTypes, this->aggregateFunctions); initializeTmpVectors(); } @@ -51,8 +51,8 @@ bool AggregateHashTable::isAggregateValueDistinctForGroupByKeys( auto tmpHashCombineResultVector = std::make_unique(LogicalTypeID::INT64, &memoryManager); VectorHashFunction::computeHash(aggregateVector, tmpHashResultVector.get()); - VectorHashFunction::combineHash( - hashVector.get(), tmpHashResultVector.get(), tmpHashCombineResultVector.get()); + VectorHashFunction::combineHash(hashVector.get(), tmpHashResultVector.get(), + tmpHashCombineResultVector.get()); hashVector = std::move(tmpHashResultVector); } hash_t hash = hashVector->getValue(hashVector->state->selVector->selectedPositions[0]); @@ -96,16 +96,16 @@ void AggregateHashTable::merge(AggregateHashTable& other) { colIdxesToScan.push_back(factorizedTable->getTableSchema()->getNumColumns() - 1); uint64_t startTupleIdx = 0; while (startTupleIdx < other.factorizedTable->getNumTuples()) { - auto numTuplesToScan = std::min( - other.factorizedTable->getNumTuples() - startTupleIdx, DEFAULT_VECTOR_CAPACITY); + auto numTuplesToScan = std::min(other.factorizedTable->getNumTuples() - startTupleIdx, + DEFAULT_VECTOR_CAPACITY); other.factorizedTable->scan(vectorsToScan, startTupleIdx, numTuplesToScan, colIdxesToScan); findHashSlots(std::vector(), groupByHashVectors, groupByNonHashVectors, vectorsToScanState.get()); auto aggregateStateOffset = aggStateColOffsetInFT; for (auto& aggregateFunction : aggregateFunctions) { for (auto i = 0u; i < numTuplesToScan; i++) { - aggregateFunction->combineState( - hashSlotsToUpdateAggState[i]->entry + aggregateStateOffset, + aggregateFunction->combineState(hashSlotsToUpdateAggState[i]->entry + + aggregateStateOffset, other.factorizedTable->getTuple(startTupleIdx + i) + aggregateStateOffset, &memoryManager); } @@ -244,8 +244,8 @@ void AggregateHashTable::initializeFTEntries(const std::vector& fl } } -uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( - ValueVector* vector, uint64_t numMayMatches, uint64_t& numNoMatches, uint32_t colIdx) { +uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn(ValueVector* vector, uint64_t numMayMatches, + uint64_t& numNoMatches, uint32_t colIdx) { KU_ASSERT(!vector->state->isFlat()); auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); uint64_t mayMatchIdx = 0; @@ -253,8 +253,8 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( if (factorizedTable->hasNoNullGuarantee(colIdx)) { for (auto i = 0u; i < numMayMatches; i++) { auto idx = mayMatchIdxes[i]; - if (compareEntryFuncs[colIdx]( - vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + if (compareEntryFuncs[colIdx](vector, idx, + hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { noMatchIdxes[numNoMatches++] = idx; @@ -271,8 +271,8 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( noMatchIdxes[numNoMatches++] = idx; continue; } - if (compareEntryFuncs[colIdx]( - vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + if (compareEntryFuncs[colIdx](vector, idx, + hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { noMatchIdxes[numNoMatches++] = idx; @@ -295,8 +295,8 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( continue; } - if (compareEntryFuncs[colIdx]( - vector, idx, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + if (compareEntryFuncs[colIdx](vector, idx, + hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { noMatchIdxes[numNoMatches++] = idx; @@ -306,8 +306,8 @@ uint64_t AggregateHashTable::matchUnFlatVecWithFTColumn( return mayMatchIdx; } -uint64_t AggregateHashTable::matchFlatVecWithFTColumn( - ValueVector* vector, uint64_t numMayMatches, uint64_t& numNoMatches, uint32_t colIdx) { +uint64_t AggregateHashTable::matchFlatVecWithFTColumn(ValueVector* vector, uint64_t numMayMatches, + uint64_t& numNoMatches, uint32_t colIdx) { KU_ASSERT(vector->state->isFlat()); auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); uint64_t mayMatchIdx = 0; @@ -326,8 +326,8 @@ uint64_t AggregateHashTable::matchFlatVecWithFTColumn( noMatchIdxes[numNoMatches++] = idx; continue; } - if (compareEntryFuncs[colIdx]( - vector, pos, hashSlotsToUpdateAggState[idx]->entry + colOffset)) { + if (compareEntryFuncs[colIdx](vector, pos, + hashSlotsToUpdateAggState[idx]->entry + colOffset)) { mayMatchIdxes[mayMatchIdx++] = idx; } else { noMatchIdxes[numNoMatches++] = idx; @@ -336,8 +336,8 @@ uint64_t AggregateHashTable::matchFlatVecWithFTColumn( return mayMatchIdx; } -void AggregateHashTable::initializeFTEntryWithFlatVec( - ValueVector* flatVector, uint64_t numEntriesToInitialize, uint32_t colIdx) { +void AggregateHashTable::initializeFTEntryWithFlatVec(ValueVector* flatVector, + uint64_t numEntriesToInitialize, uint32_t colIdx) { KU_ASSERT(flatVector->state->isFlat()); auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); auto pos = flatVector->state->selVector->selectedPositions[0]; @@ -352,14 +352,14 @@ void AggregateHashTable::initializeFTEntryWithFlatVec( for (auto i = 0u; i < numEntriesToInitialize; i++) { auto idx = entryIdxesToInitialize[i]; auto entry = hashSlotsToUpdateAggState[idx]->entry; - flatVector->copyToRowData( - pos, entry + colOffset, factorizedTable->getInMemOverflowBuffer()); + flatVector->copyToRowData(pos, entry + colOffset, + factorizedTable->getInMemOverflowBuffer()); } } } -void AggregateHashTable::initializeFTEntryWithUnFlatVec( - ValueVector* unFlatVector, uint64_t numEntriesToInitialize, uint32_t colIdx) { +void AggregateHashTable::initializeFTEntryWithUnFlatVec(ValueVector* unFlatVector, + uint64_t numEntriesToInitialize, uint32_t colIdx) { KU_ASSERT(!unFlatVector->state->isFlat()); auto colOffset = factorizedTable->getTableSchema()->getColOffset(colIdx); if (unFlatVector->hasNoNullsGuarantee()) { @@ -372,8 +372,8 @@ void AggregateHashTable::initializeFTEntryWithUnFlatVec( } else { for (auto i = 0u; i < numEntriesToInitialize; i++) { auto entryIdx = entryIdxesToInitialize[i]; - factorizedTable->updateFlatCell( - hashSlotsToUpdateAggState[entryIdx]->entry, colIdx, unFlatVector, entryIdx); + factorizedTable->updateFlatCell(hashSlotsToUpdateAggState[entryIdx]->entry, colIdx, + unFlatVector, entryIdx); } } } @@ -445,8 +445,8 @@ void AggregateHashTable::findHashSlots(const std::vector& flatKeyV noMatchIdxes[numNoMatches++] = idx; } } - initializeFTEntries( - flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, numFTEntriesToUpdate); + initializeFTEntries(flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, + numFTEntriesToUpdate); numNoMatches = matchFTEntries(flatKeyVectors, unFlatKeyVectors, numMayMatches, numNoMatches); increaseHashSlotIdxes(numNoMatches); @@ -484,17 +484,17 @@ void AggregateHashTable::updateAggState(const std::vector& flatKey std::unique_ptr& aggregateFunction, ValueVector* aggVector, uint64_t multiplicity, uint32_t /*colIdx*/, uint32_t aggStateOffset) { if (!aggVector) { - updateNullAggVectorState( - flatKeyVectors, unFlatKeyVectors, aggregateFunction, multiplicity, aggStateOffset); + updateNullAggVectorState(flatKeyVectors, unFlatKeyVectors, aggregateFunction, multiplicity, + aggStateOffset); } else if (aggVector->state->isFlat() && unFlatKeyVectors.empty()) { - updateBothFlatAggVectorState( - flatKeyVectors, aggregateFunction, aggVector, multiplicity, aggStateOffset); + updateBothFlatAggVectorState(flatKeyVectors, aggregateFunction, aggVector, multiplicity, + aggStateOffset); } else if (aggVector->state->isFlat()) { updateFlatUnFlatKeyFlatAggVectorState(flatKeyVectors, unFlatKeyVectors, aggregateFunction, aggVector, multiplicity, aggStateOffset); } else if (unFlatKeyVectors.empty()) { - updateFlatKeyUnFlatAggVectorState( - flatKeyVectors, aggregateFunction, aggVector, multiplicity, aggStateOffset); + updateFlatKeyUnFlatAggVectorState(flatKeyVectors, aggregateFunction, aggVector, + multiplicity, aggStateOffset); } else if (!unFlatKeyVectors.empty() && (aggVector->state == unFlatKeyVectors[0]->state)) { updateBothUnFlatSameDCAggVectorState(flatKeyVectors, unFlatKeyVectors, aggregateFunction, aggVector, multiplicity, aggStateOffset); @@ -520,8 +520,8 @@ void AggregateHashTable::updateAggStates(const std::vector& flatKe } } -bool AggregateHashTable::matchFlatGroupByKeys( - const std::vector& keyVectors, uint8_t* entry) { +bool AggregateHashTable::matchFlatGroupByKeys(const std::vector& keyVectors, + uint8_t* entry) { for (auto i = 0u; i < keyVectors.size(); i++) { auto keyVector = keyVectors[i]; KU_ASSERT(keyVector->state->isFlat()); @@ -536,8 +536,8 @@ bool AggregateHashTable::matchFlatGroupByKeys( } else if (isKeyVectorNull != isEntryKeyNull) { return false; } - if (!compareEntryFuncs[i]( - keyVector, pos, entry + factorizedTable->getTableSchema()->getColOffset(i))) { + if (!compareEntryFuncs[i](keyVector, pos, + entry + factorizedTable->getTableSchema()->getColOffset(i))) { return false; } } @@ -601,9 +601,9 @@ void AggregateHashTable::updateNullAggVectorState(const std::vectorstate->selVector->selectedSize; for (auto i = 0u; i < selectedSize; i++) { auto pos = unFlatKeyVectors[0]->state->selVector->selectedPositions[i]; - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[pos]->entry + aggStateOffset, nullptr, multiplicity, - 0 /* dummy pos */, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[pos]->entry + + aggStateOffset, + nullptr, multiplicity, 0 /* dummy pos */, &memoryManager); } } } @@ -631,16 +631,16 @@ void AggregateHashTable::updateFlatUnFlatKeyFlatAggVectorState( if (!aggVector->isNull(aggPos)) { if (unFlatKeyVectors[0]->state->selVector->isUnfiltered()) { for (auto i = 0u; i < selectedSize; i++) { - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[i]->entry + aggStateOffset, aggVector, multiplicity, - aggPos, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[i]->entry + + aggStateOffset, + aggVector, multiplicity, aggPos, &memoryManager); } } else { for (auto i = 0u; i < selectedSize; i++) { auto pos = unFlatKeyVectors[0]->state->selVector->selectedPositions[i]; - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[pos]->entry + aggStateOffset, aggVector, multiplicity, - aggPos, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[pos]->entry + + aggStateOffset, + aggVector, multiplicity, aggPos, &memoryManager); } } } @@ -655,16 +655,16 @@ void AggregateHashTable::updateFlatKeyUnFlatAggVectorState( if (aggVector->hasNoNullsGuarantee()) { if (aggVector->state->selVector->isUnfiltered()) { for (auto i = 0u; i < aggVecSelectedSize; i++) { - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[groupByKeyPos]->entry + aggStateOffset, aggVector, - multiplicity, aggVector->state->selVector->selectedPositions[i], + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[groupByKeyPos]->entry + + aggStateOffset, + aggVector, multiplicity, aggVector->state->selVector->selectedPositions[i], &memoryManager); } } else { for (auto i = 0u; i < aggVecSelectedSize; i++) { - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[groupByKeyPos]->entry + aggStateOffset, aggVector, - multiplicity, aggVector->state->selVector->selectedPositions[i], + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[groupByKeyPos]->entry + + aggStateOffset, + aggVector, multiplicity, aggVector->state->selVector->selectedPositions[i], &memoryManager); } } @@ -698,34 +698,34 @@ void AggregateHashTable::updateBothUnFlatSameDCAggVectorState( if (aggVector->hasNoNullsGuarantee()) { if (aggVector->state->selVector->isUnfiltered()) { for (auto i = 0u; i < aggVector->state->selVector->selectedSize; i++) { - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[i]->entry + aggStateOffset, aggVector, multiplicity, - i, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[i]->entry + + aggStateOffset, + aggVector, multiplicity, i, &memoryManager); } } else { for (auto i = 0u; i < aggVector->state->selVector->selectedSize; i++) { auto pos = aggVector->state->selVector->selectedPositions[i]; - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[pos]->entry + aggStateOffset, aggVector, multiplicity, - pos, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[pos]->entry + + aggStateOffset, + aggVector, multiplicity, pos, &memoryManager); } } } else { if (aggVector->state->selVector->isUnfiltered()) { for (auto i = 0u; i < aggVector->state->selVector->selectedSize; i++) { if (!aggVector->isNull(i)) { - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[i]->entry + aggStateOffset, aggVector, - multiplicity, i, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[i]->entry + + aggStateOffset, + aggVector, multiplicity, i, &memoryManager); } } } else { for (auto i = 0u; i < aggVector->state->selVector->selectedSize; i++) { auto pos = aggVector->state->selVector->selectedPositions[i]; if (!aggVector->isNull(pos)) { - aggregateFunction->updatePosState( - hashSlotsToUpdateAggState[pos]->entry + aggStateOffset, aggVector, - multiplicity, pos, &memoryManager); + aggregateFunction->updatePosState(hashSlotsToUpdateAggState[pos]->entry + + aggStateOffset, + aggVector, multiplicity, pos, &memoryManager); } } } @@ -746,9 +746,9 @@ void AggregateHashTable::updateBothUnFlatDifferentDCAggVectorState( } else { for (auto i = 0u; i < selectedSize; i++) { auto pos = unFlatKeyVectors[0]->state->selVector->selectedPositions[i]; - aggregateFunction->updateAllState( - hashSlotsToUpdateAggState[pos]->entry + aggStateOffset, aggVector, multiplicity, - &memoryManager); + aggregateFunction->updateAllState(hashSlotsToUpdateAggState[pos]->entry + + aggStateOffset, + aggVector, multiplicity, &memoryManager); } } } @@ -765,8 +765,8 @@ std::vector> AggregateHashTableUtils::create for (auto i = 0u; i < groupByKeyDataTypes.size(); i++) { distinctKeysDataTypes[i] = groupByKeyDataTypes[i]; auto size = LogicalTypeUtils::getRowLayoutSize(distinctKeysDataTypes[i]); - tableSchema->appendColumn(std::make_unique( - false /* isUnflat */, 0 /* dataChunkPos */, size)); + tableSchema->appendColumn(std::make_unique(false /* isUnflat */, + 0 /* dataChunkPos */, size)); } distinctKeysDataTypes[groupByKeyDataTypes.size()] = LogicalType{aggregateFunction->parameterTypeIDs[0]}; @@ -774,8 +774,8 @@ std::vector> AggregateHashTableUtils::create std::make_unique(false /* isUnflat */, 0 /* dataChunkPos */, LogicalTypeUtils::getRowLayoutSize( LogicalType{aggregateFunction->parameterTypeIDs[0]}))); - tableSchema->appendColumn(std::make_unique( - false /* isUnflat */, 0 /* dataChunkPos */, sizeof(hash_t))); + tableSchema->appendColumn(std::make_unique(false /* isUnflat */, + 0 /* dataChunkPos */, sizeof(hash_t))); std::vector> emptyFunctions; auto ht = std::make_unique(memoryManager, std::move(distinctKeysDataTypes), emptyFunctions, 0 /* numEntriesToAllocate */, diff --git a/src/processor/operator/aggregate/base_aggregate_scan.cpp b/src/processor/operator/aggregate/base_aggregate_scan.cpp index b8dc1d6781f..94fc3995982 100644 --- a/src/processor/operator/aggregate/base_aggregate_scan.cpp +++ b/src/processor/operator/aggregate/base_aggregate_scan.cpp @@ -6,16 +6,16 @@ using namespace kuzu::function; namespace kuzu { namespace processor { -void BaseAggregateScan::initLocalStateInternal( - ResultSet* resultSet, ExecutionContext* /*context*/) { +void BaseAggregateScan::initLocalStateInternal(ResultSet* resultSet, + ExecutionContext* /*context*/) { for (auto& dataPos : aggregatesPos) { auto valueVector = resultSet->getValueVector(dataPos); aggregateVectors.push_back(valueVector); } } -void BaseAggregateScan::writeAggregateResultToVector( - ValueVector& vector, uint64_t pos, AggregateState* aggregateState) { +void BaseAggregateScan::writeAggregateResultToVector(ValueVector& vector, uint64_t pos, + AggregateState* aggregateState) { if (aggregateState->isNull) { vector.setNull(pos, true); } else { diff --git a/src/processor/operator/aggregate/hash_aggregate.cpp b/src/processor/operator/aggregate/hash_aggregate.cpp index 6d27dd7c9bf..9c88638a131 100644 --- a/src/processor/operator/aggregate/hash_aggregate.cpp +++ b/src/processor/operator/aggregate/hash_aggregate.cpp @@ -44,8 +44,8 @@ std::pair HashAggregateSharedState::getNextRangeToRead() { return std::make_pair(currentOffset, currentOffset); } auto startOffset = currentOffset; - auto range = std::min( - DEFAULT_VECTOR_CAPACITY, globalAggregateHashTable->getNumEntries() - currentOffset); + auto range = std::min(DEFAULT_VECTOR_CAPACITY, + globalAggregateHashTable->getNumEntries() - currentOffset); currentOffset += range; return std::make_pair(startOffset, startOffset + range); } @@ -98,8 +98,8 @@ void HashAggregateLocalState::init(ResultSet& resultSet, main::ClientContext* co } } -void HashAggregateLocalState::append( - std::vector>& aggregateInputs, uint64_t multiplicity) const { +void HashAggregateLocalState::append(std::vector>& aggregateInputs, + uint64_t multiplicity) const { aggregateHashTable->append(flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, leadingState, aggregateInputs, multiplicity); } diff --git a/src/processor/operator/aggregate/hash_aggregate_scan.cpp b/src/processor/operator/aggregate/hash_aggregate_scan.cpp index c984270069d..e1e84bfdf58 100644 --- a/src/processor/operator/aggregate/hash_aggregate_scan.cpp +++ b/src/processor/operator/aggregate/hash_aggregate_scan.cpp @@ -21,8 +21,8 @@ bool HashAggregateScan::getNextTuplesInternal(ExecutionContext* /*context*/) { return false; } auto numRowsToScan = endOffset - startOffset; - sharedState->getFactorizedTable()->scan( - groupByKeyVectors, startOffset, numRowsToScan, groupByKeyVectorsColIdxes); + sharedState->getFactorizedTable()->scan(groupByKeyVectors, startOffset, numRowsToScan, + groupByKeyVectorsColIdxes); for (auto pos = 0u; pos < numRowsToScan; ++pos) { auto entry = sharedState->getRow(startOffset + pos); auto offset = sharedState->getFactorizedTable()->getTableSchema()->getColOffset( diff --git a/src/processor/operator/aggregate/simple_aggregate.cpp b/src/processor/operator/aggregate/simple_aggregate.cpp index 69f82481ca4..f39a1ac2c17 100644 --- a/src/processor/operator/aggregate/simple_aggregate.cpp +++ b/src/processor/operator/aggregate/simple_aggregate.cpp @@ -73,12 +73,12 @@ void SimpleAggregate::computeDistinctAggregate(AggregateHashTable* distinctHT, function::AggregateFunction* function, AggregateInput* input, function::AggregateState* state, storage::MemoryManager* memoryManager) { auto multiplicity = 1; // Distinct aggregate should ignore multiplicity. - if (distinctHT->isAggregateValueDistinctForGroupByKeys( - std::vector{}, input->aggregateVector)) { + if (distinctHT->isAggregateValueDistinctForGroupByKeys(std::vector{}, + input->aggregateVector)) { auto pos = input->aggregateVector->state->selVector->selectedPositions[0]; if (!input->aggregateVector->isNull(pos)) { - function->updatePosState( - (uint8_t*)state, input->aggregateVector, multiplicity, pos, memoryManager); + function->updatePosState((uint8_t*)state, input->aggregateVector, multiplicity, pos, + memoryManager); } } } @@ -92,12 +92,12 @@ void SimpleAggregate::computeAggregate(function::AggregateFunction* function, Ag if (input->aggregateVector && input->aggregateVector->state->isFlat()) { auto pos = input->aggregateVector->state->selVector->selectedPositions[0]; if (!input->aggregateVector->isNull(pos)) { - function->updatePosState( - (uint8_t*)state, input->aggregateVector, multiplicity, pos, memoryManager); + function->updatePosState((uint8_t*)state, input->aggregateVector, multiplicity, pos, + memoryManager); } } else { - function->updateAllState( - (uint8_t*)state, input->aggregateVector, multiplicity, memoryManager); + function->updateAllState((uint8_t*)state, input->aggregateVector, multiplicity, + memoryManager); } } diff --git a/src/processor/operator/aggregate/simple_aggregate_scan.cpp b/src/processor/operator/aggregate/simple_aggregate_scan.cpp index 3ae7fc36779..922cd1c4e78 100644 --- a/src/processor/operator/aggregate/simple_aggregate_scan.cpp +++ b/src/processor/operator/aggregate/simple_aggregate_scan.cpp @@ -21,8 +21,8 @@ bool SimpleAggregateScan::getNextTuplesInternal(ExecutionContext* /*context*/) { // Output of simple aggregate is guaranteed to be a single value for each aggregate. KU_ASSERT(startOffset == 0 && endOffset == 1); for (auto i = 0u; i < aggregateVectors.size(); i++) { - writeAggregateResultToVector( - *aggregateVectors[i], 0 /* position to write */, sharedState->getAggregateState(i)); + writeAggregateResultToVector(*aggregateVectors[i], 0 /* position to write */, + sharedState->getAggregateState(i)); } KU_ASSERT(!aggregatesPos.empty()); outDataChunk->state->initOriginalAndSelectedSize(1); diff --git a/src/processor/operator/attach_database.cpp b/src/processor/operator/attach_database.cpp index ec54db06fb3..a924ba07109 100644 --- a/src/processor/operator/attach_database.cpp +++ b/src/processor/operator/attach_database.cpp @@ -11,8 +11,8 @@ bool AttachDatabase::getNextTuplesInternal(kuzu::processor::ExecutionContext* co for (auto& [name, storageExtension] : context->clientContext->getDatabase()->getStorageExtensions()) { if (storageExtension->canHandleDB(attachInfo.dbType)) { - auto db = storageExtension->attach( - attachInfo.dbAlias, attachInfo.dbPath, context->clientContext); + auto db = storageExtension->attach(attachInfo.dbAlias, attachInfo.dbPath, + context->clientContext); context->clientContext->getDatabase() ->getDatabaseManagerUnsafe() ->registerAttachedDatabase(std::move(db)); diff --git a/src/processor/operator/call/in_query_call.cpp b/src/processor/operator/call/in_query_call.cpp index fb93471f560..5f8a897686f 100644 --- a/src/processor/operator/call/in_query_call.cpp +++ b/src/processor/operator/call/in_query_call.cpp @@ -42,8 +42,8 @@ void InQueryCall::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* function::TableFunctionInitInput tableFunctionInitInput{info.bindData.get()}; localState.funcState = info.function.initLocalStateFunc(tableFunctionInitInput, sharedState->funcState.get(), context->clientContext->getMemoryManager()); - localState.funcInput = function::TableFuncInput{ - info.bindData.get(), localState.funcState.get(), sharedState->funcState.get()}; + localState.funcInput = function::TableFuncInput{info.bindData.get(), localState.funcState.get(), + sharedState->funcState.get()}; } void InQueryCall::initGlobalStateInternal(ExecutionContext*) { diff --git a/src/processor/operator/call/standalone_call.cpp b/src/processor/operator/call/standalone_call.cpp index 890ba16b696..2664029358a 100644 --- a/src/processor/operator/call/standalone_call.cpp +++ b/src/processor/operator/call/standalone_call.cpp @@ -19,8 +19,8 @@ bool StandaloneCall::getNextTuplesInternal(kuzu::processor::ExecutionContext* co break; } case main::OptionType::EXTENSION: - context->clientContext->setExtensionOption( - standaloneCallInfo->option->name, standaloneCallInfo->optionValue); + context->clientContext->setExtensionOption(standaloneCallInfo->option->name, + standaloneCallInfo->optionValue); break; } metrics->numOutputTuple.increase(1); diff --git a/src/processor/operator/filter.cpp b/src/processor/operator/filter.cpp index ef8ec8d2337..5ff5bb88add 100644 --- a/src/processor/operator/filter.cpp +++ b/src/processor/operator/filter.cpp @@ -30,8 +30,8 @@ bool Filter::getNextTuplesInternal(ExecutionContext* context) { return true; } -void NodeLabelFiler::initLocalStateInternal( - ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) { +void NodeLabelFiler::initLocalStateInternal(ResultSet* /*resultSet_*/, + ExecutionContext* /*context*/) { nodeIDVector = resultSet->getValueVector(info->nodeVectorPos).get(); } diff --git a/src/processor/operator/hash_join/hash_join_probe.cpp b/src/processor/operator/hash_join/hash_join_probe.cpp index 7e8c4f5dcca..3e3e53364f7 100644 --- a/src/processor/operator/hash_join/hash_join_probe.cpp +++ b/src/processor/operator/hash_join/hash_join_probe.cpp @@ -21,13 +21,13 @@ void HashJoinProbe::initLocalStateInternal(ResultSet* resultSet, ExecutionContex KU_ASSERT(probeDataInfo.keysDataPos.size() + probeDataInfo.getNumPayloads() + 2 == sharedState->getHashTable()->getTableSchema()->getNumColumns()); columnIdxsToReadFrom.resize(probeDataInfo.getNumPayloads()); - iota( - columnIdxsToReadFrom.begin(), columnIdxsToReadFrom.end(), probeDataInfo.keysDataPos.size()); - hashVector = std::make_unique( - LogicalTypeID::INT64, context->clientContext->getMemoryManager()); + iota(columnIdxsToReadFrom.begin(), columnIdxsToReadFrom.end(), + probeDataInfo.keysDataPos.size()); + hashVector = std::make_unique(LogicalTypeID::INT64, + context->clientContext->getMemoryManager()); if (keyVectors.size() > 1) { - tmpHashVector = std::make_unique( - LogicalTypeID::INT64, context->clientContext->getMemoryManager()); + tmpHashVector = std::make_unique(LogicalTypeID::INT64, + context->clientContext->getMemoryManager()); } } @@ -45,11 +45,11 @@ bool HashJoinProbe::getMatchedTuplesForFlatKey(ExecutionContext* context) { return false; } saveSelVector(keyVectors[0]->state->selVector); - sharedState->getHashTable()->probe( - keyVectors, hashVector.get(), tmpHashVector.get(), probeState->probedTuples.get()); + sharedState->getHashTable()->probe(keyVectors, hashVector.get(), tmpHashVector.get(), + probeState->probedTuples.get()); } - auto numMatchedTuples = sharedState->getHashTable()->matchFlatKeys( - keyVectors, probeState->probedTuples.get(), probeState->matchedTuples.get()); + auto numMatchedTuples = sharedState->getHashTable()->matchFlatKeys(keyVectors, + probeState->probedTuples.get(), probeState->matchedTuples.get()); probeState->matchedSelVector->selectedSize = numMatchedTuples; probeState->nextMatchedTupleIdx = 0; return true; @@ -63,8 +63,8 @@ bool HashJoinProbe::getMatchedTuplesForUnFlatKey(ExecutionContext* context) { return false; } saveSelVector(keyVector->state->selVector); - sharedState->getHashTable()->probe( - keyVectors, hashVector.get(), tmpHashVector.get(), probeState->probedTuples.get()); + sharedState->getHashTable()->probe(keyVectors, hashVector.get(), tmpHashVector.get(), + probeState->probedTuples.get()); auto numMatchedTuples = sharedState->getHashTable()->matchUnFlatKey(keyVector, probeState->probedTuples.get(), probeState->matchedTuples.get(), probeState->matchedSelVector.get()); diff --git a/src/processor/operator/hash_join/join_hash_table.cpp b/src/processor/operator/hash_join/join_hash_table.cpp index 92cffcef76c..8da39523f1d 100644 --- a/src/processor/operator/hash_join/join_hash_table.cpp +++ b/src/processor/operator/hash_join/join_hash_table.cpp @@ -49,8 +49,8 @@ void JoinHashTable::appendVectors(const std::vector& keyVectors, factorizedTable->numTuples += numTuplesToAppend; } -void JoinHashTable::appendVector( - ValueVector* vector, const std::vector& appendInfos, ft_col_idx_t colIdx) { +void JoinHashTable::appendVector(ValueVector* vector, + const std::vector& appendInfos, ft_col_idx_t colIdx) { auto numAppendedTuples = 0ul; for (auto& blockAppendInfo : appendInfos) { factorizedTable->copyVectorToColumn(*vector, blockAppendInfo, numAppendedTuples, colIdx); @@ -71,8 +71,8 @@ static void sortSelectedPos(ValueVector* nodeIDVector) { }); } -void JoinHashTable::appendVectorWithSorting( - ValueVector* keyVector, std::vector payloadVectors) { +void JoinHashTable::appendVectorWithSorting(ValueVector* keyVector, + std::vector payloadVectors) { auto numTuplesToAppend = 1; KU_ASSERT(keyVector->state->selVector->selectedSize == 1); // Based on the way we are planning, we assume that the first and second vectors are both @@ -144,8 +144,8 @@ void JoinHashTable::probe(const std::vector& keyVectors, ValueVect } } -sel_t JoinHashTable::matchFlatKeys( - const std::vector& keyVectors, uint8_t** probedTuples, uint8_t** matchedTuples) { +sel_t JoinHashTable::matchFlatKeys(const std::vector& keyVectors, + uint8_t** probedTuples, uint8_t** matchedTuples) { auto numMatchedTuples = 0; while (probedTuples[0]) { if (numMatchedTuples == DEFAULT_VECTOR_CAPACITY) { @@ -193,8 +193,8 @@ uint8_t* JoinHashTable::insertEntry(uint8_t* tuple) const { return prevPtr; } -bool JoinHashTable::compareFlatKeys( - const std::vector& keyVectors, const uint8_t* tuple) { +bool JoinHashTable::compareFlatKeys(const std::vector& keyVectors, + const uint8_t* tuple) { for (auto i = 0u; i < keyVectors.size(); i++) { auto keyVector = keyVectors[i]; KU_ASSERT(keyVector->state->selVector->selectedSize == 1); diff --git a/src/processor/operator/index_lookup.cpp b/src/processor/operator/index_lookup.cpp index 1fa7b89e1d9..669c34c85cc 100644 --- a/src/processor/operator/index_lookup.cpp +++ b/src/processor/operator/index_lookup.cpp @@ -32,8 +32,8 @@ std::unique_ptr IndexLookup::clone() { for (const auto& info : infos) { copiedInfos.push_back(info->copy()); } - return make_unique( - std::move(copiedInfos), children[0]->clone(), getOperatorID(), paramsString); + return make_unique(std::move(copiedInfos), children[0]->clone(), getOperatorID(), + paramsString); } void IndexLookup::setBatchInsertSharedState(std::shared_ptr sharedState) { diff --git a/src/processor/operator/install_extension.cpp b/src/processor/operator/install_extension.cpp index 3d144866f26..4b7a67d447d 100644 --- a/src/processor/operator/install_extension.cpp +++ b/src/processor/operator/install_extension.cpp @@ -43,8 +43,8 @@ std::string InstallExtension::tryDownloadExtension() { return res->body; } -void InstallExtension::saveExtensionToLocalFile( - const std::string& extensionData, main::ClientContext* context) { +void InstallExtension::saveExtensionToLocalFile(const std::string& extensionData, + main::ClientContext* context) { auto extensionDir = context->getExtensionDir(); auto extensionPath = ExtensionUtils::getExtensionPath(extensionDir, name); auto vfs = context->getVFSUnsafe(); diff --git a/src/processor/operator/intersect/intersect.cpp b/src/processor/operator/intersect/intersect.cpp index 9bae12ce504..b80ed297136 100644 --- a/src/processor/operator/intersect/intersect.cpp +++ b/src/processor/operator/intersect/intersect.cpp @@ -107,8 +107,8 @@ static std::vector swapSmallestListToFront(std::vector& selVectorsToSlice, SelectionVector& slicer) { +static void sliceSelVectors(const std::vector& selVectorsToSlice, + SelectionVector& slicer) { for (auto selVec : selVectorsToSlice) { for (auto i = 0u; i < slicer.selectedSize; i++) { auto pos = slicer.selectedPositions[i]; @@ -145,8 +145,8 @@ void Intersect::intersectLists(const std::vector& listsToInter outKeyVector->state->selVector->selectedSize = lSelVector.selectedSize; } -void Intersect::populatePayloads( - const std::vector& tuples, const std::vector& listIdxes) { +void Intersect::populatePayloads(const std::vector& tuples, + const std::vector& listIdxes) { for (auto i = 0u; i < listIdxes.size(); i++) { auto listIdx = listIdxes[i]; sharedHTs[listIdx]->getHashTable()->getFactorizedTable()->lookup( diff --git a/src/processor/operator/macro/create_macro.cpp b/src/processor/operator/macro/create_macro.cpp index 11645f9cf12..e3984feedb8 100644 --- a/src/processor/operator/macro/create_macro.cpp +++ b/src/processor/operator/macro/create_macro.cpp @@ -11,8 +11,8 @@ bool CreateMacro::getNextTuplesInternal(kuzu::processor::ExecutionContext* /*con if (hasExecuted) { return false; } - createMacroInfo->catalog->addScalarMacroFunction( - createMacroInfo->macroName, createMacroInfo->macro->copy()); + createMacroInfo->catalog->addScalarMacroFunction(createMacroInfo->macroName, + createMacroInfo->macro->copy()); hasExecuted = true; outputVector->setValue(outputVector->state->selVector->selectedPositions[0], stringFormat("Macro: {} has been created.", createMacroInfo->macroName)); diff --git a/src/processor/operator/order_by/key_block_merger.cpp b/src/processor/operator/order_by/key_block_merger.cpp index 93cff20ed2f..40bfe42712c 100644 --- a/src/processor/operator/order_by/key_block_merger.cpp +++ b/src/processor/operator/order_by/key_block_merger.cpp @@ -7,8 +7,8 @@ using namespace kuzu::storage; namespace kuzu { namespace processor { -MergedKeyBlocks::MergedKeyBlocks( - uint32_t numBytesPerTuple, uint64_t numTuples, MemoryManager* memoryManager) +MergedKeyBlocks::MergedKeyBlocks(uint32_t numBytesPerTuple, uint64_t numTuples, + MemoryManager* memoryManager) : numBytesPerTuple{numBytesPerTuple}, numTuplesPerBlock{(uint32_t)(BufferPoolConstants::PAGE_256KB_SIZE / numBytesPerTuple)}, numTuples{numTuples}, endTupleOffset{numTuplesPerBlock * numBytesPerTuple} { @@ -26,8 +26,8 @@ MergedKeyBlocks::MergedKeyBlocks(uint32_t numBytesPerTuple, std::shared_ptrgetNumTuples() - 1 || - !keyBlockMerger.compareTuplePtr( - leftEndTuplePtr, rightKeyBlock->getTuple(curTupleIdx + 1))) { + !keyBlockMerger.compareTuplePtr(leftEndTuplePtr, + rightKeyBlock->getTuple(curTupleIdx + 1))) { // If the current tuple is the last tuple or the value of next tuple is larger than // the value of leftEndTuple, return the curTupleIdx. return curTupleIdx; @@ -145,8 +145,8 @@ void KeyBlockMerger::mergeKeyBlocks(KeyBlockMergeMorsel& keyBlockMergeMorsel) co keyBlockMergeMorsel.rightKeyBlockEndIdx, keyBlockMergeMorsel.keyBlockMergeTask->rightKeyBlock.get()); - auto resultBlockPtrInfo = BlockPtrInfo( - keyBlockMergeMorsel.leftKeyBlockStartIdx + keyBlockMergeMorsel.rightKeyBlockStartIdx, + auto resultBlockPtrInfo = BlockPtrInfo(keyBlockMergeMorsel.leftKeyBlockStartIdx + + keyBlockMergeMorsel.rightKeyBlockStartIdx, keyBlockMergeMorsel.leftKeyBlockEndIdx + keyBlockMergeMorsel.rightKeyBlockEndIdx, keyBlockMergeMorsel.keyBlockMergeTask->resultKeyBlock.get()); @@ -161,8 +161,8 @@ void KeyBlockMerger::mergeKeyBlocks(KeyBlockMergeMorsel& keyBlockMergeMorsel) co numBytesPerTuple); rightBlockPtrInfo.curTuplePtr += numBytesPerTuple; } else { - memcpy( - resultBlockPtrInfo.curTuplePtr, leftBlockPtrInfo.curTuplePtr, numBytesPerTuple); + memcpy(resultBlockPtrInfo.curTuplePtr, leftBlockPtrInfo.curTuplePtr, + numBytesPerTuple); leftBlockPtrInfo.curTuplePtr += numBytesPerTuple; } resultBlockPtrInfo.curTuplePtr += numBytesPerTuple; @@ -178,8 +178,8 @@ void KeyBlockMerger::mergeKeyBlocks(KeyBlockMergeMorsel& keyBlockMergeMorsel) co // This function returns true if the value in the leftTuplePtr is larger than the value in the // rightTuplePtr. -bool KeyBlockMerger::compareTuplePtrWithStringCol( - uint8_t* leftTuplePtr, uint8_t* rightTuplePtr) const { +bool KeyBlockMerger::compareTuplePtrWithStringCol(uint8_t* leftTuplePtr, + uint8_t* rightTuplePtr) const { // We can't simply use memcmp to compare tuples if there are string columns. // We should only compare the binary strings starting from the last compared string column // till the next string column. @@ -229,10 +229,10 @@ bool KeyBlockMerger::compareTuplePtrWithStringCol( auto& rightFactorizedTable = factorizedTables[OrderByKeyEncoder::getEncodedFTIdx(rightTupleInfo)]; uint8_t result; - auto leftStr = leftFactorizedTable->getData( - leftBlockIdx, leftBlockOffset, strKeyColInfo.colOffsetInFT); - auto rightStr = rightFactorizedTable->getData( - rightBlockIdx, rightBlockOffset, strKeyColInfo.colOffsetInFT); + auto leftStr = leftFactorizedTable->getData(leftBlockIdx, leftBlockOffset, + strKeyColInfo.colOffsetInFT); + auto rightStr = rightFactorizedTable->getData(rightBlockIdx, + rightBlockOffset, strKeyColInfo.colOffsetInFT); result = (leftStr == rightStr); if (result) { // If the tie can't be solved, we need to check the next string column. @@ -250,11 +250,11 @@ bool KeyBlockMerger::compareTuplePtrWithStringCol( return false; } -void KeyBlockMerger::copyRemainingBlockDataToResult( - BlockPtrInfo& blockToCopy, BlockPtrInfo& resultBlock) const { +void KeyBlockMerger::copyRemainingBlockDataToResult(BlockPtrInfo& blockToCopy, + BlockPtrInfo& resultBlock) const { while (blockToCopy.curBlockIdx <= blockToCopy.endBlockIdx) { - uint64_t nextNumBytesToMerge = std::min( - blockToCopy.getNumBytesLeftInCurBlock(), resultBlock.getNumBytesLeftInCurBlock()); + uint64_t nextNumBytesToMerge = std::min(blockToCopy.getNumBytesLeftInCurBlock(), + resultBlock.getNumBytesLeftInCurBlock()); for (auto i = 0u; i < nextNumBytesToMerge; i += numBytesPerTuple) { memcpy(resultBlock.curTuplePtr, blockToCopy.curTuplePtr, numBytesPerTuple); blockToCopy.curTuplePtr += numBytesPerTuple; @@ -284,8 +284,8 @@ std::unique_ptr KeyBlockMergeTaskDispatcher::getMorsel() { sortedKeyBlocks->pop(); auto resultKeyBlock = std::make_shared(leftKeyBlock->getNumBytesPerTuple(), leftKeyBlock->getNumTuples() + rightKeyBlock->getNumTuples(), memoryManager); - auto newMergeTask = std::make_shared( - leftKeyBlock, rightKeyBlock, resultKeyBlock, *keyBlockMerger); + auto newMergeTask = std::make_shared(leftKeyBlock, rightKeyBlock, + resultKeyBlock, *keyBlockMerger); activeKeyBlockMergeTasks.emplace_back(newMergeTask); auto morsel = newMergeTask->getMorsel(); morsel->keyBlockMergeTask = newMergeTask; @@ -315,8 +315,8 @@ void KeyBlockMergeTaskDispatcher::init(MemoryManager* memoryManager, KU_ASSERT(this->keyBlockMerger == nullptr); this->memoryManager = memoryManager; this->sortedKeyBlocks = sortedKeyBlocks; - this->keyBlockMerger = std::make_unique( - std::move(factorizedTables), strKeyColsInfo, numBytesPerTuple); + this->keyBlockMerger = std::make_unique(std::move(factorizedTables), + strKeyColsInfo, numBytesPerTuple); } } // namespace processor diff --git a/src/processor/operator/order_by/order_by_key_encoder.cpp b/src/processor/operator/order_by/order_by_key_encoder.cpp index cb423c34022..0d00e6f09b8 100644 --- a/src/processor/operator/order_by/order_by_key_encoder.cpp +++ b/src/processor/operator/order_by/order_by_key_encoder.cpp @@ -81,8 +81,8 @@ uint32_t OrderByKeyEncoder::getEncodingSize(const LogicalType& dataType) { } } -void OrderByKeyEncoder::flipBytesIfNecessary( - uint32_t keyColIdx, uint8_t* tuplePtr, uint32_t numEntriesToEncode, LogicalType& type) { +void OrderByKeyEncoder::flipBytesIfNecessary(uint32_t keyColIdx, uint8_t* tuplePtr, + uint32_t numEntriesToEncode, LogicalType& type) { if (!isAscOrder[keyColIdx]) { auto encodingSize = getEncodingSize(type); // If the current column is in desc order, flip all bytes. @@ -95,8 +95,8 @@ void OrderByKeyEncoder::flipBytesIfNecessary( } } -void OrderByKeyEncoder::encodeFlatVector( - ValueVector* vector, uint8_t* tuplePtr, uint32_t keyColIdx) { +void OrderByKeyEncoder::encodeFlatVector(ValueVector* vector, uint8_t* tuplePtr, + uint32_t keyColIdx) { auto pos = vector->state->selVector->selectedPositions[0]; if (vector->isNull(pos)) { for (auto j = 0u; j < getEncodingSize(vector->dataType); j++) { @@ -104,8 +104,8 @@ void OrderByKeyEncoder::encodeFlatVector( } } else { *tuplePtr = 0; - encodeFunctions[keyColIdx]( - vector->getData() + pos * vector->getNumBytesPerValue(), tuplePtr + 1, swapBytes); + encodeFunctions[keyColIdx](vector->getData() + pos * vector->getNumBytesPerValue(), + tuplePtr + 1, swapBytes); } } @@ -154,9 +154,9 @@ void OrderByKeyEncoder::encodeUnflatVector(ValueVector* vector, uint8_t* tuplePt } } else { *tuplePtr = 0; - encodeFunctions[keyColIdx]( - vector->getData() + pos * vector->getNumBytesPerValue(), tuplePtr + 1, - swapBytes); + encodeFunctions[keyColIdx](vector->getData() + + pos * vector->getNumBytesPerValue(), + tuplePtr + 1, swapBytes); } tuplePtr += numBytesPerTuple; } @@ -177,8 +177,8 @@ void OrderByKeyEncoder::encodeVector(ValueVector* vector, uint8_t* tuplePtr, uin void OrderByKeyEncoder::encodeFTIdx(uint32_t numEntriesToEncode, uint8_t* tupleInfoPtr) { uint32_t numUpdatedFTInfoEntries = 0; while (numUpdatedFTInfoEntries < numEntriesToEncode) { - auto nextBatchOfEntries = std::min( - numEntriesToEncode - numUpdatedFTInfoEntries, numTuplesPerBlockInFT - ftBlockOffset); + auto nextBatchOfEntries = std::min(numEntriesToEncode - numUpdatedFTInfoEntries, + numTuplesPerBlockInFT - ftBlockOffset); for (auto i = 0u; i < nextBatchOfEntries; i++) { *(uint32_t*)tupleInfoPtr = ftBlockIdx; *(uint32_t*)(tupleInfoPtr + 4) = ftBlockOffset; diff --git a/src/processor/operator/order_by/order_by_scan.cpp b/src/processor/operator/order_by/order_by_scan.cpp index aa52b8bb49a..3c930f14ec7 100644 --- a/src/processor/operator/order_by/order_by_scan.cpp +++ b/src/processor/operator/order_by/order_by_scan.cpp @@ -5,13 +5,13 @@ using namespace kuzu::common; namespace kuzu { namespace processor { -void OrderByScanLocalState::init( - std::vector& outVectorPos, SortSharedState& sharedState, ResultSet& resultSet) { +void OrderByScanLocalState::init(std::vector& outVectorPos, SortSharedState& sharedState, + ResultSet& resultSet) { for (auto& dataPos : outVectorPos) { vectorsToRead.push_back(resultSet.getValueVector(dataPos).get()); } - payloadScanner = std::make_unique( - sharedState.getMergedKeyBlock(), sharedState.getPayloadTables()); + payloadScanner = std::make_unique(sharedState.getMergedKeyBlock(), + sharedState.getPayloadTables()); numTuples = 0; for (auto& table : sharedState.getPayloadTables()) { numTuples += table->getNumTuples(); diff --git a/src/processor/operator/order_by/radix_sort.cpp b/src/processor/operator/order_by/radix_sort.cpp index c86a23e8d08..4e19cf4103a 100644 --- a/src/processor/operator/order_by/radix_sort.cpp +++ b/src/processor/operator/order_by/radix_sort.cpp @@ -257,10 +257,10 @@ void RadixSort::solveStringTies(TieRange& keyBlockTie, uint8_t* keyBlockPtr, const auto rightBlockIdx = OrderByKeyEncoder::getEncodedFTBlockIdx(rightTupleInfoPtr); const auto rightBlockOffset = OrderByKeyEncoder::getEncodedFTBlockOffset(rightTupleInfoPtr); - auto leftStr = factorizedTable.getData( - leftBlockIdx, leftBlockOffset, keyColInfo.colOffsetInFT); - auto rightStr = factorizedTable.getData( - rightBlockIdx, rightBlockOffset, keyColInfo.colOffsetInFT); + auto leftStr = factorizedTable.getData(leftBlockIdx, leftBlockOffset, + keyColInfo.colOffsetInFT); + auto rightStr = factorizedTable.getData(rightBlockIdx, rightBlockOffset, + keyColInfo.colOffsetInFT); return keyColInfo.isAscOrder ? leftStr < rightStr : leftStr > rightStr; }); reOrderKeyBlock(keyBlockTie, keyBlockPtr); diff --git a/src/processor/operator/order_by/sort_state.cpp b/src/processor/operator/order_by/sort_state.cpp index 1e1bfd7a918..08ffeff0f9c 100644 --- a/src/processor/operator/order_by/sort_state.cpp +++ b/src/processor/operator/order_by/sort_state.cpp @@ -60,8 +60,8 @@ void SortLocalState::init(const OrderByDataInfo& orderByDataInfo, SortSharedStat payloadTable = table; orderByKeyEncoder = std::make_unique(orderByDataInfo, memoryManager, globalIdx, payloadTable->getNumTuplesPerBlock(), sharedState.getNumBytesPerTuple()); - radixSorter = std::make_unique( - memoryManager, *payloadTable, *orderByKeyEncoder, sharedState.getStrKeyColInfo()); + radixSorter = std::make_unique(memoryManager, *payloadTable, *orderByKeyEncoder, + sharedState.getStrKeyColInfo()); } void SortLocalState::append(const std::vector& keyVectors, @@ -83,8 +83,8 @@ void SortLocalState::finalize(kuzu::processor::SortSharedState& sharedState) { PayloadScanner::PayloadScanner(MergedKeyBlocks* keyBlockToScan, std::vector payloadTables, uint64_t skipNumber, uint64_t limitNumber) - : keyBlockToScan{keyBlockToScan}, payloadTables{std::move(payloadTables)}, limitNumber{ - limitNumber} { + : keyBlockToScan{keyBlockToScan}, payloadTables{std::move(payloadTables)}, + limitNumber{limitNumber} { if (this->keyBlockToScan == nullptr || this->keyBlockToScan->getNumTuples() == 0) { nextTupleIdxToReadInMergedKeyBlock = 0; endTuplesIdxToReadInMergedKeyBlock = 0; @@ -129,8 +129,8 @@ uint64_t PayloadScanner::scan(std::vector vectorsToRead) { endTuplesIdxToReadInMergedKeyBlock - nextTupleIdxToReadInMergedKeyBlock); auto numTuplesRead = 0u; while (numTuplesRead < numTuplesToRead) { - auto numTuplesToReadInCurBlock = std::min( - numTuplesToRead - numTuplesRead, blockPtrInfo->getNumTuplesLeftInCurBlock()); + auto numTuplesToReadInCurBlock = std::min(numTuplesToRead - numTuplesRead, + blockPtrInfo->getNumTuplesLeftInCurBlock()); for (auto i = 0u; i < numTuplesToReadInCurBlock; i++) { auto payloadInfo = blockPtrInfo->curTuplePtr + payloadIdxOffset; auto blockIdx = OrderByKeyEncoder::getEncodedFTBlockIdx(payloadInfo); diff --git a/src/processor/operator/order_by/top_k.cpp b/src/processor/operator/order_by/top_k.cpp index 381e5937464..2484b8dc067 100644 --- a/src/processor/operator/order_by/top_k.cpp +++ b/src/processor/operator/order_by/top_k.cpp @@ -13,8 +13,8 @@ TopKSortState::TopKSortState() : numTuples{0}, memoryManager{nullptr} { orderBySharedState = std::make_unique(); } -void TopKSortState::init( - const OrderByDataInfo& orderByDataInfo, storage::MemoryManager* memoryManager) { +void TopKSortState::init(const OrderByDataInfo& orderByDataInfo, + storage::MemoryManager* memoryManager) { this->memoryManager = memoryManager; orderBySharedState->init(orderByDataInfo); orderByLocalState->init(orderByDataInfo, *orderBySharedState, memoryManager); @@ -42,8 +42,8 @@ void TopKSortState::finalize() { } } -void TopKBuffer::init( - storage::MemoryManager* memoryManager, uint64_t skipNumber, uint64_t limitNumber) { +void TopKBuffer::init(storage::MemoryManager* memoryManager, uint64_t skipNumber, + uint64_t limitNumber) { this->memoryManager = memoryManager; sortState->init(*orderByDataInfo, memoryManager); this->skip = skipNumber; @@ -132,8 +132,8 @@ void TopKBuffer::initVectors() { } template -void TopKBuffer::getSelectComparisonFunction( - common::PhysicalTypeID typeID, vector_select_comparison_func& selectFunc) { +void TopKBuffer::getSelectComparisonFunction(common::PhysicalTypeID typeID, + vector_select_comparison_func& selectFunc) { switch (typeID) { case common::PhysicalTypeID::INT64: { selectFunc = function::BinaryFunctionExecutor::selectComparison; @@ -209,12 +209,12 @@ bool TopKBuffer::compareBoundaryValue(const std::vector& k } } -bool TopKBuffer::compareFlatKeys( - vector_idx_t vectorIdxToCompare, std::vector keyVectors) { +bool TopKBuffer::compareFlatKeys(vector_idx_t vectorIdxToCompare, + std::vector keyVectors) { auto selVector = std::make_shared(common::DEFAULT_VECTOR_CAPACITY); selVector->setToFiltered(); - auto compareResult = compareFuncs[vectorIdxToCompare]( - *keyVectors[vectorIdxToCompare], *boundaryVecs[vectorIdxToCompare], *selVector); + auto compareResult = compareFuncs[vectorIdxToCompare](*keyVectors[vectorIdxToCompare], + *boundaryVecs[vectorIdxToCompare], *selVector); if (vectorIdxToCompare == keyVectors.size() - 1) { return compareResult; } else if (equalsFuncs[vectorIdxToCompare](*keyVectors[vectorIdxToCompare], @@ -225,13 +225,13 @@ bool TopKBuffer::compareFlatKeys( } } -void TopKBuffer::compareUnflatKeys( - vector_idx_t vectorIdxToCompare, std::vector keyVectors) { +void TopKBuffer::compareUnflatKeys(vector_idx_t vectorIdxToCompare, + std::vector keyVectors) { auto compareSelVector = std::make_shared(common::DEFAULT_VECTOR_CAPACITY); compareSelVector->setToFiltered(); - compareFuncs[vectorIdxToCompare]( - *keyVectors[vectorIdxToCompare], *boundaryVecs[vectorIdxToCompare], *compareSelVector); + compareFuncs[vectorIdxToCompare](*keyVectors[vectorIdxToCompare], + *boundaryVecs[vectorIdxToCompare], *compareSelVector); if (vectorIdxToCompare != keyVectors.size() - 1) { auto equalsSelVector = std::make_shared(common::DEFAULT_VECTOR_CAPACITY); @@ -246,8 +246,8 @@ void TopKBuffer::compareUnflatKeys( keyVectors[vectorIdxToCompare]->state->selVector = std::move(compareSelVector); } -void TopKBuffer::appendSelState( - common::SelectionVector* selVector, common::SelectionVector* selVectorToAppend) { +void TopKBuffer::appendSelState(common::SelectionVector* selVector, + common::SelectionVector* selVectorToAppend) { for (auto i = 0u; i < selVectorToAppend->selectedSize; i++) { selVector->selectedPositions[selVector->selectedSize + i] = selVectorToAppend->selectedPositions[i]; @@ -271,8 +271,8 @@ void TopKLocalState::append(const std::vector& keyVectors, void TopK::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { localState = std::make_unique(); - localState->init( - *info, context->clientContext->getMemoryManager(), *resultSet, skipNumber, limitNumber); + localState->init(*info, context->clientContext->getMemoryManager(), *resultSet, skipNumber, + limitNumber); for (auto& dataPos : info->payloadsPos) { payloadVectors.push_back(resultSet->getValueVector(dataPos).get()); } diff --git a/src/processor/operator/order_by/top_k_scanner.cpp b/src/processor/operator/order_by/top_k_scanner.cpp index b4c8d1c46e6..4e164fdd4b4 100644 --- a/src/processor/operator/order_by/top_k_scanner.cpp +++ b/src/processor/operator/order_by/top_k_scanner.cpp @@ -3,16 +3,16 @@ namespace kuzu { namespace processor { -void TopKLocalScanState::init( - std::vector& outVectorPos, TopKSharedState& sharedState, ResultSet& resultSet) { +void TopKLocalScanState::init(std::vector& outVectorPos, TopKSharedState& sharedState, + ResultSet& resultSet) { for (auto& pos : outVectorPos) { vectorsToScan.push_back(resultSet.getValueVector(pos).get()); } payloadScanner = sharedState.buffer->getScanner(); } -void TopKScan::initLocalStateInternal( - kuzu::processor::ResultSet* resultSet, kuzu::processor::ExecutionContext* /*context*/) { +void TopKScan::initLocalStateInternal(kuzu::processor::ResultSet* resultSet, + kuzu::processor::ExecutionContext* /*context*/) { localState->init(outVectorPos, *sharedState, *resultSet); } diff --git a/src/processor/operator/partitioner.cpp b/src/processor/operator/partitioner.cpp index 6a7605bc1a0..3f78f582c41 100644 --- a/src/processor/operator/partitioner.cpp +++ b/src/processor/operator/partitioner.cpp @@ -96,8 +96,8 @@ void Partitioner::initGlobalStateInternal(ExecutionContext* /*context*/) { void Partitioner::initLocalStateInternal(ResultSet* /*resultSet*/, ExecutionContext* /*context*/) { localState = std::make_unique(); - initializePartitioningStates( - infos, localState->partitioningBuffers, sharedState->numPartitions); + initializePartitioningStates(infos, localState->partitioningBuffers, + sharedState->numPartitions); } DataChunk Partitioner::constructDataChunk(const std::vector& columnPositions, @@ -140,8 +140,8 @@ void Partitioner::executeInternal(ExecutionContext* context) { auto keyVector = resultSet->getValueVector(info->keyDataPos); partitionIdxes->state = resultSet->getValueVector(info->keyDataPos)->state; info->partitionerFunc(keyVector.get(), partitionIdxes.get()); - auto chunkToCopyFrom = constructDataChunk( - info->columnDataPositions, info->columnTypes, *resultSet, keyVector->state); + auto chunkToCopyFrom = constructDataChunk(info->columnDataPositions, info->columnTypes, + *resultSet, keyVector->state); copyDataToPartitions(partitioningIdx, std::move(chunkToCopyFrom)); } } diff --git a/src/processor/operator/persistent/copy_rdf.cpp b/src/processor/operator/persistent/copy_rdf.cpp index ab4f3b0acad..e2a5e9701e4 100644 --- a/src/processor/operator/persistent/copy_rdf.cpp +++ b/src/processor/operator/persistent/copy_rdf.cpp @@ -8,8 +8,8 @@ namespace processor { void CopyRdf::finalize(ExecutionContext* context) { auto outputMsg = common::stringFormat("Done copy rdf."); - FactorizedTableUtils::appendStringToTable( - sharedState->fTable.get(), outputMsg, context->clientContext->getMemoryManager()); + FactorizedTableUtils::appendStringToTable(sharedState->fTable.get(), outputMsg, + context->clientContext->getMemoryManager()); } } // namespace processor diff --git a/src/processor/operator/persistent/copy_to_csv.cpp b/src/processor/operator/persistent/copy_to_csv.cpp index 7b242a91f0d..534da31d68a 100644 --- a/src/processor/operator/persistent/copy_to_csv.cpp +++ b/src/processor/operator/persistent/copy_to_csv.cpp @@ -34,8 +34,8 @@ void CopyToCSVLocalState::init(CopyToInfo* info, MemoryManager* mm, ResultSet* r castFuncs.resize(info->dataPoses.size()); for (auto i = 0u; i < info->dataPoses.size(); i++) { auto vectorToCast = resultSet->getValueVector(info->dataPoses[i]); - castFuncs[i] = function::CastFunction::bindCastFunction( - "cast", vectorToCast->dataType.getLogicalTypeID(), LogicalTypeID::STRING) + castFuncs[i] = function::CastFunction::bindCastFunction("cast", + vectorToCast->dataType.getLogicalTypeID(), LogicalTypeID::STRING) ->execFunc; vectorsToCast.push_back(std::move(vectorToCast)); auto castVector = std::make_unique(LogicalTypeID::STRING, mm); @@ -104,8 +104,8 @@ void CopyToCSVLocalState::writeString(common::BufferedSerializer* serializer, } } -bool CopyToCSVLocalState::requireQuotes( - CopyToCSVInfo* copyToCsvInfo, const uint8_t* str, uint64_t len) { +bool CopyToCSVLocalState::requireQuotes(CopyToCSVInfo* copyToCsvInfo, const uint8_t* str, + uint64_t len) { // Check if the string is equal to the null string. if (len == strlen(CopyToCSVConstants::DEFAULT_NULL_STR) && memcmp(str, CopyToCSVConstants::DEFAULT_NULL_STR, len) == 0) { diff --git a/src/processor/operator/persistent/copy_to_parquet.cpp b/src/processor/operator/persistent/copy_to_parquet.cpp index 31795cdda8b..58f32753d23 100644 --- a/src/processor/operator/persistent/copy_to_parquet.cpp +++ b/src/processor/operator/persistent/copy_to_parquet.cpp @@ -6,8 +6,8 @@ namespace processor { using namespace kuzu::common; using namespace kuzu::storage; -void CopyToParquetLocalState::init( - CopyToInfo* info, storage::MemoryManager* mm, ResultSet* resultSet) { +void CopyToParquetLocalState::init(CopyToInfo* info, storage::MemoryManager* mm, + ResultSet* resultSet) { auto copyToInfo = reinterpret_cast(info); ft = std::make_unique(mm, std::move(copyToInfo->tableSchema)); numTuplesInFT = 0; diff --git a/src/processor/operator/persistent/delete.cpp b/src/processor/operator/persistent/delete.cpp index e500a2f3568..d4117a8c9c0 100644 --- a/src/processor/operator/persistent/delete.cpp +++ b/src/processor/operator/persistent/delete.cpp @@ -25,8 +25,8 @@ std::unique_ptr DeleteNode::clone() { for (auto& executor : executors) { executorsCopy.push_back(executor->copy()); } - return std::make_unique( - std::move(executorsCopy), children[0]->clone(), id, paramsString); + return std::make_unique(std::move(executorsCopy), children[0]->clone(), id, + paramsString); } void DeleteRel::initLocalStateInternal(ResultSet* resultSet, ExecutionContext* context) { @@ -51,8 +51,8 @@ std::unique_ptr DeleteRel::clone() { for (auto& executor : executors) { executorsCopy.push_back(executor->copy()); } - return std::make_unique( - std::move(executorsCopy), children[0]->clone(), id, paramsString); + return std::make_unique(std::move(executorsCopy), children[0]->clone(), id, + paramsString); } } // namespace processor diff --git a/src/processor/operator/persistent/delete_executor.cpp b/src/processor/operator/persistent/delete_executor.cpp index fcf6050146a..1b62030fc13 100644 --- a/src/processor/operator/persistent/delete_executor.cpp +++ b/src/processor/operator/persistent/delete_executor.cpp @@ -26,8 +26,8 @@ static void deleteFromRelTable(ExecutionContext* context, DeleteNodeType deleteT RelDetachDeleteState* detachDeleteState) { switch (deleteType) { case DeleteNodeType::DETACH_DELETE: { - relTable->detachDelete( - context->clientContext->getTx(), direction, nodeIDVector, detachDeleteState); + relTable->detachDelete(context->clientContext->getTx(), direction, nodeIDVector, + detachDeleteState); } break; case DeleteNodeType::DELETE: { relTable->checkIfNodeHasRels(context->clientContext->getTx(), direction, nodeIDVector); @@ -92,8 +92,8 @@ void MultiLabelNodeDeleteExecutor::delete_(ExecutionContext* context) { deleteFromRelTable(context, deleteType, RelDataDirection::BWD, relTable, nodeIDVector, detachDeleteState.get()); } - auto deleteState = std::make_unique( - *nodeIDVector, *pkVectors.at(nodeID.tableID)); + auto deleteState = std::make_unique(*nodeIDVector, + *pkVectors.at(nodeID.tableID)); table->delete_(context->clientContext->getTx(), *deleteState); } @@ -104,8 +104,8 @@ void RelDeleteExecutor::init(ResultSet* resultSet, ExecutionContext* /*context*/ } void SingleLabelRelDeleteExecutor::delete_(ExecutionContext* context) { - auto deleteState = std::make_unique( - *srcNodeIDVector, *dstNodeIDVector, *relIDVector); + auto deleteState = std::make_unique(*srcNodeIDVector, + *dstNodeIDVector, *relIDVector); table->delete_(context->clientContext->getTx(), *deleteState); } @@ -115,8 +115,8 @@ void MultiLabelRelDeleteExecutor::delete_(ExecutionContext* context) { auto relID = relIDVector->getValue(pos); KU_ASSERT(tableIDToTableMap.contains(relID.tableID)); auto table = tableIDToTableMap.at(relID.tableID); - auto deleteState = std::make_unique( - *srcNodeIDVector, *dstNodeIDVector, *relIDVector); + auto deleteState = std::make_unique(*srcNodeIDVector, + *dstNodeIDVector, *relIDVector); table->delete_(context->clientContext->getTx(), *deleteState); } diff --git a/src/processor/operator/persistent/export_db.cpp b/src/processor/operator/persistent/export_db.cpp index 71a59de28ff..4f492892080 100644 --- a/src/processor/operator/persistent/export_db.cpp +++ b/src/processor/operator/persistent/export_db.cpp @@ -21,15 +21,15 @@ namespace processor { using std::stringstream; -static void writeStringStreamToFile( - VirtualFileSystem* vfs, std::string ss_string, const std::string& path) { +static void writeStringStreamToFile(VirtualFileSystem* vfs, std::string ss_string, + const std::string& path) { auto fileInfo = vfs->openFile(path, O_WRONLY | O_CREAT); - fileInfo->writeFile( - reinterpret_cast(ss_string.c_str()), ss_string.size(), 0 /* offset */); + fileInfo->writeFile(reinterpret_cast(ss_string.c_str()), ss_string.size(), + 0 /* offset */); } -static void writeCopyStatement( - stringstream& ss, std::string tableName, ReaderConfig* boundFileInfo) { +static void writeCopyStatement(stringstream& ss, std::string tableName, + ReaderConfig* boundFileInfo) { auto fileTypeStr = FileTypeUtils::toString(boundFileInfo->fileType); StringUtils::toLower(fileTypeStr); auto csvConfig = common::CSVReaderConfig::construct(boundFileInfo->options); @@ -57,8 +57,8 @@ std::string getMacroCypher(catalog::Catalog* catalog, transaction::Transaction* return ss.str(); } -std::string getCopyCypher( - catalog::Catalog* catalog, transaction::Transaction* tx, ReaderConfig* boundFileInfo) { +std::string getCopyCypher(catalog::Catalog* catalog, transaction::Transaction* tx, + ReaderConfig* boundFileInfo) { stringstream ss; for (auto& nodeTableEntry : catalog->getNodeTableEntries(tx)) { auto tableName = nodeTableEntry->getName(); @@ -83,8 +83,8 @@ bool ExportDB::getNextTuplesInternal(ExecutionContext* context) { // write the copy.cypher file // for every table, we write COPY FROM statement writeStringStreamToFile(context->clientContext->getVFSUnsafe(), - getCopyCypher( - context->clientContext->getCatalog(), context->clientContext->getTx(), &boundFileInfo), + getCopyCypher(context->clientContext->getCatalog(), context->clientContext->getTx(), + &boundFileInfo), boundFileInfo.filePaths[0] + "/copy.cypher"); return false; } diff --git a/src/processor/operator/persistent/insert_executor.cpp b/src/processor/operator/persistent/insert_executor.cpp index c99d253c8b8..3c4893beb59 100644 --- a/src/processor/operator/persistent/insert_executor.cpp +++ b/src/processor/operator/persistent/insert_executor.cpp @@ -54,8 +54,8 @@ void NodeInsertExecutor::insert(Transaction* tx, ExecutionContext* context) { return; } // TODO: Move pkVector pos to info. - auto nodeInsertState = std::make_unique( - *nodeIDVector, *columnDataVectors[table->getPKColumnID()], columnDataVectors); + auto nodeInsertState = std::make_unique(*nodeIDVector, + *columnDataVectors[table->getPKColumnID()], columnDataVectors); table->insert(tx, *nodeInsertState); writeResult(); } @@ -151,8 +151,8 @@ void RelInsertExecutor::insert(transaction::Transaction* tx, ExecutionContext* c for (auto i = 1u; i < columnDataEvaluators.size(); ++i) { columnDataEvaluators[i]->evaluate(context->clientContext); } - auto insertState = std::make_unique( - *srcNodeIDVector, *dstNodeIDVector, columnDataVectors); + auto insertState = std::make_unique(*srcNodeIDVector, + *dstNodeIDVector, columnDataVectors); table->insert(tx, *insertState); writeResult(); } diff --git a/src/processor/operator/persistent/node_batch_insert.cpp b/src/processor/operator/persistent/node_batch_insert.cpp index b84eb5b844c..857f8cb6e6c 100644 --- a/src/processor/operator/persistent/node_batch_insert.cpp +++ b/src/processor/operator/persistent/node_batch_insert.cpp @@ -16,8 +16,8 @@ void NodeBatchInsertSharedState::initPKIndex(kuzu::processor::ExecutionContext* KU_ASSERT(pkType.getLogicalTypeID() != LogicalTypeID::SERIAL); auto indexFName = StorageUtils::getNodeIndexFName(context->clientContext->getVFSUnsafe(), wal->getDirectory(), table->getTableID(), FileVersionType::ORIGINAL); - pkIndex = std::make_unique( - indexFName, pkType.getPhysicalType(), context->clientContext->getVFSUnsafe()); + pkIndex = std::make_unique(indexFName, pkType.getPhysicalType(), + context->clientContext->getVFSUnsafe()); uint64_t numRows; if (readerSharedState != nullptr) { KU_ASSERT(distinctSharedState == nullptr); @@ -43,8 +43,8 @@ void NodeBatchInsertSharedState::appendIncompleteNodeGroup( if (sharedNodeGroup->isFull()) { auto nodeGroupIdx = getNextNodeGroupIdxWithoutLock(); auto nodeTable = ku_dynamic_cast(table); - NodeBatchInsert::writeAndResetNodeGroup( - nodeGroupIdx, indexBuilder, pkColumnIdx, nodeTable, sharedNodeGroup.get()); + NodeBatchInsert::writeAndResetNodeGroup(nodeGroupIdx, indexBuilder, pkColumnIdx, nodeTable, + sharedNodeGroup.get()); } if (numNodesAppended < localNodeGroup->getNumRows()) { sharedNodeGroup->append(localNodeGroup.get(), numNodesAppended); @@ -95,8 +95,8 @@ void NodeBatchInsert::initLocalStateInternal(ResultSet* resultSet, ExecutionCont nodeLocalState->columnVectors.push_back(nullVector.get()); } } - nodeLocalState->nodeGroup = NodeGroupFactory::createNodeGroup( - ColumnDataFormat::REGULAR, nodeInfo->columnTypes, info->compressionEnabled); + nodeLocalState->nodeGroup = NodeGroupFactory::createNodeGroup(ColumnDataFormat::REGULAR, + nodeInfo->columnTypes, info->compressionEnabled); nodeLocalState->columnState = state.get(); } @@ -117,8 +117,8 @@ void NodeBatchInsert::executeInternal(ExecutionContext* context) { auto nodeSharedState = ku_dynamic_cast( sharedState.get()); - nodeSharedState->appendIncompleteNodeGroup( - std::move(nodeLocalState->nodeGroup), nodeLocalState->localIndexBuilder); + nodeSharedState->appendIncompleteNodeGroup(std::move(nodeLocalState->nodeGroup), + nodeLocalState->localIndexBuilder); } if (nodeLocalState->localIndexBuilder) { KU_ASSERT(token); @@ -133,8 +133,8 @@ void NodeBatchInsert::writeAndResetNodeGroup(node_group_idx_t nodeGroupIdx, nodeGroup->finalize(nodeGroupIdx); if (indexBuilder) { auto nodeOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); - indexBuilder->insert( - nodeGroup->getColumnChunkUnsafe(pkColumnID), nodeOffset, nodeGroup->getNumRows()); + indexBuilder->insert(nodeGroup->getColumnChunkUnsafe(pkColumnID), nodeOffset, + nodeGroup->getNumRows()); } table->append(nodeGroup); nodeGroup->resetToEmpty(); @@ -188,8 +188,8 @@ void NodeBatchInsert::finalize(ExecutionContext* context) { } auto outputMsg = stringFormat("{} number of tuples has been copied to table: {}.", sharedState->getNumRows(), info->tableEntry->getName()); - FactorizedTableUtils::appendStringToTable( - sharedState->fTable.get(), outputMsg, context->clientContext->getMemoryManager()); + FactorizedTableUtils::appendStringToTable(sharedState->fTable.get(), outputMsg, + context->clientContext->getMemoryManager()); } } // namespace processor } // namespace kuzu diff --git a/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp index 3e961821c74..d03d95b647f 100644 --- a/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/base_csv_reader.cpp @@ -276,7 +276,7 @@ uint64_t BaseCSVReader::parseCSV(Driver& driver) { goto final_state; } goto value_start; -add_row : { +add_row: { // We get here after we have a newline. KU_ASSERT(isNewLine(buffer[position])); bool isCarriageReturn = buffer[position] == '\r'; @@ -323,8 +323,8 @@ add_row : { } while (readBuffer(&start)); [[unlikely]] // still in quoted state at the end of the file, error: - throw CopyException(stringFormat( - "Error in file {} on line {}: unterminated quotes.", fileInfo->path, getLineNumber())); + throw CopyException(stringFormat("Error in file {} on line {}: unterminated quotes.", + fileInfo->path, getLineNumber())); unquote: KU_ASSERT(hasQuotes && buffer[position] == option.quoteChar); // this state handles the state directly after we unquote @@ -421,8 +421,8 @@ uint64_t BaseCSVReader::getLineNumber() { char buf[BUF_SIZE]; if (fileInfo->seek(0, SEEK_SET) == -1) { // LCOV_EXCL_START - throw CopyException(stringFormat( - "Could not seek to beginning of file {}: {}", fileInfo->path, posixErrMessage())); + throw CopyException(stringFormat("Could not seek to beginning of file {}: {}", + fileInfo->path, posixErrMessage())); // LCOV_EXCL_STOP } diff --git a/src/processor/operator/persistent/reader/csv/driver.cpp b/src/processor/operator/persistent/reader/csv/driver.cpp index f6a1598696f..fbf03c29861 100644 --- a/src/processor/operator/persistent/reader/csv/driver.cpp +++ b/src/processor/operator/persistent/reader/csv/driver.cpp @@ -17,8 +17,8 @@ bool ParsingDriver::done(uint64_t rowNum) { return rowNum >= DEFAULT_VECTOR_CAPACITY || doneEarly(); } -void ParsingDriver::addValue( - uint64_t rowNum, common::column_id_t columnIdx, std::string_view value) { +void ParsingDriver::addValue(uint64_t rowNum, common::column_id_t columnIdx, + std::string_view value) { uint64_t length = value.length(); if (length == 0 && columnIdx == 0) { rowEmpty = true; @@ -36,8 +36,8 @@ void ParsingDriver::addValue( reader->fileInfo->path, reader->getLineNumber(), reader->numColumns)); } try { - function::CastString::copyStringToVector( - chunk.getValueVector(columnIdx).get(), rowNum, value, &reader->option); + function::CastString::copyStringToVector(chunk.getValueVector(columnIdx).get(), rowNum, + value, &reader->option); } catch (ConversionException& e) { throw CopyException(stringFormat("Error in file {} on line {}: {}", reader->fileInfo->path, reader->getLineNumber(), e.what())); @@ -113,8 +113,8 @@ bool SniffCSVColumnCountDriver::done(uint64_t) const { return !emptyRow; } -void SniffCSVColumnCountDriver::addValue( - uint64_t, common::column_id_t columnIdx, std::string_view value) { +void SniffCSVColumnCountDriver::addValue(uint64_t, common::column_id_t columnIdx, + std::string_view value) { if (value != "" || columnIdx > 0) { emptyRow = false; } diff --git a/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp index d7954bc65b7..76f3712b3ea 100644 --- a/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/parallel_csv_reader.cpp @@ -153,8 +153,8 @@ static offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output) { } while (true); } -static std::unique_ptr bindFunc( - main::ClientContext* /*context*/, TableFuncBindInput* input) { +static std::unique_ptr bindFunc(main::ClientContext* /*context*/, + TableFuncBindInput* input) { auto scanInput = ku_dynamic_cast(input); std::vector detectedColumnNames; std::vector detectedColumnTypes; diff --git a/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp b/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp index 32141ccfa6e..c809d8d1c5e 100644 --- a/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp +++ b/src/processor/operator/persistent/reader/csv/serial_csv_reader.cpp @@ -63,8 +63,8 @@ void SerialCSVScanSharedState::read(DataChunk& outputChunk) { void SerialCSVScanSharedState::initReader(main::ClientContext* context) { if (fileIdx < readerConfig.getNumFiles()) { - reader = std::make_unique( - readerConfig.filePaths[fileIdx], csvReaderConfig.option.copy(), numColumns, context); + reader = std::make_unique(readerConfig.filePaths[fileIdx], + csvReaderConfig.option.copy(), numColumns, context); } } @@ -99,8 +99,8 @@ void SerialCSVScan::bindColumns(const ScanTableFuncBindInput* bindInput, } } -static std::unique_ptr bindFunc( - main::ClientContext* /*context*/, TableFuncBindInput* input) { +static std::unique_ptr bindFunc(main::ClientContext* /*context*/, + TableFuncBindInput* input) { auto scanInput = ku_dynamic_cast(input); std::vector detectedColumnNames; std::vector detectedColumnTypes; diff --git a/src/processor/operator/persistent/reader/npy/npy_reader.cpp b/src/processor/operator/persistent/reader/npy/npy_reader.cpp index 3481361d3d6..5fd2298bbf0 100644 --- a/src/processor/operator/persistent/reader/npy/npy_reader.cpp +++ b/src/processor/operator/persistent/reader/npy/npy_reader.cpp @@ -266,8 +266,8 @@ static std::unique_ptr bindColumnType(const NpyReader& reader) { } // For columns whose type is a multi-dimension array of size n*m, // we flatten the row data into an 1-d array with size 1*k where k = n*m - return LogicalType::ARRAY( - std::make_unique(reader.getType()), reader.getNumElementsPerRow()); + return LogicalType::ARRAY(std::make_unique(reader.getType()), + reader.getNumElementsPerRow()); } static void bindColumns(const common::ReaderConfig& readerConfig, uint32_t fileIdx, @@ -293,8 +293,8 @@ static void bindColumns(const common::ReaderConfig& readerConfig, } } -static std::unique_ptr bindFunc( - main::ClientContext* /*context*/, function::TableFuncBindInput* input) { +static std::unique_ptr bindFunc(main::ClientContext* /*context*/, + function::TableFuncBindInput* input) { auto scanInput = reinterpret_cast(input); std::vector detectedColumnNames; std::vector detectedColumnTypes; diff --git a/src/processor/operator/persistent/reader/parquet/boolean_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/boolean_column_reader.cpp index 7c0443f75ed..a34e4d074c5 100644 --- a/src/processor/operator/persistent/reader/parquet/boolean_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/boolean_column_reader.cpp @@ -7,8 +7,8 @@ void BooleanColumnReader::initializeRead(uint64_t rowGroupIdx, const std::vector& columns, kuzu_apache::thrift::protocol::TProtocol& protocol) { bytePos = 0; - TemplatedColumnReader::initializeRead( - rowGroupIdx, columns, protocol); + TemplatedColumnReader::initializeRead(rowGroupIdx, columns, + protocol); } bool BooleanParquetValueConversion::plainRead(ByteBuffer& plainData, ColumnReader& reader) { diff --git a/src/processor/operator/persistent/reader/parquet/column_reader.cpp b/src/processor/operator/persistent/reader/parquet/column_reader.cpp index 5cf65751429..26802b5adb0 100644 --- a/src/processor/operator/persistent/reader/parquet/column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/column_reader.cpp @@ -174,8 +174,8 @@ uint64_t ColumnReader::read(uint64_t numValues, parquet_filter_t& filter, uint8_ auto readBuf = std::make_shared(); readBuf->resize(sizeof(bool) * (readNow - nullCount)); rleDecoder->GetBatch(readBuf->ptr, readNow - nullCount); - plainTemplated>( - readBuf, defineOut, readNow, filter, resultOffset, resultOut); + plainTemplated>(readBuf, defineOut, readNow, + filter, resultOffset, resultOut); } else { plain(block, defineOut, readNow, filter, resultOffset, resultOut); } @@ -195,63 +195,63 @@ std::unique_ptr ColumnReader::createReader(ParquetReader& reader, uint64_t fileIdx, uint64_t maxDefine, uint64_t maxRepeat) { switch (type->getLogicalTypeID()) { case common::LogicalTypeID::BOOL: - return std::make_unique( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + return std::make_unique(reader, std::move(type), schema, fileIdx, + maxDefine, maxRepeat); case common::LogicalTypeID::INT8: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::INT16: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::INT32: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::INT64: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::UINT8: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::UINT16: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::UINT32: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::UINT64: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::FLOAT: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::DOUBLE: return std::make_unique< - TemplatedColumnReader>>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + TemplatedColumnReader>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::DATE: return std::make_unique< CallbackColumnReader>( reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); case common::LogicalTypeID::BLOB: case common::LogicalTypeID::STRING: - return std::make_unique( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + return std::make_unique(reader, std::move(type), schema, fileIdx, + maxDefine, maxRepeat); case common::LogicalTypeID::INTERVAL: - return std::make_unique( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + return std::make_unique(reader, std::move(type), schema, fileIdx, + maxDefine, maxRepeat); case common::LogicalTypeID::TIMESTAMP_TZ: case common::LogicalTypeID::TIMESTAMP: - return createTimestampReader( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + return createTimestampReader(reader, std::move(type), schema, fileIdx, maxDefine, + maxRepeat); // TODO(kebing): timestamp default: KU_UNREACHABLE; @@ -303,15 +303,15 @@ void ColumnReader::decompressInternal(kuzu_parquet::format::CompressionCodec::ty throw common::CopyException("Parquet data unexpectedly uncompressed"); case CompressionCodec::GZIP: { MiniZStream s; - s.Decompress( - reinterpret_cast(src), srcSize, reinterpret_cast(dst), dstSize); + s.Decompress(reinterpret_cast(src), srcSize, reinterpret_cast(dst), + dstSize); break; } case CompressionCodec::SNAPPY: { { size_t uncompressedSize = 0; - auto res = kuzu_snappy::GetUncompressedLength( - reinterpret_cast(src), srcSize, &uncompressedSize); + auto res = kuzu_snappy::GetUncompressedLength(reinterpret_cast(src), + srcSize, &uncompressedSize); // LCOV_EXCL_START if (!res) { throw common::RuntimeException{"Failed to decompress parquet file."}; @@ -322,8 +322,8 @@ void ColumnReader::decompressInternal(kuzu_parquet::format::CompressionCodec::ty } // LCOV_EXCL_STOP } - auto res = kuzu_snappy::RawUncompress( - reinterpret_cast(src), srcSize, reinterpret_cast(dst)); + auto res = kuzu_snappy::RawUncompress(reinterpret_cast(src), srcSize, + reinterpret_cast(dst)); // LCOV_EXCL_START if (!res) { throw common::RuntimeException{"Snappy decompression failure"}; @@ -426,8 +426,8 @@ void ColumnReader::prepareDataPage(kuzu_parquet::format::PageHeader& pageHdr) { uint32_t repLength = isV1 ? block->read() : v2Header.repetition_levels_byte_length; block->available(repLength); - repeatedDecoder = std::make_unique( - block->ptr, repLength, RleBpDecoder::ComputeBitWidth(maxRepeat)); + repeatedDecoder = std::make_unique(block->ptr, repLength, + RleBpDecoder::ComputeBitWidth(maxRepeat)); block->inc(repLength); } else if (isV2 && v2Header.repetition_levels_byte_length > 0) { block->inc(v2Header.repetition_levels_byte_length); @@ -436,8 +436,8 @@ void ColumnReader::prepareDataPage(kuzu_parquet::format::PageHeader& pageHdr) { if (hasDefines()) { auto defLen = isV1 ? block->read() : v2Header.definition_levels_byte_length; block->available(defLen); - defineDecoder = std::make_unique( - block->ptr, defLen, RleBpDecoder::ComputeBitWidth(maxDefine)); + defineDecoder = std::make_unique(block->ptr, defLen, + RleBpDecoder::ComputeBitWidth(maxDefine)); block->inc(defLen); } else if (isV2 && v2Header.definition_levels_byte_length > 0) { block->inc(v2Header.definition_levels_byte_length); @@ -491,23 +491,23 @@ std::unique_ptr ColumnReader::createTimestampReader(ParquetReader& switch (schema.type) { case Type::INT96: { return std::make_unique>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + ParquetTimeStampUtils::impalaTimestampToTimestamp>>(reader, std::move(type), schema, + fileIdx, maxDefine, maxRepeat); } case Type::INT64: { if (schema.__isset.logicalType && schema.logicalType.__isset.TIMESTAMP) { if (schema.logicalType.TIMESTAMP.unit.__isset.MILLIS) { return std::make_unique>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + ParquetTimeStampUtils::parquetTimestampMsToTimestamp>>(reader, std::move(type), + schema, fileIdx, maxDefine, maxRepeat); } else if (schema.logicalType.TIMESTAMP.unit.__isset.MICROS) { return std::make_unique>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + ParquetTimeStampUtils::parquetTimestampMicrosToTimestamp>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); } else if (schema.logicalType.TIMESTAMP.unit.__isset.NANOS) { return std::make_unique>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + ParquetTimeStampUtils::parquetTimestampNsToTimestamp>>(reader, std::move(type), + schema, fileIdx, maxDefine, maxRepeat); } // LCOV_EXCL_START } else if (schema.__isset.converted_type) { @@ -515,12 +515,12 @@ std::unique_ptr ColumnReader::createTimestampReader(ParquetReader& switch (schema.converted_type) { case ConvertedType::TIMESTAMP_MICROS: return std::make_unique>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + ParquetTimeStampUtils::parquetTimestampMicrosToTimestamp>>(reader, + std::move(type), schema, fileIdx, maxDefine, maxRepeat); case ConvertedType::TIMESTAMP_MILLIS: return std::make_unique>( - reader, std::move(type), schema, fileIdx, maxDefine, maxRepeat); + ParquetTimeStampUtils::parquetTimestampMsToTimestamp>>(reader, std::move(type), + schema, fileIdx, maxDefine, maxRepeat); default: KU_UNREACHABLE; } diff --git a/src/processor/operator/persistent/reader/parquet/interval_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/interval_column_reader.cpp index 49045ad709a..5c34fe7a6b6 100644 --- a/src/processor/operator/persistent/reader/parquet/interval_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/interval_column_reader.cpp @@ -12,8 +12,8 @@ common::interval_t IntervalValueConversion::readParquetInterval(const char* inpu return result; } -common::interval_t IntervalValueConversion::plainRead( - ByteBuffer& plainData, ColumnReader& /*reader*/) { +common::interval_t IntervalValueConversion::plainRead(ByteBuffer& plainData, + ColumnReader& /*reader*/) { auto intervalLen = common::ParquetConstants::PARQUET_INTERVAL_SIZE; plainData.available(intervalLen); auto res = readParquetInterval(reinterpret_cast(plainData.ptr)); @@ -21,8 +21,8 @@ common::interval_t IntervalValueConversion::plainRead( return res; } -void IntervalColumnReader::dictionary( - const std::shared_ptr& dictionary_data, uint64_t num_entries) { +void IntervalColumnReader::dictionary(const std::shared_ptr& dictionary_data, + uint64_t num_entries) { allocateDict(num_entries * sizeof(common::interval_t)); auto dict_ptr = reinterpret_cast(this->dict->ptr); for (auto i = 0u; i < num_entries; i++) { diff --git a/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp index 18028ae0ddc..ce22b533e3b 100644 --- a/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/list_column_reader.cpp @@ -62,8 +62,8 @@ uint64_t ListColumnReader::read(uint64_t numValues, parquet_filter_t& /*filter*/ // see if we have read enough if we have not read enough, we read another vector if we // have read enough, we leave any unhandled elements in the overflow vector for a // subsequent read - auto childReqNumValues = std::min( - common::DEFAULT_VECTOR_CAPACITY, childColumnReader->getGroupRowsAvailable()); + auto childReqNumValues = std::min(common::DEFAULT_VECTOR_CAPACITY, + childColumnReader->getGroupRowsAvailable()); childActualNumValues = childColumnReader->read(childReqNumValues, childFilter, childDefinesPtr, childRepeatsPtr, vectorToRead.get()); } else { diff --git a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp index 17cc980bf65..f7e40d05bb0 100644 --- a/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/parquet_reader.cpp @@ -24,8 +24,8 @@ ParquetReader::ParquetReader(const std::string& filePath, main::ClientContext* c initMetadata(); } -void ParquetReader::initializeScan( - ParquetReaderScanState& state, std::vector groups_to_read, VirtualFileSystem* vfs) { +void ParquetReader::initializeScan(ParquetReaderScanState& state, + std::vector groups_to_read, VirtualFileSystem* vfs) { state.currentGroup = -1; state.finished = false; state.groupOffset = 0; @@ -271,8 +271,8 @@ std::unique_ptr ParquetReader::createReaderRecursive(uint64_t dept } // LCOV_EXCL_STOP auto structType = LogicalType::STRUCT(std::move(structFields)); - resultType = std::unique_ptr(new LogicalType( - LogicalTypeID::MAP, std::make_unique(std::move(structType)))); + resultType = std::unique_ptr(new LogicalType(LogicalTypeID::MAP, + std::make_unique(std::move(structType)))); auto structReader = std::make_unique(*this, ListType::getChildType(resultType.get())->copy(), sEle, thisIdx, maxDefine - 1, @@ -306,14 +306,14 @@ std::unique_ptr ParquetReader::createReaderRecursive(uint64_t dept if (sEle.repetition_type == FieldRepetitionType::REPEATED) { auto derivedType = deriveLogicalType(sEle); auto listType = LogicalType::LIST(derivedType->copy()); - auto elementReader = ColumnReader::createReader( - *this, std::move(derivedType), sEle, nextFileIdx++, maxDefine, maxRepeat); + auto elementReader = ColumnReader::createReader(*this, std::move(derivedType), sEle, + nextFileIdx++, maxDefine, maxRepeat); return std::make_unique(*this, std::move(listType), sEle, thisIdx, maxDefine, maxRepeat, std::move(elementReader), context->getMemoryManager()); } // TODO check return value of derive type or should we only do this on read() - return ColumnReader::createReader( - *this, deriveLogicalType(sEle), sEle, nextFileIdx++, maxDefine, maxRepeat); + return ColumnReader::createReader(*this, deriveLogicalType(sEle), sEle, nextFileIdx++, + maxDefine, maxRepeat); } } @@ -348,8 +348,8 @@ std::unique_ptr ParquetReader::createReader() { void ParquetReader::prepareRowGroupBuffer(ParquetReaderScanState& state, uint64_t /*colIdx*/) { auto& group = getGroup(state); - state.rootReader->initializeRead( - state.groupIdxList[state.currentGroup], group.columns, *state.thriftFileProto); + state.rootReader->initializeRead(state.groupIdxList[state.currentGroup], group.columns, + *state.thriftFileProto); } uint64_t ParquetReader::getGroupSpan(ParquetReaderScanState& state) { @@ -360,8 +360,8 @@ uint64_t ParquetReader::getGroupSpan(ParquetReaderScanState& state) { // Set the min offset auto current_min_offset = UINT64_MAX; if (column_chunk.meta_data.__isset.dictionary_page_offset) { - current_min_offset = std::min( - current_min_offset, column_chunk.meta_data.dictionary_page_offset); + current_min_offset = std::min(current_min_offset, + column_chunk.meta_data.dictionary_page_offset); } if (column_chunk.meta_data.__isset.index_page_offset) { current_min_offset = @@ -370,8 +370,8 @@ uint64_t ParquetReader::getGroupSpan(ParquetReaderScanState& state) { current_min_offset = std::min(current_min_offset, column_chunk.meta_data.data_page_offset); min_offset = std::min(current_min_offset, min_offset); - max_offset = std::max( - max_offset, column_chunk.meta_data.total_compressed_size + current_min_offset); + max_offset = std::max(max_offset, + column_chunk.meta_data.total_compressed_size + current_min_offset); } return max_offset - min_offset; @@ -563,8 +563,8 @@ uint64_t ParquetReader::getGroupOffset(ParquetReaderScanState& state) { return minOffset; } -ParquetScanSharedState::ParquetScanSharedState( - common::ReaderConfig readerConfig, uint64_t numRows, main::ClientContext* context) +ParquetScanSharedState::ParquetScanSharedState(common::ReaderConfig readerConfig, uint64_t numRows, + main::ClientContext* context) : ScanFileSharedState{std::move(readerConfig), numRows, context} { readers.push_back( std::make_unique(this->readerConfig.filePaths[fileIdx], context)); @@ -576,8 +576,8 @@ ParquetScanSharedState::ParquetScanSharedState( numBlocksReadByFiles = 0; } -static bool parquetSharedStateNext( - ParquetScanLocalState& localState, ParquetScanSharedState& sharedState) { +static bool parquetSharedStateNext(ParquetScanLocalState& localState, + ParquetScanSharedState& sharedState) { std::lock_guard mtx{sharedState.lock}; while (true) { if (sharedState.fileIdx >= sharedState.readerConfig.getNumFiles()) { @@ -585,8 +585,8 @@ static bool parquetSharedStateNext( } if (sharedState.blockIdx < sharedState.readers[sharedState.fileIdx]->getNumRowsGroups()) { localState.reader = sharedState.readers[sharedState.fileIdx].get(); - localState.reader->initializeScan( - *localState.state, {sharedState.blockIdx}, sharedState.context->getVFSUnsafe()); + localState.reader->initializeScan(*localState.state, {sharedState.blockIdx}, + sharedState.context->getVFSUnsafe()); sharedState.blockIdx++; return true; } else { @@ -648,8 +648,8 @@ static void bindColumns(const ScanTableFuncBindInput* bindInput, } } -static std::unique_ptr bindFunc( - main::ClientContext* /*context*/, function::TableFuncBindInput* input) { +static std::unique_ptr bindFunc(main::ClientContext* /*context*/, + function::TableFuncBindInput* input) { auto scanInput = ku_dynamic_cast(input); std::vector detectedColumnNames; @@ -660,8 +660,8 @@ static std::unique_ptr bindFunc( ReaderBindUtils::resolveColumns(scanInput->expectedColumnNames, detectedColumnNames, resultColumnNames, scanInput->expectedColumnTypes, detectedColumnTypes, resultColumnTypes); if (!scanInput->expectedColumnTypes.empty()) { - ReaderBindUtils::validateColumnTypes( - scanInput->expectedColumnNames, scanInput->expectedColumnTypes, detectedColumnTypes); + ReaderBindUtils::validateColumnTypes(scanInput->expectedColumnNames, + scanInput->expectedColumnTypes, detectedColumnTypes); } return std::make_unique(std::move(resultColumnTypes), std::move(resultColumnNames), scanInput->config.copy(), scanInput->context); @@ -675,8 +675,8 @@ static std::unique_ptr initSharedState( auto reader = std::make_unique(path, parquetScanBindData->context); numRows += reader->getMetadata()->num_rows; } - return std::make_unique( - parquetScanBindData->config.copy(), numRows, parquetScanBindData->context); + return std::make_unique(parquetScanBindData->config.copy(), numRows, + parquetScanBindData->context); } static std::unique_ptr initLocalState( diff --git a/src/processor/operator/persistent/reader/parquet/string_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/string_column_reader.cpp index 0e1cc47cc45..ec2acbe216c 100644 --- a/src/processor/operator/persistent/reader/parquet/string_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/string_column_reader.cpp @@ -13,8 +13,8 @@ namespace processor { StringColumnReader::StringColumnReader(ParquetReader& reader, std::unique_ptr type, const kuzu_parquet::format::SchemaElement& schema, uint64_t schemaIdx, uint64_t maxDefine, uint64_t maxRepeat) - : TemplatedColumnReader( - reader, std::move(type), schema, schemaIdx, maxDefine, maxRepeat) { + : TemplatedColumnReader(reader, + std::move(type), schema, schemaIdx, maxDefine, maxRepeat) { fixedWidthStringLength = 0; if (schema.type == Type::FIXED_LEN_BYTE_ARRAY) { KU_ASSERT(schema.__isset.type_length); @@ -22,8 +22,8 @@ StringColumnReader::StringColumnReader(ParquetReader& reader, } } -uint32_t StringColumnReader::verifyString( - const char* strData, uint32_t strLen, const bool isVarchar) { +uint32_t StringColumnReader::verifyString(const char* strData, uint32_t strLen, + const bool isVarchar) { if (!isVarchar) { return strLen; } @@ -42,12 +42,12 @@ uint32_t StringColumnReader::verifyString( } uint32_t StringColumnReader::verifyString(const char* strData, uint32_t strLen) { - return verifyString( - strData, strLen, getDataType()->getLogicalTypeID() == common::LogicalTypeID::STRING); + return verifyString(strData, strLen, + getDataType()->getLogicalTypeID() == common::LogicalTypeID::STRING); } -void StringColumnReader::dictionary( - const std::shared_ptr& data, uint64_t numEntries) { +void StringColumnReader::dictionary(const std::shared_ptr& data, + uint64_t numEntries) { dict = data; dictStrs = std::unique_ptr(new common::ku_string_t[numEntries]); for (auto dictIdx = 0u; dictIdx < numEntries; dictIdx++) { @@ -68,14 +68,14 @@ void StringColumnReader::dictionary( } } -common::ku_string_t StringParquetValueConversion::dictRead( - ByteBuffer& /*dict*/, uint32_t& offset, ColumnReader& reader) { +common::ku_string_t StringParquetValueConversion::dictRead(ByteBuffer& /*dict*/, uint32_t& offset, + ColumnReader& reader) { auto& dictStrings = reinterpret_cast(reader).dictStrs; return dictStrings[offset]; } -common::ku_string_t StringParquetValueConversion::plainRead( - ByteBuffer& plainData, ColumnReader& reader) { +common::ku_string_t StringParquetValueConversion::plainRead(ByteBuffer& plainData, + ColumnReader& reader) { auto& scr = reinterpret_cast(reader); uint32_t strLen = scr.fixedWidthStringLength == 0 ? plainData.read() : scr.fixedWidthStringLength; diff --git a/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp b/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp index 87bb3800232..3e94d8216c0 100644 --- a/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp +++ b/src/processor/operator/persistent/reader/parquet/struct_column_reader.cpp @@ -49,8 +49,8 @@ uint64_t StructColumnReader::read(uint64_t numValuesToRead, parquet_filter_t& fi uint64_t numValuesRead = numValuesToRead; for (auto i = 0u; i < fieldVectors.size(); i++) { - auto numValuesChildrenRead = childReaders[i]->read( - numValuesToRead, filter, define_out, repeat_out, fieldVectors[i].get()); + auto numValuesChildrenRead = childReaders[i]->read(numValuesToRead, filter, define_out, + repeat_out, fieldVectors[i].get()); if (i == 0) { numValuesRead = numValuesChildrenRead; } else if (numValuesRead != numValuesChildrenRead) { diff --git a/src/processor/operator/persistent/reader/rdf/rdf_reader.cpp b/src/processor/operator/persistent/reader/rdf/rdf_reader.cpp index 85dfdedf806..c1cc548b3f4 100644 --- a/src/processor/operator/persistent/reader/rdf/rdf_reader.cpp +++ b/src/processor/operator/persistent/reader/rdf/rdf_reader.cpp @@ -38,8 +38,8 @@ static SerdSyntax getSerdSyntax(FileType fileType) { void RdfReader::initInternal(SerdStatementSink statementSink) { KU_ASSERT(reader == nullptr); fp = fopen(this->filePath.c_str(), "rb"); - reader = serd_reader_new( - getSerdSyntax(fileType), this, nullptr, baseHandle, prefixHandle, statementSink, nullptr); + reader = serd_reader_new(getSerdSyntax(fileType), this, nullptr, baseHandle, prefixHandle, + statementSink, nullptr); serd_reader_set_error_sink(reader, errorHandle, this); auto fileName = this->filePath.substr(this->filePath.find_last_of("/\\") + 1); serd_reader_start_stream(reader, fp, reinterpret_cast(fileName.c_str()), true); @@ -62,8 +62,8 @@ SerdStatus RdfReader::baseHandle(void* handle, const SerdNode* baseNode) { return SERD_SUCCESS; } -SerdStatus RdfReader::prefixHandle( - void* handle, const SerdNode* nameNode, const SerdNode* uriNode) { +SerdStatus RdfReader::prefixHandle(void* handle, const SerdNode* nameNode, + const SerdNode* uriNode) { auto reader = reinterpret_cast(handle); serd_env_set_prefix(reader->env, nameNode, uriNode); return SERD_SUCCESS; @@ -142,8 +142,8 @@ std::string RdfReader::getAsString(const SerdNode* node) { return std::string((const char*)prefix.buf, prefix.len) + std::string((const char*)suffix.buf, suffix.len); } else if (rdfConfig.strict) { - throw RuntimeException(stringFormat( - "Cannot expand {}.", std::string((const char*)node->buf, node->n_bytes))); + throw RuntimeException(stringFormat("Cannot expand {}.", + std::string((const char*)node->buf, node->n_bytes))); } return std::string(); // expand fail return empty string. } diff --git a/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp b/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp index 2f50b7edac9..f268ddec033 100644 --- a/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp +++ b/src/processor/operator/persistent/reader/rdf/rdf_scan.cpp @@ -48,8 +48,8 @@ void RdfScanSharedState::initReader() { reader->init(); } -std::pair RdfInMemScanSharedState::getRange( - const RdfStore& store_, uint64_t& cursor) { +std::pair RdfInMemScanSharedState::getRange(const RdfStore& store_, + uint64_t& cursor) { std::unique_lock lck{lock}; auto numTuplesToScan = std::min(batchSize, store_.size() - cursor); auto startIdx = cursor; @@ -69,8 +69,8 @@ static std::unique_ptr inMemScanInitSharedState( return std::make_unique(bindData->store); } -static std::unique_ptr initLocalState( - TableFunctionInitInput&, TableFuncSharedState*, storage::MemoryManager*) { +static std::unique_ptr initLocalState(TableFunctionInitInput&, + TableFuncSharedState*, storage::MemoryManager*) { return std::make_unique(); } @@ -80,8 +80,8 @@ static offset_t RdfAllTripleScanTableFunc(TableFuncInput& input, TableFuncOutput return 0; } -static std::unique_ptr RdfAllTripleScanBindFunc( - main::ClientContext*, function::TableFuncBindInput* input_) { +static std::unique_ptr RdfAllTripleScanBindFunc(main::ClientContext*, + function::TableFuncBindInput* input_) { auto input = ku_dynamic_cast(input_); return std::make_unique(std::vector{}, std::vector{}, input->config.copy(), input->context, @@ -130,8 +130,8 @@ static offset_t RdfLiteralInMemScanTableFunc(TableFuncInput& input, TableFuncOut return numTuplesToScan; } -static offset_t RdfResourceTripleInMemScanTableFunc( - TableFuncInput& input, TableFuncOutput& output) { +static offset_t RdfResourceTripleInMemScanTableFunc(TableFuncInput& input, + TableFuncOutput& output) { auto sharedState = ku_dynamic_cast(input.sharedState); auto [startIdx, numTuplesToScan] = sharedState->getResourceTripleRange(); @@ -167,40 +167,40 @@ static std::unique_ptr RdfResourceScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); - return std::make_unique( - bindData->config.copy(), std::move(rdfConfig)); + return std::make_unique(bindData->config.copy(), + std::move(rdfConfig)); } static std::unique_ptr RdfLiteralScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); - return std::make_unique( - bindData->config.copy(), std::move(rdfConfig)); + return std::make_unique(bindData->config.copy(), + std::move(rdfConfig)); } static std::unique_ptr RdfResourceTripleScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); - return std::make_unique( - bindData->config.copy(), std::move(rdfConfig)); + return std::make_unique(bindData->config.copy(), + std::move(rdfConfig)); } static std::unique_ptr RdfLiteralTripleScanInitSharedState( TableFunctionInitInput& input) { auto bindData = reinterpret_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); - return std::make_unique( - bindData->config.copy(), std::move(rdfConfig)); + return std::make_unique(bindData->config.copy(), + std::move(rdfConfig)); } static std::unique_ptr RdfAllTripleScanInitSharedState( TableFunctionInitInput& input) { auto bindData = ku_dynamic_cast(input.bindData); auto rdfConfig = RdfReaderConfig::construct(bindData->config.options); - return std::make_unique( - bindData->config.copy(), std::move(rdfConfig), bindData->store); + return std::make_unique(bindData->config.copy(), std::move(rdfConfig), + bindData->store); } static double RdfResourceInMemScanProgressFunc(TableFuncSharedState* sharedState) { diff --git a/src/processor/operator/persistent/reader/rdf/rdf_utils.cpp b/src/processor/operator/persistent/reader/rdf/rdf_utils.cpp index 2baa4bbeed2..59677613aec 100644 --- a/src/processor/operator/persistent/reader/rdf/rdf_utils.cpp +++ b/src/processor/operator/persistent/reader/rdf/rdf_utils.cpp @@ -29,8 +29,8 @@ common::LogicalTypeID RdfUtils::getLogicalTypeID(const std::string& type) { return LogicalTypeID::STRING; } -void RdfUtils::addRdfLiteral( - ValueVector* vector, uint32_t pos, const std::string& str, LogicalTypeID targetTypeID) { +void RdfUtils::addRdfLiteral(ValueVector* vector, uint32_t pos, const std::string& str, + LogicalTypeID targetTypeID) { auto resolveAsString = true; switch (targetTypeID) { case LogicalTypeID::INT64: { diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index d439cdc86e0..420813bb11a 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -21,12 +21,12 @@ void RelBatchInsert::initGlobalStateInternal(ExecutionContext* context) { sharedState->logBatchInsertWALRecord(); } -void RelBatchInsert::initLocalStateInternal( - ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) { +void RelBatchInsert::initLocalStateInternal(ResultSet* /*resultSet_*/, + ExecutionContext* /*context*/) { localState = std::make_unique(); auto relInfo = ku_dynamic_cast(info.get()); - localState->nodeGroup = NodeGroupFactory::createNodeGroup( - ColumnDataFormat::CSR, relInfo->columnTypes, relInfo->compressionEnabled); + localState->nodeGroup = NodeGroupFactory::createNodeGroup(ColumnDataFormat::CSR, + relInfo->columnTypes, relInfo->compressionEnabled); } void RelBatchInsert::executeInternal(ExecutionContext* context) { @@ -41,12 +41,12 @@ void RelBatchInsert::executeInternal(ExecutionContext* context) { // No more partitions left in the partitioning buffer. break; } - if (relTable->isNewNodeGroup( - context->clientContext->getTx(), relLocalState->nodeGroupIdx, relInfo->direction)) { + if (relTable->isNewNodeGroup(context->clientContext->getTx(), relLocalState->nodeGroupIdx, + relInfo->direction)) { appendNewNodeGroup(*relInfo, *relLocalState, *sharedState, *partitionerSharedState); } else { - mergeNodeGroup( - context, *relInfo, *relLocalState, *sharedState, *partitionerSharedState); + mergeNodeGroup(context, *relInfo, *relLocalState, *sharedState, + *partitionerSharedState); } } } @@ -105,13 +105,13 @@ void RelBatchInsert::mergeNodeGroup(ExecutionContext* context, const RelBatchIns insertChunks.appendChunkedGroup(&offsetChunk, std::move(chunkedGroupToAppend)); } relTable->getDirectedTableData(relInfo.direction) - ->prepareCommitNodeGroup( - context->clientContext->getTx(), localState.nodeGroupIdx, localNG.get()); + ->prepareCommitNodeGroup(context->clientContext->getTx(), localState.nodeGroupIdx, + localNG.get()); sharedState.incrementNumRows(numRels); } -void RelBatchInsert::populateEndCSROffsets( - ChunkedCSRHeader& csrHeader, std::vector& gaps) { +void RelBatchInsert::populateEndCSROffsets(ChunkedCSRHeader& csrHeader, + std::vector& gaps) { auto csrOffsets = (offset_t*)csrHeader.offset->getData(); for (auto i = 0u; i < csrHeader.offset->getNumValues(); i++) { csrOffsets[i] += gaps[i]; @@ -165,8 +165,8 @@ void RelBatchInsert::setOffsetToWithinNodeGroup(ColumnChunk& chunk, offset_t sta } } -void RelBatchInsert::setOffsetFromCSROffsets( - ColumnChunk& nodeOffsetChunk, ColumnChunk& csrOffsetChunk) { +void RelBatchInsert::setOffsetFromCSROffsets(ColumnChunk& nodeOffsetChunk, + ColumnChunk& csrOffsetChunk) { KU_ASSERT(nodeOffsetChunk.getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); for (auto i = 0u; i < nodeOffsetChunk.getNumValues(); i++) { auto nodeOffset = nodeOffsetChunk.getValue(i); @@ -184,8 +184,8 @@ void RelBatchInsert::appendNewNodeGroup(const RelBatchInsertInfo& relInfo, partitionerSharedState.getPartitionBuffer(relInfo.partitioningIdx, localState.nodeGroupIdx); auto startNodeOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); for (auto& chunkedGroup : partitioningBuffer.getChunkedGroups()) { - setOffsetToWithinNodeGroup( - chunkedGroup->getColumnChunkUnsafe(relInfo.offsetColumnID), startNodeOffset); + setOffsetToWithinNodeGroup(chunkedGroup->getColumnChunkUnsafe(relInfo.offsetColumnID), + startNodeOffset); } // Calculate num of source nodes in this node group. // This will be used to set the num of values of the node group. @@ -227,8 +227,8 @@ void RelBatchInsert::finalize(ExecutionContext* context) { sharedState->updateNumTuplesForTable(); auto outputMsg = stringFormat("{} number of tuples has been copied to table {}.", sharedState->getNumRows(), info->tableEntry->getName()); - FactorizedTableUtils::appendStringToTable( - sharedState->fTable.get(), outputMsg, context->clientContext->getMemoryManager()); + FactorizedTableUtils::appendStringToTable(sharedState->fTable.get(), outputMsg, + context->clientContext->getMemoryManager()); } sharedState->numRows.store(0); partitionerSharedState->resetState(); diff --git a/src/processor/operator/persistent/set_executor.cpp b/src/processor/operator/persistent/set_executor.cpp index 0d85229238b..ba2ae69f0bb 100644 --- a/src/processor/operator/persistent/set_executor.cpp +++ b/src/processor/operator/persistent/set_executor.cpp @@ -51,8 +51,8 @@ void SingleLabelNodeSetExecutor::set(ExecutionContext* context) { KU_ASSERT(nodeIDVector->state->selVector->selectedSize == 1); auto lhsPos = nodeIDVector->state->selVector->selectedPositions[0]; auto rhsPos = rhsVector->state->selVector->selectedPositions[0]; - auto updateState = std::make_unique( - setInfo.columnID, *nodeIDVector, *rhsVector); + auto updateState = std::make_unique(setInfo.columnID, + *nodeIDVector, *rhsVector); setInfo.table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { writeToPropertyVector(nodeIDVector, lhsVector, lhsPos, rhsVector, rhsPos); @@ -73,8 +73,8 @@ void MultiLabelNodeSetExecutor::set(ExecutionContext* context) { } auto rhsPos = rhsVector->state->selVector->selectedPositions[0]; auto& setInfo = tableIDToSetInfo.at(nodeID.tableID); - auto updateState = std::make_unique( - setInfo.columnID, *nodeIDVector, *rhsVector); + auto updateState = std::make_unique(setInfo.columnID, + *nodeIDVector, *rhsVector); setInfo.table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { KU_ASSERT(lhsVector->state->selVector->selectedSize == 1); @@ -104,8 +104,8 @@ std::vector> RelSetExecutor::copy( } // Assume both input vectors are flat. Should be removed eventually. -static void writeToPropertyVector( - ValueVector* relIDVector, ValueVector* propertyVector, ValueVector* rhsVector) { +static void writeToPropertyVector(ValueVector* relIDVector, ValueVector* propertyVector, + ValueVector* rhsVector) { KU_ASSERT(propertyVector->state->selVector->selectedSize == 1); auto propertyVectorPos = propertyVector->state->selVector->selectedPositions[0]; KU_ASSERT(rhsVector->state->selVector->selectedSize == 1); @@ -122,8 +122,8 @@ void SingleLabelRelSetExecutor::set(ExecutionContext* context) { return; } evaluator->evaluate(context->clientContext); - auto updateState = std::make_unique( - columnID, *srcNodeIDVector, *dstNodeIDVector, *relIDVector, *rhsVector); + auto updateState = std::make_unique(columnID, *srcNodeIDVector, + *dstNodeIDVector, *relIDVector, *rhsVector); table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { writeToPropertyVector(relIDVector, lhsVector, rhsVector); @@ -142,8 +142,8 @@ void MultiLabelRelSetExecutor::set(ExecutionContext* context) { return; } auto [table, columnID] = tableIDToTableAndColumnID.at(relID.tableID); - auto updateState = std::make_unique( - columnID, *srcNodeIDVector, *dstNodeIDVector, *relIDVector, *rhsVector); + auto updateState = std::make_unique(columnID, *srcNodeIDVector, + *dstNodeIDVector, *relIDVector, *rhsVector); table->update(context->clientContext->getTx(), *updateState); if (lhsVector != nullptr) { writeToPropertyVector(relIDVector, lhsVector, rhsVector); diff --git a/src/processor/operator/persistent/writer/parquet/basic_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/basic_column_writer.cpp index 9b59cdfe9cf..0e58c1ad862 100644 --- a/src/processor/operator/persistent/writer/parquet/basic_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/basic_column_writer.cpp @@ -90,8 +90,8 @@ void BasicColumnWriter::beginWrite(ColumnWriterState& writerState) { nextPage(state); } -void BasicColumnWriter::write( - ColumnWriterState& writerState, common::ValueVector* vector, uint64_t count) { +void BasicColumnWriter::write(ColumnWriterState& writerState, common::ValueVector* vector, + uint64_t count) { auto& state = reinterpret_cast(writerState); uint64_t remaining = count; @@ -191,12 +191,12 @@ void BasicColumnWriter::nextPage(BasicColumnWriterState& state) { state.currentPage++; // write the repetition levels - writeLevels( - *writeInfo.writer, state.repetitionLevels, maxRepeat, pageInfo.offset, pageInfo.rowCount); + writeLevels(*writeInfo.writer, state.repetitionLevels, maxRepeat, pageInfo.offset, + pageInfo.rowCount); // write the definition levels - writeLevels( - *writeInfo.writer, state.definitionLevels, maxDefine, pageInfo.offset, pageInfo.rowCount); + writeLevels(*writeInfo.writer, state.definitionLevels, maxDefine, pageInfo.offset, + pageInfo.rowCount); } void BasicColumnWriter::flushPage(BasicColumnWriterState& state) { @@ -265,8 +265,8 @@ void BasicColumnWriter::writeDictionary(BasicColumnWriterState& state, state.writeInfo.insert(state.writeInfo.begin(), std::move(writeInfo)); } -void BasicColumnWriter::setParquetStatistics( - BasicColumnWriterState& state, kuzu_parquet::format::ColumnChunk& column) { +void BasicColumnWriter::setParquetStatistics(BasicColumnWriterState& state, + kuzu_parquet::format::ColumnChunk& column) { if (maxRepeat == 0) { column.meta_data.statistics.null_count = nullCount; column.meta_data.statistics.__isset.null_count = true; diff --git a/src/processor/operator/persistent/writer/parquet/boolean_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/boolean_column_writer.cpp index 2565bc47893..a238466c26f 100644 --- a/src/processor/operator/persistent/writer/parquet/boolean_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/boolean_column_writer.cpp @@ -31,8 +31,8 @@ void BooleanColumnWriter::writeVector(common::Serializer& temp_writer, } } -void BooleanColumnWriter::flushPageState( - common::Serializer& temp_writer, ColumnWriterPageState* writerPageState) { +void BooleanColumnWriter::flushPageState(common::Serializer& temp_writer, + ColumnWriterPageState* writerPageState) { auto state = reinterpret_cast(writerPageState); if (state->bytePos > 0) { temp_writer.write(state->byte); diff --git a/src/processor/operator/persistent/writer/parquet/column_writer.cpp b/src/processor/operator/persistent/writer/parquet/column_writer.cpp index 659c426a2e1..b03df1c5954 100644 --- a/src/processor/operator/persistent/writer/parquet/column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/column_writer.cpp @@ -154,8 +154,8 @@ std::unique_ptr ColumnWriter::createWriterRecursive( schemaPathToCreate.emplace_back("key_value"); // Construct the child types recursively. - std::vector kvTypes{ - MapType::getKeyType(type), MapType::getValueType(type)}; + std::vector kvTypes{MapType::getKeyType(type), + MapType::getValueType(type)}; std::vector kvNames{"key", "value"}; std::vector> childrenWriters; childrenWriters.reserve(2); diff --git a/src/processor/operator/persistent/writer/parquet/interval_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/interval_column_writer.cpp index 089e86428ff..d1a7b1bacae 100644 --- a/src/processor/operator/persistent/writer/parquet/interval_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/interval_column_writer.cpp @@ -28,8 +28,8 @@ void IntervalColumnWriter::writeVector(common::Serializer& bufferedSerializer, auto pos = getVectorPos(vector, r); if (!vector->isNull(pos)) { writeParquetInterval(vector->getValue(pos), tmpIntervalBuf); - bufferedSerializer.write( - tmpIntervalBuf, common::ParquetConstants::PARQUET_INTERVAL_SIZE); + bufferedSerializer.write(tmpIntervalBuf, + common::ParquetConstants::PARQUET_INTERVAL_SIZE); } } } diff --git a/src/processor/operator/persistent/writer/parquet/list_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/list_column_writer.cpp index b4243f6971c..c885580dd0c 100644 --- a/src/processor/operator/persistent/writer/parquet/list_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/list_column_writer.cpp @@ -90,8 +90,8 @@ void ListColumnWriter::beginWrite(ColumnWriterState& state_p) { childWriter->beginWrite(*state.childState); } -void ListColumnWriter::write( - ColumnWriterState& writerState, common::ValueVector* vector, uint64_t /*count*/) { +void ListColumnWriter::write(ColumnWriterState& writerState, common::ValueVector* vector, + uint64_t /*count*/) { auto& state = reinterpret_cast(writerState); childWriter->write(*state.childState, common::ListVector::getDataVector(vector), common::ListVector::getDataVectorSize(vector)); diff --git a/src/processor/operator/persistent/writer/parquet/parquet_writer.cpp b/src/processor/operator/persistent/writer/parquet/parquet_writer.cpp index f2dfd8db93d..2a3e812e55d 100644 --- a/src/processor/operator/persistent/writer/parquet/parquet_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/parquet_writer.cpp @@ -234,8 +234,8 @@ void ParquetWriter::prepareRowGroup(FactorizedTable& ft, PreparedRowGroup& resul while (numTuplesRead < ft.getNumTuples()) { readFromFT(ft, vectorsToRead, numTuplesRead); for (auto i = 0u; i < columnWriters.size(); i++) { - columnWriters[i]->write( - *writerStates[i], vectorsToRead[i], getNumTuples(unflatDataChunkToRead.get())); + columnWriters[i]->write(*writerStates[i], vectorsToRead[i], + getNumTuples(unflatDataChunkToRead.get())); } } @@ -262,8 +262,8 @@ void ParquetWriter::flushRowGroup(PreparedRowGroup& rowGroup) { fileMetaData.num_rows += parquetRowGroup.num_rows; } -void ParquetWriter::readFromFT( - FactorizedTable& ft, std::vector vectorsToRead, uint64_t& numTuplesRead) { +void ParquetWriter::readFromFT(FactorizedTable& ft, std::vector vectorsToRead, + uint64_t& numTuplesRead) { auto numTuplesToRead = ft.getTableSchema()->getNumUnflatColumns() != 0 ? 1 : @@ -276,8 +276,8 @@ void ParquetWriter::finalize() { auto startOffset = fileOffset; fileMetaData.write(protocol.get()); uint32_t metadataSize = fileOffset - startOffset; - fileInfo->writeFile( - reinterpret_cast(&metadataSize), sizeof(metadataSize), fileOffset); + fileInfo->writeFile(reinterpret_cast(&metadataSize), sizeof(metadataSize), + fileOffset); fileOffset += sizeof(uint32_t); // Parquet files also end with the string "PAR1". diff --git a/src/processor/operator/persistent/writer/parquet/string_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/string_column_writer.cpp index 5c18604a4dc..021428c5fee 100644 --- a/src/processor/operator/persistent/writer/parquet/string_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/string_column_writer.cpp @@ -154,8 +154,8 @@ void StringColumnWriter::writeVector(common::Serializer& serializer, } } -void StringColumnWriter::flushPageState( - common::Serializer& serializer, ColumnWriterPageState* writerPageState) { +void StringColumnWriter::flushPageState(common::Serializer& serializer, + ColumnWriterPageState* writerPageState) { auto pageState = reinterpret_cast(writerPageState); if (pageState->bitWidth != 0) { if (!pageState->writtenValue) { @@ -168,8 +168,8 @@ void StringColumnWriter::flushPageState( } } -void StringColumnWriter::flushDictionary( - BasicColumnWriterState& writerState, ColumnWriterStatistics* writerStats) { +void StringColumnWriter::flushDictionary(BasicColumnWriterState& writerState, + ColumnWriterStatistics* writerStats) { auto stats = reinterpret_cast(writerStats); auto& state = reinterpret_cast(writerState); if (!state.isDictionaryEncoded()) { @@ -195,8 +195,8 @@ void StringColumnWriter::flushDictionary( writeDictionary(state, std::move(bufferedSerializer), values.size()); } -uint64_t StringColumnWriter::getRowSize( - ValueVector* vector, uint64_t index, BasicColumnWriterState& writerState) { +uint64_t StringColumnWriter::getRowSize(ValueVector* vector, uint64_t index, + BasicColumnWriterState& writerState) { auto& state = reinterpret_cast(writerState); if (state.isDictionaryEncoded()) { return (state.keyBitWidth + 7) / 8; diff --git a/src/processor/operator/persistent/writer/parquet/struct_column_writer.cpp b/src/processor/operator/persistent/writer/parquet/struct_column_writer.cpp index 3355740949b..bf2f5c2e75c 100644 --- a/src/processor/operator/persistent/writer/parquet/struct_column_writer.cpp +++ b/src/processor/operator/persistent/writer/parquet/struct_column_writer.cpp @@ -35,8 +35,8 @@ void StructColumnWriter::analyze(ColumnWriterState& state_p, ColumnWriterState* for (auto child_idx = 0u; child_idx < childWriters.size(); child_idx++) { // Need to check again. It might be that just one child needs it but the rest not if (childWriters[child_idx]->hasAnalyze()) { - childWriters[child_idx]->analyze( - *state.childStates[child_idx], &state_p, childVectors[child_idx].get(), count); + childWriters[child_idx]->analyze(*state.childStates[child_idx], &state_p, + childVectors[child_idx].get(), count); } } } @@ -51,8 +51,8 @@ void StructColumnWriter::finalizeAnalyze(ColumnWriterState& state_p) { } } -void StructColumnWriter::prepare( - ColumnWriterState& state_p, ColumnWriterState* parent, ValueVector* vector, uint64_t count) { +void StructColumnWriter::prepare(ColumnWriterState& state_p, ColumnWriterState* parent, + ValueVector* vector, uint64_t count) { auto& state = reinterpret_cast(state_p); if (parent) { // propagate empty entries from the parent @@ -61,12 +61,12 @@ void StructColumnWriter::prepare( } } handleRepeatLevels(state_p, parent); - handleDefineLevels( - state_p, parent, vector, count, ParquetConstants::PARQUET_DEFINE_VALID, maxDefine - 1); + handleDefineLevels(state_p, parent, vector, count, ParquetConstants::PARQUET_DEFINE_VALID, + maxDefine - 1); auto& child_vectors = StructVector::getFieldVectors(vector); for (auto child_idx = 0u; child_idx < childWriters.size(); child_idx++) { - childWriters[child_idx]->prepare( - *state.childStates[child_idx], &state_p, child_vectors[child_idx].get(), count); + childWriters[child_idx]->prepare(*state.childStates[child_idx], &state_p, + child_vectors[child_idx].get(), count); } } @@ -81,8 +81,8 @@ void StructColumnWriter::write(ColumnWriterState& state_p, ValueVector* vector, auto& state = reinterpret_cast(state_p); auto& child_vectors = StructVector::getFieldVectors(vector); for (auto child_idx = 0u; child_idx < childWriters.size(); child_idx++) { - childWriters[child_idx]->write( - *state.childStates[child_idx], child_vectors[child_idx].get(), count); + childWriters[child_idx]->write(*state.childStates[child_idx], + child_vectors[child_idx].get(), count); } } diff --git a/src/processor/operator/recursive_extend/path_property_probe.cpp b/src/processor/operator/recursive_extend/path_property_probe.cpp index fc2166d4eed..62d8ea2adc7 100644 --- a/src/processor/operator/recursive_extend/path_property_probe.cpp +++ b/src/processor/operator/recursive_extend/path_property_probe.cpp @@ -7,8 +7,8 @@ using namespace kuzu::common; namespace kuzu { namespace processor { -void PathPropertyProbe::initLocalStateInternal( - ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) { +void PathPropertyProbe::initLocalStateInternal(ResultSet* /*resultSet_*/, + ExecutionContext* /*context*/) { localState = std::make_unique(); vectors = std::make_unique(); auto pathVector = resultSet->getValueVector(info->pathPos); @@ -102,8 +102,8 @@ void PathPropertyProbe::probe(kuzu::processor::JoinHashTable* hashTable, uint64_ for (auto j = 0u; j < propertyVectors.size(); ++j) { auto propertyVector = propertyVectors[j]; auto colIdx = colIndicesToScan[j]; - factorizedTable->readFlatColToFlatVector( - tuple, colIdx, *propertyVector, sizeProbed + i); + factorizedTable->readFlatColToFlatVector(tuple, colIdx, *propertyVector, + sizeProbed + i); } } } diff --git a/src/processor/operator/recursive_extend/recursive_join.cpp b/src/processor/operator/recursive_extend/recursive_join.cpp index acb44bf42b5..7b6e31bd0f6 100644 --- a/src/processor/operator/recursive_extend/recursive_join.cpp +++ b/src/processor/operator/recursive_extend/recursive_join.cpp @@ -22,16 +22,16 @@ void RecursiveJoin::initLocalStateInternal(ResultSet* /*resultSet_*/, ExecutionC switch (joinType) { case planner::RecursiveJoinType::TRACK_PATH: { vectors->pathVector = resultSet->getValueVector(dataInfo->pathPos).get(); - bfsState = std::make_unique>( - upperBound, targetDstNodes.get()); + bfsState = std::make_unique>(upperBound, + targetDstNodes.get()); for (auto i = lowerBound; i <= upperBound; ++i) { - scanners.push_back(std::make_unique( - targetDstNodes.get(), i, dataInfo->tableIDToName)); + scanners.push_back(std::make_unique(targetDstNodes.get(), i, + dataInfo->tableIDToName)); } } break; case planner::RecursiveJoinType::TRACK_NONE: { - bfsState = std::make_unique>( - upperBound, targetDstNodes.get()); + bfsState = std::make_unique>(upperBound, + targetDstNodes.get()); for (auto i = lowerBound; i <= upperBound; ++i) { scanners.push_back( std::make_unique(targetDstNodes.get(), i)); @@ -45,16 +45,16 @@ void RecursiveJoin::initLocalStateInternal(ResultSet* /*resultSet_*/, ExecutionC switch (joinType) { case planner::RecursiveJoinType::TRACK_PATH: { vectors->pathVector = resultSet->getValueVector(dataInfo->pathPos).get(); - bfsState = std::make_unique>( - upperBound, targetDstNodes.get()); + bfsState = std::make_unique>(upperBound, + targetDstNodes.get()); for (auto i = lowerBound; i <= upperBound; ++i) { - scanners.push_back(std::make_unique( - targetDstNodes.get(), i, dataInfo->tableIDToName)); + scanners.push_back(std::make_unique(targetDstNodes.get(), i, + dataInfo->tableIDToName)); } } break; case planner::RecursiveJoinType::TRACK_NONE: { - bfsState = std::make_unique>( - upperBound, targetDstNodes.get()); + bfsState = std::make_unique>(upperBound, + targetDstNodes.get()); for (auto i = lowerBound; i <= upperBound; ++i) { scanners.push_back( std::make_unique(targetDstNodes.get(), i)); @@ -68,16 +68,16 @@ void RecursiveJoin::initLocalStateInternal(ResultSet* /*resultSet_*/, ExecutionC switch (joinType) { case planner::RecursiveJoinType::TRACK_PATH: { vectors->pathVector = resultSet->getValueVector(dataInfo->pathPos).get(); - bfsState = std::make_unique>( - upperBound, targetDstNodes.get()); + bfsState = std::make_unique>(upperBound, + targetDstNodes.get()); for (auto i = lowerBound; i <= upperBound; ++i) { - scanners.push_back(std::make_unique( - targetDstNodes.get(), i, dataInfo->tableIDToName)); + scanners.push_back(std::make_unique(targetDstNodes.get(), i, + dataInfo->tableIDToName)); } } break; case planner::RecursiveJoinType::TRACK_NONE: { - bfsState = std::make_unique>( - upperBound, targetDstNodes.get()); + bfsState = std::make_unique>(upperBound, + targetDstNodes.get()); for (auto i = lowerBound; i <= upperBound; ++i) { scanners.push_back( std::make_unique(targetDstNodes.get(), i)); @@ -165,8 +165,8 @@ bool RecursiveJoin::scanOutput() { if (vectors->pathVector != nullptr) { vectors->pathVector->resetAuxiliaryBuffer(); } - frontiersScanner->scan( - vectors.get(), offsetVectorSize, nodeIDDataVectorSize, relIDDataVectorSize); + frontiersScanner->scan(vectors.get(), offsetVectorSize, nodeIDDataVectorSize, + relIDDataVectorSize); if (offsetVectorSize == 0) { return false; } @@ -212,8 +212,8 @@ void RecursiveJoin::initLocalRecursivePlan(ExecutionContext* context) { op = op->getChild(0); } scanFrontier = (ScanFrontier*)op; - localResultSet = std::make_unique( - dataInfo->localResultSetDescriptor.get(), context->clientContext->getMemoryManager()); + localResultSet = std::make_unique(dataInfo->localResultSetDescriptor.get(), + context->clientContext->getMemoryManager()); vectors->recursiveDstNodeIDVector = localResultSet->getValueVector(dataInfo->recursiveDstNodeIDPos).get(); vectors->recursiveEdgeIDVector = diff --git a/src/processor/operator/result_collector.cpp b/src/processor/operator/result_collector.cpp index 70c9a809d55..1e7d993599a 100644 --- a/src/processor/operator/result_collector.cpp +++ b/src/processor/operator/result_collector.cpp @@ -11,8 +11,8 @@ void ResultCollector::initLocalStateInternal(ResultSet* resultSet, ExecutionCont for (auto& pos : info->payloadPositions) { payloadVectors.push_back(resultSet->getValueVector(pos).get()); } - localTable = std::make_unique( - context->clientContext->getMemoryManager(), info->tableSchema->copy()); + localTable = std::make_unique(context->clientContext->getMemoryManager(), + info->tableSchema->copy()); } void ResultCollector::executeInternal(ExecutionContext* context) { diff --git a/src/processor/operator/scan/scan_multi_node_tables.cpp b/src/processor/operator/scan/scan_multi_node_tables.cpp index 555f0bf8fd8..806baa03edc 100644 --- a/src/processor/operator/scan/scan_multi_node_tables.cpp +++ b/src/processor/operator/scan/scan_multi_node_tables.cpp @@ -13,8 +13,8 @@ bool ScanMultiNodeTables::getNextTuplesInternal(ExecutionContext* context) { inVector->getValue(inVector->state->selVector->selectedPositions[0]).tableID; KU_ASSERT(readStates.contains(tableID) && tables.contains(tableID)); auto scanTableInfo = tables.at(tableID).get(); - scanTableInfo->table->initializeReadState( - context->clientContext->getTx(), scanTableInfo->columnIDs, *inVector, *readStates[tableID]); + scanTableInfo->table->initializeReadState(context->clientContext->getTx(), + scanTableInfo->columnIDs, *inVector, *readStates[tableID]); scanTableInfo->table->read(context->clientContext->getTx(), *readStates.at(tableID)); return true; } diff --git a/src/processor/operator/scan/scan_multi_rel_tables.cpp b/src/processor/operator/scan/scan_multi_rel_tables.cpp index 09be6645911..ae6a636449f 100644 --- a/src/processor/operator/scan/scan_multi_rel_tables.cpp +++ b/src/processor/operator/scan/scan_multi_rel_tables.cpp @@ -7,13 +7,13 @@ using namespace kuzu::transaction; namespace kuzu { namespace processor { -void RelTableCollectionScanner::init( - ValueVector* inVector, const std::vector& outputVectors) { +void RelTableCollectionScanner::init(ValueVector* inVector, + const std::vector& outputVectors) { readStates.resize(scanInfos.size()); for (auto i = 0u; i < scanInfos.size(); i++) { auto scanInfo = scanInfos[i].get(); - readStates[i] = std::make_unique( - *inVector, scanInfo->columnIDs, outputVectors, scanInfo->direction); + readStates[i] = std::make_unique(*inVector, scanInfo->columnIDs, + outputVectors, scanInfo->direction); } } diff --git a/src/processor/operator/scan/scan_node_table.cpp b/src/processor/operator/scan/scan_node_table.cpp index 6f2f1f2308f..20e03b8e077 100644 --- a/src/processor/operator/scan/scan_node_table.cpp +++ b/src/processor/operator/scan/scan_node_table.cpp @@ -12,8 +12,8 @@ bool ScanSingleNodeTable::getNextTuplesInternal(ExecutionContext* context) { for (auto& outputVector : outVectors) { outputVector->resetAuxiliaryBuffer(); } - info->table->initializeReadState( - context->clientContext->getTx(), info->columnIDs, *inVector, *readState); + info->table->initializeReadState(context->clientContext->getTx(), info->columnIDs, *inVector, + *readState); info->table->read(context->clientContext->getTx(), *readState); return true; } diff --git a/src/processor/operator/scan/scan_table.cpp b/src/processor/operator/scan/scan_table.cpp index 438ef3ee1f5..e6bd82bf52b 100644 --- a/src/processor/operator/scan/scan_table.cpp +++ b/src/processor/operator/scan/scan_table.cpp @@ -3,8 +3,8 @@ namespace kuzu { namespace processor { -void ScanTable::initLocalStateInternal( - ResultSet* resultSet, ExecutionContext* /*executionContext*/) { +void ScanTable::initLocalStateInternal(ResultSet* resultSet, + ExecutionContext* /*executionContext*/) { inVector = resultSet->getValueVector(inVectorPos).get(); outVectors.reserve(outVectorsPos.size()); for (auto& pos : outVectorsPos) { diff --git a/src/processor/operator/scan_node_id.cpp b/src/processor/operator/scan_node_id.cpp index 60f7d2f7013..61fe3349b3b 100644 --- a/src/processor/operator/scan_node_id.cpp +++ b/src/processor/operator/scan_node_id.cpp @@ -85,8 +85,8 @@ bool ScanNodeID::getNextTuplesInternal(ExecutionContext* context) { void ScanNodeID::setSelVector(ExecutionContext* context, NodeTableScanState* tableState, offset_t startOffset, offset_t endOffset) { // Apply changes to the selVector from nodes metadata. - tableState->getTable()->setSelVectorForDeletedOffsets( - context->clientContext->getTx(), outValueVector.get()); + tableState->getTable()->setSelVectorForDeletedOffsets(context->clientContext->getTx(), + outValueVector.get()); if (tableState->isSemiMaskEnabled()) { auto buffer = outValueVector->state->selVector->getMultableBuffer(); sel_t prevSelectedSize = outValueVector->state->selVector->selectedSize; diff --git a/src/processor/operator/table_scan/ftable_scan_function.cpp b/src/processor/operator/table_scan/ftable_scan_function.cpp index c4d978adc10..88846c94e96 100644 --- a/src/processor/operator/table_scan/ftable_scan_function.cpp +++ b/src/processor/operator/table_scan/ftable_scan_function.cpp @@ -44,8 +44,8 @@ static offset_t tableFunc(TableFuncInput& input, TableFuncOutput& output) { if (morsel.numTuples == 0) { return 0; } - sharedState->table->scan( - output.vectors, morsel.startTupleIdx, morsel.numTuples, bindData->columnIndices); + sharedState->table->scan(output.vectors, morsel.startTupleIdx, morsel.numTuples, + bindData->columnIndices); return morsel.numTuples; } @@ -54,8 +54,8 @@ static std::unique_ptr initSharedState(TableFunctionInitIn return std::make_unique(bindData->table, bindData->morselSize); } -static std::unique_ptr initLocalState( - TableFunctionInitInput&, TableFuncSharedState*, storage::MemoryManager*) { +static std::unique_ptr initLocalState(TableFunctionInitInput&, + TableFuncSharedState*, storage::MemoryManager*) { return std::make_unique(); } diff --git a/src/processor/operator/table_scan/union_all_scan.cpp b/src/processor/operator/table_scan/union_all_scan.cpp index 5c7ff2dd44e..77fb0d9bbc2 100644 --- a/src/processor/operator/table_scan/union_all_scan.cpp +++ b/src/processor/operator/table_scan/union_all_scan.cpp @@ -31,8 +31,8 @@ std::unique_ptr UnionAllScanSharedState::getMorselNoLock( return morsel; } -void UnionAllScan::initLocalStateInternal( - ResultSet* /*resultSet_*/, ExecutionContext* /*context*/) { +void UnionAllScan::initLocalStateInternal(ResultSet* /*resultSet_*/, + ExecutionContext* /*context*/) { for (auto& dataPos : info->outputPositions) { vectors.push_back(resultSet->getValueVector(dataPos).get()); } diff --git a/src/processor/processor.cpp b/src/processor/processor.cpp index c255bd03c66..d2fdd879075 100644 --- a/src/processor/processor.cpp +++ b/src/processor/processor.cpp @@ -14,8 +14,8 @@ QueryProcessor::QueryProcessor(uint64_t numThreads) { taskScheduler = std::make_unique(numThreads); } -std::shared_ptr QueryProcessor::execute( - PhysicalPlan* physicalPlan, ExecutionContext* context) { +std::shared_ptr QueryProcessor::execute(PhysicalPlan* physicalPlan, + ExecutionContext* context) { auto lastOperator = physicalPlan->lastOperator.get(); auto resultCollector = ku_dynamic_cast(lastOperator); // The root pipeline(task) consists of operators and its prevOperator only, because we @@ -31,8 +31,8 @@ std::shared_ptr QueryProcessor::execute( return resultCollector->getResultFactorizedTable(); } -void QueryProcessor::decomposePlanIntoTask( - PhysicalOperator* op, Task* task, ExecutionContext* context) { +void QueryProcessor::decomposePlanIntoTask(PhysicalOperator* op, Task* task, + ExecutionContext* context) { if (op->isSource()) { context->clientContext->getProgressBar()->addPipeline(); } diff --git a/src/processor/processor_task.cpp b/src/processor/processor_task.cpp index b63da12a2c6..f5c991675d3 100644 --- a/src/processor/processor_task.cpp +++ b/src/processor/processor_task.cpp @@ -35,8 +35,8 @@ void ProcessorTask::finalizeIfNecessary() { sink->finalize(executionContext); } -std::unique_ptr ProcessorTask::populateResultSet( - Sink* op, storage::MemoryManager* memoryManager) { +std::unique_ptr ProcessorTask::populateResultSet(Sink* op, + storage::MemoryManager* memoryManager) { auto resultSetDescriptor = op->getResultSetDescriptor(); if (resultSetDescriptor == nullptr) { // Some pipeline does not need a resultSet, e.g. OrderByMerge diff --git a/src/processor/result/base_hash_table.cpp b/src/processor/result/base_hash_table.cpp index c6665c9b896..33ae95b2eff 100644 --- a/src/processor/result/base_hash_table.cpp +++ b/src/processor/result/base_hash_table.cpp @@ -25,8 +25,8 @@ void BaseHashTable::setMaxNumHashSlots(uint64_t newSize) { bitmask = maxNumHashSlots - 1; } -void BaseHashTable::computeAndCombineVecHash( - const std::vector& unFlatKeyVectors, uint32_t startVecIdx) { +void BaseHashTable::computeAndCombineVecHash(const std::vector& unFlatKeyVectors, + uint32_t startVecIdx) { for (; startVecIdx < unFlatKeyVectors.size(); startVecIdx++) { auto keyVector = unFlatKeyVectors[startVecIdx]; auto tmpHashResultVector = @@ -34,8 +34,8 @@ void BaseHashTable::computeAndCombineVecHash( auto tmpHashCombineResultVector = std::make_unique(LogicalTypeID::INT64, &memoryManager); VectorHashFunction::computeHash(keyVector, tmpHashResultVector.get()); - VectorHashFunction::combineHash( - hashVector.get(), tmpHashResultVector.get(), tmpHashCombineResultVector.get()); + VectorHashFunction::combineHash(hashVector.get(), tmpHashResultVector.get(), + tmpHashCombineResultVector.get()); hashVector = std::move(tmpHashCombineResultVector); } } @@ -56,16 +56,16 @@ template static bool compareEntry(common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { uint8_t result; auto key = vector->getData() + vectorPos * vector->getNumBytesPerValue(); - function::Equals::operation( - *(T*)key, *(T*)entry, result, nullptr /* leftVector */, nullptr /* rightVector */); + function::Equals::operation(*(T*)key, *(T*)entry, result, nullptr /* leftVector */, + nullptr /* rightVector */); return result != 0; } static compare_function_t getCompareEntryFunc(PhysicalTypeID type); template<> -[[maybe_unused]] bool compareEntry( - common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { +[[maybe_unused]] bool compareEntry(common::ValueVector* vector, uint32_t vectorPos, + const uint8_t* entry) { auto dataVector = ListVector::getDataVector(vector); auto listToCompare = vector->getValue(vectorPos); auto listEntry = reinterpret_cast(entry); @@ -85,8 +85,8 @@ template<> return true; } -static bool compareNodeEntry( - common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { +static bool compareNodeEntry(common::ValueVector* vector, uint32_t vectorPos, + const uint8_t* entry) { KU_ASSERT(0 == common::StructType::getFieldIdx(&vector->dataType, common::InternalKeyword::ID)); auto idVector = common::StructVector::getFieldVector(vector, 0).get(); return compareEntry(idVector, vectorPos, @@ -104,8 +104,8 @@ static bool compareRelEntry(common::ValueVector* vector, uint32_t vectorPos, con } template<> -[[maybe_unused]] bool compareEntry( - common::ValueVector* vector, uint32_t vectorPos, const uint8_t* entry) { +[[maybe_unused]] bool compareEntry(common::ValueVector* vector, uint32_t vectorPos, + const uint8_t* entry) { switch (vector->dataType.getLogicalTypeID()) { case LogicalTypeID::NODE: { return compareNodeEntry(vector, vectorPos, entry); diff --git a/src/processor/result/factorized_table.cpp b/src/processor/result/factorized_table.cpp index f5ca1a99023..bf8b9144b14 100644 --- a/src/processor/result/factorized_table.cpp +++ b/src/processor/result/factorized_table.cpp @@ -106,8 +106,8 @@ void DataBlockCollection::merge(DataBlockCollection& other) { } } -FactorizedTable::FactorizedTable( - MemoryManager* memoryManager, std::unique_ptr tableSchema) +FactorizedTable::FactorizedTable(MemoryManager* memoryManager, + std::unique_ptr tableSchema) : memoryManager{memoryManager}, tableSchema{std::move(tableSchema)}, numTuples{0} { KU_ASSERT(this->tableSchema->getNumBytesPerTuple() <= BufferPoolConstants::PAGE_256KB_SIZE); if (!this->tableSchema->isEmpty()) { @@ -261,20 +261,20 @@ uint8_t* FactorizedTable::getTuple(ft_tuple_idx_t tupleIdx) const { tupleIdxInBlock * tableSchema->getNumBytesPerTuple(); } -void FactorizedTable::updateFlatCell( - uint8_t* tuplePtr, ft_col_idx_t colIdx, ValueVector* valueVector, uint32_t pos) { +void FactorizedTable::updateFlatCell(uint8_t* tuplePtr, ft_col_idx_t colIdx, + ValueVector* valueVector, uint32_t pos) { auto nullBuffer = tuplePtr + tableSchema->getNullMapOffset(); if (valueVector->isNull(pos)) { setNonOverflowColNull(nullBuffer, colIdx); } else { - valueVector->copyToRowData( - pos, tuplePtr + tableSchema->getColOffset(colIdx), inMemOverflowBuffer.get()); + valueVector->copyToRowData(pos, tuplePtr + tableSchema->getColOffset(colIdx), + inMemOverflowBuffer.get()); NullBuffer::setNoNull(nullBuffer, colIdx); } } -bool FactorizedTable::isOverflowColNull( - const uint8_t* nullBuffer, ft_tuple_idx_t tupleIdx, ft_col_idx_t colIdx) const { +bool FactorizedTable::isOverflowColNull(const uint8_t* nullBuffer, ft_tuple_idx_t tupleIdx, + ft_col_idx_t colIdx) const { KU_ASSERT(colIdx < tableSchema->getNumColumns()); if (tableSchema->getColumn(colIdx)->hasNoNullGuarantee()) { return false; @@ -303,8 +303,8 @@ void FactorizedTable::clear() { inMemOverflowBuffer->resetBuffer(); } -void FactorizedTable::setOverflowColNull( - uint8_t* nullBuffer, ft_col_idx_t colIdx, ft_tuple_idx_t tupleIdx) { +void FactorizedTable::setOverflowColNull(uint8_t* nullBuffer, ft_col_idx_t colIdx, + ft_tuple_idx_t tupleIdx) { NullBuffer::setNull(nullBuffer, tupleIdx); tableSchema->setMayContainsNullsToTrue(colIdx); } @@ -345,8 +345,8 @@ std::vector FactorizedTable::allocateFlatTupleBlocks( auto& block = flatTupleBlockCollection->getBlocks().back(); auto numTuplesToAppendInCurBlock = std::min(numTuplesToAppend, block->freeSize / numBytesPerTuple); - appendingInfos.emplace_back( - block->getData() + BufferPoolConstants::PAGE_256KB_SIZE - block->freeSize, + appendingInfos.emplace_back(block->getData() + BufferPoolConstants::PAGE_256KB_SIZE - + block->freeSize, numTuplesToAppendInCurBlock); block->freeSize -= numTuplesToAppendInCurBlock * numBytesPerTuple; block->numTuples += numTuplesToAppendInCurBlock; @@ -372,8 +372,8 @@ uint8_t* FactorizedTable::allocateUnflatTupleBlock(uint32_t numBytes) { return lastBlock->getData(); } -void FactorizedTable::copyFlatVectorToFlatColumn( - const ValueVector& vector, const BlockAppendingInfo& blockAppendInfo, ft_col_idx_t colIdx) { +void FactorizedTable::copyFlatVectorToFlatColumn(const ValueVector& vector, + const BlockAppendingInfo& blockAppendInfo, ft_col_idx_t colIdx) { auto valuePositionInVectorToAppend = vector.state->selVector->selectedPositions[0]; auto colOffsetInDataBlock = tableSchema->getColOffset(colIdx); auto dstDataPtr = blockAppendInfo.data; @@ -424,8 +424,8 @@ void FactorizedTable::copyUnflatVectorToFlatColumn(const ValueVector& vector, if (vector.isNull(pos)) { setNonOverflowColNull(dstTuple + tableSchema->getNullMapOffset(), colIdx); } else { - vector.copyToRowData( - pos, dstTuple + byteOffsetOfColumnInTuple, inMemOverflowBuffer.get()); + vector.copyToRowData(pos, dstTuple + byteOffsetOfColumnInTuple, + inMemOverflowBuffer.get()); } dstTuple += tableSchema->getNumBytesPerTuple(); } @@ -436,8 +436,8 @@ void FactorizedTable::copyUnflatVectorToFlatColumn(const ValueVector& vector, // For an unflat column, only an unflat vector is allowed to copy from, for the column, we only // store an overflow_value_t, which contains a pointer to the overflow dataBlock in the // factorizedTable. NullMasks are stored inside the overflow buffer. -void FactorizedTable::copyVectorToUnflatColumn( - const ValueVector& vector, const BlockAppendingInfo& blockAppendInfo, ft_col_idx_t colIdx) { +void FactorizedTable::copyVectorToUnflatColumn(const ValueVector& vector, + const BlockAppendingInfo& blockAppendInfo, ft_col_idx_t colIdx) { KU_ASSERT(!vector.state->isFlat()); auto unflatTupleValue = appendVectorToUnflatTupleBlocks(vector, colIdx); auto blockPtr = blockAppendInfo.data + tableSchema->getColOffset(colIdx); @@ -456,8 +456,8 @@ void FactorizedTable::copyVectorToColumn(const ValueVector& vector, } } -overflow_value_t FactorizedTable::appendVectorToUnflatTupleBlocks( - const ValueVector& vector, ft_col_idx_t colIdx) { +overflow_value_t FactorizedTable::appendVectorToUnflatTupleBlocks(const ValueVector& vector, + ft_col_idx_t colIdx) { KU_ASSERT(!vector.state->isFlat()); auto numFlatTuplesInVector = vector.state->selVector->selectedSize; auto numBytesPerValue = LogicalTypeUtils::getRowLayoutSize(vector.dataType); @@ -506,8 +506,8 @@ overflow_value_t FactorizedTable::appendVectorToUnflatTupleBlocks( return overflow_value_t{numFlatTuplesInVector, overflowBlockBuffer}; } -void FactorizedTable::readUnflatCol( - uint8_t** tuplesToRead, ft_col_idx_t colIdx, ValueVector& vector) const { +void FactorizedTable::readUnflatCol(uint8_t** tuplesToRead, ft_col_idx_t colIdx, + ValueVector& vector) const { auto overflowColValue = *(overflow_value_t*)(tuplesToRead[0] + tableSchema->getColOffset(colIdx)); KU_ASSERT(vector.state->selVector->isUnfiltered()); @@ -557,16 +557,16 @@ void FactorizedTable::readUnflatCol(const uint8_t* tupleToRead, const SelectionV vector.setNull(i, true); } else { vector.setNull(i, false); - vector.copyFromRowData( - i, vectorOverflowValue.value + pos * vector.getNumBytesPerValue()); + vector.copyFromRowData(i, + vectorOverflowValue.value + pos * vector.getNumBytesPerValue()); } } } vector.state->selVector->selectedSize = selVector->selectedSize; } -void FactorizedTable::readFlatColToFlatVector( - uint8_t* tupleToRead, ft_col_idx_t colIdx, ValueVector& vector, sel_t pos) const { +void FactorizedTable::readFlatColToFlatVector(uint8_t* tupleToRead, ft_col_idx_t colIdx, + ValueVector& vector, sel_t pos) const { if (isNonOverflowColNull(tupleToRead + tableSchema->getNullMapOffset(), colIdx)) { vector.setNull(pos, true); } else { @@ -603,15 +603,15 @@ void FactorizedTable::readFlatColToUnflatVector(uint8_t** tuplesToRead, ft_col_i vector.setNull(positionInVectorToWrite, true); } else { vector.setNull(positionInVectorToWrite, false); - vector.copyFromRowData( - positionInVectorToWrite, dataBuffer + tableSchema->getColOffset(colIdx)); + vector.copyFromRowData(positionInVectorToWrite, + dataBuffer + tableSchema->getColOffset(colIdx)); } } } } -void FactorizedTableUtils::appendStringToTable( - FactorizedTable* factorizedTable, std::string& outputMsg, MemoryManager* memoryManager) { +void FactorizedTableUtils::appendStringToTable(FactorizedTable* factorizedTable, + std::string& outputMsg, MemoryManager* memoryManager) { auto outputMsgVector = std::make_shared(LogicalTypeID::STRING, memoryManager); outputMsgVector->state = DataChunkState::getSingleValueDataChunkState(); auto outputKUStr = ku_string_t(); @@ -636,8 +636,8 @@ std::shared_ptr FactorizedTableUtils::getFactorizedTableForOutp } FlatTupleIterator::FlatTupleIterator(FactorizedTable& factorizedTable, std::vector values) - : factorizedTable{factorizedTable}, numFlatTuples{0}, nextFlatTupleIdx{0}, - nextTupleIdx{1}, values{std::move(values)} { + : factorizedTable{factorizedTable}, numFlatTuples{0}, nextFlatTupleIdx{0}, nextTupleIdx{1}, + values{std::move(values)} { resetState(); KU_ASSERT(this->values.size() == factorizedTable.tableSchema->getNumColumns()); } @@ -699,8 +699,8 @@ void FlatTupleIterator::readFlatColToFlatTuple(ft_col_idx_t colIdx, uint8_t* val valueBuffer + factorizedTable.getTableSchema()->getNullMapOffset(), colIdx); values[colIdx]->setNull(isNull); if (!isNull) { - readValueBufferToValue( - colIdx, valueBuffer + factorizedTable.getTableSchema()->getColOffset(colIdx)); + readValueBufferToValue(colIdx, + valueBuffer + factorizedTable.getTableSchema()->getColOffset(colIdx)); } } diff --git a/src/processor/result/flat_tuple.cpp b/src/processor/result/flat_tuple.cpp index 5bdf56dd64d..4bfe5fac3d5 100644 --- a/src/processor/result/flat_tuple.cpp +++ b/src/processor/result/flat_tuple.cpp @@ -42,8 +42,8 @@ std::string FlatTuple::toString() { return result; } -std::string FlatTuple::toString( - const std::vector& colsWidth, const std::string& delimiter, const uint32_t maxWidth) { +std::string FlatTuple::toString(const std::vector& colsWidth, + const std::string& delimiter, const uint32_t maxWidth) { std::ostringstream result; for (auto i = 0ul; i < values.size(); i++) { std::string value = values[i]->toString(); diff --git a/src/processor/result/mark_hash_table.cpp b/src/processor/result/mark_hash_table.cpp index 545d4197653..29c515e2d56 100644 --- a/src/processor/result/mark_hash_table.cpp +++ b/src/processor/result/mark_hash_table.cpp @@ -36,8 +36,8 @@ void MarkHashTable::initializeFTEntries(const std::vector& const std::vector& unFlatKeyVectors, const std::vector& dependentKeyVectors, uint64_t numFTEntriesToInitialize) { - AggregateHashTable::initializeFTEntries( - flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, numFTEntriesToInitialize); + AggregateHashTable::initializeFTEntries(flatKeyVectors, unFlatKeyVectors, dependentKeyVectors, + numFTEntriesToInitialize); for (auto i = 0u; i < numFTEntriesToInitialize; i++) { auto entryIdx = entryIdxesToInitialize[i]; auto entry = hashSlotsToUpdateAggState[entryIdx]->entry; diff --git a/src/processor/result/result_set.cpp b/src/processor/result/result_set.cpp index 28134f915c7..6466dcd1ef5 100644 --- a/src/processor/result/result_set.cpp +++ b/src/processor/result/result_set.cpp @@ -5,8 +5,8 @@ using namespace kuzu::common; namespace kuzu { namespace processor { -ResultSet::ResultSet( - ResultSetDescriptor* resultSetDescriptor, storage::MemoryManager* memoryManager) +ResultSet::ResultSet(ResultSetDescriptor* resultSetDescriptor, + storage::MemoryManager* memoryManager) : multiplicity{1} { auto numDataChunks = resultSetDescriptor->dataChunkDescriptors.size(); dataChunks.resize(numDataChunks); diff --git a/src/storage/buffer_manager/buffer_manager.cpp b/src/storage/buffer_manager/buffer_manager.cpp index 01909c60acd..15f583a472c 100644 --- a/src/storage/buffer_manager/buffer_manager.cpp +++ b/src/storage/buffer_manager/buffer_manager.cpp @@ -98,8 +98,8 @@ void BufferManager::verifySizeParams(uint64_t bufferPoolSize, uint64_t maxDBSize // should be flushed to disk if it is evicted. // (3) If multiple threads are writing to the page, they should coordinate separately because they // both get access to the same piece of memory. -uint8_t* BufferManager::pin( - BMFileHandle& fileHandle, page_idx_t pageIdx, PageReadPolicy pageReadPolicy) { +uint8_t* BufferManager::pin(BMFileHandle& fileHandle, page_idx_t pageIdx, + PageReadPolicy pageReadPolicy) { auto pageState = fileHandle.getPageState(pageIdx); while (true) { auto currStateAndVersion = pageState->getStateAndVersion(); @@ -185,8 +185,8 @@ inline bool try_func(const std::function& func, uint8_t* frame, return true; } -void BufferManager::optimisticRead( - BMFileHandle& fileHandle, page_idx_t pageIdx, const std::function& func) { +void BufferManager::optimisticRead(BMFileHandle& fileHandle, page_idx_t pageIdx, + const std::function& func) { auto pageState = fileHandle.getPageState(pageIdx); #if defined(_WIN32) // Change the Structured Exception handling just for the scope of this function @@ -239,8 +239,8 @@ void BufferManager::unpin(BMFileHandle& fileHandle, page_idx_t pageIdx) { // or we can find no more pages to be evicted. // Lastly, we double check if the needed memory is available. If not, we free the memory we reserved // and return false, otherwise, we load the page to its corresponding frame and return true. -bool BufferManager::claimAFrame( - BMFileHandle& fileHandle, page_idx_t pageIdx, PageReadPolicy pageReadPolicy) { +bool BufferManager::claimAFrame(BMFileHandle& fileHandle, page_idx_t pageIdx, + PageReadPolicy pageReadPolicy) { page_offset_t pageSizeToClaim = fileHandle.getPageSize(); // Reserve the memory for the page. auto currentUsedMem = reserveUsedMemory(pageSizeToClaim); @@ -278,16 +278,16 @@ bool BufferManager::claimAFrame( return true; } -void BufferManager::addToEvictionQueue( - BMFileHandle* fileHandle, page_idx_t pageIdx, PageState* pageState) { +void BufferManager::addToEvictionQueue(BMFileHandle* fileHandle, page_idx_t pageIdx, + PageState* pageState) { auto currStateAndVersion = pageState->getStateAndVersion(); if (++numEvictionQueueInsertions == BufferPoolConstants::EVICTION_QUEUE_PURGING_INTERVAL) { evictionQueue->removeNonEvictableCandidates(); numEvictionQueueInsertions = 0; } pageState->tryMark(currStateAndVersion); - evictionQueue->enqueue( - fileHandle, pageIdx, pageState, PageState::getVersion(currStateAndVersion)); + evictionQueue->enqueue(fileHandle, pageIdx, pageState, + PageState::getVersion(currStateAndVersion)); } uint64_t BufferManager::tryEvictPage(EvictionCandidate& candidate) { @@ -307,8 +307,8 @@ uint64_t BufferManager::tryEvictPage(EvictionCandidate& candidate) { return numBytesFreed; } -void BufferManager::cachePageIntoFrame( - BMFileHandle& fileHandle, page_idx_t pageIdx, PageReadPolicy pageReadPolicy) { +void BufferManager::cachePageIntoFrame(BMFileHandle& fileHandle, page_idx_t pageIdx, + PageReadPolicy pageReadPolicy) { auto pageState = fileHandle.getPageState(pageIdx); pageState->clearDirty(); if (pageReadPolicy == PageReadPolicy::READ_PAGE) { @@ -338,8 +338,8 @@ void BufferManager::flushAllDirtyPagesInFrames(BMFileHandle& fileHandle) { } } -void BufferManager::updateFrameIfPageIsInFrameWithoutLock( - BMFileHandle& fileHandle, uint8_t* newPage, page_idx_t pageIdx) { +void BufferManager::updateFrameIfPageIsInFrameWithoutLock(BMFileHandle& fileHandle, + uint8_t* newPage, page_idx_t pageIdx) { auto pageState = fileHandle.getPageState(pageIdx); if (pageState) { memcpy(getFrame(fileHandle, pageIdx), newPage, BufferPoolConstants::PAGE_4KB_SIZE); @@ -354,8 +354,8 @@ void BufferManager::removePageFromFrameIfNecessary(BMFileHandle& fileHandle, pag } // NOTE: We assume the page is not pinned (locked) here. -void BufferManager::removePageFromFrame( - BMFileHandle& fileHandle, page_idx_t pageIdx, bool shouldFlush) { +void BufferManager::removePageFromFrame(BMFileHandle& fileHandle, page_idx_t pageIdx, + bool shouldFlush) { auto pageState = fileHandle.getPageState(pageIdx); if (PageState::getState(pageState->getStateAndVersion()) == PageState::EVICTED) { return; diff --git a/src/storage/buffer_manager/vm_region.cpp b/src/storage/buffer_manager/vm_region.cpp index b33eb5c7a3a..2260a66be60 100644 --- a/src/storage/buffer_manager/vm_region.cpp +++ b/src/storage/buffer_manager/vm_region.cpp @@ -47,8 +47,8 @@ VMRegion::VMRegion(PageSizeClass pageSizeClass, uint64_t maxRegionSize) : numFra #ifdef _WIN32 uint8_t* VMRegion::getFrame(frame_idx_t frameIdx) { - auto result = VirtualAlloc( - region + ((std::uint64_t)frameIdx * frameSize), frameSize, MEM_COMMIT, PAGE_READWRITE); + auto result = VirtualAlloc(region + ((std::uint64_t)frameIdx * frameSize), frameSize, + MEM_COMMIT, PAGE_READWRITE); if (result == NULL) { throw BufferManagerException(stringFormat( "VirtualAlloc MEM_COMMIT failed with error code {}: {}.", getMaxRegionSize(), diff --git a/src/storage/compression/compression.cpp b/src/storage/compression/compression.cpp index 5a409aa1893..d95e76f1661 100644 --- a/src/storage/compression/compression.cpp +++ b/src/storage/compression/compression.cpp @@ -62,8 +62,8 @@ bool CompressionMetadata::canAlwaysUpdateInPlace() const { } } -bool CompressionMetadata::canUpdateInPlace( - const uint8_t* data, uint32_t pos, PhysicalTypeID physicalType) const { +bool CompressionMetadata::canUpdateInPlace(const uint8_t* data, uint32_t pos, + PhysicalTypeID physicalType) const { if (canAlwaysUpdateInPlace()) { return true; } @@ -89,46 +89,46 @@ bool CompressionMetadata::canUpdateInPlace( switch (physicalType) { case PhysicalTypeID::INT64: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::INT32: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::INT16: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::INT8: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::STRING: case PhysicalTypeID::UINT32: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::UINT16: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } case PhysicalTypeID::UINT8: { auto value = reinterpret_cast(data)[pos]; - return IntegerBitpacking::canUpdateInPlace( - value, BitpackHeader::readHeader(this->data)); + return IntegerBitpacking::canUpdateInPlace(value, + BitpackHeader::readHeader(this->data)); } default: { throw common::StorageException( @@ -166,15 +166,15 @@ uint64_t CompressionMetadata::numValues(uint64_t pageSize, const LogicalType& da case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: - return IntegerBitpacking::numValues( - pageSize, BitpackHeader::readHeader(data)); + return IntegerBitpacking::numValues(pageSize, + BitpackHeader::readHeader(data)); case PhysicalTypeID::STRING: case PhysicalTypeID::UINT32: - return IntegerBitpacking::numValues( - pageSize, BitpackHeader::readHeader(data)); + return IntegerBitpacking::numValues(pageSize, + BitpackHeader::readHeader(data)); case PhysicalTypeID::UINT16: - return IntegerBitpacking::numValues( - pageSize, BitpackHeader::readHeader(data)); + return IntegerBitpacking::numValues(pageSize, + BitpackHeader::readHeader(data)); case PhysicalTypeID::UINT8: return IntegerBitpacking::numValues(pageSize, BitpackHeader::readHeader(data)); default: { @@ -282,8 +282,8 @@ void ConstantCompression::decompressFromPage(const uint8_t* /*srcBuffer*/, uint6 uint8_t* dstBuffer, uint64_t dstOffset, uint64_t numValues, const CompressionMetadata& metadata) const { for (auto i = 0u; i < numValues; i++) { - memcpy( - dstBuffer + (dstOffset + i) * numBytesPerValue, metadata.data.data(), numBytesPerValue); + memcpy(dstBuffer + (dstOffset + i) * numBytesPerValue, metadata.data.data(), + numBytesPerValue); } } @@ -291,8 +291,8 @@ void ConstantCompression::copyFromPage(const uint8_t* srcBuffer, uint64_t srcOff uint8_t* dstBuffer, uint64_t dstOffset, uint64_t numValues, const CompressionMetadata& metadata) const { if (dataType == common::PhysicalTypeID::BOOL) { - common::NullMask::setNullRange( - reinterpret_cast(dstBuffer), dstOffset, numValues, metadata.data[0]); + common::NullMask::setNullRange(reinterpret_cast(dstBuffer), dstOffset, numValues, + metadata.data[0]); } else { decompressFromPage(srcBuffer, srcOffset, dstBuffer, dstOffset, numValues, metadata); } @@ -309,8 +309,8 @@ static inline T abs(typename std::enable_if::value, T>::type v } template -BitpackHeader IntegerBitpacking::getBitWidth( - const uint8_t* srcBuffer, uint64_t numValues) const { +BitpackHeader IntegerBitpacking::getBitWidth(const uint8_t* srcBuffer, + uint64_t numValues) const { T max = std::numeric_limits::min(), min = std::numeric_limits::max(); for (auto i = 0u; i < numValues; i++) { T value = ((T*)srcBuffer)[i]; @@ -453,8 +453,8 @@ uint64_t IntegerBitpacking::compressNextPage(const uint8_t*& srcBuffer, // TODO(bmwinger): this is hacky; we need a better system for dynamically choosing between // algorithms when compressing if (metadata.compression == CompressionType::UNCOMPRESSED) { - return Uncompressed(sizeof(T)).compressNextPage( - srcBuffer, numValuesRemaining, dstBuffer, dstBufferSize, metadata); + return Uncompressed(sizeof(T)).compressNextPage(srcBuffer, numValuesRemaining, dstBuffer, + dstBufferSize, metadata); } KU_ASSERT(metadata.compression == CompressionType::INTEGER_BITPACKING); auto header = BitpackHeader::readHeader(metadata.data); @@ -681,11 +681,11 @@ void ReadCompressedValuesFromPage::operator()(const uint8_t* frame, PageCursor& const CompressionMetadata& metadata) { switch (metadata.compression) { case CompressionType::CONSTANT: - return constant.copyFromPage( - frame, pageCursor.elemPosInPage, result, startPosInResult, numValuesToRead, metadata); + return constant.copyFromPage(frame, pageCursor.elemPosInPage, result, startPosInResult, + numValuesToRead, metadata); case CompressionType::UNCOMPRESSED: - return uncompressed.decompressFromPage( - frame, pageCursor.elemPosInPage, result, startPosInResult, numValuesToRead, metadata); + return uncompressed.decompressFromPage(frame, pageCursor.elemPosInPage, result, + startPosInResult, numValuesToRead, metadata); case CompressionType::INTEGER_BITPACKING: { switch (physicalType) { case PhysicalTypeID::INT64: { @@ -731,8 +731,8 @@ void ReadCompressedValuesFromPage::operator()(const uint8_t* frame, PageCursor& } case CompressionType::BOOLEAN_BITPACKING: // Reading into ColumnChunks should be done without decompressing for booleans - return booleanBitpacking.copyFromPage( - frame, pageCursor.elemPosInPage, result, startPosInResult, numValuesToRead, metadata); + return booleanBitpacking.copyFromPage(frame, pageCursor.elemPosInPage, result, + startPosInResult, numValuesToRead, metadata); default: KU_UNREACHABLE; } @@ -743,47 +743,47 @@ void WriteCompressedValuesToPage::operator()(uint8_t* frame, uint16_t posInFrame const CompressionMetadata& metadata) { switch (metadata.compression) { case CompressionType::CONSTANT: - return constant.setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return constant.setValuesFromUncompressed(data, dataOffset, frame, posInFrame, numValues, + metadata); case CompressionType::UNCOMPRESSED: - return uncompressed.setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return uncompressed.setValuesFromUncompressed(data, dataOffset, frame, posInFrame, + numValues, metadata); case CompressionType::INTEGER_BITPACKING: { switch (physicalType) { case PhysicalTypeID::INT64: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::INT32: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::INT16: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::INT8: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::INTERNAL_ID: case PhysicalTypeID::LIST: case PhysicalTypeID::UINT64: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::STRING: case PhysicalTypeID::UINT32: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::UINT16: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } case PhysicalTypeID::UINT8: { - return IntegerBitpacking().setValuesFromUncompressed( - data, dataOffset, frame, posInFrame, numValues, metadata); + return IntegerBitpacking().setValuesFromUncompressed(data, dataOffset, frame, + posInFrame, numValues, metadata); } default: { throw NotImplementedException("INTEGER_BITPACKING is not implemented for type " + @@ -792,8 +792,8 @@ void WriteCompressedValuesToPage::operator()(uint8_t* frame, uint16_t posInFrame } } case CompressionType::BOOLEAN_BITPACKING: - return booleanBitpacking.copyFromPage( - data, dataOffset, frame, posInFrame, numValues, metadata); + return booleanBitpacking.copyFromPage(data, dataOffset, frame, posInFrame, numValues, + metadata); default: KU_UNREACHABLE; @@ -803,8 +803,8 @@ void WriteCompressedValuesToPage::operator()(uint8_t* frame, uint16_t posInFrame void WriteCompressedValuesToPage::operator()(uint8_t* frame, uint16_t posInFrame, common::ValueVector* vector, uint32_t posInVector, const CompressionMetadata& metadata) { if (metadata.compression == CompressionType::BOOLEAN_BITPACKING) { - booleanBitpacking.setValuesFromUncompressed( - vector->getData(), posInVector, frame, posInFrame, 1, metadata); + booleanBitpacking.setValuesFromUncompressed(vector->getData(), posInVector, frame, + posInFrame, 1, metadata); } else { (*this)(frame, posInFrame, vector->getData(), posInVector, 1, metadata); } diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp index 0489eb6a9ab..829ef2ecd9f 100644 --- a/src/storage/index/hash_index.cpp +++ b/src/storage/index/hash_index.cpp @@ -200,14 +200,14 @@ void HashIndex::insertIntoPersistentIndex(Key key, offset_t value) { } auto hashValue = HashIndexUtils::hash(key); auto fingerprint = HashIndexUtils::getFingerprintForHash(hashValue); - auto iter = getSlotIterator( - HashIndexUtils::getPrimarySlotIdForHash(header, hashValue), TransactionType::WRITE); + auto iter = getSlotIterator(HashIndexUtils::getPrimarySlotIdForHash(header, hashValue), + TransactionType::WRITE); // Find a slot with free entries while (iter.slot.header.numEntries() == getSlotCapacity() && nextChainedSlot(TransactionType::WRITE, iter)) ; - copyKVOrEntryToSlot( - iter.slotInfo, iter.slot, key, value, fingerprint); + copyKVOrEntryToSlot(iter.slotInfo, iter.slot, key, value, + fingerprint); header.numEntries++; } @@ -230,8 +230,8 @@ void HashIndex::deleteFromPersistentIndex(Key key) { } template<> -inline common::hash_t HashIndex::hashStored( - transaction::TransactionType /*trxType*/, const ku_string_t& key) const { +inline common::hash_t HashIndex::hashStored(transaction::TransactionType /*trxType*/, + const ku_string_t& key) const { common::hash_t hash; auto str = overflowFileHandle->readString(TransactionType::WRITE, key); function::Hash::operation(str, hash); @@ -239,8 +239,8 @@ inline common::hash_t HashIndex::hashStored( } template -entry_pos_t HashIndex::findMatchedEntryInSlot( - TransactionType trxType, const Slot& slot, Key key, uint8_t fingerprint) const { +entry_pos_t HashIndex::findMatchedEntryInSlot(TransactionType trxType, const Slot& slot, + Key key, uint8_t fingerprint) const { for (auto entryPos = 0u; entryPos < getSlotCapacity(); entryPos++) { if (slot.header.isEntryValid(entryPos) && slot.header.fingerprints[entryPos] == fingerprint && @@ -257,8 +257,9 @@ void HashIndex::prepareCommit() { wal->addToUpdatedTables(dbFileIDAndName.dbFileID.nodeIndexID.tableID); localStorage->applyLocalChanges( [this](Key key) -> void { this->deleteFromPersistentIndex(key); }, - [this]( - Key key, offset_t value) -> void { this->insertIntoPersistentIndex(key, value); }); + [this](Key key, offset_t value) -> void { + this->insertIntoPersistentIndex(key, value); + }); headerArray->update(INDEX_HEADER_IDX_IN_ARRAY, *indexHeaderForWriteTrx); headerArray->prepareCommit(); pSlots->prepareCommit(); @@ -311,8 +312,8 @@ inline bool HashIndex::equals(transaction::TransactionType trxType, } template<> -inline void HashIndex::insert( - std::string_view key, SlotEntry& entry, common::offset_t offset) { +inline void HashIndex::insert(std::string_view key, SlotEntry& entry, + common::offset_t offset) { entry.key = overflowFileHandle->writeString(key); entry.value = offset; } @@ -359,8 +360,8 @@ void HashIndex::copyEntryToSlot(slot_id_t slotId, const T& entry, uint8_t fin break; } } while (nextChainedSlot(TransactionType::WRITE, iter)); - copyKVOrEntryToSlot( - iter.slotInfo, iter.slot, entry, UINT32_MAX, fingerprint); + copyKVOrEntryToSlot(iter.slotInfo, iter.slot, entry, + UINT32_MAX, fingerprint); updateSlot(iter.slotInfo, iter.slot); } @@ -399,14 +400,14 @@ PrimaryKeyIndex::PrimaryKeyIndex(const DBFileIDAndName& dbFileIDAndName, bool re keyDataTypeID, [&](ku_string_t) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { - hashIndices.push_back(std::make_unique>( - dbFileIDAndName, fileHandle, overflowFile->addHandle(), i, bufferManager, wal)); + hashIndices.push_back(std::make_unique>(dbFileIDAndName, + fileHandle, overflowFile->addHandle(), i, bufferManager, wal)); } }, [&](T) { for (auto i = 0u; i < NUM_HASH_INDEXES; i++) { - hashIndices.push_back(std::make_unique>( - dbFileIDAndName, fileHandle, nullptr, i, bufferManager, wal)); + hashIndices.push_back(std::make_unique>(dbFileIDAndName, fileHandle, + nullptr, i, bufferManager, wal)); } }, [&](auto) { KU_UNREACHABLE; }); @@ -425,8 +426,8 @@ bool PrimaryKeyIndex::lookup(Transaction* trx, common::ValueVector* keyVector, u return retVal; } -bool PrimaryKeyIndex::insert( - common::ValueVector* keyVector, uint64_t vectorPos, common::offset_t value) { +bool PrimaryKeyIndex::insert(common::ValueVector* keyVector, uint64_t vectorPos, + common::offset_t value) { bool result = false; TypeUtils::visit( keyDataTypeID, diff --git a/src/storage/index/hash_index_builder.cpp b/src/storage/index/hash_index_builder.cpp index ec9fbad7a78..b5c80286bc5 100644 --- a/src/storage/index/hash_index_builder.cpp +++ b/src/storage/index/hash_index_builder.cpp @@ -23,11 +23,11 @@ HashIndexBuilder::HashIndexBuilder(const std::shared_ptr& fileHan this->indexHeader = std::make_unique(keyDataType); headerArray = std::make_unique>(*fileHandle, NUM_HEADER_PAGES * indexPos + INDEX_HEADER_ARRAY_HEADER_PAGE_IDX, 0 /* numElements */); - pSlots = std::make_unique>>( - *fileHandle, NUM_HEADER_PAGES * indexPos + P_SLOTS_HEADER_PAGE_IDX, 0 /* numElements */); + pSlots = std::make_unique>>(*fileHandle, + NUM_HEADER_PAGES * indexPos + P_SLOTS_HEADER_PAGE_IDX, 0 /* numElements */); // Reserve a slot for oSlots, which is always skipped, as we treat slot idx 0 as NULL. - oSlots = std::make_unique>>( - *fileHandle, NUM_HEADER_PAGES * indexPos + O_SLOTS_HEADER_PAGE_IDX, 1 /* numElements */); + oSlots = std::make_unique>>(*fileHandle, + NUM_HEADER_PAGES * indexPos + O_SLOTS_HEADER_PAGE_IDX, 1 /* numElements */); allocatePSlots(1u << this->indexHeader->currentLevel); } @@ -212,8 +212,8 @@ void HashIndexBuilder::flush() { } template -inline void HashIndexBuilder::insertToNewOvfSlot( - Key key, Slot* previousSlot, common::offset_t offset, uint8_t fingerprint) { +inline void HashIndexBuilder::insertToNewOvfSlot(Key key, Slot* previousSlot, + common::offset_t offset, uint8_t fingerprint) { auto newSlotId = allocateAOSlot(); previousSlot->header.nextOvfSlotId = newSlotId; auto newSlot = getSlot(SlotInfo{newSlotId, SlotType::OVF}); @@ -243,8 +243,8 @@ common::hash_t HashIndexBuilder::hashStored(const ku_string_t& key) } template<> -bool HashIndexBuilder::equals( - std::string_view keyToLookup, const ku_string_t& keyInEntry) const { +bool HashIndexBuilder::equals(std::string_view keyToLookup, + const ku_string_t& keyInEntry) const { // Checks if prefix and len matches first. if (!HashIndexUtils::areStringPrefixAndLenEqual(keyToLookup, keyInEntry)) { return false; @@ -258,8 +258,8 @@ bool HashIndexBuilder::equals( return memcmp(keyToLookup.data(), keyInEntry.prefix, keyInEntry.len) == 0; } else { // For long strings, compare with overflow data - return overflowFileHandle->equals( - transaction::TransactionType::WRITE, keyToLookup, keyInEntry); + return overflowFileHandle->equals(transaction::TransactionType::WRITE, keyToLookup, + keyInEntry); } } @@ -276,8 +276,8 @@ template class HashIndexBuilder; template class HashIndexBuilder; template class HashIndexBuilder; -PrimaryKeyIndexBuilder::PrimaryKeyIndexBuilder( - const std::string& fName, PhysicalTypeID keyDataType, VirtualFileSystem* vfs) +PrimaryKeyIndexBuilder::PrimaryKeyIndexBuilder(const std::string& fName, PhysicalTypeID keyDataType, + VirtualFileSystem* vfs) : keyDataTypeID{keyDataType} { auto fileHandle = std::make_shared(fName, FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs); diff --git a/src/storage/local_storage/local_node_table.cpp b/src/storage/local_storage/local_node_table.cpp index b367e3eb444..2a98e63127a 100644 --- a/src/storage/local_storage/local_node_table.cpp +++ b/src/storage/local_storage/local_node_table.cpp @@ -23,8 +23,8 @@ void LocalNodeNG::scan(ValueVector* nodeIDVector, const std::vector } } -void LocalNodeNG::lookup( - offset_t nodeOffset, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { +void LocalNodeNG::lookup(offset_t nodeOffset, column_id_t columnID, ValueVector* outputVector, + sel_t posInOutputVector) { if (deleteInfo.containsOffset(nodeOffset)) { // Node has been deleted. return; @@ -146,8 +146,8 @@ LocalNodeTable::LocalNodeTable(Table& table) : LocalTable{table} { bool LocalNodeTable::insert(TableInsertState& state) { auto& insertState = ku_dynamic_cast(state); - return localTableDataCollection[0]->insert( - {&insertState.nodeIDVector}, insertState.propertyVectors); + return localTableDataCollection[0]->insert({&insertState.nodeIDVector}, + insertState.propertyVectors); } bool LocalNodeTable::update(TableUpdateState& state) { @@ -166,15 +166,15 @@ bool LocalNodeTable::delete_(TableDeleteState& deleteState) { void LocalNodeTable::scan(TableReadState& state) { auto localTableData = ku_dynamic_cast(localTableDataCollection[0].get()); - localTableData->scan( - const_cast(&state.nodeIDVector), state.columnIDs, state.outputVectors); + localTableData->scan(const_cast(&state.nodeIDVector), state.columnIDs, + state.outputVectors); } void LocalNodeTable::lookup(TableReadState& state) { auto localTableData = ku_dynamic_cast(localTableDataCollection[0].get()); - localTableData->lookup( - const_cast(&state.nodeIDVector), state.columnIDs, state.outputVectors); + localTableData->lookup(const_cast(&state.nodeIDVector), state.columnIDs, + state.outputVectors); } } // namespace storage diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index 2dac3a77a9d..6dd9af07700 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -26,8 +26,8 @@ row_idx_t LocalRelNG::scanCSR(offset_t srcOffsetInChunk, offset_t posToReadForOf for (auto i = 0u; i < columnIDs.size(); i++) { uint64_t posInOutputVector = 0; for (auto rowIdx : rowIdxesToRead) { - insertChunks.readValueAtRowIdx( - rowIdx, columnIDs[i], outputVectors[i], posInOutputVector++); + insertChunks.readValueAtRowIdx(rowIdx, columnIDs[i], outputVectors[i], + posInOutputVector++); } } auto numRelsRead = rowIdxesToRead.size(); @@ -47,8 +47,8 @@ void LocalRelNG::applyLocalChangesToScannedVectors(offset_t srcOffset, applyCSRDeletions(srcOffset, relIDVector); } -void LocalRelNG::applyCSRUpdates( - column_id_t columnID, ValueVector* relIDVector, ValueVector* outputVector) { +void LocalRelNG::applyCSRUpdates(column_id_t columnID, ValueVector* relIDVector, + ValueVector* outputVector) { auto& updateChunk = updateChunks[columnID]; for (auto i = 0u; i < relIDVector->state->selVector->selectedSize; i++) { auto pos = relIDVector->state->selVector->selectedPositions[i]; @@ -83,8 +83,8 @@ void LocalRelNG::applyCSRDeletions(offset_t srcOffset, ValueVector* relIDVector) } // nodeIDVectors: srcNodeIDVector, dstNodeIDVector. -bool LocalRelNG::insert( - std::vector nodeIDVectors, std::vector propertyVectors) { +bool LocalRelNG::insert(std::vector nodeIDVectors, + std::vector propertyVectors) { KU_ASSERT(nodeIDVectors.size() == 2); auto srcNodeIDVector = nodeIDVectors[0]; auto dstNodeIDVector = nodeIDVectors[1]; @@ -110,8 +110,8 @@ bool LocalRelNG::insert( } // IDVectors: srcNodeIDVector, relIDVector. -bool LocalRelNG::update( - std::vector IDVectors, column_id_t columnID, ValueVector* propertyVector) { +bool LocalRelNG::update(std::vector IDVectors, column_id_t columnID, + ValueVector* propertyVector) { KU_ASSERT(IDVectors.size() == 2); auto srcNodeIDVector = IDVectors[0]; auto relIDVector = IDVectors[1]; @@ -171,8 +171,8 @@ offset_t LocalRelNG::getNumInsertedRels(offset_t srcOffset) const { return insertChunks.getNumRelsFromSrcOffset(srcOffset); } -void LocalRelNG::getChangesPerCSRSegment( - std::vector& sizeChangesPerSegment, std::vector& hasChangesPerSegment) { +void LocalRelNG::getChangesPerCSRSegment(std::vector& sizeChangesPerSegment, + std::vector& hasChangesPerSegment) { auto numSegments = StorageConstants::NODE_GROUP_SIZE / StorageConstants::CSR_SEGMENT_SIZE; sizeChangesPerSegment.resize(numSegments, 0 /*initValue*/); hasChangesPerSegment.resize(numSegments, false /*initValue*/); diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index 98b2596e4a9..7a63d825dde 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -5,8 +5,8 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -LocalNodeGroup::LocalNodeGroup( - offset_t nodeGroupStartOffset, const std::vector& dataTypes) +LocalNodeGroup::LocalNodeGroup(offset_t nodeGroupStartOffset, + const std::vector& dataTypes) : nodeGroupStartOffset{nodeGroupStartOffset}, insertChunks{LogicalType::copy(dataTypes)} { updateChunks.reserve(dataTypes.size()); for (auto i = 0u; i < dataTypes.size(); i++) { @@ -29,8 +29,8 @@ bool LocalNodeGroup::hasUpdatesOrDeletions() const { return false; } -void LocalChunkedGroupCollection::appendChunkedGroup( - ColumnChunk* srcOffsetChunk, std::unique_ptr chunkedGroup) { +void LocalChunkedGroupCollection::appendChunkedGroup(ColumnChunk* srcOffsetChunk, + std::unique_ptr chunkedGroup) { KU_ASSERT(chunkedGroup->getNumColumns() == dataTypes.size()); for (auto i = 0u; i < chunkedGroup->getNumColumns(); i++) { KU_ASSERT(chunkedGroup->getColumnChunk(i).getDataType() == dataTypes[i]); @@ -54,8 +54,8 @@ void LocalChunkedGroupCollection::readValueAtRowIdx(row_idx_t rowIdx, column_id_ chunk.lookup(offsetInChunk, *outputVector, posInOutputVector); } -bool LocalChunkedGroupCollection::read( - offset_t offset, column_id_t columnID, ValueVector* outputVector, sel_t posInOutputVector) { +bool LocalChunkedGroupCollection::read(offset_t offset, column_id_t columnID, + ValueVector* outputVector, sel_t posInOutputVector) { if (!offsetToRowIdx.contains(offset)) { return false; } @@ -64,8 +64,8 @@ bool LocalChunkedGroupCollection::read( return true; } -void LocalChunkedGroupCollection::update( - offset_t offset, column_id_t columnID, ValueVector* propertyVector) { +void LocalChunkedGroupCollection::update(offset_t offset, column_id_t columnID, + ValueVector* propertyVector) { KU_ASSERT(offsetToRowIdx.contains(offset)); auto rowIdx = offsetToRowIdx.at(offset); auto [chunkIdx, offsetInChunk] = getChunkIdxAndOffsetInChunk(rowIdx); @@ -90,8 +90,8 @@ row_idx_t LocalChunkedGroupCollection::append(std::vector vectors) if (chunkedGroups.getNumChunkedGroups() == 0 || chunkedGroups.getChunkedGroup(chunkedGroups.getNumChunkedGroups() - 1)->getNumRows() == ChunkedNodeGroupCollection::CHUNK_CAPACITY) { - chunkedGroups.merge(std::make_unique( - dataTypes, false /*enableCompression*/, ChunkedNodeGroupCollection::CHUNK_CAPACITY)); + chunkedGroups.merge(std::make_unique(dataTypes, + false /*enableCompression*/, ChunkedNodeGroupCollection::CHUNK_CAPACITY)); } auto lastChunkGroup = chunkedGroups.getChunkedGroupUnsafe(chunkedGroups.getNumChunkedGroups() - 1); @@ -103,15 +103,15 @@ row_idx_t LocalChunkedGroupCollection::append(std::vector vectors) return numRows++; } -bool LocalTableData::insert( - std::vector nodeIDVectors, std::vector propertyVectors) { +bool LocalTableData::insert(std::vector nodeIDVectors, + std::vector propertyVectors) { KU_ASSERT(nodeIDVectors.size() >= 1); auto localNodeGroup = getOrCreateLocalNodeGroup(nodeIDVectors[0]); return localNodeGroup->insert(nodeIDVectors, propertyVectors); } -bool LocalTableData::update( - std::vector nodeIDVectors, column_id_t columnID, ValueVector* propertyVector) { +bool LocalTableData::update(std::vector nodeIDVectors, column_id_t columnID, + ValueVector* propertyVector) { KU_ASSERT(nodeIDVectors.size() >= 1); auto localNodeGroup = getOrCreateLocalNodeGroup(nodeIDVectors[0]); return localNodeGroup->update(nodeIDVectors, columnID, propertyVector); diff --git a/src/storage/stats/node_table_statistics.cpp b/src/storage/stats/node_table_statistics.cpp index 4721df8c09a..ba3f5c8ad26 100644 --- a/src/storage/stats/node_table_statistics.cpp +++ b/src/storage/stats/node_table_statistics.cpp @@ -17,13 +17,13 @@ NodeTableStatsAndDeletedIDs::NodeTableStatsAndDeletedIDs(BMFileHandle* metadataF metadataDAHInfos.clear(); metadataDAHInfos.reserve(entry.getNumProperties()); for (auto& property : entry.getPropertiesRef()) { - metadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo( - *property.getDataType(), *metadataFH, bufferManager, wal)); + metadataDAHInfos.push_back(TablesStatistics::createMetadataDAHInfo(*property.getDataType(), + *metadataFH, bufferManager, wal)); } } -NodeTableStatsAndDeletedIDs::NodeTableStatsAndDeletedIDs( - table_id_t tableID, offset_t maxNodeOffset, const std::vector& deletedNodeOffsets) +NodeTableStatsAndDeletedIDs::NodeTableStatsAndDeletedIDs(table_id_t tableID, offset_t maxNodeOffset, + const std::vector& deletedNodeOffsets) : NodeTableStatsAndDeletedIDs{tableID, maxNodeOffset, deletedNodeOffsets, {}} {} NodeTableStatsAndDeletedIDs::NodeTableStatsAndDeletedIDs(const NodeTableStatsAndDeletedIDs& other) @@ -105,8 +105,8 @@ void NodeTableStatsAndDeletedIDs::deleteNode(offset_t nodeOffset) { // Note: this function will always be called right after scanNodeID, so we have the guarantee // that the nodeOffsetVector is always unselected. void NodeTableStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel(ValueVector* nodeIDVector) const { - auto [morselIdx, _] = StorageUtils::getQuotientRemainder( - nodeIDVector->readNodeOffset(0), DEFAULT_VECTOR_CAPACITY); + auto [morselIdx, _] = StorageUtils::getQuotientRemainder(nodeIDVector->readNodeOffset(0), + DEFAULT_VECTOR_CAPACITY); if (hasDeletedNodesPerMorsel[morselIdx]) { auto& deletedNodeOffsets = deletedNodeOffsetsPerMorsel.at(morselIdx); uint64_t morselBeginOffset = morselIdx * DEFAULT_VECTOR_CAPACITY; diff --git a/src/storage/stats/nodes_store_statistics.cpp b/src/storage/stats/nodes_store_statistics.cpp index 30075acb48f..34b32acf287 100644 --- a/src/storage/stats/nodes_store_statistics.cpp +++ b/src/storage/stats/nodes_store_statistics.cpp @@ -6,8 +6,8 @@ using namespace kuzu::transaction; namespace kuzu { namespace storage { -offset_t NodesStoreStatsAndDeletedIDs::getMaxNodeOffset( - transaction::Transaction* transaction, table_id_t tableID) { +offset_t NodesStoreStatsAndDeletedIDs::getMaxNodeOffset(transaction::Transaction* transaction, + table_id_t tableID) { KU_ASSERT(transaction); if (transaction->getType() == transaction::TransactionType::READ_ONLY) { return getNodeStatisticsAndDeletedIDs(transaction, tableID)->getMaxNodeOffset(); @@ -28,8 +28,8 @@ void NodesStoreStatsAndDeletedIDs::updateNumTuplesByValue(table_id_t tableID, in tableStats->setNumTuples(tableStats->getNumTuples() + value); } -void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel( - transaction::Transaction* tx, ValueVector* nodeIDVector, table_id_t tableID) { +void NodesStoreStatsAndDeletedIDs::setDeletedNodeOffsetsForMorsel(transaction::Transaction* tx, + ValueVector* nodeIDVector, table_id_t tableID) { // NOTE: We can remove the lock under the following assumptions, that should currently hold: // 1) During the phases when nodeStatisticsAndDeletedIDsPerTableForReadOnlyTrx change, which // is during checkpointing, this function, which is called during scans, cannot be called. @@ -60,8 +60,8 @@ void NodesStoreStatsAndDeletedIDs::addNodeStatisticsAndDeletedIDs( constructTableStatistic(nodeTableEntry); } -void NodesStoreStatsAndDeletedIDs::addMetadataDAHInfo( - table_id_t tableID, const LogicalType& dataType) { +void NodesStoreStatsAndDeletedIDs::addMetadataDAHInfo(table_id_t tableID, + const LogicalType& dataType) { initTableStatisticsForWriteTrx(); KU_ASSERT(readWriteVersion); setToUpdated(); diff --git a/src/storage/stats/rel_table_statistics.cpp b/src/storage/stats/rel_table_statistics.cpp index 8bd6e054127..f52197367b8 100644 --- a/src/storage/stats/rel_table_statistics.cpp +++ b/src/storage/stats/rel_table_statistics.cpp @@ -69,8 +69,8 @@ void RelTableStats::serializeInternal(Serializer& serializer) { serializer.serializeVectorOfPtrs(bwdMetadataDAHInfos); } -std::unique_ptr RelTableStats::deserialize( - uint64_t numRels, table_id_t tableID, Deserializer& deserializer) { +std::unique_ptr RelTableStats::deserialize(uint64_t numRels, table_id_t tableID, + Deserializer& deserializer) { offset_t nextRelOffset; deserializer.deserializeValue(nextRelOffset); std::unique_ptr fwdCSROffsetMetadataDAHInfo, bwdCSROffsetMetadataDAHInfo, diff --git a/src/storage/stats/rels_store_statistics.cpp b/src/storage/stats/rels_store_statistics.cpp index 13173545e40..03e4e4ffcf7 100644 --- a/src/storage/stats/rels_store_statistics.cpp +++ b/src/storage/stats/rels_store_statistics.cpp @@ -10,8 +10,8 @@ using namespace kuzu::transaction; namespace kuzu { namespace storage { -RelsStoreStats::RelsStoreStats( - BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, VirtualFileSystem* vfs) +RelsStoreStats::RelsStoreStats(BMFileHandle* metadataFH, BufferManager* bufferManager, WAL* wal, + VirtualFileSystem* vfs) : TablesStatistics{metadataFH, bufferManager, wal, vfs} { readFromFile(); } @@ -63,8 +63,8 @@ void RelsStoreStats::removeMetadataDAHInfo(table_id_t tableID, column_id_t colum tableStats->removeMetadataDAHInfoForColumn(columnID, RelDataDirection::BWD); } -MetadataDAHInfo* RelsStoreStats::getCSROffsetMetadataDAHInfo( - Transaction* transaction, table_id_t tableID, RelDataDirection direction) { +MetadataDAHInfo* RelsStoreStats::getCSROffsetMetadataDAHInfo(Transaction* transaction, + table_id_t tableID, RelDataDirection direction) { if (transaction->isWriteTransaction()) { initTableStatisticsForWriteTrx(); } @@ -72,8 +72,8 @@ MetadataDAHInfo* RelsStoreStats::getCSROffsetMetadataDAHInfo( return tableStats->getCSROffsetMetadataDAHInfo(direction); } -MetadataDAHInfo* RelsStoreStats::getCSRLengthMetadataDAHInfo( - Transaction* transaction, table_id_t tableID, RelDataDirection direction) { +MetadataDAHInfo* RelsStoreStats::getCSRLengthMetadataDAHInfo(Transaction* transaction, + table_id_t tableID, RelDataDirection direction) { if (transaction->isWriteTransaction()) { initTableStatisticsForWriteTrx(); } diff --git a/src/storage/stats/table_statistics.cpp b/src/storage/stats/table_statistics.cpp index 6acd94fe3b9..4fee186ce59 100644 --- a/src/storage/stats/table_statistics.cpp +++ b/src/storage/stats/table_statistics.cpp @@ -22,8 +22,8 @@ TableStatistics::TableStatistics(common::TableType tableType, uint64_t numTuples common::table_id_t tableID, std::unordered_map>&& propertyStatistics) - : tableType{tableType}, numTuples{numTuples}, tableID{tableID}, propertyStatistics{std::move( - propertyStatistics)} { + : tableType{tableType}, numTuples{numTuples}, tableID{tableID}, + propertyStatistics{std::move(propertyStatistics)} { KU_ASSERT(numTuples != UINT64_MAX); } diff --git a/src/storage/stats/table_statistics_collection.cpp b/src/storage/stats/table_statistics_collection.cpp index 442759245ea..b07ac250705 100644 --- a/src/storage/stats/table_statistics_collection.cpp +++ b/src/storage/stats/table_statistics_collection.cpp @@ -71,8 +71,8 @@ PropertyStatistics& TablesStatistics::getPropertyStatisticsForTable( } } -void TablesStatistics::setPropertyStatisticsForTable( - table_id_t tableID, property_id_t propertyID, PropertyStatistics stats) { +void TablesStatistics::setPropertyStatisticsForTable(table_id_t tableID, property_id_t propertyID, + PropertyStatistics stats) { initTableStatisticsForWriteTrx(); KU_ASSERT(readWriteVersion && readWriteVersion->tableStatisticPerTable.contains(tableID)); setToUpdated(); diff --git a/src/storage/storage_manager.cpp b/src/storage/storage_manager.cpp index 7969432806e..65d91ba97d5 100644 --- a/src/storage/storage_manager.cpp +++ b/src/storage/storage_manager.cpp @@ -27,15 +27,15 @@ StorageManager::StorageManager(bool readOnly, const Catalog& catalog, MemoryMana readOnly ? FileHandle::O_PERSISTENT_FILE_READ_ONLY : FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, BMFileHandle::FileVersionedType::VERSIONED_FILE, vfs); - nodesStatisticsAndDeletedIDs = std::make_unique( - metadataFH.get(), memoryManager.getBufferManager(), wal, vfs); - relsStatistics = std::make_unique( - metadataFH.get(), memoryManager.getBufferManager(), wal, vfs); + nodesStatisticsAndDeletedIDs = std::make_unique(metadataFH.get(), + memoryManager.getBufferManager(), wal, vfs); + relsStatistics = std::make_unique(metadataFH.get(), + memoryManager.getBufferManager(), wal, vfs); loadTables(readOnly, catalog); } -static void setCommonTableIDToRdfRelTable( - RelTable* relTable, std::vector rdfEntries) { +static void setCommonTableIDToRdfRelTable(RelTable* relTable, + std::vector rdfEntries) { for (auto rdfEntry : rdfEntries) { if (rdfEntry->isParent(relTable->getTableID())) { std::vector columns; @@ -85,8 +85,8 @@ void StorageManager::createRelTable(table_id_t tableID, RelTableCatalogEntry* re tables[tableID] = std::move(relTable); } -void StorageManager::createRelTableGroup( - table_id_t, RelGroupCatalogEntry* tableSchema, Catalog* catalog, Transaction* transaction) { +void StorageManager::createRelTableGroup(table_id_t, RelGroupCatalogEntry* tableSchema, + Catalog* catalog, Transaction* transaction) { for (auto relTableID : tableSchema->getRelTableIDs()) { createRelTable(relTableID, ku_dynamic_cast( @@ -95,8 +95,8 @@ void StorageManager::createRelTableGroup( } } -void StorageManager::createRdfGraph( - table_id_t, RDFGraphCatalogEntry* tableSchema, Catalog* catalog, Transaction* transaction) { +void StorageManager::createRdfGraph(table_id_t, RDFGraphCatalogEntry* tableSchema, Catalog* catalog, + Transaction* transaction) { auto rdfGraphSchema = ku_dynamic_cast(tableSchema); auto resourceTableID = rdfGraphSchema->getResourceTableID(); auto resourceTableEntry = ku_dynamic_cast( @@ -120,8 +120,8 @@ void StorageManager::createTable(table_id_t tableID, Catalog* catalog, Transacti auto tableEntry = catalog->getTableCatalogEntry(transaction, tableID); switch (tableEntry->getTableType()) { case TableType::NODE: { - createNodeTable( - tableID, ku_dynamic_cast(tableEntry)); + createNodeTable(tableID, + ku_dynamic_cast(tableEntry)); } break; case TableType::REL: { createRelTable(tableID, diff --git a/src/storage/storage_structure/db_file_utils.cpp b/src/storage/storage_structure/db_file_utils.cpp index c164c90b4b4..eae1d5ab324 100644 --- a/src/storage/storage_structure/db_file_utils.cpp +++ b/src/storage/storage_structure/db_file_utils.cpp @@ -6,13 +6,13 @@ namespace kuzu { namespace storage { struct WALPageIdxAndFrame { - WALPageIdxAndFrame( - common::page_idx_t originalPageIdx, common::page_idx_t pageIdxInWAL, uint8_t* frame) + WALPageIdxAndFrame(common::page_idx_t originalPageIdx, common::page_idx_t pageIdxInWAL, + uint8_t* frame) : originalPageIdx{originalPageIdx}, pageIdxInWAL{pageIdxInWAL}, frame{frame} {} WALPageIdxAndFrame(WALPageIdxAndFrame& other) - : originalPageIdx{other.originalPageIdx}, - pageIdxInWAL{other.pageIdxInWAL}, frame{other.frame} {} + : originalPageIdx{other.originalPageIdx}, pageIdxInWAL{other.pageIdxInWAL}, + frame{other.frame} {} common::page_idx_t originalPageIdx; common::page_idx_t pageIdxInWAL; @@ -29,21 +29,21 @@ WALPageIdxAndFrame createWALVersionIfNecessaryAndPinPage(page_idx_t originalPage try { if (fileHandle.hasWALPageVersionNoWALPageIdxLock(originalPageIdx)) { pageIdxInWAL = fileHandle.getWALPageIdxNoWALPageIdxLock(originalPageIdx); - walFrame = bufferManager.pin( - *wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::READ_PAGE); + walFrame = bufferManager.pin(*wal.fileHandle, pageIdxInWAL, + BufferManager::PageReadPolicy::READ_PAGE); } else { pageIdxInWAL = wal.logPageUpdateRecord(dbFileID, originalPageIdx /* pageIdxInOriginalFile */); - walFrame = bufferManager.pin( - *wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::DONT_READ_PAGE); + walFrame = bufferManager.pin(*wal.fileHandle, pageIdxInWAL, + BufferManager::PageReadPolicy::DONT_READ_PAGE); if (!insertingNewPage) { - bufferManager.optimisticRead( - fileHandle, originalPageIdx, [&](uint8_t* frame) -> void { + bufferManager.optimisticRead(fileHandle, originalPageIdx, + [&](uint8_t* frame) -> void { memcpy(walFrame, frame, BufferPoolConstants::PAGE_4KB_SIZE); }); } - fileHandle.setWALPageIdxNoLock( - originalPageIdx /* pageIdxInOriginalFile */, pageIdxInWAL); + fileHandle.setWALPageIdxNoLock(originalPageIdx /* pageIdxInOriginalFile */, + pageIdxInWAL); wal.fileHandle->setLockedPageDirty(pageIdxInWAL); } } catch (Exception& e) { @@ -74,8 +74,8 @@ std::pair DBFileUtils::getFileHandleAndPhysicalPageId !fileHandle.hasWALPageVersionNoWALPageIdxLock(physicalPageIdx)) { return std::make_pair(&fileHandle, physicalPageIdx); } else { - return std::make_pair( - wal.fileHandle.get(), fileHandle.getWALPageIdxNoWALPageIdxLock(physicalPageIdx)); + return std::make_pair(wal.fileHandle.get(), + fileHandle.getWALPageIdxNoWALPageIdxLock(physicalPageIdx)); } } @@ -83,8 +83,8 @@ common::page_idx_t DBFileUtils::insertNewPage(BMFileHandle& fileHandle, DBFileID BufferManager& bufferManager, WAL& wal, const std::function& insertOp) { auto newOriginalPage = fileHandle.addNewPage(); auto newWALPage = wal.logPageInsertRecord(dbFileID, newOriginalPage); - auto walFrame = bufferManager.pin( - *wal.fileHandle, newWALPage, BufferManager::PageReadPolicy::DONT_READ_PAGE); + auto walFrame = bufferManager.pin(*wal.fileHandle, newWALPage, + BufferManager::PageReadPolicy::DONT_READ_PAGE); fileHandle.addWALPageIdxGroupIfNecessary(newOriginalPage); fileHandle.setWALPageIdx(newOriginalPage, newWALPage); insertOp(walFrame); @@ -96,8 +96,8 @@ common::page_idx_t DBFileUtils::insertNewPage(BMFileHandle& fileHandle, DBFileID void DBFileUtils::updatePage(BMFileHandle& fileHandle, DBFileID dbFileID, page_idx_t originalPageIdx, bool isInsertingNewPage, BufferManager& bufferManager, WAL& wal, const std::function& updateOp) { - auto walPageIdxAndFrame = createWALVersionIfNecessaryAndPinPage( - originalPageIdx, isInsertingNewPage, fileHandle, dbFileID, bufferManager, wal); + auto walPageIdxAndFrame = createWALVersionIfNecessaryAndPinPage(originalPageIdx, + isInsertingNewPage, fileHandle, dbFileID, bufferManager, wal); try { updateOp(walPageIdxAndFrame.frame); } catch (Exception& e) { @@ -113,8 +113,8 @@ void DBFileUtils::readWALVersionOfPage(BMFileHandle& fileHandle, page_idx_t orig auto frame = bufferManager.pin(*wal.fileHandle, pageIdxInWAL, BufferManager::PageReadPolicy::READ_PAGE); readOp(frame); - unpinPageIdxInWALAndReleaseOriginalPageLock( - pageIdxInWAL, originalPageIdx, fileHandle, bufferManager, wal); + unpinPageIdxInWALAndReleaseOriginalPageLock(pageIdxInWAL, originalPageIdx, fileHandle, + bufferManager, wal); } } // namespace storage diff --git a/src/storage/storage_structure/disk_array.cpp b/src/storage/storage_structure/disk_array.cpp index 3fba2e01ab9..04c3124cf40 100644 --- a/src/storage/storage_structure/disk_array.cpp +++ b/src/storage/storage_structure/disk_array.cpp @@ -33,11 +33,11 @@ PIPWrapper::PIPWrapper(FileHandle& fileHandle, page_idx_t pipPageIdx) : pipPageI fileHandle.readPage(reinterpret_cast(&pipContents), pipPageIdx); } -BaseDiskArrayInternal::BaseDiskArrayInternal( - FileHandle& fileHandle, page_idx_t headerPageIdx, uint64_t elementSize) +BaseDiskArrayInternal::BaseDiskArrayInternal(FileHandle& fileHandle, page_idx_t headerPageIdx, + uint64_t elementSize) : header{elementSize}, fileHandle{fileHandle}, headerPageIdx{headerPageIdx}, - headerForWriteTrx{header}, hasTransactionalUpdates{false}, - bufferManager{nullptr}, wal{nullptr} {} + headerForWriteTrx{header}, hasTransactionalUpdates{false}, bufferManager{nullptr}, + wal{nullptr} {} BaseDiskArrayInternal::BaseDiskArrayInternal(FileHandle& fileHandle, DBFileID dbFileID, page_idx_t headerPageIdx, BufferManager* bufferManager, WAL* wal, @@ -335,8 +335,8 @@ BaseInMemDiskArray::BaseInMemDiskArray(FileHandle& fileHandle, DBFileID dbFileID } } -BaseInMemDiskArray::BaseInMemDiskArray( - FileHandle& fileHandle, page_idx_t headerPageIdx, uint64_t elementSize) +BaseInMemDiskArray::BaseInMemDiskArray(FileHandle& fileHandle, page_idx_t headerPageIdx, + uint64_t elementSize) : BaseDiskArrayInternal(fileHandle, headerPageIdx, elementSize) {} // [] operator to be used when building an InMemDiskArrayBuilder without transactional updates. @@ -353,8 +353,8 @@ void BaseInMemDiskArray::addInMemoryArrayPageAndReadFromFile(page_idx_t apPageId } void BaseInMemDiskArray::readArrayPageFromFile(uint64_t apIdx, page_idx_t apPageIdx) { - this->fileHandle.readPage( - reinterpret_cast(this->inMemArrayPages[apIdx].get()), apPageIdx); + this->fileHandle.readPage(reinterpret_cast(this->inMemArrayPages[apIdx].get()), + apPageIdx); } InMemDiskArrayBuilderInternal::InMemDiskArrayBuilderInternal(FileHandle& fileHandle, @@ -379,8 +379,8 @@ void InMemDiskArrayBuilderInternal::saveToDisk() { // save the header and pips. this->header.saveToDisk(this->fileHandle, this->headerPageIdx); for (auto i = 0u; i < this->pips.size(); ++i) { - this->fileHandle.writePage( - reinterpret_cast(&this->pips[i].pipContents), this->pips[i].pipPageIdx); + this->fileHandle.writePage(reinterpret_cast(&this->pips[i].pipContents), + this->pips[i].pipPageIdx); } // Save array pages for (page_idx_t apIdx = 0; apIdx < this->header.numAPs; ++apIdx) { diff --git a/src/storage/storage_structure/in_mem_page.cpp b/src/storage/storage_structure/in_mem_page.cpp index 777307fd20c..694cd4f0974 100644 --- a/src/storage/storage_structure/in_mem_page.cpp +++ b/src/storage/storage_structure/in_mem_page.cpp @@ -14,8 +14,8 @@ InMemPage::InMemPage() { data = buffer.get(); } -uint8_t* InMemPage::write( - uint32_t byteOffsetInPage, const uint8_t* elem, uint32_t numBytesForElem) const { +uint8_t* InMemPage::write(uint32_t byteOffsetInPage, const uint8_t* elem, + uint32_t numBytesForElem) const { memcpy(data + byteOffsetInPage, elem, numBytesForElem); return data + byteOffsetInPage; } diff --git a/src/storage/storage_structure/overflow_file.cpp b/src/storage/storage_structure/overflow_file.cpp index 7f984b9ba7d..4ce27b5a6db 100644 --- a/src/storage/storage_structure/overflow_file.cpp +++ b/src/storage/storage_structure/overflow_file.cpp @@ -29,8 +29,8 @@ std::string OverflowFileHandle::readString(TransactionType trxType, const ku_str retVal.reserve(str.len); int32_t remainingLength = str.len; while (remainingLength > 0) { - auto numBytesToReadInPage = std::min( - static_cast(remainingLength), END_OF_PAGE - cursor.elemPosInPage); + auto numBytesToReadInPage = std::min(static_cast(remainingLength), + END_OF_PAGE - cursor.elemPosInPage); auto startPosInSrc = retVal.size(); read(trxType, cursor.pageIdx, [&](uint8_t* frame) { // Replace rather than append, since optimistic read may call the function multiple @@ -75,8 +75,8 @@ bool OverflowFileHandle::equals(TransactionType trxType, std::string_view keyToL uint8_t* OverflowFileHandle::addANewPage() { page_idx_t newPageIdx = overflowFile.getNewPageIdx(); if (pageWriteCache.size() > 0) { - pageWriteCache[nextPosToWriteTo.pageIdx]->write( - END_OF_PAGE, reinterpret_cast(&newPageIdx), sizeof(page_idx_t)); + pageWriteCache[nextPosToWriteTo.pageIdx]->write(END_OF_PAGE, + reinterpret_cast(&newPageIdx), sizeof(page_idx_t)); } pageWriteCache.emplace(newPageIdx, std::make_unique()); nextPosToWriteTo.elemPosInPage = 0; @@ -84,8 +84,8 @@ uint8_t* OverflowFileHandle::addANewPage() { return pageWriteCache[newPageIdx]->data; } -void OverflowFileHandle::setStringOverflow( - const char* srcRawString, uint64_t len, ku_string_t& diskDstString) { +void OverflowFileHandle::setStringOverflow(const char* srcRawString, uint64_t len, + ku_string_t& diskDstString) { if (len <= ku_string_t::SHORT_STR_LENGTH) { return; } else if (len > BufferPoolConstants::PAGE_256KB_SIZE) { @@ -105,8 +105,8 @@ void OverflowFileHandle::setStringOverflow( if (cached != pageWriteCache.end()) { pageToWrite = cached->second->data; } else { - overflowFile.readFromDisk( - TransactionType::WRITE, nextPosToWriteTo.pageIdx, [&](auto* frame) { + overflowFile.readFromDisk(TransactionType::WRITE, nextPosToWriteTo.pageIdx, + [&](auto* frame) { auto page = std::make_unique(); memcpy(page->data, frame, BufferPoolConstants::PAGE_4KB_SIZE); pageToWrite = page->data; @@ -115,12 +115,12 @@ void OverflowFileHandle::setStringOverflow( } } int32_t remainingLength = len; - TypeUtils::encodeOverflowPtr( - diskDstString.overflowPtr, nextPosToWriteTo.pageIdx, nextPosToWriteTo.elemPosInPage); + TypeUtils::encodeOverflowPtr(diskDstString.overflowPtr, nextPosToWriteTo.pageIdx, + nextPosToWriteTo.elemPosInPage); while (remainingLength > 0) { auto bytesWritten = len - remainingLength; - auto numBytesToWriteInPage = std::min( - static_cast(remainingLength), END_OF_PAGE - nextPosToWriteTo.elemPosInPage); + auto numBytesToWriteInPage = std::min(static_cast(remainingLength), + END_OF_PAGE - nextPosToWriteTo.elemPosInPage); memcpy(pageToWrite + nextPosToWriteTo.elemPosInPage, srcRawString + bytesWritten, numBytesToWriteInPage); remainingLength -= numBytesToWriteInPage; @@ -188,8 +188,8 @@ OverflowFile::OverflowFile(const DBFileIDAndName& dbFileIdAndName, BufferManager void OverflowFile::readFromDisk(transaction::TransactionType trxType, common::page_idx_t pageIdx, const std::function& func) const { auto [fileHandleToPin, pageIdxToPin] = - storage::DBFileUtils::getFileHandleAndPhysicalPageIdxToPin( - *getBMFileHandle(), pageIdx, *wal, trxType); + storage::DBFileUtils::getFileHandleAndPhysicalPageIdxToPin(*getBMFileHandle(), pageIdx, + *wal, trxType); bufferManager->optimisticRead(*fileHandleToPin, pageIdxToPin, func); } diff --git a/src/storage/storage_utils.cpp b/src/storage/storage_utils.cpp index 3b01b81b74e..b918f1e640d 100644 --- a/src/storage/storage_utils.cpp +++ b/src/storage/storage_utils.cpp @@ -16,8 +16,8 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -std::string StorageUtils::getColumnName( - const std::string& propertyName, StorageUtils::ColumnType type, const std::string& prefix) { +std::string StorageUtils::getColumnName(const std::string& propertyName, + StorageUtils::ColumnType type, const std::string& prefix) { switch (type) { case StorageUtils::ColumnType::DATA: { return stringFormat("{}_data", propertyName); @@ -57,8 +57,8 @@ std::string StorageUtils::getNodeIndexFName(const VirtualFileSystem* vfs, vfs->joinPath(directory, fName + StorageConstants::INDEX_FILE_SUFFIX), fileVersionType); } -std::unique_ptr StorageUtils::getFileInfoForReadWrite( - const std::string& directory, DBFileID dbFileID, VirtualFileSystem* vfs) { +std::unique_ptr StorageUtils::getFileInfoForReadWrite(const std::string& directory, + DBFileID dbFileID, VirtualFileSystem* vfs) { std::string fName; switch (dbFileID.dbFileType) { case DBFileType::METADATA: { @@ -68,8 +68,8 @@ std::unique_ptr StorageUtils::getFileInfoForReadWrite( fName = getDataFName(vfs, directory); } break; case DBFileType::NODE_INDEX: { - fName = getNodeIndexFName( - vfs, directory, dbFileID.nodeIndexID.tableID, FileVersionType::ORIGINAL); + fName = getNodeIndexFName(vfs, directory, dbFileID.nodeIndexID.tableID, + FileVersionType::ORIGINAL); if (dbFileID.isOverflow) { fName = getOverflowFileName(fName); } @@ -122,8 +122,8 @@ uint32_t StorageUtils::getDataTypeSize(const LogicalType& type) { } } -std::string StorageUtils::appendSuffixOrInsertBeforeWALSuffix( - const std::string& fileName, const std::string& suffix) { +std::string StorageUtils::appendSuffixOrInsertBeforeWALSuffix(const std::string& fileName, + const std::string& suffix) { auto pos = fileName.find(StorageConstants::WAL_FILE_SUFFIX); if (pos == std::string::npos) { return fileName + suffix; diff --git a/src/storage/store/chunked_node_group.cpp b/src/storage/store/chunked_node_group.cpp index 4f5f3ce4dc4..f3291c90fb5 100644 --- a/src/storage/store/chunked_node_group.cpp +++ b/src/storage/store/chunked_node_group.cpp @@ -46,8 +46,8 @@ void ChunkedCSRHeader::fillDefaultValues(offset_t newNumValues) const { offset->getNumValues() >= newNumValues && length->getNumValues() == offset->getNumValues()); } -ChunkedNodeGroup::ChunkedNodeGroup( - const std::vector& columnTypes, bool enableCompression, uint64_t capacity) +ChunkedNodeGroup::ChunkedNodeGroup(const std::vector& columnTypes, + bool enableCompression, uint64_t capacity) : nodeGroupIdx{UINT64_MAX}, numRows{0} { chunks.reserve(columnTypes.size()); for (auto& type : columnTypes) { @@ -56,8 +56,8 @@ ChunkedNodeGroup::ChunkedNodeGroup( } } -ChunkedNodeGroup::ChunkedNodeGroup( - const std::vector>& columns, bool enableCompression) +ChunkedNodeGroup::ChunkedNodeGroup(const std::vector>& columns, + bool enableCompression) : nodeGroupIdx{UINT64_MAX}, numRows{0} { chunks.reserve(columns.size()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { @@ -118,8 +118,8 @@ uint64_t ChunkedNodeGroup::append(const std::vector& columnVectors offset_t ChunkedNodeGroup::append(ChunkedNodeGroup* other, offset_t offsetInOtherNodeGroup) { KU_ASSERT(other->chunks.size() == chunks.size()); - auto numNodesToAppend = std::min( - other->numRows - offsetInOtherNodeGroup, StorageConstants::NODE_GROUP_SIZE - numRows); + auto numNodesToAppend = std::min(other->numRows - offsetInOtherNodeGroup, + StorageConstants::NODE_GROUP_SIZE - numRows); for (auto i = 0u; i < chunks.size(); i++) { chunks[i]->append(other->chunks[i].get(), offsetInOtherNodeGroup, numNodesToAppend); } @@ -127,8 +127,8 @@ offset_t ChunkedNodeGroup::append(ChunkedNodeGroup* other, offset_t offsetInOthe return numNodesToAppend; } -void ChunkedNodeGroup::write( - const std::vector>& data, column_id_t offsetColumnID) { +void ChunkedNodeGroup::write(const std::vector>& data, + column_id_t offsetColumnID) { KU_ASSERT(data.size() == chunks.size() + 1); auto& offsetChunk = data[offsetColumnID]; column_id_t columnID = 0, chunkIdx = 0; @@ -183,8 +183,8 @@ length_t ChunkedCSRHeader::getCSRLength(offset_t nodeOffset) const { return nodeOffset >= length->getNumValues() ? 0 : length->getValue(nodeOffset); } -ChunkedCSRNodeGroup::ChunkedCSRNodeGroup( - const std::vector& columnTypes, bool enableCompression) +ChunkedCSRNodeGroup::ChunkedCSRNodeGroup(const std::vector& columnTypes, + bool enableCompression) // By default, initialize all column chunks except for the csrOffsetChunk to empty, as they // should be resized after csr offset calculation (e.g., during RelBatchInsert). : ChunkedNodeGroup{columnTypes, enableCompression, 0 /* capacity */} { diff --git a/src/storage/store/chunked_node_group_collection.cpp b/src/storage/store/chunked_node_group_collection.cpp index 68ab9677f03..e21facf5a3f 100644 --- a/src/storage/store/chunked_node_group_collection.cpp +++ b/src/storage/store/chunked_node_group_collection.cpp @@ -5,8 +5,8 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -void ChunkedNodeGroupCollection::append( - const std::vector& vectors, const SelectionVector& selVector) { +void ChunkedNodeGroupCollection::append(const std::vector& vectors, + const SelectionVector& selVector) { if (chunkedGroups.empty()) { chunkedGroups.push_back( std::make_unique(types, false /*enableCompression*/, CHUNK_CAPACITY)); @@ -25,8 +25,8 @@ void ChunkedNodeGroupCollection::append( tmpSelVector.setToFiltered(numRowsToAppendInGroup); lastChunkedGroup->append(vectors, tmpSelVector, numRowsToAppendInGroup); if (lastChunkedGroup->getNumRows() == CHUNK_CAPACITY) { - chunkedGroups.push_back(std::make_unique( - types, false /*enableCompression*/, CHUNK_CAPACITY)); + chunkedGroups.push_back(std::make_unique(types, + false /*enableCompression*/, CHUNK_CAPACITY)); } numRowsAppended += numRowsToAppendInGroup; } diff --git a/src/storage/store/column.cpp b/src/storage/store/column.cpp index 619f1baee6b..776f6032e58 100644 --- a/src/storage/store/column.cpp +++ b/src/storage/store/column.cpp @@ -252,8 +252,8 @@ Column* Column::getNullColumn() { } // NOTE: This function should only be called on node tables. -void Column::batchLookup( - Transaction* transaction, const offset_t* nodeOffsets, size_t size, uint8_t* result) { +void Column::batchLookup(Transaction* transaction, const offset_t* nodeOffsets, size_t size, + uint8_t* result) { for (auto i = 0u; i < size; ++i) { auto nodeOffset = nodeOffsets[i]; auto [nodeGroupIdx, offsetInChunk] = @@ -284,15 +284,15 @@ void Column::scan(transaction::Transaction* transaction, node_group_idx_t nodeGr auto state = getReadState(transaction->getType(), nodeGroupIdx); auto pageCursor = getPageCursorForOffsetInGroup(startOffsetInGroup, state); auto numValuesToScan = endOffsetInGroup - startOffsetInGroup; - scanUnfiltered( - transaction, pageCursor, numValuesToScan, resultVector, state.metadata, offsetInVector); + scanUnfiltered(transaction, pageCursor, numValuesToScan, resultVector, state.metadata, + offsetInVector); } void Column::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, ColumnChunk* columnChunk, offset_t startOffset, offset_t endOffset) { if (nullColumn) { - nullColumn->scan( - transaction, nodeGroupIdx, columnChunk->getNullChunk(), startOffset, endOffset); + nullColumn->scan(transaction, nodeGroupIdx, columnChunk->getNullChunk(), startOffset, + endOffset); } if (nodeGroupIdx >= metadataDA->getNumElements(transaction->getType())) { columnChunk->setNumValues(0); @@ -315,8 +315,8 @@ void Column::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, Colum } KU_ASSERT((numValuesToScan + startOffset) <= chunkMetadata.numValues); while (numValuesScanned < numValuesToScan) { - auto numValuesToReadInPage = std::min( - numValuesPerPage - cursor.elemPosInPage, numValuesToScan - numValuesScanned); + auto numValuesToReadInPage = std::min(numValuesPerPage - cursor.elemPosInPage, + numValuesToScan - numValuesScanned); KU_ASSERT(isPageIdxValid(cursor.pageIdx, chunkMetadata)); readFromPage(transaction, cursor.pageIdx, [&](uint8_t* frame) -> void { readToPageFunc(frame, cursor, columnChunk->getData(), numValuesScanned, @@ -348,8 +348,8 @@ void Column::scan(Transaction* transaction, const ReadState& state, offset_t sta } } -void Column::scanInternal( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void Column::scanInternal(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { auto startNodeOffset = nodeIDVector->readNodeOffset(0); KU_ASSERT(startNodeOffset % DEFAULT_VECTOR_CAPACITY == 0); // TODO: replace with state @@ -414,16 +414,16 @@ void Column::scanFiltered(Transaction* transaction, PageCursor& pageCursor, } } -void Column::lookup( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void Column::lookup(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { if (nullColumn) { nullColumn->lookup(transaction, nodeIDVector, resultVector); } lookupInternal(transaction, nodeIDVector, resultVector); } -void Column::lookupInternal( - transaction::Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void Column::lookupInternal(transaction::Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { for (auto i = 0ul; i < nodeIDVector->state->selVector->selectedSize; i++) { auto pos = nodeIDVector->state->selVector->selectedPositions[i]; if (nodeIDVector->isNull(pos)) { @@ -441,13 +441,13 @@ void Column::lookupValue(transaction::Transaction* transaction, offset_t nodeOff auto chunkMeta = metadataDA->get(nodeGroupIdx, transaction->getType()); KU_ASSERT(isPageIdxValid(cursor.pageIdx, chunkMeta)); readFromPage(transaction, cursor.pageIdx, [&](uint8_t* frame) -> void { - readToVectorFunc( - frame, cursor, resultVector, posInVector, 1 /* numValuesToRead */, chunkMeta.compMeta); + readToVectorFunc(frame, cursor, resultVector, posInVector, 1 /* numValuesToRead */, + chunkMeta.compMeta); }); } -void Column::readFromPage( - Transaction* transaction, page_idx_t pageIdx, const std::function& func) { +void Column::readFromPage(Transaction* transaction, page_idx_t pageIdx, + const std::function& func) { // For constant compression, call read on a nullptr since there is no data on disk and // decompression only requires metadata if (pageIdx == INVALID_PAGE_IDX) { @@ -494,8 +494,8 @@ void Column::write(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, bool isNull = vectorToWriteFrom->isNull(posInVectorToWriteFrom); auto chunkMeta = metadataDA->get(nodeGroupIdx, TransactionType::WRITE); if (!isNull) { - writeValue( - chunkMeta, nodeGroupIdx, offsetInChunk, vectorToWriteFrom, posInVectorToWriteFrom); + writeValue(chunkMeta, nodeGroupIdx, offsetInChunk, vectorToWriteFrom, + posInVectorToWriteFrom); } if (offsetInChunk >= chunkMeta.numValues) { chunkMeta.numValues = offsetInChunk + 1; @@ -509,8 +509,8 @@ void Column::writeValue(const ColumnChunkMetadata& chunkMeta, node_group_idx_t n updatePageWithCursor( getPageCursorForOffset(TransactionType::WRITE, nodeGroupIdx, offsetInChunk), [&](auto frame, auto posInPage) { - writeFromVectorFunc( - frame, posInPage, vectorToWriteFrom, posInVectorToWriteFrom, chunkMeta.compMeta); + writeFromVectorFunc(frame, posInPage, vectorToWriteFrom, posInVectorToWriteFrom, + chunkMeta.compMeta); }); } @@ -542,8 +542,8 @@ void Column::writeValues(ReadState& state, common::offset_t dstOffset, const uin } } -offset_t Column::appendValues( - node_group_idx_t nodeGroupIdx, const uint8_t* data, offset_t numValues) { +offset_t Column::appendValues(node_group_idx_t nodeGroupIdx, const uint8_t* data, + offset_t numValues) { auto state = getReadState(TransactionType::WRITE, nodeGroupIdx); auto startOffset = state.metadata.numValues; auto numPages = dataFH->getNumPages(); @@ -561,8 +561,8 @@ PageCursor Column::getPageCursorForOffsetInGroup(offset_t offsetInChunk, const R return pageCursor; } -void Column::updatePageWithCursor( - PageCursor cursor, const std::function& writeOp) { +void Column::updatePageWithCursor(PageCursor cursor, + const std::function& writeOp) { bool insertingNewPage = false; if (cursor.pageIdx == INVALID_PAGE_IDX) { return writeOp(nullptr, cursor.elemPosInPage); @@ -575,8 +575,8 @@ void Column::updatePageWithCursor( *wal, [&](auto frame) { writeOp(frame, cursor.elemPosInPage); }); } -Column::ReadState Column::getReadState( - TransactionType transactionType, node_group_idx_t nodeGroupIdx) const { +Column::ReadState Column::getReadState(TransactionType transactionType, + node_group_idx_t nodeGroupIdx) const { auto metadata = metadataDA->get(nodeGroupIdx, transactionType); return {metadata, metadata.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)}; } @@ -640,8 +640,8 @@ void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t no auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; if (isNewNodeGroup) { - commitColumnChunkOutOfPlace( - transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, startSrcOffset); + commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, + startSrcOffset); } else { bool didInPlaceCommit = false; // If this is not a new node group, we should first check if we can perform in-place commit. @@ -649,14 +649,14 @@ void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t no commitColumnChunkInPlace(nodeGroupIdx, dstOffsets, chunk, startSrcOffset); didInPlaceCommit = true; } else { - commitColumnChunkOutOfPlace( - transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, startSrcOffset); + commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, + chunk, startSrcOffset); } if (nullColumn) { - if (nullColumn->canCommitInPlace( - transaction, nodeGroupIdx, dstOffsets, chunk->getNullChunk(), startSrcOffset)) { - nullColumn->commitColumnChunkInPlace( - nodeGroupIdx, dstOffsets, chunk->getNullChunk(), startSrcOffset); + if (nullColumn->canCommitInPlace(transaction, nodeGroupIdx, dstOffsets, + chunk->getNullChunk(), startSrcOffset)) { + nullColumn->commitColumnChunkInPlace(nodeGroupIdx, dstOffsets, + chunk->getNullChunk(), startSrcOffset); } else if (didInPlaceCommit) { nullColumn->commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk->getNullChunk(), startSrcOffset); @@ -665,8 +665,8 @@ void Column::prepareCommitForChunk(Transaction* transaction, node_group_idx_t no } } -bool Column::isInsertionsOutOfPagesCapacity( - const ColumnChunkMetadata& metadata, const offset_to_row_idx_t& insertInfo) { +bool Column::isInsertionsOutOfPagesCapacity(const ColumnChunkMetadata& metadata, + const offset_to_row_idx_t& insertInfo) { auto maxOffset = 0u; for (auto& [offset, rowIdx] : insertInfo) { if (offset > maxOffset) { @@ -676,8 +676,8 @@ bool Column::isInsertionsOutOfPagesCapacity( return isMaxOffsetOutOfPagesCapacity(metadata, maxOffset); } -bool Column::isMaxOffsetOutOfPagesCapacity( - const ColumnChunkMetadata& metadata, offset_t maxOffset) { +bool Column::isMaxOffsetOutOfPagesCapacity(const ColumnChunkMetadata& metadata, + offset_t maxOffset) { if (metadata.compMeta.compression != CompressionType::CONSTANT && (metadata.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType) * metadata.numPages) <= (maxOffset + 1)) { @@ -702,8 +702,8 @@ bool Column::checkUpdateInPlace(const ColumnChunkMetadata& metadata, localChunks[chunkIdx]->getNullChunk()->isNull(offsetInLocalChunk)) { continue; } - if (!metadata.compMeta.canUpdateInPlace( - localChunks[chunkIdx]->getData(), offsetInLocalChunk, dataType.getPhysicalType())) { + if (!metadata.compMeta.canUpdateInPlace(localChunks[chunkIdx]->getData(), + offsetInLocalChunk, dataType.getPhysicalType())) { return false; } } @@ -736,8 +736,8 @@ bool Column::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGro return true; } for (auto i = 0u; i < dstOffsets.size(); i++) { - if (!metadata.compMeta.canUpdateInPlace( - chunk->getData(), srcOffset + i, dataType.getPhysicalType())) { + if (!metadata.compMeta.canUpdateInPlace(chunk->getData(), srcOffset + i, + dataType.getPhysicalType())) { return false; } } @@ -817,8 +817,8 @@ void Column::applyLocalChunkToColumnChunk(const ChunkCollection& localChunks, for (auto& [offsetInDstChunk, rowIdx] : updateInfo) { auto [chunkIdx, offsetInLocalChunk] = LocalChunkedGroupCollection::getChunkIdxAndOffsetInChunk(rowIdx); - columnChunk->write( - localChunks[chunkIdx], offsetInLocalChunk, offsetInDstChunk, 1 /* numValues */); + columnChunk->write(localChunks[chunkIdx], offsetInLocalChunk, offsetInDstChunk, + 1 /* numValues */); } } @@ -868,8 +868,8 @@ void Column::populateWithDefaultVal(Transaction* transaction, capacity *= CHUNK_RESIZE_RATIO; } if (capacity > columnChunk->getCapacity()) { - auto newColumnChunk = ColumnChunkFactory::createColumnChunk( - *dataType.copy(), enableCompression, capacity); + auto newColumnChunk = ColumnChunkFactory::createColumnChunk(*dataType.copy(), + enableCompression, capacity); newColumnChunk->populateWithDefaultVal(defaultValueVector); newColumnChunk->setNumValues(chunkMeta.numValues); append(newColumnChunk.get(), i); @@ -880,8 +880,8 @@ void Column::populateWithDefaultVal(Transaction* transaction, } } -PageCursor Column::getPageCursorForOffset( - TransactionType transactionType, node_group_idx_t nodeGroupIdx, offset_t offsetInChunk) { +PageCursor Column::getPageCursorForOffset(TransactionType transactionType, + node_group_idx_t nodeGroupIdx, offset_t offsetInChunk) { auto state = getReadState(transactionType, nodeGroupIdx); return getPageCursorForOffsetInGroup(offsetInChunk, state); } @@ -944,8 +944,8 @@ std::unique_ptr ColumnFactory::createColumn(std::string name, LogicalTyp metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); } case LogicalTypeID::SERIAL: { - return std::make_unique( - name, metaDAHeaderInfo, dataFH, metadataFH, bufferManager, wal, transaction); + return std::make_unique(name, metaDAHeaderInfo, dataFH, metadataFH, + bufferManager, wal, transaction); } default: { KU_UNREACHABLE; diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 4ab880d38ef..0f64270cc27 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -18,20 +18,20 @@ namespace storage { ColumnChunkMetadata fixedSizedFlushBuffer(const uint8_t* buffer, uint64_t bufferSize, BMFileHandle* dataFH, page_idx_t startPageIdx, const ColumnChunkMetadata& metadata) { KU_ASSERT(dataFH->getNumPages() >= startPageIdx + metadata.numPages); - dataFH->getFileInfo()->writeFile( - buffer, bufferSize, startPageIdx * BufferPoolConstants::PAGE_4KB_SIZE); - return ColumnChunkMetadata( - startPageIdx, metadata.numPages, metadata.numValues, metadata.compMeta); + dataFH->getFileInfo()->writeFile(buffer, bufferSize, + startPageIdx * BufferPoolConstants::PAGE_4KB_SIZE); + return ColumnChunkMetadata(startPageIdx, metadata.numPages, metadata.numValues, + metadata.compMeta); } -ColumnChunkMetadata fixedSizedGetMetadata( - const uint8_t* /*buffer*/, uint64_t bufferSize, uint64_t /*capacity*/, uint64_t numValues) { +ColumnChunkMetadata fixedSizedGetMetadata(const uint8_t* /*buffer*/, uint64_t bufferSize, + uint64_t /*capacity*/, uint64_t numValues) { return ColumnChunkMetadata(INVALID_PAGE_IDX, ColumnChunk::getNumPagesForBytes(bufferSize), numValues, CompressionMetadata()); } -ColumnChunkMetadata booleanGetMetadata( - const uint8_t* /*buffer*/, uint64_t bufferSize, uint64_t /*capacity*/, uint64_t numValues) { +ColumnChunkMetadata booleanGetMetadata(const uint8_t* /*buffer*/, uint64_t bufferSize, + uint64_t /*capacity*/, uint64_t numValues) { return ColumnChunkMetadata(INVALID_PAGE_IDX, ColumnChunk::getNumPagesForBytes(bufferSize), numValues, CompressionMetadata(CompressionType::BOOLEAN_BITPACKING)); } @@ -83,8 +83,8 @@ class CompressedFlushBuffer { BufferPoolConstants::PAGE_4KB_SIZE, (startPageIdx + metadata.numPages - 1) * BufferPoolConstants::PAGE_4KB_SIZE); } - return ColumnChunkMetadata( - startPageIdx, metadata.numPages, metadata.numValues, metadata.compMeta); + return ColumnChunkMetadata(startPageIdx, metadata.numPages, metadata.numValues, + metadata.compMeta); } }; @@ -98,8 +98,8 @@ class GetCompressionMetadata { GetCompressionMetadata(const GetCompressionMetadata& other) = default; - ColumnChunkMetadata operator()( - const uint8_t* buffer, uint64_t /*bufferSize*/, uint64_t capacity, uint64_t numValues) { + ColumnChunkMetadata operator()(const uint8_t* buffer, uint64_t /*bufferSize*/, + uint64_t capacity, uint64_t numValues) { auto metadata = alg->getCompressionMetadata(buffer, numValues); auto numValuesPerPage = metadata.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType); auto numPages = capacity / numValuesPerPage + (capacity % numValuesPerPage == 0 ? 0 : 1); @@ -107,8 +107,8 @@ class GetCompressionMetadata { } }; -static std::shared_ptr getCompression( - const LogicalType& dataType, bool enableCompression) { +static std::shared_ptr getCompression(const LogicalType& dataType, + bool enableCompression) { if (!enableCompression) { return std::make_shared(dataType); } @@ -146,11 +146,10 @@ static std::shared_ptr getCompression( } } -ColumnChunk::ColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression, bool hasNullChunk) - : dataType{std::move(dataType)}, - numBytesPerValue{getDataTypeSizeInChunk(this->dataType)}, numValues{0}, - enableCompression(enableCompression) { +ColumnChunk::ColumnChunk(LogicalType dataType, uint64_t capacity, bool enableCompression, + bool hasNullChunk) + : dataType{std::move(dataType)}, numBytesPerValue{getDataTypeSizeInChunk(this->dataType)}, + numValues{0}, enableCompression(enableCompression) { if (hasNullChunk) { nullChunk = std::make_unique(capacity, enableCompression); } @@ -216,8 +215,8 @@ void ColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) numValues += selVector.selectedSize; } -void ColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void ColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { KU_ASSERT(other->dataType.getPhysicalType() == dataType.getPhysicalType()); if (nullChunk) { KU_ASSERT(nullChunk->getNumValues() == getNumValues()); @@ -230,8 +229,8 @@ void ColumnChunk::append( numValues += numValuesToAppend; } -void ColumnChunk::lookup( - offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { +void ColumnChunk::lookup(offset_t offsetInChunk, ValueVector& output, + sel_t posInOutputVector) const { KU_ASSERT(offsetInChunk < capacity); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); if (!output.isNull(posInOutputVector)) { @@ -349,8 +348,8 @@ offset_t ColumnChunk::getOffsetInBuffer(offset_t pos) const { return offsetInBuffer; } -void ColumnChunk::copyVectorToBuffer( - ValueVector* vector, offset_t startPosInChunk, const SelectionVector& selVector) { +void ColumnChunk::copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk, + const SelectionVector& selVector) { auto bufferToWrite = buffer.get() + startPosInChunk * numBytesPerValue; KU_ASSERT(startPosInChunk + selVector.selectedSize <= capacity); auto vectorDataToWriteFrom = vector->getData(); @@ -405,8 +404,8 @@ ColumnChunkMetadata ColumnChunk::getMetadataToFlush() const { return getMetadataFunction(buffer.get(), bufferSize, capacity, numValues); } -ColumnChunkMetadata ColumnChunk::flushBuffer( - BMFileHandle* dataFH, page_idx_t startPageIdx, const ColumnChunkMetadata& metadata) { +ColumnChunkMetadata ColumnChunk::flushBuffer(BMFileHandle* dataFH, page_idx_t startPageIdx, + const ColumnChunkMetadata& metadata) { if (!metadata.compMeta.isConstant()) { KU_ASSERT(bufferSize == getBufferSize(capacity)); return flushBufferFunction(buffer.get(), bufferSize, dataFH, startPageIdx, metadata); @@ -436,8 +435,8 @@ void BoolColumnChunk::append(ValueVector* vector, const SelectionVector& selVect numValues += selVector.selectedSize; } -void BoolColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void BoolColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { NullMask::copyNullMask((uint64_t*)static_cast(other)->buffer.get(), startPosInOtherChunk, (uint64_t*)buffer.get(), numValues, numValuesToAppend); if (nullChunk) { @@ -446,18 +445,18 @@ void BoolColumnChunk::append( numValues += numValuesToAppend; } -void BoolColumnChunk::lookup( - offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { +void BoolColumnChunk::lookup(offset_t offsetInChunk, ValueVector& output, + sel_t posInOutputVector) const { KU_ASSERT(offsetInChunk < capacity); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); if (!output.isNull(posInOutputVector)) { - output.setValue( - posInOutputVector, NullMask::isNull((uint64_t*)buffer.get(), offsetInChunk)); + output.setValue(posInOutputVector, + NullMask::isNull((uint64_t*)buffer.get(), offsetInChunk)); } } -void BoolColumnChunk::write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { +void BoolColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::BOOL && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); @@ -485,8 +484,8 @@ void BoolColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset void BoolColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offset_t dstOffsetInChunk, offset_t numValuesToCopy) { if (nullChunk) { - nullChunk->write( - srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); + nullChunk->write(srcChunk->getNullChunk(), srcOffsetInChunk, dstOffsetInChunk, + numValuesToCopy); } if ((dstOffsetInChunk + numValuesToCopy) >= numValues) { numValues = dstOffsetInChunk + numValuesToCopy; @@ -521,8 +520,8 @@ void NullColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, srcOffsetInChunk, dstOffsetInChunk, numValuesToCopy); } -void NullColumnChunk::append( - ColumnChunk* other, offset_t startOffsetInOtherChunk, uint32_t numValuesToAppend) { +void NullColumnChunk::append(ColumnChunk* other, offset_t startOffsetInOtherChunk, + uint32_t numValuesToAppend) { copyFromBuffer((uint64_t*)static_cast(other)->buffer.get(), startOffsetInOtherChunk, numValues, numValuesToAppend); numValues += numValuesToAppend; @@ -566,8 +565,8 @@ class InternalIDColumnChunk final : public ColumnChunk { } } - void copyInt64VectorToBuffer( - ValueVector* vector, offset_t startPosInChunk, const common::SelectionVector& selVector) { + void copyInt64VectorToBuffer(ValueVector* vector, offset_t startPosInChunk, + const common::SelectionVector& selVector) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INT64); for (auto i = 0u; i < selVector.selectedSize; i++) { auto pos = selVector.selectedPositions[i]; @@ -577,8 +576,8 @@ class InternalIDColumnChunk final : public ColumnChunk { } } - void lookup( - offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const override { + void lookup(offset_t offsetInChunk, ValueVector& output, + sel_t posInOutputVector) const override { KU_ASSERT(offsetInChunk < capacity); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); if (!output.isNull(posInOutputVector)) { @@ -612,8 +611,8 @@ class InternalIDColumnChunk final : public ColumnChunk { }; // TODO(Guodong): Change the input param `dataType` to PhysicalType. -std::unique_ptr ColumnChunkFactory::createColumnChunk( - LogicalType dataType, bool enableCompression, uint64_t capacity, bool inMemory) { +std::unique_ptr ColumnChunkFactory::createColumnChunk(LogicalType dataType, + bool enableCompression, uint64_t capacity, bool inMemory) { switch (dataType.getPhysicalType()) { case PhysicalTypeID::BOOL: { return std::make_unique(capacity, enableCompression); @@ -639,16 +638,16 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( return std::make_unique(capacity, enableCompression); } case PhysicalTypeID::STRING: { - return std::make_unique( - std::move(dataType), capacity, enableCompression, inMemory); + return std::make_unique(std::move(dataType), capacity, enableCompression, + inMemory); } case PhysicalTypeID::LIST: { - return std::make_unique( - std::move(dataType), capacity, enableCompression, inMemory); + return std::make_unique(std::move(dataType), capacity, enableCompression, + inMemory); } case PhysicalTypeID::STRUCT: { - return std::make_unique( - std::move(dataType), capacity, enableCompression, inMemory); + return std::make_unique(std::move(dataType), capacity, enableCompression, + inMemory); } default: KU_UNREACHABLE; diff --git a/src/storage/store/dictionary_chunk.cpp b/src/storage/store/dictionary_chunk.cpp index 8f6f853e689..1fdc3b1e4b1 100644 --- a/src/storage/store/dictionary_chunk.cpp +++ b/src/storage/store/dictionary_chunk.cpp @@ -22,10 +22,10 @@ DictionaryChunk::DictionaryChunk(uint64_t capacity, bool enableCompression) : enableCompression{enableCompression}, indexTable(0, StringOps(this) /*hash*/, StringOps(this) /*equals*/) { // Bitpacking might save 1 bit per value with regular ascii compared to UTF-8 - stringDataChunk = ColumnChunkFactory::createColumnChunk( - *LogicalType::UINT8(), false /*enableCompression*/, capacity); - offsetChunk = ColumnChunkFactory::createColumnChunk( - *LogicalType::UINT64(), enableCompression, capacity * OFFSET_CHUNK_CAPACITY_FACTOR); + stringDataChunk = ColumnChunkFactory::createColumnChunk(*LogicalType::UINT8(), + false /*enableCompression*/, capacity); + offsetChunk = ColumnChunkFactory::createColumnChunk(*LogicalType::UINT64(), enableCompression, + capacity * OFFSET_CHUNK_CAPACITY_FACTOR); } void DictionaryChunk::resetToEmpty() { diff --git a/src/storage/store/dictionary_column.cpp b/src/storage/store/dictionary_column.cpp index 0e252868206..38b4b79f514 100644 --- a/src/storage/store/dictionary_column.cpp +++ b/src/storage/store/dictionary_column.cpp @@ -30,8 +30,8 @@ void DictionaryColumn::append(node_group_idx_t nodeGroupIdx, const DictionaryChu offsetColumn->append(dictChunk.getOffsetChunk(), nodeGroupIdx); } -void DictionaryColumn::scan( - Transaction* transaction, node_group_idx_t nodeGroupIdx, DictionaryChunk& dictChunk) { +void DictionaryColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, + DictionaryChunk& dictChunk) { auto dataMetadata = dataColumn->getMetadata(nodeGroupIdx, transaction->getType()); // Make sure that the chunk is large enough auto stringDataChunk = dictChunk.getStringDataChunk(); @@ -100,10 +100,10 @@ void DictionaryColumn::scan(Transaction* transaction, node_group_idx_t nodeGroup } string_index_t DictionaryColumn::append(node_group_idx_t nodeGroupIdx, std::string_view val) { - auto startOffset = dataColumn->appendValues( - nodeGroupIdx, reinterpret_cast(val.data()), val.size()); - return offsetColumn->appendValues( - nodeGroupIdx, reinterpret_cast(&startOffset), 1 /*numValues*/); + auto startOffset = dataColumn->appendValues(nodeGroupIdx, + reinterpret_cast(val.data()), val.size()); + return offsetColumn->appendValues(nodeGroupIdx, reinterpret_cast(&startOffset), + 1 /*numValues*/); } void DictionaryColumn::prepareCommit() { @@ -159,8 +159,8 @@ bool DictionaryColumn::canCommitInPlace(Transaction* transaction, node_group_idx return true; } -bool DictionaryColumn::canDataCommitInPlace( - Transaction* transaction, node_group_idx_t nodeGroupIdx, uint64_t totalStringLengthToAdd) { +bool DictionaryColumn::canDataCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, + uint64_t totalStringLengthToAdd) { // Make sure there is sufficient space in the data chunk (not currently compressed) auto dataColumnMetadata = dataColumn->getMetadata(nodeGroupIdx, transaction->getType()); auto totalStringDataAfterUpdate = dataColumnMetadata.numValues + totalStringLengthToAdd; @@ -207,8 +207,8 @@ bool DictionaryColumn::canOffsetCommitInPlace(Transaction* transaction, return true; } -uint64_t DictionaryColumn::getNumValuesInOffsets( - Transaction* transaction, node_group_idx_t nodeGroupIdx) { +uint64_t DictionaryColumn::getNumValuesInOffsets(Transaction* transaction, + node_group_idx_t nodeGroupIdx) { return offsetColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues; } diff --git a/src/storage/store/list_column.cpp b/src/storage/store/list_column.cpp index df0c01d9227..47189aa20b7 100644 --- a/src/storage/store/list_column.cpp +++ b/src/storage/store/list_column.cpp @@ -152,8 +152,8 @@ void ListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, } } -void ListColumn::scanInternal( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void ListColumn::scanInternal(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { resultVector->resetAuxiliaryBuffer(); auto startNodeOffset = nodeIDVector->readNodeOffset(0); auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(startNodeOffset); @@ -264,8 +264,8 @@ void ListColumn::rollbackInMemory() { dataColumn->rollbackInMemory(); } -offset_t ListColumn::readOffset( - Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t offsetInNodeGroup) { +offset_t ListColumn::readOffset(Transaction* transaction, node_group_idx_t nodeGroupIdx, + offset_t offsetInNodeGroup) { auto chunkMeta = metadataDA->get(nodeGroupIdx, transaction->getType()); auto pageCursor = PageUtils::getPageCursorForPos(offsetInNodeGroup, chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)); @@ -278,8 +278,8 @@ offset_t ListColumn::readOffset( return value; } -list_size_t ListColumn::readSize( - Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t offsetInNodeGroup) { +list_size_t ListColumn::readSize(Transaction* transaction, node_group_idx_t nodeGroupIdx, + offset_t offsetInNodeGroup) { auto chunkMeta = sizeColumn->getMetadataDA()->get(nodeGroupIdx, transaction->getType()); auto pageCursor = PageUtils::getPageCursorForPos(offsetInNodeGroup, chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)); @@ -295,10 +295,10 @@ list_size_t ListColumn::readSize( ListOffsetSizeInfo ListColumn::getListOffsetSizeInfo(Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t startOffsetInNodeGroup, offset_t endOffsetInNodeGroup) { auto numOffsetsToRead = endOffsetInNodeGroup - startOffsetInNodeGroup; - auto offsetColumnChunk = ColumnChunkFactory::createColumnChunk( - *common::LogicalType::INT64(), enableCompression, numOffsetsToRead); - auto sizeColumnChunk = ColumnChunkFactory::createColumnChunk( - *common::LogicalType::UINT32(), enableCompression, numOffsetsToRead); + auto offsetColumnChunk = ColumnChunkFactory::createColumnChunk(*common::LogicalType::INT64(), + enableCompression, numOffsetsToRead); + auto sizeColumnChunk = ColumnChunkFactory::createColumnChunk(*common::LogicalType::UINT32(), + enableCompression, numOffsetsToRead); Column::scan(transaction, nodeGroupIdx, offsetColumnChunk.get(), startOffsetInNodeGroup, endOffsetInNodeGroup); sizeColumn->scan(transaction, nodeGroupIdx, sizeColumnChunk.get(), startOffsetInNodeGroup, @@ -341,14 +341,14 @@ void ListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_ auto currentNumNodeGroups = metadataDA->getNumElements(transaction->getType()); auto isNewNodeGroup = nodeGroupIdx >= currentNumNodeGroups; if (isNewNodeGroup) { - commitColumnChunkOutOfPlace( - transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, startSrcOffset); + commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, + startSrcOffset); } else { // we separate the commit into three parts: offset chunk commit, size column chunk commit, // data column chunk auto listChunk = ku_dynamic_cast(chunk); - sizeColumn->prepareCommitForChunk( - transaction, nodeGroupIdx, dstOffsets, listChunk->getSizeColumnChunk(), startSrcOffset); + sizeColumn->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, + listChunk->getSizeColumnChunk(), startSrcOffset); auto dataColumnSize = dataColumn->getMetadata(nodeGroupIdx, transaction->getType()).numValues; auto dataColumnChunk = listChunk->getDataColumnChunk(); @@ -361,8 +361,8 @@ void ListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_ dstOffsetsInDataColumn.push_back(dataColumnSize + dataSize++); } } - dataColumn->prepareCommitForChunk( - transaction, nodeGroupIdx, dstOffsetsInDataColumn, dataColumnChunk, startListOffset); + dataColumn->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsetsInDataColumn, + dataColumnChunk, startListOffset); // we need to update the offset since we do not do in-place list data update but append data // in the end of list data column we need to plus to original data column size to get the // new offset diff --git a/src/storage/store/list_column_chunk.cpp b/src/storage/store/list_column_chunk.cpp index 6797aa8ac31..e3b80d29a9e 100644 --- a/src/storage/store/list_column_chunk.cpp +++ b/src/storage/store/list_column_chunk.cpp @@ -25,11 +25,11 @@ void ListDataColumnChunk::resizeBuffer(uint64_t numValues) { dataColumnChunk->resize(capacity); } -ListColumnChunk::ListColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) +ListColumnChunk::ListColumnChunk(LogicalType dataType, uint64_t capacity, bool enableCompression, + bool inMemory) : ColumnChunk{std::move(dataType), capacity, enableCompression, true /* hasNullChunk */} { - sizeColumnChunk = ColumnChunkFactory::createColumnChunk( - *common::LogicalType::UINT32(), enableCompression, capacity); + sizeColumnChunk = ColumnChunkFactory::createColumnChunk(*common::LogicalType::UINT32(), + enableCompression, capacity); listDataColumnChunk = std::make_unique( ColumnChunkFactory::createColumnChunk(*ListType::getChildType(&this->dataType)->copy(), enableCompression, 0 /* capacity */, inMemory)); @@ -37,8 +37,8 @@ ListColumnChunk::ListColumnChunk( KU_ASSERT(this->dataType.getPhysicalType() == PhysicalTypeID::LIST); } -bool ListColumnChunk::isOffsetsConsecutiveAndSortedAscending( - uint64_t startPos, uint64_t endPos) const { +bool ListColumnChunk::isOffsetsConsecutiveAndSortedAscending(uint64_t startPos, + uint64_t endPos) const { offset_t prevEndOffset = getListStartOffset(startPos); for (auto i = startPos; i < endPos; i++) { offset_t currentEndOffset = getListEndOffset(i); @@ -72,13 +72,13 @@ list_size_t ListColumnChunk::getListSize(common::offset_t offset) const { return sizeColumnChunk->getValue(offset); } -void ListColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void ListColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { checkOffsetSortedAsc = true; auto otherListChunk = ku_dynamic_cast(other); nullChunk->append(other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); - sizeColumnChunk->getNullChunk()->append( - other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); + sizeColumnChunk->getNullChunk()->append(other->getNullChunk(), startPosInOtherChunk, + numValuesToAppend); offset_t offsetInDataChunkToAppend = listDataColumnChunk->getNumValues(); for (auto i = 0u; i < numValuesToAppend; i++) { auto appendSize = otherListChunk->getListSize(startPosInOtherChunk + i); @@ -99,9 +99,9 @@ void ListColumnChunk::append( void ListColumnChunk::resetToEmpty() { ColumnChunk::resetToEmpty(); sizeColumnChunk->resetToEmpty(); - listDataColumnChunk = - std::make_unique(ColumnChunkFactory::createColumnChunk( - *ListType::getChildType(&this->dataType)->copy(), enableCompression, 0 /* capacity */)); + listDataColumnChunk = std::make_unique( + ColumnChunkFactory::createColumnChunk(*ListType::getChildType(&this->dataType)->copy(), + enableCompression, 0 /* capacity */)); } void ListColumnChunk::append(ValueVector* vector, const SelectionVector& selVector) { @@ -150,8 +150,8 @@ void ListColumnChunk::appendNullList() { numValues++; } -void ListColumnChunk::lookup( - offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { +void ListColumnChunk::lookup(offset_t offsetInChunk, ValueVector& output, + sel_t posInOutputVector) const { KU_ASSERT(offsetInChunk < numValues); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); if (output.isNull(posInOutputVector)) { @@ -168,8 +168,8 @@ void ListColumnChunk::lookup( } } -void ListColumnChunk::write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { +void ListColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == dataType.getPhysicalType() && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); @@ -240,10 +240,10 @@ void ListColumnChunk::write(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, offsetInDataChunkToAppend += appendSize; sizeColumnChunk->setValue(appendSize, dstOffsetInChunk + i); setValue(offsetInDataChunkToAppend, dstOffsetInChunk + i); - nullChunk->setNull( - dstOffsetInChunk + i, srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); - sizeColumnChunk->getNullChunk()->setNull( - dstOffsetInChunk + i, srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); + nullChunk->setNull(dstOffsetInChunk + i, + srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); + sizeColumnChunk->getNullChunk()->setNull(dstOffsetInChunk + i, + srcListChunk->nullChunk->isNull(srcOffsetInChunk + i)); } listDataColumnChunk->resizeBuffer(offsetInDataChunkToAppend); for (auto i = 0u; i < numValuesToCopy; i++) { @@ -294,8 +294,8 @@ void ListColumnChunk::resetOffset() { void ListColumnChunk::finalize() { // rewrite the column chunk for better scanning performance - auto newColumnChunk = ColumnChunkFactory::createColumnChunk( - std::move(*dataType.copy()), enableCompression, capacity); + auto newColumnChunk = ColumnChunkFactory::createColumnChunk(std::move(*dataType.copy()), + enableCompression, capacity); uint64_t totalListLen = listDataColumnChunk->getNumValues(); uint64_t resizeThreshold = listDataColumnChunk->capacity / 2; // if the list is not very long, we do not need to rewrite @@ -323,8 +323,8 @@ void ListColumnChunk::finalize() { } else { auto startOffset = getListStartOffset(i); auto listSize = getListSize(i); - dataColumnChunk->append( - listDataColumnChunk->dataColumnChunk.get(), startOffset, listSize); + dataColumnChunk->append(listDataColumnChunk->dataColumnChunk.get(), startOffset, + listSize); offsetInChunk += listSize; newListChunk->getNullChunk()->setNull(currentIndex, false); newListChunk->sizeColumnChunk->getNullChunk()->setNull(currentIndex, false); diff --git a/src/storage/store/node_table.cpp b/src/storage/store/node_table.cpp index a6d1b1d6a73..4a85880909a 100644 --- a/src/storage/store/node_table.cpp +++ b/src/storage/store/node_table.cpp @@ -27,8 +27,8 @@ NodeTable::NodeTable(BMFileHandle* dataFH, BMFileHandle* metadataFH, initializePKIndex(nodeTableEntry, readOnly, vfs); } -void NodeTable::initializePKIndex( - NodeTableCatalogEntry* nodeTableEntry, bool readOnly, VirtualFileSystem* vfs) { +void NodeTable::initializePKIndex(NodeTableCatalogEntry* nodeTableEntry, bool readOnly, + VirtualFileSystem* vfs) { if (nodeTableEntry->getPrimaryKey()->getDataType()->getLogicalTypeID() != LogicalTypeID::SERIAL) { pkIndex = std::make_unique( @@ -47,8 +47,8 @@ void NodeTable::read(Transaction* transaction, TableReadState& readState) { } void NodeTable::scan(Transaction* transaction, TableReadState& readState) { - tableData->scan( - transaction, *readState.dataReadState, readState.nodeIDVector, readState.outputVectors); + tableData->scan(transaction, *readState.dataReadState, readState.nodeIDVector, + readState.outputVectors); if (transaction->isWriteTransaction()) { auto localTable = transaction->getLocalStorage()->getLocalTable(tableID); if (localTable) { @@ -58,8 +58,8 @@ void NodeTable::scan(Transaction* transaction, TableReadState& readState) { } void NodeTable::lookup(Transaction* transaction, TableReadState& readState) { - tableData->lookup( - transaction, *readState.dataReadState, readState.nodeIDVector, readState.outputVectors); + tableData->lookup(transaction, *readState.dataReadState, readState.nodeIDVector, + readState.outputVectors); if (transaction->isWriteTransaction()) { auto localTable = transaction->getLocalStorage()->getLocalTable(tableID); if (localTable) { @@ -68,8 +68,8 @@ void NodeTable::lookup(Transaction* transaction, TableReadState& readState) { } } -offset_t NodeTable::validateUniquenessConstraint( - Transaction* tx, const std::vector& propertyVectors) { +offset_t NodeTable::validateUniquenessConstraint(Transaction* tx, + const std::vector& propertyVectors) { if (pkIndex == nullptr) { return INVALID_OFFSET; } @@ -95,8 +95,8 @@ void NodeTable::insert(Transaction* transaction, TableInsertState& insertState) if (pkIndex) { insertPK(nodeInsertState.nodeIDVector, nodeInsertState.pkVector); } - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); localTable->insert(insertState); } @@ -110,8 +110,8 @@ void NodeTable::update(Transaction* transaction, TableUpdateState& updateState) updatePK(transaction, updateState.columnID, nodeUpdateState.nodeIDVector, updateState.propertyVector); } - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); localTable->update(updateState); } @@ -134,13 +134,13 @@ void NodeTable::delete_(Transaction* transaction, TableDeleteState& deleteState) auto nodeOffset = nodeDeleteState.nodeIDVector.readNodeOffset(pos); ku_dynamic_cast(tablesStatistics) ->deleteNode(tableID, nodeOffset); - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); localTable->delete_(deleteState); } -void NodeTable::addColumn( - Transaction* transaction, const Property& property, ValueVector* defaultValueVector) { +void NodeTable::addColumn(Transaction* transaction, const Property& property, + ValueVector* defaultValueVector) { auto nodesStats = ku_dynamic_cast(tablesStatistics); nodesStats->setPropertyStatisticsForTable(tableID, property.getPropertyID(), diff --git a/src/storage/store/node_table_data.cpp b/src/storage/store/node_table_data.cpp index 45ffb39c2e5..4dbaed168cd 100644 --- a/src/storage/store/node_table_data.cpp +++ b/src/storage/store/node_table_data.cpp @@ -39,8 +39,8 @@ void NodeTableData::scan(Transaction* transaction, TableDataReadState& readState outputVectors[i]->setAllNull(); } else { KU_ASSERT(readState.columnIDs[i] < columns.size()); - columns[readState.columnIDs[i]]->scan( - transaction, const_cast(&nodeIDVector), outputVectors[i]); + columns[readState.columnIDs[i]]->scan(transaction, + const_cast(&nodeIDVector), outputVectors[i]); } } } @@ -54,8 +54,8 @@ void NodeTableData::lookup(Transaction* transaction, TableDataReadState& readSta outputVectors[i]->setNull(pos, true); } else { KU_ASSERT(readState.columnIDs[i] < columns.size()); - columns[readState.columnIDs[i]]->lookup( - transaction, const_cast(&nodeIDVector), outputVectors[i]); + columns[readState.columnIDs[i]]->lookup(transaction, + const_cast(&nodeIDVector), outputVectors[i]); } } } @@ -68,8 +68,8 @@ void NodeTableData::append(ChunkedNodeGroup* nodeGroup) { } } -void NodeTableData::prepareLocalTableToCommit( - Transaction* transaction, LocalTableData* localTable) { +void NodeTableData::prepareLocalTableToCommit(Transaction* transaction, + LocalTableData* localTable) { for (auto& [nodeGroupIdx, localNodeGroup] : localTable->nodeGroups) { for (auto columnID = 0u; columnID < columns.size(); columnID++) { auto column = columns[columnID].get(); diff --git a/src/storage/store/null_column.cpp b/src/storage/store/null_column.cpp index 6a1fddf54d5..352689bdcef 100644 --- a/src/storage/store/null_column.cpp +++ b/src/storage/store/null_column.cpp @@ -17,8 +17,8 @@ struct NullColumnFunc { auto value = ConstantCompression::getValue(metadata); resultVector->setNullRange(posInVector, numValuesToRead, value); } else { - resultVector->setNullFromBits( - (uint64_t*)frame, pageCursor.elemPosInPage, posInVector, numValuesToRead); + resultVector->setNullFromBits((uint64_t*)frame, pageCursor.elemPosInPage, posInVector, + numValuesToRead); } } @@ -46,8 +46,8 @@ NullColumn::NullColumn(std::string name, page_idx_t metaDAHPageIdx, BMFileHandle batchLookupFunc = nullptr; } -void NullColumn::scan( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void NullColumn::scan(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { if (propertyStatistics.mayHaveNull(*transaction)) { scanInternal(transaction, nodeIDVector, resultVector); } else { @@ -62,8 +62,8 @@ void NullColumn::scan(transaction::Transaction* transaction, node_group_idx_t no Column::scan(transaction, nodeGroupIdx, startOffsetInGroup, endOffsetInGroup, resultVector, offsetInVector); } else { - resultVector->setNullRange( - offsetInVector, endOffsetInGroup - startOffsetInGroup, false /*set non-null*/); + resultVector->setNullRange(offsetInVector, endOffsetInGroup - startOffsetInGroup, + false /*set non-null*/); } } @@ -85,8 +85,8 @@ void NullColumn::scan(transaction::Transaction* transaction, node_group_idx_t no } } -void NullColumn::lookup( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void NullColumn::lookup(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { if (propertyStatistics.mayHaveNull(*transaction)) { lookupInternal(transaction, nodeIDVector, resultVector); } else { @@ -108,16 +108,16 @@ void NullColumn::append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) { } } -bool NullColumn::isNull( - transaction::Transaction* transaction, node_group_idx_t nodeGroupIdx, offset_t offsetInChunk) { +bool NullColumn::isNull(transaction::Transaction* transaction, node_group_idx_t nodeGroupIdx, + offset_t offsetInChunk) { auto state = getReadState(transaction->getType(), nodeGroupIdx); uint64_t result = false; if (offsetInChunk >= state.metadata.numValues) { return true; } // Must be aligned to an 8-byte chunk for NullMask read to not overflow - Column::scan( - transaction, state, offsetInChunk, offsetInChunk + 1, reinterpret_cast(&result)); + Column::scan(transaction, state, offsetInChunk, offsetInChunk + 1, + reinterpret_cast(&result)); return result; } @@ -125,8 +125,8 @@ void NullColumn::setNull(node_group_idx_t nodeGroupIdx, offset_t offsetInChunk, auto chunkMeta = metadataDA->get(nodeGroupIdx, TransactionType::WRITE); propertyStatistics.setHasNull(DUMMY_WRITE_TRANSACTION); // Must be aligned to an 8-byte chunk for NullMask read to not overflow - auto state = ReadState{ - chunkMeta, chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)}; + auto state = ReadState{chunkMeta, + chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)}; writeValues(state, offsetInChunk, reinterpret_cast(&value)); if (offsetInChunk >= chunkMeta.numValues) { chunkMeta.numValues = offsetInChunk + 1; diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index 1f2b0edefba..c39e14cc328 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -37,8 +37,8 @@ void RelTable::read(Transaction* transaction, TableReadState& readState) { } void RelTable::insert(Transaction* transaction, TableInsertState& insertState) { - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); if (localTable->insert(insertState)) { auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->updateNumTuplesByValue(tableID, 1); @@ -46,14 +46,14 @@ void RelTable::insert(Transaction* transaction, TableInsertState& insertState) { } void RelTable::update(Transaction* transaction, TableUpdateState& updateState) { - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); localTable->update(updateState); } void RelTable::delete_(Transaction* transaction, TableDeleteState& deleteState) { - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); if (localTable->delete_(deleteState)) { auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->updateNumTuplesByValue(tableID, -1); @@ -68,19 +68,19 @@ void RelTable::detachDelete(Transaction* transaction, RelDataDirection direction auto reverseTableData = direction == RelDataDirection::FWD ? bwdRelTableData.get() : fwdRelTableData.get(); std::vector relIDColumns = {REL_ID_COLUMN_ID}; - auto relIDVectors = std::vector{ - deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()}; - auto relReadState = std::make_unique( - *srcNodeIDVector, relIDColumns, relIDVectors, direction); + auto relIDVectors = std::vector{deleteState->dstNodeIDVector.get(), + deleteState->relIDVector.get()}; + auto relReadState = std::make_unique(*srcNodeIDVector, relIDColumns, + relIDVectors, direction); initializeReadState(transaction, direction, relIDColumns, *srcNodeIDVector, *relReadState); - row_idx_t numRelsDeleted = detachDeleteForCSRRels( - transaction, tableData, reverseTableData, srcNodeIDVector, relReadState.get(), deleteState); + row_idx_t numRelsDeleted = detachDeleteForCSRRels(transaction, tableData, reverseTableData, + srcNodeIDVector, relReadState.get(), deleteState); auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->updateNumTuplesByValue(tableID, -numRelsDeleted); } -void RelTable::checkIfNodeHasRels( - Transaction* transaction, RelDataDirection direction, ValueVector* srcNodeIDVector) { +void RelTable::checkIfNodeHasRels(Transaction* transaction, RelDataDirection direction, + ValueVector* srcNodeIDVector) { KU_ASSERT(srcNodeIDVector->state->isFlat()); auto nodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; auto nodeOffset = srcNodeIDVector->getValue(nodeIDPos).offset; @@ -108,8 +108,8 @@ row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableDat tempState->selVector->selectedPositions[0] = i; auto deleted = tableData->delete_(transaction, srcNodeIDVector, deleteState->relIDVector.get()); - auto reverseDeleted = reverseTableData->delete_( - transaction, deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()); + auto reverseDeleted = reverseTableData->delete_(transaction, + deleteState->dstNodeIDVector.get(), deleteState->relIDVector.get()); KU_ASSERT(deleted == reverseDeleted); numRelsDeleted += (deleted && reverseDeleted); } @@ -120,12 +120,12 @@ row_idx_t RelTable::detachDeleteForCSRRels(Transaction* transaction, RelTableDat void RelTable::scan(Transaction* transaction, RelTableReadState& scanState) { auto tableData = getDirectedTableData(scanState.direction); - tableData->scan( - transaction, *scanState.dataReadState, scanState.nodeIDVector, scanState.outputVectors); + tableData->scan(transaction, *scanState.dataReadState, scanState.nodeIDVector, + scanState.outputVectors); } -void RelTable::addColumn( - Transaction* transaction, const Property& property, ValueVector* defaultValueVector) { +void RelTable::addColumn(Transaction* transaction, const Property& property, + ValueVector* defaultValueVector) { auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->setPropertyStatisticsForTable(tableID, property.getPropertyID(), PropertyStatistics{!defaultValueVector->hasNoNullsGuarantee()}); @@ -133,14 +133,14 @@ void RelTable::addColumn( fwdRelTableData->addColumn(transaction, RelDataDirectionUtils::relDirectionToString(RelDataDirection::FWD), fwdRelTableData->getNbrIDColumn()->getMetadataDA(), - *relsStats->getColumnMetadataDAHInfo( - transaction, tableID, fwdRelTableData->getNumColumns(), RelDataDirection::FWD), + *relsStats->getColumnMetadataDAHInfo(transaction, tableID, fwdRelTableData->getNumColumns(), + RelDataDirection::FWD), property, defaultValueVector, relsStats); bwdRelTableData->addColumn(transaction, RelDataDirectionUtils::relDirectionToString(RelDataDirection::BWD), bwdRelTableData->getNbrIDColumn()->getMetadataDA(), - *relsStats->getColumnMetadataDAHInfo( - transaction, tableID, bwdRelTableData->getNumColumns(), RelDataDirection::BWD), + *relsStats->getColumnMetadataDAHInfo(transaction, tableID, bwdRelTableData->getNumColumns(), + RelDataDirection::BWD), property, defaultValueVector, relsStats); // TODO(Guodong): addColumn is not going through localStorage design for now. So it needs to add // tableID into the wal's updated table set separately, as it won't trigger prepareCommit. @@ -150,10 +150,10 @@ void RelTable::addColumn( void RelTable::prepareCommit(Transaction* transaction, LocalTable* localTable) { wal->addToUpdatedTables(tableID); auto localRelTable = ku_dynamic_cast(localTable); - fwdRelTableData->prepareLocalTableToCommit( - transaction, localRelTable->getTableData(RelDataDirection::FWD)); - bwdRelTableData->prepareLocalTableToCommit( - transaction, localRelTable->getTableData(RelDataDirection::BWD)); + fwdRelTableData->prepareLocalTableToCommit(transaction, + localRelTable->getTableData(RelDataDirection::FWD)); + bwdRelTableData->prepareLocalTableToCommit(transaction, + localRelTable->getTableData(RelDataDirection::BWD)); prepareCommit(); } diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index 2078418bbe2..1ce731568e9 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -71,8 +71,8 @@ std::pair RelDataReadState::getStartAndEndOffset() { return {startOffset, startOffset + numRowsToRead}; } -offset_t CSRHeaderColumns::getNumNodes( - Transaction* transaction, node_group_idx_t nodeGroupIdx) const { +offset_t CSRHeaderColumns::getNumNodes(Transaction* transaction, + node_group_idx_t nodeGroupIdx) const { auto numPersistentNodeGroups = offset->getNumNodeGroups(transaction); return nodeGroupIdx >= numPersistentNodeGroups ? 0 : @@ -142,8 +142,8 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, // Columns (nbrID + properties). auto& properties = tableEntry->getPropertiesRef(); columns.reserve(properties.size() + 1); - auto nbrIDMetadataDAHInfo = relsStoreStats->getColumnMetadataDAHInfo( - &DUMMY_WRITE_TRANSACTION, tableID, NBR_ID_COLUMN_ID, direction); + auto nbrIDMetadataDAHInfo = relsStoreStats->getColumnMetadataDAHInfo(&DUMMY_WRITE_TRANSACTION, + tableID, NBR_ID_COLUMN_ID, direction); auto nbrIDColName = StorageUtils::getColumnName("NBR_ID", StorageUtils::ColumnType::DEFAULT, RelDataDirectionUtils::relDirectionToString(direction)); auto nbrIDColumn = std::make_unique(nbrIDColName, *nbrIDMetadataDAHInfo, @@ -154,8 +154,8 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, for (auto i = 0u; i < properties.size(); i++) { auto& property = properties[i]; auto columnID = tableEntry->getColumnID(property.getPropertyID()); - auto metadataDAHInfo = relsStoreStats->getColumnMetadataDAHInfo( - &DUMMY_WRITE_TRANSACTION, tableID, columnID, direction); + auto metadataDAHInfo = relsStoreStats->getColumnMetadataDAHInfo(&DUMMY_WRITE_TRANSACTION, + tableID, columnID, direction); auto colName = StorageUtils::getColumnName(property.getName(), StorageUtils::ColumnType::DEFAULT, RelDataDirectionUtils::relDirectionToString(direction)); @@ -210,8 +210,8 @@ void RelTableData::scan(Transaction* transaction, TableDataReadState& readState, if (relReadState.readFromLocalStorage) { auto offsetInChunk = relReadState.currentNodeOffset - relReadState.startNodeOffset; KU_ASSERT(relReadState.localNodeGroup); - auto numValuesRead = relReadState.localNodeGroup->scanCSR( - offsetInChunk, relReadState.posInCurrentCSR, relReadState.columnIDs, outputVectors); + auto numValuesRead = relReadState.localNodeGroup->scanCSR(offsetInChunk, + relReadState.posInCurrentCSR, relReadState.columnIDs, outputVectors); relReadState.posInCurrentCSR += numValuesRead; return; } @@ -250,17 +250,17 @@ void RelTableData::lookup(Transaction* /*transaction*/, TableDataReadState& /*re KU_ASSERT(false); } -bool RelTableData::delete_( - Transaction* transaction, ValueVector* srcNodeIDVector, ValueVector* relIDVector) { - auto localTable = transaction->getLocalStorage()->getLocalTable( - tableID, LocalStorage::NotExistAction::CREATE); +bool RelTableData::delete_(Transaction* transaction, ValueVector* srcNodeIDVector, + ValueVector* relIDVector) { + auto localTable = transaction->getLocalStorage()->getLocalTable(tableID, + LocalStorage::NotExistAction::CREATE); auto localRelTable = ku_dynamic_cast(localTable); auto localTableData = localRelTable->getTableData(direction); return localTableData->delete_(srcNodeIDVector, relIDVector); } -void RelTableData::checkRelMultiplicityConstraint( - Transaction* transaction, ValueVector* srcNodeIDVector) const { +void RelTableData::checkRelMultiplicityConstraint(Transaction* transaction, + ValueVector* srcNodeIDVector) const { KU_ASSERT(srcNodeIDVector->state->isFlat() && multiplicity == RelMultiplicity::ONE); auto nodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; auto nodeOffset = srcNodeIDVector->getValue(nodeIDPos).offset; @@ -289,8 +289,8 @@ void RelTableData::append(ChunkedNodeGroup* nodeGroup) { auto csrNodeGroup = ku_dynamic_cast(nodeGroup); csrHeaderColumns.append(csrNodeGroup->getCSRHeader(), nodeGroup->getNodeGroupIdx()); for (auto columnID = 0u; columnID < columns.size(); columnID++) { - getColumn(columnID)->append( - &nodeGroup->getColumnChunkUnsafe(columnID), nodeGroup->getNodeGroupIdx()); + getColumn(columnID)->append(&nodeGroup->getColumnChunkUnsafe(columnID), + nodeGroup->getNodeGroupIdx()); } } @@ -321,8 +321,8 @@ static PackedCSRRegion upgradeLevel(const PackedCSRRegion& region) { return PackedCSRRegion{regionIdx, region.level + 1}; } -static uint64_t findPosOfRelIDFromArray( - ColumnChunk* relIDInRegion, offset_t startPos, offset_t endPos, offset_t relOffset) { +static uint64_t findPosOfRelIDFromArray(ColumnChunk* relIDInRegion, offset_t startPos, + offset_t endPos, offset_t relOffset) { KU_ASSERT(endPos <= relIDInRegion->getNumValues()); for (auto i = startPos; i < endPos; i++) { if (relIDInRegion->getValue(i) == relOffset) { @@ -332,8 +332,8 @@ static uint64_t findPosOfRelIDFromArray( return UINT64_MAX; } -offset_t RelTableData::findCSROffsetInRegion( - const PersistentState& persistentState, offset_t nodeOffset, offset_t relOffset) const { +offset_t RelTableData::findCSROffsetInRegion(const PersistentState& persistentState, + offset_t nodeOffset, offset_t relOffset) const { auto startPos = persistentState.header.getStartCSROffset(nodeOffset) - persistentState.leftCSROffset; auto endPos = startPos + persistentState.header.getCSRLength(nodeOffset); @@ -421,8 +421,8 @@ void RelTableData::applyInsertionsToChunk(const PersistentState& persistentState // TODO(Guodong): This should be refactored to share the same control logic with // `applyDeletionsToColumn`. -void RelTableData::applyDeletionsToChunk( - const PersistentState& persistentState, const LocalState& localState, ColumnChunk* chunk) { +void RelTableData::applyDeletionsToChunk(const PersistentState& persistentState, + const LocalState& localState, ColumnChunk* chunk) { auto& deleteInfo = localState.localNG->deleteInfo; for (auto& [offset, deletions] : deleteInfo.getSrcNodeOffsetToRelOffsetVec()) { if (localState.region.isOutOfBoundary(offset)) { @@ -463,8 +463,8 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, KU_ASSERT(localState.regionCapacity >= (localState.rightCSROffset - localState.leftCSROffset)); // First, scan the whole region to a temp chunk. auto oldSize = persistentState.rightCSROffset - persistentState.leftCSROffset + 1; - auto chunk = ColumnChunkFactory::createColumnChunk( - *column->getDataType().copy(), enableCompression, oldSize); + auto chunk = ColumnChunkFactory::createColumnChunk(*column->getDataType().copy(), + enableCompression, oldSize); column->scan(transaction, nodeGroupIdx, chunk.get(), persistentState.leftCSROffset, persistentState.rightCSROffset + 1); auto localUpdateChunk = @@ -473,11 +473,11 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, applyDeletionsToChunk(persistentState, localState, chunk.get()); // Second, create a new temp chunk for the region. auto newSize = localState.rightCSROffset - localState.leftCSROffset + 1; - auto newChunk = ColumnChunkFactory::createColumnChunk( - *column->getDataType().copy(), enableCompression, newSize); + auto newChunk = ColumnChunkFactory::createColumnChunk(*column->getDataType().copy(), + enableCompression, newSize); newChunk->getNullChunk()->resetToAllNull(); - auto maxNumNodesToDistribute = std::min( - rightNodeBoundary - leftNodeBoundary + 1, persistentState.header.offset->getNumValues()); + auto maxNumNodesToDistribute = std::min(rightNodeBoundary - leftNodeBoundary + 1, + persistentState.header.offset->getNumValues()); // Third, copy the rels to the new chunk. for (auto i = 0u; i < maxNumNodesToDistribute; i++) { auto nodeOffset = i + leftNodeBoundary; @@ -498,12 +498,12 @@ void RelTableData::distributeAndUpdateColumn(Transaction* transaction, dstOffsets.resize(newChunk->getNumValues()); fillSequence(dstOffsets, localState.leftCSROffset); KU_ASSERT(newChunk->sanityCheck()); - column->prepareCommitForChunk( - transaction, nodeGroupIdx, dstOffsets, newChunk.get(), 0 /*srcOffset*/); + column->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, newChunk.get(), + 0 /*srcOffset*/); } -std::vector RelTableData::findRegions( - const ChunkedCSRHeader& headerChunks, LocalState& localState) { +std::vector RelTableData::findRegions(const ChunkedCSRHeader& headerChunks, + LocalState& localState) { std::vector regions; auto segmentIdx = 0u; auto numSegments = StorageConstants::NODE_GROUP_SIZE / StorageConstants::CSR_SEGMENT_SIZE; @@ -541,8 +541,8 @@ void RelTableData::updateRegion(Transaction* transaction, node_group_idx_t nodeG // NOTE: There is an implicit trick happening. Due to the mismatch of storage type and // in-memory representation of INTERNAL_ID, we only store offset as INT64 on disk. Here // we directly read relID's offset part from disk into an INT64 column chunk. - persistentState.relIDChunk = ColumnChunkFactory::createColumnChunk( - *LogicalType::INT64(), enableCompression, localState.regionCapacity); + persistentState.relIDChunk = ColumnChunkFactory::createColumnChunk(*LogicalType::INT64(), + enableCompression, localState.regionCapacity); getColumn(REL_ID_COLUMN_ID) ->scan(transaction, nodeGroupIdx, persistentState.relIDChunk.get(), persistentState.leftCSROffset, persistentState.rightCSROffset + 1); @@ -553,14 +553,14 @@ void RelTableData::updateRegion(Transaction* transaction, node_group_idx_t nodeG } } else { for (auto columnID = 0u; columnID < columns.size(); columnID++) { - distributeAndUpdateColumn( - transaction, nodeGroupIdx, columnID, persistentState, localState); + distributeAndUpdateColumn(transaction, nodeGroupIdx, columnID, persistentState, + localState); } } } -void RelTableData::findPositionsForInsertions( - offset_t nodeOffset, length_t numInsertions, LocalState& localState) { +void RelTableData::findPositionsForInsertions(offset_t nodeOffset, length_t numInsertions, + LocalState& localState) { auto& header = localState.header; KU_ASSERT(nodeOffset < header.offset->getNumValues()); // Try insert to the end of nodeOffset. @@ -575,8 +575,8 @@ void RelTableData::findPositionsForInsertions( } } -void RelTableData::slideForInsertions( - offset_t nodeOffset, length_t numInsertions, LocalState& localState) { +void RelTableData::slideForInsertions(offset_t nodeOffset, length_t numInsertions, + LocalState& localState) { // Now, we have to slide. Heuristically, the sliding happens both left and right. auto& header = localState.header; auto [leftBoundary, rightBoundary] = localState.region.getNodeOffsetBoundaries(); @@ -674,8 +674,8 @@ void RelTableData::updateColumn(Transaction* transaction, node_group_idx_t nodeG applyUpdatesToColumn(transaction, nodeGroupIdx, columnID, persistentState, localState, column); applyDeletionsToColumn(transaction, nodeGroupIdx, localState, persistentState, column); applySliding(transaction, nodeGroupIdx, localState, persistentState, column); - applyInsertionsToColumn( - transaction, nodeGroupIdx, columnID, localState, persistentState, column); + applyInsertionsToColumn(transaction, nodeGroupIdx, columnID, localState, persistentState, + column); } void RelTableData::applyUpdatesToColumn(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -775,15 +775,15 @@ void RelTableData::applyDeletionsToColumn(Transaction* transaction, node_group_i if (slides.empty()) { return; } - auto chunk = ColumnChunkFactory::createColumnChunk( - *column->getDataType().copy(), enableCompression, slides.size()); + auto chunk = ColumnChunkFactory::createColumnChunk(*column->getDataType().copy(), + enableCompression, slides.size()); std::vector dstOffsets; dstOffsets.resize(slides.size()); auto tmpChunkForRead = ColumnChunkFactory::createColumnChunk(*column->getDataType().copy(), enableCompression, 1); for (auto i = 0u; i < slides.size(); i++) { - column->scan( - transaction, nodeGroupIdx, tmpChunkForRead.get(), slides[i].first, slides[i].first + 1); + column->scan(transaction, nodeGroupIdx, tmpChunkForRead.get(), slides[i].first, + slides[i].first + 1); chunk->append(tmpChunkForRead.get(), 0, 1); dstOffsets[i] = slides[i].second; } @@ -816,23 +816,23 @@ void RelTableData::applySliding(Transaction* transaction, node_group_idx_t nodeG if (slides.empty()) { return; } - auto chunk = ColumnChunkFactory::createColumnChunk( - *column->getDataType().copy(), enableCompression, slides.size()); + auto chunk = ColumnChunkFactory::createColumnChunk(*column->getDataType().copy(), + enableCompression, slides.size()); std::vector dstOffsets; dstOffsets.resize(slides.size()); auto tmpChunkForRead = ColumnChunkFactory::createColumnChunk(*column->getDataType().copy(), enableCompression, 1); for (auto i = 0u; i < slides.size(); i++) { - column->scan( - transaction, nodeGroupIdx, tmpChunkForRead.get(), slides[i].first, slides[i].first + 1); + column->scan(transaction, nodeGroupIdx, tmpChunkForRead.get(), slides[i].first, + slides[i].first + 1); chunk->append(tmpChunkForRead.get(), 0, 1); dstOffsets[i] = slides[i].second; } column->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, chunk.get(), 0); } -offset_t RelTableData::getMaxNumNodesInRegion( - const ChunkedCSRHeader& header, const PackedCSRRegion& region, const LocalRelNG* localNG) { +offset_t RelTableData::getMaxNumNodesInRegion(const ChunkedCSRHeader& header, + const PackedCSRRegion& region, const LocalRelNG* localNG) { auto numNodes = header.offset->getNumValues(); KU_ASSERT(numNodes == header.length->getNumValues()); for (auto& [offset, _] : localNG->insertChunks.getSrcNodeOffsetToRelOffsets()) { @@ -915,8 +915,8 @@ void RelTableData::distributeOffsets(const ChunkedCSRHeader& header, LocalState& PackedCSRRegion{0, static_cast(packedCSRInfo.calibratorTreeHeight)}; localState.regionSize = getNewRegionSize(header, localState.sizeChangesPerSegment, localState.region); - localState.regionCapacity = StorageUtils::divideAndRoundUpTo( - localState.regionSize, StorageConstants::PACKED_CSR_DENSITY); + localState.regionCapacity = StorageUtils::divideAndRoundUpTo(localState.regionSize, + StorageConstants::PACKED_CSR_DENSITY); } else { localState.regionSize = getNewRegionSize(header, localState.sizeChangesPerSegment, localState.region); @@ -937,8 +937,8 @@ void RelTableData::distributeOffsets(const ChunkedCSRHeader& header, LocalState& localState.needSliding = true; } -void RelTableData::prepareCommitNodeGroup( - Transaction* transaction, node_group_idx_t nodeGroupIdx, LocalRelNG* localRelNG) { +void RelTableData::prepareCommitNodeGroup(Transaction* transaction, node_group_idx_t nodeGroupIdx, + LocalRelNG* localRelNG) { auto numNodesInPersistentStorage = csrHeaderColumns.getNumNodes(transaction, nodeGroupIdx); PersistentState persistentState(numNodesInPersistentStorage); csrHeaderColumns.scan(transaction, nodeGroupIdx, persistentState.header); @@ -953,8 +953,8 @@ void RelTableData::prepareCommitNodeGroup( } } -LocalRelNG* RelTableData::getLocalNodeGroup( - Transaction* transaction, node_group_idx_t nodeGroupIdx) { +LocalRelNG* RelTableData::getLocalNodeGroup(Transaction* transaction, + node_group_idx_t nodeGroupIdx) { auto localTable = transaction->getLocalStorage()->getLocalTable(tableID); if (!localTable) { return nullptr; diff --git a/src/storage/store/string_column.cpp b/src/storage/store/string_column.cpp index f4346710e38..ba2a155f96d 100644 --- a/src/storage/store/string_column.cpp +++ b/src/storage/store/string_column.cpp @@ -53,8 +53,8 @@ void StringColumn::writeValue(const ColumnChunkMetadata& chunkMeta, node_group_i auto& kuStr = vectorToWriteFrom->getValue(posInVectorToWriteFrom); auto index = dictionary.append(nodeGroupIdx, kuStr.getAsStringView()); // Write index to main column - auto state = ReadState{ - chunkMeta, chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)}; + auto state = ReadState{chunkMeta, + chunkMeta.compMeta.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType)}; Column::writeValues(state, offsetInChunk, (uint8_t*)&index); } @@ -82,8 +82,8 @@ void StringColumn::write(node_group_idx_t nodeGroupIdx, offset_t dstOffset, Colu } } -void StringColumn::scanInternal( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void StringColumn::scanInternal(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { KU_ASSERT(resultVector->dataType.getPhysicalType() == PhysicalTypeID::STRING); auto startNodeOffset = nodeIDVector->readNodeOffset(0); KU_ASSERT(startNodeOffset % DEFAULT_VECTOR_CAPACITY == 0); @@ -104,8 +104,8 @@ void StringColumn::scanUnfiltered(transaction::Transaction* transaction, auto numValuesToRead = endOffsetInGroup - startOffsetInGroup; auto indices = std::make_unique(numValuesToRead); auto indexState = getReadState(transaction->getType(), nodeGroupIdx); - Column::scan( - transaction, indexState, startOffsetInGroup, endOffsetInGroup, (uint8_t*)indices.get()); + Column::scan(transaction, indexState, startOffsetInGroup, endOffsetInGroup, + (uint8_t*)indices.get()); std::vector> offsetsToScan; for (auto i = 0u; i < numValuesToRead; i++) { @@ -132,8 +132,8 @@ void StringColumn::scanFiltered(transaction::Transaction* transaction, // TODO(bmwinger): optimize index scans by grouping them when adjacent auto offsetInGroup = startOffsetInGroup + pos; string_index_t index; - Column::scan( - transaction, indexState, offsetInGroup, offsetInGroup + 1, (uint8_t*)&index); + Column::scan(transaction, indexState, offsetInGroup, offsetInGroup + 1, + (uint8_t*)&index); offsetsToScan.emplace_back(index, pos); } } @@ -144,8 +144,8 @@ void StringColumn::scanFiltered(transaction::Transaction* transaction, dictionary.scan(transaction, nodeGroupIdx, offsetsToScan, resultVector, indexState.metadata); } -void StringColumn::lookupInternal( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void StringColumn::lookupInternal(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { KU_ASSERT(dataType.getPhysicalType() == PhysicalTypeID::STRING); auto startNodeOffset = nodeIDVector->readNodeOffset(0); auto nodeGroupIdx = StorageUtils::getNodeGroupIdx(startNodeOffset); @@ -158,8 +158,8 @@ void StringColumn::lookupInternal( auto offsetInGroup = nodeIDVector->readNodeOffset(pos) - StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); string_index_t index; - Column::scan( - transaction, indexState, offsetInGroup, offsetInGroup + 1, (uint8_t*)&index); + Column::scan(transaction, indexState, offsetInGroup, offsetInGroup + 1, + (uint8_t*)&index); offsetsToScan.emplace_back(index, pos); } } @@ -231,8 +231,8 @@ bool StringColumn::canIndexCommitInPlace(Transaction* transaction, node_group_id auto totalStringsAfterUpdate = dictionary.getNumValuesInOffsets(transaction, nodeGroupIdx) + numStrings; // Check if the index column can store the largest new index in-place - if (!metadata.compMeta.canUpdateInPlace( - (const uint8_t*)&totalStringsAfterUpdate, 0 /*pos*/, PhysicalTypeID::UINT32)) { + if (!metadata.compMeta.canUpdateInPlace((const uint8_t*)&totalStringsAfterUpdate, 0 /*pos*/, + PhysicalTypeID::UINT32)) { return false; } return true; diff --git a/src/storage/store/string_column_chunk.cpp b/src/storage/store/string_column_chunk.cpp index 1f5cc2eab5c..1c64f32c47b 100644 --- a/src/storage/store/string_column_chunk.cpp +++ b/src/storage/store/string_column_chunk.cpp @@ -9,8 +9,8 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -StringColumnChunk::StringColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) +StringColumnChunk::StringColumnChunk(LogicalType dataType, uint64_t capacity, + bool enableCompression, bool inMemory) : ColumnChunk{std::move(dataType), capacity, enableCompression}, dictionaryChunk{ std::make_unique(inMemory ? 0 : capacity, enableCompression)}, @@ -37,8 +37,8 @@ void StringColumnChunk::append(ValueVector* vector, const SelectionVector& selVe } } -void StringColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void StringColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { auto otherChunk = ku_dynamic_cast(other); nullChunk->append(otherChunk->getNullChunk(), startPosInOtherChunk, numValuesToAppend); switch (dataType.getLogicalTypeID()) { @@ -52,8 +52,8 @@ void StringColumnChunk::append( } } -void StringColumnChunk::lookup( - offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { +void StringColumnChunk::lookup(offset_t offsetInChunk, ValueVector& output, + sel_t posInOutputVector) const { KU_ASSERT(offsetInChunk < numValues); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); if (nullChunk->isNull(offsetInChunk)) { @@ -63,8 +63,8 @@ void StringColumnChunk::lookup( output.setValue(posInOutputVector, str); } -void StringColumnChunk::write( - ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { +void StringColumnChunk::write(ValueVector* vector, offset_t offsetInVector, + offset_t offsetInChunk) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRING); if (!needFinalize && offsetInChunk < numValues) [[unlikely]] { needFinalize = true; @@ -79,8 +79,8 @@ void StringColumnChunk::write( } } -void StringColumnChunk::write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity /*multiplicity*/) { +void StringColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + RelMultiplicity /*multiplicity*/) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRING && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID && chunk->getNumValues() == dstOffsets->getNumValues()); @@ -132,8 +132,8 @@ void StringColumnChunk::copy(ColumnChunk* srcChunk, offset_t srcOffsetInChunk, append(srcStringChunk, srcOffsetInChunk, numValuesToCopy); } -void StringColumnChunk::appendStringColumnChunk( - StringColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void StringColumnChunk::appendStringColumnChunk(StringColumnChunk* other, + offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { auto indices = reinterpret_cast(buffer.get()); for (auto i = 0u; i < numValuesToAppend; i++) { auto posInChunk = numValues; diff --git a/src/storage/store/struct_column.cpp b/src/storage/store/struct_column.cpp index f942e9b5aa5..8be95b9ff1a 100644 --- a/src/storage/store/struct_column.cpp +++ b/src/storage/store/struct_column.cpp @@ -21,8 +21,8 @@ StructColumn::StructColumn(std::string name, LogicalType dataType, KU_ASSERT(metaDAHeaderInfo.childrenInfos.size() == fieldTypes.size()); childColumns.resize(fieldTypes.size()); for (auto i = 0u; i < fieldTypes.size(); i++) { - auto childColName = StorageUtils::getColumnName( - name, StorageUtils::ColumnType::STRUCT_CHILD, std::to_string(i)); + auto childColName = StorageUtils::getColumnName(name, + StorageUtils::ColumnType::STRUCT_CHILD, std::to_string(i)); childColumns[i] = ColumnFactory::createColumn(childColName, *fieldTypes[i]->copy(), *metaDAHeaderInfo.childrenInfos[i], dataFH, metadataFH, bufferManager, wal, transaction, propertyStatistics, enableCompression); @@ -32,8 +32,8 @@ StructColumn::StructColumn(std::string name, LogicalType dataType, void StructColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, ColumnChunk* columnChunk, offset_t startOffset, offset_t endOffset) { KU_ASSERT(columnChunk->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT); - nullColumn->scan( - transaction, nodeGroupIdx, columnChunk->getNullChunk(), startOffset, endOffset); + nullColumn->scan(transaction, nodeGroupIdx, columnChunk->getNullChunk(), startOffset, + endOffset); if (nodeGroupIdx >= metadataDA->getNumElements(transaction->getType())) { columnChunk->setNumValues(0); } else { @@ -45,8 +45,8 @@ void StructColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, } auto structColumnChunk = ku_dynamic_cast(columnChunk); for (auto i = 0u; i < childColumns.size(); i++) { - childColumns[i]->scan( - transaction, nodeGroupIdx, structColumnChunk->getChild(i), startOffset, endOffset); + childColumns[i]->scan(transaction, nodeGroupIdx, structColumnChunk->getChild(i), + startOffset, endOffset); } } @@ -62,16 +62,16 @@ void StructColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx, } } -void StructColumn::scanInternal( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void StructColumn::scanInternal(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { for (auto i = 0u; i < childColumns.size(); i++) { auto fieldVector = StructVector::getFieldVector(resultVector, i).get(); childColumns[i]->scan(transaction, nodeIDVector, fieldVector); } } -void StructColumn::lookupInternal( - Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) { +void StructColumn::lookupInternal(Transaction* transaction, ValueVector* nodeIDVector, + ValueVector* resultVector) { for (auto i = 0u; i < childColumns.size(); i++) { auto fieldVector = StructVector::getFieldVector(resultVector, i).get(); childColumns[i]->lookup(transaction, nodeIDVector, fieldVector); @@ -144,8 +144,8 @@ bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t n bool StructColumn::canCommitInPlace(Transaction* transaction, node_group_idx_t nodeGroupIdx, const std::vector& dstOffsets, ColumnChunk* chunk, offset_t srcOffset) { - return nullColumn->canCommitInPlace( - transaction, nodeGroupIdx, dstOffsets, chunk->getNullChunk(), srcOffset); + return nullColumn->canCommitInPlace(transaction, nodeGroupIdx, dstOffsets, + chunk->getNullChunk(), srcOffset); } void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx, @@ -197,14 +197,14 @@ void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_id if (isNewNodeGroup) { // If this is a new node group, updateInfo should be empty. We should perform out-of-place // commit with a new column chunk. - commitColumnChunkOutOfPlace( - transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, srcOffset); + commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk, + srcOffset); } else { // STRUCT column doesn't have actual data stored in buffer. Only need to update the null // column. if (canCommitInPlace(transaction, nodeGroupIdx, dstOffsets, chunk, srcOffset)) { - nullColumn->commitColumnChunkInPlace( - nodeGroupIdx, dstOffsets, chunk->getNullChunk(), srcOffset); + nullColumn->commitColumnChunkInPlace(nodeGroupIdx, dstOffsets, chunk->getNullChunk(), + srcOffset); } else { nullColumn->commitColumnChunkOutOfPlace(transaction, nodeGroupIdx, isNewNodeGroup, dstOffsets, chunk->getNullChunk(), srcOffset); @@ -220,14 +220,14 @@ void StructColumn::prepareCommitForChunk(Transaction* transaction, node_group_id for (auto i = 0u; i < childColumns.size(); i++) { const auto& childColumn = childColumns[i]; auto childChunk = ku_dynamic_cast(chunk)->getChild(i); - childColumn->prepareCommitForChunk( - transaction, nodeGroupIdx, dstOffsets, childChunk, srcOffset); + childColumn->prepareCommitForChunk(transaction, nodeGroupIdx, dstOffsets, childChunk, + srcOffset); } } } -ChunkCollection StructColumn::getStructChildChunkCollection( - const ChunkCollection& chunkCollection, vector_idx_t childIdx) { +ChunkCollection StructColumn::getStructChildChunkCollection(const ChunkCollection& chunkCollection, + vector_idx_t childIdx) { ChunkCollection childChunkCollection; for (const auto& chunk : chunkCollection) { auto structChunk = ku_dynamic_cast(chunk); diff --git a/src/storage/store/struct_column_chunk.cpp b/src/storage/store/struct_column_chunk.cpp index 718dc4aaa74..439a10ec141 100644 --- a/src/storage/store/struct_column_chunk.cpp +++ b/src/storage/store/struct_column_chunk.cpp @@ -12,14 +12,14 @@ namespace storage { // TODO: need to handle this case, when the whole struct entry is null, should set all fields to // null too. -StructColumnChunk::StructColumnChunk( - LogicalType dataType, uint64_t capacity, bool enableCompression, bool inMemory) +StructColumnChunk::StructColumnChunk(LogicalType dataType, uint64_t capacity, + bool enableCompression, bool inMemory) : ColumnChunk{std::move(dataType), capacity} { auto fieldTypes = StructType::getFieldTypes(&this->dataType); childChunks.resize(fieldTypes.size()); for (auto i = 0u; i < fieldTypes.size(); i++) { - childChunks[i] = ColumnChunkFactory::createColumnChunk( - *fieldTypes[i]->copy(), enableCompression, capacity, inMemory); + childChunks[i] = ColumnChunkFactory::createColumnChunk(*fieldTypes[i]->copy(), + enableCompression, capacity, inMemory); } } @@ -29,15 +29,15 @@ void StructColumnChunk::finalize() { } } -void StructColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void StructColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { KU_ASSERT(other->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT); auto otherStructChunk = ku_dynamic_cast(other); KU_ASSERT(childChunks.size() == otherStructChunk->childChunks.size()); nullChunk->append(other->getNullChunk(), startPosInOtherChunk, numValuesToAppend); for (auto i = 0u; i < childChunks.size(); i++) { - childChunks[i]->append( - otherStructChunk->childChunks[i].get(), startPosInOtherChunk, numValuesToAppend); + childChunks[i]->append(otherStructChunk->childChunks[i].get(), startPosInOtherChunk, + numValuesToAppend); } numValues += numValuesToAppend; } @@ -53,14 +53,14 @@ void StructColumnChunk::append(ValueVector* vector, const SelectionVector& selVe numValues += selVector.selectedSize; } -void StructColumnChunk::lookup( - offset_t offsetInChunk, ValueVector& output, sel_t posInOutputVector) const { +void StructColumnChunk::lookup(offset_t offsetInChunk, ValueVector& output, + sel_t posInOutputVector) const { KU_ASSERT(offsetInChunk < numValues); auto numFields = StructType::getNumFields(&dataType); output.setNull(posInOutputVector, nullChunk->isNull(offsetInChunk)); for (auto i = 0u; i < numFields; i++) { - childChunks[i]->lookup( - offsetInChunk, *StructVector::getFieldVector(&output, i).get(), posInOutputVector); + childChunks[i]->lookup(offsetInChunk, *StructVector::getFieldVector(&output, i).get(), + posInOutputVector); } } @@ -79,8 +79,8 @@ void StructColumnChunk::resetToEmpty() { } } -void StructColumnChunk::write( - ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { +void StructColumnChunk::write(ValueVector* vector, offset_t offsetInVector, + offset_t offsetInChunk) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::STRUCT); nullChunk->setNull(offsetInChunk, vector->isNull(offsetInVector)); auto fields = StructVector::getFieldVectors(vector); @@ -92,8 +92,8 @@ void StructColumnChunk::write( } } -void StructColumnChunk::write( - ColumnChunk* chunk, ColumnChunk* dstOffsets, RelMultiplicity multiplicity) { +void StructColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets, + RelMultiplicity multiplicity) { KU_ASSERT(chunk->getDataType().getPhysicalType() == PhysicalTypeID::STRUCT && dstOffsets->getDataType().getPhysicalType() == PhysicalTypeID::INTERNAL_ID); for (auto i = 0u; i < dstOffsets->getNumValues(); i++) { diff --git a/src/storage/store/table_data.cpp b/src/storage/store/table_data.cpp index 5c0b6c28307..80ceb6ead37 100644 --- a/src/storage/store/table_data.cpp +++ b/src/storage/store/table_data.cpp @@ -11,16 +11,16 @@ namespace storage { TableData::TableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, catalog::TableCatalogEntry* tableEntry, BufferManager* bufferManager, WAL* wal, bool enableCompression) - : dataFH{dataFH}, - metadataFH{metadataFH}, tableID{tableEntry->getTableID()}, tableName{tableEntry->getName()}, - bufferManager{bufferManager}, wal{wal}, enableCompression{enableCompression} {} + : dataFH{dataFH}, metadataFH{metadataFH}, tableID{tableEntry->getTableID()}, + tableName{tableEntry->getName()}, bufferManager{bufferManager}, wal{wal}, + enableCompression{enableCompression} {} void TableData::addColumn(Transaction* transaction, const std::string& colNamePrefix, InMemDiskArray* metadataDA, const MetadataDAHInfo& metadataDAHInfo, const catalog::Property& property, ValueVector* defaultValueVector, TablesStatistics* tablesStats) { - auto colName = StorageUtils::getColumnName( - property.getName(), StorageUtils::ColumnType::DEFAULT, colNamePrefix); + auto colName = StorageUtils::getColumnName(property.getName(), + StorageUtils::ColumnType::DEFAULT, colNamePrefix); auto column = ColumnFactory::createColumn(colName, *property.getDataType()->copy(), metadataDAHInfo, dataFH, metadataFH, bufferManager, wal, transaction, RWPropertyStats(tablesStats, tableID, property.getPropertyID()), enableCompression); diff --git a/src/storage/wal/wal.cpp b/src/storage/wal/wal.cpp index d784d5d15cd..6fe10b73bed 100644 --- a/src/storage/wal/wal.cpp +++ b/src/storage/wal/wal.cpp @@ -71,8 +71,8 @@ void WAL::logCreateTableRecord(table_id_t tableID, TableType tableType) { void WAL::logCreateRdfGraphRecord(table_id_t rdfGraphID, table_id_t resourceTableID, table_id_t literalTableID, table_id_t resourceTripleTableID, table_id_t literalTripleTableID) { lock_t lck{mtx}; - WALRecord walRecord = WALRecord::newRdfGraphRecord( - rdfGraphID, resourceTableID, literalTableID, resourceTripleTableID, literalTripleTableID); + WALRecord walRecord = WALRecord::newRdfGraphRecord(rdfGraphID, resourceTableID, literalTableID, + resourceTripleTableID, literalTripleTableID); addNewWALRecordNoLock(walRecord); } @@ -168,8 +168,8 @@ WALIterator::WALIterator(std::shared_ptr fileHandle, std::mutex& m : BaseWALAndWALIterator{std::move(fileHandle)}, mtx{mtx} { resetCurrentHeaderPagePrefix(); if (this->fileHandle->getNumPages() > 0) { - this->fileHandle->readPage( - currentHeaderPageBuffer.get(), 0 /* first header page is at pageIdx 0 */); + this->fileHandle->readPage(currentHeaderPageBuffer.get(), + 0 /* first header page is at pageIdx 0 */); } numRecordsReadInCurrentHeaderPage = 0; } @@ -179,8 +179,8 @@ void WALIterator::getNextRecord(WALRecord& retVal) { if (!hasNextRecordNoLock()) { throw RuntimeException("WALIterator cannot read more log records from the WAL."); } - WALRecord::constructWALRecordFromBytes( - retVal, currentHeaderPageBuffer.get(), offsetInCurrentHeaderPage); + WALRecord::constructWALRecordFromBytes(retVal, currentHeaderPageBuffer.get(), + offsetInCurrentHeaderPage); numRecordsReadInCurrentHeaderPage++; if ((numRecordsReadInCurrentHeaderPage == getNumRecordsInCurrentHeaderPage()) && (getNextHeaderPageOfCurrentHeaderPage() != UINT32_MAX)) { diff --git a/src/storage/wal/wal_record.cpp b/src/storage/wal/wal_record.cpp index e818d9c561e..f584a5fe0d7 100644 --- a/src/storage/wal/wal_record.cpp +++ b/src/storage/wal/wal_record.cpp @@ -119,8 +119,8 @@ std::string walRecordTypeToString(WALRecordType walRecordType) { } } -WALRecord WALRecord::newPageInsertOrUpdateRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL, bool isInsert) { +WALRecord WALRecord::newPageInsertOrUpdateRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL, bool isInsert) { WALRecord retVal; retVal.recordType = WALRecordType::PAGE_UPDATE_OR_INSERT_RECORD; retVal.pageInsertOrUpdateRecord = @@ -128,16 +128,16 @@ WALRecord WALRecord::newPageInsertOrUpdateRecord( return retVal; } -WALRecord WALRecord::newPageUpdateRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL) { - return WALRecord::newPageInsertOrUpdateRecord( - dbFileID, pageIdxInOriginalFile, pageIdxInWAL, false /* is update */); +WALRecord WALRecord::newPageUpdateRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL) { + return WALRecord::newPageInsertOrUpdateRecord(dbFileID, pageIdxInOriginalFile, pageIdxInWAL, + false /* is update */); } -WALRecord WALRecord::newPageInsertRecord( - DBFileID dbFileID, uint64_t pageIdxInOriginalFile, uint64_t pageIdxInWAL) { - return WALRecord::newPageInsertOrUpdateRecord( - dbFileID, pageIdxInOriginalFile, pageIdxInWAL, true /* is insert */); +WALRecord WALRecord::newPageInsertRecord(DBFileID dbFileID, uint64_t pageIdxInOriginalFile, + uint64_t pageIdxInWAL) { + return WALRecord::newPageInsertOrUpdateRecord(dbFileID, pageIdxInOriginalFile, pageIdxInWAL, + true /* is insert */); } WALRecord WALRecord::newCommitRecord(uint64_t transactionID) { diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index e5895fd558e..61abc53a55b 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -62,8 +62,8 @@ void WALReplayer::replay() { } } -void WALReplayer::replayWALRecord( - WALRecord& walRecord, std::unordered_map>& fileCache) { +void WALReplayer::replayWALRecord(WALRecord& walRecord, + std::unordered_map>& fileCache) { switch (walRecord.recordType) { case WALRecordType::PAGE_UPDATE_OR_INSERT_RECORD: { replayPageUpdateOrInsertRecord(walRecord, fileCache); @@ -108,8 +108,8 @@ void WALReplayer::replayPageUpdateOrInsertRecord(const WALRecord& walRecord, auto dbFileID = walRecord.pageInsertOrUpdateRecord.dbFileID; auto entry = fileCache.find(dbFileID); if (entry == fileCache.end()) { - fileCache.insert(std::make_pair( - dbFileID, StorageUtils::getFileInfoForReadWrite(wal->getDirectory(), dbFileID, vfs))); + fileCache.insert(std::make_pair(dbFileID, + StorageUtils::getFileInfoForReadWrite(wal->getDirectory(), dbFileID, vfs))); entry = fileCache.find(dbFileID); } auto& fileInfoOfDBFile = entry->second; @@ -135,19 +135,19 @@ void WALReplayer::replayPageUpdateOrInsertRecord(const WALRecord& walRecord, void WALReplayer::replayTableStatisticsRecord(const WALRecord& walRecord) { if (isCheckpoint) { if (walRecord.tableStatisticsRecord.isNodeTable) { - auto walFilePath = StorageUtils::getNodesStatisticsAndDeletedIDsFilePath( - vfs, wal->getDirectory(), common::FileVersionType::WAL_VERSION); - auto originalFilePath = StorageUtils::getNodesStatisticsAndDeletedIDsFilePath( - vfs, wal->getDirectory(), common::FileVersionType::ORIGINAL); + auto walFilePath = StorageUtils::getNodesStatisticsAndDeletedIDsFilePath(vfs, + wal->getDirectory(), common::FileVersionType::WAL_VERSION); + auto originalFilePath = StorageUtils::getNodesStatisticsAndDeletedIDsFilePath(vfs, + wal->getDirectory(), common::FileVersionType::ORIGINAL); vfs->overwriteFile(walFilePath, originalFilePath); if (!isRecovering) { storageManager->getNodesStatisticsAndDeletedIDs()->checkpointInMemoryIfNecessary(); } } else { - auto walFilePath = StorageUtils::getRelsStatisticsFilePath( - vfs, wal->getDirectory(), common::FileVersionType::WAL_VERSION); - auto originalFilePath = StorageUtils::getRelsStatisticsFilePath( - vfs, wal->getDirectory(), common::FileVersionType::ORIGINAL); + auto walFilePath = StorageUtils::getRelsStatisticsFilePath(vfs, wal->getDirectory(), + common::FileVersionType::WAL_VERSION); + auto originalFilePath = StorageUtils::getRelsStatisticsFilePath(vfs, + wal->getDirectory(), common::FileVersionType::ORIGINAL); vfs->overwriteFile(walFilePath, originalFilePath); if (!isRecovering) { storageManager->getRelsStatistics()->checkpointInMemoryIfNecessary(); @@ -164,10 +164,10 @@ void WALReplayer::replayTableStatisticsRecord(const WALRecord& walRecord) { void WALReplayer::replayCatalogRecord() { if (isCheckpoint) { - auto walFile = StorageUtils::getCatalogFilePath( - vfs, wal->getDirectory(), common::FileVersionType::WAL_VERSION); - auto originalFile = StorageUtils::getCatalogFilePath( - vfs, wal->getDirectory(), common::FileVersionType::ORIGINAL); + auto walFile = StorageUtils::getCatalogFilePath(vfs, wal->getDirectory(), + common::FileVersionType::WAL_VERSION); + auto originalFile = StorageUtils::getCatalogFilePath(vfs, wal->getDirectory(), + common::FileVersionType::ORIGINAL); vfs->overwriteFile(walFile, originalFile); if (!isRecovering) { catalog->checkpointInMemory(); @@ -309,8 +309,8 @@ void WALReplayer::replayAddPropertyRecord(const WALRecord& walRecord) { } } -void WALReplayer::truncateFileIfInsertion( - BMFileHandle* fileHandle, const PageUpdateOrInsertRecord& pageInsertOrUpdateRecord) { +void WALReplayer::truncateFileIfInsertion(BMFileHandle* fileHandle, + const PageUpdateOrInsertRecord& pageInsertOrUpdateRecord) { if (pageInsertOrUpdateRecord.isInsert) { // If we are rolling back and this is a page insertion we truncate the fileHandle's // data structures that hold locks for pageIdxs. diff --git a/src/storage/wal_replayer_utils.cpp b/src/storage/wal_replayer_utils.cpp index 259c9b4c86f..51ab6cd8ba8 100644 --- a/src/storage/wal_replayer_utils.cpp +++ b/src/storage/wal_replayer_utils.cpp @@ -9,8 +9,8 @@ using namespace kuzu::common; namespace kuzu { namespace storage { -void WALReplayerUtils::removeHashIndexFile( - common::VirtualFileSystem* vfs, table_id_t tableID, const std::string& directory) { +void WALReplayerUtils::removeHashIndexFile(common::VirtualFileSystem* vfs, table_id_t tableID, + const std::string& directory) { vfs->removeFileIfExists( StorageUtils::getNodeIndexFName(vfs, directory, tableID, FileVersionType::ORIGINAL)); } @@ -21,8 +21,8 @@ void WALReplayerUtils::createEmptyHashIndexFiles(catalog::NodeTableCatalogEntry* auto dt = pk->getDataType(); if (dt->getLogicalTypeID() != LogicalTypeID::SERIAL) { auto pkIndex = make_unique( - StorageUtils::getNodeIndexFName( - vfs, directory, nodeTableEntry->getTableID(), FileVersionType::ORIGINAL), + StorageUtils::getNodeIndexFName(vfs, directory, nodeTableEntry->getTableID(), + FileVersionType::ORIGINAL), pk->getDataType()->getPhysicalType(), vfs); pkIndex->bulkReserve(0 /* numNodes */); pkIndex->flush(); diff --git a/src/transaction/transaction_context.cpp b/src/transaction/transaction_context.cpp index 8f57607b8e6..b88cac40ae1 100644 --- a/src/transaction/transaction_context.cpp +++ b/src/transaction/transaction_context.cpp @@ -40,8 +40,8 @@ void TransactionContext::beginAutoTransaction(bool readOnlyStatement) { readOnlyStatement ? TransactionType::READ_ONLY : TransactionType::WRITE); } -void TransactionContext::validateManualTransaction( - bool allowActiveTransaction, bool readOnlyStatement) { +void TransactionContext::validateManualTransaction(bool allowActiveTransaction, + bool readOnlyStatement) { KU_ASSERT(hasActiveTransaction()); if (activeTransaction->isReadOnly() && !readOnlyStatement) { throw ConnectionException("Can't execute a write query inside a read-only transaction."); diff --git a/src/transaction/transaction_manager.cpp b/src/transaction/transaction_manager.cpp index bcc53b19bf7..11daaba5799 100644 --- a/src/transaction/transaction_manager.cpp +++ b/src/transaction/transaction_manager.cpp @@ -32,8 +32,8 @@ std::unique_ptr TransactionManager::beginReadOnlyTransaction( // ensures calls to other public functions is not restricted. lock_t newTransactionLck{mtxForStartingNewTransactions}; lock_t publicFunctionLck{mtxForSerializingPublicFunctionCalls}; - auto transaction = std::make_unique( - clientContext, TransactionType::READ_ONLY, ++lastTransactionID); + auto transaction = std::make_unique(clientContext, TransactionType::READ_ONLY, + ++lastTransactionID); activeReadOnlyTransactionIDs.insert(transaction->getID()); return transaction; } diff --git a/test/c_api/connection_test.cpp b/test/c_api/connection_test.cpp index c3989dc2ac6..3acd8c647f8 100644 --- a/test/c_api/connection_test.cpp +++ b/test/c_api/connection_test.cpp @@ -101,8 +101,8 @@ TEST_F(CApiConnectionTest, Execute) { TEST_F(CApiConnectionTest, QueryTimeout) { auto connection = getConnection(); kuzu_connection_set_query_timeout(connection, 1); - auto result = kuzu_connection_query( - connection, "MATCH (a:person)-[:knows*1..28]->(b:person) RETURN COUNT(*);"); + auto result = kuzu_connection_query(connection, + "MATCH (a:person)-[:knows*1..28]->(b:person) RETURN COUNT(*);"); ASSERT_NE(result, nullptr); ASSERT_NE(result->_query_result, nullptr); auto resultCpp = static_cast(result->_query_result); @@ -124,8 +124,8 @@ TEST_F(CApiConnectionTest, Interrupt) { kuzu_connection_interrupt(connection); } while (!finished); }); - auto result = kuzu_connection_query( - connection, "MATCH (a:person)-[:knows*1..28]->(b:person) RETURN COUNT(*);"); + auto result = kuzu_connection_query(connection, + "MATCH (a:person)-[:knows*1..28]->(b:person) RETURN COUNT(*);"); finished = true; ASSERT_NE(result, nullptr); ASSERT_NE(result->_query_result, nullptr); diff --git a/test/c_api/flat_tuple_test.cpp b/test/c_api/flat_tuple_test.cpp index bdc7c48ab82..c5c00c9c937 100644 --- a/test/c_api/flat_tuple_test.cpp +++ b/test/c_api/flat_tuple_test.cpp @@ -13,8 +13,8 @@ class CApiFlatTupleTest : public CApiTest { TEST_F(CApiFlatTupleTest, GetValue) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, "MATCH (a:person) RETURN a.fName, a.age, a.height ORDER BY a.fName LIMIT 1"); + auto result = kuzu_connection_query(connection, + "MATCH (a:person) RETURN a.fName, a.age, a.height ORDER BY a.fName LIMIT 1"); ASSERT_TRUE(kuzu_query_result_is_success(result)); auto flatTuple = kuzu_query_result_get_next(result); ASSERT_NE(flatTuple, nullptr); @@ -47,8 +47,8 @@ TEST_F(CApiFlatTupleTest, GetValue) { TEST_F(CApiFlatTupleTest, ToString) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, "MATCH (a:person) RETURN a.fName, a.age, a.height ORDER BY a.fName LIMIT 1"); + auto result = kuzu_connection_query(connection, + "MATCH (a:person) RETURN a.fName, a.age, a.height ORDER BY a.fName LIMIT 1"); ASSERT_TRUE(kuzu_query_result_is_success(result)); auto flatTuple = kuzu_query_result_get_next(result); ASSERT_NE(flatTuple, nullptr); diff --git a/test/c_api/query_result_test.cpp b/test/c_api/query_result_test.cpp index 128d786ade3..c2f811bf49e 100644 --- a/test/c_api/query_result_test.cpp +++ b/test/c_api/query_result_test.cpp @@ -125,8 +125,8 @@ TEST_F(CApiQueryResultTest, GetQuerySummary) { TEST_F(CApiQueryResultTest, GetNext) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, "MATCH (a:person) RETURN a.fName, a.age ORDER BY a.fName"); + auto result = kuzu_connection_query(connection, + "MATCH (a:person) RETURN a.fName, a.age ORDER BY a.fName"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); @@ -151,8 +151,8 @@ TEST_F(CApiQueryResultTest, GetNext) { TEST_F(CApiQueryResultTest, ResetIterator) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, "MATCH (a:person) RETURN a.fName, a.age ORDER BY a.fName"); + auto result = kuzu_connection_query(connection, + "MATCH (a:person) RETURN a.fName, a.age ORDER BY a.fName"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); diff --git a/test/c_api/value_test.cpp b/test/c_api/value_test.cpp index ff552819e79..345582f5f61 100644 --- a/test/c_api/value_test.cpp +++ b/test/c_api/value_test.cpp @@ -310,8 +310,8 @@ TEST(CApiValueTestEmptyDB, Copy) { TEST_F(CApiValueTest, GetListSize) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.workedHours ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.workedHours ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -326,8 +326,8 @@ TEST_F(CApiValueTest, GetListSize) { TEST_F(CApiValueTest, GetListElement) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.workedHours ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.workedHours ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -356,8 +356,8 @@ TEST_F(CApiValueTest, GetListElement) { TEST_F(CApiValueTest, GetStructNumFields) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (m:movies) WHERE m.name=\"Roma\" RETURN m.description"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (m:movies) WHERE m.name=\"Roma\" RETURN m.description"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -371,8 +371,8 @@ TEST_F(CApiValueTest, GetStructNumFields) { TEST_F(CApiValueTest, GetStructFieldName) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (m:movies) WHERE m.name=\"Roma\" RETURN m.description"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (m:movies) WHERE m.name=\"Roma\" RETURN m.description"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -420,8 +420,8 @@ TEST_F(CApiValueTest, GetStructFieldName) { TEST_F(CApiValueTest, GetStructFieldValue) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (m:movies) WHERE m.name=\"Roma\" RETURN m.description"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (m:movies) WHERE m.name=\"Roma\" RETURN m.description"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -501,8 +501,8 @@ TEST_F(CApiValueTest, GetStructFieldValue) { TEST_F(CApiValueTest, GetDataType) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.fName, a.isStudent, a.workedHours"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.fName, a.isStudent, a.workedHours"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -530,8 +530,8 @@ TEST_F(CApiValueTest, GetDataType) { TEST_F(CApiValueTest, GetBool) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.isStudent ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.isStudent ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -578,8 +578,8 @@ TEST_F(CApiValueTest, GetInt16) { TEST_F(CApiValueTest, GetInt32) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (m:movies) RETURN m.length ORDER BY m.name"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (m:movies) RETURN m.length ORDER BY m.name"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -723,8 +723,8 @@ TEST_F(CApiValueTest, GetFloat) { TEST_F(CApiValueTest, GetDouble) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.eyeSight ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.eyeSight ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -758,8 +758,8 @@ TEST_F(CApiValueTest, GetInternalID) { TEST_F(CApiValueTest, GetRelVal) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) -[r:knows]-> (b:person) RETURN r ORDER BY a.ID, b.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) -[r:knows]-> (b:person) RETURN r ORDER BY a.ID, b.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -789,8 +789,8 @@ TEST_F(CApiValueTest, GetRelVal) { TEST_F(CApiValueTest, GetDate) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.birthdate ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.birthdate ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -805,8 +805,8 @@ TEST_F(CApiValueTest, GetDate) { TEST_F(CApiValueTest, GetTimestamp) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.registerTime ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.registerTime ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -821,8 +821,8 @@ TEST_F(CApiValueTest, GetTimestamp) { TEST_F(CApiValueTest, GetInterval) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)"MATCH (a:person) RETURN a.lastJobDuration ORDER BY a.ID"); + auto result = kuzu_connection_query(connection, + (char*)"MATCH (a:person) RETURN a.lastJobDuration ORDER BY a.ID"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); @@ -879,8 +879,8 @@ TEST_F(CApiValueTest, GetBlob) { TEST_F(CApiValueTest, GetUUID) { auto connection = getConnection(); - auto result = kuzu_connection_query( - connection, (char*)R"(RETURN UUID("A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11");)"); + auto result = kuzu_connection_query(connection, + (char*)R"(RETURN UUID("A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11");)"); ASSERT_TRUE(kuzu_query_result_is_success(result)); ASSERT_TRUE(kuzu_query_result_has_next(result)); auto flatTuple = kuzu_query_result_get_next(result); diff --git a/test/common/interval_test.cpp b/test/common/interval_test.cpp index ea6137c13ed..7bd548a92ff 100644 --- a/test/common/interval_test.cpp +++ b/test/common/interval_test.cpp @@ -12,8 +12,8 @@ TEST(IntervalTests, FromCString) { EXPECT_EQ(result.months, 28); EXPECT_EQ(result.days, 21); EXPECT_EQ(result.micros, 11040000028); - result = Interval::fromCString( - "32 days 48 hours 12 minutes 280 us", strlen("32 days 48 hours 12 minutes 280 us")); + result = Interval::fromCString("32 days 48 hours 12 minutes 280 us", + strlen("32 days 48 hours 12 minutes 280 us")); EXPECT_EQ(result.months, 0); EXPECT_EQ(result.days, 32); EXPECT_EQ(result.micros, 173520000280); @@ -29,8 +29,8 @@ TEST(IntervalTests, FromCString) { EXPECT_EQ(result.months, 28); EXPECT_EQ(result.days, 21); EXPECT_EQ(result.micros, 11040000028); - result = Interval::fromCString( - "2 years 4 months 21 days 03:04:00", strlen("2 years 4 months 21 days 03:04:00")); + result = Interval::fromCString("2 years 4 months 21 days 03:04:00", + strlen("2 years 4 months 21 days 03:04:00")); EXPECT_EQ(result.months, 28); EXPECT_EQ(result.days, 21); EXPECT_EQ(result.micros, 11040000000); diff --git a/test/common/null_mask_test.cpp b/test/common/null_mask_test.cpp index 5898d58e7a2..983c4e7b93b 100644 --- a/test/common/null_mask_test.cpp +++ b/test/common/null_mask_test.cpp @@ -16,8 +16,8 @@ TEST(NullMaskTests, TestRangeSingleEntry) { } TEST(NullMaskTests, TestRangeMultipleEntries) { - std::vector data{ - NullMask::ALL_NULL_ENTRY, NullMask::ALL_NULL_ENTRY, NullMask::ALL_NULL_ENTRY}; + std::vector data{NullMask::ALL_NULL_ENTRY, NullMask::ALL_NULL_ENTRY, + NullMask::ALL_NULL_ENTRY}; NullMask::setNullRange(data.data(), 5, 150, false); ASSERT_EQ(data[0], 0b11111); ASSERT_EQ(data[1], 0); @@ -85,10 +85,10 @@ TEST(NullMaskTests, CopyNullMaskReturnValue) { std::vector source(10, ~0ull); std::vector dest(10); ASSERT_EQ(NullMask::copyNullMask(source.data(), 0, dest.data(), 0, 64, false /*invert*/), true); - ASSERT_EQ( - NullMask::copyNullMask(emptySource.data(), 0, dest.data(), 0, 64, false /*invert*/), false); + ASSERT_EQ(NullMask::copyNullMask(emptySource.data(), 0, dest.data(), 0, 64, false /*invert*/), + false); ASSERT_EQ(NullMask::copyNullMask(source.data(), 0, dest.data(), 0, 64, true /*invert*/), false); - ASSERT_EQ( - NullMask::copyNullMask(emptySource.data(), 0, dest.data(), 0, 64, true /*invert*/), true); + ASSERT_EQ(NullMask::copyNullMask(emptySource.data(), 0, dest.data(), 0, 64, true /*invert*/), + true); } diff --git a/test/common/time_test.cpp b/test/common/time_test.cpp index 276b3fc4acc..01d1830310b 100644 --- a/test/common/time_test.cpp +++ b/test/common/time_test.cpp @@ -10,36 +10,44 @@ TEST(TimeTests, FromTime) { Time::fromTime(25, 24, 32, 231321); FAIL(); } catch (ConversionException& e) { - ASSERT_STREQ( - e.what(), "Conversion exception: Time field value out of range: 25:24:32[.231321]."); - } catch (std::exception& e) { FAIL(); } + ASSERT_STREQ(e.what(), + "Conversion exception: Time field value out of range: 25:24:32[.231321]."); + } catch (std::exception& e) { + FAIL(); + } // Minute out of range try { Time::fromTime(21, 60, 22, 212322); FAIL(); } catch (ConversionException& e) { - ASSERT_STREQ( - e.what(), "Conversion exception: Time field value out of range: 21:60:22[.212322]."); - } catch (std::exception& e) { FAIL(); } + ASSERT_STREQ(e.what(), + "Conversion exception: Time field value out of range: 21:60:22[.212322]."); + } catch (std::exception& e) { + FAIL(); + } // Second out of range try { Time::fromTime(14, 22, 61); FAIL(); } catch (ConversionException& e) { - ASSERT_STREQ( - e.what(), "Conversion exception: Time field value out of range: 14:22:61[.0]."); - } catch (std::exception& e) { FAIL(); } + ASSERT_STREQ(e.what(), + "Conversion exception: Time field value out of range: 14:22:61[.0]."); + } catch (std::exception& e) { + FAIL(); + } // Microsecond out of range try { Time::fromTime(14, 22, 42, 1000001); FAIL(); } catch (ConversionException& e) { - ASSERT_STREQ( - e.what(), "Conversion exception: Time field value out of range: 14:22:42[.1000001]."); - } catch (std::exception& e) { FAIL(); } + ASSERT_STREQ(e.what(), + "Conversion exception: Time field value out of range: 14:22:42[.1000001]."); + } catch (std::exception& e) { + FAIL(); + } EXPECT_EQ(80052000000, Time::fromTime(22, 14, 12).micros); EXPECT_EQ(58991000024, Time::fromTime(16, 23, 11, 24).micros); @@ -53,7 +61,9 @@ TEST(TimeTests, FromCString) { } catch (ConversionException& e) { ASSERT_STREQ(e.what(), "Conversion exception: Error occurred during parsing time. Given: " "\"25:12:00\". Expected format: (hh:mm:ss[.zzzzzz])."); - } catch (std::exception& e) { FAIL(); } + } catch (std::exception& e) { + FAIL(); + } // Hour out of range try { @@ -62,7 +72,9 @@ TEST(TimeTests, FromCString) { } catch (ConversionException& e) { ASSERT_STREQ(e.what(), "Conversion exception: Error occurred during parsing time. Given: " "\"24:00:00\". Expected format: (hh:mm:ss[.zzzzzz])."); - } catch (std::exception& e) { FAIL(); } + } catch (std::exception& e) { + FAIL(); + } EXPECT_EQ(83531000000, Time::fromCString("23:12:11", strlen("23:12:11")).micros); EXPECT_EQ(46792122311, Time::fromCString("12:59:52.122311", strlen("12:59:52.122311")).micros); diff --git a/test/common/timestamp_test.cpp b/test/common/timestamp_test.cpp index 2d3e19106cb..bd8e2fc37eb 100644 --- a/test/common/timestamp_test.cpp +++ b/test/common/timestamp_test.cpp @@ -12,7 +12,9 @@ TEST(TimestampTests, FromDatetime) { FAIL(); } catch (ConversionException& e) { ASSERT_STREQ(e.what(), "Conversion exception: Date out of range: 1968-12-42."); - } catch (std::exception& e) { FAIL(); } + } catch (std::exception& e) { + FAIL(); + } // 2021 is not a leap year, February only has 28 days. try { @@ -20,16 +22,20 @@ TEST(TimestampTests, FromDatetime) { FAIL(); } catch (ConversionException& e) { ASSERT_STREQ(e.what(), "Conversion exception: Date out of range: 2021-2-29."); - } catch (std::exception& e) { FAIL(); } + } catch (std::exception& e) { + FAIL(); + } // hour is out of range try { Timestamp::fromDateTime(Date::fromDate(1968, 12, 22), Time::fromTime(25, 32, 51)); FAIL(); } catch (ConversionException& e) { - ASSERT_STREQ( - e.what(), "Conversion exception: Time field value out of range: 25:32:51[.0]."); - } catch (std::exception& e) { FAIL(); } + ASSERT_STREQ(e.what(), + "Conversion exception: Time field value out of range: 25:32:51[.0]."); + } catch (std::exception& e) { + FAIL(); + } // second is out of range try { @@ -37,16 +43,20 @@ TEST(TimestampTests, FromDatetime) { FAIL(); } catch (ConversionException& e) { ASSERT_STREQ(e.what(), "Conversion exception: Time field value out of range: 5:52:70[.0]."); - } catch (std::exception& e) { FAIL(); } + } catch (std::exception& e) { + FAIL(); + } // microsecond is out of rarnge try { Timestamp::fromDateTime(Date::fromDate(2021, 2, 28), Time::fromTime(5, 52, 42, 1000002)); FAIL(); } catch (ConversionException& e) { - ASSERT_STREQ( - e.what(), "Conversion exception: Time field value out of range: 5:52:42[.1000002]."); - } catch (std::exception& e) { FAIL(); } + ASSERT_STREQ(e.what(), + "Conversion exception: Time field value out of range: 5:52:42[.1000002]."); + } catch (std::exception& e) { + FAIL(); + } EXPECT_EQ( Timestamp::fromDateTime(Date::fromDate(2020, 10, 22), Time::fromTime(21, 32, 51)).value, @@ -85,12 +95,12 @@ TEST(TimestampTests, FromCString) { Timestamp::fromCString("2112-08-21 08:21:23.005612Z", strlen("2112-08-21 08:21:23.005612Z")) .value, 4501210883005612); - EXPECT_EQ(Timestamp::fromCString( - "2112-08-21 08:21:23.005612Z+00:00", strlen("2112-08-21 08:21:23.005612Z+00:00")) + EXPECT_EQ(Timestamp::fromCString("2112-08-21 08:21:23.005612Z+00:00", + strlen("2112-08-21 08:21:23.005612Z+00:00")) .value, 4501210883005612); - EXPECT_EQ(Timestamp::fromCString( - "2112-08-21 08:21:23.005612Z+02:00", strlen("2112-08-21 08:21:23.005612Z+02:00")) + EXPECT_EQ(Timestamp::fromCString("2112-08-21 08:21:23.005612Z+02:00", + strlen("2112-08-21 08:21:23.005612Z+02:00")) .value, 4501203683005612); EXPECT_EQ( @@ -100,8 +110,8 @@ TEST(TimestampTests, FromCString) { EXPECT_EQ( Timestamp::fromCString("1992-04-28T09:22:56-09", strlen("1992-04-28T09:22:56-09")).value, 704485376000000); - EXPECT_EQ(Timestamp::fromCString( - "1992-04-28T09:22:56-09:00 ", strlen("1992-04-28T09:22:56-09:00 ")) + EXPECT_EQ(Timestamp::fromCString("1992-04-28T09:22:56-09:00 ", + strlen("1992-04-28T09:22:56-09:00 ")) .value, 704485376000000); EXPECT_EQ( diff --git a/test/ddl/e2e_ddl_test.cpp b/test/ddl/e2e_ddl_test.cpp index 5cfce9ddd67..ce756460da6 100644 --- a/test/ddl/e2e_ddl_test.cpp +++ b/test/ddl/e2e_ddl_test.cpp @@ -107,8 +107,8 @@ class TinySnbDDLTest : public DBTest { "Binder exception: Nodes a and b are not connected through rel e."); } - void dropTableCommitAndRecoveryTest( - std::string tableName, TransactionTestType transactionTestType) { + void dropTableCommitAndRecoveryTest(std::string tableName, + TransactionTestType transactionTestType) { auto tableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, tableName); auto tableSchema = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID)->copy(); executeQueryWithoutCommit(stringFormat("DROP TABLE {}", tableName)); @@ -178,8 +178,8 @@ class TinySnbDDLTest : public DBTest { getQueryProcessor(*database)->execute(physicalPlan.get(), executionContext.get()); } - void addPropertyToPersonTableWithoutDefaultValue( - std::string propertyType, TransactionTestType transactionTestType) { + void addPropertyToPersonTableWithoutDefaultValue(std::string propertyType, + TransactionTestType transactionTestType) { executeQueryWithoutCommit(stringFormat("ALTER TABLE person ADD random {}", propertyType)); if (transactionTestType == TransactionTestType::RECOVERY) { conn->query("COMMIT_SKIP_CHECKPOINT"); @@ -201,8 +201,8 @@ class TinySnbDDLTest : public DBTest { // The convertResultToString function will remove the single quote around the result // std::string, so we should also remove the single quote in the expected result. defaultVal.erase(remove(defaultVal.begin(), defaultVal.end(), '\''), defaultVal.end()); - std::vector expectedResult( - 8 /* numOfNodesInPesron */, expectedVal.empty() ? defaultVal : expectedVal); + std::vector expectedResult(8 /* numOfNodesInPesron */, + expectedVal.empty() ? defaultVal : expectedVal); if (transactionTestType == TransactionTestType::RECOVERY) { conn->query("COMMIT_SKIP_CHECKPOINT"); initWithoutLoadingGraph(); @@ -214,8 +214,8 @@ class TinySnbDDLTest : public DBTest { expectedResult); } - void addPropertyToStudyAtTableWithoutDefaultValue( - std::string propertyType, TransactionTestType transactionTestType) { + void addPropertyToStudyAtTableWithoutDefaultValue(std::string propertyType, + TransactionTestType transactionTestType) { executeQueryWithoutCommit(stringFormat("ALTER TABLE studyAt ADD random {}", propertyType)); if (transactionTestType == TransactionTestType::RECOVERY) { conn->query("COMMIT_SKIP_CHECKPOINT"); @@ -230,8 +230,8 @@ class TinySnbDDLTest : public DBTest { } } - void addPropertyToStudyAtTableWithDefaultValue( - std::string propertyType, std::string defaultVal, TransactionTestType transactionTestType) { + void addPropertyToStudyAtTableWithDefaultValue(std::string propertyType, std::string defaultVal, + TransactionTestType transactionTestType) { executeQueryWithoutCommit( stringFormat("ALTER TABLE studyAt ADD random {} DEFAULT {}", propertyType, defaultVal)); defaultVal.erase(remove(defaultVal.begin(), defaultVal.end(), '\''), defaultVal.end()); @@ -330,28 +330,28 @@ TEST_F(TinySnbDDLTest, DropRelTablePropertyRecovery) { } TEST_F(TinySnbDDLTest, AddInt64PropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "INT64" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithoutDefaultValue("INT64" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddArrayPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "DOUBLE[5]" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithoutDefaultValue("DOUBLE[5]" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddStringPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "STRING" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithoutDefaultValue("STRING" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddListOfInt64PropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "INT64[]" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithoutDefaultValue("INT64[]" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddListOfStringPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "STRING[]" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithoutDefaultValue("STRING[]" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddListOfStructPropertyToPersonTableWithoutDefaultValueRecovery) { @@ -360,8 +360,8 @@ TEST_F(TinySnbDDLTest, AddListOfStructPropertyToPersonTableWithoutDefaultValueRe } TEST_F(TinySnbDDLTest, AddMapPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "MAP(STRING, INT64)" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithoutDefaultValue("MAP(STRING, INT64)" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddStructPropertyToPersonTableWithoutDefaultValueRecovery) { @@ -370,8 +370,8 @@ TEST_F(TinySnbDDLTest, AddStructPropertyToPersonTableWithoutDefaultValueRecovery } TEST_F(TinySnbDDLTest, AddInt64PropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue( - "INT64" /* propertyType */, "21" /* defaultVal */, TransactionTestType::RECOVERY); + addPropertyToPersonTableWithDefaultValue("INT64" /* propertyType */, "21" /* defaultVal */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddStringPropertyToPersonTableWithDefaultValueRecovery) { @@ -417,28 +417,28 @@ TEST_F(TinySnbDDLTest, AddStructPropertyToPersonTableWithDefaultValueRecovery) { } TEST_F(TinySnbDDLTest, AddInt64PropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "INT64" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToStudyAtTableWithoutDefaultValue("INT64" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddStringPropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "STRING" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToStudyAtTableWithoutDefaultValue("STRING" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "INT64[]" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToStudyAtTableWithoutDefaultValue("INT64[]" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddListOfStringPropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "STRING[]" /* propertyType */, TransactionTestType::RECOVERY); + addPropertyToStudyAtTableWithoutDefaultValue("STRING[]" /* propertyType */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddInt64PropertyToStudyAtTableWithDefaultValueRecovery) { - addPropertyToStudyAtTableWithDefaultValue( - "INT64" /* propertyType */, "42" /* defaultVal */, TransactionTestType::RECOVERY); + addPropertyToStudyAtTableWithDefaultValue("INT64" /* propertyType */, "42" /* defaultVal */, + TransactionTestType::RECOVERY); } TEST_F(TinySnbDDLTest, AddStringPropertyToStudyAtTableWithDefaultValueRecovery) { diff --git a/test/graph_test/base_graph_test.cpp b/test/graph_test/base_graph_test.cpp index e77b0b18903..0f8817fbd24 100644 --- a/test/graph_test/base_graph_test.cpp +++ b/test/graph_test/base_graph_test.cpp @@ -11,8 +11,8 @@ using namespace kuzu::main; namespace kuzu { namespace testing { -void BaseGraphTest::commitOrRollbackConnectionAndInitDBIfNecessary( - bool isCommit, TransactionTestType transactionTestType) { +void BaseGraphTest::commitOrRollbackConnectionAndInitDBIfNecessary(bool isCommit, + TransactionTestType transactionTestType) { commitOrRollbackConnection(isCommit, transactionTestType); if (transactionTestType == TransactionTestType::RECOVERY) { // This creates a new database/conn/readConn and should run the recovery algorithm. @@ -68,8 +68,8 @@ void TestHelper::executeScript(const std::string& cypherScript, Connection& conn auto result = conn.query(line); std::cout << "Executed query: " << line << std::endl; if (!result->isSuccess()) { - throw Exception(stringFormat( - "Failed to execute statement: {}.\nError: {}", line, result->getErrorMessage())); + throw Exception(stringFormat("Failed to execute statement: {}.\nError: {}", line, + result->getErrorMessage())); } } } @@ -110,15 +110,15 @@ void BaseGraphTest::initGraph() { TestHelper::executeScript(getInputDir() + TestHelper::COPY_FILE_NAME, *conn); } else { // choose a conn from connMap - TestHelper::executeScript( - getInputDir() + TestHelper::SCHEMA_FILE_NAME, *(connMap.begin()->second)); - TestHelper::executeScript( - getInputDir() + TestHelper::COPY_FILE_NAME, *(connMap.begin()->second)); + TestHelper::executeScript(getInputDir() + TestHelper::SCHEMA_FILE_NAME, + *(connMap.begin()->second)); + TestHelper::executeScript(getInputDir() + TestHelper::COPY_FILE_NAME, + *(connMap.begin()->second)); } } -void BaseGraphTest::commitOrRollbackConnection( - bool isCommit, TransactionTestType transactionTestType) const { +void BaseGraphTest::commitOrRollbackConnection(bool isCommit, + TransactionTestType transactionTestType) const { if (transactionTestType == TransactionTestType::NORMAL_EXECUTION) { if (isCommit) { conn->query("COMMIT"); diff --git a/test/graph_test/graph_test.cpp b/test/graph_test/graph_test.cpp index 7eaa935a165..9834615deb0 100644 --- a/test/graph_test/graph_test.cpp +++ b/test/graph_test/graph_test.cpp @@ -19,8 +19,8 @@ using namespace kuzu::transaction; namespace kuzu { namespace testing { -void PrivateGraphTest::validateQueryBestPlanJoinOrder( - std::string query, std::string expectedJoinOrder) { +void PrivateGraphTest::validateQueryBestPlanJoinOrder(std::string query, + std::string expectedJoinOrder) { auto statement = parser::Parser::parseQuery(query); ASSERT_EQ(statement.size(), 1); auto parsedQuery = (parser::RegularQuery*)statement[0].get(); diff --git a/test/include/graph_test/base_graph_test.h b/test/include/graph_test/base_graph_test.h index 105eb1a9603..e129cceefc0 100644 --- a/test/include/graph_test/base_graph_test.h +++ b/test/include/graph_test/base_graph_test.h @@ -101,8 +101,8 @@ class BaseGraphTest : public Test { static inline main::ClientContext* getClientContext(main::Connection& connection) { return connection.clientContext.get(); } - static inline void sortAndCheckTestResults( - std::vector& actualResult, std::vector& expectedResult) { + static inline void sortAndCheckTestResults(std::vector& actualResult, + std::vector& expectedResult) { sort(expectedResult.begin(), expectedResult.end()); ASSERT_EQ(actualResult, expectedResult); } @@ -110,8 +110,8 @@ class BaseGraphTest : public Test { return typeID == common::LogicalTypeID::STRING || typeID == common::LogicalTypeID::LIST; } - void commitOrRollbackConnectionAndInitDBIfNecessary( - bool isCommit, TransactionTestType transactionTestType); + void commitOrRollbackConnectionAndInitDBIfNecessary(bool isCommit, + TransactionTestType transactionTestType); inline std::string getTestGroupAndName() { const ::testing::TestInfo* const testInfo = diff --git a/test/include/test_helper/test_helper.h b/test/include/test_helper/test_helper.h index 1c95e26b823..e62911719cf 100644 --- a/test/include/test_helper/test_helper.h +++ b/test/include/test_helper/test_helper.h @@ -27,11 +27,11 @@ class TestHelper { static constexpr char TEST_STATEMENTS_PATH[] = "test/statements"; static constexpr char DEFAULT_CONN_NAME[] = "conn_default"; - static std::vector> parseTestFile( - const std::string& path, bool checkOutputOrder = false); + static std::vector> parseTestFile(const std::string& path, + bool checkOutputOrder = false); - static std::vector convertResultToString( - main::QueryResult& queryResult, bool checkOutputOrder = false); + static std::vector convertResultToString(main::QueryResult& queryResult, + bool checkOutputOrder = false); static void executeScript(const std::string& path, main::Connection& conn); diff --git a/test/include/test_runner/csv_to_parquet_converter.h b/test/include/test_runner/csv_to_parquet_converter.h index 54b9d805519..0eeae9144de 100644 --- a/test/include/test_runner/csv_to_parquet_converter.h +++ b/test/include/test_runner/csv_to_parquet_converter.h @@ -11,8 +11,8 @@ namespace testing { // The dataset directory must contain schema and copy files. class CSVToParquetConverter { public: - explicit CSVToParquetConverter( - std::string csvDatasetPath, std::string parquetDatasetPath, uint64_t bufferPoolSize) + explicit CSVToParquetConverter(std::string csvDatasetPath, std::string parquetDatasetPath, + uint64_t bufferPoolSize) : csvDatasetPath{csvDatasetPath}, parquetDatasetPath{parquetDatasetPath}, bufferPoolSize{bufferPoolSize} {} diff --git a/test/include/test_runner/test_parser.h b/test/include/test_runner/test_parser.h index 5163bf28dd2..297d54cb6b9 100644 --- a/test/include/test_runner/test_parser.h +++ b/test/include/test_runner/test_parser.h @@ -125,8 +125,8 @@ class TestParser { inline std::string getParam(int paramIdx) { return currentToken.params[paramIdx]; } - TestStatement* extractStatement( - TestStatement* currentStatement, const std::string& testCaseName); + TestStatement* extractStatement(TestStatement* currentStatement, + const std::string& testCaseName); TestStatement* addNewStatement(std::string& name); const std::string exportDBPath = TestHelper::appendKuzuRootPath( diff --git a/test/include/test_runner/test_runner.h b/test/include/test_runner/test_runner.h index cc3696d1fdf..ad8c1168541 100644 --- a/test/include/test_runner/test_runner.h +++ b/test/include/test_runner/test_runner.h @@ -8,21 +8,21 @@ namespace testing { class TestRunner { public: - static void runTest( - TestStatement* statement, main::Connection& conn, std::string& databasePath); + static void runTest(TestStatement* statement, main::Connection& conn, + std::string& databasePath); - static std::unique_ptr getLogicalPlan( - const std::string& query, main::Connection& conn); + static std::unique_ptr getLogicalPlan(const std::string& query, + main::Connection& conn); private: - static bool testStatement( - TestStatement* statement, main::Connection& conn, std::string& databasePath); + static bool testStatement(TestStatement* statement, main::Connection& conn, + std::string& databasePath); static bool checkLogicalPlans(std::unique_ptr& preparedStatement, TestStatement* statement, main::Connection& conn); static bool checkLogicalPlan(std::unique_ptr& preparedStatement, TestStatement* statement, main::Connection& conn, uint32_t planIdx); - static std::vector convertResultToString( - main::QueryResult& queryResult, bool checkOutputOrder = false); + static std::vector convertResultToString(main::QueryResult& queryResult, + bool checkOutputOrder = false); static std::string convertResultToMD5Hash(main::QueryResult& queryResult, bool checkOutputOrder); // returns hash and number of values hashed static bool checkPlanResult(std::unique_ptr& result, diff --git a/test/main/db_locking_test.cpp b/test/main/db_locking_test.cpp index 14d1489f3f6..95cc94ef348 100644 --- a/test/main/db_locking_test.cpp +++ b/test/main/db_locking_test.cpp @@ -13,8 +13,8 @@ class DBLockingTest : public ApiTest { }; TEST_F(DBLockingTest, testReadLock) { - uint64_t* count = (uint64_t*)mmap( - NULL, sizeof(uint64_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); + uint64_t* count = (uint64_t*)mmap(NULL, sizeof(uint64_t), PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_SHARED, 0, 0); *count = 0; // create db EXPECT_NO_THROW(createDBAndConn()); @@ -52,8 +52,8 @@ TEST_F(DBLockingTest, testReadLock) { } TEST_F(DBLockingTest, testWriteLock) { - uint64_t* count = (uint64_t*)mmap( - NULL, sizeof(uint64_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); + uint64_t* count = (uint64_t*)mmap(NULL, sizeof(uint64_t), PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_SHARED, 0, 0); *count = 0; // test write lock // fork away a child @@ -94,8 +94,8 @@ TEST_F(DBLockingTest, testWriteLock) { } TEST_F(DBLockingTest, testReadOnly) { - uint64_t* count = (uint64_t*)mmap( - NULL, sizeof(uint64_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0); + uint64_t* count = (uint64_t*)mmap(NULL, sizeof(uint64_t), PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_SHARED, 0, 0); *count = 0; // cannot create a read-only database in a new directory systemConfig->readOnly = true; diff --git a/test/main/prepare_test.cpp b/test/main/prepare_test.cpp index 5a38ddafb52..3886b23db7e 100644 --- a/test/main/prepare_test.cpp +++ b/test/main/prepare_test.cpp @@ -99,8 +99,8 @@ TEST_F(ApiTest, PrepareString) { TEST_F(ApiTest, PrepareDate) { auto preparedStatement = conn->prepare("MATCH (a:person) WHERE a.birthdate = $n RETURN COUNT(*)"); - auto result = conn->execute( - preparedStatement.get(), std::make_pair(std::string("n"), Date::fromDate(1900, 1, 1))); + auto result = conn->execute(preparedStatement.get(), + std::make_pair(std::string("n"), Date::fromDate(1900, 1, 1))); ASSERT_TRUE(result->hasNext()); checkTuple(result->getNext().get(), "2\n"); ASSERT_FALSE(result->hasNext()); @@ -123,8 +123,8 @@ TEST_F(ApiTest, PrepareInterval) { conn->prepare("MATCH (a:person) WHERE a.lastJobDuration = $n RETURN COUNT(*)"); std::string intervalStr = "3 years 2 days 13 hours 2 minutes"; auto result = conn->execute(preparedStatement.get(), - std::make_pair( - std::string("n"), Interval::fromCString(intervalStr.c_str(), intervalStr.length()))); + std::make_pair(std::string("n"), + Interval::fromCString(intervalStr.c_str(), intervalStr.length()))); ASSERT_TRUE(result->hasNext()); checkTuple(result->getNext().get(), "2\n"); ASSERT_FALSE(result->hasNext()); @@ -228,8 +228,8 @@ TEST_F(ApiTest, MultipleExecutionOfPreparedStatement) { TEST_F(ApiTest, issueTest4) { auto preparedStatement = conn->prepare("RETURN CAST($1, 'STRING')"); - auto result = conn->execute( - preparedStatement.get(), std::make_pair(std::string("1"), int128_t(-123456789))); + auto result = conn->execute(preparedStatement.get(), + std::make_pair(std::string("1"), int128_t(-123456789))); ASSERT_TRUE(result->hasNext()); checkTuple(result->getNext().get(), "-123456789\n"); ASSERT_FALSE(result->hasNext()); diff --git a/test/main/result_value_test.cpp b/test/main/result_value_test.cpp index 513b239b6c0..38cbfa6544c 100644 --- a/test/main/result_value_test.cpp +++ b/test/main/result_value_test.cpp @@ -17,7 +17,9 @@ TEST_F(ResultValueTest, getNextException) { ASSERT_STREQ("Runtime exception: No more tuples in QueryResult, Please check hasNext() " "before calling getNext().", exception.what()); - } catch (Exception& exception) { FAIL(); } catch (std::exception& exception) { + } catch (Exception& exception) { + FAIL(); + } catch (std::exception& exception) { FAIL(); } } @@ -33,7 +35,9 @@ TEST_F(ResultValueTest, getResultValueException) { ASSERT_STREQ("Runtime exception: ValIdx is out of range. Number of values in flatTuple: 1, " "valIdx: 100.", exception.what()); - } catch (Exception& exception) { FAIL(); } catch (std::exception& exception) { + } catch (Exception& exception) { + FAIL(); + } catch (std::exception& exception) { FAIL(); } } diff --git a/test/main/udf_test.cpp b/test/main/udf_test.cpp index e2e7e8a2db1..c01be2315a8 100644 --- a/test/main/udf_test.cpp +++ b/test/main/udf_test.cpp @@ -20,8 +20,8 @@ TEST_F(ApiTest, UnaryUDFInt64) { } TEST_F(ApiTest, UnaryUDFAddDate) { - conn->createScalarFunction( - "addFiveDays", std::vector{LogicalTypeID::DATE}, LogicalTypeID::DATE, &add5); + conn->createScalarFunction("addFiveDays", std::vector{LogicalTypeID::DATE}, + LogicalTypeID::DATE, &add5); auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (p:person) return addFiveDays(p.birthdate)")); auto expectedResult = std::vector{"1900-01-06", "1900-01-06", "1940-06-27", @@ -76,8 +76,8 @@ TEST_F(ApiTest, BinaryUDFFlatUnflat) { auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (p:person)-[:knows]->(p1:person) return " "addSecondParamTwice(to_int16(p.ID), to_int32(p1.age))")); - auto expectedResult = std::vector{ - "60", "90", "40", "72", "92", "42", "73", "63", "43", "75", "65", "95", "57", "87"}; + auto expectedResult = std::vector{"60", "90", "40", "72", "92", "42", "73", "63", + "43", "75", "65", "95", "57", "87"}; sortAndCheckTestResults(actualResult, expectedResult); } @@ -132,8 +132,8 @@ TEST_F(ApiTest, BinaryAddNanoSeconds) { auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (m:movies) return addNano(m.description.release_ns, " "to_int32(m.description.stars))")); - auto expectedResult = std::vector{ - "2011-08-20 11:25:30.123456", "2018-11-13 13:33:11.123456", "2011-02-11 16:44:22.123456"}; + auto expectedResult = std::vector{"2011-08-20 11:25:30.123456", + "2018-11-13 13:33:11.123456", "2011-02-11 16:44:22.123456"}; sortAndCheckTestResults(actualResult, expectedResult); } @@ -144,8 +144,8 @@ TEST_F(ApiTest, BinaryAddMilliSeconds) { auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (m:movies) return addMilli(m.description.release_ms, " "to_int32(m.description.stars))")); - auto expectedResult = std::vector{ - "2011-08-20 11:25:30.125", "2018-11-13 13:33:11.133", "2011-02-11 16:44:22.223"}; + auto expectedResult = std::vector{"2011-08-20 11:25:30.125", + "2018-11-13 13:33:11.133", "2011-02-11 16:44:22.223"}; sortAndCheckTestResults(actualResult, expectedResult); } @@ -156,8 +156,8 @@ TEST_F(ApiTest, BinaryAddSeconds) { auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (m:movies) return addSec(m.description.release_sec, " "to_int32(m.description.stars))")); - auto expectedResult = std::vector{ - "2011-08-20 11:25:32", "2018-11-13 13:33:21", "2011-02-11 16:46:02"}; + auto expectedResult = std::vector{"2011-08-20 11:25:32", "2018-11-13 13:33:21", + "2011-02-11 16:46:02"}; sortAndCheckTestResults(actualResult, expectedResult); } @@ -179,8 +179,8 @@ int32_t ternaryLenTotal(ku_string_t a, blob_t b, ku_string_t c) { TEST_F(ApiTest, TernaryUDFStr) { conn->createScalarFunction("ternaryLenTotal", - std::vector{ - LogicalTypeID::STRING, LogicalTypeID::BLOB, LogicalTypeID::STRING}, + std::vector{LogicalTypeID::STRING, LogicalTypeID::BLOB, + LogicalTypeID::STRING}, LogicalTypeID::INT32, &ternaryLenTotal); auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (m:movies) return ternaryLenTotal(m.name, m.content, m.note)")); @@ -194,7 +194,9 @@ static void validateUDFError(std::function createFunc, std::string errMs } catch (CatalogException& e) { ASSERT_EQ(std::string(e.what()), errMsg); return; - } catch (Exception&) { FAIL(); } + } catch (Exception&) { + FAIL(); + } FAIL(); } @@ -278,8 +280,8 @@ struct AddDate { static void addDate(const std::vector>& parameters, ValueVector& result, void* /*dataPtr*/ = nullptr) { KU_ASSERT(parameters.size() == 2); - function::BinaryFunctionExecutor::execute( - *parameters[0], *parameters[1], result); + function::BinaryFunctionExecutor::execute(*parameters[0], + *parameters[1], result); } TEST_F(ApiTest, vectorizedBinaryAddDate) { @@ -309,8 +311,8 @@ static void concat(const ku_string_t& left, const ku_string_t& right, ku_string_ } struct ConditionalConcat { - static inline void operation( - ku_string_t& a, bool& b, ku_string_t& c, ku_string_t& result, ValueVector& resultVector) { + static inline void operation(ku_string_t& a, bool& b, ku_string_t& c, ku_string_t& result, + ValueVector& resultVector) { // Concat a,c if b is true, otherwise concat c,a. if (b) { concat(a, c, result, resultVector); @@ -328,8 +330,8 @@ static void conditionalConcat(const std::vector>& p } TEST_F(ApiTest, vectorizedTernaryConditionalAdd) { - conn->createVectorizedFunction( - "conditionalConcat", &conditionalConcat); + conn->createVectorizedFunction("conditionalConcat", + &conditionalConcat); auto actualResult = TestHelper::convertResultToString( *conn->query("MATCH (p:person)-[:knows]->(p1:person) return conditionalConcat(p.fName, " "p.isStudent, p1.fName)")); diff --git a/test/runner/cleanup_test.cpp b/test/runner/cleanup_test.cpp index fc0bfcfaa49..caf30e06667 100644 --- a/test/runner/cleanup_test.cpp +++ b/test/runner/cleanup_test.cpp @@ -12,8 +12,8 @@ void deleteMatchingDir(const std::string& dirPath, const std::string& match) { } int main(int argc, char** argv) { - std::vector tempDirs = { - TestHelper::PARQUET_TEMP_DATASET_PATH, TestHelper::TMP_TEST_DIR}; + std::vector tempDirs = {TestHelper::PARQUET_TEMP_DATASET_PATH, + TestHelper::TMP_TEST_DIR}; if (argc > 1 && std::string(argv[1]) == "--gtest_list_tests") { for (const auto& tempDir : tempDirs) { // path = test/unittest_temp_ diff --git a/test/runner/e2e_test.cpp b/test/runner/e2e_test.cpp index 3cf9c9d0ac3..a68be2d31aa 100644 --- a/test/runner/e2e_test.cpp +++ b/test/runner/e2e_test.cpp @@ -15,8 +15,8 @@ class EndToEndTest : public DBTest { const std::set& connNames, std::vector> testStatements) : datasetType{datasetType}, dataset{std::move(dataset)}, bufferPoolSize{bufferPoolSize}, - checkpointWaitTimeout{checkpointWaitTimeout}, - testStatements{std::move(testStatements)}, connNames{connNames} {} + checkpointWaitTimeout{checkpointWaitTimeout}, testStatements{std::move(testStatements)}, + connNames{connNames} {} void SetUp() override { setUpDataset(); diff --git a/test/storage/compression_test.cpp b/test/storage/compression_test.cpp index 8b351e0518d..7675372ea99 100644 --- a/test/storage/compression_test.cpp +++ b/test/storage/compression_test.cpp @@ -33,8 +33,8 @@ void test_compression(CompressionAlg& alg, std::vector src) { EXPECT_EQ(decompressed[1], value); for (auto i = 0u; i < src.size(); i++) { - alg.decompressFromPage( - dest.data(), i, (uint8_t*)decompressed.data(), i, 1 /*numValues*/, metadata); + alg.decompressFromPage(dest.data(), i, (uint8_t*)decompressed.data(), i, 1 /*numValues*/, + metadata); EXPECT_EQ(decompressed[i], src[i]); } EXPECT_EQ(decompressed, src); @@ -145,8 +145,8 @@ void integerPackingMultiPage(const std::vector& src) { size_t pageNum = 0; while (numValuesRemaining > 0) { ASSERT_LT(pageNum, pages); - alg.compressNextPage( - srcCursor, numValuesRemaining, dest[pageNum++].data(), pageSize, metadata); + alg.compressNextPage(srcCursor, numValuesRemaining, dest[pageNum++].data(), pageSize, + metadata); numValuesRemaining -= numValuesPerPage; } ASSERT_EQ(srcCursor, (uint8_t*)(src.data() + src.size())); @@ -154,8 +154,8 @@ void integerPackingMultiPage(const std::vector& src) { auto page = i / numValuesPerPage; auto indexInPage = i % numValuesPerPage; T value; - alg.decompressFromPage( - dest[page].data(), indexInPage, (uint8_t*)&value, 0, 1 /*numValues*/, metadata); + alg.decompressFromPage(dest[page].data(), indexInPage, (uint8_t*)&value, 0, 1 /*numValues*/, + metadata); EXPECT_EQ(src[i] - value, 0); EXPECT_EQ(src[i], value); } diff --git a/test/test_helper/test_helper.cpp b/test/test_helper/test_helper.cpp index 61832015020..afe7d6b04c4 100644 --- a/test/test_helper/test_helper.cpp +++ b/test/test_helper/test_helper.cpp @@ -13,8 +13,8 @@ namespace kuzu { namespace testing { // Deprecated -std::vector> TestHelper::parseTestFile( - const std::string& path, bool checkOutputOrder) { +std::vector> TestHelper::parseTestFile(const std::string& path, + bool checkOutputOrder) { std::vector> result; if (access(path.c_str(), 0) != 0) { throw Exception("Test file not exists! [" + path + "]."); @@ -56,8 +56,8 @@ std::vector> TestHelper::parseTestFile( return result; } -std::vector TestHelper::convertResultToString( - QueryResult& queryResult, bool checkOutputOrder) { +std::vector TestHelper::convertResultToString(QueryResult& queryResult, + bool checkOutputOrder) { std::vector actualOutput; while (queryResult.hasNext()) { auto tuple = queryResult.getNext(); diff --git a/test/test_runner/test_parser.cpp b/test/test_runner/test_parser.cpp index 8441d94034b..01d4b23614e 100644 --- a/test/test_runner/test_parser.cpp +++ b/test/test_runner/test_parser.cpp @@ -173,8 +173,8 @@ std::string TestParser::extractTextBeforeNextStatement(bool ignoreLineBreak) { return extractedText; } -TestStatement* TestParser::extractStatement( - TestStatement* statement, const std::string& testCaseName) { +TestStatement* TestParser::extractStatement(TestStatement* statement, + const std::string& testCaseName) { if (endOfFile()) { return statement; } diff --git a/test/test_runner/test_runner.cpp b/test/test_runner/test_runner.cpp index a9d47a02ae5..829ef4a1427 100644 --- a/test/test_runner/test_runner.cpp +++ b/test/test_runner/test_runner.cpp @@ -36,8 +36,8 @@ void replaceEnv(std::string& queryToReplace, const std::string& env) { } } -bool TestRunner::testStatement( - TestStatement* statement, Connection& conn, std::string& databasePath) { +bool TestRunner::testStatement(TestStatement* statement, Connection& conn, + std::string& databasePath) { std::unique_ptr preparedStatement; StringUtils::replaceAll(statement->query, "${DATABASE_PATH}", databasePath); StringUtils::replaceAll(statement->query, "${KUZU_ROOT_DIRECTORY}", KUZU_ROOT_DIRECTORY); @@ -117,8 +117,8 @@ bool TestRunner::checkLogicalPlan(std::unique_ptr& preparedSt return true; } else { if (!preparedStatement->success) { - spdlog::info( - "Query compilation failed with error: {}", preparedStatement->getErrorMessage()); + spdlog::info("Query compilation failed with error: {}", + preparedStatement->getErrorMessage()); return false; } auto planStr = preparedStatement->logicalPlans[planIdx]->toString(); @@ -153,8 +153,8 @@ bool TestRunner::checkPlanResult(std::unique_ptr& result, TestState if (resultTuples.size() == result->getNumTuples() && resultHash == statement->expectedHashValue && resultTuples.size() == statement->expectedNumTuples) { - spdlog::info( - "PLAN{} PASSED in {}ms.", planIdx, result->getQuerySummary()->getExecutionTime()); + spdlog::info("PLAN{} PASSED in {}ms.", planIdx, + result->getQuerySummary()->getExecutionTime()); return true; } else { spdlog::error("PLAN{} NOT PASSED.", planIdx); @@ -169,8 +169,8 @@ bool TestRunner::checkPlanResult(std::unique_ptr& result, TestState } if (resultTuples.size() == result->getNumTuples() && resultTuples == statement->expectedTuples) { - spdlog::info( - "PLAN{} PASSED in {}ms.", planIdx, result->getQuerySummary()->getExecutionTime()); + spdlog::info("PLAN{} PASSED in {}ms.", planIdx, + result->getQuerySummary()->getExecutionTime()); return true; } else { spdlog::error("PLAN{} NOT PASSED.", planIdx); @@ -183,8 +183,8 @@ bool TestRunner::checkPlanResult(std::unique_ptr& result, TestState return false; } -std::vector TestRunner::convertResultToString( - QueryResult& queryResult, bool checkOutputOrder) { +std::vector TestRunner::convertResultToString(QueryResult& queryResult, + bool checkOutputOrder) { std::vector actualOutput; while (queryResult.hasNext()) { auto tuple = queryResult.getNext(); @@ -210,8 +210,8 @@ std::string TestRunner::convertResultToMD5Hash(QueryResult& queryResult, bool ch return std::string(hasher.finishMD5()); } -std::unique_ptr TestRunner::getLogicalPlan( - const std::string& query, kuzu::main::Connection& conn) { +std::unique_ptr TestRunner::getLogicalPlan(const std::string& query, + kuzu::main::Connection& conn) { return std::move(conn.prepare(query)->logicalPlans[0]); } diff --git a/test/transaction/transaction_manager_test.cpp b/test/transaction/transaction_manager_test.cpp index 941132f5d29..3ca6311917e 100644 --- a/test/transaction/transaction_manager_test.cpp +++ b/test/transaction/transaction_manager_test.cpp @@ -18,8 +18,8 @@ class TransactionManagerTest : public EmptyDBTest { bufferManager = getBufferManager(*database); std::make_unique(BufferPoolConstants::DEFAULT_BUFFER_POOL_SIZE_FOR_TESTING, BufferPoolConstants::DEFAULT_VM_REGION_MAX_SIZE); - wal = std::make_unique( - databasePath, false /* readOnly */, *bufferManager, getFileSystem(*database)); + wal = std::make_unique(databasePath, false /* readOnly */, *bufferManager, + getFileSystem(*database)); transactionManager = std::make_unique(*wal); } @@ -63,34 +63,34 @@ TEST_F(TransactionManagerTest, MultipleWriteTransactionsErrors) { TEST_F(TransactionManagerTest, MultipleCommitsAndRollbacks) { // At TransactionManager level, we disallow multiple commit/rollbacks on a write transaction. try { - runTwoCommitRollback( - TransactionType::WRITE, true /* firstIsCommit */, true /* secondIsCommit */); + runTwoCommitRollback(TransactionType::WRITE, true /* firstIsCommit */, + true /* secondIsCommit */); FAIL(); } catch (TransactionManagerException& e) {} try { - runTwoCommitRollback( - TransactionType::WRITE, true /* firstIsCommit */, false /* secondIsRollback */); + runTwoCommitRollback(TransactionType::WRITE, true /* firstIsCommit */, + false /* secondIsRollback */); FAIL(); } catch (TransactionManagerException& e) {} try { - runTwoCommitRollback( - TransactionType::WRITE, false /* firstIsRollback */, true /* secondIsCommit */); + runTwoCommitRollback(TransactionType::WRITE, false /* firstIsRollback */, + true /* secondIsCommit */); FAIL(); } catch (TransactionManagerException& e) {} try { - runTwoCommitRollback( - TransactionType::WRITE, false /* firstIsRollback */, false /* secondIsRollback */); + runTwoCommitRollback(TransactionType::WRITE, false /* firstIsRollback */, + false /* secondIsRollback */); FAIL(); } catch (TransactionManagerException& e) {} // At TransactionManager level, we allow multiple commit/rollbacks on a read-only transaction. - runTwoCommitRollback( - TransactionType::READ_ONLY, true /* firstIsCommit */, true /* secondIsCommit */); - runTwoCommitRollback( - TransactionType::READ_ONLY, true /* firstIsCommit */, false /* secondIsRollback */); - runTwoCommitRollback( - TransactionType::READ_ONLY, false /* firstIsRollback */, true /* secondIsCommit */); - runTwoCommitRollback( - TransactionType::READ_ONLY, false /* firstIsRollback */, false /* secondIsRollback */); + runTwoCommitRollback(TransactionType::READ_ONLY, true /* firstIsCommit */, + true /* secondIsCommit */); + runTwoCommitRollback(TransactionType::READ_ONLY, true /* firstIsCommit */, + false /* secondIsRollback */); + runTwoCommitRollback(TransactionType::READ_ONLY, false /* firstIsRollback */, + true /* secondIsCommit */); + runTwoCommitRollback(TransactionType::READ_ONLY, false /* firstIsRollback */, + false /* secondIsRollback */); } TEST_F(TransactionManagerTest, BasicOneWriteMultipleReadOnlyTransactions) { @@ -111,19 +111,19 @@ TEST_F(TransactionManagerTest, BasicOneWriteMultipleReadOnlyTransactions) { ASSERT_EQ(trx2->getID() + 1, trx3->getID()); ASSERT_EQ(trx2->getID(), transactionManager->getActiveWriteTransactionID()); std::unordered_set expectedReadOnlyTransactionSet({trx1->getID(), trx3->getID()}); - ASSERT_EQ( - expectedReadOnlyTransactionSet, transactionManager->getActiveReadOnlyTransactionIDs()); + ASSERT_EQ(expectedReadOnlyTransactionSet, + transactionManager->getActiveReadOnlyTransactionIDs()); transactionManager->commit(trx2.get()); ASSERT_FALSE(transactionManager->hasActiveWriteTransactionID()); transactionManager->rollback(trx1.get()); expectedReadOnlyTransactionSet.erase(trx1->getID()); - ASSERT_EQ( - expectedReadOnlyTransactionSet, transactionManager->getActiveReadOnlyTransactionIDs()); + ASSERT_EQ(expectedReadOnlyTransactionSet, + transactionManager->getActiveReadOnlyTransactionIDs()); transactionManager->commit(trx3.get()); expectedReadOnlyTransactionSet.erase(trx3->getID()); - ASSERT_EQ( - expectedReadOnlyTransactionSet, transactionManager->getActiveReadOnlyTransactionIDs()); + ASSERT_EQ(expectedReadOnlyTransactionSet, + transactionManager->getActiveReadOnlyTransactionIDs()); std::unique_ptr trx4 = transactionManager->beginWriteTransaction(*getClientContext(*conn)); @@ -133,6 +133,6 @@ TEST_F(TransactionManagerTest, BasicOneWriteMultipleReadOnlyTransactions) { ASSERT_EQ(trx4->getID() + 1, trx5->getID()); ASSERT_EQ(trx4->getID(), transactionManager->getActiveWriteTransactionID()); expectedReadOnlyTransactionSet.insert(trx5->getID()); - ASSERT_EQ( - expectedReadOnlyTransactionSet, transactionManager->getActiveReadOnlyTransactionIDs()); + ASSERT_EQ(expectedReadOnlyTransactionSet, + transactionManager->getActiveReadOnlyTransactionIDs()); } diff --git a/test/util_tests/string_format.cpp b/test/util_tests/string_format.cpp index b113be7a790..76d4a47cefe 100644 --- a/test/util_tests/string_format.cpp +++ b/test/util_tests/string_format.cpp @@ -6,13 +6,13 @@ using namespace kuzu::common; TEST(StringFormat, Basic) { - ASSERT_EQ( - stringFormat("Some formatted data: {} and {}", 'a', 423), "Some formatted data: a and 423"); + ASSERT_EQ(stringFormat("Some formatted data: {} and {}", 'a', 423), + "Some formatted data: a and 423"); } TEST(StringFormat, Escape) { - ASSERT_EQ( - stringFormat("Escape this {{}} but not this {{ }}"), "Escape this {} but not this {{ }}"); + ASSERT_EQ(stringFormat("Escape this {{}} but not this {{ }}"), + "Escape this {} but not this {{ }}"); ASSERT_EQ(stringFormat("Escape before and after value works: {{}} {} {{}}", 4), "Escape before and after value works: {} 4 {}"); } From d946982e77af0f8a0bf41e7fea701c61db6f098f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Sat, 6 Apr 2024 14:42:32 +0800 Subject: [PATCH 134/136] Check for format changes on master branch (#3223) * Check for format changes on master branch * Fix extension format check job name --- .github/workflows/ci-workflow.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 3ea78dd855c..c1989bd6d19 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -347,7 +347,11 @@ jobs: - name: Check and fix extension format run: python3 scripts/run-clang-format.py --in-place --clang-format-executable /usr/bin/clang-format-18 -r extension/ - - name: Commit changes + - name: Fail if any chang is made (master branch) + if: github.ref == 'refs/heads/master' + run: git diff --exit-code + + - name: Commit changes (non-master branch) uses: EndBug/add-and-commit@v9 if: github.ref != 'refs/heads/master' with: From 8006723d24e48fdedf0d1d1cee58ce7cdcb927d1 Mon Sep 17 00:00:00 2001 From: Jonas Zaddach Date: Sun, 7 Apr 2024 08:59:06 +0200 Subject: [PATCH 135/136] CMAKE_CXX_FLAGS handling fails when variable is empty (#3228) --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2a137ecf1b..88aae897602 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,8 +104,8 @@ if(MSVC) # Enables support for custom hardware exception handling add_compile_options("/EHa") # Remove the default to avoid warnings - STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) - STRING(REPLACE "/EHs" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + STRING(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + STRING(REPLACE "/EHs" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # Store all libraries and binaries in the same directory so that kuzu_shared.dll is found at runtime set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/src") set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/src") From c6897b4c858db87a6c7c909eb3b8efa87bfbc415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9B=A7=E5=9B=A7?= Date: Sun, 7 Apr 2024 18:30:02 +0800 Subject: [PATCH 136/136] Remove extension test from `clang-build-test` job (#3231) --- .github/workflows/ci-workflow.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index c1989bd6d19..551ca7b4f46 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -174,15 +174,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Update PostgreSQL host - working-directory: extension/postgres_scanner/test/test_files - env: - FNAME: postgres_scanner.test - FIND: "localhost" - run: | - node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replaceAll(process.env.FIND,process.env.PG_HOST),"utf8",e=>{if(e!=null)throw e;});});' - cat postgres_scanner.test - - name: Ensure Python dependencies run: | pip install torch~=2.0.0 --extra-index-url https://download.pytorch.org/whl/cpu @@ -192,11 +183,6 @@ jobs: run: npm install --include=dev working-directory: tools/nodejs_api - - name: Extension test - run: | - cd scripts/ && python3 http-server.py & - make extension-test && make clean - - name: Build run: make all